ZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnR4dCBiL2FwaS9jdXJyZW50LnR4dAppbmRleCA0MTEwYTIwLi4wNjAzYTYzIDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC50eHQKKysrIGIvYXBpL2N1cnJlbnQudHh0CkBAIC00NzYxLDYgKzQ3NjEsNyBAQAogICBwdWJsaWMgY2xhc3MgQ2xpcERhdGEgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewogICAgIGN0b3IgcHVibGljIENsaXBEYXRhKGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGphdmEubGFuZy5TdHJpbmdbXSwgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0pOwogICAgIGN0b3IgcHVibGljIENsaXBEYXRhKGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb24sIGFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtKTsKKyAgICBjdG9yIHB1YmxpYyBDbGlwRGF0YShhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBhZGRJdGVtKGFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtKTsKICAgICBtZXRob2QgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCk7CkBAIC01Mzc4LDYgKzUzNzksNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIGdldENoYXJTZXF1ZW5jZUFycmF5RXh0cmEoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuQXJyYXlMaXN0PGphdmEubGFuZy5DaGFyU2VxdWVuY2U+IGdldENoYXJTZXF1ZW5jZUFycmF5TGlzdEV4dHJhKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRDaGFyU2VxdWVuY2VFeHRyYShqYXZhLmxhbmcuU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuY29udGVudC5DbGlwRGF0YSBnZXRDbGlwRGF0YSgpOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0RGF0YSgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREYXRhU3RyaW5nKCk7CkBAIC01NDYxLDYgKzU0NjMsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBzZXRDbGFzcyhhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgamF2YS5sYW5nLkNsYXNzPD8+KTsKICAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgc2V0Q2xhc3NOYW1lKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgc2V0Q2xhc3NOYW1lKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDbGlwRGF0YShhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEpOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBzZXRDb21wb25lbnQoYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBzZXREYXRhKGFuZHJvaWQubmV0LlVyaSk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHNldERhdGFBbmROb3JtYWxpemUoYW5kcm9pZC5uZXQuVXJpKTsKQEAgLTU2NDYsNiArNTY0OSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1VJRCA9ICJhbmRyb2lkLmludGVudC5leHRyYS5VSUQiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTExfSU5fQUNUSU9OID0gMTsgLy8gMHgxCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9JTl9DQVRFR09SSUVTID0gNDsgLy8gMHg0CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9JTl9DTElQX0RBVEEgPSAxMjg7IC8vIDB4ODAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMX0lOX0NPTVBPTkVOVCA9IDg7IC8vIDB4OAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTExfSU5fREFUQSA9IDI7IC8vIDB4MgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTExfSU5fUEFDS0FHRSA9IDE2OyAvLyAweDEwCkBAIC0xMDc4Miw4ICsxMDc4Niw4IEBACiAKICAgcHVibGljIGNsYXNzIE1lZGlhQWN0aW9uU291bmQgewogICAgIGN0b3IgcHVibGljIE1lZGlhQWN0aW9uU291bmQoKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgbG9hZChpbnQpOwotICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBwbGF5KGludCk7CisgICAgbWV0aG9kIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwbGF5KGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT0NVU19DT01QTEVURSA9IDE7IC8vIDB4MQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIVVRURVJfQ0xJQ0sgPSAwOyAvLyAweDAKQEAgLTIzMzcwLDYgKzIzMzc0LDcgQEAKICAgICBtZXRob2QgcHVibGljIHZvaWQgb25SZXNvbHZlZFRleHREaXJlY3Rpb25SZXNldCgpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKGFuZHJvaWQub3MuUGFyY2VsYWJsZSk7CiAgICAgbWV0aG9kIHByb3RlY3RlZCBhbmRyb2lkLm9zLlBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBvblNjcmVlblN0YXRlQ2hhbmdlZChpbnQpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgdm9pZCBvblNjcm9sbENoYW5nZWQoaW50LCBpbnQsIGludCwgaW50KTsKICAgICBtZXRob2QgcHJvdGVjdGVkIGJvb2xlYW4gb25TZXRBbHBoYShpbnQpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKGludCwgaW50LCBpbnQsIGludCk7CkBAIC0yMzU3OSw2ICsyMzU4NCw4IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuUHJvcGVydHkgUk9UQVRJT05fWTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Qcm9wZXJ0eSBTQ0FMRV9YOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlByb3BlcnR5IFNDQUxFX1k7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NSRUVOX1NUQVRFX09GRiA9IDA7IC8vIDB4MAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTl9TVEFURV9PTiA9IDE7IC8vIDB4MQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTEJBUlNfSU5TSURFX0lOU0VUID0gMTY3NzcyMTY7IC8vIDB4MTAwMDAwMAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVkgPSAwOyAvLyAweDAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JPTExCQVJTX09VVFNJREVfSU5TRVQgPSA1MDMzMTY0ODsgLy8gMHgzMDAwMDAwCkBAIC0yNzY0NSw5ICsyNzY1MiwxMiBAQAogICAgIG1ldGhvZCBwdWJsaWMgZmluYWwgaW50IGdldEF1dG9MaW5rTWFzaygpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldENvbXBvdW5kRHJhd2FibGVQYWRkaW5nKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlW10gZ2V0Q29tcG91bmREcmF3YWJsZXMoKTsKKyAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVbXSBnZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q29tcG91bmRQYWRkaW5nQm90dG9tKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q29tcG91bmRQYWRkaW5nRW5kKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q29tcG91bmRQYWRkaW5nTGVmdCgpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldENvbXBvdW5kUGFkZGluZ1JpZ2h0KCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q29tcG91bmRQYWRkaW5nU3RhcnQoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRDb21wb3VuZFBhZGRpbmdUb3AoKTsKICAgICBtZXRob2QgcHVibGljIGZpbmFsIGludCBnZXRDdXJyZW50SGludFRleHRDb2xvcigpOwogICAgIG1ldGhvZCBwdWJsaWMgZmluYWwgaW50IGdldEN1cnJlbnRUZXh0Q29sb3IoKTsKQEAgLTI3NjkwLDggKzI3NzAwLDEwIEBACiAgICAgbWV0aG9kIHB1YmxpYyBmbG9hdCBnZXRUZXh0U2NhbGVYKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBmbG9hdCBnZXRUZXh0U2l6ZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFRvdGFsUGFkZGluZ0JvdHRvbSgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFRvdGFsUGFkZGluZ0VuZCgpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFRvdGFsUGFkZGluZ0xlZnQoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRUb3RhbFBhZGRpbmdSaWdodCgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFRvdGFsUGFkZGluZ1N0YXJ0KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0VG90YWxQYWRkaW5nVG9wKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLlRyYW5zZm9ybWF0aW9uTWV0aG9kIGdldFRyYW5zZm9ybWF0aW9uTWV0aG9kKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlIGdldFR5cGVmYWNlKCk7CkBAIC0yNzcyMSw2ICsyNzczMyw5IEBACiAgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCB2b2lkIHNldEF1dG9MaW5rTWFzayhpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDb21wb3VuZERyYXdhYmxlUGFkZGluZyhpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDb21wb3VuZERyYXdhYmxlcyhhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZShhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZVdpdGhJbnRyaW5zaWNCb3VuZHMoaW50LCBpbnQsIGludCwgaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZVdpdGhJbnRyaW5zaWNCb3VuZHMoYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhpbnQsIGludCwgaW50LCBpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEN1cnNvclZpc2libGUoYm9vbGVhbik7CmRpZmYgLS1naXQgYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCmluZGV4IDEzYjYzZGMuLmJhNzljOWYgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCisrKyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCkBAIC04NiwxMSArODYsNiBAQAogICAgIGR1bXBfZmlsZSgiUEFHRVRZUEVJTkZPIiwgIi9wcm9jL3BhZ2V0eXBlaW5mbyIpOwogICAgIGR1bXBfZmlsZSgiQlVERFlJTkZPIiwgIi9wcm9jL2J1ZGR5aW5mbyIpOwogCi0gICAgcHJpbnRfcHJvcGVydGllcygpOwotCi0gICAgLyogVE9ETzogTWFrZSBsYXN0X2ttc2cgQ0FQX1NZU0xPRyBwcm90ZWN0ZWQuIGIvNTU1NTY5MSAqLwotICAgIGR1bXBfZmlsZSgiTEFTVCBLTVNHIiwgIi9wcm9jL2xhc3Rfa21zZyIpOwotICAgIGRvX2RtZXNnKCk7CiAKICAgICBkdW1wX2ZpbGUoIktFUk5FTCBXQUtFTE9DS1MiLCAiL3Byb2Mvd2FrZWxvY2tzIik7CiAgICAgZHVtcF9maWxlKCJLRVJORUwgQ1BVRlJFUSIsICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL2NwdWZyZXEvc3RhdHMvdGltZV9pbl9zdGF0ZSIpOwpAQCAtOTksNiArOTQsMTkgQEAKICAgICBydW5fY29tbWFuZCgiUFJPQ0VTU0VTIEFORCBUSFJFQURTIiwgMTAsICJwcyIsICItdCIsICItcCIsICItUCIsIE5VTEwpOwogICAgIHJ1bl9jb21tYW5kKCJMSUJSQU5LIiwgMTAsICJsaWJyYW5rIiwgTlVMTCk7CiAKKyAgICBkb19kbWVzZygpOworCisgICAgcnVuX2NvbW1hbmQoIkxJU1QgT0YgT1BFTiBGSUxFUyIsIDEwLCBTVV9QQVRILCAicm9vdCIsICJsc29mIiwgTlVMTCk7CisKKyAgICBmb3JfZWFjaF9waWQoZG9fc2hvd21hcCwgIlNNQVBTIE9GIEFMTCBQUk9DRVNTRVMiKTsKKyAgICBmb3JfZWFjaF9waWQoc2hvd193Y2hhbiwgIkJMT0NLRUQgUFJPQ0VTUyBXQUlULUNIQU5ORUxTIik7CisKKyAgICAvLyBkdW1wX2ZpbGUoIkVWRU5UIExPRyBUQUdTIiwgIi9ldGMvZXZlbnQtbG9nLXRhZ3MiKTsKKyAgICBydW5fY29tbWFuZCgiU1lTVEVNIExPRyIsIDIwLCAibG9nY2F0IiwgIi12IiwgInRocmVhZHRpbWUiLCAiLWQiLCAiKjp2IiwgTlVMTCk7CisgICAgcnVuX2NvbW1hbmQoIkVWRU5UIExPRyIsIDIwLCAibG9nY2F0IiwgIi1iIiwgImV2ZW50cyIsICItdiIsICJ0aHJlYWR0aW1lIiwgIi1kIiwgIio6diIsIE5VTEwpOworICAgIHJ1bl9jb21tYW5kKCJSQURJTyBMT0ciLCAyMCwgImxvZ2NhdCIsICItYiIsICJyYWRpbyIsICItdiIsICJ0aHJlYWR0aW1lIiwgIi1kIiwgIio6diIsIE5VTEwpOworCisKICAgICAvKiBzaG93IHRoZSB0cmFjZXMgd2UgY29sbGVjdGVkIGluIG1haW4oKSwgaWYgdGhhdCB3YXMgZG9uZSAqLwogICAgIGlmIChkdW1wX3RyYWNlc19wYXRoICE9IE5VTEwpIHsKICAgICAgICAgZHVtcF9maWxlKCJWTSBUUkFDRVMgSlVTVCBOT1ciLCBkdW1wX3RyYWNlc19wYXRoKTsKQEAgLTEyNCw2ICsxMzIsMTEgQEAKICAgICBkdW1wX2ZpbGUoIk5FVFdPUksgUk9VVEVTIiwgIi9wcm9jL25ldC9yb3V0ZSIpOwogICAgIGR1bXBfZmlsZSgiTkVUV09SSyBST1VURVMgSVBWNiIsICIvcHJvYy9uZXQvaXB2Nl9yb3V0ZSIpOwogCisgICAgLyogVE9ETzogTWFrZSBsYXN0X2ttc2cgQ0FQX1NZU0xPRyBwcm90ZWN0ZWQuIGIvNTU1NTY5MSAqLworICAgIGR1bXBfZmlsZSgiTEFTVCBLTVNHIiwgIi9wcm9jL2xhc3Rfa21zZyIpOworICAgIGR1bXBfZmlsZSgiTEFTVCBQQU5JQyBDT05TT0xFIiwgIi9kYXRhL2RvbnRwYW5pYy9hcGFuaWNfY29uc29sZSIpOworICAgIGR1bXBfZmlsZSgiTEFTVCBQQU5JQyBUSFJFQURTIiwgIi9kYXRhL2RvbnRwYW5pYy9hcGFuaWNfdGhyZWFkcyIpOworCiAgICAgaWYgKHNjcmVlbnNob3RfcGF0aFswXSkgewogICAgICAgICBBTE9HSSgidGFraW5nIHNjcmVlbnNob3RcbiIpOwogICAgICAgICBydW5fY29tbWFuZChOVUxMLCA1LCBTVV9QQVRILCAicm9vdCIsICJzY3JlZW5zaG90Iiwgc2NyZWVuc2hvdF9wYXRoLCBOVUxMKTsKQEAgLTEzNCwxMSArMTQ3LDcgQEAKICAgICAgICAgICAgICIvZGF0YS9kYXRhL2NvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy9kYXRhYmFzZXMvc2V0dGluZ3MuZGIiLAogICAgICAgICAgICAgInByYWdtYSB1c2VyX3ZlcnNpb247IHNlbGVjdCAqIGZyb20gc3lzdGVtOyBzZWxlY3QgKiBmcm9tIHNlY3VyZTsiLCBOVUxMKTsKIAotICAgIC8vIGR1bXBfZmlsZSgiRVZFTlQgTE9HIFRBR1MiLCAiL2V0Yy9ldmVudC1sb2ctdGFncyIpOwotICAgIHJ1bl9jb21tYW5kKCJTWVNURU0gTE9HIiwgMjAsICJsb2djYXQiLCAiLXYiLCAidGhyZWFkdGltZSIsICItZCIsICIqOnYiLCBOVUxMKTsKLSAgICBydW5fY29tbWFuZCgiRVZFTlQgTE9HIiwgMjAsICJsb2djYXQiLCAiLWIiLCAiZXZlbnRzIiwgIi12IiwgInRocmVhZHRpbWUiLCAiLWQiLCAiKjp2IiwgTlVMTCk7Ci0gICAgcnVuX2NvbW1hbmQoIlJBRElPIExPRyIsIDIwLCAibG9nY2F0IiwgIi1iIiwgInJhZGlvIiwgIi12IiwgInRocmVhZHRpbWUiLCAiLWQiLCAiKjp2IiwgTlVMTCk7Ci0KKyAgICAvKiBUaGUgZm9sbG93aW5nIGhhdmUgYSB0ZW5kZW5jeSB0byBnZXQgd2VkZ2VkIHdoZW4gd2lmaSBkcml2ZXJzL2Z3IGdvZXMgYmVsbHktdXAuICovCiAgICAgcnVuX2NvbW1hbmQoIk5FVFdPUksgSU5URVJGQUNFUyIsIDEwLCBTVV9QQVRILCAicm9vdCIsICJuZXRjZmciLCBOVUxMKTsKICAgICBydW5fY29tbWFuZCgiSVAgUlVMRVMiLCAxMCwgImlwIiwgInJ1bGUiLCAic2hvdyIsIE5VTEwpOwogICAgIHJ1bl9jb21tYW5kKCJJUCBSVUxFUyB2NiIsIDEwLCAiaXAiLCAiLTYiLCAicnVsZSIsICJzaG93IiwgTlVMTCk7CkBAIC0xNzEsNDAgKzE4MCwxNyBAQAogICAgICAgICAgICAgU1VfUEFUSCwgInJvb3QiLCAid2x1dGlsIiwgImNvdW50ZXJzIiwgTlVMTCk7CiAjZW5kaWYKIAotICAgIGNoYXIgcmlsX2R1bXBzdGF0ZV90aW1lb3V0W1BST1BFUlRZX1ZBTFVFX01BWF0gPSB7MH07Ci0gICAgcHJvcGVydHlfZ2V0KCJyaWwuZHVtcHN0YXRlLnRpbWVvdXQiLCByaWxfZHVtcHN0YXRlX3RpbWVvdXQsICIzMCIpOwotICAgIGlmIChzdHJubGVuKHJpbF9kdW1wc3RhdGVfdGltZW91dCwgUFJPUEVSVFlfVkFMVUVfTUFYIC0gMSkgPiAwKSB7Ci0gICAgICAgIGlmICgwID09IHN0cm5jbXAoYnVpbGRfdHlwZSwgInVzZXIiLCBQUk9QRVJUWV9WQUxVRV9NQVggLSAxKSkgewotICAgICAgICAgICAgLy8gc3UgZG9lcyBub3QgZXhpc3Qgb24gdXNlciBidWlsZHMsIHNvIHRyeSBydW5uaW5nIHdpdGhvdXQgaXQuCi0gICAgICAgICAgICAvLyBUaGlzIHdheSBhbnkgaW1wbGVtZW50YXRpb25zIG9mIHZyaWwtZHVtcCB0aGF0IGRvIG5vdCByZXF1aXJlCi0gICAgICAgICAgICAvLyByb290IGNhbiBydW4gb24gdXNlciBidWlsZHMuCi0gICAgICAgICAgICBydW5fY29tbWFuZCgiRFVNUCBWRU5ET1IgUklMIExPR1MiLCBhdG9pKHJpbF9kdW1wc3RhdGVfdGltZW91dCksCi0gICAgICAgICAgICAgICAgICAgICJ2cmlsLWR1bXAiLCBOVUxMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJ1bl9jb21tYW5kKCJEVU1QIFZFTkRPUiBSSUwgTE9HUyIsIGF0b2kocmlsX2R1bXBzdGF0ZV90aW1lb3V0KSwKLSAgICAgICAgICAgICAgICAgICAgU1VfUEFUSCwgInJvb3QiLCAidnJpbC1kdW1wIiwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHJpbnRfcHJvcGVydGllcygpOwogCiAgICAgcnVuX2NvbW1hbmQoIlZPTEQgRFVNUCIsIDEwLCAidmRjIiwgImR1bXAiLCBOVUxMKTsKICAgICBydW5fY29tbWFuZCgiU0VDVVJFIENPTlRBSU5FUlMiLCAxMCwgInZkYyIsICJhc2VjIiwgImxpc3QiLCBOVUxMKTsKIAotICAgIGR1bXBfZmlsZSgiQklOREVSIEZBSUxFRCBUUkFOU0FDVElPTiBMT0ciLCAiL3N5cy9rZXJuZWwvZGVidWcvYmluZGVyL2ZhaWxlZF90cmFuc2FjdGlvbl9sb2ciKTsKLSAgICBkdW1wX2ZpbGUoIkJJTkRFUiBUUkFOU0FDVElPTiBMT0ciLCAiL3N5cy9rZXJuZWwvZGVidWcvYmluZGVyL3RyYW5zYWN0aW9uX2xvZyIpOwotICAgIGR1bXBfZmlsZSgiQklOREVSIFRSQU5TQUNUSU9OUyIsICIvc3lzL2tlcm5lbC9kZWJ1Zy9iaW5kZXIvdHJhbnNhY3Rpb25zIik7Ci0gICAgZHVtcF9maWxlKCJCSU5ERVIgU1RBVFMiLCAiL3N5cy9rZXJuZWwvZGVidWcvYmluZGVyL3N0YXRzIik7Ci0gICAgZHVtcF9maWxlKCJCSU5ERVIgU1RBVEUiLCAiL3N5cy9rZXJuZWwvZGVidWcvYmluZGVyL3N0YXRlIik7Ci0KICAgICBydW5fY29tbWFuZCgiRklMRVNZU1RFTVMgJiBGUkVFIFNQQUNFIiwgMTAsIFNVX1BBVEgsICJyb290IiwgImRmIiwgTlVMTCk7CiAKICAgICBkdW1wX2ZpbGUoIlBBQ0tBR0UgU0VUVElOR1MiLCAiL2RhdGEvc3lzdGVtL3BhY2thZ2VzLnhtbCIpOwogICAgIGR1bXBfZmlsZSgiUEFDS0FHRSBVSUQgRVJST1JTIiwgIi9kYXRhL3N5c3RlbS91aWRlcnJvcnMudHh0Iik7CiAKICAgICBydW5fY29tbWFuZCgiTEFTVCBSQURJTyBMT0ciLCAxMCwgInBhcnNlX3JhZGlvX2xvZyIsICIvcHJvYy9sYXN0X3JhZGlvX2xvZyIsIE5VTEwpOwotICAgIGR1bXBfZmlsZSgiTEFTVCBQQU5JQyBDT05TT0xFIiwgIi9kYXRhL2RvbnRwYW5pYy9hcGFuaWNfY29uc29sZSIpOwotICAgIGR1bXBfZmlsZSgiTEFTVCBQQU5JQyBUSFJFQURTIiwgIi9kYXRhL2RvbnRwYW5pYy9hcGFuaWNfdGhyZWFkcyIpOwotCi0gICAgZm9yX2VhY2hfcGlkKHNob3dfd2NoYW4sICJCTE9DS0VEIFBST0NFU1MgV0FJVC1DSEFOTkVMUyIpOwogCiAgICAgcHJpbnRmKCItLS0tLS0gQkFDS0xJR0hUUyAtLS0tLS1cbiIpOwogICAgIHByaW50ZigiTENEIGJyaWdodG5lc3M9Iik7CkBAIC0yMTksOSArMjA1LDEyIEBACiAgICAgZHVtcF9maWxlKE5VTEwsICIvc3lzL2NsYXNzL2xlZHMvbGNkLWJhY2tsaWdodC9yZWdpc3RlcnMiKTsKICAgICBwcmludGYoIlxuIik7CiAKLSAgICBydW5fY29tbWFuZCgiTElTVCBPRiBPUEVOIEZJTEVTIiwgMTAsIFNVX1BBVEgsICJyb290IiwgImxzb2YiLCBOVUxMKTsKLQotICAgIGZvcl9lYWNoX3BpZChkb19zaG93bWFwLCAiU01BUFMgT0YgQUxMIFBST0NFU1NFUyIpOworICAgIC8qIEJpbmRlciBzdGF0ZSBpcyBleHBlbnNpdmUgdG8gbG9vayBhdCBhcyBpdCB1c2VzIGEgbG90IG9mIG1lbW9yeS4gKi8KKyAgICBkdW1wX2ZpbGUoIkJJTkRFUiBGQUlMRUQgVFJBTlNBQ1RJT04gTE9HIiwgIi9zeXMva2VybmVsL2RlYnVnL2JpbmRlci9mYWlsZWRfdHJhbnNhY3Rpb25fbG9nIik7CisgICAgZHVtcF9maWxlKCJCSU5ERVIgVFJBTlNBQ1RJT04gTE9HIiwgIi9zeXMva2VybmVsL2RlYnVnL2JpbmRlci90cmFuc2FjdGlvbl9sb2ciKTsKKyAgICBkdW1wX2ZpbGUoIkJJTkRFUiBUUkFOU0FDVElPTlMiLCAiL3N5cy9rZXJuZWwvZGVidWcvYmluZGVyL3RyYW5zYWN0aW9ucyIpOworICAgIGR1bXBfZmlsZSgiQklOREVSIFNUQVRTIiwgIi9zeXMva2VybmVsL2RlYnVnL2JpbmRlci9zdGF0cyIpOworICAgIGR1bXBfZmlsZSgiQklOREVSIFNUQVRFIiwgIi9zeXMva2VybmVsL2RlYnVnL2JpbmRlci9zdGF0ZSIpOwogCiAjaWZkZWYgQk9BUkRfSEFTX0RVTVBTVEFURQogICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwpAQCAtMjMyLDYgKzIyMSwyMiBAQAogICAgIHByaW50ZigiXG4iKTsKICNlbmRpZgogCisgICAgLyogTWlncmF0ZSB0aGUgcmlsX2R1bXBzdGF0ZSB0byBhIGR1bXBzdGF0ZV9ib2FyZCgpPyAqLworICAgIGNoYXIgcmlsX2R1bXBzdGF0ZV90aW1lb3V0W1BST1BFUlRZX1ZBTFVFX01BWF0gPSB7MH07CisgICAgcHJvcGVydHlfZ2V0KCJyaWwuZHVtcHN0YXRlLnRpbWVvdXQiLCByaWxfZHVtcHN0YXRlX3RpbWVvdXQsICIzMCIpOworICAgIGlmIChzdHJubGVuKHJpbF9kdW1wc3RhdGVfdGltZW91dCwgUFJPUEVSVFlfVkFMVUVfTUFYIC0gMSkgPiAwKSB7CisgICAgICAgIGlmICgwID09IHN0cm5jbXAoYnVpbGRfdHlwZSwgInVzZXIiLCBQUk9QRVJUWV9WQUxVRV9NQVggLSAxKSkgeworICAgICAgICAgICAgLy8gc3UgZG9lcyBub3QgZXhpc3Qgb24gdXNlciBidWlsZHMsIHNvIHRyeSBydW5uaW5nIHdpdGhvdXQgaXQuCisgICAgICAgICAgICAvLyBUaGlzIHdheSBhbnkgaW1wbGVtZW50YXRpb25zIG9mIHZyaWwtZHVtcCB0aGF0IGRvIG5vdCByZXF1aXJlCisgICAgICAgICAgICAvLyByb290IGNhbiBydW4gb24gdXNlciBidWlsZHMuCisgICAgICAgICAgICBydW5fY29tbWFuZCgiRFVNUCBWRU5ET1IgUklMIExPR1MiLCBhdG9pKHJpbF9kdW1wc3RhdGVfdGltZW91dCksCisgICAgICAgICAgICAgICAgICAgICJ2cmlsLWR1bXAiLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bl9jb21tYW5kKCJEVU1QIFZFTkRPUiBSSUwgTE9HUyIsIGF0b2kocmlsX2R1bXBzdGF0ZV90aW1lb3V0KSwKKyAgICAgICAgICAgICAgICAgICAgU1VfUEFUSCwgInJvb3QiLCAidnJpbC1kdW1wIiwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKICAgICBwcmludGYoIj09IEFuZHJvaWQgRnJhbWV3b3JrIFNlcnZpY2VzXG4iKTsKICAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKaW5kZXggZmJmODAwYy4uMDQxNGI5OCAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKQEAgLTM1LDcgKzM1LDggQEAKIHN0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKm1lKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgWy1hXSB1c2UgYXVkaW9cbiIKICAgICAgICAgICAgICAgICAgICAgIlx0XHRbLXZdIHVzZSB2aWRlb1xuIgotICAgICAgICAgICAgICAgICAgICAiXHRcdFstcF0gcGxheWJhY2tcbiIsIG1lKTsKKyAgICAgICAgICAgICAgICAgICAgIlx0XHRbLXBdIHBsYXliYWNrXG4iCisgICAgICAgICAgICAgICAgICAgICJcdFx0Wy1TXSBhbGxvY2F0ZSBidWZmZXJzIGZyb20gYSBzdXJmYWNlXG4iLCBtZSk7CiAKICAgICBleGl0KDEpOwogfQpAQCAtNDksNiArNTAsOSBAQAogICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1JbkJ1ZmZlcnM7CiAgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbU91dEJ1ZmZlcnM7CiAgICAgYm9vbCBtU2F3T3V0cHV0RU9TOworICAgIGludDY0X3QgbU51bUJ1ZmZlcnNEZWNvZGVkOworICAgIGludDY0X3QgbU51bUJ5dGVzRGVjb2RlZDsKKyAgICBib29sIG1Jc0F1ZGlvOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKQEAgLTU3LDkgKzYxLDEyIEBACiAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFMb29wZXI+ICZsb29wZXIsCiAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgIGJvb2wgdXNlQXVkaW8sCi0gICAgICAgIGJvb2wgdXNlVmlkZW8pIHsKKyAgICAgICAgYm9vbCB1c2VWaWRlbywKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6U3VyZmFjZT4gJnN1cmZhY2UpIHsKICAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAorICAgIHN0YXRpYyBpbnQ2NF90IGtUaW1lb3V0ID0gNTAwbGw7CisKICAgICBzcDxOdU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKICAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci5cbiIpOwpAQCAtNzgsMTEgKzg1LDEyIEBACiAgICAgICAgIEFTdHJpbmcgbWltZTsKICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIAotICAgICAgICBpZiAodXNlQXVkaW8gJiYgIWhhdmVBdWRpbwotICAgICAgICAgICAgICAgICYmICFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJhdWRpby8iLCA2KSkgeworICAgICAgICBib29sIGlzQXVkaW8gPSAhc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAiYXVkaW8vIiwgNik7CisgICAgICAgIGJvb2wgaXNWaWRlbyA9ICFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KTsKKworICAgICAgICBpZiAodXNlQXVkaW8gJiYgIWhhdmVBdWRpbyAmJiBpc0F1ZGlvKSB7CiAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHVzZVZpZGVvICYmICFoYXZlVmlkZW8KLSAgICAgICAgICAgICAgICAmJiAhc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgfSBlbHNlIGlmICh1c2VWaWRlbyAmJiAhaGF2ZVZpZGVvICYmIGlzVmlkZW8pIHsKICAgICAgICAgICAgIGhhdmVWaWRlbyA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTk2LDEzICsxMDQsMTcgQEAKICAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPQogICAgICAgICAgICAgJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVBdChzdGF0ZUJ5VHJhY2suYWRkKGksIENvZGVjU3RhdGUoKSkpOwogCisgICAgICAgIHN0YXRlLT5tTnVtQnl0ZXNEZWNvZGVkID0gMDsKKyAgICAgICAgc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCA9IDA7CisgICAgICAgIHN0YXRlLT5tSXNBdWRpbyA9IGlzQXVkaW87CisKICAgICAgICAgc3RhdGUtPm1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKICAgICAgICAgICAgICAgICBsb29wZXIsIG1pbWUuY19zdHIoKSwgZmFsc2UgLyogZW5jb2RlciAqLyk7CiAKICAgICAgICAgQ0hFQ0soc3RhdGUtPm1Db2RlYyAhPSBOVUxMKTsKIAogICAgICAgICBlcnIgPSBzdGF0ZS0+bUNvZGVjLT5jb25maWd1cmUoCi0gICAgICAgICAgICAgICAgZm9ybWF0LCBOVUxMIC8qIHN1cmZhY2VUZXh0dXJlICovLCAwIC8qIGZsYWdzICovKTsKKyAgICAgICAgICAgICAgICBmb3JtYXQsIGlzVmlkZW8gPyBzdXJmYWNlIDogTlVMTCwgMCAvKiBmbGFncyAqLyk7CiAKICAgICAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwogCkBAIC0xMjIsNiArMTM0LDggQEAKIAogICAgIENIRUNLKCFzdGF0ZUJ5VHJhY2suaXNFbXB0eSgpKTsKIAorICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKICAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPSAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUF0KGkpOwogCkBAIC0xMzcsMTMgKzE1MSw3IEBACiAKICAgICAgICAgd2hpbGUgKHN0YXRlLT5tQ1NESW5kZXggPCBzdGF0ZS0+bUNTRC5zaXplKCkpIHsKICAgICAgICAgICAgIHNpemVfdCBpbmRleDsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmluZGV4KTsKLQotICAgICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaW5kZXgsIC0xbGwpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwogCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyID0KQEAgLTE3OSw3ICsxODcsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHN0YXRlLT5tQ29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc3RhdGUtPm1Db2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpbmRleCwga1RpbWVvdXQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTIwNCw3ICsyMTIsNyBAQAogICAgICAgICAgICAgICAgIENvZGVjU3RhdGUgKnN0YXRlID0gJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVGb3IodHJhY2tJbmRleCk7CiAKICAgICAgICAgICAgICAgICBzaXplX3QgaW5kZXg7Ci0gICAgICAgICAgICAgICAgZXJyID0gc3RhdGUtPm1Db2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpbmRleCk7CisgICAgICAgICAgICAgICAgZXJyID0gc3RhdGUtPm1Db2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpbmRleCwga1RpbWVvdXQpOwogCiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsbGluZyBpbnB1dCBidWZmZXIgJWQiLCBpbmRleCk7CkBAIC0yNjEsMTIgKzI2OSwxNSBAQAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3M7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzdGF0ZS0+bUNvZGVjLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKAogICAgICAgICAgICAgICAgICAgICAmaW5kZXgsICZvZmZzZXQsICZzaXplLCAmcHJlc2VudGF0aW9uVGltZVVzLCAmZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIDEwMDAwbGwpOworICAgICAgICAgICAgICAgICAgICBrVGltZW91dCk7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HVigiZHJhaW5pbmcgb3V0cHV0IGJ1ZmZlciAlZCwgdGltZSA9ICVsbGQgdXMiLAogICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBwcmVzZW50YXRpb25UaW1lVXMpOwogCisgICAgICAgICAgICAgICAgKytzdGF0ZS0+bU51bUJ1ZmZlcnNEZWNvZGVkOworICAgICAgICAgICAgICAgIHN0YXRlLT5tTnVtQnl0ZXNEZWNvZGVkICs9IHNpemU7CisKICAgICAgICAgICAgICAgICBlcnIgPSBzdGF0ZS0+bUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGluZGV4KTsKICAgICAgICAgICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAKQEAgLTI5MiwxMCArMzAzLDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewogICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9ICZzdGF0ZUJ5VHJhY2suZWRpdFZhbHVlQXQoaSk7CiAKICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBzdGF0ZS0+bUNvZGVjLT5yZWxlYXNlKCkpOworCisgICAgICAgIGlmIChzdGF0ZS0+bUlzQXVkaW8pIHsKKyAgICAgICAgICAgIHByaW50ZigidHJhY2sgJWQ6ICVsbGQgYnl0ZXMgcmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAorICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQsCisgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQgKiAxRTYgLyAxMDI0IC8gZWxhcHNlZFRpbWVVcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoInRyYWNrICVkOiAlbGxkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJWxsZCBieXRlcyAiCisgICAgICAgICAgICAgICAgICAgInJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKKyAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tTnVtQnVmZmVyc0RlY29kZWQsCisgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCAqIDFFNiAvIGVsYXBzZWRUaW1lVXMsCisgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQsCisgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQgKiAxRTYgLyAxMDI0IC8gZWxhcHNlZFRpbWVVcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTMwOSw5ICszMzcsMTAgQEAKICAgICBib29sIHVzZUF1ZGlvID0gZmFsc2U7CiAgICAgYm9vbCB1c2VWaWRlbyA9IGZhbHNlOwogICAgIGJvb2wgcGxheWJhY2sgPSBmYWxzZTsKKyAgICBib29sIHVzZVN1cmZhY2UgPSBmYWxzZTsKIAogICAgIGludCByZXM7Ci0gICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhdnAiKSkgPj0gMCkgeworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoYXZwUyIpKSA+PSAwKSB7CiAgICAgICAgIHN3aXRjaCAocmVzKSB7CiAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgIHsKQEAgLTMzMSw2ICszNjAsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNlU3VyZmFjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgJz8nOgogICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMzU4LDggKzM5MywxMiBAQAogICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOwogICAgIGxvb3Blci0+c3RhcnQoKTsKIAotICAgIGlmIChwbGF5YmFjaykgewotICAgICAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKKyAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50OworICAgIHNwPFN1cmZhY2VDb250cm9sPiBjb250cm9sOworICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CisKKyAgICBpZiAocGxheWJhY2sgfHwgKHVzZVN1cmZhY2UgJiYgdXNlVmlkZW8pKSB7CisgICAgICAgIGNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKICAgICAgICAgQ0hFQ0tfRVEoY29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwogCiAgICAgICAgIHNzaXplX3QgZGlzcGxheVdpZHRoID0gY29tcG9zZXJDbGllbnQtPmdldERpc3BsYXlXaWR0aCgwKTsKQEAgLTM2NywxNCArNDA2LDEzIEBACiAKICAgICAgICAgQUxPR1YoImRpc3BsYXkgaXMgJWxkIHggJWxkXG4iLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOwogCi0gICAgICAgIHNwPFN1cmZhY2VDb250cm9sPiBjb250cm9sID0KLSAgICAgICAgICAgIGNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJBIFN1cmZhY2UiKSwKLSAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLAotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBQSVhFTF9GT1JNQVRfUkdCXzU2NSwKLSAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGNvbnRyb2wgPSBjb21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKKyAgICAgICAgICAgICAgICBTdHJpbmc4KCJBIFN1cmZhY2UiKSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgICAgIFBJWEVMX0ZPUk1BVF9SR0JfNTY1LAorICAgICAgICAgICAgICAgIDApOwogCiAgICAgICAgIENIRUNLKGNvbnRyb2wgIT0gTlVMTCk7CiAgICAgICAgIENIRUNLKGNvbnRyb2wtPmlzVmFsaWQoKSk7CkBAIC0zODQsOSArNDIyLDExIEBACiAgICAgICAgIENIRUNLX0VRKGNvbnRyb2wtPnNob3coKSwgKHN0YXR1c190KU9LKTsKICAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKCk7CiAKLSAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IGNvbnRyb2wtPmdldFN1cmZhY2UoKTsKKyAgICAgICAgc3VyZmFjZSA9IGNvbnRyb2wtPmdldFN1cmZhY2UoKTsKICAgICAgICAgQ0hFQ0soc3VyZmFjZSAhPSBOVUxMKTsKKyAgICB9CiAKKyAgICBpZiAocGxheWJhY2spIHsKICAgICAgICAgc3A8U2ltcGxlUGxheWVyPiBwbGF5ZXIgPSBuZXcgU2ltcGxlUGxheWVyOwogICAgICAgICBsb29wZXItPnJlZ2lzdGVySGFuZGxlcihwbGF5ZXIpOwogCkBAIC0zOTYsMTAgKzQzNiwxMiBAQAogICAgICAgICBzbGVlcCg2MCk7CiAgICAgICAgIHBsYXllci0+c3RvcCgpOwogICAgICAgICBwbGF5ZXItPnJlc2V0KCk7Ci0KLSAgICAgICAgY29tcG9zZXJDbGllbnQtPmRpc3Bvc2UoKTsKICAgICB9IGVsc2UgewotICAgICAgICBkZWNvZGUobG9vcGVyLCBhcmd2WzBdLCB1c2VBdWRpbywgdXNlVmlkZW8pOworICAgICAgICBkZWNvZGUobG9vcGVyLCBhcmd2WzBdLCB1c2VBdWRpbywgdXNlVmlkZW8sIHN1cmZhY2UpOworICAgIH0KKworICAgIGlmIChwbGF5YmFjayB8fCAodXNlU3VyZmFjZSAmJiB1c2VWaWRlbykpIHsKKyAgICAgICAgY29tcG9zZXJDbGllbnQtPmRpc3Bvc2UoKTsKICAgICB9CiAKICAgICBsb29wZXItPnN0b3AoKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tayBiL2NtZHMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmMzJiYi4uMDAwMDAwMAotLS0gYS9jbWRzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JbWFpbl9zdXJmYWNlZmxpbmdlci5jcHAgCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYnN1cmZhY2VmbGluZ2VyIFwKLQlsaWJiaW5kZXIgXAotCWxpYnV0aWxzCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotCSQoTE9DQUxfUEFUSCkvLi4vLi4vc2VydmljZXMvc3VyZmFjZWZsaW5nZXIKLQotTE9DQUxfTU9EVUxFOj0gc3VyZmFjZWZsaW5nZXIKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jbWRzL3N1cmZhY2VmbGluZ2VyL21haW5fc3VyZmFjZWZsaW5nZXIuY3BwIGIvY21kcy9zdXJmYWNlZmxpbmdlci9tYWluX3N1cmZhY2VmbGluZ2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiY2Y1Yy4uMDAwMDAwMAotLS0gYS9jbWRzL3N1cmZhY2VmbGluZ2VyL21haW5fc3VyZmFjZWZsaW5nZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgotI2luY2x1ZGUgPFN1cmZhY2VGbGluZ2VyLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgICBTdXJmYWNlRmxpbmdlcjo6cHVibGlzaEFuZEpvaW5UaHJlYWRQb29sKHRydWUpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY21kcy9zeXN0ZW1fc2VydmVyL2xpYnJhcnkvQW5kcm9pZC5tayBiL2NtZHMvc3lzdGVtX3NlcnZlci9saWJyYXJ5L0FuZHJvaWQubWsKaW5kZXggZThhZmNlMy4uN2QwOGE4YyAxMDA2NDQKLS0tIGEvY21kcy9zeXN0ZW1fc2VydmVyL2xpYnJhcnkvQW5kcm9pZC5taworKysgYi9jbWRzL3N5c3RlbV9zZXJ2ZXIvbGlicmFyeS9BbmRyb2lkLm1rCkBAIC01LDEzICs1LDE0IEBACiAJc3lzdGVtX2luaXQuY3BwCiAKIGJhc2UgPSAkKExPQ0FMX1BBVEgpLy4uLy4uLy4uCituYXRpdmUgPSAkKExPQ0FMX1BBVEgpLy4uLy4uLy4uLy4uL25hdGl2ZQogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKGJhc2UpL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlIFwKIAkkKGJhc2UpL3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCi0JJChiYXNlKS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlciBcCiAJJChiYXNlKS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlIFwKIAkkKGJhc2UpL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSBcCisJJChuYXRpdmUpL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyIFwKIAkkKEpOSV9IX0lOQ0xVREUpCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA1ZmVlNGRlLi5hZGM3ZDM1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQXBwR2xvYmFsczsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwpAQCAtMzMsNiArMzQsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVnaXN0ZXJlZFNlcnZpY2VzQ2FjaGU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlZ2lzdGVyZWRTZXJ2aWNlc0NhY2hlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlVzZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKQEAgLTQ4LDExICs1MCwxNCBAQAogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuVXNlcklkOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSW5kZW50aW5nUHJpbnRXcml0ZXI7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKQEAgLTYyLDYgKzY3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CkBAIC05NCw3ICsxMDAsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RJTUVEX09VVCA9IDM7CiAKICAgICBwcml2YXRlIGZpbmFsIElBY2NvdW50QXV0aGVudGljYXRvckNhY2hlIG1BdXRoZW50aWNhdG9yQ2FjaGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUhlbHBlciBtT3BlbkhlbHBlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9BQ0NPVU5UUyA9ICJhY2NvdW50cyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRTX0lEID0gIl9pZCI7CkBAIC0xNDgsMTQgKzE1MywzNiBAQAogICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNlc3Npb24+IG1TZXNzaW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU2Vzc2lvbj4oKTsKICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbU5vdGlmaWNhdGlvbklkcyA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFBhaXI8UGFpcjxBY2NvdW50LCBTdHJpbmc+LCBJbnRlZ2VyPiwgSW50ZWdlcj4KLSAgICAgICAgICAgIG1DcmVkZW50aWFsc1Blcm1pc3Npb25Ob3RpZmljYXRpb25JZHMgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8UGFpcjxQYWlyPEFjY291bnQsIFN0cmluZz4sIEludGVnZXI+LCBJbnRlZ2VyPigpOwotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxBY2NvdW50LCBJbnRlZ2VyPiBtU2lnbmluUmVxdWlyZWROb3RpZmljYXRpb25JZHMgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8QWNjb3VudCwgSW50ZWdlcj4oKTsKKyAgICBzdGF0aWMgY2xhc3MgVXNlckFjY291bnRzIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdXNlcklkOworICAgICAgICBwcml2YXRlIGZpbmFsIERhdGFiYXNlSGVscGVyIG9wZW5IZWxwZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxQYWlyPFBhaXI8QWNjb3VudCwgU3RyaW5nPiwgSW50ZWdlcj4sIEludGVnZXI+CisgICAgICAgICAgICAgICAgY3JlZGVudGlhbHNQZXJtaXNzaW9uTm90aWZpY2F0aW9uSWRzID0KKyAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxQYWlyPFBhaXI8QWNjb3VudCwgU3RyaW5nPiwgSW50ZWdlcj4sIEludGVnZXI+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxBY2NvdW50LCBJbnRlZ2VyPiBzaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkcyA9CisgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8QWNjb3VudCwgSW50ZWdlcj4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgY2FjaGVMb2NrID0gbmV3IE9iamVjdCgpOworICAgICAgICAvKiogcHJvdGVjdGVkIGJ5IHRoZSB7QGxpbmsgI2NhY2hlTG9ja30gKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQWNjb3VudFtdPiBhY2NvdW50Q2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFjY291bnRbXT4oKTsKKyAgICAgICAgLyoqIHByb3RlY3RlZCBieSB0aGUge0BsaW5rICNjYWNoZUxvY2t9ICovCisgICAgICAgIHByaXZhdGUgSGFzaE1hcDxBY2NvdW50LCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPj4gdXNlckRhdGFDYWNoZSA9CisgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8QWNjb3VudCwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4+KCk7CisgICAgICAgIC8qKiBwcm90ZWN0ZWQgYnkgdGhlIHtAbGluayAjY2FjaGVMb2NrfSAqLworICAgICAgICBwcml2YXRlIEhhc2hNYXA8QWNjb3VudCwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4+IGF1dGhUb2tlbkNhY2hlID0KKyAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxBY2NvdW50LCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPj4oKTsKKworICAgICAgICBVc2VyQWNjb3VudHMoQ29udGV4dCBjb250ZXh0LCBpbnQgdXNlcklkKSB7CisgICAgICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGVMb2NrKSB7CisgICAgICAgICAgICAgICAgb3BlbkhlbHBlciA9IG5ldyBEYXRhYmFzZUhlbHBlcihjb250ZXh0LCB1c2VySWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxVc2VyQWNjb3VudHM+IG1Vc2VycyA9IG5ldyBTcGFyc2VBcnJheTxVc2VyQWNjb3VudHM+KCk7CisKICAgICBwcml2YXRlIHN0YXRpYyBBdG9taWNSZWZlcmVuY2U8QWNjb3VudE1hbmFnZXJTZXJ2aWNlPiBzVGhpcyA9CiAgICAgICAgICAgICBuZXcgQXRvbWljUmVmZXJlbmNlPEFjY291bnRNYW5hZ2VyU2VydmljZT4oKTsKLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjY291bnRbXSBFTVBUWV9BQ0NPVU5UX0FSUkFZID0gbmV3IEFjY291bnRbXXt9OwogCiAgICAgc3RhdGljIHsKQEAgLTE2MywxNSArMTkwLDYgQEAKICAgICAgICAgQUNDT1VOVFNfQ0hBTkdFRF9JTlRFTlQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtQ2FjaGVMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIC8qKiBwcm90ZWN0ZWQgYnkgdGhlIHtAbGluayAjbUNhY2hlTG9ja30gKi8KLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBBY2NvdW50W10+IG1BY2NvdW50Q2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFjY291bnRbXT4oKTsKLSAgICAvKiogcHJvdGVjdGVkIGJ5IHRoZSB7QGxpbmsgI21DYWNoZUxvY2t9ICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwPEFjY291bnQsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+PiBtVXNlckRhdGFDYWNoZSA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxBY2NvdW50LCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAvKiogcHJvdGVjdGVkIGJ5IHRoZSB7QGxpbmsgI21DYWNoZUxvY2t9ICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwPEFjY291bnQsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+PiBtQXV0aFRva2VuQ2FjaGUgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8QWNjb3VudCwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4+KCk7CiAKICAgICAvKioKICAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBzeXN0ZW0gY29kZS4gT25lIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBhZnRlciB0aGUgc2VydmljZQpAQCAtMTkyLDEwICsyMTAsNiBAQAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IHBhY2thZ2VNYW5hZ2VyOwogCi0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgbU9wZW5IZWxwZXIgPSBuZXcgRGF0YWJhc2VIZWxwZXIobUNvbnRleHQpOwotICAgICAgICB9Ci0KICAgICAgICAgbU1lc3NhZ2VUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQWNjb3VudE1hbmFnZXJTZXJ2aWNlIik7CiAgICAgICAgIG1NZXNzYWdlVGhyZWFkLnN0YXJ0KCk7CiAgICAgICAgIG1NZXNzYWdlSGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihtTWVzc2FnZVRocmVhZC5nZXRMb29wZXIoKSk7CkBAIC0yMDMsNiArMjE3LDggQEAKICAgICAgICAgbUF1dGhlbnRpY2F0b3JDYWNoZSA9IGF1dGhlbnRpY2F0b3JDYWNoZTsKICAgICAgICAgbUF1dGhlbnRpY2F0b3JDYWNoZS5zZXRMaXN0ZW5lcih0aGlzLCBudWxsIC8qIEhhbmRsZXIgKi8pOwogCisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGluaXRVc2VyKDApOworCiAgICAgICAgIHNUaGlzLnNldCh0aGlzKTsKIAogICAgICAgICBJbnRlbnRGaWx0ZXIgaW50ZW50RmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwpAQCAtMjExLDE3ICsyMjcsMzYgQEAKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQxLCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICAgICAgcHVyZ2VPbGRHcmFudHMoKTsKKyAgICAgICAgICAgICAgICBwdXJnZU9sZEdyYW50c0FsbCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9LCBpbnRlbnRGaWx0ZXIpOwotICAgICAgICBwdXJnZU9sZEdyYW50cygpOwogCi0gICAgICAgIHZhbGlkYXRlQWNjb3VudHNBbmRQb3B1bGF0ZUNhY2hlKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHB1cmdlT2xkR3JhbnRzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgIHByaXZhdGUgVXNlckFjY291bnRzIGluaXRVc2VyKGludCB1c2VySWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtVXNlcnMpIHsKKyAgICAgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IG1Vc2Vycy5nZXQodXNlcklkKTsKKyAgICAgICAgICAgIGlmIChhY2NvdW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWNjb3VudHMgPSBuZXcgVXNlckFjY291bnRzKG1Db250ZXh0LCB1c2VySWQpOworICAgICAgICAgICAgICAgIG1Vc2Vycy5hcHBlbmQodXNlcklkLCBhY2NvdW50cyk7CisgICAgICAgICAgICAgICAgcHVyZ2VPbGRHcmFudHMoYWNjb3VudHMpOworICAgICAgICAgICAgICAgIHZhbGlkYXRlQWNjb3VudHNBbmRQb3B1bGF0ZUNhY2hlKGFjY291bnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhY2NvdW50czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwdXJnZU9sZEdyYW50c0FsbCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtVXNlcnMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVVzZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgcHVyZ2VPbGRHcmFudHMobVVzZXJzLnZhbHVlQXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHB1cmdlT2xkR3JhbnRzKFVzZXJBY2NvdW50cyBhY2NvdW50cykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBhY2NvdW50cy5vcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKICAgICAgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBkYi5xdWVyeShUQUJMRV9HUkFOVFMsCiAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtHUkFOVFNfR1JBTlRFRV9VSUR9LAogICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBHUkFOVFNfR1JBTlRFRV9VSUQsIG51bGwsIG51bGwpOwpAQCAtMjQzLDE1ICsyNzgsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUFjY291bnRzQW5kUG9wdWxhdGVDYWNoZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVBY2NvdW50c0FuZFBvcHVsYXRlQ2FjaGUoVXNlckFjY291bnRzIGFjY291bnRzKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoYWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IGFjY291bnRzLm9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOwogICAgICAgICAgICAgYm9vbGVhbiBhY2NvdW50RGVsZXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGRiLnF1ZXJ5KFRBQkxFX0FDQ09VTlRTLAogICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117QUNDT1VOVFNfSUQsIEFDQ09VTlRTX1RZUEUsIEFDQ09VTlRTX05BTUV9LAogICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUFjY291bnRDYWNoZS5jbGVhcigpOworICAgICAgICAgICAgICAgIGFjY291bnRzLmFjY291bnRDYWNoZS5jbGVhcigpOwogICAgICAgICAgICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4gYWNjb3VudE5hbWVzQnlUeXBlID0KICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+KCk7CiAgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKQEAgLTI2NSw4ICszMDAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZGIuZGVsZXRlKFRBQkxFX0FDQ09VTlRTLCBBQ0NPVU5UU19JRCArICI9IiArIGFjY291bnRJZCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50RGVsZXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQgPSBuZXcgQWNjb3VudChhY2NvdW50TmFtZSwgYWNjb3VudFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhQ2FjaGUucmVtb3ZlKGFjY291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1dGhUb2tlbkNhY2hlLnJlbW92ZShhY2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRzLnVzZXJEYXRhQ2FjaGUucmVtb3ZlKGFjY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudHMuYXV0aFRva2VuQ2FjaGUucmVtb3ZlKGFjY291bnQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWNjb3VudE5hbWVzID0gYWNjb3VudE5hbWVzQnlUeXBlLmdldChhY2NvdW50VHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWNjb3VudE5hbWVzID09IG51bGwpIHsKQEAgLTI4NiwxOSArMzIxLDUxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50c0ZvclR5cGVbaV0gPSBuZXcgQWNjb3VudChhY2NvdW50TmFtZSwgYWNjb3VudFR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgKytpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1BY2NvdW50Q2FjaGUucHV0KGFjY291bnRUeXBlLCBhY2NvdW50c0ZvclR5cGUpOworICAgICAgICAgICAgICAgICAgICBhY2NvdW50cy5hY2NvdW50Q2FjaGUucHV0KGFjY291bnRUeXBlLCBhY2NvdW50c0ZvclR5cGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGFjY291bnREZWxldGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdChhY2NvdW50cy51c2VySWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgVXNlckFjY291bnRzIGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpIHsKKyAgICAgICAgcmV0dXJuIGdldFVzZXJBY2NvdW50cyhVc2VySWQuZ2V0Q2FsbGluZ1VzZXJJZCgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVXNlckFjY291bnRzIGdldFVzZXJBY2NvdW50cyhpbnQgdXNlcklkKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVVzZXJzKSB7CisgICAgICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBtVXNlcnMuZ2V0KHVzZXJJZCk7CisgICAgICAgICAgICBpZiAoYWNjb3VudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFjY291bnRzID0gaW5pdFVzZXIodXNlcklkKTsKKyAgICAgICAgICAgICAgICBtVXNlcnMuYXBwZW5kKHVzZXJJZCwgYWNjb3VudHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFjY291bnRzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFVzZXJJbmZvPiBnZXRBbGxVc2VycygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBBcHBHbG9iYWxzLmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0VXNlcnMoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAvLyBMb2NhbCB0byBzeXN0ZW0gcHJvY2Vzcywgc2hvdWxkbid0IGhhcHBlbgorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNoYW5nZWQoQXV0aGVudGljYXRvckRlc2NyaXB0aW9uIGRlc2MsIGJvb2xlYW4gcmVtb3ZlZCkgewotICAgICAgICB2YWxpZGF0ZUFjY291bnRzQW5kUG9wdWxhdGVDYWNoZSgpOworICAgICAgICAvLyBWYWxpZGF0ZSBhY2NvdW50cyBmb3IgYWxsIHVzZXJzCisgICAgICAgIExpc3Q8VXNlckluZm8+IHVzZXJzID0gZ2V0QWxsVXNlcnMoKTsKKyAgICAgICAgaWYgKHVzZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlQWNjb3VudHNBbmRQb3B1bGF0ZUNhY2hlKGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoVXNlckluZm8gdXNlciA6IHVzZXJzKSB7CisgICAgICAgICAgICAgICAgdmFsaWRhdGVBY2NvdW50c0FuZFBvcHVsYXRlQ2FjaGUoZ2V0VXNlckFjY291bnRzKHVzZXIuaWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoQWNjb3VudCBhY2NvdW50KSB7CkBAIC0zMTAsMjEgKzM3NywyMiBAQAogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50IGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tBdXRoZW50aWNhdGVBY2NvdW50c1Blcm1pc3Npb24oYWNjb3VudCk7CiAKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZFBhc3N3b3JkSW50ZXJuYWwoYWNjb3VudCk7CisgICAgICAgICAgICByZXR1cm4gcmVhZFBhc3N3b3JkSW50ZXJuYWwoYWNjb3VudHMsIGFjY291bnQpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nIHJlYWRQYXNzd29yZEludGVybmFsKEFjY291bnQgYWNjb3VudCkgeworICAgIHByaXZhdGUgU3RyaW5nIHJlYWRQYXNzd29yZEludGVybmFsKFVzZXJBY2NvdW50cyBhY2NvdW50cywgQWNjb3VudCBhY2NvdW50KSB7CiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gYWNjb3VudHMub3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CiAgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gZGIucXVlcnkoVEFCTEVfQUNDT1VOVFMsIG5ldyBTdHJpbmdbXXtBQ0NPVU5UU19QQVNTV09SRH0sCiAgICAgICAgICAgICAgICAgICAgIEFDQ09VTlRTX05BTUUgKyAiPT8gQU5EICIgKyBBQ0NPVU5UU19UWVBFKyAiPT8iLAogICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117YWNjb3VudC5uYW1lLCBhY2NvdW50LnR5cGV9LCBudWxsLCBudWxsLCBudWxsKTsKQEAgLTM0OSw5ICs0MTcsMTAgQEAKICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWNjb3VudCBpcyBudWxsIik7CiAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tBdXRoZW50aWNhdGVBY2NvdW50c1Blcm1pc3Npb24oYWNjb3VudCk7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpOwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWRVc2VyRGF0YUludGVybmFsKGFjY291bnQsIGtleSk7CisgICAgICAgICAgICByZXR1cm4gcmVhZFVzZXJEYXRhSW50ZXJuYWwoYWNjb3VudHMsIGFjY291bnQsIGtleSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CkBAIC0zOTAsMjEgKzQ1OSwyMyBAQAogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50IGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tBdXRoZW50aWNhdGVBY2NvdW50c1Blcm1pc3Npb24oYWNjb3VudCk7CiAKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIC8vIGZhaWxzIGlmIHRoZSBhY2NvdW50IGFscmVhZHkgZXhpc3RzCiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkQWNjb3VudEludGVybmFsKGFjY291bnQsIHBhc3N3b3JkLCBleHRyYXMpOworICAgICAgICAgICAgcmV0dXJuIGFkZEFjY291bnRJbnRlcm5hbChhY2NvdW50cywgYWNjb3VudCwgcGFzc3dvcmQsIGV4dHJhcyk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGFkZEFjY291bnRJbnRlcm5hbChBY2NvdW50IGFjY291bnQsIFN0cmluZyBwYXNzd29yZCwgQnVuZGxlIGV4dHJhcykgeworICAgIHByaXZhdGUgYm9vbGVhbiBhZGRBY2NvdW50SW50ZXJuYWwoVXNlckFjY291bnRzIGFjY291bnRzLCBBY2NvdW50IGFjY291bnQsIFN0cmluZyBwYXNzd29yZCwKKyAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoYWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IGFjY291bnRzLm9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOwogICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBsb25nIG51bU1hdGNoZXMgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShkYiwKQEAgLTQzNywxMSArNTA4LDExIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICAgICAgaW5zZXJ0QWNjb3VudEludG9DYWNoZUxvY2tlZChhY2NvdW50KTsKKyAgICAgICAgICAgICAgICBpbnNlcnRBY2NvdW50SW50b0NhY2hlTG9ja2VkKGFjY291bnRzLCBhY2NvdW50KTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoYWNjb3VudHMudXNlcklkKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtNDY3LDkgKzUzOCwxMCBAQAogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50IGlzIG51bGwiKTsKICAgICAgICAgaWYgKGZlYXR1cmVzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZlYXR1cmVzIGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tSZWFkQWNjb3VudHNQZXJtaXNzaW9uKCk7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpOwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IFRlc3RGZWF0dXJlc1Nlc3Npb24ocmVzcG9uc2UsIGFjY291bnQsIGZlYXR1cmVzKS5iaW5kKCk7CisgICAgICAgICAgICBuZXcgVGVzdEZlYXR1cmVzU2Vzc2lvbihhY2NvdW50cywgcmVzcG9uc2UsIGFjY291bnQsIGZlYXR1cmVzKS5iaW5kKCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CkBAIC00NzksOSArNTUxLDkgQEAKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtRmVhdHVyZXM7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQWNjb3VudCBtQWNjb3VudDsKIAotICAgICAgICBwdWJsaWMgVGVzdEZlYXR1cmVzU2Vzc2lvbihJQWNjb3VudE1hbmFnZXJSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgcHVibGljIFRlc3RGZWF0dXJlc1Nlc3Npb24oVXNlckFjY291bnRzIGFjY291bnRzLCBJQWNjb3VudE1hbmFnZXJSZXNwb25zZSByZXNwb25zZSwKICAgICAgICAgICAgICAgICBBY2NvdW50IGFjY291bnQsIFN0cmluZ1tdIGZlYXR1cmVzKSB7Ci0gICAgICAgICAgICBzdXBlcihyZXNwb25zZSwgYWNjb3VudC50eXBlLCBmYWxzZSAvKiBleHBlY3RBY3Rpdml0eUxhdW5jaCAqLywKKyAgICAgICAgICAgIHN1cGVyKGFjY291bnRzLCByZXNwb25zZSwgYWNjb3VudC50eXBlLCBmYWxzZSAvKiBleHBlY3RBY3Rpdml0eUxhdW5jaCAqLywKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzdHJpcEF1dGhUb2tlbkZyb21SZXN1bHQgKi8pOwogICAgICAgICAgICAgbUZlYXR1cmVzID0gZmVhdHVyZXM7CiAgICAgICAgICAgICBtQWNjb3VudCA9IGFjY291bnQ7CkBAIC01MzcsMjEgKzYwOSwyMiBAQAogICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVzcG9uc2UgaXMgbnVsbCIpOwogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50IGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tNYW5hZ2VBY2NvdW50c1Blcm1pc3Npb24oKTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAKLSAgICAgICAgY2FuY2VsTm90aWZpY2F0aW9uKGdldFNpZ25pblJlcXVpcmVkTm90aWZpY2F0aW9uSWQoYWNjb3VudCkpOwotICAgICAgICBzeW5jaHJvbml6ZWQobUNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcykgeworICAgICAgICBjYW5jZWxOb3RpZmljYXRpb24oZ2V0U2lnbmluUmVxdWlyZWROb3RpZmljYXRpb25JZChhY2NvdW50cywgYWNjb3VudCkpOworICAgICAgICBzeW5jaHJvbml6ZWQoYWNjb3VudHMuY3JlZGVudGlhbHNQZXJtaXNzaW9uTm90aWZpY2F0aW9uSWRzKSB7CiAgICAgICAgICAgICBmb3IgKFBhaXI8UGFpcjxBY2NvdW50LCBTdHJpbmc+LCBJbnRlZ2VyPiBwYWlyOgotICAgICAgICAgICAgICAgIG1DcmVkZW50aWFsc1Blcm1pc3Npb25Ob3RpZmljYXRpb25JZHMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBhY2NvdW50cy5jcmVkZW50aWFsc1Blcm1pc3Npb25Ob3RpZmljYXRpb25JZHMua2V5U2V0KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoYWNjb3VudC5lcXVhbHMocGFpci5maXJzdC5maXJzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gbUNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcy5nZXQocGFpcik7CisgICAgICAgICAgICAgICAgICAgIGludCBpZCA9IGFjY291bnRzLmNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcy5nZXQocGFpcik7CiAgICAgICAgICAgICAgICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihpZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBSZW1vdmVBY2NvdW50U2Vzc2lvbihyZXNwb25zZSwgYWNjb3VudCkuYmluZCgpOworICAgICAgICAgICAgbmV3IFJlbW92ZUFjY291bnRTZXNzaW9uKGFjY291bnRzLCByZXNwb25zZSwgYWNjb3VudCkuYmluZCgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKICAgICAgICAgfQpAQCAtNTU5LDggKzYzMiw5IEBACiAKICAgICBwcml2YXRlIGNsYXNzIFJlbW92ZUFjY291bnRTZXNzaW9uIGV4dGVuZHMgU2Vzc2lvbiB7CiAgICAgICAgIGZpbmFsIEFjY291bnQgbUFjY291bnQ7Ci0gICAgICAgIHB1YmxpYyBSZW1vdmVBY2NvdW50U2Vzc2lvbihJQWNjb3VudE1hbmFnZXJSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgICAgICBzdXBlcihyZXNwb25zZSwgYWNjb3VudC50eXBlLCBmYWxzZSAvKiBleHBlY3RBY3Rpdml0eUxhdW5jaCAqLywKKyAgICAgICAgcHVibGljIFJlbW92ZUFjY291bnRTZXNzaW9uKFVzZXJBY2NvdW50cyBhY2NvdW50cywgSUFjY291bnRNYW5hZ2VyUmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgQWNjb3VudCBhY2NvdW50KSB7CisgICAgICAgICAgICBzdXBlcihhY2NvdW50cywgcmVzcG9uc2UsIGFjY291bnQudHlwZSwgZmFsc2UgLyogZXhwZWN0QWN0aXZpdHlMYXVuY2ggKi8sCiAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogc3RyaXBBdXRoVG9rZW5Gcm9tUmVzdWx0ICovKTsKICAgICAgICAgICAgIG1BY2NvdW50ID0gYWNjb3VudDsKICAgICAgICAgfQpAQCAtNTc5LDcgKzY1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICYmICFyZXN1bHQuY29udGFpbnNLZXkoQWNjb3VudE1hbmFnZXIuS0VZX0lOVEVOVCkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlbW92YWxBbGxvd2VkID0gcmVzdWx0LmdldEJvb2xlYW4oQWNjb3VudE1hbmFnZXIuS0VZX0JPT0xFQU5fUkVTVUxUKTsKICAgICAgICAgICAgICAgICBpZiAocmVtb3ZhbEFsbG93ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQWNjb3VudEludGVybmFsKG1BY2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQWNjb3VudEludGVybmFsKG1BY2NvdW50cywgbUFjY291bnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBJQWNjb3VudE1hbmFnZXJSZXNwb25zZSByZXNwb25zZSA9IGdldFJlc3BvbnNlQW5kQ2xvc2UoKTsKICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgewpAQCAtNjAwLDEzICs2NzQsMTggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qIEZvciB0ZXN0aW5nICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWNjb3VudEludGVybmFsKEFjY291bnQgYWNjb3VudCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICByZW1vdmVBY2NvdW50SW50ZXJuYWwoZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCksIGFjY291bnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVBY2NvdW50SW50ZXJuYWwoVXNlckFjY291bnRzIGFjY291bnRzLCBBY2NvdW50IGFjY291bnQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gYWNjb3VudHMub3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CiAgICAgICAgICAgICBkYi5kZWxldGUoVEFCTEVfQUNDT1VOVFMsIEFDQ09VTlRTX05BTUUgKyAiPT8gQU5EICIgKyBBQ0NPVU5UU19UWVBFKyAiPT8iLAogICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117YWNjb3VudC5uYW1lLCBhY2NvdW50LnR5cGV9KTsKLSAgICAgICAgICAgIHJlbW92ZUFjY291bnRGcm9tQ2FjaGVMb2NrZWQoYWNjb3VudCk7Ci0gICAgICAgICAgICBzZW5kQWNjb3VudHNDaGFuZ2VkQnJvYWRjYXN0KCk7CisgICAgICAgICAgICByZW1vdmVBY2NvdW50RnJvbUNhY2hlTG9ja2VkKGFjY291bnRzLCBhY2NvdW50KTsKKyAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoYWNjb3VudHMudXNlcklkKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjE5LDEzICs2OTgsMTQgQEAKICAgICAgICAgaWYgKGFjY291bnRUeXBlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnRUeXBlIGlzIG51bGwiKTsKICAgICAgICAgaWYgKGF1dGhUb2tlbiA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhdXRoVG9rZW4gaXMgbnVsbCIpOwogICAgICAgICBjaGVja01hbmFnZUFjY291bnRzT3JVc2VDcmVkZW50aWFsc1Blcm1pc3Npb25zKCk7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpOwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gYWNjb3VudHMub3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CiAgICAgICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVBdXRoVG9rZW5Mb2NrZWQoZGIsIGFjY291bnRUeXBlLCBhdXRoVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQXV0aFRva2VuTG9ja2VkKGFjY291bnRzLCBkYiwgYWNjb3VudFR5cGUsIGF1dGhUb2tlbik7CiAgICAgICAgICAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwogICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CkBAIC02MzYsNyArNzE2LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBpbnZhbGlkYXRlQXV0aFRva2VuTG9ja2VkKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgYWNjb3VudFR5cGUsIFN0cmluZyBhdXRoVG9rZW4pIHsKKyAgICBwcml2YXRlIHZvaWQgaW52YWxpZGF0ZUF1dGhUb2tlbkxvY2tlZChVc2VyQWNjb3VudHMgYWNjb3VudHMsIFNRTGl0ZURhdGFiYXNlIGRiLAorICAgICAgICAgICAgU3RyaW5nIGFjY291bnRUeXBlLCBTdHJpbmcgYXV0aFRva2VuKSB7CiAgICAgICAgIGlmIChhdXRoVG9rZW4gPT0gbnVsbCB8fCBhY2NvdW50VHlwZSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTY1Nyw3ICs3MzgsNyBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBhY2NvdW50TmFtZSA9IGN1cnNvci5nZXRTdHJpbmcoMSk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhUb2tlblR5cGUgPSBjdXJzb3IuZ2V0U3RyaW5nKDIpOwogICAgICAgICAgICAgICAgIGRiLmRlbGV0ZShUQUJMRV9BVVRIVE9LRU5TLCBBVVRIVE9LRU5TX0lEICsgIj0iICsgYXV0aFRva2VuSWQsIG51bGwpOwotICAgICAgICAgICAgICAgIHdyaXRlQXV0aFRva2VuSW50b0NhY2hlTG9ja2VkKGRiLCBuZXcgQWNjb3VudChhY2NvdW50TmFtZSwgYWNjb3VudFR5cGUpLAorICAgICAgICAgICAgICAgIHdyaXRlQXV0aFRva2VuSW50b0NhY2hlTG9ja2VkKGFjY291bnRzLCBkYiwgbmV3IEFjY291bnQoYWNjb3VudE5hbWUsIGFjY291bnRUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhUb2tlblR5cGUsIG51bGwpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewpAQCAtNjY1LDEzICs3NDYsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBzYXZlQXV0aFRva2VuVG9EYXRhYmFzZShBY2NvdW50IGFjY291bnQsIFN0cmluZyB0eXBlLCBTdHJpbmcgYXV0aFRva2VuKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIHNhdmVBdXRoVG9rZW5Ub0RhdGFiYXNlKFVzZXJBY2NvdW50cyBhY2NvdW50cywgQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgdHlwZSwKKyAgICAgICAgICAgIFN0cmluZyBhdXRoVG9rZW4pIHsKICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCB8fCB0eXBlID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBjYW5jZWxOb3RpZmljYXRpb24oZ2V0U2lnbmluUmVxdWlyZWROb3RpZmljYXRpb25JZChhY2NvdW50KSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihnZXRTaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkKGFjY291bnRzLCBhY2NvdW50KSk7CisgICAgICAgIHN5bmNocm9uaXplZCAoYWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IGFjY291bnRzLm9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOwogICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBsb25nIGFjY291bnRJZCA9IGdldEFjY291bnRJZExvY2tlZChkYiwgYWNjb3VudCk7CkBAIC02ODcsNyArNzY5LDcgQEAKICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEFVVEhUT0tFTlNfQVVUSFRPS0VOLCBhdXRoVG9rZW4pOwogICAgICAgICAgICAgICAgIGlmIChkYi5pbnNlcnQoVEFCTEVfQVVUSFRPS0VOUywgQVVUSFRPS0VOU19BVVRIVE9LRU4sIHZhbHVlcykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVBdXRoVG9rZW5JbnRvQ2FjaGVMb2NrZWQoZGIsIGFjY291bnQsIHR5cGUsIGF1dGhUb2tlbik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlQXV0aFRva2VuSW50b0NhY2hlTG9ja2VkKGFjY291bnRzLCBkYiwgYWNjb3VudCwgdHlwZSwgYXV0aFRva2VuKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTcwNyw5ICs3ODksMTAgQEAKICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWNjb3VudCBpcyBudWxsIik7CiAgICAgICAgIGlmIChhdXRoVG9rZW5UeXBlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImF1dGhUb2tlblR5cGUgaXMgbnVsbCIpOwogICAgICAgICBjaGVja0F1dGhlbnRpY2F0ZUFjY291bnRzUGVybWlzc2lvbihhY2NvdW50KTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZEF1dGhUb2tlbkludGVybmFsKGFjY291bnQsIGF1dGhUb2tlblR5cGUpOworICAgICAgICAgICAgcmV0dXJuIHJlYWRBdXRoVG9rZW5JbnRlcm5hbChhY2NvdW50cywgYWNjb3VudCwgYXV0aFRva2VuVHlwZSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CkBAIC03MjUsOSArODA4LDEwIEBACiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnQgaXMgbnVsbCIpOwogICAgICAgICBpZiAoYXV0aFRva2VuVHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhdXRoVG9rZW5UeXBlIGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tBdXRoZW50aWNhdGVBY2NvdW50c1Blcm1pc3Npb24oYWNjb3VudCk7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpOwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc2F2ZUF1dGhUb2tlblRvRGF0YWJhc2UoYWNjb3VudCwgYXV0aFRva2VuVHlwZSwgYXV0aFRva2VuKTsKKyAgICAgICAgICAgIHNhdmVBdXRoVG9rZW5Ub0RhdGFiYXNlKGFjY291bnRzLCBhY2NvdW50LCBhdXRoVG9rZW5UeXBlLCBhdXRoVG9rZW4pOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKICAgICAgICAgfQpAQCAtNzQxLDIwICs4MjUsMjEgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50IGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tBdXRoZW50aWNhdGVBY2NvdW50c1Blcm1pc3Npb24oYWNjb3VudCk7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpOwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0UGFzc3dvcmRJbnRlcm5hbChhY2NvdW50LCBwYXNzd29yZCk7CisgICAgICAgICAgICBzZXRQYXNzd29yZEludGVybmFsKGFjY291bnRzLCBhY2NvdW50LCBwYXNzd29yZCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNldFBhc3N3b3JkSW50ZXJuYWwoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICBwcml2YXRlIHZvaWQgc2V0UGFzc3dvcmRJbnRlcm5hbChVc2VyQWNjb3VudHMgYWNjb3VudHMsIEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHBhc3N3b3JkKSB7CiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBhY2NvdW50cy5vcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKICAgICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwpAQCAtNzY0LDIwICs4NDksMjAgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gYXJnc0FjY291bnRJZCA9IHtTdHJpbmcudmFsdWVPZihhY2NvdW50SWQpfTsKICAgICAgICAgICAgICAgICAgICAgZGIudXBkYXRlKFRBQkxFX0FDQ09VTlRTLCB2YWx1ZXMsIEFDQ09VTlRTX0lEICsgIj0/IiwgYXJnc0FjY291bnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIGRiLmRlbGV0ZShUQUJMRV9BVVRIVE9LRU5TLCBBVVRIVE9LRU5TX0FDQ09VTlRTX0lEICsgIj0/IiwgYXJnc0FjY291bnRJZCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdXRoVG9rZW5DYWNoZS5yZW1vdmUoYWNjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGFjY291bnRzLmF1dGhUb2tlbkNhY2hlLnJlbW92ZShhY2NvdW50KTsKICAgICAgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOworICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdChhY2NvdW50cy51c2VySWQpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKSB7CisgICAgcHJpdmF0ZSB2b2lkIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoaW50IHVzZXJJZCkgewogICAgICAgICBMb2cuaShUQUcsICJ0aGUgYWNjb3VudHMgY2hhbmdlZCwgc2VuZGluZyBicm9hZGNhc3Qgb2YgIgogICAgICAgICAgICAgICAgICsgQUNDT1VOVFNfQ0hBTkdFRF9JTlRFTlQuZ2V0QWN0aW9uKCkpOwotICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KEFDQ09VTlRTX0NIQU5HRURfSU5URU5UKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChBQ0NPVU5UU19DSEFOR0VEX0lOVEVOVCwgdXNlcklkKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjbGVhclBhc3N3b3JkKEFjY291bnQgYWNjb3VudCkgewpAQCAtNzg4LDkgKzg3MywxMCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnQgaXMgbnVsbCIpOwogICAgICAgICBjaGVja01hbmFnZUFjY291bnRzUGVybWlzc2lvbigpOworICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKTsKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldFBhc3N3b3JkSW50ZXJuYWwoYWNjb3VudCwgbnVsbCk7CisgICAgICAgICAgICBzZXRQYXNzd29yZEludGVybmFsKGFjY291bnRzLCBhY2NvdW50LCBudWxsKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CiAgICAgICAgIH0KQEAgLTgwNiwyMCArODkyLDIyIEBACiAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IGlzIG51bGwiKTsKICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWNjb3VudCBpcyBudWxsIik7CiAgICAgICAgIGNoZWNrQXV0aGVudGljYXRlQWNjb3VudHNQZXJtaXNzaW9uKGFjY291bnQpOworICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKTsKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldFVzZXJkYXRhSW50ZXJuYWwoYWNjb3VudCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBzZXRVc2VyZGF0YUludGVybmFsKGFjY291bnRzLCBhY2NvdW50LCBrZXksIHZhbHVlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0VXNlcmRhdGFJbnRlcm5hbChBY2NvdW50IGFjY291bnQsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZXRVc2VyZGF0YUludGVybmFsKFVzZXJBY2NvdW50cyBhY2NvdW50cywgQWNjb3VudCBhY2NvdW50LCBTdHJpbmcga2V5LAorICAgICAgICAgICAgU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwgfHwga2V5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBhY2NvdW50cy5vcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKICAgICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbG9uZyBhY2NvdW50SWQgPSBnZXRBY2NvdW50SWRMb2NrZWQoZGIsIGFjY291bnQpOwpAQCAtODQwLDcgKzkyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cml0ZVVzZXJEYXRhSW50b0NhY2hlTG9ja2VkKGRiLCBhY2NvdW50LCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB3cml0ZVVzZXJEYXRhSW50b0NhY2hlTG9ja2VkKGFjY291bnRzLCBkYiwgYWNjb3VudCwga2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CkBAIC04NjgsMTUgKzk1NiwxNiBAQAogICAgIH0KIAogICAgIHZvaWQgZ2V0QXV0aFRva2VuTGFiZWwoZmluYWwgSUFjY291bnRNYW5hZ2VyUmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQsIGZpbmFsIFN0cmluZyBhdXRoVG9rZW5UeXBlKSB7CisgICAgICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXV0aFRva2VuVHlwZSwgaW50IHVpZCkgewogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50IGlzIG51bGwiKTsKICAgICAgICAgaWYgKGF1dGhUb2tlblR5cGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXV0aFRva2VuVHlwZSBpcyBudWxsIik7CiAKICAgICAgICAgY2hlY2tCaW5kZXJQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uVVNFX0NSRURFTlRJQUxTKTsKLQorICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHMoVXNlcklkLmdldFVzZXJJZCh1aWQpKTsKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBTZXNzaW9uKHJlc3BvbnNlLCBhY2NvdW50LnR5cGUsIGZhbHNlLAorICAgICAgICAgICAgbmV3IFNlc3Npb24oYWNjb3VudHMsIHJlc3BvbnNlLCBhY2NvdW50LnR5cGUsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBzdHJpcEF1dGhUb2tlbkZyb21SZXN1bHQgKi8pIHsKICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHRvRGVidWdTdHJpbmcobG9uZyBub3cpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvRGVidWdTdHJpbmcobm93KSArICIsIGdldEF1dGhUb2tlbkxhYmVsIgpAQCAtOTIxLDYgKzEwMTAsNyBAQAogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50IGlzIG51bGwiKTsKICAgICAgICAgaWYgKGF1dGhUb2tlblR5cGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXV0aFRva2VuVHlwZSBpcyBudWxsIik7CiAgICAgICAgIGNoZWNrQmluZGVyUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLlVTRV9DUkVERU5USUFMUyk7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpOwogICAgICAgICBBY2NvdW50QXV0aGVudGljYXRvckNhY2hlLlNlcnZpY2VJbmZvPEF1dGhlbnRpY2F0b3JEZXNjcmlwdGlvbj4gYXV0aGVudGljYXRvckluZm8gPQogICAgICAgICAgICAgbUF1dGhlbnRpY2F0b3JDYWNoZS5nZXRTZXJ2aWNlSW5mbygKICAgICAgICAgICAgICAgICAgICAgQXV0aGVudGljYXRvckRlc2NyaXB0aW9uLm5ld0tleShhY2NvdW50LnR5cGUpKTsKQEAgLTk0Niw3ICsxMDM2LDcgQEAKICAgICAgICAgICAgIC8vIGlmIHRoZSBjYWxsZXIgaGFzIHBlcm1pc3Npb24sIGRvIHRoZSBwZWVrLiBvdGhlcndpc2UgZ28gdGhlIG1vcmUgZXhwZW5zaXZlCiAgICAgICAgICAgICAvLyByb3V0ZSBvZiBzdGFydGluZyBhIFNlc3Npb24KICAgICAgICAgICAgIGlmICghY3VzdG9tVG9rZW5zICYmIHBlcm1pc3Npb25HcmFudGVkKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhUb2tlbiA9IHJlYWRBdXRoVG9rZW5JbnRlcm5hbChhY2NvdW50LCBhdXRoVG9rZW5UeXBlKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aFRva2VuID0gcmVhZEF1dGhUb2tlbkludGVybmFsKGFjY291bnRzLCBhY2NvdW50LCBhdXRoVG9rZW5UeXBlKTsKICAgICAgICAgICAgICAgICBpZiAoYXV0aFRva2VuICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIHJlc3VsdCA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQVVUSFRPS0VOLCBhdXRoVG9rZW4pOwpAQCAtOTU3LDcgKzEwNDcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbmV3IFNlc3Npb24ocmVzcG9uc2UsIGFjY291bnQudHlwZSwgZXhwZWN0QWN0aXZpdHlMYXVuY2gsCisgICAgICAgICAgICBuZXcgU2Vzc2lvbihhY2NvdW50cywgcmVzcG9uc2UsIGFjY291bnQudHlwZSwgZXhwZWN0QWN0aXZpdHlMYXVuY2gsCiAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHN0cmlwQXV0aFRva2VuRnJvbVJlc3VsdCAqLykgewogICAgICAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgdG9EZWJ1Z1N0cmluZyhsb25nIG5vdykgewogICAgICAgICAgICAgICAgICAgICBpZiAobG9naW5PcHRpb25zICE9IG51bGwpIGxvZ2luT3B0aW9ucy5rZXlTZXQoKTsKQEAgLTEwMDAsMTQgKzEwOTAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1c3RvbVRva2VucykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlQXV0aFRva2VuVG9EYXRhYmFzZShuZXcgQWNjb3VudChuYW1lLCB0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUF1dGhUb2tlblRvRGF0YWJhc2UobUFjY291bnRzLCBuZXcgQWNjb3VudChuYW1lLCB0eXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoVG9rZW5UeXBlLCBhdXRoVG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IHJlc3VsdC5nZXRQYXJjZWxhYmxlKEFjY291bnRNYW5hZ2VyLktFWV9JTlRFTlQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVudCAhPSBudWxsICYmIG5vdGlmeU9uQXV0aEZhaWx1cmUgJiYgIWN1c3RvbVRva2VucykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvTm90aWZpY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvTm90aWZpY2F0aW9uKG1BY2NvdW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQsIHJlc3VsdC5nZXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0FVVEhfRkFJTEVEX01FU1NBR0UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEwOTAsMjYgKzExODAsMjcgQEAKICAgICBwcml2YXRlIEludGVnZXIgZ2V0Q3JlZGVudGlhbFBlcm1pc3Npb25Ob3RpZmljYXRpb25JZChBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRoVG9rZW5UeXBlLAogICAgICAgICAgICAgaW50IHVpZCkgewogICAgICAgICBJbnRlZ2VyIGlkOwotICAgICAgICBzeW5jaHJvbml6ZWQobUNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcykgeworICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHMoVXNlcklkLmdldFVzZXJJZCh1aWQpKTsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jcmVkZW50aWFsc1Blcm1pc3Npb25Ob3RpZmljYXRpb25JZHMpIHsKICAgICAgICAgICAgIGZpbmFsIFBhaXI8UGFpcjxBY2NvdW50LCBTdHJpbmc+LCBJbnRlZ2VyPiBrZXkgPQogICAgICAgICAgICAgICAgICAgICBuZXcgUGFpcjxQYWlyPEFjY291bnQsIFN0cmluZz4sIEludGVnZXI+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYWlyPEFjY291bnQsIFN0cmluZz4oYWNjb3VudCwgYXV0aFRva2VuVHlwZSksIHVpZCk7Ci0gICAgICAgICAgICBpZCA9IG1DcmVkZW50aWFsc1Blcm1pc3Npb25Ob3RpZmljYXRpb25JZHMuZ2V0KGtleSk7CisgICAgICAgICAgICBpZCA9IGFjY291bnRzLmNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcy5nZXQoa2V5KTsKICAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWQgPSBtTm90aWZpY2F0aW9uSWRzLmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgICAgIG1DcmVkZW50aWFsc1Blcm1pc3Npb25Ob3RpZmljYXRpb25JZHMucHV0KGtleSwgaWQpOworICAgICAgICAgICAgICAgIGFjY291bnRzLmNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcy5wdXQoa2V5LCBpZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGlkOwogICAgIH0KIAotICAgIHByaXZhdGUgSW50ZWdlciBnZXRTaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkKEFjY291bnQgYWNjb3VudCkgeworICAgIHByaXZhdGUgSW50ZWdlciBnZXRTaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkKFVzZXJBY2NvdW50cyBhY2NvdW50cywgQWNjb3VudCBhY2NvdW50KSB7CiAgICAgICAgIEludGVnZXIgaWQ7Ci0gICAgICAgIHN5bmNocm9uaXplZChtU2lnbmluUmVxdWlyZWROb3RpZmljYXRpb25JZHMpIHsKLSAgICAgICAgICAgIGlkID0gbVNpZ25pblJlcXVpcmVkTm90aWZpY2F0aW9uSWRzLmdldChhY2NvdW50KTsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5zaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkcykgeworICAgICAgICAgICAgaWQgPSBhY2NvdW50cy5zaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkcy5nZXQoYWNjb3VudCk7CiAgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlkID0gbU5vdGlmaWNhdGlvbklkcy5pbmNyZW1lbnRBbmRHZXQoKTsKLSAgICAgICAgICAgICAgICBtU2lnbmluUmVxdWlyZWROb3RpZmljYXRpb25JZHMucHV0KGFjY291bnQsIGlkKTsKKyAgICAgICAgICAgICAgICBhY2NvdW50cy5zaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkcy5wdXQoYWNjb3VudCwgaWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBpZDsKQEAgLTExMzEsNiArMTIyMiw3IEBACiAgICAgICAgIGlmIChhY2NvdW50VHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50VHlwZSBpcyBudWxsIik7CiAgICAgICAgIGNoZWNrTWFuYWdlQWNjb3VudHNQZXJtaXNzaW9uKCk7CiAKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGZpbmFsIGludCBwaWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICBmaW5hbCBpbnQgdWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgZmluYWwgQnVuZGxlIG9wdGlvbnMgPSAob3B0aW9uc0luID09IG51bGwpID8gbmV3IEJ1bmRsZSgpIDogb3B0aW9uc0luOwpAQCAtMTEzOSw3ICsxMjMxLDcgQEAKIAogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IFNlc3Npb24ocmVzcG9uc2UsIGFjY291bnRUeXBlLCBleHBlY3RBY3Rpdml0eUxhdW5jaCwKKyAgICAgICAgICAgIG5ldyBTZXNzaW9uKGFjY291bnRzLCByZXNwb25zZSwgYWNjb3VudFR5cGUsIGV4cGVjdEFjdGl2aXR5TGF1bmNoLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHN0cmlwQXV0aFRva2VuRnJvbVJlc3VsdCAqLykgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgICBtQXV0aGVudGljYXRvci5hZGRBY2NvdW50KHRoaXMsIG1BY2NvdW50VHlwZSwgYXV0aFRva2VuVHlwZSwgcmVxdWlyZWRGZWF0dXJlcywKQEAgLTExNzIsOSArMTI2NCwxMCBAQAogICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVzcG9uc2UgaXMgbnVsbCIpOwogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50IGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tNYW5hZ2VBY2NvdW50c1Blcm1pc3Npb24oKTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgU2Vzc2lvbihyZXNwb25zZSwgYWNjb3VudC50eXBlLCBleHBlY3RBY3Rpdml0eUxhdW5jaCwKKyAgICAgICAgICAgIG5ldyBTZXNzaW9uKGFjY291bnRzLCByZXNwb25zZSwgYWNjb3VudC50eXBlLCBleHBlY3RBY3Rpdml0eUxhdW5jaCwKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzdHJpcEF1dGhUb2tlbkZyb21SZXN1bHQgKi8pIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICAgbUF1dGhlbnRpY2F0b3IuY29uZmlybUNyZWRlbnRpYWxzKHRoaXMsIGFjY291bnQsIG9wdGlvbnMpOwpAQCAtMTIwNCw5ICsxMjk3LDEwIEBACiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnQgaXMgbnVsbCIpOwogICAgICAgICBpZiAoYXV0aFRva2VuVHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhdXRoVG9rZW5UeXBlIGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tNYW5hZ2VBY2NvdW50c1Blcm1pc3Npb24oKTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgU2Vzc2lvbihyZXNwb25zZSwgYWNjb3VudC50eXBlLCBleHBlY3RBY3Rpdml0eUxhdW5jaCwKKyAgICAgICAgICAgIG5ldyBTZXNzaW9uKGFjY291bnRzLCByZXNwb25zZSwgYWNjb3VudC50eXBlLCBleHBlY3RBY3Rpdml0eUxhdW5jaCwKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzdHJpcEF1dGhUb2tlbkZyb21SZXN1bHQgKi8pIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICAgbUF1dGhlbnRpY2F0b3IudXBkYXRlQ3JlZGVudGlhbHModGhpcywgYWNjb3VudCwgYXV0aFRva2VuVHlwZSwgbG9naW5PcHRpb25zKTsKQEAgLTEyMzYsOSArMTMzMCwxMCBAQAogICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVzcG9uc2UgaXMgbnVsbCIpOwogICAgICAgICBpZiAoYWNjb3VudFR5cGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWNjb3VudFR5cGUgaXMgbnVsbCIpOwogICAgICAgICBjaGVja01hbmFnZUFjY291bnRzUGVybWlzc2lvbigpOworICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKTsKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBTZXNzaW9uKHJlc3BvbnNlLCBhY2NvdW50VHlwZSwgZXhwZWN0QWN0aXZpdHlMYXVuY2gsCisgICAgICAgICAgICBuZXcgU2Vzc2lvbihhY2NvdW50cywgcmVzcG9uc2UsIGFjY291bnRUeXBlLCBleHBlY3RBY3Rpdml0eUxhdW5jaCwKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzdHJpcEF1dGhUb2tlbkZyb21SZXN1bHQgKi8pIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICAgbUF1dGhlbnRpY2F0b3IuZWRpdFByb3BlcnRpZXModGhpcywgbUFjY291bnRUeXBlKTsKQEAgLTEyNTksMTYgKzEzNTQsMTYgQEAKICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBBcnJheUxpc3Q8QWNjb3VudD4gbUFjY291bnRzV2l0aEZlYXR1cmVzID0gbnVsbDsKICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbUN1cnJlbnRBY2NvdW50ID0gMDsKIAotICAgICAgICBwdWJsaWMgR2V0QWNjb3VudHNCeVR5cGVBbmRGZWF0dXJlU2Vzc2lvbihJQWNjb3VudE1hbmFnZXJSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgICAgIFN0cmluZyB0eXBlLCBTdHJpbmdbXSBmZWF0dXJlcykgewotICAgICAgICAgICAgc3VwZXIocmVzcG9uc2UsIHR5cGUsIGZhbHNlIC8qIGV4cGVjdEFjdGl2aXR5TGF1bmNoICovLAorICAgICAgICBwdWJsaWMgR2V0QWNjb3VudHNCeVR5cGVBbmRGZWF0dXJlU2Vzc2lvbihVc2VyQWNjb3VudHMgYWNjb3VudHMsCisgICAgICAgICAgICAgICAgSUFjY291bnRNYW5hZ2VyUmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyB0eXBlLCBTdHJpbmdbXSBmZWF0dXJlcykgeworICAgICAgICAgICAgc3VwZXIoYWNjb3VudHMsIHJlc3BvbnNlLCB0eXBlLCBmYWxzZSAvKiBleHBlY3RBY3Rpdml0eUxhdW5jaCAqLywKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzdHJpcEF1dGhUb2tlbkZyb21SZXN1bHQgKi8pOwogICAgICAgICAgICAgbUZlYXR1cmVzID0gZmVhdHVyZXM7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgICAgIG1BY2NvdW50c09mVHlwZSA9IGdldEFjY291bnRzRnJvbUNhY2hlTG9ja2VkKG1BY2NvdW50VHlwZSk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1BY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgICAgICBtQWNjb3VudHNPZlR5cGUgPSBnZXRBY2NvdW50c0Zyb21DYWNoZUxvY2tlZChtQWNjb3VudHMsIG1BY2NvdW50VHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGVhY2ggYWNjb3VudCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZXMKICAgICAgICAgICAgIG1BY2NvdW50c1dpdGhGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8QWNjb3VudD4obUFjY291bnRzT2ZUeXBlLmxlbmd0aCk7CkBAIC0xMzQ2LDYgKzE0NDEsMjMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFjY291bnRzIGZvciBhIHNwZWNpZmljIHVzZXIKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBBY2NvdW50W10gZ2V0QWNjb3VudHMoaW50IHVzZXJJZCkgeworICAgICAgICBjaGVja1JlYWRBY2NvdW50c1Blcm1pc3Npb24oKTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzKHVzZXJJZCk7CisgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRBY2NvdW50c0Zyb21DYWNoZUxvY2tlZChhY2NvdW50cywgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIEFjY291bnRbXSBnZXRBY2NvdW50cyhTdHJpbmcgdHlwZSkgewogICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgIExvZy52KFRBRywgImdldEFjY291bnRzOiBhY2NvdW50VHlwZSAiICsgdHlwZQpAQCAtMTM1MywxMCArMTQ2NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICArICIsIHBpZCAiICsgQmluZGVyLmdldENhbGxpbmdQaWQoKSk7CiAgICAgICAgIH0KICAgICAgICAgY2hlY2tSZWFkQWNjb3VudHNQZXJtaXNzaW9uKCk7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpOwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEFjY291bnRzRnJvbUNhY2hlTG9ja2VkKHR5cGUpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QWNjb3VudHNGcm9tQ2FjaGVMb2NrZWQoYWNjb3VudHMsIHR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKQEAgLTEzNzUsMTkgKzE0ODgsMjAgQEAKICAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlc3BvbnNlIGlzIG51bGwiKTsKICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWNjb3VudFR5cGUgaXMgbnVsbCIpOwogICAgICAgICBjaGVja1JlYWRBY2NvdW50c1Blcm1pc3Npb24oKTsKKyAgICAgICAgVXNlckFjY291bnRzIHVzZXJBY2NvdW50cyA9IGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpOwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICBBY2NvdW50W10gYWNjb3VudHM7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjY291bnRzID0gZ2V0QWNjb3VudHNGcm9tQ2FjaGVMb2NrZWQodHlwZSk7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh1c2VyQWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY291bnRzID0gZ2V0QWNjb3VudHNGcm9tQ2FjaGVMb2NrZWQodXNlckFjY291bnRzLCB0eXBlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQnVuZGxlIHJlc3VsdCA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgICAgICAgICByZXN1bHQucHV0UGFyY2VsYWJsZUFycmF5KEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UUywgYWNjb3VudHMpOwogICAgICAgICAgICAgICAgIG9uUmVzdWx0KHJlc3BvbnNlLCByZXN1bHQpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ldyBHZXRBY2NvdW50c0J5VHlwZUFuZEZlYXR1cmVTZXNzaW9uKHJlc3BvbnNlLCB0eXBlLCBmZWF0dXJlcykuYmluZCgpOworICAgICAgICAgICAgbmV3IEdldEFjY291bnRzQnlUeXBlQW5kRmVhdHVyZVNlc3Npb24odXNlckFjY291bnRzLCByZXNwb25zZSwgdHlwZSwgZmVhdHVyZXMpLmJpbmQoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CiAgICAgICAgIH0KQEAgLTE0MzUsMTIgKzE1NDksMTQgQEAKICAgICAgICAgSUFjY291bnRBdXRoZW50aWNhdG9yIG1BdXRoZW50aWNhdG9yID0gbnVsbDsKIAogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVN0cmlwQXV0aFRva2VuRnJvbVJlc3VsdDsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFVzZXJBY2NvdW50cyBtQWNjb3VudHM7CiAKLSAgICAgICAgcHVibGljIFNlc3Npb24oSUFjY291bnRNYW5hZ2VyUmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBhY2NvdW50VHlwZSwKKyAgICAgICAgcHVibGljIFNlc3Npb24oVXNlckFjY291bnRzIGFjY291bnRzLCBJQWNjb3VudE1hbmFnZXJSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGFjY291bnRUeXBlLAogICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwZWN0QWN0aXZpdHlMYXVuY2gsIGJvb2xlYW4gc3RyaXBBdXRoVG9rZW5Gcm9tUmVzdWx0KSB7CiAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlc3BvbnNlIGlzIG51bGwiKTsKICAgICAgICAgICAgIGlmIChhY2NvdW50VHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50VHlwZSBpcyBudWxsIik7CisgICAgICAgICAgICBtQWNjb3VudHMgPSBhY2NvdW50czsKICAgICAgICAgICAgIG1TdHJpcEF1dGhUb2tlbkZyb21SZXN1bHQgPSBzdHJpcEF1dGhUb2tlbkZyb21SZXN1bHQ7CiAgICAgICAgICAgICBtUmVzcG9uc2UgPSByZXNwb25zZTsKICAgICAgICAgICAgIG1BY2NvdW50VHlwZSA9IGFjY291bnRUeXBlOwpAQCAtMTU3OCw3ICsxNjk0LDcgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgYWNjb3VudFR5cGUgPSByZXN1bHQuZ2V0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX1RZUEUpOwogICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoYWNjb3VudE5hbWUpICYmICFUZXh0VXRpbHMuaXNFbXB0eShhY2NvdW50VHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgQWNjb3VudCBhY2NvdW50ID0gbmV3IEFjY291bnQoYWNjb3VudE5hbWUsIGFjY291bnRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgY2FuY2VsTm90aWZpY2F0aW9uKGdldFNpZ25pblJlcXVpcmVkTm90aWZpY2F0aW9uSWQoYWNjb3VudCkpOworICAgICAgICAgICAgICAgICAgICBjYW5jZWxOb3RpZmljYXRpb24oZ2V0U2lnbmluUmVxdWlyZWROb3RpZmljYXRpb25JZChtQWNjb3VudHMsIGFjY291bnQpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBJQWNjb3VudE1hbmFnZXJSZXNwb25zZSByZXNwb25zZTsKQEAgLTE2OTQsMjAgKzE4MTAsMjMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREYXRhYmFzZU5hbWUoKSB7Ci0gICAgICAgIGlmKEVudmlyb25tZW50LmlzRW5jcnlwdGVkRmlsZXN5c3RlbUVuYWJsZWQoKSkgewotICAgICAgICAgICAgLy8gSGFyZC1jb2RlZCBwYXRoIGluIGNhc2Ugb2YgZW5jcnlwdGVkIGZpbGUgc3lzdGVtCi0gICAgICAgICAgICByZXR1cm4gRW52aXJvbm1lbnQuZ2V0U3lzdGVtU2VjdXJlRGlyZWN0b3J5KCkuZ2V0UGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBEQVRBQkFTRV9OQU1FOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gUmVndWxhciBwYXRoIGluIGNhc2Ugb2Ygbm9uLWVuY3J5cHRlZCBmaWxlIHN5c3RlbQotICAgICAgICAgICAgcmV0dXJuIERBVEFCQVNFX05BTUU7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERhdGFiYXNlTmFtZShpbnQgdXNlcklkKSB7CisgICAgICAgIEZpbGUgc3lzdGVtRGlyID0gRW52aXJvbm1lbnQuZ2V0U3lzdGVtU2VjdXJlRGlyZWN0b3J5KCk7CisgICAgICAgIEZpbGUgZGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoc3lzdGVtRGlyLCAidXNlcnMvIiArIHVzZXJJZCArICIvIiArIERBVEFCQVNFX05BTUUpOworICAgICAgICBpZiAodXNlcklkID09IDApIHsKKyAgICAgICAgICAgIC8vIE1pZ3JhdGUgb2xkIGZpbGUsIGlmIGl0IGV4aXN0cywgdG8gdGhlIG5ldyBsb2NhdGlvbgorICAgICAgICAgICAgRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUoc3lzdGVtRGlyLCBEQVRBQkFTRV9OQU1FKTsKKyAgICAgICAgICAgIGlmIChvbGRGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgb2xkRmlsZS5yZW5hbWVUbyhkYXRhYmFzZUZpbGUpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHJldHVybiBkYXRhYmFzZUZpbGUuZ2V0UGF0aCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgY2xhc3MgRGF0YWJhc2VIZWxwZXIgZXh0ZW5kcyBTUUxpdGVPcGVuSGVscGVyIHsKKyAgICBzdGF0aWMgY2xhc3MgRGF0YWJhc2VIZWxwZXIgZXh0ZW5kcyBTUUxpdGVPcGVuSGVscGVyIHsKIAotICAgICAgICBwdWJsaWMgRGF0YWJhc2VIZWxwZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBBY2NvdW50TWFuYWdlclNlcnZpY2UuZ2V0RGF0YWJhc2VOYW1lKCksIG51bGwsIERBVEFCQVNFX1ZFUlNJT04pOworICAgICAgICBwdWJsaWMgRGF0YWJhc2VIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgdXNlcklkKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBBY2NvdW50TWFuYWdlclNlcnZpY2UuZ2V0RGF0YWJhc2VOYW1lKHVzZXJJZCksIG51bGwsIERBVEFCQVNFX1ZFUlNJT04pOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xNzk5LDE1ICsxOTE4LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzZXRNZXRhVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgdmFsdWVzLnB1dChNRVRBX0tFWSwga2V5KTsKLSAgICAgICAgdmFsdWVzLnB1dChNRVRBX1ZBTFVFLCB2YWx1ZSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpLnJlcGxhY2UoVEFCTEVfTUVUQSwgTUVUQV9LRVksIHZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgewogICAgICAgICByZXR1cm4gYXNCaW5kZXIoKTsKICAgICB9CkBAIC0xODM3LDExICsxOTQ3LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRob3V0IHBlcm1pc3Npb24gIiArIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIGlzQ2hlY2tpblJlcXVlc3QgPSBzY2FuQXJncyhhcmdzLCAiLS1jaGVja2luIikgfHwgc2NhbkFyZ3MoYXJncywgIi1jIik7CiAKLSAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgZm91dCA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihmb3V0LCAiICAiKTsKKyAgICAgICAgaW50IHNpemUgPSBtVXNlcnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgZm91dC5wcmludGxuKCJVc2VyICIgKyBtVXNlcnMua2V5QXQoaSkgKyAiOiIpOworICAgICAgICAgICAgKChJbmRlbnRpbmdQcmludFdyaXRlcikgZm91dCkuaW5jcmVhc2VJbmRlbnQoKTsKKyAgICAgICAgICAgIGR1bXBVc2VyKG1Vc2Vycy52YWx1ZUF0KGkpLCBmZCwgZm91dCwgYXJncywgaXNDaGVja2luUmVxdWVzdCk7CisgICAgICAgICAgICAoKEluZGVudGluZ1ByaW50V3JpdGVyKSBmb3V0KS5kZWNyZWFzZUluZGVudCgpOworICAgICAgICAgICAgaWYgKGkgPCBzaXplIC0gMSkgeworICAgICAgICAgICAgICAgIGZvdXQucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzQ2hlY2tpblJlcXVlc3QgPSBzY2FuQXJncyhhcmdzLCAiLS1jaGVja2luIikgfHwgc2NhbkFyZ3MoYXJncywgIi1jIik7CisgICAgcHJpdmF0ZSB2b2lkIGR1bXBVc2VyKFVzZXJBY2NvdW50cyB1c2VyQWNjb3VudHMsIEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBmb3V0LAorICAgICAgICAgICAgU3RyaW5nW10gYXJncywgYm9vbGVhbiBpc0NoZWNraW5SZXF1ZXN0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodXNlckFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSB1c2VyQWNjb3VudHMub3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CiAKICAgICAgICAgICAgIGlmIChpc0NoZWNraW5SZXF1ZXN0KSB7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNoZWNraW4gcmVxdWVzdC4gKk9ubHkqIHVwbG9hZCB0aGUgYWNjb3VudCB0eXBlcyBhbmQgdGhlIGNvdW50IG9mIGVhY2guCkBAIC0xODU4LDcgKzE5ODIsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBY2NvdW50W10gYWNjb3VudHMgPSBnZXRBY2NvdW50c0Zyb21DYWNoZUxvY2tlZChudWxsIC8qIHR5cGUgKi8pOworICAgICAgICAgICAgICAgIEFjY291bnRbXSBhY2NvdW50cyA9IGdldEFjY291bnRzRnJvbUNhY2hlTG9ja2VkKHVzZXJBY2NvdW50cywgbnVsbCAvKiB0eXBlICovKTsKICAgICAgICAgICAgICAgICBmb3V0LnByaW50bG4oIkFjY291bnRzOiAiICsgYWNjb3VudHMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICBmb3IgKEFjY291bnQgYWNjb3VudCA6IGFjY291bnRzKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvdXQucHJpbnRsbigiICAiICsgYWNjb3VudCk7CkBAIC0xODc5LDcgKzIwMDMsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRvTm90aWZpY2F0aW9uKEFjY291bnQgYWNjb3VudCwgQ2hhclNlcXVlbmNlIG1lc3NhZ2UsIEludGVudCBpbnRlbnQpIHsKKyAgICBwcml2YXRlIHZvaWQgZG9Ob3RpZmljYXRpb24oVXNlckFjY291bnRzIGFjY291bnRzLCBBY2NvdW50IGFjY291bnQsIENoYXJTZXF1ZW5jZSBtZXNzYWdlLAorICAgICAgICAgICAgSW50ZW50IGludGVudCkgewogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CkBAIC0xODkxLDcgKzIwMTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRDb21wb25lbnQoKS5nZXRDbGFzc05hbWUoKSkpIHsKICAgICAgICAgICAgICAgICBjcmVhdGVOb0NyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbihhY2NvdW50LCBpbnRlbnQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIG5vdGlmaWNhdGlvbklkID0gZ2V0U2lnbmluUmVxdWlyZWROb3RpZmljYXRpb25JZChhY2NvdW50KTsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIG5vdGlmaWNhdGlvbklkID0gZ2V0U2lnbmluUmVxdWlyZWROb3RpZmljYXRpb25JZChhY2NvdW50cywgYWNjb3VudCk7CiAgICAgICAgICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KFN0cmluZy52YWx1ZU9mKG5vdGlmaWNhdGlvbklkKSk7CiAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uKGFuZHJvaWQuUi5kcmF3YWJsZS5zdGF0X3N5c193YXJuaW5nLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiB3aGVuICovKTsKQEAgLTE5NjIsNyArMjA4Nyw3IEBACiAgICAgICAgIGZpbmFsIGJvb2xlYW4gZnJvbUF1dGhlbnRpY2F0b3IgPSBhY2NvdW50ICE9IG51bGwKICAgICAgICAgICAgICAgICAmJiBoYXNBdXRoZW50aWNhdG9yVWlkKGFjY291bnQudHlwZSwgY2FsbGVyVWlkKTsKICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNFeHBsaWNpdEdyYW50cyA9IGFjY291bnQgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGhhc0V4cGxpY2l0bHlHcmFudGVkUGVybWlzc2lvbihhY2NvdW50LCBhdXRoVG9rZW5UeXBlKTsKKyAgICAgICAgICAgICAgICAmJiBoYXNFeHBsaWNpdGx5R3JhbnRlZFBlcm1pc3Npb24oYWNjb3VudCwgYXV0aFRva2VuVHlwZSwgY2FsbGVyVWlkKTsKICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CiAgICAgICAgICAgICBMb2cudihUQUcsICJjaGVja0dyYW50c09yQ2FsbGluZ1VpZEFnYWluc3RBdXRoZW50aWNhdG9yOiBjYWxsZXIgdWlkICIKICAgICAgICAgICAgICAgICAgICAgKyBjYWxsZXJVaWQgKyAiLCAiICsgYWNjb3VudApAQCAtMTk4NCwxMyArMjEwOSwxNSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0V4cGxpY2l0bHlHcmFudGVkUGVybWlzc2lvbihBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRoVG9rZW5UeXBlKSB7Ci0gICAgICAgIGlmIChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpID09IGFuZHJvaWQub3MuUHJvY2Vzcy5TWVNURU1fVUlEKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0V4cGxpY2l0bHlHcmFudGVkUGVybWlzc2lvbihBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRoVG9rZW5UeXBlLAorICAgICAgICAgICAgaW50IGNhbGxlclVpZCkgeworICAgICAgICBpZiAoY2FsbGVyVWlkID09IGFuZHJvaWQub3MuUHJvY2Vzcy5TWVNURU1fVUlEKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgU3RyaW5nW10gYXJncyA9IHtTdHJpbmcudmFsdWVPZihCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKSwgYXV0aFRva2VuVHlwZSwKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoYWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IGFjY291bnRzLm9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOworICAgICAgICAgICAgU3RyaW5nW10gYXJncyA9IHsgU3RyaW5nLnZhbHVlT2YoY2FsbGVyVWlkKSwgYXV0aFRva2VuVHlwZSwKICAgICAgICAgICAgICAgICAgICAgYWNjb3VudC5uYW1lLCBhY2NvdW50LnR5cGV9OwogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBwZXJtaXNzaW9uR3JhbnRlZCA9CiAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGRiLCBDT1VOVF9PRl9NQVRDSElOR19HUkFOVFMsIGFyZ3MpICE9IDA7CkBAIC0xOTk4LDcgKzIxMjUsNyBAQAogICAgICAgICAgICAgICAgIC8vIFRPRE86IFNraXAgdGhpcyBjaGVjayB3aGVuIHJ1bm5pbmcgYXV0b21hdGVkIHRlc3RzLiBSZXBsYWNlIHRoaXMKICAgICAgICAgICAgICAgICAvLyB3aXRoIGEgbW9yZSBnZW5lcmFsIHNvbHV0aW9uLgogICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm5vIGNyZWRlbnRpYWxzIHBlcm1pc3Npb24gZm9yIHVzYWdlIG9mICIgKyBhY2NvdW50ICsgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBhdXRoVG9rZW5UeXBlICsgIiBieSB1aWQgIiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYXV0aFRva2VuVHlwZSArICIgYnkgdWlkICIgKyBjYWxsZXJVaWQKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgaWdub3Jpbmcgc2luY2UgZGV2aWNlIGlzIGluIHRlc3QgaGFybmVzcy4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KQEAgLTIwNDgsOCArMjE3NSw5IEBACiAgICAgICAgICAgICBMb2cuZShUQUcsICJncmFudEFwcFBlcm1pc3Npb246IGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzIiwgbmV3IEV4Y2VwdGlvbigpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHMoVXNlcklkLmdldFVzZXJJZCh1aWQpKTsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gYWNjb3VudHMub3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CiAgICAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uKCk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGxvbmcgYWNjb3VudElkID0gZ2V0QWNjb3VudElkTG9ja2VkKGRiLCBhY2NvdW50KTsKQEAgLTIwODEsOCArMjIwOSw5IEBACiAgICAgICAgICAgICBMb2cuZShUQUcsICJyZXZva2VBcHBQZXJtaXNzaW9uOiBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cyIsIG5ldyBFeGNlcHRpb24oKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzKFVzZXJJZC5nZXRVc2VySWQodWlkKSk7CisgICAgICAgIHN5bmNocm9uaXplZCAoYWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IGFjY291bnRzLm9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOwogICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBsb25nIGFjY291bnRJZCA9IGdldEFjY291bnRJZExvY2tlZChkYiwgYWNjb3VudCk7CkBAIC0yMTA1LDggKzIyMzQsOCBAQAogICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/ICgiWyIgKyBUZXh0VXRpbHMuam9pbigiLCIsIHZhbHVlKSArICJdIikgOiBudWxsOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCByZW1vdmVBY2NvdW50RnJvbUNhY2hlTG9ja2VkKEFjY291bnQgYWNjb3VudCkgewotICAgICAgICBmaW5hbCBBY2NvdW50W10gb2xkQWNjb3VudHNGb3JUeXBlID0gbUFjY291bnRDYWNoZS5nZXQoYWNjb3VudC50eXBlKTsKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlQWNjb3VudEZyb21DYWNoZUxvY2tlZChVc2VyQWNjb3VudHMgYWNjb3VudHMsIEFjY291bnQgYWNjb3VudCkgeworICAgICAgICBmaW5hbCBBY2NvdW50W10gb2xkQWNjb3VudHNGb3JUeXBlID0gYWNjb3VudHMuYWNjb3VudENhY2hlLmdldChhY2NvdW50LnR5cGUpOwogICAgICAgICBpZiAob2xkQWNjb3VudHNGb3JUeXBlICE9IG51bGwpIHsKICAgICAgICAgICAgIEFycmF5TGlzdDxBY2NvdW50PiBuZXdBY2NvdW50c0xpc3QgPSBuZXcgQXJyYXlMaXN0PEFjY291bnQ+KCk7CiAgICAgICAgICAgICBmb3IgKEFjY291bnQgY3VyQWNjb3VudCA6IG9sZEFjY291bnRzRm9yVHlwZSkgewpAQCAtMjExNSwzNCArMjI0NCwzNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuZXdBY2NvdW50c0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbUFjY291bnRDYWNoZS5yZW1vdmUoYWNjb3VudC50eXBlKTsKKyAgICAgICAgICAgICAgICBhY2NvdW50cy5hY2NvdW50Q2FjaGUucmVtb3ZlKGFjY291bnQudHlwZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFjY291bnRbXSBuZXdBY2NvdW50c0ZvclR5cGUgPSBuZXcgQWNjb3VudFtuZXdBY2NvdW50c0xpc3Quc2l6ZSgpXTsKICAgICAgICAgICAgICAgICBuZXdBY2NvdW50c0ZvclR5cGUgPSBuZXdBY2NvdW50c0xpc3QudG9BcnJheShuZXdBY2NvdW50c0ZvclR5cGUpOwotICAgICAgICAgICAgICAgIG1BY2NvdW50Q2FjaGUucHV0KGFjY291bnQudHlwZSwgbmV3QWNjb3VudHNGb3JUeXBlKTsKKyAgICAgICAgICAgICAgICBhY2NvdW50cy5hY2NvdW50Q2FjaGUucHV0KGFjY291bnQudHlwZSwgbmV3QWNjb3VudHNGb3JUeXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtVXNlckRhdGFDYWNoZS5yZW1vdmUoYWNjb3VudCk7Ci0gICAgICAgIG1BdXRoVG9rZW5DYWNoZS5yZW1vdmUoYWNjb3VudCk7CisgICAgICAgIGFjY291bnRzLnVzZXJEYXRhQ2FjaGUucmVtb3ZlKGFjY291bnQpOworICAgICAgICBhY2NvdW50cy5hdXRoVG9rZW5DYWNoZS5yZW1vdmUoYWNjb3VudCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlIGFjY291bnQgaXMgbm90IGFscmVhZHkgcHJlc2VudC4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5zZXJ0QWNjb3VudEludG9DYWNoZUxvY2tlZChBY2NvdW50IGFjY291bnQpIHsKLSAgICAgICAgQWNjb3VudFtdIGFjY291bnRzRm9yVHlwZSA9IG1BY2NvdW50Q2FjaGUuZ2V0KGFjY291bnQudHlwZSk7CisgICAgcHJpdmF0ZSB2b2lkIGluc2VydEFjY291bnRJbnRvQ2FjaGVMb2NrZWQoVXNlckFjY291bnRzIGFjY291bnRzLCBBY2NvdW50IGFjY291bnQpIHsKKyAgICAgICAgQWNjb3VudFtdIGFjY291bnRzRm9yVHlwZSA9IGFjY291bnRzLmFjY291bnRDYWNoZS5nZXQoYWNjb3VudC50eXBlKTsKICAgICAgICAgaW50IG9sZExlbmd0aCA9IChhY2NvdW50c0ZvclR5cGUgIT0gbnVsbCkgPyBhY2NvdW50c0ZvclR5cGUubGVuZ3RoIDogMDsKICAgICAgICAgQWNjb3VudFtdIG5ld0FjY291bnRzRm9yVHlwZSA9IG5ldyBBY2NvdW50W29sZExlbmd0aCArIDFdOwogICAgICAgICBpZiAoYWNjb3VudHNGb3JUeXBlICE9IG51bGwpIHsKICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYWNjb3VudHNGb3JUeXBlLCAwLCBuZXdBY2NvdW50c0ZvclR5cGUsIDAsIG9sZExlbmd0aCk7CiAgICAgICAgIH0KICAgICAgICAgbmV3QWNjb3VudHNGb3JUeXBlW29sZExlbmd0aF0gPSBhY2NvdW50OwotICAgICAgICBtQWNjb3VudENhY2hlLnB1dChhY2NvdW50LnR5cGUsIG5ld0FjY291bnRzRm9yVHlwZSk7CisgICAgICAgIGFjY291bnRzLmFjY291bnRDYWNoZS5wdXQoYWNjb3VudC50eXBlLCBuZXdBY2NvdW50c0ZvclR5cGUpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBBY2NvdW50W10gZ2V0QWNjb3VudHNGcm9tQ2FjaGVMb2NrZWQoU3RyaW5nIGFjY291bnRUeXBlKSB7CisgICAgcHJvdGVjdGVkIEFjY291bnRbXSBnZXRBY2NvdW50c0Zyb21DYWNoZUxvY2tlZChVc2VyQWNjb3VudHMgdXNlckFjY291bnRzLCBTdHJpbmcgYWNjb3VudFR5cGUpIHsKICAgICAgICAgaWYgKGFjY291bnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIEFjY291bnRbXSBhY2NvdW50cyA9IG1BY2NvdW50Q2FjaGUuZ2V0KGFjY291bnRUeXBlKTsKKyAgICAgICAgICAgIGZpbmFsIEFjY291bnRbXSBhY2NvdW50cyA9IHVzZXJBY2NvdW50cy5hY2NvdW50Q2FjaGUuZ2V0KGFjY291bnRUeXBlKTsKICAgICAgICAgICAgIGlmIChhY2NvdW50cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0FDQ09VTlRfQVJSQVk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjE1MCw3ICsyMjc5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludCB0b3RhbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICBmb3IgKEFjY291bnRbXSBhY2NvdW50cyA6IG1BY2NvdW50Q2FjaGUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAoQWNjb3VudFtdIGFjY291bnRzIDogdXNlckFjY291bnRzLmFjY291bnRDYWNoZS52YWx1ZXMoKSkgewogICAgICAgICAgICAgICAgIHRvdGFsTGVuZ3RoICs9IGFjY291bnRzLmxlbmd0aDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0b3RhbExlbmd0aCA9PSAwKSB7CkBAIC0yMTU4LDcgKzIyODcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQWNjb3VudFtdIGFjY291bnRzID0gbmV3IEFjY291bnRbdG90YWxMZW5ndGhdOwogICAgICAgICAgICAgdG90YWxMZW5ndGggPSAwOwotICAgICAgICAgICAgZm9yIChBY2NvdW50W10gYWNjb3VudHNPZlR5cGUgOiBtQWNjb3VudENhY2hlLnZhbHVlcygpKSB7CisgICAgICAgICAgICBmb3IgKEFjY291bnRbXSBhY2NvdW50c09mVHlwZSA6IHVzZXJBY2NvdW50cy5hY2NvdW50Q2FjaGUudmFsdWVzKCkpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFjY291bnRzT2ZUeXBlLCAwLCBhY2NvdW50cywgdG90YWxMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50c09mVHlwZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgIHRvdGFsTGVuZ3RoICs9IGFjY291bnRzT2ZUeXBlLmxlbmd0aDsKQEAgLTIxNjcsMTIgKzIyOTYsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlVXNlckRhdGFJbnRvQ2FjaGVMb2NrZWQoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIEFjY291bnQgYWNjb3VudCwKLSAgICAgICAgICAgIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB1c2VyRGF0YUZvckFjY291bnQgPSBtVXNlckRhdGFDYWNoZS5nZXQoYWNjb3VudCk7CisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVVc2VyRGF0YUludG9DYWNoZUxvY2tlZChVc2VyQWNjb3VudHMgYWNjb3VudHMsIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLAorICAgICAgICAgICAgQWNjb3VudCBhY2NvdW50LCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdXNlckRhdGFGb3JBY2NvdW50ID0gYWNjb3VudHMudXNlckRhdGFDYWNoZS5nZXQoYWNjb3VudCk7CiAgICAgICAgIGlmICh1c2VyRGF0YUZvckFjY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICAgdXNlckRhdGFGb3JBY2NvdW50ID0gcmVhZFVzZXJEYXRhRm9yQWNjb3VudEZyb21EYXRhYmFzZUxvY2tlZChkYiwgYWNjb3VudCk7Ci0gICAgICAgICAgICBtVXNlckRhdGFDYWNoZS5wdXQoYWNjb3VudCwgdXNlckRhdGFGb3JBY2NvdW50KTsKKyAgICAgICAgICAgIGFjY291bnRzLnVzZXJEYXRhQ2FjaGUucHV0KGFjY291bnQsIHVzZXJEYXRhRm9yQWNjb3VudCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHVzZXJEYXRhRm9yQWNjb3VudC5yZW1vdmUoa2V5KTsKQEAgLTIxODEsMTIgKzIzMTAsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQXV0aFRva2VuSW50b0NhY2hlTG9ja2VkKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLCBBY2NvdW50IGFjY291bnQsCi0gICAgICAgICAgICBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aFRva2Vuc0ZvckFjY291bnQgPSBtQXV0aFRva2VuQ2FjaGUuZ2V0KGFjY291bnQpOworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQXV0aFRva2VuSW50b0NhY2hlTG9ja2VkKFVzZXJBY2NvdW50cyBhY2NvdW50cywgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsCisgICAgICAgICAgICBBY2NvdW50IGFjY291bnQsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBhdXRoVG9rZW5zRm9yQWNjb3VudCA9IGFjY291bnRzLmF1dGhUb2tlbkNhY2hlLmdldChhY2NvdW50KTsKICAgICAgICAgaWYgKGF1dGhUb2tlbnNGb3JBY2NvdW50ID09IG51bGwpIHsKICAgICAgICAgICAgIGF1dGhUb2tlbnNGb3JBY2NvdW50ID0gcmVhZEF1dGhUb2tlbnNGb3JBY2NvdW50RnJvbURhdGFiYXNlTG9ja2VkKGRiLCBhY2NvdW50KTsKLSAgICAgICAgICAgIG1BdXRoVG9rZW5DYWNoZS5wdXQoYWNjb3VudCwgYXV0aFRva2Vuc0ZvckFjY291bnQpOworICAgICAgICAgICAgYWNjb3VudHMuYXV0aFRva2VuQ2FjaGUucHV0KGFjY291bnQsIGF1dGhUb2tlbnNGb3JBY2NvdW50KTsKICAgICAgICAgfQogICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgYXV0aFRva2Vuc0ZvckFjY291bnQucmVtb3ZlKGtleSk7CkBAIC0yMTk1LDI3ICsyMzI0LDI4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlYWRBdXRoVG9rZW5JbnRlcm5hbChBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRoVG9rZW5UeXBlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aFRva2Vuc0ZvckFjY291bnQgPSBtQXV0aFRva2VuQ2FjaGUuZ2V0KGFjY291bnQpOworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVhZEF1dGhUb2tlbkludGVybmFsKFVzZXJBY2NvdW50cyBhY2NvdW50cywgQWNjb3VudCBhY2NvdW50LAorICAgICAgICAgICAgU3RyaW5nIGF1dGhUb2tlblR5cGUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGF1dGhUb2tlbnNGb3JBY2NvdW50ID0gYWNjb3VudHMuYXV0aFRva2VuQ2FjaGUuZ2V0KGFjY291bnQpOwogICAgICAgICAgICAgaWYgKGF1dGhUb2tlbnNGb3JBY2NvdW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHBvcHVsYXRlIHRoZSBjYWNoZSBmb3IgdGhpcyBhY2NvdW50Ci0gICAgICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBhY2NvdW50cy5vcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKICAgICAgICAgICAgICAgICBhdXRoVG9rZW5zRm9yQWNjb3VudCA9IHJlYWRBdXRoVG9rZW5zRm9yQWNjb3VudEZyb21EYXRhYmFzZUxvY2tlZChkYiwgYWNjb3VudCk7Ci0gICAgICAgICAgICAgICAgbUF1dGhUb2tlbkNhY2hlLnB1dChhY2NvdW50LCBhdXRoVG9rZW5zRm9yQWNjb3VudCk7CisgICAgICAgICAgICAgICAgYWNjb3VudHMuYXV0aFRva2VuQ2FjaGUucHV0KGFjY291bnQsIGF1dGhUb2tlbnNGb3JBY2NvdW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBhdXRoVG9rZW5zRm9yQWNjb3VudC5nZXQoYXV0aFRva2VuVHlwZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlYWRVc2VyRGF0YUludGVybmFsKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGtleSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJEYXRhRm9yQWNjb3VudCA9IG1Vc2VyRGF0YUNhY2hlLmdldChhY2NvdW50KTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlYWRVc2VyRGF0YUludGVybmFsKFVzZXJBY2NvdW50cyBhY2NvdW50cywgQWNjb3VudCBhY2NvdW50LCBTdHJpbmcga2V5KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoYWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB1c2VyRGF0YUZvckFjY291bnQgPSBhY2NvdW50cy51c2VyRGF0YUNhY2hlLmdldChhY2NvdW50KTsKICAgICAgICAgICAgIGlmICh1c2VyRGF0YUZvckFjY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcG9wdWxhdGUgdGhlIGNhY2hlIGZvciB0aGlzIGFjY291bnQKLSAgICAgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IGFjY291bnRzLm9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOwogICAgICAgICAgICAgICAgIHVzZXJEYXRhRm9yQWNjb3VudCA9IHJlYWRVc2VyRGF0YUZvckFjY291bnRGcm9tRGF0YWJhc2VMb2NrZWQoZGIsIGFjY291bnQpOwotICAgICAgICAgICAgICAgIG1Vc2VyRGF0YUNhY2hlLnB1dChhY2NvdW50LCB1c2VyRGF0YUZvckFjY291bnQpOworICAgICAgICAgICAgICAgIGFjY291bnRzLnVzZXJEYXRhQ2FjaGUucHV0KGFjY291bnQsIHVzZXJEYXRhRm9yQWNjb3VudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdXNlckRhdGFGb3JBY2NvdW50LmdldChrZXkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9HcmFudENyZWRlbnRpYWxzUGVybWlzc2lvbkFjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9HcmFudENyZWRlbnRpYWxzUGVybWlzc2lvbkFjdGl2aXR5LmphdmEKaW5kZXggMGVlNjgzYy4uNDQxOWM4YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvR3JhbnRDcmVkZW50aWFsc1Blcm1pc3Npb25BY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0dyYW50Q3JlZGVudGlhbHNQZXJtaXNzaW9uQWN0aXZpdHkuamF2YQpAQCAtMTEzLDggKzExMyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAKLSAgICAgICAgYWNjb3VudE1hbmFnZXJTZXJ2aWNlLmdldEF1dGhUb2tlbkxhYmVsKAotICAgICAgICAgICAgICAgIHJlc3BvbnNlLCBtQWNjb3VudCwgbUF1dGhUb2tlblR5cGUpOworICAgICAgICBhY2NvdW50TWFuYWdlclNlcnZpY2UuZ2V0QXV0aFRva2VuTGFiZWwocmVzcG9uc2UsIG1BY2NvdW50LCBtQXV0aFRva2VuVHlwZSwgbVVpZCk7CiAKICAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuYWxsb3dfYnV0dG9uKS5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmRlbnlfYnV0dG9uKS5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9PbkFjY291bnRzVXBkYXRlTGlzdGVuZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL09uQWNjb3VudHNVcGRhdGVMaXN0ZW5lci5qYXZhCmluZGV4IDM4YjM3MWQuLjJiNGVlNTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL09uQWNjb3VudHNVcGRhdGVMaXN0ZW5lci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL09uQWNjb3VudHNVcGRhdGVMaXN0ZW5lci5qYXZhCkBAIC0xNywxMSArMTcsMTEgQEAKIHBhY2thZ2UgYW5kcm9pZC5hY2NvdW50czsKIAogLyoqCi0gKiBBbiBpbnRlcmZhY2UgdGhhdCBjb250YWlucyB0aGUgY2FsbGJhY2sgdXNlZCBieSB0aGUgQWNjb3VudE1vbml0b3IKKyAqIEFuIGludGVyZmFjZSB0aGF0IGNvbnRhaW5zIHRoZSBjYWxsYmFjayB1c2VkIGJ5IHRoZSBBY2NvdW50TWFuYWdlcgogICovCiBwdWJsaWMgaW50ZXJmYWNlIE9uQWNjb3VudHNVcGRhdGVMaXN0ZW5lciB7CiAgICAgLyoqCi0gICAgICogVGhpcyBpbnZva2VkIHdoZW4gdGhlIEFjY291bnRNb25pdG9yIHN0YXJ0cyB1cCBhbmQgd2hlbmV2ZXIgdGhlIGFjY291bnQKKyAgICAgKiBUaGlzIGludm9rZWQgd2hlbiB0aGUgQWNjb3VudE1hbmFnZXIgc3RhcnRzIHVwIGFuZCB3aGVuZXZlciB0aGUgYWNjb3VudAogICAgICAqIHNldCBjaGFuZ2VzLgogICAgICAqIEBwYXJhbSBhY2NvdW50cyB0aGUgY3VycmVudCBhY2NvdW50cwogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQppbmRleCA4ZThkMzdkLi5mODk1NDMxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQpAQCAtNTcwLDcgKzU3MCwxOCBAQAogICogdGFnLiAgQnkgZG9pbmcgc28sIG90aGVyIGFwcGxpY2F0aW9ucyB3aWxsIG5lZWQgdG8gZGVjbGFyZSBhIGNvcnJlc3BvbmRpbmcKICAqIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI0FuZHJvaWRNYW5pZmVzdFVzZXNQZXJtaXNzaW9uICZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7fQogICogZWxlbWVudCBpbiB0aGVpciBvd24gbWFuaWZlc3QgdG8gYmUgYWJsZSB0byBzdGFydCB0aGF0IGFjdGl2aXR5LgotICogCisgKgorICogPHA+V2hlbiBzdGFydGluZyBhbiBBY3Rpdml0eSB5b3UgY2FuIHNldCB7QGxpbmsgSW50ZW50I0ZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgorICogSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTn0gYW5kL29yIHtAbGluayBJbnRlbnQjRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTgorICogSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT059IG9uIHRoZSBJbnRlbnQuICBUaGlzIHdpbGwgZ3JhbnQgdGhlCisgKiBBY3Rpdml0eSBhY2Nlc3MgdG8gdGhlIHNwZWNpZmljIFVSSXMgaW4gdGhlIEludGVudC4gIEFjY2VzcyB3aWxsIHJlbWFpbgorICogdW50aWwgdGhlIEFjdGl2aXR5IGhhcyBmaW5pc2hlZCAoaXQgd2lsbCByZW1haW4gYWNyb3NzIHRoZSBob3N0aW5nCisgKiBwcm9jZXNzIGJlaW5nIGtpbGxlZCBhbmQgb3RoZXIgdGVtcG9yYXJ5IGRlc3RydWN0aW9uKS4gIEFzIG9mCisgKiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0dJTkdFUkJSRUFEfSwgaWYgdGhlIEFjdGl2aXR5CisgKiB3YXMgYWxyZWFkeSBjcmVhdGVkIGFuZCBhIG5ldyBJbnRlbnQgaXMgYmVpbmcgZGVsaXZlcmVkIHRvCisgKiB7QGxpbmsgI29uTmV3SW50ZW50KEludGVudCl9LCBhbnkgbmV3bHkgZ3JhbnRlZCBVUkkgcGVybWlzc2lvbnMgd2lsbCBiZSBhZGRlZAorICogdG8gdGhlIGV4aXN0aW5nIG9uZXMgaXQgaG9sZHMuCisgKgogICogPHA+U2VlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3NlY3VyaXR5L3NlY3VyaXR5Lmh0bWwiPlNlY3VyaXR5IGFuZCBQZXJtaXNzaW9uczwvYT4KICAqIGRvY3VtZW50IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBlcm1pc3Npb25zIGFuZCBzZWN1cml0eSBpbiBnZW5lcmFsLgogICogCkBAIC0zNTQ5LDcgKzM1NjAsMTYgQEAKICAgICAvKioKICAgICAgKiBDYWxsIHRoaXMgdG8gc2V0IHRoZSByZXN1bHQgdGhhdCB5b3VyIGFjdGl2aXR5IHdpbGwgcmV0dXJuIHRvIGl0cwogICAgICAqIGNhbGxlci4KLSAgICAgKiAKKyAgICAgKgorICAgICAqIDxwPkFzIG9mIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjR0lOR0VSQlJFQUR9LCB0aGUgSW50ZW50CisgICAgICogeW91IHN1cHBseSBoZXJlIGNhbiBoYXZlIHtAbGluayBJbnRlbnQjRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OCisgICAgICogSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTn0gYW5kL29yIHtAbGluayBJbnRlbnQjRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTgorICAgICAqIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OfSBzZXQuICBUaGlzIHdpbGwgZ3JhbnQgdGhlCisgICAgICogQWN0aXZpdHkgcmVjZWl2aW5nIHRoZSByZXN1bHQgYWNjZXNzIHRvIHRoZSBzcGVjaWZpYyBVUklzIGluIHRoZSBJbnRlbnQuCisgICAgICogQWNjZXNzIHdpbGwgcmVtYWluIHVudGlsIHRoZSBBY3Rpdml0eSBoYXMgZmluaXNoZWQgKGl0IHdpbGwgcmVtYWluIGFjcm9zcyB0aGUgaG9zdGluZworICAgICAqIHByb2Nlc3MgYmVpbmcga2lsbGVkIGFuZCBvdGhlciB0ZW1wb3JhcnkgZGVzdHJ1Y3Rpb24pIGFuZCB3aWxsIGJlIGFkZGVkCisgICAgICogdG8gYW55IGV4aXN0aW5nIHNldCBvZiBVUkkgcGVybWlzc2lvbnMgaXQgYWxyZWFkeSBob2xkcy4KKyAgICAgKgogICAgICAqIEBwYXJhbSByZXN1bHRDb2RlIFRoZSByZXN1bHQgY29kZSB0byBwcm9wYWdhdGUgYmFjayB0byB0aGUgb3JpZ2luYXRpbmcKICAgICAgKiAgICAgICAgICAgICAgICAgICBhY3Rpdml0eSwgb2Z0ZW4gUkVTVUxUX0NBTkNFTEVEIG9yIFJFU1VMVF9PSwogICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHByb3BhZ2F0ZSBiYWNrIHRvIHRoZSBvcmlnaW5hdGluZyBhY3Rpdml0eS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhCmluZGV4IDU4ODEyNWQuLmViZjQyNjE5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAvKioKICAgICAgKiBQYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHdoaWNoIGluc3RhbGxlZCB0aGUgYXBwbGljYXRpb24gdGhpcwogICAgICAqIHJlcG9ydCBwZXJ0YWlucyB0by4KLSAgICAgKiBUaGlzIGlkZW50aWZpZXMgd2hpY2ggTWFya2V0IHRoZSBhcHBsaWNhdGlvbiBjYW1lIGZyb20uCisgICAgICogVGhpcyBpZGVudGlmaWVzIHdoaWNoIG1hcmtldCB0aGUgYXBwbGljYXRpb24gY2FtZSBmcm9tLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgaW5zdGFsbGVyUGFja2FnZU5hbWU7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VydmljZS5qYXZhCmluZGV4IDM1YmQ4YzAuLmJlNGI4YWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlcnZpY2UuamF2YQpAQCAtMTYzLDcgKzE2MywxOSBAQAogICoge0BsaW5rIGFuZHJvaWQuUi5zdHlsZWFibGUjQW5kcm9pZE1hbmlmZXN0VXNlc1Blcm1pc3Npb24gJmx0O3VzZXMtcGVybWlzc2lvbiZndDt9CiAgKiBlbGVtZW50IGluIHRoZWlyIG93biBtYW5pZmVzdCB0byBiZSBhYmxlIHRvIHN0YXJ0LCBzdG9wLCBvciBiaW5kIHRvCiAgKiB0aGUgc2VydmljZS4KLSAqIAorICoKKyAqIDxwPkFzIG9mIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjR0lOR0VSQlJFQUR9LCB3aGVuIHVzaW5nCisgKiB7QGxpbmsgQ29udGV4dCNzdGFydFNlcnZpY2UoSW50ZW50KSBDb250ZXh0LnN0YXJ0U2VydmljZShJbnRlbnQpfSwgeW91IGNhbgorICogYWxzbyBzZXQge0BsaW5rIEludGVudCNGTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KKyAqIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT059IGFuZC9vciB7QGxpbmsgSW50ZW50I0ZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04KKyAqIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OfSBvbiB0aGUgSW50ZW50LiAgVGhpcyB3aWxsIGdyYW50IHRoZQorICogU2VydmljZSB0ZW1wb3JhcnkgYWNjZXNzIHRvIHRoZSBzcGVjaWZpYyBVUklzIGluIHRoZSBJbnRlbnQuICBBY2Nlc3Mgd2lsbAorICogcmVtYWluIHVudGlsIHRoZSBTZXJ2aWNlIGhhcyBjYWxsZWQge0BsaW5rICNzdG9wU2VsZihpbnQpfSBmb3IgdGhhdCBzdGFydAorICogY29tbWFuZCBvciBhIGxhdGVyIG9uZSwgb3IgdW50aWwgdGhlIFNlcnZpY2UgaGFzIGJlZW4gY29tcGxldGVseSBzdG9wcGVkLgorICogVGhpcyB3b3JrcyBmb3IgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBvdGhlciBhcHBzIHRoYXQgaGF2ZSBub3QgcmVxdWVzdGVkCisgKiB0aGUgcGVybWlzc2lvbiBwcm90ZWN0aW5nIHRoZSBTZXJ2aWNlLCBvciBldmVuIHdoZW4gdGhlIFNlcnZpY2UgaXMgbm90CisgKiBleHBvcnRlZCBhdCBhbGwuCisgKgogICogPHA+SW4gYWRkaXRpb24sIGEgc2VydmljZSBjYW4gcHJvdGVjdCBpbmRpdmlkdWFsIElQQyBjYWxscyBpbnRvIGl0IHdpdGgKICAqIHBlcm1pc3Npb25zLCBieSBjYWxsaW5nIHRoZQogICoge0BsaW5rICNjaGVja0NhbGxpbmdQZXJtaXNzaW9ufQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5qYXZhCmluZGV4IGE4YjFiZjQuLmE2NTVkZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmphdmEKQEAgLTE1Myw3ICsxNTMsNyBAQAogICAgIAogICAgIGZpbmFsIEJpdG1hcCBtSWNvbjsKIAotICAgIGZpbmFsIEFycmF5TGlzdDxJdGVtPiBtSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEl0ZW0+KCk7CisgICAgZmluYWwgQXJyYXlMaXN0PEl0ZW0+IG1JdGVtczsKIAogICAgIC8qKgogICAgICAqIERlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIGl0ZW0gaW4gYSBDbGlwcGVkRGF0YS4KQEAgLTMyMSw2ICszMjEsMzMgQEAKICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgfQogLy9FTkRfSU5DTFVERShjb2VyY2VUb1RleHQpCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworCisgICAgICAgICAgICBiLmFwcGVuZCgiQ2xpcERhdGEuSXRlbSB7ICIpOworICAgICAgICAgICAgdG9TaG9ydFN0cmluZyhiKTsKKyAgICAgICAgICAgIGIuYXBwZW5kKCIgfSIpOworCisgICAgICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyB2b2lkIHRvU2hvcnRTdHJpbmcoU3RyaW5nQnVpbGRlciBiKSB7CisgICAgICAgICAgICBpZiAobVRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCJUOiIpOworICAgICAgICAgICAgICAgIGIuYXBwZW5kKG1UZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYi5hcHBlbmQoIlU6Iik7CisgICAgICAgICAgICAgICAgYi5hcHBlbmQobVVyaSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCJJOiIpOworICAgICAgICAgICAgICAgIG1JbnRlbnQudG9TaG9ydFN0cmluZyhiLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYi5hcHBlbmQoIk5VTEwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzM2LDYgKzM2Myw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZW0gaXMgbnVsbCIpOwogICAgICAgICB9CiAgICAgICAgIG1JY29uID0gbnVsbDsKKyAgICAgICAgbUl0ZW1zID0gbmV3IEFycmF5TGlzdDxJdGVtPigpOwogICAgICAgICBtSXRlbXMuYWRkKGl0ZW0pOwogICAgIH0KIApAQCAtMzUxLDEwICszNzksMjMgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaXRlbSBpcyBudWxsIik7CiAgICAgICAgIH0KICAgICAgICAgbUljb24gPSBudWxsOworICAgICAgICBtSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEl0ZW0+KCk7CiAgICAgICAgIG1JdGVtcy5hZGQoaXRlbSk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGNsaXAgdGhhdCBpcyBhIGNvcHkgb2YgYW5vdGhlciBjbGlwLiAgVGhpcyBkb2VzIGEgZGVlcC1jb3B5CisgICAgICogb2YgYWxsIGl0ZW1zIGluIHRoZSBjbGlwLgorICAgICAqCisgICAgICogQHBhcmFtIG90aGVyIFRoZSBleGlzdGluZyBDbGlwRGF0YSB0aGF0IGlzIHRvIGJlIGNvcGllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpcERhdGEoQ2xpcERhdGEgb3RoZXIpIHsKKyAgICAgICAgbUNsaXBEZXNjcmlwdGlvbiA9IG90aGVyLm1DbGlwRGVzY3JpcHRpb247CisgICAgICAgIG1JY29uID0gb3RoZXIubUljb247CisgICAgICAgIG1JdGVtcyA9IG5ldyBBcnJheUxpc3Q8SXRlbT4ob3RoZXIubUl0ZW1zKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYSBuZXcgQ2xpcERhdGEgaG9sZGluZyBkYXRhIG9mIHRoZSB0eXBlCiAgICAgICoge0BsaW5rIENsaXBEZXNjcmlwdGlvbiNNSU1FVFlQRV9URVhUX1BMQUlOfS4KICAgICAgKgpAQCAtNDc1LDYgKzUxNiw0NiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CisKKyAgICAgICAgYi5hcHBlbmQoIkNsaXBEYXRhIHsgIik7CisgICAgICAgIHRvU2hvcnRTdHJpbmcoYik7CisgICAgICAgIGIuYXBwZW5kKCIgfSIpOworCisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHZvaWQgdG9TaG9ydFN0cmluZyhTdHJpbmdCdWlsZGVyIGIpIHsKKyAgICAgICAgYm9vbGVhbiBmaXJzdDsKKyAgICAgICAgaWYgKG1DbGlwRGVzY3JpcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZmlyc3QgPSAhbUNsaXBEZXNjcmlwdGlvbi50b1Nob3J0U3RyaW5nKGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChtSWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBiLmFwcGVuZCgiSToiKTsKKyAgICAgICAgICAgIGIuYXBwZW5kKG1JY29uLmdldFdpZHRoKCkpOworICAgICAgICAgICAgYi5hcHBlbmQoJ3gnKTsKKyAgICAgICAgICAgIGIuYXBwZW5kKG1JY29uLmdldEhlaWdodCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPTA7IGk8bUl0ZW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBiLmFwcGVuZCgneycpOworICAgICAgICAgICAgbUl0ZW1zLmdldChpKS50b1Nob3J0U3RyaW5nKGIpOworICAgICAgICAgICAgYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNTE1LDYgKzU5Niw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtSWNvbiA9IG51bGw7CiAgICAgICAgIH0KKyAgICAgICAgbUl0ZW1zID0gbmV3IEFycmF5TGlzdDxJdGVtPigpOwogICAgICAgICBmaW5hbCBpbnQgTiA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmphdmEKaW5kZXggYjVmYTIwYy4uYzZiNTFlZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEZXNjcmlwdGlvbi5qYXZhCkBAIC0xODQsNiArMTg0LDM5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKKworICAgICAgICBiLmFwcGVuZCgiQ2xpcERlc2NyaXB0aW9uIHsgIik7CisgICAgICAgIHRvU2hvcnRTdHJpbmcoYik7CisgICAgICAgIGIuYXBwZW5kKCIgfSIpOworCisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIGJvb2xlYW4gdG9TaG9ydFN0cmluZyhTdHJpbmdCdWlsZGVyIGIpIHsKKyAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWltZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBiLmFwcGVuZChtTWltZVR5cGVzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxhYmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgnICcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGIuYXBwZW5kKCciJyk7CisgICAgICAgICAgICBiLmFwcGVuZChtTGFiZWwpOworICAgICAgICAgICAgYi5hcHBlbmQoJyInKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIWZpcnN0OworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50U2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50U2VydmljZS5qYXZhCmluZGV4IGZjNGMyNjIuLmY4MjdjM2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRTZXJ2aWNlLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuVXNlcklkOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OwogaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7CkBAIC0xNjMsNiArMTY0LDggQEAKICAgICAgICAgICAgIExvZy52KFRBRywgIk5vdGlmeWluZyB1cGRhdGUgb2YgIiArIHVyaSArICIgZnJvbSBvYnNlcnZlciAiICsgb2JzZXJ2ZXIKICAgICAgICAgICAgICAgICAgICAgKyAiLCBzeW5jVG9OZXR3b3JrICIgKyBzeW5jVG9OZXR3b3JrKTsKICAgICAgICAgfQorCisgICAgICAgIGludCB1c2VySWQgPSBVc2VySWQuZ2V0Q2FsbGluZ1VzZXJJZCgpOwogICAgICAgICAvLyBUaGlzIG1ha2VzIGl0IHNvIHRoYXQgZnV0dXJlIHBlcm1pc3Npb24gY2hlY2tzIHdpbGwgYmUgaW4gdGhlIGNvbnRleHQgb2YgdGhpcwogICAgICAgICAvLyBwcm9jZXNzIHJhdGhlciB0aGFuIHRoZSBjYWxsZXIncyBwcm9jZXNzLiBXZSB3aWxsIHJlc3RvcmUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nLgogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwpAQCAtMjAxLDcgKzIwNCw4IEBACiAgICAgICAgICAgICBpZiAoc3luY1RvTmV0d29yaykgewogICAgICAgICAgICAgICAgIFN5bmNNYW5hZ2VyIHN5bmNNYW5hZ2VyID0gZ2V0U3luY01hbmFnZXIoKTsKICAgICAgICAgICAgICAgICBpZiAoc3luY01hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzeW5jTWFuYWdlci5zY2hlZHVsZUxvY2FsU3luYyhudWxsIC8qIGFsbCBhY2NvdW50cyAqLywgdXJpLmdldEF1dGhvcml0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY01hbmFnZXIuc2NoZWR1bGVMb2NhbFN5bmMobnVsbCAvKiBhbGwgYWNjb3VudHMgKi8sIHVzZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmkuZ2V0QXV0aG9yaXR5KCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKQEAgLTIyOSwxMyArMjMzLDE1IEBACiAKICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U3luYyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHksIEJ1bmRsZSBleHRyYXMpIHsKICAgICAgICAgQ29udGVudFJlc29sdmVyLnZhbGlkYXRlU3luY0V4dHJhc0J1bmRsZShleHRyYXMpOworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKKwogICAgICAgICAvLyBUaGlzIG1ha2VzIGl0IHNvIHRoYXQgZnV0dXJlIHBlcm1pc3Npb24gY2hlY2tzIHdpbGwgYmUgaW4gdGhlIGNvbnRleHQgb2YgdGhpcwogICAgICAgICAvLyBwcm9jZXNzIHJhdGhlciB0aGFuIHRoZSBjYWxsZXIncyBwcm9jZXNzLiBXZSB3aWxsIHJlc3RvcmUgdGhpcyBiZWZvcmUgcmV0dXJuaW5nLgogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3luY01hbmFnZXIgc3luY01hbmFnZXIgPSBnZXRTeW5jTWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHN5bmNNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzeW5jTWFuYWdlci5zY2hlZHVsZVN5bmMoYWNjb3VudCwgYXV0aG9yaXR5LCBleHRyYXMsIDAgLyogbm8gZGVsYXkgKi8sCisgICAgICAgICAgICAgICAgc3luY01hbmFnZXIuc2NoZWR1bGVTeW5jKGFjY291bnQsIHVzZXJJZCwgYXV0aG9yaXR5LCBleHRyYXMsIDAgLyogbm8gZGVsYXkgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBvbmx5VGhvc2VXaXRoVW5rb3duU3luY2FibGVTdGF0ZSAqLyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CkBAIC0yNTAsMTQgKzI1NiwxNiBAQAogICAgICAqIEBwYXJhbSBhdXRob3JpdHkgZmlsdGVyIHRoZSBwZW5kaW5nIGFuZCBhY3RpdmUgc3luY3MgdG8gY2FuY2VsIHVzaW5nIHRoaXMgYXV0aG9yaXR5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2FuY2VsU3luYyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgLy8gVGhpcyBtYWtlcyBpdCBzbyB0aGF0IGZ1dHVyZSBwZXJtaXNzaW9uIGNoZWNrcyB3aWxsIGJlIGluIHRoZSBjb250ZXh0IG9mIHRoaXMKICAgICAgICAgLy8gcHJvY2VzcyByYXRoZXIgdGhhbiB0aGUgY2FsbGVyJ3MgcHJvY2Vzcy4gV2Ugd2lsbCByZXN0b3JlIHRoaXMgYmVmb3JlIHJldHVybmluZy4KICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN5bmNNYW5hZ2VyIHN5bmNNYW5hZ2VyID0gZ2V0U3luY01hbmFnZXIoKTsKICAgICAgICAgICAgIGlmIChzeW5jTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3luY01hbmFnZXIuY2xlYXJTY2hlZHVsZWRTeW5jT3BlcmF0aW9ucyhhY2NvdW50LCBhdXRob3JpdHkpOwotICAgICAgICAgICAgICAgIHN5bmNNYW5hZ2VyLmNhbmNlbEFjdGl2ZVN5bmMoYWNjb3VudCwgYXV0aG9yaXR5KTsKKyAgICAgICAgICAgICAgICBzeW5jTWFuYWdlci5jbGVhclNjaGVkdWxlZFN5bmNPcGVyYXRpb25zKGFjY291bnQsIHVzZXJJZCwgYXV0aG9yaXR5KTsKKyAgICAgICAgICAgICAgICBzeW5jTWFuYWdlci5jYW5jZWxBY3RpdmVTeW5jKGFjY291bnQsIHVzZXJJZCwgYXV0aG9yaXR5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CkBAIC0yODMsMTIgKzI5MSwxNCBAQAogICAgIHB1YmxpYyBib29sZWFuIGdldFN5bmNBdXRvbWF0aWNhbGx5KEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1NZTkNfU0VUVElOR1MsCiAgICAgICAgICAgICAgICAgIm5vIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc3luYyBzZXR0aW5ncyIpOworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKKwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3luY01hbmFnZXIgc3luY01hbmFnZXIgPSBnZXRTeW5jTWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHN5bmNNYW5hZ2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gc3luY01hbmFnZXIuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5nZXRTeW5jQXV0b21hdGljYWxseSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQsIHByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwpAQCAtMjk5LDEyICszMDksMTQgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRTeW5jQXV0b21hdGljYWxseShBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUsIGJvb2xlYW4gc3luYykgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9TWU5DX1NFVFRJTkdTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHdyaXRlIHRoZSBzeW5jIHNldHRpbmdzIik7CisgICAgICAgIGludCB1c2VySWQgPSBVc2VySWQuZ2V0Q2FsbGluZ1VzZXJJZCgpOworCiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTeW5jTWFuYWdlciBzeW5jTWFuYWdlciA9IGdldFN5bmNNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAoc3luY01hbmFnZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuc2V0U3luY0F1dG9tYXRpY2FsbHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCBwcm92aWRlck5hbWUsIHN5bmMpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgdXNlcklkLCBwcm92aWRlck5hbWUsIHN5bmMpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKQEAgLTMxNSwxMCArMzI3LDEyIEBACiAgICAgICAgICAgICBsb25nIHBvbGxGcmVxdWVuY3kpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uV1JJVEVfU1lOQ19TRVRUSU5HUywKICAgICAgICAgICAgICAgICAibm8gcGVybWlzc2lvbiB0byB3cml0ZSB0aGUgc3luYyBzZXR0aW5ncyIpOworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKKwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgZ2V0U3luY01hbmFnZXIoKS5nZXRTeW5jU3RvcmFnZUVuZ2luZSgpLmFkZFBlcmlvZGljU3luYygKLSAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgYXV0aG9yaXR5LCBleHRyYXMsIHBvbGxGcmVxdWVuY3kpOworICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSwgZXh0cmFzLCBwb2xsRnJlcXVlbmN5KTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CiAgICAgICAgIH0KQEAgLTMyNyw5ICszNDEsMTIgQEAKICAgICBwdWJsaWMgdm9pZCByZW1vdmVQZXJpb2RpY1N5bmMoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5LCBCdW5kbGUgZXh0cmFzKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX1NZTkNfU0VUVElOR1MsCiAgICAgICAgICAgICAgICAgIm5vIHBlcm1pc3Npb24gdG8gd3JpdGUgdGhlIHN5bmMgc2V0dGluZ3MiKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFN5bmNNYW5hZ2VyKCkuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5yZW1vdmVQZXJpb2RpY1N5bmMoYWNjb3VudCwgYXV0aG9yaXR5LCBleHRyYXMpOworICAgICAgICAgICAgZ2V0U3luY01hbmFnZXIoKS5nZXRTeW5jU3RvcmFnZUVuZ2luZSgpLnJlbW92ZVBlcmlvZGljU3luYyhhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CiAgICAgICAgIH0KQEAgLTMzOCwxMCArMzU1LDEyIEBACiAgICAgcHVibGljIExpc3Q8UGVyaW9kaWNTeW5jPiBnZXRQZXJpb2RpY1N5bmNzKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1NZTkNfU0VUVElOR1MsCiAgICAgICAgICAgICAgICAgIm5vIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc3luYyBzZXR0aW5ncyIpOworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKKwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIGdldFN5bmNNYW5hZ2VyKCkuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5nZXRQZXJpb2RpY1N5bmNzKAotICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCBwcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CkBAIC0zNTAsMTIgKzM2OSwxNCBAQAogICAgIHB1YmxpYyBpbnQgZ2V0SXNTeW5jYWJsZShBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9TWU5DX1NFVFRJTkdTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlIHN5bmMgc2V0dGluZ3MiKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN5bmNNYW5hZ2VyIHN5bmNNYW5hZ2VyID0gZ2V0U3luY01hbmFnZXIoKTsKICAgICAgICAgICAgIGlmIChzeW5jTWFuYWdlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuZ2V0SXNTeW5jYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQsIHByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwpAQCAtMzY2LDEyICszODcsMTQgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRJc1N5bmNhYmxlKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwgaW50IHN5bmNhYmxlKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX1NZTkNfU0VUVElOR1MsCiAgICAgICAgICAgICAgICAgIm5vIHBlcm1pc3Npb24gdG8gd3JpdGUgdGhlIHN5bmMgc2V0dGluZ3MiKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN5bmNNYW5hZ2VyIHN5bmNNYW5hZ2VyID0gZ2V0U3luY01hbmFnZXIoKTsKICAgICAgICAgICAgIGlmIChzeW5jTWFuYWdlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc3luY01hbmFnZXIuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5zZXRJc1N5bmNhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgcHJvdmlkZXJOYW1lLCBzeW5jYWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwgc3luY2FibGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKQEAgLTM4MSwxMSArNDA0LDEzIEBACiAgICAgcHVibGljIGJvb2xlYW4gZ2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfU1lOQ19TRVRUSU5HUywKICAgICAgICAgICAgICAgICAibm8gcGVybWlzc2lvbiB0byByZWFkIHRoZSBzeW5jIHNldHRpbmdzIik7CisgICAgICAgIGludCB1c2VySWQgPSBVc2VySWQuZ2V0Q2FsbGluZ1VzZXJJZCgpOworCiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTeW5jTWFuYWdlciBzeW5jTWFuYWdlciA9IGdldFN5bmNNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAoc3luY01hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzeW5jTWFuYWdlci5nZXRTeW5jU3RvcmFnZUVuZ2luZSgpLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuZ2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkodXNlcklkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CkBAIC0zOTYsMTEgKzQyMSwxMyBAQAogICAgIHB1YmxpYyB2b2lkIHNldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KGJvb2xlYW4gZmxhZykgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9TWU5DX1NFVFRJTkdTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHdyaXRlIHRoZSBzeW5jIHNldHRpbmdzIik7CisgICAgICAgIGludCB1c2VySWQgPSBVc2VySWQuZ2V0Q2FsbGluZ1VzZXJJZCgpOworCiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTeW5jTWFuYWdlciBzeW5jTWFuYWdlciA9IGdldFN5bmNNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAoc3luY01hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuc2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoZmxhZyk7CisgICAgICAgICAgICAgICAgc3luY01hbmFnZXIuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5zZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseShmbGFnLCB1c2VySWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKQEAgLTQxMCwxMiArNDM3LDE0IEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNTeW5jQWN0aXZlKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1NZTkNfU1RBVFMsCiAgICAgICAgICAgICAgICAgIm5vIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc3luYyBzdGF0cyIpOworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKKwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3luY01hbmFnZXIgc3luY01hbmFnZXIgPSBnZXRTeW5jTWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHN5bmNNYW5hZ2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gc3luY01hbmFnZXIuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5pc1N5bmNBY3RpdmUoCi0gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCBhdXRob3JpdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgdXNlcklkLCBhdXRob3JpdHkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKQEAgLTQyNiw5ICs0NTUsMTEgQEAKICAgICBwdWJsaWMgTGlzdDxTeW5jSW5mbz4gZ2V0Q3VycmVudFN5bmNzKCkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1NZTkNfU1RBVFMsCiAgICAgICAgICAgICAgICAgIm5vIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc3luYyBzdGF0cyIpOworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKKwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFN5bmNNYW5hZ2VyKCkuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5nZXRDdXJyZW50U3luY3MoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRTeW5jTWFuYWdlcigpLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuZ2V0Q3VycmVudFN5bmNzKHVzZXJJZCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CkBAIC00MzcsMTIgKzQ2OCwxNCBAQAogICAgIHB1YmxpYyBTeW5jU3RhdHVzSW5mbyBnZXRTeW5jU3RhdHVzKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1NZTkNfU1RBVFMsCiAgICAgICAgICAgICAgICAgIm5vIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc3luYyBzdGF0cyIpOworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKKwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3luY01hbmFnZXIgc3luY01hbmFnZXIgPSBnZXRTeW5jTWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHN5bmNNYW5hZ2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gc3luY01hbmFnZXIuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5nZXRTdGF0dXNCeUFjY291bnRBbmRBdXRob3JpdHkoCi0gICAgICAgICAgICAgICAgICAgIGFjY291bnQsIGF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwpAQCAtNDUzLDExICs0ODYsMTMgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bmNQZW5kaW5nKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1NZTkNfU1RBVFMsCiAgICAgICAgICAgICAgICAgIm5vIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc3luYyBzdGF0cyIpOworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKKwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3luY01hbmFnZXIgc3luY01hbmFnZXIgPSBnZXRTeW5jTWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHN5bmNNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3luY01hbmFnZXIuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5pc1N5bmNQZW5kaW5nKGFjY291bnQsIGF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuaXNTeW5jUGVuZGluZyhhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKaW5kZXggYWI2MmM0NC4uNTczOTExOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCkBAIC0xMTM3LDcgKzExMzcsNyBAQAogICAgIC8qKgogICAgICAqIEFjdGl2aXR5IEFjdGlvbjogVGhlIHVzZXIgcHJlc3NlZCB0aGUgIlJlcG9ydCIgYnV0dG9uIGluIHRoZSBjcmFzaC9BTlIgZGlhbG9nLgogICAgICAqIFRoaXMgaW50ZW50IGlzIGRlbGl2ZXJlZCB0byB0aGUgcGFja2FnZSB3aGljaCBpbnN0YWxsZWQgdGhlIGFwcGxpY2F0aW9uLCB1c3VhbGx5Ci0gICAgICogdGhlIE1hcmtldC4KKyAgICAgKiBHb29nbGUgUGxheS4KICAgICAgKiA8cD5JbnB1dDogTm8gZGF0YSBpcyBzcGVjaWZpZWQuIFRoZSBidWcgcmVwb3J0IGlzIHBhc3NlZCBpbiB1c2luZwogICAgICAqIGFuIHtAbGluayAjRVhUUkFfQlVHX1JFUE9SVH0gZmllbGQuCiAgICAgICogPHA+T3V0cHV0OiBOb3RoaW5nLgpAQCAtMjY4OCwxMiArMjY4OCwyMCBAQAogCiAgICAgLyoqCiAgICAgICogSWYgc2V0LCB0aGUgcmVjaXBpZW50IG9mIHRoaXMgSW50ZW50IHdpbGwgYmUgZ3JhbnRlZCBwZXJtaXNzaW9uIHRvCi0gICAgICogcGVyZm9ybSByZWFkIG9wZXJhdGlvbnMgb24gdGhlIFVyaSBpbiB0aGUgSW50ZW50J3MgZGF0YS4KKyAgICAgKiBwZXJmb3JtIHJlYWQgb3BlcmF0aW9ucyBvbiB0aGUgVXJpIGluIHRoZSBJbnRlbnQncyBkYXRhIGFuZCBhbnkgVVJJcworICAgICAqIHNwZWNpZmllZCBpbiBpdHMgQ2xpcERhdGEuICBXaGVuIGFwcGx5aW5nIHRvIGFuIEludGVudCdzIENsaXBEYXRhLAorICAgICAqIGFsbCBVUklzIGFzIHdlbGwgYXMgcmVjdXJzaXZlIHRyYXZlcnNhbHMgdGhyb3VnaCBkYXRhIG9yIG90aGVyIENsaXBEYXRhCisgICAgICogaW4gSW50ZW50IGl0ZW1zIHdpbGwgYmUgZ3JhbnRlZDsgb25seSB0aGUgZ3JhbnQgZmxhZ3Mgb2YgdGhlIHRvcC1sZXZlbAorICAgICAqIEludGVudCBhcmUgdXNlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04gPSAweDAwMDAwMDAxOwogICAgIC8qKgogICAgICAqIElmIHNldCwgdGhlIHJlY2lwaWVudCBvZiB0aGlzIEludGVudCB3aWxsIGJlIGdyYW50ZWQgcGVybWlzc2lvbiB0bwotICAgICAqIHBlcmZvcm0gd3JpdGUgb3BlcmF0aW9ucyBvbiB0aGUgVXJpIGluIHRoZSBJbnRlbnQncyBkYXRhLgorICAgICAqIHBlcmZvcm0gd3JpdGUgb3BlcmF0aW9ucyBvbiB0aGUgVXJpIGluIHRoZSBJbnRlbnQncyBkYXRhIGFuZCBhbnkgVVJJcworICAgICAqIHNwZWNpZmllZCBpbiBpdHMgQ2xpcERhdGEuICBXaGVuIGFwcGx5aW5nIHRvIGFuIEludGVudCdzIENsaXBEYXRhLAorICAgICAqIGFsbCBVUklzIGFzIHdlbGwgYXMgcmVjdXJzaXZlIHRyYXZlcnNhbHMgdGhyb3VnaCBkYXRhIG9yIG90aGVyIENsaXBEYXRhCisgICAgICogaW4gSW50ZW50IGl0ZW1zIHdpbGwgYmUgZ3JhbnRlZDsgb25seSB0aGUgZ3JhbnQgZmxhZ3Mgb2YgdGhlIHRvcC1sZXZlbAorICAgICAqIEludGVudCBhcmUgdXNlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OID0gMHgwMDAwMDAwMjsKICAgICAvKioKQEAgLTMwMTgsNiArMzAyNiw3IEBACiAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKICAgICBwcml2YXRlIFJlY3QgbVNvdXJjZUJvdW5kczsKICAgICBwcml2YXRlIEludGVudCBtU2VsZWN0b3I7CisgICAgcHJpdmF0ZSBDbGlwRGF0YSBtQ2xpcERhdGE7CiAKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzA0OSw2ICszMDU4LDkgQEAKICAgICAgICAgaWYgKG8ubVNlbGVjdG9yICE9IG51bGwpIHsKICAgICAgICAgICAgIHRoaXMubVNlbGVjdG9yID0gbmV3IEludGVudChvLm1TZWxlY3Rvcik7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG8ubUNsaXBEYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMubUNsaXBEYXRhID0gbmV3IENsaXBEYXRhKG8ubUNsaXBEYXRhKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzcyOSw2ICszNzQxLDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgQ2xpcERhdGF9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEludGVudC4gIElmIHRoZXJlIGlzCisgICAgICogbm9uZSwgcmV0dXJucyBudWxsLiAgU2VlIHtAbGluayAjc2V0Q2xpcERhdGF9IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHNlZSAjc2V0Q2xpcERhdGE7CisgICAgICovCisgICAgcHVibGljIENsaXBEYXRhIGdldENsaXBEYXRhKCkgeworICAgICAgICByZXR1cm4gbUNsaXBEYXRhOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIENsYXNzTG9hZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdW5tYXJzaGFsbGluZwogICAgICAqIGFueSBQYXJjZWxhYmxlIHZhbHVlcyBmcm9tIHRoZSBleHRyYXMgb2YgdGhpcyBJbnRlbnQuCiAgICAgICoKQEAgLTQ2ODMsNiArNDcwNSwzNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldCBhIHtAbGluayBDbGlwRGF0YX0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgSW50ZW50LiAgVGhpcyByZXBsYWNlcyBhbnkKKyAgICAgKiBwcmV2aW91c2x5IHNldCBDbGlwRGF0YS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBDbGlwRGF0YSBpbiBhbiBpbnRlbnQgaXMgbm90IHVzZWQgZm9yIEludGVudCBtYXRjaGluZyBvciBvdGhlcgorICAgICAqIHN1Y2ggb3BlcmF0aW9ucy4gIFNlbWFudGljYWxseSBpdCBpcyBsaWtlIGV4dHJhcywgdXNlZCB0byB0cmFuc21pdAorICAgICAqIGFkZGl0aW9uYWwgZGF0YSB3aXRoIHRoZSBJbnRlbnQuICBUaGUgbWFpbiBmZWF0dXJlIG9mIHVzaW5nIHRoaXMgb3ZlcgorICAgICAqIHRoZSBleHRyYXMgZm9yIGRhdGEgaXMgdGhhdCB7QGxpbmsgI0ZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTn0KKyAgICAgKiBhbmQge0BsaW5rICNGTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OfSB3aWxsIG9wZXJhdGUgb24gYW55IFVSSQorICAgICAqIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBjbGlwIGRhdGEuICBUaGlzIGlzIHVzZWZ1bCwgaW4gcGFydGljdWxhciwgaWYKKyAgICAgKiB5b3Ugd2FudCB0byB0cmFuc21pdCBhbiBJbnRlbnQgY29udGFpbmluZyBtdWx0aXBsZSA8Y29kZT5jb250ZW50OjwvY29kZT4KKyAgICAgKiBVUklzIGZvciB3aGljaCB0aGUgcmVjaXBpZW50IG1heSBub3QgaGF2ZSBnbG9iYWwgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlCisgICAgICogY29udGVudCBwcm92aWRlci4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBDbGlwRGF0YSBjb250YWlucyBpdGVtcyB0aGF0IGFyZSB0aGVtc2VsdmVzIEludGVudHMsIGFueQorICAgICAqIGdyYW50IGZsYWdzIGluIHRob3NlIEludGVudHMgd2lsbCBiZSBpZ25vcmVkLiAgT25seSB0aGUgdG9wLWxldmVsIGZsYWdzCisgICAgICogb2YgdGhlIG1haW4gSW50ZW50IGFyZSByZXNwZWN0ZWQsIGFuZCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIFVyaSBvcgorICAgICAqIEludGVudCBpdGVtcyBpbiB0aGUgY2xpcCAob3Igc3ViLWl0ZW1zIG9mIHRoZSBjbGlwKS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBNSU1FIHR5cGUsIGxhYmVsLCBhbmQgaWNvbiBpbiB0aGUgQ2xpcERhdGEgb2JqZWN0IGFyZSBub3QKKyAgICAgKiBkaXJlY3RseSB1c2VkIGJ5IEludGVudC4gIEFwcGxpY2F0aW9ucyBzaG91bGQgZ2VuZXJhbGx5IHJlbHkgb24gdGhlCisgICAgICogTUlNRSB0eXBlIG9mIHRoZSBJbnRlbnQgaXRzZWxmLCBub3Qgd2hhdCBpdCBtYXkgZmluZCBpbiB0aGUgQ2xpcERhdGEuCisgICAgICogQSBjb21tb24gcHJhY3RpY2UgaXMgdG8gY29uc3RydWN0IGEgQ2xpcERhdGEgZm9yIHVzZSB3aXRoIGFuIEludGVudAorICAgICAqIHdpdGggYSBNSU1FIHR5cGUgb2YgIipcLyoiLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaXAgVGhlIG5ldyBjbGlwIHRvIHNldC4gIE1heSBiZSBudWxsIHRvIGNsZWFyIHRoZSBjdXJyZW50IGNsaXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xpcERhdGEoQ2xpcERhdGEgY2xpcCkgeworICAgICAgICBtQ2xpcERhdGEgPSBjbGlwOworICAgIH0KKworICAgIC8qKgogICAgICAqIEFkZCBleHRlbmRlZCBkYXRhIHRvIHRoZSBpbnRlbnQuICBUaGUgbmFtZSBtdXN0IGluY2x1ZGUgYSBwYWNrYWdlCiAgICAgICogcHJlZml4LCBmb3IgZXhhbXBsZSB0aGUgYXBwIGNvbS5hbmRyb2lkLmNvbnRhY3RzIHdvdWxkIHVzZSBuYW1lcwogICAgICAqIGxpa2UgImNvbS5hbmRyb2lkLmNvbnRhY3RzLlNob3dBbGwiLgpAQCAtNTY2MCw2ICs1NzEzLDEyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9JTl9TRUxFQ1RPUiA9IDE8PDY7CiAKICAgICAvKioKKyAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI2ZpbGxJbn0gdG8gYWxsb3cgdGhlIGN1cnJlbnQgQ2xpcERhdGEgdG8gYmUKKyAgICAgKiBvdmVyd3JpdHRlbiwgZXZlbiBpZiBpdCBpcyBhbHJlYWR5IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMX0lOX0NMSVBfREFUQSA9IDE8PDc7CisKKyAgICAvKioKICAgICAgKiBDb3B5IHRoZSBjb250ZW50cyBvZiA8dmFyPm90aGVyPC92YXI+IGluIHRvIHRoaXMgb2JqZWN0LCBidXQgb25seQogICAgICAqIHdoZXJlIGZpZWxkcyBhcmUgbm90IGRlZmluZWQgYnkgdGhpcyBvYmplY3QuICBGb3IgcHVycG9zZXMgb2YgYSBmaWVsZAogICAgICAqIGJlaW5nIGRlZmluZWQsIHRoZSBmb2xsb3dpbmcgcGllY2VzIG9mIGRhdGEgaW4gdGhlIEludGVudCBhcmUKQEAgLTU2NzMsMTkgKzU3MzIsMjIgQEAKICAgICAgKiA8bGk+IHBhY2thZ2UsIGFzIHNldCBieSB7QGxpbmsgI3NldFBhY2thZ2V9LgogICAgICAqIDxsaT4gY29tcG9uZW50LCBhcyBzZXQgYnkge0BsaW5rICNzZXRDb21wb25lbnQoQ29tcG9uZW50TmFtZSl9IG9yCiAgICAgICogcmVsYXRlZCBtZXRob2RzLgotICAgICAqIDxsaT4gc291cmNlIGJvdW5kcywgYXMgc2V0IGJ5IHtAbGluayAjc2V0U291cmNlQm91bmRzfQorICAgICAqIDxsaT4gc291cmNlIGJvdW5kcywgYXMgc2V0IGJ5IHtAbGluayAjc2V0U291cmNlQm91bmRzfS4KKyAgICAgKiA8bGk+IHNlbGVjdG9yLCBhcyBzZXQgYnkge0BsaW5rICNzZXRTZWxlY3RvcihJbnRlbnQpfS4KKyAgICAgKiA8bGk+IGNsaXAgZGF0YSwgYXMgc2V0IGJ5IHtAbGluayAjc2V0Q2xpcERhdGEoQ2xpcERhdGEpfS4KICAgICAgKiA8bGk+IGVhY2ggdG9wLWxldmVsIG5hbWUgaW4gdGhlIGFzc29jaWF0ZWQgZXh0cmFzLgogICAgICAqIDwvdWw+CiAgICAgICoKICAgICAgKiA8cD5JbiBhZGRpdGlvbiwgeW91IGNhbiB1c2UgdGhlIHtAbGluayAjRklMTF9JTl9BQ1RJT059LAogICAgICAqIHtAbGluayAjRklMTF9JTl9EQVRBfSwge0BsaW5rICNGSUxMX0lOX0NBVEVHT1JJRVN9LCB7QGxpbmsgI0ZJTExfSU5fUEFDS0FHRX0sCi0gICAgICoge0BsaW5rICNGSUxMX0lOX0NPTVBPTkVOVH0sIHtAbGluayAjRklMTF9JTl9TT1VSQ0VfQk9VTkRTfSwgYW5kCi0gICAgICoge0BsaW5rICNGSUxMX0lOX1NFTEVDVE9SfSB0byBvdmVycmlkZSB0aGUgcmVzdHJpY3Rpb24gd2hlcmUgdGhlCi0gICAgICogY29ycmVzcG9uZGluZyBmaWVsZCB3aWxsIG5vdCBiZSByZXBsYWNlZCBpZiBpdCBpcyBhbHJlYWR5IHNldC4KKyAgICAgKiB7QGxpbmsgI0ZJTExfSU5fQ09NUE9ORU5UfSwge0BsaW5rICNGSUxMX0lOX1NPVVJDRV9CT1VORFN9LAorICAgICAqIHtAbGluayAjRklMTF9JTl9TRUxFQ1RPUn0sIGFuZCB7QGxpbmsgI0ZJTExfSU5fQ0xJUF9EQVRBfSB0byBvdmVycmlkZQorICAgICAqIHRoZSByZXN0cmljdGlvbiB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCB3aWxsIG5vdCBiZSByZXBsYWNlZCBpZgorICAgICAqIGl0IGlzIGFscmVhZHkgc2V0LgogICAgICAqCi0gICAgICogPHA+Tm90ZTogVGhlIGNvbXBvbmVudCBmaWVsZCB3aWxsIG9ubHkgYmUgY29waWVkIGlmIHtAbGluayAjRklMTF9JTl9DT01QT05FTlR9IGlzIGV4cGxpY2l0bHkKLSAgICAgKiBzcGVjaWZpZWQuICBUaGUgc2VsZWN0b3Igd2lsbCBvbmx5IGJlIGNvcGllZCBpZiB7QGxpbmsgI0ZJTExfSU5fU0VMRUNUT1J9IGlzCi0gICAgICogZXhwbGljaXRseSBzcGVjaWZpZWQuCisgICAgICogPHA+Tm90ZTogVGhlIGNvbXBvbmVudCBmaWVsZCB3aWxsIG9ubHkgYmUgY29waWVkIGlmIHtAbGluayAjRklMTF9JTl9DT01QT05FTlR9CisgICAgICogaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuICBUaGUgc2VsZWN0b3Igd2lsbCBvbmx5IGJlIGNvcGllZCBpZgorICAgICAqIHtAbGluayAjRklMTF9JTl9TRUxFQ1RPUn0gaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCiAgICAgICoKICAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgY29uc2lkZXIgSW50ZW50IEEgd2l0aCB7ZGF0YT0iZm9vIiwgY2F0ZWdvcmllcz0iYmFyIn0KICAgICAgKiBhbmQgSW50ZW50IEIgd2l0aCB7YWN0aW9uPSJnb3RpdCIsIGRhdGEtdHlwZT0ic29tZS90aGluZyIsCkBAIC01NzQyLDYgKzU4MDQsMTEgQEAKICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IEZJTExfSU5fU0VMRUNUT1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG90aGVyLm1DbGlwRGF0YSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgKG1DbGlwRGF0YSA9PSBudWxsIHx8IChmbGFncyZGSUxMX0lOX0NMSVBfREFUQSkgIT0gMCkpIHsKKyAgICAgICAgICAgIG1DbGlwRGF0YSA9IG90aGVyLm1DbGlwRGF0YTsKKyAgICAgICAgICAgIGNoYW5nZXMgfD0gRklMTF9JTl9DTElQX0RBVEE7CisgICAgICAgIH0KICAgICAgICAgLy8gQ29tcG9uZW50IGlzIHNwZWNpYWw6IGl0IGNhbiAtb25seS0gYmUgc2V0IGlmIGV4cGxpY2l0bHkgYWxsb3dlZCwKICAgICAgICAgLy8gc2luY2Ugb3RoZXJ3aXNlIHRoZSBzZW5kZXIgY291bGQgZm9yY2UgdGhlIGludGVudCBzb21ld2hlcmUgdGhlCiAgICAgICAgIC8vIG9yaWdpbmF0b3IgZGlkbid0IGludGVuZC4KQEAgLTU5MzgsNyArNjAwNSw3IEBACiAgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CiAKICAgICAgICAgYi5hcHBlbmQoIkludGVudCB7ICIpOwotICAgICAgICB0b1Nob3J0U3RyaW5nKGIsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICB0b1Nob3J0U3RyaW5nKGIsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKTsKICAgICAgICAgYi5hcHBlbmQoIiB9Iik7CiAKICAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKQEAgLTU5NDksMjEgKzYwMTYsMzMgQEAKICAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKIAogICAgICAgICBiLmFwcGVuZCgiSW50ZW50IHsgIik7Ci0gICAgICAgIHRvU2hvcnRTdHJpbmcoYiwgZmFsc2UsIHRydWUsIHRydWUpOworICAgICAgICB0b1Nob3J0U3RyaW5nKGIsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgIGIuYXBwZW5kKCIgfSIpOwogCiAgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CiAgICAgfQogCiAgICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIFN0cmluZyB0b1Nob3J0U3RyaW5nKGJvb2xlYW4gc2VjdXJlLCBib29sZWFuIGNvbXAsIGJvb2xlYW4gZXh0cmFzKSB7CisgICAgcHVibGljIFN0cmluZyB0b0luc2VjdXJlU3RyaW5nV2l0aENsaXAoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7Ci0gICAgICAgIHRvU2hvcnRTdHJpbmcoYiwgc2VjdXJlLCBjb21wLCBleHRyYXMpOworCisgICAgICAgIGIuYXBwZW5kKCJJbnRlbnQgeyAiKTsKKyAgICAgICAgdG9TaG9ydFN0cmluZyhiLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGIuYXBwZW5kKCIgfSIpOworCiAgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CiAgICAgfQogCiAgICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIHZvaWQgdG9TaG9ydFN0cmluZyhTdHJpbmdCdWlsZGVyIGIsIGJvb2xlYW4gc2VjdXJlLCBib29sZWFuIGNvbXAsIGJvb2xlYW4gZXh0cmFzKSB7CisgICAgcHVibGljIFN0cmluZyB0b1Nob3J0U3RyaW5nKGJvb2xlYW4gc2VjdXJlLCBib29sZWFuIGNvbXAsIGJvb2xlYW4gZXh0cmFzLCBib29sZWFuIGNsaXApIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKKyAgICAgICAgdG9TaG9ydFN0cmluZyhiLCBzZWN1cmUsIGNvbXAsIGV4dHJhcywgY2xpcCk7CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHZvaWQgdG9TaG9ydFN0cmluZyhTdHJpbmdCdWlsZGVyIGIsIGJvb2xlYW4gc2VjdXJlLCBib29sZWFuIGNvbXAsIGJvb2xlYW4gZXh0cmFzLAorICAgICAgICAgICAgYm9vbGVhbiBjbGlwKSB7CiAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwogICAgICAgICBpZiAobUFjdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICBiLmFwcGVuZCgiYWN0PSIpLmFwcGVuZChtQWN0aW9uKTsKQEAgLTYwMzEsNiArNjExMCwxOSBAQAogICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgIGIuYXBwZW5kKCJibmRzPSIpLmFwcGVuZChtU291cmNlQm91bmRzLnRvU2hvcnRTdHJpbmcoKSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1DbGlwRGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoY2xpcCkgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCJjbGlwPXsiKTsKKyAgICAgICAgICAgICAgICBtQ2xpcERhdGEudG9TaG9ydFN0cmluZyhiKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgnfScpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiKGhhcyBjbGlwKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChleHRyYXMgJiYgbUV4dHJhcyAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgICAgICAgICAgYi5hcHBlbmQoJyAnKTsKQEAgLTYwNDAsNyArNjEzMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG1TZWxlY3RvciAhPSBudWxsKSB7CiAgICAgICAgICAgICBiLmFwcGVuZCgiIHNlbD17Iik7Ci0gICAgICAgICAgICBtU2VsZWN0b3IudG9TaG9ydFN0cmluZyhiLCBzZWN1cmUsIGNvbXAsIGV4dHJhcyk7CisgICAgICAgICAgICBtU2VsZWN0b3IudG9TaG9ydFN0cmluZyhiLCBzZWN1cmUsIGNvbXAsIGV4dHJhcywgY2xpcCk7CiAgICAgICAgICAgICBiLmFwcGVuZCgifSIpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjIwOSw2ICs2MzAxLDEzIEBACiAgICAgICAgICAgICBvdXQud3JpdGVJbnQoMCk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUNsaXBEYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC53cml0ZUludCgxKTsKKyAgICAgICAgICAgIG1DbGlwRGF0YS53cml0ZVRvUGFyY2VsKG91dCwgZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LndyaXRlSW50KDApOworICAgICAgICB9CisKICAgICAgICAgb3V0LndyaXRlQnVuZGxlKG1FeHRyYXMpOwogICAgIH0KIApAQCAtNjI1NCw2ICs2MzUzLDEwIEBACiAgICAgICAgICAgICBtU2VsZWN0b3IgPSBuZXcgSW50ZW50KGluKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChpbi5yZWFkSW50KCkgIT0gMCkgeworICAgICAgICAgICAgbUNsaXBEYXRhID0gbmV3IENsaXBEYXRhKGluKTsKKyAgICAgICAgfQorCiAgICAgICAgIG1FeHRyYXMgPSBpbi5yZWFkQnVuZGxlKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEKaW5kZXggYmEyNDAzNi4uYjdkZmU5MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YQpAQCAtMjMsMTggKzIzLDIzIEBACiAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CiBpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNYW5hZ2VyU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLk9uQWNjb3VudHNVcGRhdGVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFwcEdsb2JhbHM7CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Eb3dubG9hZE1hbmFnZXIuUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU3luY1N0b3JhZ2VFbmdpbmUuT25TeW5jUmVxdWVzdExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5Qcm92aWRlckluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlZ2lzdGVyZWRTZXJ2aWNlc0NhY2hlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZWdpc3RlcmVkU2VydmljZXNDYWNoZUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uVXNlckluZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKQEAgLTQ4LDYgKzUzLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJJZDsKIGltcG9ydCBhbmRyb2lkLm9zLldvcmtTb3VyY2U7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlsczsKQEAgLTEzMiw3ICsxMzgsOSBAQAogCiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBBY2NvdW50W10gbUFjY291bnRzID0gSU5JVElBTF9BQ0NPVU5UU19BUlJBWTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY2NvdW50QW5kVXNlcltdIElOSVRJQUxfQUNDT1VOVFNfQVJSQVkgPSBuZXcgQWNjb3VudEFuZFVzZXJbMF07CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIEFjY291bnRBbmRVc2VyW10gbUFjY291bnRzID0gSU5JVElBTF9BQ0NPVU5UU19BUlJBWTsKIAogICAgIHZvbGF0aWxlIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1IYW5kbGVBbGFybVdha2VMb2NrOwogICAgIHZvbGF0aWxlIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1TeW5jTWFuYWdlcldha2VMb2NrOwpAQCAtMTY2LDcgKzE3NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiSW50ZXJuYWwgc3RvcmFnZSBpcyBsb3cuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RvcmFnZUlzTG93ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEFjdGl2ZVN5bmMobnVsbCAvKiBhbnkgYWNjb3VudCAqLywgbnVsbCAvKiBhbnkgYXV0aG9yaXR5ICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEFjdGl2ZVN5bmMobnVsbCAvKiBhbnkgYWNjb3VudCAqLywgVXNlcklkLlVTRVJfQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGFueSBhdXRob3JpdHkgKi8pOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEludGVudC5BQ1RJT05fREVWSUNFX1NUT1JBR0VfT0suZXF1YWxzKGFjdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkludGVybmFsIHN0b3JhZ2UgaXMgb2suIik7CkBAIC0xODYsMjggKzE5NSw3MyBAQAogICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUJhY2tncm91bmREYXRhU2V0dGluZ0NoYW5nZWQgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKICAgICAgICAgICAgIGlmIChnZXRDb25uZWN0aXZpdHlNYW5hZ2VyKCkuZ2V0QmFja2dyb3VuZERhdGFTZXR0aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmMobnVsbCAvKiBhY2NvdW50ICovLCBudWxsIC8qIGF1dGhvcml0eSAqLywgbmV3IEJ1bmRsZSgpLCAwIC8qIGRlbGF5ICovLAorICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luYyhudWxsIC8qIGFjY291bnQgKi8sIFVzZXJJZC5VU0VSX0FMTCwgbnVsbCAvKiBhdXRob3JpdHkgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVuZGxlKCksIDAgLyogZGVsYXkgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBvbmx5VGhvc2VXaXRoVW5rbm93blN5bmNhYmxlU3RhdGUgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjY291bnRbXSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZID0gbmV3IEFjY291bnRbMF07Ci0KICAgICBwcml2YXRlIGZpbmFsIFBvd2VyTWFuYWdlciBtUG93ZXJNYW5hZ2VyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTWU5DX0FMQVJNX1RJTUVPVVRfTUlOID0gMzAgKiAxMDAwOyAvLyAzMCBzZWNvbmRzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTWU5DX0FMQVJNX1RJTUVPVVRfTUFYID0gMiAqIDYwICogNjAgKiAxMDAwOyAvLyB0d28gaG91cnMKIAorICAgIHByaXZhdGUgTGlzdDxVc2VySW5mbz4gZ2V0QWxsVXNlcnMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQXBwR2xvYmFscy5nZXRQYWNrYWdlTWFuYWdlcigpLmdldFVzZXJzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgLy8gTG9jYWwgdG8gc3lzdGVtIHByb2Nlc3MsIHNob3VsZG4ndCBoYXBwZW4KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNBY2NvdW50QW5kVXNlcihBY2NvdW50QW5kVXNlcltdIGFjY291bnRzLCBBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQpIHsKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjY291bnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYWNjb3VudHNbaV0udXNlcklkID09IHVzZXJJZAorICAgICAgICAgICAgICAgICAgICAmJiBhY2NvdW50c1tpXS5hY2NvdW50LmVxdWFscyhhY2NvdW50KSkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm91bmQ7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgb25BY2NvdW50c1VwZGF0ZWQoQWNjb3VudFtdIGFjY291bnRzKSB7CiAgICAgICAgIC8vIHJlbWVtYmVyIGlmIHRoaXMgd2FzIHRoZSBmaXJzdCB0aW1lIHRoaXMgd2FzIGNhbGxlZCBhZnRlciBhbiB1cGRhdGUKICAgICAgICAgZmluYWwgYm9vbGVhbiBqdXN0Qm9vdGVkVXAgPSBtQWNjb3VudHMgPT0gSU5JVElBTF9BQ0NPVU5UU19BUlJBWTsKLSAgICAgICAgbUFjY291bnRzID0gYWNjb3VudHM7CiAKLSAgICAgICAgLy8gaWYgYSBzeW5jIGlzIGluIHByb2dyZXNzIHlldCBpdCBpcyBubyBsb25nZXIgaW4gdGhlIGFjY291bnRzIGxpc3QsCi0gICAgICAgIC8vIGNhbmNlbCBpdAorICAgICAgICBMaXN0PFVzZXJJbmZvPiB1c2VycyA9IGdldEFsbFVzZXJzKCk7CisgICAgICAgIGlmICh1c2VycyA9PSBudWxsKSAgcmV0dXJuOworCisgICAgICAgIGludCBjb3VudCA9IDA7CisKKyAgICAgICAgLy8gRm9yIGFsbCBrbm93biB1c2VycyBvbiB0aGUgc3lzdGVtLCBnZXQgdGhlaXIgYWNjb3VudHMgYW5kIGFkZCB0aGVtIHRvIHRoZSBsaXN0CisgICAgICAgIC8vIFRPRE86IExpbWl0IHRoaXMgdG8gYWN0aXZlIHVzZXJzLCB3aGVuIHN1Y2ggYSBjb25jZXB0IGV4aXN0cy4KKyAgICAgICAgZm9yIChVc2VySW5mbyB1c2VyIDogdXNlcnMpIHsKKyAgICAgICAgICAgIGFjY291bnRzID0gQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmdldFNpbmdsZXRvbigpLmdldEFjY291bnRzKHVzZXIuaWQpOworICAgICAgICAgICAgY291bnQgKz0gYWNjb3VudHMubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgQWNjb3VudEFuZFVzZXJbXSBhbGxBY2NvdW50cyA9IG5ldyBBY2NvdW50QW5kVXNlcltjb3VudF07CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGZvciAoVXNlckluZm8gdXNlciA6IHVzZXJzKSB7CisgICAgICAgICAgICBhY2NvdW50cyA9IEFjY291bnRNYW5hZ2VyU2VydmljZS5nZXRTaW5nbGV0b24oKS5nZXRBY2NvdW50cyh1c2VyLmlkKTsKKyAgICAgICAgICAgIGZvciAoQWNjb3VudCBhY2NvdW50IDogYWNjb3VudHMpIHsKKyAgICAgICAgICAgICAgICBhbGxBY2NvdW50c1tpbmRleCsrXSA9IG5ldyBBY2NvdW50QW5kVXNlcihhY2NvdW50LCB1c2VyLmlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQm9vdENvbXBsZXRlZCkgeworICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5kb0RhdGFiYXNlQ2xlYW51cChhY2NvdW50cywgdXNlci5pZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtQWNjb3VudHMgPSBhbGxBY2NvdW50czsKKwogICAgICAgICBmb3IgKEFjdGl2ZVN5bmNDb250ZXh0IGN1cnJlbnRTeW5jQ29udGV4dCA6IG1BY3RpdmVTeW5jQ29udGV4dHMpIHsKLSAgICAgICAgICAgIGlmICghQXJyYXlVdGlscy5jb250YWlucyhhY2NvdW50cywgY3VycmVudFN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmFjY291bnQpKSB7CisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zQWNjb3VudEFuZFVzZXIoYWxsQWNjb3VudHMsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hY2NvdW50LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24udXNlcklkKSkgewogICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNhbmNlbGluZyBzeW5jIHNpbmNlIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlbW92ZWQiKTsKICAgICAgICAgICAgICAgICBzZW5kU3luY0ZpbmlzaGVkT3JDYW5jZWxlZE1lc3NhZ2UoY3VycmVudFN5bmNDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBubyByZXN1bHQgc2luY2UgdGhpcyBpcyBhIGNhbmNlbCAqLyk7CkBAIC0yMTgsMTEgKzI3Miw3IEBACiAgICAgICAgIC8vIHRoZSBhY2NvdW50cyBhcmUgbm90IHNldCB5ZXQKICAgICAgICAgc2VuZENoZWNrQWxhcm1zTWVzc2FnZSgpOwogCi0gICAgICAgIGlmIChtQm9vdENvbXBsZXRlZCkgewotICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLmRvRGF0YWJhc2VDbGVhbnVwKGFjY291bnRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY2NvdW50cy5sZW5ndGggPiAwKSB7CisgICAgICAgIGlmIChhbGxBY2NvdW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoaXMgd2FzIGNhbGxlZCBhZnRlciBhIGJvb3R1cCB0aGVuCiAgICAgICAgICAgICAvLyB0aGUgYWNjb3VudHMgaGF2ZW4ndCByZWFsbHkgY2hhbmdlZCwgaW5zdGVhZCB0aGV5IHdlcmUganVzdCBsb2FkZWQKICAgICAgICAgICAgIC8vIGZyb20gdGhlIEFjY291bnRNYW5hZ2VyLiBPdGhlcndpc2UgYXQgbGVhc3Qgb25lIG9mIHRoZSBhY2NvdW50cwpAQCAtMjM4LDcgKzI4OCw4IEBACiAgICAgICAgICAgICAvLyBhIGNoYW5jZSB0byBzZXQgdGhlaXIgc3luY2FibGUgc3RhdGUuCiAKICAgICAgICAgICAgIGJvb2xlYW4gb25seVRob3NlV2l0aFVua293blN5bmNhYmxlU3RhdGUgPSBqdXN0Qm9vdGVkVXA7Ci0gICAgICAgICAgICBzY2hlZHVsZVN5bmMobnVsbCwgbnVsbCwgbnVsbCwgMCAvKiBubyBkZWxheSAqLywgb25seVRob3NlV2l0aFVua293blN5bmNhYmxlU3RhdGUpOworICAgICAgICAgICAgc2NoZWR1bGVTeW5jKG51bGwsIFVzZXJJZC5VU0VSX0FMTCwgbnVsbCwgbnVsbCwgMCAvKiBubyBkZWxheSAqLywKKyAgICAgICAgICAgICAgICAgICAgb25seVRob3NlV2l0aFVua293blN5bmNhYmxlU3RhdGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNzcsMTAgKzMyOCwzNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TWU5DX0FMQVJNID0gImFuZHJvaWQuY29udGVudC5zeW5jbWFuYWdlci5TWU5DX0FMQVJNIjsKICAgICBwcml2YXRlIGZpbmFsIFN5bmNIYW5kbGVyIG1TeW5jSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbU1haW5IYW5kbGVyOwogCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1Cb290Q29tcGxldGVkID0gZmFsc2U7CiAKKyAgICBzdGF0aWMgY2xhc3MgQWNjb3VudEFuZFVzZXIgeworICAgICAgICBBY2NvdW50IGFjY291bnQ7CisgICAgICAgIGludCB1c2VySWQ7CisKKyAgICAgICAgQWNjb3VudEFuZFVzZXIoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkKSB7CisgICAgICAgICAgICB0aGlzLmFjY291bnQgPSBhY2NvdW50OworICAgICAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEFjY291bnRBbmRVc2VyKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgZmluYWwgQWNjb3VudEFuZFVzZXIgb3RoZXIgPSAoQWNjb3VudEFuZFVzZXIpIG87CisgICAgICAgICAgICByZXR1cm4gdGhpcy5hY2NvdW50LmVxdWFscyhvdGhlci5hY2NvdW50KQorICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnVzZXJJZCA9PSBvdGhlci51c2VySWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBhY2NvdW50Lmhhc2hDb2RlKCkgKyB1c2VySWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGFjY291bnQudG9TdHJpbmcoKSArICIgdSIgKyB1c2VySWQ7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIgZ2V0Q29ubmVjdGl2aXR5TWFuYWdlcigpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAobUNvbm5NYW5hZ2VyRG9Ob3RVc2VEaXJlY3RseSA9PSBudWxsKSB7CkBAIC0yOTcsNiArMzc0LDEzIEBACiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgU3luY1N0b3JhZ2VFbmdpbmUuaW5pdChjb250ZXh0KTsKICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lID0gU3luY1N0b3JhZ2VFbmdpbmUuZ2V0U2luZ2xldG9uKCk7CisgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRPblN5bmNSZXF1ZXN0TGlzdGVuZXIobmV3IE9uU3luY1JlcXVlc3RMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JlcXVlc3QoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5LAorICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jKGFjY291bnQsIHVzZXJJZCwgYXV0aG9yaXR5LCBleHRyYXMsIDAsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKICAgICAgICAgbVN5bmNBZGFwdGVycyA9IG5ldyBTeW5jQWRhcHRlcnNDYWNoZShtQ29udGV4dCk7CiAgICAgICAgIG1TeW5jUXVldWUgPSBuZXcgU3luY1F1ZXVlKG1TeW5jU3RvcmFnZUVuZ2luZSwgbVN5bmNBZGFwdGVycyk7CiAKQEAgLTMwNCwxMiArMzg4LDExIEBACiAgICAgICAgICAgICAgICAgUHJvY2Vzcy5USFJFQURfUFJJT1JJVFlfQkFDS0dST1VORCk7CiAgICAgICAgIHN5bmNUaHJlYWQuc3RhcnQoKTsKICAgICAgICAgbVN5bmNIYW5kbGVyID0gbmV3IFN5bmNIYW5kbGVyKHN5bmNUaHJlYWQuZ2V0TG9vcGVyKCkpOwotICAgICAgICBtTWFpbkhhbmRsZXIgPSBuZXcgSGFuZGxlcihtQ29udGV4dC5nZXRNYWluTG9vcGVyKCkpOwogCiAgICAgICAgIG1TeW5jQWRhcHRlcnMuc2V0TGlzdGVuZXIobmV3IFJlZ2lzdGVyZWRTZXJ2aWNlc0NhY2hlTGlzdGVuZXI8U3luY0FkYXB0ZXJUeXBlPigpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNoYW5nZWQoU3luY0FkYXB0ZXJUeXBlIHR5cGUsIGJvb2xlYW4gcmVtb3ZlZCkgewogICAgICAgICAgICAgICAgIGlmICghcmVtb3ZlZCkgewotICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmMobnVsbCwgdHlwZS5hdXRob3JpdHksIG51bGwsIDAgLyogbm8gZGVsYXkgKi8sCisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luYyhudWxsLCBVc2VySWQuVVNFUl9BTEwsIHR5cGUuYXV0aG9yaXR5LCBudWxsLCAwIC8qIG5vIGRlbGF5ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIG9ubHlUaG9zZVdpdGhVbmtvd25TeW5jYWJsZVN0YXRlICovKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0zNzYsNyArNDU5LDcgQEAKICAgICAgICAgICAgIEFjY291bnRNYW5hZ2VyLmdldChtQ29udGV4dCkuYWRkT25BY2NvdW50c1VwZGF0ZWRMaXN0ZW5lcihTeW5jTWFuYWdlci50aGlzLAogICAgICAgICAgICAgICAgIG1TeW5jSGFuZGxlciwgZmFsc2UgLyogdXBkYXRlSW1tZWRpYXRlbHkgKi8pOwogICAgICAgICAgICAgLy8gZG8gdGhpcyBzeW5jaHJvbm91c2x5IHRvIGVuc3VyZSB3ZSBoYXZlIHRoZSBhY2NvdW50cyBiZWZvcmUgdGhpcyBjYWxsIHJldHVybnMKLSAgICAgICAgICAgIG9uQWNjb3VudHNVcGRhdGVkKEFjY291bnRNYW5hZ2VyLmdldChtQ29udGV4dCkuZ2V0QWNjb3VudHMoKSk7CisgICAgICAgICAgICBvbkFjY291bnRzVXBkYXRlZChudWxsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDA0LDgyICs0ODcsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTeW5jQWRhcHRlcihBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKLSAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICBMb2cudihUQUcsICJpbml0aWFsaXplU3luY0FkYXB0ZXI6ICIgKyBhY2NvdW50ICsgIiwgYXV0aG9yaXR5ICIgKyBhdXRob3JpdHkpOwotICAgICAgICB9Ci0gICAgICAgIFN5bmNBZGFwdGVyVHlwZSBzeW5jQWRhcHRlclR5cGUgPSBTeW5jQWRhcHRlclR5cGUubmV3S2V5KGF1dGhvcml0eSwgYWNjb3VudC50eXBlKTsKLSAgICAgICAgUmVnaXN0ZXJlZFNlcnZpY2VzQ2FjaGUuU2VydmljZUluZm88U3luY0FkYXB0ZXJUeXBlPiBzeW5jQWRhcHRlckluZm8gPQotICAgICAgICAgICAgICAgIG1TeW5jQWRhcHRlcnMuZ2V0U2VydmljZUluZm8oc3luY0FkYXB0ZXJUeXBlKTsKLSAgICAgICAgaWYgKHN5bmNBZGFwdGVySW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJjYW4ndCBmaW5kIGEgc3luYyBhZGFwdGVyIGZvciAiICsgc3luY0FkYXB0ZXJUeXBlICsgIiwgcmVtb3ZpbmciKTsKLSAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5yZW1vdmVBdXRob3JpdHkoYWNjb3VudCwgYXV0aG9yaXR5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgIGludGVudC5zZXRBY3Rpb24oImFuZHJvaWQuY29udGVudC5TeW5jQWRhcHRlciIpOwotICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KHN5bmNBZGFwdGVySW5mby5jb21wb25lbnROYW1lKTsKLSAgICAgICAgaWYgKCFtQ29udGV4dC5iaW5kU2VydmljZShpbnRlbnQsCi0gICAgICAgICAgICAgICAgbmV3IEluaXRpYWxpemVyU2VydmljZUNvbm5lY3Rpb24oYWNjb3VudCwgYXV0aG9yaXR5LCBtQ29udGV4dCwgbU1haW5IYW5kbGVyKSwKLSAgICAgICAgICAgICAgICBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUgfCBDb250ZXh0LkJJTkRfTk9UX0ZPUkVHUk9VTkQKLSAgICAgICAgICAgICAgICB8IENvbnRleHQuQklORF9BTExPV19PT01fTUFOQUdFTUVOVCkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImluaXRpYWxpemVTeW5jQWRhcHRlcjogZmFpbGVkIHRvIGJpbmQgdG8gIiArIGludGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbml0aWFsaXplclNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24gewotICAgICAgICBwcml2YXRlIGZpbmFsIEFjY291bnQgbUFjY291bnQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1BdXRob3JpdHk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKLSAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBDb250ZXh0IG1Db250ZXh0OwotICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbUluaXRpYWxpemVkOwotCi0gICAgICAgIHB1YmxpYyBJbml0aWFsaXplclNlcnZpY2VDb25uZWN0aW9uKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSwgQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICAgICAgbUFjY291bnQgPSBhY2NvdW50OwotICAgICAgICAgICAgbUF1dGhvcml0eSA9IGF1dGhvcml0eTsKLSAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgICAgIG1IYW5kbGVyID0gaGFuZGxlcjsKLSAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiY2FsbGluZyBpbml0aWFsaXplOiAiICsgbUFjY291bnQgKyAiLCBhdXRob3JpdHkgIiArIG1BdXRob3JpdHkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIElTeW5jQWRhcHRlci5TdHViLmFzSW50ZXJmYWNlKHNlcnZpY2UpLmluaXRpYWxpemUobUFjY291bnQsIG1BdXRob3JpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG9lc24ndCBtYXR0ZXIsIHdlIHdpbGwgcmV0cnkgYWdhaW4gbGF0ZXIKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJlcnJvciB3aGlsZSBpbml0aWFsaXppbmc6ICIgKyBtQWNjb3VudCArICIsIGF1dGhvcml0eSAiICsgbUF1dGhvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvLyBnaXZlIHRoZSBzeW5jIGFkYXB0ZXIgdGltZSB0byBpbml0aWFsaXplIGJlZm9yZSB1bmJpbmRpbmcgZnJvbSBpdAotICAgICAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSB0aGlzIEFQSSB0byBub3QgcmVseSBvbiB0aGlzIHRpbWluZywgaHR0cDovL2IvMjUwMDgwNQotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKEluaXRpYWxpemVyU2VydmljZUNvbm5lY3Rpb24udGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSwgSU5JVElBTElaQVRJT05fVU5CSU5EX0RFTEFZX01TKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIGlmIChtQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRleHQudW5iaW5kU2VydmljZShJbml0aWFsaXplclNlcnZpY2VDb25uZWN0aW9uLnRoaXMpOwotICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCiAgICAgLyoqCiAgICAgICogSW5pdGlhdGUgYSBzeW5jLiBUaGlzIGNhbiBzdGFydCBhIHN5bmMgZm9yIGFsbCBwcm92aWRlcnMKICAgICAgKiAocGFzcyBudWxsIHRvIHVybCwgc2V0IG9ubHlUaWNrbGFibGUgdG8gZmFsc2UpLCBvbmx5IHRob3NlCkBAIC01MDAsNiArNTA3LDggQEAKICAgICAgKiA8cD5Zb3UnbGwgc3RhcnQgZ2V0dGluZyBjYWxsYmFja3MgYWZ0ZXIgdGhpcy4KICAgICAgKgogICAgICAqIEBwYXJhbSByZXF1ZXN0ZWRBY2NvdW50IHRoZSBhY2NvdW50IHRvIHN5bmMsIG1heSBiZSBudWxsIHRvIHNpZ25pZnkgYWxsIGFjY291bnRzCisgICAgICogQHBhcmFtIHVzZXJJZCB0aGUgaWQgb2YgdGhlIHVzZXIgd2hvc2UgYWNjb3VudHMgYXJlIHRvIGJlIHN5bmNlZC4gSWYgdXNlcklkIGlzIFVTRVJfQUxMLAorICAgICAqICAgICAgICAgIHRoZW4gYWxsIHVzZXJzJyBhY2NvdW50cyBhcmUgY29uc2lkZXJlZC4KICAgICAgKiBAcGFyYW0gcmVxdWVzdGVkQXV0aG9yaXR5IHRoZSBhdXRob3JpdHkgdG8gc3luYywgbWF5IGJlIG51bGwgdG8gaW5kaWNhdGUgYWxsIGF1dGhvcml0aWVzCiAgICAgICogQHBhcmFtIGV4dHJhcyBhIE1hcCBvZiBTeW5jQWRhcHRlci1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBjb250cm9sCiAgICAgICogICAgICAgICAgc3luY3Mgb2YgYSBzcGVjaWZpYyBwcm92aWRlci4gQ2FuIGJlIG51bGwuIElzIGlnbm9yZWQKQEAgLTUwNyw3ICs1MTYsNyBAQAogICAgICAqIEBwYXJhbSBkZWxheSBob3cgbWFueSBtaWxsaXNlY29uZHMgaW4gdGhlIGZ1dHVyZSB0byB3YWl0IGJlZm9yZSBwZXJmb3JtaW5nIHRoaXMKICAgICAgKiBAcGFyYW0gb25seVRob3NlV2l0aFVua293blN5bmNhYmxlU3RhdGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZVN5bmMoQWNjb3VudCByZXF1ZXN0ZWRBY2NvdW50LCBTdHJpbmcgcmVxdWVzdGVkQXV0aG9yaXR5LAorICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlU3luYyhBY2NvdW50IHJlcXVlc3RlZEFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyByZXF1ZXN0ZWRBdXRob3JpdHksCiAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzLCBsb25nIGRlbGF5LCBib29sZWFuIG9ubHlUaG9zZVdpdGhVbmtvd25TeW5jYWJsZVN0YXRlKSB7CiAgICAgICAgIGJvb2xlYW4gaXNMb2dnYWJsZSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwogCkBAIC01MjEsOSArNTMwLDkgQEAKICAgICAgICAgICAgIGRlbGF5ID0gLTE7IC8vIHRoaXMgbWVhbnMgc2NoZWR1bGUgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZQogICAgICAgICB9CiAKLSAgICAgICAgQWNjb3VudFtdIGFjY291bnRzOwotICAgICAgICBpZiAocmVxdWVzdGVkQWNjb3VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhY2NvdW50cyA9IG5ldyBBY2NvdW50W117cmVxdWVzdGVkQWNjb3VudH07CisgICAgICAgIEFjY291bnRBbmRVc2VyW10gYWNjb3VudHM7CisgICAgICAgIGlmIChyZXF1ZXN0ZWRBY2NvdW50ICE9IG51bGwgJiYgdXNlcklkICE9IFVzZXJJZC5VU0VSX0FMTCkgeworICAgICAgICAgICAgYWNjb3VudHMgPSBuZXcgQWNjb3VudEFuZFVzZXJbXSB7IG5ldyBBY2NvdW50QW5kVXNlcihyZXF1ZXN0ZWRBY2NvdW50LCB1c2VySWQpIH07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBpZiB0aGUgYWNjb3VudHMgYXJlbid0IGNvbmZpZ3VyZWQgeWV0IHRoZW4gd2UgY2FuJ3Qgc3VwcG9ydCBhbiBhY2NvdW50LWxlc3MKICAgICAgICAgICAgIC8vIHN5bmMgcmVxdWVzdApAQCAtNTc0LDI0ICs1ODMsMjMgQEAKICAgICAgICAgICAgIGlmIChoYXNTeW5jQWRhcHRlcikgc3luY2FibGVBdXRob3JpdGllcy5hZGQocmVxdWVzdGVkQXV0aG9yaXR5KTsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gbWFzdGVyU3luY0F1dG9tYXRpY2FsbHkgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoKTsKLQogICAgICAgICBmb3IgKFN0cmluZyBhdXRob3JpdHkgOiBzeW5jYWJsZUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICBmb3IgKEFjY291bnQgYWNjb3VudCA6IGFjY291bnRzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGlzU3luY2FibGUgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0SXNTeW5jYWJsZShhY2NvdW50LCBhdXRob3JpdHkpOworICAgICAgICAgICAgZm9yIChBY2NvdW50QW5kVXNlciBhY2NvdW50IDogYWNjb3VudHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaXNTeW5jYWJsZSA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRJc1N5bmNhYmxlKGFjY291bnQuYWNjb3VudCwgYWNjb3VudC51c2VySWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdHkpOwogICAgICAgICAgICAgICAgIGlmIChpc1N5bmNhYmxlID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZpbmFsIFJlZ2lzdGVyZWRTZXJ2aWNlc0NhY2hlLlNlcnZpY2VJbmZvPFN5bmNBZGFwdGVyVHlwZT4gc3luY0FkYXB0ZXJJbmZvID0KICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jQWRhcHRlcnMuZ2V0U2VydmljZUluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNBZGFwdGVyVHlwZS5uZXdLZXkoYXV0aG9yaXR5LCBhY2NvdW50LnR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY0FkYXB0ZXJUeXBlLm5ld0tleShhdXRob3JpdHksIGFjY291bnQuYWNjb3VudC50eXBlKSk7CiAgICAgICAgICAgICAgICAgaWYgKHN5bmNBZGFwdGVySW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFsbG93UGFyYWxsZWxTeW5jcyA9IHN5bmNBZGFwdGVySW5mby50eXBlLmFsbG93UGFyYWxsZWxTeW5jcygpOwogICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNBbHdheXNTeW5jYWJsZSA9IHN5bmNBZGFwdGVySW5mby50eXBlLmlzQWx3YXlzU3luY2FibGUoKTsKICAgICAgICAgICAgICAgICBpZiAoaXNTeW5jYWJsZSA8IDAgJiYgaXNBbHdheXNTeW5jYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0SXNTeW5jYWJsZShhY2NvdW50LCBhdXRob3JpdHksIDEpOworICAgICAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0SXNTeW5jYWJsZShhY2NvdW50LmFjY291bnQsIGFjY291bnQudXNlcklkLCBhdXRob3JpdHksIDEpOwogICAgICAgICAgICAgICAgICAgICBpc1N5bmNhYmxlID0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG9ubHlUaG9zZVdpdGhVbmtvd25TeW5jYWJsZVN0YXRlICYmIGlzU3luY2FibGUgPj0gMCkgewpAQCAtNjA1LDggKzYxMywxMCBAQAogICAgICAgICAgICAgICAgIGJvb2xlYW4gc3luY0FsbG93ZWQgPQogICAgICAgICAgICAgICAgICAgICAgICAgKGlzU3luY2FibGUgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgaWdub3JlU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChiYWNrZ3JvdW5kRGF0YVVzYWdlQWxsb3dlZCAmJiBtYXN0ZXJTeW5jQXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50LCBhdXRob3JpdHkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChiYWNrZ3JvdW5kRGF0YVVzYWdlQWxsb3dlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudC51c2VySWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50LmFjY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudC51c2VySWQsIGF1dGhvcml0eSkpOwogICAgICAgICAgICAgICAgIGlmICghc3luY0FsbG93ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNjaGVkdWxlU3luYzogc3luYyBvZiAiICsgYWNjb3VudCArICIsICIgKyBhdXRob3JpdHkKQEAgLTYxNSw4ICs2MjUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgUGFpcjxMb25nLCBMb25nPiBiYWNrb2ZmID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldEJhY2tvZmYoYWNjb3VudCwgYXV0aG9yaXR5KTsKLSAgICAgICAgICAgICAgICBsb25nIGRlbGF5VW50aWwgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0RGVsYXlVbnRpbFRpbWUoYWNjb3VudCwgYXV0aG9yaXR5KTsKKyAgICAgICAgICAgICAgICBQYWlyPExvbmcsIExvbmc+IGJhY2tvZmYgPSBtU3luY1N0b3JhZ2VFbmdpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCYWNrb2ZmKGFjY291bnQuYWNjb3VudCwgYWNjb3VudC51c2VySWQsIGF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgbG9uZyBkZWxheVVudGlsID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldERlbGF5VW50aWxUaW1lKGFjY291bnQuYWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQudXNlcklkLCBhdXRob3JpdHkpOwogICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgYmFja29mZlRpbWUgPSBiYWNrb2ZmICE9IG51bGwgPyBiYWNrb2ZmLmZpcnN0IDogMDsKICAgICAgICAgICAgICAgICBpZiAoaXNTeW5jYWJsZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIG5ld0V4dHJhcyA9IG5ldyBCdW5kbGUoKTsKQEAgLTYzMCw5ICs2NDIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGV4dHJhcyAiICsgbmV3RXh0cmFzKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudCwgc291cmNlLCBhdXRob3JpdHksIG5ld0V4dHJhcywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tvZmZUaW1lLCBkZWxheVVudGlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dQYXJhbGxlbFN5bmNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudC5hY2NvdW50LCBhY2NvdW50LnVzZXJJZCwgc291cmNlLCBhdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFeHRyYXMsIDAsIGJhY2tvZmZUaW1lLCBkZWxheVVudGlsLCBhbGxvd1BhcmFsbGVsU3luY3MpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCFvbmx5VGhvc2VXaXRoVW5rb3duU3luY2FibGVTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgewpAQCAtNjQ0LDE4ICs2NTUsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBleHRyYXMgIiArIGV4dHJhcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQsIHNvdXJjZSwgYXV0aG9yaXR5LCBleHRyYXMsIGRlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja29mZlRpbWUsIGRlbGF5VW50aWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1BhcmFsbGVsU3luY3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3luY09wZXJhdGlvbihhY2NvdW50LmFjY291bnQsIGFjY291bnQudXNlcklkLCBzb3VyY2UsIGF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcywgZGVsYXksIGJhY2tvZmZUaW1lLCBkZWxheVVudGlsLCBhbGxvd1BhcmFsbGVsU3luY3MpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZUxvY2FsU3luYyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZUxvY2FsU3luYyhBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBhdXRob3JpdHkpIHsKICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgZXh0cmFzLnB1dEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX1VQTE9BRCwgdHJ1ZSk7Ci0gICAgICAgIHNjaGVkdWxlU3luYyhhY2NvdW50LCBhdXRob3JpdHksIGV4dHJhcywgTE9DQUxfU1lOQ19ERUxBWSwKKyAgICAgICAgc2NoZWR1bGVTeW5jKGFjY291bnQsIHVzZXJJZCwgYXV0aG9yaXR5LCBleHRyYXMsIExPQ0FMX1NZTkNfREVMQVksCiAgICAgICAgICAgICAgICAgZmFsc2UgLyogb25seVRob3NlV2l0aFVua293blN5bmNhYmxlU3RhdGUgKi8pOwogICAgIH0KIApAQCAtNjkxLDExICs3MDEsMTMgQEAKICAgICAgICAgbVN5bmNIYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRDYW5jZWxTeW5jc01lc3NhZ2UoZmluYWwgQWNjb3VudCBhY2NvdW50LCBmaW5hbCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgcHJpdmF0ZSB2b2lkIHNlbmRDYW5jZWxTeW5jc01lc3NhZ2UoZmluYWwgQWNjb3VudCBhY2NvdW50LCBmaW5hbCBpbnQgdXNlcklkLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhvcml0eSkgewogICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIExvZy52KFRBRywgInNlbmRpbmcgTUVTU0FHRV9DQU5DRUwiKTsKICAgICAgICAgTWVzc2FnZSBtc2cgPSBtU3luY0hhbmRsZXIub2J0YWluTWVzc2FnZSgpOwogICAgICAgICBtc2cud2hhdCA9IFN5bmNIYW5kbGVyLk1FU1NBR0VfQ0FOQ0VMOwogICAgICAgICBtc2cub2JqID0gUGFpci5jcmVhdGUoYWNjb3VudCwgYXV0aG9yaXR5KTsKKyAgICAgICAgbXNnLmFyZzEgPSB1c2VySWQ7CiAgICAgICAgIG1TeW5jSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwogICAgIH0KIApAQCAtNzE3LDEwICs3MjksMTAgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2xlYXJCYWNrb2ZmU2V0dGluZyhTeW5jT3BlcmF0aW9uIG9wKSB7Ci0gICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRCYWNrb2ZmKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSwKKyAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldEJhY2tvZmYob3AuYWNjb3VudCwgb3AudXNlcklkLCBvcC5hdXRob3JpdHksCiAgICAgICAgICAgICAgICAgU3luY1N0b3JhZ2VFbmdpbmUuTk9UX0lOX0JBQ0tPRkZfTU9ERSwgU3luY1N0b3JhZ2VFbmdpbmUuTk9UX0lOX0JBQ0tPRkZfTU9ERSk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNRdWV1ZSkgewotICAgICAgICAgICAgbVN5bmNRdWV1ZS5vbkJhY2tvZmZDaGFuZ2VkKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSwgMCk7CisgICAgICAgICAgICBtU3luY1F1ZXVlLm9uQmFja29mZkNoYW5nZWQob3AuYWNjb3VudCwgb3AudXNlcklkLCBvcC5hdXRob3JpdHksIDApOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MjgsNyArNzQwLDcgQEAKICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKIAogICAgICAgICBmaW5hbCBQYWlyPExvbmcsIExvbmc+IHByZXZpb3VzU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRCYWNrb2ZmKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLmdldEJhY2tvZmYob3AuYWNjb3VudCwgb3AudXNlcklkLCBvcC5hdXRob3JpdHkpOwogICAgICAgICBsb25nIG5ld0RlbGF5SW5NcyA9IC0xOwogICAgICAgICBpZiAocHJldmlvdXNTZXR0aW5ncyAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBkb24ndCBpbmNyZWFzZSBiYWNrb2ZmIGJlZm9yZSBjdXJyZW50IGJhY2tvZmYgaXMgZXhwaXJlZC4gVGhpcyB3aWxsIGhhcHBlbiBmb3Igb3AncwpAQCAtNzU5LDE0ICs3NzEsMTQgQEAKIAogICAgICAgICBmaW5hbCBsb25nIGJhY2tvZmYgPSBub3cgKyBuZXdEZWxheUluTXM7CiAKLSAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldEJhY2tvZmYob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5LAorICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0QmFja29mZihvcC5hY2NvdW50LCBvcC51c2VySWQsIG9wLmF1dGhvcml0eSwKICAgICAgICAgICAgICAgICBiYWNrb2ZmLCBuZXdEZWxheUluTXMpOwogCiAgICAgICAgIG9wLmJhY2tvZmYgPSBiYWNrb2ZmOwogICAgICAgICBvcC51cGRhdGVFZmZlY3RpdmVSdW5UaW1lKCk7CiAKICAgICAgICAgc3luY2hyb25pemVkIChtU3luY1F1ZXVlKSB7Ci0gICAgICAgICAgICBtU3luY1F1ZXVlLm9uQmFja29mZkNoYW5nZWQob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5LCBiYWNrb2ZmKTsKKyAgICAgICAgICAgIG1TeW5jUXVldWUub25CYWNrb2ZmQ2hhbmdlZChvcC5hY2NvdW50LCBvcC51c2VySWQsIG9wLmF1dGhvcml0eSwgYmFja29mZik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc3OSw3ICs3OTEsOCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbmV3RGVsYXlVbnRpbFRpbWUgPSAwOwogICAgICAgICB9Ci0gICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXREZWxheVVudGlsVGltZShvcC5hY2NvdW50LCBvcC5hdXRob3JpdHksIG5ld0RlbGF5VW50aWxUaW1lKTsKKyAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lCisgICAgICAgICAgICAgICAgLnNldERlbGF5VW50aWxUaW1lKG9wLmFjY291bnQsIG9wLnVzZXJJZCwgb3AuYXV0aG9yaXR5LCBuZXdEZWxheVVudGlsVGltZSk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNRdWV1ZSkgewogICAgICAgICAgICAgbVN5bmNRdWV1ZS5vbkRlbGF5VW50aWxUaW1lQ2hhbmdlZChvcC5hY2NvdW50LCBvcC5hdXRob3JpdHksIG5ld0RlbGF5VW50aWxUaW1lKTsKICAgICAgICAgfQpAQCAtNzkwLDggKzgwMyw4IEBACiAgICAgICogQHBhcmFtIGFjY291bnQgbGltaXQgdGhlIGNhbmNlbGF0aW9ucyB0byBzeW5jcyB3aXRoIHRoaXMgYWNjb3VudCwgaWYgbm9uLW51bGwKICAgICAgKiBAcGFyYW0gYXV0aG9yaXR5IGxpbWl0IHRoZSBjYW5jZWxhdGlvbnMgdG8gc3luY3Mgd2l0aCB0aGlzIGF1dGhvcml0eSwgaWYgbm9uLW51bGwKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxBY3RpdmVTeW5jKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgewotICAgICAgICBzZW5kQ2FuY2VsU3luY3NNZXNzYWdlKGFjY291bnQsIGF1dGhvcml0eSk7CisgICAgcHVibGljIHZvaWQgY2FuY2VsQWN0aXZlU3luYyhBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICAgICAgc2VuZENhbmNlbFN5bmNzTWVzc2FnZShhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04MjMsMTEgKzgzNiwxMSBAQAogICAgICAqIEBwYXJhbSBhY2NvdW50IGxpbWl0IHRoZSByZW1vdmFscyB0byBvcGVyYXRpb25zIHdpdGggdGhpcyBhY2NvdW50LCBpZiBub24tbnVsbAogICAgICAqIEBwYXJhbSBhdXRob3JpdHkgbGltaXQgdGhlIHJlbW92YWxzIHRvIG9wZXJhdGlvbnMgd2l0aCB0aGlzIGF1dGhvcml0eSwgaWYgbm9uLW51bGwKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhclNjaGVkdWxlZFN5bmNPcGVyYXRpb25zKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgeworICAgIHB1YmxpYyB2b2lkIGNsZWFyU2NoZWR1bGVkU3luY09wZXJhdGlvbnMoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNRdWV1ZSkgewotICAgICAgICAgICAgbVN5bmNRdWV1ZS5yZW1vdmUoYWNjb3VudCwgYXV0aG9yaXR5KTsKKyAgICAgICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKGFjY291bnQsIHVzZXJJZCwgYXV0aG9yaXR5KTsKICAgICAgICAgfQotICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0QmFja29mZihhY2NvdW50LCBhdXRob3JpdHksCisgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRCYWNrb2ZmKGFjY291bnQsIHVzZXJJZCwgYXV0aG9yaXR5LAogICAgICAgICAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lLk5PVF9JTl9CQUNLT0ZGX01PREUsIFN5bmNTdG9yYWdlRW5naW5lLk5PVF9JTl9CQUNLT0ZGX01PREUpOwogICAgIH0KIApAQCAtODc1LDcgKzg4OCw4IEBACiAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmV0cnlpbmcgc3luYyBvcGVyYXRpb24gdGhhdCBmYWlsZWQgYmVjYXVzZSB0aGVyZSB3YXMgYWxyZWFkeSBhICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgInN5bmMgaW4gcHJvZ3Jlc3M6ICIgKyBvcGVyYXRpb24pOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKG5ldyBTeW5jT3BlcmF0aW9uKG9wZXJhdGlvbi5hY2NvdW50LCBvcGVyYXRpb24uc3luY1NvdXJjZSwKKyAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbihuZXcgU3luY09wZXJhdGlvbihvcGVyYXRpb24uYWNjb3VudCwgb3BlcmF0aW9uLnVzZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLnN5bmNTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hdXRob3JpdHksIG9wZXJhdGlvbi5leHRyYXMsCiAgICAgICAgICAgICAgICAgICAgIERFTEFZX1JFVFJZX1NZTkNfSU5fUFJPR1JFU1NfSU5fU0VDT05EUyAqIDEwMDAsCiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5iYWNrb2ZmLCBvcGVyYXRpb24uZGVsYXlVbnRpbCwgb3BlcmF0aW9uLmFsbG93UGFyYWxsZWxTeW5jcykpOwpAQCAtOTc5LDcgKzk5Myw4IEBACiAgICAgICAgICAgICBtQm91bmQgPSB0cnVlOwogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBiaW5kUmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCB0aGlzLAogICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUgfCBDb250ZXh0LkJJTkRfTk9UX0ZPUkVHUk9VTkQKLSAgICAgICAgICAgICAgICAgICAgfCBDb250ZXh0LkJJTkRfQUxMT1dfT09NX01BTkFHRU1FTlQpOworICAgICAgICAgICAgICAgICAgICB8IENvbnRleHQuQklORF9BTExPV19PT01fTUFOQUdFTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgbVN5bmNPcGVyYXRpb24udXNlcklkKTsKICAgICAgICAgICAgIGlmICghYmluZFJlc3VsdCkgewogICAgICAgICAgICAgICAgIG1Cb3VuZCA9IGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtMTAzNCwxMCArMTA0OSwxOSBAQAogCiAgICAgcHJvdGVjdGVkIHZvaWQgZHVtcFN5bmNTdGF0ZShQcmludFdyaXRlciBwdykgewogICAgICAgICBwdy5wcmludCgiZGF0YSBjb25uZWN0ZWQ6ICIpOyBwdy5wcmludGxuKG1EYXRhQ29ubmVjdGlvbklzQ29ubmVjdGVkKTsKLSAgICAgICAgcHcucHJpbnQoImF1dG8gc3luYzogIik7IHB3LnByaW50bG4obVN5bmNTdG9yYWdlRW5naW5lLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KCkpOworICAgICAgICBwdy5wcmludCgiYXV0byBzeW5jOiAiKTsKKyAgICAgICAgTGlzdDxVc2VySW5mbz4gdXNlcnMgPSBnZXRBbGxVc2VycygpOworICAgICAgICBpZiAodXNlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChVc2VySW5mbyB1c2VyIDogdXNlcnMpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgidSIgKyB1c2VyLmlkICsgIj0iCisgICAgICAgICAgICAgICAgICAgICAgICArIG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseSh1c2VyLmlkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdy5wcmludGxuKCk7CisgICAgICAgIH0KICAgICAgICAgcHcucHJpbnQoIm1lbW9yeSBsb3c6ICIpOyBwdy5wcmludGxuKG1TdG9yYWdlSXNMb3cpOwogCi0gICAgICAgIGZpbmFsIEFjY291bnRbXSBhY2NvdW50cyA9IG1BY2NvdW50czsKKyAgICAgICAgZmluYWwgQWNjb3VudEFuZFVzZXJbXSBhY2NvdW50cyA9IG1BY2NvdW50czsKKwogICAgICAgICBwdy5wcmludCgiYWNjb3VudHM6ICIpOwogICAgICAgICBpZiAoYWNjb3VudHMgIT0gSU5JVElBTF9BQ0NPVU5UU19BUlJBWSkgewogICAgICAgICAgICAgcHcucHJpbnRsbihhY2NvdW50cy5sZW5ndGgpOwpAQCAtMTA5MCwxOCArMTExNCwyMCBAQAogICAgICAgICAvLyBqb2luIHRoZSBpbnN0YWxsZWQgc3luYyBhZGFwdGVyIHdpdGggdGhlIGFjY291bnRzIGxpc3QgYW5kIGVtaXQgZm9yIGV2ZXJ5dGhpbmcKICAgICAgICAgcHcucHJpbnRsbigpOwogICAgICAgICBwdy5wcmludGxuKCJTeW5jIFN0YXR1cyIpOwotICAgICAgICBmb3IgKEFjY291bnQgYWNjb3VudCA6IGFjY291bnRzKSB7Ci0gICAgICAgICAgICBwdy5wcmludCgiICBBY2NvdW50ICIpOyBwdy5wcmludChhY2NvdW50Lm5hbWUpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiICIpOyBwdy5wcmludChhY2NvdW50LnR5cGUpOworICAgICAgICBmb3IgKEFjY291bnRBbmRVc2VyIGFjY291bnQgOiBhY2NvdW50cykgeworICAgICAgICAgICAgcHcucHJpbnQoIiAgQWNjb3VudCAiKTsgcHcucHJpbnQoYWNjb3VudC5hY2NvdW50Lm5hbWUpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIHUiKTsgcHcucHJpbnQoYWNjb3VudC51c2VySWQpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiICIpOyBwdy5wcmludChhY2NvdW50LmFjY291bnQudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIjoiKTsKICAgICAgICAgICAgIGZvciAoUmVnaXN0ZXJlZFNlcnZpY2VzQ2FjaGUuU2VydmljZUluZm88U3luY0FkYXB0ZXJUeXBlPiBzeW5jQWRhcHRlclR5cGUgOgogICAgICAgICAgICAgICAgICAgICBtU3luY0FkYXB0ZXJzLmdldEFsbFNlcnZpY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN5bmNBZGFwdGVyVHlwZS50eXBlLmFjY291bnRUeXBlLmVxdWFscyhhY2NvdW50LnR5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzeW5jQWRhcHRlclR5cGUudHlwZS5hY2NvdW50VHlwZS5lcXVhbHMoYWNjb3VudC5hY2NvdW50LnR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lLkF1dGhvcml0eUluZm8gc2V0dGluZ3MgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0T3JDcmVhdGVBdXRob3JpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCBzeW5jQWRhcHRlclR5cGUudHlwZS5hdXRob3JpdHkpOworICAgICAgICAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lLkF1dGhvcml0eUluZm8gc2V0dGluZ3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLmdldE9yQ3JlYXRlQXV0aG9yaXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LmFjY291bnQsIGFjY291bnQudXNlcklkLCBzeW5jQWRhcHRlclR5cGUudHlwZS5hdXRob3JpdHkpOwogICAgICAgICAgICAgICAgIFN5bmNTdGF0dXNJbmZvIHN0YXR1cyA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRPckNyZWF0ZVN5bmNTdGF0dXMoc2V0dGluZ3MpOwogICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgIik7IHB3LnByaW50KHNldHRpbmdzLmF1dGhvcml0eSk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiOiIpOwpAQCAtMTU1NCw3ICsxNTgwLDE2IEBACiAgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQ291bnREb3duTGF0Y2ggbVJlYWR5VG9SdW5MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKICAgICAgICAgcHVibGljIHZvaWQgb25Cb290Q29tcGxldGVkKCkgewogICAgICAgICAgICAgbUJvb3RDb21wbGV0ZWQgPSB0cnVlOwotICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLmRvRGF0YWJhc2VDbGVhbnVwKEFjY291bnRNYW5hZ2VyLmdldChtQ29udGV4dCkuZ2V0QWNjb3VudHMoKSk7CisgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgYm9vdGNvbXBsZXRlZCBldmVudCBmb3Igc3BlY2lmaWMgdXNlci4gTm93IGxldCdzIGp1c3QgaXRlcmF0ZSB0aHJvdWdoCisgICAgICAgICAgICAvLyBhbGwgdGhlIHVzZXJzLgorICAgICAgICAgICAgTGlzdDxVc2VySW5mbz4gdXNlcnMgPSBnZXRBbGxVc2VycygpOworICAgICAgICAgICAgaWYgKHVzZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFVzZXJJbmZvIHVzZXIgOiB1c2VycykgeworICAgICAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuZG9EYXRhYmFzZUNsZWFudXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmdldFNpbmdsZXRvbigpLmdldEFjY291bnRzKHVzZXIuaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtUmVhZHlUb1J1bkxhdGNoICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtUmVhZHlUb1J1bkxhdGNoLmNvdW50RG93bigpOwogICAgICAgICAgICAgfQpAQCAtMTYzNSw3ICsxNjcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJoYW5kbGVTeW5jSGFuZGxlck1lc3NhZ2U6IE1FU1NBR0VfU0VSVklDRV9DQU5DRUw6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGF5bG9hZC5maXJzdCArICIsICIgKyBwYXlsb2FkLnNlY29uZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxBY3RpdmVTeW5jTG9ja2VkKHBheWxvYWQuZmlyc3QsIHBheWxvYWQuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEFjdGl2ZVN5bmNMb2NrZWQocGF5bG9hZC5maXJzdCwgbXNnLmFyZzEsIHBheWxvYWQuc2Vjb25kKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQZW5kaW5nU3luY1RpbWUgPSBtYXliZVN0YXJ0TmV4dFN5bmNMb2NrZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNzQwLDIyICsxNzc1LDI4IEBACiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJhY2tncm91bmREYXRhVXNhZ2VBbGxvd2VkID0KICAgICAgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGl2aXR5TWFuYWdlcigpLmdldEJhY2tncm91bmREYXRhU2V0dGluZygpOwogICAgICAgICAgICAgbG9uZyBlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lID0gTG9uZy5NQVhfVkFMVUU7Ci0gICAgICAgICAgICBpZiAoIWJhY2tncm91bmREYXRhVXNhZ2VBbGxvd2VkIHx8ICFtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoKSkgeworICAgICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kRGF0YVVzYWdlQWxsb3dlZCkgewogICAgICAgICAgICAgICAgIHJldHVybiBlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBY2NvdW50QW5kVXNlcltdIGFjY291bnRzID0gbUFjY291bnRzOworCiAgICAgICAgICAgICBmaW5hbCBsb25nIG5vd0Fic29sdXRlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgICAgICBBcnJheUxpc3Q8U3luY1N0b3JhZ2VFbmdpbmUuQXV0aG9yaXR5SW5mbz4gaW5mb3MgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0QXV0aG9yaXRpZXMoKTsKICAgICAgICAgICAgIGZvciAoU3luY1N0b3JhZ2VFbmdpbmUuQXV0aG9yaXR5SW5mbyBpbmZvIDogaW5mb3MpIHsKICAgICAgICAgICAgICAgICAvLyBza2lwIHRoZSBzeW5jIGlmIHRoZSBhY2NvdW50IG9mIHRoaXMgb3BlcmF0aW9uIG5vIGxvbmdlciBleGlzdHMKLSAgICAgICAgICAgICAgICBpZiAoIUFycmF5VXRpbHMuY29udGFpbnMobUFjY291bnRzLCBpbmZvLmFjY291bnQpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc0FjY291bnRBbmRVc2VyKGFjY291bnRzLCBpbmZvLmFjY291bnQsIGluZm8udXNlcklkKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIW1TeW5jU3RvcmFnZUVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShpbmZvLmFjY291bnQsIGluZm8uYXV0aG9yaXR5KSkgeworICAgICAgICAgICAgICAgIGlmICghbVN5bmNTdG9yYWdlRW5naW5lLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KGluZm8udXNlcklkKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1TeW5jU3RvcmFnZUVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShpbmZvLmFjY291bnQsIGluZm8udXNlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmF1dGhvcml0eSkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRJc1N5bmNhYmxlKGluZm8uYWNjb3VudCwgaW5mby5hdXRob3JpdHkpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobVN5bmNTdG9yYWdlRW5naW5lLmdldElzU3luY2FibGUoaW5mby5hY2NvdW50LCBpbmZvLnVzZXJJZCwgaW5mby5hdXRob3JpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMTc3Miw4ICsxODEzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxhc3RQb2xsVGltZUFic29sdXRlICsgcGVyaW9kSW5TZWNvbmRzICogMTAwMDsKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVhZHkgdG8gcnVuIHRoZW4gc2NoZWR1bGUgaXQgYW5kIG1hcmsgaXQgYXMgaGF2aW5nIGJlZW4gc2NoZWR1bGVkCiAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0UG9sbFRpbWVBYnNvbHV0ZSA8PSBub3dBYnNvbHV0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFpcjxMb25nLCBMb25nPiBiYWNrb2ZmID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLmdldEJhY2tvZmYoaW5mby5hY2NvdW50LCBpbmZvLmF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYWlyPExvbmcsIExvbmc+IGJhY2tvZmYgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0QmFja29mZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5hY2NvdW50LCBpbmZvLnVzZXJJZCwgaW5mby5hdXRob3JpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVnaXN0ZXJlZFNlcnZpY2VzQ2FjaGUuU2VydmljZUluZm88U3luY0FkYXB0ZXJUeXBlPiBzeW5jQWRhcHRlckluZm8gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3luY0FkYXB0ZXJzLmdldFNlcnZpY2VJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNBZGFwdGVyVHlwZS5uZXdLZXkoaW5mby5hdXRob3JpdHksIGluZm8uYWNjb3VudC50eXBlKSk7CkBAIC0xNzgxLDExICsxODIyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTeW5jT3BlcmF0aW9uKGluZm8uYWNjb3VudCwgU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFX1BFUklPRElDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3luY09wZXJhdGlvbihpbmZvLmFjY291bnQsIGluZm8udXNlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9QRVJJT0RJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmF1dGhvcml0eSwgZXh0cmFzLCAwIC8qIGRlbGF5ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tvZmYgIT0gbnVsbCA/IGJhY2tvZmYuZmlyc3QgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5nZXREZWxheVVudGlsVGltZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYWNjb3VudCwgaW5mby5hdXRob3JpdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5hY2NvdW50LCBpbmZvLnVzZXJJZCwgaW5mby5hdXRob3JpdHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNBZGFwdGVySW5mby50eXBlLmFsbG93UGFyYWxsZWxTeW5jcygpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0UGVyaW9kaWNTeW5jVGltZShpLCBub3dBYnNvbHV0ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xODMwLDcgKzE4NzIsNyBAQAogCiAgICAgICAgICAgICAvLyBJZiB0aGUgYWNjb3VudHMgYXJlbid0IGtub3duIHlldCB0aGVuIHdlIGFyZW4ndCByZWFkeSB0byBydW4uIFdlIHdpbGwgYmUga2lja2VkCiAgICAgICAgICAgICAvLyB3aGVuIHRoZSBhY2NvdW50IGxvb2t1cCByZXF1ZXN0IGRvZXMgY29tcGxldGUuCi0gICAgICAgICAgICBBY2NvdW50W10gYWNjb3VudHMgPSBtQWNjb3VudHM7CisgICAgICAgICAgICBBY2NvdW50QW5kVXNlcltdIGFjY291bnRzID0gbUFjY291bnRzOwogICAgICAgICAgICAgaWYgKGFjY291bnRzID09IElOSVRJQUxfQUNDT1VOVFNfQVJSQVkpIHsKICAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJtYXliZVN0YXJ0TmV4dFN5bmM6IGFjY291bnRzIG5vdCBrbm93biwgc2tpcHBpbmciKTsKQEAgLTE4NDMsNyArMTg4NSw2IEBACiAgICAgICAgICAgICAvLyBzdGFydCBpdCwgb3RoZXJ3aXNlIGp1c3QgZ2V0IG91dC4KICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmFja2dyb3VuZERhdGFVc2FnZUFsbG93ZWQgPQogICAgICAgICAgICAgICAgICAgICBnZXRDb25uZWN0aXZpdHlNYW5hZ2VyKCkuZ2V0QmFja2dyb3VuZERhdGFTZXR0aW5nKCk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIG1hc3RlclN5bmNBdXRvbWF0aWNhbGx5ID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KCk7CiAKICAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CiAKQEAgLTE4NjMsMTQgKzE5MDQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBvcCA9IG9wZXJhdGlvbkl0ZXJhdG9yLm5leHQoKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHRoZSBzeW5jIGlmIHRoZSBhY2NvdW50IG9mIHRoaXMgb3BlcmF0aW9uIG5vIGxvbmdlciBleGlzdHMKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheVV0aWxzLmNvbnRhaW5zKG1BY2NvdW50cywgb3AuYWNjb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc0FjY291bnRBbmRVc2VyKGFjY291bnRzLCBvcC5hY2NvdW50LCBvcC51c2VySWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JdGVyYXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5kZWxldGVGcm9tUGVuZGluZyhvcC5wZW5kaW5nT3BlcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCB0aGlzIHN5bmMgcmVxdWVzdCBpZiBpdCBpc24ndCBzeW5jYWJsZQotICAgICAgICAgICAgICAgICAgICBpbnQgc3luY2FibGVTdGF0ZSA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRJc1N5bmNhYmxlKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgICAgIGludCBzeW5jYWJsZVN0YXRlID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldElzU3luY2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AuYWNjb3VudCwgb3AudXNlcklkLCBvcC5hdXRob3JpdHkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3luY2FibGVTdGF0ZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JdGVyYXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5kZWxldGVGcm9tUGVuZGluZyhvcC5wZW5kaW5nT3BlcmF0aW9uKTsKQEAgLTE5MDUsMTEgKzE5NDcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gZGlzY29ubmVjdGVkIGZvciB0aGUgdGFyZ2V0IFVJRC4KICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcC5leHRyYXMuZ2V0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfSUdOT1JFX1NFVFRJTkdTLCBmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3luY2FibGVTdGF0ZSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFtYXN0ZXJTeW5jQXV0b21hdGljYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghbVN5bmNTdG9yYWdlRW5naW5lLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KG9wLnVzZXJJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWJhY2tncm91bmREYXRhVXNhZ2VBbGxvd2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICF1aWROZXR3b3JrQ29ubmVjdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5hY2NvdW50LCBvcC5hdXRob3JpdHkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AuYWNjb3VudCwgb3AudXNlcklkLCBvcC5hdXRob3JpdHkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uSXRlcmF0b3IucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuZGVsZXRlRnJvbVBlbmRpbmcob3AucGVuZGluZ09wZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE5NDYsNiArMTk4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZU9wLmFjY291bnQudHlwZS5lcXVhbHMoY2FuZGlkYXRlLmFjY291bnQudHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3RpdmVPcC5hdXRob3JpdHkuZXF1YWxzKGNhbmRpZGF0ZS5hdXRob3JpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aXZlT3AudXNlcklkID09IGNhbmRpZGF0ZS51c2VySWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWFjdGl2ZU9wLmFsbG93UGFyYWxsZWxTeW5jcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBhY3RpdmVPcC5hY2NvdW50Lm5hbWUuZXF1YWxzKGNhbmRpZGF0ZS5hY2NvdW50Lm5hbWUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3QgPSBhY3RpdmVTeW5jQ29udGV4dDsKQEAgLTIwMzMsNyArMjA3Niw3IEBACiAgICAgICAgICAgICBpZiAoc3luY0FkYXB0ZXJJbmZvID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjYW4ndCBmaW5kIGEgc3luYyBhZGFwdGVyIGZvciAiICsgc3luY0FkYXB0ZXJUeXBlCiAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlbW92aW5nIHNldHRpbmdzIGZvciBpdCIpOwotICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5yZW1vdmVBdXRob3JpdHkob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5KTsKKyAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUucmVtb3ZlQXV0aG9yaXR5KG9wLmFjY291bnQsIG9wLnVzZXJJZCwgb3AuYXV0aG9yaXR5KTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKQEAgLTIwNzQsNyArMjExNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgY2FuY2VsQWN0aXZlU3luY0xvY2tlZChBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEFjdGl2ZVN5bmNMb2NrZWQoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5KSB7CiAgICAgICAgICAgICBBcnJheUxpc3Q8QWN0aXZlU3luY0NvbnRleHQ+IGFjdGl2ZVN5bmNzID0KICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxBY3RpdmVTeW5jQ29udGV4dD4obUFjdGl2ZVN5bmNDb250ZXh0cyk7CiAgICAgICAgICAgICBmb3IgKEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0IDogYWN0aXZlU3luY3MpIHsKQEAgLTIwODIsMTUgKzIxMjUsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYW4gYXV0aG9yaXR5IHdhcyBzcGVjaWZpZWQgdGhlbiBvbmx5IGNhbmNlbCB0aGUgc3luYyBpZiBpdCBtYXRjaGVzCiAgICAgICAgICAgICAgICAgICAgIGlmIChhY2NvdW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWNjb3VudC5lcXVhbHMoYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYWNjb3VudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYW4gYWNjb3VudCB3YXMgc3BlY2lmaWVkIHRoZW4gb25seSBjYW5jZWwgdGhlIHN5bmMgaWYgaXQgbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aG9yaXR5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXV0aG9yaXR5LmVxdWFscyhhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hdXRob3JpdHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSB1c2VyaWQgbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICBpZiAodXNlcklkICE9IFVzZXJJZC5VU0VSX0FMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVzZXJJZCAhPSBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi51c2VySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJ1blN5bmNGaW5pc2hlZE9yQ2FuY2VsZWRMb2NrZWQobnVsbCAvKiBubyByZXN1bHQgc2luY2UgdGhpcyBpcyBhIGNhbmNlbCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjE2OSw3ICsyMjE3LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHN5bmNSZXN1bHQgIT0gbnVsbCAmJiBzeW5jUmVzdWx0LmZ1bGxTeW5jUmVxdWVzdGVkKSB7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKG5ldyBTeW5jT3BlcmF0aW9uKHN5bmNPcGVyYXRpb24uYWNjb3VudCwKKyAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24obmV3IFN5bmNPcGVyYXRpb24oc3luY09wZXJhdGlvbi5hY2NvdW50LCBzeW5jT3BlcmF0aW9uLnVzZXJJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24uc3luY1NvdXJjZSwgc3luY09wZXJhdGlvbi5hdXRob3JpdHksIG5ldyBCdW5kbGUoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24uYmFja29mZiwgc3luY09wZXJhdGlvbi5kZWxheVVudGlsLAogICAgICAgICAgICAgICAgICAgICAgICAgc3luY09wZXJhdGlvbi5hbGxvd1BhcmFsbGVsU3luY3MpKTsKQEAgLTIxODAsNyArMjIyOCw4IEBACiAgICAgICAgIHByaXZhdGUgdm9pZCBjbG9zZUFjdGl2ZVN5bmNDb250ZXh0KEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0KSB7CiAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5jbG9zZSgpOwogICAgICAgICAgICAgbUFjdGl2ZVN5bmNDb250ZXh0cy5yZW1vdmUoYWN0aXZlU3luY0NvbnRleHQpOwotICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnJlbW92ZUFjdGl2ZVN5bmMoYWN0aXZlU3luY0NvbnRleHQubVN5bmNJbmZvKTsKKyAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5yZW1vdmVBY3RpdmVTeW5jKGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jSW5mbywKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24udXNlcklkKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjQ0Niw3ICsyNDk1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY09wZXJhdGlvbi5hY2NvdW50Lm5hbWUuaGFzaENvZGUoKSk7CiAKICAgICAgICAgICAgIHJldHVybiBtU3luY1N0b3JhZ2VFbmdpbmUuaW5zZXJ0U3RhcnRTeW5jRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24uYWNjb3VudCwgc3luY09wZXJhdGlvbi5hdXRob3JpdHksIG5vdywgc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY09wZXJhdGlvbi5hY2NvdW50LCBzeW5jT3BlcmF0aW9uLnVzZXJJZCwgc3luY09wZXJhdGlvbi5hdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgIG5vdywgc291cmNlKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHN0b3BTeW5jRXZlbnQobG9uZyByb3dJZCwgU3luY09wZXJhdGlvbiBzeW5jT3BlcmF0aW9uLCBTdHJpbmcgcmVzdWx0TWVzc2FnZSwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY09wZXJhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jT3BlcmF0aW9uLmphdmEKaW5kZXggOTRjMjI0Ny4uNGU4NmVmOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jT3BlcmF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jT3BlcmF0aW9uLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKICAqLwogcHVibGljIGNsYXNzIFN5bmNPcGVyYXRpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKICAgICBwdWJsaWMgZmluYWwgQWNjb3VudCBhY2NvdW50OworICAgIHB1YmxpYyBmaW5hbCBpbnQgdXNlcklkOwogICAgIHB1YmxpYyBpbnQgc3luY1NvdXJjZTsKICAgICBwdWJsaWMgU3RyaW5nIGF1dGhvcml0eTsKICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBhbGxvd1BhcmFsbGVsU3luY3M7CkBAIC0zOCw5ICszOSwxMCBAQAogICAgIHB1YmxpYyBsb25nIGRlbGF5VW50aWw7CiAgICAgcHVibGljIGxvbmcgZWZmZWN0aXZlUnVuVGltZTsKIAotICAgIHB1YmxpYyBTeW5jT3BlcmF0aW9uKEFjY291bnQgYWNjb3VudCwgaW50IHNvdXJjZSwgU3RyaW5nIGF1dGhvcml0eSwgQnVuZGxlIGV4dHJhcywKKyAgICBwdWJsaWMgU3luY09wZXJhdGlvbihBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIGludCBzb3VyY2UsIFN0cmluZyBhdXRob3JpdHksIEJ1bmRsZSBleHRyYXMsCiAgICAgICAgICAgICBsb25nIGRlbGF5SW5NcywgbG9uZyBiYWNrb2ZmLCBsb25nIGRlbGF5VW50aWwsIGJvb2xlYW4gYWxsb3dQYXJhbGxlbFN5bmNzKSB7CiAgICAgICAgIHRoaXMuYWNjb3VudCA9IGFjY291bnQ7CisgICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkOwogICAgICAgICB0aGlzLnN5bmNTb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gYXV0aG9yaXR5OwogICAgICAgICB0aGlzLmFsbG93UGFyYWxsZWxTeW5jcyA9IGFsbG93UGFyYWxsZWxTeW5jczsKQEAgLTc1LDYgKzc3LDcgQEAKIAogICAgIFN5bmNPcGVyYXRpb24oU3luY09wZXJhdGlvbiBvdGhlcikgewogICAgICAgICB0aGlzLmFjY291bnQgPSBvdGhlci5hY2NvdW50OworICAgICAgICB0aGlzLnVzZXJJZCA9IG90aGVyLnVzZXJJZDsKICAgICAgICAgdGhpcy5zeW5jU291cmNlID0gb3RoZXIuc3luY1NvdXJjZTsKICAgICAgICAgdGhpcy5hdXRob3JpdHkgPSBvdGhlci5hdXRob3JpdHk7CiAgICAgICAgIHRoaXMuZXh0cmFzID0gbmV3IEJ1bmRsZShvdGhlci5leHRyYXMpOwpAQCAtMTIwLDcgKzEyMyw4IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgdG9LZXkoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBzYi5hcHBlbmQoImF1dGhvcml0eTogIikuYXBwZW5kKGF1dGhvcml0eSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiIGFjY291bnQge25hbWU9IiArIGFjY291bnQubmFtZSArICIsIHR5cGU9IiArIGFjY291bnQudHlwZSArICJ9Iik7CisgICAgICAgIHNiLmFwcGVuZCgiIGFjY291bnQge25hbWU9IiArIGFjY291bnQubmFtZSArICIsIHVzZXI9IiArIHVzZXJJZCArICIsIHR5cGU9IiArIGFjY291bnQudHlwZQorICAgICAgICAgICAgICAgICsgIn0iKTsKICAgICAgICAgc2IuYXBwZW5kKCIgZXh0cmFzOiAiKTsKICAgICAgICAgZXh0cmFzVG9TdHJpbmdCdWlsZGVyKGV4dHJhcywgc2IpOwogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY1F1ZXVlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNRdWV1ZS5qYXZhCmluZGV4IGJmZGY0YTEuLjA2ZGE2ZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY1F1ZXVlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jUXVldWUuamF2YQpAQCAtNDksNyArNDksOCBAQAogICAgICAgICBmaW5hbCBpbnQgTiA9IG9wcy5zaXplKCk7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lLlBlbmRpbmdPcGVyYXRpb24gb3AgPSBvcHMuZ2V0KGkpOwotICAgICAgICAgICAgZmluYWwgUGFpcjxMb25nLCBMb25nPiBiYWNrb2ZmID0gc3luY1N0b3JhZ2VFbmdpbmUuZ2V0QmFja29mZihvcC5hY2NvdW50LCBvcC5hdXRob3JpdHkpOworICAgICAgICAgICAgZmluYWwgUGFpcjxMb25nLCBMb25nPiBiYWNrb2ZmID0KKyAgICAgICAgICAgICAgICAgICAgc3luY1N0b3JhZ2VFbmdpbmUuZ2V0QmFja29mZihvcC5hY2NvdW50LCBvcC51c2VySWQsIG9wLmF1dGhvcml0eSk7CiAgICAgICAgICAgICBmaW5hbCBSZWdpc3RlcmVkU2VydmljZXNDYWNoZS5TZXJ2aWNlSW5mbzxTeW5jQWRhcHRlclR5cGU+IHN5bmNBZGFwdGVySW5mbyA9CiAgICAgICAgICAgICAgICAgICAgIHN5bmNBZGFwdGVycy5nZXRTZXJ2aWNlSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jQWRhcHRlclR5cGUubmV3S2V5KG9wLmF1dGhvcml0eSwgb3AuYWNjb3VudC50eXBlKSk7CkBAIC01Nyw5ICs1OCw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBTeW5jT3BlcmF0aW9uIHN5bmNPcGVyYXRpb24gPSBuZXcgU3luY09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgb3AuYWNjb3VudCwgb3Auc3luY1NvdXJjZSwgb3AuYXV0aG9yaXR5LCBvcC5leHRyYXMsIDAgLyogZGVsYXkgKi8sCisgICAgICAgICAgICAgICAgICAgIG9wLmFjY291bnQsIG9wLnVzZXJJZCwgb3Auc3luY1NvdXJjZSwgb3AuYXV0aG9yaXR5LCBvcC5leHRyYXMsIDAgLyogZGVsYXkgKi8sCiAgICAgICAgICAgICAgICAgICAgIGJhY2tvZmYgIT0gbnVsbCA/IGJhY2tvZmYuZmlyc3QgOiAwLAotICAgICAgICAgICAgICAgICAgICBzeW5jU3RvcmFnZUVuZ2luZS5nZXREZWxheVVudGlsVGltZShvcC5hY2NvdW50LCBvcC5hdXRob3JpdHkpLAorICAgICAgICAgICAgICAgICAgICBzeW5jU3RvcmFnZUVuZ2luZS5nZXREZWxheVVudGlsVGltZShvcC5hY2NvdW50LCBvcC51c2VySWQsIG9wLmF1dGhvcml0eSksCiAgICAgICAgICAgICAgICAgICAgIHN5bmNBZGFwdGVySW5mby50eXBlLmFsbG93UGFyYWxsZWxTeW5jcygpKTsKICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24uZXhwZWRpdGVkID0gb3AuZXhwZWRpdGVkOwogICAgICAgICAgICAgc3luY09wZXJhdGlvbi5wZW5kaW5nT3BlcmF0aW9uID0gb3A7CkBAIC0xMDIsOCArMTAzLDggQEAKICAgICAgICAgb3BlcmF0aW9uLnBlbmRpbmdPcGVyYXRpb24gPSBwb3A7CiAgICAgICAgIGlmIChvcGVyYXRpb24ucGVuZGluZ09wZXJhdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICBwb3AgPSBuZXcgU3luY1N0b3JhZ2VFbmdpbmUuUGVuZGluZ09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uYWNjb3VudCwgb3BlcmF0aW9uLnN5bmNTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmF1dGhvcml0eSwgb3BlcmF0aW9uLmV4dHJhcywgb3BlcmF0aW9uLmV4cGVkaXRlZCk7CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hY2NvdW50LCBvcGVyYXRpb24udXNlcklkLCBvcGVyYXRpb24uc3luY1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmF1dGhvcml0eSwgb3BlcmF0aW9uLmV4dHJhcywgb3BlcmF0aW9uLmV4cGVkaXRlZCk7CiAgICAgICAgICAgICBwb3AgPSBtU3luY1N0b3JhZ2VFbmdpbmUuaW5zZXJ0SW50b1BlbmRpbmcocG9wKTsKICAgICAgICAgICAgIGlmIChwb3AgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImVycm9yIGFkZGluZyBwZW5kaW5nIHN5bmMgb3BlcmF0aW9uICIKQEAgLTEzMSwxMSArMTMyLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBvbkJhY2tvZmZDaGFuZ2VkKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwgbG9uZyBiYWNrb2ZmKSB7CisgICAgcHVibGljIHZvaWQgb25CYWNrb2ZmQ2hhbmdlZChBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBwcm92aWRlck5hbWUsIGxvbmcgYmFja29mZikgewogICAgICAgICAvLyBmb3IgZWFjaCBvcCB0aGF0IG1hdGNoZXMgdGhlIGFjY291bnQgYW5kIHByb3ZpZGVyIHVwZGF0ZSBpdHMKICAgICAgICAgLy8gYmFja29mZiBhbmQgZWZmZWN0aXZlU3RhcnRUaW1lCiAgICAgICAgIGZvciAoU3luY09wZXJhdGlvbiBvcCA6IG1PcGVyYXRpb25zTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAob3AuYWNjb3VudC5lcXVhbHMoYWNjb3VudCkgJiYgb3AuYXV0aG9yaXR5LmVxdWFscyhwcm92aWRlck5hbWUpKSB7CisgICAgICAgICAgICBpZiAob3AuYWNjb3VudC5lcXVhbHMoYWNjb3VudCkgJiYgb3AuYXV0aG9yaXR5LmVxdWFscyhwcm92aWRlck5hbWUpCisgICAgICAgICAgICAgICAgICAgICYmIG9wLnVzZXJJZCA9PSB1c2VySWQpIHsKICAgICAgICAgICAgICAgICBvcC5iYWNrb2ZmID0gYmFja29mZjsKICAgICAgICAgICAgICAgICBvcC51cGRhdGVFZmZlY3RpdmVSdW5UaW1lKCk7CiAgICAgICAgICAgICB9CkBAIC0xNTMsNyArMTU1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5KSB7CiAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN5bmNPcGVyYXRpb24+PiBlbnRyaWVzID0gbU9wZXJhdGlvbnNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwogICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIFN5bmNPcGVyYXRpb24+IGVudHJ5ID0gZW50cmllcy5uZXh0KCk7CkBAIC0xNjQsNiArMTY2LDkgQEAKICAgICAgICAgICAgIGlmIChhdXRob3JpdHkgIT0gbnVsbCAmJiAhc3luY09wZXJhdGlvbi5hdXRob3JpdHkuZXF1YWxzKGF1dGhvcml0eSkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1c2VySWQgIT0gc3luY09wZXJhdGlvbi51c2VySWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVudHJpZXMucmVtb3ZlKCk7CiAgICAgICAgICAgICBpZiAoIW1TeW5jU3RvcmFnZUVuZ2luZS5kZWxldGVGcm9tUGVuZGluZyhzeW5jT3BlcmF0aW9uLnBlbmRpbmdPcGVyYXRpb24pKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZSA9ICJ1bmFibGUgdG8gZmluZCBwZW5kaW5nIHJvdyBmb3IgIiArIHN5bmNPcGVyYXRpb247CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNTdG9yYWdlRW5naW5lLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNTdG9yYWdlRW5naW5lLmphdmEKaW5kZXggYTFlMTc0Yi4uN2JiOTg2NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY1N0b3JhZ2VFbmdpbmUuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXI7CiAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlN5bmNNYW5hZ2VyLkFjY291bnRBbmRVc2VyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKQEAgLTU4LDkgKzU5LDE2IEBACiAgKiBAaGlkZQogICovCiBwdWJsaWMgY2xhc3MgU3luY1N0b3JhZ2VFbmdpbmUgZXh0ZW5kcyBIYW5kbGVyIHsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3luY01hbmFnZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRklMRSA9IGZhbHNlOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRSX05FWFRfQVVUSE9SSVRZX0lEID0gIm5leHRBdXRob3JpdHlJZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRSX0xJU1RFTl9GT1JfVElDS0xFUyA9ICJsaXN0ZW4tZm9yLXRpY2tsZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUUl9FTkFCTEVEID0gImVuYWJsZWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUUl9VU0VSID0gInVzZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX0xJU1RFTl9GT1JfVElDS0xFUyA9ICJsaXN0ZW5Gb3JUaWNrbGVzIjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9QT0xMX0ZSRVFVRU5DWV9TRUNPTkRTID0gNjAgKiA2MCAqIDI0OyAvLyBPbmUgZGF5CiAKICAgICAvLyBAVmlzaWJsZUZvclRlc3RpbmcKQEAgLTEzMyw2ICsxNDEsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQZW5kaW5nT3BlcmF0aW9uIHsKICAgICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50OworICAgICAgICBmaW5hbCBpbnQgdXNlcklkOwogICAgICAgICBmaW5hbCBpbnQgc3luY1NvdXJjZTsKICAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhvcml0eTsKICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhczsgICAgICAgIC8vIG5vdGU6IHJlYWQtb25seS4KQEAgLTE0MSw5ICsxNTAsMTAgQEAKICAgICAgICAgaW50IGF1dGhvcml0eUlkOwogICAgICAgICBieXRlW10gZmxhdEV4dHJhczsKIAotICAgICAgICBQZW5kaW5nT3BlcmF0aW9uKEFjY291bnQgYWNjb3VudCwgaW50IHNvdXJjZSwKKyAgICAgICAgUGVuZGluZ09wZXJhdGlvbihBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIGludCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhvcml0eSwgQnVuZGxlIGV4dHJhcywgYm9vbGVhbiBleHBlZGl0ZWQpIHsKICAgICAgICAgICAgIHRoaXMuYWNjb3VudCA9IGFjY291bnQ7CisgICAgICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKICAgICAgICAgICAgIHRoaXMuc3luY1NvdXJjZSA9IHNvdXJjZTsKICAgICAgICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gYXV0aG9yaXR5OwogICAgICAgICAgICAgdGhpcy5leHRyYXMgPSBleHRyYXMgIT0gbnVsbCA/IG5ldyBCdW5kbGUoZXh0cmFzKSA6IGV4dHJhczsKQEAgLTE1Myw2ICsxNjMsNyBAQAogCiAgICAgICAgIFBlbmRpbmdPcGVyYXRpb24oUGVuZGluZ09wZXJhdGlvbiBvdGhlcikgewogICAgICAgICAgICAgdGhpcy5hY2NvdW50ID0gb3RoZXIuYWNjb3VudDsKKyAgICAgICAgICAgIHRoaXMudXNlcklkID0gb3RoZXIudXNlcklkOwogICAgICAgICAgICAgdGhpcy5zeW5jU291cmNlID0gb3RoZXIuc3luY1NvdXJjZTsKICAgICAgICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gb3RoZXIuYXV0aG9yaXR5OwogICAgICAgICAgICAgdGhpcy5leHRyYXMgPSBvdGhlci5leHRyYXM7CkBAIC0xNjIsMTcgKzE3MywxOCBAQAogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBBY2NvdW50SW5mbyB7Ci0gICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudDsKKyAgICAgICAgZmluYWwgQWNjb3VudEFuZFVzZXIgYWNjb3VudEFuZFVzZXI7CiAgICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBBdXRob3JpdHlJbmZvPiBhdXRob3JpdGllcyA9CiAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBBdXRob3JpdHlJbmZvPigpOwogCi0gICAgICAgIEFjY291bnRJbmZvKEFjY291bnQgYWNjb3VudCkgewotICAgICAgICAgICAgdGhpcy5hY2NvdW50ID0gYWNjb3VudDsKKyAgICAgICAgQWNjb3VudEluZm8oQWNjb3VudEFuZFVzZXIgYWNjb3VudEFuZFVzZXIpIHsKKyAgICAgICAgICAgIHRoaXMuYWNjb3VudEFuZFVzZXIgPSBhY2NvdW50QW5kVXNlcjsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXV0aG9yaXR5SW5mbyB7CiAgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudDsKKyAgICAgICAgZmluYWwgaW50IHVzZXJJZDsKICAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhvcml0eTsKICAgICAgICAgZmluYWwgaW50IGlkZW50OwogICAgICAgICBib29sZWFuIGVuYWJsZWQ7CkBAIC0xODIsOCArMTk0LDkgQEAKICAgICAgICAgbG9uZyBkZWxheVVudGlsOwogICAgICAgICBmaW5hbCBBcnJheUxpc3Q8UGFpcjxCdW5kbGUsIExvbmc+PiBwZXJpb2RpY1N5bmNzOwogCi0gICAgICAgIEF1dGhvcml0eUluZm8oQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5LCBpbnQgaWRlbnQpIHsKKyAgICAgICAgQXV0aG9yaXR5SW5mbyhBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBhdXRob3JpdHksIGludCBpZGVudCkgewogICAgICAgICAgICAgdGhpcy5hY2NvdW50ID0gYWNjb3VudDsKKyAgICAgICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkOwogICAgICAgICAgICAgdGhpcy5hdXRob3JpdHkgPSBhdXRob3JpdHk7CiAgICAgICAgICAgICB0aGlzLmlkZW50ID0gaWRlbnQ7CiAgICAgICAgICAgICBlbmFibGVkID0gU1lOQ19FTkFCTEVEX0RFRkFVTFQ7CkBAIC0yMTksMTcgKzIzMiwyOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaW50ZXJmYWNlIE9uU3luY1JlcXVlc3RMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHN5bmMgaXMgbmVlZGVkIG9uIGFuIGFjY291bnQocykgZHVlIHRvIHNvbWUgY2hhbmdlIGluIHN0YXRlLgorICAgICAgICAgKiBAcGFyYW0gYWNjb3VudAorICAgICAgICAgKiBAcGFyYW0gdXNlcklkCisgICAgICAgICAqIEBwYXJhbSBhdXRob3JpdHkKKyAgICAgICAgICogQHBhcmFtIGV4dHJhcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUmVxdWVzdChBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBhdXRob3JpdHksIEJ1bmRsZSBleHRyYXMpOworICAgIH0KKwogICAgIC8vIFByaW1hcnkgbGlzdCBvZiBhbGwgc3luY2FibGUgYXV0aG9yaXRpZXMuICBBbHNvIG91ciBnbG9iYWwgbG9jay4KICAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PEF1dGhvcml0eUluZm8+IG1BdXRob3JpdGllcyA9CiAgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8QXV0aG9yaXR5SW5mbz4oKTsKIAotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxBY2NvdW50LCBBY2NvdW50SW5mbz4gbUFjY291bnRzID0KLSAgICAgICAgbmV3IEhhc2hNYXA8QWNjb3VudCwgQWNjb3VudEluZm8+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPEFjY291bnRBbmRVc2VyLCBBY2NvdW50SW5mbz4gbUFjY291bnRzCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPEFjY291bnRBbmRVc2VyLCBBY2NvdW50SW5mbz4oKTsKIAogICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFBlbmRpbmdPcGVyYXRpb24+IG1QZW5kaW5nT3BlcmF0aW9ucyA9CiAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFBlbmRpbmdPcGVyYXRpb24+KCk7CiAKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTeW5jSW5mbz4gbUN1cnJlbnRTeW5jcyA9IG5ldyBBcnJheUxpc3Q8U3luY0luZm8+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxBcnJheUxpc3Q8U3luY0luZm8+PiBtQ3VycmVudFN5bmNzCisgICAgICAgICAgICA9IG5ldyBTcGFyc2VBcnJheTxBcnJheUxpc3Q8U3luY0luZm8+PigpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxTeW5jU3RhdHVzSW5mbz4gbVN5bmNTdGF0dXMgPQogICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PFN5bmNTdGF0dXNJbmZvPigpOwpAQCAtMjgyLDcgKzMwNyw5IEBACiAgICAgcHJpdmF0ZSBpbnQgbU51bVBlbmRpbmdGaW5pc2hlZCA9IDA7CiAKICAgICBwcml2YXRlIGludCBtTmV4dEhpc3RvcnlJZCA9IDA7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1NYXN0ZXJTeW5jQXV0b21hdGljYWxseSA9IHRydWU7CisgICAgcHJpdmF0ZSBTcGFyc2VBcnJheTxCb29sZWFuPiBtTWFzdGVyU3luY0F1dG9tYXRpY2FsbHkgPSBuZXcgU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKKworICAgIHByaXZhdGUgT25TeW5jUmVxdWVzdExpc3RlbmVyIG1TeW5jUmVxdWVzdExpc3RlbmVyOwogCiAgICAgcHJpdmF0ZSBTeW5jU3RvcmFnZUVuZ2luZShDb250ZXh0IGNvbnRleHQsIEZpbGUgZGF0YURpcikgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CkBAIC0zMzAsNiArMzU3LDEyIEBACiAgICAgICAgIHJldHVybiBzU3luY1N0b3JhZ2VFbmdpbmU7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0T25TeW5jUmVxdWVzdExpc3RlbmVyKE9uU3luY1JlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobVN5bmNSZXF1ZXN0TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVN5bmNSZXF1ZXN0TGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfV1JJVEVfU1RBVFVTKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewpAQCAtMzg5LDEwICs0MjIsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGdldFN5bmNBdXRvbWF0aWNhbGx5KEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSkgeworICAgIHB1YmxpYyBib29sZWFuIGdldFN5bmNBdXRvbWF0aWNhbGx5KEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIHByb3ZpZGVyTmFtZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewogICAgICAgICAgICAgaWYgKGFjY291bnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldEF1dGhvcml0eUxvY2tlZChhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRTeW5jQXV0b21hdGljYWxseSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBhdXRob3JpdHkgIT0gbnVsbCAmJiBhdXRob3JpdHkuZW5hYmxlZDsKICAgICAgICAgICAgIH0KQEAgLTQwMiw2ICs0MzUsNyBAQAogICAgICAgICAgICAgICAgIGktLTsKICAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IG1BdXRob3JpdGllcy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgICAgIGlmIChhdXRob3JpdHkuYXV0aG9yaXR5LmVxdWFscyhwcm92aWRlck5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhdXRob3JpdHkudXNlcklkID09IHVzZXJJZAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXV0aG9yaXR5LmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDEwLDExICs0NDQsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFN5bmNBdXRvbWF0aWNhbGx5KEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwgYm9vbGVhbiBzeW5jKSB7Ci0gICAgICAgIExvZy5kKFRBRywgInNldFN5bmNBdXRvbWF0aWNhbGx5OiAiICsgLyphY2NvdW50ICsqLyAiLCBwcm92aWRlciAiICsgcHJvdmlkZXJOYW1lCi0gICAgICAgICAgICAgICAgKyAiIC0+ICIgKyBzeW5jKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRTeW5jQXV0b21hdGljYWxseShBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBwcm92aWRlck5hbWUsCisgICAgICAgICAgICBib29sZWFuIHN5bmMpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAic2V0U3luY0F1dG9tYXRpY2FsbHk6ICIgKyAvKiBhY2NvdW50ICsgKi8iIHByb3ZpZGVyICIgKyBwcm92aWRlck5hbWUKKyAgICAgICAgICAgICAgICArICIsIHVzZXIgIiArIHVzZXJJZCArICIgLT4gIiArIHN5bmMpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewotICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZChhY2NvdW50LCBwcm92aWRlck5hbWUsIC0xLCBmYWxzZSk7CisgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAgaWYgKGF1dGhvcml0eS5lbmFibGVkID09IHN5bmMpIHsKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXRTeW5jQXV0b21hdGljYWxseTogYWxyZWFkeSBzZXQgdG8gIiArIHN5bmMgKyAiLCBkb2luZyBub3RoaW5nIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtNDI0LDE1ICs0NjAsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzeW5jKSB7Ci0gICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIucmVxdWVzdFN5bmMoYWNjb3VudCwgcHJvdmlkZXJOYW1lLCBuZXcgQnVuZGxlKCkpOworICAgICAgICAgICAgcmVxdWVzdFN5bmMoYWNjb3VudCwgdXNlcklkLCBwcm92aWRlck5hbWUsIG5ldyBCdW5kbGUoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmVwb3J0Q2hhbmdlKENvbnRlbnRSZXNvbHZlci5TWU5DX09CU0VSVkVSX1RZUEVfU0VUVElOR1MpOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZ2V0SXNTeW5jYWJsZShBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUpIHsKKyAgICBwdWJsaWMgaW50IGdldElzU3luY2FibGUoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgcHJvdmlkZXJOYW1lKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7CiAgICAgICAgICAgICBpZiAoYWNjb3VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRBdXRob3JpdHlMb2NrZWQoYWNjb3VudCwgcHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgImdldElzU3luY2FibGUiKTsKICAgICAgICAgICAgICAgICBpZiAoYXV0aG9yaXR5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNDUyLDE1ICs0ODgsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldElzU3luY2FibGUoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcHJvdmlkZXJOYW1lLCBpbnQgc3luY2FibGUpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRJc1N5bmNhYmxlKEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwgaW50IHN5bmNhYmxlKSB7CiAgICAgICAgIGlmIChzeW5jYWJsZSA+IDEpIHsKICAgICAgICAgICAgIHN5bmNhYmxlID0gMTsKICAgICAgICAgfSBlbHNlIGlmIChzeW5jYWJsZSA8IC0xKSB7CiAgICAgICAgICAgICBzeW5jYWJsZSA9IC0xOwogICAgICAgICB9Ci0gICAgICAgIExvZy5kKFRBRywgInNldElzU3luY2FibGU6ICIgKyBhY2NvdW50ICsgIiwgcHJvdmlkZXIgIiArIHByb3ZpZGVyTmFtZSArICIgLT4gIiArIHN5bmNhYmxlKTsKKyAgICAgICAgTG9nLmQoVEFHLCAic2V0SXNTeW5jYWJsZTogIiArIGFjY291bnQgKyAiLCBwcm92aWRlciAiICsgcHJvdmlkZXJOYW1lCisgICAgICAgICAgICAgICAgKyAiLCB1c2VyICIgKyB1c2VySWQgKyAiIC0+ICIgKyBzeW5jYWJsZSk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHByb3ZpZGVyTmFtZSwgLTEsIGZhbHNlKTsKKyAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQoYWNjb3VudCwgdXNlcklkLCBwcm92aWRlck5hbWUsIC0xLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICAgICAgICBpZiAoYXV0aG9yaXR5LnN5bmNhYmxlID09IHN5bmNhYmxlKSB7CiAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0SXNTeW5jYWJsZTogYWxyZWFkeSBzZXQgdG8gIiArIHN5bmNhYmxlICsgIiwgZG9pbmcgbm90aGluZyIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTQ3MCwxNCArNTA4LDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3luY2FibGUgPiAwKSB7Ci0gICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIucmVxdWVzdFN5bmMoYWNjb3VudCwgcHJvdmlkZXJOYW1lLCBuZXcgQnVuZGxlKCkpOworICAgICAgICAgICAgcmVxdWVzdFN5bmMoYWNjb3VudCwgdXNlcklkLCBwcm92aWRlck5hbWUsIG5ldyBCdW5kbGUoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmVwb3J0Q2hhbmdlKENvbnRlbnRSZXNvbHZlci5TWU5DX09CU0VSVkVSX1RZUEVfU0VUVElOR1MpOwogICAgIH0KIAotICAgIHB1YmxpYyBQYWlyPExvbmcsIExvbmc+IGdldEJhY2tvZmYoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcHJvdmlkZXJOYW1lKSB7CisgICAgcHVibGljIFBhaXI8TG9uZywgTG9uZz4gZ2V0QmFja29mZihBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBwcm92aWRlck5hbWUpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHByb3ZpZGVyTmFtZSwgImdldEJhY2tvZmYiKTsKKyAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAiZ2V0QmFja29mZiIpOwogICAgICAgICAgICAgaWYgKGF1dGhvcml0eSA9PSBudWxsIHx8IGF1dGhvcml0eS5iYWNrb2ZmVGltZSA8IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KQEAgLTQ4NSwxNyArNTI0LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRCYWNrb2ZmKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwKKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrb2ZmKEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwKICAgICAgICAgICAgIGxvbmcgbmV4dFN5bmNUaW1lLCBsb25nIG5leHREZWxheSkgewogICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgIExvZy52KFRBRywgInNldEJhY2tvZmY6ICIgKyBhY2NvdW50ICsgIiwgcHJvdmlkZXIgIiArIHByb3ZpZGVyTmFtZQorICAgICAgICAgICAgICAgICAgICArICIsIHVzZXIgIiArIHVzZXJJZAogICAgICAgICAgICAgICAgICAgICArICIgLT4gbmV4dFN5bmNUaW1lICIgKyBuZXh0U3luY1RpbWUgKyAiLCBuZXh0RGVsYXkgIiArIG5leHREZWxheSk7CiAgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7CiAgICAgICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsIHx8IHByb3ZpZGVyTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZm9yIChBY2NvdW50SW5mbyBhY2NvdW50SW5mbyA6IG1BY2NvdW50cy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjb3VudCAhPSBudWxsICYmICFhY2NvdW50LmVxdWFscyhhY2NvdW50SW5mby5hY2NvdW50KSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2NvdW50ICE9IG51bGwgJiYgIWFjY291bnQuZXF1YWxzKGFjY291bnRJbmZvLmFjY291bnRBbmRVc2VyLmFjY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXNlcklkICE9IGFjY291bnRJbmZvLmFjY291bnRBbmRVc2VyLnVzZXJJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZm9yIChBdXRob3JpdHlJbmZvIGF1dGhvcml0eUluZm8gOiBhY2NvdW50SW5mby5hdXRob3JpdGllcy52YWx1ZXMoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyTmFtZSAhPSBudWxsICYmICFwcm92aWRlck5hbWUuZXF1YWxzKGF1dGhvcml0eUluZm8uYXV0aG9yaXR5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNTEwLDcgKzU1Myw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZChhY2NvdW50LCBwcm92aWRlck5hbWUsIC0xIC8qIGlkZW50ICovLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLCAtMSAvKiBpZGVudCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKGF1dGhvcml0eS5iYWNrb2ZmVGltZSA9PSBuZXh0U3luY1RpbWUgJiYgYXV0aG9yaXR5LmJhY2tvZmZEZWxheSA9PSBuZXh0RGVsYXkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KQEAgLTUzNSwxMyArNTc5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjbGVhckFsbEJhY2tvZmZzOiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdXRob3JpdHk6IiArIGF1dGhvcml0eUluZm8uYXV0aG9yaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYWNjb3VudDoiICsgYWNjb3VudEluZm8uYWNjb3VudC5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYWNjb3VudDoiICsgYWNjb3VudEluZm8uYWNjb3VudEFuZFVzZXIuYWNjb3VudC5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdXNlcjoiICsgYWNjb3VudEluZm8uYWNjb3VudEFuZFVzZXIudXNlcklkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYmFja29mZlRpbWUgd2FzOiAiICsgYXV0aG9yaXR5SW5mby5iYWNrb2ZmVGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJhY2tvZmZEZWxheSB3YXM6ICIgKyBhdXRob3JpdHlJbmZvLmJhY2tvZmZEZWxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdHlJbmZvLmJhY2tvZmZUaW1lID0gTk9UX0lOX0JBQ0tPRkZfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eUluZm8uYmFja29mZkRlbGF5ID0gTk9UX0lOX0JBQ0tPRkZfTU9ERTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNRdWV1ZS5vbkJhY2tvZmZDaGFuZ2VkKGFjY291bnRJbmZvLmFjY291bnQsIGF1dGhvcml0eUluZm8uYXV0aG9yaXR5LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNRdWV1ZS5vbkJhY2tvZmZDaGFuZ2VkKGFjY291bnRJbmZvLmFjY291bnRBbmRVc2VyLmFjY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRJbmZvLmFjY291bnRBbmRVc2VyLnVzZXJJZCwgYXV0aG9yaXR5SW5mby5hdXRob3JpdHksIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC01NTMsMTQgKzU5OSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0RGVsYXlVbnRpbFRpbWUoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcHJvdmlkZXJOYW1lLCBsb25nIGRlbGF5VW50aWwpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXREZWxheVVudGlsVGltZShBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBwcm92aWRlck5hbWUsCisgICAgICAgICAgICBsb25nIGRlbGF5VW50aWwpIHsKICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CiAgICAgICAgICAgICBMb2cudihUQUcsICJzZXREZWxheVVudGlsOiAiICsgYWNjb3VudCArICIsIHByb3ZpZGVyICIgKyBwcm92aWRlck5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIC0+IGRlbGF5VW50aWwgIiArIGRlbGF5VW50aWwpOworICAgICAgICAgICAgICAgICAgICArICIsIHVzZXIgIiArIHVzZXJJZCArICIgLT4gZGVsYXlVbnRpbCAiICsgZGVsYXlVbnRpbCk7CiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQoCi0gICAgICAgICAgICAgICAgICAgIGFjY291bnQsIHByb3ZpZGVyTmFtZSwgLTEgLyogaWRlbnQgKi8sIHRydWUpOworICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwgLTEgLyogaWRlbnQgKi8sIHRydWUpOwogICAgICAgICAgICAgaWYgKGF1dGhvcml0eS5kZWxheVVudGlsID09IGRlbGF5VW50aWwpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC01NzAsOSArNjE3LDEwIEBACiAgICAgICAgIHJlcG9ydENoYW5nZShDb250ZW50UmVzb2x2ZXIuU1lOQ19PQlNFUlZFUl9UWVBFX1NFVFRJTkdTKTsKICAgICB9CiAKLSAgICBwdWJsaWMgbG9uZyBnZXREZWxheVVudGlsVGltZShBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUpIHsKKyAgICBwdWJsaWMgbG9uZyBnZXREZWxheVVudGlsVGltZShBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBwcm92aWRlck5hbWUpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHByb3ZpZGVyTmFtZSwgImdldERlbGF5VW50aWwiKTsKKyAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAiZ2V0RGVsYXlVbnRpbCIpOwogICAgICAgICAgICAgaWYgKGF1dGhvcml0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CkBAIC01ODAsNyArNjI4LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVPclJlbW92ZVBlcmlvZGljU3luYyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUsIEJ1bmRsZSBleHRyYXMsCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU9yUmVtb3ZlUGVyaW9kaWNTeW5jKEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMsCiAgICAgICAgICAgICBsb25nIHBlcmlvZCwgYm9vbGVhbiBhZGQpIHsKICAgICAgICAgaWYgKHBlcmlvZCA8PSAwKSB7CiAgICAgICAgICAgICBwZXJpb2QgPSAwOwpAQCAtNTg5LDEzICs2MzgsMTQgQEAKICAgICAgICAgICAgIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgIExvZy52KFRBRywgImFkZE9yUmVtb3ZlUGVyaW9kaWNTeW5jOiAiICsgYWNjb3VudCArICIsIHByb3ZpZGVyICIgKyBwcm92aWRlck5hbWUKKyAgICAgICAgICAgIExvZy52KFRBRywgImFkZE9yUmVtb3ZlUGVyaW9kaWNTeW5jOiAiICsgYWNjb3VudCArICIsIHVzZXIgIiArIHVzZXJJZAorICAgICAgICAgICAgICAgICAgICArICIsIHByb3ZpZGVyICIgKyBwcm92aWRlck5hbWUKICAgICAgICAgICAgICAgICAgICAgKyAiIC0+IHBlcmlvZCAiICsgcGVyaW9kICsgIiwgZXh0cmFzICIgKyBleHRyYXMpOwogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHByb3ZpZGVyTmFtZSwgLTEsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLCAtMSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChhZGQpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoaXMgcGVyaW9kaWMgc3luYyBpZiBvbmUgd2l0aCB0aGUgc2FtZSBleHRyYXMgZG9lc24ndCBhbHJlYWR5CiAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0IGluIHRoZSBwZXJpb2RpY1N5bmNzIGFycmF5CkBAIC02NTIsNjEgKzcwMiw2NyBAQAogICAgICAgICByZXBvcnRDaGFuZ2UoQ29udGVudFJlc29sdmVyLlNZTkNfT0JTRVJWRVJfVFlQRV9TRVRUSU5HUyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkUGVyaW9kaWNTeW5jKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwgQnVuZGxlIGV4dHJhcywKKyAgICBwdWJsaWMgdm9pZCBhZGRQZXJpb2RpY1N5bmMoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgcHJvdmlkZXJOYW1lLCBCdW5kbGUgZXh0cmFzLAogICAgICAgICAgICAgbG9uZyBwb2xsRnJlcXVlbmN5KSB7Ci0gICAgICAgIHVwZGF0ZU9yUmVtb3ZlUGVyaW9kaWNTeW5jKGFjY291bnQsIHByb3ZpZGVyTmFtZSwgZXh0cmFzLCBwb2xsRnJlcXVlbmN5LCB0cnVlIC8qIGFkZCAqLyk7CisgICAgICAgIHVwZGF0ZU9yUmVtb3ZlUGVyaW9kaWNTeW5jKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLCBleHRyYXMsIHBvbGxGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBhZGQgKi8pOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBlcmlvZGljU3luYyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgdXBkYXRlT3JSZW1vdmVQZXJpb2RpY1N5bmMoYWNjb3VudCwgcHJvdmlkZXJOYW1lLCBleHRyYXMsIDAgLyogcGVyaW9kLCBpZ25vcmVkICovLAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBlcmlvZGljU3luYyhBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBwcm92aWRlck5hbWUsCisgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIHVwZGF0ZU9yUmVtb3ZlUGVyaW9kaWNTeW5jKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLCBleHRyYXMsIDAgLyogcGVyaW9kLCBpZ25vcmVkICovLAogICAgICAgICAgICAgICAgIGZhbHNlIC8qIHJlbW92ZSAqLyk7CiAgICAgfQogCi0gICAgcHVibGljIExpc3Q8UGVyaW9kaWNTeW5jPiBnZXRQZXJpb2RpY1N5bmNzKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSkgeworICAgIHB1YmxpYyBMaXN0PFBlcmlvZGljU3luYz4gZ2V0UGVyaW9kaWNTeW5jcyhBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBwcm92aWRlck5hbWUpIHsKICAgICAgICAgQXJyYXlMaXN0PFBlcmlvZGljU3luYz4gc3luY3MgPSBuZXcgQXJyYXlMaXN0PFBlcmlvZGljU3luYz4oKTsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHByb3ZpZGVyTmFtZSwgImdldFBlcmlvZGljU3luY3MiKTsKKyAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAiZ2V0UGVyaW9kaWNTeW5jcyIpOwogICAgICAgICAgICAgaWYgKGF1dGhvcml0eSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZm9yIChQYWlyPEJ1bmRsZSwgTG9uZz4gaXRlbSA6IGF1dGhvcml0eS5wZXJpb2RpY1N5bmNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNzLmFkZChuZXcgUGVyaW9kaWNTeW5jKGFjY291bnQsIHByb3ZpZGVyTmFtZSwgaXRlbS5maXJzdCwgaXRlbS5zZWNvbmQpKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY3MuYWRkKG5ldyBQZXJpb2RpY1N5bmMoYWNjb3VudCwgcHJvdmlkZXJOYW1lLCBpdGVtLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2Vjb25kKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzeW5jczsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseShib29sZWFuIGZsYWcpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseShib29sZWFuIGZsYWcsIGludCB1c2VySWQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIGlmIChtTWFzdGVyU3luY0F1dG9tYXRpY2FsbHkgPT0gZmxhZykgeworICAgICAgICAgICAgQm9vbGVhbiBhdXRvID0gbU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5LmdldCh1c2VySWQpOworICAgICAgICAgICAgaWYgKGF1dG8gIT0gbnVsbCAmJiAoYm9vbGVhbikgYXV0byA9PSBmbGFnKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5ID0gZmxhZzsKKyAgICAgICAgICAgIG1NYXN0ZXJTeW5jQXV0b21hdGljYWxseS5wdXQodXNlcklkLCBmbGFnKTsKICAgICAgICAgICAgIHdyaXRlQWNjb3VudEluZm9Mb2NrZWQoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZmxhZykgewotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLnJlcXVlc3RTeW5jKG51bGwsIG51bGwsIG5ldyBCdW5kbGUoKSk7CisgICAgICAgICAgICByZXF1ZXN0U3luYyhudWxsLCB1c2VySWQsIG51bGwsIG5ldyBCdW5kbGUoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmVwb3J0Q2hhbmdlKENvbnRlbnRSZXNvbHZlci5TWU5DX09CU0VSVkVSX1RZUEVfU0VUVElOR1MpOwogICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KFNZTkNfQ09OTkVDVElPTl9TRVRUSU5HX0NIQU5HRURfSU5URU5UKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseSgpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseShpbnQgdXNlcklkKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5OworICAgICAgICAgICAgQm9vbGVhbiBhdXRvID0gbU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5LmdldCh1c2VySWQpOworICAgICAgICAgICAgcmV0dXJuIGF1dG8gPT0gbnVsbCA/IHRydWUgOiBhdXRvOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIEF1dGhvcml0eUluZm8gZ2V0T3JDcmVhdGVBdXRob3JpdHkoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgcHVibGljIEF1dGhvcml0eUluZm8gZ2V0T3JDcmVhdGVBdXRob3JpdHkoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQoYWNjb3VudCwgYXV0aG9yaXR5LAorICAgICAgICAgICAgcmV0dXJuIGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHVzZXJJZCwgYXV0aG9yaXR5LAogICAgICAgICAgICAgICAgICAgICAtMSAvKiBhc3NpZ24gYSBuZXcgaWRlbnRpZmllciBpZiBjcmVhdGluZyBhIG5ldyBhdXRob3JpdHkgKi8sCiAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogd3JpdGUgdG8gc3RvcmFnZSBpZiB0aGlzIHJlc3VsdHMgaW4gYSBjaGFuZ2UgKi8pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQXV0aG9yaXR5KEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgeworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF1dGhvcml0eShBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBhdXRob3JpdHkpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIHJlbW92ZUF1dGhvcml0eUxvY2tlZChhY2NvdW50LCBhdXRob3JpdHksIHRydWUgLyogZG9Xcml0ZSAqLyk7CisgICAgICAgICAgICByZW1vdmVBdXRob3JpdHlMb2NrZWQoYWNjb3VudCwgdXNlcklkLCBhdXRob3JpdHksIHRydWUgLyogZG9Xcml0ZSAqLyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTcyMCwxMiArNzc2LDEzIEBACiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGN1cnJlbnRseSBhIHN5bmMgb3BlcmF0aW9uIGZvciB0aGUgZ2l2ZW4KICAgICAgKiBhY2NvdW50IG9yIGF1dGhvcml0eSBhY3RpdmVseSBiZWluZyBwcm9jZXNzZWQuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTeW5jQWN0aXZlKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgeworICAgIHB1YmxpYyBib29sZWFuIGlzU3luY0FjdGl2ZShBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBhdXRob3JpdHkpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIGZvciAoU3luY0luZm8gc3luY0luZm8gOiBtQ3VycmVudFN5bmNzKSB7CisgICAgICAgICAgICBmb3IgKFN5bmNJbmZvIHN5bmNJbmZvIDogZ2V0Q3VycmVudFN5bmNzKHVzZXJJZCkpIHsKICAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGFpbmZvID0gZ2V0QXV0aG9yaXR5KHN5bmNJbmZvLmF1dGhvcml0eUlkKTsKICAgICAgICAgICAgICAgICBpZiAoYWluZm8gIT0gbnVsbCAmJiBhaW5mby5hY2NvdW50LmVxdWFscyhhY2NvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWluZm8uYXV0aG9yaXR5LmVxdWFscyhhdXRob3JpdHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhaW5mby5hdXRob3JpdHkuZXF1YWxzKGF1dGhvcml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGFpbmZvLnVzZXJJZCA9PSB1c2VySWQpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNzM4LDEyICs3OTUsMTMgQEAKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewogICAgICAgICAgICAgICAgIExvZy52KFRBRywgImluc2VydEludG9QZW5kaW5nOiBhY2NvdW50PSIgKyBvcC5hY2NvdW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiBhdXRoPSIgKyBvcC5hdXRob3JpdHkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNyYz0iICsgb3Auc3luY1NvdXJjZQotICAgICAgICAgICAgICAgICAgICArICIgZXh0cmFzPSIgKyBvcC5leHRyYXMpOworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHVzZXI9IiArIG9wLnVzZXJJZAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGF1dGg9IiArIG9wLmF1dGhvcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNyYz0iICsgb3Auc3luY1NvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGV4dHJhcz0iICsgb3AuZXh0cmFzKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZChvcC5hY2NvdW50LAorICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZChvcC5hY2NvdW50LCBvcC51c2VySWQsCiAgICAgICAgICAgICAgICAgICAgIG9wLmF1dGhvcml0eSwKICAgICAgICAgICAgICAgICAgICAgLTEgLyogZGVzaXJlZCBpZGVudGlmaWVyICovLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHdyaXRlIGFjY291bnRzIHRvIHN0b3JhZ2UgKi8pOwpAQCAtNzY5LDYgKzgyNyw3IEBACiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7CiAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJkZWxldGVGcm9tUGVuZGluZzogYWNjb3VudD0iICsgb3AuYWNjb3VudAorICAgICAgICAgICAgICAgICAgICArICIgdXNlcj0iICsgb3AudXNlcklkCiAgICAgICAgICAgICAgICAgICAgICsgIiBhdXRoPSIgKyBvcC5hdXRob3JpdHkKICAgICAgICAgICAgICAgICAgICAgKyAiIHNyYz0iICsgb3Auc3luY1NvdXJjZQogICAgICAgICAgICAgICAgICAgICArICIgZXh0cmFzPSIgKyBvcC5leHRyYXMpOwpAQCAtNzgyLDcgKzg0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1OdW1QZW5kaW5nRmluaXNoZWQrKzsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldEF1dGhvcml0eUxvY2tlZChvcC5hY2NvdW50LCBvcC5hdXRob3JpdHksCisgICAgICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRBdXRob3JpdHlMb2NrZWQob3AuYWNjb3VudCwgb3AudXNlcklkLCBvcC5hdXRob3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRlRnJvbVBlbmRpbmciKTsKICAgICAgICAgICAgICAgICBpZiAoYXV0aG9yaXR5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSBMb2cudihUQUcsICJyZW1vdmluZyAtICIgKyBhdXRob3JpdHkpOwpAQCAtNzkxLDcgKzg1MCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdPcGVyYXRpb24gY3VyID0gbVBlbmRpbmdPcGVyYXRpb25zLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIuYWNjb3VudC5lcXVhbHMob3AuYWNjb3VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY3VyLmF1dGhvcml0eS5lcXVhbHMob3AuYXV0aG9yaXR5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjdXIuYXV0aG9yaXR5LmVxdWFscyhvcC5hdXRob3JpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGN1ci51c2VySWQgPT0gb3AudXNlcklkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZVBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtODEyLDI0ICs4NzIsNiBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgY2xlYXJQZW5kaW5nKCkgewotICAgICAgICBpbnQgbnVtOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewotICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiY2xlYXJQZW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW0gPSBtUGVuZGluZ09wZXJhdGlvbnMuc2l6ZSgpOwotICAgICAgICAgICAgbVBlbmRpbmdPcGVyYXRpb25zLmNsZWFyKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1TeW5jU3RhdHVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtU3luY1N0YXR1cy52YWx1ZUF0KGkpLnBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlUGVuZGluZ09wZXJhdGlvbnNMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXBvcnRDaGFuZ2UoQ29udGVudFJlc29sdmVyLlNZTkNfT0JTRVJWRVJfVFlQRV9QRU5ESU5HKTsKLSAgICAgICAgcmV0dXJuIG51bTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBjdXJyZW50IGFycmF5IG9mIHBlbmRpbmcgb3BlcmF0aW9ucy4gIFRoZQogICAgICAqIFBlbmRpbmdPcGVyYXRpb24gb2JqZWN0cyBhcmUgdGhlIHJlYWwgb2JqZWN0cyBzdG9yZWQgaW5zaWRlLCBzbyB0aGF0CkBAIC04NTQsMTcgKzg5NiwxOCBAQAogICAgICAqIENhbGxlZCB3aGVuIHRoZSBzZXQgb2YgYWNjb3VudCBoYXMgY2hhbmdlZCwgZ2l2ZW4gdGhlIG5ldyBhcnJheSBvZgogICAgICAqIGFjdGl2ZSBhY2NvdW50cy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb0RhdGFiYXNlQ2xlYW51cChBY2NvdW50W10gYWNjb3VudHMpIHsKKyAgICBwdWJsaWMgdm9pZCBkb0RhdGFiYXNlQ2xlYW51cChBY2NvdW50W10gYWNjb3VudHMsIGludCB1c2VySWQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgTG9nLncoVEFHLCAiVXBkYXRpbmcgZm9yIG5ldyBhY2NvdW50cy4uLiIpOwogICAgICAgICAgICAgU3BhcnNlQXJyYXk8QXV0aG9yaXR5SW5mbz4gcmVtb3ZpbmcgPSBuZXcgU3BhcnNlQXJyYXk8QXV0aG9yaXR5SW5mbz4oKTsKICAgICAgICAgICAgIEl0ZXJhdG9yPEFjY291bnRJbmZvPiBhY2NJdCA9IG1BY2NvdW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwogICAgICAgICAgICAgd2hpbGUgKGFjY0l0Lmhhc05leHQoKSkgewogICAgICAgICAgICAgICAgIEFjY291bnRJbmZvIGFjYyA9IGFjY0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIUFycmF5VXRpbHMuY29udGFpbnMoYWNjb3VudHMsIGFjYy5hY2NvdW50KSkgeworICAgICAgICAgICAgICAgIGlmICghQXJyYXlVdGlscy5jb250YWlucyhhY2NvdW50cywgYWNjLmFjY291bnRBbmRVc2VyLmFjY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY2MuYWNjb3VudEFuZFVzZXIudXNlcklkID09IHVzZXJJZCkgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFjY291bnQgbm8gbG9uZ2VyIGV4aXN0cy4uLgogICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkFjY291bnQgcmVtb3ZlZDogIiArIGFjYy5hY2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkFjY291bnQgcmVtb3ZlZDogIiArIGFjYy5hY2NvdW50QW5kVXNlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZm9yIChBdXRob3JpdHlJbmZvIGF1dGggOiBhY2MuYXV0aG9yaXRpZXMudmFsdWVzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92aW5nLnB1dChhdXRoLmlkZW50LCBhdXRoKTsKQEAgLTkxOSwxMyArOTYyLDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKAogICAgICAgICAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hY2NvdW50LAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi51c2VySWQsCiAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmF1dGhvcml0eSwKICAgICAgICAgICAgICAgICAgICAgLTEgLyogYXNzaWduIGEgbmV3IGlkZW50aWZpZXIgaWYgY3JlYXRpbmcgYSBuZXcgYXV0aG9yaXR5ICovLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHdyaXRlIHRvIHN0b3JhZ2UgaWYgdGhpcyByZXN1bHRzIGluIGEgY2hhbmdlICovKTsKICAgICAgICAgICAgIHN5bmNJbmZvID0gbmV3IFN5bmNJbmZvKGF1dGhvcml0eS5pZGVudCwKICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5LmFjY291bnQsIGF1dGhvcml0eS5hdXRob3JpdHksCiAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN5bmNDb250ZXh0Lm1TdGFydFRpbWUpOwotICAgICAgICAgICAgbUN1cnJlbnRTeW5jcy5hZGQoc3luY0luZm8pOworICAgICAgICAgICAgZ2V0Q3VycmVudFN5bmNzKGF1dGhvcml0eS51c2VySWQpLmFkZChzeW5jSW5mbyk7CiAgICAgICAgIH0KIAogICAgICAgICByZXBvcnRBY3RpdmVDaGFuZ2UoKTsKQEAgLTkzNSwxMyArOTc5LDE0IEBACiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgYSBwcmV2aW91c2x5IGFjdGl2ZSBzeW5jIGlzIG5vIGxvbmdlciBhY3RpdmUuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWN0aXZlU3luYyhTeW5jSW5mbyBzeW5jSW5mbykgeworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFjdGl2ZVN5bmMoU3luY0luZm8gc3luY0luZm8sIGludCB1c2VySWQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgInJlbW92ZUFjdGl2ZVN5bmM6IGFjY291bnQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBzeW5jSW5mby5hY2NvdW50ICsgIiBhdXRoPSIgKyBzeW5jSW5mby5hdXRob3JpdHkpOworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInJlbW92ZUFjdGl2ZVN5bmM6IGFjY291bnQ9IiArIHN5bmNJbmZvLmFjY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB1c2VyPSIgKyB1c2VySWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdXRoPSIgKyBzeW5jSW5mby5hdXRob3JpdHkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnRTeW5jcy5yZW1vdmUoc3luY0luZm8pOworICAgICAgICAgICAgZ2V0Q3VycmVudFN5bmNzKHVzZXJJZCkucmVtb3ZlKHN5bmNJbmZvKTsKICAgICAgICAgfQogCiAgICAgICAgIHJlcG9ydEFjdGl2ZUNoYW5nZSgpOwpAQCAtOTU3LDE1ICsxMDAyLDE1IEBACiAgICAgLyoqCiAgICAgICogTm90ZSB0aGF0IHN5bmMgaGFzIHN0YXJ0ZWQgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGFuZCBhdXRob3JpdHkuCiAgICAgICovCi0gICAgcHVibGljIGxvbmcgaW5zZXJ0U3RhcnRTeW5jRXZlbnQoQWNjb3VudCBhY2NvdW50TmFtZSwgU3RyaW5nIGF1dGhvcml0eU5hbWUsCisgICAgcHVibGljIGxvbmcgaW5zZXJ0U3RhcnRTeW5jRXZlbnQoQWNjb3VudCBhY2NvdW50TmFtZSwgaW50IHVzZXJJZCwgU3RyaW5nIGF1dGhvcml0eU5hbWUsCiAgICAgICAgICAgICBsb25nIG5vdywgaW50IHNvdXJjZSkgewogICAgICAgICBsb25nIGlkOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewogICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiaW5zZXJ0U3RhcnRTeW5jRXZlbnQ6IGFjY291bnQ9IiArIGFjY291bnROYW1lCisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiaW5zZXJ0U3RhcnRTeW5jRXZlbnQ6IGFjY291bnQ9IiArIGFjY291bnROYW1lICsgInVzZXI9IiArIHVzZXJJZAogICAgICAgICAgICAgICAgICAgICArICIgYXV0aD0iICsgYXV0aG9yaXR5TmFtZSArICIgc291cmNlPSIgKyBzb3VyY2UpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRBdXRob3JpdHlMb2NrZWQoYWNjb3VudE5hbWUsIGF1dGhvcml0eU5hbWUsCisgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldEF1dGhvcml0eUxvY2tlZChhY2NvdW50TmFtZSwgdXNlcklkLCBhdXRob3JpdHlOYW1lLAogICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0U3RhcnRTeW5jRXZlbnQiKTsKICAgICAgICAgICAgIGlmIChhdXRob3JpdHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTExMTksOSArMTE2NCwxNCBAQAogICAgICAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgc3luY3MuIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgaXRlbXMgYXJlIHRoZQogICAgICAqIHJlYWwsIGxpdmUgYWN0aXZlIHN5bmMgb2JqZWN0cywgc28gYmUgY2FyZWZ1bCB3aGF0IHlvdSBkbyB3aXRoIGl0LgogICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN5bmNJbmZvPiBnZXRDdXJyZW50U3luY3MoKSB7CisgICAgcHVibGljIExpc3Q8U3luY0luZm8+IGdldEN1cnJlbnRTeW5jcyhpbnQgdXNlcklkKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTeW5jSW5mbz4obUN1cnJlbnRTeW5jcyk7CisgICAgICAgICAgICBBcnJheUxpc3Q8U3luY0luZm8+IHN5bmNzID0gbUN1cnJlbnRTeW5jcy5nZXQodXNlcklkKTsKKyAgICAgICAgICAgIGlmIChzeW5jcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3luY3MgPSBuZXcgQXJyYXlMaXN0PFN5bmNJbmZvPigpOworICAgICAgICAgICAgICAgIG1DdXJyZW50U3luY3MucHV0KHVzZXJJZCwgc3luY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3luY0luZm8+KHN5bmNzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE2NCw3ICsxMjE0LDggQEAKICAgICAgKiBAcGFyYW0gYXV0aG9yaXR5IHRoZSBhdXRob3JpdHkgd2hvc2Ugcm93IHNob3VsZCBiZSBzZWxlY3RlZAogICAgICAqIEByZXR1cm4gdGhlIFN5bmNTdGF0dXNJbmZvIGZvciB0aGUgYXV0aG9yaXR5CiAgICAgICovCi0gICAgcHVibGljIFN5bmNTdGF0dXNJbmZvIGdldFN0YXR1c0J5QWNjb3VudEFuZEF1dGhvcml0eShBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICBwdWJsaWMgU3luY1N0YXR1c0luZm8gZ2V0U3RhdHVzQnlBY2NvdW50QW5kQXV0aG9yaXR5KEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwKKyAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHkpIHsKICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCB8fCBhdXRob3JpdHkgPT0gbnVsbCkgewogICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICAgICAgfQpAQCAtMTE3NCw4ICsxMjI1LDkgQEAKICAgICAgICAgICAgICAgICBTeW5jU3RhdHVzSW5mbyBjdXIgPSBtU3luY1N0YXR1cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYWluZm8gPSBtQXV0aG9yaXRpZXMuZ2V0KGN1ci5hdXRob3JpdHlJZCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoYWluZm8gIT0gbnVsbCAmJiBhaW5mby5hdXRob3JpdHkuZXF1YWxzKGF1dGhvcml0eSkgJiYKLSAgICAgICAgICAgICAgICAgICAgYWNjb3VudC5lcXVhbHMoYWluZm8uYWNjb3VudCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWluZm8gIT0gbnVsbCAmJiBhaW5mby5hdXRob3JpdHkuZXF1YWxzKGF1dGhvcml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGFpbmZvLnVzZXJJZCA9PSB1c2VySWQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGFjY291bnQuZXF1YWxzKGFpbmZvLmFjY291bnQpKSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTExODYsNyArMTIzOCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHBlbmRpbmcgc3RhdHVzIGlzIHRydWUgb2YgYW55IG1hdGNoaW5nIGF1dGhvcml0aWVzLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU3luY1BlbmRpbmcoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgcHVibGljIGJvb2xlYW4gaXNTeW5jUGVuZGluZyhBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBhdXRob3JpdHkpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVN5bmNTdGF0dXMuc2l6ZSgpOwogICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewpAQCAtMTE5NSw2ICsxMjQ3LDkgQEAKICAgICAgICAgICAgICAgICBpZiAoYWluZm8gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHVzZXJJZCAhPSBhaW5mby51c2VySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChhY2NvdW50ICE9IG51bGwgJiYgIWFpbmZvLmFjY291bnQuZXF1YWxzKGFjY291bnQpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTEyMzUsMzQgKzEyOTAsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogSWYgc3luYyBpcyBmYWlsaW5nIGZvciBhbnkgb2YgdGhlIHByb3ZpZGVyL2FjY291bnRzIHRoZW4gZGV0ZXJtaW5lIHRoZSB0aW1lIGF0IHdoaWNoIGl0Ci0gICAgICogc3RhcnRlZCBmYWlsaW5nIGFuZCByZXR1cm4gdGhlIGVhcmxpZXN0IHRpbWUgb3ZlciBhbGwgdGhlIHByb3ZpZGVyL2FjY291bnRzLiBJZiBub25lIGFyZQotICAgICAqIGZhaWxpbmcgdGhlbiByZXR1cm4gMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRJbml0aWFsU3luY0ZhaWx1cmVUaW1lKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewotICAgICAgICAgICAgaWYgKCFtTWFzdGVyU3luY0F1dG9tYXRpY2FsbHkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9uZyBvbGRlc3QgPSAwOwotICAgICAgICAgICAgaW50IGkgPSBtU3luY1N0YXR1cy5zaXplKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICAgICAgU3luY1N0YXR1c0luZm8gc3RhdHMgPSBtU3luY1N0YXR1cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gbUF1dGhvcml0aWVzLmdldChzdGF0cy5hdXRob3JpdHlJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF1dGhvcml0eSAhPSBudWxsICYmIGF1dGhvcml0eS5lbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvbGRlc3QgPT0gMCB8fCBzdGF0cy5pbml0aWFsRmFpbHVyZVRpbWUgPCBvbGRlc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZGVzdCA9IHN0YXRzLmluaXRpYWxGYWlsdXJlVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9sZGVzdDsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgaW50IGdldEN1cnJlbnREYXlMb2NrZWQoKSB7CiAgICAgICAgIG1DYWwuc2V0VGltZUluTWlsbGlzKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKICAgICAgICAgZmluYWwgaW50IGRheU9mWWVhciA9IG1DYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9ZRUFSKTsKQEAgLTEyODMsMTggKzEzMTAsMTkgQEAKICAgICAgKiBAcGFyYW0gdGFnIElmIG5vbi1udWxsLCB0aGlzIHdpbGwgYmUgdXNlZCBpbiBhIGxvZyBtZXNzYWdlIGlmIHRoZQogICAgICAqIHJlcXVlc3RlZCBhdXRob3JpdHkgZG9lcyBub3QgZXhpc3QuCiAgICAgICovCi0gICAgcHJpdmF0ZSBBdXRob3JpdHlJbmZvIGdldEF1dGhvcml0eUxvY2tlZChBY2NvdW50IGFjY291bnROYW1lLCBTdHJpbmcgYXV0aG9yaXR5TmFtZSwKKyAgICBwcml2YXRlIEF1dGhvcml0eUluZm8gZ2V0QXV0aG9yaXR5TG9ja2VkKEFjY291bnQgYWNjb3VudE5hbWUsIGludCB1c2VySWQsIFN0cmluZyBhdXRob3JpdHlOYW1lLAogICAgICAgICAgICAgU3RyaW5nIHRhZykgewotICAgICAgICBBY2NvdW50SW5mbyBhY2NvdW50ID0gbUFjY291bnRzLmdldChhY2NvdW50TmFtZSk7Ci0gICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHsKKyAgICAgICAgQWNjb3VudEFuZFVzZXIgYXUgPSBuZXcgQWNjb3VudEFuZFVzZXIoYWNjb3VudE5hbWUsIHVzZXJJZCk7CisgICAgICAgIEFjY291bnRJbmZvIGFjY291bnRJbmZvID0gbUFjY291bnRzLmdldChhdSk7CisgICAgICAgIGlmIChhY2NvdW50SW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCB0YWcgKyAiOiB1bmtub3duIGFjY291bnQgIiArIGFjY291bnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCB0YWcgKyAiOiB1bmtub3duIGFjY291bnQgIiArIGF1KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGFjY291bnQuYXV0aG9yaXRpZXMuZ2V0KGF1dGhvcml0eU5hbWUpOworICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGFjY291bnRJbmZvLmF1dGhvcml0aWVzLmdldChhdXRob3JpdHlOYW1lKTsKICAgICAgICAgaWYgKGF1dGhvcml0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKQEAgLTEzMDcsMTIgKzEzMzUsMTMgQEAKICAgICAgICAgcmV0dXJuIGF1dGhvcml0eTsKICAgICB9CiAKLSAgICBwcml2YXRlIEF1dGhvcml0eUluZm8gZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQoQWNjb3VudCBhY2NvdW50TmFtZSwKKyAgICBwcml2YXRlIEF1dGhvcml0eUluZm8gZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQoQWNjb3VudCBhY2NvdW50TmFtZSwgaW50IHVzZXJJZCwKICAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHlOYW1lLCBpbnQgaWRlbnQsIGJvb2xlYW4gZG9Xcml0ZSkgewotICAgICAgICBBY2NvdW50SW5mbyBhY2NvdW50ID0gbUFjY291bnRzLmdldChhY2NvdW50TmFtZSk7CisgICAgICAgIEFjY291bnRBbmRVc2VyIGF1ID0gbmV3IEFjY291bnRBbmRVc2VyKGFjY291bnROYW1lLCB1c2VySWQpOworICAgICAgICBBY2NvdW50SW5mbyBhY2NvdW50ID0gbUFjY291bnRzLmdldChhdSk7CiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIGFjY291bnQgPSBuZXcgQWNjb3VudEluZm8oYWNjb3VudE5hbWUpOwotICAgICAgICAgICAgbUFjY291bnRzLnB1dChhY2NvdW50TmFtZSwgYWNjb3VudCk7CisgICAgICAgICAgICBhY2NvdW50ID0gbmV3IEFjY291bnRJbmZvKGF1KTsKKyAgICAgICAgICAgIG1BY2NvdW50cy5wdXQoYXUsIGFjY291bnQpOwogICAgICAgICB9CiAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gYWNjb3VudC5hdXRob3JpdGllcy5nZXQoYXV0aG9yaXR5TmFtZSk7CiAgICAgICAgIGlmIChhdXRob3JpdHkgPT0gbnVsbCkgewpAQCAtMTMyMyw5ICsxMzUyLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjcmVhdGVkIGEgbmV3IEF1dGhvcml0eUluZm8gZm9yICIgKyBhY2NvdW50TmFtZQotICAgICAgICAgICAgICAgICAgICArICIsIHByb3ZpZGVyICIgKyBhdXRob3JpdHlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgdXNlciAiICsgdXNlcklkCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIHByb3ZpZGVyICIgKyBhdXRob3JpdHlOYW1lKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dGhvcml0eSA9IG5ldyBBdXRob3JpdHlJbmZvKGFjY291bnROYW1lLCBhdXRob3JpdHlOYW1lLCBpZGVudCk7CisgICAgICAgICAgICBhdXRob3JpdHkgPSBuZXcgQXV0aG9yaXR5SW5mbyhhY2NvdW50TmFtZSwgdXNlcklkLCBhdXRob3JpdHlOYW1lLCBpZGVudCk7CiAgICAgICAgICAgICBhY2NvdW50LmF1dGhvcml0aWVzLnB1dChhdXRob3JpdHlOYW1lLCBhdXRob3JpdHkpOwogICAgICAgICAgICAgbUF1dGhvcml0aWVzLnB1dChpZGVudCwgYXV0aG9yaXR5KTsKICAgICAgICAgICAgIGlmIChkb1dyaXRlKSB7CkBAIC0xMzM2LDggKzEzNjYsOSBAQAogICAgICAgICByZXR1cm4gYXV0aG9yaXR5OwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCByZW1vdmVBdXRob3JpdHlMb2NrZWQoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5TmFtZSwgYm9vbGVhbiBkb1dyaXRlKSB7Ci0gICAgICAgIEFjY291bnRJbmZvIGFjY291bnRJbmZvID0gbUFjY291bnRzLmdldChhY2NvdW50KTsKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlQXV0aG9yaXR5TG9ja2VkKEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIGF1dGhvcml0eU5hbWUsCisgICAgICAgICAgICBib29sZWFuIGRvV3JpdGUpIHsKKyAgICAgICAgQWNjb3VudEluZm8gYWNjb3VudEluZm8gPSBtQWNjb3VudHMuZ2V0KG5ldyBBY2NvdW50QW5kVXNlcihhY2NvdW50LCB1c2VySWQpKTsKICAgICAgICAgaWYgKGFjY291bnRJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgIGZpbmFsIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5SW5mbyA9IGFjY291bnRJbmZvLmF1dGhvcml0aWVzLnJlbW92ZShhdXRob3JpdHlOYW1lKTsKICAgICAgICAgICAgIGlmIChhdXRob3JpdHlJbmZvICE9IG51bGwpIHsKQEAgLTE0MTksOCArMTQ1MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBTdHJpbmcgdGFnTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CiAgICAgICAgICAgICBpZiAoImFjY291bnRzIi5lcXVhbHModGFnTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGlzdGVuID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgImxpc3Rlbi1mb3ItdGlja2xlcyIpOworICAgICAgICAgICAgICAgIFN0cmluZyBsaXN0ZW4gPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgWE1MX0FUVFJfTElTVEVOX0ZPUl9USUNLTEVTKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmVyc2lvbiIpOwogICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uOwogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC0xNDI4LDE0ICsxNDU4LDE0IEBACiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IDA7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBuZXh0SWRTdHJpbmcgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgIm5leHRBdXRob3JpdHlJZCIpOworICAgICAgICAgICAgICAgIFN0cmluZyBuZXh0SWRTdHJpbmcgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgWE1MX0FUVFJfTkVYVF9BVVRIT1JJVFlfSUQpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBpZCA9IChuZXh0SWRTdHJpbmcgPT0gbnVsbCkgPyAwIDogSW50ZWdlci5wYXJzZUludChuZXh0SWRTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICBtTmV4dEF1dGhvcml0eUlkID0gTWF0aC5tYXgobU5leHRBdXRob3JpdHlJZCwgaWQpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGNhcmUKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5ID0gbGlzdGVuID09IG51bGwgfHwgQm9vbGVhbi5wYXJzZUJvb2xlYW4obGlzdGVuKTsKKyAgICAgICAgICAgICAgICBtTWFzdGVyU3luY0F1dG9tYXRpY2FsbHkucHV0KDAsIGxpc3RlbiA9PSBudWxsIHx8IEJvb2xlYW4ucGFyc2VCb29sZWFuKGxpc3RlbikpOwogICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IHBhcnNlci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBudWxsOwogICAgICAgICAgICAgICAgIFBhaXI8QnVuZGxlLCBMb25nPiBwZXJpb2RpY1N5bmMgPSBudWxsOwpAQCAtMTQ0OSw2ICsxNDc5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhvcml0eS5pZGVudCA+IGhpZ2hlc3RBdXRob3JpdHlJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdEF1dGhvcml0eUlkID0gYXV0aG9yaXR5LmlkZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxfVEFHX0xJU1RFTl9GT1JfVElDS0xFUy5lcXVhbHModGFnTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VMaXN0ZW5Gb3JUaWNrbGVzKHBhcnNlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJzZXIuZ2V0RGVwdGgoKSA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJwZXJpb2RpY1N5bmMiLmVxdWFscyh0YWdOYW1lKSAmJiBhdXRob3JpdHkgIT0gbnVsbCkgewpAQCAtMTUxMSwyNSArMTU0Myw0MSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSByZWNvcmQgb2YgdGhpcyBuZXcgYXV0aG9yaXR5IHRoZW4gZG9uJ3QgY29weSBvdmVyIHRoZSBzZXR0aW5ncwotICAgICAgICAgICAgaWYgKGdldEF1dGhvcml0eUxvY2tlZChhdXRob3JpdHkuYWNjb3VudCwgbmV3QXV0aG9yaXR5TmFtZSwgImNsZWFudXAiKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZ2V0QXV0aG9yaXR5TG9ja2VkKGF1dGhvcml0eS5hY2NvdW50LCBhdXRob3JpdHkudXNlcklkLCBuZXdBdXRob3JpdHlOYW1lLCAiY2xlYW51cCIpCisgICAgICAgICAgICAgICAgICAgICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBuZXdBdXRob3JpdHkgPSBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZChhdXRob3JpdHkuYWNjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgbmV3QXV0aG9yaXR5TmFtZSwgLTEgLyogaWRlbnQgKi8sIGZhbHNlIC8qIGRvV3JpdGUgKi8pOworICAgICAgICAgICAgICAgICAgICBhdXRob3JpdHkudXNlcklkLCBuZXdBdXRob3JpdHlOYW1lLCAtMSAvKiBpZGVudCAqLywgZmFsc2UgLyogZG9Xcml0ZSAqLyk7CiAgICAgICAgICAgICBuZXdBdXRob3JpdHkuZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICB3cml0ZU5lZWRlZCA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKEF1dGhvcml0eUluZm8gYXV0aG9yaXR5SW5mbyA6IGF1dGhvcml0aWVzVG9SZW1vdmUpIHsKLSAgICAgICAgICAgIHJlbW92ZUF1dGhvcml0eUxvY2tlZChhdXRob3JpdHlJbmZvLmFjY291bnQsIGF1dGhvcml0eUluZm8uYXV0aG9yaXR5LAotICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb1dyaXRlICovKTsKKyAgICAgICAgICAgIHJlbW92ZUF1dGhvcml0eUxvY2tlZChhdXRob3JpdHlJbmZvLmFjY291bnQsIGF1dGhvcml0eUluZm8udXNlcklkLAorICAgICAgICAgICAgICAgICAgICBhdXRob3JpdHlJbmZvLmF1dGhvcml0eSwgZmFsc2UgLyogZG9Xcml0ZSAqLyk7CiAgICAgICAgICAgICB3cml0ZU5lZWRlZCA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gd3JpdGVOZWVkZWQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlTGlzdGVuRm9yVGlja2xlcyhYbWxQdWxsUGFyc2VyIHBhcnNlcikgeworICAgICAgICBTdHJpbmcgdXNlciA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBYTUxfQVRUUl9VU0VSKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1c2VySWQgPSBJbnRlZ2VyLnBhcnNlSW50KHVzZXIpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXJyb3IgcGFyc2luZyB0aGUgdXNlciBmb3IgbGlzdGVuLWZvci10aWNrbGVzIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgInRoZSB1c2VyIGluIGxpc3Rlbi1mb3ItdGlja2xlcyBpcyBudWxsIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGVuYWJsZWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgWE1MX0FUVFJfRU5BQkxFRCk7CisgICAgICAgIGJvb2xlYW4gbGlzdGVuID0gZW5hYmxlZCA9PSBudWxsIHx8IEJvb2xlYW4ucGFyc2VCb29sZWFuKGVuYWJsZWQpOworICAgICAgICBtTWFzdGVyU3luY0F1dG9tYXRpY2FsbHkucHV0KHVzZXJJZCwgbGlzdGVuKTsKKyAgICB9CisKICAgICBwcml2YXRlIEF1dGhvcml0eUluZm8gcGFyc2VBdXRob3JpdHkoWG1sUHVsbFBhcnNlciBwYXJzZXIsIGludCB2ZXJzaW9uKSB7CiAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gbnVsbDsKICAgICAgICAgaW50IGlkID0gLTE7CkBAIC0xNTQzLDEwICsxNTkxLDEyIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGlkID49IDApIHsKICAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHlOYW1lID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJhdXRob3JpdHkiKTsKLSAgICAgICAgICAgIFN0cmluZyBlbmFibGVkID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJlbmFibGVkIik7CisgICAgICAgICAgICBTdHJpbmcgZW5hYmxlZCA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBYTUxfQVRUUl9FTkFCTEVEKTsKICAgICAgICAgICAgIFN0cmluZyBzeW5jYWJsZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAic3luY2FibGUiKTsKICAgICAgICAgICAgIFN0cmluZyBhY2NvdW50TmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAiYWNjb3VudCIpOwogICAgICAgICAgICAgU3RyaW5nIGFjY291bnRUeXBlID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ0eXBlIik7CisgICAgICAgICAgICBTdHJpbmcgdXNlciA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBYTUxfQVRUUl9VU0VSKTsKKyAgICAgICAgICAgIGludCB1c2VySWQgPSB1c2VyID09IG51bGwgPyAwIDogSW50ZWdlci5wYXJzZUludCh1c2VyKTsKICAgICAgICAgICAgIGlmIChhY2NvdW50VHlwZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYWNjb3VudFR5cGUgPSAiY29tLmdvb2dsZSI7CiAgICAgICAgICAgICAgICAgc3luY2FibGUgPSAidW5rbm93biI7CkBAIC0xNTU0LDEyICsxNjA0LDEzIEBACiAgICAgICAgICAgICBhdXRob3JpdHkgPSBtQXV0aG9yaXRpZXMuZ2V0KGlkKTsKICAgICAgICAgICAgIGlmIChERUJVR19GSUxFKSBMb2cudihUQUcsICJBZGRpbmcgYXV0aG9yaXR5OiBhY2NvdW50PSIKICAgICAgICAgICAgICAgICAgICAgKyBhY2NvdW50TmFtZSArICIgYXV0aD0iICsgYXV0aG9yaXR5TmFtZQorICAgICAgICAgICAgICAgICAgICArICIgdXNlcj0iICsgdXNlcklkCiAgICAgICAgICAgICAgICAgICAgICsgIiBlbmFibGVkPSIgKyBlbmFibGVkCiAgICAgICAgICAgICAgICAgICAgICsgIiBzeW5jYWJsZT0iICsgc3luY2FibGUpOwogICAgICAgICAgICAgaWYgKGF1dGhvcml0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0ZJTEUpIExvZy52KFRBRywgIkNyZWF0aW5nIGVudHJ5Iik7CiAgICAgICAgICAgICAgICAgYXV0aG9yaXR5ID0gZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWNjb3VudChhY2NvdW50TmFtZSwgYWNjb3VudFR5cGUpLCBhdXRob3JpdHlOYW1lLCBpZCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjY291bnQoYWNjb3VudE5hbWUsIGFjY291bnRUeXBlKSwgdXNlcklkLCBhdXRob3JpdHlOYW1lLCBpZCwgZmFsc2UpOwogICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2ZXJzaW9uIGlzIDAgdGhlbiB3ZSBhcmUgdXBncmFkaW5nIGZyb20gYSBmaWxlIGZvcm1hdCB0aGF0IGRpZCBub3QKICAgICAgICAgICAgICAgICAvLyBrbm93IGFib3V0IHBlcmlvZGljIHN5bmNzLiBJbiB0aGF0IGNhc2UgZG9uJ3QgY2xlYXIgdGhlIGxpc3Qgc2luY2Ugd2UKICAgICAgICAgICAgICAgICAvLyB3YW50IHRoZSBkZWZhdWx0LCB3aGljaCBpcyBhIGRhaWx5IHBlcmlvZGlvYyBzeW5jLgpAQCAtMTY1Myw5ICsxNzA0LDE3IEBACiAKICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiYWNjb3VudHMiKTsKICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZlcnNpb24iLCBJbnRlZ2VyLnRvU3RyaW5nKEFDQ09VTlRTX1ZFUlNJT04pKTsKLSAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgIm5leHRBdXRob3JpdHlJZCIsIEludGVnZXIudG9TdHJpbmcobU5leHRBdXRob3JpdHlJZCkpOwotICAgICAgICAgICAgaWYgKCFtTWFzdGVyU3luY0F1dG9tYXRpY2FsbHkpIHsKLSAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsaXN0ZW4tZm9yLXRpY2tsZXMiLCAiZmFsc2UiKTsKKyAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgWE1MX0FUVFJfTkVYVF9BVVRIT1JJVFlfSUQsIEludGVnZXIudG9TdHJpbmcobU5leHRBdXRob3JpdHlJZCkpOworCisgICAgICAgICAgICAvLyBXcml0ZSB0aGUgU3luYyBBdXRvbWF0aWNhbGx5IGZsYWdzIGZvciBlYWNoIHVzZXIKKyAgICAgICAgICAgIGZpbmFsIGludCBNID0gbU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgTTsgbSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHVzZXJJZCA9IG1NYXN0ZXJTeW5jQXV0b21hdGljYWxseS5rZXlBdChtKTsKKyAgICAgICAgICAgICAgICBCb29sZWFuIGxpc3RlbiA9IG1NYXN0ZXJTeW5jQXV0b21hdGljYWxseS52YWx1ZUF0KG0pOworICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCBYTUxfVEFHX0xJU1RFTl9GT1JfVElDS0xFUyk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCBYTUxfQVRUUl9VU0VSLCBJbnRlZ2VyLnRvU3RyaW5nKHVzZXJJZCkpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgWE1MX0FUVFJfRU5BQkxFRCwgQm9vbGVhbi50b1N0cmluZyhsaXN0ZW4pKTsKKyAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsIFhNTF9UQUdfTElTVEVOX0ZPUl9USUNLTEVTKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQXV0aG9yaXRpZXMuc2l6ZSgpOwpAQCAtMTY2NCw5ICsxNzIzLDEwIEBACiAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJhdXRob3JpdHkiKTsKICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJpZCIsIEludGVnZXIudG9TdHJpbmcoYXV0aG9yaXR5LmlkZW50KSk7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAiYWNjb3VudCIsIGF1dGhvcml0eS5hY2NvdW50Lm5hbWUpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgWE1MX0FUVFJfVVNFUiwgSW50ZWdlci50b1N0cmluZyhhdXRob3JpdHkudXNlcklkKSk7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidHlwZSIsIGF1dGhvcml0eS5hY2NvdW50LnR5cGUpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImF1dGhvcml0eSIsIGF1dGhvcml0eS5hdXRob3JpdHkpOwotICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImVuYWJsZWQiLCBCb29sZWFuLnRvU3RyaW5nKGF1dGhvcml0eS5lbmFibGVkKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCBYTUxfQVRUUl9FTkFCTEVELCBCb29sZWFuLnRvU3RyaW5nKGF1dGhvcml0eS5lbmFibGVkKSk7CiAgICAgICAgICAgICAgICAgaWYgKGF1dGhvcml0eS5zeW5jYWJsZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAic3luY2FibGUiLCAidW5rbm93biIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNzg4LDcgKzE4NDgsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXR5TmFtZSA9IGMuZ2V0U3RyaW5nKGMuZ2V0Q29sdW1uSW5kZXgoImF1dGhvcml0eSIpKTsKICAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IHRoaXMuZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWNjb3VudChhY2NvdW50TmFtZSwgYWNjb3VudFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjY291bnQoYWNjb3VudE5hbWUsIGFjY291bnRUeXBlKSwgMCAvKiBsZWdhY3kgaXMgc2luZ2xlLXVzZXIgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdHlOYW1lLCAtMSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChhdXRob3JpdHkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IG1TeW5jU3RhdHVzLnNpemUoKTsKQEAgLTE4MzMsNyArMTg5Myw3IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYy5nZXRTdHJpbmcoYy5nZXRDb2x1bW5JbmRleCgidmFsdWUiKSk7CiAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJsaXN0ZW5fZm9yX3RpY2tsZXMiKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseSh2YWx1ZSA9PSBudWxsIHx8IEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIHNldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KHZhbHVlID09IG51bGwgfHwgQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpLCAwKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgic3luY19wcm92aWRlcl8iKSkgewogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdmlkZXIgPSBuYW1lLnN1YnN0cmluZygic3luY19wcm92aWRlcl8iLmxlbmd0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUubGVuZ3RoKCkpOwpAQCAtMTk2NCw3ICsyMDI0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBQZW5kaW5nT3BlcmF0aW9uIG9wID0gbmV3IFBlbmRpbmdPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5LmFjY291bnQsIHN5bmNTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5LmFjY291bnQsIGF1dGhvcml0eS51c2VySWQsIHN5bmNTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5LmF1dGhvcml0eSwgZXh0cmFzLCBleHBlZGl0ZWQpOwogICAgICAgICAgICAgICAgICAgICBvcC5hdXRob3JpdHlJZCA9IGF1dGhvcml0eUlkOwogICAgICAgICAgICAgICAgICAgICBvcC5mbGF0RXh0cmFzID0gZmxhdEV4dHJhczsKQEAgLTIwODQsNiArMjE0NCwxOSBAQAogICAgICAgICByZXR1cm4gYnVuZGxlOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0U3luYyhBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBhdXRob3JpdHksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBoYXBwZW5pbmcgaW4gdGhlIHN5c3RlbSBwcm9jZXNzLCB0aGVuIGNhbGwgdGhlIHN5bmNyZXF1ZXN0IGxpc3RlbmVyCisgICAgICAgIC8vIHRvIG1ha2UgYSByZXF1ZXN0IGJhY2sgdG8gdGhlIFN5bmNNYW5hZ2VyIGRpcmVjdGx5LgorICAgICAgICAvLyBJZiB0aGlzIGlzIHByb2JhYmx5IGEgdGVzdCBpbnN0YW5jZSwgdGhlbiBjYWxsIGJhY2sgdGhyb3VnaCB0aGUgQ29udGVudFJlc29sdmVyCisgICAgICAgIC8vIHdoaWNoIHdpbGwga25vdyB3aGljaCB1c2VySWQgdG8gYXBwbHkgYmFzZWQgb24gdGhlIEJpbmRlciBpZC4KKyAgICAgICAgaWYgKGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpID09IGFuZHJvaWQub3MuUHJvY2Vzcy5TWVNURU1fVUlECisgICAgICAgICAgICAgICAgJiYgbVN5bmNSZXF1ZXN0TGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN5bmNSZXF1ZXN0TGlzdGVuZXIub25TeW5jUmVxdWVzdChhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSwgZXh0cmFzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlci5yZXF1ZXN0U3luYyhhY2NvdW50LCBhdXRob3JpdHksIGV4dHJhcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUSVNUSUNTX0ZJTEVfRU5EID0gMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUSVNUSUNTX0ZJTEVfSVRFTV9PTEQgPSAxMDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElTVElDU19GSUxFX0lURU0gPSAxMDE7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEKaW5kZXggMDZjNmM2ZS4uNmFkOGZlMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YQpAQCAtMTgsNiArMTgsOCBAQAogCiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CkBAIC0xMjgsMTAgKzEzMCwxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVUcnVzdFN0b3JhZ2VVcGRhdGUoKSB7CiAKLSAgICAgICAgWDUwOVRydXN0TWFuYWdlciB4NTA5VHJ1c3RNYW5hZ2VyID0gU1NMUGFyYW1ldGVyc0ltcGwuZ2V0RGVmYXVsdFRydXN0TWFuYWdlcigpOwotICAgICAgICBpZiggeDUwOVRydXN0TWFuYWdlciBpbnN0YW5jZW9mIFRydXN0TWFuYWdlckltcGwgKSB7Ci0gICAgICAgICAgICBUcnVzdE1hbmFnZXJJbXBsIHRydXN0TWFuYWdlciA9IChUcnVzdE1hbmFnZXJJbXBsKSB4NTA5VHJ1c3RNYW5hZ2VyOwotICAgICAgICAgICAgdHJ1c3RNYW5hZ2VyLmhhbmRsZVRydXN0U3RvcmFnZVVwZGF0ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgWDUwOVRydXN0TWFuYWdlciB4NTA5VHJ1c3RNYW5hZ2VyID0gU1NMUGFyYW1ldGVyc0ltcGwuZ2V0RGVmYXVsdFRydXN0TWFuYWdlcigpOworICAgICAgICAgICAgaWYoIHg1MDlUcnVzdE1hbmFnZXIgaW5zdGFuY2VvZiBUcnVzdE1hbmFnZXJJbXBsICkgeworICAgICAgICAgICAgICAgIFRydXN0TWFuYWdlckltcGwgdHJ1c3RNYW5hZ2VyID0gKFRydXN0TWFuYWdlckltcGwpIHg1MDlUcnVzdE1hbmFnZXI7CisgICAgICAgICAgICAgICAgdHJ1c3RNYW5hZ2VyLmhhbmRsZVRydXN0U3RvcmFnZVVwZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIGlnbm9yZWQpIHsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTY1LDcgKzE3MCw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTU0xQYXJhbWV0ZXJzSW1wbC5nZXREZWZhdWx0VHJ1c3RNYW5hZ2VyKCkuY2hlY2tTZXJ2ZXJUcnVzdGVkKGNoYWluLCBhdXRoVHlwZSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgIC8vIE5vIGVycm9ycy4KLSAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgaWYgKEh0dHBMb2cuTE9HVikgewogICAgICAgICAgICAgICAgIEh0dHBMb2cudigiZmFpbGVkIHRvIHZhbGlkYXRlIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiwgZXJyb3I6ICIgKwogICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEKaW5kZXggYTBhZDljMC4uNzU5YmU5MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1N0cmljdE1vZGUuamF2YQpAQCAtMTA5LDcgKzEwOSw3IEBACiAgKiBlZmZvcnQgbWVjaGFuaXNtLiAgTm90YWJseSwgZGlzayBvciBuZXR3b3JrIGFjY2VzcyBmcm9tIEpOSSBjYWxscwogICogd29uJ3QgbmVjZXNzYXJpbHkgdHJpZ2dlciBpdC4gIEZ1dHVyZSB2ZXJzaW9ucyBvZiBBbmRyb2lkIG1heSBjYXRjaAogICogbW9yZSAob3IgZmV3ZXIpIG9wZXJhdGlvbnMsIHNvIHlvdSBzaG91bGQgbmV2ZXIgbGVhdmUgU3RyaWN0TW9kZQotICogZW5hYmxlZCBpbiBzaGlwcGluZyBhcHBsaWNhdGlvbnMgb24gdGhlIEFuZHJvaWQgTWFya2V0LgorICogZW5hYmxlZCBpbiBhcHBsaWNhdGlvbnMgZGlzdHJpYnV0ZWQgb24gR29vZ2xlIFBsYXkuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpY3RNb2RlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0cmljdE1vZGUiOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKaW5kZXggYjQyNDE3YS4uYmM2NTk0YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCkBAIC0yNjQ0LDEwICsyNjQ0LDEwIEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZXRoZXIgdGhlIHBhY2thZ2UgaW5zdGFsbGVyIHNob3VsZCBhbGxvdyBpbnN0YWxsYXRpb24gb2YgYXBwcyBkb3dubG9hZGVkIGZyb20KLSAgICAgICAgICogc291cmNlcyBvdGhlciB0aGFuIHRoZSBBbmRyb2lkIE1hcmtldCAodmVuZGluZyBtYWNoaW5lKS4KKyAgICAgICAgICogc291cmNlcyBvdGhlciB0aGFuIEdvb2dsZSBQbGF5LgogICAgICAgICAgKgogICAgICAgICAgKiAxID0gYWxsb3cgaW5zdGFsbGluZyBmcm9tIG90aGVyIHNvdXJjZXMKLSAgICAgICAgICogMCA9IG9ubHkgYWxsb3cgaW5zdGFsbGluZyBmcm9tIHRoZSBBbmRyb2lkIE1hcmtldAorICAgICAgICAgKiAwID0gb25seSBhbGxvdyBpbnN0YWxsaW5nIGZyb20gR29vZ2xlIFBsYXkKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RBTExfTk9OX01BUktFVF9BUFBTID0gImluc3RhbGxfbm9uX21hcmtldF9hcHBzIjsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93LmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lXaW5kb3cuYWlkbAppbmRleCA3MTVmYTdiLi40OTdiYzkwYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93LmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93LmFpZGwKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgICAgIGJvb2xlYW4gcmVwb3J0RHJhdywgaW4gQ29uZmlndXJhdGlvbiBuZXdDb25maWcpOwogICAgIHZvaWQgZGlzcGF0Y2hBcHBWaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSk7CiAgICAgdm9pZCBkaXNwYXRjaEdldE5ld1N1cmZhY2UoKTsKKyAgICB2b2lkIGRpc3BhdGNoU2NyZWVuU3RhdGUoYm9vbGVhbiBvbik7CiAKICAgICAvKioKICAgICAgKiBUZWxsIHRoZSB3aW5kb3cgdGhhdCBpdCBpcyBlaXRoZXIgZ2FpbmluZyBvciBsb3NpbmcgZm9jdXMuICBLZWVwIGl0IHVwCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCmluZGV4IDBjNzZlOGYuLmE2NTEzNjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCkBAIC0xOTk0LDYgKzE5OTQsMjAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5EX1ZJRVdTX1dJVEhfQUNDRVNTSUJJTElUWV9OT0RFX1BST1ZJREVSUyA9IDB4MDAwMDAwMDQ7CiAKICAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2NyZWVuIGhhcyBjaGFuZ2VkIHN0YXRlIGFuZCBpcyBub3cgb2ZmLgorICAgICAqCisgICAgICogQHNlZSAjb25TY3JlZW5TdGF0ZUNoYW5nZWQoaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTl9TVEFURV9PRkYgPSAweDA7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2NyZWVuIGhhcyBjaGFuZ2VkIHN0YXRlIGFuZCBpcyBub3cgb24uCisgICAgICoKKyAgICAgKiBAc2VlICNvblNjcmVlblN0YXRlQ2hhbmdlZChpbnQpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NSRUVOX1NUQVRFX09OID0gMHgxOworCisgICAgLyoqCiAgICAgICogQ29udHJvbHMgdGhlIG92ZXItc2Nyb2xsIG1vZGUgZm9yIHRoaXMgdmlldy4KICAgICAgKiBTZWUge0BsaW5rICNvdmVyU2Nyb2xsQnkoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGJvb2xlYW4pfSwKICAgICAgKiB7QGxpbmsgI09WRVJfU0NST0xMX0FMV0FZU30sIHtAbGluayAjT1ZFUl9TQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTfSwKQEAgLTMwOTMsMTMgKzMxMDcsMTMgQEAKICAgICAgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShiYWNrZ3JvdW5kKTsKICAgICAgICAgfQogCi0gICAgICAgIG1Vc2VyUGFkZGluZ1JlbGF0aXZlID0gKHN0YXJ0UGFkZGluZyA+PSAwIHx8IGVuZFBhZGRpbmcgPj0gMCk7Ci0KICAgICAgICAgLy8gQ2FjaGUgdXNlciBwYWRkaW5nIGFzIHdlIGNhbm5vdCBmdWxseSByZXNvbHZlIHBhZGRpbmcgaGVyZSAod2UgZG9udCBoYXZlIHlldCB0aGUgcmVzb2x2ZWQKICAgICAgICAgLy8gbGF5b3V0IGRpcmVjdGlvbikuIFRob3NlIGNhY2hlZCB2YWx1ZXMgd2lsbCBiZSB1c2VkIGxhdGVyIGR1cmluZyBwYWRkaW5nIHJlc29sdXRpb24uCiAgICAgICAgIG1Vc2VyUGFkZGluZ1N0YXJ0ID0gc3RhcnRQYWRkaW5nOwogICAgICAgICBtVXNlclBhZGRpbmdFbmQgPSBlbmRQYWRkaW5nOwogCisgICAgICAgIHVwZGF0ZVVzZXJQYWRkaW5nUmVsYXRpdmUoKTsKKwogICAgICAgICBpZiAocGFkZGluZyA+PSAwKSB7CiAgICAgICAgICAgICBsZWZ0UGFkZGluZyA9IHBhZGRpbmc7CiAgICAgICAgICAgICB0b3BQYWRkaW5nID0gcGFkZGluZzsKQEAgLTMxNDYsNiArMzE2MCwxMCBAQAogICAgICAgICBjb21wdXRlT3BhcXVlRmxhZ3MoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlVXNlclBhZGRpbmdSZWxhdGl2ZSgpIHsKKyAgICAgICAgbVVzZXJQYWRkaW5nUmVsYXRpdmUgPSAobVVzZXJQYWRkaW5nU3RhcnQgPj0gMCB8fCBtVXNlclBhZGRpbmdFbmQgPj0gMCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTm9uLXB1YmxpYyBjb25zdHJ1Y3RvciBmb3IgdXNlIGluIHRlc3RpbmcKICAgICAgKi8KQEAgLTk2NDcsNiArOTY2NSwyNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBzZWUgI29uU2NyZWVuU3RhdGVDaGFuZ2VkKGludCkKKyAgICAgKi8KKyAgICB2b2lkIGRpc3BhdGNoU2NyZWVuU3RhdGVDaGFuZ2VkKGludCBzY3JlZW5TdGF0ZSkgeworICAgICAgICBvblNjcmVlblN0YXRlQ2hhbmdlZChzY3JlZW5TdGF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBzdGF0ZSBvZiB0aGUgc2NyZWVuIHRoaXMgdmlldyBpcworICAgICAqIGF0dGFjaGVkIHRvIGNoYW5nZXMuIEEgc3RhdGUgY2hhbmdlIHdpbGwgdXN1YWxseSBvY2N1cnMgd2hlbiB0aGUgc2NyZWVuCisgICAgICogdHVybnMgb24gb3Igb2ZmICh3aGV0aGVyIGl0IGhhcHBlbnMgYXV0b21hdGljYWxseSBvciB0aGUgdXNlciBkb2VzIGl0CisgICAgICogbWFudWFsbHkuKQorICAgICAqCisgICAgICogQHBhcmFtIHNjcmVlblN0YXRlIFRoZSBuZXcgc3RhdGUgb2YgdGhlIHNjcmVlbi4gQ2FuIGJlIGVpdGhlcgorICAgICAqICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI1NDUkVFTl9TVEFURV9PTn0gb3Ige0BsaW5rICNTQ1JFRU5fU1RBVEVfT0ZGfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2NyZWVuU3RhdGVDaGFuZ2VkKGludCBzY3JlZW5TdGF0ZSkgeworICAgIH0KKworICAgIC8qKgogICAgICAqIFJlc29sdmUgYW5kIGNhY2hlIHRoZSBsYXlvdXQgZGlyZWN0aW9uLiBMVFIgaXMgc2V0IGluaXRpYWxseS4gVGhpcyBpcyBpbXBsaWNpdGx5IHN1cHBvc2luZwogICAgICAqIHRoYXQgdGhlIHBhcmVudCBkaXJlY3Rpb25hbGl0eSBjYW4gYW5kIHdpbGwgYmUgcmVzb2x2ZWQgYmVmb3JlIGl0cyBjaGlsZHJlbi4KICAgICAgKi8KQEAgLTk2OTEsNiArOTcyOCw4IEBACiAgICAgICAgIC8vIFNldCB0byByZXNvbHZlZAogICAgICAgICBtUHJpdmF0ZUZsYWdzMiB8PSBMQVlPVVRfRElSRUNUSU9OX1JFU09MVkVEOwogICAgICAgICBvblJlc29sdmVkTGF5b3V0RGlyZWN0aW9uQ2hhbmdlZCgpOworICAgICAgICAvLyBSZXNvbHZlIHBhZGRpbmcKKyAgICAgICAgcmVzb2x2ZVBhZGRpbmcoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk3NDUsNyArOTc4NCwxMSBAQAogCiAgICAgICAgIG1Vc2VyUGFkZGluZ0JvdHRvbSA9IChtVXNlclBhZGRpbmdCb3R0b20gPj0gMCkgPyBtVXNlclBhZGRpbmdCb3R0b20gOiBtUGFkZGluZ0JvdHRvbTsKIAotICAgICAgICByZWNvbXB1dGVQYWRkaW5nKCk7CisgICAgICAgIGlmKGlzUGFkZGluZ1JlbGF0aXZlKCkpIHsKKyAgICAgICAgICAgIHNldFBhZGRpbmdSZWxhdGl2ZShtVXNlclBhZGRpbmdTdGFydCwgbVBhZGRpbmdUb3AsIG1Vc2VyUGFkZGluZ0VuZCwgbVVzZXJQYWRkaW5nQm90dG9tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY29tcHV0ZVBhZGRpbmcoKTsKKyAgICAgICAgfQogICAgICAgICBvblBhZGRpbmdDaGFuZ2VkKHJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKTsKICAgICB9CiAKQEAgLTEyMjgyLDE1ICsxMjMyNSwyMCBAQAogICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBwYWRkaW5nIGluIHBpeGVscwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBhZGRpbmcoaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgewotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQorICAgICAgICBtVXNlclBhZGRpbmdTdGFydCA9IC0xOworICAgICAgICBtVXNlclBhZGRpbmdFbmQgPSAtMTsKICAgICAgICAgbVVzZXJQYWRkaW5nUmVsYXRpdmUgPSBmYWxzZTsKIAorICAgICAgICBpbnRlcm5hbFNldFBhZGRpbmcobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW50ZXJuYWxTZXRQYWRkaW5nKGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKICAgICAgICAgbVVzZXJQYWRkaW5nTGVmdCA9IGxlZnQ7CiAgICAgICAgIG1Vc2VyUGFkZGluZ1JpZ2h0ID0gcmlnaHQ7CiAgICAgICAgIG1Vc2VyUGFkZGluZ0JvdHRvbSA9IGJvdHRvbTsKIAogICAgICAgICBmaW5hbCBpbnQgdmlld0ZsYWdzID0gbVZpZXdGbGFnczsKKyAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CiAKICAgICAgICAgLy8gQ29tbW9uIGNhc2UgaXMgdGhlcmUgYXJlIG5vIHNjcm9sbCBiYXJzLgogICAgICAgICBpZiAoKHZpZXdGbGFncyAmIChTQ1JPTExCQVJTX1ZFUlRJQ0FMfFNDUk9MTEJBUlNfSE9SSVpPTlRBTCkpICE9IDApIHsKQEAgLTEyMzU5LDE4ICsxMjQwNywxNyBAQAogICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBwYWRkaW5nIGluIHBpeGVscwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBhZGRpbmdSZWxhdGl2ZShpbnQgc3RhcnQsIGludCB0b3AsIGludCBlbmQsIGludCBib3R0b20pIHsKLSAgICAgICAgbVVzZXJQYWRkaW5nUmVsYXRpdmUgPSB0cnVlOwotCiAgICAgICAgIG1Vc2VyUGFkZGluZ1N0YXJ0ID0gc3RhcnQ7CiAgICAgICAgIG1Vc2VyUGFkZGluZ0VuZCA9IGVuZDsKKyAgICAgICAgbVVzZXJQYWRkaW5nUmVsYXRpdmUgPSB0cnVlOwogCiAgICAgICAgIHN3aXRjaChnZXRSZXNvbHZlZExheW91dERpcmVjdGlvbigpKSB7CiAgICAgICAgICAgICBjYXNlIExBWU9VVF9ESVJFQ1RJT05fUlRMOgotICAgICAgICAgICAgICAgIHNldFBhZGRpbmcoZW5kLCB0b3AsIHN0YXJ0LCBib3R0b20pOworICAgICAgICAgICAgICAgIGludGVybmFsU2V0UGFkZGluZyhlbmQsIHRvcCwgc3RhcnQsIGJvdHRvbSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIExBWU9VVF9ESVJFQ1RJT05fTFRSOgogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzZXRQYWRkaW5nKHN0YXJ0LCB0b3AsIGVuZCwgYm90dG9tKTsKKyAgICAgICAgICAgICAgICBpbnRlcm5hbFNldFBhZGRpbmcoc3RhcnQsIHRvcCwgZW5kLCBib3R0b20pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDkyMCw2ICsxNDk2Nyw4IEBACiAgICAgICAgIGJvb2xlYW4gbUhhcmR3YXJlQWNjZWxlcmF0aW9uUmVxdWVzdGVkOwogICAgICAgICBIYXJkd2FyZVJlbmRlcmVyIG1IYXJkd2FyZVJlbmRlcmVyOwogCisgICAgICAgIGJvb2xlYW4gbVNjcmVlbk9uOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTY2FsZSBmYWN0b3IgdXNlZCBieSB0aGUgY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKaW5kZXggMGM2MzI4Ni4uYzllMDI0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCkBAIC0yMjU0LDYgKzIyNTQsMTcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGRpc3BhdGNoU2NyZWVuU3RhdGVDaGFuZ2VkKGludCBzY3JlZW5TdGF0ZSkgeworICAgICAgICBzdXBlci5kaXNwYXRjaFNjcmVlblN0YXRlQ2hhbmdlZChzY3JlZW5TdGF0ZSk7CisKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CisgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjaGlsZHJlbltpXS5kaXNwYXRjaFNjcmVlblN0YXRlQ2hhbmdlZChzY3JlZW5TdGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBib29sZWFuIGRpc3BhdGNoUG9wdWxhdGVBY2Nlc3NpYmlsaXR5RXZlbnRJbnRlcm5hbChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gc3VwZXIuZGlzcGF0Y2hQb3B1bGF0ZUFjY2Vzc2liaWxpdHlFdmVudEludGVybmFsKGV2ZW50KTsKICAgICAgICAgaWYgKGhhbmRsZWQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3RJbXBsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290SW1wbC5qYXZhCmluZGV4IDc5MDU4MjcuLjcyMzY1YzcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3RJbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdEltcGwuamF2YQpAQCAtNDYsNiArNDYsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwpAQCAtMzkwLDYgKzM5MSw5IEBACiAgICAgICAgIG1Qcm9maWxlUmVuZGVyaW5nID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oCiAgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5nZXQoUFJPUEVSVFlfUFJPRklMRV9SRU5ERVJJTkcsICJmYWxzZSIpKTsKICAgICAgICAgbUNob3Jlb2dyYXBoZXIgPSBDaG9yZW9ncmFwaGVyLmdldEluc3RhbmNlKCk7CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOworICAgICAgICBtQXR0YWNoSW5mby5tU2NyZWVuT24gPSBwb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzU3LDYgKzc2MSwxOSBAQAogICAgICAgICBzY2hlZHVsZVRyYXZlcnNhbHMoKTsKICAgICB9CiAKKyAgICB2b2lkIGhhbmRsZVNjcmVlblN0YXRlQ2hhbmdlKGJvb2xlYW4gb24pIHsKKyAgICAgICAgaWYgKG9uICE9IG1BdHRhY2hJbmZvLm1TY3JlZW5PbikgeworICAgICAgICAgICAgbUF0dGFjaEluZm8ubVNjcmVlbk9uID0gb247CisgICAgICAgICAgICBpZiAobVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1WaWV3LmRpc3BhdGNoU2NyZWVuU3RhdGVDaGFuZ2VkKG9uID8gVmlldy5TQ1JFRU5fU1RBVEVfT04gOiBWaWV3LlNDUkVFTl9TVEFURV9PRkYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9uKSB7CisgICAgICAgICAgICAgICAgbUZ1bGxSZWRyYXdOZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNjaGVkdWxlVHJhdmVyc2FscygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwpAQCAtMTg4Niw2ICsxOTAzLDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcGVyZm9ybURyYXcoKSB7CisgICAgICAgIGlmICghbUF0dGFjaEluZm8ubVNjcmVlbk9uKSByZXR1cm47CisKICAgICAgICAgZmluYWwgbG9uZyBkcmF3U3RhcnRUaW1lOwogICAgICAgICBpZiAoVmlld0RlYnVnLkRFQlVHX0xBVEVOQ1kpIHsKICAgICAgICAgICAgIGRyYXdTdGFydFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKQEAgLTIwMTgsOCArMjAzNyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIWRpcnR5LmlzRW1wdHkoKSB8fCBtSXNBbmltYXRpbmcpIHsKLSAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlciAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAobUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIgIT0gbnVsbCAmJiBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5pc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIERyYXcgd2l0aCBoYXJkd2FyZSByZW5kZXJlci4KICAgICAgICAgICAgICAgICBtSXNBbmltYXRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtSGFyZHdhcmVZT2Zmc2V0ID0geW9mZjsKQEAgLTI0ODUsNiArMjUwMyw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1TR19GSU5EX0FDQ0VTU0lCTElUWV9OT0RFX0lORk9fQllfVklFV19JRCA9IDIxOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNU0dfRklORF9BQ0NFU1NJQkxJVFlfTk9ERV9JTkZPX0JZX1RFWFQgPSAyMjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTVNHX1BST0NFU1NfSU5QVVRfRVZFTlRTID0gMjM7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1TR19ESVNQQVRDSF9TQ1JFRU5fU1RBVEUgPSAyNDsKIAogICAgIGZpbmFsIGNsYXNzIFZpZXdSb290SGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewogICAgICAgICBAT3ZlcnJpZGUKQEAgLTI3NDEsNiArMjc2MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlUZXh0VWlUaHJlYWQobXNnKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBNU0dfRElTUEFUQ0hfU0NSRUVOX1NUQVRFOiB7CisgICAgICAgICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2NyZWVuU3RhdGVDaGFuZ2UobXNnLmFyZzEgPT0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTQxMjEsNiArNDE0NSwxMiBAQAogICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU2NyZWVuU3RhdGVDaGFuZ2UoYm9vbGVhbiBvbikgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0RJU1BBVENIX1NDUkVFTl9TVEFURSk7CisgICAgICAgIG1zZy5hcmcxID0gb24gPyAxIDogMDsKKyAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaEdldE5ld1N1cmZhY2UoKSB7CiAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfRElTUEFUQ0hfR0VUX05FV19TVVJGQUNFKTsKICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKQEAgLTQzMjIsNiArNDM1MiwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hTY3JlZW5TdGF0ZShib29sZWFuIG9uKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3Um9vdEltcGwgdmlld0FuY2VzdG9yID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3QW5jZXN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXdBbmNlc3Rvci5kaXNwYXRjaFNjcmVlblN0YXRlQ2hhbmdlKG9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoR2V0TmV3U3VyZmFjZSgpIHsKICAgICAgICAgICAgIGZpbmFsIFZpZXdSb290SW1wbCB2aWV3QW5jZXN0b3IgPSBtVmlld0FuY2VzdG9yLmdldCgpOwogICAgICAgICAgICAgaWYgKHZpZXdBbmNlc3RvciAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L3RleHRzZXJ2aWNlL1NwZWxsQ2hlY2tlclNlc3Npb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvdGV4dHNlcnZpY2UvU3BlbGxDaGVja2VyU2Vzc2lvbi5qYXZhCmluZGV4IDkxMDVmMTkuLjZmZjNiOWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvdGV4dHNlcnZpY2UvU3BlbGxDaGVja2VyU2Vzc2lvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvdGV4dHNlcnZpY2UvU3BlbGxDaGVja2VyU2Vzc2lvbi5qYXZhCkBAIC0yODEsOSArMjgxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJHZXQgc3VnZ2VzdGlvbnMgZnJvbSB0aGUgc3BlbGwgY2hlY2tlci4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY3AubVRleHRJbmZvcy5sZW5ndGggIT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5vbkdldFNlbnRlbmNlU3VnZ2VzdGlvbnNNdWx0aXBsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcC5tVGV4dEluZm9zLCBzY3AubVN1Z2dlc3Rpb25zTGltaXQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGFzc2ljLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NsYXNzaWMuamF2YQppbmRleCAwNGE2OThmLi43MmFlZDRiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NsYXNzaWMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NsYXNzaWMuamF2YQpAQCAtMTM1NywxNCArMTM1Nyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFdlYlZpZXcgd2l0aCBsYXlvdXQgcGFyYW1ldGVycywgYSBkZWZhdWx0IHN0eWxlIGFuZCBhIHNldAotICAgICAqIG9mIGN1c3RvbSBKYXZzY3JpcHQgaW50ZXJmYWNlcyB0byBiZSBhZGRlZCB0byB0aGUgV2ViVmlldyBhdCBpbml0aWFsaXphdGlvbgotICAgICAqIHRpbWUuIFRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZXNlIGludGVyZmFjZXMgd2lsbCBiZSBhdmFpbGFibGUgd2hlbiB0aGUgSlMKLSAgICAgKiBjb250ZXh0IGlzIGluaXRpYWxpemVkLgotICAgICAqIEBwYXJhbSBqYXZhU2NyaXB0SW50ZXJmYWNlcyBpcyBhIE1hcCBvZiBpbnRlcmZhY2UgbmFtZXMsIGFzIGtleXMsIGFuZAotICAgICAqIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhvc2UgaW50ZXJmYWNlcywgYXMgdmFsdWVzLgotICAgICAqIEBwYXJhbSBwcml2YXRlQnJvd3NpbmcgSWYgdHJ1ZSB0aGUgd2ViIHZpZXcgd2lsbCBiZSBpbml0aWFsaXplZCBpbiBwcml2YXRlIG1vZGUuCi0gICAgICogQGhpZGUgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3UHJvdmlkZXIjaW5pdChNYXAsIGJvb2xlYW4pfQogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhU2NyaXB0SW50ZXJmYWNlcywgYm9vbGVhbiBwcml2YXRlQnJvd3NpbmcpIHsKQEAgLTE4NjcsMzYgKzE4NjAsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyIGhhcyBvdmVybGF5IHN0eWxlLgotICAgICAqIEBwYXJhbSBvdmVybGF5IFRSVUUgaWYgaG9yaXpvbnRhbCBzY3JvbGxiYXIgc2hvdWxkIGhhdmUgb3ZlcmxheSBzdHlsZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjc2V0SG9yaXpvbnRhbFNjcm9sbGJhck92ZXJsYXkoYm9vbGVhbil9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbFNjcm9sbGJhck92ZXJsYXkoYm9vbGVhbiBvdmVybGF5KSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1PdmVybGF5SG9yaXpvbnRhbFNjcm9sbGJhciA9IG92ZXJsYXk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXIgaGFzIG92ZXJsYXkgc3R5bGUuCi0gICAgICogQHBhcmFtIG92ZXJsYXkgVFJVRSBpZiB2ZXJ0aWNhbCBzY3JvbGxiYXIgc2hvdWxkIGhhdmUgb3ZlcmxheSBzdHlsZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjc2V0VmVydGljYWxTY3JvbGxiYXJPdmVybGF5KGJvb2xlYW4pCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VmVydGljYWxTY3JvbGxiYXJPdmVybGF5KGJvb2xlYW4gb3ZlcmxheSkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBtT3ZlcmxheVZlcnRpY2FsU2Nyb2xsYmFyID0gb3ZlcmxheTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciBob3Jpem9udGFsIHNjcm9sbGJhciBoYXMgb3ZlcmxheSBzdHlsZQotICAgICAqIEByZXR1cm4gVFJVRSBpZiBob3Jpem9udGFsIHNjcm9sbGJhciBoYXMgb3ZlcmxheSBzdHlsZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjb3ZlcmxheUhvcml6b250YWxTY3JvbGxiYXIoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvdmVybGF5SG9yaXpvbnRhbFNjcm9sbGJhcigpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgcmV0dXJuIG1PdmVybGF5SG9yaXpvbnRhbFNjcm9sbGJhcjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciB2ZXJ0aWNhbCBzY3JvbGxiYXIgaGFzIG92ZXJsYXkgc3R5bGUKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdmVydGljYWwgc2Nyb2xsYmFyIGhhcyBvdmVybGF5IHN0eWxlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNvdmVybGF5VmVydGljYWxTY3JvbGxiYXIoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvdmVybGF5VmVydGljYWxTY3JvbGxiYXIoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIHJldHVybiBtT3ZlcmxheVZlcnRpY2FsU2Nyb2xsYmFyOwpAQCAtMTkzNCwxMSArMTkyNyw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB2aXNpYmxlIGhlaWdodCAoaW4gcGl4ZWxzKSBvZiB0aGUgZW1iZWRkZWQgdGl0bGUgYmFyIChpZiBhbnkpLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGlzIG1ldGhvZCBpcyBvYnNvbGV0ZSBhbmQgYWx3YXlzIHJldHVybnMgMC4KLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3cgb2Jzb2xldGUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldFZpc2libGVUaXRsZUhlaWdodCgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKSB7CiAgICAgICAgIC8vIEFjdHVhbGx5LCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIGVtYmVkZGVkIHRpdGxlIGJhciBpZiBvbmUgaXMgc2V0IHZpYSB0aGUKQEAgLTE5ODUsMTcgKzE5NzYsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBTU0wgY2VydGlmaWNhdGUgZm9yIHRoZSBtYWluIHRvcC1sZXZlbCBwYWdlIG9yIG51bGwgaWYKLSAgICAgKiB0aGVyZSBpcyBubyBjZXJ0aWZpY2F0ZSAodGhlIHNpdGUgaXMgbm90IHNlY3VyZSkuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldENlcnRpZmljYXRlKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNzbENlcnRpZmljYXRlIGdldENlcnRpZmljYXRlKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gbUNlcnRpZmljYXRlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIFNTTCBjZXJ0aWZpY2F0ZSBmb3IgdGhlIG1haW4gdG9wLWxldmVsIHBhZ2UuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3NldENlcnRpZmljYXRlKFNzbENlcnRpZmljYXRlKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRDZXJ0aWZpY2F0ZShTc2xDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewpAQCAtMjAxMCwyNiArMjAwMiwxOCBAQAogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgLyoqCi0gICAgICogU2F2ZSB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZvciBhIHBhcnRpY3VsYXIgaG9zdCBpbiB0aGUgV2ViVmlldydzCi0gICAgICogaW50ZXJuYWwgZGF0YWJhc2UuCi0gICAgICogQHBhcmFtIGhvc3QgVGhlIGhvc3QgdGhhdCByZXF1aXJlZCB0aGUgY3JlZGVudGlhbHMuCi0gICAgICogQHBhcmFtIHVzZXJuYW1lIFRoZSB1c2VybmFtZSBmb3IgdGhlIGdpdmVuIGhvc3QuCi0gICAgICogQHBhcmFtIHBhc3N3b3JkIFRoZSBwYXNzd29yZCBmb3IgdGhlIGdpdmVuIGhvc3QuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3NhdmVQYXNzd29yZChTdHJpbmcsIFN0cmluZywgU3RyaW5nKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzYXZlUGFzc3dvcmQoU3RyaW5nIGhvc3QsIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1EYXRhYmFzZS5zZXRVc2VybmFtZVBhc3N3b3JkKGhvc3QsIHVzZXJuYW1lLCBwYXNzd29yZCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBIVFRQIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGZvciBhIGdpdmVuIGhvc3QgYW5kIHJlYWxtLgotICAgICAqCi0gICAgICogQHBhcmFtIGhvc3QgVGhlIGhvc3QgZm9yIHRoZSBjcmVkZW50aWFscy4KLSAgICAgKiBAcGFyYW0gcmVhbG0gVGhlIHJlYWxtIGZvciB0aGUgY3JlZGVudGlhbHMuCi0gICAgICogQHBhcmFtIHVzZXJuYW1lIFRoZSB1c2VybmFtZSBmb3IgdGhlIHBhc3N3b3JkLiBJZiBpdCBpcyBudWxsLCBpdCBtZWFucwotICAgICAqICAgICAgICAgICAgICAgICBwYXNzd29yZCBjYW4ndCBiZSBzYXZlZC4KLSAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3NldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZChTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtLAogICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKQEAgLTIwMzcsMTQgKzIwMjEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSBIVFRQIGF1dGhlbnRpY2F0aW9uIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgYSBnaXZlbgotICAgICAqIGhvc3QgJiByZWFsbSBwYWlyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaG9zdCBUaGUgaG9zdCBmb3Igd2hpY2ggdGhlIGNyZWRlbnRpYWxzIGFwcGx5LgotICAgICAqIEBwYXJhbSByZWFsbSBUaGUgcmVhbG0gZm9yIHdoaWNoIHRoZSBjcmVkZW50aWFscyBhcHBseS4KLSAgICAgKiBAcmV0dXJuIFN0cmluZ1tdIGlmIGZvdW5kLCBTdHJpbmdbMF0gaXMgdXNlcm5hbWUsIHdoaWNoIGNhbiBiZSBudWxsIGFuZAotICAgICAqICAgICAgICAgU3RyaW5nWzFdIGlzIHBhc3N3b3JkLiBSZXR1cm4gbnVsbCBpZiBpdCBjYW4ndCBmaW5kIGFueXRoaW5nLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nLCBTdHJpbmcpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIGhvc3QsIFN0cmluZyByZWFsbSkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gbURhdGFiYXNlLmdldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZChob3N0LCByZWFsbSk7CkBAIC0yMDgyLDEwICsyMDYxLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXN0cm95IHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgV2ViVmlldy4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZAotICAgICAqIGFmdGVyIHRoZSBXZWJWaWV3IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdmlldyBzeXN0ZW0uIE5vIG90aGVyCi0gICAgICogbWV0aG9kcyBtYXkgYmUgY2FsbGVkIG9uIGEgV2ViVmlldyBhZnRlciBkZXN0cm95LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNkZXN0cm95KCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgZGVzdHJveUltcGwoKTsKQEAgLTIxMTUsMTAgKzIwOTMsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuYWJsZXMgcGxhdGZvcm0gbm90aWZpY2F0aW9ucyBvZiBkYXRhIHN0YXRlIGFuZCBwcm94eSBjaGFuZ2VzLgotICAgICAqIE5vdGlmaWNhdGlvbnMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIG5vdyBvYnNvbGV0ZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZW5hYmxlUGxhdGZvcm1Ob3RpZmljYXRpb25zKCl9CiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlUGxhdGZvcm1Ob3RpZmljYXRpb25zKCkgewpAQCAtMjEzMiwxMCArMjEwNyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGlzYWJsZXMgcGxhdGZvcm0gbm90aWZpY2F0aW9ucyBvZiBkYXRhIHN0YXRlIGFuZCBwcm94eSBjaGFuZ2VzLgotICAgICAqIE5vdGlmaWNhdGlvbnMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIG5vdyBvYnNvbGV0ZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZGlzYWJsZVBsYXRmb3JtTm90aWZpY2F0aW9ucygpfQogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGRpc2FibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKSB7CkBAIC0yMTYxLDExICsyMTMzLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmZvcm0gV2ViVmlldyBvZiB0aGUgbmV0d29yayBzdGF0ZS4gVGhpcyBpcyB1c2VkIHRvIHNldAotICAgICAqIHRoZSBKYXZhU2NyaXB0IHByb3BlcnR5IHdpbmRvdy5uYXZpZ2F0b3IuaXNPbmxpbmUgYW5kCi0gICAgICogZ2VuZXJhdGVzIHRoZSBvbmxpbmUvb2ZmbGluZSBldmVudCBhcyBzcGVjaWZpZWQgaW4gSFRNTDUsIHNlYy4gNS43LjcKLSAgICAgKiBAcGFyYW0gbmV0d29ya1VwIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBuZXR3b3JrIGlzIGF2YWlsYWJsZQorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNzZXROZXR3b3JrQXZhaWxhYmxlKGJvb2xlYW4pfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldE5ldHdvcmtBdmFpbGFibGUoYm9vbGVhbiBuZXR3b3JrVXApIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9ORVRXT1JLX1NUQVRFLApAQCAtMjE4MywxOSArMjE1MywxMSBAQAogICAgICAgICBtYXAucHV0KCJzdWJ0eXBlIiwgc3VidHlwZSk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfTkVUV09SS19UWVBFLCBtYXApOwogICAgIH0KKwogICAgIC8qKgotICAgICAqIFNhdmUgdGhlIHN0YXRlIG9mIHRoaXMgV2ViVmlldyB1c2VkIGluCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU2F2ZUluc3RhbmNlU3RhdGV9LiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMKLSAgICAgKiBtZXRob2Qgbm8gbG9uZ2VyIHN0b3JlcyB0aGUgZGlzcGxheSBkYXRhIGZvciB0aGlzIFdlYlZpZXcuIFRoZSBwcmV2aW91cwotICAgICAqIGJlaGF2aW9yIGNvdWxkIHBvdGVudGlhbGx5IGxlYWsgZmlsZXMgaWYge0BsaW5rICNyZXN0b3JlU3RhdGV9IHdhcyBuZXZlcgotICAgICAqIGNhbGxlZC4gU2VlIHtAbGluayAjc2F2ZVBpY3R1cmV9IGFuZCB7QGxpbmsgI3Jlc3RvcmVQaWN0dXJlfSBmb3Igc2F2aW5nCi0gICAgICogYW5kIHJlc3RvcmluZyB0aGUgZGlzcGxheSBkYXRhLgotICAgICAqIEBwYXJhbSBvdXRTdGF0ZSBUaGUgQnVuZGxlIHRvIHN0b3JlIHRoZSBXZWJWaWV3IHN0YXRlLgotICAgICAqIEByZXR1cm4gVGhlIHNhbWUgY29weSBvZiB0aGUgYmFjay9mb3J3YXJkIGxpc3QgdXNlZCB0byBzYXZlIHRoZSBzdGF0ZS4gSWYKLSAgICAgKiAgICAgICAgIHNhdmVTdGF0ZSBmYWlscywgdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBudWxsLgotICAgICAqIEBzZWUgI3NhdmVQaWN0dXJlCi0gICAgICogQHNlZSAjcmVzdG9yZVBpY3R1cmUKKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjc2F2ZVN0YXRlKEJ1bmRsZSl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFdlYkJhY2tGb3J3YXJkTGlzdCBzYXZlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmIChvdXRTdGF0ZSA9PSBudWxsKSB7CkBAIC0yMjQ0LDE0ICsyMjA2LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjdXJyZW50IGRpc3BsYXkgZGF0YSB0byB0aGUgQnVuZGxlIGdpdmVuLiBVc2VkIGluIGNvbmp1bmN0aW9uCi0gICAgICogd2l0aCB7QGxpbmsgI3NhdmVTdGF0ZX0uCi0gICAgICogQHBhcmFtIGIgQSBCdW5kbGUgdG8gc3RvcmUgdGhlIGRpc3BsYXkgZGF0YS4KLSAgICAgKiBAcGFyYW0gZGVzdCBUaGUgZmlsZSB0byBzdG9yZSB0aGUgc2VyaWFsaXplZCBwaWN0dXJlIGRhdGEuIFdpbGwgYmUKLSAgICAgKiAgICAgICAgICAgICBvdmVyd3JpdHRlbiB3aXRoIHRoaXMgV2ViVmlldydzIHBpY3R1cmUgZGF0YS4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBpY3R1cmUgd2FzIHN1Y2Nlc3NmdWxseSBzYXZlZC4KLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3cgb2Jzb2xldGUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3NhdmVQaWN0dXJlKEJ1bmRsZSwgRmlsZSl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBzYXZlUGljdHVyZShCdW5kbGUgYiwgZmluYWwgRmlsZSBkZXN0KSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CkBAIC0yMzExLDE1ICsyMjY4LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXN0b3JlIHRoZSBkaXNwbGF5IGRhdGEgdGhhdCB3YXMgc2F2ZSBpbiB7QGxpbmsgI3NhdmVQaWN0dXJlfS4gVXNlZCBpbgotICAgICAqIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rICNyZXN0b3JlU3RhdGV9LgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCBub3Qgd29yayBpZiB0aGUgV2ViVmlldyBpcyBoYXJkd2FyZSBhY2NlbGVyYXRlZC4KLSAgICAgKiBAcGFyYW0gYiBBIEJ1bmRsZSBjb250YWluaW5nIHRoZSBzYXZlZCBkaXNwbGF5IGRhdGEuCi0gICAgICogQHBhcmFtIHNyYyBUaGUgZmlsZSB3aGVyZSB0aGUgcGljdHVyZSBkYXRhIHdhcyBzdG9yZWQuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwaWN0dXJlIHdhcyBzdWNjZXNzZnVsbHkgcmVzdG9yZWQuCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm93IG9ic29sZXRlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNyZXN0b3JlUGljdHVyZShCdW5kbGUsIEZpbGUpfTsKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIHJlc3RvcmVQaWN0dXJlKEJ1bmRsZSBiLCBGaWxlIHNyYykgewogICAgICAgICBjaGVja1RocmVhZCgpOwpAQCAtMjQwMiw3ICsyMzUzLDYgQEAKICAgICAvKioKICAgICAgKiBDbGVhcnMgdGhlIHZpZXcgc3RhdGUgc2V0IHdpdGgge0BsaW5rICNsb2FkVmlld1N0YXRlKElucHV0U3RyZWFtKX0uCiAgICAgICogVGhpcyBXZWJWaWV3IHdpbGwgdGhlbiBzd2l0Y2ggdG8gc2hvd2luZyB0aGUgY29udGVudCBmcm9tIHdlYmtpdAotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJWaWV3U3RhdGUoKSB7CiAgICAgICAgIG1CbG9ja1dlYmtpdFZpZXdNZXNzYWdlcyA9IGZhbHNlOwpAQCAtMjQxMSwxOSArMjM2MSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhpcyBXZWJWaWV3IGZyb20gdGhlIGdpdmVuIG1hcCB1c2VkIGluCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUmVzdG9yZUluc3RhbmNlU3RhdGV9LiBUaGlzIG1ldGhvZCBzaG91bGQKLSAgICAgKiBiZSBjYWxsZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIFdlYlZpZXcgYmVmb3JlIHVzaW5nIHRoZSBvYmplY3QuIElmCi0gICAgICogaXQgaXMgY2FsbGVkIGFmdGVyIHRoZSBXZWJWaWV3IGhhcyBoYWQgYSBjaGFuY2UgdG8gYnVpbGQgc3RhdGUgKGxvYWQKLSAgICAgKiBwYWdlcywgY3JlYXRlIGEgYmFjay9mb3J3YXJkIGxpc3QsIGV0Yy4pIHRoZXJlIG1heSBiZSB1bmRlc2lyYWJsZQotICAgICAqIHNpZGUtZWZmZWN0cy4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBubyBsb25nZXIgcmVzdG9yZXMgdGhlCi0gICAgICogZGlzcGxheSBkYXRhIGZvciB0aGlzIFdlYlZpZXcuIFNlZSB7QGxpbmsgI3NhdmVQaWN0dXJlfSBhbmQge0BsaW5rCi0gICAgICogI3Jlc3RvcmVQaWN0dXJlfSBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgdGhlIGRpc3BsYXkgZGF0YS4KLSAgICAgKiBAcGFyYW0gaW5TdGF0ZSBUaGUgaW5jb21pbmcgQnVuZGxlIG9mIHN0YXRlLgotICAgICAqIEByZXR1cm4gVGhlIHJlc3RvcmVkIGJhY2svZm9yd2FyZCBsaXN0IG9yIG51bGwgaWYgcmVzdG9yZVN0YXRlIGZhaWxlZC4KLSAgICAgKiBAc2VlICNzYXZlUGljdHVyZQotICAgICAqIEBzZWUgI3Jlc3RvcmVQaWN0dXJlCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3Jlc3RvcmVTdGF0ZShCdW5kbGUpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBXZWJCYWNrRm9yd2FyZExpc3QgcmVzdG9yZVN0YXRlKEJ1bmRsZSBpblN0YXRlKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIFdlYkJhY2tGb3J3YXJkTGlzdCByZXR1cm5MaXN0ID0gbnVsbDsKQEAgLTI0NzgsMTUgKzI0MTgsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWQgdGhlIGdpdmVuIFVSTCB3aXRoIHRoZSBzcGVjaWZpZWQgYWRkaXRpb25hbCBIVFRQIGhlYWRlcnMuCi0gICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBsb2FkLgotICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsSHR0cEhlYWRlcnMgVGhlIGFkZGl0aW9uYWwgaGVhZGVycyB0byBiZSB1c2VkIGluIHRoZQotICAgICAqICAgICAgICAgICAgSFRUUCByZXF1ZXN0IGZvciB0aGlzIFVSTCwgc3BlY2lmaWVkIGFzIGEgbWFwIGZyb20gbmFtZSB0bwotICAgICAqICAgICAgICAgICAgdmFsdWUuIE5vdGUgdGhhdCBpZiB0aGlzIG1hcCBjb250YWlucyBhbnkgb2YgdGhlIGhlYWRlcnMKLSAgICAgKiAgICAgICAgICAgIHRoYXQgYXJlIHNldCBieSBkZWZhdWx0IGJ5IHRoZSBXZWJWaWV3LCBzdWNoIGFzIHRob3NlCi0gICAgICogICAgICAgICAgICBjb250cm9sbGluZyBjYWNoaW5nLCBhY2NlcHQgdHlwZXMgb3IgdGhlIFVzZXItQWdlbnQsIHRoZWlyCi0gICAgICogICAgICAgICAgICB2YWx1ZXMgbWF5IGJlIG92ZXJyaWRlbiBieSB0aGUgV2ViVmlldydzIGRlZmF1bHRzLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNsb2FkVXJsKFN0cmluZywgTWFwKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBsb2FkVXJsKFN0cmluZyB1cmwsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkaXRpb25hbEh0dHBIZWFkZXJzKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGxvYWRVcmxJbXBsKHVybCwgYWRkaXRpb25hbEh0dHBIZWFkZXJzKTsKQEAgLTI1MDIsOSArMjQzNiw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9hZCB0aGUgZ2l2ZW4gVVJMLgotICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gbG9hZC4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjbG9hZFVybChTdHJpbmcpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGxvYWRVcmwoU3RyaW5nIHVybCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBsb2FkVXJsSW1wbCh1cmwpOwpAQCAtMjUxOCwxMyArMjQ1Miw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9hZCB0aGUgdXJsIHdpdGggcG9zdERhdGEgdXNpbmcgIlBPU1QiIG1ldGhvZCBpbnRvIHRoZSBXZWJWaWV3LiBJZiB1cmwKLSAgICAgKiBpcyBub3QgYSBuZXR3b3JrIHVybCwgaXQgd2lsbCBiZSBsb2FkZWQgd2l0aCB7bGluawotICAgICAqIHtAbGluayAjbG9hZFVybChTdHJpbmcpfSBpbnN0ZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtIHVybCBUaGUgdXJsIG9mIHRoZSByZXNvdXJjZSB0byBsb2FkLgotICAgICAqIEBwYXJhbSBwb3N0RGF0YSBUaGUgZGF0YSB3aWxsIGJlIHBhc3NlZCB0byAiUE9TVCIgcmVxdWVzdC4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjcG9zdFVybChTdHJpbmcsIGJ5dGVbXSl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcG9zdFVybChTdHJpbmcgdXJsLCBieXRlW10gcG9zdERhdGEpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKFVSTFV0aWwuaXNOZXR3b3JrVXJsKHVybCkpIHsKQEAgLTI1NDAsMzEgKzI0NzAsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWQgdGhlIGdpdmVuIGRhdGEgaW50byB0aGUgV2ViVmlldyB1c2luZyBhICdkYXRhJyBzY2hlbWUgVVJMLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBKYXZhU2NyaXB0J3Mgc2FtZSBvcmlnaW4gcG9saWN5IG1lYW5zIHRoYXQgc2NyaXB0IHJ1bm5pbmcgaW4gYQotICAgICAqIHBhZ2UgbG9hZGVkIHVzaW5nIHRoaXMgbWV0aG9kIHdpbGwgYmUgdW5hYmxlIHRvIGFjY2VzcyBjb250ZW50IGxvYWRlZAotICAgICAqIHVzaW5nIGFueSBzY2hlbWUgb3RoZXIgdGhhbiAnZGF0YScsIGluY2x1ZGluZyAnaHR0cChzKScuIFRvIGF2b2lkIHRoaXMKLSAgICAgKiByZXN0cmljdGlvbiwgdXNlIHtAbGluawotICAgICAqICNsb2FkRGF0YVdpdGhCYXNlVVJMKFN0cmluZyxTdHJpbmcsU3RyaW5nLFN0cmluZyxTdHJpbmcpCi0gICAgICogbG9hZERhdGFXaXRoQmFzZVVSTCgpfSB3aXRoIGFuIGFwcHJvcHJpYXRlIGJhc2UgVVJMLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSB2YWx1ZSBvZiB0aGUgZW5jb2RpbmcgcGFyYW1ldGVyIGlzICdiYXNlNjQnLCB0aGVuIHRoZSBkYXRhIG11c3QKLSAgICAgKiBiZSBlbmNvZGVkIGFzIGJhc2U2NC4gT3RoZXJ3aXNlLCB0aGUgZGF0YSBtdXN0IHVzZSBBU0NJSSBlbmNvZGluZyBmb3IKLSAgICAgKiBvY3RldHMgaW5zaWRlIHRoZSByYW5nZSBvZiBzYWZlIFVSTCBjaGFyYWN0ZXJzIGFuZCB1c2UgdGhlIHN0YW5kYXJkICV4eAotICAgICAqIGhleCBlbmNvZGluZyBvZiBVUkxzIGZvciBvY3RldHMgb3V0c2lkZSB0aGF0IHJhbmdlLiBGb3IgZXhhbXBsZSwKLSAgICAgKiAnIycsICclJywgJ1wnLCAnPycgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5ICUyMywgJTI1LCAlMjcsICUzZiByZXNwZWN0aXZlbHkuCi0gICAgICogPHA+Ci0gICAgICogVGhlICdkYXRhJyBzY2hlbWUgVVJMIGZvcm1lZCBieSB0aGlzIG1ldGhvZCB1c2VzIHRoZSBkZWZhdWx0IFVTLUFTQ0lJCi0gICAgICogY2hhcnNldC4gSWYgeW91IG5lZWQgbmVlZCB0byBzZXQgYSBkaWZmZXJlbnQgY2hhcnNldCwgeW91IHNob3VsZCBmb3JtIGEKLSAgICAgKiAnZGF0YScgc2NoZW1lIFVSTCB3aGljaCBleHBsaWNpdGx5IHNwZWNpZmllcyBhIGNoYXJzZXQgcGFyYW1ldGVyIGluIHRoZQotICAgICAqIG1lZGlhdHlwZSBwb3J0aW9uIG9mIHRoZSBVUkwgYW5kIGNhbGwge0BsaW5rICNsb2FkVXJsKFN0cmluZyl9IGluc3RlYWQuCi0gICAgICogTm90ZSB0aGF0IHRoZSBjaGFyc2V0IG9idGFpbmVkIGZyb20gdGhlIG1lZGlhdHlwZSBwb3J0aW9uIG9mIGEgZGF0YSBVUkwKLSAgICAgKiBhbHdheXMgb3ZlcnJpZGVzIHRoYXQgc3BlY2lmaWVkIGluIHRoZSBIVE1MIG9yIFhNTCBkb2N1bWVudCBpdHNlbGYuCi0gICAgICogQHBhcmFtIGRhdGEgQSBTdHJpbmcgb2YgZGF0YSBpbiB0aGUgZ2l2ZW4gZW5jb2RpbmcuCi0gICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBNSU1FIHR5cGUgb2YgdGhlIGRhdGEsIGUuZy4gJ3RleHQvaHRtbCcuCi0gICAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZyBvZiB0aGUgZGF0YS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjbG9hZERhdGEoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbG9hZERhdGEoU3RyaW5nIGRhdGEsIFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIGVuY29kaW5nKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGxvYWREYXRhSW1wbChkYXRhLCBtaW1lVHlwZSwgZW5jb2RpbmcpOwpAQCAtMjU4MiwyNyArMjQ5MCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9hZCB0aGUgZ2l2ZW4gZGF0YSBpbnRvIHRoZSBXZWJWaWV3LCB1c2luZyBiYXNlVXJsIGFzIHRoZSBiYXNlIFVSTCBmb3IKLSAgICAgKiB0aGUgY29udGVudC4gVGhlIGJhc2UgVVJMIGlzIHVzZWQgYm90aCB0byByZXNvbHZlIHJlbGF0aXZlIFVSTHMgYW5kIHdoZW4KLSAgICAgKiBhcHBseWluZyBKYXZhU2NyaXB0J3Mgc2FtZSBvcmlnaW4gcG9saWN5LiBUaGUgaGlzdG9yeVVybCBpcyB1c2VkIGZvciB0aGUKLSAgICAgKiBoaXN0b3J5IGVudHJ5LgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBjb250ZW50IHNwZWNpZmllZCBpbiB0aGlzIHdheSBjYW4gYWNjZXNzIGxvY2FsIGRldmljZSBmaWxlcwotICAgICAqICh2aWEgJ2ZpbGUnIHNjaGVtZSBVUkxzKSBvbmx5IGlmIGJhc2VVcmwgc3BlY2lmaWVzIGEgc2NoZW1lIG90aGVyIHRoYW4KLSAgICAgKiAnaHR0cCcsICdodHRwcycsICdmdHAnLCAnZnRwcycsICdhYm91dCcgb3IgJ2phdmFzY3JpcHQnLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBiYXNlIFVSTCB1c2VzIHRoZSBkYXRhIHNjaGVtZSwgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bwotICAgICAqIGNhbGxpbmcge0BsaW5rICNsb2FkRGF0YShTdHJpbmcsU3RyaW5nLFN0cmluZykgbG9hZERhdGEoKX0gYW5kIHRoZQotICAgICAqIGhpc3RvcnlVcmwgaXMgaWdub3JlZC4KLSAgICAgKiBAcGFyYW0gYmFzZVVybCBVUkwgdG8gdXNlIGFzIHRoZSBwYWdlJ3MgYmFzZSBVUkwuIElmIG51bGwgZGVmYXVsdHMgdG8KLSAgICAgKiAgICAgICAgICAgICdhYm91dDpibGFuaycKLSAgICAgKiBAcGFyYW0gZGF0YSBBIFN0cmluZyBvZiBkYXRhIGluIHRoZSBnaXZlbiBlbmNvZGluZy4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIE1JTUVUeXBlIG9mIHRoZSBkYXRhLCBlLmcuICd0ZXh0L2h0bWwnLiBJZiBudWxsLAotICAgICAqICAgICAgICAgICAgZGVmYXVsdHMgdG8gJ3RleHQvaHRtbCcuCi0gICAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZyBvZiB0aGUgZGF0YS4KLSAgICAgKiBAcGFyYW0gaGlzdG9yeVVybCBVUkwgdG8gdXNlIGFzIHRoZSBoaXN0b3J5IGVudHJ5LCBpZiBudWxsIGRlZmF1bHRzIHRvCi0gICAgICogICAgICAgICAgICAnYWJvdXQ6YmxhbmsnLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNsb2FkRGF0YVdpdGhCYXNlVVJMKFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBsb2FkRGF0YVdpdGhCYXNlVVJMKFN0cmluZyBiYXNlVXJsLCBTdHJpbmcgZGF0YSwKICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgaGlzdG9yeVVybCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwpAQCAtMjYyMywxMCArMjUxMyw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgdmlldyBhcyBhIHdlYiBhcmNoaXZlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgcGxhY2VkLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNzYXZlV2ViQXJjaGl2ZShTdHJpbmcpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBmaWxlbmFtZSkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBzYXZlV2ViQXJjaGl2ZUltcGwoZmlsZW5hbWUsIGZhbHNlLCBudWxsKTsKQEAgLTI2NDYsMTcgKzI1MzUsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IHZpZXcgYXMgYSB3ZWIgYXJjaGl2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiYXNlbmFtZSBUaGUgZmlsZW5hbWUgd2hlcmUgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHBsYWNlZC4KLSAgICAgKiBAcGFyYW0gYXV0b25hbWUgSWYgZmFsc2UsIHRha2VzIGJhc2VuYW1lIHRvIGJlIGEgZmlsZS4gSWYgdHJ1ZSwgYmFzZW5hbWUKLSAgICAgKiAgICAgICAgICAgICAgICAgaXMgYXNzdW1lZCB0byBiZSBhIGRpcmVjdG9yeSBpbiB3aGljaCBhIGZpbGVuYW1lIHdpbGwgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgY2hvc2VuIGFjY29yZGluZyB0byB0aGUgdXJsIG9mIHRoZSBjdXJyZW50IHBhZ2UuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxlZCBhZnRlciB0aGUgd2ViIGFyY2hpdmUgaGFzIGJlZW4gc2F2ZWQuIFRoZQotICAgICAqICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgZm9yIG9uUmVjZWl2ZVZhbHVlIHdpbGwgZWl0aGVyIGJlIHRoZSBmaWxlbmFtZQotICAgICAqICAgICAgICAgICAgICAgICB1bmRlciB3aGljaCB0aGUgZmlsZSB3YXMgc2F2ZWQsIG9yIG51bGwgaWYgc2F2aW5nIHRoZQotICAgICAqICAgICAgICAgICAgICAgICBmaWxlIGZhaWxlZC4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjc2F2ZVdlYkFyY2hpdmUoU3RyaW5nLCBib29sZWFuLCBWYWx1ZUNhbGxiYWNrKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzYXZlV2ViQXJjaGl2ZShTdHJpbmcgYmFzZW5hbWUsIGJvb2xlYW4gYXV0b25hbWUsIFZhbHVlQ2FsbGJhY2s8U3RyaW5nPiBjYWxsYmFjaykgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBzYXZlV2ViQXJjaGl2ZUltcGwoYmFzZW5hbWUsIGF1dG9uYW1lLCBjYWxsYmFjayk7CkBAIC0yNjY5LDggKzI1NTAsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFN0b3AgdGhlIGN1cnJlbnQgbG9hZC4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjc3RvcExvYWRpbmcoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGluZygpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGNsZWFyIGFsbCB0aGUgbWVzc2FnZXMgaW4gdGhlIHF1ZXVlIGJlZm9yZSBzZW5kaW5nCkBAIC0yNjgwLDggKzI1NjIsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbG9hZCB0aGUgY3VycmVudCB1cmwuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3JlbG9hZCgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlbG9hZCgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgY2xlYXJIZWxwZXJzKCk7CkBAIC0yNjkwLDkgKzI1NzMsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgV2ViVmlldyBoYXMgYSBiYWNrIGhpc3RvcnkgaXRlbS4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWZmIHRoaXMgV2ViVmlldyBoYXMgYSBiYWNrIGhpc3RvcnkgaXRlbS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjY2FuR29CYWNrKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY2FuR29CYWNrKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBXZWJCYWNrRm9yd2FyZExpc3QgbCA9IG1DYWxsYmFja1Byb3h5LmdldEJhY2tGb3J3YXJkTGlzdCgpOwpAQCAtMjcwNiwxNyArMjU4OSwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdvIGJhY2sgaW4gdGhlIGhpc3Rvcnkgb2YgdGhpcyBXZWJWaWV3LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnb0JhY2soKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBnb0JhY2soKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGdvQmFja09yRm9yd2FyZEltcGwoLTEpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgV2ViVmlldyBoYXMgYSBmb3J3YXJkIGhpc3RvcnkgaXRlbS4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWZmIHRoaXMgV2VidmlldyBoYXMgYSBmb3J3YXJkIGhpc3RvcnkgaXRlbS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjY2FuR29Gb3J3YXJkKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY2FuR29Gb3J3YXJkKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBXZWJCYWNrRm9yd2FyZExpc3QgbCA9IG1DYWxsYmFja1Byb3h5LmdldEJhY2tGb3J3YXJkTGlzdCgpOwpAQCAtMjczMCwxOSArMjYxNCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdvIGZvcndhcmQgaW4gdGhlIGhpc3Rvcnkgb2YgdGhpcyBXZWJWaWV3LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnb0ZvcndhcmQoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBnb0ZvcndhcmQoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGdvQmFja09yRm9yd2FyZEltcGwoMSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHBhZ2UgY2FuIGdvIGJhY2sgb3IgZm9yd2FyZCB0aGUgZ2l2ZW4KLSAgICAgKiBudW1iZXIgb2Ygc3RlcHMuCi0gICAgICogQHBhcmFtIHN0ZXBzIFRoZSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBudW1iZXIgb2Ygc3RlcHMgdG8gbW92ZSB0aGUKLSAgICAgKiAgICAgICAgICAgICAgaGlzdG9yeS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjY2FuR29CYWNrT3JGb3J3YXJkKGludCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY2FuR29CYWNrT3JGb3J3YXJkKGludCBzdGVwcykgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBXZWJCYWNrRm9yd2FyZExpc3QgbCA9IG1DYWxsYmFja1Byb3h5LmdldEJhY2tGb3J3YXJkTGlzdCgpOwpAQCAtMjc1NywxMiArMjY0MCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR28gdG8gdGhlIGhpc3RvcnkgaXRlbSB0aGF0IGlzIHRoZSBudW1iZXIgb2Ygc3RlcHMgYXdheSBmcm9tCi0gICAgICogdGhlIGN1cnJlbnQgaXRlbS4gU3RlcHMgaXMgbmVnYXRpdmUgaWYgYmFja3dhcmQgYW5kIHBvc2l0aXZlCi0gICAgICogaWYgZm9yd2FyZC4KLSAgICAgKiBAcGFyYW0gc3RlcHMgVGhlIG51bWJlciBvZiBzdGVwcyB0byB0YWtlIGJhY2sgb3IgZm9yd2FyZCBpbiB0aGUgYmFjawotICAgICAqICAgICAgICAgICAgICBmb3J3YXJkIGxpc3QuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dvQmFja09yRm9yd2FyZChpbnQpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGdvQmFja09yRm9yd2FyZChpbnQgc3RlcHMpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgZ29CYWNrT3JGb3J3YXJkSW1wbChzdGVwcyk7CkBAIC0yNzgxLDggKzI2NjEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBwcml2YXRlIGJyb3dzaW5nIGlzIGVuYWJsZWQgaW4gdGhpcyBXZWJWaWV3LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIHJldHVybiBnZXRTZXR0aW5ncygpLmlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpOwpAQCAtMjgwMiwxMCArMjY4Myw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2Nyb2xsIHRoZSBjb250ZW50cyBvZiB0aGUgdmlldyB1cCBieSBoYWxmIHRoZSB2aWV3IHNpemUKLSAgICAgKiBAcGFyYW0gdG9wIHRydWUgdG8ganVtcCB0byB0aGUgdG9wIG9mIHRoZSBwYWdlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwYWdlIHdhcyBzY3JvbGxlZAorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNwYWdlVXAoYm9vbGVhbil9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcGFnZVVwKGJvb2xlYW4gdG9wKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkgewpAQCAtMjgyOCwxMCArMjcwOCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2Nyb2xsIHRoZSBjb250ZW50cyBvZiB0aGUgdmlldyBkb3duIGJ5IGhhbGYgdGhlIHBhZ2Ugc2l6ZQotICAgICAqIEBwYXJhbSBib3R0b20gdHJ1ZSB0byBqdW1wIHRvIGJvdHRvbSBvZiBwYWdlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwYWdlIHdhcyBzY3JvbGxlZAorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNwYWdlRG93bihib29sZWFuKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBwYWdlRG93bihib29sZWFuIGJvdHRvbSkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHsKQEAgLTI4NTMsOSArMjczMiw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIHZpZXcgc28gdGhhdCBvbkRyYXcoKSB3aWxsIGRyYXcgbm90aGluZyBidXQgd2hpdGUgYmFja2dyb3VuZCwKLSAgICAgKiBhbmQgb25NZWFzdXJlKCkgd2lsbCByZXR1cm4gMCBpZiBNZWFzdXJlU3BlYyBpcyBub3QgTWVhc3VyZVNwZWMuRVhBQ1RMWQorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNjbGVhclZpZXcoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhclZpZXcoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1Db250ZW50V2lkdGggPSAwOwpAQCAtMjg2NSwxNCArMjc0NCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGEgbmV3IHBpY3R1cmUgdGhhdCBjYXB0dXJlcyB0aGUgY3VycmVudCBkaXNwbGF5IG9mIHRoZSB3ZWJ2aWV3LgotICAgICAqIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBkaXNwbGF5LCBhbmQgd2lsbCBiZSB1bmFmZmVjdGVkIGlmIHRoZSB3ZWJ2aWV3Ci0gICAgICogbGF0ZXIgbG9hZHMgYSBkaWZmZXJlbnQgVVJMLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHBpY3R1cmUgY29udGFpbmluZyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgdmlldy4gTm90ZSB0aGlzCi0gICAgICogICAgICAgICBwaWN0dXJlIGlzIG9mIHRoZSBlbnRpcmUgZG9jdW1lbnQsIGFuZCBpcyBub3QgcmVzdHJpY3RlZCB0byB0aGUKLSAgICAgKiAgICAgICAgIGJvdW5kcyBvZiB0aGUgdmlldy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjY2FwdHVyZVBpY3R1cmUoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGljdHVyZSBjYXB0dXJlUGljdHVyZSgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm4gbnVsbDsKQEAgLTI4ODIsOSArMjc1Niw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHNjYWxlIG9mIHRoZSBXZWJWaWV3Ci0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBzY2FsZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZ2V0U2NhbGUoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgZ2V0U2NhbGUoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKQEAgLTI5MDAsMjUgKzI3NzQsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGluaXRpYWwgc2NhbGUgZm9yIHRoZSBXZWJWaWV3LiAwIG1lYW5zIGRlZmF1bHQuIElmCi0gICAgICoge0BsaW5rIFdlYlNldHRpbmdzI2dldFVzZVdpZGVWaWV3UG9ydCgpfSBpcyB0cnVlLCBpdCB6b29tcyBvdXQgYWxsIHRoZQotICAgICAqIHdheS4gT3RoZXJ3aXNlIGl0IHN0YXJ0cyB3aXRoIDEwMCUuIElmIGluaXRpYWwgc2NhbGUgaXMgZ3JlYXRlciB0aGFuIDAsCi0gICAgICogV2ViVmlldyBzdGFydHMgd2l0aCB0aGlzIHZhbHVlIGFzIGluaXRpYWwgc2NhbGUuCi0gICAgICogUGxlYXNlIG5vdGUgdGhhdCB1bmxpa2UgdGhlIHNjYWxlIHByb3BlcnRpZXMgaW4gdGhlIHZpZXdwb3J0IG1ldGEgdGFnLAotICAgICAqIHRoaXMgbWV0aG9kIGRvZXNuJ3QgdGFrZSB0aGUgc2NyZWVuIGRlbnNpdHkgaW50byBhY2NvdW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHNjYWxlSW5QZXJjZW50IFRoZSBpbml0aWFsIHNjYWxlIGluIHBlcmNlbnQuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3NldEluaXRpYWxTY2FsZShpbnQpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTY2FsZShpbnQgc2NhbGVJblBlcmNlbnQpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgbVpvb21NYW5hZ2VyLnNldEluaXRpYWxTY2FsZUluUGVyY2VudChzY2FsZUluUGVyY2VudCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW52b2tlIHRoZSBncmFwaGljYWwgem9vbSBwaWNrZXIgd2lkZ2V0IGZvciB0aGlzIFdlYlZpZXcuIFRoaXMgd2lsbAotICAgICAqIHJlc3VsdCBpbiB0aGUgem9vbSB3aWRnZXQgYXBwZWFyaW5nIG9uIHRoZSBzY3JlZW4gdG8gY29udHJvbCB0aGUgem9vbQotICAgICAqIGxldmVsIG9mIHRoaXMgV2ViVmlldy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjaW52b2tlWm9vbVBpY2tlcigpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGludm9rZVpvb21QaWNrZXIoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmICghZ2V0U2V0dGluZ3MoKS5zdXBwb3J0Wm9vbSgpKSB7CkBAIC0yOTMwLDIzICsyNzk3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBIaXRUZXN0UmVzdWx0IGJhc2VkIG9uIHRoZSBjdXJyZW50IGN1cnNvciBub2RlLiBJZiBhIEhUTUw6OmEgdGFnCi0gICAgICogaXMgZm91bmQgYW5kIHRoZSBhbmNob3IgaGFzIGEgbm9uLUphdmFTY3JpcHQgdXJsLCB0aGUgSGl0VGVzdFJlc3VsdCB0eXBlCi0gICAgICogaXMgc2V0IHRvIFNSQ19BTkNIT1JfVFlQRSBhbmQgdGhlIHVybCBpcyBzZXQgaW4gdGhlICJleHRyYSIgZmllbGQuIElmIHRoZQotICAgICAqIGFuY2hvciBkb2VzIG5vdCBoYXZlIGEgdXJsIG9yIGlmIGl0IGlzIGEgSmF2YVNjcmlwdCB1cmwsIHRoZSB0eXBlIHdpbGwKLSAgICAgKiBiZSBVTktOT1dOX1RZUEUgYW5kIHRoZSB1cmwgaGFzIHRvIGJlIHJldHJpZXZlZCB0aHJvdWdoCi0gICAgICoge0BsaW5rICNyZXF1ZXN0Rm9jdXNOb2RlSHJlZn0gYXN5bmNocm9ub3VzbHkuIElmIGEgSFRNTDo6aW1nIHRhZyBpcwotICAgICAqIGZvdW5kLCB0aGUgSGl0VGVzdFJlc3VsdCB0eXBlIGlzIHNldCB0byBJTUFHRV9UWVBFIGFuZCB0aGUgdXJsIGlzIHNldCBpbgotICAgICAqIHRoZSAiZXh0cmEiIGZpZWxkLiBBIHR5cGUgb2YKLSAgICAgKiBTUkNfSU1BR0VfQU5DSE9SX1RZUEUgaW5kaWNhdGVzIGFuIGFuY2hvciB3aXRoIGEgdXJsIHRoYXQgaGFzIGFuIGltYWdlIGFzCi0gICAgICogYSBjaGlsZCBub2RlLiBJZiBhIHBob25lIG51bWJlciBpcyBmb3VuZCwgdGhlIEhpdFRlc3RSZXN1bHQgdHlwZSBpcyBzZXQKLSAgICAgKiB0byBQSE9ORV9UWVBFIGFuZCB0aGUgcGhvbmUgbnVtYmVyIGlzIHNldCBpbiB0aGUgImV4dHJhIiBmaWVsZCBvZgotICAgICAqIEhpdFRlc3RSZXN1bHQuIElmIGEgbWFwIGFkZHJlc3MgaXMgZm91bmQsIHRoZSBIaXRUZXN0UmVzdWx0IHR5cGUgaXMgc2V0Ci0gICAgICogdG8gR0VPX1RZUEUgYW5kIHRoZSBhZGRyZXNzIGlzIHNldCBpbiB0aGUgImV4dHJhIiBmaWVsZCBvZiBIaXRUZXN0UmVzdWx0LgotICAgICAqIElmIGFuIGVtYWlsIGFkZHJlc3MgaXMgZm91bmQsIHRoZSBIaXRUZXN0UmVzdWx0IHR5cGUgaXMgc2V0IHRvIEVNQUlMX1RZUEUKLSAgICAgKiBhbmQgdGhlIGVtYWlsIGlzIHNldCBpbiB0aGUgImV4dHJhIiBmaWVsZCBvZiBIaXRUZXN0UmVzdWx0LiBPdGhlcndpc2UsCi0gICAgICogSGl0VGVzdFJlc3VsdCB0eXBlIGlzIHNldCB0byBVTktOT1dOX1RZUEUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldEhpdFRlc3RSZXN1bHQoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSGl0VGVzdFJlc3VsdCBnZXRIaXRUZXN0UmVzdWx0KCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gbUluaXRpYWxIaXRUZXN0UmVzdWx0OwpAQCAtMjk4MCwxOSArMjgzMyw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdCB0aGUgYW5jaG9yIG9yIGltYWdlIGVsZW1lbnQgVVJMIGF0IHRoZSBsYXN0IHRhcHBlZCBwb2ludC4KLSAgICAgKiBJZiBocmVmTXNnIGlzIG51bGwsIHRoaXMgbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkgYW5kIGRvZXMgbm90Ci0gICAgICogZGlzcGF0Y2ggaHJlZk1zZyB0byBpdHMgdGFyZ2V0LiBJZiB0aGUgdGFwcGVkIHBvaW50IGhpdHMgYW4gaW1hZ2UsCi0gICAgICogYW4gYW5jaG9yLCBvciBhbiBpbWFnZSBpbiBhbiBhbmNob3IsIHRoZSBtZXNzYWdlIGFzc29jaWF0ZXMKLSAgICAgKiBzdHJpbmdzIGluIG5hbWVkIGtleXMgaW4gaXRzIGRhdGEuIFRoZSB2YWx1ZSBwYWlyZWQgd2l0aCB0aGUga2V5Ci0gICAgICogbWF5IGJlIGFuIGVtcHR5IHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBocmVmTXNnIFRoaXMgbWVzc2FnZSB3aWxsIGJlIGRpc3BhdGNoZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZQotICAgICAqICAgICAgICAgICAgICAgIHJlcXVlc3QuIFRoZSBtZXNzYWdlIGRhdGEgY29udGFpbnMgdGhyZWUga2V5czoKLSAgICAgKiAgICAgICAgICAgICAgICAtICJ1cmwiIHJldHVybnMgdGhlIGFuY2hvcidzIGhyZWYgYXR0cmlidXRlLgotICAgICAqICAgICAgICAgICAgICAgIC0gInRpdGxlIiByZXR1cm5zIHRoZSBhbmNob3IncyB0ZXh0LgotICAgICAqICAgICAgICAgICAgICAgIC0gInNyYyIgcmV0dXJucyB0aGUgaW1hZ2UncyBzcmMgYXR0cmlidXRlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNyZXF1ZXN0Rm9jdXNOb2RlSHJlZihNZXNzYWdlKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0Rm9jdXNOb2RlSHJlZihNZXNzYWdlIGhyZWZNc2cpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKGhyZWZNc2cgPT0gbnVsbCkgewpAQCAtMzAxMywxMiArMjg1Niw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdCB0aGUgdXJsIG9mIHRoZSBpbWFnZSBsYXN0IHRvdWNoZWQgYnkgdGhlIHVzZXIuIG1zZyB3aWxsIGJlIHNlbnQKLSAgICAgKiB0byBpdHMgdGFyZ2V0IHdpdGggYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB1cmwgYXMgaXRzIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgVGhpcyBtZXNzYWdlIHdpbGwgYmUgZGlzcGF0Y2hlZCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIHJlcXVlc3QKLSAgICAgKiAgICAgICAgICAgIGFzIHRoZSBkYXRhIG1lbWJlciB3aXRoICJ1cmwiIGFzIGtleS4gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbC4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjcmVxdWVzdEltYWdlUmVmKE1lc3NhZ2UpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RJbWFnZVJlZihNZXNzYWdlIG1zZykgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBpZiAoMCA9PSBtTmF0aXZlQ2xhc3MpIHJldHVybjsgLy8gY2xpZW50IGlzbid0IGluaXRpYWxpemVkCkBAIC0zNTIxLDExICszMzYxLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIHVybCBmb3IgdGhlIGN1cnJlbnQgcGFnZS4gVGhpcyBpcyBub3QgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSB1cmwKLSAgICAgKiBwYXNzZWQgdG8gV2ViVmlld0NsaWVudC5vblBhZ2VTdGFydGVkIGJlY2F1c2UgYWx0aG91Z2ggdGhlIGxvYWQgZm9yCi0gICAgICogdGhhdCB1cmwgaGFzIGJlZ3VuLCB0aGUgY3VycmVudCBwYWdlIG1heSBub3QgaGF2ZSBjaGFuZ2VkLgotICAgICAqIEByZXR1cm4gVGhlIHVybCBmb3IgdGhlIGN1cnJlbnQgcGFnZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZ2V0VXJsKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIFdlYkhpc3RvcnlJdGVtIGggPSBtQ2FsbGJhY2tQcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKS5nZXRDdXJyZW50SXRlbSgpOwpAQCAtMzUzMywxMyArMzM3MSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBvcmlnaW5hbCB1cmwgZm9yIHRoZSBjdXJyZW50IHBhZ2UuIFRoaXMgaXMgbm90IGFsd2F5cyB0aGUgc2FtZQotICAgICAqIGFzIHRoZSB1cmwgcGFzc2VkIHRvIFdlYlZpZXdDbGllbnQub25QYWdlU3RhcnRlZCBiZWNhdXNlIGFsdGhvdWdoIHRoZQotICAgICAqIGxvYWQgZm9yIHRoYXQgdXJsIGhhcyBiZWd1biwgdGhlIGN1cnJlbnQgcGFnZSBtYXkgbm90IGhhdmUgY2hhbmdlZC4KLSAgICAgKiBBbHNvLCB0aGVyZSBtYXkgaGF2ZSBiZWVuIHJlZGlyZWN0cyByZXN1bHRpbmcgaW4gYSBkaWZmZXJlbnQgdXJsIHRvIHRoYXQKLSAgICAgKiBvcmlnaW5hbGx5IHJlcXVlc3RlZC4KLSAgICAgKiBAcmV0dXJuIFRoZSB1cmwgdGhhdCB3YXMgb3JpZ2luYWxseSByZXF1ZXN0ZWQgZm9yIHRoZSBjdXJyZW50IHBhZ2UuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldE9yaWdpbmFsVXJsKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRPcmlnaW5hbFVybCgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgV2ViSGlzdG9yeUl0ZW0gaCA9IG1DYWxsYmFja1Byb3h5LmdldEJhY2tGb3J3YXJkTGlzdCgpLmdldEN1cnJlbnRJdGVtKCk7CkBAIC0zNTQ3LDEwICszMzgxLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIHRpdGxlIGZvciB0aGUgY3VycmVudCBwYWdlLiBUaGlzIGlzIHRoZSB0aXRsZSBvZiB0aGUgY3VycmVudCBwYWdlCi0gICAgICogdW50aWwgV2ViVmlld0NsaWVudC5vblJlY2VpdmVkVGl0bGUgaXMgY2FsbGVkLgotICAgICAqIEByZXR1cm4gVGhlIHRpdGxlIGZvciB0aGUgY3VycmVudCBwYWdlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRUaXRsZSgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIFdlYkhpc3RvcnlJdGVtIGggPSBtQ2FsbGJhY2tQcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKS5nZXRDdXJyZW50SXRlbSgpOwpAQCAtMzU1OCwxMCArMzM5MSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBmYXZpY29uIGZvciB0aGUgY3VycmVudCBwYWdlLiBUaGlzIGlzIHRoZSBmYXZpY29uIG9mIHRoZSBjdXJyZW50Ci0gICAgICogcGFnZSB1bnRpbCBXZWJWaWV3Q2xpZW50Lm9uUmVjZWl2ZWRJY29uIGlzIGNhbGxlZC4KLSAgICAgKiBAcmV0dXJuIFRoZSBmYXZpY29uIGZvciB0aGUgY3VycmVudCBwYWdlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRGYXZpY29uKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEJpdG1hcCBnZXRGYXZpY29uKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBXZWJIaXN0b3J5SXRlbSBoID0gbUNhbGxiYWNrUHJveHkuZ2V0QmFja0ZvcndhcmRMaXN0KCkuZ2V0Q3VycmVudEl0ZW0oKTsKQEAgLTM1NjksMzcgKzM0MDEsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIHRvdWNoIGljb24gdXJsIGZvciB0aGUgYXBwbGUtdG91Y2gtaWNvbiA8bGluaz4gZWxlbWVudCwgb3IKLSAgICAgKiBhIFVSTCBvbiB0aGlzIHNpdGUncyBzZXJ2ZXIgcG9pbnRpbmcgdG8gdGhlIHN0YW5kYXJkIGxvY2F0aW9uIG9mIGEKLSAgICAgKiB0b3VjaCBpY29uLgotICAgICAqIEBoaWRlCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldFRvdWNoSWNvblVybCgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG91Y2hJY29uVXJsKCkgewogICAgICAgICBXZWJIaXN0b3J5SXRlbSBoID0gbUNhbGxiYWNrUHJveHkuZ2V0QmFja0ZvcndhcmRMaXN0KCkuZ2V0Q3VycmVudEl0ZW0oKTsKICAgICAgICAgcmV0dXJuIGggIT0gbnVsbCA/IGguZ2V0VG91Y2hJY29uVXJsKCkgOiBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJvZ3Jlc3MgZm9yIHRoZSBjdXJyZW50IHBhZ2UuCi0gICAgICogQHJldHVybiBUaGUgcHJvZ3Jlc3MgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYmV0d2VlbiAwIGFuZCAxMDAuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldFByb2dyZXNzKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRQcm9ncmVzcygpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgcmV0dXJuIG1DYWxsYmFja1Byb3h5LmdldFByb2dyZXNzKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSBIVE1MIGNvbnRlbnQuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldENvbnRlbnRIZWlnaHQoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldENvbnRlbnRIZWlnaHQoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIHJldHVybiBtQ29udGVudEhlaWdodDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgSFRNTCBjb250ZW50LgotICAgICAqIEBoaWRlCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldENvbnRlbnRXaWR0aCgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudFdpZHRoKCkgewogICAgICAgICByZXR1cm4gbUNvbnRlbnRXaWR0aDsKICAgICB9CkBAIC0zNjEyLDMyICszNDQzLDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGF1c2UgYWxsIGxheW91dCwgcGFyc2luZywgYW5kIEphdmFTY3JpcHQgdGltZXJzIGZvciBhbGwgd2Vidmlld3MuIFRoaXMKLSAgICAgKiBpcyBhIGdsb2JhbCByZXF1ZXN0cywgbm90IHJlc3RyaWN0ZWQgdG8ganVzdCB0aGlzIHdlYnZpZXcuIFRoaXMgY2FuIGJlCi0gICAgICogdXNlZnVsIGlmIHRoZSBhcHBsaWNhdGlvbiBoYXMgYmVlbiBwYXVzZWQuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3BhdXNlVGltZXJzKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcGF1c2VUaW1lcnMoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5QQVVTRV9USU1FUlMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc3VtZSBhbGwgbGF5b3V0LCBwYXJzaW5nLCBhbmQgSmF2YVNjcmlwdCB0aW1lcnMgZm9yIGFsbCB3ZWJ2aWV3cy4KLSAgICAgKiBUaGlzIHdpbGwgcmVzdW1lIGRpc3BhdGNoaW5nIGFsbCB0aW1lcnMuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3Jlc3VtZVRpbWVycygpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlc3VtZVRpbWVycygpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlJFU1VNRV9USU1FUlMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhbGwgdGhpcyB0byBwYXVzZSBhbnkgZXh0cmEgcHJvY2Vzc2luZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBXZWJWaWV3IGFuZAotICAgICAqIGl0cyBhc3NvY2lhdGVkIERPTSwgcGx1Z2lucywgSmF2YVNjcmlwdCBldGMuIEZvciBleGFtcGxlLCBpZiB0aGUgV2ViVmlldwotICAgICAqIGlzIHRha2VuIG9mZnNjcmVlbiwgdGhpcyBjb3VsZCBiZSBjYWxsZWQgdG8gcmVkdWNlIHVubmVjZXNzYXJ5IENQVSBvcgotICAgICAqIG5ldHdvcmsgdHJhZmZpYy4gV2hlbiB0aGUgV2ViVmlldyBpcyBhZ2FpbiAiYWN0aXZlIiwgY2FsbCBvblJlc3VtZSgpLgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IHRoaXMgZGlmZmVycyBmcm9tIHBhdXNlVGltZXJzKCksIHdoaWNoIGFmZmVjdHMgYWxsIFdlYlZpZXdzLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNvblBhdXNlKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKCFtSXNQYXVzZWQpIHsKQEAgLTM2NzQsOCArMzUwMCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2FsbCB0aGlzIHRvIHJlc3VtZSBhIFdlYlZpZXcgYWZ0ZXIgYSBwcmV2aW91cyBjYWxsIHRvIG9uUGF1c2UoKS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjb25SZXN1bWUoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKG1Jc1BhdXNlZCkgewpAQCAtMzY5NywyOSArMzUyNCwyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmlldyBpcyBwYXVzZWQsIG1lYW5pbmcgb25QYXVzZSgpIHdhcyBjYWxsZWQuIENhbGxpbmcKLSAgICAgKiBvblJlc3VtZSgpIHNldHMgdGhlIHBhdXNlZCBzdGF0ZSBiYWNrIHRvIGZhbHNlLgotICAgICAqIEBoaWRlCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2lzUGF1c2VkKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNQYXVzZWQoKSB7CiAgICAgICAgIHJldHVybiBtSXNQYXVzZWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2FsbCB0aGlzIHRvIGluZm9ybSB0aGUgdmlldyB0aGF0IG1lbW9yeSBpcyBsb3cgc28gdGhhdCBpdCBjYW4KLSAgICAgKiBmcmVlIGFueSBhdmFpbGFibGUgbWVtb3J5LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNmcmVlTWVtb3J5KCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZnJlZU1lbW9yeSgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkZSRUVfTUVNT1JZKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgcmVzb3VyY2UgY2FjaGUuIE5vdGUgdGhhdCB0aGUgY2FjaGUgaXMgcGVyLWFwcGxpY2F0aW9uLCBzbwotICAgICAqIHRoaXMgd2lsbCBjbGVhciB0aGUgY2FjaGUgZm9yIGFsbCBXZWJWaWV3cyB1c2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIGluY2x1ZGVEaXNrRmlsZXMgSWYgZmFsc2UsIG9ubHkgdGhlIFJBTSBjYWNoZSBpcyBjbGVhcmVkLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNjbGVhckNhY2hlKGJvb2xlYW4pfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoYm9vbGVhbiBpbmNsdWRlRGlza0ZpbGVzKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIC8vIE5vdGU6IHRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGEgc3RhdGljIG1ldGhvZCBhcyBpdCBjbGVhcnMgY2FjaGUgZm9yIGFsbApAQCAtMzczMCwxNyArMzU1NCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIE1ha2Ugc3VyZSB0aGF0IGNsZWFyaW5nIHRoZSBmb3JtIGRhdGEgcmVtb3ZlcyB0aGUgYWRhcHRlciBmcm9tIHRoZQotICAgICAqIGN1cnJlbnRseSBmb2N1c2VkIHRleHRmaWVsZCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2NsZWFyRm9ybURhdGEoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhckZvcm1EYXRhKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgYi82MDgzMDQxCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGVsbCB0aGUgV2ViVmlldyB0byBjbGVhciBpdHMgaW50ZXJuYWwgYmFjay9mb3J3YXJkIGxpc3QuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2NsZWFySGlzdG9yeSgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsZWFySGlzdG9yeSgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgbUNhbGxiYWNrUHJveHkuZ2V0QmFja0ZvcndhcmRMaXN0KCkuc2V0Q2xlYXJQZW5kaW5nKCk7CkBAIC0zNzQ4LDQ2ICszNTczLDM3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIFNTTCBwcmVmZXJlbmNlcyB0YWJsZSBzdG9yZWQgaW4gcmVzcG9uc2UgdG8gcHJvY2VlZGluZyB3aXRoIFNTTAotICAgICAqIGNlcnRpZmljYXRlIGVycm9ycy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjY2xlYXJTc2xQcmVmZXJlbmNlcygpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsZWFyU3NsUHJlZmVyZW5jZXMoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5DTEVBUl9TU0xfUFJFRl9UQUJMRSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBXZWJCYWNrRm9yd2FyZExpc3QgZm9yIHRoaXMgV2ViVmlldy4gVGhpcyBjb250YWlucyB0aGUKLSAgICAgKiBiYWNrL2ZvcndhcmQgbGlzdCBmb3IgdXNlIGluIHF1ZXJ5aW5nIGVhY2ggaXRlbSBpbiB0aGUgaGlzdG9yeSBzdGFjay4KLSAgICAgKiBUaGlzIGlzIGEgY29weSBvZiB0aGUgcHJpdmF0ZSBXZWJCYWNrRm9yd2FyZExpc3Qgc28gaXQgY29udGFpbnMgb25seSBhCi0gICAgICogc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgc3RhdGUuIE11bHRpcGxlIGNhbGxzIHRvIHRoaXMgbWV0aG9kIG1heSByZXR1cm4KLSAgICAgKiBkaWZmZXJlbnQgb2JqZWN0cy4gVGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIHdpbGwgbm90IGJlCi0gICAgICogdXBkYXRlZCB0byByZWZsZWN0IGFueSBuZXcgc3RhdGUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2NvcHlCYWNrRm9yd2FyZExpc3QoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgV2ViQmFja0ZvcndhcmRMaXN0IGNvcHlCYWNrRm9yd2FyZExpc3QoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIHJldHVybiBtQ2FsbGJhY2tQcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKS5jbG9uZSgpOwogICAgIH0KIAotICAgIC8qCi0gICAgICogSGlnaGxpZ2h0IGFuZCBzY3JvbGwgdG8gdGhlIG5leHQgb2NjdXJhbmNlIG9mIFN0cmluZyBpbiBmaW5kQWxsLgotICAgICAqIFdyYXBzIHRoZSBwYWdlIGluZmluaXRlbHksIGFuZCBzY3JvbGxzLiAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIKLSAgICAgKiBjYWxsaW5nIGZpbmRBbGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9yd2FyZCBEaXJlY3Rpb24gdG8gc2VhcmNoLgorICAgIC8qKgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNmaW5kTmV4dChib29sZWFuKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmaW5kTmV4dChib29sZWFuIGZvcndhcmQpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZAogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuRklORF9ORVhULCBmb3J3YXJkID8gMSA6IDApOwogICAgIH0KIAotICAgIC8qCi0gICAgICogRmluZCBhbGwgaW5zdGFuY2VzIG9mIGZpbmQgb24gdGhlIHBhZ2UgYW5kIGhpZ2hsaWdodCB0aGVtLgotICAgICAqIEBwYXJhbSBmaW5kICBTdHJpbmcgdG8gZmluZC4KLSAgICAgKiBAcmV0dXJuIGludCAgVGhlIG51bWJlciBvZiBvY2N1cmFuY2VzIG9mIHRoZSBTdHJpbmcgImZpbmQiCi0gICAgICogICAgICAgICAgICAgIHRoYXQgd2VyZSBmb3VuZC4KKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZmluZEFsbChTdHJpbmcpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZmluZEFsbChTdHJpbmcgZmluZCkgewogICAgICAgICByZXR1cm4gZmluZEFsbEJvZHkoZmluZCwgZmFsc2UpOwogICAgIH0KQEAgLTM5MzUsOSArMzc1MSwxMCBAQAogICAgICAgICByZXR1cm4gV2ViVmlld0NvcmUubmF0aXZlRmluZEFkZHJlc3MoYWRkciwgY2FzZUluc2Vuc2l0aXZlKTsKICAgICB9CiAKLSAgICAvKgotICAgICAqIENsZWFyIHRoZSBoaWdobGlnaHRpbmcgc3Vycm91bmRpbmcgdGV4dCBtYXRjaGVzIGNyZWF0ZWQgYnkgZmluZEFsbC4KKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjY2xlYXJNYXRjaGVzKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xlYXJNYXRjaGVzKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApCkBAIC0zOTY1LDExICszNzgyLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBRdWVyeSB0aGUgZG9jdW1lbnQgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIGFueSBpbWFnZSByZWZlcmVuY2VzLiBUaGUKLSAgICAgKiBtZXNzYWdlIG9iamVjdCB3aWxsIGJlIGRpc3BhdGNoZWQgd2l0aCBhcmcxIGJlaW5nIHNldCB0byAxIGlmIGltYWdlcwotICAgICAqIHdlcmUgZm91bmQgYW5kIDAgaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgaW1hZ2VzLgotICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGF0Y2hlZCB3aXRoIHRoZSByZXN1bHQuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2RvY3VtZW50SGFzSW1hZ2VzKE1lc3NhZ2UpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRvY3VtZW50SGFzSW1hZ2VzKE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKQEAgLTQzOTYsMTAgKzQyMTEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgV2ViVmlld0NsaWVudCB0aGF0IHdpbGwgcmVjZWl2ZSB2YXJpb3VzIG5vdGlmaWNhdGlvbnMgYW5kCi0gICAgICogcmVxdWVzdHMuIFRoaXMgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IGhhbmRsZXIuCi0gICAgICogQHBhcmFtIGNsaWVudCBBbiBpbXBsZW1lbnRhdGlvbiBvZiBXZWJWaWV3Q2xpZW50LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNzZXRXZWJWaWV3Q2xpZW50KFdlYlZpZXdDbGllbnQpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFdlYlZpZXdDbGllbnQoV2ViVmlld0NsaWVudCBjbGllbnQpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgbUNhbGxiYWNrUHJveHkuc2V0V2ViVmlld0NsaWVudChjbGllbnQpOwpAQCAtNDQxNiwyMiArNDIzMCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIHRoZSBpbnRlcmZhY2UgdG8gYmUgdXNlZCB3aGVuIGNvbnRlbnQgY2FuIG5vdCBiZSBoYW5kbGVkIGJ5Ci0gICAgICogdGhlIHJlbmRlcmluZyBlbmdpbmUsIGFuZCBzaG91bGQgYmUgZG93bmxvYWRlZCBpbnN0ZWFkLiBUaGlzIHdpbGwgcmVwbGFjZQotICAgICAqIHRoZSBjdXJyZW50IGhhbmRsZXIuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIEFuIGltcGxlbWVudGF0aW9uIG9mIERvd25sb2FkTGlzdGVuZXIuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3NldERvd25sb2FkTGlzdGVuZXIoRG93bmxvYWRMaXN0ZW5lcil9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RG93bmxvYWRMaXN0ZW5lcihEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1DYWxsYmFja1Byb3h5LnNldERvd25sb2FkTGlzdGVuZXIobGlzdGVuZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgY2hyb21lIGhhbmRsZXIuIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgV2ViQ2hyb21lQ2xpZW50IGZvcgotICAgICAqIHVzZSBpbiBoYW5kbGluZyBKYXZhU2NyaXB0IGRpYWxvZ3MsIGZhdmljb25zLCB0aXRsZXMsIGFuZCB0aGUgcHJvZ3Jlc3MuCi0gICAgICogVGhpcyB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgaGFuZGxlci4KLSAgICAgKiBAcGFyYW0gY2xpZW50IEFuIGltcGxlbWVudGF0aW9uIG9mIFdlYkNocm9tZUNsaWVudC4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjc2V0V2ViQ2hyb21lQ2xpZW50KFdlYkNocm9tZUNsaWVudCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0V2ViQ2hyb21lQ2xpZW50KFdlYkNocm9tZUNsaWVudCBjbGllbnQpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgbUNhbGxiYWNrUHJveHkuc2V0V2ViQ2hyb21lQ2xpZW50KGNsaWVudCk7CkBAIC00NDY3LDExICs0Mjc3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIFBpY3R1cmUgbGlzdGVuZXIuIFRoaXMgaXMgYW4gaW50ZXJmYWNlIHVzZWQgdG8gcmVjZWl2ZQotICAgICAqIG5vdGlmaWNhdGlvbnMgb2YgYSBuZXcgUGljdHVyZS4KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQW4gaW1wbGVtZW50YXRpb24gb2YgV2ViVmlldy5QaWN0dXJlTGlzdGVuZXIuCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm93IG9ic29sZXRlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNzZXRQaWN0dXJlTGlzdGVuZXIoUGljdHVyZUxpc3RlbmVyKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFBpY3R1cmVMaXN0ZW5lcihQaWN0dXJlTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKQEAgLTQ0OTUsMzEgKzQzMDMsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGluamVjdHMgdGhlIHN1cHBsaWVkIEphdmEgb2JqZWN0IGludG8gdGhlIFdlYlZpZXcuIFRoZQotICAgICAqIG9iamVjdCBpcyBpbmplY3RlZCBpbnRvIHRoZSBKYXZhU2NyaXB0IGNvbnRleHQgb2YgdGhlIG1haW4gZnJhbWUsIHVzaW5nCi0gICAgICogdGhlIHN1cHBsaWVkIG5hbWUuIFRoaXMgYWxsb3dzIHRoZSBKYXZhIG9iamVjdCB0byBiZSBhY2Nlc3NlZCBmcm9tCi0gICAgICogSmF2YVNjcmlwdC4gTm90ZSB0aGF0IHRoYXQgaW5qZWN0ZWQgb2JqZWN0cyB3aWxsIG5vdCBhcHBlYXIgaW4KLSAgICAgKiBKYXZhU2NyaXB0IHVudGlsIHRoZSBwYWdlIGlzIG5leHQgKHJlKWxvYWRlZC4gRm9yIGV4YW1wbGU6Ci0gICAgICogPHByZT4gd2ViVmlldy5hZGRKYXZhc2NyaXB0SW50ZXJmYWNlKG5ldyBPYmplY3QoKSwgImluamVjdGVkT2JqZWN0Iik7Ci0gICAgICogd2ViVmlldy5sb2FkRGF0YSgiPCFET0NUWVBFIGh0bWw+PHRpdGxlPjwvdGl0bGU+IiwgInRleHQvaHRtbCIsIG51bGwpOwotICAgICAqIHdlYlZpZXcubG9hZFVybCgiamF2YXNjcmlwdDphbGVydChpbmplY3RlZE9iamVjdC50b1N0cmluZygpKSIpOzwvcHJlPgotICAgICAqIDxwPjxzdHJvbmc+SU1QT1JUQU5UOjwvc3Ryb25nPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+IGFkZEphdmFzY3JpcHRJbnRlcmZhY2UoKSBjYW4gYmUgdXNlZCB0byBhbGxvdyBKYXZhU2NyaXB0IHRvIGNvbnRyb2wKLSAgICAgKiB0aGUgaG9zdCBhcHBsaWNhdGlvbi4gVGhpcyBpcyBhIHBvd2VyZnVsIGZlYXR1cmUsIGJ1dCBhbHNvIHByZXNlbnRzIGEKLSAgICAgKiBzZWN1cml0eSByaXNrLiBVc2Ugb2YgdGhpcyBtZXRob2QgaW4gYSBXZWJWaWV3IGNvbnRhaW5pbmcgdW50cnVzdGVkCi0gICAgICogY29udGVudCBjb3VsZCBhbGxvdyBhbiBhdHRhY2tlciB0byBtYW5pcHVsYXRlIHRoZSBob3N0IGFwcGxpY2F0aW9uIGluCi0gICAgICogdW5pbnRlbmRlZCB3YXlzLCBleGVjdXRpbmcgSmF2YSBjb2RlIHdpdGggdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBob3N0Ci0gICAgICogYXBwbGljYXRpb24uIFVzZSBleHRyZW1lIGNhcmUgd2hlbiB1c2luZyB0aGlzIG1ldGhvZCBpbiBhIFdlYlZpZXcgd2hpY2gKLSAgICAgKiBjb3VsZCBjb250YWluIHVudHJ1c3RlZCBjb250ZW50LgotICAgICAqIDxsaT4gSmF2YVNjcmlwdCBpbnRlcmFjdHMgd2l0aCBKYXZhIG9iamVjdCBvbiBhIHByaXZhdGUsIGJhY2tncm91bmQKLSAgICAgKiB0aHJlYWQgb2YgdGhlIFdlYlZpZXcuIENhcmUgaXMgdGhlcmVmb3JlIHJlcXVpcmVkIHRvIG1haW50YWluIHRocmVhZAotICAgICAqIHNhZmV0eS48L2xpPgotICAgICAqIDwvdWw+PC9wPgotICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIEphdmEgb2JqZWN0IHRvIGluamVjdCBpbnRvIHRoZSBXZWJWaWV3J3MgSmF2YVNjcmlwdAotICAgICAqICAgICAgICAgICAgICAgY29udGV4dC4gTnVsbCB2YWx1ZXMgYXJlIGlnbm9yZWQuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdXNlZCB0byBleHBvc2UgdGhlIGluc3RhbmNlIGluIEphdmFTY3JpcHQuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2FkZEphdmFzY3JpcHRJbnRlcmZhY2UoT2JqZWN0LCBTdHJpbmcpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEphdmFzY3JpcHRJbnRlcmZhY2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CkBAIC00NTMyLDkgKzQzMTgsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBwcmV2aW91c2x5IGFkZGVkIEphdmFTY3JpcHQgaW50ZXJmYWNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIGludGVyZmFjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0byByZW1vdmUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3JlbW92ZUphdmFzY3JpcHRJbnRlcmZhY2UoU3RyaW5nKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZW1vdmVKYXZhc2NyaXB0SW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmIChtV2ViVmlld0NvcmUgIT0gbnVsbCkgewpAQCAtNDU0NSwzMyArNDMzMSwyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgV2ViU2V0dGluZ3Mgb2JqZWN0IHVzZWQgdG8gY29udHJvbCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMKLSAgICAgKiBXZWJWaWV3LgotICAgICAqIEByZXR1cm4gQSBXZWJTZXR0aW5ncyBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoaXMgV2ViVmlldydzCi0gICAgICogICAgICAgICBzZXR0aW5ncy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZ2V0U2V0dGluZ3MoKX0KKyAgICAgKiBOb3RlIHRoaXMgcmV0dXJucyBXZWJTZXR0aW5nc0NsYXNzaWMsIGEgc3ViLWNsYXNzIG9mIFdlYlNldHRpbmdzLCB3aGljaCBjYW4gYmUgdXNlZAorICAgICAqIHRvIGFjY2VzcyBleHRlbnNpb24gQVBJcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgV2ViU2V0dGluZ3NDbGFzc2ljIGdldFNldHRpbmdzKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gKG1XZWJWaWV3Q29yZSAhPSBudWxsKSA/IG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpIDogbnVsbDsKICAgICB9CiAKLSAgIC8qKgotICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBsb2FkZWQgcGx1Z2lucy4KLSAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgY3VycmVudGx5IGxvYWRlZCBwbHVnaW5zLgotICAgICoKLSAgICAqIEBoaWRlCi0gICAgKiBAZGVwcmVjYXRlZCBUaGlzIHdhcyB1c2VkIGZvciBHZWFycywgd2hpY2ggaGFzIGJlZW4gZGVwcmVjYXRlZC4KLSAgICAqLworICAgIC8qKgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRQbHVnaW5MaXN0KCl9CisgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBQbHVnaW5MaXN0IGdldFBsdWdpbkxpc3QoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIHJldHVybiBuZXcgUGx1Z2luTGlzdCgpOwogICAgIH0KIAotICAgLyoqCi0gICAgKiBAaGlkZQotICAgICogQGRlcHJlY2F0ZWQgVGhpcyB3YXMgdXNlZCBmb3IgR2VhcnMsIHdoaWNoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCi0gICAgKi8KKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjcmVmcmVzaFBsdWdpbnMoYm9vbGVhbil9CisgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCByZWZyZXNoUGx1Z2lucyhib29sZWFuIHJlbG9hZE9wZW5QYWdlcykgewogICAgICAgICBjaGVja1RocmVhZCgpOwpAQCAtNDkyNSw5ICs0NzA2LDcgQEAKICAgICAgICAgaWYgKGxheWVyID09IDAgfHwgaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgewogICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnJlc3VtZVdlYktpdERyYXcoKTsKICAgICAgICAgfSBlbHNlIGlmIChxdWV1ZUZ1bGwpIHsKLSAgICAgICAgICAgIC8vIHRlbXBvcmFyaWx5IGRpc2FibGUgd2Via2l0IGRyYXcgdGhyb3R0bGluZwotICAgICAgICAgICAgLy8gVE9ETzogcmUtZW5hYmxlCi0gICAgICAgICAgICAvLyBtV2ViVmlld0NvcmUucGF1c2VXZWJLaXREcmF3KCk7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUucGF1c2VXZWJLaXREcmF3KCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUhUTUw1VmlkZW9WaWV3UHJveHkgIT0gbnVsbCkgewpAQCAtNTUwMywxMCArNTI4Miw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHB1dCB0aGUgV2ViVmlldyBpbnRvIHRleHQgc2VsZWN0aW9uIG1vZGUuCi0gICAgICogRG8gbm90IHJlbHkgb24gdGhpcyBmdW5jdGlvbmFsaXR5OyBpdCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3cgb2Jzb2xldGUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2VtdWxhdGVTaGlmdEhlbGQoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGVtdWxhdGVTaGlmdEhlbGQoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CkBAIC01NzQ5LDYgKzU1MjcsOSBAQAogICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKGZhbHNlKTsKICAgICAgICAgICAgIG1LZXlzUHJlc3NlZC5jbGVhcigpOwogICAgICAgICB9CisgICAgICAgIGlmICghbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZShtVG91Y2hIaWdobGlnaHRSZWdpb24uZ2V0Qm91bmRzKCkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBzZXRHTFJlY3RWaWV3cG9ydCgpIHsKQEAgLTU5NjAsNiArNTc0MSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKCFtV2ViVmlldy5pc0ZvY3VzZWQoKSkgeworICAgICAgICAgICAgbVdlYlZpZXcucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCBldiArICIgYXQgIiArIGV2LmdldEV2ZW50VGltZSgpCiAgICAgICAgICAgICAgICAgKyAiIG1Ub3VjaE1vZGU9IiArIG1Ub3VjaE1vZGUKQEAgLTYzNDksNyArNjEzNCw2IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDogewotICAgICAgICAgICAgICAgIGlmICghbVdlYlZpZXcuaXNGb2N1c2VkKCkpIG1XZWJWaWV3LnJlcXVlc3RGb2N1cygpOwogICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhlIHRvdWNoIGV2ZW50cyBmcm9tIFVJIHRocmVhZCB0byBXZWJDb3JlIHRocmVhZAogICAgICAgICAgICAgICAgIGlmIChzaG91bGRGb3J3YXJkVG91Y2hFdmVudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwpAQCAtNzE3MSwxOCArNjk1NSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHZpZXcgY29udGFpbmluZyB6b29tIGNvbnRyb2xzIGkuZS4gKy8tIGJ1dHRvbnMuIFRoZSBjYWxsZXIgaXMKLSAgICAgKiBpbiBjaGFyZ2Ugb2YgaW5zdGFsbGluZyB0aGlzIHZpZXcgdG8gdGhlIHZpZXcgaGllcmFyY2h5LiBUaGlzIHZpZXcgd2lsbAotICAgICAqIGJlY29tZSB2aXNpYmxlIHdoZW4gdGhlIHVzZXIgc3RhcnRzIHNjcm9sbGluZyB2aWEgdG91Y2ggYW5kIGZhZGUgYXdheSBpZgotICAgICAqIHRoZSB1c2VyIGRvZXMgbm90IGludGVyYWN0IHdpdGggaXQuCi0gICAgICogPHAvPgotICAgICAqIEFQSSB2ZXJzaW9uIDMgaW50cm9kdWNlcyBhIGJ1aWx0LWluIHpvb20gbWVjaGFuaXNtIHRoYXQgaXMgc2hvd24KLSAgICAgKiBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBNYXBWaWV3LiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgYXBwcm9hY2ggZm9yCi0gICAgICogc2hvd2luZyB0aGUgem9vbSBVSS4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIFRoZSBidWlsdC1pbiB6b29tIG1lY2hhbmlzbSBpcyBwcmVmZXJyZWQsIHNlZQotICAgICAqICAgICAgICAgICAgIHtAbGluayBXZWJTZXR0aW5ncyNzZXRCdWlsdEluWm9vbUNvbnRyb2xzKGJvb2xlYW4pfS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZ2V0Wm9vbUNvbnRyb2xzKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgVmlldyBnZXRab29tQ29udHJvbHMoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CkBAIC03MjEwLDM0ICs2OTg1LDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBXZWJWaWV3IGNhbiBiZSB6b29tZWQgaW4uCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2Nhblpvb21JbigpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNhblpvb21JbigpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5jYW5ab29tSW4oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIFdlYlZpZXcgY2FuIGJlIHpvb21lZCBvdXQuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2Nhblpvb21PdXQoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBjYW5ab29tT3V0KCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtIHpvb20gaW4gaW4gdGhlIHdlYnZpZXcKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgem9vbSBpbiBzdWNjZWVkcy4gRkFMU0UgaWYgbm8gem9vbSBjaGFuZ2VzLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyN6b29tSW4oKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiB6b29tSW4oKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuem9vbUluKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGVyZm9ybSB6b29tIG91dCBpbiB0aGUgd2VidmlldwotICAgICAqIEByZXR1cm4gVFJVRSBpZiB6b29tIG91dCBzdWNjZWVkcy4gRkFMU0UgaWYgbm8gem9vbSBjaGFuZ2VzLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyN6b29tT3V0KCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gem9vbU91dCgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci56b29tT3V0KCk7CkBAIC04NTIxLDcgKzgyOTgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtRm9jdXNlZE5vZGUubUhhc0ZvY3VzICYmICFtV2ViVmlldy5pc0luVG91Y2hNb2RlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAhbUZvY3VzZWROb2RlLm1FZGl0YWJsZTsKKyAgICAgICAgICAgIHJldHVybiBtRHJhd0N1cnNvclJpbmcgJiYgIW1Gb2N1c2VkTm9kZS5tRWRpdGFibGU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Gb2N1c2VkTm9kZS5tSGFzRm9jdXMgJiYgbUZvY3VzZWROb2RlLm1FZGl0YWJsZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtOTE4Miw5ICs4OTU5LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IuIEl0J3Mgd2hpdGUgYnkgZGVmYXVsdC4gUGFzcwotICAgICAqIHplcm8gdG8gbWFrZSB0aGUgdmlldyB0cmFuc3BhcmVudC4KLSAgICAgKiBAcGFyYW0gY29sb3IgICB0aGUgQVJHQiBjb2xvciBkZXNjcmliZWQgYnkgQ29sb3IuamF2YQorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNzZXRCYWNrZ3JvdW5kQ29sb3IoaW50KX0KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoaW50IGNvbG9yKSB7CkBAIC05MTkzLDggKzg5NjgsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIG5vdyBvYnNvbGV0ZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZGVidWdEdW1wKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBkZWJ1Z0R1bXAoKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0NoZWNrZWRUZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0NoZWNrZWRUZXh0Vmlldy5qYXZhCmluZGV4IDYwM2NlYTEuLjE5ZmI3YjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DaGVja2VkVGV4dFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ2hlY2tlZFRleHRWaWV3LmphdmEKQEAgLTE2MSw2ICsxNjEsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWRkaW5nUmVsYXRpdmUoaW50IHN0YXJ0LCBpbnQgdG9wLCBpbnQgZW5kLCBpbnQgYm90dG9tKSB7CisgICAgICAgIHN1cGVyLnNldFBhZGRpbmdSZWxhdGl2ZShzdGFydCwgdG9wLCBlbmQsIGJvdHRvbSk7CisgICAgICAgIG1CYXNlUGFkZGluZyA9IGdldFBhZGRpbmdFbmQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhCmluZGV4IDVjOTc1OTMuLmY0ZDVkNzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFBvcHVwV2luZG93LmphdmEKQEAgLTEwODAsNiArMTA4MCw4IEBACiAgICAgICAgICAgICBpZiAoIW1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0U2V0KSB7CiAgICAgICAgICAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQgPSAtbVRlbXBSZWN0LnRvcDsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1UZW1wUmVjdC5zZXRFbXB0eSgpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gTWF4IGhlaWdodCBhdmFpbGFibGUgb24gdGhlIHNjcmVlbiBmb3IgYSBwb3B1cC4KQEAgLTEwOTIsNyArMTA5NCwyNSBAQAogICAgICAgICAgICAgcmV0dXJuIG1heEhlaWdodCArIHBhZGRpbmc7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBpbnQgbGlzdENvbnRlbnQgPSBtRHJvcERvd25MaXN0Lm1lYXN1cmVIZWlnaHRPZkNoaWxkcmVuKE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVELAorICAgICAgICBmaW5hbCBpbnQgY2hpbGRXaWR0aFNwZWM7CisgICAgICAgIHN3aXRjaCAobURyb3BEb3duV2lkdGgpIHsKKyAgICAgICAgICAgIGNhc2UgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ6CisgICAgICAgICAgICAgICAgY2hpbGRXaWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLndpZHRoUGl4ZWxzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIChtVGVtcFJlY3QubGVmdCArIG1UZW1wUmVjdC5yaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ6CisgICAgICAgICAgICAgICAgY2hpbGRXaWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLndpZHRoUGl4ZWxzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIChtVGVtcFJlY3QubGVmdCArIG1UZW1wUmVjdC5yaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY2hpbGRXaWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMobURyb3BEb3duV2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBsaXN0Q29udGVudCA9IG1Ecm9wRG93bkxpc3QubWVhc3VyZUhlaWdodE9mQ2hpbGRyZW4oY2hpbGRXaWR0aFNwZWMsCiAgICAgICAgICAgICAgICAgMCwgTGlzdFZpZXcuTk9fUE9TSVRJT04sIG1heEhlaWdodCAtIG90aGVySGVpZ2h0cywgLTEpOwogICAgICAgICAvLyBhZGQgcGFkZGluZyBvbmx5IGlmIHRoZSBsaXN0IGhhcyBpdGVtcyBpbiBpdCwgdGhhdCB3YXkgd2UgZG9uJ3Qgc2hvdwogICAgICAgICAvLyB0aGUgcG9wdXAgaWYgaXQgaXMgbm90IG5lZWRlZApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwZWxsQ2hlY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwZWxsQ2hlY2tlci5qYXZhCmluZGV4IGRmMjk5NmMuLjlhZmFlZTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGVsbENoZWNrZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3BlbGxDaGVja2VyLmphdmEKQEAgLTI5MCw3ICsyOTAsNyBAQAogCiAgICAgcHJpdmF0ZSBTcGVsbENoZWNrU3BhbiBvbkdldFN1Z2dlc3Rpb25zSW50ZXJuYWwoCiAgICAgICAgICAgICBTdWdnZXN0aW9uc0luZm8gc3VnZ2VzdGlvbnNJbmZvLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIGlmIChzdWdnZXN0aW9uc0luZm8uZ2V0Q29va2llKCkgIT0gbUNvb2tpZSkgeworICAgICAgICBpZiAoc3VnZ2VzdGlvbnNJbmZvID09IG51bGwgfHwgc3VnZ2VzdGlvbnNJbmZvLmdldENvb2tpZSgpICE9IG1Db29raWUpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIEVkaXRhYmxlIGVkaXRhYmxlID0gKEVkaXRhYmxlKSBtVGV4dFZpZXcuZ2V0VGV4dCgpOwpAQCAtMzM1LDkgKzMzNSwxNSBAQAogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgZmluYWwgU2VudGVuY2VTdWdnZXN0aW9uc0luZm8gc3NpID0gcmVzdWx0c1tpXTsKKyAgICAgICAgICAgIGlmIChzc2kgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgU3BlbGxDaGVja1NwYW4gc3BlbGxDaGVja1NwYW4gPSBudWxsOwogICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzc2kuZ2V0U3VnZ2VzdGlvbnNDb3VudCgpOyArK2opIHsKICAgICAgICAgICAgICAgICBmaW5hbCBTdWdnZXN0aW9uc0luZm8gc3VnZ2VzdGlvbnNJbmZvID0gc3NpLmdldFN1Z2dlc3Rpb25zSW5mb0F0KGopOworICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uc0luZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IG9mZnNldCA9IHNzaS5nZXRPZmZzZXRBdChqKTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc3NpLmdldExlbmd0aEF0KGopOwogICAgICAgICAgICAgICAgIGZpbmFsIFNwZWxsQ2hlY2tTcGFuIHNjcyA9IG9uR2V0U3VnZ2VzdGlvbnNJbnRlcm5hbCgKQEAgLTQ4OCwxMSArNDk0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlLnJlbW92ZVNwYW4obVJhbmdlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBTdG9wIHNwZWxsIGNoZWNraW5nIHdoZW4gdGhlcmUgYXJlIG5vIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlLgorICAgICAgICAgICAgICAgIGlmICh3b3JkRW5kIDwgc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB3b3JkU3RhcnQgPSByZWdpb25FbmQ7CiAgICAgICAgICAgICAgICAgLy8gVE9ETzogRmluZCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHNlbnRlbmNlLgogICAgICAgICAgICAgICAgIC8vIFNldCBzcGFuIHdpdGggdGhlIGNvbnRleHQKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3BlbGxDaGVja1N0YXJ0ID0gIE1hdGgubWluKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIE1hdGgubWF4KHdvcmRTdGFydCwgcmVnaW9uRW5kIC0gV09SRF9JVEVSQVRPUl9JTlRFUlZBTCkpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzcGVsbENoZWNrU3RhcnQgPSAgTWF0aC5tYXgoCisgICAgICAgICAgICAgICAgICAgICAgICAwLCBNYXRoLm1pbih3b3JkU3RhcnQsIHJlZ2lvbkVuZCAtIFdPUkRfSVRFUkFUT1JfSU5URVJWQUwpKTsKICAgICAgICAgICAgICAgICBpZiAocmVnaW9uRW5kIDw9IHNwZWxsQ2hlY2tTdGFydCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEKaW5kZXggODljNTA2Zi4uNjU0MDYxMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKaW5kZXggNDcxOTAxMC4uNGM4OTIxOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKQEAgLTIxNiw2ICsyMTYsOCBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVCb3R0b20KICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RleHRWaWV3X2RyYXdhYmxlUmlnaHQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RleHRWaWV3X2RyYXdhYmxlTGVmdAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVTdGFydAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVFbmQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RleHRWaWV3X2RyYXdhYmxlUGFkZGluZwogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfbGluZVNwYWNpbmdFeHRyYQogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfbGluZVNwYWNpbmdNdWx0aXBsaWVyCkBAIC0xNTIwLDggKzE1MjIsNiBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHN0YXJ0IHBhZGRpbmcgb2YgdGhlIHZpZXcsIHBsdXMgc3BhY2UgZm9yIHRoZSBzdGFydAogICAgICAqIERyYXdhYmxlIGlmIGFueS4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRDb21wb3VuZFBhZGRpbmdTdGFydCgpIHsKICAgICAgICAgcmVzb2x2ZURyYXdhYmxlcygpOwpAQCAtMTUzNyw4ICsxNTM3LDYgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBlbmQgcGFkZGluZyBvZiB0aGUgdmlldywgcGx1cyBzcGFjZSBmb3IgdGhlIGVuZAogICAgICAqIERyYXdhYmxlIGlmIGFueS4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRDb21wb3VuZFBhZGRpbmdFbmQoKSB7CiAgICAgICAgIHJlc29sdmVEcmF3YWJsZXMoKTsKQEAgLTE2MzYsOCArMTYzNCw2IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdG90YWwgc3RhcnQgcGFkZGluZyBvZiB0aGUgdmlldywgaW5jbHVkaW5nIHRoZSBzdGFydAogICAgICAqIERyYXdhYmxlIGlmIGFueS4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUb3RhbFBhZGRpbmdTdGFydCgpIHsKICAgICAgICAgcmV0dXJuIGdldENvbXBvdW5kUGFkZGluZ1N0YXJ0KCk7CkBAIC0xNjQ2LDggKzE2NDIsNiBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHRvdGFsIGVuZCBwYWRkaW5nIG9mIHRoZSB2aWV3LCBpbmNsdWRpbmcgdGhlIGVuZAogICAgICAqIERyYXdhYmxlIGlmIGFueS4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUb3RhbFBhZGRpbmdFbmQoKSB7CiAgICAgICAgIHJldHVybiBnZXRDb21wb3VuZFBhZGRpbmdFbmQoKTsKQEAgLTE4NDksOCArMTg0Myw2IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVUb3AKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19kcmF3YWJsZUVuZAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RleHRWaWV3X2RyYXdhYmxlQm90dG9tCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbXBvdW5kRHJhd2FibGVzUmVsYXRpdmUoRHJhd2FibGUgc3RhcnQsIERyYXdhYmxlIHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBlbmQsIERyYXdhYmxlIGJvdHRvbSkgewpAQCAtMTk3Miw4ICsxOTY0LDYgQEAKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19kcmF3YWJsZVRvcAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RleHRWaWV3X2RyYXdhYmxlRW5kCiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVCb3R0b20KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZVdpdGhJbnRyaW5zaWNCb3VuZHMoaW50IHN0YXJ0LCBpbnQgdG9wLCBpbnQgZW5kLAogICAgICAgICAgICAgaW50IGJvdHRvbSkgewpAQCAtMTk5Niw4ICsxOTg2LDYgQEAKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19kcmF3YWJsZVRvcAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RleHRWaWV3X2RyYXdhYmxlRW5kCiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVCb3R0b20KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZVdpdGhJbnRyaW5zaWNCb3VuZHMoRHJhd2FibGUgc3RhcnQsIERyYXdhYmxlIHRvcCwKICAgICAgICAgICAgIERyYXdhYmxlIGVuZCwgRHJhd2FibGUgYm90dG9tKSB7CkBAIC0yMDM0LDggKzIwMjIsNiBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBkcmF3YWJsZXMgZm9yIHRoZSBzdGFydCwgdG9wLCBlbmQsIGFuZCBib3R0b20gYm9yZGVycy4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIERyYXdhYmxlW10gZ2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZSgpIHsKICAgICAgICAgZmluYWwgRHJhd2FibGVzIGRyID0gbURyYXdhYmxlczsKQEAgLTIwOTMsNiArMjA3OSwyMCBAQAogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UGFkZGluZ1JlbGF0aXZlKGludCBzdGFydCwgaW50IHRvcCwgaW50IGVuZCwgaW50IGJvdHRvbSkgeworICAgICAgICBpZiAoc3RhcnQgIT0gZ2V0UGFkZGluZ1N0YXJ0KCkgfHwKKyAgICAgICAgICAgIGVuZCAhPSBnZXRQYWRkaW5nRW5kKCkgfHwKKyAgICAgICAgICAgIHRvcCAhPSBtUGFkZGluZ1RvcCB8fAorICAgICAgICAgICAgYm90dG9tICE9IG1QYWRkaW5nQm90dG9tKSB7CisgICAgICAgICAgICBudWxsTGF5b3V0cygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIHN1cGVyIGNhbGwgd2lsbCByZXF1ZXN0TGF5b3V0KCkKKyAgICAgICAgc3VwZXIuc2V0UGFkZGluZ1JlbGF0aXZlKHN0YXJ0LCB0b3AsIGVuZCwgYm90dG9tKTsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGF1dG9saW5rIG1hc2sgb2YgdGhlIHRleHQuICBTZWUge0BsaW5rCiAgICAgICogYW5kcm9pZC50ZXh0LnV0aWwuTGlua2lmeSNBTEwgTGlua2lmeS5BTEx9IGFuZCBwZWVycyBmb3IKQEAgLTQyODAsNiArNDI4MCwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2NyZWVuU3RhdGVDaGFuZ2VkKGludCBzY3JlZW5TdGF0ZSkgeworICAgICAgICBzdXBlci5vblNjcmVlblN0YXRlQ2hhbmdlZChzY3JlZW5TdGF0ZSk7CisgICAgICAgIGlmIChtRWRpdG9yICE9IG51bGwpIGdldEVkaXRvcigpLm9uU2NyZWVuU3RhdGVDaGFuZ2VkKHNjcmVlblN0YXRlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhZGRpbmdPZmZzZXRSZXF1aXJlZCgpIHsKICAgICAgICAgcmV0dXJuIG1TaGFkb3dSYWRpdXMgIT0gMCB8fCBtRHJhd2FibGVzICE9IG51bGw7CiAgICAgfQpAQCAtMTE0MDAsNiArMTE0MDYsMzAgQEAKICAgICAgICAgICAgIGhpZGVDb250cm9sbGVycygpOwogICAgICAgICB9CiAKKyAgICAgICAgdm9pZCBvblNjcmVlblN0YXRlQ2hhbmdlZChpbnQgc2NyZWVuU3RhdGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc2NyZWVuU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNDUkVFTl9TVEFURV9PTjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdW1lQmxpbmsoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTQ1JFRU5fU1RBVEVfT0ZGOgorICAgICAgICAgICAgICAgICAgICBzdXNwZW5kQmxpbmsoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc3VzcGVuZEJsaW5rKCkgeworICAgICAgICAgICAgaWYgKG1CbGluayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUJsaW5rLmNhbmNlbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlc3VtZUJsaW5rKCkgeworICAgICAgICAgICAgaWYgKG1CbGluayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUJsaW5rLnVuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgbWFrZUJsaW5rKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICB2b2lkIGFkanVzdElucHV0VHlwZShib29sZWFuIHBhc3N3b3JkLCBib29sZWFuIHBhc3N3b3JkSW5wdXRUeXBlLAogICAgICAgICAgICAgICAgIGJvb2xlYW4gd2ViUGFzc3dvcmRJbnB1dFR5cGUsIGJvb2xlYW4gbnVtYmVyUGFzc3dvcmRJbnB1dFR5cGUpIHsKICAgICAgICAgICAgIC8vIG1JbnB1dFR5cGUgaGFzIGJlZW4gc2V0IGZyb20gaW5wdXRUeXBlLCBwb3NzaWJseSBtb2RpZmllZCBieSBtSW5wdXRNZXRob2QuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9CYXNlSVdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvQmFzZUlXaW5kb3cuamF2YQppbmRleCBiMjI3NzAwLi4xNWQxMWQ4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9CYXNlSVdpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0Jhc2VJV2luZG93LmphdmEKQEAgLTQ5LDYgKzQ5LDkgQEAKICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaEdldE5ld1N1cmZhY2UoKSB7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hTY3JlZW5TdGF0ZShib29sZWFuIG9uKSB7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgd2luZG93Rm9jdXNDaGFuZ2VkKGJvb2xlYW4gaGFzRm9jdXMsIGJvb2xlYW4gdG91Y2hFbmFibGVkKSB7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2puaS9BbmRyb2lkLm1rIGIvY29yZS9qbmkvQW5kcm9pZC5tawppbmRleCBjNmQzY2VlLi5jMzg5Y2Y3IDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkLm1rCisrKyBiL2NvcmUvam5pL0FuZHJvaWQubWsKQEAgLTE1OSwxMiArMTU5LDEwIEBACiAJJChKTklfSF9JTkNMVURFKSBcCiAJJChMT0NBTF9QQVRIKS9hbmRyb2lkL2dyYXBoaWNzIFwKIAkkKExPQ0FMX1BBVEgpLy4uLy4uL2xpYnMvaHd1aSBcCi0JJChMT0NBTF9QQVRIKS8uLi8uLi9vcGVuZ2wvbGlicyBcCisJJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9uYXRpdmUvb3BlbmdsL2xpYnMgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBibHVlZHJvaWQpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgbGliaGFyZHdhcmUpL2hhcmR3YXJlIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgbGliaGFyZHdhcmVfbGVnYWN5KS9oYXJkd2FyZV9sZWdhY3kgXAotCSQoTE9DQUxfUEFUSCkvLi4vLi4vaW5jbHVkZS91aSBcCi0JJChMT0NBTF9QQVRIKS8uLi8uLi9pbmNsdWRlL3V0aWxzIFwKIAlleHRlcm5hbC9za2lhL2luY2x1ZGUvY29yZSBcCiAJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2VmZmVjdHMgXAogCWV4dGVybmFsL3NraWEvaW5jbHVkZS9pbWFnZXMgXApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC93ZWJ2aWV3X3NlbGVjdF9zaW5nbGVjaG9pY2UueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC93ZWJ2aWV3X3NlbGVjdF9zaW5nbGVjaG9pY2UueG1sCmluZGV4IGMwNzUzYTguLmQzYzNjMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2Vidmlld19zZWxlY3Rfc2luZ2xlY2hvaWNlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYnZpZXdfc2VsZWN0X3NpbmdsZWNob2ljZS54bWwKQEAgLTE3LDEzICsxNyw3IEBACiA8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RleHQxIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCi0gICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgotICAgIGFuZHJvaWQ6dGV4dENvbG9yPSI/YW5kcm9pZDphdHRyL3RleHRDb2xvckFsZXJ0RGlhbG9nTGlzdEl0ZW0iCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkaXAiCi0gICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjdkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL2Ryb3Bkb3duTGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCiAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCiAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvc3Bpbm5lckRyb3BEb3duSXRlbVN0eWxlIgogICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9hY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKaW5kZXggNDkwMGE1ZC4uOWFjMjBmYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCkBAIC0yNiw4ICsyNiw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJnaWdhYnl0ZVNob3J0IiBtc2dpZD0iMzI1OTg4MjQ1NTIxMjE5MzIxNCI+IkdCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGVyYWJ5dGVTaG9ydCIgbXNnaWQ9IjIzMTYxMzAxODE1OTE4Njk2MiI+IlRCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGV0YWJ5dGVTaG9ydCIgbXNnaWQ9IjU2Mzc4MTY2ODAxNDQ5OTAyMTkiPiJQQiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaWxlU2l6ZVN1ZmZpeCAoOTE2NDI5Mjc5MTUwMDUzMTk0OSkgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbGVTaXplU3VmZml4IiBtc2dpZD0iOTE2NDI5Mjc5MTUwMDUzMTk0OSI+Ijx4bGlmZjpnIGlkPSJVTklUIj4lMiRzPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJOVU1CRVIiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idW50aXRsZWQiIG1zZ2lkPSI0NjM4OTU2OTU0ODUyNzgyNTc2Ij4iJmx0O1RpdGVsbG9vcyZndDsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGxpcHNpcyIgbXNnaWQ9Ijc4OTk4Mjk1MTYwNDg4MTMyMzciPiLigKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGxpcHNpc190d29fZG90cyIgbXNnaWQ9IjEyMjgwNzg5OTQ4NjYwMzA3MzYiPiLigKUiPC9zdHJpbmc+CkBAIC0zMTQsOCArMzEzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2hhbmdlQ29tcG9uZW50U3RhdGUiIG1zZ2lkPSI2MzM1NTc2Nzc1NzExMDk1OTMxIj4iYWt0aXZlZXIgb2YgZGVha3RpdmVlciBwcm9ncmFta29tcG9uZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI4ODg3NDM1NzQwOTgyMjM3Mjk0Ij4iTGFhdCBkaWUgcHJvZ3JhbSB0b2Ugb20gdGUgdmVyYW5kZXIgb2YgXCduIGtvbXBvbmVudCB2YW4gYW5kZXIgcHJvZ3JhbSBnZWFrdGl2ZWVyIGlzIG9mIG5pZS4gS3dhYWR3aWxsaWdlIHByb2dyYW1tZSBrYW4gZGl0IGRhbGsgZ2VicnVpayBvbSBiZWxhbmdyaWtlIHRhYmxldHZlcm1vw6tucyB0ZSBkZWFrdGl2ZWVyLiBXZWVzIHZlcnNpZ3RpZyBtZXQgaGllcmRpZSB0b2VzdGVtbWluZywgd2FudCBkaXQga2FuIHByb2dyYW1rb21wb25lbnRlIHRvdCBcJ24gb25icnVpa2JhcmUsIGlua29uc2Vrd2VudGUgb2Ygb25zdGFiaWVsZSB0b2VzdGFuZCBicmluZy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jaGFuZ2VDb21wb25lbnRTdGF0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjE4MjcyMzI0ODQ0MTY1MDU2MTUiPiJMYWF0IGRpZSBwcm9ncmFtIHRvZSBvbSB0ZSB2ZXJhbmRlciBvZiBcJ24ga29tcG9uZW50IHZhbiBhbmRlciBwcm9ncmFtIGdlYWt0aXZlZXIgaXMgb2YgbmllLiBLd2FhZHdpbGxpZ2UgcHJvZ3JhbW1lIGthbiBkaXQgZ2VicnVpayBvbSBiZWxhbmdyaWtlIGZvb252ZXJtb8OrbnMgdGUgZGVha3RpdmVlci4gV2VlcyB2ZXJzaWd0aWcgbWV0IGhpZXJkaWUgdG9lc3RlbW1pbmcsIHdhbnQgZGl0IGthbiBwcm9ncmFta29tcG9uZW50ZSB0b3QgXCduIG9uYnJ1aWtiYXJlLCBpbmtvbnNla3dlbnRlIG9mIG9uc3RhYmllbGUgdG9lc3RhbmQgYnJpbmcuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ncmFudFJldm9rZVBlcm1pc3Npb25zIiBtc2dpZD0iNDYyNzMxNTM1MTA5MzUwODc5NSI+InRvZXN0ZW1taW5ncyB0ZSB2ZXJsZWVuIG9mIHRlIGhlcnJvZXAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ncmFudFJldm9rZVBlcm1pc3Npb25zIiBtc2dpZD0iNDA4ODY0MjY1NDA4NTg1MDY2MiI+IkxhYXQgXCduIHByb2dyYW0gdG9lIG9tIHNwZXNpZmlla2UgdG9lc3RlbW1pbmdzIHRlIHZlcmxlZW4gb2YgdGUgaGVycm9lcCB2aXIgZGllIGJldHJva2tlIHByb2dyYW0gb2YgYW5kZXIgcHJvZ3JhbW1lLiBTa2FkZWxpa2UgcHJvZ3JhbW1lIGthbiBkaXQgZ2VicnVpayBvbSB0b2VnYW5nIHRlIHZlcmtyeSB0b3Qga2VubWVya2Ugd2FhcnZvb3IgankgbmllIHRvZXN0ZW1taW5nIHZlcmxlZW4gaGV0IG5pZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2dyYW50UmV2b2tlUGVybWlzc2lvbnMiIG1zZ2lkPSI0NjI3MzE1MzUxMDkzNTA4Nzk1Ij4idmVybGVlbiBvZiBoZXJyb2VwIHRvZXN0ZW1taW5ncyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2dyYW50UmV2b2tlUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDg4NjQyNjU0MDg1ODUwNjYyIj4iTGFhdCBcJ24gcHJvZ3JhbSB0b2Ugb20gc3Blc2lmaWVrZSB0b2VzdGVtbWluZ3MgdGUgdmVybGVlbiBvZiB0ZSBoZXJyb2VwIHZpciBkaWUgYmV0cm9ra2UgcHJvZ3JhbSBvZiBhbmRlciBwcm9ncmFtbWUuIEt3YWFkd2lsbGlnZSBwcm9ncmFtbWUga2FuIGRpdCBnZWJydWlrIG9tIHRvZWdhbmcgdGUgdmVya3J5IHRvdCBrZW5tZXJrZSB3YWFydm9vciBqeSBuaWUgdG9lc3RlbW1pbmcgdmVybGVlbiBoZXQgbmllLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0UHJlZmVycmVkQXBwbGljYXRpb25zIiBtc2dpZD0iODQ2MzE4MTYyODY5NTM5NjM5MSI+InN0ZWwgdm9vcmtldXJwcm9ncmFtbWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRQcmVmZXJyZWRBcHBsaWNhdGlvbnMiIG1zZ2lkPSI0OTczOTg2NzYyMjQxNzgzNzEyIj4iTGFhdCBkaWUgcHJvZ3JhbSB0b2Ugb20gam91IHZvb3JrZXVyLXByb2dyYW1tZSB0ZSB2ZXJhbmRlci4gS3dhYWR3aWxsaWdlIHByb2dyYW1tZSBrYW4gc3RpbHdlZyBkaWUgcHJvZ3JhbW1lIHdhdCBsb29wLCB2ZXJhbmRlciwgd2F0IGpvdSBiZXN0YWFuZGUgcHJvZ3JhbW1lIGJlZHJpZWcgb20gcHJpdmF0ZSBkYXRhIG9vciBqb3UgaW4gdGUgc2FtZWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVNldHRpbmdzIiBtc2dpZD0iMTM2NTUyMzQ5NzM5NTE0MzcwNCI+InZlcmFuZGVyIGdsb2JhbGUgc3RlbHNlbGluc3RlbGxpbmdzIjwvc3RyaW5nPgpAQCAtNjcyLDggKzY3MSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYWNldW5sb2NrX211bHRpcGxlX2ZhaWx1cmVzIiBtc2dpZD0iNzU0MTM3NTgzMDIyNzkyNDI5Ij4iTWFrc2ltdW0gZ2VzaWdvbnRzbHVpdC1wb2dpbmdzIG9vcnNrcnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI4MDU3NzYyODI4MzU1NTcyMzE1Ij4iTGFhaSwgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iR2VoZWYuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCAoNDQ3NzI2NDg0OTM4Njg1MDI2NikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjQ0NzcyNjQ4NDkzODY4NTAyNjYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9sb3dfYmF0dGVyeSIgbXNnaWQ9IjE0ODI4NzM5ODE5MTkyNDk3NDAiPiJLb3BwZWwgam91IGhlcmxhYWllci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQiIG1zZ2lkPSI3MzgxNDk5MjE3NzMyMjI3Mjk1Ij4iR2VlbiBTSU0ta2FhcnQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSIxNTE2NTkxOTYwOTU3OTE0NzQiPiJHZWVuIFNJTS1rYWFydCBpbiB0YWJsZXQgbmllLiI8L3N0cmluZz4KQEAgLTcyMiwxMCArNzIwLDggQEAKICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX3N5bWJvbF9rZXkiIG1zZ2lkPSI5OTIyODA3NTYyNTY1MzYwNDIiPiI/MTIzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfYWxwaGFfa2V5IiBtc2dpZD0iODAwMTA5NjE3NTE2NzQ4NTY0OSI+IkFCQyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX2FsdF9rZXkiIG1zZ2lkPSIxMjg0ODIwOTQyNjIwMjg4Njc4Ij4iQUxUIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGhvdXJfYW1wbSAoNDU4NDMzODA4MzUyOTM1NTk4MikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBob3VyX2NhcF9hbXBtICgyMDgzNDY1OTkyOTQwNDQ0MzY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9hbXBtIiBtc2dpZD0iNDU4NDMzODA4MzUyOTM1NTk4MiI+Ijx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IkFNUE0iPiVQPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfY2FwX2FtcG0iIG1zZ2lkPSIyMDgzNDY1OTkyOTQwNDQ0MzY2Ij4iPHhsaWZmOmcgaWQ9IkhPVVIiPiUtbDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iQU1QTSI+JXA8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3RfZmFpbGVkIiBtc2dpZD0iNTQxMDI3MDMyOTExNDIxMjA0MSI+IkZhYnJpZWt0b2V0cyBoZXQgZ2VmYWFsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3Rfbm90X3N5c3RlbSIgbXNnaWQ9IjQ0MzUyMDE2NTY3NjcyNzY3MjMiPiJEaWUgRkFDVE9SWV9URVNULWhhbmRlbGluZyB3b3JkIG5ldCBvbmRlcnN0ZXVuIHZpciBwYWtrZXR0ZSB3YXQgaW4gL3N5c3RlbS9hcHAgZ2XDr25zdGFsbGVlciBpcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9ub19hY3Rpb24iIG1zZ2lkPSI4NzI5OTE4NzQ3OTk5OTg1NjEiPiJHZWVuIHBha2tldCBpcyBnZXZpbmQgd2F0IGRpZSBGQUNUT1JZX1RFU1QtaGFuZGVsaW5nIGJpZWQgbmllLiI8L3N0cmluZz4KQEAgLTczNyw4ICs3MzMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjQ1OTUwNDY1MTU0MDAyNjg4ODEiPiJXZW5rOiBEdWJiZWx0aWsgb20gaW4gZW4gdWl0IHRlIHpvZW0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfdGhpc19mb3JtIiBtc2dpZD0iNDYxNjc1ODg0MTE1NzgxNjY3NiI+Ik91dG92dWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9hdXRvZmlsbCIgbXNnaWQ9IjcxMDM0OTUwNzAxODA1OTA4MTQiPiJTdGVsIG91dG92dWwgb3AiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfYWRkcmVzc19uYW1lX3NlcGFyYXRvciAoNjM1MDE0NTE1NDc3OTcwNjc3MikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3NfbmFtZV9zZXBhcmF0b3IiIG1zZ2lkPSI2MzUwMTQ1MTU0Nzc5NzA2NzcyIj4iICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9uYW1lX2Zvcm1hdCIgbXNnaWQ9IjMyNjgwNDEwNTQ4OTkyMTQ5NDUiPiIkMSQyJDMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfc2VwYXJhdG9yIiBtc2dpZD0iNzQ4MzMwNzg5MzE3MDMyNDEyOSI+IiwgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X2Zvcm1hdCIgbXNnaWQ9IjQ4NzQ0NTk0NTU3ODY4MjczNDQiPiIkMSQyJDMiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbAppbmRleCBmMjUzOGM2Li5kYzc0ZDk0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKQEAgLTM0MSw3ICszNDEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNDYzNzM2NjcyMzc5MzA0NTYwMyI+IuGIjeGKrSDhiqXhipXhi7Ag4Yqg4YqV4YmwIOGIteGInSDhiqXhipMg4Yuo4YuV4YuN4YmC4YurIOGImOGIqOGMgyDhjaMg4Ymj4YqV4YmwIOGImOGIs+GIquGLqyDhi4jhiLXhjKUg4Yuo4Ymw4Yqo4Yib4Ym5IOGLqOGMjeGIjSDhiJjhjIjhiIjhjKsg4YiY4Yio4YyDIOGIiOGImOGIiOGLiOGMpSDhi4jhi63hiJ0g4YiI4Yib4Yqo4YiNIOGIiOGImOGJsOGMjeGJoOGIquGLq+GLjSDhi63hjYjhiYXhi7PhiInhjaHhjaHhi63hiIThiJ0g4Yib4YiI4Ym1IOGIjOGIjuGJvSDhiJjhibDhjI3hiaDhiKrhi6vhi47hib0g4YiK4YiI4Yup4YiFIOGLreGJveGIi+GIiSDhiqXhipMg4YiI4YiM4YiO4Ym9IOGLqOGImOGMiOGIiOGMqyDhiJjhiKjhjIPhiIXhipUg4Yut4YiN4Yqr4YiJ4Y2h4Y2hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU29jaWFsU3RyZWFtIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMTI2ODkyMDk1NjE1MjQxOTE3MCI+IuGLqOGKoOGKleGJsOGKlSDhiJvhiIXhiaDhiKvhi4og4Yuo4YuN4Yut4Yut4Ym1IOGKreGNjeGIjuGJvSDhiqDhipXhiaXhiaUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkU29jaWFsU3RyZWFtIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzQxOTA1MDgwODU0NzMzNTMyMCI+IiDhiqjhiqDhipXhibAg4YyT4Yuw4Yqe4Ym9IOGIm+GIheGJoOGIq+GLiiDhi53hiJvhipThi47hib3hipUg4Yql4YqV4Yuy4Yuw4Yit4Yi14Ymj4Ym44YuNIOGKpeGKkyDhiqXhipXhi7Lhi6vhiJjhiLPhiLXhiI0g4YiI4YiY4Ymw4YyN4Ymg4Yiq4Yur4YuN4Yut4Y2I4YmF4Yuz4YiJ4Y2h4Y2hIOGJsOGKleGKruGIjSDhiqDhi5jhiI0g4YiY4Ymw4YyN4Ymg4Yiq4Yur4YuO4Ym9IOGLreGIheGKlSDhiJjhi7PhiKjhiLsg4Ymj4YqV4Ymw4YqTIOGJoOGMk+GLsOGKnuGJveGIhSDhiJjhiqvhiqjhiI0g4Ymg4Yib4YiF4Ymg4Yir4YuKIOGKoOGLjeGJs+GIqOGImOGIqOGJpuGJvSDhi6vhiIkg4Yuo4YyN4YiNIOGJsOGMjeGJo+GJpuGJtuGJveGKlSDhiIjhiJjhi7PhiKjhiLUg4YiK4Yyg4YmA4YiZ4Ymg4Ym1IOGLreGJveGIi+GIieGNoeGNoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVTb2NpYWxTdHJlYW0iIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNTA0MTc5MjIyNDkzMjM1NjQ1Ij4i4YuI4YuwIOGLq+GKleGJsCDhiJvhiIXhiaDhiKvhi4og4Yuo4YuN4Yut4Yut4Ym1IOGKreGNjeGIjuGJvSDhjLvhjY0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlU29jaWFsU3RyZWFtIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzUwNDE3OTIyMjQ5MzIzNTY0NSI+IuGLiOGLsCDhi6jhiqDhipXhibAgIOGIm+GIheGJoOGIq+GLiiDhi6jhi43hi63hi63hibUg4Yqt4Y2N4YiO4Ym9IOGMu+GNjSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlU29jaWFsU3RyZWFtIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzQ5NjI3NzE3Njk1NTcyMTQ1MSI+IiDhi6jhjJPhi7Dhip7hib3hiIXhipUg4Yib4YiF4Ymg4Yir4YuKIOGLneGIm+GKlOGLjuGJveGKlSDhiIjhiJvhiLPhi6jhibUg4YiI4YiY4Ymw4YyN4Ymg4Yiq4Yur4YuNIOGLreGNiOGJheGLs+GIieGNoeGNoSDhibDhipXhiq7hiI0g4Yqg4YuY4YiNIOGImOGJsOGMjeGJoOGIquGLq+GLjuGJvSDhi63hiIXhipUg4YiY4Yuz4Yio4Yi7IOGMk+GLsOGKmyDhiJjhiLXhiIjhi40g4YiI4YiY4YmF4Yio4YmlIOGKpeGKkyDhi6jhi63hiIjhjY0g4YmD4YiN4YqTIOGIjOGIiyDhiJ3hiLXhjKLhiKvhi4og4YiY4Yio4YyDIOGKpeGKleGLteGJteGIsOGMpSDhiIjhiJvhi7XhiKjhjI0g4YiK4Yyg4YmA4YiZ4Ymg4Ym1IOGLreGJveGIi+GIieGNoeGNoSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZENhbGVuZGFyIiBtc2dpZD0iNTk3MjcyNzU2MDI1NzYxMjM5OCI+IuGLqOGJgOGKlSDhiJjhiYHhjKDhiKrhi6sg4Yqt4Yi14Ymw4Ym24Ym9IOGJsOGMqOGIm+GIqiDhiJrhiLXhjKXhiKvhi4og4YiY4Yio4YyDIOGKoOGKleGJpeGJpSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDYWxlbmRhciIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iMjMzODQxNDU1MTAwNDEyMjY4NyI+IuGJoOGMoeGJo+GLiiDhibDhiq7hiIUg4YiL4YutIOGLqOGJsOGKqOGIm+GJuSDhiIHhiInhipXhiJ0g4Yuo4YmA4YqVIOGImOGJgeGMoOGIquGLqyDhiq3hiLXhibDhibbhib0g4YiY4Ymw4YyN4Ymg4Yiq4Yur4YuO4Ym5IOGKpeGKleGLsuGLq+GKkOGJoSDhi63hjYjhiYXhi7PhiInhjaHhjaEg4Yur4YiIIOGJo+GIiOGJpOGJsSDhiqXhi43hiYXhipMg4Yqo4YqQ4Yua4YiFIOGLqOGJgOGKlSDhiJjhiYHhjKDhiKrhi6vhi47hib0g4Yuo4YyN4YiNIOGImOGIqOGMg+GLjuGJveGKlSDhjI7hjIIg4YiY4Ymw4YyN4Ymg4Yiq4Yur4YuO4Ym9IOGLq+GLiOGMo+GIieGNoeGNoSI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCmluZGV4IDNkYWYzM2EuLmMyNzdlZTkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbApAQCAtMjYsOCArMjYsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZ2lnYWJ5dGVTaG9ydCIgbXNnaWQ9IjMyNTk4ODI0NTUyMTIxOTMyMTQiPiLQk9CRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGVyYWJ5dGVTaG9ydCIgbXNnaWQ9IjIzMTYxMzAxODE1OTE4Njk2MiI+ItCi0JEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXRhYnl0ZVNob3J0IiBtc2dpZD0iNTYzNzgxNjY4MDE0NDk5MDIxOSI+ItCf0JEiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZmlsZVNpemVTdWZmaXggKDkxNjQyOTI3OTE1MDA1MzE5NDkpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJmaWxlU2l6ZVN1ZmZpeCIgbXNnaWQ9IjkxNjQyOTI3OTE1MDA1MzE5NDkiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lMSRzPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iVU5JVCI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1bnRpdGxlZCIgbXNnaWQ9IjQ2Mzg5NTY5NTQ4NTI3ODI1NzYiPiImbHQ70JHQtdC3INC30LDQs9C70LDQstC40LUmZ3Q7Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxsaXBzaXMiIG1zZ2lkPSI3ODk5ODI5NTE2MDQ4ODEzMjM3Ij4i4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxsaXBzaXNfdHdvX2RvdHMiIG1zZ2lkPSIxMjI4MDc4OTk0ODY2MDMwNzM2Ij4iLi4iPC9zdHJpbmc+CkBAIC02NzIsOCArNjcxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhY2V1bmxvY2tfbXVsdGlwbGVfZmFpbHVyZXMiIG1zZ2lkPSI3NTQxMzc1ODMwMjI3OTI0MjkiPiLQnNCw0LrRgdC40LzQsNC70L3QuNGP0YIg0LHRgNC+0Lkg0L7Qv9C40YLQuCDQt9CwINC+0YLQutC70Y7Rh9Cy0LDQvdC1INGBINC70LjRhtC1INC1INC90LDQtNCy0LjRiNC10L0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI4MDU3NzYyODI4MzU1NTcyMzE1Ij4i0JfQsNGA0LXQttC00LAg0YHQtSwgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLQl9Cw0YDQtdC00LXQvS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0ICg0NDc3MjY0ODQ5Mzg2ODUwMjY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iNDQ3NzI2NDg0OTM4Njg1MDI2NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5IiBtc2dpZD0iMTQ4Mjg3Mzk4MTkxOTI0OTc0MCI+ItCh0LLRitGA0LbQtdGC0LUg0LfQsNGA0Y/QtNC90L7RgtC+INGB0Lgg0YPRgdGC0YDQvtC50YHRgtCy0L4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0IiBtc2dpZD0iNzM4MTQ5OTIxNzczMjIyNzI5NSI+ItCd0Y/QvNCwIFNJTSDQutCw0YDRgtCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZSIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iMTUxNjU5MTk2MDk1NzkxNDc0Ij4i0JIg0YLQsNCx0LvQtdGC0LAg0L3Rj9C80LAgU0lNINC60LDRgNGC0LAuIjwvc3RyaW5nPgpAQCAtNzIyLDEwICs3MjAsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfc3ltYm9sX2tleSIgbXNnaWQ9Ijk5MjI4MDc1NjI1NjUzNjA0MiI+Ij8xMjMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9hbHBoYV9rZXkiIG1zZ2lkPSI4MDAxMDk2MTc1MTY3NDg1NjQ5Ij4i0JDQkdCSIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfYWx0X2tleSIgbXNnaWQ9IjEyODQ4MjA5NDI2MjAyODg2NzgiPiJBTFQiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaG91cl9hbXBtICg0NTg0MzM4MDgzNTI5MzU1OTgyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGhvdXJfY2FwX2FtcG0gKDIwODM0NjU5OTI5NDA0NDQzNjYpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJob3VyX2FtcG0iIG1zZ2lkPSI0NTg0MzM4MDgzNTI5MzU1OTgyIj4iPHhsaWZmOmcgaWQ9IkhPVVIiPiUtbDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iQU1QTSI+JVA8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9jYXBfYW1wbSIgbXNnaWQ9IjIwODM0NjU5OTI5NDA0NDQzNjYiPiI8eGxpZmY6ZyBpZD0iSE9VUiI+JS1sPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJBTVBNIj4lcDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9mYWlsZWQiIG1zZ2lkPSI1NDEwMjcwMzI5MTE0MjEyMDQxIj4i0KTQsNCx0YDQuNGH0L3QuNGP0YIg0YLQtdGB0YIg0L3QtSDQsdC1INGD0YHQv9C10YjQtdC9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3Rfbm90X3N5c3RlbSIgbXNnaWQ9IjQ0MzUyMDE2NTY3NjcyNzY3MjMiPiLQlNC10LnRgdGC0LLQuNC10YLQviBGQUNUT1JZX1RFU1Qg0YHQtSDQv9C+0LTQtNGK0YDQttCwINGB0LDQvNC+INC30LAg0L/QsNC60LXRgtC4LCDQuNC90YHRgtCw0LvQuNGA0LDQvdC4INCyIC9zeXN0ZW0vYXBwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X25vX2FjdGlvbiIgbXNnaWQ9Ijg3Mjk5MTg3NDc5OTk5ODU2MSI+ItCd0LUg0LHQtSDQvdCw0LzQtdGA0LXQvSDQv9Cw0LrQtdGCLCDQv9GA0LXQtNC+0YHRgtCw0LLRj9GJINC00LXQudGB0YLQstC40LXRgtC+IEZBQ1RPUllfVEVTVC4iPC9zdHJpbmc+CkBAIC03MzcsOCArNzMzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSI0NTk1MDQ2NTE1NDAwMjY4ODgxIj4i0KHRitCy0LXRgjog0JTQvtC60L7RgdC90LXRgtC1INC00LLRg9C60YDQsNGC0L3Qviwg0LfQsCDQtNCwINGD0LLQtdC70LjRh9C40YLQtSDQuNC70Lgg0L3QsNC80LDQu9C40YLQtSDQvNCw0YnQsNCx0LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfdGhpc19mb3JtIiBtc2dpZD0iNDYxNjc1ODg0MTE1NzgxNjY3NiI+ItCQ0LLRgtC+0L/QvtC/LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNldHVwX2F1dG9maWxsIiBtc2dpZD0iNzEwMzQ5NTA3MDE4MDU5MDgxNCI+ItCQ0LLRgtC+0L/QvtC/Ljog0J3QsNGB0YLRgNC+0LnQutCwIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX2FkZHJlc3NfbmFtZV9zZXBhcmF0b3IgKDYzNTAxNDUxNTQ3Nzk3MDY3NzIpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX25hbWVfc2VwYXJhdG9yIiBtc2dpZD0iNjM1MDE0NTE1NDc3OTcwNjc3MiI+IiAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfbmFtZV9mb3JtYXQiIG1zZ2lkPSIzMjY4MDQxMDU0ODk5MjE0OTQ1Ij4iJDEkMiQzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X3NlcGFyYXRvciIgbXNnaWQ9Ijc0ODMzMDc4OTMxNzAzMjQxMjkiPiIsICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9mb3JtYXQiIG1zZ2lkPSI0ODc0NDU5NDU1Nzg2ODI3MzQ0Ij4iJDEkMiQzIjwvc3RyaW5nPgpAQCAtNzczLDEwICs3NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2VyaWFsUG9ydCIgbXNnaWQ9IjI5OTE2Mzk5ODUyMjQ1OTgxOTMiPiLQoNCw0LfRgNC10YjQsNCy0LAg0L3QsCDQv9GA0LjRgtC10LbQsNGC0LXQu9GPINC00L7RgdGC0YrQvyDQtNC+INGB0LXRgNC40LnQvdC4INC/0L7RgNGC0L7QstC1INC/0L7RgdGA0LXQtNGB0YLQstC+0Lwg0L/RgNC40LvQvtC20L3QuNGPINC/0YDQvtCz0YDQsNC80LXQvSDQuNC90YLQtdGA0YTQtdC50YEgKEFQSSkgU2VyaWFsTWFuYWdlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNTA3Nzc3NDI5Nzk0MzQwOTI4NSI+ItCy0YrQvdGI0LXQvSDQtNC+0YHRgtGK0L8g0LTQviDQtNC+0YHRgtCw0LLRh9C40YbQuNGC0LUg0L3QsCDRgdGK0LTRitGA0LYuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYWNjZXNzQ29udGVudFByb3ZpZGVyc0V4dGVybmFsbHkiIG1zZ2lkPSI0NTQ0MzQ2NDg2Njk3ODUzNjg1Ij4i0KDQsNC30YDQtdGI0LDQstCwINC90LAg0L/RgNC40YLQtdC20LDRgtC10LvRjyDQtNC+0YHRgtGK0L8g0LTQviDQtNC+0YHRgtCw0LLRh9C40YbQuNGC0LUg0L3QsCDRgdGK0LTRitGA0LbQsNC90LjQtSDQvtGCINC60L7QvNCw0L3QtNC90LjRjyDRgNC10LQuINCd0L7RgNC80LDQu9C90LjRgtC1INC/0YDQuNC70L7QttC10L3QuNGPINCx0Lgg0YLRgNGP0LHQstCw0LvQviDQvdC40LrQvtCz0LAg0LTQsCDQvdC1INGB0LUg0L3Rg9C20LTQsNGP0YIg0L7RgiDRgtC+0LLQsC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl91cGRhdGVMb2NrICgzNTI3NTU4MzY2NjE2NjgwODg5KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3VwZGF0ZUxvY2sgKDE2NTU2MjU4MzIxNjY3Nzg0OTIpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3VwZGF0ZUxvY2siIG1zZ2lkPSIzNTI3NTU4MzY2NjE2NjgwODg5Ij4i0LHQtdC3INCw0LLRgi4g0LDQutGC0YPQsNC70LjQt9Cw0YbQuNC4INC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiLQoNCw0LfRgNC10YjQsNCy0LAg0L3QsCDQv9GA0LjRgtC10LbQsNGC0LXQu9GPINC00LAg0L/RgNC10LTQu9C+0LbQuCDQvdCwINGB0LjRgdGC0LXQvNCw0YLQsCDQuNC90YTQvtGA0LzQsNGG0LjRjyDQt9CwINGC0L7QstCwLCDQutC+0LPQsCDRidC1INC1INCy0YrQt9C80L7QttC90L4g0L3QtdC40L3RgtC10YDQsNC60YLQuNCy0L3QviDRgNC10YHRgtCw0YDRgtC40YDQsNC90LUg0LfQsCDQvdCw0LTRgdGC0YDQvtC50LLQsNC90LUg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4i0JjRgdC60LDRgtC1INC70Lgg0LHRgNCw0YPQt9GK0YDRitGCINC00LAg0LfQsNC/0L7QvNC90Lgg0YLQsNC30Lgg0L/QsNGA0L7Qu9CwPyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbm90bm93IiBtc2dpZD0iNjM4OTY3NTMxNjcwNjY5OTc1OCI+ItCd0LUg0YHQtdCz0LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX3JlbWVtYmVyIiBtc2dpZD0iNjQ5MTg3OTY3ODk5Njc0OTQ2NiI+ItCX0LDQv9C+0LzQvdGP0L3QtSI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCmluZGV4IDhlYTc3MTEuLjM4OWE2NzIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbApAQCAtNzY4LDcgKzc2OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXJpYWxQb3J0IiBtc2dpZD0iMjk5MTYzOTk4NTIyNDU5ODE5MyI+IlVtb8W+xYh1amUgZHLFvml0ZWxpIHDFmcOtc3R1cCBrIHPDqXJpb3bDvW0gcG9ydMWvbSBwb21vY8OtIHJvemhyYW7DrSBTZXJpYWxNYW5hZ2VyIEFQSS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNTA3Nzc3NDI5Nzk0MzQwOTI4NSI+ImV4dGVybsOtIHDFmcOtc3R1cCBrIHBvc2t5dG92YXRlbMWvbSBvYnNhaHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjQ1NDQzNDY0ODY2OTc4NTM2ODUiPiJVbW/FvsWIdWplIGRyxb5pdGVsaSB6w61za2F0IHogcMWZw61rYXpvdsOpaG8gxZnDoWRrdSBwxZnDrXN0dXAgayBwb3NreXRvdmF0ZWzFr20gb2JzYWh1LiBCxJvFvm7DqSBhcGxpa2FjZSBieSB0b3RvIG9wcsOhdm7Em27DrSBuZW3Em2x5IG5pa2R5IHBvxb5hZG92YXQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl91cGRhdGVMb2NrIiBtc2dpZD0iMzUyNzU1ODM2NjYxNjY4MDg4OSI+InZhcm92w6Fuw60gcMWZZWQgYXV0b21hdGlja291IGFrdHVhbGl6YWPDrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfdXBkYXRlTG9jayIgbXNnaWQ9IjM1Mjc1NTgzNjY2MTY2ODA4ODkiPiJ2YXJvdmF0IHDFmWVkIGF1dG9tYXRpY2tvdSBha3R1YWxpemFjw60iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY191cGRhdGVMb2NrIiBtc2dpZD0iMTY1NTYyNTgzMjE2Njc3ODQ5MiI+IlVtb8W+xYh1amUgZHLFvml0ZWxpIG5hdnJobm91dCBzeXN0w6ltdSBpbmZvcm1hY2UgbyB2aG9kbsOpIGRvYsSbIHBybyB1cGdyYWRlIHphxZnDrXplbsOtIG5laW50ZXJha3Rpdm7DrW0gcmVzdGFydG92w6Fuw61tLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IkNoY2V0ZSwgYWJ5IHNpIHByb2hsw63FvmXEjSB6YXBhbWF0b3ZhbCB0b3RvIGhlc2xvPyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbm90bm93IiBtc2dpZD0iNjM4OTY3NTMxNjcwNjY5OTc1OCI+Ik55bsOtIG5lIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKaW5kZXggNmZkNDU0My4uM2NhMDUzNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCkBAIC03NjksNyArNzY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYWNjZXNzQ29udGVudFByb3ZpZGVyc0V4dGVybmFsbHkiIG1zZ2lkPSI1MDc3Nzc0Mjk3OTQzNDA5Mjg1Ij4iYWRnYW5nIHRpbCBpbmRob2xkc2xldmVyYW5kw7hyZXIgZWtzdGVybnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjQ1NDQzNDY0ODY2OTc4NTM2ODUiPiJHaXZlciBpbmRlaGF2ZXJlbiBhZGdhbmcgdGlsIGluZGhvbGRzbGV2ZXJhbmTDuHJlciBmcmEgc3RhcnRzaWRlbi4gQsO4ciBhbGRyaWcgdsOmcmUgbsO4ZHZlbmRpZ3QgZm9yIG5vcm1hbGUgYXBwcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3VwZGF0ZUxvY2siIG1zZ2lkPSIzNTI3NTU4MzY2NjE2NjgwODg5Ij4idW5kZ8OlIGF1dG9tYXRpc2tlIGVuaGVkc29wZGF0ZXJpbmdlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3VwZGF0ZUxvY2siIG1zZ2lkPSIxNjU1NjI1ODMyMTY2Nzc4NDkyIj4iR2l2ZXIgaW5kZWhhdmVyZW4gcmV0IHRpbCBhdCBnaXZlIHN5c3RlbWV0IG9wbHlzbmluZ2VyIG9tLCBodm9ybsOlciBkZXQgdmlsIHbDpnJlIGV0IGdvZHQgdGlkc3B1bmt0IGZvciBlbiBpa2tlLWludGVyYWt0aXYgZ2Vuc3RhcnQgYXQgb3BncmFkZXJlIGVuaGVkZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiJHaXZlciBpbmRlaGF2ZXJlbiByZXQgdGlsIGF0IGdpdmUgc3lzdGVtZXQgb3BseXNuaW5nZXIgb20sIGh2b3Juw6VyIGRldCB2aWwgdsOmcmUgZXQgZ29kdCB0aWRzcHVua3QgZm9yIGVuIGlra2UtaW50ZXJha3RpdiBnZW5zdGFydCBmb3IgYXQgb3BncmFkZXJlIGVuaGVkZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iw5huc2tlciBkdSwgYXQgYnJvd3NlcmVuIHNrYWwgaHVza2UgZGVubmUgYWRnYW5nc2tvZGU/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9ub3Rub3ciIG1zZ2lkPSI2Mzg5Njc1MzE2NzA2Njk5NzU4Ij4iSWtrZSBudSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfcmVtZW1iZXIiIG1zZ2lkPSI2NDkxODc5Njc4OTk2NzQ5NDY2Ij4iSHVzayI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCmluZGV4IDNiN2JkMGYuLmE0YTliZmYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbApAQCAtNzY4LDEwICs3NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2VyaWFsUG9ydCIgbXNnaWQ9IjI5OTE2Mzk5ODUyMjQ1OTgxOTMiPiLYqNmHINiv2KfYsdmG2K/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+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX25vdG5vdyIgbXNnaWQ9IjYzODk2NzUzMTY3MDY2OTk3NTgiPiJOZSBkYWJhciI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sCmluZGV4IDJjOGNhMzAuLjViYjk1YWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbApAQCAtMjYsOCArMjYsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZ2lnYWJ5dGVTaG9ydCIgbXNnaWQ9IjMyNTk4ODI0NTUyMTIxOTMyMTQiPiJHQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRlcmFieXRlU2hvcnQiIG1zZ2lkPSIyMzE2MTMwMTgxNTkxODY5NjIiPiJUQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBldGFieXRlU2hvcnQiIG1zZ2lkPSI1NjM3ODE2NjgwMTQ0OTkwMjE5Ij4iUEIiPC9zdHJpbmc+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+InRpZGFrIG1lbmdnYWxha2thbiBrZW1hcyBraW5pIHBlcmFudGkgYXV0b21hdGlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiJNZW1iZW5hcmthbiBwZW1lZ2FuZyB1bnR1ayBtZW5hd2Fya2FuIG1ha2x1bWF0IGtlcGFkYSBzaXN0ZW0gdGVudGFuZyBiaWxhIGFrYW4gbWVuamFkaSBtYXNhIHlhbmcgYmFpayB1bnR1ayBidXQgc2VtdWxhIGJ1a2FuIGludGVyYWt0aWYgdW50dWsgbWVuYWlrIHRhcmFmIHBlcmFudGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iQWRha2FoIGFuZGEgbWFodSBwZW55ZW1hayBpbWJhcyBtZW5naW5nYXRpIGthdGEgbGFsdWFuIGluaT8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX25vdG5vdyIgbXNnaWQ9IjYzODk2NzUzMTY3MDY2OTk3NTgiPiJCdWthbiBzZWthcmFuZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfcmVtZW1iZXIiIG1zZ2lkPSI2NDkxODc5Njc4OTk2NzQ5NDY2Ij4iSW5nYXQiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAppbmRleCAwOTczNjI0Li42YTlmODQ2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKQEAgLTEwODgsNyArMTA4OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJpbWVfYWN0aW9uX2RlZmF1bHQiIG1zZ2lkPSIyODQwOTIxODg1NTU4MDQ1NzIxIj4iVXRmw7hyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbF9udW1iZXJfdXNpbmciIG1zZ2lkPSI1Nzg5MTc2NDI1MTY3NTczNTg2Ij4iUmluZyBudW1tZXJldCJcbiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjcmVhdGVfY29udGFjdF91c2luZyIgbXNnaWQ9IjQ5NDc0MDUyMjY3ODgxMDQ1MzgiPiJMYWcga29udGFrdCJcbiJtZWQgbnVtbWVyZXQgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JXM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZ3JhbnRfY3JlZGVudGlhbHNfcGVybWlzc2lvbl9tZXNzYWdlX2hlYWRlciIgbXNnaWQ9IjIxMDYxMDM4MTc5Mzc4NTk2NjIiPiLDiW4gZWxsZXIgZmxlcmUgYXYgZGUgZsO4bGdlbmRlIGFwcGVuZSBiZXIgb20gdGlsbGF0ZWxzZSB0aWwgw6UgZsOlIHRpbGdhbmcgdGlsIGtvbnRvZW4gZGluIGZyYSBuw6UgYXYuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ3JhbnRfY3JlZGVudGlhbHNfcGVybWlzc2lvbl9tZXNzYWdlX2hlYWRlciIgbXNnaWQ9IjIxMDYxMDM4MTc5Mzc4NTk2NjIiPiJGw7hsZ2VuZGUgYXBwKGVyKSBiZXIgb20gdGlsZ2FuZyB0aWwga29udG9lbiBkaW4gZnJhIG7DpSBhdi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJncmFudF9jcmVkZW50aWFsc19wZXJtaXNzaW9uX21lc3NhZ2VfZm9vdGVyIiBtc2dpZD0iMzEyNTIxMTM0MzM3OTM3NjU2MSI+IlZpbCBkdSB0aWxsYXRlIGRldHRlPyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImdyYW50X3Blcm1pc3Npb25zX2hlYWRlcl90ZXh0IiBtc2dpZD0iNjg3NDQ5NzQwODIwMTgyNjcwOCI+IlRpbGdhbmdzZm9yZXNww7hyc2VsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWxsb3ciIG1zZ2lkPSI3MjI1OTQ4ODExMjk2Mzg2NTUxIj4iVGlsbGF0Ijwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKaW5kZXggZDc3OTcwZC4uMjg2YzMyYyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCkBAIC0yNiw4ICsyNiw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJnaWdhYnl0ZVNob3J0IiBtc2dpZD0iMzI1OTg4MjQ1NTIxMjE5MzIxNCI+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+IiQxJDIkMyI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sCmluZGV4IDZhMDg0YzAuLmNhYzU4NmUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApAQCAtMjYsOCArMjYsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZ2lnYWJ5dGVTaG9ydCIgbXNnaWQ9IjMyNTk4ODI0NTUyMTIxOTMyMTQiPiJHTyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRlcmFieXRlU2hvcnQiIG1zZ2lkPSIyMzE2MTMwMTgxNTkxODY5NjIiPiJUTyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBldGFieXRlU2hvcnQiIG1zZ2lkPSI1NjM3ODE2NjgwMTQ0OTkwMjE5Ij4iUE8iPC9zdHJpbmc+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+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbAppbmRleCAyZWQyYWQ2Li4yODZlNmQ2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwKQEAgLTI2LDggKzI2LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImdpZ2FieXRlU2hvcnQiIG1zZ2lkPSIzMjU5ODgyNDU1MjEyMTkzMjE0Ij4iR0IiPC9zdHJpbmc+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+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3VwZGF0ZUxvY2siIG1zZ2lkPSIzNTI3NTU4MzY2NjE2NjgwODg5Ij4ia2F0aXNoYSB0YW1hYSB1c2FzaXNoYWppIGtpZmFhIGtpb3RvbWF0aWtpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiJJbmFydWh1c3UgbW1pbGlraSBrdXRvYSBtYWVsZXpvIGt3YSBtZnVtbyBrdWh1c3UgbmkgbGluaSBpdGFrdXdhIHdha2F0aSBtenVyaSB3YSB1d2FzaGFqaSB1cHlhIHVzaW90YWd1c2FuYSBpbGkga3Vib3Jlc2hhIGtpZmFhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IlVuYXRha2Ega3V2aW5qYXJpIGlsaSB1a3VtYnVrZSBuZW5vc2lyaSBoaWxpPyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbm90bm93IiBtc2dpZD0iNjM4OTY3NTMxNjcwNjY5OTc1OCI+IlNpIFNhc2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX3JlbWVtYmVyIiBtc2dpZD0iNjQ5MTg3OTY3ODk5Njc0OTQ2NiI+Ikt1bWJ1a2EiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmluZGV4IDRhYmE2N2MuLjI0YjcyNmQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCkBAIC0yNiw4ICsyNiw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJnaWdhYnl0ZVNob3J0IiBtc2dpZD0iMzI1OTg4MjQ1NTIxMjE5MzIxNCI+IkdCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGVyYWJ5dGVTaG9ydCIgbXNnaWQ9IjIzMTYxMzAxODE1OTE4Njk2MiI+IlRCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGV0YWJ5dGVTaG9ydCIgbXNnaWQ9IjU2Mzc4MTY2ODAxNDQ5OTAyMTkiPiJQQiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaWxlU2l6ZVN1ZmZpeCAoOTE2NDI5Mjc5MTUwMDUzMTk0OSkgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbGVTaXplU3VmZml4IiBtc2dpZD0iOTE2NDI5Mjc5MTUwMDUzMTk0OSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiUxJHM8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJVTklUIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVudGl0bGVkIiBtc2dpZD0iNDYzODk1Njk1NDg1Mjc4MjU3NiI+IiZsdDvmnKrlkb3lkI0mZ3Q7Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxsaXBzaXMiIG1zZ2lkPSI3ODk5ODI5NTE2MDQ4ODEzMjM3Ij4iLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxsaXBzaXNfdHdvX2RvdHMiIG1zZ2lkPSIxMjI4MDc4OTk0ODY2MDMwNzM2Ij4i4oClIjwvc3RyaW5nPgpAQCAtNjcyLDggKzY3MSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYWNldW5sb2NrX211bHRpcGxlX2ZhaWx1cmVzIiBtc2dpZD0iNzU0MTM3NTgzMDIyNzkyNDI5Ij4i5bey6LaF6L+H4oCc5Lq66IS46Kej6ZSB4oCd5bCd6K+V5qyh5pWw5LiK6ZmQIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iODA1Nzc2MjgyODM1NTU3MjMxNSI+Iuato+WcqOWFheeUte+8jDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4i5bey5YWF5ruh44CCIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCAoNDQ3NzI2NDg0OTM4Njg1MDI2NikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjQ0NzcyNjQ4NDkzODY4NTAyNjYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9sb3dfYmF0dGVyeSIgbXNnaWQ9IjE0ODI4NzM5ODE5MTkyNDk3NDAiPiLov57mjqXmgqjnmoTlhYXnlLXlmajjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQiIG1zZ2lkPSI3MzgxNDk5MjE3NzMyMjI3Mjk1Ij4i5rKh5pyJIFNJTSDljaEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2UiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjE1MTY1OTE5NjA5NTc5MTQ3NCI+IuW5s+adv+eUteiEkeS4reayoeaciSBTSU0g5Y2h44CCIjwvc3RyaW5nPgpAQCAtNzIyLDEwICs3MjAsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfc3ltYm9sX2tleSIgbXNnaWQ9Ijk5MjI4MDc1NjI1NjUzNjA0MiI+Ij8xMjMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9hbHBoYV9rZXkiIG1zZ2lkPSI4MDAxMDk2MTc1MTY3NDg1NjQ5Ij4iQUJDIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfYWx0X2tleSIgbXNnaWQ9IjEyODQ4MjA5NDI2MjAyODg2NzgiPiJBTFQiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaG91cl9hbXBtICg0NTg0MzM4MDgzNTI5MzU1OTgyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGhvdXJfY2FwX2FtcG0gKDIwODM0NjU5OTI5NDA0NDQzNjYpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJob3VyX2FtcG0iIG1zZ2lkPSI0NTg0MzM4MDgzNTI5MzU1OTgyIj4iPHhsaWZmOmcgaWQ9IkFNUE0iPiVQPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iSE9VUiI+JS1sPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfY2FwX2FtcG0iIG1zZ2lkPSIyMDgzNDY1OTkyOTQwNDQ0MzY2Ij4iPHhsaWZmOmcgaWQ9IkFNUE0iPiVwPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iSE9VUiI+JS1sPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X2ZhaWxlZCIgbXNnaWQ9IjU0MTAyNzAzMjkxMTQyMTIwNDEiPiLlh7rljoLmtYvor5XlpLHotKUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9ub3Rfc3lzdGVtIiBtc2dpZD0iNDQzNTIwMTY1Njc2NzI3NjcyMyI+IuWPquacieWcqCAvc3lzdGVtL2FwcCDkuK3lronoo4XnmoTljIXmlK/mjIEgRkFDVE9SWV9URVNUIOaTjeS9nOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X25vX2FjdGlvbiIgbXNnaWQ9Ijg3Mjk5MTg3NDc5OTk5ODU2MSI+IuacquWPkeeOsOaUr+aMgSBGQUNUT1JZX1RFU1Qg5pON5L2c55qE5YyF44CCIjwvc3RyaW5nPgpAQCAtNzM3LDggKzczMyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iNDU5NTA0NjUxNTQwMDI2ODg4MSI+IuaPkOekuu+8mueCueaMieS4pOasoeWPr+aUvuWkp+aIlue8qeWwj+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX3RoaXNfZm9ybSIgbXNnaWQ9IjQ2MTY3NTg4NDExNTc4MTY2NzYiPiLoh6rliqjloavlhYUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9hdXRvZmlsbCIgbXNnaWQ9IjcxMDM0OTUwNzAxODA1OTA4MTQiPiLorr7nva7oh6rliqjloavlhYUiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfYWRkcmVzc19uYW1lX3NlcGFyYXRvciAoNjM1MDE0NTE1NDc3OTcwNjc3MikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3NfbmFtZV9zZXBhcmF0b3IiIG1zZ2lkPSI2MzUwMTQ1MTU0Nzc5NzA2NzcyIj4iICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9uYW1lX2Zvcm1hdCIgbXNnaWQ9IjMyNjgwNDEwNTQ4OTkyMTQ5NDUiPiIkMSQyJDMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfc2VwYXJhdG9yIiBtc2dpZD0iNzQ4MzMwNzg5MzE3MDMyNDEyOSI+Iu+8jCAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfZm9ybWF0IiBtc2dpZD0iNDg3NDQ1OTQ1NTc4NjgyNzM0NCI+IiQxJDIkMyI8L3N0cmluZz4KQEAgLTc3MywxMCArNzY4LDggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NlcmlhbFBvcnQiIG1zZ2lkPSIyOTkxNjM5OTg1MjI0NTk4MTkzIj4i5YWB6K645oyB5pyJ5Lq65L2/55SoIFNlcmlhbE1hbmFnZXIgQVBJIOiuv+mXruS4suihjOerr+WPo+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYWNjZXNzQ29udGVudFByb3ZpZGVyc0V4dGVybmFsbHkiIG1zZ2lkPSI1MDc3Nzc0Mjk3OTQzNDA5Mjg1Ij4i5LuO5aSW6YOo6K6/6Zeu5YaF5a655o+Q5L6b56iL5bqPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYWNjZXNzQ29udGVudFByb3ZpZGVyc0V4dGVybmFsbHkiIG1zZ2lkPSI0NTQ0MzQ2NDg2Njk3ODUzNjg1Ij4i5YWB6K645oyB5pyJ6ICF6YCa6L+H55WM6Z2i6K6/6Zeu5YaF5a655o+Q5L6b56iL5bqP44CC5pmu6YCa5bqU55So57ud5LiN6ZyA6KaB5q2k5p2D6ZmQ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfdXBkYXRlTG9jayAoMzUyNzU1ODM2NjYxNjY4MDg4OSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY191cGRhdGVMb2NrICgxNjU1NjI1ODMyMTY2Nzc4NDkyKSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl91cGRhdGVMb2NrIiBtc2dpZD0iMzUyNzU1ODM2NjYxNjY4MDg4OSI+IumYu+atouiHquWKqOiuvuWkh+abtOaWsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3VwZGF0ZUxvY2siIG1zZ2lkPSIxNjU1NjI1ODMyMTY2Nzc4NDkyIj4i5YWB6K645oyB5pyJ5Lq65ZCR57O757uf5o+Q5L6b55u45YWz5L+h5oGv77yM5Lul56Gu5a6a5LuA5LmI5pe25YCZ6YCC5ZCI5omn6KGM6Z2e5Lqk5LqS5byP6YeN5paw5ZCv5Yqo5p2l5Y2H57qn6K6+5aSH44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4i5piv5ZCm5biM5pyb5rWP6KeI5Zmo6K6w5L2P5q2k5a+G56CB77yfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9ub3Rub3ciIG1zZ2lkPSI2Mzg5Njc1MzE2NzA2Njk5NzU4Ij4i5pqC5LiN5L+d5a2YIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9yZW1lbWJlciIgbXNnaWQ9IjY0OTE4Nzk2Nzg5OTY3NDk0NjYiPiLorrDkvY8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggOWU3YjE3Yy4uYTUxZjNmOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtODI2LDYgKzgyNiwxMCBAQAogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldpZGdldC5JY29uTWVudS5JdGVtIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLlNtYWxsIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgICAgICA8IS0tIGRwIGlzIHVzZWQgb24gcHVycG9zZSBoZXJlIGluc3RlYWQgb2Ygc3A7IHRoZXJlIGlzIG5vdCBzcGFjZQorICAgICAgICAgICAgIGZvciBsYXJnZXIgZm9udCBzaXplcyBiYXNlZCBvbiB0aGUgdXNlciBzZXR0aW5nLiBOZXdlciBhcHBzCisgICAgICAgICAgICAgc2hvdWxkIG5vdCByZWNlaXZlIHRoZSBsZWdhY3kgaWNvbiBtZW51IHBhbmVsLiAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRkcDwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldpZGdldC5FZGl0VGV4dCI+CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL0Nvbm5lY3Rpdml0eU1hbmFnZXJUZXN0L3NyYy9jb20vYW5kcm9pZC9jb25uZWN0aXZpdHltYW5hZ2VydGVzdC9Db25uZWN0aXZpdHlNYW5hZ2VyVGVzdEFjdGl2aXR5LmphdmEgYi9jb3JlL3Rlc3RzL0Nvbm5lY3Rpdml0eU1hbmFnZXJUZXN0L3NyYy9jb20vYW5kcm9pZC9jb25uZWN0aXZpdHltYW5hZ2VydGVzdC9Db25uZWN0aXZpdHlNYW5hZ2VyVGVzdEFjdGl2aXR5LmphdmEKaW5kZXggMjU5ZjE1Zi4uMTlhYTc3YiAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9Db25uZWN0aXZpdHlNYW5hZ2VyVGVzdC9zcmMvY29tL2FuZHJvaWQvY29ubmVjdGl2aXR5bWFuYWdlcnRlc3QvQ29ubmVjdGl2aXR5TWFuYWdlclRlc3RBY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvdGVzdHMvQ29ubmVjdGl2aXR5TWFuYWdlclRlc3Qvc3JjL2NvbS9hbmRyb2lkL2Nvbm5lY3Rpdml0eW1hbmFnZXJ0ZXN0L0Nvbm5lY3Rpdml0eU1hbmFnZXJUZXN0QWN0aXZpdHkuamF2YQpAQCAtMjQxLDYgKzI0MSw3IEBACiAgICAgICAgIG1DTSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CiAgICAgICAgIC8vIEdldCBhbiBpbnN0YW5jZSBvZiBXaWZpTWFuYWdlcgogICAgICAgICBtV2lmaU1hbmFnZXIgPShXaWZpTWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKKyAgICAgICAgbUNvbnRleHQgPSB0aGlzOwogICAgICAgICBtQ2hhbm5lbCA9IG1XaWZpTWFuYWdlci5pbml0aWFsaXplKG1Db250ZXh0LCBtQ29udGV4dC5nZXRNYWluTG9vcGVyKCksIG51bGwpOwogCiAgICAgICAgIGluaXRpYWxpemVOZXR3b3JrU3RhdGVzKCk7CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L1N5bmNPcGVyYXRpb25UZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L1N5bmNPcGVyYXRpb25UZXN0LmphdmEKaW5kZXggMzdlOTQ4ZC4uOTEwYzcyMSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9TeW5jT3BlcmF0aW9uVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvU3luY09wZXJhdGlvblRlc3QuamF2YQpAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICBCdW5kbGUgYjIgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIGIyLnB1dEJvb2xlYW4oImIyIiwgdHJ1ZSk7CiAKLSAgICAgICAgU3luY09wZXJhdGlvbiBvcDEgPSBuZXcgU3luY09wZXJhdGlvbihhY2NvdW50MSwKKyAgICAgICAgU3luY09wZXJhdGlvbiBvcDEgPSBuZXcgU3luY09wZXJhdGlvbihhY2NvdW50MSwgMCwKICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICJhdXRob3JpdHkxIiwKICAgICAgICAgICAgICAgICBiMSwKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgICAgICAgICBmYWxzZSk7CiAKICAgICAgICAgLy8gU2FtZSBhcyBvcDEgYnV0IGRpZmZlcmVudCB0aW1lIGluZm9zCi0gICAgICAgIFN5bmNPcGVyYXRpb24gb3AyID0gbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudDEsCisgICAgICAgIFN5bmNPcGVyYXRpb24gb3AyID0gbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudDEsIDAsCiAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAiYXV0aG9yaXR5MSIsCiAgICAgICAgICAgICAgICAgYjEsCkBAIC02MSw3ICs2MSw3IEBACiAgICAgICAgICAgICAgICAgZmFsc2UpOwogCiAgICAgICAgIC8vIFNhbWUgYXMgb3AxIGJ1dCBkaWZmZXJlbnQgYXV0aG9yaXR5Ci0gICAgICAgIFN5bmNPcGVyYXRpb24gb3AzID0gbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudDEsCisgICAgICAgIFN5bmNPcGVyYXRpb24gb3AzID0gbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudDEsIDAsCiAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAiYXV0aG9yaXR5MiIsCiAgICAgICAgICAgICAgICAgYjEsCkBAIC03MSw3ICs3MSw3IEBACiAgICAgICAgICAgICAgICAgZmFsc2UpOwogCiAgICAgICAgIC8vIFNhbWUgYXMgb3AxIGJ1dCBkaWZmZXJlbnQgYWNjb3VudAotICAgICAgICBTeW5jT3BlcmF0aW9uIG9wNCA9IG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQyLAorICAgICAgICBTeW5jT3BlcmF0aW9uIG9wNCA9IG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQyLCAwLAogICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgImF1dGhvcml0eTEiLAogICAgICAgICAgICAgICAgIGIxLApAQCAtODEsNyArODEsNyBAQAogICAgICAgICAgICAgICAgIGZhbHNlKTsKIAogICAgICAgICAvLyBTYW1lIGFzIG9wMSBidXQgZGlmZmVyZW50IGJ1bmRsZQotICAgICAgICBTeW5jT3BlcmF0aW9uIG9wNSA9IG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQxLAorICAgICAgICBTeW5jT3BlcmF0aW9uIG9wNSA9IG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQxLCAwLAogICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgImF1dGhvcml0eTEiLAogICAgICAgICAgICAgICAgIGIyLApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvU3luY1N0b3JhZ2VFbmdpbmVUZXN0LmphdmEKaW5kZXggYWU0MTQwOS4uOTZmMzEzYSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZVRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L1N5bmNTdG9yYWdlRW5naW5lVGVzdC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5SZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7CkBAIC0zNCw2ICszNSwxMCBAQAogCiBwdWJsaWMgY2xhc3MgU3luY1N0b3JhZ2VFbmdpbmVUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAorICAgIHByaXZhdGUgRmlsZSBnZXRTeW5jRGlyKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUobmV3IEZpbGUoZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCksICJzeXN0ZW0iKSwgInN5bmMiKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUZXN0IHRoYXQgd2UgaGFuZGxlIHRoZSBjYXNlIG9mIGEgaGlzdG9yeSByb3cgYmVpbmcgb2xkIGVub3VnaCB0byBwdXJnZSBiZWZvcmUgdGhlCiAgICAgICogY29ycmVjcG9uZGluZyBzeW5jIGlzIGZpbmlzaGVkLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGNsb2NrIGNoYW5nZXMgd2hpbGUgd2UgYXJlIHN5bmNpbmcuCkBAIC01Miw3ICs1Nyw3IEBACiAKICAgICAgICAgbG9uZyB0aW1lMCA9IDEwMDA7CiAgICAgICAgIGxvbmcgaGlzdG9yeUlkID0gZW5naW5lLmluc2VydFN0YXJ0U3luY0V2ZW50KAotICAgICAgICAgICAgICAgIGFjY291bnQsIGF1dGhvcml0eSwgdGltZTAsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9MT0NBTCk7CisgICAgICAgICAgICAgICAgYWNjb3VudCwgMCwgYXV0aG9yaXR5LCB0aW1lMCwgU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFX0xPQ0FMKTsKICAgICAgICAgbG9uZyB0aW1lMSA9IHRpbWUwICsgU3luY1N0b3JhZ2VFbmdpbmUuTUlMTElTX0lOXzRXRUVLUyAqIDI7CiAgICAgICAgIGVuZ2luZS5zdG9wU3luY0V2ZW50KGhpc3RvcnlJZCwgdGltZTEgLSB0aW1lMCwgInlheSIsIDAsIDApOwogICAgIH0KQEAgLTgyLDM4ICs4Nyw0NyBAQAogICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZSBlbmdpbmUgPSBTeW5jU3RvcmFnZUVuZ2luZS5uZXdUZXN0SW5zdGFuY2UoCiAgICAgICAgICAgICAgICAgbmV3IFRlc3RDb250ZXh0KG1vY2tSZXNvbHZlciwgZ2V0Q29udGV4dCgpKSk7CiAKLSAgICAgICAgcmVtb3ZlUGVyaW9kaWNTeW5jcyhlbmdpbmUsIGFjY291bnQxLCBhdXRob3JpdHkpOwotICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDIsIGF1dGhvcml0eSk7CisgICAgICAgIHJlbW92ZVBlcmlvZGljU3luY3MoZW5naW5lLCBhY2NvdW50MSwgMCwgYXV0aG9yaXR5KTsKKyAgICAgICAgcmVtb3ZlUGVyaW9kaWNTeW5jcyhlbmdpbmUsIGFjY291bnQyLCAwLCBhdXRob3JpdHkpOworICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDEsIDEsIGF1dGhvcml0eSk7CiAKICAgICAgICAgLy8gdGhpcyBzaG91bGQgYWRkIHR3byBkaXN0aW5jdCBwZXJpb2RpYyBzeW5jcyBmb3IgYWNjb3VudDEgYW5kIG9uZSBmb3IgYWNjb3VudDIKLSAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMS5hY2NvdW50LCBzeW5jMS5hdXRob3JpdHksIHN5bmMxLmV4dHJhcywgc3luYzEucGVyaW9kKTsKLSAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMi5hY2NvdW50LCBzeW5jMi5hdXRob3JpdHksIHN5bmMyLmV4dHJhcywgc3luYzIucGVyaW9kKTsKLSAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMy5hY2NvdW50LCBzeW5jMy5hdXRob3JpdHksIHN5bmMzLmV4dHJhcywgc3luYzMucGVyaW9kKTsKLSAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jNC5hY2NvdW50LCBzeW5jNC5hdXRob3JpdHksIHN5bmM0LmV4dHJhcywgc3luYzQucGVyaW9kKTsKKyAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMS5hY2NvdW50LCAwLCBzeW5jMS5hdXRob3JpdHksIHN5bmMxLmV4dHJhcywgc3luYzEucGVyaW9kKTsKKyAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMi5hY2NvdW50LCAwLCBzeW5jMi5hdXRob3JpdHksIHN5bmMyLmV4dHJhcywgc3luYzIucGVyaW9kKTsKKyAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMy5hY2NvdW50LCAwLCBzeW5jMy5hdXRob3JpdHksIHN5bmMzLmV4dHJhcywgc3luYzMucGVyaW9kKTsKKyAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jNC5hY2NvdW50LCAwLCBzeW5jNC5hdXRob3JpdHksIHN5bmM0LmV4dHJhcywgc3luYzQucGVyaW9kKTsKKyAgICAgICAgLy8gYWRkIGEgc2Vjb25kIHVzZXIKKyAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMi5hY2NvdW50LCAxLCBzeW5jMi5hdXRob3JpdHksIHN5bmMyLmV4dHJhcywgc3luYzIucGVyaW9kKTsKIAotICAgICAgICBMaXN0PFBlcmlvZGljU3luYz4gc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50MSwgYXV0aG9yaXR5KTsKKyAgICAgICAgTGlzdDxQZXJpb2RpY1N5bmM+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+CiA8L3VsPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19yZWZlcmVuY2UuamQgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19yZWZlcmVuY2UuamQKaW5kZXggNWE3YmE1Ni4uZThjZjJlZSAxMDA3NTUKLS0tIGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfcmVmZXJlbmNlLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX3JlZmVyZW5jZS5qZApAQCAtMzYsMjAgKzM2LDIwIEBACiA8cD5UaGUgZm9sbG93aW5nIGRvY3VtZW50IHByb3ZpZGVzIHRlY2huaWNhbCByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBmb2xsb3dpbmc6PC9wPgogCiA8dWw+Ci0gIDxsaT48YSBocmVmPSIjYmlsbGluZy1jb2RlcyI+QW5kcm9pZCBNYXJrZXQgU2VydmVyIFJlc3BvbnNlIENvZGVzIGZvciBJbi1hcHAgQmlsbGluZzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI2JpbGxpbmctY29kZXMiPkdvb2dsZSBQbGF5IFNlcnZlciBSZXNwb25zZSBDb2RlcyBmb3IgSW4tYXBwIEJpbGxpbmc8L2E+PC9saT4KICAgPGxpPjxhIGhyZWY9IiNiaWxsaW5nLWludGVyZmFjZSI+SW4tYXBwIEJpbGxpbmcgSW50ZXJmYWNlIFBhcmFtZXRlcnM8L2E+PC9saT4KICAgPGxpPjxhIGhyZWY9IiNiaWxsaW5nLWludGVudHMiPkluLWFwcCBCaWxsaW5nIEJyb2FkY2FzdCBJbnRlbnRzPC9hPjwvbGk+CiA8L3VsPgogCi08aDIgaWQ9ImJpbGxpbmctY29kZXMiPkFuZHJvaWQgTWFya2V0IFNlcnZlciBSZXNwb25zZSBDb2RlcyBmb3IgSW4tYXBwIEJpbGxpbmc8L2gyPgorPGgyIGlkPSJiaWxsaW5nLWNvZGVzIj5Hb29nbGUgUGxheSBTZXJ2ZXIgUmVzcG9uc2UgQ29kZXMgZm9yIEluLWFwcCBCaWxsaW5nPC9oMj4KIAotPHA+VGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyBhbGwgb2YgdGhlIHNlcnZlciByZXNwb25zZSBjb2RlcyB0aGF0IGFyZSBzZW50IGZyb20gQW5kcm9pZCBNYXJrZXQgdG8KLXlvdXIgYXBwbGljYXRpb24uIEFuZHJvaWQgTWFya2V0IHNlbmRzIHRoZXNlIHJlc3BvbnNlIGNvZGVzIGFzeW5jaHJvbm91c2x5IGFzCis8cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIGFsbCBvZiB0aGUgc2VydmVyIHJlc3BvbnNlIGNvZGVzIHRoYXQgYXJlIHNlbnQgZnJvbSBHb29nbGUgUGxheSB0bworeW91ciBhcHBsaWNhdGlvbi4gR29vZ2xlIFBsYXkgc2VuZHMgdGhlc2UgcmVzcG9uc2UgY29kZXMgYXN5bmNocm9ub3VzbHkgYXMKIDxjb2RlPnJlc3BvbnNlX2NvZGU8L2NvZGU+IGV4dHJhcyBpbiB0aGUgPGNvZGU+Y29tLmFuZHJvaWQudmVuZGluZy5iaWxsaW5nLlJFU1BPTlNFX0NPREU8L2NvZGU+CiBicm9hZGNhc3QgaW50ZW50LiBZb3VyIGFwcGxpY2F0aW9uIG11c3QgaGFuZGxlIGFsbCBvZiB0aGVzZSByZXNwb25zZSBjb2Rlcy48L3A+CiAKIDxwIGNsYXNzPSJ0YWJsZS1jYXB0aW9uIiBpZD0icmVzcG9uc2UtY29kZXMtdGFibGUiPjxzdHJvbmc+VGFibGUgMS48L3N0cm9uZz4gU3VtbWFyeSBvZiByZXNwb25zZQotY29kZXMgcmV0dXJuZWQgYnkgQW5kcm9pZCBNYXJrZXQuPC9wPgorY29kZXMgcmV0dXJuZWQgYnkgR29vZ2xlIFBsYXkuPC9wPgogCiA8dGFibGU+CiAKQEAgLTgwLDEzICs4MCwxMyBAQAogICA8dGQ+PGNvZGU+UkVTVUxUX0JJTExJTkdfVU5BVkFJTEFCTEU8L2NvZGU+PC90ZD4KICAgPHRkPjM8L3RkPgogICA8dGQ+SW5kaWNhdGVzIHRoYXQgaW4tYXBwIGJpbGxpbmcgaXMgbm90IGF2YWlsYWJsZSBiZWNhdXNlIHRoZSA8Y29kZT5BUElfVkVSU0lPTjwvY29kZT4gdGhhdCB5b3UKLSAgc3BlY2lmaWVkIGlzIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBvciB0aGUgdXNlciBpcyBpbmVsaWdpYmxlIGZvciBpbi1hcHAKKyAgc3BlY2lmaWVkIGlzIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBvciB0aGUgdXNlciBpcyBpbmVsaWdpYmxlIGZvciBpbi1hcHAKICAgYmlsbGluZyAoZm9yIGV4YW1wbGUsIHRoZSB1c2VyIHJlc2lkZXMgaW4gYSBjb3VudHJ5IHRoYXQgcHJvaGliaXRzIGluLWFwcCBwdXJjaGFzZXMpLjwvdGQ+CiA8L3RyPgogPHRyPgogICA8dGQ+PGNvZGU+UkVTVUxUX0lURU1fVU5BVkFJTEFCTEU8L2NvZGU+PC90ZD4KICAgPHRkPjQ8L3RkPgotICA8dGQ+SW5kaWNhdGVzIHRoYXQgQW5kcm9pZCBNYXJrZXQgY2Fubm90IGZpbmQgdGhlIHJlcXVlc3RlZCBpdGVtIGluIHRoZSBhcHBsaWNhdGlvbidzIHByb2R1Y3QKKyAgPHRkPkluZGljYXRlcyB0aGF0IEdvb2dsZSBQbGF5IGNhbm5vdCBmaW5kIHRoZSByZXF1ZXN0ZWQgaXRlbSBpbiB0aGUgYXBwbGljYXRpb24ncyBwcm9kdWN0CiAgIGxpc3QuIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgcHJvZHVjdCBJRCBpcyBtaXNzcGVsbGVkIGluIHlvdXIgPGNvZGU+UkVRVUVTVF9QVVJDSEFTRTwvY29kZT4KICAgcmVxdWVzdCBvciBpZiBhbiBpdGVtIGlzIHVucHVibGlzaGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIHByb2R1Y3QgbGlzdC48L3RkPgogPC90cj4KQEAgLTEwOCw3ICsxMDgsNyBAQAogCiA8aDIgaWQ9ImJpbGxpbmctaW50ZXJmYWNlIj5Jbi1hcHAgQmlsbGluZyBTZXJ2aWNlIEludGVyZmFjZTwvaDI+CiAKLTxwPlRoZSBmb2xsb3dpbmcgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBmb3IgQW5kcm9pZCBNYXJrZXQncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlLiBUaGUKKzxwPlRoZSBmb2xsb3dpbmcgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBmb3IgR29vZ2xlIFBsYXkncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlLiBUaGUKIGludGVyZmFjZSBpcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5JTWFya2V0QmlsbGluZ1NlcnZpY2UuYWlkbDwvY29kZT4gZmlsZSwgd2hpY2ggaXMgaW5jbHVkZWQgd2l0aCB0aGUKIGluLWFwcCBiaWxsaW5nIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19pbnRlZ3JhdGUuaHRtbCNiaWxsaW5nLWRvd25sb2FkIj5zYW1wbGUKQEAgLTE0NCw3ICsxNDQsNyBAQAogICA8dGQ+PGNvZGU+aW50PC9jb2RlPjwvdGQ+CiAgIDx0ZD4xPC90ZD4KICAgPHRkPlllczwvdGQ+Ci0gIDx0ZD5UaGUgdmVyc2lvbiBvZiBBbmRyb2lkIE1hcmtldCdzIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UgeW91IGFyZSB1c2luZy4gVGhlIGN1cnJlbnQgdmVyc2lvbiBpcworICA8dGQ+VGhlIHZlcnNpb24gb2YgR29vZ2xlIFBsYXkncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlIHlvdSBhcmUgdXNpbmcuIFRoZSBjdXJyZW50IHZlcnNpb24gaXMKICAgMS48L3RkPgogPC90cj4KIDx0cj4KQEAgLTE2MCw4ICsxNjAsOCBAQAogICA8dGQ+QW55IHZhbGlkIHByb2R1Y3QgaWRlbnRpZmllci48L3RkPgogICA8dGQ+UmVxdWlyZWQgZm9yIDxjb2RlPlJFUVVFU1RfUFVSQ0hBU0U8L2NvZGU+IHJlcXVlc3RzLjwvdGQ+CiAgIDx0ZD5UaGUgcHJvZHVjdCBJRCBvZiB0aGUgaXRlbSB5b3UgYXJlIG1ha2luZyBhIGJpbGxpbmcgcmVxdWVzdCBmb3IuIEV2ZXJ5IGluLWFwcCBpdGVtIHRoYXQgeW91Ci0gIHNlbGwgdXNpbmcgQW5kcm9pZCBNYXJrZXQncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlIG11c3QgaGF2ZSBhIHVuaXF1ZSBwcm9kdWN0IElELCB3aGljaCB5b3UKLSAgc3BlY2lmeSBvbiB0aGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGUuPC90ZD4KKyAgc2VsbCB1c2luZyBHb29nbGUgUGxheSdzIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UgbXVzdCBoYXZlIGEgdW5pcXVlIHByb2R1Y3QgSUQsIHdoaWNoIHlvdQorICBzcGVjaWZ5IG9uIHRoZSBHb29nbGUgUGxheSBwdWJsaXNoZXIgc2l0ZS48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPk5PTkNFPC9jb2RlPjwvdGQ+CkBAIC0xNzIsNyArMTcyLDcgQEAKICAgPHRkPkEgbnVtYmVyIHVzZWQgb25jZS4gWW91ciBhcHBsaWNhdGlvbiBtdXN0IGdlbmVyYXRlIGFuZCBzZW5kIGEgbm9uY2Ugd2l0aCBlYWNoCiAgIDxjb2RlPkdFVF9QVVJDSEFTRV9JTkZPUk1BVElPTjwvY29kZT4gYW5kIDxjb2RlPlJFU1RPUkVfVFJBTlNBQ1RJT05TPC9jb2RlPiByZXF1ZXN0LiBUaGUgbm9uY2UgaXMKICAgcmV0dXJuZWQgd2l0aCB0aGUgPGNvZGU+UFVSQ0hBU0VfU1RBVEVfQ0hBTkdFRDwvY29kZT4gYnJvYWRjYXN0IGludGVudCwgc28geW91IGNhbiB1c2UgdGhpcyB2YWx1ZQotICB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0cmFuc2FjdGlvbiByZXNwb25zZXMgZm9ybSBBbmRyb2lkIE1hcmtldC48L3RkPgorICB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0cmFuc2FjdGlvbiByZXNwb25zZXMgZm9ybSBHb29nbGUgUGxheS48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPk5PVElGWV9JRFM8L2NvZGU+PC90ZD4KQEAgLTIwMiwyMCArMjAyLDIwIEBACiAKIDx1bD4KICAgPGxpPjxjb2RlPkNIRUNLX0JJTExJTkdfU1VQUE9SVEVEPC9jb2RlPgotICAgIDxwPlRoaXMgcmVxdWVzdCB2ZXJpZmllcyB0aGF0IHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBzdXBwb3J0cyBpbi1hcHAgYmlsbGluZy4gWW91CisgICAgPHA+VGhpcyByZXF1ZXN0IHZlcmlmaWVzIHRoYXQgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHN1cHBvcnRzIGluLWFwcCBiaWxsaW5nLiBZb3UKICAgICB1c3VhbGx5IHNlbmQgdGhpcyByZXF1ZXN0IHdoZW4geW91ciBhcHBsaWNhdGlvbiBmaXJzdCBzdGFydHMgdXAuIFRoaXMgcmVxdWVzdCBpcyB1c2VmdWwgaWYgeW91CiAgICAgd2FudCB0byBlbmFibGUgb3IgZGlzYWJsZSBjZXJ0YWluIFVJIGZlYXR1cmVzIHRoYXQgYXJlIHJlbGV2YW50IG9ubHkgdG8gaW4tYXBwIGJpbGxpbmcuPC9wPgogICA8L2xpPgogICA8bGk+PGNvZGU+UkVRVUVTVF9QVVJDSEFTRTwvY29kZT4KLSAgICA8cD5UaGlzIHJlcXVlc3Qgc2VuZHMgYSBwdXJjaGFzZSBtZXNzYWdlIHRvIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBhbmQgaXMgdGhlIGZvdW5kYXRpb24KKyAgICA8cD5UaGlzIHJlcXVlc3Qgc2VuZHMgYSBwdXJjaGFzZSBtZXNzYWdlIHRvIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBhbmQgaXMgdGhlIGZvdW5kYXRpb24KICAgICBvZiBpbi1hcHAgYmlsbGluZy4gWW91IHNlbmQgdGhpcyByZXF1ZXN0IHdoZW4gYSB1c2VyIGluZGljYXRlcyB0aGF0IGhlIG9yIHNoZSB3YW50cyB0byBwdXJjaGFzZQotICAgIGFuIGl0ZW0gaW4geW91ciBhcHBsaWNhdGlvbi4gQW5kcm9pZCBNYXJrZXQgdGhlbiBoYW5kbGVzIHRoZSBmaW5hbmNpYWwgdHJhbnNhY3Rpb24gYnkgZGlzcGxheWluZworICAgIGFuIGl0ZW0gaW4geW91ciBhcHBsaWNhdGlvbi4gR29vZ2xlIFBsYXkgdGhlbiBoYW5kbGVzIHRoZSBmaW5hbmNpYWwgdHJhbnNhY3Rpb24gYnkgZGlzcGxheWluZwogICAgIHRoZSBjaGVja291dCB1c2VyIGludGVyZmFjZS48L3A+CiAgIDwvbGk+CiAgIDxsaT48Y29kZT5HRVRfUFVSQ0hBU0VfSU5GT1JNQVRJT048L2NvZGU+CiAgICAgPHA+VGhpcyByZXF1ZXN0IHJldHJpZXZlcyB0aGUgZGV0YWlscyBvZiBhIHB1cmNoYXNlIHN0YXRlIGNoYW5nZS4gQSBwdXJjaGFzZSBzdGF0ZSBjaGFuZ2UgY2FuCiAgICAgb2NjdXIgd2hlbiBhIHB1cmNoYXNlIHJlcXVlc3QgaXMgYmlsbGVkIHN1Y2Nlc3NmdWxseSBvciB3aGVuIGEgdXNlciBjYW5jZWxzIGEgdHJhbnNhY3Rpb24gZHVyaW5nCi0gICAgY2hlY2tvdXQuIEl0IGNhbiBhbHNvIG9jY3VyIHdoZW4gYSBwcmV2aW91cyBwdXJjaGFzZSBpcyByZWZ1bmRlZC4gQW5kcm9pZCBNYXJrZXQgbm90aWZpZXMgeW91cgorICAgIGNoZWNrb3V0LiBJdCBjYW4gYWxzbyBvY2N1ciB3aGVuIGEgcHJldmlvdXMgcHVyY2hhc2UgaXMgcmVmdW5kZWQuIEdvb2dsZSBQbGF5IG5vdGlmaWVzIHlvdXIKICAgICBhcHBsaWNhdGlvbiB3aGVuIGEgcHVyY2hhc2UgY2hhbmdlcyBzdGF0ZSwgc28geW91IG9ubHkgbmVlZCB0byBzZW5kIHRoaXMgcmVxdWVzdCB3aGVuIHRoZXJlIGlzCiAgICAgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gdG8gcmV0cmlldmUuPC9wPgogICA8L2xpPgpAQCAtMjk0LDggKzI5NCw4IEBACiAKIDxoMiBpZD0iYmlsbGluZy1pbnRlbnRzIj5Jbi1hcHAgQmlsbGluZyBCcm9hZGNhc3QgSW50ZW50czwvaDI+CiAKLTxwPlRoZSBmb2xsb3dpbmcgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGluLWFwcCBiaWxsaW5nIGJyb2FkY2FzdCBpbnRlbnRzIHRoYXQgYXJlIHNlbnQgYnkgdGhlIEFuZHJvaWQKLU1hcmtldCBhcHBsaWNhdGlvbi4gVGhlc2UgYnJvYWRjYXN0IGludGVudHMgaW5mb3JtIHlvdXIgYXBwbGljYXRpb24gYWJvdXQgaW4tYXBwIGJpbGxpbmcgYWN0aW9ucworPHA+VGhlIGZvbGxvd2luZyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgaW4tYXBwIGJpbGxpbmcgYnJvYWRjYXN0IGludGVudHMgdGhhdCBhcmUgc2VudCBieSB0aGUgR29vZ2xlCitQbGF5IGFwcGxpY2F0aW9uLiBUaGVzZSBicm9hZGNhc3QgaW50ZW50cyBpbmZvcm0geW91ciBhcHBsaWNhdGlvbiBhYm91dCBpbi1hcHAgYmlsbGluZyBhY3Rpb25zCiB0aGF0IGhhdmUgb2NjdXJyZWQuIFlvdXIgYXBwbGljYXRpb24gbXVzdCBpbXBsZW1lbnQgYSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyfSB0bwogcmVjZWl2ZSB0aGVzZSBicm9hZGNhc3QgaW50ZW50cywgc3VjaCBhcyB0aGUgPGNvZGU+QmlsbGluZ1JlY2VpdmVyPC9jb2RlPiB0aGF0J3Mgc2hvd24gaW4gdGhlIGluLWFwcAogYmlsbGluZyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19pbnRlZ3JhdGUuaHRtbCNiaWxsaW5nLWRvd25sb2FkIj5zYW1wbGUKQEAgLTMwMywyMSArMzAzLDIxIEBACiAKIDxoND5jb20uYW5kcm9pZC52ZW5kaW5nLmJpbGxpbmcuUkVTUE9OU0VfQ09ERTwvaDQ+CiAKLTxwPlRoaXMgYnJvYWRjYXN0IGludGVudCBjb250YWlucyBhbiBBbmRyb2lkIE1hcmtldCByZXNwb25zZSBjb2RlLCBhbmQgaXMgc2VudCBhZnRlciB5b3UgbWFrZSBhbgorPHA+VGhpcyBicm9hZGNhc3QgaW50ZW50IGNvbnRhaW5zIGEgR29vZ2xlIFBsYXkgcmVzcG9uc2UgY29kZSwgYW5kIGlzIHNlbnQgYWZ0ZXIgeW91IG1ha2UgYW4KIGluLWFwcCBiaWxsaW5nIHJlcXVlc3QuIEEgc2VydmVyIHJlc3BvbnNlIGNvZGUgY2FuIGluZGljYXRlIHRoYXQgYSBiaWxsaW5nIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseQotc2VudCB0byBBbmRyb2lkIE1hcmtldCBvciBpdCBjYW4gaW5kaWNhdGUgdGhhdCBzb21lIGVycm9yIG9jY3VycmVkIGR1cmluZyBhIGJpbGxpbmcgcmVxdWVzdC4gVGhpcworc2VudCB0byBHb29nbGUgUGxheSBvciBpdCBjYW4gaW5kaWNhdGUgdGhhdCBzb21lIGVycm9yIG9jY3VycmVkIGR1cmluZyBhIGJpbGxpbmcgcmVxdWVzdC4gVGhpcwogaW50ZW50IGlzIG5vdCB1c2VkIHRvIHJlcG9ydCBhbnkgcHVyY2hhc2Ugc3RhdGUgY2hhbmdlcyAoc3VjaCBhcyByZWZ1bmQgb3IgcHVyY2hhc2UgaW5mb3JtYXRpb24pLgogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc3BvbnNlIGNvZGVzIHRoYXQgYXJlIHNlbnQgd2l0aCB0aGlzIHJlc3BvbnNlLCBzZWUgPGEKLWhyZWY9IiNiaWxsaW5nLWNvZGVzIj5BbmRyb2lkIE1hcmtldCBSZXNwb25zZSBDb2RlcyBmb3IgSW4tYXBwIEJpbGxpbmc8L2E+LiBUaGUgc2FtcGxlIGFwcGxpY2F0aW9uCitocmVmPSIjYmlsbGluZy1jb2RlcyI+R29vZ2xlIFBsYXkgUmVzcG9uc2UgQ29kZXMgZm9yIEluLWFwcCBCaWxsaW5nPC9hPi4gVGhlIHNhbXBsZSBhcHBsaWNhdGlvbgogYXNzaWducyB0aGlzIGJyb2FkY2FzdCBpbnRlbnQgdG8gYSBjb25zdGFudCBuYW1lZCA8Y29kZT5BQ1RJT05fUkVTUE9OU0VfQ09ERTwvY29kZT4uPC9wPgogCiA8aDU+RXh0cmFzPC9oNT4KIAogPHVsIHR5cGU9Im5vbmUiPgogICA8bGk+PGNvZGU+cmVxdWVzdF9pZDwvY29kZT4mbWRhc2g7YSA8Y29kZT5sb25nPC9jb2RlPiByZXByZXNlbnRpbmcgYSByZXF1ZXN0IElELiBBIHJlcXVlc3QgSUQKLSAgaWRlbnRpZmllcyBhIHNwZWNpZmljIGJpbGxpbmcgcmVxdWVzdCBhbmQgaXMgcmV0dXJuZWQgYnkgQW5kcm9pZCBNYXJrZXQgYXQgdGhlIHRpbWUgYSByZXF1ZXN0IGlzCisgIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBiaWxsaW5nIHJlcXVlc3QgYW5kIGlzIHJldHVybmVkIGJ5IEdvb2dsZSBQbGF5IGF0IHRoZSB0aW1lIGEgcmVxdWVzdCBpcwogICBtYWRlLjwvbGk+Ci0gIDxsaT48Y29kZT5yZXNwb25zZV9jb2RlPC9jb2RlPiZtZGFzaDthbiA8Y29kZT5pbnQ8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgQW5kcm9pZCBNYXJrZXQgc2VydmVyCisgIDxsaT48Y29kZT5yZXNwb25zZV9jb2RlPC9jb2RlPiZtZGFzaDthbiA8Y29kZT5pbnQ8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgR29vZ2xlIFBsYXkgc2VydmVyCiAgIHJlc3BvbnNlIGNvZGUuPC9saT4KIDwvdWw+CiAKQEAgLTMzNSw3ICszMzUsNyBAQAogCiA8dWwgdHlwZT0ibm9uZSI+CiAgIDxsaT48Y29kZT5ub3RpZmljYXRpb25faWQ8L2NvZGU+Jm1kYXNoO2EgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIG5vdGlmaWNhdGlvbiBJRCBmb3IKLSAgYSBnaXZlbiBwdXJjaGFzZSBzdGF0ZSBjaGFuZ2UuIEFuZHJvaWQgTWFya2V0IG5vdGlmaWVzIHlvdSB3aGVuIHRoZXJlIGlzIGEgcHVyY2hhc2Ugc3RhdGUgY2hhbmdlCisgIGEgZ2l2ZW4gcHVyY2hhc2Ugc3RhdGUgY2hhbmdlLiBHb29nbGUgUGxheSBub3RpZmllcyB5b3Ugd2hlbiB0aGVyZSBpcyBhIHB1cmNoYXNlIHN0YXRlIGNoYW5nZQogICBhbmQgdGhlIG5vdGlmaWNhdGlvbiBpbmNsdWRlcyBhIHVuaXF1ZSBub3RpZmljYXRpb24gSUQuIFRvIGdldCB0aGUgZGV0YWlscyBvZiB0aGUgcHVyY2hhc2Ugc3RhdGUKICAgY2hhbmdlLCB5b3Ugc2VuZCB0aGUgbm90aWZpY2F0aW9uIElEIHdpdGggdGhlIDxjb2RlPkdFVF9QVVJDSEFTRV9JTkZPUk1BVElPTjwvY29kZT4gcmVxdWVzdC48L2xpPgogPC91bD4KQEAgLTM3NSwxNSArMzc1LDE1IEBACiA8dHI+CiAgIDx0ZD5ub25jZTwvdGQ+CiAgIDx0ZD5BIG51bWJlciB1c2VkIG9uY2UuIFlvdXIgYXBwbGljYXRpb24gZ2VuZXJhdGVzIHRoZSBub25jZSBhbmQgc2VuZHMgaXQgd2l0aCB0aGUKLSAgPGNvZGU+R0VUX1BVUkNIQVNFX0lORk9STUFUSU9OPC9jb2RlPiByZXF1ZXN0LiBBbmRyb2lkIE1hcmtldCBzZW5kcyB0aGUgbm9uY2UgYmFjayBhcyBwYXJ0IG9mIHRoZQorICA8Y29kZT5HRVRfUFVSQ0hBU0VfSU5GT1JNQVRJT048L2NvZGU+IHJlcXVlc3QuIEdvb2dsZSBQbGF5IHNlbmRzIHRoZSBub25jZSBiYWNrIGFzIHBhcnQgb2YgdGhlCiAgIEpTT04gc3RyaW5nIHNvIHlvdSBjYW4gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIG1lc3NhZ2UuPC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD5ub3RpZmljYXRpb25JZDwvdGQ+CiAgIDx0ZD5BIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaXMgc2VudCB3aXRoIGFuIDxjb2RlPklOX0FQUF9OT1RJRlk8L2NvZGU+IGJyb2FkY2FzdCBpbnRlbnQuIEVhY2gKICAgPGNvZGU+bm90aWZpY2F0aW9uSWQ8L2NvZGU+IGNvcnJlc3BvbmRzIHRvIGEgc3BlY2lmeSBtZXNzYWdlIHRoYXQgaXMgd2FpdGluZyB0byBiZSByZXRyaWV2ZWQgb24KLSAgdGhlIEFuZHJvaWQgTWFya2V0IHNlcnZlci4gWW91ciBhcHBsaWNhdGlvbiBzZW5kcyBiYWNrIHRoZSA8Y29kZT5ub3RpZmljYXRpb25JZDwvY29kZT4gd2l0aCB0aGUKLSAgPGNvZGU+R0VUX1BVUkNIQVNFX0lORk9STUFUSU9OPC9jb2RlPiBtZXNzYWdlIHNvIEFuZHJvaWQgTWFya2V0IGNhbiBkZXRlcm1pbmUgd2hpY2ggbWVzc2FnZXMgeW91CisgIHRoZSBHb29nbGUgUGxheSBzZXJ2ZXIuIFlvdXIgYXBwbGljYXRpb24gc2VuZHMgYmFjayB0aGUgPGNvZGU+bm90aWZpY2F0aW9uSWQ8L2NvZGU+IHdpdGggdGhlCisgIDxjb2RlPkdFVF9QVVJDSEFTRV9JTkZPUk1BVElPTjwvY29kZT4gbWVzc2FnZSBzbyBHb29nbGUgUGxheSBjYW4gZGV0ZXJtaW5lIHdoaWNoIG1lc3NhZ2VzIHlvdQogICBhcmUgcmV0cmlldmluZy48L3RkPgogPC90cj4KIDx0cj4KQEAgLTM5OCw3ICszOTgsNyBAQAogPHRyPgogICA8dGQ+cHJvZHVjdElkPC90ZD4KICAgPHRkPlRoZSBpdGVtJ3MgcHJvZHVjdCBpZGVudGlmaWVyLiBFdmVyeSBpdGVtIGhhcyBhIHByb2R1Y3QgSUQsIHdoaWNoIHlvdSBtdXN0IHNwZWNpZnkgaW4gdGhlCi0gIGFwcGxpY2F0aW9uJ3MgcHJvZHVjdCBsaXN0IG9uIHRoZSBBbmRyb2lkIE1hcmtldCBwdWJsaXNoZXIgc2l0ZS48L3RkPgorICBhcHBsaWNhdGlvbidzIHByb2R1Y3QgbGlzdCBvbiB0aGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUuPC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD5wdXJjaGFzZVRpbWU8L3RkPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfdGVzdGluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX3Rlc3RpbmcuamQKaW5kZXggNTQ1MzA0Ny4uNzdhYTNlZCAxMDA3NTUKLS0tIGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfdGVzdGluZy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ190ZXN0aW5nLmpkCkBAIC0zMiwxNiArMzIsMTYgQEAKIDwvZGl2PgogPC9kaXY+CiAKLTxwPlRoZSBBbmRyb2lkIE1hcmtldCBwdWJsaXNoZXIgc2l0ZSBwcm92aWRlcyBzZXZlcmFsIHRvb2xzIHRoYXQgaGVscCB5b3UgdGVzdCB5b3VyIGluLWFwcCBiaWxsaW5nCis8cD5UaGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUgcHJvdmlkZXMgc2V2ZXJhbCB0b29scyB0aGF0IGhlbHAgeW91IHRlc3QgeW91ciBpbi1hcHAgYmlsbGluZwogaW1wbGVtZW50YXRpb24gYmVmb3JlIGl0IGlzIHB1Ymxpc2hlZC4gWW91IGNhbiB1c2UgdGhlc2UgdG9vbHMgdG8gY3JlYXRlIHRlc3QgYWNjb3VudHMgYW5kIHB1cmNoYXNlCiBzcGVjaWFsIHJlc2VydmVkIGl0ZW1zIHRoYXQgc2VuZCBzdGF0aWMgYmlsbGluZyByZXNwb25zZXMgdG8geW91ciBhcHBsaWNhdGlvbi48L3A+CiAKIDxwPlRvIHRlc3QgaW4tYXBwIGJpbGxpbmcgaW4gYW4gYXBwbGljYXRpb24geW91IG11c3QgaW5zdGFsbCB0aGUgYXBwbGljYXRpb24gb24gYW4gQW5kcm9pZC1wb3dlcmVkCiBkZXZpY2UuIFlvdSBjYW5ub3QgdXNlIHRoZSBBbmRyb2lkIGVtdWxhdG9yIHRvIHRlc3QgaW4tYXBwIGJpbGxpbmcuICBUaGUgZGV2aWNlIHlvdSB1c2UgZm9yIHRlc3RpbmcKIG11c3QgcnVuIGEgc3RhbmRhcmQgdmVyc2lvbiBvZiB0aGUgQW5kcm9pZCAxLjYgb3IgbGF0ZXIgcGxhdGZvcm0gKEFQSSBsZXZlbCA0IG9yIGhpZ2hlciksIGFuZCBoYXZlCi10aGUgbW9zdCBjdXJyZW50IHZlcnNpb24gb2YgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIGluc3RhbGxlZC4gSWYgYSBkZXZpY2UgaXMgbm90IHJ1bm5pbmcgdGhlCi1tb3N0IGN1cnJlbnQgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24sIHlvdXIgYXBwbGljYXRpb24gd29uJ3QgYmUgYWJsZSB0byBzZW5kIGluLWFwcCBiaWxsaW5nCi1yZXF1ZXN0cyB0byBBbmRyb2lkIE1hcmtldC4gRm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHNldCB1cCBhIGRldmljZSBmb3IgdXNlIGluCit0aGUgbW9zdCBjdXJyZW50IHZlcnNpb24gb2YgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIGluc3RhbGxlZC4gSWYgYSBkZXZpY2UgaXMgbm90IHJ1bm5pbmcgdGhlCittb3N0IGN1cnJlbnQgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24sIHlvdXIgYXBwbGljYXRpb24gd29uJ3QgYmUgYWJsZSB0byBzZW5kIGluLWFwcCBiaWxsaW5nCityZXF1ZXN0cyB0byBHb29nbGUgUGxheS4gRm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHNldCB1cCBhIGRldmljZSBmb3IgdXNlIGluCiBkZXZlbG9waW5nIEFuZHJvaWQgYXBwbGljYXRpb25zLCBzZWUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvZGV2aWNlLmh0bWwiPlVzaW5nIEhhcmR3YXJlCiBEZXZpY2VzPC9hPi48L3A+CiAKQEAgLTUwLDEyICs1MCwxMiBAQAogPGgyIGlkPSJiaWxsaW5nLXRlc3Rpbmctc3RhdGljIj5UZXN0aW5nIGluLWFwcCBwdXJjaGFzZXMgd2l0aCBzdGF0aWMgcmVzcG9uc2VzPC9oMj4KIAogPHA+V2UgcmVjb21tZW5kIHRoYXQgeW91IGZpcnN0IHRlc3QgeW91ciBpbi1hcHAgYmlsbGluZyBpbXBsZW1lbnRhdGlvbiB1c2luZyBzdGF0aWMgcmVzcG9uc2VzIGZyb20KLUFuZHJvaWQgTWFya2V0LiBUaGlzIGVuYWJsZXMgeW91IHRvIHZlcmlmeSB0aGF0IHlvdXIgYXBwbGljYXRpb24gaXMgaGFuZGxpbmcgdGhlIHByaW1hcnkgQW5kcm9pZAotTWFya2V0IHJlc3BvbnNlcyBjb3JyZWN0bHkgYW5kIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBpcyBhYmxlIHRvIHZlcmlmeSBzaWduYXR1cmVzIGNvcnJlY3RseS48L3A+CitHb29nbGUgUGxheS4gVGhpcyBlbmFibGVzIHlvdSB0byB2ZXJpZnkgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGlzIGhhbmRsaW5nIHRoZSBwcmltYXJ5IEdvb2dsZQorUGxheSByZXNwb25zZXMgY29ycmVjdGx5IGFuZCB0aGF0IHlvdXIgYXBwbGljYXRpb24gaXMgYWJsZSB0byB2ZXJpZnkgc2lnbmF0dXJlcyBjb3JyZWN0bHkuPC9wPgogCiA8cD5UbyB0ZXN0IHlvdXIgaW1wbGVtZW50YXRpb24gd2l0aCBzdGF0aWMgcmVzcG9uc2VzLCB5b3UgbWFrZSBhbiBpbi1hcHAgYmlsbGluZyByZXF1ZXN0IHVzaW5nIGEKIHNwZWNpYWwgaXRlbSB0aGF0IGhhcyBhIHJlc2VydmVkIHByb2R1Y3QgSUQuIEVhY2ggcmVzZXJ2ZWQgcHJvZHVjdCBJRCByZXR1cm5zIGEgc3BlY2lmaWMgc3RhdGljCi1yZXNwb25zZSBmcm9tIEFuZHJvaWQgTWFya2V0LiBObyBtb25leSBpcyB0cmFuc2ZlcnJlZCB3aGVuIHlvdSBtYWtlIGluLWFwcCBiaWxsaW5nIHJlcXVlc3RzIHdpdGggdGhlCityZXNwb25zZSBmcm9tIEdvb2dsZSBQbGF5LiBObyBtb25leSBpcyB0cmFuc2ZlcnJlZCB3aGVuIHlvdSBtYWtlIGluLWFwcCBiaWxsaW5nIHJlcXVlc3RzIHdpdGggdGhlCiByZXNlcnZlZCBwcm9kdWN0IElEcy4gQWxzbywgeW91IGNhbm5vdCBzcGVjaWZ5IHRoZSBmb3JtIG9mIHBheW1lbnQgd2hlbiB5b3UgbWFrZSBhIGJpbGxpbmcgcmVxdWVzdAogd2l0aCBhIHJlc2VydmVkIHByb2R1Y3QgSUQuIEZpZ3VyZSAxIHNob3dzIHRoZSBjaGVja291dCBmbG93IGZvciB0aGUgcmVzZXJ2ZWQgaXRlbSB0aGF0IGhhcyB0aGUKIHByb2R1Y3QgSUQgYW5kcm9pZC50ZXN0LnB1cmNoYXNlZC48L3A+CkBAIC02NSw3ICs2NSw3IEBACiAgIDxzdHJvbmc+RmlndXJlIDEuPC9zdHJvbmc+IENoZWNrb3V0IGZsb3cgZm9yIHRoZSBzcGVjaWFsIHJlc2VydmVkIGl0ZW0gYW5kcm9pZC50ZXN0LnB1cmNoYXNlZC4KIDwvcD4KIAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGxpc3QgdGhlIHJlc2VydmVkIHByb2R1Y3RzIGluIHlvdXIgYXBwbGljYXRpb24ncyBwcm9kdWN0IGxpc3QuIEFuZHJvaWQgTWFya2V0Cis8cD5Zb3UgZG8gbm90IG5lZWQgdG8gbGlzdCB0aGUgcmVzZXJ2ZWQgcHJvZHVjdHMgaW4geW91ciBhcHBsaWNhdGlvbidzIHByb2R1Y3QgbGlzdC4gR29vZ2xlIFBsYXkKIGFscmVhZHkga25vd3MgYWJvdXQgdGhlIHJlc2VydmVkIHByb2R1Y3QgSURzLiBBbHNvLCB5b3UgZG8gbm90IG5lZWQgdG8gdXBsb2FkIHlvdXIgYXBwbGljYXRpb24gdG8KIHRoZSBwdWJsaXNoZXIgc2l0ZSB0byBwZXJmb3JtIHN0YXRpYyByZXNwb25zZSB0ZXN0cyB3aXRoIHRoZSByZXNlcnZlZCBwcm9kdWN0IElEcy4gWW91IGNhbiBzaW1wbHkKIGluc3RhbGwgeW91ciBhcHBsaWNhdGlvbiBvbiBhIGRldmljZSwgbG9nIGludG8gdGhlIGRldmljZSwgYW5kIG1ha2UgYmlsbGluZyByZXF1ZXN0cyB1c2luZyB0aGUKQEAgLTc1LDI0ICs3NSwyNCBAQAogCiA8dWw+CiAgIDxsaT48c3Ryb25nPmFuZHJvaWQudGVzdC5wdXJjaGFzZWQ8L3N0cm9uZz4KLSAgICA8cD5XaGVuIHlvdSBtYWtlIGFuIGluLWFwcCBiaWxsaW5nIHJlcXVlc3Qgd2l0aCB0aGlzIHByb2R1Y3QgSUQsIEFuZHJvaWQgTWFya2V0IHJlc3BvbmRzIGFzCisgICAgPHA+V2hlbiB5b3UgbWFrZSBhbiBpbi1hcHAgYmlsbGluZyByZXF1ZXN0IHdpdGggdGhpcyBwcm9kdWN0IElELCBHb29nbGUgUGxheSByZXNwb25kcyBhcwogICAgIHRob3VnaCB5b3Ugc3VjY2Vzc2Z1bGx5IHB1cmNoYXNlZCBhbiBpdGVtLiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgYSBKU09OIHN0cmluZywgd2hpY2ggY29udGFpbnMKICAgICBmYWtlIHB1cmNoYXNlIGluZm9ybWF0aW9uIChmb3IgZXhhbXBsZSwgYSBmYWtlIG9yZGVyIElEKS4gSW4gc29tZSBjYXNlcywgdGhlIEpTT04gc3RyaW5nIGlzCiAgICAgc2lnbmVkIGFuZCB0aGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIHNpZ25hdHVyZSBzbyB5b3UgY2FuIHRlc3QgeW91ciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uCiAgICAgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlc2UgcmVzcG9uc2VzLjwvcD4KICAgPC9saT4KICAgPGxpPjxzdHJvbmc+YW5kcm9pZC50ZXN0LmNhbmNlbGVkPC9zdHJvbmc+Ci0gICAgPHA+V2hlbiB5b3UgbWFrZSBhbiBpbi1hcHAgYmlsbGluZyByZXF1ZXN0IHdpdGggdGhpcyBwcm9kdWN0IElEIEFuZHJvaWQgTWFya2V0IHJlc3BvbmRzIGFzCisgICAgPHA+V2hlbiB5b3UgbWFrZSBhbiBpbi1hcHAgYmlsbGluZyByZXF1ZXN0IHdpdGggdGhpcyBwcm9kdWN0IElEIEdvb2dsZSBQbGF5IHJlc3BvbmRzIGFzCiAgICAgdGhvdWdoIHRoZSBwdXJjaGFzZSB3YXMgY2FuY2VsZWQuIFRoaXMgY2FuIG9jY3VyIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgaW4gdGhlIG9yZGVyCiAgICAgcHJvY2Vzcywgc3VjaCBhcyBhbiBpbnZhbGlkIGNyZWRpdCBjYXJkLCBvciB3aGVuIHlvdSBjYW5jZWwgYSB1c2VyJ3Mgb3JkZXIgYmVmb3JlIGl0IGlzCiAgICAgY2hhcmdlZC48L3A+CiAgIDwvbGk+CiAgIDxsaT48c3Ryb25nPmFuZHJvaWQudGVzdC5yZWZ1bmRlZDwvc3Ryb25nPgotICAgIDxwPldoZW4geW91IG1ha2UgYW4gaW4tYXBwIGJpbGxpbmcgcmVxdWVzdCB3aXRoIHRoaXMgcHJvZHVjdCBJRCwgQW5kcm9pZCBNYXJrZXQgcmVzcG9uZHMgYXMKLSAgICB0aG91Z2ggdGhlIHB1cmNoYXNlIHdhcyByZWZ1bmRlZC4gUmVmdW5kcyBjYW5ub3QgYmUgaW5pdGlhdGVkIHRocm91Z2ggQW5kcm9pZCBNYXJrZXQncyBpbi1hcHAKKyAgICA8cD5XaGVuIHlvdSBtYWtlIGFuIGluLWFwcCBiaWxsaW5nIHJlcXVlc3Qgd2l0aCB0aGlzIHByb2R1Y3QgSUQsIEdvb2dsZSBQbGF5IHJlc3BvbmRzIGFzCisgICAgdGhvdWdoIHRoZSBwdXJjaGFzZSB3YXMgcmVmdW5kZWQuIFJlZnVuZHMgY2Fubm90IGJlIGluaXRpYXRlZCB0aHJvdWdoIEdvb2dsZSBQbGF5J3MgaW4tYXBwCiAgICAgYmlsbGluZyBzZXJ2aWNlLiBSZWZ1bmRzIG11c3QgYmUgaW5pdGlhdGVkIGJ5IHlvdSAodGhlIG1lcmNoYW50KS4gQWZ0ZXIgeW91IHByb2Nlc3MgYSByZWZ1bmQKICAgICByZXF1ZXN0IHRocm91Z2ggeW91ciBHb29nbGUgQ2hlY2tvdXQgYWNjb3VudCwgYSByZWZ1bmQgbWVzc2FnZSBpcyBzZW50IHRvIHlvdXIgYXBwbGljYXRpb24gYnkKLSAgICBBbmRyb2lkIE1hcmtldC4gVGhpcyBvY2N1cnMgb25seSB3aGVuIEFuZHJvaWQgTWFya2V0IGdldHMgbm90aWZpY2F0aW9uIGZyb20gR29vZ2xlIENoZWNrb3V0IHRoYXQKKyAgICBHb29nbGUgUGxheS4gVGhpcyBvY2N1cnMgb25seSB3aGVuIEdvb2dsZSBQbGF5IGdldHMgbm90aWZpY2F0aW9uIGZyb20gR29vZ2xlIENoZWNrb3V0IHRoYXQKICAgICBhIHJlZnVuZCBoYXMgYmVlbiBtYWRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCByZWZ1bmRzLCBzZWUgPGEKICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19vdmVydmlldy5odG1sI2JpbGxpbmctYWN0aW9uLW5vdGlmeSI+SGFuZGxpbmcKICAgICBJTl9BUFBfTk9USUZZIG1lc3NhZ2VzPC9hPiBhbmQgPGEKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgIFByaWNpbmc8L2E+LjwvcD4KICAgPC9saT4KICAgPGxpPjxzdHJvbmc+YW5kcm9pZC50ZXN0Lml0ZW1fdW5hdmFpbGFibGU8L3N0cm9uZz4KLSAgICA8cD5XaGVuIHlvdSBtYWtlIGFuIGluLWFwcCBiaWxsaW5nIHJlcXVlc3Qgd2l0aCB0aGlzIHByb2R1Y3QgSUQsIEFuZHJvaWQgTWFya2V0IHJlc3BvbmRzIGFzCisgICAgPHA+V2hlbiB5b3UgbWFrZSBhbiBpbi1hcHAgYmlsbGluZyByZXF1ZXN0IHdpdGggdGhpcyBwcm9kdWN0IElELCBHb29nbGUgUGxheSByZXNwb25kcyBhcwogICAgIHRob3VnaCB0aGUgaXRlbSBiZWluZyBwdXJjaGFzZWQgd2FzIG5vdCBsaXN0ZWQgaW4geW91ciBhcHBsaWNhdGlvbidzIHByb2R1Y3QgbGlzdC48L3A+CiAgIDwvbGk+CiA8L3VsPgpAQCAtMTg1LDIwICsxODUsMjAgQEAKICAgICA8cD5Zb3UgZG8gbm90IG5lZWQgdG8gdXNlIGEgdGVzdCBhY2NvdW50IGlmIHlvdSBhcmUgdGVzdGluZyBvbmx5IHdpdGggdGhlIHJlc2VydmVkIHByb2R1Y3QKICAgICBJRHMuPC9wPgogICA8L2xpPgotICA8bGk+PHN0cm9uZz5WZXJpZnkgdGhhdCB5b3VyIGRldmljZSBpcyBydW5uaW5nIGEgc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhlIEFuZHJvaWQgTWFya2V0CisgIDxsaT48c3Ryb25nPlZlcmlmeSB0aGF0IHlvdXIgZGV2aWNlIGlzIHJ1bm5pbmcgYSBzdXBwb3J0ZWQgdmVyc2lvbiBvZiB0aGUgR29vZ2xlIFBsYXkKICAgYXBwbGljYXRpb24gb3IgdGhlIE15QXBwcyBhcHBsaWNhdGlvbi48L3N0cm9uZz4KICAgICA8cD5JZiB5b3VyIGRldmljZSBpcyBydW5uaW5nIEFuZHJvaWQgMy4wLCBpbi1hcHAgYmlsbGluZyByZXF1aXJlcyB2ZXJzaW9uIDUuMC4xMiAob3IgaGlnaGVyKSBvZgogICAgIHRoZSBNeUFwcHMgYXBwbGljYXRpb24uIElmIHlvdXIgZGV2aWNlIGlzIHJ1bm5pbmcgYW55IG90aGVyIHZlcnNpb24gb2YgQW5kcm9pZCwgaW4tYXBwIGJpbGxpbmcKLSAgICByZXF1aXJlcyB2ZXJzaW9uIDIuMy40IChvciBoaWdoZXIpIG9mIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbi4gVG8gbGVhcm4gaG93IHRvIGNoZWNrIHRoZQotICAgIHZlcnNpb24gb2YgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLCBzZWUgPGEKLSAgICBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3N1cHBvcnQvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTkwODYwIj5VcGRhdGluZyBBbmRyb2lkCi0gICAgTWFya2V0PC9hPi48L3A+CisgICAgcmVxdWlyZXMgdmVyc2lvbiAyLjMuNCAob3IgaGlnaGVyKSBvZiB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24uIFRvIGxlYXJuIGhvdyB0byBjaGVjayB0aGUKKyAgICB2ZXJzaW9uIG9mIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiwgc2VlIDxhCisgICAgaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9zdXBwb3J0L2Jpbi9hbnN3ZXIucHk/YW5zd2VyPTE5MDg2MCI+VXBkYXRpbmcgR29vZ2xlCisgICAgUGxheTwvYT4uPC9wPgogICA8L2xpPgogICA8bGk+PHN0cm9uZz5SdW4geW91ciBhcHBsaWNhdGlvbiBhbmQgcHVyY2hhc2UgdGhlIHJlc2VydmVkIHByb2R1Y3QgSURzLjwvc3Ryb25nPjwvbGk+CiA8L29sPgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBNYWtpbmcgaW4tYXBwIGJpbGxpbmcgcmVxdWVzdHMgd2l0aCB0aGUgcmVzZXJ2ZWQgcHJvZHVjdCBJRHMKLW92ZXJyaWRlcyB0aGUgdXN1YWwgQW5kcm9pZCBNYXJrZXQgcHJvZHVjdGlvbiBzeXN0ZW0uIFdoZW4geW91IHNlbmQgYW4gaW4tYXBwIGJpbGxpbmcgcmVxdWVzdCBmb3IgYQorb3ZlcnJpZGVzIHRoZSB1c3VhbCBHb29nbGUgUGxheSBwcm9kdWN0aW9uIHN5c3RlbS4gV2hlbiB5b3Ugc2VuZCBhbiBpbi1hcHAgYmlsbGluZyByZXF1ZXN0IGZvciBhCiByZXNlcnZlZCBwcm9kdWN0IElELCB0aGUgcXVhbGl0eSBvZiBzZXJ2aWNlIHdpbGwgbm90IGJlIGNvbXBhcmFibGUgdG8gdGhlIHByb2R1Y3Rpb24KIGVudmlyb25tZW50LjwvcD4KIApAQCAtMjA3LDcgKzIwNyw3IEBACiA8cD5BZnRlciB5b3UgZmluaXNoIHlvdXIgc3RhdGljIHJlc3BvbnNlIHRlc3RpbmcsIGFuZCB5b3UgdmVyaWZ5IHRoYXQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBpcwogd29ya2luZyBpbiB5b3VyIGFwcGxpY2F0aW9uLCB5b3UgY2FuIHRlc3QgeW91ciBpbi1hcHAgYmlsbGluZyBpbXBsZW1lbnRhdGlvbiBieSBtYWtpbmcgYWN0dWFsIGluLWFwcAogcHVyY2hhc2VzLiBUZXN0aW5nIHJlYWwgaW4tYXBwIHB1cmNoYXNlcyBlbmFibGVzIHlvdSB0byB0ZXN0IHRoZSBlbmQtdG8tZW5kIGluLWFwcCBiaWxsaW5nCi1leHBlcmllbmNlLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCByZXNwb25zZXMgZnJvbSBBbmRyb2lkIE1hcmtldCBhbmQgdGhlIGFjdHVhbCBjaGVja291dCBmbG93IHRoYXQKK2V4cGVyaWVuY2UsIGluY2x1ZGluZyB0aGUgYWN0dWFsIHJlc3BvbnNlcyBmcm9tIEdvb2dsZSBQbGF5IGFuZCB0aGUgYWN0dWFsIGNoZWNrb3V0IGZsb3cgdGhhdAogdXNlcnMgd2lsbCBleHBlcmllbmNlIGluIHlvdXIgYXBwbGljYXRpb24uPC9wPgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBZb3UgZG8gbm90IG5lZWQgdG8gcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uIHRvIGRvIGVuZC10by1lbmQKQEAgLTIxNSw3ICsyMTUsNyBAQAogdGVzdGluZy48L3A+CiAKIDxwPlRvIHRlc3QgeW91ciBpbi1hcHAgYmlsbGluZyBpbXBsZW1lbnRhdGlvbiB3aXRoIGFjdHVhbCBpbi1hcHAgcHVyY2hhc2VzLCB5b3Ugd2lsbCBuZWVkIHRvCi1yZWdpc3RlciBhdCBsZWFzdCBvbmUgdGVzdCBhY2NvdW50IG9uIHRoZSBBbmRyb2lkIE1hcmtldCBwdWJsaXNoZXIgc2l0ZS4gWW91IGNhbm5vdCB1c2UgeW91cgorcmVnaXN0ZXIgYXQgbGVhc3Qgb25lIHRlc3QgYWNjb3VudCBvbiB0aGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUuIFlvdSBjYW5ub3QgdXNlIHlvdXIKIGRldmVsb3BlciBhY2NvdW50IHRvIHRlc3QgdGhlIGNvbXBsZXRlIGluLWFwcCBwdXJjaGFzZSBwcm9jZXNzIGJlY2F1c2UgR29vZ2xlIENoZWNrb3V0IGRvZXMgbm90IGxldAogeW91IGJ1eSBpdGVtcyBmcm9tIHlvdXJzZWxmLiBJZiB5b3UgaGF2ZSBub3Qgc2V0IHVwIHRlc3QgYWNjb3VudHMgYmVmb3JlLCBzZWUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX2FkbWluLmh0bWwjYmlsbGluZy10ZXN0aW5nLXNldHVwIj5TZXR0aW5nIHVwIHRlc3QKQEAgLTIzNyw3ICsyMzcsNyBAQAogICAgIElEczsgeW91IG9ubHkgbmVlZCB0byB1cGxvYWQgeW91ciBhcHBsaWNhdGlvbiBhcyBhIGRyYWZ0IGFwcGxpY2F0aW9uLiBIb3dldmVyLCB5b3UgbXVzdCBzaWduCiAgICAgeW91ciBhcHBsaWNhdGlvbiB3aXRoIHlvdXIgcmVsZWFzZSBrZXkgYmVmb3JlIHlvdSB1cGxvYWQgaXQgYXMgYSBkcmFmdCBhcHBsaWNhdGlvbi4gQWxzbywgdGhlCiAgICAgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHVwbG9hZGVkIGFwcGxpY2F0aW9uIG11c3QgbWF0Y2ggdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBhcHBsaWNhdGlvbiB5b3UKLSAgICBsb2FkIHRvIHlvdXIgZGV2aWNlIGZvciB0ZXN0aW5nLiBUbyBsZWFybiBob3cgdG8gdXBsb2FkIGFuIGFwcGxpY2F0aW9uIHRvIEFuZHJvaWQgTWFya2V0LCBzZWUKKyAgICBsb2FkIHRvIHlvdXIgZGV2aWNlIGZvciB0ZXN0aW5nLiBUbyBsZWFybiBob3cgdG8gdXBsb2FkIGFuIGFwcGxpY2F0aW9uIHRvIEdvb2dsZSBQbGF5LCBzZWUKICAgICA8YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3N1cHBvcnQvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTEzNDY5Ij5VcGxvYWRpbmcKICAgICBhcHBsaWNhdGlvbnM8L2E+LjwvcD4KICAgPC9saT4KQEAgLTI1Nyw3ICsyNTcsNyBAQAogICAgIDxwPlRvIHBlcmZvcm0gZW5kLXRvLWVuZCB0ZXN0aW5nIG9mIGluLWFwcCBiaWxsaW5nLCB0aGUgcHJpbWFyeSBhY2NvdW50IG9uIHlvdXIgZGV2aWNlIG11c3QgYmUKICAgICBvbmUgb2YgdGhlIDxhCiAgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfYWRtaW4uaHRtbCNiaWxsaW5nLXRlc3Rpbmctc2V0dXAiPnRlc3QgYWNjb3VudHM8L2E+Ci0gICAgdGhhdCB5b3UgcmVnaXN0ZXJlZCBvbiB0aGUgQW5kcm9pZCBNYXJrZXQgc2l0ZS4gSWYgdGhlIHByaW1hcnkgYWNjb3VudCBvbiB5b3VyIGRldmljZSBpcyBub3QgYQorICAgIHRoYXQgeW91IHJlZ2lzdGVyZWQgb24gdGhlIEdvb2dsZSBQbGF5IHNpdGUuIElmIHRoZSBwcmltYXJ5IGFjY291bnQgb24geW91ciBkZXZpY2UgaXMgbm90IGEKICAgICB0ZXN0IGFjY291bnQsIHlvdSBtdXN0IGRvIGEgZmFjdG9yeSByZXNldCBvZiB0aGUgZGV2aWNlIGFuZCB0aGVuIHNpZ24gaW4gd2l0aCBvbmUgb2YgeW91ciB0ZXN0CiAgICAgYWNjb3VudHMuIFRvIHBlcmZvcm0gYSBmYWN0b3J5IHJlc2V0LCBkbyB0aGUgZm9sbG93aW5nOjwvcD4KICAgICA8b2w+CkBAIC0yNjksMTQgKzI2OSwxNCBAQAogICAgICAgZGV2aWNlIHNldHVwIHByb2Nlc3MuPC9saT4KICAgICA8L29sPgogICA8L2xpPgotICA8bGk+PHN0cm9uZz5WZXJpZnkgdGhhdCB5b3VyIGRldmljZSBpcyBydW5uaW5nIGEgc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhlIEFuZHJvaWQgTWFya2V0CisgIDxsaT48c3Ryb25nPlZlcmlmeSB0aGF0IHlvdXIgZGV2aWNlIGlzIHJ1bm5pbmcgYSBzdXBwb3J0ZWQgdmVyc2lvbiBvZiB0aGUgR29vZ2xlIFBsYXkKICAgYXBwbGljYXRpb24gb3IgdGhlIE15QXBwcyBhcHBsaWNhdGlvbi48L3N0cm9uZz4KICAgICA8cD5JZiB5b3VyIGRldmljZSBpcyBydW5uaW5nIEFuZHJvaWQgMy4wLCBpbi1hcHAgYmlsbGluZyByZXF1aXJlcyB2ZXJzaW9uIDUuMC4xMiAob3IgaGlnaGVyKSBvZgogICAgIHRoZSBNeUFwcHMgYXBwbGljYXRpb24uIElmIHlvdXIgZGV2aWNlIGlzIHJ1bm5pbmcgYW55IG90aGVyIHZlcnNpb24gb2YgQW5kcm9pZCwgaW4tYXBwIGJpbGxpbmcKLSAgICByZXF1aXJlcyB2ZXJzaW9uIDIuMy40IChvciBoaWdoZXIpIG9mIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbi4gVG8gbGVhcm4gaG93IHRvIGNoZWNrIHRoZQotICAgIHZlcnNpb24gb2YgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLCBzZWUgPGEKLSAgICBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3N1cHBvcnQvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTkwODYwIj5VcGRhdGluZyBBbmRyb2lkCi0gICAgTWFya2V0PC9hPi48L3A+CisgICAgcmVxdWlyZXMgdmVyc2lvbiAyLjMuNCAob3IgaGlnaGVyKSBvZiB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24uIFRvIGxlYXJuIGhvdyB0byBjaGVjayB0aGUKKyAgICB2ZXJzaW9uIG9mIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiwgc2VlIDxhCisgICAgaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9zdXBwb3J0L2Jpbi9hbnN3ZXIucHk/YW5zd2VyPTE5MDg2MCI+VXBkYXRpbmcgR29vZ2xlCisgICAgUGxheTwvYT4uPC9wPgogICA8L2xpPgogICA8bGk+PHN0cm9uZz5NYWtlIGluLWFwcCBwdXJjaGFzZXMgaW4geW91ciBhcHBsaWNhdGlvbi48L3N0cm9uZz48L2xpPgogPC9vbD4KQEAgLTI4NSw3ICsyODUsNyBAQAogZG8gYSBmYWN0b3J5IHJlc2V0LCBtYWtpbmcgc3VyZSB5b3UgbG9nIG9uIHdpdGggeW91ciBwcmltYXJ5IGFjY291bnQgZmlyc3QuPC9wPgogCiA8cD5XaGVuIHlvdSBhcmUgZmluaXNoZWQgdGVzdGluZyB5b3VyIGluLWFwcCBiaWxsaW5nIGltcGxlbWVudGF0aW9uLCB5b3UgYXJlIHJlYWR5IHRvCi1wdWJsaXNoIHlvdXIgYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQuIFlvdSBjYW4gZm9sbG93IHRoZSBub3JtYWwgc3RlcHMgZm9yIDxhCitwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkuIFlvdSBjYW4gZm9sbG93IHRoZSBub3JtYWwgc3RlcHMgZm9yIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wcmVwYXJpbmcuaHRtbCI+cHJlcGFyaW5nPC9hPiwgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL2FwcC1zaWduaW5nLmh0bWwiPnNpZ25pbmc8L2E+LCBhbmQgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCI+cHVibGlzaGluZyB5b3VyIGFwcGxpY2F0aW9uPC9hPi4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9pbmRleC5qZCBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9pbmRleC5qZAppbmRleCBmZGZhNmZhLi4wMzY3NjFmIDEwMDc1NQotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL21hcmtldC9iaWxsaW5nL2luZGV4LmpkCkBAIC0zMCwxOCArMzAsMTggQEAKIDwvZGl2PgogPC9kaXY+CiAKLTxwPkFuZHJvaWQgTWFya2V0IEluLWFwcCBCaWxsaW5nIGlzIGFuIEFuZHJvaWQgTWFya2V0IHNlcnZpY2UgdGhhdCBsZXRzIHlvdSBzZWxsIGRpZ2l0YWwgY29udGVudCBpbgorPHA+R29vZ2xlIFBsYXkgSW4tYXBwIEJpbGxpbmcgaXMgYSBHb29nbGUgUGxheSBzZXJ2aWNlIHRoYXQgbGV0cyB5b3Ugc2VsbCBkaWdpdGFsIGNvbnRlbnQgaW4KIHlvdXIgYXBwbGljYXRpb25zLiBZb3UgY2FuIHVzZSB0aGUgc2VydmljZSB0byBzZWxsIGEgd2lkZSByYW5nZSBvZiBjb250ZW50LCBpbmNsdWRpbmcgZG93bmxvYWRhYmxlCiBjb250ZW50IHN1Y2ggYXMgbWVkaWEgZmlsZXMgb3IgcGhvdG9zLCBhbmQgdmlydHVhbCBjb250ZW50IHN1Y2ggYXMgZ2FtZSBsZXZlbHMgb3IgcG90aW9ucy48L3A+CiAKLTxwPldoZW4geW91IHVzZSBBbmRyb2lkIE1hcmtldCdzIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UgdG8gc2VsbCBhbiBpdGVtLCBBbmRyb2lkIE1hcmtldCBoYW5kbGVzIGFsbAorPHA+V2hlbiB5b3UgdXNlIEdvb2dsZSBQbGF5J3MgaW4tYXBwIGJpbGxpbmcgc2VydmljZSB0byBzZWxsIGFuIGl0ZW0sIEdvb2dsZSBQbGF5IGhhbmRsZXMgYWxsCiBjaGVja291dCBkZXRhaWxzIHNvIHlvdXIgYXBwbGljYXRpb24gbmV2ZXIgaGFzIHRvIGRpcmVjdGx5IHByb2Nlc3MgYW55IGZpbmFuY2lhbCB0cmFuc2FjdGlvbnMuCi1BbmRyb2lkIE1hcmtldCB1c2VzIHRoZSBzYW1lIGNoZWNrb3V0IHNlcnZpY2UgdGhhdCBpcyB1c2VkIGZvciBhcHBsaWNhdGlvbiBwdXJjaGFzZXMsIHNvIHlvdXIgdXNlcnMKK0dvb2dsZSBQbGF5IHVzZXMgdGhlIHNhbWUgY2hlY2tvdXQgc2VydmljZSB0aGF0IGlzIHVzZWQgZm9yIGFwcGxpY2F0aW9uIHB1cmNoYXNlcywgc28geW91ciB1c2VycwogZXhwZXJpZW5jZSBhIGNvbnNpc3RlbnQgYW5kIGZhbWlsaWFyIHB1cmNoYXNlIGZsb3cgKHNlZSBmaWd1cmUgMSkuIEFsc28sIHRoZSB0cmFuc2FjdGlvbiBmZWUgZm9yCiBpbi1hcHAgcHVyY2hhc2VzIGlzIHRoZSBzYW1lIGFzIHRoZSB0cmFuc2FjdGlvbiBmZWUgZm9yIGFwcGxpY2F0aW9uIHB1cmNoYXNlcyAoMzAlKS48L3A+CiAKLTxwPkFueSBhcHBsaWNhdGlvbiB0aGF0IHlvdSBwdWJsaXNoIHRocm91Z2ggQW5kcm9pZCBNYXJrZXQgY2FuIGltcGxlbWVudCBpbi1hcHAgYmlsbGluZy4gTm8gc3BlY2lhbAotYWNjb3VudCBvciByZWdpc3RyYXRpb24gaXMgcmVxdWlyZWQgb3RoZXIgdGhhbiBhbiBBbmRyb2lkIE1hcmtldCBwdWJsaXNoZXIgYWNjb3VudCBhbmQgYSBHb29nbGUKKzxwPkFueSBhcHBsaWNhdGlvbiB0aGF0IHlvdSBwdWJsaXNoIHRocm91Z2ggR29vZ2xlIFBsYXkgY2FuIGltcGxlbWVudCBpbi1hcHAgYmlsbGluZy4gTm8gc3BlY2lhbAorYWNjb3VudCBvciByZWdpc3RyYXRpb24gaXMgcmVxdWlyZWQgb3RoZXIgdGhhbiBhIEdvb2dsZSBQbGF5IGFwcCBwdWJsaXNoZXIgYWNjb3VudCBhbmQgYSBHb29nbGUKIENoZWNrb3V0IE1lcmNoYW50IGFjY291bnQuIEFsc28sIGJlY2F1c2UgdGhlIHNlcnZpY2UgdXNlcyBubyBkZWRpY2F0ZWQgZnJhbWV3b3JrIEFQSXMsIHlvdSBjYW4gYWRkCiBpbi1hcHAgYmlsbGluZyB0byBhbnkgYXBwbGljYXRpb24gdGhhdCB1c2VzIGEgbWluaW11bSBBUEkgbGV2ZWwgb2YgNCBvciBoaWdoZXIuPC9wPgogCkBAIC01OSwxMSArNTksMTEgQEAKIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2JpbGxpbmdfY2hlY2tvdXRfZmxvdy5wbmciIGhlaWdodD0iMzgyIiBpZD0iZmlndXJlMSIgLz4KIDxwIGNsYXNzPSJpbWctY2FwdGlvbiI+CiAgIDxzdHJvbmc+RmlndXJlIDEuPC9zdHJvbmc+IEFwcGxpY2F0aW9ucyBpbml0aWF0ZSBpbi1hcHAgYmlsbGluZyByZXF1ZXN0cyB0aHJvdWdoIHRoZWlyIG93biBVSQotICAoZmlyc3Qgc2NyZWVuKS4gQW5kcm9pZCBNYXJrZXQgcmVzcG9uZHMgdG8gdGhlIHJlcXVlc3QgYnkgcHJvdmlkaW5nIHRoZSBjaGVja291dCB1c2VyIGludGVyZmFjZQorICAoZmlyc3Qgc2NyZWVuKS4gR29vZ2xlIFBsYXkgcmVzcG9uZHMgdG8gdGhlIHJlcXVlc3QgYnkgcHJvdmlkaW5nIHRoZSBjaGVja291dCB1c2VyIGludGVyZmFjZQogICAobWlkZGxlIHNjcmVlbikuIFdoZW4gY2hlY2tvdXQgaXMgY29tcGxldGUsIHRoZSBhcHBsaWNhdGlvbiByZXN1bWVzLgogPC9wPgogCi08cD5UbyBsZWFybiBtb3JlIGFib3V0IEFuZHJvaWQgTWFya2V0J3MgaW4tYXBwIGJpbGxpbmcgc2VydmljZSBhbmQgc3RhcnQgaW50ZWdyYXRpbmcgaXQgaW50byB5b3VyCis8cD5UbyBsZWFybiBtb3JlIGFib3V0IEdvb2dsZSBQbGF5J3MgaW4tYXBwIGJpbGxpbmcgc2VydmljZSBhbmQgc3RhcnQgaW50ZWdyYXRpbmcgaXQgaW50byB5b3VyCiBhcHBsaWNhdGlvbnMsIHJlYWQgdGhlIGZvbGxvd2luZyBkb2N1bWVudHM6PC9wPgogCiA8ZGw+CkBAIC04OCw3ICs4OCw3IEBACiAgICAgPGRkPkxlYXJuIGhvdyB0byBzZXQgdXAgeW91ciBwcm9kdWN0IGxpc3QsIHJlZ2lzdGVyIHRlc3QgYWNjb3VudHMsIGFuZCBoYW5kbGUgcmVmdW5kcy48L2RkPgogICA8ZHQ+PHN0cm9uZz48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19yZWZlcmVuY2UuaHRtbCI+SW4tYXBwIEJpbGxpbmcKICAgUmVmZXJlbmNlPC9hPjwvc3Ryb25nPjwvZHQ+Ci0gICAgPGRkPkdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBBbmRyb2lkIE1hcmtldCByZXNwb25zZSBjb2RlcyBhbmQgdGhlIGluLWFwcCBiaWxsaW5nCisgICAgPGRkPkdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBHb29nbGUgUGxheSByZXNwb25zZSBjb2RlcyBhbmQgdGhlIGluLWFwcCBiaWxsaW5nCiAgICAgaW50ZXJmYWNlLjwvZGQ+CiA8L2RsPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2V4cGFuc2lvbi1maWxlcy5qZCBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvZXhwYW5zaW9uLWZpbGVzLmpkCmluZGV4IGNkOWI1N2EuLjAxYWNiMzMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvZXhwYW5zaW9uLWZpbGVzLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvZXhwYW5zaW9uLWZpbGVzLmpkCkBAIC04LDcgKzgsNyBAQAogPHVsPgogICA8bGk+UmVjb21tZW5kZWQgZm9yIG1vc3QgYXBwcyB0aGF0IGV4Y2VlZCB0aGUgNTBNQiBBUEsgbGltaXQ8L2xpPgogICA8bGk+WW91IGNhbiBwcm92aWRlIHVwIHRvIDRHQiBvZiBhZGRpdGlvbmFsIGRhdGEgZm9yIGVhY2ggQVBLPC9saT4KLSAgPGxpPkFuZHJvaWQgTWFya2V0IGhvc3RzIGFuZCBzZXJ2ZXMgdGhlIGV4cGFuc2lvbiBmaWxlcyBhdCBubyBjaGFyZ2U8L2xpPgorICA8bGk+R29vZ2xlIFBsYXkgaG9zdHMgYW5kIHNlcnZlcyB0aGUgZXhwYW5zaW9uIGZpbGVzIGF0IG5vIGNoYXJnZTwvbGk+CiAgIDxsaT5UaGUgZmlsZXMgY2FuIGJlIGFueSBmaWxlIHR5cGUgeW91IHdhbnQgYW5kIGFyZSBzYXZlZCB0byB0aGUgZGV2aWNlJ3Mgc2hhcmVkIHN0b3JhZ2U8L2xpPgogPC91bD4KIApAQCAtNjEsMjggKzYxLDI4IEBACiAKIAogCi08cD5BbmRyb2lkIE1hcmtldCBjdXJyZW50bHkgcmVxdWlyZXMgdGhhdCB5b3VyIEFQSyBmaWxlIGJlIG5vIG1vcmUgdGhhbiA1ME1CLiBGb3IgbW9zdAorPHA+R29vZ2xlIFBsYXkgY3VycmVudGx5IHJlcXVpcmVzIHRoYXQgeW91ciBBUEsgZmlsZSBiZSBubyBtb3JlIHRoYW4gNTBNQi4gRm9yIG1vc3QKIGFwcGxpY2F0aW9ucywgdGhpcyBpcyBwbGVudHkgb2Ygc3BhY2UgZm9yIGFsbCB0aGUgYXBwbGljYXRpb24ncyBjb2RlIGFuZCBhc3NldHMuCiBIb3dldmVyLCBzb21lIGFwcHMgbmVlZCBtb3JlIHNwYWNlIGZvciBoaWdoLWZpZGVsaXR5IGdyYXBoaWNzLCBtZWRpYSBmaWxlcywgb3Igb3RoZXIgbGFyZ2UgYXNzZXRzLgogUHJldmlvdXNseSwgaWYgeW91ciBhcHAgZXhjZWVkZWQgNTBNQiwgeW91IGhhZCB0byBob3N0IGFuZCBkb3dubG9hZCB0aGUgYWRkaXRpb25hbCByZXNvdXJjZXMKIHlvdXJzZWxmIHdoZW4gdGhlIHVzZXIgb3BlbnMgdGhlIGFwcC4gSG9zdGluZyBhbmQgc2VydmluZyB0aGUgZXh0cmEgZmlsZXMgY2FuIGJlIGNvc3RseSwgYW5kIHRoZQogdXNlciBleHBlcmllbmNlIGlzIG9mdGVuIGxlc3MgdGhhbiBpZGVhbC4gVG8gbWFrZSB0aGlzIHByb2Nlc3MgZWFzaWVyIGZvciB5b3UgYW5kIG1vcmUgcGxlYXNhbnQKLWZvciB1c2VycywgQW5kcm9pZCBNYXJrZXQgYWxsb3dzIHlvdSB0byBhdHRhY2ggdHdvIGxhcmdlIGV4cGFuc2lvbiBmaWxlcyB0aGF0IHN1cHBsZW1lbnQgeW91cgorZm9yIHVzZXJzLCBHb29nbGUgUGxheSBhbGxvd3MgeW91IHRvIGF0dGFjaCB0d28gbGFyZ2UgZXhwYW5zaW9uIGZpbGVzIHRoYXQgc3VwcGxlbWVudCB5b3VyCiBBUEsuPC9wPgogCi08cD5BbmRyb2lkIE1hcmtldCBob3N0cyB0aGUgZXhwYW5zaW9uIGZpbGVzIGZvciB5b3VyIGFwcGxpY2F0aW9uIGFuZCBzZXJ2ZXMgdGhlbSB0byB0aGUgZGV2aWNlIGF0Cis8cD5Hb29nbGUgUGxheSBob3N0cyB0aGUgZXhwYW5zaW9uIGZpbGVzIGZvciB5b3VyIGFwcGxpY2F0aW9uIGFuZCBzZXJ2ZXMgdGhlbSB0byB0aGUgZGV2aWNlIGF0CiBubyBjb3N0IHRvIHlvdS4gVGhlIGV4cGFuc2lvbiBmaWxlcyBhcmUgc2F2ZWQgdG8gdGhlIGRldmljZSdzIHNoYXJlZCBzdG9yYWdlIGxvY2F0aW9uICh0aGUKIFNEIGNhcmQgb3IgVVNCLW1vdW50YWJsZSBwYXJ0aXRpb247IGFsc28ga25vd24gYXMgdGhlICJleHRlcm5hbCIgc3RvcmFnZSkgd2hlcmUgeW91ciBhcHAgY2FuIGFjY2VzcwotdGhlbS4gT24gbW9zdCBkZXZpY2VzLCBBbmRyb2lkIE1hcmtldCBkb3dubG9hZHMgdGhlIGV4cGFuc2lvbiBmaWxlKHMpIGF0IHRoZSBzYW1lIHRpbWUgaXQKK3RoZW0uIE9uIG1vc3QgZGV2aWNlcywgR29vZ2xlIFBsYXkgZG93bmxvYWRzIHRoZSBleHBhbnNpb24gZmlsZShzKSBhdCB0aGUgc2FtZSB0aW1lIGl0CiBkb3dubG9hZHMgdGhlIEFQSywgc28geW91ciBhcHBsaWNhdGlvbiBoYXMgZXZlcnl0aGluZyBpdCBuZWVkcyB3aGVuIHRoZSB1c2VyIG9wZW5zIGl0IGZvciB0aGUKLWZpcnN0IHRpbWUuIEluIHNvbWUgY2FzZXMsIGhvd2V2ZXIsIHlvdXIgYXBwbGljYXRpb24gbXVzdCBkb3dubG9hZCB0aGUgZmlsZXMgZnJvbSBBbmRyb2lkIE1hcmtldAorZmlyc3QgdGltZS4gSW4gc29tZSBjYXNlcywgaG93ZXZlciwgeW91ciBhcHBsaWNhdGlvbiBtdXN0IGRvd25sb2FkIHRoZSBmaWxlcyBmcm9tIEdvb2dsZSBQbGF5CiB3aGVuIHlvdXIgYXBwbGljYXRpb24gc3RhcnRzLjwvcD4KIAogCiAKIDxoMiBpZD0iT3ZlcnZpZXciPk92ZXJ2aWV3PC9oMj4KIAotPHA+RWFjaCB0aW1lIHlvdSB1cGxvYWQgYW4gQVBLIHVzaW5nIHRoZSBBbmRyb2lkIE1hcmtldCBEZXZlbG9wZXIgQ29uc29sZSwgeW91IGhhdmUgdGhlIG9wdGlvbiB0bworPHA+RWFjaCB0aW1lIHlvdSB1cGxvYWQgYW4gQVBLIHVzaW5nIHRoZSBHb29nbGUgUGxheSBBbmRyb2lkIERldmVsb3BlciBDb25zb2xlLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIHRvCiBhZGQgb25lIG9yIHR3byBleHBhbnNpb24gZmlsZXMgdG8gdGhlIEFQSy4gRWFjaCBmaWxlIGNhbiBiZSB1cCB0byAyR0IgYW5kIGl0IGNhbiBiZSBhbnkgZm9ybWF0IHlvdQogY2hvb3NlLCBidXQgd2UgcmVjb21tZW5kIHlvdSB1c2UgYSBjb21wcmVzc2VkIGZpbGUgdG8gY29uc2VydmUgYmFuZHdpZHRoIGR1cmluZyB0aGUgZG93bmxvYWQuCiBDb25jZXB0dWFsbHksIGVhY2ggZXhwYW5zaW9uIGZpbGUgcGxheXMgYSBkaWZmZXJlbnQgcm9sZTo8L3A+CkBAIC0xMDIsNyArMTAyLDcgQEAKIDxwPkhvd2V2ZXIsIGV2ZW4gaWYgeW91ciBhcHBsaWNhdGlvbiB1cGRhdGUgcmVxdWlyZXMgb25seSBhIG5ldyBwYXRjaCBleHBhbnNpb24gZmlsZSwgeW91IHN0aWxsIG11c3QKIHVwbG9hZCBhIG5ldyBBUEsgd2l0aCBhbiB1cGRhdGVkIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCN2Y29kZSI+e0Bjb2RlCi12ZXJzaW9uQ29kZX08L2E+IGluIHRoZSBtYW5pZmVzdC4gKFRoZSBBbmRyb2lkIE1hcmtldAordmVyc2lvbkNvZGV9PC9hPiBpbiB0aGUgbWFuaWZlc3QuIChUaGUKIERldmVsb3BlciBDb25zb2xlIGRvZXMgbm90IGFsbG93IHlvdSB0byB1cGxvYWQgYW4gZXhwYW5zaW9uIGZpbGUgdG8gYW4gZXhpc3RpbmcgQVBLLik8L3A+CiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBwYXRjaCBleHBhbnNpb24gZmlsZSBpcyBzZW1hbnRpY2FsbHkgdGhlIHNhbWUgYXMgdGhlCkBAIC0xMTUsNyArMTE1LDcgQEAKIDxoMyBpZD0iRmlsZW5hbWUiPkZpbGUgbmFtZSBmb3JtYXQ8L2gzPgogCiA8cD5FYWNoIGV4cGFuc2lvbiBmaWxlIHlvdSB1cGxvYWQgY2FuIGJlIGFueSBmb3JtYXQgeW91IGNob29zZSAoWklQLCBQREYsIE1QNCwgZXRjLikuIFJlZ2FyZGxlc3Mgb2YKLXRoZSBmaWxlIHR5cGUsIEFuZHJvaWQgTWFya2V0IGNvbnNpZGVycyB0aGVtIG9wYXF1ZSBiaW5hcnkgYmxvYnMgYW5kIHJlbmFtZXMgdGhlIGZpbGVzCit0aGUgZmlsZSB0eXBlLCBHb29nbGUgUGxheSBjb25zaWRlcnMgdGhlbSBvcGFxdWUgYmluYXJ5IGJsb2JzIGFuZCByZW5hbWVzIHRoZSBmaWxlcwogdXNpbmcgdGhlIGZvbGxvd2luZyBzY2hlbWU6PC9wPgogCiA8cHJlIGNsYXNzPSJjbGFzc2ljIG5vLXByZXR0eS1wcmludCI+CkBAIC0xMzMsNyArMTMzLDcgQEAKIDxlbT5maXJzdDwvZW0+IGFzc29jaWF0ZWQgKGl0IG1hdGNoZXMgdGhlIGFwcGxpY2F0aW9uJ3MgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtZWxlbWVudC5odG1sI3Zjb2RlIj57QGNvZGUgYW5kcm9pZDp2ZXJzaW9uQ29kZX08L2E+CiB2YWx1ZSkuCi0gICAgPHA+IkZpcnN0IiBpcyBlbXBoYXNpemVkIGJlY2F1c2UgYWx0aG91Z2ggdGhlIEFuZHJvaWQgTWFya2V0IERldmVsb3BlciBDb25zb2xlIGFsbG93cyB5b3UgdG8KKyAgICA8cD4iRmlyc3QiIGlzIGVtcGhhc2l6ZWQgYmVjYXVzZSBhbHRob3VnaCB0aGUgRGV2ZWxvcGVyIENvbnNvbGUgYWxsb3dzIHlvdSB0bwogcmUtdXNlIGFuIHVwbG9hZGVkIGV4cGFuc2lvbiBmaWxlIHdpdGggYSBuZXcgQVBLLCB0aGUgZXhwYW5zaW9uIGZpbGUncyBuYW1lIGRvZXMgbm90IGNoYW5nZSZtZGFzaDtpdAogcmV0YWlucyB0aGUgdmVyc2lvbiBhcHBsaWVkIHRvIGl0IHdoZW4geW91IGZpcnN0IHVwbG9hZGVkIHRoZSBmaWxlLjwvcD48L2RkPgogICA8ZHQ+e0Bjb2RlICZsdDtwYWNrYWdlLW5hbWUmZ3Q7fTwvZHQ+IApAQCAtMTQ3LDkgKzE0Nyw5IEBACiAKIDxoMyBpZD0iU3RvcmFnZUxvY2F0aW9uIj5TdG9yYWdlIGxvY2F0aW9uPC9oMz4KIAotPHA+V2hlbiBBbmRyb2lkIE1hcmtldCBkb3dubG9hZHMgeW91ciBleHBhbnNpb24gZmlsZXMgdG8gYSBkZXZpY2UsIGl0IHNhdmVzIHRoZW0gdG8gdGhlIHN5c3RlbSdzCis8cD5XaGVuIEdvb2dsZSBQbGF5IGRvd25sb2FkcyB5b3VyIGV4cGFuc2lvbiBmaWxlcyB0byBhIGRldmljZSwgaXQgc2F2ZXMgdGhlbSB0byB0aGUgc3lzdGVtJ3MKIHNoYXJlZCBzdG9yYWdlIGxvY2F0aW9uLiBUbyBlbnN1cmUgcHJvcGVyIGJlaGF2aW9yLCB5b3UgbXVzdCBub3QgZGVsZXRlLCBtb3ZlLCBvciByZW5hbWUgdGhlCi1leHBhbnNpb24gZmlsZXMuIEluIHRoZSBldmVudCB0aGF0IHlvdXIgYXBwbGljYXRpb24gbXVzdCBwZXJmb3JtIHRoZSBkb3dubG9hZCBmcm9tIEFuZHJvaWQgTWFya2V0CitleHBhbnNpb24gZmlsZXMuIEluIHRoZSBldmVudCB0aGF0IHlvdXIgYXBwbGljYXRpb24gbXVzdCBwZXJmb3JtIHRoZSBkb3dubG9hZCBmcm9tIEdvb2dsZSBQbGF5CiBpdHNlbGYsIHlvdSBtdXN0IHNhdmUgdGhlIGZpbGVzIHRvIHRoZSBleGFjdCBzYW1lIGxvY2F0aW9uLjwvcD4KIAogPHA+VGhlIHNwZWNpZmljIGxvY2F0aW9uIGZvciB5b3VyIGV4cGFuc2lvbiBmaWxlcyBpczo8L3A+CkBAIC0xOTQsMjcgKzE5NCwyNyBAQAogCiA8aDMgaWQ9IkRvd25sb2FkUHJvY2VzcyI+RG93bmxvYWQgcHJvY2VzczwvaDM+CiAKLTxwPk1vc3Qgb2YgdGhlIHRpbWUsIEFuZHJvaWQgTWFya2V0IGRvd25sb2FkcyBhbmQgc2F2ZXMgeW91ciBleHBhbnNpb24gZmlsZXMgYXQgdGhlIHNhbWUgdGltZSBpdAotZG93bmxvYWRzIHRoZSBBUEsgdG8gdGhlIGRldmljZS4gSG93ZXZlciwgaW4gc29tZSBjYXNlcyBBbmRyb2lkIE1hcmtldAorPHA+TW9zdCBvZiB0aGUgdGltZSwgR29vZ2xlIFBsYXkgZG93bmxvYWRzIGFuZCBzYXZlcyB5b3VyIGV4cGFuc2lvbiBmaWxlcyBhdCB0aGUgc2FtZSB0aW1lIGl0Citkb3dubG9hZHMgdGhlIEFQSyB0byB0aGUgZGV2aWNlLiBIb3dldmVyLCBpbiBzb21lIGNhc2VzIEdvb2dsZSBQbGF5CiBjYW5ub3QgZG93bmxvYWQgdGhlIGV4cGFuc2lvbiBmaWxlcyBvciB0aGUgdXNlciBtaWdodCBoYXZlIGRlbGV0ZWQgcHJldmlvdXNseSBkb3dubG9hZGVkIGV4cGFuc2lvbgogZmlsZXMuIFRvIGhhbmRsZSB0aGVzZSBzaXR1YXRpb25zLCB5b3VyIGFwcCBtdXN0IGJlIGFibGUgdG8gZG93bmxvYWQgdGhlIGZpbGVzCi1pdHNlbGYgd2hlbiB0aGUgbWFpbiBhY3Rpdml0eSBzdGFydHMsIHVzaW5nIGEgVVJMIHByb3ZpZGVkIGJ5IEFuZHJvaWQgTWFya2V0LjwvcD4KK2l0c2VsZiB3aGVuIHRoZSBtYWluIGFjdGl2aXR5IHN0YXJ0cywgdXNpbmcgYSBVUkwgcHJvdmlkZWQgYnkgR29vZ2xlIFBsYXkuPC9wPgogCiA8cD5UaGUgZG93bmxvYWQgcHJvY2VzcyBmcm9tIGEgaGlnaCBsZXZlbCBsb29rcyBsaWtlIHRoaXM6PC9wPgogCiA8b2w+Ci0gIDxsaT5Vc2VyIHNlbGVjdHMgdG8gaW5zdGFsbCB5b3VyIGFwcCBmcm9tIEFuZHJvaWQgTWFya2V0LjwvbGk+Ci0gIDxsaT5JZiBBbmRyb2lkIE1hcmtldCBpcyBhYmxlIHRvIGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMgKHdoaWNoIGlzIHRoZSBjYXNlIGZvciBtb3N0CisgIDxsaT5Vc2VyIHNlbGVjdHMgdG8gaW5zdGFsbCB5b3VyIGFwcCBmcm9tIEdvb2dsZSBQbGF5LjwvbGk+CisgIDxsaT5JZiBHb29nbGUgUGxheSBpcyBhYmxlIHRvIGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMgKHdoaWNoIGlzIHRoZSBjYXNlIGZvciBtb3N0CiBkZXZpY2VzKSwgaXQgZG93bmxvYWRzIHRoZW0gYWxvbmcgd2l0aCB0aGUgQVBLLgotICAgICA8cD5JZiBBbmRyb2lkIE1hcmtldCBpcyB1bmFibGUgdG8gZG93bmxvYWQgdGhlIGV4cGFuc2lvbiBmaWxlcywgaXQgZG93bmxvYWRzIHRoZQorICAgICA8cD5JZiBHb29nbGUgUGxheSBpcyB1bmFibGUgdG8gZG93bmxvYWQgdGhlIGV4cGFuc2lvbiBmaWxlcywgaXQgZG93bmxvYWRzIHRoZQogQVBLIG9ubHkuPC9wPgogICA8L2xpPgogICA8bGk+V2hlbiB0aGUgdXNlciBsYXVuY2hlcyB5b3VyIGFwcGxpY2F0aW9uLCB5b3VyIGFwcCBtdXN0IGNoZWNrIHdoZXRoZXIgdGhlIGV4cGFuc2lvbiBmaWxlcyBhcmUKIGFscmVhZHkgc2F2ZWQgb24gdGhlIGRldmljZS4KICAgICA8b2w+CiAgICAgICA8bGk+SWYgeWVzLCB5b3VyIGFwcCBpcyByZWFkeSB0byBnby48L2xpPgotICAgICAgPGxpPklmIG5vLCB5b3VyIGFwcCBtdXN0IGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMgb3ZlciBIVFRQIGZyb20gQW5kcm9pZCBNYXJrZXQuIFlvdXIgYXBwCi1tdXN0IHNlbmQgYSByZXF1ZXN0IHRvIHRoZSBBbmRyb2lkIE1hcmtldCBjbGllbnQgdXNpbmcgdGhlIEFuZHJvaWQgTWFya2V0J3MgPGEKKyAgICAgIDxsaT5JZiBubywgeW91ciBhcHAgbXVzdCBkb3dubG9hZCB0aGUgZXhwYW5zaW9uIGZpbGVzIG92ZXIgSFRUUCBmcm9tIEdvb2dsZSBQbGF5LiBZb3VyIGFwcAorbXVzdCBzZW5kIGEgcmVxdWVzdCB0byB0aGUgR29vZ2xlIFBsYXkgY2xpZW50IHVzaW5nIHRoZSBHb29nbGUgUGxheSdzIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy9pbmRleC5odG1sIj5BcHBsaWNhdGlvbiBMaWNlbnNpbmc8L2E+IHNlcnZpY2UsIHdoaWNoCiByZXNwb25kcyB3aXRoIHRoZSBuYW1lLCBmaWxlIHNpemUsIGFuZCBVUkwgZm9yIGVhY2ggZXhwYW5zaW9uIGZpbGUuIFdpdGggdGhpcyBpbmZvcm1hdGlvbiwgeW91IHRoZW4KIGRvd25sb2FkIHRoZSBmaWxlcyBhbmQgc2F2ZSB0aGVtIHRvIHRoZSBwcm9wZXIgPGEgaHJlZj0iI1N0b3JhZ2VMb2NhdGlvbiI+c3RvcmFnZSBsb2NhdGlvbjwvYT4uPC9saT4KQEAgLTIyMyw3ICsyMjMsNyBAQAogPC9vbD4KIAogPHAgY2xhc3M9ImNhdXRpb24iPjxzdHJvbmc+Q2F1dGlvbjo8L3N0cm9uZz4gSXQgaXMgY3JpdGljYWwgdGhhdCB5b3UgaW5jbHVkZSB0aGUgbmVjZXNzYXJ5IGNvZGUgdG8KLWRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMgZnJvbSBBbmRyb2lkIE1hcmtldCBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgZmlsZXMgYXJlIG5vdCBhbHJlYWR5IG9uIHRoZQorZG93bmxvYWQgdGhlIGV4cGFuc2lvbiBmaWxlcyBmcm9tIEdvb2dsZSBQbGF5IGluIHRoZSBldmVudCB0aGF0IHRoZSBmaWxlcyBhcmUgbm90IGFscmVhZHkgb24gdGhlCiBkZXZpY2Ugd2hlbiB5b3VyIGFwcGxpY2F0aW9uIHN0YXJ0cy4gQXMgZGlzY3Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBhYm91dCA8YQogaHJlZj0iI0Rvd25sb2FkaW5nIj5Eb3dubG9hZGluZyB0aGUgRXhwYW5zaW9uIEZpbGVzPC9hPiwgd2UndmUgbWFkZSBhIGxpYnJhcnkgYXZhaWxhYmxlIHRvIHlvdSB0aGF0CiBncmVhdGx5IHNpbXBsaWZpZXMgdGhpcyBwcm9jZXNzIGFuZCBwZXJmb3JtcyB0aGUgZG93bmxvYWQgZnJvbSBhIHNlcnZpY2Ugd2l0aCBhIG1pbmltYWwgYW1vdW50IG9mCkBAIC0yNTgsNyArMjU4LDcgQEAKIExpYnJhcnk8L2E+LjwvcD4KICAgPC9saT4KICAgPGxpPkFkZCBsb2dpYyB0byB5b3VyIGFwcGxpY2F0aW9uJ3MgbWFpbiBhY3Rpdml0eSB0aGF0IGNoZWNrcyB3aGV0aGVyIHRoZSBleHBhbnNpb24gZmlsZXMKLWFyZSBvbiB0aGUgZGV2aWNlIHVwb24gc3RhcnQtdXAuIElmIHRoZSBmaWxlcyBhcmUgbm90IG9uIHRoZSBkZXZpY2UsIHVzZSBBbmRyb2lkIE1hcmtldCdzIDxhCithcmUgb24gdGhlIGRldmljZSB1cG9uIHN0YXJ0LXVwLiBJZiB0aGUgZmlsZXMgYXJlIG5vdCBvbiB0aGUgZGV2aWNlLCB1c2UgR29vZ2xlIFBsYXkncyA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguaHRtbCI+QXBwbGljYXRpb24gTGljZW5zaW5nPC9hPiBzZXJ2aWNlIHRvIHJlcXVlc3QgVVJMcwogZm9yIHRoZSBleHBhbnNpb24gZmlsZXMsIHRoZW4gZG93bmxvYWQgYW5kIHNhdmUgdGhlbS4KICAgICA8cD5UbyBncmVhdGx5IHJlZHVjZSB0aGUgYW1vdW50IG9mIGNvZGUgeW91IG11c3Qgd3JpdGUgYW5kIGVuc3VyZSBhIGdvb2QgdXNlciBleHBlcmllbmNlCkBAIC0yODAsMTUgKzI4MCwxNSBAQAogPGgyIGlkPSJSdWxlcyI+UnVsZXMgYW5kIExpbWl0YXRpb25zPC9oMj4KIAogPHA+QWRkaW5nIEFQSyBleHBhbnNpb24gZmlsZXMgaXMgYSBmZWF0dXJlIGF2YWlsYWJsZSB3aGVuIHlvdSB1cGxvYWQgeW91ciBhcHBsaWNhdGlvbiB1c2luZyB0aGUKLUFuZHJvaWQgTWFya2V0IERldmVsb3BlciBDb25zb2xlLiBXaGVuIHVwbG9hZGluZyB5b3VyIGFwcGxpY2F0aW9uIGZvciB0aGUgZmlyc3QgdGltZSBvciB1cGRhdGluZyBhbgorRGV2ZWxvcGVyIENvbnNvbGUuIFdoZW4gdXBsb2FkaW5nIHlvdXIgYXBwbGljYXRpb24gZm9yIHRoZSBmaXJzdCB0aW1lIG9yIHVwZGF0aW5nIGFuCiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgZXhwYW5zaW9uIGZpbGVzLCB5b3UgbXVzdCBiZSBhd2FyZSBvZiB0aGUgZm9sbG93aW5nIHJ1bGVzIGFuZCBsaW1pdGF0aW9uczo8L3A+CiAKIDxvbCB0eXBlPSJJIj4KICAgPGxpPkVhY2ggZXhwYW5zaW9uIGZpbGUgY2FuIGJlIG5vIG1vcmUgdGhhbiAyR0IuPC9saT4KLSAgPGxpPkluIG9yZGVyIHRvIGRvd25sb2FkIHlvdXIgZXhwYW5zaW9uIGZpbGVzIGZyb20gQW5kcm9pZCBNYXJrZXQsIDxzdHJvbmc+dGhlIHVzZXIgbXVzdCBoYXZlCi1hY3F1aXJlZCB5b3VyIGFwcGxpY2F0aW9uIGZyb20gQW5kcm9pZCBNYXJrZXQ8L3N0cm9uZz4uIEFuZHJvaWQgTWFya2V0IHdpbGwgbm90CisgIDxsaT5JbiBvcmRlciB0byBkb3dubG9hZCB5b3VyIGV4cGFuc2lvbiBmaWxlcyBmcm9tIEdvb2dsZSBQbGF5LCA8c3Ryb25nPnRoZSB1c2VyIG11c3QgaGF2ZQorYWNxdWlyZWQgeW91ciBhcHBsaWNhdGlvbiBmcm9tIEdvb2dsZSBQbGF5PC9zdHJvbmc+LiBHb29nbGUgUGxheSB3aWxsIG5vdAogcHJvdmlkZSB0aGUgVVJMcyBmb3IgeW91ciBleHBhbnNpb24gZmlsZXMgaWYgdGhlIGFwcGxpY2F0aW9uIHdhcyBpbnN0YWxsZWQgYnkgb3RoZXIgbWVhbnMuPC9saT4KLSAgPGxpPldoZW4gcGVyZm9ybWluZyB0aGUgZG93bmxvYWQgZnJvbSB3aXRoaW4geW91ciBhcHBsaWNhdGlvbiwgdGhlIFVSTCB0aGF0IEFuZHJvaWQgTWFya2V0CisgIDxsaT5XaGVuIHBlcmZvcm1pbmcgdGhlIGRvd25sb2FkIGZyb20gd2l0aGluIHlvdXIgYXBwbGljYXRpb24sIHRoZSBVUkwgdGhhdCBHb29nbGUgUGxheQogcHJvdmlkZXMgZm9yIGVhY2ggZmlsZSBpcyB1bmlxdWUgZm9yIGV2ZXJ5IGRvd25sb2FkIGFuZCBlYWNoIG9uZSBleHBpcmVzIHNob3J0bHkgYWZ0ZXIgaXQgaXMgZ2l2ZW4KIHRvIHlvdXIgYXBwbGljYXRpb24uPC9saT4KICAgPGxpPklmIHlvdSB1cGRhdGUgeW91ciBhcHBsaWNhdGlvbiB3aXRoIGEgbmV3IEFQSyBvciB1cGxvYWQgPGEKQEAgLTMxMyw3ICszMTMsNyBAQAogZGlyZWN0b3J5PC9zdHJvbmc+LiBJZiB5b3UgbXVzdCB1bnBhY2sgc29tZSBkYXRhLCBzYXZlIGl0IGludG8gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSB7QGxpbmsKIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldEV4dGVybmFsRmlsZXNEaXIgZ2V0RXh0ZXJuYWxGaWxlc0RpcigpfS48L2xpPgogICA8bGk+PHN0cm9uZz5EbyBub3QgZGVsZXRlIG9yIHJlbmFtZSB0aGUge0Bjb2RlIC5vYmJ9IGV4cGFuc2lvbiBmaWxlPC9zdHJvbmc+ICh1bmxlc3MgeW91J3JlCi1wZXJmb3JtaW5nIGFuIHVwZGF0ZSkuIERvaW5nIHNvIHdpbGwgY2F1c2UgQW5kcm9pZCBNYXJrZXQgKG9yIHlvdXIgYXBwIGl0c2VsZikgdG8gcmVwZWF0ZWRseQorcGVyZm9ybWluZyBhbiB1cGRhdGUpLiBEb2luZyBzbyB3aWxsIGNhdXNlIEdvb2dsZSBQbGF5IChvciB5b3VyIGFwcCBpdHNlbGYpIHRvIHJlcGVhdGVkbHkKIGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZS48L2xpPgogICA8bGk+V2hlbiB1cGRhdGluZyBhbiBleHBhbnNpb24gZmlsZSBtYW51YWxseSwgeW91IG11c3QgZGVsZXRlIHRoZSBwcmV2aW91cyBleHBhbnNpb24gZmlsZS48L2xpPgogPC9vbD4KQEAgLTMyOCwxMSArMzI4LDExIEBACiAKIDxoMiBpZD0iRG93bmxvYWRpbmciPkRvd25sb2FkaW5nIHRoZSBFeHBhbnNpb24gRmlsZXM8L2gyPgogCi08cD5JbiBtb3N0IGNhc2VzLCBBbmRyb2lkIE1hcmtldCBkb3dubG9hZHMgYW5kIHNhdmVzIHlvdXIgZXhwYW5zaW9uIGZpbGVzIHRvIHRoZSBkZXZpY2UgYXQgdGhlIHNhbWUKKzxwPkluIG1vc3QgY2FzZXMsIEdvb2dsZSBQbGF5IGRvd25sb2FkcyBhbmQgc2F2ZXMgeW91ciBleHBhbnNpb24gZmlsZXMgdG8gdGhlIGRldmljZSBhdCB0aGUgc2FtZQogdGltZSBpdCBpbnN0YWxscyBvciB1cGRhdGVzIHRoZSBBUEsuIFRoaXMgd2F5LCB0aGUgZXhwYW5zaW9uIGZpbGVzIGFyZSBhdmFpbGFibGUgd2hlbiB5b3VyCiBhcHBsaWNhdGlvbiBsYXVuY2hlcyBmb3IgdGhlIGZpcnN0IHRpbWUuIEhvd2V2ZXIsIGluIHNvbWUgY2FzZXMgeW91ciBhcHAgbXVzdCBkb3dubG9hZCB0aGUKIGV4cGFuc2lvbiBmaWxlcyBpdHNlbGYgYnkgcmVxdWVzdGluZyB0aGVtIGZyb20gYSBVUkwgcHJvdmlkZWQgdG8geW91IGluIGEgcmVzcG9uc2UKLWZyb20gQW5kcm9pZCBNYXJrZXQncyA8YQorZnJvbSBHb29nbGUgUGxheSdzIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy9pbmRleC5odG1sIj5BcHBsaWNhdGlvbiBMaWNlbnNpbmc8L2E+IHNlcnZpY2UuPC9wPgogCiA8cD5UaGUgYmFzaWMgbG9naWMgeW91IG5lZWQgdG8gZG93bmxvYWQgeW91ciBleHBhbnNpb24gZmlsZXMgaXMgdGhlIGZvbGxvd2luZzo8L3A+CkBAIC0zNDUsMTUgKzM0NSwxNSBAQAogICAgICAgPGxpPklmIHRoZSBleHBhbnNpb24gZmlsZXMgYXJlIHRoZXJlLCB5b3UncmUgYWxsIHNldCBhbmQgeW91ciBhcHBsaWNhdGlvbiBjYW4gY29udGludWUuPC9saT4KICAgICAgIDxsaT5JZiB0aGUgZXhwYW5zaW9uIGZpbGVzIGFyZSA8ZW0+bm90PC9lbT4gdGhlcmU6CiAgICAgICAgIDxvbD4KLSAgICAgICAgICA8bGk+UGVyZm9ybSBhIHJlcXVlc3QgdXNpbmcgQW5kcm9pZCBNYXJrZXQncyA8YQorICAgICAgICAgIDxsaT5QZXJmb3JtIGEgcmVxdWVzdCB1c2luZyBHb29nbGUgUGxheSdzIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy9pbmRleC5odG1sIj5BcHBsaWNhdGlvbiBMaWNlbnNpbmc8L2E+IHRvIGdldCB5b3VyCiBhcHAncyBleHBhbnNpb24gZmlsZSBuYW1lcywgc2l6ZXMsIGFuZCBVUkxzLjwvbGk+IAotICAgICAgICAgIDxsaT5Vc2UgdGhlIFVSTHMgcHJvdmlkZWQgYnkgQW5kcm9pZCBNYXJrZXQgdG8gZG93bmxvYWQgdGhlIGV4cGFuc2lvbiBmaWxlcyBhbmQgc2F2ZQorICAgICAgICAgIDxsaT5Vc2UgdGhlIFVSTHMgcHJvdmlkZWQgYnkgR29vZ2xlIFBsYXkgdG8gZG93bmxvYWQgdGhlIGV4cGFuc2lvbiBmaWxlcyBhbmQgc2F2ZQogdGhlIGV4cGFuc2lvbiBmaWxlcy4gWW91IDxzdHJvbmc+bXVzdDwvc3Ryb25nPiBzYXZlIHRoZSBmaWxlcyB0byB0aGUgPGEKIGhyZWY9IiNTdG9yYWdlTG9jYXRpb24iPnNoYXJlZCBzdG9yYWdlIGxvY2F0aW9uPC9hPgogKDxjb2RlPkFuZHJvaWQvb2JiLyZsdDtwYWNrYWdlLW5hbWUmZ3Q7LzwvY29kZT4pIGFuZCB1c2UgdGhlIGV4YWN0IGZpbGUgbmFtZSBwcm92aWRlZAotYnkgQW5kcm9pZCBNYXJrZXQncyByZXNwb25zZS4KLSAgICAgICAgICAgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBVUkwgdGhhdCBBbmRyb2lkIE1hcmtldCBwcm92aWRlcyBmb3IgeW91cgorYnkgR29vZ2xlIFBsYXkncyByZXNwb25zZS4KKyAgICAgICAgICAgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBVUkwgdGhhdCBHb29nbGUgUGxheSBwcm92aWRlcyBmb3IgeW91cgogZXhwYW5zaW9uIGZpbGVzIGlzIHVuaXF1ZSBmb3IgZXZlcnkgZG93bmxvYWQgYW5kIGVhY2ggb25lIGV4cGlyZXMgc2hvcnRseSBhZnRlciBpdCBpcyBnaXZlbiB0bwogeW91ciBhcHBsaWNhdGlvbi48L3A+CiAgICAgICAgICAgPC9saT4KQEAgLTM2OCwxNiArMzY4LDE2IEBACiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy9pbmRleC5odG1sIj5BcHBsaWNhdGlvbiBMaWNlbnNpbmc8L2E+IHNlcnZpY2UuIEl0J3MgcHJpbWFyaWx5CiBkZXNpZ25lZCBmb3IgeW91IHRvIGVuZm9yY2UKIGxpY2Vuc2luZyBwb2xpY2llcyBmb3IgeW91ciBhcHBsaWNhdGlvbiBhbmQgZW5zdXJlIHRoYXQgdGhlIHVzZXIgaGFzIHRoZSByaWdodCB0bwotdXNlIHlvdXIgYXBwIChoZSBvciBzaGUgcmlnaHRmdWxseSBwYWlkIGZvciBpdCBvbiBBbmRyb2lkIE1hcmtldCkuIEluIG9yZGVyIHRvIGZhY2lsaXRhdGUgdGhlCit1c2UgeW91ciBhcHAgKGhlIG9yIHNoZSByaWdodGZ1bGx5IHBhaWQgZm9yIGl0IG9uIEdvb2dsZSBQbGF5KS4gSW4gb3JkZXIgdG8gZmFjaWxpdGF0ZSB0aGUKIGV4cGFuc2lvbiBmaWxlIGZ1bmN0aW9uYWxpdHksIHRoZSBsaWNlbnNpbmcgc2VydmljZSBoYXMgYmVlbiBlbmhhbmNlZCB0byBwcm92aWRlIGEgcmVzcG9uc2UKIHRvIHlvdXIgYXBwbGljYXRpb24gdGhhdCBpbmNsdWRlcyB0aGUgVVJMIG9mIHlvdXIgYXBwbGljYXRpb24ncyBleHBhbnNpb24gZmlsZXMgdGhhdCBhcmUgaG9zdGVkCi1vbiBBbmRyb2lkIE1hcmtldC4gU28sIGV2ZW4gaWYgeW91ciBhcHBsaWNhdGlvbiBpcyBmcmVlIGZvciB1c2VycywgeW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgQW5kcm9pZAotTWFya2V0IExpY2Vuc2UgVmVyaWZpY2F0aW9uIExpYnJhcnkgKExWTCkgdG8gdXNlIEFQSyBleHBhbnNpb24gZmlsZXMuIE9mIGNvdXJzZSwgaWYgeW91ciBhcHBsaWNhdGlvbgorb24gR29vZ2xlIFBsYXkuIFNvLCBldmVuIGlmIHlvdXIgYXBwbGljYXRpb24gaXMgZnJlZSBmb3IgdXNlcnMsIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlCitMaWNlbnNlIFZlcmlmaWNhdGlvbiBMaWJyYXJ5IChMVkwpIHRvIHVzZSBBUEsgZXhwYW5zaW9uIGZpbGVzLiBPZiBjb3Vyc2UsIGlmIHlvdXIgYXBwbGljYXRpb24KIGlzIGZyZWUsIHlvdSBkb24ndCBuZWVkIHRvIGVuZm9yY2UgbGljZW5zZSB2ZXJpZmljYXRpb24mbWRhc2g7eW91IHNpbXBseSBuZWVkIHRoZQogbGlicmFyeSB0byBwZXJmb3JtIHRoZSByZXF1ZXN0IHRoYXQgcmV0dXJucyB0aGUgVVJMIG9mIHlvdXIgZXhwYW5zaW9uIGZpbGVzLjwvcD4KIAotPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gV2hldGhlciB5b3VyIGFwcGxpY2F0aW9uIGlzIGZyZWUgb3Igbm90LCBBbmRyb2lkIE1hcmtldAotcmV0dXJucyB0aGUgZXhwYW5zaW9uIGZpbGUgVVJMcyBvbmx5IGlmIHRoZSB1c2VyIGFjcXVpcmVkIHlvdXIgYXBwbGljYXRpb24gZnJvbSBBbmRyb2lkIE1hcmtldC48L3A+Cis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBXaGV0aGVyIHlvdXIgYXBwbGljYXRpb24gaXMgZnJlZSBvciBub3QsIEdvb2dsZSBQbGF5CityZXR1cm5zIHRoZSBleHBhbnNpb24gZmlsZSBVUkxzIG9ubHkgaWYgdGhlIHVzZXIgYWNxdWlyZWQgeW91ciBhcHBsaWNhdGlvbiBmcm9tIEdvb2dsZSBQbGF5LjwvcD4KIAogPHA+SW4gYWRkaXRpb24gdG8gdGhlIExWTCwgeW91IG5lZWQgYSBzZXQgb2YgY29kZSB0aGF0IGRvd25sb2FkcyB0aGUgZXhwYW5zaW9uIGZpbGVzCiBvdmVyIGFuIEhUVFAgY29ubmVjdGlvbiBhbmQgc2F2ZXMgdGhlbSB0byB0aGUgcHJvcGVyIGxvY2F0aW9uIG9uIHRoZSBkZXZpY2UncyBzaGFyZWQgc3RvcmFnZS4KQEAgLTQwOCw4ICs0MDgsOCBAQAogZG93bmxvYWQgeW91ciBleHBhbnNpb24gZmlsZXMuIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIGV4cGxhaW4gaG93IHRvIGludGVncmF0ZQogdGhlIGxpYnJhcnkgaW50byB5b3VyIGFwcGxpY2F0aW9uLjwvcD4KIAotPHA+SWYgeW91J2QgcmF0aGVyIGRldmVsb3AgeW91ciBvd24gc29sdXRpb24gdG8gZG93bmxvYWQgdGhlIGV4cGFuc2lvbiBmaWxlcyB1c2luZyB0aGUgQW5kcm9pZAotTWFya2V0IFVSTHMsIHlvdSBtdXN0IGZvbGxvdyB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguaHRtbCI+QXBwbGljYXRpb24KKzxwPklmIHlvdSdkIHJhdGhlciBkZXZlbG9wIHlvdXIgb3duIHNvbHV0aW9uIHRvIGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMgdXNpbmcgdGhlIEdvb2dsZQorUGxheSBVUkxzLCB5b3UgbXVzdCBmb2xsb3cgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2luZGV4Lmh0bWwiPkFwcGxpY2F0aW9uCiBMaWNlbnNpbmc8L2E+IGRvY3VtZW50YXRpb24gdG8gcGVyZm9ybSBhIGxpY2Vuc2UgcmVxdWVzdCwgdGhlbiByZXRyaWV2ZSB0aGUgZXhwYW5zaW9uIGZpbGUgbmFtZXMsCiBzaXplcywgYW5kIFVSTHMgZnJvbSB0aGUgcmVzcG9uc2UgZXh0cmFzLiBZb3Ugc2hvdWxkIHVzZSB0aGUgPGEgaHJlZj0iI0V4cGFuc2lvblBvbGljeSI+e0Bjb2RlCiBBUEtFeHBhbnNpb25Qb2xpY3l9PC9hPiBjbGFzcyAoaW5jbHVkZWQgaW4gdGhlIExpY2Vuc2UgVmVyaWZpY2F0aW9uIExpYnJhcnkpIGFzIHlvdXIgbGljZW5zaW5nCkBAIC00MjEsNyArNDIxLDcgQEAKIAogPHA+VG8gdXNlIEFQSyBleHBhbnNpb24gZmlsZXMgd2l0aCB5b3VyIGFwcGxpY2F0aW9uIGFuZCBwcm92aWRlIHRoZSBiZXN0IHVzZXIgZXhwZXJpZW5jZSB3aXRoCiBtaW5pbWFsIGVmZm9ydCBvbiB5b3VyIGJlaGFsZiwgd2UgcmVjb21tZW5kIHlvdSB1c2UgdGhlIERvd25sb2FkZXIgTGlicmFyeSB0aGF0J3MgaW5jbHVkZWQgaW4gdGhlCi1BbmRyb2lkIE1hcmtldCBBUEsgRXhwYW5zaW9uIExpYnJhcnkgcGFja2FnZS4gVGhpcyBsaWJyYXJ5IGRvd25sb2FkcyB5b3VyIGV4cGFuc2lvbiBmaWxlcyBpbiBhCitHb29nbGUgTWFya2V0IEFwayBFeHBhbnNpb24gcGFja2FnZS4gVGhpcyBsaWJyYXJ5IGRvd25sb2FkcyB5b3VyIGV4cGFuc2lvbiBmaWxlcyBpbiBhCiBiYWNrZ3JvdW5kIHNlcnZpY2UsIHNob3dzIGEgdXNlciBub3RpZmljYXRpb24gd2l0aCB0aGUgZG93bmxvYWQgc3RhdHVzLCBoYW5kbGVzIG5ldHdvcmsKIGNvbm5lY3Rpdml0eSBsb3NzLCByZXN1bWVzIHRoZSBkb3dubG9hZCB3aGVuIHBvc3NpYmxlLCBhbmQgbW9yZS48L3A+CiAKQEAgLTQ0NywxMCArNDQ3LDExIEBACiBkb3dubG9hZCB0d28gcGFja2FnZXMgZnJvbSB0aGUgU0RLIE1hbmFnZXIgYW5kIGFkZCB0aGUgYXBwcm9wcmlhdGUgbGlicmFyaWVzIHRvIHlvdXIKIGFwcGxpY2F0aW9uLjwvcD4KIAotPHA+Rmlyc3QsIG9wZW4gdGhlIEFuZHJvaWQgU0RLIE1hbmFnZXIsIGV4cGFuZCA8ZW0+RXh0cmFzPC9lbT4gYW5kIGRvd25sb2FkOjwvcD4KKzxwPkZpcnN0LCBvcGVuIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9c2RrL2FkZGluZy1jb21wb25lbnRzLmh0bWwiPkFuZHJvaWQgU0RLIE1hbmFnZXI8L2E+LCBleHBhbmQKKzxlbT5FeHRyYXM8L2VtPiBhbmQgZG93bmxvYWQ6PC9wPgogPHVsPgogICA8bGk+PGVtPkdvb2dsZSBNYXJrZXQgTGljZW5zaW5nIHBhY2thZ2U8L2VtPjwvbGk+Ci0gIDxsaT48ZW0+R29vZ2xlIE1hcmtldCBBUEsgRXhwYW5zaW9uIExpYnJhcnkgcGFja2FnZTwvZW0+PC9saT4KKyAgPGxpPjxlbT5Hb29nbGUgTWFya2V0IEFwayBFeHBhbnNpb24gcGFja2FnZTwvZW0+PC9saT4KIDwvdWw+CiAKIDxwPklmIHlvdSdyZSB1c2luZyBFY2xpcHNlLCBjcmVhdGUgYSBwcm9qZWN0IGZvciBlYWNoIGxpYnJhcnkgYW5kIGFkZCBpdCB0byB5b3VyIGFwcDo8L3A+CkBAIC00NjMsNyArNDY0LDcgQEAKIHNvdXJjZTwvc3Ryb25nPiBhbmQgY2hvb3NlIHRoZSBsaWJyYXJ5IGZyb20gdGhlIHtAY29kZSAmbHQ7c2RrJmd0Oy9leHRyYXMvZ29vZ2xlL30gZGlyZWN0b3J5CiAoe0Bjb2RlIG1hcmtldF9saWNlbnNpbmcvfSBmb3IgdGhlIExpY2Vuc2UgVmVyaWZpY2F0aW9uIExpYnJhcnkgb3Ige0Bjb2RlCiBtYXJrZXRfYXBrX2V4cGFuc2lvbi9kb3dubG9hZGVyX2xpYnJhcnkvfSBmb3IgdGhlIERvd25sb2FkZXIgTGlicmFyeSkuPC9saT4KLSAgICAgIDxsaT5TcGVjaWZ5IGEgPGVtPlByb2plY3QgTmFtZTwvZW0+IHN1Y2ggYXMgIkFuZHJvaWQgTWFya2V0IExpY2Vuc2UgTGlicmFyeSIgYW5kICJNYXJrZXQKKyAgICAgIDxsaT5TcGVjaWZ5IGEgPGVtPlByb2plY3QgTmFtZTwvZW0+IHN1Y2ggYXMgIkdvb2dsZSBQbGF5IExpY2Vuc2UgTGlicmFyeSIgYW5kICJHb29nbGUgUGxheQogRG93bmxvYWRlcgogTGlicmFyeSI8L2xpPgogICAgICAgPGxpPkNsaWNrIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+LjwvbGk+CkBAIC00OTQsMTQgKzQ5NSwxNCBAQAogCiA8cD5XaXRoIGJvdGggdGhlIExpY2Vuc2UgVmVyaWZpY2F0aW9uIExpYnJhcnkgYW5kIERvd25sb2FkZXIgTGlicmFyeSBhZGRlZCB0byB5b3VyCiBhcHBsaWNhdGlvbiwgeW91J2xsIGJlIGFibGUgdG8gcXVpY2tseSBpbnRlZ3JhdGUgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgZXhwYW5zaW9uIGZpbGVzIGZyb20KLUFuZHJvaWQgTWFya2V0LiBUaGUgZm9ybWF0IHRoYXQgeW91IGNob29zZSBmb3IgdGhlIGV4cGFuc2lvbiBmaWxlcyBhbmQgaG93IHlvdSByZWFkIHRoZW0KK0dvb2dsZSBQbGF5LiBUaGUgZm9ybWF0IHRoYXQgeW91IGNob29zZSBmb3IgdGhlIGV4cGFuc2lvbiBmaWxlcyBhbmQgaG93IHlvdSByZWFkIHRoZW0KIGZyb20gdGhlIHNoYXJlZCBzdG9yYWdlIGlzIGEgc2VwYXJhdGUgaW1wbGVtZW50YXRpb24gdGhhdCB5b3Ugc2hvdWxkIGNvbnNpZGVyIGJhc2VkIG9uIHlvdXIKIGFwcGxpY2F0aW9uIG5lZWRzLjwvcD4KIAotPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+VGlwOjwvc3Ryb25nPiBUaGUgQVBLIEV4cGFuc2lvbiBMaWJyYXJ5IHBhY2thZ2UgaW5jbHVkZXMgYSBzYW1wbGUKKzxwIGNsYXNzPSJub3RlIj48c3Ryb25nPlRpcDo8L3N0cm9uZz4gVGhlIEFwayBFeHBhbnNpb24gcGFja2FnZSBpbmNsdWRlcyBhIHNhbXBsZQogYXBwbGljYXRpb24KIHRoYXQgc2hvd3MgaG93IHRvIHVzZSB0aGUgRG93bmxvYWRlciBMaWJyYXJ5IGluIGFuIGFwcC4gVGhlIHNhbXBsZSB1c2VzIGEgdGhpcmQgbGlicmFyeQotYXZhaWxhYmxlIGluIHRoZSBBUEsgRXhwYW5zaW9uIExpYnJhcnkgcGFja2FnZSBjYWxsZWQgdGhlIEFQSyBFeHBhbnNpb24gWmlwIExpYnJhcnkuIElmCithdmFpbGFibGUgaW4gdGhlIEFwayBFeHBhbnNpb24gcGFja2FnZSBjYWxsZWQgdGhlIEFQSyBFeHBhbnNpb24gWmlwIExpYnJhcnkuIElmCiB5b3UgcGxhbiBvbgogdXNpbmcgWklQIGZpbGVzIGZvciB5b3VyIGV4cGFuc2lvbiBmaWxlcywgd2Ugc3VnZ2VzdCB5b3UgYWxzbyBhZGQgdGhlIEFQSyBFeHBhbnNpb24gWmlwIExpYnJhcnkgdG8KIHlvdXIgYXBwbGljYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIHNlY3Rpb24gYmVsb3cKQEAgLTUxNywxMCArNTE4LDEwIEBACiAKIDxwcmU+CiAmbHQ7bWFuaWZlc3QgLi4uPgotICAgICZsdDshLS0gUmVxdWlyZWQgdG8gYWNjZXNzIEFuZHJvaWQgTWFya2V0IExpY2Vuc2luZyAtLT4KKyAgICAmbHQ7IS0tIFJlcXVpcmVkIHRvIGFjY2VzcyBHb29nbGUgUGxheSBMaWNlbnNpbmcgLS0+CiAgICAgJmx0O3VzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnZlbmRpbmcuQ0hFQ0tfTElDRU5TRSIgLz4KIAotICAgICZsdDshLS0gUmVxdWlyZWQgdG8gZG93bmxvYWQgZmlsZXMgZnJvbSBBbmRyb2lkIE1hcmtldCAtLT4KKyAgICAmbHQ7IS0tIFJlcXVpcmVkIHRvIGRvd25sb2FkIGZpbGVzIGZyb20gR29vZ2xlIFBsYXkgLS0+CiAgICAgJmx0O3VzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KIAogICAgICZsdDshLS0gUmVxdWlyZWQgdG8ga2VlcCBDUFUgYWxpdmUgd2hpbGUgZG93bmxvYWRpbmcgZmlsZXMgKE5PVCB0byBrZWVwIHNjcmVlbiBhd2FrZSkgLS0+CkBAIC01NjksNyArNTcwLDcgQEAKIDxkbD4KICAgPGR0PntAY29kZSBnZXRQdWJsaWNLZXkoKX08L2R0PgogICAgIDxkZD5UaGlzIG11c3QgcmV0dXJuIGEgc3RyaW5nIHRoYXQgaXMgdGhlIEJhc2U2NC1lbmNvZGVkIFJTQSBwdWJsaWMga2V5IGZvciB5b3VyIHB1Ymxpc2hlcgotYWNjb3VudCwgYXZhaWxhYmxlIGZyb20gdGhlIHByb2ZpbGUgcGFnZSBvbiB0aGUgQW5kcm9pZCBNYXJrZXQgRGV2ZWxvcGVyIENvbnNvbGUgKHNlZSA8YQorYWNjb3VudCwgYXZhaWxhYmxlIGZyb20gdGhlIHByb2ZpbGUgcGFnZSBvbiB0aGUgRGV2ZWxvcGVyIENvbnNvbGUgKHNlZSA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvc2V0dGluZy11cC5odG1sIj5TZXR0aW5nIFVwIGZvciBMaWNlbnNpbmc8L2E+KS48L2RkPgogICA8ZHQ+e0Bjb2RlIGdldFNBTFQoKX08L2R0PgogICAgIDxkZD5UaGlzIG11c3QgcmV0dXJuIGFuIGFycmF5IG9mIHJhbmRvbSBieXRlcyB0aGF0IHRoZSBsaWNlbnNpbmcge0Bjb2RlIFBvbGljeX0gdXNlcyB0bwpAQCAtNTg4LDcgKzU4OSw3IEBACiA8cHJlPgogcHVibGljIGNsYXNzIFNhbXBsZURvd25sb2FkZXJTZXJ2aWNlIGV4dGVuZHMgRG93bmxvYWRlclNlcnZpY2UgewogICAgIC8vIFlvdSBtdXN0IHVzZSB0aGUgcHVibGljIGtleSBiZWxvbmdpbmcgdG8geW91ciBwdWJsaXNoZXIgYWNjb3VudAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0U2NF9QVUJMSUNfS0VZID0gIllvdXJBbmRyb2lkTWFya2V0TFZMS2V5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFNjRfUFVCTElDX0tFWSA9ICJZb3VyTFZMS2V5IjsKICAgICAvLyBZb3Ugc2hvdWxkIGFsc28gbW9kaWZ5IHRoaXMgc2FsdAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFNBTFQgPSBuZXcgYnl0ZVtdIHsgMSwgNDIsIC0xMiwgLTEsIDU0LCA5OCwKICAgICAgICAgICAgIC0xMDAsIC0xMiwgNDMsIDIsIC04LCAtNCwgOSwgNSwgLTEwNiwgLTEwNywgLTMzLCA0NSwgLTEsIDg0CkBAIC02MTIsOCArNjEzLDggQEAKIDwvcHJlPgogCiA8cCBjbGFzcz0iY2F1dGlvbiI+PHN0cm9uZz5Ob3RpY2U6PC9zdHJvbmc+IFlvdSBtdXN0IHVwZGF0ZSB0aGUge0Bjb2RlIEJBU0U2NF9QVUJMSUNfS0VZfSB2YWx1ZQotdG8gYmUgdGhlIHB1YmxpYyBrZXkgYmVsb25naW5nIHRvIHlvdXIgcHVibGlzaGVyIGFjY291bnQuIFlvdSBjYW4gZmluZCB0aGUga2V5IGluIHRoZSBBbmRyb2lkCi1NYXJrZXQgRGV2ZWxvcGVyIENvbnNvbGUgdW5kZXIgeW91ciBwcm9maWxlIGluZm9ybWF0aW9uLiBUaGlzIGlzIG5lY2Vzc2FyeSBldmVuIHdoZW4gdGVzdGluZwordG8gYmUgdGhlIHB1YmxpYyBrZXkgYmVsb25naW5nIHRvIHlvdXIgcHVibGlzaGVyIGFjY291bnQuIFlvdSBjYW4gZmluZCB0aGUga2V5IGluIHRoZSBEZXZlbG9wZXIKK0NvbnNvbGUgdW5kZXIgeW91ciBwcm9maWxlIGluZm9ybWF0aW9uLiBUaGlzIGlzIG5lY2Vzc2FyeSBldmVuIHdoZW4gdGVzdGluZwogeW91ciBkb3dubG9hZHMuPC9wPgogCiA8cD5SZW1lbWJlciB0byBkZWNsYXJlIHRoZSBzZXJ2aWNlIGluIHlvdXIgbWFuaWZlc3QgZmlsZTo8L3A+CkBAIC02ODYsNyArNjg3LDcgQEAKIHZlcnNpb25Db2RlKX08L2xpPgogICAgIDxsaT57QGNvZGUgZG9lc0ZpbGVFeGlzdChDb250ZXh0IGMsIFN0cmluZyBmaWxlTmFtZSwgbG9uZyBmaWxlU2l6ZSl9PC9saT4KICAgPC91bD4KLSAgICA8cD5Gb3IgZXhhbXBsZSwgdGhlIHNhbXBsZSBhcHAgcHJvdmlkZWQgaW4gdGhlIEFQSyBFeHBhbnNpb24gTGlicmFyeSBwYWNrYWdlIGNhbGxzIHRoZQorICAgIDxwPkZvciBleGFtcGxlLCB0aGUgc2FtcGxlIGFwcCBwcm92aWRlZCBpbiB0aGUgQXBrIEV4cGFuc2lvbiBwYWNrYWdlIGNhbGxzIHRoZQogZm9sbG93aW5nIG1ldGhvZCBpbiB0aGUgYWN0aXZpdHkncyB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25DcmVhdGUgb25DcmVhdGUoKX0gbWV0aG9kIHRvIGNoZWNrCiB3aGV0aGVyIHRoZSBleHBhbnNpb24gZmlsZXMgYWxyZWFkeSBleGlzdCBvbiB0aGUgZGV2aWNlOjwvcD4KIDxwcmU+CkBAIC04NzIsNyArODczLDcgQEAKIDwvZGw+CiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5UaXA6PC9zdHJvbmc+IEZvciBleGFtcGxlcyBvZiB0aGVzZSBjYWxsYmFja3MgdGhhdCB1cGRhdGUgdGhlIGRvd25sb2FkCiBwcm9ncmVzcyBVSSwgc2VlIHRoZSB7QGNvZGUgU2FtcGxlRG93bmxvYWRlckFjdGl2aXR5fSBpbiB0aGUgc2FtcGxlIGFwcCBwcm92aWRlZCB3aXRoIHRoZQotQVBLIEV4cGFuc2lvbiBMaWJyYXJ5IHBhY2thZ2UuPC9wPgorQXBrIEV4cGFuc2lvbiBwYWNrYWdlLjwvcD4KIAogPHA+U29tZSBwdWJsaWMgbWV0aG9kcyBmb3IgdGhlIHtAY29kZSBJRG93bmxvYWRlclNlcnZpY2V9IGludGVyZmFjZSB5b3UgbWlnaHQgZmluZCB1c2VmdWwgYXJlOjwvcD4KIApAQCAtODk4LDExICs4OTksMTEgQEAKIAogPGgyIGlkPSJFeHBhbnNpb25Qb2xpY3kiPlVzaW5nIEFQS0V4cGFuc2lvblBvbGljeTwvaDI+CiAKLTxwPklmIHlvdSBkZWNpZGUgdG8gYnVpbGQgeW91ciBvd24gZG93bmxvYWRlciBzZXJ2aWNlIGluc3RlYWQgb2YgdXNpbmcgdGhlIEFuZHJvaWQgTWFya2V0Cis8cD5JZiB5b3UgZGVjaWRlIHRvIGJ1aWxkIHlvdXIgb3duIGRvd25sb2FkZXIgc2VydmljZSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBHb29nbGUgUGxheQogPGEgaHJlZj0iI0Fib3V0TGlicmFyaWVzIj5Eb3dubG9hZGVyIExpYnJhcnk8L2E+LCB5b3Ugc2hvdWxkIHN0aWxsIHVzZSB0aGUge0Bjb2RlCiBBUEtFeHBhbnNpb25Qb2xpY3l9IHRoYXQncyBwcm92aWRlZCBpbiB0aGUgTGljZW5zZSBWZXJpZmljYXRpb24gTGlicmFyeS4gVGhlIHtAY29kZQogQVBLRXhwYW5zaW9uUG9saWN5fSBjbGFzcyBpcyBuZWFybHkgaWRlbnRpY2FsIHRvIHtAY29kZSBTZXJ2ZXJNYW5hZ2VkUG9saWN5fSAoYXZhaWxhYmxlIGluIHRoZQotQW5kcm9pZCBNYXJrZXQgTGljZW5zZSBWZXJpZmljYXRpb24gTGlicmFyeSkgYnV0IGluY2x1ZGVzIGFkZGl0aW9uYWwgaGFuZGxpbmcgZm9yIHRoZSBBUEsgZXhwYW5zaW9uCitHb29nbGUgUGxheSBMaWNlbnNlIFZlcmlmaWNhdGlvbiBMaWJyYXJ5KSBidXQgaW5jbHVkZXMgYWRkaXRpb25hbCBoYW5kbGluZyBmb3IgdGhlIEFQSyBleHBhbnNpb24KIGZpbGUgcmVzcG9uc2UgZXh0cmFzLjwvcD4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IDxlbT5kbyB1c2U8L2VtPiB0aGUgPGEKQEAgLTEwMzcsNyArMTAzOCw3IEBACiA8L2Rpdj4KIDwvZGl2PgogCi08cD5UaGUgQW5kcm9pZCBNYXJrZXQgQVBLIEV4cGFuc2lvbiBMaWJyYXJ5IHBhY2thZ2UgaW5jbHVkZXMgYSBsaWJyYXJ5IGNhbGxlZCB0aGUgQVBLCis8cD5UaGUgR29vZ2xlIE1hcmtldCBBcGsgRXhwYW5zaW9uIHBhY2thZ2UgaW5jbHVkZXMgYSBsaWJyYXJ5IGNhbGxlZCB0aGUgQVBLCiBFeHBhbnNpb24gWmlwIExpYnJhcnkgKGxvY2F0ZWQgaW4ge0Bjb2RlCiAmbHQ7c2RrPi9leHRyYXMvZ29vZ2xlL2dvb2dsZV9tYXJrZXRfYXBrX2V4cGFuc2lvbi96aXBfZmlsZS99KS4gVGhpcyBpcyBhbiBvcHRpb25hbCBsaWJyYXJ5IHRoYXQKIGhlbHBzIHlvdSByZWFkIHlvdXIgZXhwYW5zaW9uCkBAIC0xMDg5LDcgKzEwOTAsNyBAQAogcHJvdmlkZXIge0BsaW5rIGFuZHJvaWQubmV0LlVyaX0gaW4gb3JkZXIgdG8gcHJvdmlkZSBmaWxlIGFjY2VzcyBmb3IgY2VydGFpbiBBbmRyb2lkIEFQSXMgdGhhdAogZXhwZWN0IHtAbGluayBhbmRyb2lkLm5ldC5Vcml9IGFjY2VzcyB0byBtZWRpYSBmaWxlcy4KICAgICAgIDxwPlRoZSBzYW1wbGUgYXBwbGljYXRpb24gYXZhaWxhYmxlIGluIHRoZQotQVBLIEV4cGFuc2lvbiBMaWJyYXJ5IHBhY2thZ2UgZGVtb25zdHJhdGVzIGEgc2NlbmFyaW8gaW4gd2hpY2ggdGhpcyBjbGFzcyBpcyB1c2VmdWwKK0FwayBFeHBhbnNpb24gcGFja2FnZSBkZW1vbnN0cmF0ZXMgYSBzY2VuYXJpbyBpbiB3aGljaCB0aGlzIGNsYXNzIGlzIHVzZWZ1bAogdG8gc3BlY2lmeSBhIHZpZGVvIHdpdGgge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldyNzZXRWaWRlb1VSSQogVmlkZW9WaWV3LnNldFZpZGVvVVJJKCl9LiBTZWUgdGhlIHNhbXBsZSBhcHAncyBjbGFzcyB7QGNvZGUgU2FtcGxlWmlwZmlsZVByb3ZpZGVyfSBmb3IgYW4KIGV4YW1wbGUgb2YgaG93IHRvIGV4dGVuZCB0aGlzIGNsYXNzIHRvIHVzZSBpbiB5b3VyIGFwcGxpY2F0aW9uLjwvcD48L2RkPgpAQCAtMTE0MywyMSArMTE0NCwyMSBAQAogCiA8aDMgaWQ9IlRlc3RpbmdSZWFkaW5nIj5UZXN0aW5nIGZpbGUgcmVhZHM8L2gzPgogCi08cD5CZWZvcmUgeW91IHVwbG9hZCB5b3VyIGFwcGxpY2F0aW9uIHRvIEFuZHJvaWQgTWFya2V0LCB5b3UKKzxwPkJlZm9yZSB5b3UgdXBsb2FkIHlvdXIgYXBwbGljYXRpb24gdG8gR29vZ2xlIFBsYXksIHlvdQogc2hvdWxkIHRlc3QgeW91ciBhcHBsaWNhdGlvbidzIGFiaWxpdHkgdG8gcmVhZCB0aGUgZmlsZXMgZnJvbSB0aGUgc2hhcmVkIHN0b3JhZ2UuIEFsbCB5b3UgbmVlZCB0byBkbwogaXMgYWRkIHRoZSBmaWxlcyB0byB0aGUgYXBwcm9wcmlhdGUgbG9jYXRpb24gb24gdGhlIGRldmljZSBzaGFyZWQgc3RvcmFnZSBhbmQgbGF1bmNoIHlvdXIKIGFwcGxpY2F0aW9uOjwvcD4KIAogPG9sPgotICA8bGk+T24geW91ciBkZXZpY2UsIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5IG9uIHRoZSBzaGFyZWQgc3RvcmFnZSB3aGVyZSBBbmRyb2lkCi1NYXJrZXQgd2lsbCBzYXZlIHlvdXIgZmlsZXMuCisgIDxsaT5PbiB5b3VyIGRldmljZSwgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rvcnkgb24gdGhlIHNoYXJlZCBzdG9yYWdlIHdoZXJlIEdvb2dsZQorUGxheSB3aWxsIHNhdmUgeW91ciBmaWxlcy4KICAgPHA+Rm9yIGV4YW1wbGUsIGlmIHlvdXIgcGFja2FnZSBuYW1lIGlzIHtAY29kZSBjb20uZXhhbXBsZS5hbmRyb2lkfSwgeW91IG5lZWQgdG8gY3JlYXRlCiB0aGUgZGlyZWN0b3J5IHtAY29kZSBBbmRyb2lkL29iYi9jb20uZXhhbXBsZS5hbmRyb2lkL30gb24gdGhlIHNoYXJlZCBzdG9yYWdlIHNwYWNlLiAoUGx1ZyBpbgogeW91ciB0ZXN0IGRldmljZSB0byB5b3VyIGNvbXB1dGVyIHRvIG1vdW50IHRoZSBzaGFyZWQgc3RvcmFnZSBhbmQgbWFudWFsbHkgY3JlYXRlIHRoaXMKIGRpcmVjdG9yeS4pPC9wPgogICA8L2xpPgogICA8bGk+TWFudWFsbHkgYWRkIHRoZSBleHBhbnNpb24gZmlsZXMgdG8gdGhhdCBkaXJlY3RvcnkuIEJlIHN1cmUgdGhhdCB5b3UgcmVuYW1lIHlvdXIgZmlsZXMgdG8KLW1hdGNoIHRoZSA8YSBocmVmPSIjRmlsZW5hbWUiPmZpbGUgbmFtZSBmb3JtYXQ8L2E+IHRoYXQgQW5kcm9pZCBNYXJrZXQgd2lsbCB1c2UuCittYXRjaCB0aGUgPGEgaHJlZj0iI0ZpbGVuYW1lIj5maWxlIG5hbWUgZm9ybWF0PC9hPiB0aGF0IEdvb2dsZSBQbGF5IHdpbGwgdXNlLgogICA8cD5Gb3IgZXhhbXBsZSwgcmVnYXJkbGVzcyBvZiB0aGUgZmlsZSB0eXBlLCB0aGUgbWFpbiBleHBhbnNpb24gZmlsZSBmb3IgdGhlIHtAY29kZQogY29tLmV4YW1wbGUuYW5kcm9pZH0gYXBwbGljYXRpb24gc2hvdWxkIGJlIHtAY29kZSBtYWluLjAzMDAxMTAuY29tLmV4YW1wbGUuYW5kcm9pZC5vYmJ9LgogVGhlIHZlcnNpb24gY29kZSBjYW4gYmUgd2hhdGV2ZXIgdmFsdWUgeW91IHdhbnQuIEp1c3QgcmVtZW1iZXI6PC9wPgpAQCAtMTE2NSw3ICsxMTY2LDcgQEAKICAgICA8bGk+VGhlIG1haW4gZXhwYW5zaW9uIGZpbGUgYWx3YXlzIHN0YXJ0cyB3aXRoIHtAY29kZSBtYWlufSBhbmQgdGhlIHBhdGNoIGZpbGUgc3RhcnRzIHdpdGgKIHtAY29kZSBwYXRjaH0uPC9saT4KICAgICA8bGk+VGhlIHBhY2thZ2UgbmFtZSBhbHdheXMgbWF0Y2hlcyB0aGF0IG9mIHRoZSBBUEsgdG8gd2hpY2ggdGhlIGZpbGUgaXMgYXR0YWNoZWQgb24KLUFuZHJvaWQgTWFya2V0LgorR29vZ2xlIFBsYXkuCiAgIDwvdWw+CiAgIDwvbGk+CiAgIDxsaT5Ob3cgdGhhdCB0aGUgZXhwYW5zaW9uIGZpbGUocykgYXJlIG9uIHRoZSBkZXZpY2UsIHlvdSBjYW4gaW5zdGFsbCBhbmQgcnVuIHlvdXIgYXBwbGljYXRpb24gdG8KQEAgLTExNzUsNyArMTE3Niw3IEBACiA8cD5IZXJlIGFyZSBzb21lIHJlbWluZGVycyBhYm91dCBoYW5kbGluZyB0aGUgZXhwYW5zaW9uIGZpbGVzOjwvcD4KIDx1bD4KICAgPGxpPjxzdHJvbmc+RG8gbm90IGRlbGV0ZSBvciByZW5hbWU8L3N0cm9uZz4gdGhlIHtAY29kZSAub2JifSBleHBhbnNpb24gZmlsZXMgKGV2ZW4gaWYgeW91IHVucGFjawotdGhlIGRhdGEgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24pLiBEb2luZyBzbyB3aWxsIGNhdXNlIEFuZHJvaWQgTWFya2V0IChvciB5b3VyIGFwcCBpdHNlbGYpIHRvCit0aGUgZGF0YSB0byBhIGRpZmZlcmVudCBsb2NhdGlvbikuIERvaW5nIHNvIHdpbGwgY2F1c2UgR29vZ2xlIFBsYXkgKG9yIHlvdXIgYXBwIGl0c2VsZikgdG8KIHJlcGVhdGVkbHkgZG93bmxvYWQgdGhlIGV4cGFuc2lvbiBmaWxlLjwvbGk+CiAgIDxsaT48c3Ryb25nPkRvIG5vdCBzYXZlIG90aGVyIGRhdGEgaW50byB5b3VyIDxjb2RlPm9iYi88L2NvZGU+CiBkaXJlY3Rvcnk8L3N0cm9uZz4uIElmIHlvdSBtdXN0IHVucGFjayBzb21lIGRhdGEsIHNhdmUgaXQgaW50byB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHtAbGluawpAQCAtMTE5MSwxNiArMTE5MiwxNiBAQAogZm9yIHRoZSBVUkxzLCBkb3dubG9hZCB0aGUgZmlsZXMsIGFuZCBzYXZlIHRoZW0gdG8gdGhlIGRldmljZS48L3A+CiAKIDxwPlRvIHRlc3QgeW91ciBhcHBsaWNhdGlvbidzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtYW51YWwgZG93bmxvYWQgcHJvY2VkdXJlLCB5b3UgbXVzdCB1cGxvYWQKLXlvdXIgYXBwbGljYXRpb24gdG8gQW5kcm9pZCBNYXJrZXQgYXMgYSAiZHJhZnQiIHRvIG1ha2UgeW91ciBleHBhbnNpb24gZmlsZXMgYXZhaWxhYmxlIGZvcgoreW91ciBhcHBsaWNhdGlvbiB0byBHb29nbGUgUGxheSBhcyBhICJkcmFmdCIgdG8gbWFrZSB5b3VyIGV4cGFuc2lvbiBmaWxlcyBhdmFpbGFibGUgZm9yCiBkb3dubG9hZDo8L3A+CiAKIDxvbD4KLSAgPGxpPlVwbG9hZCB5b3VyIEFQSyBhbmQgY29ycmVzcG9uZGluZyBleHBhbnNpb24gZmlsZXMgdXNpbmcgdGhlIEFuZHJvaWQgTWFya2V0IERldmVsb3BlcgorICA8bGk+VXBsb2FkIHlvdXIgQVBLIGFuZCBjb3JyZXNwb25kaW5nIGV4cGFuc2lvbiBmaWxlcyB1c2luZyB0aGUgR29vZ2xlIFBsYXkgRGV2ZWxvcGVyCiBDb25zb2xlLjwvbGk+CiAgIDxsaT5GaWxsIGluIHRoZSBuZWNlc3NhcnkgYXBwbGljYXRpb24gZGV0YWlscyAodGl0bGUsIHNjcmVlbnNob3RzLCBldGMuKS4gWW91IGNhbiBjb21lIGJhY2sgYW5kCiBmaW5hbGl6ZSB0aGVzZSBkZXRhaWxzIGJlZm9yZSBwdWJsaXNoaW5nIHlvdXIgYXBwbGljYXRpb24uCiAgIDxwPkNsaWNrIHRoZSA8c3Ryb25nPlNhdmU8L3N0cm9uZz4gYnV0dG9uLiA8ZW0+RG8gbm90IGNsaWNrIFB1Ymxpc2guPC9lbT4gVGhpcyBzYXZlcwotdGhlIGFwcGxpY2F0aW9uIGFzIGEgZHJhZnQsIHN1Y2ggdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGlzIG5vdCBwdWJsaXNoZWQgZm9yIEFuZHJvaWQgTWFya2V0IHVzZXJzLAordGhlIGFwcGxpY2F0aW9uIGFzIGEgZHJhZnQsIHN1Y2ggdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGlzIG5vdCBwdWJsaXNoZWQgZm9yIEdvb2dsZSBQbGF5IHVzZXJzLAogYnV0IHRoZSBleHBhbnNpb24gZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgeW91IHRvIHRlc3QgdGhlIGRvd25sb2FkIHByb2Nlc3MuPC9wPjwvbGk+CiAgIDxsaT5JbnN0YWxsIHRoZSBhcHBsaWNhdGlvbiBvbiB5b3VyIHRlc3QgZGV2aWNlIHVzaW5nIHRoZSBFY2xpcHNlIHRvb2xzIG9yIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCI+e0Bjb2RlIGFkYn08L2E+LjwvbGk+CkBAIC0xMjE1LDI5ICsxMjE2LDI5IEBACiAKIDxoMiBpZD0iVXBkYXRpbmciPlVwZGF0aW5nIFlvdXIgQXBwbGljYXRpb248L2gyPgogCi08cD5PbmUgb2YgdGhlIGdyZWF0IGJlbmVmaXRzIHRvIHVzaW5nIGV4cGFuc2lvbiBmaWxlcyBvbiBBbmRyb2lkIE1hcmtldCBpcyB0aGUgYWJpbGl0eSB0bwotdXBkYXRlIHlvdXIgYXBwbGljYXRpb24gd2l0aG91dCByZS1kb3dubG9hZGluZyBhbGwgb2YgdGhlIG9yaWdpbmFsIGFzc2V0cy4gQmVjYXVzZSBBbmRyb2lkIE1hcmtldAorPHA+T25lIG9mIHRoZSBncmVhdCBiZW5lZml0cyB0byB1c2luZyBleHBhbnNpb24gZmlsZXMgb24gR29vZ2xlIFBsYXkgaXMgdGhlIGFiaWxpdHkgdG8KK3VwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIHdpdGhvdXQgcmUtZG93bmxvYWRpbmcgYWxsIG9mIHRoZSBvcmlnaW5hbCBhc3NldHMuIEJlY2F1c2UgR29vZ2xlIFBsYXkKIGFsbG93cyB5b3UgdG8gcHJvdmlkZSB0d28gZXhwYW5zaW9uIGZpbGVzIHdpdGggZWFjaCBBUEssIHlvdSBjYW4gdXNlIHRoZSBzZWNvbmQgZmlsZSBhcyBhICJwYXRjaCIKIHRoYXQgcHJvdmlkZXMgdXBkYXRlcyBhbmQgbmV3IGFzc2V0cy4gRG9pbmcgc28gYXZvaWRzIHRoZQogbmVlZCB0byByZS1kb3dubG9hZCB0aGUgbWFpbiBleHBhbnNpb24gZmlsZSB3aGljaCBjb3VsZCBiZSBsYXJnZSBhbmQgZXhwZW5zaXZlIGZvciB1c2Vycy48L3A+CiAKIDxwPlRoZSBwYXRjaCBleHBhbnNpb24gZmlsZSBpcyB0ZWNobmljYWxseSB0aGUgc2FtZSBhcyB0aGUgbWFpbiBleHBhbnNpb24gZmlsZSBhbmQgbmVpdGhlcgotdGhlIEFuZHJvaWQgc3lzdGVtIG5vciBBbmRyb2lkIE1hcmtldCBwZXJmb3JtIGFjdHVhbCBwYXRjaGluZyBiZXR3ZWVuIHlvdXIgbWFpbiBhbmQgcGF0Y2ggZXhwYW5zaW9uCit0aGUgQW5kcm9pZCBzeXN0ZW0gbm9yIEdvb2dsZSBQbGF5IHBlcmZvcm0gYWN0dWFsIHBhdGNoaW5nIGJldHdlZW4geW91ciBtYWluIGFuZCBwYXRjaCBleHBhbnNpb24KIGZpbGVzLiBZb3VyIGFwcGxpY2F0aW9uIGNvZGUgbXVzdCBwZXJmb3JtIGFueSBuZWNlc3NhcnkgcGF0Y2hlcyBpdHNlbGYuPC9wPgogCiA8cD5JZiB5b3UgdXNlIFpJUCBmaWxlcyBhcyB5b3VyIGV4cGFuc2lvbiBmaWxlcywgdGhlIDxhIGhyZWY9IiNaaXBMaWIiPkFQSyBFeHBhbnNpb24gWmlwCi1MaWJyYXJ5PC9hPiB0aGF0J3MgaW5jbHVkZWQgd2l0aCB0aGUgQVBLIEV4cGFuc2lvbiBMaWJyYXJ5IHBhY2thZ2UgaW5jbHVkZXMgdGhlIGFiaWxpdHkgdG8gbWVyZ2UKK0xpYnJhcnk8L2E+IHRoYXQncyBpbmNsdWRlZCB3aXRoIHRoZSBBcGsgRXhwYW5zaW9uIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGFiaWxpdHkgdG8gbWVyZ2UKIHlvdXIKIHBhdGNoIGZpbGUgd2l0aCB0aGUgbWFpbiBleHBhbnNpb24gZmlsZS48L3A+CiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEV2ZW4gaWYgeW91IG9ubHkgbmVlZCB0byBtYWtlIGNoYW5nZXMgdG8gdGhlIHBhdGNoCi1leHBhbnNpb24gZmlsZSwgeW91IG11c3Qgc3RpbGwgdXBkYXRlIHRoZSBBUEsgaW4gb3JkZXIgZm9yIEFuZHJvaWQgTWFya2V0IHRvIHBlcmZvcm0gYW4gdXBkYXRlLgorZXhwYW5zaW9uIGZpbGUsIHlvdSBtdXN0IHN0aWxsIHVwZGF0ZSB0aGUgQVBLIGluIG9yZGVyIGZvciBHb29nbGUgUGxheSB0byBwZXJmb3JtIGFuIHVwZGF0ZS4KIElmIHlvdSBkb24ndCByZXF1aXJlIGNvZGUgY2hhbmdlcyBpbiB0aGUgYXBwbGljYXRpb24sIHlvdSBzaG91bGQgc2ltcGx5IHVwZGF0ZSB0aGUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtZWxlbWVudC5odG1sI3Zjb2RlIj57QGNvZGUgdmVyc2lvbkNvZGV9PC9hPiBpbiB0aGUKIG1hbmlmZXN0LjwvcD4KIAogPHA+QXMgbG9uZyBhcyB5b3UgZG9uJ3QgY2hhbmdlIHRoZSBtYWluIGV4cGFuc2lvbiBmaWxlIHRoYXQncyBhc3NvY2lhdGVkIHdpdGggdGhlIEFQSwotaW4gdGhlIEFuZHJvaWQgTWFya2V0IERldmVsb3BlciBDb25zb2xlLCB1c2VycyB3aG8gcHJldmlvdXNseSBpbnN0YWxsZWQgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG5vdAoraW4gdGhlIERldmVsb3BlciBDb25zb2xlLCB1c2VycyB3aG8gcHJldmlvdXNseSBpbnN0YWxsZWQgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG5vdAogZG93bmxvYWQgdGhlIG1haW4gZXhwYW5zaW9uIGZpbGUuIEV4aXN0aW5nIHVzZXJzIHJlY2VpdmUgb25seSB0aGUgdXBkYXRlZCBBUEsgYW5kIHRoZSBuZXcgcGF0Y2gKIGV4cGFuc2lvbiBmaWxlIChyZXRhaW5pbmcgdGhlIHByZXZpb3VzIG1haW4gZXhwYW5zaW9uIGZpbGUpLjwvcD4KIApAQCAtMTI0NSwxMSArMTI0NiwxMSBAQAogCiA8dWw+CiAgIDxsaT5UaGVyZSBjYW4gYmUgb25seSB0d28gZXhwYW5zaW9uIGZpbGVzIGZvciB5b3VyIGFwcGxpY2F0aW9uIGF0IGEgdGltZS4gT25lIG1haW4gZXhwYW5zaW9uCi1maWxlIGFuZCBvbmUgcGF0Y2ggZXhwYW5zaW9uIGZpbGUuIER1cmluZyBhbiB1cGRhdGUgdG8gYSBmaWxlLCBBbmRyb2lkIE1hcmtldCBkZWxldGVzIHRoZQorZmlsZSBhbmQgb25lIHBhdGNoIGV4cGFuc2lvbiBmaWxlLiBEdXJpbmcgYW4gdXBkYXRlIHRvIGEgZmlsZSwgR29vZ2xlIFBsYXkgZGVsZXRlcyB0aGUKIHByZXZpb3VzIHZlcnNpb24gKGFuZCBzbyBtdXN0IHlvdXIgYXBwbGljYXRpb24gd2hlbiBwZXJmb3JtaW5nIG1hbnVhbCB1cGRhdGVzKS48L2xpPgogICA8bGk+V2hlbiBhZGRpbmcgYSBwYXRjaCBleHBhbnNpb24gZmlsZSwgdGhlIEFuZHJvaWQgc3lzdGVtIGRvZXMgbm90IGFjdHVhbGx5IHBhdGNoIHlvdXIKIGFwcGxpY2F0aW9uIG9yIG1haW4gZXhwYW5zaW9uIGZpbGUuIFlvdSBtdXN0IGRlc2lnbiB5b3VyIGFwcGxpY2F0aW9uIHRvIHN1cHBvcnQgdGhlIHBhdGNoIGRhdGEuCi1Ib3dldmVyLCB0aGUgQVBLIEV4cGFuc2lvbiBMaWJyYXJ5IHBhY2thZ2UgaW5jbHVkZXMgYSBsaWJyYXJ5IGZvciB1c2luZyBaSVAgZmlsZXMKK0hvd2V2ZXIsIHRoZSBBcGsgRXhwYW5zaW9uIHBhY2thZ2UgaW5jbHVkZXMgYSBsaWJyYXJ5IGZvciB1c2luZyBaSVAgZmlsZXMKIGFzIGV4cGFuc2lvbiBmaWxlcywgd2hpY2ggbWVyZ2VzIHRoZSBkYXRhIGZyb20gdGhlIHBhdGNoIGZpbGUgaW50byB0aGUgbWFpbiBleHBhbnNpb24gZmlsZSBzbwogeW91IGNhbiBlYXNpbHkgcmVhZCBhbGwgdGhlIGV4cGFuc2lvbiBmaWxlIGRhdGEuPC9saT4KIDwvdWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9hZGRpbmctbGljZW5zaW5nLmpkIGIvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvYWRkaW5nLWxpY2Vuc2luZy5qZAppbmRleCBkMWZlODM5Li5kNGRkMDA4IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9hZGRpbmctbGljZW5zaW5nLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2FkZGluZy1saWNlbnNpbmcuamQKQEAgLTgyLDcgKzgyLDcgQEAKIAogPGgyIGlkPSJtYW5pZmVzdC1wZXJtaXNzaW9uIj5BZGRpbmcgdGhlIExpY2Vuc2luZyBQZXJtaXNzaW9uPC9oMj4KIAotPHA+VG8gdXNlIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBmb3Igc2VuZGluZyBhIGxpY2Vuc2UgY2hlY2sgdG8gdGhlCis8cD5UbyB1c2UgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIGZvciBzZW5kaW5nIGEgbGljZW5zZSBjaGVjayB0byB0aGUKIHNlcnZlciwgeW91ciBhcHBsaWNhdGlvbiBtdXN0IHJlcXVlc3QgdGhlIHByb3BlciBwZXJtaXNzaW9uLAogPGNvZGU+Y29tLmFuZHJvaWQudmVuZGluZy5DSEVDS19MSUNFTlNFPC9jb2RlPi4gSWYgeW91ciBhcHBsaWNhdGlvbiBkb2VzCiBub3QgZGVjbGFyZSB0aGUgbGljZW5zaW5nIHBlcm1pc3Npb24gYnV0IGF0dGVtcHRzIHRvIGluaXRpYXRlIGEgbGljZW5zZSBjaGVjaywKQEAgLTEwMSw3ICsxMDEsNyBAQAogPHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Jmd0OwogCiAmbHQ7bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiAuLi4iJmd0OwotICAgICZsdDshLS0gRGV2aWNlcyAmZ3Q7PSAzIGhhdmUgdmVyc2lvbiBvZiBBbmRyb2lkIE1hcmtldCB0aGF0IHN1cHBvcnRzIGxpY2Vuc2luZy4gLS0mZ3Q7CisgICAgJmx0OyEtLSBEZXZpY2VzICZndDs9IDMgaGF2ZSB2ZXJzaW9uIG9mIEdvb2dsZSBQbGF5IHRoYXQgc3VwcG9ydHMgbGljZW5zaW5nLiAtLSZndDsKICAgICAmbHQ7dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIzIiAvJmd0OwogICAgICZsdDshLS0gUmVxdWlyZWQgcGVybWlzc2lvbiB0byBjaGVjayBsaWNlbnNpbmcuIC0tJmd0OwogICAgICZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC52ZW5kaW5nLkNIRUNLX0xJQ0VOU0UiIC8mZ3Q7CkBAIC0xMjMsNyArMTIzLDcgQEAKIDxoMj5TZXJ2ZXJNYW5hZ2VkUG9saWN5PC9oMj4KIAogPHA+VGhlIExWTCBpbmNsdWRlcyBhIGNvbXBsZXRlIHtAY29kZSBQb2xpY3l9IGltcGxlbWVudGF0aW9uIGNhbGxlZCBTZXJ2ZXJNYW5hZ2VkUG9saWN5Ci10aGF0IG1ha2VzIHVzZSBvZiBsaWNlbnNlLW1hbmFnZW1lbnQgc2V0dGluZ3MgcHJvdmlkZWQgYnkgdGhlIEFuZHJvaWQgTWFya2V0Cit0aGF0IG1ha2VzIHVzZSBvZiBsaWNlbnNlLW1hbmFnZW1lbnQgc2V0dGluZ3MgcHJvdmlkZWQgYnkgdGhlIEdvb2dsZSBQbGF5CiBzZXJ2ZXIuIDwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi10b3A6LjVlbTsiPlVzZSBvZiBTZXJ2ZXJNYW5hZ2VkUG9saWN5IGFzIHRoZSBiYXNpcyBmb3IgeW91cgpAQCAtMTMzLDcgKzEzMyw3IEBACiA8L2Rpdj4KIDwvZGl2PgogCi08cD5BbmRyb2lkIE1hcmtldCBsaWNlbnNpbmcgc2VydmljZSBkb2VzIG5vdCBpdHNlbGYgZGV0ZXJtaW5lIHdoZXRoZXIgYQorPHA+R29vZ2xlIFBsYXkgbGljZW5zaW5nIHNlcnZpY2UgZG9lcyBub3QgaXRzZWxmIGRldGVybWluZSB3aGV0aGVyIGEKIGdpdmVuIHVzZXIgd2l0aCBhIGdpdmVuIGxpY2Vuc2Ugc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIHRvIHlvdXIgYXBwbGljYXRpb24uCiBSYXRoZXIsIHRoYXQgcmVzcG9uc2liaWxpdHkgaXMgbGVmdCB0byBhIHtAY29kZSBQb2xpY3l9IGltcGxlbWVudGF0aW9uIHRoYXQgeW91IHByb3ZpZGUKIGluIHlvdXIgYXBwbGljYXRpb24uPC9wPgpAQCAtMjI3LDcgKzIyNyw3IEBACiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy9saWNlbnNpbmctcmVmZXJlbmNlLmh0bWwjZXh0cmFzIj5TZXJ2ZXIgUmVzcG9uc2UgRXh0cmFzPC9hPgogZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9saT4KIDxsaT5Vc2VzIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYgcGVyaW9kLCBpZiByZXRyeWluZyBhbnkgcmVxdWVzdHMgdGhlIHJlc3VsdCBpbgotZXJyb3JzLiBOb3RlIHRoYXQgdGhlIEFuZHJvaWQgTWFya2V0IGNsaWVudCBhdXRvbWF0aWNhbGx5IHJldHJpZXMgZmFpbGVkCitlcnJvcnMuIE5vdGUgdGhhdCB0aGUgR29vZ2xlIFBsYXkgY2xpZW50IGF1dG9tYXRpY2FsbHkgcmV0cmllcyBmYWlsZWQKIHJlcXVlc3RzLCBzbyBpbiBtb3N0IGNhc2VzIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHlvdXIge0Bjb2RlIFBvbGljeX0gdG8gcmV0cnkgdGhlbS48L2xpPgogPGxpPlByb3ZpZGVzIGZvciBhICJncmFjZSBwZXJpb2QiIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGFjY2VzcyB5b3VyCiBhcHBsaWNhdGlvbiBmb3IgYSBsaW1pdGVkIHRpbWUgb3IgbnVtYmVyIG9mIHVzZXMsIHdoaWxlIGEgbGljZW5zZSBjaGVjayBpcyBiZWluZwpAQCAtMjg2LDcgKzI4Niw3IEBACiA8cD5JbXBvcnRhbnRseSwgYSBrZXkgZmVhdHVyZSBvZiBTZXJ2ZXJNYW5nZWRQb2xpY3kgaXMgaXRzIHVzZSBvZgogc2VydmVyLXByb3ZpZGVkIHNldHRpbmdzIGFzIHRoZSBiYXNpcyBmb3IgbWFuYWdpbmcgbGljZW5zaW5nIGFjcm9zcyBhbgogYXBwbGljYXRpb24ncyByZWZ1bmQgcGVyaW9kIGFuZCB0aHJvdWdoIHZhcnlpbmcgbmV0d29yayBhbmQgZXJyb3IgY29uZGl0aW9ucy4KLVdoZW4gYW4gYXBwbGljYXRpb24gY29udGFjdHMgdGhlIEFuZHJvaWQgTWFya2V0IHNlcnZlciBmb3IgYSBsaWNlbnNlIGNoZWNrLCB0aGUKK1doZW4gYW4gYXBwbGljYXRpb24gY29udGFjdHMgdGhlIEdvb2dsZSBQbGF5IHNlcnZlciBmb3IgYSBsaWNlbnNlIGNoZWNrLCB0aGUKIHNlcnZlciBhcHBlbmRzIHNldmVyYWwgc2V0dGluZ3MgYXMga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBleHRyYXMgZmllbGQgb2YgY2VydGFpbgogbGljZW5zZSByZXNwb25zZSB0eXBlcy4gRm9yIGV4YW1wbGUsIHRoZSBzZXJ2ZXIgcHJvdmlkZXMgcmVjb21tZW5kZWQgdmFsdWVzIGZvciB0aGUKIGFwcGxpY2F0aW9uJ3MgbGljZW5zZSB2YWxpZGl0eSBwZXJpb2QsIHJldHJ5IGdyYWNlIHBlcmlvZCwgYW5kIG1heGltdW0gYWxsb3dhYmxlCkBAIC0yOTgsNyArMjk4LDcgQEAKIEV4dHJhczwvYT4uPC9wPgogCiA8cD5Gb3IgY29udmVuaWVuY2UsIGJlc3QgcGVyZm9ybWFuY2UsIGFuZCB0aGUgYmVuZWZpdCBvZiB1c2luZyBsaWNlbnNlIHNldHRpbmdzCi1mcm9tIHRoZSBBbmRyb2lkIE1hcmtldCBzZXJ2ZXIsIDxzdHJvbmc+dXNpbmcgU2VydmVyTWFuYWdlZFBvbGljeSBhcyB5b3VyCitmcm9tIHRoZSBHb29nbGUgUGxheSBzZXJ2ZXIsIDxzdHJvbmc+dXNpbmcgU2VydmVyTWFuYWdlZFBvbGljeSBhcyB5b3VyCiBsaWNlbnNpbmcge0Bjb2RlIFBvbGljeX0gaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQ8L3N0cm9uZz4uIDwvcD4KIAogPHA+SWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQgdGhlIHNlY3VyaXR5IG9mIGxpY2Vuc2UgcmVzcG9uc2UgZGF0YSB0aGF0IGlzCkBAIC00NDYsNyArNDQ2LDcgQEAKIAogPHA+QmVmb3JlIHJlcXVlc3RpbmcgbmV3IHBlcm1pc3Npb25zIGZvciB0aGUgPGVtPnNvbGUgcHVycG9zZTwvZW0+IG9mIGFjcXVpcmluZwogZGV2aWNlLXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciB1c2UgaW4geW91ciB7QGNvZGUgT2JmdXNjYXRvcn0sIGNvbnNpZGVyCi1ob3cgZG9pbmcgc28gbWlnaHQgYWZmZWN0IHlvdXIgYXBwbGljYXRpb24gb3IgaXRzIGZpbHRlcmluZyBvbiBBbmRyb2lkIE1hcmtldAoraG93IGRvaW5nIHNvIG1pZ2h0IGFmZmVjdCB5b3VyIGFwcGxpY2F0aW9uIG9yIGl0cyBmaWx0ZXJpbmcgb24gR29vZ2xlIFBsYXkKIChzaW5jZSBzb21lIHBlcm1pc3Npb25zIGNhbiBjYXVzZSB0aGUgU0RLIGJ1aWxkIHRvb2xzIHRvIGFkZAogdGhlIGFzc29jaWF0ZWQgPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+KS48L3A+CiAKQEAgLTY0NywxMSArNjQ3LDExIEBACiA8bGk+RGlzcGxheSBhICJUcnkgYWdhaW4iIGRpYWxvZyB0byB0aGUgdXNlciwgaW5jbHVkaW5nIGEgYnV0dG9uIHRvIGluaXRpYXRlIGEKIG5ldyBsaWNlbnNlIGNoZWNrIGlmIHRoZSA8Y29kZT5yZWFzb248L2NvZGU+IHN1cHBsaWVkIGlzIHtAY29kZSBQb2xpY3kuUkVUUll9LiA8L2xpPgogPGxpPkRpc3BsYXkgYSAiUHVyY2hhc2UgdGhpcyBhcHBsaWNhdGlvbiIgZGlhbG9nLCBpbmNsdWRpbmcgYSBidXR0b24gdGhhdAotZGVlcC1saW5rcyB0aGUgdXNlciB0byB0aGUgYXBwbGljYXRpb24ncyBkZXRhaWxzIHBhZ2Ugb24gTWFya2V0LCBmcm9tIHdoaWNoIHRoZQorZGVlcC1saW5rcyB0aGUgdXNlciB0byB0aGUgYXBwbGljYXRpb24ncyBkZXRhaWxzIHBhZ2Ugb24gR29vZ2xlIFBsYXksIGZyb20gd2hpY2ggdGhlCiB1c2UgY2FuIHB1cmNoYXNlIHRoZSBhcHBsaWNhdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHNldCB1cCBzdWNoCiBsaW5rcywgc2VlIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwjbWFya2V0aW50ZW50Ij5Vc2luZyBJbnRlbnRzIHRvCi1MYXVuY2ggdGhlIE1hcmtldCBBcHBsaWNhdGlvbiBvbiBhIERldmljZTwvYT4uIDwvbGk+CitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwjbWFya2V0aW50ZW50Ij5MaW5raW5nIHRvIHlvdXIgYXBwcworb24gR29vZ2xlIFBsYXk8L2E+LiA8L2xpPgogPGxpPkRpc3BsYXkgYSBUb2FzdCBub3RpZmljYXRpb24gdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZmVhdHVyZXMgb2YgdGhlCiBhcHBsaWNhdGlvbiBhcmUgbGltaXRlZCBiZWNhdXNlIGl0IGlzIG5vdCBsaWNlbnNlZC4gPC9saT4KIDwvdWw+CkBAIC02ODgsNyArNjg4LDcgQEAKICAgICAgICAgICAgIC8vIFlvdXIgcmVzcG9uc2Ugc2hvdWxkIGFsd2F5cyBpbmZvcm0gdGhlIHVzZXIgdGhhdCB0aGUgYXBwbGljYXRpb24KICAgICAgICAgICAgIC8vIGlzIG5vdCBsaWNlbnNlZCwgYnV0IHlvdXIgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBjYW4gdmFyeS4gWW91IG1pZ2h0CiAgICAgICAgICAgICAvLyBwcm92aWRlIHRoZSB1c2VyIGEgbGltaXRlZCBhY2Nlc3MgdmVyc2lvbiBvZiB5b3VyIGFwcCBvciB5b3UgY2FuCi0gICAgICAgICAgICAvLyB0YWtlIHRoZW0gdG8gQW5kcm9pZCBNYXJrZXQgdG8gcHVyY2hhc2UgdGhlIGFwcC4KKyAgICAgICAgICAgIC8vIHRha2UgdGhlbSB0byBHb29nbGUgUGxheSB0byBwdXJjaGFzZSB0aGUgYXBwLgogICAgICAgICAgICAgc2hvd0RpYWxvZyhESUFMT0dfR09UT01BUktFVCk7CiAgICAgICAgIH0KICAgICB9CkBAIC03MDcsMTYgKzcwNywxNiBAQAogPGgzIGlkPSJ0aHJlYWQtaGFuZGxlciI+Q3JlYXRlIGEgSGFuZGxlciBmb3IgcG9zdGluZyBmcm9tIExpY2Vuc2VDaGVja2VyQ2FsbGJhY2sKIHRvIHRoZSBVSSB0aHJlYWQ8L2gzPgogCi08cD5EdXJpbmcgYSBsaWNlbnNlIGNoZWNrLCB0aGUgTFZMIHBhc3NlcyB0aGUgcmVxdWVzdCB0byB0aGUgQW5kcm9pZCBNYXJrZXQKKzxwPkR1cmluZyBhIGxpY2Vuc2UgY2hlY2ssIHRoZSBMVkwgcGFzc2VzIHRoZSByZXF1ZXN0IHRvIHRoZSBHb29nbGUgUGxheQogYXBwbGljYXRpb24sIHdoaWNoIGhhbmRsZXMgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBsaWNlbnNpbmcgc2VydmVyLiBUaGUgTFZMCiBwYXNzZXMgdGhlIHJlcXVlc3Qgb3ZlciBhc3luY2hyb25vdXMgSVBDICh1c2luZyB7QGxpbmsgYW5kcm9pZC5vcy5CaW5kZXJ9KSBzbwogdGhlIGFjdHVhbCBwcm9jZXNzaW5nIGFuZCBuZXR3b3JrIGNvbW11bmljYXRpb24gZG8gbm90IHRha2UgcGxhY2Ugb24gYSB0aHJlYWQKLW1hbmFnZWQgYnkgeW91ciBhcHBsaWNhdGlvbi4gU2ltaWxhcmx5LCB3aGVuIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbgorbWFuYWdlZCBieSB5b3VyIGFwcGxpY2F0aW9uLiBTaW1pbGFybHksIHdoZW4gdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uCiByZWNlaXZlcyB0aGUgcmVzdWx0LCBpdCBpbnZva2VzIGEgIGNhbGxiYWNrIG1ldGhvZCBvdmVyIElQQywgd2hpY2ggaW4gdHVybgogZXhlY3V0ZXMgaW4gYW4gSVBDIHRocmVhZCBwb29sIGluIHlvdXIgYXBwbGljYXRpb24ncyBwcm9jZXNzLjwvcD4KIAogPHA+VGhlIHtAY29kZSBMaWNlbnNlQ2hlY2tlcn0gY2xhc3MgbWFuYWdlcyB5b3VyIGFwcGxpY2F0aW9uJ3MgSVBDIGNvbW11bmljYXRpb24gd2l0aAotdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLCBpbmNsdWRpbmcgdGhlIGNhbGwgdGhhdCBzZW5kcyB0aGUgcmVxdWVzdCBhbmQKK3RoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nIHRoZSBjYWxsIHRoYXQgc2VuZHMgdGhlIHJlcXVlc3QgYW5kCiB0aGUgY2FsbGJhY2sgdGhhdCByZWNlaXZlcyB0aGUgcmVzcG9uc2UuIHtAY29kZSBMaWNlbnNlQ2hlY2tlcn0gYWxzbyB0cmFja3Mgb3BlbiBsaWNlbnNlCiByZXF1ZXN0cyBhbmQgbWFuYWdlcyB0aGVpciB0aW1lb3V0cy4gPC9wPgogCkBAIC04NTgsMTQgKzg1OCwxNCBAQAogCiA8aDMgaWQ9ImFjY291bnQta2V5Ij5FbWJlZCB5b3VyIHB1YmxpYyBrZXkgZm9yIGxpY2Vuc2luZzwvaDM+CiAKLTxwPkZvciBlYWNoIHB1Ymxpc2hlciBhY2NvdW50LCB0aGUgQW5kcm9pZCBNYXJrZXQgc2VydmljZSBhdXRvbWF0aWNhbGx5Cis8cD5Gb3IgZWFjaCBwdWJsaXNoZXIgYWNjb3VudCwgdGhlIEdvb2dsZSBQbGF5IHNlcnZpY2UgYXV0b21hdGljYWxseQogZ2VuZXJhdGVzIGEgIDIwNDgtYml0IFJTQSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpciB0aGF0IGlzIHVzZWQgZXhjbHVzaXZlbHkgZm9yCiBsaWNlbnNpbmcuIFRoZSBrZXkgcGFpciBpcyB1bmlxdWVseSBhc3NvY2lhdGVkIHdpdGggdGhlIHB1Ymxpc2hlciBhY2NvdW50IGFuZCBpcwogc2hhcmVkIGFjcm9zcyBhbGwgYXBwbGljYXRpb25zIHRoYXQgYXJlIHB1Ymxpc2hlZCB0aHJvdWdoIHRoZSBhY2NvdW50LiBBbHRob3VnaAogYXNzb2NpYXRlZCB3aXRoIGEgcHVibGlzaGVyIGFjY291bnQsIHRoZSBrZXkgcGFpciBpcyA8ZW0+bm90PC9lbT4gdGhlIHNhbWUgYXMKIHRoZSBrZXkgdGhhdCB5b3UgdXNlIHRvIHNpZ24geW91ciBhcHBsaWNhdGlvbnMgKG9yIGRlcml2ZWQgZnJvbSBpdCkuPC9wPgogCi08cD5UaGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGUgZXhwb3NlcyB0aGUgcHVibGljIGtleSBmb3IgbGljZW5zaW5nIHRvIGFueQorPHA+VGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlIGV4cG9zZXMgdGhlIHB1YmxpYyBrZXkgZm9yIGxpY2Vuc2luZyB0byBhbnkKIGRldmVsb3BlciBzaWduZWQgaW4gdG8gdGhlIHB1Ymxpc2hlciBhY2NvdW50LCBidXQgaXQga2VlcHMgdGhlIHByaXZhdGUga2V5CiBoaWRkZW4gZnJvbSBhbGwgdXNlcnMgaW4gYSBzZWN1cmUgbG9jYXRpb24uIFdoZW4gYW4gYXBwbGljYXRpb24gcmVxdWVzdHMgYQogbGljZW5zZSBjaGVjayBmb3IgYW4gYXBwbGljYXRpb24gcHVibGlzaGVkIGluIHlvdXIgYWNjb3VudCwgdGhlIGxpY2Vuc2luZyBzZXJ2ZXIKQEAgLTg3OCw4ICs4NzgsOCBAQAogeW91ciBhY2NvdW50J3MgcHVibGljIGtleSBmb3IgbGljZW5zaW5nOjwvcD4KIAogPG9sPgotPGxpPkdvIHRvIHRoZSBBbmRyb2lkIE1hcmtldCA8YQotaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9wdWJsaXNoIj5wdWJsaXNoZXIgc2l0ZTwvYT4gYW5kIHNpZ24gaW4uCis8bGk+R28gdG8gdGhlIEdvb2dsZSBQbGF5IDxhCitocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaCI+cHVibGlzaGVyIHNpdGU8L2E+IGFuZCBzaWduIGluLgogTWFrZSBzdXJlIHRoYXQgeW91IHNpZ24gaW4gdG8gdGhlIGFjY291bnQgZnJvbSB3aGljaCB0aGUgYXBwbGljYXRpb24geW91IGFyZQogbGljZW5zaW5nIGlzIHB1Ymxpc2hlZCAob3Igd2lsbCBiZSBwdWJsaXNoZWQpLiA8L2xpPgogPGxpPkluIHRoZSBhY2NvdW50IGhvbWUgcGFnZSwgbG9jYXRlIHRoZSAiRWRpdCBwcm9maWxlIiBsaW5rIGFuZCBjbGljayBpdC4gPC9saT4KQEAgLTkwNyw3ICs5MDcsNyBAQAoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0fSBjaGFuZ2VzLCBhZGQgYSBjYWxsIHRvIHRoZSB7QGNvZGUgTGljZW5zZUNoZWNrZXJ9J3MKIDxjb2RlPm9uRGVzdHJveSgpPC9jb2RlPiBtZXRob2QgZnJvbSB5b3VyIEFjdGl2aXR5J3MKIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3koKX0gaW1wbGVtZW50YXRpb24uIFRoZSBjYWxsIGNhdXNlcyB0aGUKLXtAY29kZSBMaWNlbnNlQ2hlY2tlcn0gdG8gcHJvcGVybHkgY2xvc2UgYW55IG9wZW4gSVBDIGNvbm5lY3Rpb24gdG8gdGhlIEFuZHJvaWQgTWFya2V0Cit7QGNvZGUgTGljZW5zZUNoZWNrZXJ9IHRvIHByb3Blcmx5IGNsb3NlIGFueSBvcGVuIElQQyBjb25uZWN0aW9uIHRvIHRoZSBHb29nbGUgUGxheQogYXBwbGljYXRpb24ncyBJTGljZW5zaW5nU2VydmljZSBhbmQgcmVtb3ZlcyBhbnkgbG9jYWwgcmVmZXJlbmNlcyB0byB0aGUgc2VydmljZQogYW5kIGhhbmRsZXIuPC9wPgogCkBAIC05OTIsMTMgKzk5MiwxMyBAQAogPHA+U2V2ZXJhbCBvYmZ1c2NhdG9yIHByb2dyYW1zIGFyZSBhdmFpbGFibGUgZm9yIEFuZHJvaWQgYXBwbGljYXRpb25zLCBpbmNsdWRpbmcKIDxhIGhyZWY9Imh0dHA6Ly9wcm9ndWFyZC5zb3VyY2Vmb3JnZS5uZXQvIj5Qcm9HdWFyZDwvYT4sIHdoaWNoIGFsc28gb2ZmZXJzCiBjb2RlLW9wdGltaXphdGlvbiBmZWF0dXJlcy4gVGhlIHVzZSBvZiBQcm9HdWFyZCBvciBhIHNpbWlsYXIgcHJvZ3JhbSB0byBvYmZ1c2NhdGUKLXlvdXIgY29kZSBpcyA8ZW0+c3Ryb25nbHkgcmVjb21tZW5kZWQ8L2VtPiBmb3IgYWxsIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBBbmRyb2lkCi1NYXJrZXQgTGljZW5zaW5nLiA8L3A+Cit5b3VyIGNvZGUgaXMgPGVtPnN0cm9uZ2x5IHJlY29tbWVuZGVkPC9lbT4gZm9yIGFsbCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgR29vZ2xlCitQbGF5IExpY2Vuc2luZy4gPC9wPgogCiA8aDIgaWQ9ImFwcC1wdWJsaXNoaW5nIj5QdWJsaXNoaW5nIGEgTGljZW5zZWQgQXBwbGljYXRpb248L2gyPgogCiA8cD5XaGVuIHlvdSBhcmUgZmluaXNoZWQgdGVzdGluZyB5b3VyIGxpY2Vuc2UgaW1wbGVtZW50YXRpb24sIHlvdSBhcmUgcmVhZHkgdG8KLXB1Ymxpc2ggdGhlIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0LiBGb2xsb3cgdGhlIG5vcm1hbCBzdGVwcyB0byA8YQorcHVibGlzaCB0aGUgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkuIEZvbGxvdyB0aGUgbm9ybWFsIHN0ZXBzIHRvIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wcmVwYXJpbmcuaHRtbCI+cHJlcGFyZTwvYT4sIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9hcHAtc2lnbmluZy5odG1sIj5zaWduPC9hPiwgYW5kIHRoZW4gPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCI+cHVibGlzaCB0aGUgYXBwbGljYXRpb248L2E+LgpAQCAtMTAyMSw3ICsxMDIxLDcgQEAKIHN1cHBvcnQgeW91IG5lZWQgbW9yZSBxdWlja2x5LiA8L3A+CiAKIDxwIGNsYXNzPSJ0YWJsZS1jYXB0aW9uIj48c3Ryb25nPlRhYmxlIDIuPC9zdHJvbmc+IERldmVsb3BlciBzdXBwb3J0IHJlc291cmNlcwotZm9yIEFuZHJvaWQgTWFya2V0IExpY2Vuc2luZyBTZXJ2aWNlLjwvcD4KK2ZvciBHb29nbGUgUGxheSBMaWNlbnNpbmcgU2VydmljZS48L3A+CiAKIDx0YWJsZT4KIApAQCAtMTA0NSw4ICsxMDQ1LDggQEAKIDwvdHI+CiA8dHI+CiA8dGQgcm93c3Bhbj0iMiI+QWNjb3VudHMsIHB1Ymxpc2hpbmcsIGFuZCBkZXBsb3ltZW50IGlzc3VlczwvdGQ+Ci08dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvZm9ydW0vcC9BbmRyb2lkK01hcmtldCI+QW5kcm9pZAotTWFya2V0IEhlbHAgRm9ydW08L2E+PC90ZD4KKzx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc3VwcG9ydC9mb3J1bS9wL0FuZHJvaWQrTWFya2V0Ij5Hb29nbGUgUGxheQorSGVscCBGb3J1bTwvYT48L3RkPgogPHRkIHJvd3NwYW49IjIiPlB1Ymxpc2hlciBhY2NvdW50cywgbGljZW5zaW5nIGtleSBwYWlyLCB0ZXN0IGFjY291bnRzLCBzZXJ2ZXIKIHJlc3BvbnNlcywgdGVzdCByZXNwb25zZXMsIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgYW5kIHJlc3VsdHM8L3RkPgogPC90cj4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2luZGV4LmpkIGIvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguamQKaW5kZXggZjA4MTc2ZC4uMWYxNTMwMyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguamQKQEAgLTIsMzkgKzIsMzkgQEAKIEBqZDpib2R5CiAKIAotPHA+QW5kcm9pZCBNYXJrZXQgb2ZmZXJzIGEgbGljZW5zaW5nIHNlcnZpY2UgdGhhdCBsZXRzIHlvdSBlbmZvcmNlIGxpY2Vuc2luZyBwb2xpY2llcyBmb3IKLWFwcGxpY2F0aW9ucyB0aGF0IHlvdSBwdWJsaXNoIG9uIEFuZHJvaWQgTWFya2V0LiBXaXRoIEFuZHJvaWQgTWFya2V0IExpY2Vuc2luZywgeW91ciBhcHBsaWNhdGlvbiBjYW4KLXF1ZXJ5IEFuZHJvaWQgTWFya2V0IGF0IHJ1biB0aW1lIHRvIG9idGFpbiB0aGUgbGljZW5zaW5nIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdXNlciwgdGhlbiBhbGxvdyBvcgorPHA+R29vZ2xlIFBsYXkgb2ZmZXJzIGEgbGljZW5zaW5nIHNlcnZpY2UgdGhhdCBsZXRzIHlvdSBlbmZvcmNlIGxpY2Vuc2luZyBwb2xpY2llcyBmb3IKK2FwcGxpY2F0aW9ucyB0aGF0IHlvdSBwdWJsaXNoIG9uIEdvb2dsZSBQbGF5LiBXaXRoIEdvb2dsZSBQbGF5IExpY2Vuc2luZywgeW91ciBhcHBsaWNhdGlvbiBjYW4KK3F1ZXJ5IEdvb2dsZSBQbGF5IGF0IHJ1biB0aW1lIHRvIG9idGFpbiB0aGUgbGljZW5zaW5nIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdXNlciwgdGhlbiBhbGxvdyBvcgogZGlzYWxsb3cgZnVydGhlciB1c2UgYXMgYXBwcm9wcmlhdGUuIDwvcD4KIAogPHA+VXNpbmcgdGhlIHNlcnZpY2UsIHlvdSBjYW4gYXBwbHkgYSBmbGV4aWJsZSBsaWNlbnNpbmcgcG9saWN5IG9uIGFuIGFwcGxpY2F0aW9uLWJ5LWFwcGxpY2F0aW9uCiBiYXNpcyZtZGFzaDtlYWNoIGFwcGxpY2F0aW9uIGNhbiBlbmZvcmNlIGxpY2Vuc2luZyBpbiB0aGUgd2F5IG1vc3QgYXBwcm9wcmlhdGUgZm9yIGl0LiBJZiBuZWNlc3NhcnksCi1hbiBhcHBsaWNhdGlvbiBjYW4gYXBwbHkgY3VzdG9tIGNvbnN0cmFpbnRzIGJhc2VkIG9uIHRoZSBsaWNlbnNpbmcgc3RhdHVzIG9idGFpbmVkIGZyb20gQW5kcm9pZAotTWFya2V0LiBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gY2FuIGNoZWNrIHRoZSBsaWNlbnNpbmcgc3RhdHVzIGFuZCB0aGVuIGFwcGx5IGN1c3RvbSBjb25zdHJhaW50cworYW4gYXBwbGljYXRpb24gY2FuIGFwcGx5IGN1c3RvbSBjb25zdHJhaW50cyBiYXNlZCBvbiB0aGUgbGljZW5zaW5nIHN0YXR1cyBvYnRhaW5lZCBmcm9tIEdvb2dsZSBQbGF5LgorRm9yIGV4YW1wbGUsIGFuIGFwcGxpY2F0aW9uIGNhbiBjaGVjayB0aGUgbGljZW5zaW5nIHN0YXR1cyBhbmQgdGhlbiBhcHBseSBjdXN0b20gY29uc3RyYWludHMKIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gcnVuIGl0IHVubGljZW5zZWQgZm9yIGEgc3BlY2lmaWMgdmFsaWRpdHkgcGVyaW9kLiBBbiBhcHBsaWNhdGlvbiBjYW4gYWxzbwogcmVzdHJpY3QgdXNlIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBhIHNwZWNpZmljIGRldmljZSwgaW4gYWRkaXRpb24gdG8gYW55IG90aGVyIGNvbnN0cmFpbnRzLiA8L3A+CiAKIDxwPlRoZSBsaWNlbnNpbmcgc2VydmljZSBpcyBhIHNlY3VyZSBtZWFucyBvZiBjb250cm9sbGluZyBhY2Nlc3MgdG8geW91ciBhcHBsaWNhdGlvbnMuIFdoZW4gYW4KLWFwcGxpY2F0aW9uIGNoZWNrcyB0aGUgbGljZW5zaW5nIHN0YXR1cywgdGhlIEFuZHJvaWQgTWFya2V0IHNlcnZlciBzaWducyB0aGUgbGljZW5zaW5nIHN0YXR1cworYXBwbGljYXRpb24gY2hlY2tzIHRoZSBsaWNlbnNpbmcgc3RhdHVzLCB0aGUgR29vZ2xlIFBsYXkgc2VydmVyIHNpZ25zIHRoZSBsaWNlbnNpbmcgc3RhdHVzCiByZXNwb25zZSB1c2luZyBhIGtleSBwYWlyIHRoYXQgaXMgdW5pcXVlbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwdWJsaXNoZXIgYWNjb3VudC4gWW91ciBhcHBsaWNhdGlvbgogc3RvcmVzIHRoZSBwdWJsaWMga2V5IGluIGl0cyBjb21waWxlZCA8Y29kZT4uYXBrPC9jb2RlPiBmaWxlIGFuZCB1c2VzIGl0IHRvIHZlcmlmeSB0aGUgbGljZW5zaW5nCiBzdGF0dXMgcmVzcG9uc2UuPC9wPgogCi08cD5BbnkgYXBwbGljYXRpb24gdGhhdCB5b3UgcHVibGlzaCB0aHJvdWdoIEFuZHJvaWQgTWFya2V0IGNhbiB1c2UgdGhlIEFuZHJvaWQgTWFya2V0IExpY2Vuc2luZworPHA+QW55IGFwcGxpY2F0aW9uIHRoYXQgeW91IHB1Ymxpc2ggdGhyb3VnaCBHb29nbGUgUGxheSBjYW4gdXNlIHRoZSBHb29nbGUgUGxheSBMaWNlbnNpbmcKIHNlcnZpY2UuIE5vIHNwZWNpYWwgYWNjb3VudCBvciByZWdpc3RyYXRpb24gaXMgbmVlZGVkLiBBZGRpdGlvbmFsbHksIGJlY2F1c2UgdGhlIHNlcnZpY2UgdXNlcyBubwogZGVkaWNhdGVkIGZyYW1ld29yayBBUElzLCB5b3UgY2FuIGFkZCBsaWNlbnNpbmcgdG8gYW55IGFwcGxpY2F0aW9uIHRoYXQgdXNlcyBhIG1pbmltdW0gQVBJIGxldmVsIG9mCiAzIG9yIGhpZ2hlci48L3A+CiAKLTxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBBbmRyb2lkIE1hcmtldCBMaWNlbnNpbmcgc2VydmljZSBpcyBwcmltYXJpbHkgaW50ZW5kZWQKKzxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBHb29nbGUgUGxheSBMaWNlbnNpbmcgc2VydmljZSBpcyBwcmltYXJpbHkgaW50ZW5kZWQKIGZvciBwYWlkIGFwcGxpY2F0aW9ucyB0aGF0IHdpc2ggdG8gdmVyaWZ5IHRoYXQgdGhlIGN1cnJlbnQgdXNlciBkaWQgaW4gZmFjdCBwYXkgZm9yIHRoZSBhcHBsaWNhdGlvbgotb24gQW5kcm9pZCBNYXJrZXQuIEhvd2V2ZXIsIGFueSBhcHBsaWNhdGlvbiAoaW5jbHVkaW5nIGZyZWUgYXBwcykgbWF5IHVzZSB0aGUgbGljZW5zaW5nIHNlcnZpY2UKK29uIEdvb2dsZSBQbGF5LiBIb3dldmVyLCBhbnkgYXBwbGljYXRpb24gKGluY2x1ZGluZyBmcmVlIGFwcHMpIG1heSB1c2UgdGhlIGxpY2Vuc2luZyBzZXJ2aWNlCiB0byBpbml0aWF0ZSB0aGUgZG93bmxvYWQgb2YgYW4gQVBLIGV4cGFuc2lvbiBmaWxlLiBJbiB3aGljaCBjYXNlLCB0aGUgcmVxdWVzdCB0aGF0IHlvdXIgYXBwbGljYXRpb24KIHNlbmRzIHRvIHRoZSBsaWNlbnNpbmcgc2VydmljZSBpcyBub3QgdG8gY2hlY2sgd2hldGhlciB0aGUgdXNlciBwYWlkIGZvciB0aGUgYXBwLCBidXQgdG8gcmVxdWVzdCB0aGUKIFVSTCBvZiB0aGUgZXhwYW5zaW9uIGZpbGVzLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgZG93bmxvYWRpbmcgZXhwYW5zaW9uIGZpbGVzIGZvciB5b3VyIGFwcGxpY2F0aW9uLAogcmVhZCB0aGUgZ3VpZGUgdG8gPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9leHBhbnNpb24tZmlsZXMuaHRtbCI+QVBLIEV4cGFuc2lvbiBGaWxlczwvYT4uPC9wPgogCiAKLTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgQW5kcm9pZCBNYXJrZXQncyBhcHBsaWNhdGlvbiBsaWNlbnNpbmcgc2VydmljZSBhbmQgc3RhcnQgaW50ZWdyYXRpbmcgaXQgaW50bworPHA+VG8gbGVhcm4gbW9yZSBhYm91dCBHb29nbGUgUGxheSdzIGFwcGxpY2F0aW9uIGxpY2Vuc2luZyBzZXJ2aWNlIGFuZCBzdGFydCBpbnRlZ3JhdGluZyBpdCBpbnRvCiB5b3VyIGFwcGxpY2F0aW9ucywgcmVhZCB0aGUgZm9sbG93aW5nIGRvY3VtZW50czo8L3A+CiAKIDxkbD4KQEAgLTQ0LDcgKzQ0LDcgQEAKIGxpa2UuPC9kZD4KICAgPGR0PjxzdHJvbmc+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvc2V0dGluZy11cC5odG1sIj5TZXR0aW5nIFVwIGZvcgogTGljZW5zaW5nPC9hPjwvc3Ryb25nPjwvZHQ+Ci0gICAgPGRkPkV4cGxhaW5zIGhvdyB0byBzZXQgdXAgeW91ciBBbmRyb2lkIE1hcmtldCBhY2NvdW50LCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgYW5kCisgICAgPGRkPkV4cGxhaW5zIGhvdyB0byBzZXQgdXAgeW91ciBHb29nbGUgUGxheSBhY2NvdW50LCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgYW5kCiB0ZXN0aW5nIGVudmlyb25tZW50IGluIG9yZGVyIHRvIGFkZCBsaWNlbnNpbmcgdG8geW91ciBhcHAuPC9kZD4KICAgPGR0PjxzdHJvbmc+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvYWRkaW5nLWxpY2Vuc2luZy5odG1sIj5BZGRpbmcKIExpY2Vuc2luZyB0byBZb3VyIEFwcDwvYT48L3N0cm9uZz48L2R0PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvbGljZW5zaW5nLXJlZmVyZW5jZS5qZCBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2xpY2Vuc2luZy1yZWZlcmVuY2UuamQKaW5kZXggYWM1ZDU5Ni4uMGE3ZTAzMyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvbGljZW5zaW5nLXJlZmVyZW5jZS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9saWNlbnNpbmctcmVmZXJlbmNlLmpkCkBAIC0xMTcsNyArMTE3LDcgQEAKIDx0cj4KIDx0ZD48ZW0+SUxpY2Vuc2luZ1NlcnZpY2U8L2VtPjwvdGQ+CiA8dGQ+T25lLXdheSBJUEMgaW50ZXJmYWNlIG92ZXIgd2hpY2ggYSBsaWNlbnNlIGNoZWNrIHJlcXVlc3QgaXMgcGFzc2VkIHRvIHRoZQotQW5kcm9pZCBNYXJrZXQgY2xpZW50LjwvdGQ+CitHb29nbGUgUGxheSBjbGllbnQuPC90ZD4KIDwvdHI+CiA8dHI+CiA8dGQ+PGVtPklMaWNlbnNlUmVzdWx0TGlzdGVuZXI8L2VtPjwvdGQ+CkBAIC0xMzcsNyArMTM3LDcgQEAKIG5lY2Vzc2FyeSBoYW5kbGluZyBvZiB0aGVzZSByZXNwb25zZSBjb2RlcyBmb3IgeW91LiA8L3A+CiAKIDxwIGNsYXNzPSJ0YWJsZS1jYXB0aW9uIj48c3Ryb25nPlRhYmxlIDIuPC9zdHJvbmc+IFN1bW1hcnkgb2YgcmVzcG9uc2UgY29kZXMKLXJldHVybmVkIGJ5IHRoZSBBbmRyb2lkIE1hcmtldCBzZXJ2ZXIgaW4gYSBsaWNlbnNlIHJlc3BvbnNlLjwvcD4KK3JldHVybmVkIGJ5IHRoZSBHb29nbGUgUGxheSBzZXJ2ZXIgaW4gYSBsaWNlbnNlIHJlc3BvbnNlLjwvcD4KIAogPHRhYmxlPgogCkBAIC0xNzgsNyArMTc4LDcgQEAKIDwvdHI+CiA8dHI+CiA8dGQ+e0Bjb2RlIEVSUk9SX0NPTlRBQ1RJTkdfU0VSVkVSfTwvdGQ+Ci08dGQ+TG9jYWwgZXJyb3IgJm1kYXNoOyB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gd2FzIG5vdCBhYmxlIHRvIHJlYWNoIHRoZQorPHRkPkxvY2FsIGVycm9yICZtZGFzaDsgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHdhcyBub3QgYWJsZSB0byByZWFjaCB0aGUKIGxpY2Vuc2luZyBzZXJ2ZXIsIHBvc3NpYmx5IGJlY2F1c2Ugb2YgbmV0d29yayBhdmFpbGFiaWxpdHkgcHJvYmxlbXMuIDwvdGQ+CiA8dGQ+Tm88L3RkPgogPHRkPjwvdGQ+CkBAIC0yMTcsMTIgKzIxNywxMiBAQAogPHRyPgogPHRkPntAY29kZSBFUlJPUl9OT1RfTUFSS0VUX01BTkFHRUR9PC90ZD4KIDx0ZD5TZXJ2ZXIgZXJyb3IgJm1kYXNoOyB0aGUgYXBwbGljYXRpb24gKHBhY2thZ2UgbmFtZSkgd2FzIG5vdCByZWNvZ25pemVkIGJ5Ci1BbmRyb2lkIE1hcmtldC4gPC90ZD4KK0dvb2dsZSBQbGF5LiA8L3RkPgogPHRkPk5vPC90ZD4KIDx0ZD48L3RkPgogPHRkPjxlbT5EbyBub3QgcmV0cnkgdGhlIGxpY2Vuc2UgY2hlY2suPC9lbT4KIDxwIHN0eWxlPSJtYXJnaW4tdG9wOi41ZW07Ij5DYW4gaW5kaWNhdGUgdGhhdCB0aGUgYXBwbGljYXRpb24gd2FzIG5vdCBwdWJsaXNoZWQKLXRocm91Z2ggQW5kcm9pZCBNYXJrZXQgb3IgdGhhdCB0aGVyZSBpcyBhbiBkZXZlbG9wbWVudCBlcnJvciBpbiB0aGUgbGljZW5zaW5nCit0aHJvdWdoIEdvb2dsZSBQbGF5IG9yIHRoYXQgdGhlcmUgaXMgYW4gZGV2ZWxvcG1lbnQgZXJyb3IgaW4gdGhlIGxpY2Vuc2luZwogaW1wbGVtZW50YXRpb24uPC9wPgogPC90ZD4KIDwvdHI+CkBAIC0yMzMsNyArMjMzLDcgQEAKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nL3NldHRpbmctdXAuaHRtbCN0ZXN0LWVudiI+CiBTZXR0aW5nIFVwIFRoZSBUZXN0aW5nIEVudmlyb25tZW50PC9hPiwgdGhlIHJlc3BvbnNlIGNvZGUgY2FuIGJlIG1hbnVhbGx5CiBvdmVycmlkZGVuIGZvciB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIGFuZCBhbnkgcmVnaXN0ZXJlZCB0ZXN0IHVzZXJzIHZpYSB0aGUKLUFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBzaXRlLgorR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUuCiA8YnIvPjxici8+CiBBZGRpdGlvbmFsbHksIGFzIG5vdGVkIGFib3ZlLCBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgaW4gZHJhZnQgbW9kZSAoaW4gb3RoZXIKIHdvcmRzLCBhcHBsaWNhdGlvbnMgdGhhdCBoYXZlIGJlZW4gdXBsb2FkZWQgYnV0IGhhdmUgPGVtPm5ldmVyPC9lbT4gYmVlbgpAQCAtMjYzLDcgKzI2Myw3IEBACiBzZXR0aW5ncy4gPC9wPgogCiA8cCBjbGFzcz0idGFibGUtY2FwdGlvbiI+PHN0cm9uZz5UYWJsZSAzLjwvc3Ryb25nPiBTdW1tYXJ5IG9mCi1saWNlbnNlLW1hbmFnZW1lbnQgc2V0dGluZ3Mgc3VwcGxpZWQgYnkgdGhlIEFuZHJvaWQgTWFya2V0IHNlcnZlciBpbiBhIGxpY2Vuc2UKK2xpY2Vuc2UtbWFuYWdlbWVudCBzZXR0aW5ncyBzdXBwbGllZCBieSB0aGUgR29vZ2xlIFBsYXkgc2VydmVyIGluIGEgbGljZW5zZQogcmVzcG9uc2UuPC9wPgogCiA8dGFibGU+CkBAIC0zMjksNyArMzI5LDcgQEAKIAogPGg0IGlkPSJWVCI+TGljZW5zZSB2YWxpZGl0eSBwZXJpb2Q8L2g0PgogCi08cD5UaGUgQW5kcm9pZCBNYXJrZXQgbGljZW5zaW5nIHNlcnZlciBzZXRzIGEgbGljZW5zZSB2YWxpZGl0eSBwZXJpb2QgZm9yIGFsbAorPHA+VGhlIEdvb2dsZSBQbGF5IGxpY2Vuc2luZyBzZXJ2ZXIgc2V0cyBhIGxpY2Vuc2UgdmFsaWRpdHkgcGVyaW9kIGZvciBhbGwKIGRvd25sb2FkZWQgYXBwbGljYXRpb25zLiBUaGUgcGVyaW9kIGV4cHJlc3NlcyB0aGUgaW50ZXJ2YWwgb2YgdGltZSBvdmVyIHdoaWNoIGFuCiBhcHBsaWNhdGlvbidzIGxpY2Vuc2Ugc3RhdHVzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHVuY2hhbmdpbmcgYW5kIGNhY2hlYWJsZSBieQogYSBsaWNlbnNpbmcge0Bjb2RlIFBvbGljeX0gaW4gdGhlIGFwcGxpY2F0aW9uLiBUaGUgbGljZW5zaW5nIHNlcnZlciBpbmNsdWRlcyB0aGUKQEAgLTM1MSw3ICszNTEsNyBAQAogCiA8cD5UaGUgbGljZW5zaW5nIHNlcnZlciBtYW5hZ2VzIHRoZSB2YWxpZGl0eSBwZXJpb2QgYXMgYSBtZWFucyBvZiBoZWxwaW5nIHRoZQogYXBwbGljYXRpb24gcHJvcGVybHkgZW5mb3JjZSBsaWNlbnNpbmcgYWNyb3NzIHRoZSByZWZ1bmQgcGVyaW9kIG9mZmVyZWQgYnkKLUFuZHJvaWQgTWFya2V0IGZvciBwYWlkIGFwcGxpY2F0aW9ucy4gSXQgc2V0cyB0aGUgdmFsaWRpdHkgcGVyaW9kIGJhc2VkIG9uCitHb29nbGUgUGxheSBmb3IgcGFpZCBhcHBsaWNhdGlvbnMuIEl0IHNldHMgdGhlIHZhbGlkaXR5IHBlcmlvZCBiYXNlZCBvbgogd2hldGhlciB0aGUgYXBwbGljYXRpb24gd2FzIHB1cmNoYXNlZCBhbmQsIGlmIHNvLCBob3cgbG9uZyBhZ28uIFNwZWNpZmljYWxseSwKIHRoZSBzZXJ2ZXIgc2V0cyBhIHZhbGlkaXR5IHBlcmlvZCBhcyBmb2xsb3dzOjwvcD4KIApAQCAtMzgxLDE1ICszODEsMTUgQEAKIAogPHA+SW4gc29tZSBjYXNlcywgc3lzdGVtIG9yIG5ldHdvcmsgY29uZGl0aW9ucyBjYW4gcHJldmVudCBhbiBhcHBsaWNhdGlvbidzCiBsaWNlbnNlIGNoZWNrIGZyb20gcmVhY2hpbmcgdGhlIGxpY2Vuc2luZyBzZXJ2ZXIsIG9yIHByZXZlbnQgdGhlIHNlcnZlcidzCi1yZXNwb25zZSBmcm9tIHJlYWNoaW5nIHRoZSBBbmRyb2lkIE1hcmtldCBjbGllbnQgYXBwbGljYXRpb24uIEZvciBleGFtcGxlLCB0aGUKK3Jlc3BvbnNlIGZyb20gcmVhY2hpbmcgdGhlIEdvb2dsZSBQbGF5IGNsaWVudCBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIHRoZQogdXNlciBtaWdodCBsYXVuY2ggYW4gYXBwbGljYXRpb24gd2hlbiB0aGVyZSBpcyBubyBjZWxsIG5ldHdvcmsgb3IgZGF0YQogY29ubmVjdGlvbiBhdmFpbGFibGUmbWRhc2g7c3VjaCBhcyB3aGVuIG9uIGFuIGFpcnBsYW5lJm1kYXNoO29yIHdoZW4gdGhlCiBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgdW5zdGFibGUgb3IgdGhlIGNlbGwgc2lnbmFsIGlzIHdlYWsuIDwvcD4KIAotPHA+V2hlbiBuZXR3b3JrIHByb2JsZW1zIHByZXZlbnQgb3IgaW50ZXJydXB0IGEgbGljZW5zZSBjaGVjaywgdGhlIEFuZHJvaWQKLU1hcmtldCBjbGllbnQgbm90aWZpZXMgdGhlIGFwcGxpY2F0aW9uIGJ5IHJldHVybmluZyBhIHtAY29kZSBSRVRSWX0gcmVzcG9uc2UgY29kZSB0bworPHA+V2hlbiBuZXR3b3JrIHByb2JsZW1zIHByZXZlbnQgb3IgaW50ZXJydXB0IGEgbGljZW5zZSBjaGVjaywgdGhlIEdvb2dsZQorUGxheSBjbGllbnQgbm90aWZpZXMgdGhlIGFwcGxpY2F0aW9uIGJ5IHJldHVybmluZyBhIHtAY29kZSBSRVRSWX0gcmVzcG9uc2UgY29kZSB0bwogdGhlIHtAY29kZSBQb2xpY3l9J3MgPGNvZGU+cHJvY2Vzc1NlcnZlclJlc3BvbnNlKCk8L2NvZGU+IG1ldGhvZC4gSW4gdGhlIGNhc2Ugb2Ygc3lzdGVtCi1wcm9ibGVtcywgc3VjaCBhcyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyB1bmFibGUgdG8gYmluZCB3aXRoIEFuZHJvaWQgTWFya2V0J3MKK3Byb2JsZW1zLCBzdWNoIGFzIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIHVuYWJsZSB0byBiaW5kIHdpdGggR29vZ2xlIFBsYXkncwoge0Bjb2RlIElMaWNlbnNpbmdTZXJ2aWNlfSBpbXBsZW1lbnRhdGlvbiwgdGhlIHtAY29kZSBMaWNlbnNlQ2hlY2tlcn0gbGlicmFyeSBpdHNlbGYgY2FsbHMgdGhlCiBQb2xpY3kgPGNvZGU+cHJvY2Vzc1NlcnZlclJlc29uc2UoKTwvY29kZT4gbWV0aG9kIHdpdGggYSB7QGNvZGUgUkVUUll9IHJlc3BvbnNlIGNvZGUuCiA8L3A+CkBAIC0zOTcsNyArMzk3LDcgQEAKIDxwPkluIGdlbmVyYWwsIHRoZSB7QGNvZGUgUkVUUll9IHJlc3BvbnNlIGNvZGUgaXMgYSBzaWduYWwgdG8gdGhlIGFwcGxpY2F0aW9uIHRoYXQgYW4KIGVycm9yIGhhcyBvY2N1cnJlZCB0aGF0IGhhcyBwcmV2ZW50ZWQgYSBsaWNlbnNlIGNoZWNrIGZyb20gY29tcGxldGluZy4KIAotPHA+VGhlIEFuZHJvaWQgTWFya2V0IHNlcnZlciBoZWxwcyBhbiBhcHBsaWNhdGlvbiB0byBtYW5hZ2UgbGljZW5zaW5nIHVuZGVyCis8cD5UaGUgR29vZ2xlIFBsYXkgc2VydmVyIGhlbHBzIGFuIGFwcGxpY2F0aW9uIHRvIG1hbmFnZSBsaWNlbnNpbmcgdW5kZXIKIGVycm9yIGNvbmRpdGlvbnMgYnkgc2V0dGluZyBhIHJldHJ5ICJncmFjZSBwZXJpb2QiIGFuZCBhIHJlY29tbWVuZGVkIG1heGltdW0KIHJldHJpZXMgY291bnQuIFRoZSBzZXJ2ZXIgaW5jbHVkZXMgdGhlc2UgdmFsdWVzIGluIGFsbCBsaWNlbnNlIGNoZWNrIHJlc3BvbnNlcywKIGFwcGVuZGluZyB0aGVtIGFzIGV4dHJhcyB1bmRlciB0aGUga2V5cyB7QGNvZGUgR1R9IGFuZCB7QGNvZGUgR1J9LiA8L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9vdmVydmlldy5qZCBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL292ZXJ2aWV3LmpkCmluZGV4IDM1NzZlMjYuLjA1YTNhNDAgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL292ZXJ2aWV3LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL292ZXJ2aWV3LmpkCkBAIC05LDkgKzksOSBAQAogICAKICAgPGgyPlF1aWNrdmlldzwvaDI+CiAgIDx1bD4KLSAgICA8bGk+TGljZW5zaW5nIGFsbG93cyB5b3UgdG8gdmVyaWZ5IHlvdXIgYXBwIHdhcyBwdXJjaGFzZWQgZnJvbSBBbmRyb2lkIE1hcmtldDwvbGk+CisgICAgPGxpPkxpY2Vuc2luZyBhbGxvd3MgeW91IHRvIHZlcmlmeSB5b3VyIGFwcCB3YXMgcHVyY2hhc2VkIGZyb20gR29vZ2xlIFBsYXk8L2xpPgogICAgIDxsaT5Zb3VyIGFwcCBtYWludGFpbnMgY29udHJvbCBvZiBob3cgaXQgZW5mb3JjZXMgaXRzIGxpY2Vuc2luZyBzdGF0dXM8L2xpPgotICAgIDxsaT5UaGUgc2VydmljZSBpcyBmcmVlIGZvciBhbGwgZGV2ZWxvcGVycyB3aG8gcHVibGlzaCBvbiBBbmRyb2lkIE1hcmtldDwvbGk+CisgICAgPGxpPlRoZSBzZXJ2aWNlIGlzIGZyZWUgZm9yIGFsbCBkZXZlbG9wZXJzIHdobyBwdWJsaXNoIG9uIEdvb2dsZSBQbGF5PC9saT4KICAgPC91bD4KICAgCiAgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KQEAgLTI2LDE5ICsyNiwxOSBAQAogPC9kaXY+CiAKIAotPHA+QW5kcm9pZCBNYXJrZXQgTGljZW5zaW5nIGlzIGEgbmV0d29yay1iYXNlZCBzZXJ2aWNlIHRoYXQgbGV0cyBhbiBhcHBsaWNhdGlvbiBxdWVyeSBhIHRydXN0ZWQKLUFuZHJvaWQgTWFya2V0IGxpY2Vuc2luZyBzZXJ2ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGlzIGxpY2Vuc2VkIHRvIHRoZSBjdXJyZW50Ci1kZXZpY2UgdXNlci4gVGhlIGxpY2Vuc2luZyBzZXJ2aWNlIGlzIGJhc2VkIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBBbmRyb2lkIE1hcmtldCBsaWNlbnNpbmcgc2VydmVyCi10byBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgbGljZW5zZWQgdG8gdXNlIGEgZ2l2ZW4gYXBwbGljYXRpb24uIEFuZHJvaWQgTWFya2V0IGNvbnNpZGVycyBhCis8cD5Hb29nbGUgUGxheSBMaWNlbnNpbmcgaXMgYSBuZXR3b3JrLWJhc2VkIHNlcnZpY2UgdGhhdCBsZXRzIGFuIGFwcGxpY2F0aW9uIHF1ZXJ5IGEgdHJ1c3RlZAorR29vZ2xlIFBsYXkgbGljZW5zaW5nIHNlcnZlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgYXBwbGljYXRpb24gaXMgbGljZW5zZWQgdG8gdGhlIGN1cnJlbnQKK2RldmljZSB1c2VyLiBUaGUgbGljZW5zaW5nIHNlcnZpY2UgaXMgYmFzZWQgb24gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIEdvb2dsZSBQbGF5IGxpY2Vuc2luZyBzZXJ2ZXIKK3RvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBsaWNlbnNlZCB0byB1c2UgYSBnaXZlbiBhcHBsaWNhdGlvbi4gR29vZ2xlIFBsYXkgY29uc2lkZXJzIGEKIHVzZXIgdG8gYmUgbGljZW5zZWQgaWYgdGhlIHVzZXIgaXMgYSByZWNvcmRlZCBwdXJjaGFzZXIgb2YgdGhlIGFwcGxpY2F0aW9uLjwvcD4KIAogPHA+VGhlIHJlcXVlc3Qgc3RhcnRzIHdoZW4geW91ciBhcHBsaWNhdGlvbiBtYWtlcyBhIHJlcXVlc3QgdG8gYSBzZXJ2aWNlIGhvc3RlZCBieQotdGhlIEFuZHJvaWQgTWFya2V0IGNsaWVudCBhcHBsaWNhdGlvbi4gVGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHRoZW4gc2VuZHMgYSByZXF1ZXN0IHRvCi10aGUgbGljZW5zaW5nIHNlcnZlciBhbmQgcmVjZWl2ZXMgdGhlIHJlc3VsdC4gVGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHNlbmRzCit0aGUgR29vZ2xlIFBsYXkgY2xpZW50IGFwcGxpY2F0aW9uLiBUaGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gdGhlbiBzZW5kcyBhIHJlcXVlc3QgdG8KK3RoZSBsaWNlbnNpbmcgc2VydmVyIGFuZCByZWNlaXZlcyB0aGUgcmVzdWx0LiBUaGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gc2VuZHMKIHRoZSByZXN1bHQgdG8geW91ciBhcHBsaWNhdGlvbiwgd2hpY2ggY2FuIGFsbG93IG9yIGRpc2FsbG93IGZ1cnRoZXIgdXNlIG9mIHRoZQogYXBwbGljYXRpb24gYXMgbmVlZGVkLjwvcD4KIAotPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgYSBwYWlkIGFwcGxpY2F0aW9uIGhhcyBiZWVuIHVwbG9hZGVkIHRvIEFuZHJvaWQgTWFya2V0IGJ1dAorPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgYSBwYWlkIGFwcGxpY2F0aW9uIGhhcyBiZWVuIHVwbG9hZGVkIHRvIEdvb2dsZSBQbGF5IGJ1dAogc2F2ZWQgb25seSBhcyBhIGRyYWZ0IGFwcGxpY2F0aW9uICh0aGUgYXBwIGlzIHVucHVibGlzaGVkKSwgdGhlIGxpY2Vuc2luZyBzZXJ2ZXIgY29uc2lkZXJzIGFsbCB1c2VycwogdG8gYmUgbGljZW5zZWQgdXNlcnMgb2YgdGhlIGFwcGxpY2F0aW9uIChiZWNhdXNlIGl0J3Mgbm90IGV2ZW4gcG9zc2libGUgdG8gcHVyY2hhc2UgdGhlIGFwcCkuCiBUaGlzIGV4Y2VwdGlvbiBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgZm9yIHlvdSB0byBwZXJmb3JtIHRlc3Rpbmcgb2YgeW91ciBsaWNlbnNpbmcKQEAgLTQ4LDM5ICs0OCwzOSBAQAogPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0id2lkdGg6NDY5cHgiPgogPGltZyBzcmM9IntAZG9jUm9vdH1pbWFnZXMvbGljZW5zaW5nX2FyY2gucG5nIiBhbHQ9IiIvPgogPHAgY2xhc3M9ImltZy1jYXB0aW9uIj48c3Ryb25nPkZpZ3VyZSAxLjwvc3Ryb25nPiBZb3VyIGFwcGxpY2F0aW9uIGluaXRpYXRlcyBhCi1saWNlbnNlIGNoZWNrIHRocm91Z2ggdGhlIExpY2Vuc2UgVmVyaWZpY2F0aW9uIExpYnJhcnkgYW5kIHRoZSBBbmRyb2lkIE1hcmtldAotY2xpZW50LCB3aGljaCBoYW5kbGVzIGNvbW11bmljYXRpb24gd2l0aCB0aGUgTWFya2V0IHNlcnZlci48L3A+CitsaWNlbnNlIGNoZWNrIHRocm91Z2ggdGhlIExpY2Vuc2UgVmVyaWZpY2F0aW9uIExpYnJhcnkgYW5kIHRoZSBHb29nbGUgUGxheQorY2xpZW50LCB3aGljaCBoYW5kbGVzIGNvbW11bmljYXRpb24gd2l0aCB0aGUgR29vZ2xlIFBsYXkgc2VydmVyLjwvcD4KIDwvZGl2PgogCiAKIDxwPlRvIHByb3Blcmx5IGlkZW50aWZ5IHRoZSB1c2VyIGFuZCBkZXRlcm1pbmUgdGhlIGxpY2Vuc2Ugc3RhdHVzLCB0aGUgbGljZW5zaW5nIHNlcnZlciByZXF1aXJlcwotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFwcGxpY2F0aW9uIGFuZCB1c2VyJm1kYXNoO3lvdXIgYXBwbGljYXRpb24gYW5kIHRoZSBBbmRyb2lkIE1hcmtldCBjbGllbnQgd29yawotdG9nZXRoZXIgdG8gYXNzZW1ibGUgdGhlIGluZm9ybWF0aW9uIGFuZCB0aGUgQW5kcm9pZCBNYXJrZXQgY2xpZW50IHBhc3NlcyBpdCB0byB0aGUgc2VydmVyLiA8L3A+CitpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXBwbGljYXRpb24gYW5kIHVzZXImbWRhc2g7eW91ciBhcHBsaWNhdGlvbiBhbmQgdGhlIEdvb2dsZSBQbGF5IGNsaWVudCB3b3JrCit0b2dldGhlciB0byBhc3NlbWJsZSB0aGUgaW5mb3JtYXRpb24gYW5kIHRoZSBHb29nbGUgUGxheSBjbGllbnQgcGFzc2VzIGl0IHRvIHRoZSBzZXJ2ZXIuIDwvcD4KIAogPHA+VG8gaGVscCB5b3UgYWRkIGxpY2Vuc2luZyB0byB5b3VyIGFwcGxpY2F0aW9uLCB0aGUgQW5kcm9pZCBTREsgcHJvdmlkZXMgYSBkb3dubG9hZGFibGUgc2V0IG9mCi1saWJyYXJ5IHNvdXJjZXMgdGhhdCB5b3UgY2FuIGluY2x1ZGUgaW4geW91ciBhcHBsaWNhdGlvbiBwcm9qZWN0OiB0aGUgIkdvb2dsZSBNYXJrZXQgQmlsbGluZworbGlicmFyeSBzb3VyY2VzIHRoYXQgeW91IGNhbiBpbmNsdWRlIGluIHlvdXIgYXBwbGljYXRpb24gcHJvamVjdDogdGhlICJHb29nbGUgTWFya2V0IExpY2Vuc2luZwogcGFja2FnZS4iIFRoZSBMaWNlbnNlIFZlcmlmaWNhdGlvbiBMaWJyYXJ5IChMVkwpIGlzIGEgbGlicmFyeSB5b3UgY2FuIGFkZCB0byB5b3VyIGFwcGxpY2F0aW9uIHRoYXQKLWhhbmRsZXMgYWxsIG9mIHRoZSBsaWNlbnNpbmctcmVsYXRlZCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIEFuZHJvaWQgTWFya2V0IGxpY2Vuc2luZyBzZXJ2aWNlLiBXaXRoCitoYW5kbGVzIGFsbCBvZiB0aGUgbGljZW5zaW5nLXJlbGF0ZWQgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBHb29nbGUgUGxheSBsaWNlbnNpbmcgc2VydmljZS4gV2l0aAogdGhlIExWTCBhZGRlZCB0byB5b3VyIGFwcGxpY2F0aW9uLCB5b3VyIGFwcGxpY2F0aW9uIGNhbiBkZXRlcm1pbmUgaXRzIGxpY2Vuc2luZyBzdGF0dXMgZm9yIHRoZQogY3VycmVudCB1c2VyIGJ5IHNpbXBseSBjYWxsaW5nIGEgbWV0aG9kIGFuZCBpbXBsZW1lbnRpbmcgYSBjYWxsYmFjayB0aGF0IHJlY2VpdmVzIHRoZSBzdGF0dXMKIHJlc3BvbnNlLjwvcD4KIAogPHA+WW91ciBhcHBsaWNhdGlvbiBkb2VzIG5vdCBxdWVyeSB0aGUgbGljZW5zaW5nIHNlcnZlcgotZGlyZWN0bHksIGJ1dCBpbnN0ZWFkIGNhbGxzIHRoZSBBbmRyb2lkIE1hcmtldCBjbGllbnQgb3ZlciByZW1vdGUgSVBDIHRvCitkaXJlY3RseSwgYnV0IGluc3RlYWQgY2FsbHMgdGhlIEdvb2dsZSBQbGF5IGNsaWVudCBvdmVyIHJlbW90ZSBJUEMgdG8KIGluaXRpYXRlIGEgbGljZW5zZSByZXF1ZXN0LiBJbiB0aGUgbGljZW5zZSByZXF1ZXN0OjwvcD4KIAogPHVsPgogPGxpPllvdXIgYXBwbGljYXRpb24gcHJvdmlkZXM6IGl0cyBwYWNrYWdlIG5hbWUsIGEgbm9uY2UgdGhhdCBpcyBsYXRlciB1c2VkIHRvCiB2YWxpZGF0ZSBhbnkgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLCBhbmQgYSBjYWxsYmFjayBvdmVyIHdoaWNoIHRoZQogcmVzcG9uc2UgY2FuIGJlIHJldHVybmVkIGFzeW5jaHJvbm91c2x5LjwvbGk+Ci08bGk+VGhlIEFuZHJvaWQgTWFya2V0IGNsaWVudCBjb2xsZWN0cyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIGFuZCB0aGUgZGV2aWNlLAorPGxpPlRoZSBHb29nbGUgUGxheSBjbGllbnQgY29sbGVjdHMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciBhbmQgdGhlIGRldmljZSwKIHN1Y2ggYXMgdGhlIGRldmljZSdzIHByaW1hcnkgR29vZ2xlIGFjY291bnQgdXNlcm5hbWUsIElNU0ksIGFuZCBvdGhlcgogaW5mb3JtYXRpb24uIEl0IHRoZW4gc2VuZHMgdGhlIGxpY2Vuc2UgY2hlY2sgcmVxdWVzdCB0byB0aGUgc2VydmVyIG9uIGJlaGFsZiBvZgogeW91ciBhcHBsaWNhdGlvbi48L2xpPgotPGxpPlRoZSBBbmRyb2lkIE1hcmtldCBzZXJ2ZXIgZXZhbHVhdGVzIHRoZSByZXF1ZXN0IHVzaW5nIGFsbCBhdmFpbGFibGUgaW5mb3JtYXRpb24sIGF0dGVtcHRpbmcKKzxsaT5UaGUgR29vZ2xlIFBsYXkgc2VydmVyIGV2YWx1YXRlcyB0aGUgcmVxdWVzdCB1c2luZyBhbGwgYXZhaWxhYmxlIGluZm9ybWF0aW9uLCBhdHRlbXB0aW5nCiB0byBlc3RhYmxpc2ggdGhlIHVzZXIncyBpZGVudGl0eSB0byBhIHN1ZmZpY2llbnQgbGV2ZWwgb2YgY29uZmlkZW5jZS4gVGhlIHNlcnZlcgogdGhlbiBjaGVja3MgdGhlIHVzZXIgaWRlbnRpdHkgYWdhaW5zdCBwdXJjaGFzZSByZWNvcmRzIGZvciB5b3VyIGFwcGxpY2F0aW9uIGFuZAotcmV0dXJucyBhIGxpY2Vuc2UgcmVzcG9uc2UsIHdoaWNoIHRoZSBBbmRyb2lkIE1hcmtldCBjbGllbnQgcmV0dXJucyB0byB5b3VyCityZXR1cm5zIGEgbGljZW5zZSByZXNwb25zZSwgd2hpY2ggdGhlIEdvb2dsZSBQbGF5IGNsaWVudCByZXR1cm5zIHRvIHlvdXIKIGFwcGxpY2F0aW9uIG92ZXIgdGhlIElQQyBjYWxsYmFjay48L2xpPgogPC91bD4KIApAQCAtOTcsNyArOTcsNyBAQAogPGgyIGlkPSJTZWN1cmUiPkxpY2Vuc2UgUmVzcG9uc2VzIGFyZSBTZWN1cmU8L2gyPgogCiA8cD5UbyBlbnN1cmUgdGhlIGludGVncml0eSBvZiBlYWNoIGxpY2Vuc2UgcXVlcnksIHRoZSBzZXJ2ZXIgc2lnbnMgdGhlIGxpY2Vuc2UKLXJlc3BvbnNlIGRhdGEgdXNpbmcgYW4gUlNBIGtleSBwYWlyIHRoYXQgaXMgc2hhcmVkIGV4Y2x1c2l2ZWx5IGJldHdlZW4gdGhlIEFuZHJvaWQgTWFya2V0CityZXNwb25zZSBkYXRhIHVzaW5nIGFuIFJTQSBrZXkgcGFpciB0aGF0IGlzIHNoYXJlZCBleGNsdXNpdmVseSBiZXR3ZWVuIHRoZSBHb29nbGUgUGxheQogc2VydmVyIGFuZCB5b3UuPC9wPgogCiA8cD5UaGUgbGljZW5zaW5nIHNlcnZpY2UgZ2VuZXJhdGVzIGEgc2luZ2xlIGxpY2Vuc2luZyBrZXkgcGFpciBmb3IgZWFjaApAQCAtMTIwLDcgKzEyMCw3IEBACiB3aGljaCBpbmNsdWRlcyB0aGUgTGljZW5zZSBWZXJpZmljYXRpb24gTGlicmFyeSAoTFZMKS4gVGhlIExWTCBncmVhdGx5IHNpbXBsaWZpZXMgdGhlIHByb2Nlc3Mgb2YKIGFkZGluZyBsaWNlbnNpbmcgdG8geW91ciBhcHBsaWNhdGlvbiBhbmQgaGVscHMgZW5zdXJlIGEgbW9yZSBzZWN1cmUsIHJvYnVzdCBpbXBsZW1lbnRhdGlvbiBmb3IgeW91cgogYXBwbGljYXRpb24uIFRoZSBMVkwgcHJvdmlkZXMgaW50ZXJuYWwgY2xhc3NlcyB0aGF0IGhhbmRsZSBtb3N0IG9mIHRoZSBzdGFuZGFyZCBvcGVyYXRpb25zIG9mIGEKLWxpY2Vuc2UgcXVlcnksIHN1Y2ggYXMgY29udGFjdGluZyB0aGUgQW5kcm9pZCBNYXJrZXQgY2xpZW50IHRvIGluaXRpYXRlIGEgbGljZW5zZSByZXF1ZXN0IGFuZAorbGljZW5zZSBxdWVyeSwgc3VjaCBhcyBjb250YWN0aW5nIHRoZSBHb29nbGUgUGxheSBjbGllbnQgdG8gaW5pdGlhdGUgYSBsaWNlbnNlIHJlcXVlc3QgYW5kCiB2ZXJpZnlpbmcgYW5kIHZhbGlkYXRpbmcgdGhlIHJlc3BvbnNlcy4gSXQgYWxzbyBleHBvc2VzIGludGVyZmFjZXMgdGhhdCBsZXQgeW91IGVhc2lseSBwbHVnIGluIHlvdXIKIGN1c3RvbSBjb2RlIGZvciBkZWZpbmluZyBsaWNlbnNpbmcgcG9saWN5IGFuZCBtYW5hZ2luZyBhY2Nlc3MgYXMgbmVlZGVkIGJ5IHlvdXIgYXBwbGljYXRpb24uIFRoZSBrZXkKIExWTCBpbnRlcmZhY2VzIGFyZTogPC9wPgpAQCAtMTc5LDE3ICsxNzksMTcgQEAKIAogPGgyIGlkPSJSZXFzIj5SZXF1aXJlbWVudHMgYW5kIExpbWl0YXRpb25zPC9oMj4KIAotPHA+QW5kcm9pZCBNYXJrZXQgTGljZW5zaW5nIGlzIGRlc2lnbmVkIHRvIGxldCB5b3UgYXBwbHkgbGljZW5zZSBjb250cm9scyB0bwotYXBwbGljYXRpb25zIHRoYXQgeW91IHB1Ymxpc2ggdGhyb3VnaCBBbmRyb2lkIE1hcmtldC4gVGhlIHNlcnZpY2UgaXMgbm90Cis8cD5Hb29nbGUgUGxheSBMaWNlbnNpbmcgaXMgZGVzaWduZWQgdG8gbGV0IHlvdSBhcHBseSBsaWNlbnNlIGNvbnRyb2xzIHRvCithcHBsaWNhdGlvbnMgdGhhdCB5b3UgcHVibGlzaCB0aHJvdWdoIEdvb2dsZSBQbGF5LiBUaGUgc2VydmljZSBpcyBub3QKIGRlc2lnbmVkIHRvIGxldCB5b3UgY29udHJvbCBhY2Nlc3MgdG8gYXBwbGljYXRpb25zIHRoYXQgYXJlIG5vdCBwdWJsaXNoZWQKLXRocm91Z2ggQW5kcm9pZCBNYXJrZXQgb3IgdGhhdCBhcmUgcnVuIG9uIGRldmljZXMgdGhhdCBkbyBub3Qgb2ZmZXIgdGhlIEFuZHJvaWQKLU1hcmtldCBjbGllbnQuIDwvcD4KK3Rocm91Z2ggR29vZ2xlIFBsYXkgb3IgdGhhdCBhcmUgcnVuIG9uIGRldmljZXMgdGhhdCBkbyBub3Qgb2ZmZXIgdGhlIEdvb2dsZQorUGxheSBjbGllbnQuIDwvcD4KIAogPHA+SGVyZSBhcmUgc29tZSBwb2ludHMgdG8ga2VlcCBpbiBtaW5kIGFzIHlvdSBpbXBsZW1lbnQgbGljZW5zaW5nIGluIHlvdXIKIGFwcGxpY2F0aW9uOiA8L3A+CiAKIDx1bD4KLTxsaT5BbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoZSBzZXJ2aWNlIG9ubHkgaWYgdGhlIEFuZHJvaWQgTWFya2V0IGNsaWVudCBpcworPGxpPkFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhlIHNlcnZpY2Ugb25seSBpZiB0aGUgR29vZ2xlIFBsYXkgY2xpZW50IGlzCiBpbnN0YWxsZWQgb24gaXRzIGhvc3QgZGV2aWNlIGFuZCB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZCAxLjUgKEFQSSBsZXZlbCAzKQogb3IgaGlnaGVyLjwvbGk+CiA8bGk+VG8gY29tcGxldGUgYSBsaWNlbnNlIGNoZWNrLCB0aGUgbGljZW5zaW5nIHNlcnZlciBtdXN0IGJlIGFjY2Vzc2libGUgb3ZlcgpAQCAtMjAyLDcgKzIwMiw3IEBACiBwcmFjdGljZXMgaW4gdGhlIGZvbGxvd2luZyBkb2N1bWVudHMsIHlvdSBjYW4gaGVscCBlbnN1cmUgdGhhdCB5b3VyIGltcGxlbWVudGF0aW9uIHdpbGwgYmUKIHNlY3VyZS48L2xpPgogPGxpPkFkZGluZyBsaWNlbnNpbmcgdG8gYW4gYXBwbGljYXRpb24gZG9lcyBub3QgYWZmZWN0IHRoZSB3YXkgdGhlIGFwcGxpY2F0aW9uCi1mdW5jdGlvbnMgd2hlbiBydW4gb24gYSBkZXZpY2UgdGhhdCBkb2VzIG5vdCBvZmZlciBBbmRyb2lkIE1hcmtldC48L2xpPgorZnVuY3Rpb25zIHdoZW4gcnVuIG9uIGEgZGV2aWNlIHRoYXQgZG9lcyBub3Qgb2ZmZXIgR29vZ2xlIFBsYXkuPC9saT4KIDxsaT5Zb3UgY2FuIGltcGxlbWVudCBsaWNlbnNpbmcgY29udHJvbHMgZm9yIGEgZnJlZSBhcHAsIGJ1dCBvbmx5IGlmIHlvdSdyZSB1c2luZyB0aGUgc2VydmljZSB0byAKIHByb3ZpZGUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvZXhwYW5zaW9uLWZpbGVzLmh0bWwiPkFQSyBleHBhbnNpb24gZmlsZXM8L2E+LjwvbGk+CkBAIC0yMTIsMjAgKzIxMiwyMCBAQAogCiA8aDIgaWQ9IkNvcHlQcm90ZWN0aW9uIj5SZXBsYWNlbWVudCBmb3IgQ29weSBQcm90ZWN0aW9uPC9oMj4KIAotPHA+QW5kcm9pZCBNYXJrZXQgTGljZW5zaW5nIGlzIGEgZmxleGlibGUsIHNlY3VyZSBtZWNoYW5pc20gZm9yIGNvbnRyb2xsaW5nCis8cD5Hb29nbGUgUGxheSBMaWNlbnNpbmcgaXMgYSBmbGV4aWJsZSwgc2VjdXJlIG1lY2hhbmlzbSBmb3IgY29udHJvbGxpbmcKIGFjY2VzcyB0byB5b3VyIGFwcGxpY2F0aW9ucy4gSXQgZWZmZWN0aXZlbHkgcmVwbGFjZXMgdGhlIENvcHkgUHJvdGVjdGlvbgotbWVjaGFuaXNtIG9mZmVyZWQgb24gQW5kcm9pZCBNYXJrZXQgYW5kIGdpdmVzIHlvdSB3aWRlciBkaXN0cmlidXRpb24KK21lY2hhbmlzbSBvZmZlcmVkIG9uIEdvb2dsZSBQbGF5IGFuZCBnaXZlcyB5b3Ugd2lkZXIgZGlzdHJpYnV0aW9uCiBwb3RlbnRpYWwgZm9yIHlvdXIgYXBwbGljYXRpb25zLiA8L3A+CiAKIDx1bD4KLTxsaT5BIGxpbWl0YXRpb24gb2YgdGhlIGxlZ2FjeSBDb3B5IFByb3RlY3Rpb24gbWVjaGFuaXNtIG9uIEFuZHJvaWQgTWFya2V0IGlzCis8bGk+QSBsaW1pdGF0aW9uIG9mIHRoZSBsZWdhY3kgQ29weSBQcm90ZWN0aW9uIG1lY2hhbmlzbSBvbiBHb29nbGUgUGxheSBpcwogdGhhdCBhcHBsaWNhdGlvbnMgdXNpbmcgaXQgY2FuIGJlIGluc3RhbGxlZCBvbmx5IG9uIGNvbXBhdGlibGUgZGV2aWNlcyB0aGF0CiBwcm92aWRlIGEgc2VjdXJlIGludGVybmFsIHN0b3JhZ2UgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLCBhIGNvcHktcHJvdGVjdGVkCi1hcHBsaWNhdGlvbiBjYW5ub3QgYmUgZG93bmxvYWRlZCBmcm9tIE1hcmtldCB0byBhIGRldmljZSB0aGF0IHByb3ZpZGVzIHJvb3QKK2FwcGxpY2F0aW9uIGNhbm5vdCBiZSBkb3dubG9hZGVkIGZyb20gR29vZ2xlIFBsYXkgdG8gYSBkZXZpY2UgdGhhdCBwcm92aWRlcyByb290CiBhY2Nlc3MsIGFuZCB0aGUgYXBwbGljYXRpb24gY2Fubm90IGJlIGluc3RhbGxlZCB0byBhIGRldmljZSdzIFNEIGNhcmQuIDwvbGk+Ci08bGk+V2l0aCBBbmRyb2lkIE1hcmtldCBsaWNlbnNpbmcsIHlvdSBjYW4gbW92ZSB0byBhIGxpY2Vuc2UtYmFzZWQgbW9kZWwgaW4KKzxsaT5XaXRoIEdvb2dsZSBQbGF5IGxpY2Vuc2luZywgeW91IGNhbiBtb3ZlIHRvIGEgbGljZW5zZS1iYXNlZCBtb2RlbCBpbgogd2hpY2ggYWNjZXNzIGlzIG5vdCBib3VuZCB0byB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBob3N0IGRldmljZSwgYnV0IHRvIHlvdXIKLXB1Ymxpc2hlciBhY2NvdW50IG9uIEFuZHJvaWQgTWFya2V0IGFuZCB0aGUgbGljZW5zaW5nIHBvbGljeSB0aGF0IHlvdSBkZWZpbmUuCitwdWJsaXNoZXIgYWNjb3VudCBvbiBHb29nbGUgUGxheSBhbmQgdGhlIGxpY2Vuc2luZyBwb2xpY3kgdGhhdCB5b3UgZGVmaW5lLgogWW91ciBhcHBsaWNhdGlvbiBjYW4gYmUgaW5zdGFsbGVkIGFuZCBjb250cm9sbGVkIG9uIGFueSBjb21wYXRpYmxlIGRldmljZSBvbgogYW55IHN0b3JhZ2UsIGluY2x1ZGluZyBTRCBjYXJkLjwvbGk+CiA8L3VsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvc2V0dGluZy11cC5qZCBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL3NldHRpbmctdXAuamQKaW5kZXggYzc5ZjkwYi4uMTUyMTRkMSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvc2V0dGluZy11cC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9zZXR0aW5nLXVwLmpkCkBAIC0zMSwyNyArMzEsMjcgQEAKIDwvZGl2PgogPC9kaXY+CiAKLTxwPkJlZm9yZSB5b3Ugc3RhcnQgYWRkaW5nIGxpY2Vuc2UgdmVyaWZpY2F0aW9uIHRvIHlvdXIgYXBwbGljYXRpb24sIHlvdSBuZWVkIHRvIHNldCB1cCB5b3VyIEFuZHJvaWQKLU1hcmtldCBwdWJsaXNoaW5nIGFjY291bnQsIHlvdXIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGFuZCB0ZXN0IGFjY291bnRzIHJlcXVpcmVkIHRvIHZlcmlmeQorPHA+QmVmb3JlIHlvdSBzdGFydCBhZGRpbmcgbGljZW5zZSB2ZXJpZmljYXRpb24gdG8geW91ciBhcHBsaWNhdGlvbiwgeW91IG5lZWQgdG8gc2V0IHVwIHlvdXIgR29vZ2xlCitQbGF5IHB1Ymxpc2hpbmcgYWNjb3VudCwgeW91ciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgYW5kIHRlc3QgYWNjb3VudHMgcmVxdWlyZWQgdG8gdmVyaWZ5CiB5b3VyIGltcGxlbWVudGF0aW9uLjwvcD4KIAogCiA8aDIgaWQ9ImFjY291bnQiPlNldHRpbmcgVXAgYSBQdWJsaXNoZXIgQWNjb3VudDwvaDI+CiAKLTxwPklmIHlvdSBkb24ndCBhbHJlYWR5IGhhdmUgYSBwdWJsaXNoZXIgYWNjb3VudCBmb3IgQW5kcm9pZCBNYXJrZXQsIHlvdSBuZWVkIHRvIHJlZ2lzdGVyIGZvciBvbmUKLXVzaW5nIHlvdXIgR29vZ2xlIGFjY291bnQgYW5kIGFncmVlIHRvIHRoZSB0ZXJtcyBvZiBzZXJ2aWNlIG9uIHRoZSBBbmRyb2lkIE1hcmtldCBwdWJsaXNoZXIgc2l0ZTo8L3A+Cis8cD5JZiB5b3UgZG9uJ3QgYWxyZWFkeSBoYXZlIGEgcHVibGlzaGVyIGFjY291bnQgZm9yIEdvb2dsZSBQbGF5LCB5b3UgbmVlZCB0byByZWdpc3RlciBmb3Igb25lCit1c2luZyB5b3VyIEdvb2dsZSBhY2NvdW50IGFuZCBhZ3JlZSB0byB0aGUgdGVybXMgb2Ygc2VydmljZSBvbiB0aGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGU6PC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLWxlZnQ6MmVtOyI+PGEKLWhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaCI+aHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9wdWJsaXNoPC9hPgoraHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2giPmh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoPC9hPgogPC9wPgogCiA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPlB1Ymxpc2hpbmcgb24gQW5kcm9pZCBNYXJrZXQ8L2E+LjwvcD4KK2hyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCI+UHVibGlzaGluZyBvbiBHb29nbGUgUGxheTwvYT4uPC9wPgogCi08cD5JZiB5b3UgYWxyZWFkeSBoYXZlIGEgcHVibGlzaGVyIGFjY291bnQgb24gQW5kcm9pZCBNYXJrZXQsIHVzZSB5b3VyIGV4aXN0aW5nCis8cD5JZiB5b3UgYWxyZWFkeSBoYXZlIGEgcHVibGlzaGVyIGFjY291bnQgb24gR29vZ2xlIFBsYXksIHVzZSB5b3VyIGV4aXN0aW5nCiBhY2NvdW50IHRvIHNldCB1cCBsaWNlbnNpbmcuPC9wPgogCi08cD5Vc2luZyB5b3VyIHB1Ymxpc2hlciBhY2NvdW50IG9uIEFuZHJvaWQgTWFya2V0LCB5b3UgY2FuOjwvcD4KKzxwPlVzaW5nIHlvdXIgcHVibGlzaGVyIGFjY291bnQgb24gR29vZ2xlIFBsYXksIHlvdSBjYW46PC9wPgogCiA8dWw+CiA8bGk+T2J0YWluIGEgcHVibGljIGtleSBmb3IgbGljZW5zaW5nPC9saT4KQEAgLTYzLDcgKzYzLDcgQEAKIDxoND5BZG1pbmlzdHJhdGl2ZSBzZXR0aW5ncyBmb3IgbGljZW5zaW5nPC9oND4KIAogPHA+WW91IGNhbiBtYW5hZ2Ugc2V2ZXJhbAotYWRtaW5pc3RyYXRpdmUgY29udHJvbHMgZm9yIEFuZHJvaWQgTWFya2V0IGxpY2Vuc2luZyBvbiB0aGUgcHVibGlzaGVyIHNpdGUuIFRoZSBjb250cm9scyBhcmUgYXZhaWxhYmxlCithZG1pbmlzdHJhdGl2ZSBjb250cm9scyBmb3IgR29vZ2xlIFBsYXkgbGljZW5zaW5nIG9uIHRoZSBwdWJsaXNoZXIgc2l0ZS4gVGhlIGNvbnRyb2xzIGFyZSBhdmFpbGFibGUKIGluIHRoZSBFZGl0IFByb2ZpbGUgcGFnZSwgaW4gdGhlICJMaWNlbnNpbmciIHBhbmVsLCBzaG93biBpbiBmaWd1cmUgMS4gVGhlIGNvbnRyb2xzCiBsZXQgeW91OiA8L3A+CiAKQEAgLTExNCwxNyArMTE0LDE3IEBACiAKIDxwPkFzIGRlc2NyaWJlZCBlYXJsaWVyLCBhcHBsaWNhdGlvbnMgY2hlY2sgbGljZW5zaW5nIHN0YXR1cyBub3QgYnkgY29udGFjdGluZwogdGhlIGxpY2Vuc2luZyBzZXJ2ZXIgZGlyZWN0bHksIGJ1dCBieSBiaW5kaW5nIHRvIGEgc2VydmljZSBwcm92aWRlZCBieSB0aGUKLUFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIGFuZCBpbml0aWF0aW5nIGEgbGljZW5zZSBjaGVjayByZXF1ZXN0LiBUaGUgQW5kcm9pZAotTWFya2V0IHNlcnZpY2UgdGhlbiBoYW5kbGVzIHRoZSBkaXJlY3QgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBsaWNlbnNpbmcgc2VydmVyCitHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBhbmQgaW5pdGlhdGluZyBhIGxpY2Vuc2UgY2hlY2sgcmVxdWVzdC4gVGhlIEdvb2dsZQorUGxheSBzZXJ2aWNlIHRoZW4gaGFuZGxlcyB0aGUgZGlyZWN0IGNvbW11bmljYXRpb24gd2l0aCB0aGUgbGljZW5zaW5nIHNlcnZlcgogYW5kIGZpbmFsbHkgcm91dGVzIHRoZSByZXNwb25zZSBiYWNrIHRvIHlvdXIgYXBwbGljYXRpb24uIFRvIGRlYnVnIGFuZCB0ZXN0CiBsaWNlbnNpbmcgaW4geW91ciBhcHBsaWNhdGlvbiwgeW91IG5lZWQgdG8gc2V0IHVwIGEgcnVudGltZSBlbnZpcm9ubWVudCB0aGF0Ci1pbmNsdWRlcyB0aGUgbmVjZXNzYXJ5IEFuZHJvaWQgTWFya2V0IHNlcnZpY2UsIHNvIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBpcyBhYmxlCitpbmNsdWRlcyB0aGUgbmVjZXNzYXJ5IEdvb2dsZSBQbGF5IHNlcnZpY2UsIHNvIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBpcyBhYmxlCiB0byBzZW5kIGxpY2Vuc2UgY2hlY2sgcmVxdWVzdHMgdG8gdGhlIGxpY2Vuc2luZyBzZXJ2ZXIuIDwvcD4KIAogPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiBydW50aW1lIGVudmlyb25tZW50IHRoYXQgeW91IGNhbiB1c2U6IDwvcD4KIAogPHVsPgotPGxpPkFuIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2UgdGhhdCBpbmNsdWRlcyB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24sIG9yPC9saT4KKzxsaT5BbiBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlIHRoYXQgaW5jbHVkZXMgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uLCBvcjwvbGk+CiA8bGk+QW4gQW5kcm9pZCBlbXVsYXRvciBydW5uaW5nIHRoZSBHb29nbGUgQVBJcyBBZGQtb24sIEFQSSBsZXZlbCA4IChyZWxlYXNlIDIpCiBvciBoaWdoZXI8L2xpPgogPC91bD4KQEAgLTEzNywxMiArMTM3LDEyIEBACiA8dWw+CiA8bGk+UnVuIGEgY29tcGF0aWJsZSB2ZXJzaW9uIG9mIEFuZHJvaWQgMS41IG9yIGxhdGVyIChBUEkgbGV2ZWwKIDMgb3IgaGlnaGVyKSBwbGF0Zm9ybSwgPGVtPmFuZDwvZW0+IDwvbGk+Ci08bGk+UnVuIGEgc3lzdGVtIGltYWdlIG9uIHdoaWNoIHRoZSBBbmRyb2lkIE1hcmtldCBjbGllbnQgYXBwbGljYXRpb24KKzxsaT5SdW4gYSBzeXN0ZW0gaW1hZ2Ugb24gd2hpY2ggdGhlIEdvb2dsZSBQbGF5IGNsaWVudCBhcHBsaWNhdGlvbgogaXMgcHJlaW5zdGFsbGVkLiA8L2xpPgogPC91bD4KIAotPHA+SWYgQW5kcm9pZCBNYXJrZXQgaXMgbm90IHByZWluc3RhbGxlZCBpbiB0aGUgc3lzdGVtIGltYWdlLCB5b3VyIGFwcGxpY2F0aW9uIHdvbid0Ci1iZSBhYmxlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIEFuZHJvaWQgTWFya2V0IGxpY2Vuc2luZyBzZXJ2ZXIuIDwvcD4KKzxwPklmIEdvb2dsZSBQbGF5IGlzIG5vdCBwcmVpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBpbWFnZSwgeW91ciBhcHBsaWNhdGlvbiB3b24ndAorYmUgYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBHb29nbGUgUGxheSBsaWNlbnNpbmcgc2VydmVyLiA8L3A+CiAKIDxwPkZvciBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBzZXQgdXAgYSBkZXZpY2UgZm9yIHVzZSBpbiBkZXZlbG9waW5nCiBBbmRyb2lkIGFwcGxpY2F0aW9ucywgc2VlIDxhCkBAIC0xNTQsMTYgKzE1NCwxNiBAQAogbGljZW5zaW5nLjwvcD4KIAogPHA+QmVjYXVzZSB0aGUgQW5kcm9pZCBwbGF0Zm9ybXMgcHJvdmlkZWQgaW4gdGhlIEFuZHJvaWQgU0RLIDxlbT5kbwotbm90PC9lbT4gaW5jbHVkZSBBbmRyb2lkIE1hcmtldCwgeW91IG5lZWQgdG8gZG93bmxvYWQgdGhlIEdvb2dsZSBBUElzIEFkZC1Pbgorbm90PC9lbT4gaW5jbHVkZSBHb29nbGUgUGxheSwgeW91IG5lZWQgdG8gZG93bmxvYWQgdGhlIEdvb2dsZSBBUElzIEFkZC1PbgogcGxhdGZvcm0sIEFQSSBsZXZlbCA4IChvciBoaWdoZXIpLCBmcm9tIHRoZSBTREsgcmVwb3NpdG9yeS4gQWZ0ZXIgZG93bmxvYWRpbmcKIHRoZSBhZGQtb24sIHlvdSBuZWVkIHRvIGNyZWF0ZSBhbiBBVkQgY29uZmlndXJhdGlvbiB0aGF0IHVzZXMgdGhhdCBzeXN0ZW0gaW1hZ2UuCiA8L3A+CiAKLTxwPlRoZSBHb29nbGUgQVBJcyBBZGQtT24gZG9lcyBub3QgaW5jbHVkZSB0aGUgZnVsbCBBbmRyb2lkIE1hcmtldCBjbGllbnQuCis8cD5UaGUgR29vZ2xlIEFQSXMgQWRkLU9uIGRvZXMgbm90IGluY2x1ZGUgdGhlIGZ1bGwgR29vZ2xlIFBsYXkgY2xpZW50LgogSG93ZXZlciwgaXQgZG9lcyBwcm92aWRlOiA8L3A+CiAKIDx1bD4KLTxsaT5BbiBBbmRyb2lkIE1hcmtldCBiYWNrZ3JvdW5kIHNlcnZpY2UgdGhhdCBpbXBsZW1lbnRzIHRoZQorPGxpPkFuIEdvb2dsZSBQbGF5IGJhY2tncm91bmQgc2VydmljZSB0aGF0IGltcGxlbWVudHMgdGhlCiA8Y29kZT5JTGljZW5zaW5nU2VydmljZTwvY29kZT4gcmVtb3RlIGludGVyZmFjZSwgc28gdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGNhbgogc2VuZCBsaWNlbnNlIGNoZWNrcyBvdmVyIHRoZSBuZXR3b3JrIHRvIHRoZSBsaWNlbnNpbmcgc2VydmVyLiA8L2xpPgogPGxpPkEgc2V0IG9mIHVuZGVybHlpbmcgYWNjb3VudCBzZXJ2aWNlcyB0aGF0IGxldCB5b3UgYWRkIGFuIGEgR29vZ2xlIGFjY291bnQgb24KQEAgLTE3NCw4ICsxNzQsOCBAQAogPC91bD4KIAogPHA+U2V2ZXJhbCB2ZXJzaW9ucyBvZiB0aGUgYWRkLW9uIGFyZSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgU0RLIE1hbmFnZXIsIGJ1dCBvbmx5Ci08c3Ryb25nPkdvb2dsZSBBUElzIEFkZC1PbiwgQVBJIDggKHJlbGVhc2UgMikgb3IgaGlnaGVyPC9zdHJvbmc+IGluY2x1ZGVzIHRoZSBuZWNlc3NhcnkgQW5kcm9pZAotTWFya2V0IHNlcnZpY2VzLjwvcD4KKzxzdHJvbmc+R29vZ2xlIEFQSXMgQWRkLU9uLCBBUEkgOCAocmVsZWFzZSAyKSBvciBoaWdoZXI8L3N0cm9uZz4gaW5jbHVkZXMgdGhlIG5lY2Vzc2FyeSBHb29nbGUKK1BsYXkgc2VydmljZXMuPC9wPgogCiAKIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2xpY2Vuc2luZ19nYXBpc184LnBuZyIgYWx0PSIiLz4KQEAgLTI1NiwxMSArMjU2LDExIEBACiAKIDxwPlRvIGRvd25sb2FkIHRoZSBMVkwgY29tcG9uZW50IGludG8geW91ciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgdXNlIHRoZQogQW5kcm9pZCBTREsgTWFuYWdlci4gTGF1bmNoIHRoZSBBbmRyb2lkIFNESyBNYW5hZ2VyIGFuZCB0aGVuCi1zZWxlY3QgdGhlICJNYXJrZXQgTGljZW5zaW5nIiBjb21wb25lbnQsIGFzIHNob3duIGluIGZpZ3VyZSAzLgorc2VsZWN0IHRoZSAiR29vZ2xlIE1hcmtldCBMaWNlbnNpbmciIGNvbXBvbmVudCwgYXMgc2hvd24gaW4gZmlndXJlIDMuCiBBY2NlcHQgdGhlIHRlcm1zIGFuZCBjbGljayA8c3Ryb25nPkluc3RhbGwgU2VsZWN0ZWQ8L3N0cm9uZz4gdG8gYmVnaW4gdGhlIGRvd25sb2FkLiA8L3A+CiAKIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2xpY2Vuc2luZ19wYWNrYWdlLnBuZyIgYWx0PSIiLz4KLTxwIGNsYXNzPSJpbWctY2FwdGlvbiI+PHN0cm9uZz5GaWd1cmUgMy48L3N0cm9uZz4gVGhlIE1hcmtldCBMaWNlbnNpbmcgcGFja2FnZSBjb250YWlucyB0aGUgTFZMIGFuZAorPHAgY2xhc3M9ImltZy1jYXB0aW9uIj48c3Ryb25nPkZpZ3VyZSAzLjwvc3Ryb25nPiBUaGUgTGljZW5zaW5nIHBhY2thZ2UgY29udGFpbnMgdGhlIExWTCBhbmQKIHRoZSBMVkwgc2FtcGxlIGFwcGxpY2F0aW9uLjwvcD4KIAogPHA+V2hlbiB0aGUgZG93bmxvYWQgaXMgY29tcGxldGUsIHRoZSBBbmRyb2lkIFNESyBNYW5hZ2VyIGluc3RhbGxzIGJvdGgKQEAgLTI5Nyw3ICsyOTcsNyBAQAogdGhhbiB0aG9zZSBpbiBkZWZhdWx0IGxvY2F0aW9uIGluIHRoZSBTREsuIDwvcD4KIAogPHA+TW92aW5nIHRoZSBsaWJyYXJ5IHNvdXJjZXMgaXMgaW1wb3J0YW50IGlzIGJlY2F1c2UsIHdoZW4geW91IGxhdGVyIHVwZGF0ZSB0aGUKLU1hcmtldCBsaWNlbnNpbmcgcGFja2FnZSwgdGhlIFNESyBpbnN0YWxscyB0aGUgbmV3IGZpbGVzIHRvIHRoZSBzYW1lIGxvY2F0aW9uIGFzCitMaWNlbnNpbmcgcGFja2FnZSwgdGhlIFNESyBpbnN0YWxscyB0aGUgbmV3IGZpbGVzIHRvIHRoZSBzYW1lIGxvY2F0aW9uIGFzCiB0aGUgb2xkZXIgZmlsZXMuIE1vdmluZyB5b3VyIHdvcmtpbmcgbGlicmFyeSBmaWxlcyB0byBhIHNhZmUgbG9jYXRpb24gZW5zdXJlcwogdGhhdCB5b3VyIHdvcmsgd29uJ3QgYmUgaW5hZHZlcnRlbnRseSBvdmVyd3JpdHRlbiBzaG91bGQgeW91IGRvd25sb2FkIGEgbmV3CiB2ZXJzaW9uIG9mIHRoZSBMVkwuPC9wPgpAQCAtNDM4LDcgKzQzOCw3IEBACiAKIDxoMiBpZD0idGVzdC1lbnYiPlNldHRpbmcgVXAgdGhlIFRlc3RpbmcgRW52aXJvbm1lbnQ8L2gyPgogCi08cD5UaGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGUgcHJvdmlkZXMgY29uZmlndXJhdGlvbiB0b29scyB0aGF0IGxldCB5b3UKKzxwPlRoZSBHb29nbGUgUGxheSBwdWJsaXNoZXIgc2l0ZSBwcm92aWRlcyBjb25maWd1cmF0aW9uIHRvb2xzIHRoYXQgbGV0IHlvdQogYW5kIG90aGVycyB0ZXN0IGxpY2Vuc2luZyBvbiB5b3VyIGFwcGxpY2F0aW9uIGJlZm9yZSBpdCBpcyBwdWJsaXNoZWQuIEFzIHlvdSBhcmUKIGltcGxlbWVudGluZyBsaWNlbnNpbmcsIHlvdSBjYW4gbWFrZSB1c2Ugb2YgdGhlIHB1Ymxpc2hlciBzaXRlIHRvb2xzIHRvIHRlc3QKIHlvdXIgYXBwbGljYXRpb24ncyBQb2xpY3kgYW5kIGhhbmRsaW5nIG9mIGRpZmZlcmVudCBsaWNlbnNpbmcgcmVzcG9uc2VzIGFuZApAQCAtNDU0LDcgKzQ1NCw3IEBACiA8bGk+QW4gb3B0aW9uYWwgc2V0IG9mIHRlc3QgYWNjb3VudHMgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIHN0YXRpYyB0ZXN0CiByZXNwb25zZSB3aGVuIHRoZXkgY2hlY2sgdGhlIGxpY2Vuc2Ugb2YgYW4gYXBwbGljYXRpb24gdGhhdCB5b3UgaGF2ZSB1cGxvYWRlZAogKHJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgYXBwbGljYXRpb24gaXMgcHVibGlzaGVkIG9yIG5vdCkuPC9saT4KLTxsaT5BIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGluY2x1ZGVzIHRoZSBBbmRyb2lkIE1hcmtldAorPGxpPkEgcnVudGltZSBlbnZpcm9ubWVudCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRoYXQgaW5jbHVkZXMgdGhlIEdvb2dsZSBQbGF5CiBhcHBsaWNhdGlvbiBvciBHb29nbGUgQVBJcyBBZGQtT24sIG9uIHdoaWNoIHRoZSB1c2VyIGlzIHNpZ25lZCBpbiB0byB0aGUKIHB1Ymxpc2hlciBhY2NvdW50IG9yIG9uZSBvZiB0aGUgdGVzdCBhY2NvdW50cy48L2xpPgogPC91bD4KQEAgLTQ3Miw3ICs0NzIsNyBAQAogCiA8aDMgaWQ9InRlc3QtcmVzcG9uc2UiPlNldHRpbmcgdGVzdCByZXNwb25zZXMgZm9yIGxpY2Vuc2UgY2hlY2tzPC9oMz4KIAotPHA+QW5kcm9pZCBNYXJrZXQgcHJvdmlkZXMgYSBjb25maWd1cmF0aW9uIHNldHRpbmcgaW4geW91ciBwdWJsaXNoZXIgYWNjb3VudAorPHA+R29vZ2xlIFBsYXkgcHJvdmlkZXMgYSBjb25maWd1cmF0aW9uIHNldHRpbmcgaW4geW91ciBwdWJsaXNoZXIgYWNjb3VudAogdGhhdCBsZXRzIHlvdSBvdmVycmlkZSB0aGUgbm9ybWFsIHByb2Nlc3Npbmcgb2YgYSBsaWNlbnNlIGNoZWNrIGFuZCByZXR1cm4gYQogc3BlY2lmaWVkIHN0YXRpYyByZXNwb25zZSBjb2RlLiBUaGUgc2V0dGluZyBpcyBmb3IgdGVzdGluZyBvbmx5IGFuZCBhcHBsaWVzCiA8ZW0+b25seTwvZW0+IHRvIGxpY2Vuc2UgY2hlY2tzIGZvciBhcHBsaWNhdGlvbnMgdGhhdCB5b3UgaGF2ZSB1cGxvYWRlZCwgbWFkZSBieQpAQCAtNTIyLDcgKzUyMiw3IEBACiA8cD5JbiBzb21lIGNhc2VzLCB5b3UgbWlnaHQgd2FudCB0byBsZXQgbXVsdGlwbGUgdGVhbXMgb2YgZGV2ZWxvcGVycyB0ZXN0CiBsaWNlbnNpbmcgb24gYXBwbGljYXRpb25zIHRoYXQgd2lsbCB1bHRpbWF0ZWx5IGJlIHB1Ymxpc2hlZCB0aHJvdWdoIHlvdXIKIHB1Ymxpc2hlciBhY2NvdW50LCBidXQgd2l0aG91dCBnaXZpbmcgdGhlbSBhY2Nlc3MgdG8geW91ciBwdWJsaXNoZXIgYWNjb3VudCdzCi1zaWduLWluIGNyZWRlbnRpYWxzLiBUbyBtZWV0IHRoYXQgbmVlZCwgdGhlIEFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBzaXRlIGxldHMKK3NpZ24taW4gY3JlZGVudGlhbHMuIFRvIG1lZXQgdGhhdCBuZWVkLCB0aGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUgbGV0cwogeW91IHNldCB1cCBvbmUgb3IgbW9yZSBvcHRpb25hbCA8ZW0+dGVzdCBhY2NvdW50czwvZW0+ICZtZGFzaDsgYWNjb3VudHMgdGhhdCBhcmUKIGF1dGhvcml6ZWQgdG8gcXVlcnkgdGhlIGxpY2Vuc2luZyBzZXJ2ZXIgYW5kIHJlY2VpdmUgc3RhdGljIHRlc3QgcmVzcG9uc2VzIGZyb20KIHlvdXIgcHVibGlzaGVyIGFjY291bnQuPC9wPgpAQCAtNjMyLDExICs2MzIsMTEgQEAKIGVudmlyb25tZW50PC9oMz4KIAogPHA+VGhlIGxpY2Vuc2luZyBzZXJ2aWNlIGlzIGRlc2lnbmVkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcwotbGljZW5zZWQgdG8gdXNlIGEgZ2l2ZW4gYXBwbGljYXRpb24gJm1kYXNoOyBkdXJpbmcgYSBsaWNlbnNlIGNoZWNrLCB0aGUgQW5kcm9pZAotTWFya2V0IGFwcGxpY2F0aW9uIGdhdGhlcnMgdGhlIHVzZXIgSUQgZnJvbSB0aGUgcHJpbWFyeSBhY2NvdW50IG9uIHRoZSBzeXN0ZW0KK2xpY2Vuc2VkIHRvIHVzZSBhIGdpdmVuIGFwcGxpY2F0aW9uICZtZGFzaDsgZHVyaW5nIGEgbGljZW5zZSBjaGVjaywgdGhlIEdvb2dsZQorUGxheSBhcHBsaWNhdGlvbiBnYXRoZXJzIHRoZSB1c2VyIElEIGZyb20gdGhlIHByaW1hcnkgYWNjb3VudCBvbiB0aGUgc3lzdGVtCiBhbmQgc2VuZHMgaXQgdG8gdGhlIHNlcnZlciwgdG9nZXRoZXIgd2l0aCB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbgogYW5kIG90aGVyIGluZm9ybWF0aW9uLiBIb3dldmVyLCBpZiB0aGVyZSBpcyBubyB1c2VyIGluZm9ybWF0aW9uIGF2YWlsYWJsZSwgdGhlCi1saWNlbnNlIGNoZWNrIGNhbm5vdCBzdWNjZWVkLCBzbyB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gdGVybWluYXRlcyB0aGUKK2xpY2Vuc2UgY2hlY2sgY2Fubm90IHN1Y2NlZWQsIHNvIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiB0ZXJtaW5hdGVzIHRoZQogcmVxdWVzdCBhbmQgcmV0dXJucyBhbiBlcnJvciB0byB0aGUgYXBwbGljYXRpb24uIDwvcD4KIAogPHA+RHVyaW5nIHRlc3RpbmcsIHRvIGVuc3VyZSB0aGF0IHlvdXIgYXBwbGljYXRpb24gY2FuIHN1Y2Nlc3NmdWxseSBxdWVyeSB0aGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvcHVibGlzaGluZy9tdWx0aXBsZS1hcGtzLmpkIGIvZG9jcy9odG1sL2d1aWRlL21hcmtldC9wdWJsaXNoaW5nL211bHRpcGxlLWFwa3MuamQKaW5kZXggZmY3MGU4NS4uZTdjZmEzMyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9wdWJsaXNoaW5nL211bHRpcGxlLWFwa3MuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL21hcmtldC9wdWJsaXNoaW5nL211bHRpcGxlLWFwa3MuamQKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogICA8aDI+U2VlIGFsc288L2gyPgogPG9sPgotICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPk1hcmtldCBGaWx0ZXJzPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+RmlsdGVycyBvbiBHb29nbGUgUGxheTwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbCI+U3VwcG9ydGluZyBNdWx0aXBsZSBTY3JlZW5zPC9hPjwvbGk+CiAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9c2RrL2NvbXBhdGliaWxpdHktbGlicmFyeS5odG1sIj5Db21wYXRpYmlsaXR5CiBQYWNrYWdlPC9hPjwvbGk+CkBAIC01NSwxMCArNTUsMTAgQEAKIDwvZGl2PgogPC9kaXY+CiAKLTxwPk11bHRpcGxlIEFQSyBzdXBwb3J0IGlzIGEgZmVhdHVyZSBpbiBBbmRyb2lkIE1hcmtldCB0aGF0IGFsbG93cyB5b3UgdG8gcHVibGlzaCBkaWZmZXJlbnQgQVBLcworPHA+TXVsdGlwbGUgQVBLIHN1cHBvcnQgaXMgYSBmZWF0dXJlIG9uIEdvb2dsZSBQbGF5IHRoYXQgYWxsb3dzIHlvdSB0byBwdWJsaXNoIGRpZmZlcmVudCBBUEtzCiBmb3IgeW91ciBhcHBsaWNhdGlvbiB0aGF0IGFyZSBlYWNoIHRhcmdldGVkIHRvIGRpZmZlcmVudCBkZXZpY2UgY29uZmlndXJhdGlvbnMuIEVhY2ggQVBLIGlzIGEKIGNvbXBsZXRlIGFuZCBpbmRlcGVuZGVudCB2ZXJzaW9uIG9mIHlvdXIgYXBwbGljYXRpb24sIGJ1dCB0aGV5IHNoYXJlIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGxpc3Rpbmcgb24KLUFuZHJvaWQgTWFya2V0IGFuZCBtdXN0IHNoYXJlIHRoZSBzYW1lIHBhY2thZ2UgbmFtZSBhbmQgYmUgc2lnbmVkIHdpdGggdGhlIHNhbWUgcmVsZWFzZSBrZXkuIFRoaXMKK0dvb2dsZSBQbGF5IGFuZCBtdXN0IHNoYXJlIHRoZSBzYW1lIHBhY2thZ2UgbmFtZSBhbmQgYmUgc2lnbmVkIHdpdGggdGhlIHNhbWUgcmVsZWFzZSBrZXkuIFRoaXMKIGZlYXR1cmUgaXMgdXNlZnVsIGZvciBjYXNlcyBpbiB3aGljaCB5b3VyIGFwcGxpY2F0aW9uIGNhbm5vdCByZWFjaCBhbGwgZGVzaXJlZCBkZXZpY2VzIHdpdGggYSBzaW5nbGUKIEFQSy48L3A+CiAKQEAgLTczLDggKzczLDggQEAKIAogPHA+QWx0aG91Z2ggPHN0cm9uZz53ZSBlbmNvdXJhZ2UgeW91IHRvIGRldmVsb3AgYW5kIHB1Ymxpc2ggYSBzaW5nbGUgQVBLPC9zdHJvbmc+IHRoYXQgc3VwcG9ydHMgYXMKIG1hbnkgZGV2aWNlIGNvbmZpZ3VyYXRpb25zIGFzIHBvc3NpYmxlLCBkb2luZyBzbyBpcyBzb21ldGltZXMgbm90IHBvc3NpYmxlLiBUbyBoZWxwCi15b3UgcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uIGZvciBhcyBtYW55IGRldmljZXMgYXMgcG9zc2libGUsIEFuZHJvaWQgTWFya2V0IGFsbG93cyB5b3UgdG8KLXB1Ymxpc2ggbXVsdGlwbGUgQVBLcyB1bmRlciB0aGUgc2FtZSBhcHBsaWNhdGlvbiBsaXN0aW5nLiBBbmRyb2lkIE1hcmtldCB0aGVuIHN1cHBsaWVzIGVhY2ggQVBLIHRvCit5b3UgcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uIGZvciBhcyBtYW55IGRldmljZXMgYXMgcG9zc2libGUsIEdvb2dsZSBQbGF5IGFsbG93cyB5b3UgdG8KK3B1Ymxpc2ggbXVsdGlwbGUgQVBLcyB1bmRlciB0aGUgc2FtZSBhcHBsaWNhdGlvbiBsaXN0aW5nLiBHb29nbGUgUGxheSB0aGVuIHN1cHBsaWVzIGVhY2ggQVBLIHRvCiB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uIHN1cHBvcnQgeW91J3ZlIGRlY2xhcmVkIGluIHRoZSBtYW5pZmVzdCBmaWxlIG9mIGVhY2gKIEFQSy48L3A+CiAKQEAgLTg2LDcgKzg2LDcgQEAKICAgPGxpPlN1cHBvcnQgZGlmZmVyZW50IHBsYXRmb3JtIHZlcnNpb25zIHdpdGggZWFjaCBBUEsuPC9saT4KIDwvdWw+CiAKLTxwPkN1cnJlbnRseSwgdGhlc2UgYXJlIHRoZSBvbmx5IGRldmljZSBjaGFyYWN0ZXJpc3RpY3MgdGhhdCBBbmRyb2lkIE1hcmtldCBzdXBwb3J0cyBmb3IgcHVibGlzaGluZworPHA+Q3VycmVudGx5LCB0aGVzZSBhcmUgdGhlIG9ubHkgZGV2aWNlIGNoYXJhY3RlcmlzdGljcyB0aGF0IEdvb2dsZSBQbGF5IHN1cHBvcnRzIGZvciBwdWJsaXNoaW5nCiBtdWx0aXBsZSBBUEtzIGFzIHRoZSBzYW1lIGFwcGxpY2F0aW9uLjwvcD4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gWW91IHNob3VsZCBnZW5lcmFsbHkgdXNlIG11bHRpcGxlIEFQS3MgdG8gc3VwcG9ydApAQCAtMTAwLDggKzEwMCw4IEBACiAKIDxoMiBpZD0iQ29uY2VwdHMiPlB1Ymxpc2hpbmcgQ29uY2VwdHM8L2gyPgogCi08cD5CZWZvcmUgeW91IHN0YXJ0IHB1Ymxpc2hpbmcgbXVsdGlwbGUgQVBLcyBvbiBBbmRyb2lkIE1hcmtldCwgeW91IG11c3QgdW5kZXJzdGFuZCBhIGZldwotY29uY2VwdHMgcmVnYXJkaW5nIGhvdyB0aGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGUgd29ya3MuPC9wPgorPHA+QmVmb3JlIHlvdSBzdGFydCBwdWJsaXNoaW5nIG11bHRpcGxlIEFQS3Mgb24gR29vZ2xlIFBsYXksIHlvdSBtdXN0IHVuZGVyc3RhbmQgYSBmZXcKK2NvbmNlcHRzIHJlZ2FyZGluZyBob3cgdGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlIHdvcmtzLjwvcD4KIAogPGgzIGlkPSJBY3RpdmUiPkFjdGl2ZSBBUEtzPC9oMz4KIApAQCAtMTExLDIwICsxMTEsMjAgQEAKICAgPHA+V2hlbiBlZGl0aW5nIHlvdXIgYXBwbGljYXRpb24sIHRoZXJlIGFyZSB0d28gYnV0dG9ucyBvbiB0aGUgdG9wLXJpZ2h0IHNpZGUgb2YgdGhlIHBhZ2UuIFRoZQogZmlyc3QgYnV0dG9uIGlzIGVpdGhlciA8c3Ryb25nPlB1Ymxpc2g8L3N0cm9uZz4gb3IgPHN0cm9uZz5VbnB1Ymxpc2g8L3N0cm9uZz4gYW5kIHRoZSBzZWNvbmQKIGJ1dHRvbiBpcyBhbHdheXMgPHN0cm9uZz5TYXZlPC9zdHJvbmc+IChidXQgaXRzIGJlaGF2aW9yIGNoYW5nZXMpLjwvcD4KLSAgPHA+V2hlbiB5b3VyIGFwcGxpY2F0aW9uIGlzIG5ldyBvciB5b3UgaGF2ZSB1bnB1Ymxpc2hlZCBpdCBmcm9tIE1hcmtldCwgdGhlIGZpcnN0CisgIDxwPldoZW4geW91ciBhcHBsaWNhdGlvbiBpcyBuZXcgb3IgeW91IGhhdmUgdW5wdWJsaXNoZWQgaXQgZnJvbSBHb29nbGUgUGxheSwgdGhlIGZpcnN0CiBidXR0b24gc2F5cyA8c3Ryb25nPlB1Ymxpc2g8L3N0cm9uZz4uIENsaWNraW5nIGl0IHdpbGwgcHVibGlzaCBhbnkgQVBLcyBsaXN0ZWQgYXMKLUFjdGl2ZSwgbWFraW5nIHRoZW0gYXZhaWxhYmxlIG9uIEFuZHJvaWQgTWFya2V0LiBBbHNvIHdoaWxlIHlvdXIgYXBwbGljYXRpb24gaXMgbmV3CitBY3RpdmUsIG1ha2luZyB0aGVtIGF2YWlsYWJsZSBvbiBHb29nbGUgUGxheS4gQWxzbyB3aGlsZSB5b3VyIGFwcGxpY2F0aW9uIGlzIG5ldwogb3IgdW5wdWJsaXNoZWQsIGNsaWNraW5nIDxzdHJvbmc+U2F2ZTwvc3Ryb25nPiB3aWxsIHNhdmUgYW55IGNoYW5nZXMgeW91J3ZlIG1hZGUsIHN1Y2gKIGFzIGluZm9ybWF0aW9uIGFkZGVkIHRvIHRoZSBQcm9kdWN0IGRldGFpbHMgYW5kIEFQS3MgeW91J3ZlIHVwbG9hZGVkLCBidXQgbm90aGluZyBpcyBtYWRlIHZpc2libGUgb24KLUFuZHJvaWQgTWFya2V0Jm1kYXNoO3RoaXMgYWxsb3dzIHlvdSB0byBzYXZlIHlvdXIgY2hhbmdlcyBhbmQgc2lnbiBvdXQgb2YgdGhlIHB1Ymxpc2hlciBzaXRlIGJlZm9yZQorR29vZ2xlIFBsYXkmbWRhc2g7dGhpcyBhbGxvd3MgeW91IHRvIHNhdmUgeW91ciBjaGFuZ2VzIGFuZCBzaWduIG91dCBvZiB0aGUgcHVibGlzaGVyIHNpdGUgYmVmb3JlCiBkZWNpZGluZyB0byBwdWJsaXNoLjwvcD4KICA8cD5PbmNlIHlvdSd2ZSBwdWJsaXNoZWQgeW91ciBhcHBsaWNhdGlvbiwgdGhlIGZpcnN0IGJ1dHRvbiBjaGFuZ2VzIHRvCiA8c3Ryb25nPlVucHVibGlzaDwvc3Ryb25nPi4gQ2xpY2tpbmcgaXQgaW4gdGhpcyBzdGF0ZSB1bnB1Ymxpc2hlcyB5b3VyIGFwcGxpY2F0aW9uIHNvIHRoYXQgbm9uZQotb2YgdGhlIEFQS3MgYXJlIGF2YWlsYWJsZSBvbiBBbmRyb2lkIE1hcmtldC4gQWxzbyB3aGlsZSBwdWJsaXNoZWQsIHRoZSBiZWhhdmlvciBvZiB0aGUKK29mIHRoZSBBUEtzIGFyZSBhdmFpbGFibGUgb24gR29vZ2xlIFBsYXkuIEFsc28gd2hpbGUgcHVibGlzaGVkLCB0aGUgYmVoYXZpb3Igb2YgdGhlCiA8c3Ryb25nPlNhdmU8L3N0cm9uZz4gYnV0dG9uIGlzIGRpZmZlcmVudC4gSW4gdGhpcyBzdGF0ZSwgY2xpY2tpbmcgPHN0cm9uZz5TYXZlPC9zdHJvbmc+IG5vdAotb25seSBzYXZlcyBhbGwgeW91ciBjaGFuZ2VzLCBidXQgYWxzbyBwdWJsaXNoZXMgdGhlbSB0byBBbmRyb2lkIE1hcmtldC4gRm9yIGV4YW1wbGUsIGlmIHlvdSd2ZQorb25seSBzYXZlcyBhbGwgeW91ciBjaGFuZ2VzLCBidXQgYWxzbyBwdWJsaXNoZXMgdGhlbSB0byBHb29nbGUgUGxheS4gRm9yIGV4YW1wbGUsIGlmIHlvdSd2ZQogYWxyZWFkeSBwdWJsaXNoZWQgeW91ciBhcHBsaWNhdGlvbiBhbmQgdGhlbiBtYWtlIGNoYW5nZXMgdG8geW91ciBwcm9kdWN0IGRldGFpbHMgb3IgYWN0aXZhdGUgbmV3Ci1BUEtzLCBjbGlja2luZyA8c3Ryb25nPlNhdmU8L3N0cm9uZz4gbWFrZXMgYWxsIHRob3NlIGNoYW5nZXMgbGl2ZSBvbiBBbmRyb2lkIE1hcmtldC48L3A+CitBUEtzLCBjbGlja2luZyA8c3Ryb25nPlNhdmU8L3N0cm9uZz4gbWFrZXMgYWxsIHRob3NlIGNoYW5nZXMgbGl2ZSBvbiBHb29nbGUgUGxheS48L3A+CiA8L2Rpdj4KIDwvZGl2PgogCkBAIC0xMzUsMTQgKzEzNSwxNCBAQAogeW91J3JlIGFib3V0IHRvIHB1Ymxpc2guPC9wPgogCiA8cD5JZiB0aGVyZSBhcmUgbm8gZXJyb3JzLCBhbnkgImFjdGl2ZSIgQVBLIHdpbGwgYmUgcHVibGlzaGVkIHRvCi1BbmRyb2lkIE1hcmtldCB3aGVuIHlvdSBjbGljayB0aGUgPHN0cm9uZz5QdWJsaXNoPC9zdHJvbmc+IGJ1dHRvbiAoaWYgdGhlIGFwcGxpY2F0aW9uIGlzCitHb29nbGUgUGxheSB3aGVuIHlvdSBjbGljayB0aGUgPHN0cm9uZz5QdWJsaXNoPC9zdHJvbmc+IGJ1dHRvbiAoaWYgdGhlIGFwcGxpY2F0aW9uIGlzCiB1bnB1Ymxpc2hlZCkgb3Igd2hlbiB5b3UgY2xpY2sgdGhlIDxzdHJvbmc+U2F2ZTwvc3Ryb25nPiBidXR0b24gKGlmIHRoZSBhcHBsaWNhdGlvbiBpcwogYWxyZWFkeSBwdWJsaXNoZWQpLjwvcD4KIAogCiA8aDMgaWQ9IlNpbXBsZUFuZEFkdmFuY2VkIj5TaW1wbGUgbW9kZSBhbmQgYWR2YW5jZWQgbW9kZTwvaDM+CiAKLTxwPlRoZSBBbmRyb2lkIE1hcmtldCBwdWJsaXNoZXIgc2l0ZSBwcm92aWRlcyB0d28gbW9kZXMgZm9yIG1hbmFnaW5nIHRoZSBBUEtzIGFzc29jaWF0ZWQgd2l0aAorPHA+VGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlIHByb3ZpZGVzIHR3byBtb2RlcyBmb3IgbWFuYWdpbmcgdGhlIEFQS3MgYXNzb2NpYXRlZCB3aXRoCiB5b3VyIGFwcGxpY2F0aW9uOiA8ZW0+c2ltcGxlIG1vZGU8L2VtPiBhbmQgPGVtPmFkdmFuY2VkIG1vZGU8L2VtPi4gWW91IGNhbiBzd2l0Y2ggYmV0d2VlbiB0aGVzZSBieQogY2xpY2tpbmcgdGhlCiBsaW5rIGF0IHRoZSB0b3AtcmlnaHQgY29ybmVyIG9mIHRoZSA8c3Ryb25nPkFQSyBmaWxlczwvc3Ryb25nPiB0YWIuPC9wPgpAQCAtMTY0LDIxICsxNjQsMjEgQEAKIAogPGgyIGlkPSJIb3dJdFdvcmtzIj5Ib3cgTXVsdGlwbGUgQVBLcyBXb3JrPC9oMj4KIAotPHA+VGhlIGNvbmNlcHQgZm9yIHVzaW5nIG11bHRpcGxlIEFQS3Mgb24gQW5kcm9pZCBNYXJrZXQgaXMgdGhhdCB5b3UgaGF2ZSBqdXN0IG9uZSBlbnRyeSBpbgotQW5kcm9pZCBNYXJrZXQgZm9yIHlvdXIgYXBwbGljYXRpb24sIGJ1dCBkaWZmZXJlbnQgZGV2aWNlcyBtaWdodCBkb3dubG9hZCBhIGRpZmZlcmVudCBBUEsuIFRoaXMKKzxwPlRoZSBjb25jZXB0IGZvciB1c2luZyBtdWx0aXBsZSBBUEtzIG9uIEdvb2dsZSBQbGF5IGlzIHRoYXQgeW91IGhhdmUganVzdCBvbmUgZW50cnkgaW4KK0dvb2dsZSBQbGF5IGZvciB5b3VyIGFwcGxpY2F0aW9uLCBidXQgZGlmZmVyZW50IGRldmljZXMgbWlnaHQgZG93bmxvYWQgYSBkaWZmZXJlbnQgQVBLLiBUaGlzCiBtZWFucyB0aGF0OjwvcD4KIAogPHVsPgogICA8bGk+WW91IG1haW50YWluIG9ubHkgb25lIHNldCBvZiBwcm9kdWN0IGRldGFpbHMgKGFwcCBkZXNjcmlwdGlvbiwgaWNvbnMsIHNjcmVlbnNob3RzLCBldGMuKS4KIFRoaXMgYWxzbyBtZWFucyB5b3UgPGVtPmNhbm5vdDwvZW0+IGNoYXJnZSBhIGRpZmZlcmVudCBwcmljZSBmb3IgZGlmZmVyZW50IEFQS3MuPC9saT4KLSAgPGxpPkFsbCB1c2VycyBzZWUgb25seSBvbmUgdmVyc2lvbiBvZiB5b3VyIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0LCBzbyB0aGV5IGFyZSBub3QKKyAgPGxpPkFsbCB1c2VycyBzZWUgb25seSBvbmUgdmVyc2lvbiBvZiB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LCBzbyB0aGV5IGFyZSBub3QKIGNvbmZ1c2VkIGJ5IGRpZmZlcmVudCB2ZXJzaW9ucyB5b3UgbWF5IGhhdmUgcHVibGlzaGVkIHRoYXQgYXJlICJmb3IgdGFibGV0cyIgb3IKICJmb3IgcGhvbmVzLiI8L2xpPgogICA8bGk+QWxsIHVzZXIgcmV2aWV3cyBhcmUgYXBwbGllZCB0byB0aGUgc2FtZSBhcHBsaWNhdGlvbiBsaXN0aW5nLCBldmVuIHRob3VnaCB1c2VycyBvbiBkaWZmZXJlbnQKIGRldmljZXMgbWF5IGhhdmUgZGlmZmVyZW50IEFQS3MuPC9saT4KICAgPGxpPklmIHlvdSBwdWJsaXNoIGRpZmZlcmVudCBBUEtzIGZvciBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQW5kcm9pZCAoZm9yIGRpZmZlcmVudCBBUEkgbGV2ZWxzKSwKIHRoZW4gd2hlbiBhIHVzZXIncyBkZXZpY2UgcmVjZWl2ZXMgYSBzeXN0ZW0gdXBkYXRlIHRoYXQgcXVhbGlmaWVzIHRoZW0gZm9yIGEgZGlmZmVyZW50IEFQSyB5b3UndmUKLXB1Ymxpc2hlZCwgQW5kcm9pZCBNYXJrZXQgdXBkYXRlcyB0aGUgdXNlcidzIGFwcGxpY2F0aW9uIHRvIHRoZSBBUEsgZGVzaWduZWQgZm9yIHRoZSBoaWdoZXIgdmVyc2lvbgorcHVibGlzaGVkLCBHb29nbGUgUGxheSB1cGRhdGVzIHRoZSB1c2VyJ3MgYXBwbGljYXRpb24gdG8gdGhlIEFQSyBkZXNpZ25lZCBmb3IgdGhlIGhpZ2hlciB2ZXJzaW9uCiBvZiBBbmRyb2lkLiBBbnkgc3lzdGVtIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBpcyByZXRhaW5lZCAodGhlIHNhbWUgYXMgd2l0aCBub3JtYWwKIGFwcGxpY2F0aW9uIHVwZGF0ZXMgd2hlbiB1c2luZyBhIHNpbmdsZSBBUEspLjwvbGk+CiA8L3VsPgpAQCAtMTkyLDggKzE5Miw4IEBACiA8aDMgaWQ9IlN1cHBvcnRlZEZpbHRlcnMiPlN1cHBvcnRlZCBmaWx0ZXJzPC9oMz4KIAogPHA+V2hpY2ggZGV2aWNlcyByZWNlaXZlIGVhY2ggQVBLIGlzIGRldGVybWluZWQgYnkgPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5BbmRyb2lkIE1hcmtldCBmaWx0ZXJzPC9hPiB0aGF0IGFyZSBzcGVjaWZpZWQgYnkKLWVsZW1lbnRzIGluIHRoZSBtYW5pZmVzdCBmaWxlIG9mIGVhY2ggQVBLLiBIb3dldmVyLCBBbmRyb2lkIE1hcmtldCBhbGxvd3MgeW91IHRvIHB1Ymxpc2ggbXVsdGlwbGUKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5Hb29nbGUgUGxheSBmaWx0ZXJzPC9hPiB0aGF0IGFyZSBzcGVjaWZpZWQgYnkKK2VsZW1lbnRzIGluIHRoZSBtYW5pZmVzdCBmaWxlIG9mIGVhY2ggQVBLLiBIb3dldmVyLCBHb29nbGUgUGxheSBhbGxvd3MgeW91IHRvIHB1Ymxpc2ggbXVsdGlwbGUKIEFQS3Mgb25seSB3aGVuIGVhY2ggQVBLIHVzZXMgZmlsdGVycyB0byBzdXBwb3J0IGEgdmFyaWF0aW9uIG9mIHRoZSBmb2xsb3dpbmcKIGRldmljZSBjaGFyYWN0ZXJpc3RpY3M6PC9wPgogCkBAIC0yMjksNyArMjI5LDcgQEAKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtc2NyZWVucy1lbGVtZW50Lmh0bWwiPntAY29kZQogJmx0O3N1cHBvcnRzLXNjcmVlbnMmZ3Q7fTwvYT4gZWxlbWVudCBhcmUgInRydWUiIGlmIHlvdSBkbyBub3QgZGVjbGFyZSB0aGVtIG90aGVyd2lzZS4gSG93ZXZlciwKIGJlY2F1c2UgdGhlIHtAY29kZSBhbmRyb2lkOnhsYXJnZVNjcmVlbnN9IGF0dHJpYnV0ZSB3YXMgYWRkZWQgaW4gQW5kcm9pZCAyLjMgKEFQSSBsZXZlbAotOSksIEFuZHJvaWQgTWFya2V0IHdpbGwgYXNzdW1lIHRoYXQgaXQgaXMgImZhbHNlIiBpZiB5b3VyIGFwcGxpY2F0aW9uIGRvZXMgbm90IHNldCBlaXRoZXIgPGEKKzkpLCBHb29nbGUgUGxheSB3aWxsIGFzc3VtZSB0aGF0IGl0IGlzICJmYWxzZSIgaWYgeW91ciBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzZXQgZWl0aGVyIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuaHRtbCNtaW4iPntAY29kZQogYW5kcm9pZDptaW5TZGtWZXJzaW9ufTwvYT4gb3IgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sI3RhcmdldCI+e0Bjb2RlCkBAIC0yNjYsNyArMjY2LDcgQEAKIGFuZHJvaWQ6bWluU2RrVmVyc2lvbn08L2E+IHZhbHVlIG11c3QgaGF2ZSBhIGhpZ2hlciA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1lbGVtZW50Lmh0bWwjdmNvZGUiPntAY29kZSBhbmRyb2lkOnZlcnNpb25Db2RlfTwvYT4KIHZhbHVlLiBUaGlzIGlzIGFsc28gdHJ1ZSBpZiB0d28gQVBLcyBvdmVybGFwIHRoZWlyIGRldmljZSBzdXBwb3J0IGJhc2VkIG9uIGEgZGlmZmVyZW50IHN1cHBvcnRlZAotZmlsdGVyLiBUaGlzIGVuc3VyZXMgdGhhdCB3aGVuIGEgZGV2aWNlIHJlY2VpdmVzIGEgc3lzdGVtIHVwZGF0ZSwgQW5kcm9pZCBNYXJrZXQgY2FuIG9mZmVyIHRoZSB1c2VyCitmaWx0ZXIuIFRoaXMgZW5zdXJlcyB0aGF0IHdoZW4gYSBkZXZpY2UgcmVjZWl2ZXMgYSBzeXN0ZW0gdXBkYXRlLCBHb29nbGUgUGxheSBjYW4gb2ZmZXIgdGhlIHVzZXIKIGFuIHVwZGF0ZSBmb3IgeW91ciBhcHBsaWNhdGlvbiAoYmVjYXVzZSB1cGRhdGVzIGFyZSBiYXNlZCBvbiBhbiBpbmNyZWFzZSBpbiB0aGUgYXBwIHZlcnNpb24gY29kZSkuCiBUaGlzIHJlcXVpcmVtZW50IGlzIGRlc2NyaWJlZCBmdXJ0aGVyIGluIHRoZSBzZWN0aW9uIGJlbG93IGFib3V0IDxhIGhyZWY9IiNSdWxlcyI+UnVsZXMgZm9yCiBtdWx0aXBsZSBBUEtzPC9hPi48L2xpPgpAQCAtMjg2LDggKzI4Niw4IEBACiA8L3VsPgogCiA8cD5PdGhlciBtYW5pZmVzdCBlbGVtZW50cyB0aGF0IGVuYWJsZSA8YQotaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkFuZHJvaWQgTWFya2V0IGZpbHRlcnM8L2E+Jm1kYXNoO2J1dCBhcmUgbm90Ci1saXN0ZWQgYWJvdmUmbWRhc2g7YXJlIHN0aWxsIGFwcGxpZWQgZm9yIGVhY2ggQVBLIGFzIHVzdWFsLiBIb3dldmVyLCBBbmRyb2lkIE1hcmtldCBkb2VzIG5vdCBhbGxvdworaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkdvb2dsZSBQbGF5IGZpbHRlcnM8L2E+Jm1kYXNoO2J1dCBhcmUgbm90CitsaXN0ZWQgYWJvdmUmbWRhc2g7YXJlIHN0aWxsIGFwcGxpZWQgZm9yIGVhY2ggQVBLIGFzIHVzdWFsLiBIb3dldmVyLCBHb29nbGUgUGxheSBkb2VzIG5vdCBhbGxvdwogeW91IHRvIHB1Ymxpc2ggbXVsdGlwbGUgQVBLcyBiYXNlZCBvbiB2YXJpYXRpb25zIG9mIHRoZW0uIFRodXMsIHlvdSBjYW5ub3QgcHVibGlzaAogbXVsdGlwbGUgQVBLcyBpZiB0aGUgYWJvdmUgbGlzdGVkIGZpbHRlcnMgYXJlIHRoZSBzYW1lIGZvciBlYWNoIEFQSyAoYnV0IHRoZSBBUEtzIGRpZmZlciBiYXNlZCBvbgogb3RoZXIgY2hhcmFjdGVyaXN0aWNzIGluIHRoZSBtYW5pZmVzdCBmaWxlKS4gRm9yCkBAIC0zMTIsNyArMzEyLDcgQEAKIAogICA8bGk+RWFjaCBBUEsgPHN0cm9uZz5tdXN0IG5vdCBleGFjdGx5IG1hdGNoIHRoZSBjb25maWd1cmF0aW9uIHN1cHBvcnQgb2YgYW5vdGhlciBBUEs8L3N0cm9uZz4uCiAgICAgPHA+VGhhdCBpcywgZWFjaCBBUEsgbXVzdCBkZWNsYXJlIHNsaWdodGx5IGRpZmZlcmVudCBzdXBwb3J0IGZvciBhdCBsZWFzdCBvbmUgb2YKLXRoZSA8YSBocmVmPSIjTWFya2V0RmlsdGVyc1N1cHBvcnRlZCI+c3VwcG9ydGVkIE1hcmtldCBmaWx0ZXJzPC9hPiAobGlzdGVkIGFib3ZlKS48L3A+Cit0aGUgPGEgaHJlZj0iI1N1cHBvcnRlZEZpbHRlcnMiPnN1cHBvcnRlZCBHb29nbGUgUGxheSBmaWx0ZXJzPC9hPiAobGlzdGVkIGFib3ZlKS48L3A+CiAgICAgPHA+VXN1YWxseSwgeW91IHdpbGwgZGlmZmVyZW50aWF0ZSB5b3VyIEFQS3MgYmFzZWQgb24gYSBzcGVjaWZpYyBjaGFyYWN0ZXJpc3RpYyAoc3VjaCBhcyB0aGUKIHN1cHBvcnRlZCB0ZXh0dXJlIGNvbXByZXNzaW9uIGZvcm1hdHMpLCBhbmQgdGh1cywgZWFjaCBBUEsgd2lsbCBkZWNsYXJlIHN1cHBvcnQgZm9yIGRpZmZlcmVudAogZGV2aWNlcy4gSG93ZXZlciwgaXQncyBPSyB0byBwdWJsaXNoIG11bHRpcGxlIEFQS3MgdGhhdCBvdmVybGFwIHRoZWlyIHN1cHBvcnQgc2xpZ2h0bHkuIFdoZW4gdHdvCkBAIC0zMzAsMTEgKzMzMCwxMSBAQAogICA8bGk+QW4gQVBLIHRoYXQgcmVxdWlyZXMgYSA8c3Ryb25nPmhpZ2hlciBBUEkgbGV2ZWw8L3N0cm9uZz4gbXVzdCBoYXZlIGEgPHN0cm9uZz5oaWdoZXIKIHZlcnNpb24gY29kZTwvc3Ryb25nPi4KICAgICA8cD5UaGlzIGlzIHRydWUgb25seSB3aGVuIGVpdGhlcjogdGhlIEFQS3MgZGlmZmVyIGJhc2VkIDxlbT5vbmx5PC9lbT4gb24gdGhlCi1zdXBwb3J0ZWQgQVBJIGxldmVscyAobm8gb3RoZXIgPGEgaHJlZj0iI1N1cHBvcnRlZE1hcmtldEZpbHRlcnMiPnN1cHBvcnRlZCBtYXJrZXQgZmlsdGVyczwvYT4KK3N1cHBvcnRlZCBBUEkgbGV2ZWxzIChubyBvdGhlciA8YSBocmVmPSIjU3VwcG9ydGVkRmlsdGVycyI+c3VwcG9ydGVkIGZpbHRlcnM8L2E+CiBkaXN0aW5ndWlzaCB0aGUgQVBLcyBmcm9tIGVhY2ggb3RoZXIpIDxlbT5vcjwvZW0+IHdoZW4gdGhlIEFQS3MgZG8gdXNlIGFub3RoZXIgc3VwcG9ydGVkIGZpbHRlciwgYnV0CiB0aGVyZSBpcyBhbiBvdmVybGFwIGJldHdlZW4gdGhlIEFQS3Mgd2l0aGluIHRoYXQgZmlsdGVyLjwvcD4KICAgICA8cD5UaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGEgdXNlcidzIGRldmljZSByZWNlaXZlcyBhbiBhcHBsaWNhdGlvbiB1cGRhdGUgZnJvbQotQW5kcm9pZCBNYXJrZXQgb25seSBpZiB0aGUgdmVyc2lvbiBjb2RlIGZvciB0aGUgQVBLIG9uIEFuZHJvaWQgTWFya2V0IGlzIGhpZ2hlciB0aGFuIHRoZSB2ZXJzaW9uCitHb29nbGUgUGxheSBvbmx5IGlmIHRoZSB2ZXJzaW9uIGNvZGUgZm9yIHRoZSBBUEsgb24gR29vZ2xlIFBsYXkgaXMgaGlnaGVyIHRoYW4gdGhlIHZlcnNpb24KIGNvZGUgb2YgdGhlIEFQSyBjdXJyZW50bHkgb24gdGhlIGRldmljZS4gVGhpcyBlbnN1cmVzIHRoYXQgaWYgYSBkZXZpY2UgcmVjZWl2ZXMgYSBzeXN0ZW0gdXBkYXRlIHRoYXQKIHRoZW4gcXVhbGlmaWVzIGl0IHRvIGluc3RhbGwgdGhlIEFQSyBmb3IgaGlnaGVyIEFQSSBsZXZlbHMsIHRoZSBkZXZpY2UgcmVjZWl2ZXMgYW4gYXBwbGljYXRpb24KIHVwZGF0ZSBiZWNhdXNlIHRoZSB2ZXJzaW9uIGNvZGUgaW5jcmVhc2VzLjwvcD4KQEAgLTM2NSw3ICszNjUsNyBAQAogCiA8L3VsPgogCi08cD5GYWlsdXJlIHRvIGFiaWRlIGJ5IHRoZSBhYm92ZSBydWxlcyByZXN1bHRzIGluIGFuIGVycm9yIG9uIHRoZSBBbmRyb2lkIE1hcmtldCBwdWJsaXNoZXIgc2l0ZQorPHA+RmFpbHVyZSB0byBhYmlkZSBieSB0aGUgYWJvdmUgcnVsZXMgcmVzdWx0cyBpbiBhbiBlcnJvciBvbiB0aGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUKIHdoZW4geW91IGFjdGl2YXRlIHlvdXIgQVBLcyZtZGFzaDt5b3Ugd2lsbCBiZSB1bmFibGUgdG8gcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uIHVudGlsIHlvdQogcmVzb2x2ZSB0aGUgZXJyb3IuPC9wPgogCkBAIC0zNzcsNyArMzc3LDcgQEAKIEFQS3Mgc3VwcG9ydCB0aGUgZGV2aWNlcyB0aGF0IHRoZW4gZmFsbCBvdXRzaWRlIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuIEZvciBleGFtcGxlLCBpZiBhbiBBUEsKIGN1cnJlbnRseSBzdXBwb3J0cyBzbWFsbCBhbmQgbm9ybWFsIHNpemUgc2NyZWVucyBhbmQgeW91IGNoYW5nZSBpdCB0byBzdXBwb3J0IG9ubHkgc21hbGwgc2NyZWVucywKIHRoZW4geW91IGhhdmUgc2hydW5rIHRoZSBwb29sIG9mIHN1cHBvcnRlZCBkZXZpY2VzIGFuZCBzb21lIGRldmljZXMgd2lsbCBubyBsb25nZXIgc2VlIHlvdXIKLWFwcGxpY2F0aW9uIGluIEFuZHJvaWQgTWFya2V0LiBZb3UgY2FuIHJlc29sdmUgdGhpcyBieSBhZGRpbmcgYW5vdGhlciBBUEsgdGhhdCBzdXBwb3J0cyBub3JtYWwgc2l6ZQorYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkuIFlvdSBjYW4gcmVzb2x2ZSB0aGlzIGJ5IGFkZGluZyBhbm90aGVyIEFQSyB0aGF0IHN1cHBvcnRzIG5vcm1hbCBzaXplCiBzY3JlZW5zIHNvIHRoYXQgYWxsIHByZXZpb3VzbHktc3VwcG9ydGVkIGRldmljZXMgYXJlIHN0aWxsIHN1cHBvcnRlZC48L2xpPgogCiAgIDxsaT5XaGVuIHRoZXJlIGFyZSAib3ZlcmxhcHMiIGJldHdlZW4gdHdvIG9yIG1vcmUgQVBLcy4gRm9yIGV4YW1wbGUsIGlmIGFuIEFQSyBzdXBwb3J0cyBzY3JlZW4KQEAgLTQ2Nyw4ICs0NjcsOCBAQAogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1lbGVtZW50Lmh0bWwjdm5hbWUiPntAY29kZSBhbmRyb2lkOnZlcnNpb25OYW1lfTwvYT4pLAogc28gdGhhdCBpdCdzIGVhc3kgZm9yIHlvdSB0byBhc3NvY2lhdGUgdGhlIHZlcnNpb24gY29kZSBhbmQgdmVyc2lvbiBuYW1lLjwvcD4KIAotPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gV2hlbiB5b3UgaW5jcmVhc2UgdGhlIHZlcnNpb24gY29kZSBmb3IgYW4gQVBLLCBBbmRyb2lkCi1NYXJrZXQgd2lsbCBwcm9tcHQgdXNlcnMgb2YgdGhlIHByZXZpb3VzIHZlcnNpb24gdG8gdXBkYXRlIHRoZSBhcHBsaWNhdGlvbi4gVGh1cywgdG8gYXZvaWQKKzxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFdoZW4geW91IGluY3JlYXNlIHRoZSB2ZXJzaW9uIGNvZGUgZm9yIGFuIEFQSywgR29vZ2xlCitQbGF5IHdpbGwgcHJvbXB0IHVzZXJzIG9mIHRoZSBwcmV2aW91cyB2ZXJzaW9uIHRvIHVwZGF0ZSB0aGUgYXBwbGljYXRpb24uIFRodXMsIHRvIGF2b2lkCiB1bm5lY2Vzc2FyeSB1cGRhdGVzLCB5b3Ugc2hvdWxkIG5vdCBpbmNyZWFzZSB0aGUgdmVyc2lvbiBjb2RlIGZvciBBUEtzIHRoYXQgZG8gbm90IGFjdHVhbGx5CiBpbmNsdWRlIGNoYW5nZXMuPC9wPgogCkBAIC01MDcsNyArNTA3LDcgQEAKIDxoMiBpZD0iU2luZ2xlQVBLIj5Vc2luZyBhIFNpbmdsZSBBUEsgSW5zdGVhZDwvaDI+CiAKIDxwPjxzdHJvbmc+Q3JlYXRpbmcgbXVsdGlwbGUgQVBLcyBmb3IgeW91ciBhcHBsaWNhdGlvbiBpcyBub3QgdGhlIG5vcm1hbCBwcm9jZWR1cmU8L3N0cm9uZz4gZm9yCi1wdWJsaXNoaW5nIGFuIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0LiBJbiBtb3N0IGNhc2VzLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcHVibGlzaCB5b3VyCitwdWJsaXNoaW5nIGFuIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LiBJbiBtb3N0IGNhc2VzLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcHVibGlzaCB5b3VyCiBhcHBsaWNhdGlvbiB0byBtb3N0IHVzZXJzIHdpdGggYSBzaW5nbGUgQVBLIGFuZCB3ZSBlbmNvdXJhZ2UgdGhhdCB5b3UgZG8gc28uIFdoZW4geW91IGVuY291bnRlcgogYSBzaXR1YXRpb24gaW4gd2hpY2ggdXNpbmcgYSBzaW5nbGUgQVBLIGJlY29tZXMgZGlmZmljdWx0LCB5b3Ugc2hvdWxkIGNhcmVmdWxseSBjb25zaWRlciBhbGwgeW91cgogb3B0aW9ucyBiZWZvcmUgZGVjaWRpbmcgdG8gcHVibGlzaCBtdWx0aXBsZSBBUEtzLjwvcD4KQEAgLTU0Miw3ICs1NDIsNyBAQAogRm9yIGV4YW1wbGUsIG9uIGEgbmV3IHRhYmxldCwgdGhlIHVzZXIgcmVjZWl2ZXMgeW91ciBhcHBsaWNhdGlvbiBhbmQgaXQgcnVucyB3aXRoIHlvdXIKIHRhYmxldC1vcHRpbWl6ZWQgcmVzb3VyY2VzLiBUaGlzIHJlc3RvcmUKIHByb2Nlc3MgZG9lcyBub3Qgd29yayBhY3Jvc3MgZGlmZmVyZW50IEFQS3MsIGJlY2F1c2UgZWFjaCBBUEsgY2FuIHBvdGVudGlhbGx5IGhhdmUgZGlmZmVyZW50Ci1wZXJtaXNzaW9ucyB0aGF0IHRoZSB1c2VyIGhhcyBub3QgYWdyZWVkIHRvLCBzbyBBbmRyb2lkIE1hcmtldCBtYXkgbm90IHJlc3RvcmUgdGhlIGFwcGxpY2F0aW9uIGF0CitwZXJtaXNzaW9ucyB0aGF0IHRoZSB1c2VyIGhhcyBub3QgYWdyZWVkIHRvLCBzbyBHb29nbGUgUGxheSBtYXkgbm90IHJlc3RvcmUgdGhlIGFwcGxpY2F0aW9uIGF0CiBhbGwuIChJZiB5b3UgdXNlIG11bHRpcGxlIEFQS3MsIHRoZSB1c2VyIHJlY2VpdmVzIGVpdGhlciB0aGUgZXhhY3Qgc2FtZSBBUEsgaWYgaXQncyBjb21wYXRpYmxlIG9yCiBub3RoaW5nIGF0IGFsbCBhbmQgbXVzdCBtYW51YWxseSBkb3dubG9hZCB5b3VyIGFwcGxpY2F0aW9uIHRvIGdldCB0aGUgQVBLIGRlc2lnbmVkIGZvciB0aGUgbmV3CiBkZXZpY2UuKTwvcD48L2xpPgpAQCAtNTg2LDcgKzU4Niw3IEBACiAKIDxoMyBpZD0iU2NyZWVuT3B0aW9ucyI+U3VwcG9ydGluZyBtdWx0aXBsZSBzY3JlZW5zPC9oMz4KIAotPHA+VW5sZXNzIHlvdXIgQVBLIGZpbGUgZXhjZWVkcyB0aGUgQW5kcm9pZCBNYXJrZXQgc2l6ZSBsaW1pdCBvZiA1ME1CLCBzdXBwb3J0aW5nIG11bHRpcGxlIHNjcmVlbnMKKzxwPlVubGVzcyB5b3VyIEFQSyBmaWxlIGV4Y2VlZHMgdGhlIEdvb2dsZSBQbGF5IHNpemUgbGltaXQgb2YgNTBNQiwgc3VwcG9ydGluZyBtdWx0aXBsZSBzY3JlZW5zCiBzaG91bGQgYWx3YXlzIGJlIGRvbmUgd2l0aCBhIHNpbmdsZSBBUEsuIFNpbmNlIEFuZHJvaWQgMS42LCB0aGUgQW5kcm9pZCBzeXN0ZW0gbWFuYWdlcyBtb3N0IG9mIHRoZQogd29yayByZXF1aXJlZCBmb3IgeW91ciBhcHBsaWNhdGlvbiB0byBydW4gc3VjY2Vzc2Z1bGx5IG9uIGEgdmFyaWV0eSBvZiBzY3JlZW4gc2l6ZXMgYW5kCiBkZW5zaXRpZXMuPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9jb21wYXRpYmlsaXR5LmpkIGIvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9jb21wYXRpYmlsaXR5LmpkCmluZGV4IGJiN2E3MmUuLjVlNTE0YzQgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvY29tcGF0aWJpbGl0eS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL2NvbXBhdGliaWxpdHkuamQKQEAgLTcsNyArNyw3IEBACiA8aDI+U2VlIGFsc288L2gyPgogIDxvbD4KIDxsaT48YQotaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPk1hcmtldCBGaWx0ZXJzPC9hPjwvbGk+CitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+RmlsdGVyaW5nIG9uIEdvb2dsZSBQbGF5PC9hPjwvbGk+CiA8bGk+PGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3Byb3ZpZGluZy1yZXNvdXJjZXMuaHRtbCNBbHRlcm5hdGl2ZVJlc291cmNlcyI+UHJvdmlkaW5nIEFsdGVybmF0aXZlIFJlc291cmNlczwvYT48L2xpPgogPGxpPjxhCkBAIC0zOSw3ICszOSw3IEBACiB5b3VyIGFwcHMgdG8gZG8gdGhhdCwgd2hpbGUgYXQgdGhlIHNhbWUgdGltZSBsZXR0aW5nIHlvdSBtYWludGFpbiBjb250cm9sIG9mCiB3aGF0IHR5cGVzIG9mIGRldmljZXMgeW91ciBhcHAgaXMgYXZhaWxhYmxlIHRvLiBXaXRoIGEgYml0IG9mIGZvcmV0aG91Z2h0IGFuZAogc29tZSBtaW5vciBjaGFuZ2VzIGluIHlvdXIgYXBwJ3MgbWFuaWZlc3QgZmlsZSwgeW91IGNhbiBlbnN1cmUgdGhhdCB1c2Vycwotd2hvc2UgZGV2aWNlcyBjYW7igJl0IHJ1biB5b3VyIGFwcCB3aWxsIG5ldmVyIHNlZSBpdCBpbiB0aGUgQW5kcm9pZCBNYXJrZXQsIGFuZAord2hvc2UgZGV2aWNlcyBjYW7igJl0IHJ1biB5b3VyIGFwcCB3aWxsIG5ldmVyIHNlZSBpdCBvbiBHb29nbGUgUGxheSwgYW5kCiB3aWxsIG5vdCBnZXQgaW4gdHJvdWJsZSBieSBkb3dubG9hZGluZyBpdC4gVGhpcyBwYWdlIGV4cGxhaW5zIGhvdyB5b3UgY2FuCiBjb250cm9sIHdoaWNoIGRldmljZXMgaGF2ZSBhY2Nlc3MgdG8geW91ciBhcHBzLCBhbmQgaG93IHRvIHByZXBhcmUgeW91ciBhcHBzIHRvCiBtYWtlIHN1cmUgdGhleSByZWFjaCB0aGUgcmlnaHQgYXVkaWVuY2UuPC9wPgpAQCAtNjQsNyArNjQsNyBAQAogY29ycmVzcG9uZGluZyBoYXJkd2FyZSBvciBmZWF0dXJlLiBCdXQgdGhhdOKAmXMgbm90IGEgcHJvYmxlbTogd2UgYWxzbyBkZXNpZ25lZAogQW5kcm9pZCB0byBwcmV2ZW50IGFwcHMgZnJvbSBiZWluZyB2aXNpYmxlIHRvIGRldmljZXMgd2hpY2ggZG9u4oCZdCBoYXZlIGZlYXR1cmVzCiB0aGUgYXBwcyByZXF1aXJlLiBXZeKAmXZlIGJ1aWx0IHN1cHBvcnQgZm9yIHRoaXMgcmlnaHQgaW50byB0aGUgU0RLIHRvb2xzLCBhbmQKLWl04oCZcyBwYXJ0IG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtIGl0c2VsZiwgYXMgd2VsbCBhcyBBbmRyb2lkIE1hcmtldC48L3A+CitpdOKAmXMgcGFydCBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBpdHNlbGYsIGFzIHdlbGwgYXMgcGFydCBvZiBHb29nbGUgUGxheS48L3A+CiAKIDxwPkFzIGEgZGV2ZWxvcGVyLCB5b3UgaGF2ZSBjb21wbGV0ZSBjb250cm9sIG9mIGhvdyBhbmQgd2hlcmUgeW91ciBhcHBzIGFyZQogYXZhaWxhYmxlLiBBbmRyb2lkIHByb3ZpZGVzIHRvb2xzIGFzIGEgZmlyc3QtY2xhc3MgcGFydCBvZiB0aGUgcGxhdGZvcm0gdGhhdCBsZXQKQEAgLTc5LDkgKzc5LDkgQEAKIDxsaT5Zb3Ugc3RhdGUgdGhlIGZlYXR1cmVzIHlvdXIgYXBwIHJlcXVpcmVzIGJ5IGRlY2xhcmluZyA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5odG1sIj48Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT48L2E+CiBlbGVtZW50cyBpdHMgbWFuaWZlc3QgZmlsZS48L2xpPgotPGxpPkRldmljZXMgYXJlIHJlcXVpcmVkIHRvIGRlY2xhcmUgdGhlIGZlYXR1cmVzIHRoZXkgaW5jbHVkZSB0byBBbmRyb2lkCi1NYXJrZXQuPC9saT4KLTxsaT5BbmRyb2lkIE1hcmtldCB1c2VzIHlvdXIgYXBw4oCZcyBzdGF0ZWQgcmVxdWlyZW1lbnRzIHRvIGZpbHRlciBpdCBmcm9tIGRldmljZXMKKzxsaT5EZXZpY2VzIGFyZSByZXF1aXJlZCB0byBkZWNsYXJlIHRoZSBmZWF0dXJlcyB0aGV5IGluY2x1ZGUgdG8gR29vZ2xlCitQbGF5LjwvbGk+Cis8bGk+R29vZ2xlIFBsYXkgdXNlcyB5b3VyIGFwcOKAmXMgc3RhdGVkIHJlcXVpcmVtZW50cyB0byBmaWx0ZXIgaXQgZnJvbSBkZXZpY2VzCiB0aGF0IGRvbuKAmXQgbWVldCB0aG9zZSByZXF1aXJlbWVudHMuPC9saT4KIDwvb2w+CiAKQEAgLTEwMywyNCArMTAzLDI0IEBACiAgPGRpdiBjbGFzcz0ic2lkZWJveC13cmFwcGVyIj4gCiAgIDxpbWcgaWQ9InJ1bGUiIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvZ3JhZC1ydWxlLXF2LnBuZyI+IAogICA8ZGl2IGlkPSJxdi1zdWItcnVsZSI+IAotICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjowO3BhZGRpbmc6MDsiPiAKLSAgICA8cCBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPkZpbHRlcmluZyBvbiBBbmRyb2lkIE1hcmtldDwvcD4KKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvaWNvbl9wbGF5LnBuZyIgc3R5bGU9ImZsb2F0OmxlZnQ7bWFyZ2luOjA7cGFkZGluZzowOyI+IAorICAgIDxwIHN0eWxlPSJjb2xvcjojNjY5OTk5OyI+RmlsdGVyaW5nIG9uIEdvb2dsZSBQbGF5PC9wPgogCi0gICAgPHA+QW5kcm9pZCBNYXJrZXQgZmlsdGVycyB0aGUgYXBwbGljYXRpb25zIHRoYXQgYXJlIHZpc2libGUgdG8gdXNlcnMsIHNvCisgICAgPHA+R29vZ2xlIFBsYXkgZmlsdGVycyB0aGUgYXBwbGljYXRpb25zIHRoYXQgYXJlIHZpc2libGUgdG8gdXNlcnMsIHNvCiB0aGF0IHVzZXJzIGNhbiBzZWUgYW5kIGRvd25sb2FkIG9ubHkgdGhvc2UgYXBwbGljYXRpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aAogdGhlaXIgZGV2aWNlcy48L3A+CiAKLSAgICA8cCBzdHlsZT0ibWFyZ2luLXRvcDoxZW07Ij5PbmUgb2YgdGhlIHdheXMgTWFya2V0IGZpbHRlcnMgYXBwbGljYXRpb25zIGlzIGJ5Ci1mZWF0dXJlIGNvbXBhdGliaWxpdHkuIFRvIGRvIHRoaXMsIE1hcmtldCBjaGVja3MgdGhlCisgICAgPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyI+T25lIG9mIHRoZSB3YXlzIEdvb2dsZSBQbGF5IGZpbHRlcnMgYXBwbGljYXRpb25zIGlzIGJ5CitmZWF0dXJlIGNvbXBhdGliaWxpdHkuIFRvIGRvIHRoaXMsIEdvb2dsZSBQbGF5IGNoZWNrcyB0aGUKIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbiBlYWNoIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QsIHRvCi1lc3RhYmxpc2ggdGhlIGFwcCdzIGZlYXR1cmUgbmVlZHMuIE1hcmtldCB0aGVuIHNob3dzIG9yIGhpZGVzIHRoZSBhcHBsaWNhdGlvbiB0bworZXN0YWJsaXNoIHRoZSBhcHAncyBmZWF0dXJlIG5lZWRzLiBHb29nbGUgUGxheSB0aGVuIHNob3dzIG9yIGhpZGVzIHRoZSBhcHBsaWNhdGlvbiB0bwogZWFjaCB1c2VyLCBiYXNlZCBvbiBhIGNvbXBhcmlzb24gd2l0aCB0aGUgZmVhdHVyZXMgYXZhaWxhYmxlIG9uIHRoZSB1c2VyJ3MKIGRldmljZS4gCiAKIDxwIHN0eWxlPSJtYXJnaW4tdG9wOjFlbTsiPkZvciBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBmaWx0ZXJzIHRoYXQgeW91IGNhbgogdXNlIHRvIGNvbnRyb2wgdGhlIGF2YWlsYWJpbGl0eSBvZiB5b3VyIGFwcHMsIHNlZSB0aGUgCi08YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+TWFya2V0Ci1GaWx0ZXJzPC9hPiBkb2N1bWVudC48L3A+Cis8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+RmlsdGVycyBvbiBHb29nbGUgUGxheTwvYT4KK2RvY3VtZW50LjwvcD4KICAgPC9kaXY+IAogPC9kaXY+CiAKQEAgLTE0Miw4ICsxNDIsOCBAQAogCiA8cD5XaGVuIHlvdSB3cml0ZSB5b3VyIGFwcGxpY2F0aW9uLCB5b3Ugc3BlY2lmeSB3aGljaCBmZWF0dXJlcyB5b3VyIGFwcCByZXF1aXJlcwogYnkgbGlzdGluZyB0aGVpciBmZWF0dXJlIElEcyBpbiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudHMgaW4KLXRoZSA8Y29kZT5BbmRyb2lkTWFuaWZlc3QueG1sPC9jb2RlPiBmaWxlLiAgVGhpcyBpcyB0aGUgaW5mb3JtYXRpb24gdGhhdCBBbmRyb2lkCi1NYXJrZXQgdXNlcyB0byBtYXRjaCB5b3VyIGFwcCB0byBkZXZpY2VzIHRoYXQgY2FuIHJ1biBpdC4gRm9yIGluc3RhbmNlLCBpZiB5b3UKK3RoZSA8Y29kZT5BbmRyb2lkTWFuaWZlc3QueG1sPC9jb2RlPiBmaWxlLiAgVGhpcyBpcyB0aGUgaW5mb3JtYXRpb24gdGhhdCBHb29nbGUKK1BsYXkgdXNlcyB0byBtYXRjaCB5b3VyIGFwcCB0byBkZXZpY2VzIHRoYXQgY2FuIHJ1biBpdC4gRm9yIGluc3RhbmNlLCBpZiB5b3UKIHN0YXRlIHRoYXQgeW91ciBhcHAgcmVxdWlyZXMgYW5kcm9pZC5zb2Z0d2FyZS5saXZlX3dhbGxwYXBlcnMsIGl0IHdvbuKAmXQgYmUgc2hvd24KIHRvIGRldmljZXMgdGhhdCBkb27igJl0IHN1cHBvcnQgTGl2ZSBXYWxscGFwZXJzLjwvcD4KIApAQCAtMTcwLDEyICsxNzAsMTIgQEAKIGJ1c2luZXNzIG9yIGxlZ2FsIHJlYXNvbnMuIEZvciBpbnN0YW5jZSwgYW4gYXBwIHRoYXQgZGlzcGxheXMgdHJhaW4gc2NoZWR1bGVzCiBmb3IgdGhlIExvbmRvbiBVbmRlcmdyb3VuZCBpcyB1bmxpa2VseSB0byBiZSB1c2VmdWwgdG8gdXNlcnMgb3V0c2lkZSB0aGUgVW5pdGVkCiBLaW5nZG9tLiBPdGhlciBhcHBzIG1pZ2h0IG5vdCBiZSBwZXJtaXR0ZWQgaW4gY2VydGFpbiBjb3VudHJpZXMgZm9yIGJ1c2luZXNzIG9yCi1sZWdhbCByZWFzb25zLiBGb3IgY2FzZXMgc3VjaCBhcyB0aGVzZSwgQW5kcm9pZCBNYXJrZXQgaXRzZWxmIHByb3ZpZGVzCitsZWdhbCByZWFzb25zLiBGb3IgY2FzZXMgc3VjaCBhcyB0aGVzZSwgR29vZ2xlIFBsYXkgaXRzZWxmIHByb3ZpZGVzCiBkZXZlbG9wZXJzIHdpdGggZmlsdGVyaW5nIG9wdGlvbnMgdGhhdCBhbGxvdyB0aGVtIGNvbnRyb2wgdGhlaXIgYXBw4oCZcwogYXZhaWxhYmlsaXR5IGZvciBub24tdGVjaG5pY2FsIHJlYXNvbnMuPC9wPgogCi08cD5UaGUgaGVscCBpbmZvcm1hdGlvbiBmb3IgQW5kcm9pZCBNYXJrZXQgcHJvdmlkZXMgZnVsbCBkZXRhaWxzLCBidXQgaW4gYQotbnV0c2hlbGwsIGRldmVsb3BlcnMgY2FuIHVzZSB0aGUgTWFya2V0IHB1Ymxpc2hlciBVSSB0bzo8L3A+Cis8cD5UaGUgaGVscCBpbmZvcm1hdGlvbiBmb3IgR29vZ2xlIFBsYXkgcHJvdmlkZXMgZnVsbCBkZXRhaWxzLCBidXQgaW4gYQorbnV0c2hlbGwsIGRldmVsb3BlcnMgY2FuIHVzZSB0aGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIFVJIHRvOjwvcD4KIAogPHVsPgogPGxpPkxpc3QgdGhlIGNvdW50cmllcyBhbiBhcHAgaXMgYXZhaWxhYmxlIGluLjwvbGk+CkBAIC0xODUsNyArMTg1LDcgQEAKIDxwPkZpbHRlcmluZyBmb3IgdGVjaG5pY2FsIGNvbXBhdGliaWxpdHkgKHN1Y2ggYXMgcmVxdWlyZWQgaGFyZHdhcmUgY29tcG9uZW50cykKIGlzIGFsd2F5cyBiYXNlZCBvbiBpbmZvcm1hdGlvbiBjb250YWluZWQgd2l0aGluIHlvdXIgPGNvZGU+LmFwazwvY29kZT4gZmlsZS4gQnV0CiBmaWx0ZXJpbmcgZm9yIG5vbi10ZWNobmljYWwgcmVhc29ucyAoc3VjaCBhcyBnZW9ncmFwaGljIHJlc3RyaWN0aW9ucykgaXMgYWx3YXlzCi1oYW5kbGVkIGluIHRoZSBNYXJrZXQgdXNlciBpbnRlcmZhY2UuPC9wPgoraGFuZGxlZCBpbiB0aGUgR29vZ2xlIFBsYXkgdXNlciBpbnRlcmZhY2UuPC9wPgogCiA8aDMgaWQ9ImZ1dHVyZXByb29maW5nIj5GdXR1cmUtcHJvb2Zpbmc8L2gzPgogCkBAIC0yMDYsNyArMjA2LDcgQEAKIGJhcmNvZGUgc2Nhbm5lcnMgZG8gbm90IGZ1bmN0aW9uIGFzIHdlbGwgd2l0aCBjYW1lcmFzIHRoYXQgZG8gbm90IGF1dG8tZm9jdXMuIFRvCiBwcmV2ZW50IHVzZXJzIGZyb20gaGF2aW5nIGEgYmFkIGV4cGVyaWVuY2Ugd2l0aCB0aG9zZSBhcHBzLCBleGlzdGluZyBhcHBzIHRoYXQKIG9idGFpbiBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgQ2FtZXJhIHdlcmUgYXNzdW1lZCBieSBkZWZhdWx0IHRvIHJlcXVpcmUKLWF1dG8tZm9jdXMuIFRoaXMgYWxsb3dlZCBBbmRyb2lkIE1hcmtldCB0byBmaWx0ZXIgdGhvc2UgYXBwcyBmcm9tIGRldmljZXMgdGhhdAorYXV0by1mb2N1cy4gVGhpcyBhbGxvd2VkIEdvb2dsZSBQbGF5IHRvIGZpbHRlciB0aG9zZSBhcHBzIGZyb20gZGV2aWNlcyB0aGF0CiBsYWNrIGF1dG8tZm9jdXMuPC9saT4KIAogPGxpPkFuZHJvaWQgMi4yLCBtZWFud2hpbGUsIGFsbG93ZWQgdGhlIG1pY3JvcGhvbmUgdG8gYmUgb3B0aW9uYWwgb24gc29tZQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9kZXNpZ24vYWNjZXNzaWJpbGl0eS5qZCBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvZGVzaWduL2FjY2Vzc2liaWxpdHkuamQKaW5kZXggYTY2YTk3NC4uNzJkYTA0ZSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9kZXNpZ24vYWNjZXNzaWJpbGl0eS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL2Rlc2lnbi9hY2Nlc3NpYmlsaXR5LmpkCkBAIC0zMzIsMTEgKzMzMiwxMCBAQAogCiA8cD5Zb3UgY2FuIHNpbXVsYXRlIHRoZSBleHBlcmllbmNlIGZvciBtYW55IHVzZXJzIGJ5IGVuYWJsaW5nIGFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSB0aGF0IHNwZWFrcwogYXMgeW91IG1vdmUgYXJvdW5kIHRoZSBzY3JlZW4uICBPbmUgc3VjaCBzZXJ2aWNlIGlzIDxhCi1ocmVmPSJodHRwczovL21hcmtldC5hbmRyb2lkLmNvbS9kZXRhaWxzP2lkPWNvbS5nb29nbGUuYW5kcm9pZC5tYXJ2aW4udGFsa2JhY2siPlRhbGtCYWNrPC9hPiwgYnkgdGhlCitocmVmPSJodHRwczovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9kZXRhaWxzP2lkPWNvbS5nb29nbGUuYW5kcm9pZC5tYXJ2aW4udGFsa2JhY2siPlRhbGtCYWNrPC9hPiwgYnkgdGhlCiA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZXllcy1mcmVlLyI+RXllcy1GcmVlIFByb2plY3Q8L2E+LiAgSXQgY29tZXMgcHJlaW5zdGFsbGVkIG9uIG1hbnkKLUFuZHJvaWQtcG93ZXJlZCBkZXZpY2VzLCBidXQgaXMgYWxzbyBhdmFpbGFibGUgZm9yIGZyZWUgZnJvbSA8YQotaHJlZj0iaHR0cHM6Ly9tYXJrZXQuYW5kcm9pZC5jb20vZGV0YWlscz9pZD1jb20uZ29vZ2xlLmFuZHJvaWQubWFydmluLnRhbGtiYWNrIj5BbmRyb2lkCi1NYXJrZXQ8L2E+LjwvcD4KK0FuZHJvaWQtcG93ZXJlZCBkZXZpY2VzLCBidXQgaXMgYWxzbyBhdmFpbGFibGUgZm9yIGZyZWUgZnJvbSB0aGUgPGEKK2hyZWY9Imh0dHBzOi8vcGxheS5nb29nbGUuY29tL3N0b3JlL2RldGFpbHM/aWQ9Y29tLmdvb2dsZS5hbmRyb2lkLm1hcnZpbi50YWxrYmFjayI+R29vZ2xlIFBsYXk8L2E+IHN0b3JlLjwvcD4KIAogPHA+VGhpcyBzZXJ2aWNlIHJlcXVpcmVzIHRoYXQgeW91IGhhdmUgYSB0ZXh0LXRvLXNwZWVjaCBlbmdpbmUgaW5zdGFsbGVkIG9uIHlvdXIgcGhvbmUuICBZb3UgY2FuCiB2ZXJpZnkgaWYgeW91IGhhdmUgb25lIGluc3RhbGxlZCBpbiB0aGUgPHN0cm9uZz5UZXh0LXRvLXNwZWVjaDwvc3Ryb25nPiBzZXR0aW5ncyBtZW51IGJ5IHNlbGVjdGluZwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9vcHRpbWl6aW5nLWZvci0zLjAuamQgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL29wdGltaXppbmctZm9yLTMuMC5qZAppbmRleCAzOTY2MmYxLi4xNDBjNTBjIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL29wdGltaXppbmctZm9yLTMuMC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL29wdGltaXppbmctZm9yLTMuMC5qZApAQCAtNDgxLDcgKzQ4MSw3IEBACiBjb25maWd1cmF0aW9ucyBvZiBzY3JlZW4gc2l6ZSBhbmQgZGVuc2l0eSwgeW91IGNhbiBpbnN0ZWFkIGNob29zZSB0byBsaW1pdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHlvdXIKIGFwcGxpY2F0aW9uIHRvIGNlcnRhaW4gdHlwZXMgb2Ygc2NyZWVucywgc3VjaCBhcyBvbmx5IHRhYmxldHMgb3Igb25seSBtb2JpbGUgZGV2aWNlcy4gVG8gZG8gc28sIHlvdQogY2FuIGFkZCBlbGVtZW50cyB0byB5b3VyIEFuZHJvaWQgbWFuaWZlc3QgZmlsZSB0aGF0IGVuYWJsZSBmaWx0ZXJpbmcgYmFzZWQgb24gc2NyZWVuIGNvbmZpZ3VyYXRpb24KLWJ5IGV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQuPC9wPgorYnkgZXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBHb29nbGUgUGxheS48L3A+CiAKIDxwPkhvd2V2ZXIsIGJlZm9yZSB5b3UgZGVjaWRlIHRvIHJlc3RyaWN0IHlvdXIgYXBwbGljYXRpb24gdG8gY2VydGFpbiBzY3JlZW4gY29uZmlndXJhdGlvbnMsIHlvdQogc2hvdWxkIHVuZGVyc3RhbmQgdGhlIHRlY2huaXF1ZXMgZm9yIDxhCkBAIC01MTcsMTQgKzUxNywxNCBAQAogJmx0Oy9tYW5pZmVzdD4KIDwvcHJlPgogCi08cD5FeHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0IHJlYWQgdGhpcyBtYW5pZmVzdCBlbGVtZW50IGFuZCB1c2UgaXQgdG8gZW5zdXJlIHRoYXQKKzxwPkV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgR29vZ2xlIFBsYXkgcmVhZCB0aGlzIG1hbmlmZXN0IGVsZW1lbnQgYW5kIHVzZSBpdCB0byBlbnN1cmUgdGhhdAogeW91ciBhcHBsaWNhdGlvbiBpcyBhdmFpbGFibGUgb25seSB0byBkZXZpY2VzIHdpdGggYW4gZXh0cmEgbGFyZ2Ugc2NyZWVuLjwvcD4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IHVzZSB0aGUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtc2NyZWVucy1lbGVtZW50Lmh0bWwiPntAY29kZQogJmx0O3N1cHBvcnRzLXNjcmVlbnM+fTwvYT4gZWxlbWVudCBmb3IgdGhlIHJldmVyc2Ugc2NlbmFyaW8gKHdoZW4geW91ciBhcHBsaWNhdGlvbiBpcyBub3QgY29tcGF0aWJsZQogd2l0aCA8ZW0+bGFyZ2VyPC9lbT4gc2NyZWVucykgYW5kIHNldCB0aGUgbGFyZ2VyIHNjcmVlbiBzaXplIGF0dHJpYnV0ZXMgdG8ge0Bjb2RlICJmYWxzZSJ9LCB0aGVuCi1leHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0IDxzdHJvbmc+ZG8gbm90PC9zdHJvbmc+IGFwcGx5IGZpbHRlcmluZy4gWW91ciBhcHBsaWNhdGlvbgorZXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBHb29nbGUgUGxheSA8c3Ryb25nPmRvIG5vdDwvc3Ryb25nPiBhcHBseSBmaWx0ZXJpbmcuIFlvdXIgYXBwbGljYXRpb24KIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlIHRvIGxhcmdlciBzY3JlZW5zLCBidXQgd2hlbiBpdCBydW5zLCBpdCB3aWxsIG5vdCBmaWxsIHRoZSBzY3JlZW4mbWRhc2g7dGhlCiBzeXN0ZW0gd2lsbCBkcmF3IGl0IGluIGEgInBvc3RhZ2Ugc3RhbXAiIHdpbmRvdyB0aGF0J3MgdGhlIHNhbWUgcmVsYXRpdmUgc2l6ZSBhcyB0aGUgc2NyZWVuIHNpemUKIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBkb2VzIHN1cHBvcnQuIElmIHlvdSB3YW50IHRvIHByZXZlbnQgeW91ciBhcHBsaWNhdGlvbiBmcm9tIGJlaW5nIGRvd25sb2FkZWQgb24KQEAgLTU0MSw3ICs1NDEsNyBAQAogdXNlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2NvbXBhdGlibGUtc2NyZWVucy1lbGVtZW50Lmh0bWwiPntAY29kZQogJmx0O2NvbXBhdGlibGUtc2NyZWVucz59PC9hPiBlbGVtZW50IHRvIG1hbmFnZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHlvdXIgYXBwbGljYXRpb24gYmFzZWQgb24gdGhlCiBjb21iaW5hdGlvbiBvZiBzY3JlZW4gc2l6ZSBhbmQgZGVuc2l0eS4gRXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcwotQW5kcm9pZCBNYXJrZXQgdXNlcyB0aGlzIGluZm9ybWF0aW9uIHRvIGFwcGx5IGZpbHRlcmluZyB0byB5b3VyIGFwcGxpY2F0aW9uLCBzbyB0aGF0IG9ubHkgZGV2aWNlcworR29vZ2xlIFBsYXkgdXNlcyB0aGlzIGluZm9ybWF0aW9uIHRvIGFwcGx5IGZpbHRlcmluZyB0byB5b3VyIGFwcGxpY2F0aW9uLCBzbyB0aGF0IG9ubHkgZGV2aWNlcwogdGhhdCBoYXZlIGEgc2NyZWVuIGNvbmZpZ3VyYXRpb24gd2l0aCB3aGljaCB5b3UgZGVjbGFyZSBjb21wYXRpYmlsaXR5IGNhbiBkb3dubG9hZCB5b3VyCiBhcHBsaWNhdGlvbi48L3A+CiAKQEAgLTU1MSw3ICs1NTEsNyBAQAogdGhlIHtAY29kZSBhbmRyb2lkOnNjcmVlblNpemV9IGFuZCB7QGNvZGUgYW5kcm9pZDpzY3JlZW5EZW5zaXR5fSBhdHRyaWJ1dGVzLiBFYWNoIHtAY29kZQogJmx0O3NjcmVlbiZndDt9IGVsZW1lbnQgPHN0cm9uZz5tdXN0IGluY2x1ZGUgYm90aCBhdHRyaWJ1dGVzPC9zdHJvbmc+IHRvIHNwZWNpZnkgYW4gaW5kaXZpZHVhbAogc2NyZWVuIGNvbmZpZ3VyYXRpb24mbWRhc2g7aWYgZWl0aGVyIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLCB0aGVuIHRoZSBlbGVtZW50IGlzIGludmFsaWQKLShleHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0IHdpbGwgaWdub3JlIGl0KS48L3A+CisoZXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBHb29nbGUgUGxheSB3aWxsIGlnbm9yZSBpdCkuPC9wPgogCiA8cD5Gb3IgZXhhbXBsZSwgaWYgeW91ciBhcHBsaWNhdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggb25seSBzbWFsbCBhbmQgbm9ybWFsIHNjcmVlbnMsIHJlZ2FyZGxlc3MKIG9mIHNjcmVlbiBkZW5zaXR5LCB0aGVuIHlvdSBtdXN0IHNwZWNpZnkgZWlnaHQgZGlmZmVyZW50IHtAY29kZSAmbHQ7c2NyZWVuJmd0O30gZWxlbWVudHMsCkBAIC02MTMsNyArNjEzLDcgQEAKICAgPGxpPjxhIGhyZWY9IiNUZWxlcGhvbnkiPk5vdCBhbGwgZGV2aWNlcyBoYXZlIHRlbGVwaG9ueSBvciBvdGhlciBmZWF0dXJlczwvYT4KICAgPHA+SWYgeW91ciBhcHBsaWNhdGlvbiBkZWNsYXJlcyB0aGUge0Bjb2RlICJhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSJ9IGZlYXR1cmUgaW4gdGhlIG1hbmlmZXN0LAogdGhlbiBpdCB3aWxsIG5vdCBiZSBhdmFpbGFibGUgdG8gZGV2aWNlcyB0aGF0IGRvIG5vdCBvZmZlciB0ZWxlcGhvbnkgKHN1Y2ggYXMgdGFibGV0cyksIGJhc2VkIG9uCi1BbmRyb2lkIE1hcmtldCBmaWx0ZXJpbmcuIElmIHlvdXIgYXBwbGljYXRpb24gY2FuIGZ1bmN0aW9uIHByb3Blcmx5IHdpdGhvdXQgdGVsZXBob255LCB5b3Ugc2hvdWxkCitHb29nbGUgUGxheSBmaWx0ZXJpbmcuIElmIHlvdXIgYXBwbGljYXRpb24gY2FuIGZ1bmN0aW9uIHByb3Blcmx5IHdpdGhvdXQgdGVsZXBob255LCB5b3Ugc2hvdWxkCiB1cGRhdGUgeW91ciBhcHBsaWNhdGlvbiB0byBncmFjZWZ1bGx5IGRpc2FibGUgdGhlIHRlbGVwaG9ueSBmZWF0dXJlcyB3aGVuIG5vdCBhdmFpbGFibGUgb24gYQogZGV2aWNlLjwvcD48L2xpPgogPC91bD4KQEAgLTY4Miw3ICs2ODIsNyBAQAogPHByZT4mbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkiIC8+PC9wcmU+CiAKIDxwPkJ5IGRlZmF1bHQsIHRoaXMgZGVjbGFyZXMgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIDxlbT5yZXF1aXJlczwvZW0+IHRlbGVwaG9ueSBmZWF0dXJlcy4gU28sCi1leHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGZpbHRlciB5b3VyIGFwcGxpY2F0aW9uIGZyb20KK2V4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgR29vZ2xlIFBsYXkgdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZmlsdGVyIHlvdXIgYXBwbGljYXRpb24gZnJvbQogZGV2aWNlcyB0aGF0IGRvIG5vdCBvZmZlciB0ZWxlcGhvbnkuPC9wPgogCiA8cD5JZiwgaG93ZXZlciwgeW91ciBhcHBsaWNhdGlvbiB1c2VzLCBidXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgZmVhdHVyZSwgeW91IHNob3VsZApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9zY3JlZW5zLWRpc3RyaWJ1dGlvbi5qZCBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvc2NyZWVucy1kaXN0cmlidXRpb24uamQKaW5kZXggNjBjOWM5NS4uYTdjNGE4ZSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9zY3JlZW5zLWRpc3RyaWJ1dGlvbi5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3NjcmVlbnMtZGlzdHJpYnV0aW9uLmpkCkBAIC0zNyw3ICszNyw3IEBACiBjb25maWd1cmF0aW9ucyBvZiBzY3JlZW4gc2l6ZSBhbmQgZGVuc2l0eSwgeW91IGNhbiBpbnN0ZWFkIGNob29zZSB0byBsaW1pdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHlvdXIKIGFwcGxpY2F0aW9uIHRvIGNlcnRhaW4gdHlwZXMgb2Ygc2NyZWVucywgc3VjaCBhcyBvbmx5IHRhYmxldHMgYW5kIG90aGVyIGxhcmdlIGRldmljZXMgb3Igb25seQogaGFuZHNldHMgYW5kIHNpbWlsYXItc2l6ZWQgZGV2aWNlcy4gVG8gZG8gc28sIHlvdSBjYW4gZW5hYmxlIGZpbHRlcmluZyBieSBleHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzCi1BbmRyb2lkIE1hcmtldCBieSBhZGRpbmcgZWxlbWVudHMgdG8geW91ciBtYW5pZmVzdCBmaWxlIHRoYXQgc3BlY2lmeSB0aGUgc2NyZWVuIGNvbmZpZ3VyYXRpb25zIHlvdXIKK0dvb2dsZSBQbGF5IGJ5IGFkZGluZyBlbGVtZW50cyB0byB5b3VyIG1hbmlmZXN0IGZpbGUgdGhhdCBzcGVjaWZ5IHRoZSBzY3JlZW4gY29uZmlndXJhdGlvbnMgeW91cgogYXBwbGljYXRpb24gc3VwcG9ydHMuPC9wPgogCiA8cD5Ib3dldmVyLCBiZWZvcmUgeW91IGRlY2lkZSB0byByZXN0cmljdCB5b3VyIGFwcGxpY2F0aW9uIHRvIGNlcnRhaW4gc2NyZWVuIGNvbmZpZ3VyYXRpb25zLCB5b3UKQEAgLTU4LDcgKzU4LDcgQEAKIHZlcnNpb25zIG9mIHlvdXIgYXBwbGljYXRpb24gZm9yIGRpZmZlcmVudCBzY3JlZW4gY29uZmlndXJhdGlvbnMuIEluIHN1Y2ggYSBjYXNlLCB5b3UgY2FuIHVzZSB0aGUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvY29tcGF0aWJsZS1zY3JlZW5zLWVsZW1lbnQuaHRtbCI+e0Bjb2RlCiAmbHQ7Y29tcGF0aWJsZS1zY3JlZW5zPn08L2E+IGVsZW1lbnQgdG8gbWFuYWdlIHRoZSBkaXN0cmlidXRpb24gb2YgeW91ciBhcHBsaWNhdGlvbiBiYXNlZCBvbgotY29tYmluYXRpb25zIG9mIHNjcmVlbiBzaXplIGFuZCBkZW5zaXR5LiBFeHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0IHVzZSB0aGlzCitjb21iaW5hdGlvbnMgb2Ygc2NyZWVuIHNpemUgYW5kIGRlbnNpdHkuIEV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgR29vZ2xlIFBsYXkgdXNlIHRoaXMKIGluZm9ybWF0aW9uIHRvIGFwcGx5IGZpbHRlcmluZyB0byB5b3VyIGFwcGxpY2F0aW9uLCBzbyB0aGF0IG9ubHkgZGV2aWNlcyB0aGF0IGhhdmUgYSBzY3JlZW4KIGNvbmZpZ3VyYXRpb24gd2l0aCB3aGljaCB5b3UgZGVjbGFyZSBjb21wYXRpYmlsaXR5IGNhbiBkb3dubG9hZCB5b3VyIGFwcGxpY2F0aW9uLjwvcD4KIApAQCAtNjgsNyArNjgsNyBAQAogY29tcGF0aWJsZSwgdXNpbmcgYm90aCB0aGUge0Bjb2RlIGFuZHJvaWQ6c2NyZWVuU2l6ZX0gYW5kIHtAY29kZSBhbmRyb2lkOnNjcmVlbkRlbnNpdHl9IGF0dHJpYnV0ZXMuCiBFYWNoIHtAY29kZSAmbHQ7c2NyZWVuJmd0O30gZWxlbWVudCA8c3Ryb25nPm11c3QgaW5jbHVkZSBib3RoIGF0dHJpYnV0ZXM8L3N0cm9uZz4gdG8gc3BlY2lmeSBhbgogaW5kaXZpZHVhbCBzY3JlZW4gY29uZmlndXJhdGlvbiZtZGFzaDtpZiBlaXRoZXIgYXR0cmlidXRlIGlzIG1pc3NpbmcsIHRoZW4gdGhlIGVsZW1lbnQgaXMgaW52YWxpZAotKGV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQgd2lsbCBpZ25vcmUgaXQpLjwvcD4KKyhleHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEdvb2dsZSBQbGF5IHdpbGwgaWdub3JlIGl0KS48L3A+CiAKIDxwPkZvciBleGFtcGxlLCBpZiB5b3VyIGFwcGxpY2F0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCBvbmx5IHNtYWxsIGFuZCBub3JtYWwgc2l6ZSBzY3JlZW5zLAogcmVnYXJkbGVzcyBvZiBzY3JlZW4gZGVuc2l0eSwgeW91IG11c3Qgc3BlY2lmeSBlaWdodCBkaWZmZXJlbnQge0Bjb2RlICZsdDtzY3JlZW4mZ3Q7fSBlbGVtZW50cywKQEAgLTE3Myw3ICsxNzMsNyBAQAogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9zdXBwb3J0cy1zY3JlZW5zLWVsZW1lbnQuaHRtbCI+e0Bjb2RlCiAmbHQ7c3VwcG9ydHMtc2NyZWVucz59PC9hPiBlbGVtZW50IGZvciB0aGUgcmV2ZXJzZSBzY2VuYXJpbyAod2hlbiB5b3VyIGFwcGxpY2F0aW9uIGlzIG5vdCBjb21wYXRpYmxlCiB3aXRoIDxlbT5sYXJnZXI8L2VtPiBzY3JlZW5zKSBhbmQgc2V0IHRoZSBsYXJnZXIgc2NyZWVuIHNpemUgYXR0cmlidXRlcyB0byB7QGNvZGUgImZhbHNlIn0sIHRoZW4KLWV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQgPHN0cm9uZz5kbyBub3Q8L3N0cm9uZz4gYXBwbHkgZmlsdGVyaW5nLiBZb3VyIGFwcGxpY2F0aW9uCitleHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEdvb2dsZSBQbGF5IDxzdHJvbmc+ZG8gbm90PC9zdHJvbmc+IGFwcGx5IGZpbHRlcmluZy4gWW91ciBhcHBsaWNhdGlvbgogd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUgdG8gbGFyZ2VyIHNjcmVlbnMsIGJ1dCB3aGVuIGl0IHJ1bnMsIGl0IHdpbGwgbm90IHJlc2l6ZSB0byBmaXQgdGhlIHNjcmVlbi4KIEluc3RlYWQsIHRoZSBzeXN0ZW0gd2lsbCBlbXVsYXRlIGEgaGFuZHNldCBzY3JlZW4gc2l6ZSAoYWJvdXQgMzIwZHAgeCA0ODBkcDsgc2VlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHJhY3RpY2VzL3NjcmVlbi1jb21wYXQtbW9kZS5odG1sIj5TY3JlZW4gQ29tcGF0aWJpbGl0eSBNb2RlPC9hPiBmb3IgbW9yZQpAQCAtMTk3LDEzICsxOTcsMTMgQEAKIAogPGgyIGlkPSJNdWx0aUFwa3MiPlB1Ymxpc2hpbmcgTXVsdGlwbGUgQVBLcyBmb3IgRGlmZmVyZW50IFNjcmVlbnM8L2gyPgogCi08cD5BbHRob3VnaCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgcHVibGlzaCBvbmUgQVBLIGZvciB5b3VyIGFwcGxpY2F0aW9uLCBBbmRyb2lkIE1hcmtldCBhbGxvd3MKKzxwPkFsdGhvdWdoIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBwdWJsaXNoIG9uZSBBUEsgZm9yIHlvdXIgYXBwbGljYXRpb24sIEdvb2dsZSBQbGF5IGFsbG93cwogeW91IHRvIHB1Ymxpc2ggbXVsdGlwbGUgQVBLcyBmb3IgdGhlIHNhbWUKIGFwcGxpY2F0aW9uIHdoZW4gZWFjaCBBUEsgc3VwcG9ydHMgYSBkaWZmZXJlbnQgc2V0IG9mIHNjcmVlbiBjb25maWd1cmF0aW9ucyAoYXMgZGVjbGFyZWQgaW4KIHRoZSBtYW5pZmVzdCBmaWxlKS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHB1Ymxpc2ggYm90aCBhIGhhbmRzZXQgdmVyc2lvbiBhbmQgYSB0YWJsZXQKIHZlcnNpb24gb2YgeW91ciBhcHBsaWNhdGlvbiwgYnV0IHlvdSdyZSB1bmFibGUgdG8gbWFrZSB0aGUgc2FtZSBBUEsgd29yayBmb3IgYm90aCBzY3JlZW4gc2l6ZXMsCiB5b3UgY2FuIGFjdHVhbGx5IHB1Ymxpc2ggdHdvIEFQS3MgZm9yIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGxpc3RpbmcuIERlcGVuZGluZyBvbiBlYWNoIGRldmljZSdzCi1zY3JlZW4gY29uZmlndXJhdGlvbiwgQW5kcm9pZCBNYXJrZXQgd2lsbCBkZWxpdmVyIGl0IHRoZSBBUEsgdGhhdCB5b3UndmUgZGVjbGFyZWQgdG8gc3VwcG9ydCB0aGF0CitzY3JlZW4gY29uZmlndXJhdGlvbiwgR29vZ2xlIFBsYXkgd2lsbCBkZWxpdmVyIGl0IHRoZSBBUEsgdGhhdCB5b3UndmUgZGVjbGFyZWQgdG8gc3VwcG9ydCB0aGF0CiBkZXZpY2UncyBzY3JlZW4uPC9wPgogCiA8cD5CZXdhcmUsIGhvd2V2ZXIsIHRoYXQgcHVibGlzaGluZyBtdWx0aXBsZSBBUEtzIGZvciB0aGUgc2FtZSBhcHBsaWNhdGlvbiBpcwpAQCAtMjEyLDUgKzIxMiw1IEBACiBzaXplcywgZXNwZWNpYWxseSwgaXMgd2l0aGluIHJlYXNvbiB1c2luZyBhIHNpbmdsZSBBUEssIGFzIGxvbmcgYXMgeW91IGZvbGxvdyB0aGUgZ3VpZGUgdG8KIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0Lmh0bWwiPlN1cHBvcnRpbmcgTXVsdGlwbGUgU2NyZWVuczwvYT4uPC9wPgogCi08cD5JZiB5b3UgbmVlZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBwdWJsaXNoIG11bHRpcGxlIEFQS3Mgb24gQW5kcm9pZCBNYXJrZXQsIHJlYWQgPGEKKzxwPklmIHlvdSBuZWVkIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHB1Ymxpc2ggbXVsdGlwbGUgQVBLcyBvbiBHb29nbGUgUGxheSwgcmVhZCA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9wdWJsaXNoaW5nL211bHRpcGxlLWFwa3MuaHRtbCI+TXVsdGlwbGUgQVBLIFN1cHBvcnQ8L2E+LjwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0LmpkIGIvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuamQKaW5kZXggZmIxMjFiZC4uMjlkZmYyNiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuamQKQEAgLTg4Miw4ICs4ODIsOCBAQAogCiAgIDxwIGNsYXNzPSJjYXV0aW9uIj48c3Ryb25nPkNhdXRpb246PC9zdHJvbmc+IFRoZSBBbmRyb2lkIHN5c3RlbSBkb2VzIG5vdCBwYXkgYXR0ZW50aW9uIHRvIHRoaXMKIGF0dHJpYnV0ZSwgc28gaXQgZG9lcyBub3QgYWZmZWN0IGhvdyB5b3VyIGFwcGxpY2F0aW9uIGJlaGF2ZXMgYXQgcnVudGltZS4gSW5zdGVhZCwgaXQgaXMgdXNlZAotdG8gZW5hYmxlIGZpbHRlcmluZyBmb3IgeW91ciBhcHBsaWNhdGlvbiBvbiBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0LiBIb3dldmVyLAotPHN0cm9uZz5BbmRyb2lkIE1hcmtldCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGF0dHJpYnV0ZSBmb3IgZmlsdGVyaW5nPC9zdHJvbmc+IChvbiBBbmRyb2lkCit0byBlbmFibGUgZmlsdGVyaW5nIGZvciB5b3VyIGFwcGxpY2F0aW9uIG9uIHNlcnZpY2VzIHN1Y2ggYXMgR29vZ2xlIFBsYXkuIEhvd2V2ZXIsCis8c3Ryb25nPkdvb2dsZSBQbGF5IGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgYXR0cmlidXRlIGZvciBmaWx0ZXJpbmc8L3N0cm9uZz4gKG9uIEFuZHJvaWQKIDMuMiksIHNvIHlvdSBzaG91bGQgY29udGludWUgdXNpbmcgdGhlIG90aGVyIHNpemUgYXR0cmlidXRlcyBpZiB5b3VyIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBvcnQKIHNtYWxsIHNjcmVlbnMuPC9wPgogPC9kZD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9hY3Rpdml0eV90YXNrX2Rlc2lnbi5qZCBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9hY3Rpdml0eV90YXNrX2Rlc2lnbi5qZAppbmRleCA5YmU3MmVlLi5mOGNhM2Y4IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3VpX2d1aWRlbGluZXMvYWN0aXZpdHlfdGFza19kZXNpZ24uamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL2FjdGl2aXR5X3Rhc2tfZGVzaWduLmpkCkBAIC04ODYsNyArODg2LDcgQEAKICAgWW91IGNhbiBwZXJmb3JtIHRoaXMgdGVzdCB3aGVuIGluaXRpYWxpemluZyB0aGUgdXNlciBpbnRlcmZhY2UuCiAgIEZvciBpbnN0YW5jZSwgeW91IGNvdWxkIGRpc2FibGUgdGhlIHVzZXIgY29udHJvbCB0aGF0IGluaXRpYXRlcwogICB0aGUgSW50ZW50IG9iamVjdCwgb3IgZGlzcGxheSBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgdGhhdCBsZXRzIHRoZW0gZ28KLSAgdG8gYSBsb2NhdGlvbiwgc3VjaCBhcyB0aGUgTWFya2V0LCB0byBkb3dubG9hZCBpdHMgYXBwbGljYXRpb24uCisgIHRvIGEgbG9jYXRpb24sIHN1Y2ggYXMgR29vZ2xlIFBsYXksIHRvIGRvd25sb2FkIGl0cyBhcHBsaWNhdGlvbi4KICAgSW4gdGhpcyB3YXksIHlvdXIgY29kZSBjYW4gc3RhcnQgdGhlIGFjdGl2aXR5ICh1c2luZyBlaXRoZXIgc3RhcnRBY3Rpdml0eSgpIAogICBvciBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KCkpIG9ubHkgaWYgdGhlIGludGVudCBoYXMgdGVzdGVkIHRvIHJlc29sdmUKICAgdG8gYW4gYWN0aXZpdHkgdGhhdCBpcyBhY3R1YWxseSBwcmVzZW50LgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL2ljb25fZGVzaWduX2xhdW5jaGVyLmpkIGIvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL2ljb25fZGVzaWduX2xhdW5jaGVyLmpkCmluZGV4IDZiNjg2YjEuLjRiNjc2OGYgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9pY29uX2Rlc2lnbl9sYXVuY2hlci5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3VpX2d1aWRlbGluZXMvaWNvbl9kZXNpZ25fbGF1bmNoZXIuamQKQEAgLTQ5LDkgKzQ5LDkgQEAKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9pY29uX2Rlc2lnbi5odG1sI2Rlc2lnbi10aXBzIj5UaXBzIGZvciBEZXNpZ25lcnM8L2E+CiBmb3Igc3VnZ2VzdGlvbnMgb24gaG93IHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBzZXRzIG9mIGljb25zLjwvcD4KIAotPHA+QSBoaWdoLXJlc29sdXRpb24gdmVyc2lvbiBvZiB5b3VyIGFwcGxpY2F0aW9uIGxhdW5jaGVyIGljb24gaXMgYWxzbyByZXF1aXJlZCBieSBBbmRyb2lkIE1hcmtldAorPHA+QSBoaWdoLXJlc29sdXRpb24gdmVyc2lvbiBvZiB5b3VyIGFwcGxpY2F0aW9uIGxhdW5jaGVyIGljb24gaXMgYWxzbyByZXF1aXJlZCBieSBHb29nbGUgUGxheQogZm9yIHVzZSBpbiBhcHBsaWNhdGlvbiBsaXN0aW5ncy4gRm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzLCBzZWUgPGEKLWhyZWY9IiNpY29uc19pbl9tYXJrZXQiPkFwcGxpY2F0aW9uIEljb25zIGluIEFuZHJvaWQgTWFya2V0PC9hPiBiZWxvdy48L3A+CitocmVmPSIjaWNvbnNfaW5fbWFya2V0Ij5BcHBsaWNhdGlvbiBJY29ucyBvbiBHb29nbGUgUGxheTwvYT4gYmVsb3cuPC9wPgogCiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+CkBAIC04MSw3ICs4MSw3IEBACiAKIDxvbD4KICAgPGxpPlByb21vdGUgdGhlIGJyYW5kIGFuZCB0ZWxsIHRoZSBzdG9yeSBvZiB0aGUgYXBwLjwvbGk+Ci0gIDxsaT5IZWxwIHVzZXJzIGRpc2NvdmVyIHRoZSBhcHAgaW4gQW5kcm9pZCBNYXJrZXQuPC9saT4KKyAgPGxpPkhlbHAgdXNlcnMgZGlzY292ZXIgdGhlIGFwcCBvbiBHb29nbGUgUGxheS48L2xpPgogICA8bGk+RnVuY3Rpb24gd2VsbCBpbiB0aGUgTGF1bmNoZXIuPC9saT4KIDwvb2w+CiAKQEAgLTEwMCwxOSArMTAwLDE5IEBACiA8L3VsPgogCiAKLTxoMyBpZD0iaGVscF91c2Vyc19kaXNjb3ZlciI+SGVscCB1c2VycyBkaXNjb3ZlciB0aGUgYXBwIGluIEFuZHJvaWQgTWFya2V0PC9oMz4KKzxoMyBpZD0iaGVscF91c2Vyc19kaXNjb3ZlciI+SGVscCB1c2VycyBkaXNjb3ZlciB0aGUgYXBwIG9uIEdvb2dsZSBQbGF5PC9oMz4KIAotPHA+QXBwIGxhdW5jaGVyIGljb25zIGFyZSB0aGUgZmlyc3QgbG9vayB0aGF0IHByb3NwZWN0aXZlIHVzZXJzIHdpbGwgZ2V0IG9mIHlvdXIgYXBwIGluIEFuZHJvaWQKLU1hcmtldC4gQSBoaWdoIHF1YWxpdHkgYXBwIGljb24gY2FuIGluZmx1ZW5jZSB1c2VycyB0byBmaW5kIG91dCBtb3JlIGFzIHRoZXkgc2Nyb2xsIHRocm91Z2ggbGlzdHMgb2YKKzxwPkFwcCBsYXVuY2hlciBpY29ucyBhcmUgdGhlIGZpcnN0IGxvb2sgdGhhdCBwcm9zcGVjdGl2ZSB1c2VycyB3aWxsIGdldCBvZiB5b3VyIGFwcCBvbiBHb29nbGUgUGxheS4KK0EgaGlnaCBxdWFsaXR5IGFwcCBpY29uIGNhbiBpbmZsdWVuY2UgdXNlcnMgdG8gZmluZCBvdXQgbW9yZSBhcyB0aGV5IHNjcm9sbCB0aHJvdWdoIGxpc3RzIG9mCiBhcHBsaWNhdGlvbnMuPC9wPgogCiA8cD5RdWFsaXR5IG1hdHRlcnMgaGVyZS4gQSB3ZWxsLWRlc2lnbmVkIGljb24gY2FuIGJlIGEgc3Ryb25nIHNpZ25hbCB0aGF0IHlvdXIgYXBwCiBpcyBvZiBzaW1pbGFybHkgaGlnaCBxdWFsaXR5LiBDb25zaWRlciB3b3JraW5nIHdpdGggYW4gaWNvbiBkZXNpZ25lciB0byBkZXZlbG9wIHRoZSBhcHDigJlzIGxhdW5jaGVyCiBpY29uLjwvcD4KIAotPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gQW5kcm9pZCBNYXJrZXQgcmVxdWlyZXMgYSBoaWdoLXJlc29sdXRpb24gdmVyc2lvbiBvZiB5b3VyCi1pY29uOyBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMsIHNlZSA8YSBocmVmPSIjaWNvbnNfaW5fbWFya2V0Ij5BcHBsaWNhdGlvbiBJY29ucyBpbiBBbmRyb2lkCi1NYXJrZXQ8L2E+IGJlbG93LjwvcD4KKzxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEdvb2dsZSBQbGF5IHJlcXVpcmVzIGEgaGlnaC1yZXNvbHV0aW9uIHZlcnNpb24gb2YgeW91cgoraWNvbjsgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzLCBzZWUgPGEgaHJlZj0iI2ljb25zX2luX21hcmtldCI+QXBwbGljYXRpb24gSWNvbnMgaW4gR29vZ2xlCitQbGF5PC9hPiBiZWxvdy48L3A+CiAKIAogPGgzIGlkPSJmdW5jdGlvbl93ZWxsX2luX2xhdW5jaGVyIj5GdW5jdGlvbiB3ZWxsIGluIHRoZSBMYXVuY2hlcjwvaDM+CkBAIC0yMzksMjEgKzIzOSwyMSBAQAogdGhhdCBsYXVuY2hlciBpY29ucyBhcmUgbGVnaWJsZSBhY3Jvc3Mgb24gYW55IGJhY2tncm91bmQgY29sb3IuPC9wPgogCiAKLTxoMyBpZD0iaWNvbnNfaW5fbWFya2V0Ij5BcHBsaWNhdGlvbiBJY29ucyBpbiBBbmRyb2lkIE1hcmtldDwvaDM+Cis8aDMgaWQ9Imljb25zX2luX21hcmtldCI+QXBwbGljYXRpb24gSWNvbnMgb24gR29vZ2xlIFBsYXk8L2gzPgogCiA8cD5JZiB5b3UgYXJlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCI+cHVibGlzaGluZyB5b3VyIGFwcGxpY2F0aW9uIG9uCi1BbmRyb2lkIE1hcmtldDwvYT4sIHlvdSB3aWxsIGFsc28gbmVlZCB0byBwcm92aWRlIGEgNTEyIHggNTEyIHBpeGVsLCBoaWdoLXJlc29sdXRpb24gYXBwbGljYXRpb24gaWNvbgotaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaCI+ZGV2ZWxvcGVyIGNvbnNvbGU8L2E+IGF0IHVwbG9hZCB0aW1lLiBUaGlzIGljb24KLXdpbGwgYmUgdXNlZCBpbiB2YXJpb3VzIGxvY2F0aW9ucyBpbiBBbmRyb2lkIE1hcmtldCBhbmQgZG9lcyBub3QgcmVwbGFjZSB5b3VyIGxhdW5jaGVyIGljb24uPC9wPgorR29vZ2xlIFBsYXk8L2E+LCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gcHJvdmlkZSBhIDUxMiB4IDUxMiBwaXhlbCwgaGlnaC1yZXNvbHV0aW9uIGFwcGxpY2F0aW9uIGljb24KK2luIHRoZSA8YSBocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaCI+ZGV2ZWxvcGVyIGNvbnNvbGU8L2E+IGF0IHVwbG9hZCB0aW1lLiBUaGlzIGljb24KK3dpbGwgYmUgdXNlZCBpbiB2YXJpb3VzIGxvY2F0aW9ucyBvbiBHb29nbGUgUGxheSBhbmQgZG9lcyBub3QgcmVwbGFjZSB5b3VyIGxhdW5jaGVyIGljb24uPC9wPgogCiA8cD5Gb3IgdGlwcyBhbmQgcmVjb21tZW5kYXRpb25zIG9uIGNyZWF0aW5nIGhpZ2gtcmVzb2x1dGlvbiBsYXVuY2hlciBpY29ucyB0aGF0IGNhbiBlYXNpbHkgYmUgc2NhbGVkCiB1cCB0byA1MTJ4NTEyLCBzZWUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL2ljb25fZGVzaWduLmh0bWwjZGVzaWduLXRpcHMiPgogVGlwcyBmb3IgRGVzaWduZXJzPC9hPi48L3A+CiAKLTxwPkZvciBpbmZvcm1hdGlvbiBhbmQgc3BlY2lmaWNhdGlvbnMgYWJvdXQgaGlnaC1yZXNvbHV0aW9uIGFwcGxpY2F0aW9uIGljb25zIGluIEFuZHJvaWQgTWFya2V0LCBzZWUKKzxwPkZvciBpbmZvcm1hdGlvbiBhbmQgc3BlY2lmaWNhdGlvbnMgYWJvdXQgaGlnaC1yZXNvbHV0aW9uIGFwcGxpY2F0aW9uIGljb25zIG9uIEdvb2dsZSBQbGF5LCBzZWUKIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZTo8L3A+CiAKIDxwIHN0eWxlPSJtYXJnaW4tbGVmdDoyZW0iPjxhIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vc3VwcG9ydC9iaW4vYW5zd2VyLnB5P2Fuc3dlcj0xMDc4ODcwIj4KLUdyYXBoaWMgQXNzZXRzIGZvciB5b3VyIEFwcGxpY2F0aW9uIChBbmRyb2lkIE1hcmtldCBIZWxwKSAmcmFxdW87PC9hPgorR3JhcGhpYyBBc3NldHMgZm9yIHlvdXIgQXBwbGljYXRpb24gKEdvb2dsZSBQbGF5IEhlbHApICZyYXF1bzs8L2E+CiAKIDxicj48YnI+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3VpX2d1aWRlbGluZXMvaWNvbl9kZXNpZ25fbGF1bmNoZXJfYXJjaGl2ZS5qZCBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9pY29uX2Rlc2lnbl9sYXVuY2hlcl9hcmNoaXZlLmpkCmluZGV4IGVhMDM2Y2QuLjg1YTNjYzggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9pY29uX2Rlc2lnbl9sYXVuY2hlcl9hcmNoaXZlLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9pY29uX2Rlc2lnbl9sYXVuY2hlcl9hcmNoaXZlLmpkCkBAIC01NiwxMyArNTYsMTMgQEAKIAogCiAKLTxoMiBpZD0ibWFya2V0Ij5BcHBsaWNhdGlvbiBJY29ucyBpbiBBbmRyb2lkIE1hcmtldDwvaDI+Cis8aDIgaWQ9Im1hcmtldCI+QXBwbGljYXRpb24gSWNvbnMgb24gR29vZ2xlIFBsYXk8L2gyPgogCiA8cD5JZiB5b3UgYXJlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCI+cHVibGlzaGluZwoteW91ciBhcHBsaWNhdGlvbiBvbiBBbmRyb2lkIE1hcmtldDwvYT4sIHlvdSB3aWxsIGFsc28gbmVlZCB0byBwcm92aWRlIGEgNTEyeDUxMgoreW91ciBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheTwvYT4sIHlvdSB3aWxsIGFsc28gbmVlZCB0byBwcm92aWRlIGEgNTEyeDUxMgogcGl4ZWwsIGhpZ2gtcmVzb2x1dGlvbiBhcHBsaWNhdGlvbiBpY29uIGluIHRoZSA8YQotaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9wdWJsaXNoIj5kZXZlbG9wZXIgY29uc29sZTwvYT4gYXQgdXBsb2FkLXRpbWUuCi1UaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHZhcmlvdXMgbG9jYXRpb25zIGluIEFuZHJvaWQgTWFya2V0IGFuZCBkb2VzCitocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaCI+ZGV2ZWxvcGVyIGNvbnNvbGU8L2E+IGF0IHVwbG9hZC10aW1lLgorVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiB2YXJpb3VzIGxvY2F0aW9ucyBvbiBHb29nbGUgUGxheSBhbmQgZG9lcwogbm90IHJlcGxhY2UgeW91ciBsYXVuY2hlciBpY29uLjwvcD4KIAogPHA+Rm9yIHRpcHMgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiBjcmVhdGluZyBoaWdoLXJlc29sdXRpb24gbGF1bmNoZXIgaWNvbnMgdGhhdApAQCAtNzEsMTEgKzcxLDExIEBACiBUaXBzIGZvciBEZXNpZ25lcnM8L2E+LjwvcD4KIAogPHA+Rm9yIGluZm9ybWF0aW9uIGFuZCBzcGVjaWZpY2F0aW9ucyBhYm91dCBoaWdoLXJlc29sdXRpb24gYXBwbGljYXRpb24KLWljb25zIGluIEFuZHJvaWQgTWFya2V0LCBzZWUgdGhlIGZvbGxvd2luZyBhcnRpY2xlOjwvcD4KK2ljb25zIG9uIEdvb2dsZSBQbGF5LCBzZWUgdGhlIGZvbGxvd2luZyBhcnRpY2xlOjwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi1sZWZ0OjJlbSI+PGEKIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vc3VwcG9ydC9iaW4vYW5zd2VyLnB5P2Fuc3dlcj0xMDc4ODcwIj4KLSAgR3JhcGhpYyBBc3NldHMgZm9yIHlvdXIgQXBwbGljYXRpb24gKEFuZHJvaWQgTWFya2V0IEhlbHApICZyYXF1bzs8L2E+CisgIEdyYXBoaWMgQXNzZXRzIGZvciB5b3VyIEFwcGxpY2F0aW9uIChHb29nbGUgUGxheSBIZWxwKSAmcmFxdW87PC9hPgogCiAKIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvYXBwLXNpZ25pbmcuamQgYi9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy9hcHAtc2lnbmluZy5qZAppbmRleCA5YWJjZGY3Li5lODZlYzMwIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy9hcHAtc2lnbmluZy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy9hcHAtc2lnbmluZy5qZApAQCAtODIsNyArODIsNyBAQAogdXNlIHRvIGJ1aWxkIHlvdXIgYXBwbGljYXRpb24uIFRoZXJlIGFyZSB0d28gYnVpbGQgbW9kZXM6IDxlbT5kZWJ1ZyBtb2RlPC9lbT4gYW5kIDxlbT5yZWxlYXNlCiBtb2RlPC9lbT4uIFlvdSB1c2UgZGVidWcgbW9kZSB3aGVuIHlvdSBhcmUgZGV2ZWxvcGluZyBhbmQgdGVzdGluZyB5b3VyIGFwcGxpY2F0aW9uLiBZb3UgdXNlCiByZWxlYXNlIG1vZGUgd2hlbiB5b3Ugd2FudCB0byBidWlsZCBhIHJlbGVhc2UgdmVyc2lvbiBvZiB5b3VyIGFwcGxpY2F0aW9uIHRoYXQgeW91IGNhbgotZGlzdHJpYnV0ZSBkaXJlY3RseSB0byB1c2VycyBvciBwdWJsaXNoIG9uIGFuIGFwcGxpY2F0aW9uIG1hcmtldHBsYWNlIHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQuPC9wPgorZGlzdHJpYnV0ZSBkaXJlY3RseSB0byB1c2VycyBvciBwdWJsaXNoIG9uIGFuIGFwcGxpY2F0aW9uIG1hcmtldHBsYWNlIHN1Y2ggYXMgR29vZ2xlIFBsYXkuPC9wPgogCiA8cD5XaGVuIHlvdSBidWlsZCBpbiA8ZW0+ZGVidWcgbW9kZTwvZW0+IHRoZSBBbmRyb2lkIFNESyBidWlsZCB0b29scyB1c2UgdGhlIEtleXRvb2wgdXRpbGl0eQogKGluY2x1ZGVkIGluIHRoZSBKREspIHRvIGNyZWF0ZSBhIGRlYnVnIGtleS4gQmVjYXVzZSB0aGUgU0RLIGJ1aWxkIHRvb2xzIGNyZWF0ZWQgdGhlIGRlYnVnIGtleSwKQEAgLTE1OCwxMCArMTU4LDEwIEBACiBsaWZlc3BhbiBvZiA8ZW0+YWxsIHZlcnNpb25zIG9mIGFsbCBvZiB0aGUgYXBwbGljYXRpb25zPC9lbT4sIGluY2x1ZGluZwogZGVwZW5kZW50IGFwcGxpY2F0aW9ucyB0aGF0IG1heSBiZSBhZGRlZCB0byB0aGUgc3VpdGUgaW4gdGhlIGZ1dHVyZS4gPC9saT4KIAotPGxpPklmIHlvdSBwbGFuIHRvIHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbihzKSBvbiBBbmRyb2lkIE1hcmtldCwgdGhlCis8bGk+SWYgeW91IHBsYW4gdG8gcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uKHMpIG9uIEdvb2dsZSBQbGF5LCB0aGUKIGtleSB5b3UgdXNlIHRvIHNpZ24gdGhlIGFwcGxpY2F0aW9uKHMpIG11c3QgaGF2ZSBhIHZhbGlkaXR5IHBlcmlvZAotZW5kaW5nIGFmdGVyIDIyIE9jdG9iZXIgMjAzMy4gVGhlIE1hcmtldCBzZXJ2ZXIgZW5mb3JjZXMgdGhpcyByZXF1aXJlbWVudAotdG8gZW5zdXJlIHRoYXQgdXNlcnMgY2FuIHNlYW1sZXNzbHkgdXBncmFkZSBNYXJrZXQgYXBwbGljYXRpb25zIHdoZW4KK2VuZGluZyBhZnRlciAyMiBPY3RvYmVyIDIwMzMuIEdvb2dsZSBQbGF5IGVuZm9yY2VzIHRoaXMgcmVxdWlyZW1lbnQKK3RvIGVuc3VyZSB0aGF0IHVzZXJzIGNhbiBzZWFtbGVzc2x5IHVwZ3JhZGUgYXBwbGljYXRpb25zIHdoZW4KIG5ldyB2ZXJzaW9ucyBhcmUgYXZhaWxhYmxlLiA8L2xpPgogPC91bD4KIApAQCAtMjkyLDcgKzI5Miw3IEBACiB3aXRoIHRoZSBhcHBsaWNhdGlvbjwvbGk+CiA8bGk+SGFzIGEgdmFsaWRpdHkgcGVyaW9kIHRoYXQgZXhjZWVkcyB0aGUgZXhwZWN0ZWQgbGlmZXNwYW4gb2YgdGhlIGFwcGxpY2F0aW9uCiBvciBhcHBsaWNhdGlvbiBzdWl0ZS4gQSB2YWxpZGl0eSBwZXJpb2Qgb2YgbW9yZSB0aGFuIDI1IHllYXJzIGlzIHJlY29tbWVuZGVkLgotPHA+SWYgeW91IHBsYW4gdG8gcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uKHMpIG9uIEFuZHJvaWQgTWFya2V0LCBub3RlIHRoYXQgYQorPHA+SWYgeW91IHBsYW4gdG8gcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uKHMpIG9uIEdvb2dsZSBQbGF5LCBub3RlIHRoYXQgYQogdmFsaWRpdHkgcGVyaW9kIGVuZGluZyBhZnRlciAyMiBPY3RvYmVyIDIwMzMgaXMgYSByZXF1aXJlbWVudC4gWW91IGNhbiBub3QgdXBsb2FkIGFuCiBhcHBsaWNhdGlvbiBpZiBpdCBpcyBzaWduZWQgd2l0aCBhIGtleSB3aG9zZSB2YWxpZGl0eSBleHBpcmVzIGJlZm9yZSB0aGF0IGRhdGUuCiA8L3A+PC9saT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL3ByZXBhcmluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL3ByZXBhcmluZy5qZAppbmRleCBjMzU1NDc5Li5mZTU2MzUyIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy9wcmVwYXJpbmcuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvcHJlcGFyaW5nLmpkCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgPG9sPgogICAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmdfb3ZlcnZpZXcuaHRtbCI+UHVibGlzaGluZyBPdmVydmlldzwvYT48L2xpPgogICAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL2FwcC1zaWduaW5nLmh0bWwiPlNpZ25pbmcgWW91ciBBcHBsaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPlB1Ymxpc2hpbmcgb24gQW5kcm9pZCBNYXJrZXQ8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPlB1Ymxpc2hpbmcgb24gR29vZ2xlIFBsYXk8L2E+PC9saT4KICAgICA8L29sPgogICA8L2Rpdj4KIDwvZGl2PgpAQCAtMzksMTMgKzM5LDEzIEBACiB0YXNrcyBzZXJ2ZSBhcyBhIGZpbmFsIGNoZWNrLCBlbnN1cmluZyB0aGF0IHlvdXIgYXBwbGljYXRpb24gcGVyZm9ybXMgYXMgZXhwZWN0ZWQgdW5kZXIgcmVhbC13b3JsZAogY29uZGl0aW9ucy4gV2hlbiB5b3UgYXJlIGZpbmlzaGVkIHByZXBhcmluZyB5b3VyIGFwcGxpY2F0aW9uIGZvciByZWxlYXNlIHlvdSBoYXZlIGEgc2lnbmVkCiA8Y29kZT4uYXBrPC9jb2RlPiBmaWxlLCB3aGljaCB5b3UgY2FuIGRpc3RyaWJ1dGUgZGlyZWN0bHkgdG8gdXNlcnMgb3IgZGlzdHJpYnV0ZSB0aHJvdWdoIGFuCi1hcHBsaWNhdGlvbiBtYXJrZXRwbGFjZSBzdWNoIGFzIEFuZHJvaWQgTWFya2V0LjwvcD4KK2FwcGxpY2F0aW9uIG1hcmtldHBsYWNlIHN1Y2ggYXMgR29vZ2xlIFBsYXkuPC9wPgogCiA8cD5UaGlzIGRvY3VtZW50IHN1bW1hcml6ZXMgdGhlIG1haW4gdGFza3MgeW91IG5lZWQgdG8gcGVyZm9ybSB0byBwcmVwYXJlIHlvdXIgYXBwbGljYXRpb24gZm9yCiByZWxlYXNlLiBUaGUgdGFza3MgdGhhdCBhcmUgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQgYXBwbHkgdG8gYWxsIEFuZHJvaWQgYXBwbGljYXRpb25zIHJlZ2FyZGxlc3MKLWhvdyB0aGV5IGFyZSByZWxlYXNlZCBvciBkaXN0cmlidXRlZCB0byB1c2Vycy4gSWYgeW91IGFyZSByZWxlYXNpbmcgeW91ciBhcHBsaWNhdGlvbiB0aHJvdWdoIEFuZHJvaWQKLU1hcmtldCwgeW91IHNob3VsZCBhbHNvIHJlYWQgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sIj5QdWJsaXNoaW5nIG9uCi1BbmRyb2lkIE1hcmtldDwvYT4gdG8gYmUgc3VyZSB5b3VyIHJlbGVhc2UtcmVhZHkgYXBwbGljYXRpb24gc2F0aXNmaWVzIGFsbCBBbmRyb2lkIE1hcmtldAoraG93IHRoZXkgYXJlIHJlbGVhc2VkIG9yIGRpc3RyaWJ1dGVkIHRvIHVzZXJzLiBJZiB5b3UgYXJlIHJlbGVhc2luZyB5b3VyIGFwcGxpY2F0aW9uIHRocm91Z2ggR29vZ2xlCitQbGF5LCB5b3Ugc2hvdWxkIGFsc28gcmVhZCA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPlB1Ymxpc2hpbmcgb24KK0dvb2dsZSBQbGF5PC9hPiB0byBiZSBzdXJlIHlvdXIgcmVsZWFzZS1yZWFkeSBhcHBsaWNhdGlvbiBzYXRpc2ZpZXMgYWxsIEdvb2dsZSBQbGF5CiByZXF1aXJlbWVudHMuPC9wPgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBBcyBhIGJlc3QgcHJhY3RpY2UsIHlvdXIgYXBwbGljYXRpb24gc2hvdWxkIG1lZXQgYWxsIG9mIHlvdXIKQEAgLTg5LDkgKzg5LDkgQEAKIAogPHA+VG8gcHJlcGFyZSB5b3VyIGFwcGxpY2F0aW9uIGZvciByZWxlYXNlIHlvdSB0eXBpY2FsbHkgcGVyZm9ybSBmaXZlIG1haW4gdGFza3MgKHNlZSBmaWd1cmUgMikuCiBFYWNoIG1haW4gdGFzayBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBzbWFsbGVyIHRhc2tzIGRlcGVuZGluZyBvbiBob3cgeW91IGFyZSByZWxlYXNpbmcgeW91cgotYXBwbGljYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHJlbGVhc2luZyB5b3VyIGFwcGxpY2F0aW9uIHRocm91Z2ggQW5kcm9pZCBNYXJrZXQgeW91IG1heSB3YW50CithcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgcmVsZWFzaW5nIHlvdXIgYXBwbGljYXRpb24gdGhyb3VnaCBHb29nbGUgUGxheSB5b3UgbWF5IHdhbnQKIHRvIGFkZCBzcGVjaWFsIGZpbHRlcmluZyBydWxlcyB0byB5b3VyIG1hbmlmZXN0IHdoaWxlIHlvdSBhcmUgY29uZmlndXJpbmcgeW91ciBhcHBsaWNhdGlvbiBmb3IKLXJlbGVhc2UuIFNpbWlsYXJseSwgdG8gbWVldCBBbmRyb2lkIE1hcmtldCBwdWJsaXNoaW5nIGd1aWRlbGluZXMgeW91IG1heSBoYXZlIHRvIHByZXBhcmUgc2NyZWVuc2hvdHMKK3JlbGVhc2UuIFNpbWlsYXJseSwgdG8gbWVldCBHb29nbGUgUGxheSBwdWJsaXNoaW5nIGd1aWRlbGluZXMgeW91IG1heSBoYXZlIHRvIHByZXBhcmUgc2NyZWVuc2hvdHMKIGFuZCBjcmVhdGUgcHJvbW90aW9uYWwgdGV4dCB3aGlsZSB5b3UgYXJlIGdhdGhlcmluZyBtYXRlcmlhbHMgZm9yIHJlbGVhc2UuPC9wPgogCiA8cD5Zb3UgdXN1YWxseSBwZXJmb3JtIHRoZSB0YXNrcyBsaXN0ZWQgaW4gZmlndXJlIDIgYWZ0ZXIgeW91IGhhdmUgdGhyb3JvdWdobHkgZGVidWdnZWQgYW5kIHRlc3RlZApAQCAtMTM3LDkgKzEzNyw5IEBACiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHJhY3RpY2VzL3VpX2d1aWRlbGluZXMvaWNvbl9kZXNpZ25fbGF1bmNoZXIuaHRtbCI+aWNvbiBndWlkZWxpbmVzPC9hPi4gWW91cgogYXBwbGljYXRpb24ncyBpY29uIGhlbHBzIHVzZXJzIGlkZW50aWZ5IHlvdXIgYXBwbGljYXRpb24gb24gYSBkZXZpY2UncyBIb21lCiBzY3JlZW4gYW5kIGluIHRoZSBMYXVuY2hlciB3aW5kb3cuIEl0IGFsc28gYXBwZWFycyBpbiBNYW5hZ2UgQXBwbGljYXRpb25zLCBNeSBEb3dubG9hZHMsIGFuZAotZWxzZXdoZXJlLiBJbiBhZGRpdGlvbiwgcHVibGlzaGluZyBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0IGRpc3BsYXkgeW91ciBpY29uIHRvIHVzZXJzLjwvcD4KK2Vsc2V3aGVyZS4gSW4gYWRkaXRpb24sIHB1Ymxpc2hpbmcgc2VydmljZXMgc3VjaCBhcyBHb29nbGUgUGxheSBkaXNwbGF5IHlvdXIgaWNvbiB0byB1c2Vycy48L3A+CiAKLTxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSBhcmUgcmVsZWFzaW5nIHlvdXIgYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQsIHlvdQorPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IGFyZSByZWxlYXNpbmcgeW91ciBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheSwgeW91CiBuZWVkIHRvIGNyZWF0ZSBhIGhpZ2ggcmVzb2x1dGlvbgogICB2ZXJzaW9uIG9mIHlvdXIgaWNvbi4gU2VlIDxhCiBocmVmPSJodHRwczovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvYW5kcm9pZG1hcmtldC9kZXZlbG9wZXIvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTA3ODg3MCI+R3JhcGhpYwpAQCAtMTU0LDcgKzE1NCw3IEBACiA8aDQ+TWlzY2VsbGFuZW91cyBNYXRlcmlhbHM8L2g0PgogCiA8cD5Zb3UgbWlnaHQgYWxzbyBoYXZlIHRvIHByZXBhcmUgcHJvbW90aW9uYWwgYW5kIG1hcmtldGluZyBtYXRlcmlhbHMgdG8gcHVibGljaXplIHlvdXIgYXBwbGljYXRpb24uCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGFyZSByZWxlYXNpbmcgeW91ciBhcHBsaWNhdGlvbiBvbiBBbmRyb2lkIE1hcmtldCB5b3Ugd2lsbCBuZWVkIHRvIHByZXBhcmUgc29tZQorRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgcmVsZWFzaW5nIHlvdXIgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkgeW91IHdpbGwgbmVlZCB0byBwcmVwYXJlIHNvbWUKIHByb21vdGlvbmFsIHRleHQgYW5kIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIHNjcmVlbnNob3RzIG9mIHlvdXIgYXBwbGljYXRpb24uIEZvciBtb3JlCiBpbmZvcm1hdGlvbiwgc2VlCiA8YSBocmVmPSJodHRwczovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvYW5kcm9pZG1hcmtldC9kZXZlbG9wZXIvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTA3ODg3MCI+CkBAIC0yNDIsMTEgKzI0MiwxMSBAQAogPC91bD4KIAogPHA+VGhlcmUgYXJlIHNldmVyYWwgYWRkaXRpb25hbCBtYW5pZmVzdCBlbGVtZW50cyB0aGF0IHlvdSBjYW4gc2V0IGlmIHlvdSBhcmUgcmVsZWFzaW5nIHlvdXIKLWFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0LiBGb3IgZXhhbXBsZSwgdGhlIDxjb2RlPmFuZHJvaWQ6bWluU2RrVmVyc2lvbjwvY29kZT4gYW5kCithcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheS4gRm9yIGV4YW1wbGUsIHRoZSA8Y29kZT5hbmRyb2lkOm1pblNka1ZlcnNpb248L2NvZGU+IGFuZAogPGNvZGU+YW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPC9jb2RlPiBhdHRyaWJ1dGVzLCB3aGljaCBhcmUgbG9jYXRlZCBpbiB0aGUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sIj4gJmx0O3VzZXMtc2RrJmd0OzwvYT4gZWxlbWVudC4gRm9yIG1vcmUKLWluZm9ybWF0aW9uIGFib3V0IHRoZXNlIGFuZCBvdGhlciBBbmRyb2lkIE1hcmtldCBzZXR0aW5ncywgc2VlIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9L2d1aWRlLy9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5NYXJrZXQgRmlsdGVyczwvYT4uPC9wPgoraW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgYW5kIG90aGVyIEdvb2dsZSBQbGF5IHNldHRpbmdzLCBzZWUgPGEKK2hyZWY9IntAZG9jUm9vdH0vZ3VpZGUvL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+LjwvcD4KIAogPGg0PkFkZHJlc3MgY29tcGF0aWJpbGl0eSBpc3N1ZXM8L2g0PgogCkBAIC0yODMsMTYgKzI4MywxNSBAQAogPHA+SWYgeW91ciBhcHBsaWNhdGlvbiBhY2Nlc3NlcyByZW1vdGUgc2VydmVycyBvciBzZXJ2aWNlcywgbWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgdGhlIHByb2R1Y3Rpb24KIFVSTCBvciBwYXRoIGZvciB0aGUgc2VydmVyIG9yIHNlcnZpY2UgYW5kIG5vdCBhIHRlc3QgVVJMIG9yIHBhdGguPC9wPgogCi08aDQ+SW1wbGVtZW50IExpY2Vuc2luZyAoaWYgeW91IGFyZSByZWxlYXNpbmcgb24gQW5kcm9pZCBNYXJrZXQpPC9oND4KKzxoND5JbXBsZW1lbnQgTGljZW5zaW5nIChpZiB5b3UgYXJlIHJlbGVhc2luZyBvbiBHb29nbGUgUGxheSk8L2g0PgogCi08cD5JZiB5b3UgYXJlIHJlbGVhc2luZyBhIHBhaWQgYXBwbGljYXRpb24gdGhyb3VnaCBBbmRyb2lkIE1hcmtldCwgY29uc2lkZXIgYWRkaW5nIHN1cHBvcnQgZm9yCi1BbmRyb2lkIE1hcmtldCBMaWNlbnNpbmcuIExpY2Vuc2luZyBsZXRzIHlvdSBjb250cm9sIGFjY2VzcyB0byB5b3VyIGFwcGxpY2F0aW9uIGJhc2VkIG9uIHdoZXRoZXIgdGhlCi1jdXJyZW50IHVzZXIgaGFzIHB1cmNoYXNlZCBpdC4gVXNpbmcgQW5kcm9pZCBNYXJrZXQgTGljZW5zaW5nIGlzIG9wdGlvbmFsIGV2ZW4gaWYgeW91IGFyZQotcmVsZWFzaW5nIHlvdXIgYXBwIHRocm91Z2ggQW5kcm9pZCBNYXJrZXQuPC9wPgorPHA+SWYgeW91IGFyZSByZWxlYXNpbmcgYSBwYWlkIGFwcGxpY2F0aW9uIHRocm91Z2ggR29vZ2xlIFBsYXksIGNvbnNpZGVyIGFkZGluZyBzdXBwb3J0IGZvcgorR29vZ2xlIFBsYXkgTGljZW5zaW5nLiBMaWNlbnNpbmcgbGV0cyB5b3UgY29udHJvbCBhY2Nlc3MgdG8geW91ciBhcHBsaWNhdGlvbiBiYXNlZCBvbiB3aGV0aGVyIHRoZQorY3VycmVudCB1c2VyIGhhcyBwdXJjaGFzZWQgaXQuIFVzaW5nIEdvb2dsZSBQbGF5IExpY2Vuc2luZyBpcyBvcHRpb25hbCBldmVuIGlmIHlvdSBhcmUKK3JlbGVhc2luZyB5b3VyIGFwcCB0aHJvdWdoIEdvb2dsZSBQbGF5LjwvcD4KIAotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQW5kcm9pZCBNYXJrZXQgTGljZW5zaW5nIFNlcnZpY2UgYW5kIGhvdyB0byB1c2UgaXQgaW4geW91cgotYXBwbGljYXRpb24sIHNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy9pbmRleC5odG1sIj5BcHBsaWNhdGlvbgotTGljZW5zaW5nPC9hPi48L3A+Cis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBHb29nbGUgUGxheSBMaWNlbnNpbmcgU2VydmljZSBhbmQgaG93IHRvIHVzZSBpdCBpbiB5b3VyCithcHBsaWNhdGlvbiwgc2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nLmh0bWwiPkFwcGxpY2F0aW9uIExpY2Vuc2luZzwvYT4uPC9wPgogCiA8aDIgaWQ9InB1Ymxpc2hpbmctYnVpbGQiPkJ1aWxkaW5nIFlvdXIgQXBwbGljYXRpb24gZm9yIFJlbGVhc2U8L2gyPgogCkBAIC0zNTMsNyArMzUyLDcgQEAKIGRvbmUgdGVzdGluZyBhbmQgeW91IGFyZSBzYXRpc2ZpZWQgdGhhdCB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIHlvdXIgYXBwbGljYXRpb24KIGJlaGF2ZXMgY29ycmVjdGx5LCB5b3UgY2FuIHJlbGVhc2UgeW91ciBhcHBsaWNhdGlvbiB0byB1c2Vycy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQogPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZ19vdmVydmlldy5odG1sI3B1Ymxpc2hpbmctcmVsZWFzZSI+UmVsZWFzaW5nIFlvdXIKLUFwcGxpY2F0aW9uIHRvIFVzZXJzPC9hPi4gSWYgeW91IGFyZSBwdWJsaXNoaW5nIHlvdXIgYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQsIHNlZQotPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sIj5QdWJsaXNoaW5nIG9uIEFuZHJvaWQgTWFya2V0PC9hPi48L3A+CitBcHBsaWNhdGlvbiB0byBVc2VyczwvYT4uIElmIHlvdSBhcmUgcHVibGlzaGluZyB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LCBzZWUKKzxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCI+UHVibGlzaGluZyBvbiBHb29nbGUgUGxheTwvYT4uPC9wPgogCiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuamQgYi9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmpkCmluZGV4IDI3YTg3ZjkuLmI5NTEzYWIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5qZApAQCAtMSw0ICsxLDQgQEAKLXBhZ2UudGl0bGU9UHVibGlzaGluZyBvbiBBbmRyb2lkIE1hcmtldAorcGFnZS50aXRsZT1QdWJsaXNoaW5nIG9uIEdvb2dsZSBQbGF5CiBAamQ6Ym9keQogCiA8ZGl2IGlkPSJxdi13cmFwcGVyIj4KQEAgLTcsMjUgKzcsMjUgQEAKIDxoMj5RdWlja3ZpZXc8L2gyPgogCiA8dWw+Ci08bGk+TGVhcm4gaG93IHRvIHB1Ymxpc2ggYW5kIHVwZGF0ZSBhcHBzIG9uIEFuZHJvaWQgTWFya2V0LjwvbGk+Ci08bGk+RmluZCBvdXQgaG93IHRvIGNyZWF0ZSBsaW5rcyB0byBhcHBzIHRoYXQgYXJlIHB1Ymxpc2hlZCBvbiBBbmRyb2lkIE1hcmtldC48L2xpPgotPGxpPkxlYXJuIGFib3V0IEFuZHJvaWQgTWFya2V0IGZlYXR1cmVzLjwvbGk+Cis8bGk+TGVhcm4gaG93IHRvIHB1Ymxpc2ggYW5kIHVwZGF0ZSBhcHBzIG9uIEdvb2dsZSBQbGF5LjwvbGk+Cis8bGk+RmluZCBvdXQgaG93IHRvIGNyZWF0ZSBsaW5rcyB0byBhcHBzIHRoYXQgYXJlIHB1Ymxpc2hlZCBvbiBHb29nbGUgUGxheS48L2xpPgorPGxpPkxlYXJuIGFib3V0IEdvb2dsZSBQbGF5IGZlYXR1cmVzLjwvbGk+CiA8L3VsPgogCiAKIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KIAogPG9sPgotPGxpPjxhIGhyZWY9IiNvdmVydmlldyI+QWJvdXQgQW5kcm9pZCBNYXJrZXQ8L2E+Ci08bGk+PEEgaHJlZj0iI21hcmtldHB1Ymxpc2giPlB1Ymxpc2hpbmcgQXBwcyBvbiBBbmRyb2lkIE1hcmtldDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNtYXJrZXR1cGdyYWRlIj5QdWJsaXNoaW5nIFVwZGF0ZXMgb24gQW5kcm9pZCBNYXJrZXQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbWFya2V0TGljZW5zaW5nIj5Vc2luZyBBbmRyb2lkIE1hcmtldCBMaWNlbnNpbmcgU2VydmljZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNtYXJrZXRpbmFwcGJpbGxpbmciPlVzaW5nIEFuZHJvaWQgTWFya2V0IEluLWFwcCBCaWxsaW5nPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI21hcmtldGludGVudCI+TGlua2luZyB0byBZb3VyIEFwcHMgb24gQW5kcm9pZCBNYXJrZXQ8L2E+Cis8bGk+PGEgaHJlZj0iI292ZXJ2aWV3Ij5BYm91dCBHb29nbGUgUGxheTwvYT4KKzxsaT48QSBocmVmPSIjbWFya2V0cHVibGlzaCI+UHVibGlzaGluZyBBcHBzIG9uIEdvb2dsZSBQbGF5PC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI21hcmtldHVwZ3JhZGUiPlB1Ymxpc2hpbmcgVXBkYXRlcyBvbiBHb29nbGUgUGxheTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNtYXJrZXRMaWNlbnNpbmciPlVzaW5nIEdvb2dsZSBQbGF5IExpY2Vuc2luZyBTZXJ2aWNlPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI21hcmtldGluYXBwYmlsbGluZyI+VXNpbmcgR29vZ2xlIFBsYXkgSW4tYXBwIEJpbGxpbmc8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjbWFya2V0aW50ZW50Ij5MaW5raW5nIHRvIFlvdXIgQXBwcyBvbiBHb29nbGUgUGxheTwvYT4KICAgPG9sPgogICAgIDxsaT48YSBocmVmPSIjT3BlbmluZ0RldGFpbHMiPk9wZW5pbmcgYW4gYXBwJ3MgZGV0YWlscyBwYWdlPC9hPjwvbGk+CiAgICAgPGxpPjxhIGhyZWY9IiNQZXJmb3JtaW5nU2VhcmNoIj5QZXJmb3JtaW5nIGEgc2VhcmNoPC9hPjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiNCdWlsZGFCdXR0b24iPkJ1aWxkIGFuIEFuZHJvaWQgTWFya2V0IGJ1dHRvbjwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSIjQnVpbGRhQnV0dG9uIj5CdWlsZCBhIEdvb2dsZSBQbGF5IGJ1dHRvbjwvYT48L2xpPgogICAgIDxsaT48YSBocmVmPSIjVXJpU3VtbWFyeSI+U3VtbWFyeSBvZiBVUkkgZm9ybWF0czwvYT48L2xpPgogICA8L29sPgogPC9saT4KQEAgLTQxLDkgKzQxLDkgQEAKIDxkaXYgaWQ9InF2LWV4dHJhIj4KICAgPGltZyBpZD0icnVsZSIgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9ncmFkLXJ1bGUtcXYucG5nIj4KICAgPGRpdiBpZD0icXYtc3ViLXJ1bGUiPgotICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjowO3BhZGRpbmc6MCA1cHg7Ij4KLSAgICA8aDIgc3R5bGU9ImNvbG9yOiM2Njk5OTk7Ij5BbHJlYWR5IGtub3cgYWJvdXQgQW5kcm9pZCBNYXJrZXQgYW5kIHdhbnQgdG8gZ2V0IHN0YXJ0ZWQ/PC9oMj4KLSAgICA8cD5HbyB0byA8YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2giPkFuZHJvaWQgTWFya2V0PC9hPiwgY3JlYXRlIGEgZGV2ZWxvcGVyCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fcGxheS5wbmciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjowO3BhZGRpbmc6MCA1cHg7Ij4KKyAgICA8aDIgc3R5bGU9ImNvbG9yOiM2Njk5OTk7Ij5BbHJlYWR5IGtub3cgYWJvdXQgR29vZ2xlIFBsYXkgYW5kIHdhbnQgdG8gZ2V0IHN0YXJ0ZWQ/PC9oMj4KKyAgICA8cD5HbyB0byA8YSBocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaCI+R29vZ2xlIFBsYXk8L2E+LCBjcmVhdGUgYSBkZXZlbG9wZXIKIGFjY291bnQsIGFuZCB1cGxvYWQgeW91ciBhcHBsaWNhdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcmVxdWlyZWQgYXNzZXRzLCBsaXN0aW5nIGRldGFpbHMsCiBhbmQgcHVibGlzaGluZyBvcHRpb25zLCBzZWUgPGEKIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vc3VwcG9ydC9iaW4vYW5zd2VyLnB5P2Fuc3dlcj0xMTM0NjkiPlVwbG9hZApAQCAtNTUsNzggKzU1LDc4IEBACiA8L2Rpdj4KIAogPHA+T25lIG9mIHRoZSBtb3N0IGVmZmVjdGl2ZSB3YXlzIHRvIGdldCB5b3VyIGFwcGxpY2F0aW9uIGludG8gdXNlcnMnIGhhbmRzIGlzIHRvCi1wdWJsaXNoIGl0IG9uIGFuIGFwcGxpY2F0aW9uIG1hcmtldHBsYWNlIGxpa2UgQW5kcm9pZCBNYXJrZXQuIFB1Ymxpc2hpbmcgb24gQW5kcm9pZCBNYXJrZXQgaXMgYQorcHVibGlzaCBpdCBvbiBhbiBhcHBsaWNhdGlvbiBtYXJrZXRwbGFjZSBsaWtlIEdvb2dsZSBQbGF5LiBQdWJsaXNoaW5nIG9uIEdvb2dsZSBQbGF5IGlzIGEKIHN0cmFpZ2h0Zm9yd2FyZCBwcm9jZXNzIHRoYXQgeW91IGNhbiBkbyBpbiBqdXN0IGEgZmV3IHNpbXBsZSBzdGVwcyZtZGFzaDtyZWdpc3RlciwgY29uZmlndXJlLAogdXBsb2FkLCBhbmQgcHVibGlzaC4gUmVnaXN0cmF0aW9uIHRha2VzIG9ubHkgYSBmZXcgbWludXRlcyBhbmQgbmVlZHMgdG8gYmUgZG9uZSBvbmx5IG9uY2UuCi1UaGUgY29uZmlndXJhdGlvbiBhbmQgcHVibGlzaGluZyBzdGVwcyBjYW4gYWxsIGJlIGRvbmUgdGhyb3VnaCB0aGUgQW5kcm9pZCBNYXJrZXQgRGV2ZWxvcGVyIENvbnNvbGUKLWFmdGVyIHlvdSByZWdpc3RlciBhcyBhbiBBbmRyb2lkIE1hcmtldCBkZXZlbG9wZXIuPC9wPgorVGhlIGNvbmZpZ3VyYXRpb24gYW5kIHB1Ymxpc2hpbmcgc3RlcHMgY2FuIGFsbCBiZSBkb25lIHRocm91Z2ggdGhlIEdvb2dsZSBQbGF5IEFuZHJvaWQgRGV2ZWxvcGVyIENvbnNvbGUKK2FmdGVyIHlvdSByZWdpc3RlciBhcyBhIEdvb2dsZSBQbGF5IGRldmVsb3Blci48L3A+CiAKLTxwPlRvIHN0YXJ0IHB1Ymxpc2hpbmcgb24gQW5kcm9pZCBNYXJrZXQsIGZpcnN0IHJlYWQgdGhpcyB0b3BpYyBhbmQgdGhlbiBnbyB0byB0aGUgPGEKLWhyZWY9Imh0dHBzOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2gvc2lnbnVwIj5BbmRyb2lkIE1hcmtldCBwdWJsaXNoZXIgc2l0ZTwvYT4gYW5kIHJlZ2lzdGVyIGFzCi1hbiBBbmRyb2lkIE1hcmtldCBkZXZlbG9wZXIuPC9wPgorPHA+VG8gc3RhcnQgcHVibGlzaGluZyBvbiBHb29nbGUgUGxheSwgZmlyc3QgcmVhZCB0aGlzIHRvcGljIGFuZCB0aGVuIGdvIHRvIHRoZSA8YQoraHJlZj0iaHR0cHM6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoIj5Hb29nbGUgUGxheSBBbmRyb2lkIERldmVsb3BlciBDb25zb2xlPC9hPiBhbmQgcmVnaXN0ZXIgYXMKK2EgR29vZ2xlIFBsYXkgZGV2ZWxvcGVyLjwvcD4KIAogCi08aDIgaWQ9Im92ZXJ2aWV3Ij5BYm91dCBBbmRyb2lkIE1hcmtldDwvaDI+Cis8aDIgaWQ9Im92ZXJ2aWV3Ij5BYm91dCBHb29nbGUgUGxheTwvaDI+CiAKLTxwPkFuZHJvaWQgTWFya2V0IGlzIGEgcm9idXN0IHB1Ymxpc2hpbmcgcGxhdGZvcm0gdGhhdCBoZWxwcyB5b3UgcHVibGljaXplLCBzZWxsLCBhbmQgZGlzdHJpYnV0ZQorPHA+R29vZ2xlIFBsYXkgaXMgYSByb2J1c3QgcHVibGlzaGluZyBwbGF0Zm9ybSB0aGF0IGhlbHBzIHlvdSBwdWJsaWNpemUsIHNlbGwsIGFuZCBkaXN0cmlidXRlCiB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb25zIHRvIHVzZXJzIGFyb3VuZCB0aGUgd29ybGQuIFdoZW4geW91IHJlbGVhc2UgeW91ciBhcHBsaWNhdGlvbnMgdGhyb3VnaAotQW5kcm9pZCBNYXJrZXQgeW91IGhhdmUgYWNjZXNzIHRvIGEgc3VpdGUgb2YgZGV2ZWxvcGVyIHRvb2xzIHRoYXQgbGV0IHlvdSBhbmFseXplIHlvdXIgc2FsZXMsCitHb29nbGUgUGxheSB5b3UgaGF2ZSBhY2Nlc3MgdG8gYSBzdWl0ZSBvZiBkZXZlbG9wZXIgdG9vbHMgdGhhdCBsZXQgeW91IGFuYWx5emUgeW91ciBzYWxlcywKIGlkZW50aWZ5IG1hcmtldCB0cmVuZHMsIGFuZCBjb250cm9sIHdobyB5b3VyIGFwcGxpY2F0aW9ucyBhcmUgYmVpbmcgZGlzdHJpYnV0ZWQgdG8uIFlvdSBhbHNvIGhhdmUKIGFjY2VzcyB0byBzZXZlcmFsIHJldmVudWUtZW5oYW5jaW5nIGZlYXR1cmVzLCBzdWNoIGFzIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvaW5kZXguaHRtbCI+aW4tYXBwIGJpbGxpbmc8L2E+IGFuZAogPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguaHRtbCI+YXBwbGljYXRpb24gbGljZW5zaW5nPC9hPi48L3A+CiAKLTxwPkJlZm9yZSB5b3UgY2FuIHB1Ymxpc2ggYXBwbGljYXRpb25zIG9uIEFuZHJvaWQgTWFya2V0LCB5b3UgbmVlZCB0byA8YQotaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9wdWJsaXNoIj5yZWdpc3RlcjwvYT4gYXMgYW4gQW5kcm9pZCBNYXJrZXQgZGV2ZWxvcGVyLiBEdXJpbmcgdGhlCis8cD5CZWZvcmUgeW91IGNhbiBwdWJsaXNoIGFwcGxpY2F0aW9ucyBvbiBHb29nbGUgUGxheSwgeW91IG5lZWQgdG8gPGEKK2hyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoIj5yZWdpc3RlcjwvYT4gYXMgYSBHb29nbGUgUGxheSBkZXZlbG9wZXIuIER1cmluZyB0aGUKIHJlZ2lzdHJhdGlvbiBwcm9jZXNzIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgZGV2ZWxvcGVyIHByb2ZpbGUsIHBheSBhIHJlZ2lzdHJhdGlvbiBmZWUsIGFuZCBhZ3JlZQotdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdXMvZGV2ZWxvcGVyLWRpc3RyaWJ1dGlvbi1hZ3JlZW1lbnQuaHRtbCI+QW5kcm9pZCBNYXJrZXQKLURldmVsb3BlciBEaXN0cmlidXRpb24gQWdyZWVtZW50PC9hPi4gQWZ0ZXIgeW91IHJlZ2lzdGVyIHlvdSBjYW4gYWNjZXNzIHRoZSBBbmRyb2lkIE1hcmtldCBEZXZlbG9wZXIKK3RvIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3VzL2RldmVsb3Blci1kaXN0cmlidXRpb24tYWdyZWVtZW50Lmh0bWwiPkdvb2dsZSBQbGF5CitEZXZlbG9wZXIgRGlzdHJpYnV0aW9uIEFncmVlbWVudDwvYT4uIEFmdGVyIHlvdSByZWdpc3RlciB5b3UgY2FuIGFjY2VzcyB0aGUgRGV2ZWxvcGVyCiBDb25zb2xlLCB3aGVyZSB5b3UgY2FuIHVwbG9hZCBhcHBsaWNhdGlvbnMsIGNvbmZpZ3VyZSBwdWJsaXNoaW5nIG9wdGlvbnMsIGFuZCBtb25pdG9yIHB1Ymxpc2hpbmcKIGRhdGEuIElmIHlvdSB3YW50IHRvIHNlbGwgeW91ciBhcHBsaWNhdGlvbnMgb3IgdXNlIHRoZSBpbi1hcHAgYmlsbGluZyBmZWF0dXJlLCB5b3Ugd2lsbCBhbHNvIG5lZWQKIHRvIHNldCB1cCBhIEdvb2dsZSBDaGVja291dCBtZXJjaGFudCBhY2NvdW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVnaXN0cmF0aW9uIHByb2Nlc3MsCiBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vYW5kcm9pZG1hcmtldC9kZXZlbG9wZXIvYmluL2Fuc3dlci5weT9obD1lbiZhbnN3ZXI9MTEzNDY4Ij4KIERldmVsb3BlciBSZWdpc3RyYXRpb248L2E+LjwvcD4KIAotPGgyIGlkPSJtYXJrZXRwdWJsaXNoIj5QdWJsaXNoaW5nIEFwcHMgb24gQW5kcm9pZCBNYXJrZXQ8L2gyPgorPGgyIGlkPSJtYXJrZXRwdWJsaXNoIj5QdWJsaXNoaW5nIEFwcHMgb24gR29vZ2xlIFBsYXk8L2gyPgogCi08cD5QdWJsaXNoaW5nIHlvdXIgYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQgaXMgYSBzaW1wbGUgcHJvY2VzcyB0aGF0IGludm9sdmVzIHRocmVlIGJhc2ljCis8cD5QdWJsaXNoaW5nIHlvdXIgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkgaXMgYSBzaW1wbGUgcHJvY2VzcyB0aGF0IGludm9sdmVzIHRocmVlIGJhc2ljCiB0YXNrcyAoc2VlIGZpZ3VyZSAxKTo8L3A+CiAKIDx1bD4KICAgPGxpPkNyZWF0aW5nIHZhcmlvdXMgZ3JhcGhpY2FsIGFzc2V0cyB0aGF0Ci1hY2NvbXBhbnkgeW91ciBhcHAgb24gQW5kcm9pZCBNYXJrZXQuPC9saT4KLSAgPGxpPlVzaW5nIHRoZSBBbmRyb2lkIE1hcmtldCA8YQotaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9wdWJsaXNoIj5EZXZlbG9wZXIgQ29uc29sZTwvYT4gdG8gY29uZmlndXJlIHB1Ymxpc2hpbmcgb3B0aW9ucywKLXNwZWNpZnkgbGlzdGluZyBkZXRhaWxzLCBhbmQgdXBsb2FkIHlvdXIgYXBwIGFuZCBncmFwaGljYWwgYXNzZXRzIHRvIEFuZHJvaWQgTWFya2V0LjwvbGk+CithY2NvbXBhbnkgeW91ciBhcHAgb24gR29vZ2xlIFBsYXkuPC9saT4KKyAgPGxpPlVzaW5nIHRoZSBHb29nbGUgUGxheSA8YQoraHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2giPkRldmVsb3BlciBDb25zb2xlPC9hPiB0byBjb25maWd1cmUgcHVibGlzaGluZyBvcHRpb25zLAorc3BlY2lmeSBsaXN0aW5nIGRldGFpbHMsIGFuZCB1cGxvYWQgeW91ciBhcHAgYW5kIGdyYXBoaWNhbCBhc3NldHMgdG8gR29vZ2xlIFBsYXkuPC9saT4KICAgPGxpPlJldmlld2luZyB5b3VyIHB1Ymxpc2hpbmcgc2V0dGluZ3MgYW5kIGNoYW5naW5nIHRoZSByZWxlYXNlCiBzdGF0dXMgb2YgeW91ciBhcHAgZnJvbSBVbnB1Ymxpc2hlZCB0byBQdWJsaXNoZWQuPC9saT4KIDwvdWw+CiAKIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL3B1Ymxpc2hpbmcvcHVibGlzaGluZ19hbmRyb2lkX21hcmtldC5wbmciCi0gICAgIGFsdD0iU2hvd3MgdGhlIHRocmVlIHN0ZXBzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIHB1Ymxpc2ggb24gQW5kcm9pZCBNYXJrZXQiCisgICAgIGFsdD0iU2hvd3MgdGhlIHRocmVlIHN0ZXBzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIHB1Ymxpc2ggb24gR29vZ2xlIFBsYXkiCiAgICAgIGhlaWdodD0iMTY4IgogICAgICBpZD0iZmlndXJlMSIgLz4KIDxwIGNsYXNzPSJpbWctY2FwdGlvbiI+Ci0gIDxzdHJvbmc+RmlndXJlIDEuPC9zdHJvbmc+IFRvIHB1Ymxpc2ggYXBwcyBvbiBBbmRyb2lkIE1hcmtldCB5b3UgbXVzdCBmaXJzdCA8YQorICA8c3Ryb25nPkZpZ3VyZSAxLjwvc3Ryb25nPiBUbyBwdWJsaXNoIGFwcHMgb24gR29vZ2xlIFBsYXkgeW91IG11c3QgZmlyc3QgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3ByZXBhcmluZy5odG1sIj5wcmVwYXJlIHlvdXIgYXBwIGZvciByZWxlYXNlPC9hPiBhbmQgdGhlbiBwZXJmb3JtCiB0aHJlZSBzaW1wbGUgdGFza3MuCiA8L3A+CiAKIDxwIGNsYXNzPSJjYXV0aW9uIj48c3Ryb25nPkltcG9ydGFudDo8L3N0cm9uZz4gWW91IG11c3QgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3ByZXBhcmluZy5odG1sIj5wcmVwYXJlIHlvdXIgYXBwbGljYXRpb24gZm9yIHJlbGVhc2U8L2E+IGJlZm9yZSB5b3UKLWNhbiBwdWJsaXNoIGl0IG9uIEFuZHJvaWQgTWFya2V0LiBXaGVuIHlvdSBwcmVwYXJlIHlvdXIgYXBwbGljYXRpb24gZm9yIHJlbGVhc2UgeW91IGNvbmZpZ3VyZSBpdCBmb3IKK2NhbiBwdWJsaXNoIGl0IG9uIEdvb2dsZSBQbGF5LiBXaGVuIHlvdSBwcmVwYXJlIHlvdXIgYXBwbGljYXRpb24gZm9yIHJlbGVhc2UgeW91IGNvbmZpZ3VyZSBpdCBmb3IKIHJlbGVhc2UgYW5kIGJ1aWxkIGl0IGluIHJlbGVhc2UgbW9kZS4gQnVpbGRpbmcgaW4gcmVsZWFzZSBtb2RlIHNpZ25zIHlvdXIgYXBwbGljYXRpb24ncyB7QGNvZGUgLmFwa30KLWZpbGUgd2l0aCB5b3VyIHByaXZhdGUgcmVsZWFzZSBrZXkuIFlvdSBjYW5ub3QgcHVibGlzaCBhbiBhcHBsaWNhdGlvbiBvbiBBbmRyb2lkIE1hcmtldCB1bmxlc3MgaXQgaXMKK2ZpbGUgd2l0aCB5b3VyIHByaXZhdGUgcmVsZWFzZSBrZXkuIFlvdSBjYW5ub3QgcHVibGlzaCBhbiBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheSB1bmxlc3MgaXQgaXMKIHNpZ25lZCB3aXRoIHlvdXIgb3duIHByaXZhdGUgcmVsZWFzZSBrZXkuPC9wPgogCiA8aDM+UHJlcGFyaW5nIHByb21vdGlvbmFsIG1hdGVyaWFsczwvaDM+CiAKLTxwPlRvIGZ1bGx5IGxldmVyYWdlIHRoZSBtYXJrZXRpbmcgYW5kIHB1YmxpY2l0eSBjYXBhYmlsaXRpZXMgb2YgQW5kcm9pZCBNYXJrZXQsIHlvdSBuZWVkIHRvIGNyZWF0ZQotc2V2ZXJhbCBncmFwaGljYWwgYXNzZXRzIHRoYXQgYWNjb21wYW55IHlvdXIgYXBwIG9uIEFuZHJvaWQgTWFya2V0LCBzdWNoIGFzIHNjcmVlbnNob3RzLCB2aWRlb3MsCis8cD5UbyBmdWxseSBsZXZlcmFnZSB0aGUgbWFya2V0aW5nIGFuZCBwdWJsaWNpdHkgY2FwYWJpbGl0aWVzIG9mIEdvb2dsZSBQbGF5LCB5b3UgbmVlZCB0byBjcmVhdGUKK3NldmVyYWwgZ3JhcGhpY2FsIGFzc2V0cyB0aGF0IGFjY29tcGFueSB5b3VyIGFwcCBvbiBHb29nbGUgUGxheSwgc3VjaCBhcyBzY3JlZW5zaG90cywgdmlkZW9zLAogcHJvbW90aW9uYWwgZ3JhcGhpY3MsIGFuZCBwcm9tb3Rpb25hbCB0ZXh0LiBBdCBhIG1pbmltdW0geW91IG11c3QgcHJvdmlkZSB0d28gc2NyZWVuc2hvdHMgb2YgeW91cgogYXBwbGljYXRpb24gYW5kIGEgaGlnaCByZXNvbHV0aW9uIGFwcGxpY2F0aW9uIGljb24uIFRoZSBzY3JlZW5zaG90cyBhcmUgZGlzcGxheWVkIG9uIHRoZSBkZXRhaWxzCi1wYWdlIGZvciB5b3VyIGFwcGxpY2F0aW9uIGluIEFuZHJvaWQgTWFya2V0LCBhbmQgdGhlIGhpZ2ggcmVzb2x1dGlvbiBhcHBsaWNhdGlvbiBpY29uIGlzIGRpc3BsYXllZAotaW4gdmFyaW91cyBsb2NhdGlvbnMgdGhyb3VnaG91dCBBbmRyb2lkIE1hcmtldC4gVGhlIGhpZ2ggcmVzb2x1dGlvbiBpY29uIGRvZXMgbm90IHJlcGxhY2UgdGhlCitwYWdlIGZvciB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LCBhbmQgdGhlIGhpZ2ggcmVzb2x1dGlvbiBhcHBsaWNhdGlvbiBpY29uIGlzIGRpc3BsYXllZAoraW4gdmFyaW91cyBsb2NhdGlvbnMgdGhyb3VnaG91dCBHb29nbGUgUGxheS4gVGhlIGhpZ2ggcmVzb2x1dGlvbiBpY29uIGRvZXMgbm90IHJlcGxhY2UgdGhlCiBsYXVuY2hlciBpY29uIGZvciB5b3VyIGFwcGxpY2F0aW9uLCByYXRoZXIsIGl0IHNlcnZlcyBhcyBhIHN1cHBsZW1lbnRhbCBpY29uIGFuZCBzaG91bGQgbG9vawogdGhlIHNhbWUgYXMgeW91ciBsYXVuY2hlciBpY29uLiBQcm9tb3Rpb25hbCB2aWRlbywKIGdyYXBoaWNzLCBhbmQgdGV4dCBhcmUgb3B0aW9uYWwsIGFsdGhvdWdoIHdlIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgeW91IHByZXBhcmUgdGhlc2UgZm9yIHlvdXIKQEAgLTEzNiw4ICsxMzYsOCBAQAogCiA8aDM+Q29uZmlndXJpbmcgb3B0aW9ucyBhbmQgdXBsb2FkaW5nIGFzc2V0czwvaDM+CiAKLTxwPkFuZHJvaWQgTWFya2V0IGxldHMgeW91IHRhcmdldCB5b3VyIGFwcGxpY2F0aW9uIHRvIGEgd29ybGR3aWRlIHBvb2wgb2YgdXNlcnMgYW5kIGRldmljZXMuIFRvCi1yZWFjaCB0aGVzZSB1c2VycyB5b3UgY2FuIHVzZSB0aGUgQW5kcm9pZCBNYXJrZXQgRGV2ZWxvcGVyIENvbnNvbGUgdG8gY29uZmlndXJlIHZhcmlvdXMgcHVibGlzaGluZworPHA+R29vZ2xlIFBsYXkgbGV0cyB5b3UgdGFyZ2V0IHlvdXIgYXBwbGljYXRpb24gdG8gYSB3b3JsZHdpZGUgcG9vbCBvZiB1c2VycyBhbmQgZGV2aWNlcy4gVG8KK3JlYWNoIHRoZXNlIHVzZXJzIHlvdSBjYW4gdXNlIHRoZSBEZXZlbG9wZXIgQ29uc29sZSB0byBjb25maWd1cmUgdmFyaW91cyBwdWJsaXNoaW5nCiBvcHRpb25zIGFuZCBsaXN0aW5nIGRldGFpbHMgZm9yIHlvdXIgYXBwLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjaG9vc2UgdGhlIDxhCiBocmVmPSJodHRwOi8vc3VwcG9ydC5nb29nbGUuY29tL2FuZHJvaWRtYXJrZXQvZGV2ZWxvcGVyL2Jpbi9hbnN3ZXIucHk/aGw9ZW4mYW5zd2VyPTEzODI5NCZ0b3BpYz0KIDIzNjU2MjQmY3R4PXRvcGljIj5jb3VudHJpZXM8L2E+IHlvdSB3YW50IHRvIHJlYWNoLCB0aGUgbGlzdGluZyBsYW5ndWFnZXMgeW91IHdhbnQgdG8gdXNlLCBhbmQgdGhlCkBAIC0xNTUsMTEgKzE1NSwxMSBAQAogYXBwLjwvcD4KIAogPHA+V2hlbiB5b3UgYXJlIGZpbmlzaGVkIHNldHRpbmcgcHVibGlzaGluZyBvcHRpb25zIGFuZCBsaXN0aW5nIGRldGFpbHMsIHlvdSBjYW4gdXBsb2FkIHlvdXIgYXNzZXRzCi1hbmQgeW91ciBhcHBsaWNhdGlvbiB0byBBbmRyb2lkIE1hcmtldC4gWW91IGNhbiBhbHNvIHVwbG9hZCB5b3VyIGFwcGxpY2F0aW9uIGFzIGEgZHJhZnQKK2FuZCB5b3VyIGFwcGxpY2F0aW9uIHRvIEdvb2dsZSBQbGF5LiBZb3UgY2FuIGFsc28gdXBsb2FkIHlvdXIgYXBwbGljYXRpb24gYXMgYSBkcmFmdAogKHVucHVibGlzaGVkKSBhcHBsaWNhdGlvbiwgd2hpY2ggbGV0cyB5b3UgZG8gZmluYWwgdGVzdGluZyBiZWZvcmUgeW91IHB1Ymxpc2ggaXQgZm9yIGZpbmFsCiByZWxlYXNlLjwvcD4KIAotPHA+VG8gbGVhcm4gbW9yZSBhYm91dCBBbmRyb2lkIE1hcmtldCBwdWJsaXNoaW5nIHNldHRpbmdzLCBzZWUgdGhlIGZvbGxvd2luZyByZXNvdXJjZXM6PC9wPgorPHA+VG8gbGVhcm4gbW9yZSBhYm91dCBHb29nbGUgUGxheSBwdWJsaXNoaW5nIHNldHRpbmdzLCBzZWUgdGhlIGZvbGxvd2luZyByZXNvdXJjZXM6PC9wPgogCiA8dWw+CiAgIDxsaT48YQpAQCAtMTgxLDIwICsxODEsMjAgQEAKIDxwPldoZW4geW91IGFyZSBzYXRpc2ZpZWQgdGhhdCB5b3VyIHB1Ymxpc2hpbmcgc2V0dGluZ3MgYXJlIGNvcnJlY3RseSBjb25maWd1cmVkIGFuZCB5b3VyIHVwbG9hZGVkCiBhcHBsaWNhdGlvbiBpcyByZWFkeSB0byBiZSByZWxlYXNlZCB0byB0aGUgcHVibGljLCB5b3UgY2FuIHNpbXBseSBjbGljayA8c3Ryb25nPlB1Ymxpc2g8L3N0cm9uZz4gaW4KIHRoZSBEZXZlbG9wZXIgQ29uc29sZSB0byBtYWtlIHlvdXIgYXBwIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQKLWFyb3VuZCB0aGUgd29ybGQuIEtlZXAgaW4gbWluZCwgaXQgY2FuIHRha2Ugc2V2ZXJhbCBob3VycyBmb3IgeW91ciBhcHAgdG8gYXBwZWFyIG9uIEFuZHJvaWQKLU1hcmtldCBhZnRlciB5b3UgY2xpY2sgPHN0cm9uZz5QdWJsaXNoPC9zdHJvbmc+IGluIHRoZSBEZXZlbG9wZXIgQ29uc29sZS48L3A+Cithcm91bmQgdGhlIHdvcmxkLiBLZWVwIGluIG1pbmQsIGl0IGNhbiB0YWtlIHNldmVyYWwgaG91cnMgZm9yIHlvdXIgYXBwIHRvIGFwcGVhciBvbiBHb29nbGUKK1BsYXkgYWZ0ZXIgeW91IGNsaWNrIDxzdHJvbmc+UHVibGlzaDwvc3Ryb25nPiBpbiB0aGUgRGV2ZWxvcGVyIENvbnNvbGUuPC9wPgogCiA8aDM+Q29udHJvbGxpbmcgRGlzdHJpYnV0aW9uIHRvIERldmljZXM8L2gzPgogCiA8cD5JZiB5b3VyIGFwcGxpY2F0aW9uIHRhcmdldHMgZGlmZmVyZW50IGRldmljZSBjb25maWd1cmF0aW9ucywgeW91IGNhbiBjb250cm9sIHdoaWNoIEFuZHJvaWQtcG93ZXJlZAotZGV2aWNlcyBoYXZlIGFjY2VzcyB0byB5b3VyIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0IGJ5Ci11c2luZyBBbmRyb2lkIE1hcmtldCBmaWx0ZXJzLiBGaWx0ZXJpbmcgY29tcGFyZXMgZGV2aWNlIGNvbmZpZ3VyYXRpb25zIHRoYXQgeW91IGRlY2xhcmUgaW4geW91cgorZGV2aWNlcyBoYXZlIGFjY2VzcyB0byB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5IGJ5Cit1c2luZyBHb29nbGUgUGxheSBmaWx0ZXJzLiBGaWx0ZXJpbmcgY29tcGFyZXMgZGV2aWNlIGNvbmZpZ3VyYXRpb25zIHRoYXQgeW91IGRlY2xhcmUgaW4geW91cgogYXBwJ3MgbWFuaWZlc3QgZmlsZSB0byB0aGUgY29uZmlndXJhdGlvbiBkZWZpbmVkIGJ5IGEgZGV2aWNlLiBGb3IgZXhhbXBsZSwgaWYgeW91IGRlY2xhcmUgdGhlIGNhbWVyYQotZmlsdGVyIGluIHlvdXIgbWFuaWZlc3QsIG9ubHkgdGhvc2UgZGV2aWNlcyB0aGF0IGhhdmUgYSBjYW1lcmEgd2lsbCBzZWUgeW91ciBhcHAgb24gQW5kcm9pZAotTWFya2V0LiBGaWx0ZXJzIG11c3QgYmUgY29uZmlndXJlZCBpbiB5b3VyIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZmlsZSB3aGVuIHlvdSBhcmUgPGEKK2ZpbHRlciBpbiB5b3VyIG1hbmlmZXN0LCBvbmx5IHRob3NlIGRldmljZXMgdGhhdCBoYXZlIGEgY2FtZXJhIHdpbGwgc2VlIHlvdXIgYXBwIG9uIEdvb2dsZQorUGxheS4gRmlsdGVycyBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4geW91ciBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUgd2hlbiB5b3UgYXJlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wcmVwYXJpbmcuaHRtbCI+cHJlcGFyaW5nIHlvdXIgYXBwIGZvciByZWxlYXNlPC9hPiAodGhhdCBpcywgYmVmb3JlCi15b3UgdXBsb2FkIHlvdXIgYXBwIHRvIEFuZHJvaWQgTWFya2V0KS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YQotaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPk1hcmtldCBGaWx0ZXJzPC9hPi48L3A+Cit5b3UgdXBsb2FkIHlvdXIgYXBwIHRvIEdvb2dsZSBQbGF5KS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+LjwvcD4KIAogPHA+WW91IGNhbiBhbHNvIHVzZSB0aGUgbXVsdGlwbGUgQVBLIGZlYXR1cmUgdG8gZGlzdHJpYnV0ZSBkaWZmZXJlbnQge0Bjb2RlIC5hcGt9IGZpbGVzIHVuZGVyIHRoZSBzYW1lCiBhcHBsaWNhdGlvbiBsaXN0aW5nIGFuZCB0aGUgc2FtZSBwYWNrYWdlIG5hbWU7IGhvd2V2ZXIsIHlvdSBzaG91bGQgdXNlIHRoaXMgb3B0aW9uIG9ubHkgYXMgYSBsYXN0CkBAIC0yMDUsMTcgKzIwNSwxNyBAQAogcmVzb3VyY2VzIG1ha2UgdGhlIEFQSyBmaWxlIHRvbyBiaWcgKGdyZWF0ZXIgdGhhbiA1ME1CKSBvciBvdGhlciB0ZWNobmljYWwgY2hhbGxlbmdlcyBwcmV2ZW50IGEKIHNpbmdsZSBBUEsgZnJvbSB3b3JraW5nIG9uIGFsbCBkZXZpY2VzLiBBbHRob3VnaCB3ZSBlbmNvdXJhZ2UgeW91IHRvIGRldmVsb3AgYW5kIHB1Ymxpc2ggYSBzaW5nbGUKIEFQSyB0aGF0IHN1cHBvcnRzIGFzIG1hbnkgZGV2aWNlIGNvbmZpZ3VyYXRpb25zIGFzIHBvc3NpYmxlLCBkb2luZyBzbyBpcyBzb21ldGltZXMKLW5vdCBwb3NzaWJsZS4gVG8gaGVscCB5b3UgcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uIGZvciBhcyBtYW55IGRldmljZXMgYXMgcG9zc2libGUsIEFuZHJvaWQgTWFya2V0Ci1hbGxvd3MgeW91IHRvIHB1Ymxpc2ggbXVsdGlwbGUgQVBLcyB1bmRlciB0aGUgc2FtZSBhcHBsaWNhdGlvbiBsaXN0aW5nLiBBbmRyb2lkIE1hcmtldCB0aGVuIHN1cHBsaWVzCitub3QgcG9zc2libGUuIFRvIGhlbHAgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiBmb3IgYXMgbWFueSBkZXZpY2VzIGFzIHBvc3NpYmxlLCBHb29nbGUgUGxheQorYWxsb3dzIHlvdSB0byBwdWJsaXNoIG11bHRpcGxlIEFQS3MgdW5kZXIgdGhlIHNhbWUgYXBwbGljYXRpb24gbGlzdGluZy4gR29vZ2xlIFBsYXkgdGhlbiBzdXBwbGllcwogZWFjaCBBUEsgdG8gdGhlIGFwcHJvcHJpYXRlIGRldmljZXMgYmFzZWQgb24gY29uZmlndXJhdGlvbiBzdXBwb3J0IHlvdSd2ZSBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QKIGZpbGUgb2YgZWFjaCBBUEsuIFRvIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBuZWVkIHRvIGJ1aWxkIHlvdXIgc2VwYXJhdGUge0Bjb2RlIC5hcGt9IGZpbGVzIHdoZW4geW91IGFyZSA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHJlcGFyaW5nLmh0bWwiPnByZXBhcmluZyB5b3VyIGFwcCBmb3IgcmVsZWFzZTwvYT4gKHRoYXQgaXMsIGJlZm9yZQoteW91IHVwbG9hZCB5b3VyIGFwcCB0byBBbmRyb2lkIE1hcmtldCkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEKK3lvdSB1cGxvYWQgeW91ciBhcHAgdG8gR29vZ2xlIFBsYXkpLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L3B1Ymxpc2hpbmcvbXVsdGlwbGUtYXBrcy5odG1sIj5NdWx0aXBsZSBBUEsgU3VwcG9ydDwvYT4uPC9wPgogCi08aDIgaWQ9Im1hcmtldHVwZ3JhZGUiPlB1Ymxpc2hpbmcgVXBkYXRlcyBvbiBBbmRyb2lkIE1hcmtldDwvaDI+Cis8aDIgaWQ9Im1hcmtldHVwZ3JhZGUiPlB1Ymxpc2hpbmcgVXBkYXRlcyBvbiBHb29nbGUgUGxheTwvaDI+CiAKLTxwPkF0IGFueSB0aW1lIGFmdGVyIHB1Ymxpc2hpbmcgYW4gYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQsIHlvdSBjYW4gdXBsb2FkCis8cD5BdCBhbnkgdGltZSBhZnRlciBwdWJsaXNoaW5nIGFuIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LCB5b3UgY2FuIHVwbG9hZAogYW5kIHB1Ymxpc2ggYW4gdXBkYXRlIHRvIHRoZSBzYW1lIGFwcGxpY2F0aW9uIHBhY2thZ2UuIFdoZW4geW91IHB1Ymxpc2ggYW4KIHVwZGF0ZSB0byBhbiBhcHBsaWNhdGlvbiwgdXNlcnMgd2hvIGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgdGhlCiBhcHBsaWNhdGlvbiBtYXkgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiB0aGF0IGFuIHVwZGF0ZSBpcwpAQCAtMjI4LDQ5ICsyMjgsNDkgQEAKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtZWxlbWVudC5odG1sIj48Y29kZT4mbHQ7bWFuaWZlc3QmZ3Q7PC9jb2RlPjwvYT4KIGVsZW1lbnQgb2YgdGhlIG1hbmlmZXN0IGZpbGUuIEFsc28sIHRoZSBwYWNrYWdlIG5hbWUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgZXhpc3RpbmcgdmVyc2lvbiBhbmQKIHRoZSB7QGNvZGUgLmFwa30gZmlsZSBtdXN0IGJlIHNpZ25lZCB3aXRoIHRoZSBzYW1lIHByaXZhdGUga2V5LiBJZiB0aGUgcGFja2FnZSBuYW1lIGFuZCBzaWduaW5nCi1jZXJ0aWZpY2F0ZSBkbyA8ZW0+bm90PC9lbT4gbWF0Y2ggdGhvc2Ugb2YgdGhlIGV4aXN0aW5nIHZlcnNpb24sIE1hcmtldCB3aWxsCitjZXJ0aWZpY2F0ZSBkbyA8ZW0+bm90PC9lbT4gbWF0Y2ggdGhvc2Ugb2YgdGhlIGV4aXN0aW5nIHZlcnNpb24sIEdvb2dsZSBQbGF5IHdpbGwKIGNvbnNpZGVyIGl0IGEgbmV3IGFwcGxpY2F0aW9uLCBwdWJsaXNoIGl0IGFzIHN1Y2gsIGFuZCB3aWxsIG5vdCBvZmZlciBpdCB0byBleGlzdGluZyB1c2VycyBhcyBhbgogdXBkYXRlLjwvcD4KIAotPHA+SWYgeW91IHBsYW4gdG8gcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0LCB5b3UgbXVzdCBtYWtlIHN1cmUKLSAgdGhhdCBpdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzIGxpc3RlZCBiZWxvdywgd2hpY2ggYXJlIGVuZm9yY2VkIGJ5IHRoZSBNYXJrZXQKLSAgc2VydmVyIHdoZW4geW91IHVwbG9hZCB0aGUgYXBwbGljYXRpb24uPC9wPgorPHA+SWYgeW91IHBsYW4gdG8gcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LCB5b3UgbXVzdCBtYWtlIHN1cmUKKyAgdGhhdCBpdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzIGxpc3RlZCBiZWxvdywgd2hpY2ggYXJlIGVuZm9yY2VkIGJ5IEdvb2dsZSBQbGF5CisgIHdoZW4geW91IHVwbG9hZCB0aGUgYXBwbGljYXRpb24uPC9wPgogCi08aDIgaWQ9Im1hcmtldExpY2Vuc2luZyI+VXNpbmcgQW5kcm9pZCBNYXJrZXQgTGljZW5zaW5nIFNlcnZpY2U8L2gyPgorPGgyIGlkPSJtYXJrZXRMaWNlbnNpbmciPlVzaW5nIEdvb2dsZSBQbGF5IExpY2Vuc2luZyBTZXJ2aWNlPC9oMj4KIAotPHA+QW5kcm9pZCBNYXJrZXQgb2ZmZXJzIGEgbGljZW5zaW5nIHNlcnZpY2UgdGhhdCBsZXRzIHlvdSBlbmZvcmNlIGxpY2Vuc2luZwotcG9saWNpZXMgZm9yIHBhaWQgYXBwbGljYXRpb25zIHRoYXQgeW91IHB1Ymxpc2ggdGhyb3VnaCBBbmRyb2lkIE1hcmtldC4gV2l0aAotQW5kcm9pZCBNYXJrZXQgTGljZW5zaW5nLCB5b3VyIGFwcGxpY2F0aW9ucyBjYW4gcXVlcnkgQW5kcm9pZCBNYXJrZXQgYXQgcnVudGltZQorPHA+R29vZ2xlIFBsYXkgb2ZmZXJzIGEgbGljZW5zaW5nIHNlcnZpY2UgdGhhdCBsZXRzIHlvdSBlbmZvcmNlIGxpY2Vuc2luZworcG9saWNpZXMgZm9yIHBhaWQgYXBwbGljYXRpb25zIHRoYXQgeW91IHB1Ymxpc2ggdGhyb3VnaCBHb29nbGUgUGxheS4gV2l0aAorR29vZ2xlIFBsYXkgTGljZW5zaW5nLCB5b3VyIGFwcGxpY2F0aW9ucyBjYW4gcXVlcnkgR29vZ2xlIFBsYXkgYXQgcnVudGltZQogdG8gb2J0YWluIHRoZSBsaWNlbnNpbmcgc3RhdHVzIGZvciB0aGUgY3VycmVudCB1c2VyLCB0aGVuIGFsbG93IG9yIGRpc2FsbG93CiBmdXJ0aGVyIHVzZSBvZiB0aGUgYXBwbGljYXRpb24gYXMgYXBwcm9wcmlhdGUuIFVzaW5nIHRoZSBzZXJ2aWNlLCB5b3UgY2FuIGFwcGx5IGEgZmxleGlibGUKIGxpY2Vuc2luZyBwb2xpY3kgb24gYW4gYXBwbGljYXRpb24tYnktYXBwbGljYXRpb24gYmFzaXMmbWRhc2g7ZWFjaAogYXBwbGljYXRpb24gY2FuIGVuZm9yY2UgaXRzIGxpY2Vuc2luZyBzdGF0dXMgaW4gdGhlIHdheSBtb3N0IGFwcHJvcHJpYXRlCiBmb3IgaXQuIDwvcD4KIAotPHA+QW55IGFwcGxpY2F0aW9uIHRoYXQgeW91IHB1Ymxpc2ggdGhyb3VnaCBBbmRyb2lkIE1hcmtldCBjYW4gdXNlIHRoZSBBbmRyb2lkCi1NYXJrZXQgTGljZW5zaW5nIFNlcnZpY2UuIFRoZSBzZXJ2aWNlIHVzZXMgbm8gZGVkaWNhdGVkIGZyYW1ld29yayBBUElzLCBzbyB5b3UgY2FuCis8cD5BbnkgYXBwbGljYXRpb24gdGhhdCB5b3UgcHVibGlzaCB0aHJvdWdoIEdvb2dsZSBQbGF5IGNhbiB1c2UgdGhlIEdvb2dsZQorUGxheSBMaWNlbnNpbmcgU2VydmljZS4gVGhlIHNlcnZpY2UgdXNlcyBubyBkZWRpY2F0ZWQgZnJhbWV3b3JrIEFQSXMsIHNvIHlvdSBjYW4KIGFkZCBsaWNlbnNpbmcgdG8gYW55IGFwcGxpY2F0aW9uIHRoYXQgdXNlcyBhIG1pbmltdW0gQVBJIExldmVsIG9mIDMgb3IKIGhpZ2hlci48L3A+CiAKLTxwPkZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbiBhYm91dCBBbmRyb2lkIE1hcmtldCBMaWNlbnNpbmcgU2VydmljZSBhbmQgaG93IHRvCis8cD5Gb3IgY29tcGxldGUgaW5mb3JtYXRpb24gYWJvdXQgR29vZ2xlIFBsYXkgTGljZW5zaW5nIFNlcnZpY2UgYW5kIGhvdyB0bwogdXNlIGl0IGluIHlvdXIgYXBwbGljYXRpb24sIHJlYWQgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2luZGV4Lmh0bWwiPkFwcGxpY2F0aW9uIExpY2Vuc2luZzwvYT4uPC9wPgogCi08aDIgaWQ9Im1hcmtldGluYXBwYmlsbGluZyI+VXNpbmcgQW5kcm9pZCBNYXJrZXQgSW4tYXBwIEJpbGxpbmc8L2gyPgorPGgyIGlkPSJtYXJrZXRpbmFwcGJpbGxpbmciPlVzaW5nIEdvb2dsZSBQbGF5IEluLWFwcCBCaWxsaW5nPC9oMj4KIAotPHA+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfb3ZlcnZpZXcuaHRtbCI+QW5kcm9pZCBNYXJrZXQgSW4tYXBwIEJpbGxpbmc8L2E+Ci1pcyBhbiBBbmRyb2lkIE1hcmtldCBzZXJ2aWNlIHRoYXQgbGV0cyB5b3Ugc2VsbCBkaWdpdGFsIGNvbnRlbnQgaW4geW91ciBhcHBsaWNhdGlvbnMuIFlvdSBjYW4gdXNlCis8cD48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19vdmVydmlldy5odG1sIj5Hb29nbGUgUGxheSBJbi1hcHAgQmlsbGluZzwvYT4KK2lzIGEgR29vZ2xlIFBsYXkgc2VydmljZSB0aGF0IGxldHMgeW91IHNlbGwgZGlnaXRhbCBjb250ZW50IGluIHlvdXIgYXBwbGljYXRpb25zLiBZb3UgY2FuIHVzZQogdGhlIHNlcnZpY2UgdG8gc2VsbCBhIHdpZGUgcmFuZ2Ugb2YgY29udGVudCwgaW5jbHVkaW5nIGRvd25sb2FkYWJsZSAgY29udGVudCBzdWNoIGFzIG1lZGlhIGZpbGVzIG9yCiBwaG90b3MsIGFuZCB2aXJ0dWFsIGNvbnRlbnQgc3VjaCBhcyBnYW1lIGxldmVscyBvciBwb3Rpb25zLjwvcD4KIAotPHA+V2hlbiB5b3UgdXNlIEFuZHJvaWQgTWFya2V0J3MgaW4tYXBwIGJpbGxpbmcgc2VydmljZSB0byBzZWxsIGFuIGl0ZW0sIEFuZHJvaWQgTWFya2V0IGhhbmRsZXMgYWxsCis8cD5XaGVuIHlvdSB1c2UgR29vZ2xlIFBsYXkncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlIHRvIHNlbGwgYW4gaXRlbSwgR29vZ2xlIFBsYXkgaGFuZGxlcyBhbGwKIGJpbGxpbmcgZGV0YWlscyBzbyB5b3VyIGFwcGxpY2F0aW9uIG5ldmVyIGhhcyB0byBkaXJlY3RseSBwcm9jZXNzIGFueSBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zLgotQW5kcm9pZCBNYXJrZXQgdXNlcyB0aGUgc2FtZSBjaGVja291dCBzZXJ2aWNlIHRoYXQgaXMgdXNlZCBmb3IgYXBwbGljYXRpb24gcHVyY2hhc2VzLCBzbyB5b3VyIHVzZXJzCitHb29nbGUgUGxheSB1c2VzIHRoZSBzYW1lIGNoZWNrb3V0IHNlcnZpY2UgdGhhdCBpcyB1c2VkIGZvciBhcHBsaWNhdGlvbiBwdXJjaGFzZXMsIHNvIHlvdXIgdXNlcnMKIGV4cGVyaWVuY2UgYSBjb25zaXN0ZW50IGFuZCBmYW1pbGlhciBwdXJjaGFzZSBmbG93IChzZWUgZmlndXJlIDEpLiBBbHNvLCB0aGUgdHJhbnNhY3Rpb24gZmVlIGZvcgogaW4tYXBwIHB1cmNoYXNlcyBpcyB0aGUgc2FtZSBhcyB0aGUgdHJhbnNhY3Rpb24gZmVlIGZvciBhcHBsaWNhdGlvbiBwdXJjaGFzZXMgKDMwJSkuPC9wPgogCi08cD5BbnkgYXBwbGljYXRpb24gdGhhdCB5b3UgcHVibGlzaCB0aHJvdWdoIEFuZHJvaWQgTWFya2V0IGNhbiBpbXBsZW1lbnQgaW4tYXBwIGJpbGxpbmcuIE5vIHNwZWNpYWwKLWFjY291bnQgb3IgcmVnaXN0cmF0aW9uIGlzIHJlcXVpcmVkIG90aGVyIHRoYW4gYW4gQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIGFjY291bnQgYW5kIGEgR29vZ2xlCis8cD5BbnkgYXBwbGljYXRpb24gdGhhdCB5b3UgcHVibGlzaCB0aHJvdWdoIEdvb2dsZSBQbGF5IGNhbiBpbXBsZW1lbnQgaW4tYXBwIGJpbGxpbmcuIE5vIHNwZWNpYWwKK2FjY291bnQgb3IgcmVnaXN0cmF0aW9uIGlzIHJlcXVpcmVkIG90aGVyIHRoYW4gYSBHb29nbGUgUGxheSBwdWJsaXNoZXIgYWNjb3VudCBhbmQgYSBHb29nbGUKIENoZWNrb3V0IE1lcmNoYW50IGFjY291bnQuIEFsc28sIGJlY2F1c2UgdGhlIHNlcnZpY2UgdXNlcyBubyBkZWRpY2F0ZWQgZnJhbWV3b3JrIEFQSXMsIHlvdSBjYW4gYWRkCiBpbi1hcHAgYmlsbGluZyB0byBhbnkgYXBwbGljYXRpb24gdGhhdCB1c2VzIGEgbWluaW11bSBBUEkgbGV2ZWwgb2YgNCBvciBoaWdoZXIuPC9wPgogCkBAIC0yODIsNTggKzI4Miw1OSBAQAogaW1wbGVtZW50IGluLWFwcCBiaWxsaW5nLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW4tYXBwIGJpbGxpbmcgZmVhdHVyZSwgc2VlIHRoZQogPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9iaWxsaW5nL2luZGV4Lmh0bWwiPkluLWFwcCBCaWxsaW5nIGRvY3VtZW50YXRpb248L2E+LjwvcD4KIAotPGgyIGlkPSJtYXJrZXRpbnRlbnQiPkxpbmtpbmcgdG8gWW91ciBBcHBzIG9uIEFuZHJvaWQgTWFya2V0PC9oMj4KKzxoMiBpZD0ibWFya2V0aW50ZW50Ij5MaW5raW5nIHRvIFlvdXIgQXBwcyBvbiBHb29nbGUgUGxheTwvaDI+CiAKLTxwPlRvIGhlbHAgdXNlcnMgZGlzY292ZXIgeW91ciBwdWJsaXNoZWQgYXBwbGljYXRpb25zLCB5b3UgY2FuIHVzZSB0d28gc3BlY2lhbCBBbmRyb2lkIE1hcmtldCBVUklzCis8cD5UbyBoZWxwIHVzZXJzIGRpc2NvdmVyIHlvdXIgcHVibGlzaGVkIGFwcGxpY2F0aW9ucywgeW91IGNhbiB1c2UgdHdvIHNwZWNpYWwgR29vZ2xlIFBsYXkgVVJJcwogdGhhdCBkaXJlY3QgdXNlcnMgdG8geW91ciBhcHBsaWNhdGlvbidzIGRldGFpbHMgcGFnZSBvciBwZXJmb3JtIGEgc2VhcmNoIGZvciBhbGwgb2YgeW91ciBwdWJsaXNoZWQKLWFwcGxpY2F0aW9ucyBpbiBBbmRyb2lkIE1hcmtldC4gWW91IGNhbiB1c2UgdGhlc2UgVVJJcyB0byBjcmVhdGUgYSBidXR0b24gaW4geW91ciBhcHBsaWNhdGlvbiBvciBhCithcHBsaWNhdGlvbnMgb24gR29vZ2xlIFBsYXkuIFlvdSBjYW4gdXNlIHRoZXNlIFVSSXMgdG8gY3JlYXRlIGEgYnV0dG9uIGluIHlvdXIgYXBwbGljYXRpb24gb3IgYQogbGluayBvbiBhIHdlYiBwYWdlIHRoYXQ6PC9wPgogCiA8dWw+Ci0gIDxsaT5PcGVucyB5b3VyIGFwcGxpY2F0aW9uJ3MgZGV0YWlscyBwYWdlIGluIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBvciB3ZWIgc2l0ZS48L2xpPgotICA8bGk+U2VhcmNoZXMgZm9yIGFsbCB5b3VyIHB1Ymxpc2hlZCBhcHBsaWNhdGlvbnMgaW4gdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIG9yIHdlYgorICA8bGk+T3BlbnMgeW91ciBhcHBsaWNhdGlvbidzIGRldGFpbHMgcGFnZSBpbiB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gb3Igd2ViIHNpdGUuPC9saT4KKyAgPGxpPlNlYXJjaGVzIGZvciBhbGwgeW91ciBwdWJsaXNoZWQgYXBwbGljYXRpb25zIGluIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBvciB3ZWIKIHNpdGUuPC9saT4KIDwvdWw+CiAKLTxwPllvdSBjYW4gbGF1bmNoIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBvciB3ZWIgc2l0ZSBpbiB0aGUgZm9sbG93aW5nIHdheXM6PC9wPgorPHA+WW91IGNhbiBsYXVuY2ggdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIG9yIHdlYiBzaXRlIGluIHRoZSBmb2xsb3dpbmcgd2F5czo8L3A+CiA8dWw+CiAgIDxsaT5Jbml0aWF0ZSBhbiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudH0gZnJvbSB5b3VyIGFwcGxpY2F0aW9uIHRoYXQgbGF1bmNoZXMgdGhlCi1BbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBvbiB0aGUgdXNlcidzIGRldmljZS48L2xpPgotICA8bGk+UHJvdmlkZSBhIGxpbmsgb24gYSB3ZWIgcGFnZSB0aGF0IG9wZW5zIHRoZSBBbmRyb2lkIE1hcmtldCB3ZWIgc2l0ZSAoYnV0IHdpbGwgYWxzbwotb3BlbiB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gaWYgY2xpY2tlZCBmcm9tIGEgZGV2aWNlKS48L2xpPgorR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gb24gdGhlIHVzZXIncyBkZXZpY2UuPC9saT4KKyAgPGxpPlByb3ZpZGUgYSBsaW5rIG9uIGEgd2ViIHBhZ2UgdGhhdCBvcGVucyB0aGUgR29vZ2xlIFBsYXkgd2ViIHNpdGUgKGJ1dCB3aWxsIGFsc28KK29wZW4gdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIGlmIGNsaWNrZWQgZnJvbSBhIGRldmljZSkuPC9saT4KIDwvdWw+CiAKIDxwPkluIGJvdGggY2FzZXMsIHdoZXRoZXIgeW91IHdhbnQgdG8gaW5pdGlhdGUgdGhlIGFjdGlvbiBmcm9tIHlvdXIgYXBwbGljYXRpb24gb3IgZnJvbSBhIHdlYgogcGFnZSwgdGhlIFVSSXMgYXJlIHF1aXRlIHNpbWlsYXIuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlIFVSSSBwcmVmaXguPC9wPgogCi08cD5UbyBvcGVuIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBmcm9tIHlvdXIgYXBwbGljYXRpb24sIHRoZSBwcmVmaXggZm9yIHRoZSBpbnRlbnQncyBkYXRhCis8cD5UbyBvcGVuIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBmcm9tIHlvdXIgYXBwbGljYXRpb24sIHRoZSBwcmVmaXggZm9yIHRoZSBpbnRlbnQncyBkYXRhCiBVUkkgaXM6PC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLWxlZnQ6MmVtIj48Y29kZT5tYXJrZXQ6Ly88L2NvZGU+PC9wPgogCi08cD5UbyBvcGVuIEFuZHJvaWQgTWFya2V0IGZyb20geW91ciB3ZWIgc2l0ZSwgdGhlIHByZWZpeCBmb3IgdGhlIGxpbmsgVVJJIGlzOjwvcD4KKzxwPlRvIG9wZW4gR29vZ2xlIFBsYXkgc3RvcmUgZnJvbSB5b3VyIHdlYiBzaXRlLCB0aGUgcHJlZml4IGZvciB0aGUgbGluayBVUkkgaXM6PC9wPgogCi08cCBzdHlsZT0ibWFyZ2luLWxlZnQ6MmVtIj48Y29kZT5odHRwOi8vbWFya2V0LmFuZHJvaWQuY29tLzwvY29kZT48L3A+Cis8cCBzdHlsZT0ibWFyZ2luLWxlZnQ6MmVtIj48Y29kZT5odHRwOi8vcGxheS5nb29nbGUuY29tL3N0b3JlLzwvY29kZT48L3A+CiAKIDxwPlRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGVzY3JpYmUgaG93IHRvIGNyZWF0ZSBhIGNvbXBsZXRlIFVSSSBmb3IgZWFjaCBhY3Rpb24uPC9wPgogCi08cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB5b3UgY3JlYXRlIGEgbGluayB0byBvcGVuIEFuZHJvaWQgTWFya2V0IGZyb20geW91ciB3ZWIKLXNpdGUgYW5kIHRoZSB1c2VyIHNlbGVjdHMgaXQgZnJvbSBhbiBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlLCB0aGUgZGV2aWNlJ3MgTWFya2V0IGFwcGxpY2F0aW9uIHdpbGwKLXJlc29sdmUgdGhlIGxpbmsgc28gdGhlIHVzZXIgY2FuIHVzZSB0aGUgTWFya2V0IGFwcGxpY2F0aW9uIGluc3RlYWQgb2Ygb3BlbmluZyB0aGUgd2ViCi1zaXRlLiBBcyBzdWNoLCB5b3Ugc2hvdWxkIGFsd2F5cyB1c2Uge0Bjb2RlIGh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vfSBVUklzIHdoZW4gY3JlYXRpbmcgYSBsaW5rIG9uCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB5b3UgY3JlYXRlIGEgbGluayB0byBvcGVuIEdvb2dsZSBQbGF5IGZyb20geW91ciB3ZWIKK3NpdGUgYW5kIHRoZSB1c2VyIHNlbGVjdHMgaXQgZnJvbSBhbiBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlLCB0aGUgZGV2aWNlJ3MgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gd2lsbAorcmVzb2x2ZSB0aGUgbGluayBzbyB0aGUgdXNlciBjYW4gdXNlIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlIGluc3RlYWQgb2Ygb3BlbmluZyB0aGUgd2ViCitzaXRlLiBBcyBzdWNoLCB5b3Ugc2hvdWxkIGFsd2F5cyB1c2Uge0Bjb2RlIGh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvYXBwcy8uLi59IFVSSXMgd2hlbgorY3JlYXRpbmcgYSBsaW5rIG9uCiBhIHdlYiBwYWdlLiBXaGVuIHBvaW50aW5nIHRvIHlvdXIgYXBwcyBmcm9tIHdpdGhpbiB5b3VyIEFuZHJvaWQgYXBwLCB1c2UgdGhlCi17QGNvZGUgbWFya2V0Oi8vfSBVUklzIGluIGFuIGludGVudCwgc28gdGhhdCB0aGUgTWFya2V0IGFwcGxpY2F0aW9uIGFsd2F5cyBvcGVucy48L3A+Cit7QGNvZGUgbWFya2V0Oi8vfSBVUklzIGluIGFuIGludGVudCwgc28gdGhhdCB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gYWx3YXlzIG9wZW5zLjwvcD4KIAogCiA8aDMgaWQ9Ik9wZW5pbmdEZXRhaWxzIj5PcGVuaW5nIGFuIGFwcCdzIGRldGFpbHMgcGFnZTwvaDM+CiAKIDxwPkFzIGRlc2NyaWJlZCBhYm92ZSwgeW91IGNhbiBvcGVuIHRoZSBkZXRhaWxzIHBhZ2UgZm9yIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gZWl0aGVyIG9uIHRoZQotQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gb3IgdGhlIEFuZHJvaWQgTWFya2V0IHdlYiBzaXRlLiBUaGUgZGV0YWlscyBwYWdlIGFsbG93cyB0aGUgdXNlciB0byBzZWUKK0dvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIG9yIHRoZSBHb29nbGUgUGxheSB3ZWIgc2l0ZS4gVGhlIGRldGFpbHMgcGFnZSBhbGxvd3MgdGhlIHVzZXIgdG8gc2VlCiB0aGUgYXBwbGljYXRpb24gZGVzY3JpcHRpb24sIHNjcmVlbnNob3RzLCByZXZpZXdzIGFuZCBtb3JlLCBhbmQgY2hvb3NlIHRvIGluc3RhbGwgaXQuPC9wPgogCiA8cD5UaGUgZm9ybWF0IGZvciB0aGUgVVJJIHRoYXQgb3BlbnMgdGhlIGRldGFpbHMgcGFnZSBpczo8L3A+CiAKLTxwIHN0eWxlPSJtYXJnaW4tbGVmdDoyZW0iPjxjb2RlPiZsdDtVUklfcHJlZml4Jmd0OzxiPmRldGFpbHM/aWQ9PC9iPiZsdDtwYWNrYWdlX25hbWUmZ3Q7PC9jb2RlPjwvcD4KKzxwIHN0eWxlPSJtYXJnaW4tbGVmdDoyZW0iPjxjb2RlPiZsdDtVUklfcHJlZml4Jmd0OzxiPmFwcHMvZGV0YWlscz9pZD08L2I+Jmx0O3BhY2thZ2VfbmFtZSZndDs8L2NvZGU+PC9wPgogCiA8cD5UaGUgPGNvZGU+Jmx0O3BhY2thZ2VfbmFtZSZndDs8L2NvZGU+IGlzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSB0YXJnZXQgYXBwbGljYXRpb24ncwogZnVsbHktcXVhbGlmaWVkIHBhY2thZ2UgbmFtZSwgYXMgZGVjbGFyZWQgaW4gdGhlIDxhCkBAIC0zNDEsMjYgKzM0MiwyOCBAQAogcGFja2FnZX08L2E+IGF0dHJpYnV0ZSBvZiB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1lbGVtZW50Lmh0bWwiPntAY29kZQogJmx0O21hbmlmZXN0Jmd0O308L2E+IGVsZW1lbnQuPC9wPgogCis8cD5Gb3IgZXhhbXBsZTogPGNvZGU+aHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9hcHBzL2RldGFpbHM/aWQ9Y29tLmV4YW1wbGUubXlhcHA8L2NvZGU+PC9wPgorCiAKIDxoND5PcGVuaW5nIHRoZSBhcHAgZGV0YWlscyBwYWdlIGZyb20geW91ciBBbmRyb2lkIGFwcDwvaDQ+CiAKLTxwPlRvIG9wZW4gdGhlIEFuZHJvaWQgTWFya2V0IGRldGFpbHMgcGFnZSBmcm9tIHlvdXIgYXBwbGljYXRpb24sCis8cD5UbyBvcGVuIHRoZSBHb29nbGUgUGxheSBkZXRhaWxzIHBhZ2UgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLAogY3JlYXRlIGFuIGludGVudCB3aXRoIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNBQ1RJT05fVklFV30gYWN0aW9uIGFuZCBpbmNsdWRlIGEgZGF0YSBVUkkKIGluIHRoaXMgZm9ybWF0OjwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi1sZWZ0OjJlbSI+PGNvZGU+bWFya2V0Oi8vZGV0YWlscz9pZD0mbHQ7cGFja2FnZV9uYW1lJmd0OzwvY29kZT48L3A+CiAKIDxwPkZvciBleGFtcGxlLCBoZXJlJ3MgaG93IHlvdSBjYW4gY3JlYXRlIGFuIGludGVudCBhbmQgb3BlbiBhbiBhcHBsaWNhdGlvbidzIGRldGFpbHMgcGFnZSBpbgotQW5kcm9pZCBNYXJrZXQ6PC9wPgorR29vZ2xlIFBsYXk6PC9wPgogCiA8cHJlPgogSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKLWludGVudC5zZXREYXRhKFVyaS5wYXJzZSgibWFya2V0Oi8vZGV0YWlscz9pZD1jb20uYW5kcm9pZC5leGFtcGxlIikpOworaW50ZW50LnNldERhdGEoVXJpLnBhcnNlKCJtYXJrZXQ6Ly9kZXRhaWxzP2lkPWNvbS5leGFtcGxlLmFuZHJvaWQiKSk7CiBzdGFydEFjdGl2aXR5KGludGVudCk7CiA8L3ByZT4KIAotPHA+VGhpcyB3aWxsIG9wZW4gdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIG9uIHRoZSBkZXZpY2UgdG8gdmlldyB0aGUge0Bjb2RlCi1jb20uYW5kcm9pZC5leGFtcGxlfSBhcHBsaWNhdGlvbi48L3A+Cis8cD5UaGlzIHdpbGwgb3BlbiB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gb24gdGhlIGRldmljZSB0byB2aWV3IHRoZSB7QGNvZGUKK2NvbS5leGFtcGxlLmFuZHJvaWR9IGFwcGxpY2F0aW9uLjwvcD4KIAogCiA8aDQ+T3BlbmluZyB0aGUgYXBwIGRldGFpbHMgcGFnZSBmcm9tIGEgd2ViIHNpdGU8L2g0PgpAQCAtMzY5LDMyICszNzIsMzIgQEAKIGZvcm1hdDo8L3A+CiAKIDxwIHN0eWxlPSJtYXJnaW4tbGVmdDoyZW0iPgotICA8Y29kZT5odHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL2RldGFpbHM/aWQ9Jmx0O3BhY2thZ2VfbmFtZSZndDs8L2NvZGU+CisgIDxjb2RlPmh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvYXBwcy9kZXRhaWxzP2lkPSZsdDtwYWNrYWdlX25hbWUmZ3Q7PC9jb2RlPgogPC9wPgogCi08cD5Gb3IgZXhhbXBsZSwgaGVyZSdzIGEgbGluayB0aGF0IG9wZW5zIGFuIGFwcGxpY2F0aW9uJ3MgZGV0YWlscyBwYWdlIG9uIEFuZHJvaWQgTWFya2V0OjwvcD4KKzxwPkZvciBleGFtcGxlLCBoZXJlJ3MgYSBsaW5rIHRoYXQgb3BlbnMgYW4gYXBwbGljYXRpb24ncyBkZXRhaWxzIHBhZ2Ugb24gR29vZ2xlIFBsYXk6PC9wPgogCiA8cHJlPgotJmx0O2EgaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9kZXRhaWxzP2lkPWNvbS5hbmRyb2lkLmV4YW1wbGUiPkFwcCBMaW5rJmx0Oy9hPgorJmx0O2EgaHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9hcHBzL2RldGFpbHM/aWQ9Y29tLmV4YW1wbGUuYW5kcm9pZCI+QXBwIExpbmsmbHQ7L2E+CiA8L3ByZT4KIAotPHA+V2hlbiBjbGlja2VkIGZyb20gYSBkZXNrdG9wIHdlYiBicm93c2VyLCB0aGlzIG9wZW5zIHRoZSBBbmRyb2lkIE1hcmtldCB3ZWIgc2l0ZSB0byB2aWV3IHRoZQote0Bjb2RlIGNvbS5hbmRyb2lkLmV4YW1wbGV9IGFwcGxpY2F0aW9uLiBXaGVuIGNsaWNrZWQgZnJvbSBhbiBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlLCB1c2VycyBhcmUKLWdpdmVuIHRoZSBvcHRpb24gdG8gdXNlIGVpdGhlciB0aGVpciB3ZWIgYnJvd3NlciBvciB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gdG8gdmlldyB0aGUKKzxwPldoZW4gY2xpY2tlZCBmcm9tIGEgZGVza3RvcCB3ZWIgYnJvd3NlciwgdGhpcyBvcGVucyB0aGUgR29vZ2xlIFBsYXkgd2ViIHNpdGUgdG8gdmlldyB0aGUKK3tAY29kZSBjb20uZXhhbXBsZS5hbmRyb2lkfSBhcHBsaWNhdGlvbi4gV2hlbiBjbGlja2VkIGZyb20gYW4gQW5kcm9pZC1wb3dlcmVkIGRldmljZSwgdXNlcnMgYXJlCitnaXZlbiB0aGUgb3B0aW9uIHRvIHVzZSBlaXRoZXIgdGhlaXIgd2ViIGJyb3dzZXIgb3IgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHRvIHZpZXcgdGhlCiBhcHBsaWNhdGlvbi48L3A+CiAKIAogCiA8aDMgaWQ9IlBlcmZvcm1pbmdTZWFyY2giPlBlcmZvcm1pbmcgYSBzZWFyY2g8L2gzPgogCi08cD5UbyBpbml0aWF0ZSBhIHNlYXJjaCBpbiBBbmRyb2lkIE1hcmtldCwgdGhlIGZvcm1hdCBmb3IgdGhlIFVSSSBpczo8L3A+Cis8cD5UbyBpbml0aWF0ZSBhIHNlYXJjaCBvbiBHb29nbGUgUGxheSwgdGhlIGZvcm1hdCBmb3IgdGhlIFVSSSBpczo8L3A+CiAKIDxwIHN0eWxlPSJtYXJnaW4tbGVmdDoyZW0iPgogICA8Y29kZT4mbHQ7VVJJX3ByZWZpeCZndDs8Yj5zZWFyY2g/cT08L2I+Jmx0O3F1ZXJ5Jmd0OzwvY29kZT4KIDwvcD4KIAotPHA+VGhlIDxjb2RlPiZsdDtxdWVyeSZndDs8L2NvZGU+IGlzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBzZWFyY2ggcXVlcnkgdG8gZXhlY3V0ZSBpbiBBbmRyb2lkCi1NYXJrZXQuIFRoZSBxdWVyeSBjYW4gYmUgYSByYXcgdGV4dCBzdHJpbmcgb3IgeW91IGNhbiBpbmNsdWRlIGEgcGFyYW1ldGVyIHRoYXQgcGVyZm9ybXMgYSBzZWFyY2gKKzxwPlRoZSA8Y29kZT4mbHQ7cXVlcnkmZ3Q7PC9jb2RlPiBpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgc2VhcmNoIHF1ZXJ5IHRvIGV4ZWN1dGUgaW4gR29vZ2xlCitQbGF5LiBUaGUgcXVlcnkgY2FuIGJlIGEgcmF3IHRleHQgc3RyaW5nIG9yIHlvdSBjYW4gaW5jbHVkZSBhIHBhcmFtZXRlciB0aGF0IHBlcmZvcm1zIGEgc2VhcmNoCiBiYXNlZCBvbiB0aGUgcHVibGlzaGVyIG5hbWU6PC9wPgogCiA8dWw+CkBAIC00MTAsMTQgKzQxMywxNCBAQAogCiA8aDQ+U2VhcmNoaW5nIGZyb20geW91ciBBbmRyb2lkIGFwcDwvaDQ+CiAKLTxwPlRvIGluaXRpYXRlIGEgc2VhcmNoIG9uIEFuZHJvaWQgTWFya2V0IGZyb20geW91ciBhcHBsaWNhdGlvbiwgY3JlYXRlIGFuIGludGVudCB3aXRoIHRoZQorPHA+VG8gaW5pdGlhdGUgYSBzZWFyY2ggb24gR29vZ2xlIFBsYXkgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLCBjcmVhdGUgYW4gaW50ZW50IHdpdGggdGhlCiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNBQ1RJT05fVklFV30gYWN0aW9uIGFuZCBpbmNsdWRlIGEgZGF0YSBVUkkgaW4gdGhpcyBmb3JtYXQ6PC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLWxlZnQ6MmVtIj48Y29kZT5tYXJrZXQ6Ly9zZWFyY2g/cT0mbHQ7cXVlcnkmZ3Q7PC9jb2RlPjwvcD4KIAogPHA+VGhlIHF1ZXJ5IG1heSBpbmNsdWRlIHRoZSB7QGNvZGUgcHViOn0gcGFyYW1ldGVyIGRlc2NyaWJlZCBhYm92ZS48L3A+CiAKLTxwPkZvciBleGFtcGxlLCBoZXJlJ3MgaG93IHlvdSBjYW4gaW5pdGlhdGUgYSBzZWFyY2ggaW4gdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLCBiYXNlZCBvbiB0aGUKKzxwPkZvciBleGFtcGxlLCBoZXJlJ3MgaG93IHlvdSBjYW4gaW5pdGlhdGUgYSBzZWFyY2ggaW4gdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uLCBiYXNlZCBvbiB0aGUKIHB1Ymxpc2hlciBuYW1lOjwvcD4KIAogPHByZT4KQEAgLTQyNiw0NiArNDI5LDQ2IEBACiBzdGFydEFjdGl2aXR5KGludGVudCk7CiA8L3ByZT4KIAotPHA+VGhpcyBvcGVucyB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gdG8gcGVyZm9ybSB0aGUgc2VhcmNoLiBUaGUgc2VhcmNoIHJlc3VsdCBzaG93cyBhbGwKKzxwPlRoaXMgb3BlbnMgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC4gVGhlIHNlYXJjaCByZXN1bHQgc2hvd3MgYWxsCiBhcHBsaWNhdGlvbnMgcHVibGlzaGVkIGJ5IHRoZSBwdWJsaXNoZXIgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IGRldmljZS48L3A+CiAKIAogPGg0PlNlYXJjaGluZyBmcm9tIGEgd2ViIHNpdGU8L2g0PgogCi08cD5UbyBpbml0aWF0ZSBhIHNlYXJjaCBvbiBBbmRyb2lkIE1hcmtldCBmcm9tIHlvdXIgd2ViIHNpdGUsIGNyZWF0ZSBhIGxpbmsgd2l0aCBhIFVSSSBpbiB0aGlzCis8cD5UbyBpbml0aWF0ZSBhIHNlYXJjaCBvbiBHb29nbGUgUGxheSBmcm9tIHlvdXIgd2ViIHNpdGUsIGNyZWF0ZSBhIGxpbmsgd2l0aCBhIFVSSSBpbiB0aGlzCiBmb3JtYXQ6PC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLWxlZnQ6MmVtIj4KLSAgPGNvZGU+aHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9zZWFyY2g/cT0mbHQ7cXVlcnkmZ3Q7PC9jb2RlPgorICA8Y29kZT5odHRwOi8vcGxheS5nb29nbGUuY29tL3N0b3JlL3NlYXJjaD9xPSZsdDtxdWVyeSZndDs8L2NvZGU+CiA8L3A+CiAKIDxwPlRoZSBxdWVyeSBtYXkgaW5jbHVkZSB0aGUge0Bjb2RlIHB1Yjp9IHBhcmFtZXRlciBkZXNjcmliZWQgYWJvdmUuPC9wPgogCi08cD5Gb3IgZXhhbXBsZSwgaGVyZSdzIGEgbGluayB0aGF0IGluaXRpYXRlcyBhIHNlYXJjaCBvbiBBbmRyb2lkIE1hcmtldCwgYmFzZWQgb24gdGhlCis8cD5Gb3IgZXhhbXBsZSwgaGVyZSdzIGEgbGluayB0aGF0IGluaXRpYXRlcyBhIHNlYXJjaCBvbiBHb29nbGUgUGxheSwgYmFzZWQgb24gdGhlCiBwdWJsaXNoZXIgbmFtZTo8L3A+CiAKIDxwcmU+Ci0mbHQ7YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3NlYXJjaD9xPXB1YjpZb3VyIFB1Ymxpc2hlciBOYW1lIj5TZWFyY2ggTGluayZsdDsvYT4KKyZsdDthIGhyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvc2VhcmNoP3E9cHViOllvdXIgUHVibGlzaGVyIE5hbWUiPlNlYXJjaCBMaW5rJmx0Oy9hPgogPC9wcmU+CiAKLTxwPldoZW4gY2xpY2tlZCBmcm9tIGEgZGVza3RvcCB3ZWIgYnJvd3NlciwgdGhpcyBvcGVucyB0aGUgQW5kcm9pZCBNYXJrZXQgd2ViIHNpdGUgYW5kIHBlcmZvcm1zIHRoZQorPHA+V2hlbiBjbGlja2VkIGZyb20gYSBkZXNrdG9wIHdlYiBicm93c2VyLCB0aGlzIG9wZW5zIHRoZSBHb29nbGUgUGxheSB3ZWIgc2l0ZSBhbmQgcGVyZm9ybXMgdGhlCiBzZWFyY2guIFdoZW4gY2xpY2tlZCBmcm9tIGFuIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2UsIHVzZXJzIGFyZSBnaXZlbiB0aGUgb3B0aW9uIHRvIHVzZSBlaXRoZXIgdGhlaXIKLXdlYiBicm93c2VyIG9yIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiB0byBwZXJmb3JtIHRoZSBzZWFyY2guPC9wPgord2ViIGJyb3dzZXIgb3IgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC48L3A+CiAKIAogCi08aDMgaWQ9IkJ1aWxkYUJ1dHRvbiI+QnVpbGQgYW4gQW5kcm9pZCBNYXJrZXQgYnV0dG9uPC9oMz4KKzxoMyBpZD0iQnVpbGRhQnV0dG9uIj5CdWlsZCBhIEdvb2dsZSBQbGF5IGJ1dHRvbjwvaDM+CiAKLTxwPlVzZSB0aGUgZm9sbG93aW5nIGZvcm0gdG8gZ2VuZXJhdGUgYW4gIkF2YWlsYWJsZSBpbiBBbmRyb2lkIE1hcmtldCIgYnV0dG9uIHRoYXQgeW91IGNhbiB1c2Ugb24KLXlvdXIgd2ViIHNpdGUuIElucHV0IGVpdGhlciB5b3VyIGFwcGxpY2F0aW9uJ3MgcGFja2FnZSBuYW1lIG9yIHB1Ymxpc2hlciBuYW1lIGFuZCB0aGUgYnV0dG9uIHdpbGwKLXRha2UgdXNlcnMgdG8gQW5kcm9pZCBNYXJrZXQgdG8gZWl0aGVyIHZpZXcgeW91ciBhcHBsaWNhdGlvbidzIGluZm9ybWF0aW9uIG9yIHZpZXcgYSBsaXN0IG9mCi15b3VyIHB1Ymxpc2hlZCBhcHBzLiBJZiB1c2VycyBjbGljayB0aGUgYnV0dG9uIHdoaWxlIG9uIGFuIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2UsIHRoZSBBbmRyb2lkCi1NYXJrZXQgYXBwbGljYXRpb24gd2lsbCByZXNwb25kIHRvIHNob3cgdXNlcnMgeW91ciBhcHBsaWNhdGlvbihzKS48L3A+Cis8cD5Vc2UgdGhlIGZvbGxvd2luZyBmb3JtIHRvIGNyZWF0ZSBhIGJ1dHRvbiBmb3IgeW91ciB3ZWIgc2l0ZSB0aGF0IHRha2VzIHVzZXJzIHRvIHlvdXIgYXBwbGljYXRpb24KK29uIEdvb2dsZSBQbGF5LiBJbnB1dCBlaXRoZXIgeW91ciBhcHBsaWNhdGlvbidzIHBhY2thZ2UgbmFtZSBvciB5b3VyIHB1Ymxpc2hlciBuYW1lIGFuZCB0aGUgYnV0dG9uCit3aWxsIHRha2UgdXNlcnMgdG8gR29vZ2xlIFBsYXkgdG8gZWl0aGVyIHZpZXcgeW91ciBhcHBsaWNhdGlvbidzIGluZm9ybWF0aW9uIG9yIHZpZXcgYSBsaXN0IG9mIHlvdXIKK3B1Ymxpc2hlZCBhcHBzLiBJZiB1c2VycyBjbGljayB0aGUgYnV0dG9uIHdoaWxlIG9uIGFuIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2UsIHRoZSBHb29nbGUgUGxheQorYXBwbGljYXRpb24gd2lsbCByZXNwb25kIHRvIHNob3cgdXNlcnMgeW91ciBhcHBsaWNhdGlvbihzKS48L3A+CiAKLTxwPlRoaXMgZm9ybSBvZmZlcnMgZm91ciB2ZXJzaW9ucyBvZiB0aGUgb2ZmaWNpYWwgIkF2YWlsYWJsZSBpbiBBbmRyb2lkIE1hcmtldCIgYnV0dG9uIGF0Ci1yZWNvbW1lbmRlZCBzaXplcy4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgZGlmZmVyZW50IHNpemUsIHlvdSBjYW4gZG93bmxvYWQgYW4gRVBTIGZpbGUgZm9yCi10aGUgYnV0dG9uIGltYWdlcyBmcm9tIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkFuZHJvaWQgQnJhbmQKLUd1aWRlbGluZXM8L2E+LjwvcD4KKzxwPlRoaXMgZm9ybSBvZmZlcnMgdHdvIHN0eWxlcyBvZiB0aGUgb2ZmaWNpYWwgYnJhbmQgYmFkZ2UgZWFjaCBhdCByZWNvbW1lbmRlZCBzaXplcy4gWW91IGNhbiBwaWNrCitiZXR3ZWVuIGVpdGhlciAiR2V0IGl0IG9uIEdvb2dsZSBQbGF5IiBvciAiQW5kcm9pZCBhcHAgb24gR29vZ2xlIFBsYXkuIiBZb3Ugc2hvdWxkIG5vdCBtb2RpZnkgdGhlCitiYWRnZSBpbWFnZXMgaW4gYW55IHdheS4gRm9yIG1vcmUgdXNhZ2UgZ3VpZGVsaW5lcywKK3NlZSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5BbmRyb2lkIEJyYW5kIEd1aWRlbGluZXM8L2E+LjwvcD4KIAogPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KIApAQCAtNTA3LDMzICs1MTAsNDQgQEAKIAogLy8gdmFyaWFibGVzIGZvciBjcmVhdGluZyAndHJ5IGl0IG91dCcgZGVtbyBidXR0b24KIHZhciBpbWFnZVBhdGggPSAiaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9pbWFnZXMvYnJhbmQvIgotdmFyIGxpbmtTdGFydCA9ICI8YSBocmVmPVwiaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS8iOwordmFyIGxpbmtTdGFydCA9ICI8YSBocmVmPVwiaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS8iOwogdmFyIGltYWdlU3RhcnQgPSAiXCI+XG4iCi0gICAgICAgICsgIiAgPGltZyBzcmM9XCIiICsgaW1hZ2VQYXRoOwotdmFyIGltYWdlRW5kID0gIi5wbmdcIlxuIgotICAgICAgICArICIgICAgICAgYWx0PVwiQXZhaWxhYmxlIGluIEFuZHJvaWQgTWFya2V0XCIgLz5cbjwvYT4iOworICAgICAgICArICIgIDxpbWcgYWx0PVwiIjsKKyAgLy8gbGVhdmVzIG9wZW5pbmcgZm9yIHRoZSBhbHQgdGV4dCB2YWx1ZQordmFyIGltYWdlU3JjID0gIlwiXG4gICAgICAgc3JjPVwiIiArIGltYWdlUGF0aDsKKyAgLy8gbGVhdmVzIG9wZW5pbmcgZm9yIHRoZSBpbWFnZSBmaWxlIG5hbWUKK3ZhciBpbWFnZUVuZCA9ICIucG5nXCIgLz5cbjwvYT4iOwogCiAvLyB2YXJpYWJsZXMgZm9yIGNyZWF0aW5nIGNvZGUgc25pcHBldAotdmFyIGxpbmtTdGFydENvZGUgPSAiJmx0O2EgaHJlZj1cImh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vIjsKK3ZhciBsaW5rU3RhcnRDb2RlID0gIiZsdDthIGhyZWY9XCJodHRwOi8vcGxheS5nb29nbGUuY29tL3N0b3JlLyI7CiB2YXIgaW1hZ2VTdGFydENvZGUgPSAiXCImZ3Q7XG4iCi0gICAgICAgICsgIiAgJmx0O2ltZyBzcmM9XCIiICsgaW1hZ2VQYXRoOwotdmFyIGltYWdlRW5kQ29kZSA9ICIucG5nXCJcbiIKLSAgICAgICAgKyAiICAgICAgIGFsdD1cIkF2YWlsYWJsZSBpbiBBbmRyb2lkIE1hcmtldFwiIC8+XG4mbHQ7L2E+IjsKKyAgICAgICAgKyAiICAmbHQ7aW1nIGFsdD1cIiI7CisgIC8vIGxlYXZlcyBvcGVuaW5nIGZvciB0aGUgYWx0IHRleHQgdmFsdWUKK3ZhciBpbWFnZVNyY0NvZGUgPSAiXCJcbiAgICAgICBzcmM9XCIiICsgaW1hZ2VQYXRoOworICAvLyBsZWF2ZXMgb3BlbmluZyBmb3IgdGhlIGltYWdlIGZpbGUgbmFtZQordmFyIGltYWdlRW5kQ29kZSA9ICIucG5nXCIgLz5cbiZsdDsvYT4iOwogCiAvKiogR2VuZXJhdGUgdGhlIEhUTUwgc25pcHBldCBhbmQgZGVtbyBiYXNlZCBvbiBmb3JtIHZhbHVlcyAqLwogZnVuY3Rpb24gYnVpbGRCdXR0b24oZm9ybSkgewotICBpZiAoZm9ybVsicGFja2FnZSJdLnZhbHVlICE9ICJjb20uYW5kcm9pZC5leGFtcGxlIikgeworICB2YXIgc2VsZWN0ZWRWYWx1ZSA9ICQoJ2Zvcm0gaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCcpLnZhbCgpOworICB2YXIgYWx0VGV4dCA9IHNlbGVjdGVkVmFsdWUuaW5kZXhPZigiZ2V0X2l0IikgIT0gLTEgPyAiR2V0IGl0IG9uIEdvb2dsZSBQbGF5IiA6ICJBbmRyb2lkIGFwcCBvbiBHb29nbGUgUGxheSI7CisKKyAgaWYgKGZvcm1bInBhY2thZ2UiXS52YWx1ZSAhPSAiY29tLmV4YW1wbGUuYW5kcm9pZCIpIHsKICAgICAkKCIjcHJldmlldyIpLnNob3coKTsKLSAgICAkKCIjc25pcHBldCIpLnNob3coKS5odG1sKGxpbmtTdGFydENvZGUgKyAiZGV0YWlscz9pZD0iICsgZm9ybVsicGFja2FnZSJdLnZhbHVlCi0gICAgICAgICAgICArIGltYWdlU3RhcnRDb2RlICsgJCgnZm9ybSBpbnB1dFt0eXBlPXJhZGlvXTpjaGVja2VkJykudmFsKCkgKyBpbWFnZUVuZENvZGUpOwotICAgICQoIiNidXR0b24tcHJldmlldyIpLmh0bWwobGlua1N0YXJ0ICsgImRldGFpbHM/aWQ9IiArIGZvcm1bInBhY2thZ2UiXS52YWx1ZQotICAgICAgICAgICAgKyBpbWFnZVN0YXJ0ICsgJCgnZm9ybSBpbnB1dFt0eXBlPXJhZGlvXTpjaGVja2VkJykudmFsKCkgKyBpbWFnZUVuZCk7CisgICAgJCgiI3NuaXBwZXQiKS5zaG93KCkuaHRtbChsaW5rU3RhcnRDb2RlICsgImFwcHMvZGV0YWlscz9pZD0iICsgZm9ybVsicGFja2FnZSJdLnZhbHVlCisgICAgICAgICAgICArIGltYWdlU3RhcnRDb2RlICsgYWx0VGV4dCArIGltYWdlU3JjQ29kZQorICAgICAgICAgICAgKyBzZWxlY3RlZFZhbHVlICsgaW1hZ2VFbmRDb2RlKTsKKyAgICAkKCIjYnV0dG9uLXByZXZpZXciKS5odG1sKGxpbmtTdGFydCArICJhcHBzL2RldGFpbHM/aWQ9IiArIGZvcm1bInBhY2thZ2UiXS52YWx1ZQorICAgICAgICAgICAgKyBpbWFnZVN0YXJ0ICsgYWx0VGV4dCArIGltYWdlU3JjCisgICAgICAgICAgICArIHNlbGVjdGVkVmFsdWUgKyBpbWFnZUVuZCk7CiAgIH0gZWxzZSBpZiAoZm9ybVsicHVibGlzaGVyIl0udmFsdWUgIT0gIkV4YW1wbGUsIEluYy4iKSB7CiAgICAgJCgiI3ByZXZpZXciKS5zaG93KCk7CiAgICAgJCgiI3NuaXBwZXQiKS5zaG93KCkuaHRtbChsaW5rU3RhcnRDb2RlICsgInNlYXJjaD9xPXB1YjoiICsgZm9ybVsicHVibGlzaGVyIl0udmFsdWUKLSAgICAgICAgICAgICsgaW1hZ2VTdGFydENvZGUgKyAkKCdmb3JtIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQnKS52YWwoKSArIGltYWdlRW5kQ29kZSk7Ci0gICAgJCgiI2J1dHRvbi1wcmV2aWV3IikuaHRtbChsaW5rU3RhcnQgKyAic2VhcmNoP3E9cHViOiIgKyBmb3JtWyJwdWJsaXNoZXIiXS52YWx1ZSArIGltYWdlU3RhcnQgKwotICAgICQoJ2Zvcm0gaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCcpLnZhbCgpICsgaW1hZ2VFbmQpOworICAgICAgICAgICAgKyBpbWFnZVN0YXJ0Q29kZSArIGFsdFRleHQgKyBpbWFnZVNyY0NvZGUKKyAgICAgICAgICAgICsgc2VsZWN0ZWRWYWx1ZSArIGltYWdlRW5kQ29kZSk7CisgICAgJCgiI2J1dHRvbi1wcmV2aWV3IikuaHRtbChsaW5rU3RhcnQgKyAic2VhcmNoP3E9cHViOiIgKyBmb3JtWyJwdWJsaXNoZXIiXS52YWx1ZQorICAgICAgICAgICAgKyBpbWFnZVN0YXJ0ICsgYWx0VGV4dCArIGltYWdlU3JjCisgICAgICAgICAgICArIHNlbGVjdGVkVmFsdWUgKyBpbWFnZUVuZCk7CiAgIH0gZWxzZSB7CiAgICAgYWxlcnQoIlBsZWFzZSBlbnRlciB5b3VyIHBhY2thZ2UgbmFtZSBvciBwdWJsaXNoZXIgbmFtZSIpOwogICB9CkBAIC01OTcsMTMgKzYxMSwxMyBAQAogPGZvcm0gY2xhc3M9ImJ1dHRvbi1mb3JtIj4KICAgPGxhYmVsIGNsYXNzPSJibG9jayIgZm9yPSJwYWNrYWdlIj5QYWNrYWdlIG5hbWU6PC9sYWJlbD4KICAgPGlucHV0IGNsYXNzPSJ0ZXh0IiB0eXBlPSJ0ZXh0IiBpZD0icGFja2FnZSIgbmFtZT0icGFja2FnZSIKLSAgICAgICAgIHZhbHVlPSJjb20uYW5kcm9pZC5leGFtcGxlIgotICAgICAgICAgZGVmYXVsdD0iY29tLmFuZHJvaWQuZXhhbXBsZSIKLSAgICAgICAgIG9uZm9jdXM9Im9uSW5wdXRGb2N1cyh0aGlzLCAnY29tLmFuZHJvaWQuZXhhbXBsZScpIgotICAgICAgICAgb25ibHVyPSJvbklucHV0Qmx1cih0aGlzLCAnY29tLmFuZHJvaWQuZXhhbXBsZScpIgorICAgICAgICAgdmFsdWU9ImNvbS5leGFtcGxlLmFuZHJvaWQiCisgICAgICAgICBkZWZhdWx0PSJjb20uZXhhbXBsZS5hbmRyb2lkIgorICAgICAgICAgb25mb2N1cz0ib25JbnB1dEZvY3VzKHRoaXMsICdjb20uZXhhbXBsZS5hbmRyb2lkJykiCisgICAgICAgICBvbmJsdXI9Im9uSW5wdXRCbHVyKHRoaXMsICdjb20uZXhhbXBsZS5hbmRyb2lkJykiCiAgICAgICAgICBvbmtleXVwPSJyZXR1cm4gb25UZXh0RW50ZXJlZChldmVudCwgdGhpcy5wYXJlbnROb2RlLCB0aGlzKSIvPiZuYnNwOwogICAgICAgICAgPGEgaWQ9InBhY2thZ2UtY2xlYXIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGhyZWY9IiMiCi0gICAgICAgICAgICBvbmNsaWNrPSJyZXR1cm4gY2xlYXJMYWJlbCgncGFja2FnZScsJ2NvbS5hbmRyb2lkLmV4YW1wbGUnKTsiPmNsZWFyPC9hPgorICAgICAgICAgICAgb25jbGljaz0icmV0dXJuIGNsZWFyTGFiZWwoJ3BhY2thZ2UnLCdjb20uZXhhbXBsZS5hbmRyb2lkJyk7Ij5jbGVhcjwvYT4KICAgPHAgc3R5bGU9ImNsZWFyOmJvdGg7bWFyZ2luOjAiPiZuYnNwOzxlbT5vcjwvZW0+PC9wPgogICA8bGFiZWwgY2xhc3M9ImJsb2NrIiBzdHlsZT0ibWFyZ2luLXRvcDo1cHgiIGZvcj0icHVibGlzaGVyIj5QdWJsaXNoZXIgbmFtZTo8L2xhYmVsPgogICA8aW5wdXQgY2xhc3M9InRleHQiIHR5cGU9InRleHQiIGlkPSJwdWJsaXNoZXIiIG5hbWU9InB1Ymxpc2hlciIKQEAgLTYxNywyMyArNjMxLDIzIEBACiAgICAgICAgICA8YnIvPjxici8+CiAKIDxkaXYgY2xhc3M9ImJ1dHRvbi1yb3ciPgotICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImJ1dHRvblN0eWxlIiB2YWx1ZT0iNDVfYXZhaWxfbWFya2V0X2xvZ28xIiBpZD0ibnMiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+Ci0gICAgPGxhYmVsIGZvcj0ibnMiPjxpbWcgc3JjPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2ltYWdlcy9icmFuZC80NV9hdmFpbF9tYXJrZXRfbG9nbzEucG5nIgotYWx0PSJuYXJyb3cgYW5kIHNtYWxsIGxvZ28iIC8+PC9sYWJlbD4KKyAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJidXR0b25TdHlsZSIgdmFsdWU9ImdldF9pdF9vbl9wbGF5X2xvZ29fc21hbGwiIGlkPSJucyIgY2hlY2tlZD0iY2hlY2tlZCIgLz4KKyAgICA8bGFiZWwgZm9yPSJucyI+PGltZyBzcmM9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vaW1hZ2VzL2JyYW5kL2dldF9pdF9vbl9wbGF5X2xvZ29fc21hbGwucG5nIgorYWx0PSJHZXQgaXQgb24gR29vZ2xlIFBsYXkgKHNtYWxsKSIgLz48L2xhYmVsPgogICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImJ1dHRvblN0eWxlIiB2YWx1ZT0iNjBfYXZhaWxfbWFya2V0X2xvZ28xIiBpZD0ibm0iIC8+Ci0gICAgPGxhYmVsIGZvcj0ibm0iPjxpbWcgc3JjPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2ltYWdlcy9icmFuZC82MF9hdmFpbF9tYXJrZXRfbG9nbzEucG5nIgotYWx0PSJuYXJyb3cgYW5kIGxhcmdlIGxvZ28iIC8+PC9sYWJlbD4KKyAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJidXR0b25TdHlsZSIgdmFsdWU9ImdldF9pdF9vbl9wbGF5X2xvZ29fbGFyZ2UiIGlkPSJubSIgLz4KKyAgICA8bGFiZWwgZm9yPSJubSI+PGltZyBzcmM9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vaW1hZ2VzL2JyYW5kL2dldF9pdF9vbl9wbGF5X2xvZ29fbGFyZ2UucG5nIgorYWx0PSJHZXQgaXQgb24gR29vZ2xlIFBsYXkgKGxhcmdlKSIgLz48L2xhYmVsPgogPC9kaXY+CiAKIDxkaXYgY2xhc3M9ImJ1dHRvbi1yb3ciPgotICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImJ1dHRvblN0eWxlIiB2YWx1ZT0iNDVfYXZhaWxfbWFya2V0X2xvZ28yIiBpZD0id3MiIC8+Ci0gICAgPGxhYmVsIGZvcj0id3MiPjxpbWcgc3JjPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2ltYWdlcy9icmFuZC80NV9hdmFpbF9tYXJrZXRfbG9nbzIucG5nIgotYWx0PSJ3aWRlIGFuZCBzbWFsbCBsb2dvIiAvPjwvbGFiZWw+CisgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iYnV0dG9uU3R5bGUiIHZhbHVlPSJhbmRyb2lkX2FwcF9vbl9wbGF5X2xvZ29fc21hbGwiIGlkPSJ3cyIgLz4KKyAgICA8bGFiZWwgZm9yPSJ3cyI+PGltZyBzcmM9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vaW1hZ2VzL2JyYW5kL2FuZHJvaWRfYXBwX29uX3BsYXlfbG9nb19zbWFsbC5wbmciCithbHQ9IkFuZHJvaWQgYXBwIG9uIEdvb2dsZSBQbGF5IChzbWFsbCkiIC8+PC9sYWJlbD4KICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJidXR0b25TdHlsZSIgdmFsdWU9IjYwX2F2YWlsX21hcmtldF9sb2dvMiIgaWQ9IndtIiAvPgotICAgIDxsYWJlbCBmb3I9IndtIj48aW1nIHNyYz0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9pbWFnZXMvYnJhbmQvNjBfYXZhaWxfbWFya2V0X2xvZ28yLnBuZyIKLWFsdD0id2lkZSBhbmQgbGFyZ2UgbG9nbyIgLz48L2xhYmVsPgorICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImJ1dHRvblN0eWxlIiB2YWx1ZT0iYW5kcm9pZF9hcHBfb25fcGxheV9sb2dvX2xhcmdlIiBpZD0id20iIC8+CisgICAgPGxhYmVsIGZvcj0id20iPjxpbWcgc3JjPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2ltYWdlcy9icmFuZC9hbmRyb2lkX2FwcF9vbl9wbGF5X2xvZ29fbGFyZ2UucG5nIgorYWx0PSJBbmRyb2lkIGFwcCBvbiBHb29nbGUgUGxheSAobGFyZ2UpIiAvPjwvbGFiZWw+CiA8L2Rpdj4KIAogICA8aW5wdXQgdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJyZXR1cm4gYnVpbGRCdXR0b24odGhpcy5wYXJlbnROb2RlKSIgdmFsdWU9IkJ1aWxkIG15IGJ1dHRvbiIKQEAgLTY0Myw3ICs2NTcsNyBAQAogCiA8ZGl2IGlkPSJwcmV2aWV3IiBzdHlsZT0iZGlzcGxheTpub25lIj4KICAgPHA+Q29weSBhbmQgcGFzdGUgdGhpcyBIVE1MIGludG8geW91ciB3ZWIgc2l0ZTo8L3A+Ci0gIDx0ZXh0YXJlYSBpZD0ic25pcHBldCIgY29scz0iODAiIHJvd3M9IjQiIG9uY2xpY2s9InRoaXMuc2VsZWN0KCkiCisgIDx0ZXh0YXJlYSBpZD0ic25pcHBldCIgY29scz0iMTAwIiByb3dzPSI1IiBvbmNsaWNrPSJ0aGlzLnNlbGVjdCgpIgogc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZTtiYWNrZ3JvdW5kLWNvbG9yOiNlZmVmZWY7cGFkZGluZzo1cHg7ZGlzcGxheTpub25lO21hcmdpbi1ib3R0b206MWVtIj4KICAgPC90ZXh0YXJlYSA+CiAKQEAgLTY1OCw3ICs2NzIsNyBAQAogCiA8aDMgaWQ9IlVyaVN1bW1hcnkiPlN1bW1hcnkgb2YgVVJJIGZvcm1hdHM8L2gzPgogCi08cD5UaGUgdGFibGUgYmVsb3cgcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIHRoZSBVUklzIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgdGhlIEFuZHJvaWQgTWFya2V0IChib3RoIG9uCis8cD5UaGUgdGFibGUgYmVsb3cgcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIHRoZSBVUklzIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgdGhlIEdvb2dsZSBQbGF5IChib3RoIG9uCiB0aGUgd2ViIGFuZCBpbiB0aGUgQW5kcm9pZCBhcHBsaWNhdGlvbiksIGFzIGRpc2N1c3NlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbnMuPC9wPgogCiA8dGFibGU+CkBAIC02NzAsMTkgKzY4NCwxOSBAQAogCiA8dHI+CiA8dGQ+RGlzcGxheSB0aGUgZGV0YWlscyBzY3JlZW4gZm9yIGEgc3BlY2lmaWMgYXBwbGljYXRpb248L3RkPgotPHRkPjxjb2RlPmh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vZGV0YWlscz9pZD0mbHQ7cGFja2FnZV9uYW1lJmd0OzwvY29kZT4KKzx0ZD48Y29kZT5odHRwOi8vcGxheS5nb29nbGUuY29tL3N0b3JlL2FwcHMvZGV0YWlscz9pZD0mbHQ7cGFja2FnZV9uYW1lJmd0OzwvY29kZT4KIDx0ZD48Y29kZT5tYXJrZXQ6Ly9kZXRhaWxzP2lkPSZsdDtwYWNrYWdlX25hbWUmZ3Q7PC9jb2RlPjwvdGQ+CiA8L3RyPgogCiA8dHI+CiA8dGQ+U2VhcmNoIGZvciBhcHBsaWNhdGlvbnMgdXNpbmcgYSBnZW5lcmFsIHN0cmluZyBxdWVyeS48L3RkPgotPHRkPjxjb2RlPmh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vc2VhcmNoP3E9Jmx0O3F1ZXJ5Jmd0OzwvY29kZT48L3RkPgorPHRkPjxjb2RlPmh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvc2VhcmNoP3E9Jmx0O3F1ZXJ5Jmd0OzwvY29kZT48L3RkPgogPHRkPjxjb2RlPm1hcmtldDovL3NlYXJjaD9xPSZsdDtxdWVyeSZndDs8L2NvZGU+PC90ZD4KIDwvdHI+CiAKIDx0cj4KIDx0ZD5TZWFyY2ggZm9yIGFwcGxpY2F0aW9ucyBieSBwdWJsaXNoZXIgbmFtZTwvdGQ+Ci08dGQ+PG5vYnI+PGNvZGU+aHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9zZWFyY2g/cT1wdWI6Jmx0O3B1Ymxpc2hlcl9uYW1lJmd0OzwvY29kZT48L25vYnI+PC90ZD4KKzx0ZD48bm9icj48Y29kZT5odHRwOi8vcGxheS5nb29nbGUuY29tL3N0b3JlL3NlYXJjaD9xPXB1YjombHQ7cHVibGlzaGVyX25hbWUmZ3Q7PC9jb2RlPjwvbm9icj48L3RkPgogPHRkPjxub2JyPjxjb2RlPm1hcmtldDovL3NlYXJjaD9xPXB1YjombHQ7cHVibGlzaGVyX25hbWUmZ3Q7PC9jb2RlPjwvbm9icj48L3RkPgogPC90cj4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZ19vdmVydmlldy5qZCBiL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmdfb3ZlcnZpZXcuamQKaW5kZXggYzk0ZDIwMS4uNmZiNzdlMSAxMDA3NTUKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZ19vdmVydmlldy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nX292ZXJ2aWV3LmpkCkBAIC0xNCw3ICsxNCw3IEBACiAgICAgPGxpPjxhIGhyZWY9IiNwdWJsaXNoaW5nLXByZXBhcmUiPlByZXBhcmluZyBZb3VyIEFwcGxpY2F0aW9uIGZvciBSZWxlYXNlPC9hPjwvbGk+CiAgICAgPGxpPjxhIGhyZWY9IiNwdWJsaXNoaW5nLXJlbGVhc2UiPlJlbGVhc2luZyBZb3VyIEFwcGxpY2F0aW9uIHRvIFVzZXJzPC9hPgogICAgIDxvbD4KLSAgICAgIDxsaT48YSBocmVmPSIjcHVibGlzaGluZy1tYXJrZXQiPlJlbGVhc2luZyBvbiBBbmRyb2lkIE1hcmtldDwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNwdWJsaXNoaW5nLW1hcmtldCI+UmVsZWFzaW5nIG9uIEdvb2dsZSBQbGF5PC9hPjwvbGk+CiAgICAgICA8bGk+PGEgaHJlZj0iI3B1Ymxpc2hpbmctd2Vic2l0ZSI+UmVsZWFzaW5nIG9uIHlvdXIgb3duIHdlYnNpdGU8L2E+PC9saT4KICAgICAgIDxsaT48YSBocmVmPSIjcHVibGlzaGluZy1lbWFpbCI+UmVsZWFzaW5nIHRocm91Z2ggZW1haWw8L2E+PC9saT4KICAgICA8L29sPgpAQCAtMjMsNyArMjMsNyBAQAogICA8b2w+CiAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3ByZXBhcmluZy5odG1sIj5QcmVwYXJpbmcgZm9yCiAgICAgUmVsZWFzZTwvYT48L2xpPgotICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPlB1Ymxpc2hpbmcgb24gQW5kcm9pZCBNYXJrZXQ8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sIj5QdWJsaXNoaW5nIG9uIEdvb2dsZSBQbGF5PC9hPjwvbGk+CiAgIDwvb2w+CiA8L2Rpdj4KIDwvZGl2PgpAQCAtNDIsNyArNDIsNyBAQAogICA8L2xpPgogPC91bD4KIAotPHA+VXN1YWxseSwgeW91IHJlbGVhc2UgeW91ciBhcHBsaWNhdGlvbiB0aHJvdWdoIGFuIGFwcGxpY2F0aW9uIG1hcmtldHBsYWNlLCBzdWNoIGFzIEFuZHJvaWQgTWFya2V0LgorPHA+VXN1YWxseSwgeW91IHJlbGVhc2UgeW91ciBhcHBsaWNhdGlvbiB0aHJvdWdoIGFuIGFwcGxpY2F0aW9uIG1hcmtldHBsYWNlLCBzdWNoIGFzIEdvb2dsZSBQbGF5LgogSG93ZXZlciwgeW91IGNhbiBhbHNvIHJlbGVhc2UgYXBwbGljYXRpb25zIGJ5IHNlbmRpbmcgdGhlbSBkaXJlY3RseSB0byB1c2VycyBvciBieSBsZXR0aW5nIHVzZXJzCiBkb3dubG9hZCB0aGVtIGZyb20geW91ciBvd24gd2Vic2l0ZS48L3A+CiAKQEAgLTczLDcgKzczLDcgQEAKICAgICA8Y29kZT5hbmRyb2lkOnZlcnNpb25Db2RlPC9jb2RlPiBhbmQgPGNvZGU+YW5kcm9pZDp2ZXJzaW9uTmFtZTwvY29kZT4gYXR0cmlidXRlcywgd2hpY2ggYXJlCiAgICAgbG9jYXRlZCBpbiB0aGUKICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCI+Jmx0O21hbmlmZXN0Jmd0OzwvYT4KLSAgICBlbGVtZW50LiBZb3UgbWF5IGFsc28gaGF2ZSB0byBjb25maWd1cmUgc2V2ZXJhbCBvdGhlciBzZXR0aW5ncyB0byBtZWV0IEFuZHJvaWQgTWFya2V0CisgICAgZWxlbWVudC4gWW91IG1heSBhbHNvIGhhdmUgdG8gY29uZmlndXJlIHNldmVyYWwgb3RoZXIgc2V0dGluZ3MgdG8gbWVldCBHb29nbGUgUGxheQogICAgIHJlcXVpcmVtZW50cyBvciBhY2NvbW9kYXRlIHdoYXRldmVyIG1ldGhvZCB5b3UncmUgdXNpbmcgdG8gcmVsZWFzZSB5b3VyIGFwcGxpY2F0aW9uLjwvcD4KICAgPC9saT4KICAgPGxpPkJ1aWxkaW5nIGFuZCBzaWduaW5nIGEgcmVsZWFzZSB2ZXJzaW9uIG9mIHlvdXIgYXBwbGljYXRpb24uCkBAIC0xMTQsMjggKzExNCwyNyBAQAogPGgyIGlkPSJwdWJsaXNoaW5nLXJlbGVhc2UiPlJlbGVhc2luZyBZb3VyIEFwcGxpY2F0aW9uIHRvIFVzZXJzPC9oMj4KIAogPHA+WW91IGNhbiByZWxlYXNlIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbnMgc2V2ZXJhbCB3YXlzLiBVc3VhbGx5LCB5b3UgcmVsZWFzZSBhcHBsaWNhdGlvbnMKLXRocm91Z2ggYW4gYXBwbGljYXRpb24gbWFya2V0cGxhY2UsIHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQsIGJ1dCB5b3UgY2FuIGFsc28gcmVsZWFzZSBhcHBsaWNhdGlvbnMKLW9uIHlvdXIgb3duIHdlYnNpdGUgb3IgYnkgc2VuZGluZyBhbiBhcHBsaWNhdGlvbiBkaXJlY3RseSB0byBhIHVzZXIuIEFuZHJvaWQgTWFya2V0IGlzIHRoZQordGhyb3VnaCBhbiBhcHBsaWNhdGlvbiBtYXJrZXRwbGFjZSwgc3VjaCBhcyBHb29nbGUgUGxheSwgYnV0IHlvdSBjYW4gYWxzbyByZWxlYXNlIGFwcGxpY2F0aW9ucworb24geW91ciBvd24gd2Vic2l0ZSBvciBieSBzZW5kaW5nIGFuIGFwcGxpY2F0aW9uIGRpcmVjdGx5IHRvIGEgdXNlci4gR29vZ2xlIFBsYXkgaXMgdGhlCiByZWNvbW1lbmRlZCBtYXJrZXRwbGFjZSBmb3IgQW5kcm9pZCBhcHBsaWNhdGlvbnMgYW5kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaWYgeW91IHdhbnQgdG8KIGRpc3RyaWJ1dGUgeW91ciBhcHBsaWNhdGlvbnMgdG8gYSBsYXJnZSBnbG9iYWwgYXVkaWVuY2UuIFRoZSBvdGhlciB0d28gcmVsZWFzZSBtZXRob2RzJm1kYXNoO3NlcnZlcgogZGlzdHJpYnV0aW9uIGFuZCBlbWFpbCBkaXN0cmlidXRpb24mbWRhc2g7YXJlIHVzZWZ1bCBpZiB5b3UgYXJlIHJlbGVhc2luZyBhbiBhcHBsaWNhdGlvbiB0byBhIHNtYWxsCiBncm91cCBvZiB1c2VycyAoZm9yIGV4YW1wbGUsIGEgd29yayBncm91cCBpbiBhbiBlbnRlcnByaXNlIGVudmlyb25tZW50KSwgb3IgaWYgeW91IGRvIG5vdCB3YW50IHRvCiBtYWtlIHlvdXIgYXBwbGljYXRpb24gYXZhaWxhYmxlIHRvIHRoZSBnZW5lcmFsIHB1YmxpYy48L3A+CiAKLTxoMyBpZD0icHVibGlzaGluZy1tYXJrZXQiPlJlbGVhc2luZyBZb3VyIEFwcGxpY2F0aW9ucyBvbiBBbmRyb2lkIE1hcmtldDwvaDM+Cis8aDMgaWQ9InB1Ymxpc2hpbmctbWFya2V0Ij5SZWxlYXNpbmcgWW91ciBBcHBsaWNhdGlvbnMgb24gR29vZ2xlIFBsYXk8L2gzPgogCi08cD5BbmRyb2lkIE1hcmtldCBpcyBhIHJvYnVzdCBwdWJsaXNoaW5nIHBsYXRmb3JtIHRoYXQgaGVscHMgeW91IHB1YmxpY2l6ZSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUKKzxwPkdvb2dsZSBQbGF5IGlzIGEgcm9idXN0IHB1Ymxpc2hpbmcgcGxhdGZvcm0gdGhhdCBoZWxwcyB5b3UgcHVibGljaXplLCBzZWxsLCBhbmQgZGlzdHJpYnV0ZQogeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9ucyB0byB1c2VycyBhcm91bmQgdGhlIHdvcmxkLiBXaGVuIHlvdSByZWxlYXNlIHlvdXIgYXBwbGljYXRpb25zIHRocm91Z2gKLUFuZHJvaWQgTWFya2V0IHlvdSBoYXZlIGFjY2VzcyB0byBhIHN1aXRlIG9mIGRldmVsb3BlciB0b29scyB0aGF0IGxldCB5b3UgYW5hbHl6ZSB5b3VyIHNhbGVzLAorR29vZ2xlIFBsYXkgeW91IGhhdmUgYWNjZXNzIHRvIGEgc3VpdGUgb2YgZGV2ZWxvcGVyIHRvb2xzIHRoYXQgbGV0IHlvdSBhbmFseXplIHlvdXIgc2FsZXMsCiBpZGVudGlmeSBtYXJrZXQgdHJlbmRzLCBhbmQgY29udHJvbCB3aG8geW91ciBhcHBsaWNhdGlvbnMgYXJlIGJlaW5nIGRpc3RyaWJ1dGVkIHRvLiBZb3UgYWxzbyBoYXZlCiBhY2Nlc3MgdG8gc2V2ZXJhbCByZXZlbnVlLWVuaGFuY2luZyBmZWF0dXJlcyB0aGF0IGFyZSBub3QgYXZhaWxhYmxlIGFueXdoZXJlIGVsc2UsIHN1Y2ggYXMgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvYmlsbGluZy9pbmRleC5odG1sIj5pbi1hcHAgYmlsbGluZzwvYT4gYW5kIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy9pbmRleC5odG1sIj5hcHBsaWNhdGlvbiBsaWNlbnNpbmc8L2E+LiBUaGlzIHJpY2ggYXJyYXkgb2YKLXRvb2xzCi1hbmQgZmVhdHVyZXMsIGNvdXBsZWQgd2l0aCBudW1lcm91cyBlbmQtdXNlciBjb21tdW5pdHkgZmVhdHVyZXMsIG1ha2VzIEFuZHJvaWQgTWFya2V0IHRoZSBwcmVtaWVyCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy5odG1sIj5hcHBsaWNhdGlvbiBsaWNlbnNpbmc8L2E+LiBUaGlzIHJpY2ggYXJyYXkgb2YgdG9vbHMKK2FuZCBmZWF0dXJlcywgY291cGxlZCB3aXRoIG51bWVyb3VzIGVuZC11c2VyIGNvbW11bml0eSBmZWF0dXJlcywgbWFrZXMgR29vZ2xlIFBsYXkgdGhlIHByZW1pZXIKIG1hcmtldHBsYWNlIGZvciBzZWxsaW5nIGFuZCBidXlpbmcgQW5kcm9pZCBhcHBsaWNhdGlvbnMuPC9wPgogCi08cD5SZWxlYXNpbmcgeW91ciBhcHBsaWNhdGlvbiBvbiBBbmRyb2lkIE1hcmtldCBpcyBhIHNpbXBsZSBwcm9jZXNzIHRoYXQgaW52b2x2ZXMgdGhyZWUgYmFzaWMKKzxwPlJlbGVhc2luZyB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5IGlzIGEgc2ltcGxlIHByb2Nlc3MgdGhhdCBpbnZvbHZlcyB0aHJlZSBiYXNpYwogICBzdGVwczo8L3A+CiAKIDxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9IndpZHRoOjI3NXB4Ij4KQEAgLTE0NCwxOSArMTQzLDE5IEBACiAgICAgICAgdG8gYmUgaW5zdGFsbGVkIiAvPgogICA8cCBjbGFzcz0iaW1nLWNhcHRpb24iPgogICAgIDxzdHJvbmc+RmlndXJlIDIuPC9zdHJvbmc+IFRoZSA8c3Ryb25nPlVua25vd24gc291cmNlczwvc3Ryb25nPiBzZXR0aW5nIGxldHMgeW91IGluc3RhbGwKLSAgICBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgbm90IHB1Ymxpc2hlZCBvbiBBbmRyb2lkIE1hcmtldCAuCisgICAgYXBwbGljYXRpb25zIHRoYXQgYXJlIG5vdCBwdWJsaXNoZWQgb24gR29vZ2xlIFBsYXkgLgogICA8L3A+CiA8L2Rpdj4KIAogPHVsPgogICA8bGk+UHJlcGFyaW5nIHByb21vdGlvbmFsIG1hdGVyaWFscy4KLSAgICA8cD5UbyBmdWxseSBsZXZlcmFnZSB0aGUgbWFya2V0aW5nIGFuZCBwdWJsaWNpdHkgY2FwYWJpbGl0aWVzIG9mIEFuZHJvaWQgTWFya2V0LCB5b3UgbmVlZCB0bworICAgIDxwPlRvIGZ1bGx5IGxldmVyYWdlIHRoZSBtYXJrZXRpbmcgYW5kIHB1YmxpY2l0eSBjYXBhYmlsaXRpZXMgb2YgR29vZ2xlIFBsYXksIHlvdSBuZWVkIHRvCiAgICAgY3JlYXRlIHByb21vdGlvbmFsIG1hdGVyaWFscyBmb3IgeW91ciBhcHBsaWNhdGlvbiwgc3VjaCBhcyBzY3JlZW5zaG90cywgdmlkZW9zLCBncmFwaGljcywgYW5kCiAgICAgcHJvbW90aW9uYWwgdGV4dC48L3A+CiAgIDwvbGk+CiAgIDxsaT5Db25maWd1cmluZyBvcHRpb25zIGFuZCB1cGxvYWRpbmcgYXNzZXRzLgotICAgIDxwPkFuZHJvaWQgTWFya2V0IGxldHMgeW91IHRhcmdldCB5b3VyIGFwcGxpY2F0aW9uIHRvIGEgd29ybGR3aWRlIHBvb2wgb2YgdXNlcnMgYW5kIGRldmljZXMuCi0gICAgQnkgY29uZmlndXJpbmcgdmFyaW91cyBBbmRyb2lkIE1hcmtldCBzZXR0aW5ncywgeW91IGNhbiBjaG9vc2UgdGhlIGNvdW50cmllcyB5b3Ugd2FudCB0bworICAgIDxwPkdvb2dsZSBQbGF5IGxldHMgeW91IHRhcmdldCB5b3VyIGFwcGxpY2F0aW9uIHRvIGEgd29ybGR3aWRlIHBvb2wgb2YgdXNlcnMgYW5kIGRldmljZXMuCisgICAgQnkgY29uZmlndXJpbmcgdmFyaW91cyBHb29nbGUgUGxheSBzZXR0aW5ncywgeW91IGNhbiBjaG9vc2UgdGhlIGNvdW50cmllcyB5b3Ugd2FudCB0bwogICAgIHJlYWNoLCB0aGUgbGlzdGluZyBsYW5ndWFnZXMgeW91IHdhbnQgdG8gdXNlLCBhbmQgdGhlIHByaWNlIHlvdSB3YW50IHRvIGNoYXJnZSBpbiBlYWNoCiAgICAgY291bnRyeS4gWW91IGNhbiBhbHNvIGNvbmZpZ3VyZSBsaXN0aW5nIGRldGFpbHMgc3VjaCBhcyB0aGUgYXBwbGljYXRpb24gdHlwZSwgY2F0ZWdvcnksIGFuZAogICAgIGNvbnRlbnQgcmF0aW5nLiBXaGVuIHlvdSBhcmUgZG9uZSBjb25maWd1cmluZyBvcHRpb25zIHlvdSBjYW4gdXBsb2FkIHlvdXIgcHJvbW90aW9uYWwgbWF0ZXJpYWxzCkBAIC0xNzAsMjEgKzE2OSwyMSBAQAogICA8L2xpPgogPC91bD4KIAotPHA+Rm9yIGluZm9ybWF0aW9uIGFib3V0IEFuZHJvaWQgTWFya2V0LCBzZWUgPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCNtYXJrZXQiPlB1Ymxpc2hpbmcgb24gQW5kcm9pZCBNYXJrZXQ8L2E+LiBUaGlzCi10b3BpYyBwcm92aWRlcyBhbiBpbnRyb2R1Y3Rpb24gdG8gQW5kcm9pZCBNYXJrZXQgZmVhdHVyZXMgYW5kIHByb3ZpZGVzIGEgc3RlcC1ieS1zdGVwIGd1aWRlIGZvcgotZGlzdHJpYnV0aW5nIHlvdXIgYXBwbGljYXRpb25zIG9uIEFuZHJvaWQgTWFya2V0LjwvcD4KKzxwPkZvciBpbmZvcm1hdGlvbiBhYm91dCBHb29nbGUgUGxheSwgc2VlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwjbWFya2V0Ij5QdWJsaXNoaW5nIG9uIEdvb2dsZSBQbGF5PC9hPi4gVGhpcwordG9waWMgcHJvdmlkZXMgYW4gaW50cm9kdWN0aW9uIHRvIEdvb2dsZSBQbGF5IGZlYXR1cmVzIGFuZCBwcm92aWRlcyBhIHN0ZXAtYnktc3RlcCBndWlkZSBmb3IKK2Rpc3RyaWJ1dGluZyB5b3VyIGFwcGxpY2F0aW9ucyBvbiBHb29nbGUgUGxheS48L3A+CiAKIDxoMyBpZD0icHVibGlzaGluZy13ZWJzaXRlIj5SZWxlYXNpbmcgeW91ciBhcHBsaWNhdGlvbiBvbiB5b3VyIG93biB3ZWJzaXRlPC9oMz4KIAotPHA+SWYgeW91IGRvIG5vdCB3YW50IHRvIHJlbGVhc2UgeW91ciBhcHBsaWNhdGlvbiBvbiBhbiBhcHBsaWNhdGlvbiBtYXJrZXRwbGFjZSBsaWtlIEFuZHJvaWQgTWFya2V0LAorPHA+SWYgeW91IGRvIG5vdCB3YW50IHRvIHJlbGVhc2UgeW91ciBhcHBsaWNhdGlvbiBvbiBhbiBhcHBsaWNhdGlvbiBtYXJrZXRwbGFjZSBsaWtlIEdvb2dsZSBQbGF5LAogeW91IGNhbiByZWxlYXNlIHlvdXIgYXBwbGljYXRpb24gYnkgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgb24geW91ciBvd24gd2Vic2l0ZSBvciBzZXJ2ZXIuCiBUbyBkbyB0aGlzLCB5b3UgbXVzdCBmaXJzdCBwcmVwYXJlIHlvdXIgYXBwbGljYXRpb24gZm9yIHJlbGVhc2UgKHRoYXQgaXMsIHlvdSBtdXN0IGJ1aWxkIGl0IGZvcgogcmVsZWFzZSBhbmQgc2lnbiBpdCkuIFRoZW4gYWxsIHlvdSBuZWVkIHRvIGRvIGlzIGhvc3QgdGhlIHJlbGVhc2UtcmVhZHkgYXBwbGljYXRpb24gb24geW91ciB3ZWJzaXRlCiBhbmQgcHJvdmlkZSBhIGRvd25sb2FkIGxpbmsgZm9yIHRoZSBhcHBsaWNhdGlvbi4gV2hlbiB1c2VycyBicm93c2UgdG8geW91ciB3ZWJzaXRlIHdpdGggdGhlaXIKIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2VzIGFuZCBkb3dubG9hZCB5b3VyIGFwcGxpY2F0aW9uLCB0aGUgQW5kcm9pZCBzeXN0ZW0gd2lsbCBhdXRvbWF0aWNhbGx5IHN0YXJ0CiBpbnN0YWxsaW5nIHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlLiBIb3dldmVyLCB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3Mgd2lsbCBzdGFydCBhdXRvbWF0aWNhbGx5Ci1vbmx5IGlmIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIGRldmljZSB0byBhbGxvdyB0aGUgaW5zdGFsbGF0aW9uIG9mIG5vbi1BbmRyb2lkIE1hcmtldAorb25seSBpZiB0aGUgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBkZXZpY2UgdG8gYWxsb3cgdGhlIGluc3RhbGxhdGlvbiBvZiBub24tR29vZ2xlIFBsYXkKIGFwcGxpY2F0aW9ucy48L3A+CiAKIDxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9IndpZHRoOjI3NXB4Ij4KQEAgLTE5OCw3ICsxOTcsNyBAQAogPC9kaXY+CiAKIDxwPkJ5IGRlZmF1bHQsIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2VzIGFsbG93IHVzZXJzIHRvIGluc3RhbGwgYXBwbGljYXRpb25zIG9ubHkgaWYgdGhlIGFwcGxpY2F0aW9ucwotaGF2ZSBiZWVuIGRvd25sb2FkZWQgZnJvbSBBbmRyb2lkIE1hcmtldC4gVG8gYWxsb3cgdGhlIGluc3RhbGxhdGlvbiBvZiBhcHBsaWNhdGlvbnMgZnJvbSBvdGhlcgoraGF2ZSBiZWVuIGRvd25sb2FkZWQgZnJvbSBHb29nbGUgUGxheS4gVG8gYWxsb3cgdGhlIGluc3RhbGxhdGlvbiBvZiBhcHBsaWNhdGlvbnMgZnJvbSBvdGhlcgogc291cmNlcywgdXNlcnMgbmVlZCB0byBlbmFibGUgdGhlIDxzdHJvbmc+VW5rbm93biBzb3VyY2VzPC9zdHJvbmc+IHNldHRpbmcgb24gdGhlaXIgZGV2aWNlcywgYW5kCiB0aGV5IG5lZWQgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGJlZm9yZSB0aGV5IGRvd25sb2FkIHlvdXIgYXBwbGljYXRpb24gdG8gdGhlaXIKIGRldmljZSAoc2VlIGZpZ3VyZSAyKS48L3A+CkBAIC0yMDksNyArMjA4LDcgQEAKIDxwPkFsdGhvdWdoIGl0IGlzIHJlbGF0aXZlbHkgZWFzeSB0byByZWxlYXNlIHlvdXIgYXBwbGljYXRpb24gb24geW91ciBvd24gd2Vic2l0ZSwgaXQgY2FuIGJlCiBpbmVmZmljaWVudCBhbmQgY3VtYmVyc29tZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIG1vbmV0aXplIHlvdXIgYXBwbGljYXRpb24geW91IHdpbGwKIGhhdmUgdG8gcHJvY2VzcyBhbmQgdHJhY2sgYWxsIGZpbmFuY2lhbCB0cmFuc2FjdGlvbnMgeW91cnNlbGYgYW5kIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZQotQW5kcm9pZCBNYXJrZXQncyBpbi1hcHAgYmlsbGluZyBmZWF0dXJlIHRvIHNlbGwgaW4tYXBwIHByb2R1Y3RzLiBJbiBhZGRpdGlvbiwgeW91IHdpbGwgbm90IGJlCitHb29nbGUgUGxheSdzIGluLWFwcCBiaWxsaW5nIGZlYXR1cmUgdG8gc2VsbCBpbi1hcHAgcHJvZHVjdHMuIEluIGFkZGl0aW9uLCB5b3Ugd2lsbCBub3QgYmUKIGFibGUgdG8gdXNlIHRoZSBsaWNlbnNpbmcgZmVhdHVyZSB0byBoZWxwIHByZXZlbnQgdW5hdXRob3JpemVkIGluc3RhbGxhdGlvbiBhbmQgdXNlIG9mIHlvdXIKIGFwcGxpY2F0aW9uLjwvcD4KIApAQCAtMjIzLDcgKzIyMiw3IEBACiBidXR0b24uPC9wPgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgPHN0cm9uZz5JbnN0YWxsIE5vdzwvc3Ryb25nPiBidXR0b24gYXBwZWFycyBvbmx5IGlmIGEKLXVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgZGV2aWNlIHRvIGFsbG93IHRoZSBpbnN0YWxsYXRpb24gb2Ygbm9uLUFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9ucyBhbmQKK3VzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgZGV2aWNlIHRvIGFsbG93IHRoZSBpbnN0YWxsYXRpb24gb2Ygbm9uLUdvb2dsZSBQbGF5IGFwcGxpY2F0aW9ucyBhbmQKIHRoZXkgb3BlbiB5b3VyIGVtYWlsIHdpdGggdGhlIG5hdGl2ZSBHbWFpbCBhcHBsaWNhdGlvbi48L3A+CiAKIDxwPlJlbGVhc2luZyBhcHBsaWNhdGlvbnMgdGhyb3VnaCBlbWFpbCBpcyBjb252ZW5pZW50IGlmIHlvdSBhcmUgc2VuZGluZyB5b3VyIGFwcGxpY2F0aW9uIHRvCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy92ZXJzaW9uaW5nLmpkIGIvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvdmVyc2lvbmluZy5qZAppbmRleCA3OWViZjk2Li5kYTU3ZTNlIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy92ZXJzaW9uaW5nLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL3ZlcnNpb25pbmcuamQKQEAgLTI1LDcgKzI1LDcgQEAKIAogPG9sPgogPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3ByZXBhcmluZy5odG1sIj5QcmVwYXJpbmcgdG8gUHVibGlzaCBZb3VyIEFwcGxpY2F0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sI21hcmtldCI+UHVibGlzaGluZyBPbiBBbmRyb2lkIE1hcmtldDwvYT48L2xpPgorPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCNtYXJrZXQiPlB1Ymxpc2hpbmcgT24gR29vZ2xlIFBsYXk8L2E+PC9saT4KIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWludHJvLmh0bWwiPlRoZSBBbmRyb2lkTWFuaWZlc3QueG1sIEZpbGU8L2E+PC9saT4KIDwvb2w+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvYWRtaW4vZGV2aWNlLWFkbWluLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9hZG1pbi9kZXZpY2UtYWRtaW4uamQKaW5kZXggODIwYzNjMC4uNGEzMjVkYiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9hZG1pbi9kZXZpY2UtYWRtaW4uamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9hZG1pbi9kZXZpY2UtYWRtaW4uamQKQEAgLTc1LDggKzc1LDggQEAKIG5vdCBjdXJyZW50bHkgaGF2ZSBhbiBhdXRvbWF0ZWQgcHJvdmlzaW9uaW5nIHNvbHV0aW9uLiBTb21lIG9mIHRoZSB3YXlzIGEgc3lzYWRtaW4gbWlnaHQKIGRpc3RyaWJ1dGUgdGhlIGFwcGxpY2F0aW9uIHRvIHVzZXJzIGFyZSBhcyBmb2xsb3dzOgogPHVsPgotPGxpPkFuZHJvaWQgTWFya2V0LjwvbGk+Ci08bGk+RW5hYmxpbmcgbm9uLW1hcmtldCBpbnN0YWxsYXRpb24uPC9saT4KKzxsaT5Hb29nbGUgUGxheS48L2xpPgorPGxpPkVuYWJsaW5nIGluc3RhbGxhdGlvbiBmcm9tIGFub3RoZXIgc3RvcmUuPC9saT4KIDxsaT5EaXN0cmlidXRpbmcgdGhlIGFwcGxpY2F0aW9uIHRocm91Z2ggb3RoZXIgbWVhbnMsIHN1Y2ggYXMgZW1haWwgb3Igd2Vic2l0ZXMuPC9saT4KIAogPC91bD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZGF0YS9iYWNrdXAuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2RhdGEvYmFja3VwLmpkCmluZGV4IDc5ZGZkODguLmQ5MWU0MjIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZGF0YS9iYWNrdXAuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9kYXRhL2JhY2t1cC5qZApAQCAtODkyLDggKzg5Miw4IEBACiAgIDxsaT5JbnN0YWxsIHlvdXIgYXBwbGljYXRpb24gb24gYSBzdWl0YWJsZSBBbmRyb2lkIHN5c3RlbSBpbWFnZQogICAgIDx1bD4KICAgICAgIDxsaT5JZiB1c2luZyB0aGUgZW11bGF0b3IsIGNyZWF0ZSBhbmQgdXNlIGFuIEFWRCB3aXRoIEFuZHJvaWQgMi4yIChBUEkgTGV2ZWwgOCkuPC9saT4KLSAgICAgIDxsaT5JZiB1c2luZyBhIGRldmljZSwgdGhlIGRldmljZSBtdXN0IGJlIHJ1bm5pbmcgQW5kcm9pZCAyLjIgb3IgZ3JlYXRlciBhbmQgaGF2ZSBBbmRyb2lkCi1NYXJrZXQgYnVpbHQgaW4uPC9saT4KKyAgICAgIDxsaT5JZiB1c2luZyBhIGRldmljZSwgdGhlIGRldmljZSBtdXN0IGJlIHJ1bm5pbmcgQW5kcm9pZCAyLjIgb3IgZ3JlYXRlciBhbmQgaGF2ZSBHb29nbGUKK1BsYXkgYnVpbHQgaW4uPC9saT4KICAgICA8L3VsPgogICA8L2xpPgogICA8bGk+RW5zdXJlIHRoYXQgYmFja3VwIGlzIGVuYWJsZWQKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuamQKaW5kZXggZDFhMzc4Ni4uYTg2ZDkwNSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuamQKQEAgLTM5MiwxMyArMzkyLDEzIEBACiB0aGF0IGxhY2sgZmVhdHVyZXMgbmVlZGVkIGJ5IHlvdXIgYXBwbGljYXRpb24sIGl0J3MgaW1wb3J0YW50IHRoYXQgeW91IGNsZWFybHkgZGVmaW5lIGEgcHJvZmlsZSBmb3IKIHRoZSB0eXBlcyBvZiBkZXZpY2VzIHlvdXIgYXBwbGljYXRpb24gc3VwcG9ydHMgYnkgZGVjbGFyaW5nIGRldmljZSBhbmQgc29mdHdhcmUgcmVxdWlyZW1lbnRzIGluIHlvdXIKIG1hbmlmZXN0IGZpbGUuIE1vc3Qgb2YgdGhlc2UgZGVjbGFyYXRpb25zIGFyZSBpbmZvcm1hdGlvbmFsIG9ubHkgYW5kIHRoZSBzeXN0ZW0gZG9lcyBub3QgcmVhZAotdGhlbSwgYnV0IGV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQgZG8gcmVhZCB0aGVtIGluIG9yZGVyIHRvIHByb3ZpZGUgZmlsdGVyaW5nCit0aGVtLCBidXQgZXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBHb29nbGUgUGxheSBkbyByZWFkIHRoZW0gaW4gb3JkZXIgdG8gcHJvdmlkZSBmaWx0ZXJpbmcKIGZvciB1c2VycyB3aGVuIHRoZXkgc2VhcmNoIGZvciBhcHBsaWNhdGlvbnMgZnJvbSB0aGVpciBkZXZpY2UuPC9wPgogCiA8cD5Gb3IgZXhhbXBsZSwgaWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBhIGNhbWVyYSBhbmQgdXNlcyBBUElzIGludHJvZHVjZWQgaW4gQW5kcm9pZCAyLjEgKDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvYXBpLWxldmVscy5odG1sIj5BUEkgTGV2ZWw8L2E+IDcpLCB5b3Ugc2hvdWxkIGRlY2xhcmUgdGhlc2UgYXMKIHJlcXVpcmVtZW50cyBpbiB5b3VyIG1hbmlmZXN0IGZpbGUuIFRoYXQgd2F5LCBkZXZpY2VzIHRoYXQgZG8gPGVtPm5vdDwvZW0+IGhhdmUgYSBjYW1lcmEgYW5kIGhhdmUgYW4KLUFuZHJvaWQgdmVyc2lvbiA8ZW0+bG93ZXI8L2VtPiB0aGFuIDIuMSBjYW5ub3QgaW5zdGFsbCB5b3VyIGFwcGxpY2F0aW9uIGZyb20gQW5kcm9pZCBNYXJrZXQuPC9wPgorQW5kcm9pZCB2ZXJzaW9uIDxlbT5sb3dlcjwvZW0+IHRoYW4gMi4xIGNhbm5vdCBpbnN0YWxsIHlvdXIgYXBwbGljYXRpb24gZnJvbSBHb29nbGUgUGxheS48L3A+CiAKIDxwPkhvd2V2ZXIsIHlvdSBjYW4gYWxzbyBkZWNsYXJlIHRoYXQgeW91ciBhcHBsaWNhdGlvbiB1c2VzIHRoZSBjYW1lcmEsIGJ1dCBkb2VzIG5vdAogPGVtPnJlcXVpcmU8L2VtPiBpdC4gSW4gdGhhdCBjYXNlLCB5b3VyIGFwcGxpY2F0aW9uIG11c3QgcGVyZm9ybSBhIGNoZWNrIGF0IHJ1bnRpbWUgdG8gZGV0ZXJtaW5lCkBAIC00NTgsMTIgKzQ1OCwxMiBAQAogPC9kbD4KIAogPHA+SXQncyBpbXBvcnRhbnQgdGhhdCB5b3UgZGVjbGFyZSBhbGwgc3VjaCByZXF1aXJlbWVudHMgZm9yIHlvdXIgYXBwbGljYXRpb24sIGJlY2F1c2UsIHdoZW4geW91Ci1kaXN0cmlidXRlIHlvdXIgYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQsIE1hcmtldCB1c2VzIHRoZXNlIGRlY2xhcmF0aW9ucyB0byBmaWx0ZXIgd2hpY2gKK2Rpc3RyaWJ1dGUgeW91ciBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheSwgdGhlIHN0b3JlIHVzZXMgdGhlc2UgZGVjbGFyYXRpb25zIHRvIGZpbHRlciB3aGljaAogYXBwbGljYXRpb25zIGFyZSBhdmFpbGFibGUgb24gZWFjaCBkZXZpY2UuIEFzIHN1Y2gsIHlvdXIgYXBwbGljYXRpb24gc2hvdWxkIGJlIGF2YWlsYWJsZSBvbmx5IHRvCiBkZXZpY2VzIHRoYXQgbWVldCBhbGwgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuPC9wPgogCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgQW5kcm9pZCBNYXJrZXQgZmlsdGVycyBhcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlc2UgKGFuZCBvdGhlcikKLXJlcXVpcmVtZW50cywgc2VlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+TWFya2V0IEZpbHRlcnM8L2E+Cis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgR29vZ2xlIFBsYXkgZmlsdGVycyBhcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlc2UgKGFuZCBvdGhlcikKK3JlcXVpcmVtZW50cywgc2VlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+RmlsdGVycyBvbiBHb29nbGUgUGxheTwvYT4KIGRvY3VtZW50LjwvcD4KIAogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2dyYXBoaWNzL29wZW5nbC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZ3JhcGhpY3Mvb3BlbmdsLmpkCmluZGV4IDZhMmEyMGYuLmE3ODZkNDIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZ3JhcGhpY3Mvb3BlbmdsLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZ3JhcGhpY3Mvb3BlbmdsLmpkCkBAIC0xODksNyArMTg5LDcgQEAKICAgICAmbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6Z2xFc1ZlcnNpb249IjB4MDAwMjAwMDAiIGFuZHJvaWQ6cmVxdWlyZWQ9InRydWUiIC8mZ3Q7CiA8L3ByZT4KIAotICA8cD5BZGRpbmcgdGhpcyBkZWNsYXJhdGlvbiBjYXVzZXMgdGhlIEFuZHJvaWQgTWFya2V0IHRvIHJlc3RyaWN0IHlvdXIgYXBwbGljYXRpb24gZnJvbSBiZWluZworICA8cD5BZGRpbmcgdGhpcyBkZWNsYXJhdGlvbiBjYXVzZXMgR29vZ2xlIFBsYXkgdG8gcmVzdHJpY3QgeW91ciBhcHBsaWNhdGlvbiBmcm9tIGJlaW5nCiAgIGluc3RhbGxlZCBvbiBkZXZpY2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgT3BlbkdMIEVTIDIuMC48L3A+CiAgIDwvbGk+CiAgIDxsaT48c3Ryb25nPlRleHR1cmUgY29tcHJlc3Npb24gcmVxdWlyZW1lbnRzPC9zdHJvbmc+IC0gSWYgeW91ciBhcHBsaWNhdGlvbiB1c2VzIHRleHR1cmUKQEAgLTIwMCw5ICsyMDAsOSBAQAogCiA8cD5EZWNsYXJpbmcgdGV4dHVyZSBjb21wcmVzc2lvbiByZXF1aXJlbWVudHMgaW4geW91ciBtYW5pZmVzdCBoaWRlcyB5b3VyIGFwcGxpY2F0aW9uIGZyb20gdXNlcnMKIHdpdGggZGV2aWNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGF0IGxlYXN0IG9uZSBvZiB5b3VyIGRlY2xhcmVkIGNvbXByZXNzaW9uIHR5cGVzLiBGb3IgbW9yZQotaW5mb3JtYXRpb24gb24gaG93IEFuZHJvaWQgTWFya2V0IGZpbHRlcmluZyB3b3JrcyBmb3IgdGV4dHVyZSBjb21wcmVzc2lvbnMsIHNlZSB0aGUgPGEKK2luZm9ybWF0aW9uIG9uIGhvdyBHb29nbGUgUGxheSBmaWx0ZXJpbmcgd29ya3MgZm9yIHRleHR1cmUgY29tcHJlc3Npb25zLCBzZWUgdGhlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLWdsLXRleHR1cmUtZWxlbWVudC5odG1sI21hcmtldC10ZXh0dXJlLWZpbHRlcmluZyI+Ci1BbmRyb2lkIE1hcmtldCBhbmQgdGV4dHVyZSBjb21wcmVzc2lvbiBmaWx0ZXJpbmc8L2E+IHNlY3Rpb24gb2YgdGhlIHtAY29kZQorR29vZ2xlIFBsYXkgYW5kIHRleHR1cmUgY29tcHJlc3Npb24gZmlsdGVyaW5nPC9hPiBzZWN0aW9uIG9mIHRoZSB7QGNvZGUKICZsdDtzdXBwb3J0cy1nbC10ZXh0dXJlJmd0O30gZG9jdW1lbnRhdGlvbi48L3A+CiAgIDwvbGk+CiA8L3VsPgpAQCAtNDcwLDcgKzQ3MCw3IEBACiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBPbmNlIHlvdSBkZWNpZGUgd2hpY2ggdGV4dHVyZSBjb21wcmVzc2lvbiBmb3JtYXRzIHlvdXIKIGFwcGxpY2F0aW9uIHdpbGwgc3VwcG9ydCwgbWFrZSBzdXJlIHlvdSBkZWNsYXJlIHRoZW0gaW4geW91ciBtYW5pZmVzdCB1c2luZyA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9zdXBwb3J0cy1nbC10ZXh0dXJlLWVsZW1lbnQuaHRtbCI+Jmx0O3N1cHBvcnRzLWdsLXRleHR1cmUmZ3Q7Ci08L2E+LiBVc2luZyB0aGlzIGRlY2xhcmF0aW9uIGVuYWJsZXMgZmlsdGVyaW5nIGJ5IGV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQsIHNvIHRoYXQKKzwvYT4uIFVzaW5nIHRoaXMgZGVjbGFyYXRpb24gZW5hYmxlcyBmaWx0ZXJpbmcgYnkgZXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBHb29nbGUgUGxheSwgc28gdGhhdAogeW91ciBhcHAgaXMgaW5zdGFsbGVkIG9ubHkgb24gZGV2aWNlcyB0aGF0IHN1cHBvcnQgdGhlIGZvcm1hdHMgeW91ciBhcHAgcmVxdWlyZXMuIEZvciBkZXRhaWxzLCBzZWUKIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2dyYXBoaWNzL29wZW5nbC5odG1sI21hbmlmZXN0Ij5PcGVuR0wgbWFuaWZlc3QgZGVjbGFyYXRpb25zPC9hPi48L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuamQKaW5kZXggOGIxMzFjOC4uOWRjMTI0YiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5qZApAQCAtNjcyLDcgKzY3Miw3IEBACiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFdoZW4geW91IGRlY2xhcmUgb25lIG9mIHRoZSBsYW5kc2NhcGUgb3IgcG9ydHJhaXQgdmFsdWVzLAogaXQgaXMgY29uc2lkZXJlZCBhIGhhcmQgcmVxdWlyZW1lbnQgZm9yIHRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCB0aGUgYWN0aXZpdHkgcnVucy4gQXMgc3VjaCwKLXRoZSB2YWx1ZSB5b3UgZGVjbGFyZSBlbmFibGVzIGZpbHRlcmluZyBieSBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0IHNvIHlvdXIgYXBwbGljYXRpb24gaXMKK3RoZSB2YWx1ZSB5b3UgZGVjbGFyZSBlbmFibGVzIGZpbHRlcmluZyBieSBzZXJ2aWNlcyBzdWNoIGFzIEdvb2dsZSBQbGF5IHNvIHlvdXIgYXBwbGljYXRpb24gaXMKIGF2YWlsYWJsZSBvbmx5IHRvIGRldmljZXMgdGhhdCBzdXBwb3J0IHRoZSBvcmllbnRhdGlvbiByZXF1aXJlZCBieSB5b3VyIGFjdGl2aXRpZXMuIEZvcgogZXhhbXBsZSwgaWYgeW91IGRlY2xhcmUgZWl0aGVyIHtAY29kZSAibGFuZHNjYXBlIn0sIHtAY29kZSAicmV2ZXJzZUxhbmRzY2FwZSJ9LCBvcgoge0Bjb2RlICJzZW5zb3JMYW5kc2NhcGUifSwgdGhlbiB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIG9ubHkgdG8gZGV2aWNlcyB0aGF0IHN1cHBvcnQKQEAgLTY4MSw3ICs2ODEsNyBAQAogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5odG1sIj57QGNvZGUgJmx0O3VzZXMtZmVhdHVyZSZndDt9PC9hPgogZWxlbWVudC4gRm9yIGV4YW1wbGUsIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUKIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5zY3JlZW4ucG9ydHJhaXQiLz48L2NvZGU+LiBUaGlzIGlzIHB1cmVseSBhIGZpbHRlcmluZyBiZWhhdmlvcgotcHJvdmlkZWQgYnkgQW5kcm9pZCBNYXJrZXQgKGFuZCBvdGhlciBzZXJ2aWNlcyB0aGF0IHN1cHBvcnQgaXQpIGFuZCB0aGUgcGxhdGZvcm0gaXRzZWxmIGRvZXMgbm90Citwcm92aWRlZCBieSBHb29nbGUgUGxheSAoYW5kIG90aGVyIHNlcnZpY2VzIHRoYXQgc3VwcG9ydCBpdCkgYW5kIHRoZSBwbGF0Zm9ybSBpdHNlbGYgZG9lcyBub3QKIGNvbnRyb2wgd2hldGhlciB5b3VyIGFwcCBjYW4gYmUgaW5zdGFsbGVkIHdoZW4gYSBkZXZpY2Ugc3VwcG9ydHMgb25seSBjZXJ0YWluIG9yaWVudGF0aW9ucy48L3A+CiAKIDwvZGQ+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L2NvbXBhdGlibGUtc2NyZWVucy1lbGVtZW50LmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9jb21wYXRpYmxlLXNjcmVlbnMtZWxlbWVudC5qZAppbmRleCA1Yzg5ODY5Li5hMjdjMzE2IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L2NvbXBhdGlibGUtc2NyZWVucy1lbGVtZW50LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvY29tcGF0aWJsZS1zY3JlZW5zLWVsZW1lbnQuamQKQEAgLTI3LDEwICsyNywxMCBAQAogCiAgIDxwPlRoZSBBbmRyb2lkIHN5c3RlbSA8ZW0+ZG9lcyBub3Q8L2VtPiByZWFkIHRoZSB7QGNvZGUgJmx0O2NvbXBhdGlibGUtc2NyZWVucyZndDt9IG1hbmlmZXN0CiBlbGVtZW50IChuZWl0aGVyIGF0IGluc3RhbGwtdGltZSBub3IgYXQgcnVudGltZSkuIFRoaXMgZWxlbWVudCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkgYW5kIG1heSBiZSB1c2VkCi1ieSBleHRlcm5hbCBzZXJ2aWNlcyAoc3VjaCBhcyBBbmRyb2lkIE1hcmtldCkgdG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIGFwcGxpY2F0aW9uJ3MgY29tcGF0aWJpbGl0eQorYnkgZXh0ZXJuYWwgc2VydmljZXMgKHN1Y2ggYXMgR29vZ2xlIFBsYXkpIHRvIGJldHRlciB1bmRlcnN0YW5kIHRoZSBhcHBsaWNhdGlvbidzIGNvbXBhdGliaWxpdHkKIHdpdGggc3BlY2lmaWMgc2NyZWVuIGNvbmZpZ3VyYXRpb25zIGFuZCBlbmFibGUgZmlsdGVyaW5nIGZvciB1c2Vycy4gQW55IHNjcmVlbiBjb25maWd1cmF0aW9uIHRoYXQgaXMKIDxlbT5ub3Q8L2VtPiBkZWNsYXJlZCBpbiB0aGlzIGVsZW1lbnQgaXMgYSBzY3JlZW4gd2l0aCB3aGljaCB0aGUgYXBwbGljYXRpb24gaXMgPGVtPm5vdDwvZW0+Ci1jb21wYXRpYmxlLiBUaHVzLCBleHRlcm5hbCBzZXJ2aWNlcyAoc3VjaCBhcyBBbmRyb2lkIE1hcmtldCkgc2hvdWxkIG5vdCBwcm92aWRlIHRoZSBhcHBsaWNhdGlvbiB0bworY29tcGF0aWJsZS4gVGh1cywgZXh0ZXJuYWwgc2VydmljZXMgKHN1Y2ggYXMgR29vZ2xlIFBsYXkpIHNob3VsZCBub3QgcHJvdmlkZSB0aGUgYXBwbGljYXRpb24gdG8KIGRldmljZXMgd2l0aCBzdWNoIHNjcmVlbnMuPC9wPgogCiAgIDxwIGNsYXNzPSJjYXV0aW9uIj48c3Ryb25nPkNhdXRpb246PC9zdHJvbmc+IE5vcm1hbGx5LCA8c3Ryb25nPnlvdSBzaG91bGQgbm90IHVzZSB0aGlzIG1hbmlmZXN0CkBAIC00OCwxNCArNDgsMTQgQEAKIG9ubHkgZm9yIDxlbT5sYXJnZTwvZW0+IGFuZCA8ZW0+eGxhcmdlPC9lbT4gc2NyZWVuIGRldmljZXMsIHRoZSA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9zdXBwb3J0cy1zY3JlZW5zLWVsZW1lbnQuaHRtbCI+e0Bjb2RlCiAmbHQ7c3VwcG9ydHMtc2NyZWVucyZndDt9PC9hPiBlbGVtZW50IGFsbG93cyB5b3UgdG8gZGVjbGFyZSB0aGF0IHlvdXIgYXBwbGljYXRpb24gZG9lcyBub3QKLXN1cHBvcnQgPGVtPnNtYWxsPC9lbT4gYW5kIDxlbT5ub3JtYWw8L2VtPiBzY3JlZW4gc2l6ZXMuIEV4dGVybmFsIHNlcnZpY2VzIChzdWNoIGFzIEFuZHJvaWQKLU1hcmtldCkgd2lsbCBmaWx0ZXIgeW91ciBhcHBsaWNhdGlvbiBhY2NvcmRpbmdseS4gWW91IGNhbiBhbHNvIHVzZSB0aGUgPGEKK3N1cHBvcnQgPGVtPnNtYWxsPC9lbT4gYW5kIDxlbT5ub3JtYWw8L2VtPiBzY3JlZW4gc2l6ZXMuIEV4dGVybmFsIHNlcnZpY2VzIChzdWNoIGFzIEdvb2dsZQorUGxheSkgd2lsbCBmaWx0ZXIgeW91ciBhcHBsaWNhdGlvbiBhY2NvcmRpbmdseS4gWW91IGNhbiBhbHNvIHVzZSB0aGUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtc2NyZWVucy1lbGVtZW50Lmh0bWwiPntAY29kZQogJmx0O3N1cHBvcnRzLXNjcmVlbnMmZ3Q7fTwvYT4gZWxlbWVudCB0byBkZWNsYXJlIHdoZXRoZXIgdGhlIHN5c3RlbSBzaG91bGQgcmVzaXplIHlvdXIKIGFwcGxpY2F0aW9uIGZvciBkaWZmZXJlbnQgc2NyZWVuIHNpemVzLjwvcD4KIAotICA8cD5BbHNvIHNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPk1hcmtldCBGaWx0ZXJzPC9hPgotZG9jdW1lbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFuZHJvaWQgTWFya2V0IGZpbHRlcnMgYXBwbGljYXRpb25zIHVzaW5nIHRoaXMgYW5kCisgIDxwPkFsc28gc2VlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+RmlsdGVycyBvbiBHb29nbGUgUGxheTwvYT4KK2RvY3VtZW50IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyBHb29nbGUgUGxheSBmaWx0ZXJzIGFwcGxpY2F0aW9ucyB1c2luZyB0aGlzIGFuZAogb3RoZXIgbWFuaWZlc3QgZWxlbWVudHMuPC9wPgogCiA8L2RkPgpAQCAtMTM4LDUgKzEzOCw1IEBACiA8ZHQ+c2VlIGFsc286PC9kdD4KIDxkZD48YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbCI+U3VwcG9ydGluZyBNdWx0aXBsZSBTY3JlZW5zPC9hPjwvZGQ+Ci08ZGQ+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPk1hcmtldCBGaWx0ZXJzPC9hPjwvZGQ+Cis8ZGQ+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+PC9kZD4KIDwvZGw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuamQKaW5kZXggYzk3MGM3Mi4uOTc4ODk0NSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1lbGVtZW50LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtZWxlbWVudC5qZApAQCAtMTUwLDkgKzE1MCw5IEBACiA8L3RyPgogPC90YWJsZT4KIAotPHAgY2xhc3M9ImNhdXRpb24iPjxzdHJvbmc+Q2F1dGlvbjo8L3N0cm9uZz4gSWYgeW91ciBhcHBsaWNhdGlvbiB1c2VzIHRoZSBBbmRyb2lkIE1hcmtldCdzIENvcHkgCi0gIFByb3RlY3Rpb24gZmVhdHVyZSwgaXQgY2Fubm90IGJlIGluc3RhbGxlZCB0byBhIGRldmljZSdzIFNEIGNhcmQuIEhvd2V2ZXIsIGlmIHlvdSB1c2UgQW5kcm9pZCAKLSAgTWFya2V0J3MgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguaHRtbCI+QXBwbGljYXRpb24gTGljZW5zaW5nPC9hPiBpbnN0ZWFkLCAKKzxwIGNsYXNzPSJjYXV0aW9uIj48c3Ryb25nPkNhdXRpb246PC9zdHJvbmc+IElmIHlvdXIgYXBwbGljYXRpb24gdXNlcyBHb29nbGUgUGxheSdzIENvcHkgCisgIFByb3RlY3Rpb24gZmVhdHVyZSwgaXQgY2Fubm90IGJlIGluc3RhbGxlZCB0byBhIGRldmljZSdzIFNEIGNhcmQuIEhvd2V2ZXIsIGlmIHlvdSB1c2UgR29vZ2xlIAorICBQbGF5J3MgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcuaHRtbCI+QXBwbGljYXRpb24gTGljZW5zaW5nPC9hPiBpbnN0ZWFkLCAKICAgeW91ciBhcHBsaWNhdGlvbiA8ZW0+Y2FuPC9lbT4gYmUgaW5zdGFsbGVkIHRvIGludGVybmFsIG9yIGV4dGVybmFsIHN0b3JhZ2UsIGluY2x1ZGluZyBTRCBjYXJkcy48L3A+CiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEJ5IGRlZmF1bHQsIHlvdXIgYXBwbGljYXRpb24gd2lsbCBiZSBpbnN0YWxsZWQgb24gdGhlCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLWdsLXRleHR1cmUtZWxlbWVudC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtZ2wtdGV4dHVyZS1lbGVtZW50LmpkCmluZGV4IDZjNGEwNWEuLmViZGQwYjEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtZ2wtdGV4dHVyZS1lbGVtZW50LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtZ2wtdGV4dHVyZS1lbGVtZW50LmpkCkBAIC0xOCwyMCArMTgsMjAgQEAKICA8ZGl2IGNsYXNzPSJzaWRlYm94LXdyYXBwZXIiPgogICA8aW1nIGlkPSJydWxlIiBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2dyYWQtcnVsZS1xdi5wbmciPgogICA8ZGl2IGlkPSJxdi1zdWItcnVsZSI+Ci0gICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fbWFya2V0LmpwZyIKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvaWNvbl9wbGF5LnBuZyIKICAgICBzdHlsZT0iZmxvYXQ6bGVmdDttYXJnaW46MDtwYWRkaW5nOjA7Ij4KLSAgICA8cCBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPkFuZHJvaWQgTWFya2V0IGFuZCA8Y29kZQorICAgIDxwIHN0eWxlPSJjb2xvcjojNjY5OTk5O3BhZGRpbmctdG9wOjFlbTsiPkdvb2dsZSBQbGF5IGFuZCA8Y29kZQogICAgIHN0eWxlPSJjb2xvcjojNjY5OTk5OyI+Jmx0O3N1cHBvcnRzLWdsLXRleHR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50czwvcD4KLSAgICA8cCBzdHlsZT0ibWFyZ2luLXRvcDoxZW07Ij5BbmRyb2lkIE1hcmtldCBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBhY2NvcmRpbmcKKyAgICA8cCBzdHlsZT0ibWFyZ2luLXRvcDoxZW07Ij5Hb29nbGUgUGxheSBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBhY2NvcmRpbmcKICAgICB0byB0aGUgdGV4dHVyZSBjb21wcmVzc2lvbiBmb3JtYXRzIHRoYXQgdGhleSBzdXBwb3J0LCB0byBlbnN1cmUgdGhhdAogICAgIHRoZXkgY2FuIGJlIGluc3RhbGxlZCBvbmx5IG9uIGRldmljZXMgdGhhdCBjYW4gaGFuZGxlIHRoZWlyIHRleHR1cmVzCiAgICAgcHJvcGVybHkuIERldmVsb3BlcnMgY2FuIHVzZSB0ZXh0dXJlIGNvbXByZXNzaW9uIGZpbHRlcmluZwogICAgIGFzIGEgd2F5IG9mIHRhcmdldGluZyBzcGVjaWZpYyBkZXZpY2UgdHlwZXMsIGJhc2VkIG9uIEdQVSBwbGF0Zm9ybS48L3A+CiAgICAgCiAgICAgPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyIgY2xhc3M9ImNhdXRpb24iPkZvciBpbXBvcnRhbnQgaW5mb3JtYXRpb24gYWJvdXQgaG93Ci0gICAgQW5kcm9pZCBNYXJrZXQgdXNlcyA8Y29kZT4mbHQ7c3VwcG9ydHMtZ2wtdGV4dHVyZSZndDs8L2NvZGU+IGVsZW1lbnRzIGFzCi0gICAgdGhlIGJhc2lzIGZvciBmaWx0ZXJpbmcsIHBsZWFzZSByZWFkIDxhIGhyZWY9IiNtYXJrZXQtdGV4dHVyZS1maWx0ZXJpbmciPkFuZHJvaWQKLSAgICBNYXJrZXQgYW5kIHRleHR1cmUgY29tcHJlc3Npb24gZmlsdGVyaW5nPC9hPiwgYmVsb3cuPC9wPgorICAgIEdvb2dsZSBQbGF5IHVzZXMgPGNvZGU+Jmx0O3N1cHBvcnRzLWdsLXRleHR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcworICAgIHRoZSBiYXNpcyBmb3IgZmlsdGVyaW5nLCBwbGVhc2UgcmVhZCA8YSBocmVmPSIjbWFya2V0LXRleHR1cmUtZmlsdGVyaW5nIj5Hb29nbGUKKyAgICBQbGF5IGFuZCB0ZXh0dXJlIGNvbXByZXNzaW9uIGZpbHRlcmluZzwvYT4sIGJlbG93LjwvcD4KIDwvZGl2PiAKIDwvZGl2PgogCkBAIC01Nyw3ICs1Nyw3IEBACiA8cD5EZWNsYXJlZCA8Y29kZT4mbHQ7c3VwcG9ydHMtZ2wtdGV4dHVyZSZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBpbmZvcm1hdGlvbmFsLAogbWVhbmluZyB0aGF0IHRoZSBBbmRyb2lkIHN5c3RlbSBpdHNlbGYgZG9lcyBub3QgZXhhbWluZSB0aGUgZWxlbWVudHMgYXQgaW5zdGFsbAogdGltZSB0byBlbnN1cmUgbWF0Y2hpbmcgc3VwcG9ydCBvbiB0aGUgZGV2aWNlLiBIb3dldmVyLCBvdGhlciBzZXJ2aWNlcwotKHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQpIG9yIGFwcGxpY2F0aW9ucyBjYW4gY2hlY2sgeW91ciBhcHBsaWNhdGlvbidzCisoc3VjaCBhcyBHb29nbGUgUGxheSkgb3IgYXBwbGljYXRpb25zIGNhbiBjaGVjayB5b3VyIGFwcGxpY2F0aW9uJ3MKIDxjb2RlPiZsdDtzdXBwb3J0cy1nbC10ZXh0dXJlJmd0OzwvY29kZT4gZGVjbGFyYXRpb25zIGFzIHBhcnQgb2YgaGFuZGxpbmcgb3IKIGludGVyYWN0aW5nIHdpdGggeW91ciBhcHBsaWNhdGlvbi4gRm9yIHRoaXMgcmVhc29uLCBpdCdzIHZlcnkgaW1wb3J0YW50IHRoYXQKIHlvdSBkZWNsYXJlIGFsbCBvZiB0aGUgdGV4dHVyZSBjb21wcmVzc2lvbiBmb3JtYXRzIChmcm9tIHRoZSBsaXN0IGJlbG93KSB0aGF0CkBAIC0xNDEsMjAgKzE0MSwyMCBAQAogPGR0PnNlZSBhbHNvOjwvZHQ+CiA8ZGQ+CiAgIDx1bD4KLSAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkFuZHJvaWQgTWFya2V0IEZpbHRlcnM8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+PC9saT4KICAgPC91bD4KIDwvZGQ+CiAKLTxoMiBpZD0ibWFya2V0LXRleHR1cmUtZmlsdGVyaW5nIj5BbmRyb2lkIE1hcmtldCBhbmQgdGV4dHVyZSBjb21wcmVzc2lvbiBmaWx0ZXJpbmc8L2gyPgorPGgyIGlkPSJtYXJrZXQtdGV4dHVyZS1maWx0ZXJpbmciPkdvb2dsZSBQbGF5IGFuZCB0ZXh0dXJlIGNvbXByZXNzaW9uIGZpbHRlcmluZzwvaDI+CiAKLTxwPkFuZHJvaWQgTWFya2V0IGZpbHRlcnMgdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSB2aXNpYmxlIHRvIHVzZXJzLCBzbyB0aGF0Cis8cD5Hb29nbGUgUGxheSBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgdmlzaWJsZSB0byB1c2Vycywgc28gdGhhdAogdXNlcnMgY2FuIHNlZSBhbmQgZG93bmxvYWQgb25seSB0aG9zZSBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoCi10aGVpciBkZXZpY2VzLiBPbmUgb2YgdGhlIHdheXMgTWFya2V0IGZpbHRlcnMgYXBwbGljYXRpb25zIGlzIGJ5IHRleHR1cmUKK3RoZWlyIGRldmljZXMuIE9uZSBvZiB0aGUgd2F5cyBpdCBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBpcyBieSB0ZXh0dXJlCiBjb21wcmVzc2lvbiBjb21wYXRpYmlsaXR5LCBnaXZpbmcgeW91IGNvbnRyb2wgb3ZlciB0aGUgYXZhaWxhYmlsaXR5IG9mIHlvdXIKIGFwcGxpY2F0aW9uIHRvIHZhcmlvdXMgZGV2aWNlcywgYmFzZWQgb24gdGhlIGNhcGFiaWxpdGllcyBvZiB0aGVpciBHUFVzLjwvcD4KIAogPHA+VG8gZGV0ZXJtaW5lIGFuIGFwcGxpY2F0aW9uJ3MgdGV4dHVyZSBjb21wcmVzc2lvbiBjb21wYXRpYmlsaXR5IHdpdGggYSBnaXZlbgotdXNlcidzIGRldmljZSwgQW5kcm9pZCBNYXJrZXQgY29tcGFyZXM6PC9wPgordXNlcidzIGRldmljZSwgR29vZ2xlIFBsYXkgY29tcGFyZXM6PC9wPgogCiA8dWw+CiA8bGk+VGV4dHVyZSBjb21wcmVzc2lvbiBmb3JtYXRzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgYXBwbGljYXRpb24gJm1kYXNoOwpAQCAtMTY0LDI2ICsxNjQsMjYgQEAKIGEgZGV2aWNlIHJlcG9ydHMgdGhlIGZvcm1hdHMgaXQgc3VwcG9ydHMgYXMgcmVhZC1vbmx5IHN5c3RlbSBwcm9wZXJ0aWVzLjwvbGk+CiA8L3VsPgogCi08cD5FYWNoIHRpbWUgeW91IHVwbG9hZCBhbiBhcHBsaWNhdGlvbiB0byB0aGUgQW5kcm9pZCBNYXJrZXQgUHVibGlzaGVyIFNpdGUsCi1BbmRyb2lkIE1hcmtldCBzY2FucyB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdCBmaWxlIGFuZCBsb29rcyBmb3IgYW55Cis8cD5FYWNoIHRpbWUgeW91IHVwbG9hZCBhbiBhcHBsaWNhdGlvbiB0byB0aGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUsCitHb29nbGUgUGxheSBzY2FucyB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdCBmaWxlIGFuZCBsb29rcyBmb3IgYW55CiA8Y29kZT4mbHQ7c3VwcG9ydHMtZ2wtdGV4dHVyZSZndDs8L2NvZGU+IGVsZW1lbnRzLiBJdCBleHRyYWN0cyB0aGUKIGZvcm1hdCBkZXNjcmlwdG9ycyBmcm9tIHRoZSBlbGVtZW50cyBhbmQgc3RvcmVzIHRoZW0gaW50ZXJuYWxseSBhcwogbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiA8Y29kZT4uYXBrPC9jb2RlPiBhbmQgdGhlIGFwcGxpY2F0aW9uCiB2ZXJzaW9uLiA8L3A+CiAKLTxwPldoZW4gYSB1c2VyIHNlYXJjaGVzIG9yIGJyb3dzZXMgZm9yIGFwcGxpY2F0aW9ucyBvbiBBbmRyb2lkIE1hcmtldCwKKzxwPldoZW4gYSB1c2VyIHNlYXJjaGVzIG9yIGJyb3dzZXMgZm9yIGFwcGxpY2F0aW9ucyBvbiBHb29nbGUgUGxheSwKIHRoZSBzZXJ2aWNlIGNvbXBhcmVzIHRoZSB0ZXh0dXJlIGNvbXByZXNzaW9uIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbgogd2l0aCB0aG9zZSBzdXBwb3J0ZWQgYnkgdGhlIHVzZXIncyBkZXZpY2UuIFRoZSBjb21wYXJpc29uIGlzIGJhc2VkIG9uIHRoZSBmb3JtYXQKIGRlc2NyaXB0b3Igc3RyaW5ncyBhbmQgYSBtYXRjaCBtdXN0IGJlIGV4YWN0LjwvcD4KIAogPHA+SWYgPGVtPmFueTwvZW0+IG9mIGFuIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydGVkIHRleHR1cmUgY29tcHJlc3Npb24gZm9ybWF0cyBpcwotYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSwgQW5kcm9pZCBNYXJrZXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlZSB0aGUKK2Fsc28gc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UsIEdvb2dsZSBQbGF5IGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlCiBhcHBsaWNhdGlvbiBhbmQgcG90ZW50aWFsbHkgZG93bmxvYWQgaXQuIE90aGVyd2lzZSwgaWYgbm9uZSBvZiB0aGUgYXBwbGljYXRpb24ncwotZm9ybWF0cyBpcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSwgQW5kcm9pZCBNYXJrZXQgZmlsdGVycyB0aGUgYXBwbGljYXRpb24gc28KK2Zvcm1hdHMgaXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UsIEdvb2dsZSBQbGF5IGZpbHRlcnMgdGhlIGFwcGxpY2F0aW9uIHNvCiB0aGF0IGl0IGlzIG5vdCBhdmFpbGFibGUgZm9yIGRvd25sb2FkLiA8L3A+CiAKIDxwPklmIGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IGRlY2xhcmUgYW55IDxjb2RlPiZsdDtzdXBwb3J0cy1nbC10ZXh0dXJlJmd0OzwvY29kZT4gZWxlbWVudHMsCi1BbmRyb2lkIE1hcmtldCBkb2VzIG5vdCBhcHBseSBhbnkgZmlsdGVyaW5nIGJhc2VkIG9uIEdMIHRleHR1cmUgY29tcHJlc3Npb24gZm9ybWF0LjwvcD4KK0dvb2dsZSBQbGF5IGRvZXMgbm90IGFwcGx5IGFueSBmaWx0ZXJpbmcgYmFzZWQgb24gR0wgdGV4dHVyZSBjb21wcmVzc2lvbiBmb3JtYXQuPC9wPgogCiA8L2RsPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLXNjcmVlbnMtZWxlbWVudC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtc2NyZWVucy1lbGVtZW50LmpkCmluZGV4IDgxZDZlMjcuLmFlMTQxMjEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtc2NyZWVucy1lbGVtZW50LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtc2NyZWVucy1lbGVtZW50LmpkCkBAIC04MCw3ICs4MCw3IEBACiAgICAgIEEgc21hbGwgc2NyZWVuIGlzIGRlZmluZWQgYXMgb25lIHdpdGggYSBzbWFsbGVyIGFzcGVjdCByYXRpbyB0aGFuCiAgICAgIHRoZSAibm9ybWFsIiAodHJhZGl0aW9uYWwgSFZHQSkgc2NyZWVuLiAgQW4gYXBwbGljYXRpb24gdGhhdCBkb2VzCiAgICAgIG5vdCBzdXBwb3J0IHNtYWxsIHNjcmVlbnMgPGVtPndpbGwgbm90IGJlIGF2YWlsYWJsZTwvZW0+IGZvcgotICAgICBzbWFsbCBzY3JlZW4gZGV2aWNlcyBmcm9tIGV4dGVybmFsIHNlcnZpY2VzIChzdWNoIGFzIEFuZHJvaWQgTWFya2V0KSwgYmVjYXVzZSB0aGVyZSBpcyBsaXR0bGUKKyAgICAgc21hbGwgc2NyZWVuIGRldmljZXMgZnJvbSBleHRlcm5hbCBzZXJ2aWNlcyAoc3VjaCBhcyBHb29nbGUgUGxheSksIGJlY2F1c2UgdGhlcmUgaXMgbGl0dGxlCiB0aGUgcGxhdGZvcm0gY2FuIGRvIHRvIG1ha2Ugc3VjaCBhbiBhcHBsaWNhdGlvbiB3b3JrIG9uIGEgc21hbGxlciBzY3JlZW4uIFRoaXMgaXMge0Bjb2RlICJ0cnVlIn0gYnkKIGRlZmF1bHQuCiAgIDwvZGQ+CkBAIC0xNTYsOCArMTU2LDggQEAKIAogICA8cCBjbGFzcz0iY2F1dGlvbiI+PHN0cm9uZz5DYXV0aW9uOjwvc3Ryb25nPiBUaGUgQW5kcm9pZCBzeXN0ZW0gZG9lcyBub3QgcGF5IGF0dGVudGlvbiB0byB0aGlzCiBhdHRyaWJ1dGUsIHNvIGl0IGRvZXMgbm90IGFmZmVjdCBob3cgeW91ciBhcHBsaWNhdGlvbiBiZWhhdmVzIGF0IHJ1bnRpbWUuIEluc3RlYWQsIGl0IGlzIHVzZWQKLXRvIGVuYWJsZSBmaWx0ZXJpbmcgZm9yIHlvdXIgYXBwbGljYXRpb24gb24gc2VydmljZXMgc3VjaCBhcyBBbmRyb2lkIE1hcmtldC4gSG93ZXZlciwKLTxzdHJvbmc+QW5kcm9pZCBNYXJrZXQgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBhdHRyaWJ1dGUgZm9yIGZpbHRlcmluZzwvc3Ryb25nPiAob24gQW5kcm9pZAordG8gZW5hYmxlIGZpbHRlcmluZyBmb3IgeW91ciBhcHBsaWNhdGlvbiBvbiBzZXJ2aWNlcyBzdWNoIGFzIEdvb2dsZSBQbGF5LiBIb3dldmVyLAorPHN0cm9uZz5Hb29nbGUgUGxheSBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGF0dHJpYnV0ZSBmb3IgZmlsdGVyaW5nPC9zdHJvbmc+IChvbiBBbmRyb2lkCiAzLjIpLCBzbyB5b3Ugc2hvdWxkIGNvbnRpbnVlIHVzaW5nIHRoZSBvdGhlciBzaXplIGF0dHJpYnV0ZXMgaWYgeW91ciBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwb3J0CiBzbWFsbCBzY3JlZW5zLjwvcD4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuamQKaW5kZXggOWY4MDYzOC4uOTE3NTU2NiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtZmVhdHVyZS1lbGVtZW50LmpkCkBAIC05LDcgKzksNyBAQAogCiA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CiA8b2w+Ci0gIDxsaT48YSBocmVmPSIjbWFya2V0LWZlYXR1cmUtZmlsdGVyaW5nIj5BbmRyb2lkIE1hcmtldCBhbmQgRmVhdHVyZS1CYXNlZCBGaWx0ZXJpbmc8L2E+CisgIDxsaT48YSBocmVmPSIjbWFya2V0LWZlYXR1cmUtZmlsdGVyaW5nIj5Hb29nbGUgUGxheSBhbmQgRmVhdHVyZS1CYXNlZCBGaWx0ZXJpbmc8L2E+CiAgICAgPG9sPgogICAgICAgPGxpPjxhIGhyZWY9IiNkZWNsYXJlZCI+RmlsdGVyaW5nIGJhc2VkIG9uIGV4cGxpY2l0bHkgZGVjbGFyZWQgZmVhdHVyZXM8L2E+PC9saT4KICAgICAgIDxsaT48YSBocmVmPSIjaW1wbGljaXQiPkZpbHRlcmluZyBiYXNlZCBvbiBpbXBsaWNpdCBmZWF0dXJlczwvYT48L2xpPgpAQCAtNDUsMjYgKzQ1LDI2IEBACiAgPGRpdiBjbGFzcz0ic2lkZWJveC13cmFwcGVyIj4gCiAgIDxpbWcgaWQ9InJ1bGUiIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvZ3JhZC1ydWxlLXF2LnBuZyI+IAogICA8ZGl2IGlkPSJxdi1zdWItcnVsZSI+IAotICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjowO3BhZGRpbmc6MDsiPiAKLSAgICA8cCBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPkFuZHJvaWQgTWFya2V0IGFuZCA8Y29kZSBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50czwvcD4KLSAgICA8cCBzdHlsZT0ibWFyZ2luLXRvcDoxZW07Ij5BbmRyb2lkIE1hcmtldCBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgdmlzaWJsZSB0byB1c2Vycywgc28KKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvaWNvbl9wbGF5LnBuZyIgc3R5bGU9ImZsb2F0OmxlZnQ7bWFyZ2luOjA7cGFkZGluZzowOyI+IAorICAgIDxwIHN0eWxlPSJjb2xvcjojNjY5OTk5O3BhZGRpbmctdG9wOjFlbTsiPkdvb2dsZSBQbGF5IGFuZCA8Y29kZSBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50czwvcD4KKyAgICA8cCBzdHlsZT0ibWFyZ2luLXRvcDoxZW07Ij5Hb29nbGUgUGxheSBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgdmlzaWJsZSB0byB1c2Vycywgc28KIHRoYXQgdXNlcnMgY2FuIHNlZSBhbmQgZG93bmxvYWQgb25seSB0aG9zZSBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZWlyCi1kZXZpY2VzLiBPbmUgb2YgdGhlIHdheXMgTWFya2V0IGZpbHRlcnMgYXBwbGljYXRpb25zIGlzIGJ5IGZlYXR1cmUgY29tcGF0aWJpbGl0eS48L3A+CitkZXZpY2VzLiBPbmUgb2YgdGhlIHdheXMgaXQgZmlsdGVycyBhcHBsaWNhdGlvbnMgaXMgYnkgZmVhdHVyZSBjb21wYXRpYmlsaXR5LjwvcD4KIAotPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyI+VG8gZG8gdGhpcywgTWFya2V0IGNoZWNrcyB0aGUKKzxwIHN0eWxlPSJtYXJnaW4tdG9wOjFlbTsiPlRvIGRvIHRoaXMsIEdvb2dsZSBQbGF5IGNoZWNrcyB0aGUKIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbiBlYWNoIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QsIHRvCi1lc3RhYmxpc2ggdGhlIGFwcCdzIGZlYXR1cmUgbmVlZHMuIE1hcmtldCB0aGVuIHNob3dzIG9yIGhpZGVzIHRoZSBhcHBsaWNhdGlvbiB0bworZXN0YWJsaXNoIHRoZSBhcHAncyBmZWF0dXJlIG5lZWRzLiBHb29nbGUgUGxheSB0aGVuIHNob3dzIG9yIGhpZGVzIHRoZSBhcHBsaWNhdGlvbiB0bwogZWFjaCB1c2VyLCBiYXNlZCBvbiBhIGNvbXBhcmlzb24gd2l0aCB0aGUgZmVhdHVyZXMgYXZhaWxhYmxlIG9uIHRoZSB1c2VyJ3MKIGRldmljZS4gPC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLXRvcDoxZW07Ij5CeSBzcGVjaWZ5aW5nIHRoZSBmZWF0dXJlcyB0aGF0IHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMsCi15b3UgZW5hYmxlIEFuZHJvaWQgTWFya2V0IHRvIHByZXNlbnQgeW91ciBhcHBsaWNhdGlvbiBvbmx5IHRvIHVzZXJzIHdob3NlCit5b3UgZW5hYmxlIEdvb2dsZSBQbGF5IHRvIHByZXNlbnQgeW91ciBhcHBsaWNhdGlvbiBvbmx5IHRvIHVzZXJzIHdob3NlCiBkZXZpY2VzIG1lZXQgdGhlIGFwcGxpY2F0aW9uJ3MgZmVhdHVyZSByZXF1aXJlbWVudHMsIHJhdGhlciB0aGFuIHByZXNlbnRpbmcgaXQKIHRvIGFsbCB1c2Vycy4gPC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLXRvcDoxZW07IiBjbGFzcz0iY2F1dGlvbiI+Rm9yIGltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCBob3cKLUFuZHJvaWQgTWFya2V0IHVzZXMgZmVhdHVyZXMgYXMgdGhlIGJhc2lzIGZvciBmaWx0ZXJpbmcsIHBsZWFzZSByZWFkIDxhCi1ocmVmPSIjbWFya2V0LWZlYXR1cmUtZmlsdGVyaW5nIj5BbmRyb2lkIE1hcmtldCBhbmQgRmVhdHVyZS1CYXNlZCBGaWx0ZXJpbmc8L2E+LAorR29vZ2xlIFBsYXkgdXNlcyBmZWF0dXJlcyBhcyB0aGUgYmFzaXMgZm9yIGZpbHRlcmluZywgcGxlYXNlIHJlYWQgPGEKK2hyZWY9IiNtYXJrZXQtZmVhdHVyZS1maWx0ZXJpbmciPkdvb2dsZSBQbGF5IGFuZCBGZWF0dXJlLUJhc2VkIEZpbHRlcmluZzwvYT4sCiBiZWxvdy48L3A+CiA8L2Rpdj4KIDwvZGl2PgpAQCAtMTA2LDcgKzEwNiw3IEBACiA8cD5EZWNsYXJlZCA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlPjwvY29kZT4gZWxlbWVudHMgYXJlIGluZm9ybWF0aW9uYWwgb25seSwgbWVhbmluZwogdGhhdCB0aGUgQW5kcm9pZCBzeXN0ZW0gaXRzZWxmIGRvZXMgbm90IGNoZWNrIGZvciBtYXRjaGluZyBmZWF0dXJlIHN1cHBvcnQgb24KIHRoZSBkZXZpY2UgYmVmb3JlIGluc3RhbGxpbmcgYW4gYXBwbGljYXRpb24uIEhvd2V2ZXIsIG90aGVyIHNlcnZpY2VzCi0oc3VjaCBhcyBBbmRyb2lkIE1hcmtldCkgb3IgYXBwbGljYXRpb25zIG1heSBjaGVjayB5b3VyIGFwcGxpY2F0aW9uJ3MgCisoc3VjaCBhcyBHb29nbGUgUGxheSkgb3IgYXBwbGljYXRpb25zIG1heSBjaGVjayB5b3VyIGFwcGxpY2F0aW9uJ3MgCiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlPjwvY29kZT4gZGVjbGFyYXRpb25zIGFzIHBhcnQgb2YgaGFuZGxpbmcgb3IgaW50ZXJhY3RpbmcKIHdpdGggeW91ciBhcHBsaWNhdGlvbi4gRm9yIHRoaXMgcmVhc29uLCBpdCdzIHZlcnkgaW1wb3J0YW50IHRoYXQgeW91IGRlY2xhcmUgYWxsIG9mCiB0aGUgZmVhdHVyZXMgKGZyb20gdGhlIGxpc3QgYmVsb3cpIHRoYXQgeW91ciBhcHBsaWNhdGlvbiB1c2VzLiA8L3A+CkBAIC0yMDcsMjIgKzIwNywyMiBAQAogICAgIDxsaT57QGxpbmsgYW5kcm9pZC5jb250ZW50LnBtLkZlYXR1cmVJbmZvfTwvbGk+CiAgICAgPGxpPntAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uQ29uZmlndXJhdGlvbkluZm99PC9saT4KICAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXBlcm1pc3Npb24tZWxlbWVudC5odG1sIj48Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uJmd0OzwvY29kZT48L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkFuZHJvaWQgTWFya2V0IEZpbHRlcnM8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+PC9saT4KICAgPC91bD4KIDwvZGQ+CiAKIDwvZGw+CiAKIAotPGgyIGlkPSJtYXJrZXQtZmVhdHVyZS1maWx0ZXJpbmciPkFuZHJvaWQgTWFya2V0IGFuZCBGZWF0dXJlLUJhc2VkIEZpbHRlcmluZzwvaDI+Cis8aDIgaWQ9Im1hcmtldC1mZWF0dXJlLWZpbHRlcmluZyI+R29vZ2xlIFBsYXkgYW5kIEZlYXR1cmUtQmFzZWQgRmlsdGVyaW5nPC9oMj4KIAotPHA+QW5kcm9pZCBNYXJrZXQgZmlsdGVycyB0aGUgYXBwbGljYXRpb25zIHRoYXQgYXJlIHZpc2libGUgdG8gdXNlcnMsIHNvIHRoYXQKKzxwPkdvb2dsZSBQbGF5IGZpbHRlcnMgdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSB2aXNpYmxlIHRvIHVzZXJzLCBzbyB0aGF0CiB1c2VycyBjYW4gc2VlIGFuZCBkb3dubG9hZCBvbmx5IHRob3NlIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGgKLXRoZWlyIGRldmljZXMuIE9uZSBvZiB0aGUgd2F5cyBNYXJrZXQgZmlsdGVycyBhcHBsaWNhdGlvbnMgaXMgYnkgZmVhdHVyZQordGhlaXIgZGV2aWNlcy4gT25lIG9mIHRoZSB3YXlzIGl0IGZpbHRlcnMgYXBwbGljYXRpb25zIGlzIGJ5IGZlYXR1cmUKIGNvbXBhdGliaWxpdHkuPC9wPgogCiA8cD5UbyBkZXRlcm1pbmUgYW4gYXBwbGljYXRpb24ncyBmZWF0dXJlIGNvbXBhdGliaWxpdHkgd2l0aCBhIGdpdmVuIHVzZXIncwotZGV2aWNlLCB0aGUgQW5kcm9pZCBNYXJrZXQgc2VydmljZSBjb21wYXJlczo8L3A+CitkZXZpY2UsIEdvb2dsZSBQbGF5IGNvbXBhcmVzOjwvcD4KIAogPHVsPgogPGxpPkZlYXR1cmVzIHJlcXVpcmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAmbWRhc2g7IGFuIGFwcGxpY2F0aW9uIGRlY2xhcmVzIGZlYXR1cmVzIGluCkBAIC0yMzgsMTQgKzIzOCwxNCBAQAogdGhlIGJvdHRvbSBvZiB0aGlzIGRvY3VtZW50LCBhbmQgaW4gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIHtAbGluawogYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyfS48L3A+CiAKLTxwPldoZW4gdGhlIHVzZXIgbGF1bmNoZXMgdGhlIE1hcmtldCBhcHBsaWNhdGlvbiwgdGhlIGFwcGxpY2F0aW9uIHF1ZXJpZXMgdGhlCis8cD5XaGVuIHRoZSB1c2VyIGxhdW5jaGVzIEdvb2dsZSBQbGF5LCB0aGUgYXBwbGljYXRpb24gcXVlcmllcyB0aGUKIFBhY2thZ2UgTWFuYWdlciBmb3IgdGhlIGxpc3Qgb2YgZmVhdHVyZXMgYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UgYnkgY2FsbGluZwoge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlciNnZXRTeXN0ZW1BdmFpbGFibGVGZWF0dXJlcygpfS4gVGhlCi1NYXJrZXQgYXBwbGljYXRpb24gdGhlbiBwYXNzZXMgdGhlIGZlYXR1cmVzIGxpc3QgdXAgdG8gdGhlIEFuZHJvaWQgTWFya2V0Ci1zZXJ2aWNlIHdoZW4gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uIGZvciB0aGUgdXNlci48L3A+CitTdG9yZSBhcHBsaWNhdGlvbiB0aGVuIHBhc3NlcyB0aGUgZmVhdHVyZXMgbGlzdCB1cCB0byBHb29nbGUgUGxheQord2hlbiBlc3RhYmxpc2hpbmcgdGhlIHNlc3Npb24gZm9yIHRoZSB1c2VyLjwvcD4KIAotPHA+RWFjaCB0aW1lIHlvdSB1cGxvYWQgYW4gYXBwbGljYXRpb24gdG8gdGhlIEFuZHJvaWQgTWFya2V0IFB1Ymxpc2hlciBTaXRlLAotQW5kcm9pZCBNYXJrZXQgc2NhbnMgdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZmlsZS4gSXQgbG9va3MgZm9yCis8cD5FYWNoIHRpbWUgeW91IHVwbG9hZCBhbiBhcHBsaWNhdGlvbiB0byB0aGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUsCitHb29nbGUgUGxheSBzY2FucyB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdCBmaWxlLiBJdCBsb29rcyBmb3IKIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhbmQgZXZhbHVhdGVzIHRoZW0gaW4gY29tYmluYXRpb24KIHdpdGggb3RoZXIgZWxlbWVudHMsIGluIHNvbWUgY2FzZXMsIHN1Y2ggYXMgPGNvZGU+Jmx0O3VzZXMtc2RrJmd0OzwvY29kZT4gYW5kCiA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uJmd0OzwvY29kZT4gZWxlbWVudHMuIEFmdGVyIGVzdGFibGlzaGluZyB0aGUKQEAgLTI1MywxNyArMjUzLDE3IEBACiBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uIDxjb2RlPi5hcGs8L2NvZGU+IGFuZCB0aGUgYXBwbGljYXRpb24KIHZlcnNpb24uIDwvcD4KIAotPHA+V2hlbiBhIHVzZXIgc2VhcmNoZXMgb3IgYnJvd3NlcyBmb3IgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBBbmRyb2lkIE1hcmtldAorPHA+V2hlbiBhIHVzZXIgc2VhcmNoZXMgb3IgYnJvd3NlcyBmb3IgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBHb29nbGUgUGxheQogYXBwbGljYXRpb24sIHRoZSBzZXJ2aWNlIGNvbXBhcmVzIHRoZSBmZWF0dXJlcyBuZWVkZWQgYnkgZWFjaCBhcHBsaWNhdGlvbiB3aXRoCiB0aGUgZmVhdHVyZXMgYXZhaWxhYmxlIG9uIHRoZSB1c2VyJ3MgZGV2aWNlLiBJZiBhbGwgb2YgYW4gYXBwbGljYXRpb24ncyByZXF1aXJlZAotZmVhdHVyZXMgYXJlIHByZXNlbnQgb24gdGhlIGRldmljZSwgQW5kcm9pZCBNYXJrZXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlZSB0aGUKK2ZlYXR1cmVzIGFyZSBwcmVzZW50IG9uIHRoZSBkZXZpY2UsIEdvb2dsZSBQbGF5IGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlCiBhcHBsaWNhdGlvbiBhbmQgcG90ZW50aWFsbHkgZG93bmxvYWQgaXQuIElmIGFueSByZXF1aXJlZCBmZWF0dXJlIGlzIG5vdAotc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UsIEFuZHJvaWQgTWFya2V0IGZpbHRlcnMgdGhlIGFwcGxpY2F0aW9uIHNvIHRoYXQgaXQgaXMKK3N1cHBvcnRlZCBieSB0aGUgZGV2aWNlLCBHb29nbGUgUGxheSBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbiBzbyB0aGF0IGl0IGlzCiBub3QgdmlzaWJsZSB0byB0aGUgdXNlciBhbmQgbm90IGF2YWlsYWJsZSBmb3IgZG93bmxvYWQuIDwvcD4KIAogPHA+QmVjYXVzZSB0aGUgZmVhdHVyZXMgeW91IGRlY2xhcmUgaW4gPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+Ci1lbGVtZW50cyBkaXJlY3RseSBhZmZlY3QgaG93IEFuZHJvaWQgTWFya2V0IGZpbHRlcnMgeW91ciBhcHBsaWNhdGlvbiwgaXQncwotaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgaG93IEFuZHJvaWQgTWFya2V0IGV2YWx1YXRlcyB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdAorZWxlbWVudHMgZGlyZWN0bHkgYWZmZWN0IGhvdyBHb29nbGUgUGxheSBmaWx0ZXJzIHlvdXIgYXBwbGljYXRpb24sIGl0J3MKK2ltcG9ydGFudCB0byB1bmRlcnN0YW5kIGhvdyBHb29nbGUgUGxheSBldmFsdWF0ZXMgdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QKIGFuZCBlc3RhYmxpc2hlcyB0aGUgc2V0IG9mIHJlcXVpcmVkIGZlYXR1cmVzLiBUaGUgc2VjdGlvbnMgYmVsb3cgcHJvdmlkZSBtb3JlCiBpbmZvcm1hdGlvbi4gPC9wPgogCkBAIC0yNzcsMzUgKzI3NywzNSBAQAogaXQgKDxjb2RlPiJ0cnVlIjwvY29kZT4pLCBvciB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBwcmVmZXJzIHRvIHVzZSB0aGUgZmVhdHVyZQogaWYgYXZhaWxhYmxlLCBidXQgaXMgZGVzaWduZWQgdG8gcnVuIHdpdGhvdXQgaXQgKDxjb2RlPiJmYWxzZSI8L2NvZGU+KS48L3A+CiAKLTxwPkFuZHJvaWQgTWFya2V0IGhhbmRsZXMgZXhwbGljaXRseSBkZWNsYXJlZCBmZWF0dXJlcyBpbiB0aGlzIHdheTogPC9wPgorPHA+R29vZ2xlIFBsYXkgaGFuZGxlcyBleHBsaWNpdGx5IGRlY2xhcmVkIGZlYXR1cmVzIGluIHRoaXMgd2F5OiA8L3A+CiAKIDx1bD4KLTxsaT5JZiBhIGZlYXR1cmUgaXMgZXhwbGljaXRseSBkZWNsYXJlZCBhcyBiZWluZyByZXF1aXJlZCwgQW5kcm9pZCBNYXJrZXQgYWRkcworPGxpPklmIGEgZmVhdHVyZSBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIGFzIGJlaW5nIHJlcXVpcmVkLCBHb29nbGUgUGxheSBhZGRzCiB0aGUgZmVhdHVyZSB0byB0aGUgbGlzdCBvZiByZXF1aXJlZCBmZWF0dXJlcyBmb3IgdGhlIGFwcGxpY2F0aW9uLiBJdCB0aGVuCiBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIHVzZXJzIG9uIGRldmljZXMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGF0IGZlYXR1cmUuCiBGb3IgZXhhbXBsZToKIDxwcmU+Jmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhIiBhbmRyb2lkOnJlcXVpcmVkPSJ0cnVlIiAvJmd0OzwvcHJlPjwvbGk+Ci08bGk+SWYgYSBmZWF0dXJlIGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgYXMgPGVtPm5vdDwvZW0+IGJlaW5nIHJlcXVpcmVkLCBBbmRyb2lkCi1NYXJrZXQgPGVtPmRvZXMgbm90PC9lbT4gYWRkIHRoZSBmZWF0dXJlIHRvIHRoZSBsaXN0IG9mIHJlcXVpcmVkIGZlYXR1cmVzLiBGb3IKKzxsaT5JZiBhIGZlYXR1cmUgaXMgZXhwbGljaXRseSBkZWNsYXJlZCBhcyA8ZW0+bm90PC9lbT4gYmVpbmcgcmVxdWlyZWQsIEdvb2dsZQorUGxheSA8ZW0+ZG9lcyBub3Q8L2VtPiBhZGQgdGhlIGZlYXR1cmUgdG8gdGhlIGxpc3Qgb2YgcmVxdWlyZWQgZmVhdHVyZXMuIEZvcgogdGhhdCByZWFzb24sIGFuIGV4cGxpY2l0bHkgZGVjbGFyZWQgbm9uLXJlcXVpcmVkIGZlYXR1cmUgaXMgbmV2ZXIgY29uc2lkZXJlZCB3aGVuCiBmaWx0ZXJpbmcgdGhlIGFwcGxpY2F0aW9uLiBFdmVuIGlmIHRoZSBkZXZpY2UgZG9lcyBub3QgcHJvdmlkZSB0aGUgZGVjbGFyZWQKLWZlYXR1cmUsIEFuZHJvaWQgTWFya2V0IHdpbGwgc3RpbGwgY29uc2lkZXIgdGhlIGFwcGxpY2F0aW9uIGNvbXBhdGlibGUgd2l0aCB0aGUKK2ZlYXR1cmUsIEdvb2dsZSBQbGF5IHdpbGwgc3RpbGwgY29uc2lkZXIgdGhlIGFwcGxpY2F0aW9uIGNvbXBhdGlibGUgd2l0aCB0aGUKIGRldmljZSBhbmQgd2lsbCBzaG93IGl0IHRvIHRoZSB1c2VyLCB1bmxlc3Mgb3RoZXIgZmlsdGVyaW5nIHJ1bGVzIGFwcGx5LiBGb3IKIGV4YW1wbGU6CiA8cHJlPiZsdDt1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYSIgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiIC8mZ3Q7PC9wcmU+PC9saT4KIDxsaT5JZiBhIGZlYXR1cmUgaXMgZXhwbGljaXRseSBkZWNsYXJlZCwgYnV0IHdpdGhvdXQgYW4KLTxjb2RlPmFuZHJvaWQ6cmVxdWlyZWQ8L2NvZGU+IGF0dHJpYnV0ZSwgQW5kcm9pZCBNYXJrZXQgYXNzdW1lcyB0aGF0IHRoZSBmZWF0dXJlCis8Y29kZT5hbmRyb2lkOnJlcXVpcmVkPC9jb2RlPiBhdHRyaWJ1dGUsIEdvb2dsZSBQbGF5IGFzc3VtZXMgdGhhdCB0aGUgZmVhdHVyZQogaXMgcmVxdWlyZWQgYW5kIHNldHMgdXAgZmlsdGVyaW5nIG9uIGl0LiA8L2xpPgogPC91bD4KIAogPHA+SW4gZ2VuZXJhbCwgaWYgeW91ciBhcHBsaWNhdGlvbiBpcyBkZXNpZ25lZCB0byBydW4gb24gQW5kcm9pZCAxLjYgYW5kIGVhcmxpZXIKIHZlcnNpb25zLCB0aGUgPGNvZGU+YW5kcm9pZDpyZXF1aXJlZDwvY29kZT4gYXR0cmlidXRlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlCi1BUEkgYW5kIEFuZHJvaWQgTWFya2V0IGFzc3VtZXMgdGhhdCBhbnkgYW5kIGFsbAorQVBJIGFuZCBHb29nbGUgUGxheSBhc3N1bWVzIHRoYXQgYW55IGFuZCBhbGwKIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBkZWNsYXJhdGlvbnMgYXJlIHJlcXVpcmVkLiA8L3A+CiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEJ5IGRlY2xhcmluZyBhIGZlYXR1cmUgZXhwbGljaXRseSBhbmQKIGluY2x1ZGluZyBhbiA8Y29kZT5hbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSI8L2NvZGU+IGF0dHJpYnV0ZSwgeW91IGNhbgotZWZmZWN0aXZlbHkgZGlzYWJsZSBhbGwgZmlsdGVyaW5nIG9uIEFuZHJvaWQgTWFya2V0IGZvciB0aGUgc3BlY2lmaWVkIGZlYXR1cmUuCitlZmZlY3RpdmVseSBkaXNhYmxlIGFsbCBmaWx0ZXJpbmcgb24gR29vZ2xlIFBsYXkgZm9yIHRoZSBzcGVjaWZpZWQgZmVhdHVyZS4KIDwvcD4KIAogCkBAIC0zMTcsNyArMzE3LDcgQEAKIHNwZWFraW5nLCBldmVyeSBhcHBsaWNhdGlvbiBzaG91bGQgPGVtPmFsd2F5czwvZW0+IGRlY2xhcmUgYWxsIGZlYXR1cmVzIHRoYXQgaXQKIHVzZXMgb3IgcmVxdWlyZXMsIHNvIHRoZSBhYnNlbmNlIG9mIGEgZGVjbGFyYXRpb24gZm9yIGEgZmVhdHVyZSB1c2VkIGJ5IGFuCiBhcHBsaWNhdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBlcnJvci4gSG93ZXZlciwgYXMgYSBzYWZlZ3VhcmQgZm9yIHVzZXJzIGFuZAotZGV2ZWxvcGVycywgQW5kcm9pZCBNYXJrZXQgbG9va3MgZm9yIGltcGxpY2l0IGZlYXR1cmVzIGluIGVhY2ggYXBwbGljYXRpb24gYW5kCitkZXZlbG9wZXJzLCBHb29nbGUgUGxheSBsb29rcyBmb3IgaW1wbGljaXQgZmVhdHVyZXMgaW4gZWFjaCBhcHBsaWNhdGlvbiBhbmQKIHNldHMgdXAgZmlsdGVycyBmb3IgdGhvc2UgZmVhdHVyZXMsIGp1c3QgYXMgaXQgd291bGQgZG8gZm9yIGFuIGV4cGxpY2l0bHkKIGRlY2xhcmVkIGZlYXR1cmUuIDwvcD4KIApAQCAtMzM3LDI1ICszMzcsMjUgQEAKIDwvbGk+CiA8L3VsPgogCi08cD5UbyBhY2NvdW50IGZvciB0aGUgY2FzZXMgYWJvdmUsIEFuZHJvaWQgTWFya2V0IGF0dGVtcHRzIHRvIGRpc2NvdmVyIGFuCis8cD5UbyBhY2NvdW50IGZvciB0aGUgY2FzZXMgYWJvdmUsIEdvb2dsZSBQbGF5IGF0dGVtcHRzIHRvIGRpc2NvdmVyIGFuCiBhcHBsaWNhdGlvbidzIGltcGxpZWQgZmVhdHVyZSByZXF1aXJlbWVudHMgYnkgZXhhbWluaW5nIDxlbT5vdGhlciBlbGVtZW50czwvZW0+CiBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QgZmlsZSwgc3BlY2lmaWNhbGx5LAogPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KIAotPHA+SWYgYW4gYXBwbGljYXRpb24gcmVxdWVzdHMgaGFyZHdhcmUtcmVsYXRlZCBwZXJtaXNzaW9ucywgQW5kcm9pZCBNYXJrZXQKKzxwPklmIGFuIGFwcGxpY2F0aW9uIHJlcXVlc3RzIGhhcmR3YXJlLXJlbGF0ZWQgcGVybWlzc2lvbnMsIEdvb2dsZSBQbGF5CiA8ZW0+YXNzdW1lcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1c2VzIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlIGZlYXR1cmVzIGFuZAogdGhlcmVmb3JlIHJlcXVpcmVzIHRob3NlIGZlYXR1cmVzPC9lbT4sIGV2ZW4gdGhvdWdoIHRoZXJlIG1pZ2h0IGJlIG5vCiBjb3JyZXNwb25kaW5nIHRvIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBkZWNsYXJhdGlvbnMuIEZvciBzdWNoCi1wZXJtaXNzaW9ucywgQW5kcm9pZCBNYXJrZXQgYWRkcyB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBmZWF0dXJlcyB0byB0aGUKK3Blcm1pc3Npb25zLCBHb29nbGUgUGxheSBhZGRzIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlIGZlYXR1cmVzIHRvIHRoZQogbWV0YWRhdGEgdGhhdCBpdCBzdG9yZXMgZm9yIHRoZSBhcHBsaWNhdGlvbiBhbmQgc2V0cyB1cCBmaWx0ZXJzIGZvciB0aGVtLjwvcD4KIAogPHA+Rm9yIGV4YW1wbGUsIGlmIGFuIGFwcGxpY2F0aW9uIHJlcXVlc3RzIHRoZSA8Y29kZT5DQU1FUkE8L2NvZGU+IHBlcm1pc3Npb24KIGJ1dCBkb2VzIG5vdCBkZWNsYXJlIGEgPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+IGVsZW1lbnQgZm9yCi08Y29kZT5hbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTwvY29kZT4sIEFuZHJvaWQgTWFya2V0IGNvbnNpZGVycyB0aGF0IHRoZQorPGNvZGU+YW5kcm9pZC5oYXJkd2FyZS5jYW1lcmE8L2NvZGU+LCBHb29nbGUgUGxheSBjb25zaWRlcnMgdGhhdCB0aGUKIGFwcGxpY2F0aW9uIHJlcXVpcmVzIGEgY2FtZXJhIGFuZCBzaG91bGQgbm90IGJlIHNob3duIHRvIHVzZXJzIHdob3NlIGRldmljZXMgZG8KIG5vdCBvZmZlciBhIGNhbWVyYS48L3A+CiAKLTxwPklmIHlvdSBkb24ndCB3YW50IEFuZHJvaWQgTWFya2V0IHRvIGZpbHRlciBiYXNlZCBvbiBhIHNwZWNpZmljIGltcGxpZWQKKzxwPklmIHlvdSBkb24ndCB3YW50IEdvb2dsZSBQbGF5IHRvIGZpbHRlciBiYXNlZCBvbiBhIHNwZWNpZmljIGltcGxpZWQKIGZlYXR1cmUsIHlvdSBjYW4gZGlzYWJsZSB0aGF0IGJlaGF2aW9yLiBUbyBkbyBzbywgZGVjbGFyZSB0aGUgZmVhdHVyZSBleHBsaWNpdGx5CiBpbiBhIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50IGFuZCBpbmNsdWRlIGFuIAogPGNvZGU+YW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiPC9jb2RlPiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCB0byBkaXNhYmxlCkBAIC0zNjYsMzAgKzM2NiwzMCBAQAogCiA8cCBjbGFzcz0iY2F1dGlvbiI+SXQncyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IHRoZSBwZXJtaXNzaW9ucyB0aGF0IHlvdQogcmVxdWVzdCBpbiA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uJmd0OzwvY29kZT4gZWxlbWVudHMgY2FuIGRpcmVjdGx5IGFmZmVjdCBob3cKLUFuZHJvaWQgTWFya2V0IGZpbHRlcnMgeW91ciBhcHBsaWNhdGlvbi4gVGhlIHJlZmVyZW5jZSBzZWN0aW9uIDxhCitHb29nbGUgUGxheSBmaWx0ZXJzIHlvdXIgYXBwbGljYXRpb24uIFRoZSByZWZlcmVuY2Ugc2VjdGlvbiA8YQogaHJlZj0iI3Blcm1pc3Npb25zIj5QZXJtaXNzaW9ucyB0aGF0IEltcGx5IEZlYXR1cmUgUmVxdWlyZW1lbnRzPC9hPiwKIGJlbG93LCBsaXN0cyB0aGUgZnVsbCBzZXQgb2YgcGVybWlzc2lvbnMgdGhhdCBpbXBseSBmZWF0dXJlIHJlcXVpcmVtZW50cyBhbmQKIHRoZXJlZm9yZSB0cmlnZ2VyIGZpbHRlcmluZy48L3A+CiAKIDxoMyBpZD0iYnQtcGVybWlzc2lvbi1oYW5kbGluZyI+U3BlY2lhbCBoYW5kbGluZyBmb3IgQmx1ZXRvb3RoIGZlYXR1cmU8L2gzPgogCi08cD5BbmRyb2lkIE1hcmtldCBhcHBsaWVzIHNsaWdodGx5IGRpZmZlcmVudCBydWxlcyB0aGFuIGRlc2NyaWJlZCBhYm92ZSwgd2hlbgorPHA+R29vZ2xlIFBsYXkgYXBwbGllcyBzbGlnaHRseSBkaWZmZXJlbnQgcnVsZXMgdGhhbiBkZXNjcmliZWQgYWJvdmUsIHdoZW4KIGRldGVybWluaW5nIGZpbHRlcmluZyBmb3IgQmx1ZXRvb3RoLjwvcD4KIAogPHA+SWYgYW4gYXBwbGljYXRpb24gZGVjbGFyZXMgYSBCbHVldG9vdGggcGVybWlzc2lvbiBpbiBhCiA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uJmd0OzwvY29kZT4gZWxlbWVudCwgYnV0IGRvZXMgbm90IGV4cGxpY2l0bHkgZGVjbGFyZQotdGhlIEJsdWV0b290aCBmZWF0dXJlIGluIGEgPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+IGVsZW1lbnQsIEFuZHJvaWQKLU1hcmtldCBjaGVja3MgdGhlIHZlcnNpb24ocykgb2YgdGhlIEFuZHJvaWQgcGxhdGZvcm0gb24gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGlzCit0aGUgQmx1ZXRvb3RoIGZlYXR1cmUgaW4gYSA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudCwgR29vZ2xlCitQbGF5IGNoZWNrcyB0aGUgdmVyc2lvbihzKSBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBvbiB3aGljaCB0aGUgYXBwbGljYXRpb24gaXMKIGRlc2lnbmVkIHRvIHJ1biwgYXMgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT4mbHQ7dXNlcy1zZGsmZ3Q7PC9jb2RlPiBlbGVtZW50LiA8L3A+CiAKLTxwPkFzIHNob3duIGluIHRoZSB0YWJsZSBiZWxvdywgQW5kcm9pZCBNYXJrZXQgZW5hYmxlcyBmaWx0ZXJpbmcgZm9yIHRoZQorPHA+QXMgc2hvd24gaW4gdGhlIHRhYmxlIGJlbG93LCBHb29nbGUgUGxheSBlbmFibGVzIGZpbHRlcmluZyBmb3IgdGhlCiBCbHVldG9vdGggZmVhdHVyZSBvbmx5IGlmIHRoZSBhcHBsaWNhdGlvbiBkZWNsYXJlcyBpdHMgbG93ZXN0IG9yIHRhcmdldGVkCi1wbGF0Zm9ybSBhcyBBbmRyb2lkIDIuMCAoQVBJIGxldmVsIDUpIG9yIGhpZ2hlci4gSG93ZXZlciwgbm90ZSB0aGF0IEFuZHJvaWQKLW1hcmtldCBhcHBsaWVzIHRoZSBub3JtYWwgcnVsZXMgZm9yIGZpbHRlcmluZyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBleHBsaWNpdGx5CitwbGF0Zm9ybSBhcyBBbmRyb2lkIDIuMCAoQVBJIGxldmVsIDUpIG9yIGhpZ2hlci4gSG93ZXZlciwgbm90ZSB0aGF0IEdvb2dsZQorUGxheSBhcHBsaWVzIHRoZSBub3JtYWwgcnVsZXMgZm9yIGZpbHRlcmluZyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBleHBsaWNpdGx5CiBkZWNsYXJlcyB0aGUgQmx1ZXRvb3RoIGZlYXR1cmUgaW4gYSA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudC4KIDwvcD4KIAotPHAgY2xhc3M9ImNhcHRpb24iPjxzdHJvbmc+VGFibGUgMS48L3N0cm9uZz4gSG93IEFuZHJvaWQgTWFya2V0IGRldGVybWluZXMgdGhlCis8cCBjbGFzcz0iY2FwdGlvbiI+PHN0cm9uZz5UYWJsZSAxLjwvc3Ryb25nPiBIb3cgR29vZ2xlIFBsYXkgZGV0ZXJtaW5lcyB0aGUKIEJsdWV0b290aCBmZWF0dXJlIHJlcXVpcmVtZW50IGZvciBhbiBhcHBsaWNhdGlvbiB0aGF0IHJlcXVlc3RzIGEgQmx1ZXRvb3RoCiBwZXJtaXNzaW9uIGJ1dCBkb2VzIG5vdCBkZWNsYXJlIHRoZSBCbHVldG9vdGggZmVhdHVyZSBpbiBhCiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudC48L3A+CkBAIC00MDMsMTQgKzQwMywxNCBAQAogPHRyPgogPHRkPjxub2JyPiZsdDs9NCAob3IgdXNlcy1zZGsgaXMgbm90IGRlY2xhcmVkKTwvbm9icj48L3RkPgogPHRkPiZsdDs9NDwvdGQ+Ci08dGQ+QW5kcm9pZCBNYXJrZXQgPGVtPndpbGwgbm90PC9lbT4gZmlsdGVyIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGFueSBkZXZpY2VzCis8dGQ+R29vZ2xlIFBsYXkgPGVtPndpbGwgbm90PC9lbT4gZmlsdGVyIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGFueSBkZXZpY2VzCiBiYXNlZCBvbiB0aGVpciByZXBvcnRlZCBzdXBwb3J0IGZvciB0aGUgPGNvZGU+YW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGg8L2NvZGU+CiBmZWF0dXJlLjwvdGQ+CiA8L3RyPgogPHRyPgogPHRkPiZsdDs9NDwvdGQ+CiA8dGQ+Jmd0Oz01PC90ZD4KLTx0ZCByb3dzcGFuPSIyIj5BbmRyb2lkIE1hcmtldCBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGFueSBkZXZpY2VzIHRoYXQKKzx0ZCByb3dzcGFuPSIyIj5Hb29nbGUgUGxheSBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGFueSBkZXZpY2VzIHRoYXQKIGRvIG5vdCBzdXBwb3J0IHRoZSA8Y29kZT5hbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aDwvY29kZT4gZmVhdHVyZSAoaW5jbHVkaW5nCiBvbGRlciByZWxlYXNlcykuPC90ZD4KIDwvdHI+CkBAIC00MjEsMTMgKzQyMSwxMyBAQAogPC90YWJsZT4KIAogPHA+VGhlIGV4YW1wbGVzIGJlbG93IGlsbHVzdHJhdGUgdGhlIGRpZmZlcmVudCBmaWx0ZXJpbmcgZWZmZWN0cywgYmFzZWQgb24gaG93Ci1BbmRyb2lkIE1hcmtldCBoYW5kbGVzIHRoZSBCbHVldG9vdGggZmVhdHVyZS4gPC9wPgorR29vZ2xlIFBsYXkgaGFuZGxlcyB0aGUgQmx1ZXRvb3RoIGZlYXR1cmUuIDwvcD4KIAogPGRsPgogPGR0PkluIGZpcnN0IGV4YW1wbGUsIGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgZGVzaWduZWQgdG8gcnVuIG9uIG9sZGVyIEFQSSBsZXZlbHMKIGRlY2xhcmVzIGEgQmx1ZXRvb3RoIHBlcm1pc3Npb24sIGJ1dCBkb2VzIG5vdCBkZWNsYXJlIHRoZSBCbHVldG9vdGggZmVhdHVyZSBpbiBhCiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudC48L2R0PgotPGRkPjxlbT5SZXN1bHQ6PC9lbT4gQW5kcm9pZCBNYXJrZXQgZG9lcyBub3QgZmlsdGVyIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGFueSBkZXZpY2UuPC9kZD4KKzxkZD48ZW0+UmVzdWx0OjwvZW0+IEdvb2dsZSBQbGF5IGRvZXMgbm90IGZpbHRlciB0aGUgYXBwbGljYXRpb24gZnJvbSBhbnkgZGV2aWNlLjwvZGQ+CiA8L2RsPgogCiA8cHJlPiZsdDttYW5pZmVzdCAuLi4+CkBAIC00MzksNyArNDM5LDcgQEAKIDxkbD4KIDxkdD5JbiB0aGUgc2Vjb25kIGV4YW1wbGUsIGJlbG93LCB0aGUgc2FtZSBhcHBsaWNhdGlvbiBhbHNvIGRlY2xhcmVzIGEgdGFyZ2V0CiBBUEkgbGV2ZWwgb2YgIjUiLiA8L2R0PgotPGRkPjxlbT5SZXN1bHQ6PC9lbT4gQW5kcm9pZCBNYXJrZXQgbm93IGFzc3VtZXMgdGhhdCB0aGUgZmVhdHVyZSBpcyByZXF1aXJlZCBhbmQKKzxkZD48ZW0+UmVzdWx0OjwvZW0+IEdvb2dsZSBQbGF5IG5vdyBhc3N1bWVzIHRoYXQgdGhlIGZlYXR1cmUgaXMgcmVxdWlyZWQgYW5kCiB3aWxsIGZpbHRlciB0aGUgYXBwbGljYXRpb24gZnJvbSBhbGwgZGV2aWNlcyB0aGF0IGRvIG5vdCByZXBvcnQgQmx1ZXRvb3RoIHN1cHBvcnQsCiBpbmNsdWRpbmcgZGV2aWNlcyBydW5uaW5nIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBwbGF0Zm9ybS4gPC9kZD4KIDwvZGw+CkBAIC00NjUsNyArNDY1LDcgQEAKIDxkbD4KIDxkdD5GaW5hbGx5LCBpbiB0aGUgY2FzZSBiZWxvdywgdGhlIHNhbWUgYXBwbGljYXRpb24gYWRkcyBhbgogPGNvZGU+YW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiPC9jb2RlPiBhdHRyaWJ1dGUuPC9kdD4KLTxkZD48ZW0+UmVzdWx0OjwvZW0+IEFuZHJvaWQgTWFya2V0IGRpc2FibGVzIGZpbHRlcmluZyBiYXNlZCBvbiBCbHVldG9vdGgKKzxkZD48ZW0+UmVzdWx0OjwvZW0+IEdvb2dsZSBQbGF5IGRpc2FibGVzIGZpbHRlcmluZyBiYXNlZCBvbiBCbHVldG9vdGgKIGZlYXR1cmUgc3VwcG9ydCwgZm9yIGFsbCBkZXZpY2VzLjwvZGQ+CiA8L2RsPgogCkBAIC00ODEsMTAgKzQ4MSwxMCBAQAogPGgzIGlkPSJ0ZXN0aW5nIj5UZXN0aW5nIHRoZSBmZWF0dXJlcyByZXF1aXJlZCBieSB5b3VyIGFwcGxpY2F0aW9uPC9oMz4KIAogPHA+WW91IGNhbiB1c2UgdGhlIDxjb2RlPmFhcHQ8L2NvZGU+IHRvb2wsIGluY2x1ZGVkIGluIHRoZSBBbmRyb2lkIFNESywgdG8KLWRldGVybWluZSBob3cgQW5kcm9pZCBNYXJrZXQgd2lsbCBmaWx0ZXIgeW91ciBhcHBsaWNhdGlvbiwgYmFzZWQgb24gaXRzIGRlY2xhcmVkCitkZXRlcm1pbmUgaG93IEdvb2dsZSBQbGF5IHdpbGwgZmlsdGVyIHlvdXIgYXBwbGljYXRpb24sIGJhc2VkIG9uIGl0cyBkZWNsYXJlZAogZmVhdHVyZXMgYW5kIHBlcm1pc3Npb25zLiBUbyBkbyBzbywgcnVuICA8Y29kZT5hYXB0PC9jb2RlPiB3aXRoIHRoZSA8Y29kZT5kdW1wCiBiYWRnaW5nPC9jb2RlPiBjb21tYW5kLiBUaGlzIGNhdXNlcyA8Y29kZT5hYXB0PC9jb2RlPiB0byBwYXJzZSB5b3VyCi1hcHBsaWNhdGlvbidzIG1hbmlmZXN0IGFuZCBhcHBseSB0aGUgc2FtZSBydWxlcyBhcyB1c2VkIGJ5IEFuZHJvaWQgTWFya2V0IHRvCithcHBsaWNhdGlvbidzIG1hbmlmZXN0IGFuZCBhcHBseSB0aGUgc2FtZSBydWxlcyBhcyB1c2VkIGJ5IEdvb2dsZSBQbGF5IHRvCiBkZXRlcm1pbmUgdGhlIGZlYXR1cmVzIHRoYXQgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcy4gPC9wPgogCiA8cD5UbyB1c2UgdGhlIHRvb2wsIGZvbGxvdyB0aGVzZSBzdGVwczogPC9wPgpAQCAtNTI5LDcgKzUyOSw3IEBACiA8aDIgaWQ9ZmVhdHVyZXMtcmVmZXJlbmNlPkZlYXR1cmVzIFJlZmVyZW5jZTwvaDI+CiAKIDxwPlRoZSB0YWJsZXMgYmVsb3cgcHJvdmlkZSByZWZlcmVuY2UgaW5mb3JtYXRpb24gYWJvdXQgaGFyZHdhcmUgYW5kIHNvZnR3YXJlCi1mZWF0dXJlcyBhbmQgdGhlIHBlcm1pc3Npb25zIHRoYXQgY2FuIGltcGx5IHRoZW0gb24gQW5kcm9pZCBNYXJrZXQuIDwvcD4KK2ZlYXR1cmVzIGFuZCB0aGUgcGVybWlzc2lvbnMgdGhhdCBjYW4gaW1wbHkgdGhlbSBvbiBHb29nbGUgUGxheS4gPC9wPgogCiA8aDMgaWQ9Imh3LWZlYXR1cmVzIj5IYXJkd2FyZSBmZWF0dXJlczwvaDM+CiAKQEAgLTg3MywxMiArODczLDEyIEBACiB0aGUgYWJpbGl0eSB0byBkZWNsYXJlIHRoYXQgdGhleSByZXF1aXJlIHRoZSBBUEkgdmlhIHRoZQogPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+IHN5c3RlbS4gPC9wPgogCi08cD5UbyBwcmV2ZW50IHRob3NlIGFwcHMgZnJvbSBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmludGVudGlvbmFsbHksICBBbmRyb2lkCi1NYXJrZXQgYXNzdW1lcyB0aGF0IGNlcnRhaW4gaGFyZHdhcmUtcmVsYXRlZCBwZXJtaXNzaW9ucyBpbmRpY2F0ZSB0aGF0IHRoZQorPHA+VG8gcHJldmVudCB0aG9zZSBhcHBzIGZyb20gYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5pbnRlbnRpb25hbGx5LCAgR29vZ2xlCitQbGF5IGFzc3VtZXMgdGhhdCBjZXJ0YWluIGhhcmR3YXJlLXJlbGF0ZWQgcGVybWlzc2lvbnMgaW5kaWNhdGUgdGhhdCB0aGUKIHVuZGVybHlpbmcgaGFyZHdhcmUgZmVhdHVyZXMgYXJlIHJlcXVpcmVkIGJ5IGRlZmF1bHQuIEZvciBpbnN0YW5jZSwgYXBwbGljYXRpb25zCiB0aGF0IHVzZSBCbHVldG9vdGggbXVzdCByZXF1ZXN0IHRoZSA8Y29kZT5CTFVFVE9PVEg8L2NvZGU+IHBlcm1pc3Npb24gaW4gYQotPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiZndDs8L2NvZGU+IGVsZW1lbnQgJm1kYXNoOyBmb3IgbGVnYWN5IGFwcHMsIEFuZHJvaWQKLU1hcmtldCBhc3N1bWVzIHRoYXQgdGhlIHBlcm1pc3Npb24gZGVjbGFyYXRpb24gbWVhbnMgdGhhdCB0aGUgdW5kZXJseWluZworPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiZndDs8L2NvZGU+IGVsZW1lbnQgJm1kYXNoOyBmb3IgbGVnYWN5IGFwcHMsIEdvb2dsZQorUGxheSBhc3N1bWVzIHRoYXQgdGhlIHBlcm1pc3Npb24gZGVjbGFyYXRpb24gbWVhbnMgdGhhdCB0aGUgdW5kZXJseWluZwogPGNvZGU+YW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGg8L2NvZGU+IGZlYXR1cmUgaXMgcmVxdWlyZWQgYnkgdGhlIGFwcGxpY2F0aW9uCiBhbmQgc2V0cyB1cCBmaWx0ZXJpbmcgYmFzZWQgb24gdGhhdCBmZWF0dXJlLiA8L3A+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1saWJyYXJ5LWVsZW1lbnQuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtbGlicmFyeS1lbGVtZW50LmpkCmluZGV4IGQ5NGFkOWYuLjJmOGViNTAgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1saWJyYXJ5LWVsZW1lbnQuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWxpYnJhcnktZWxlbWVudC5qZApAQCAtMzMsNyArMzMsNyBAQAogICAgIDwvcD4KICAgICA8cD4KICAgICAgICAgVGhpcyBlbGVtZW50IGFsc28gYWZmZWN0cyB0aGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBvbiBhIHBhcnRpY3VsYXIgZGV2aWNlIGFuZAotICAgICAgICB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBhcHBsaWNhdGlvbiBpbiBBbmRyb2lkIE1hcmtldDoKKyAgICAgICAgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXk6CiAgICAgPC9wPgogICAgIDxkbD4KICAgICAgICAgPGR0PjxlbT5JbnN0YWxsYXRpb248L2VtPjwvZHQ+CkBAIC00MiwxMSArNDIsMTEgQEAKICAgICAgICAgICAgIHtAY29kZSB0cnVlfSwgdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXJ9IGZyYW1ld29yayB3b24ndCBsZXQgdGhlIHVzZXIKICAgICAgICAgICAgIGluc3RhbGwgdGhlIGFwcGxpY2F0aW9uIHVubGVzcyB0aGUgbGlicmFyeSBpcyBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgZGV2aWNlLgogICAgICAgICA8L2RkPgotICAgICAgICA8ZHQ+PGVtPk1hcmtldDwvZW0+PC9kdD4KKyAgICAgICAgPGR0PjxlbT5Hb29nbGUgUGxheTwvZW0+PC9kdD4KICAgICAgICAgPGRkPgotICAgICAgICAgICAgQW5kcm9pZCBNYXJrZXQgZmlsdGVycyBhcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlIGxpYnJhcmllcyBpbnN0YWxsZWQgb24gdGhlCisgICAgICAgICAgICBHb29nbGUgUGxheSBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBiYXNlZCBvbiB0aGUgbGlicmFyaWVzIGluc3RhbGxlZCBvbiB0aGUKICAgICAgICAgICAgIHVzZXIncyBkZXZpY2UuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZpbHRlcmluZywgc2VlIHRoZSB0b3BpYwotICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPk1hcmtldCBGaWx0ZXJzPC9hPi4KKyAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5GaWx0ZXJzIG9uIEdvb2dsZSBQbGF5PC9hPi4KICAgICAgICAgPC9kZD4KICAgICA8L2RsPgogICAgIDxwPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXBlcm1pc3Npb24tZWxlbWVudC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1wZXJtaXNzaW9uLWVsZW1lbnQuamQKaW5kZXggOTY3ZmM1YS4uNmM3MWZiNCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXBlcm1pc3Npb24tZWxlbWVudC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtcGVybWlzc2lvbi1lbGVtZW50LmpkCkBAIC04LDIxICs4LDIxIEBACiAgPGRpdiBjbGFzcz0ic2lkZWJveC13cmFwcGVyIj4gCiAgIDxpbWcgaWQ9InJ1bGUiIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvZ3JhZC1ydWxlLXF2LnBuZyI+IAogICA8ZGl2IGlkPSJxdi1zdWItcnVsZSI+IAotICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjowO3BhZGRpbmc6MDsiPiAKLSAgICA8cCBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPjxjb2RlIHN0eWxlPSJjb2xvcjojNjY5OTk5OyI+Jmx0O3VzZXMtcGVybWlzc2lvbiZndDs8L2NvZGU+IGFuZCBmaWx0ZXJpbmcgb24gQW5kcm9pZCBNYXJrZXQuIDwvcD4KKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvaWNvbl9wbGF5LnBuZyIgc3R5bGU9ImZsb2F0OmxlZnQ7bWFyZ2luOjA7cGFkZGluZzowOyI+IAorICAgIDxwIHN0eWxlPSJjb2xvcjojNjY5OTk5O3BhZGRpbmctdG9wOjFlbTsiPjxjb2RlIHN0eWxlPSJjb2xvcjojNjY5OTk5OyI+Jmx0O3VzZXMtcGVybWlzc2lvbiZndDs8L2NvZGU+IGFuZCBmaWx0ZXJpbmcgb24gR29vZ2xlIFBsYXkuIDwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyI+SW4gc29tZSBjYXNlcywgdGhlIHBlcm1pc3Npb25zIHRoYXQgeW91IHJlcXVlc3QKIHRocm91Z2ggPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiZndDs8L2NvZGU+IGNhbiBhZmZlY3QgaG93Ci15b3VyIGFwcGxpY2F0aW9uIGlzIGZpbHRlcmVkIGJ5IEFuZHJvaWQgTWFya2V0LjwvcD4KK3lvdXIgYXBwbGljYXRpb24gaXMgZmlsdGVyZWQgYnkgR29vZ2xlIFBsYXkuPC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLXRvcDoxZW07Ij5JZiB5b3UgcmVxdWVzdCBhIGhhcmR3YXJlLXJlbGF0ZWQgcGVybWlzc2lvbiAmbWRhc2g7Ci08Y29kZT5DQU1FUkE8L2NvZGU+LCBmb3IgZXhhbXBsZSAmbWRhc2g7IEFuZHJvaWQgTWFya2V0IGFzc3VtZXMgdGhhdCB5b3VyCis8Y29kZT5DQU1FUkE8L2NvZGU+LCBmb3IgZXhhbXBsZSAmbWRhc2g7IEdvb2dsZSBQbGF5IGFzc3VtZXMgdGhhdCB5b3VyCiBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBmZWF0dXJlIGFuZCBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbgogZnJvbSBkZXZpY2VzIHRoYXQgZG8gbm90IG9mZmVyIGl0LjwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyI+VG8gY29udHJvbCBmaWx0ZXJpbmcsIGFsd2F5cyBleHBsaWNpdGx5IGRlY2xhcmUKIGhhcmR3YXJlIGZlYXR1cmVzIGluIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50cywgcmF0aGVyIHRoYW4KLXJlbHlpbmcgb24gQW5kcm9pZCBNYXJrZXQgdG8gImRpc2NvdmVyIiB0aGUgcmVxdWlyZW1lbnRzIGluCityZWx5aW5nIG9uIEdvb2dsZSBQbGF5IHRvICJkaXNjb3ZlciIgdGhlIHJlcXVpcmVtZW50cyBpbgogPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiZndDs8L2NvZGU+IGVsZW1lbnRzLiBUaGVuLCBpZiB5b3Ugd2FudCB0byBkaXNhYmxlCiBmaWx0ZXJpbmcgZm9yIGEgcGFydGljdWxhciBmZWF0dXJlLCB5b3UgY2FuIGFkZCBhCiA8Y29kZT5hbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSI8L2NvZGU+IGF0dHJpYnV0ZSB0byB0aGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5qZAppbmRleCA5OWM5MWY2Li44ZmEzOWQxIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXNkay1lbGVtZW50LmpkCkBAIC0zMywxNiArMzMsMTYgQEAKICA8ZGl2IGNsYXNzPSJzaWRlYm94LXdyYXBwZXIiIHhzdHlsZT0ibWFyZ2luLWJvdHRvbToyZW07bWFyZ2luLXRvcDouNWVtO3dpZHRoOjkwJTsiPiAKICAgPGltZyBpZD0icnVsZSIgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9ncmFkLXJ1bGUtcXYucG5nIj4gCiAgIDxkaXYgaWQ9InF2LXN1Yi1ydWxlIj4gCi0gICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fbWFya2V0LmpwZyIgc3R5bGU9ImZsb2F0OmxlZnQ7bWFyZ2luOjA7cGFkZGluZzowOyI+IAotICAgIDxwIHN0eWxlPSJjb2xvcjojNjY5OTk5OyI+QW5kcm9pZCBNYXJrZXQgYW5kICZsdDt1c2VzLXNkayZndDsgYXR0cmlidXRlczwvcD4gCi0gICAgPHA+QW5kcm9pZCBNYXJrZXQgZmlsdGVycyB0aGUgYXBwbGljYXRpb25zIHRoYXQgYXJlIHZpc2libGUgdG8gdXNlcnMsIHNvCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fcGxheS5wbmciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjowO3BhZGRpbmc6MDsiPiAKKyAgICA8cCBzdHlsZT0iY29sb3I6IzY2OTk5OTtwYWRkaW5nLXRvcDoxZW07Ij5Hb29nbGUgUGxheSBhbmQgJmx0O3VzZXMtc2RrJmd0OyBhdHRyaWJ1dGVzPC9wPiAKKyAgICA8cCBzdHlsZT0icGFkZGluZy10b3A6MWVtOyI+R29vZ2xlIFBsYXkgZmlsdGVycyB0aGUgYXBwbGljYXRpb25zIHRoYXQgYXJlIHZpc2libGUgdG8gdXNlcnMsIHNvCiB0aGF0IHVzZXJzIGNhbiBvbmx5IHNlZSBhbmQgZG93bmxvYWQgYXBwbGljYXRpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGVpcgotZGV2aWNlcy4gT25lIG9mIHRoZSB3YXlzIE1hcmtldCBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBpcyBieSBBbmRyb2lkCi12ZXJzaW9uLWNvbXBhdGliaWxpdHkuIFRvIGRvIHRoaXMsIE1hcmtldCBjaGVja3MgdGhlIDxjb2RlPiZsdDt1c2VzLXNkayZndDs8L2NvZGU+CitkZXZpY2VzLiBPbmUgb2YgdGhlIHdheXMgaXQgZmlsdGVycyBhcHBsaWNhdGlvbnMgaXMgYnkgQW5kcm9pZAordmVyc2lvbi1jb21wYXRpYmlsaXR5LiBUbyBkbyB0aGlzLCBHb29nbGUgUGxheSBjaGVja3MgdGhlIDxjb2RlPiZsdDt1c2VzLXNkayZndDs8L2NvZGU+CiBhdHRyaWJ1dGVzIGluIGVhY2ggYXBwbGljYXRpb24ncyBtYW5pZmVzdCB0byBlc3RhYmxpc2ggaXRzIHZlcnNpb24tY29tcGF0aWJpbGl0eQogcmFuZ2UsIHRoZW4gc2hvd3Mgb3IgaGlkZXMgdGhlIGFwcGxpY2F0aW9uIGJhc2VkIG9uIGEgY29tcGFyaXNvbiB3aXRoIHRoZSBBUEkKIExldmVsIG9mIHRoZSB1c2VyJ3MgQW5kcm9pZCBzeXN0ZW0gdmVyc2lvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YQotaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPk1hcmtldCBGaWx0ZXJzPC9hPi48L3A+CitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+RmlsdGVycyBvbiBHb29nbGUgUGxheTwvYT4uPC9wPgogICA8L2Rpdj4KIDwvZGl2PgogCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgdXBkYXRlcywgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlOiA8L3A+CiAKICAgPHA+QW4gYXBwbGljYXRpb24gZGVjbGFyaW5nIDxjb2RlPm1heFNka1ZlcnNpb249IjUiPC9jb2RlPiBpbiBpdHMKLSAgbWFuaWZlc3QgaXMgcHVibGlzaGVkIG9uIEFuZHJvaWQgTWFya2V0LiBBIHVzZXIgd2hvc2UgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZAorICBtYW5pZmVzdCBpcyBwdWJsaXNoZWQgb24gR29vZ2xlIFBsYXkuIEEgdXNlciB3aG9zZSBkZXZpY2UgaXMgcnVubmluZyBBbmRyb2lkCiAgIDEuNiAoQVBJIExldmVsIDQpIGRvd25sb2FkcyBhbmQgaW5zdGFsbHMgdGhlIGFwcC4gQWZ0ZXIgYSBmZXcgd2Vla3MsIHRoZSB1c2VyCiAgIHJlY2VpdmVzIGFuIG92ZXItdGhlLWFpciBzeXN0ZW0gdXBkYXRlIHRvIEFuZHJvaWQgMi4wIChBUEkgTGV2ZWwgNSkuIEFmdGVyIHRoZQogICB1cGRhdGUgaXMgaW5zdGFsbGVkLCB0aGUgc3lzdGVtIGNoZWNrcyB0aGUgYXBwbGljYXRpb24ncwpAQCAtMTQzLDcgKzE0Myw3IEBACiAKICAgPGRpdiBjbGFzcz0ic3BlY2lhbCI+RnV0dXJlIHZlcnNpb25zIG9mIEFuZHJvaWQgKGJleW9uZCBBbmRyb2lkIDIuMC4xKSB3aWxsIG5vCiBsb25nZXIgY2hlY2sgb3IgZW5mb3JjZSB0aGUgPGNvZGU+bWF4U2RrVmVyc2lvbjwvY29kZT4gYXR0cmlidXRlIGR1cmluZwotaW5zdGFsbGF0aW9uIG9yIHJlLXZhbGlkYXRpb24uIEFuZHJvaWQgTWFya2V0IHdpbGwgY29udGludWUgdG8gdXNlIHRoZSBhdHRyaWJ1dGUKK2luc3RhbGxhdGlvbiBvciByZS12YWxpZGF0aW9uLiBHb29nbGUgUGxheSB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUgYXR0cmlidXRlCiBhcyBhIGZpbHRlciwgaG93ZXZlciwgd2hlbiBwcmVzZW50aW5nIHVzZXJzIHdpdGggYXBwbGljYXRpb25zIGF2YWlsYWJsZSBmb3IKIGRvd25sb2FkLiA8L2Rpdj4KICAgPC9kZD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWVkaWEvY2FtZXJhLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tZWRpYS9jYW1lcmEuamQKaW5kZXggNGU5MjhiMy4uN2Q3MjQ5MSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tZWRpYS9jYW1lcmEuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tZWRpYS9jYW1lcmEuamQKQEAgLTEzMSwxMSArMTMxLDExIEBACiAgIDxwPkZvciBhIGxpc3Qgb2YgY2FtZXJhIGZlYXR1cmVzLCBzZWUgdGhlIG1hbmlmZXN0CiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtZmVhdHVyZS1lbGVtZW50Lmh0bWwjaHctZmVhdHVyZXMiPkZlYXR1cmVzCiBSZWZlcmVuY2U8L2E+LjwvcD4KLSAgPHA+QWRkaW5nIGNhbWVyYSBmZWF0dXJlcyB0byB5b3VyIG1hbmlmZXN0IGNhdXNlcyBBbmRyb2lkIE1hcmtldCB0byBwcmV2ZW50IHlvdXIgYXBwbGljYXRpb24gZnJvbQorICA8cD5BZGRpbmcgY2FtZXJhIGZlYXR1cmVzIHRvIHlvdXIgbWFuaWZlc3QgY2F1c2VzIEdvb2dsZSBQbGF5IHRvIHByZXZlbnQgeW91ciBhcHBsaWNhdGlvbiBmcm9tCiBiZWluZyBpbnN0YWxsZWQgdG8gZGV2aWNlcyB0aGF0IGRvIG5vdCBpbmNsdWRlIGEgY2FtZXJhIG9yIGRvIG5vdCBzdXBwb3J0IHRoZSBjYW1lcmEgZmVhdHVyZXMgeW91Ci1zcGVjaWZ5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyBmZWF0dXJlLWJhc2VkIGZpbHRlcmluZyB3aXRoIEFuZHJvaWQgTWFya2V0LCBzZWUgPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuaHRtbCNtYXJrZXQtZmVhdHVyZS1maWx0ZXJpbmciPkFuZHJvaWQKLU1hcmtldCBhbmQgRmVhdHVyZS1CYXNlZCBGaWx0ZXJpbmc8L2E+LjwvcD4KK3NwZWNpZnkuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIGZlYXR1cmUtYmFzZWQgZmlsdGVyaW5nIHdpdGggR29vZ2xlIFBsYXksIHNlZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5odG1sI21hcmtldC1mZWF0dXJlLWZpbHRlcmluZyI+R29vZ2xlCitQbGF5IGFuZCBGZWF0dXJlLUJhc2VkIEZpbHRlcmluZzwvYT4uPC9wPgogICA8cD5JZiB5b3VyIGFwcGxpY2F0aW9uIDxlbT5jYW4gdXNlPC9lbT4gYSBjYW1lcmEgb3IgY2FtZXJhIGZlYXR1cmUgZm9yIHByb3BlciBvcGVyYXRpb24sIGJ1dCBkb2VzCiBub3QgPGVtPnJlcXVpcmU8L2VtPiBpdCwgeW91IHNob3VsZCBzcGVjaWZ5IHRoaXMgaW4gdGhlIG1hbmlmZXN0IGJ5IGluY2x1ZGluZyB0aGUge0Bjb2RlCiBhbmRyb2lkOnJlcXVpcmVkfSBhdHRyaWJ1dGUsIGFuZCBzZXR0aW5nIGl0IHRvIHtAY29kZSBmYWxzZX06PC9wPgpAQCAtNDQyLDcgKzQ0Miw3IEBACiB0aGUgZmlyc3QsIGJhY2stZmFjaW5nIGNhbWVyYSBvbiBhIGRldmljZSB3aXRoIG1vcmUgdGhhbiBvbmUgY2FtZXJhLjwvcD4KIAogPGgzIGlkPSJjaGVjay1jYW1lcmEtZmVhdHVyZXMiPkNoZWNraW5nIGNhbWVyYSBmZWF0dXJlczwvaDM+Ci08cD5PbmNlIHlvdSBvYnRhaW4gYWNjZXNzIHRvIGEgY2FtZXJhLCB5b3UgY2FuIGdldCBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjYXBhYmlsdGllcyB1c2luZworPHA+T25jZSB5b3Ugb2J0YWluIGFjY2VzcyB0byBhIGNhbWVyYSwgeW91IGNhbiBnZXQgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBpdHMgY2FwYWJpbGl0aWVzIHVzaW5nCiB0aGUge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhI2dldFBhcmFtZXRlcnMoKSBDYW1lcmEuZ2V0UGFyYW1ldGVycygpfSBtZXRob2QgYW5kIGNoZWNraW5nIHRoZQogcmV0dXJuZWQge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLlBhcmFtZXRlcnN9IG9iamVjdCBmb3Igc3VwcG9ydGVkIGNhcGFiaWxpdGllcy4gV2hlbiB1c2luZwogQVBJIExldmVsIDkgb3IgaGlnaGVyLCB1c2UgdGhlIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSNnZXRDYW1lcmFJbmZvKGludCwKQEAgLTY3Nyw4ICs2NzcsOCBAQAogPHByZT4KIC8vIEFkZCBhIGxpc3RlbmVyIHRvIHRoZSBDYXB0dXJlIGJ1dHRvbgogQnV0dG9uIGNhcHR1cmVCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoaWQuYnV0dG9uX2NhcHR1cmUpOwotICAgIGNhcHR1cmVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKAotICAgICAgICBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CitjYXB0dXJlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcigKKyAgICBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgICYjNjQ7T3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKICAgICAgICAgICAgIC8vIGdldCBhbiBpbWFnZSBmcm9tIHRoZSBjYW1lcmEKQEAgLTEyNjAsNyArMTI2MCw3IEBACiAKIDxwPklmIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMgY2VydGFpbiBjYW1lcmEgZmVhdHVyZXMgaW4gb3JkZXIgdG8gZnVuY3Rpb24gcHJvcGVybHksIHlvdSBjYW4KIHJlcXVpcmUgdGhlbSB0aHJvdWdoIGFkZGl0aW9ucyB0byB5b3VyIGFwcGxpY2F0aW9uIG1hbmlmZXN0LiBXaGVuIHlvdSBkZWNsYXJlIHRoZSB1c2Ugb2Ygc3BlY2lmaWMKLWNhbWVyYSBmZWF0dXJlcywgc3VjaCBhcyBmbGFzaCBhbmQgYXV0by1mb2N1cywgdGhlIEFuZHJvaWQgTWFya2V0IHJlc3RyaWN0cyB5b3VyIGFwcGxpY2F0aW9uIGZyb20KK2NhbWVyYSBmZWF0dXJlcywgc3VjaCBhcyBmbGFzaCBhbmQgYXV0by1mb2N1cywgR29vZ2xlIFBsYXkgcmVzdHJpY3RzIHlvdXIgYXBwbGljYXRpb24gZnJvbQogYmVpbmcgaW5zdGFsbGVkIG9uIGRldmljZXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgdGhlc2UgZmVhdHVyZXMuIEZvciBhIGxpc3Qgb2YgY2FtZXJhIGZlYXR1cmVzIHRoYXQKIGNhbiBiZSBkZWNsYXJlZCBpbiB5b3VyIGFwcCBtYW5pZmVzdCwgc2VlIHRoZSBtYW5pZmVzdAogPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5odG1sI2h3LWZlYXR1cmVzIj4gRmVhdHVyZXMKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbmV0d29yay9zaXAuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL25ldHdvcmsvc2lwLmpkCmluZGV4IDI3NmFkYjYuLjYwMGRhNzggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbmV0d29yay9zaXAuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9uZXR3b3JrL3NpcC5qZApAQCAtMTQ3LDcgKzE0Nyw3IEBACiA8L3VsPgogCiA8cD5UbyBjb250cm9sIGhvdyB5b3VyIGFwcGxpY2F0aW9uIGlzIGZpbHRlcmVkIGZyb20gZGV2aWNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0Ci1TSVAgKGZvciBleGFtcGxlLCBpbiBBbmRyb2lkIE1hcmtldCksIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgYXBwbGljYXRpb24ncworU0lQIChmb3IgZXhhbXBsZSwgb24gR29vZ2xlIFBsYXkpLCBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIGFwcGxpY2F0aW9uJ3MKIG1hbmlmZXN0OjwvcD4KIAogPHVsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9uZmMvbmZjLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9uZmMvbmZjLmpkCmluZGV4IDgzODczYzMuLjgzNDY1NmEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbmZjL25mYy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL25mYy9uZmMuamQKQEAgLTMxOCw4ICszMTgsOCBAQAogPC9wcmU+CiAgICAgPC9saT4KIAotICAgIDxsaT5UaGUgPGNvZGU+dXNlcy1mZWF0dXJlPC9jb2RlPiBlbGVtZW50IHNvIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBzaG93cyB1cCBpbiB0aGUgQW5kcm9pZAotTWFya2V0IG9ubHkgZm9yIGRldmljZXMgdGhhdCBoYXZlIE5GQyBoYXJkd2FyZToKKyAgICA8bGk+VGhlIDxjb2RlPnVzZXMtZmVhdHVyZTwvY29kZT4gZWxlbWVudCBzbyB0aGF0IHlvdXIgYXBwbGljYXRpb24gc2hvd3MgdXAgaW4gR29vZ2xlCitQbGF5IG9ubHkgZm9yIGRldmljZXMgdGhhdCBoYXZlIE5GQyBoYXJkd2FyZToKICAgICAgIDxwcmU+CiAmbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5uZmMiIGFuZHJvaWQ6cmVxdWlyZWQ9InRydWUiIC8mZ3Q7CiA8L3ByZT4KQEAgLTY2MCw3ICs2NjAsNyBAQAogb2YgYW4gYXBwbGljYXRpb24gZW1iZWRkZWQgaW5zaWRlIGFuIE5ERUYgcmVjb3JkLiBZb3UgY2FuIGFkZCBhbiBBQVIgdG8gYW55IE5ERUYgcmVjb3JkIG9mIHlvdXIgTkRFRiBtZXNzYWdlLAogYmVjYXVzZSBBbmRyb2lkIHNlYXJjaGVzIHRoZSBlbnRpcmUgTkRFRiBtZXNzYWdlIGZvciBBQVJzLiBJZiBpdCBmaW5kcyBhbiBBQVIsIGl0IHN0YXJ0cyB0aGUgYXBwbGljYXRpb24gYmFzZWQKIG9uIHRoZSBwYWNrYWdlIG5hbWUgaW5zaWRlIHRoZSBBQVIuIElmIHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgcHJlc2VudCBvbiB0aGUgZGV2aWNlLAotQW5kcm9pZCBNYXJrZXQgaXMgbGF1bmNoZWQgdG8gZG93bmxvYWQgdGhlIGFwcGxpY2F0aW9uLjwvcD4KK0dvb2dsZSBQbGF5IGlzIGxhdW5jaGVkIHRvIGRvd25sb2FkIHRoZSBhcHBsaWNhdGlvbi48L3A+CiAKIDxwPkFBUnMgYXJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IG90aGVyIGFwcGxpY2F0aW9ucyBmcm9tIGZpbHRlcmluZyBmb3IgdGhlIHNhbWUgaW50ZW50IGFuZAogcG90ZW50aWFsbHkgaGFuZGxpbmcgc3BlY2lmaWMgdGFncyB0aGF0IHlvdSBoYXZlIGRlcGxveWVkLiBBQVJzIGFyZSBvbmx5IHN1cHBvcnRlZCBhdCB0aGUKQEAgLTY3OCw3ICs2NzgsNyBAQAogICA8bGk+SWYgdGhlIEFjdGl2aXR5IHRoYXQgZmlsdGVycyBmb3IgdGhlIGludGVudCBkb2VzIG5vdCBtYXRjaCB0aGUKIEFBUiwgaWYgbXVsdGlwbGUgQWN0aXZpdGllcyBjYW4gaGFuZGxlIHRoZSBpbnRlbnQsIG9yIGlmIG5vIEFjdGl2aXR5IGhhbmRsZXMgdGhlIGludGVudCwgc3RhcnQgdGhlCiBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIEFBUi48L2xpPgotICA8bGk+SWYgbm8gYXBwbGljYXRpb24gY2FuIHN0YXJ0IHdpdGggdGhlIEFBUiwgZ28gdG8gdGhlIEFuZHJvaWQgTWFya2V0IHRvIGRvd25sb2FkIHRoZQorICA8bGk+SWYgbm8gYXBwbGljYXRpb24gY2FuIHN0YXJ0IHdpdGggdGhlIEFBUiwgZ28gdG8gR29vZ2xlIFBsYXkgdG8gZG93bmxvYWQgdGhlCiBhcHBsaWNhdGlvbiBiYXNlZCBvbiB0aGUgQUFSLjwvbGk+CiA8L29sPgogCkBAIC04OTcsNyArODk3LDcgQEAKIAogPHA+Tm90ZSB0aGF0IHRoaXMgY29kZSBjb21tZW50cyBvdXQgYW4gQUFSLCB3aGljaCB5b3UgY2FuIHJlbW92ZS4gSWYgeW91IGVuYWJsZSB0aGUgQUFSLCB0aGUKIGFwcGxpY2F0aW9uIHNwZWNpZmllZCBpbiB0aGUgQUFSIGFsd2F5cyByZWNlaXZlcyB0aGUgQW5kcm9pZCBCZWFtIG1lc3NhZ2UuIElmIHRoZSBhcHBsaWNhdGlvbiBpcyBub3QKLXByZXNlbnQsIHRoZSBBbmRyb2lkIE1hcmtldCBpcyBzdGFydGVkIHRvIGRvd25sb2FkIHRoZSBhcHBsaWNhdGlvbi4gVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIGludGVudAorcHJlc2VudCwgR29vZ2xlIFBsYXkgbGF1bmNoZXMgdG8gZG93bmxvYWQgdGhlIGFwcGxpY2F0aW9uLiBUaGVyZWZvcmUsIHRoZSBmb2xsb3dpbmcgaW50ZW50CiBmaWx0ZXIgaXMgbm90IHRlY2huaWNhbGx5IG5lY2Vzc2FyeSBmb3IgQW5kcm9pZCA0LjAgZGV2aWNlcyBvciBsYXRlciBpZiB0aGUgQUFSIGlzIHVzZWQ6CiA8L3A+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL2xvY2FsaXphdGlvbi5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL2xvY2FsaXphdGlvbi5qZAppbmRleCA5YWZmYjE1Li5jMmI2NjhkIDEwMDc1NQotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9sb2NhbGl6YXRpb24uamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvbG9jYWxpemF0aW9uLmpkCkBAIC0xODYsNyArMTg2LDcgQEAKIAlhbmQgY2FuIGluY2x1ZGUgb3RoZXIgdHlwZXMgb2YgcmVzb3VyY2VzIHN1Y2ggYXMgYW5pbWF0aW9ucy4gDQogPGJyPg0KICAgPGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cmVzL2RyYXdhYmxlLzwvY29kZT4ocmVxdWlyZWQgZGlyZWN0b3J5IGhvbGRpbmcgYXQgbGVhc3QNCi0gIG9uZSBncmFwaGljIGZpbGUsIGZvciB0aGUgYXBwbGljYXRpb24ncyBpY29uIGluIHRoZSBNYXJrZXQpPGJyPg0KKyAgb25lIGdyYXBoaWMgZmlsZSwgZm9yIHRoZSBhcHBsaWNhdGlvbidzIGljb24gb24gR29vZ2xlIFBsYXkpPGJyPg0KICAgPGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cmVzL2xheW91dC88L2NvZGU+IChyZXF1aXJlZCBkaXJlY3RvcnkgaG9sZGluZyBhbiBYTUwNCiAgIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBkZWZhdWx0IGxheW91dCk8YnI+DQogICA8Y29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtyZXMvYW5pbS88L2NvZGU+IChyZXF1aXJlZCBpZiB5b3UgaGF2ZSBhbnkgDQpAQCAtNTA3LDcgKzUwNyw3IEBACiANCiA8aDIgaWQ9InB1Ymxpc2hpbmciPlB1Ymxpc2hpbmcgTG9jYWxpemVkIEFwcGxpY2F0aW9uczwvaDI+DQogDQotPHA+VGhlIEFuZHJvaWQgTWFya2V0IGlzDQorPHA+VGhlIEdvb2dsZSBQbGF5IGlzDQogICB0aGUgbWFpbiBhcHBsaWNhdGlvbiBkaXN0cmlidXRpb24gc3lzdGVtIGZvciBBbmRyb2lkIGRldmljZXMuIFRvIHB1Ymxpc2ggYSANCiAgIGxvY2FsaXplZCBhcHBsaWNhdGlvbiwgeW91IG5lZWQgdG8gc2lnbiB5b3VyIGFwcGxpY2F0aW9uLCB2ZXJzaW9uIGl0LCBhbmQgZ28NCiB0aHJvdWdoIGFsbCB0aGUgb3RoZXIgc3RlcHMgZGVzY3JpYmVkIGluIDxhDQpAQCAtNTIxLDcgKzUyMSw3IEBACiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9hcHAtc2lnbmluZy5odG1sI3N0cmF0ZWdpZXMiPlNpZ25pbmcNCiBTdHJhdGVnaWVzPC9hPi4gPC9saT4NCiAgIDxsaT5HaXZlIGVhY2ggLmFwayBmaWxlIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIG5hbWUuIEN1cnJlbnRseSBpdCBpcw0KLWltcG9zc2libGUgdG8gcHV0IHR3byBhcHBsaWNhdGlvbnMgaW50byB0aGUgQW5kcm9pZCBNYXJrZXQgdGhhdCBoYXZlIGV4YWN0bHkgdGhlDQoraW1wb3NzaWJsZSB0byBwdWJsaXNoIHR3byBhcHBsaWNhdGlvbnMgb24gR29vZ2xlIFBsYXkgdGhhdCBoYXZlIGV4YWN0bHkgdGhlDQogc2FtZSBuYW1lLjwvbGk+DQogPGxpPkluY2x1ZGUgYSBjb21wbGV0ZSBzZXQgb2YgZGVmYXVsdCByZXNvdXJjZXMgaW4gZWFjaCAuYXBrIGZpbGUuPC9saT4NCiA8L3VsPg0KQEAgLTYzOCw3ICs2MzgsNyBAQAogICA8dHI+DQogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9Ii4uLy4uLy4uL2ltYWdlcy9yZXNvdXJjZXMvYXJyb3cucG5nIiBhbHQ9ImFycm93IiB3aWR0aD0iMjYiDQogYm9yZGVyPSIwIj48L3RkPg0KLSAgICA8dGQ+VXBsb2FkIHlvdXIgLmFwayBmaWxlIG9yIGZpbGVzIHRvIE1hcmtldCwgc2VsZWN0aW5nIHRoZSBhcHByb3ByaWF0ZQ0KKyAgICA8dGQ+VXBsb2FkIHlvdXIgLmFwayBmaWxlIG9yIGZpbGVzIHRvIEdvb2dsZSBQbGF5LCBzZWxlY3RpbmcgdGhlIGFwcHJvcHJpYXRlDQogbGFuZ3VhZ2VzIGFzDQogICAgIHlvdSB1cGxvYWQuIChGb3IgbW9yZSBkZXRhaWxzLCBzZWUgPGENCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPlB1Ymxpc2hpbmcgWW91cg0KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3Mvc2Vuc29ycy9zZW5zb3JzX292ZXJ2aWV3LmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9zZW5zb3JzL3NlbnNvcnNfb3ZlcnZpZXcuamQKaW5kZXggM2M1ZTk0Yy4uNTQzODcyYyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9zZW5zb3JzL3NlbnNvcnNfb3ZlcnZpZXcuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9zZW5zb3JzL3NlbnNvcnNfb3ZlcnZpZXcuamQKQEAgLTYwNiw3ICs2MDYsNyBAQAogdGhhdCBhIGdpdmVuIHNlbnNvciBpcyBwcmVzZW50IG9uIGEgZGV2aWNlOjwvcD4KIDx1bD4KICAgPGxpPkRldGVjdCBzZW5zb3JzIGF0IHJ1bnRpbWUgYW5kIGVuYWJsZSBvciBkaXNhYmxlIGFwcGxpY2F0aW9uIGZlYXR1cmVzIGFzIGFwcHJvcHJpYXRlLjwvbGk+Ci0gIDxsaT5Vc2UgQW5kcm9pZCBNYXJrZXQgZmlsdGVycyB0byB0YXJnZXQgZGV2aWNlcyB3aXRoIHNwZWNpZmljIHNlbnNvciBjb25maWd1cmF0aW9ucy48L2xpPgorICA8bGk+VXNlIEdvb2dsZSBQbGF5IGZpbHRlcnMgdG8gdGFyZ2V0IGRldmljZXMgd2l0aCBzcGVjaWZpYyBzZW5zb3IgY29uZmlndXJhdGlvbnMuPC9saT4KIDwvdWw+CiAKIDxwPkVhY2ggb3B0aW9uIGlzIGRpc2N1c3NlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLjwvcD4KQEAgLTYzMyw5ICs2MzMsOSBAQAogICB9CiA8L3ByZT4KIAotPGg0PlVzaW5nIEFuZHJvaWQgTWFya2V0IGZpbHRlcnMgdG8gdGFyZ2V0IHNwZWNpZmljIHNlbnNvciBjb25maWd1cmF0aW9uczwvaDQ+Cis8aDQ+VXNpbmcgR29vZ2xlIFBsYXkgZmlsdGVycyB0byB0YXJnZXQgc3BlY2lmaWMgc2Vuc29yIGNvbmZpZ3VyYXRpb25zPC9oND4KIAotPHA+SWYgeW91IGFyZSBwdWJsaXNoaW5nIHlvdXIgYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQgeW91IGNhbiB1c2UgdGhlCis8cD5JZiB5b3UgYXJlIHB1Ymxpc2hpbmcgeW91ciBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheSB5b3UgY2FuIHVzZSB0aGUKICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlLy90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDsKICAgICA8L2NvZGU+PC9hPiBlbGVtZW50IGluIHlvdXIgbWFuaWZlc3QgZmlsZSB0byBmaWx0ZXIgeW91ciBhcHBsaWNhdGlvbiBmcm9tIGRldmljZXMgdGhhdCBkbyBub3QKIGhhdmUgdGhlIGFwcHJvcHJpYXRlIHNlbnNvciBjb25maWd1cmF0aW9uIGZvciB5b3VyIGFwcGxpY2F0aW9uLiBUaGUKQEAgLTY1MCw3ICs2NTAsNyBAQAogPC9wcmU+CiAKIDxwPklmIHlvdSBhZGQgdGhpcyBlbGVtZW50IGFuZCBkZXNjcmlwdG9yIHRvIHlvdXIgYXBwbGljYXRpb24ncyBtYW5pZmVzdCwgdXNlcnMgd2lsbCBzZWUgeW91cgotYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQgb25seSBpZiB0aGVpciBkZXZpY2UgaGFzIGFuIGFjY2VsZXJvbWV0ZXIuPC9wPgorYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkgb25seSBpZiB0aGVpciBkZXZpY2UgaGFzIGFuIGFjY2VsZXJvbWV0ZXIuPC9wPgogCiA8cD5Zb3Ugc2hvdWxkIHNldCB0aGUgZGVzY3JpcHRvciB0byA8Y29kZT5hbmRyb2lkOnJlcXVpcmVkPSJ0cnVlIjwvY29kZT4gb25seSBpZiB5b3VyIGFwcGxpY2F0aW9uCiByZWxpZXMgZW50aXJlbHkgb24gYSBzcGVjaWZpYyBzZW5zb3IuIElmIHlvdXIgYXBwbGljYXRpb24gdXNlcyBhIHNlbnNvciBmb3Igc29tZSBmdW5jdGlvbmFsaXR5LCBidXQKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdWkvYWN0aW9uYmFyLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9hY3Rpb25iYXIuamQKaW5kZXggZTU5ZmEwZi4uYmY3MzY5YSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9hY3Rpb25iYXIuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9hY3Rpb25iYXIuamQKQEAgLTM0OSw3ICszNDksNyBAQAogICA8bGk+PHN0cm9uZz5GcmVxdWVudGx5IHVzZWQ8L3N0cm9uZz46IEl0J3MgYW4gYWN0aW9uIHRoYXQgeW91ciB1c2VycyBuZWVkIHNldmVuIG91dCBvZiB0ZW4gdmlzaXRzCiBvciB0aGV5IHVzZSBpdCBzZXZlcmFsIHRpbWVzIGluIGEgcm93LgogICAgIDxwPkV4YW1wbGUgZnJlcXVlbnQgYWN0aW9uczogIk5ldyBtZXNzYWdlIiBpbiB0aGUgTWVzc2FnaW5nIGFwcCBhbmQKLSJTZWFyY2giIGluIEFuZHJvaWQgTWFya2V0LjwvcD4KKyJTZWFyY2giIG9uIEdvb2dsZSBQbGF5LjwvcD4KICAgPC9saT4KIAogICA8bGk+PHN0cm9uZz5JbXBvcnRhbnQ8L3N0cm9uZz46IEl0J3MgYW4gYWN0aW9uIHRoYXQgeW91IG5lZWQgdXNlcnMgdG8gZWFzaWx5IGRpc2NvdmVyIG9yLCBpZiBpdCdzCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VzYi9hZGsuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VzYi9hZGsuamQKaW5kZXggNGQ1ZmJmYS4uYzg5NDlhMyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91c2IvYWRrLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdXNiL2Fkay5qZApAQCAtOTcsNiArOTcsOSBAQAogICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuc3BhcmtmdW4uY29tL3Byb2R1Y3RzLzEwNzQ4Ij4KICAgICAgICAgU3BhcmtGdW48L2E+PC9saT4KIAorICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90cm9pZG8uZGUvZGUvc2hvcGxzbWFsbGdidXktYW5kcm9pZC1zdHVmZmxzbWFsbGciPgorICAgICAgICBUcm9pZG88L2E+PC9saT4KKwogICAgICAgPC9vbD4KICAgICA8L2Rpdj4KICAgPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL2hvbWUvcGxheV9sb2dvLnBuZyBiL2RvY3MvaHRtbC9pbWFnZXMvaG9tZS9wbGF5X2xvZ28ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTNlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvaW1hZ2VzL2hvbWUvcGxheV9sb2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW5kZXguamQgYi9kb2NzL2h0bWwvaW5kZXguamQKaW5kZXggNDMxYTdkMi4uY2ZkOWZmMSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9pbmRleC5qZApAQCAtMTMsMTQgKzEzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iYW5ub3VuY2VtZW50LWJsb2NrIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRvdGFsIG1heCB3aWR0aCBpcyA1MjBweCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWRlc2lnbi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy9ob21lL2FuZHJvaWQtZGVzaWduLnBuZyIKLWFsdD0iQW5kcm9pZCBEZXNpZ24iIHdpZHRoPSIxNjBweCIgc3R5bGU9InBhZGRpbmc6MTBweCAzM3B4IDVweCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2hvbWUvcGxheV9sb2dvLnBuZyIKK2FsdD0iR29vZ2xlIFBsYXkiIHdpZHRoPSIxMjBweCIgc3R5bGU9InBhZGRpbmc6MTBweCA1MnB4Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJhbm5vdW5jZW1lbnQiIHN0eWxlPSJ3aWR0aDoyNzVweCI+Ci0gICAgPHA+SW50cm9kdWNpbmcgPGI+QW5kcm9pZCBEZXNpZ248L2I+OiBUaGUgcGxhY2UgdG8gbGVhcm4gYWJvdXQgcHJpbmNpcGxlcywgYnVpbGRpbmcgYmxvY2tzLCBhbmQgcGF0dGVybnMKLSAgICAgIGZvciBjcmVhdGluZyB3b3JsZC1jbGFzcyBBbmRyb2lkIHVzZXIgaW50ZXJmYWNlcy4gV2hldGhlciB5b3UncmUgYSBVSSBwcm9mZXNzaW9uYWwgb3IgYSBkZXZlbG9wZXIKLSAgICAgIHBsYXlpbmcgdGhhdCByb2xlLCB0aGVzZSBkb2NzIHNob3cgeW91IGhvdyB0byBtYWtlIGdvb2QgZGVzaWduIGRlY2lzaW9ucywgYmlnIGFuZCBzbWFsbC48L3A+Ci0gICAgPHA+PGEgaHJlZj0ie0Bkb2NSb290fWRlc2lnbi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbiAmcmFxdW87PC9hPjwvcD4KKyAgICA8cD5JbnRyb2R1Y2luZyA8c3Ryb25nPkdvb2dsZSBQbGF5PC9zdHJvbmc+OiBBbiBpbnRlZ3JhdGVkIGRpZ2l0YWwgY29udGVudCBkZXN0aW5hdGlvbiB3aGVyZQordXNlcnMgYnV5IGFuZCBlbmpveSBhbGwgb2YgdGhlaXIgZmF2b3JpdGUgY29udGVudCBpbiBvbmUgcGxhY2UuIEl0J3MgdGhlIG5ldyBkZXN0aW5hdGlvbiBmb3IKK0FuZHJvaWQgYXBwcyE8L3A+CisgICAgPHA+PGEgaHJlZj0iaHR0cDovL2FuZHJvaWQtZGV2ZWxvcGVycy5ibG9nc3BvdC5jb20vMjAxMi8wMy9pbnRyb2R1Y2luZy1nb29nbGUtcGxheS5odG1sIj5SZWFkIG1vcmUgJnJhcXVvOzwvYT48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiA8IS0tIGVuZCBhbm5vdWNlbWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gPCEtLSBlbmQgYW5ub3VjZW1lbnQtYmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj48IS0tIGVuZCB0b3BBbm5vdW5jZW1lbnQgLS0+CkBAIC01OSwxMSArNTksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxkaXYgY2xhc3M9InNlcGVyYXRvciI+Jm5ic3A7PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iaW1hZ2VDZWxsIj48YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2giPjxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGciIHN0eWxlPSJwYWRkaW5nOjAiIC8+PC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iaW1hZ2VDZWxsIj48YSBocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaCI+PGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fcGxheS5wbmciIHN0eWxlPSJwYWRkaW5nOjAiIC8+PC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9ImdyZWVuIj5QdWJsaXNoPC9oMj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbmRyb2lkIE1hcmtldCBpcyBhbiBvcGVuIHNlcnZpY2UgdGhhdCBsZXRzIHlvdSBkaXN0cmlidXRlIHlvdXIgYXBwcyB0byBoYW5kc2V0cy48L3A+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGEgaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9wdWJsaXNoIj5MZWFybiBtb3JlICZyYXF1bzs8L2E+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkdvb2dsZSBQbGF5IGlzIGFuIG9wZW4gc2VydmljZSB0aGF0IGxldHMgeW91IGRpc3RyaWJ1dGUgeW91ciBhcHBzIHRvIGRldmljZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxhIGhyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoIj5MZWFybiBtb3JlICZyYXF1bzs8L2E+PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KQEAgLTE4Miw4ICsxODIsOCBAQAogICAgICAgJ2Rlc2MnOiAiPHA+UnVuIGFuZCBkZWJ1ZyB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb25zIGRpcmVjdGx5IG9uIG9uZSBvZiB0aGVzZSAiCiAgKyAiZGV2aWNlcy4gTW9kaWZ5IGFuZCByZWJ1aWxkIHRoZSBBbmRyb2lkIG9wZXJhdGluZyBzeXN0ZW0sIGFuZCBmbGFzaCBpdCBvbnRvICIKICArICJ0aGUgcGhvbmUuIFRoZSBBbmRyb2lkIERldiBQaG9uZXMgYXJlIGNhcnJpZXItaW5kZXBlbmRlbnQsIGFuZCBhdmFpbGFibGUgZm9yICIKLSArICJwdXJjaGFzZSBieSBkZXZlbG9wZXJzIHRocm91Z2ggdGhlaXIgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIGFjY291bnRzLjwvcD48cD4gIgotICsgIjxhIGhyZWY9J2h0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaCc+VmlzaXQgQW5kcm9pZCBNYXJrZXQgIgorICsgInB1cmNoYXNlIGJ5IGRldmVsb3BlcnMgdGhyb3VnaCB0aGVpciBHb29nbGUgUGxheSBwdWJsaXNoZXIgYWNjb3VudHMuPC9wPjxwPiAiCisgKyAiPGEgaHJlZj0naHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2gnPlZpc2l0IEdvb2dsZSBQbGF5ICIKICArICJ0byBsZWFybiBtb3JlICZyYXF1bzs8L2E+PC9wPiIKICAgICB9LAogICAgICovCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW50bC9qYS9jb21tdW5pdHkvaW5kZXguamQgYi9kb2NzL2h0bWwvaW50bC9qYS9jb21tdW5pdHkvaW5kZXguamQKaW5kZXggNDkwYjIzZi4uOTczOWYwZCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2ludGwvamEvY29tbXVuaXR5L2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9pbnRsL2phL2NvbW11bml0eS9pbmRleC5qZApAQCAtODUsNyArODUsNyBAQAogCiA8bGk+PGI+QW5kcm9pZCDjg57jg7zjgrHjg4Pjg4gg44OY44Or44OX44OV44Kp44O844Op44OgPC9iPiAtIEFuZHJvaWQg44Oe44O844Kx44OD44OI44Gr6Zai44GZ44KL6LOq5ZWP44KE5ZWP6aGM44Gu5aCx5ZGK44KS44GZ44KL44Gf44KB44Gu44CB44Km44Kn44OW44OZ44O844K544Gu44OH44Kj44K544Kr44OD44K344On44OzIOODleOCqeODvOODqeODoOOBp+OBmeOAggogPHVsPgotPGxpPlVSTDombmJzcDs8YSBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc3VwcG9ydC9mb3J1bS9wL0FuZHJvaWQrTWFya2V0P2hsPWphIj5odHRwOi8vd3d3Lmdvb2dsZS5jb20vc3VwcG9ydC9mb3J1bS9wL0FuZHJvaWQrTWFya2V0P2hsPWphPC9hPjwvbGk+Cis8bGk+VVJMOiZuYnNwOzxhIGhyZWY9Imh0dHA6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vZ29vZ2xlcGxheT9obD1qYSI+aHR0cDovL3N1cHBvcnQuZ29vZ2xlLmNvbS9nb29nbGVwbGF5P2hsPWphPC9hPjwvbGk+CiA8L3VsPgogPC9saT4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2ludGwvamEvaW5kZXguamQgYi9kb2NzL2h0bWwvaW50bC9qYS9pbmRleC5qZAppbmRleCA4MDk2MjQ3Li5mYmJkODhmIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvaW50bC9qYS9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvaW50bC9qYS9pbmRleC5qZApAQCAtNTIsMTEgKzUyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48ZGl2IGNsYXNzPSJzZXBlcmF0b3IiPiZuYnNwOzwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImltYWdlQ2VsbCI+PGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9tYXJrZXQuaHRtbCI+PGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fbWFya2V0LmpwZyIgc3R5bGU9InBhZGRpbmc6MCIgLz48L2E+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJpbWFnZUNlbGwiPjxhIGhyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoIj48aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvaWNvbl9wbGF5LnBuZyIgc3R5bGU9InBhZGRpbmc6MCIgLz48L2E+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz0iZ3JlZW4iPuWFrOmWizwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW5kcm9pZCDjg57jg7zjgrHjg4Pjg4jjga/jgIHjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgpLmkLrluK/nq6/mnKvjgavphY3kv6HjgZnjgovjgZ/jgoHjga7jgqrjg7zjg5fjg7Mg44K144O844OT44K544Gn44GZ44CCPC9wPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxhIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaC9Ib21lIj7oqbPntLAgJnJhcXVvOzwvYT48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGEgaHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2giPuips+e0sCAmcmFxdW87PC9hPjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICAgICduYW1lJzoiRGV2IFBob25lIDEiLAogICAgICAgJ2ltZyc6ImRldnBob25lLWxhcmdlLnBuZyIsCiAgICAgICAndGl0bGUnOiJBbmRyb2lkIERldiBQaG9uZSAxIiwKLSAgICAgICdkZXNjJzogIjxwPuOBk+OBruaQuuW4r+mbu+ipseOCkuS9v+eUqOOBmeOCi+OBk+OBqOOBp+OAgemWi+eZuuOBl+OBnyBBbmRyb2lkIOOCouODl+ODquOCseODvOOCt+ODp+ODs+OBruWun+ihjOOBqOODh+ODkOODg+OCsOOCkuihjOOBhuOBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgkFuZHJvaWQg44Kq44Oa44Os44O844OG44Kj44Oz44Kw44K344K544OG44Og44KS5aSJ5pu044GX44Gm44GL44KJ44Oq44OT44Or44OJ44GX44CB5pC65biv6Zu76Kmx44Gr5pu444GN6L6844KA44GT44Go44GM44Gn44GN44G+44GZ44CCQW5kcm9pZCBEZXYgUGhvbmUgMSDjga/mkLrluK/pgJrkv6HkvJrnpL7jgavkvp3lrZjjgZfjgabjgYrjgonjgZrjgIE8YSBocmVmPSdodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2gnPkFuZHJvaWQg44Oe44O844Kx44OD44OIPC9hPuOBq+eZu+mMsua4iOOBv+OBruODh+ODmeODreODg+ODkeODvOOBquOCieiqsOOBp+OCguizvOWFpeWPr+iDveOBp+OBmeOAgjwvcD48cD48YSBocmVmPScvZ3VpZGUvZGV2ZWxvcGluZy9kZXZpY2UuaHRtbCNkZXYtcGhvbmUtMSc+QW5kcm9pZCBEZXYgUGhvbmUgMSDjga7oqbPntLAmcmFxdW87PC9hPjwvcD4iCisgICAgICAnZGVzYyc6ICI8cD7jgZPjga7mkLrluK/pm7voqbHjgpLkvb/nlKjjgZnjgovjgZPjgajjgafjgIHplovnmbrjgZfjgZ8gQW5kcm9pZCDjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7Pjga7lrp/ooYzjgajjg4fjg5Djg4PjgrDjgpLooYzjgYbjgZPjgajjgYzjgafjgY3jgb7jgZnjgIJBbmRyb2lkIOOCquODmuODrOODvOODhuOCo+ODs+OCsOOCt+OCueODhuODoOOCkuWkieabtOOBl+OBpuOBi+OCieODquODk+ODq+ODieOBl+OAgeaQuuW4r+mbu+ipseOBq+abuOOBjei+vOOCgOOBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgkFuZHJvaWQgRGV2IFBob25lIDEg44Gv5pC65biv6YCa5L+h5Lya56S+44Gr5L6d5a2Y44GX44Gm44GK44KJ44Ga44CBPGEgaHJlZj0naHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2gnPkFuZHJvaWQg44Oe44O844Kx44OD44OIPC9hPuOBq+eZu+mMsua4iOOBv+OBruODh+ODmeODreODg+ODkeODvOOBquOCieiqsOOBp+OCguizvOWFpeWPr+iDveOBp+OBmeOAgjwvcD48cD48YSBocmVmPScvZ3VpZGUvZGV2ZWxvcGluZy9kZXZpY2UuaHRtbCNkZXYtcGhvbmUtMSc+QW5kcm9pZCBEZXYgUGhvbmUgMSDjga7oqbPntLAmcmFxdW87PC9hPjwvcD4iCiAgICAgfQogCiAgIH0KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbnRsL2phL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkIGIvZG9jcy9odG1sL2ludGwvamEvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQKaW5kZXggZWNlZGRlMS4uM2ZkNjYwMSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2ludGwvamEvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQKKysrIGIvZG9jcy9odG1sL2ludGwvamEvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQKQEAgLTg1LDcgKzg1LDcgQEAKIAogPGxpPjxiPkFuZHJvaWQg44Oe44O844Kx44OD44OIIOODmOODq+ODl+ODleOCqeODvOODqeODoDwvYj4gLSBBbmRyb2lkIOODnuODvOOCseODg+ODiOOBq+mWouOBmeOCi+izquWVj+OChOWVj+mhjOOBruWgseWRiuOCkuOBmeOCi+OBn+OCgeOBruOAgeOCpuOCp+ODluODmeODvOOCueOBruODh+OCo+OCueOCq+ODg+OCt+ODp+ODsyDjg5Xjgqnjg7zjg6njg6DjgafjgZnjgIIKIDx1bD4KLTxsaT5VUkw6Jm5ic3A7PGEgaHJlZj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvZm9ydW0vcC9BbmRyb2lkK01hcmtldD9obD1qYSI+aHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvZm9ydW0vcC9BbmRyb2lkK01hcmtldD9obD1qYTwvYT48L2xpPgorPGxpPlVSTDombmJzcDs8YSBocmVmPSJodHRwOi8vc3VwcG9ydC5nb29nbGUuY29tL2dvb2dsZXBsYXk/aGw9amEiPmh0dHA6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vZ29vZ2xlcGxheT9obD1qYTwvYT48L2xpPgogPC91bD4KIDwvbGk+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvY2FuLWktdXNlLXRoaXMtaW50ZW50LmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9jYW4taS11c2UtdGhpcy1pbnRlbnQuamQKaW5kZXggYzUyNzMzMS4uNzc4N2QzMWUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvY2FuLWktdXNlLXRoaXMtaW50ZW50LmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvY2FuLWktdXNlLXRoaXMtaW50ZW50LmpkCkBAIC02OCw0ICs2OCw0IEBACiBVSSBhY2NvcmRpbmdseSB0byBwcmV2ZW50IHRoZSB1c2VyIGZyb20gZG9pbmcgc29tZXRoaW5nIHRoYXQgd29uJ3Qgd29yay4gVGhlCiB0ZWNobmlxdWUgZGVzY3JpYmVkIGhlcmUgY2FuIGFsc28gYmUgdXNlZCBhdCBzdGFydHVwIHRpbWUgdG8gYXNrIHRoZSB1c2VyCiB3aGV0aGVyIGhlJ2QgbGlrZSB0byBpbnN0YWxsIHRoZSBtaXNzaW5nIHBhY2thZ2UsIHlvdSBjYW4gdGhlbiBzaW1wbHkgcmVkaXJlY3QKLWhpbSB0byB0aGUgQW5kcm9pZCBNYXJrZXQgYnkgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFVSSS48L3A+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraGltIHRvIEdvb2dsZSBQbGF5IGJ5IHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBVUkkuPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvY29udGFjdHMuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2NvbnRhY3RzLmpkCmluZGV4IDgzNjVkMjkuLjM3NDU4N2IgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvY29udGFjdHMuamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9jb250YWN0cy5qZApAQCAtMjk4LDEwICsyOTgsMTAgQEAKICAgICAgIDxsaT5BdCBsYXVuY2ggdGltZSwgY2hlY2sgdGhlIHZlcnNpb24gb2YgdGhlIFNESy4gVGhlIHZlcnNpb24gb2YgdGhlIFNESyAKIGlzIGF2YWlsYWJsZSBhcyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OI1NESyBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLfS48L2xpPgogICAgICAgPGxpPklmIHRoZSBTREsgdmVyc2lvbiBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIDUgKEFuZHJvaWQgMi4wKSwgc2hvdyBhIGRpYWxvZyAKLXN1Z2dlc3RpbmcgdG8gdGhlIHVzZXIgdGhhdCBpdCdzIHRpbWUgdG8gZ28gdG8gTWFya2V0IGFuZCBmaW5kIGEgbmV3IHZlcnNpb24gb2YgCi10aGUgYXBwLiBZb3UgY2FuIGV2ZW4gcHJvdmlkZSBhIGxpbmsgdG8gdGhlIG5ldyBhcHAgb24gTWFya2V0IChzZWUgPGEgCitzdWdnZXN0aW5nIHRvIHRoZSB1c2VyIHRoYXQgaXQncyB0aW1lIHRvIGdvIHRvIEdvb2dsZSBQbGF5IGFuZCBmaW5kIGEgbmV3IHZlcnNpb24gb2YgCit0aGUgYXBwLiBZb3UgY2FuIGV2ZW4gcHJvdmlkZSBhIGxpbmsgdG8gdGhlIG5ldyBhcHAgb24gR29vZ2xlIFBsYXkgKHNlZSA8YSAKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCNtYXJrZXRpbnRlbnQiPlVzaW5nIEludGVudHMgCi10byBMYXVuY2ggTWFya2V0PC9hPikuIDwvbGk+Cit0byBMYXVuY2ggR29vZ2xlIFBsYXk8L2E+KS4gPC9saT4KICAgICA8L3VsPgogICA8bGk+Q2hhbmdlIHRoZSBuZXcgYXBwbGljYXRpb246PC9saT4KICAgICA8dWw+CkBAIC0zMTEsMTQgKzMxMSwxNCBAQAogICAgICAgPGxpPk1vZGlmeSB0aGF0IGFwcGxpY2F0aW9uJ3MgQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlOiA8L2xpPgogICAgICAgICA8dWw+CiAgICAgICAgICAgPGxpPkdpdmUgdGhlIGFwcGxpY2F0aW9uIGEgbmV3IG5hbWUgYW5kIGEgbmV3IHBhY2thZ2UgbmFtZS4gQ3VycmVudGx5IAotQW5kcm9pZCBNYXJrZXQgZG9lcyBub3QgYWxsb3cgeW91IHRvIGhhdmUgdHdvIGFwcGxpY2F0aW9ucyB3aXRoIHRoZSBzYW1lIAorR29vZ2xlIFBsYXkgZG9lcyBub3QgYWxsb3cgeW91IHRvIGhhdmUgdHdvIGFwcGxpY2F0aW9ucyB3aXRoIHRoZSBzYW1lIAogbmFtZS9wYWNrYWdlLjwvbGk+CiAgICAgICAgICAgPGxpPlVwZGF0ZSAob3IgYWRkKSB0aGUgPGNvZGU+YW5kcm9pZDptaW5TZGtWZXJzaW9uPC9jb2RlPiBhdHRyaWJ1dGUgCiB0byB0aGUgPGNvZGU+Jmx0O3VzZXMtc2RrJmd0OzwvY29kZT4gZWxlbWVudC4gVG8gdXNlIHRoZSBuZXcgQ29udGFjdHMgQVBJLCAKIHlvdSBzaG91bGQgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHRvICI1IiAob3IgaGlnaGVyLCBhcyBhcHByb3ByaWF0ZSkuPC9saT4KICAgICAgICAgPC91bD4KICAgICAgIDwvdWw+Ci0gICAgPGxpPlB1Ymxpc2ggYm90aCBhcHBzIG9uIE1hcmtldCwgdGhlIG9sZCBhcHAgb25lIGFzIGFuIHVwZ3JhZGUgYW5kIHRoZSAKKyAgICA8bGk+UHVibGlzaCBib3RoIGFwcHMgb24gR29vZ2xlIFBsYXksIHRoZSBvbGQgYXBwIG9uZSBhcyBhbiB1cGdyYWRlIGFuZCB0aGUgCiBvdGhlciBhcyBuZXcuIE1ha2Ugc3VyZSB0byBleHBsYWluIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFwcHMgaW4gdGhlaXIgCiBkZXNjcmlwdGlvbnMuPC9saT4KIDwvdWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2xpdmUtd2FsbHBhcGVycy5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvbGl2ZS13YWxscGFwZXJzLmpkCmluZGV4IGJmYmJiMzQuLjA2OTJhNjIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvbGl2ZS13YWxscGFwZXJzLmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvbGl2ZS13YWxscGFwZXJzLmpkCkBAIC03NiwxOSArNzYsMTkgQEAKIHN1cHBvcnRlZCBvbmx5IG9uIEFuZHJvaWQgMi4xIChBUEkgbGV2ZWwgNykgYW5kIGhpZ2hlciB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0uCiBUbyBlbnN1cmUgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGNhbiBvbmx5IGJlIGluc3RhbGxlZCBvbiBkZXZpY2VzIHRoYXQgc3VwcG9ydAogbGl2ZSB3YWxscGFwZXJzLCByZW1lbWJlciB0byBhZGQgdGhlIGZvbGxvd2luZyB0byB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdAotYmVmb3JlIHB1Ymxpc2hpbmcgdG8gQW5kcm9pZCBNYXJrZXQ6PC9wPgorYmVmb3JlIHB1Ymxpc2hpbmcgdG8gR29vZ2xlIFBsYXk6PC9wPgogCiA8dWw+CiA8bGk+PGNvZGU+Jmx0O3VzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iNyIgLyZndDs8L2NvZGU+LCB3aGljaCBpbmRpY2F0ZXMKLXRvIEFuZHJvaWQgTWFya2V0IGFuZCB0aGUgcGxhdGZvcm0gdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVzIEFuZHJvaWQgMi4xIG9yCit0byBHb29nbGUgUGxheSBhbmQgdGhlIHBsYXRmb3JtIHRoYXQgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBBbmRyb2lkIDIuMSBvcgogaGlnaGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvYXBpLWxldmVscy5odG1sIj5BUEkKIExldmVsczwvYT4gYW5kIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sIj48Y29kZT4mbHQ7dXNlcy1zZGsmZ3Q7PC9jb2RlPjwvYT4KIGVsZW1lbnQuPC9saT4KIDxsaT48Y29kZT4mbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5zb2Z0d2FyZS5saXZlX3dhbGxwYXBlciIgLyZndDs8L2NvZGU+LAotd2hpY2ggdGVsbHMgQW5kcm9pZCBNYXJrZXQgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGluY2x1ZGVzIGEgbGl2ZSB3YWxscGFwZXIKLUFuZHJvaWQgTWFya2V0IHVzZXMgdGhpcyBmZWF0dXJlIGFzIGEgZmlsdGVyLCB3aGVuIHByZXNlbnRpbmcgdXNlcnMgbGlzdHMgb2YKLWF2YWlsYWJsZSBhcHBsaWNhdGlvbnMuIFdoZW4geW91IGRlY2xhcmluZyB0aGlzIGZlYXR1cmUsIEFuZHJvaWQgTWFya2V0Cit3aGljaCB0ZWxscyBHb29nbGUgUGxheSB0aGF0IHlvdXIgYXBwbGljYXRpb24gaW5jbHVkZXMgYSBsaXZlIHdhbGxwYXBlcgorR29vZ2xlIFBsYXkgdXNlcyB0aGlzIGZlYXR1cmUgYXMgYSBmaWx0ZXIsIHdoZW4gcHJlc2VudGluZyB1c2VycyBsaXN0cyBvZgorYXZhaWxhYmxlIGFwcGxpY2F0aW9ucy4gV2hlbiB5b3UgZGVjbGFyaW5nIHRoaXMgZmVhdHVyZSwgR29vZ2xlIFBsYXkKIGRpc3BsYXlzIHlvdXIgYXBwbGljYXRpb24gb25seSB0byB1c2VycyB3aG9zZSBkZXZpY2VzIHN1cHBvcnQgbGl2ZSB3YWxscGFwZXJzLAogd2hpbGUgaGlkaW5nIGl0IGZyb20gb3RoZXIgZGV2aWNlcyBvbiB3aGljaCBpdCB3b3VsZCBub3QgYmUgYWJsZSB0byBydW4uIEZvcgogbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKQEAgLTk4LDUgKzk4LDUgQEAKIGVsZW1lbnQuPC9saT4KIDwvdWw+CiAKLTxwPk1hbnkgZ3JlYXQgbGl2ZSB3YWxscGFwZXJzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSBvbiBBbmRyb2lkIE1hcmtldCBhbmQKKzxwPk1hbnkgZ3JlYXQgbGl2ZSB3YWxscGFwZXJzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSBvbiBHb29nbGUgUGxheSBhbmQKIHdlIGNhbid0IHdhaXQgdG8gc2VlIG1vcmUhPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9zcGVlY2gtaW5wdXQuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3NwZWVjaC1pbnB1dC5qZAppbmRleCAwODY3ZmYyLi4yZjljZDY5IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3NwZWVjaC1pbnB1dC5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3NwZWVjaC1pbnB1dC5qZApAQCAtOSw3ICs5LDcgQEAKIAogPHA+U3BlZWNoIGlucHV0IGFkZHMgYW5vdGhlciBkaW1lbnNpb24gdG8gc3RheWluZyBpbiB0b3VjaC4KIEdvb2dsZSdzIFZvaWNlIFNlYXJjaCBhcHBsaWNhdGlvbiwgd2hpY2ggaXMgcHJlLWluc3RhbGxlZCBvbiBtYW55IEFuZHJvaWQgZGV2aWNlcwotYW5kIGF2YWlsYWJsZSBpbiBBbmRyb2lkIE1hcmtldCwgcHJvdmlkZXMgcG93ZXJmdWwgZmVhdHVyZXMgbGlrZSAic2VhcmNoIGJ5IHZvaWNlIgorYW5kIGF2YWlsYWJsZSBvbiBHb29nbGUgUGxheSwgcHJvdmlkZXMgcG93ZXJmdWwgZmVhdHVyZXMgbGlrZSAic2VhcmNoIGJ5IHZvaWNlIgogYW5kIFZvaWNlIEFjdGlvbnMgbGlrZSAiTmF2aWdhdGUgdG8uIiBGdXJ0aGVyCiBlbmhhbmNpbmcgdGhlIHZvaWNlIGV4cGVyaWVuY2UsIEFuZHJvaWQgMi4xIGludHJvZHVjZXMgYSA8YQogaHJlZj0iaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWxhT2xrRDhMbVp3Ij4KQEAgLTIxLDcgKzIxLDcgQEAKIDxwPiBXZSBiZWxpZXZlIHNwZWVjaCBjYW4KIGZ1bmRhbWVudGFsbHkgY2hhbmdlIHRoZSBtb2JpbGUgZXhwZXJpZW5jZS4gV2Ugd291bGQgbGlrZSB0byBpbnZpdGUgZXZlcnkKIEFuZHJvaWQgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGNvbnNpZGVyIGludGVncmF0aW5nIHNwZWVjaCBpbnB1dCBjYXBhYmlsaXRpZXMKLXZpYSB0aGUgQW5kcm9pZCBTREsuICBPbmUgb2Ygb3VyIGZhdm9yaXRlIGFwcHMgaW4gdGhlIE1hcmtldCB0aGF0IGludGVncmF0ZXMKK3ZpYSB0aGUgQW5kcm9pZCBTREsuICBPbmUgb2Ygb3VyIGZhdm9yaXRlIGFwcHMgb24gR29vZ2xlIFBsYXkgdGhhdCBpbnRlZ3JhdGVzCiBzcGVlY2ggaW5wdXQgaXMgPGEgaHJlZj0iaHR0cDovL3d3dy5oYW5kY2VudC5jb20vIj5IYW5kY2VudCBTTVM8L2E+LCAKIGJlY2F1c2UgeW91IGNhbiBkaWN0YXRlIGEgcmVwbHkgdG8gYW55IFNNUyB3aXRoIGEKIHF1aWNrIHRhcCBvbiB0aGUgU01TIHBvcHVwIHdpbmRvdy4gSGVyZSBpcyBTcGVlY2ggaW5wdXQgaW50ZWdyYXRlZCBpbnRvCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3R0cy5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvdHRzLmpkCmluZGV4IDdkMDdhODkuLjkyOWQwODQgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvdHRzLmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvdHRzLmpkCkBAIC00Myw3ICs0Myw3IEBACiBrbm93IHRvIGluc3RhbGwgdGhlIGRhdGEgdGhhdCdzIHJlcXVpcmVkIGZvciB0aGUgZGV2aWNlIHRvIGJlY29tZSBhCiBtdWx0aS1saW5ndWFsIHRhbGtpbmcgbWFjaGluZSEgRG93bmxvYWRpbmcgYW5kIGluc3RhbGxpbmcgdGhlIGRhdGEgaXMKIGFjY29tcGxpc2hlZCBieSBmaXJpbmcgb2ZmIHRoZSBBQ1RJT05fSU5TVEFMTF9UVFNfREFUQSBpbnRlbnQsIHdoaWNoIHdpbGwgdGFrZQotdGhlIHVzZXIgdG8gQW5kcm9pZCBNYXJrZXQsIGFuZCB3aWxsIGxldCBoZXIvaGltIGluaXRpYXRlIHRoZSBkb3dubG9hZC4KK3RoZSB1c2VyIHRvIEdvb2dsZSBQbGF5LCBhbmQgd2lsbCBsZXQgaGVyL2hpbSBpbml0aWF0ZSB0aGUgZG93bmxvYWQuCiBJbnN0YWxsYXRpb24gb2YgdGhlIGRhdGEgd2lsbCBoYXBwZW4gYXV0b21hdGljYWxseSBvbmNlIHRoZSBkb3dubG9hZCBjb21wbGV0ZXMuCiBIZXJlIGlzIGFuIGV4YW1wbGUgb2Ygd2hhdCB5b3VyIGltcGxlbWVudGF0aW9uIG9mCiA8Y29kZT5vbkFjdGl2aXR5UmVzdWx0KCk8L2NvZGU+IHdvdWxkIGxvb2sgbGlrZTo8L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3VpLTEuNi5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvdWktMS42LmpkCmluZGV4IDA5MTA4ZGQuLmIzMjM4ZTMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvdWktMS42LmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvdWktMS42LmpkCkBAIC0xMjksNCArMTI5LDQgQEAKIAogPHA+VGhlIEFuZHJvaWQgdGVhbSBpcyBjb21taXR0ZWQgdG8gaGVscGluZyB5b3Ugd3JpdGUgYXBwbGljYXRpb25zIGluIHRoZQogZWFzaWVzdCBhbmQgbW9zdCBlZmZpY2llbnQgd2F5IHBvc3NpYmxlLiBXZSBob3BlIHlvdSBmaW5kIHRoZXNlIGltcHJvdmVtZW50cwotdXNlZnVsIGFuZCB3ZSdyZSBleGNpdGVkIHRvIHNlZSB5b3VyIGFwcGxpY2F0aW9ucyBvbiBBbmRyb2lkIE1hcmtldC48L3A+Cit1c2VmdWwgYW5kIHdlJ3JlIGV4Y2l0ZWQgdG8gc2VlIHlvdXIgYXBwbGljYXRpb25zIG9uIEdvb2dsZSBQbGF5LjwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZAppbmRleCA1OTljNGFlLi42YmQzNDdjIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkCkBAIC0xNCw3ICsxNCw3IEBACiAgICAgPGxpPjxhIGhyZWY9IiNVc2luZ0VtYWlsIj5Vc2luZyBlbWFpbCB3aXRoIHRoZSBtYWlsaW5nIGxpc3RzPC9hPjwvbGk+CiAgICAgPGxpPjxhIGhyZWY9IiNBcHBsaWNhdGlvbkRldmVsb3Blckxpc3RzIj5BcHBsaWNhdGlvbiBkZXZlbG9wZXIgbWFpbGluZyBsaXN0czwvYT48L2xpPgogICA8L29sPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjTWFya2V0SGVscCI+QW5kcm9pZCBNYXJrZXQgSGVscCBGb3J1bTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI1BsYXlIZWxwIj5Hb29nbGUgUGxheSBIZWxwIEZvcnVtPC9hPjwvbGk+CiAgIDwvb2w+CiAKIDwvZGl2PgpAQCAtMTEzLDggKzExMyw4IEBACiA8L3VsPgogCiAKLTxoMiBpZD0iTWFya2V0SGVscCI+QW5kcm9pZCBNYXJrZXQgSGVscCBGb3J1bTwvaDI+Cis8aDIgaWQ9IlBsYXlIZWxwIj5Hb29nbGUgUGxheSBIZWxwIEZvcnVtPC9oMj4KIAotPHA+VGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L2ZvcnVtL3AvQW5kcm9pZCtNYXJrZXQiPkFuZHJvaWQgTWFya2V0IEhlbHAgRm9ydW08L2E+IGlzIGEgd2ViLWJhc2VkIGRpc2N1c3Npb24gZm9ydW0gd2hlcmUgeW91IGNhbiBhc2sgcXVlc3Rpb25zIG9yIHJlcG9ydCBpc3N1ZXMgcmVsYXRpbmcgdG8gQW5kcm9pZCBNYXJrZXQuPC9wPgorPHA+VGhlIDxhIGhyZWY9Imh0dHA6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vZ29vZ2xlcGxheSI+R29vZ2xlIFBsYXkgSGVscCBGb3J1bTwvYT4gaXMgYSB3ZWItYmFzZWQgZGlzY3Vzc2lvbiBmb3J1bSB3aGVyZSB5b3UgY2FuIGFzayBxdWVzdGlvbnMgb3IgcmVwb3J0IGlzc3VlcyByZWxhdGluZyB0byBHb29nbGUgUGxheS48L3A+CiAKLTxwIHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj48YSBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc3VwcG9ydC9mb3J1bS9wL0FuZHJvaWQrTWFya2V0Ij5odHRwOi8vd3d3Lmdvb2dsZS5jb20vc3VwcG9ydC9mb3J1bS9wL0FuZHJvaWQrTWFya2V0PC9hPjwvcD4KKzxwIHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj48YSBocmVmPSJodHRwOi8vc3VwcG9ydC5nb29nbGUuY29tL2dvb2dsZXBsYXkiPmh0dHA6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vZ29vZ2xlcGxheTwvYT48L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2Rhc2hib2FyZC9vcGVuZ2wuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2Rhc2hib2FyZC9vcGVuZ2wuamQKaW5kZXggNjk3OGQ2Mi4uYjFjMzIzNCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9kYXNoYm9hcmQvb3BlbmdsLmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvZGFzaGJvYXJkL29wZW5nbC5qZApAQCAtNTAsNyArNTAsNyBAQAogdXNlcy48L3A+CiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgZGF0YSBpcyBiYXNlZCBvbiB0aGUgbnVtYmVyCi1vZiBBbmRyb2lkIGRldmljZXMgdGhhdCBoYXZlIGFjY2Vzc2VkIEFuZHJvaWQgTWFya2V0IHdpdGhpbiBhIDctZGF5IHBlcmlvZAorb2YgQW5kcm9pZCBkZXZpY2VzIHRoYXQgaGF2ZSBhY2Nlc3NlZCBHb29nbGUgUGxheSB3aXRoaW4gYSA3LWRheSBwZXJpb2QKIGVuZGluZyBvbiB0aGUgZGF0YSBjb2xsZWN0aW9uIGRhdGUgbm90ZWQgYmVsb3cuPC9wPgogCiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvZGFzaGJvYXJkL3BsYXRmb3JtLXZlcnNpb25zLmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9kYXNoYm9hcmQvcGxhdGZvcm0tdmVyc2lvbnMuamQKaW5kZXggOTYzMTA1OS4uNjVhNTU3NSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9kYXNoYm9hcmQvcGxhdGZvcm0tdmVyc2lvbnMuamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9kYXNoYm9hcmQvcGxhdGZvcm0tdmVyc2lvbnMuamQKQEAgLTQ3LDEyICs0NywxMiBAQAogPGgzIGlkPSJDdXJyZW50Ij5DdXJyZW50IERpc3RyaWJ1dGlvbjwvaDM+CiAKIDxwPlRoZSBmb2xsb3dpbmcgcGllIGNoYXJ0IGFuZCB0YWJsZSBpcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIEFuZHJvaWQgZGV2aWNlcyB0aGF0IGhhdmUgYWNjZXNzZWQKLUFuZHJvaWQgTWFya2V0IHdpdGhpbiBhIDE0LWRheSBwZXJpb2QgZW5kaW5nIG9uIHRoZSBkYXRhIGNvbGxlY3Rpb24gZGF0ZSBub3RlZCBiZWxvdy48L3A+CitHb29nbGUgUGxheSB3aXRoaW4gYSAxNC1kYXkgcGVyaW9kIGVuZGluZyBvbiB0aGUgZGF0YSBjb2xsZWN0aW9uIGRhdGUgbm90ZWQgYmVsb3cuPC9wPgogCiA8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtcGFuZWwiPgogCiA8aW1nIGFsdD0iIiBoZWlnaHQ9IjI1MCIgd2lkdGg9IjQ3MCIKLXNyYz0iaHR0cDovL2NoYXJ0LmFwaXMuZ29vZ2xlLmNvbS9jaGFydD8mY2h0PXAmY2hzPTQ2MHgyNTAmY2hkPXQ6MC4xLDAuNCwwLjgsNi42LDI1LjIsMC41LDYxLjQsMS4xLDIuMSwwLjQsMS4yJmNobD1BbmRyb2lkJTIwMS41fEFuZHJvaWQlMjAxLjZ8QW5kcm9pZCUyMDIuMXxBbmRyb2lkJTIwMi4yfEFuZHJvaWQlMjAyLjN8QW5kcm9pZCUyMDIuMy4zfEFuZHJvaWQlMjAzLjF8QW5kcm9pZCUyMDMuMnxBbmRyb2lkJTIwNC4wfEFuZHJvaWQlMjA0LjAuMyZjaGNvPWM0ZGY5Yiw2ZmFkMGMiIC8+CitzcmM9Imh0dHA6Ly9jaGFydC5hcGlzLmdvb2dsZS5jb20vY2hhcnQ/JmNodD1wJmNocz00NjB4MjUwJmNoZD10OjAuNCwwLjgsNi42LDI1LjIsMC41LDYxLjQsMC4xLDEuMSwyLjEsMC40LDEuMiZjaGw9QW5kcm9pZCUyMDEuNXxBbmRyb2lkJTIwMS42fEFuZHJvaWQlMjAyLjF8QW5kcm9pZCUyMDIuMnxBbmRyb2lkJTIwMi4zfEFuZHJvaWQlMjAyLjMuM3xBbmRyb2lkJTIwMy4wfEFuZHJvaWQlMjAzLjF8QW5kcm9pZCUyMDMuMnxBbmRyb2lkJTIwNC4wfEFuZHJvaWQlMjA0LjAuMyZjaGNvPWM0ZGY5Yiw2ZmFkMGMiIC8+CiAKIDx0YWJsZT4KIDx0cj4KQEAgLTEwMyw3ICsxMDMsNyBAQAogbGluZSBmb3IgdGhhdCB2ZXJzaW9uIG1lZXRzIHRoZSB5LWF4aXMgb24gdGhlIHJpZ2h0LjwvcD4KIAogPHA+RWFjaCBkYXRhc2V0IGluIHRoZSB0aW1lbGluZSBpcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIEFuZHJvaWQgZGV2aWNlcyB0aGF0IGFjY2Vzc2VkCi1BbmRyb2lkIE1hcmtldCB3aXRoaW4gYSAxNC1kYXkgcGVyaW9kIGVuZGluZyBvbiB0aGUgZGF0ZSBpbmRpY2F0ZWQgb24gdGhlIHgtYXhpcy48L3A+CitHb29nbGUgUGxheSB3aXRoaW4gYSAxNC1kYXkgcGVyaW9kIGVuZGluZyBvbiB0aGUgZGF0ZSBpbmRpY2F0ZWQgb24gdGhlIHgtYXhpcy48L3A+CiAKIDxkaXYgY2xhc3M9ImRhc2hib2FyZC1wYW5lbCI+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvZGFzaGJvYXJkL3NjcmVlbnMuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2Rhc2hib2FyZC9zY3JlZW5zLmpkCmluZGV4IDZjMDRmN2UuLmU5YzczOGUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvZGFzaGJvYXJkL3NjcmVlbnMuamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9kYXNoYm9hcmQvc2NyZWVucy5qZApAQCAtNTMsNyArNTMsNyBAQAogU2NyZWVuczwvYT4uPC9wPgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIGRhdGEgaXMgYmFzZWQgb24gdGhlIG51bWJlcgotb2YgQW5kcm9pZCBkZXZpY2VzIHRoYXQgaGF2ZSBhY2Nlc3NlZCBBbmRyb2lkIE1hcmtldCB3aXRoaW4gYSA3LWRheSBwZXJpb2QKK29mIEFuZHJvaWQgZGV2aWNlcyB0aGF0IGhhdmUgYWNjZXNzZWQgR29vZ2xlIFBsYXkgd2l0aGluIGEgNy1kYXkgcGVyaW9kCiBlbmRpbmcgb24gdGhlIGRhdGEgY29sbGVjdGlvbiBkYXRlIG5vdGVkIGJlbG93LjwvcD4KIAogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMS42LWhpZ2hsaWdodHMuamQgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMS42LWhpZ2hsaWdodHMuamQKaW5kZXggODQ3NjZkNi4uZjBhNTBmYiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTEuNi1oaWdobGlnaHRzLmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0xLjYtaGlnaGxpZ2h0cy5qZApAQCAtMzgsNyArMzgsNyBAQAogCiA8dWw+CiAgIDxsaT48YSBocmVmPSIjVXNlckZlYXR1cmVzIj5OZXcgVXNlciBGZWF0dXJlczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI0FuZHJvaWRNYXJrZXRVcGRhdGVzIj5BbmRyb2lkIE1hcmtldCBVcGRhdGVzPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjR29vZ2xlUGxheVVwZGF0ZXMiPkdvb2dsZSBQbGF5IFVwZGF0ZXM8L2E+PC9saT4KICAgPGxpPjxhIGhyZWY9IiNQbGF0Zm9ybVRlY2hub2xvZ2llcyI+TmV3IFBsYXRmb3JtIFRlY2hub2xvZ2llczwvYT48L2xpPgogPC91bD4KIApAQCAtMTE4LDE0ICsxMTgsMTQgQEAKIAogCiAKLTxoMiBpZD0iQW5kcm9pZE1hcmtldFVwZGF0ZXMiIHN0eWxlPSJjbGVhcjpyaWdodCI+QW5kcm9pZCBNYXJrZXQgVXBkYXRlczwvaDI+Cis8aDIgaWQ9Ikdvb2dsZVBsYXlVcGRhdGVzIiBzdHlsZT0iY2xlYXI6cmlnaHQiPkdvb2dsZSBQbGF5IFVwZGF0ZXM8L2gyPgogCiA8ZGl2IGNsYXNzPSJzY3JlZW5zaG90IiBzdHlsZT0ibWFyZ2luLXRvcDotMzVweCI+CiA8aW1nIHNyYz0iaW1hZ2VzL21hcmtldC5wbmciIGNsYXNzPSJzY3JlZW5zaG90IiBhbHQ9IiIgLz48YnIvPgotTmV3IEFuZHJvaWQgTWFya2V0IFVJCitOZXcgR29vZ2xlIFBsYXkgVUkKIDwvZGl2PgogCi08cD5Gb3IgZGV2aWNlcyB3aXRoIEFuZHJvaWQgTWFya2V0LCB0aGUgbGF0ZXN0IHZlcnNpb24gaW1wcm92ZXMgdGhlIG92ZXJhbGwgdXNlciBleHBlcmllbmNlIGFuZCBtYWtlcworPHA+Rm9yIGRldmljZXMgd2l0aCBHb29nbGUgUGxheSwgdGhlIGxhdGVzdCB2ZXJzaW9uIGltcHJvdmVzIHRoZSBvdmVyYWxsIHVzZXIgZXhwZXJpZW5jZSBhbmQgbWFrZXMKIGl0IGVhc2llciBmb3IgdXNlcnMgdG8gZGlzY292ZXIgZ3JlYXQgYXBwcyBhbmQgZ2FtZXMgZnJvbSBkZXZlbG9wZXJzLjwvcD4KIAogPHVsPgpAQCAtMTU3LDcgKzE1Nyw3IEBACiBJdCBhbGxvd3MgYW55IEFuZHJvaWQgYXBwbGljYXRpb24gdG8gInNwZWFrIiBhIHN0cmluZyBvZiB0ZXh0IHdpdGggYW4gYWNjZW50IHRoYXQgbWF0Y2hlcyB0aGUgbGFuZ3VhZ2UuIAogVGhlIGVuZ2luZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGxhbmd1YWdlczogRW5nbGlzaCAoQW1lcmljYW4gYW5kIEJyaXRpc2ggYWNjZW50cyksIEZyZW5jaCwgCiBJdGFsaWFuLCBHZXJtYW4gYW5kIFNwYW5pc2guIElmIHlvdSdyZSB1c2luZyBhIFQtTW9iaWxlIEcxIG9yIERyZWFtIGRldmljZSwgeW91J2xsIG5lZWQgdG8gZG93bmxvYWQgdGhlIAotU3BlZWNoU3ludGhlc2lzIERhdGEgSW5zdGFsbGVyIGZyb20gQW5kcm9pZCBNYXJrZXQsIHdoaWNoIGluY2x1ZGVzIHRoZSAidm9pY2VzIiBuZWVkZWQgYnkgdGhlIAorU3BlZWNoU3ludGhlc2lzIERhdGEgSW5zdGFsbGVyIGZyb20gR29vZ2xlIFBsYXksIHdoaWNoIGluY2x1ZGVzIHRoZSAidm9pY2VzIiBuZWVkZWQgYnkgdGhlIAogdGV4dC10by1zcGVlY2ggZW5naW5lLjwvcD4KIAogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4xLmpkIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMS5qZAppbmRleCAzZjI4NTUxLi4xZWU4MzNjIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4xLmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjEuamQKQEAgLTE5MSw3ICsxOTEsNyBAQAogJmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc29mdHdhcmUubGl2ZV93YWxscGFwZXIiIC8+CiA8L3ByZT4KIAotPHA+V2hlbiB5b3UndmUgcHVibGlzaGVkIHlvdXIgYXBwbGljYXRpb24sIEFuZHJvaWQgTWFya2V0IGNoZWNrcyBmb3IgdGhlCis8cD5XaGVuIHlvdSd2ZSBwdWJsaXNoZWQgeW91ciBhcHBsaWNhdGlvbiwgR29vZ2xlIFBsYXkgY2hlY2tzIGZvciB0aGUKIHByZXNlbmNlIG9mIHRoaXMgZWxlbWVudCBhbmQgdXNlcyBpdCBhcyBhIGZpbHRlciwgZW5zdXJpbmcgdGhhdCB5b3VyIGFwcGxpY2F0aW9uCiBpcyBub3QgbWFkZSBhdmFpbGFibGUgdG8gdXNlcnMgd2hvc2UgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydCBMaXZlIFdhbGxwYXBlcnMuCiA8L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4yLWhpZ2hsaWdodHMuamQgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4yLWhpZ2hsaWdodHMuamQKaW5kZXggOGJlZDY3NS4uMzdhMjBkNSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMi1oaWdobGlnaHRzLmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjItaGlnaGxpZ2h0cy5qZApAQCAtMjMxLDcgKzIzMSw3IEBACiAKIDxoMz5BbmRyb2lkIEFwcGxpY2F0aW9uIEVycm9yIFJlcG9ydHM8L2gzPgogCi08cD5OZXcgYnVnIHJlcG9ydGluZyBmZWF0dXJlIGZvciBBbmRyb2lkIE1hcmtldCBhcHBzIGVuYWJsZXMgZGV2ZWxvcGVycyB0byByZWNlaXZlIGNyYXNoIGFuZCBmcmVlemUKKzxwPk5ldyBidWcgcmVwb3J0aW5nIGZlYXR1cmUgZm9yIEdvb2dsZSBQbGF5IGFwcHMgZW5hYmxlcyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgY3Jhc2ggYW5kIGZyZWV6ZQogcmVwb3J0cyBmcm9tIHRoZWlyIHVzZXJzLiBUaGUgcmVwb3J0cyB3aWxsIGJlIGF2YWlsYWJsZSB3aGVuIHRoZXkgbG9nIGludG8gdGhlaXIgcHVibGlzaGVyCiBhY2NvdW50LjwvcD4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy4zLmpkIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy4zLmpkCmluZGV4IDAyM2UyZTQuLjQwNWMwNjMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuMy5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLjMuamQKQEAgLTE5Miw3ICsxOTIsNyBAQAogZGVjbGFyaW5nIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24KIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk5GQyImZ3Q7PC9jb2RlPiBpbiB0aGVpciBtYW5pZmVzdCBmaWxlcy48L3A+CiAKLTxwPkFkZGl0aW9uYWxseSwgZGV2ZWxvcGVycyBjYW4gcmVxdWVzdCBmaWx0ZXJpbmcgb24gQW5kcm9pZCBNYXJrZXQsIHN1Y2ggdGhhdAorPHA+QWRkaXRpb25hbGx5LCBkZXZlbG9wZXJzIGNhbiByZXF1ZXN0IGZpbHRlcmluZyBvbiBHb29nbGUgUGxheSwgc3VjaCB0aGF0CiB0aGVpciBhcHBsaWNhdGlvbnMgYXJlIG5vdCBkaXNjb3ZlcmFibGUgdG8gdXNlcnMgd2hvc2UgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydAogTkZDLiBUbyByZXF1ZXN0IGZpbHRlcmluZywgYWRkCiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5uZmMiCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLjQuamQgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLjQuamQKaW5kZXggZWVhYTY5YS4uNGJmZGFiZCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy40LmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuNC5qZApAQCAtMTk3LDcgKzE5Nyw3IEBACiBhY2Nlc3NvcmllcywgcGxlYXNlIHNlZSB0aGUgcmVsYXRlZCA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy91c2IvaW5kZXguaHRtbCI+ZGV2ZWxvcGVyIGRvY3VtZW50YXRpb248L2E+LjwvcD4KIAotPHA+QWRkaXRpb25hbGx5LCBkZXZlbG9wZXJzIGNhbiByZXF1ZXN0IGZpbHRlcmluZyBvbiBBbmRyb2lkIE1hcmtldCwgc3VjaCB0aGF0Cis8cD5BZGRpdGlvbmFsbHksIGRldmVsb3BlcnMgY2FuIHJlcXVlc3QgZmlsdGVyaW5nIG9uIEdvb2dsZSBQbGF5LCBzdWNoIHRoYXQKIHRoZWlyIGFwcGxpY2F0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSB0byB1c2VycyB3aG9zZSBkZXZpY2VzIGRvIG5vdCBwcm92aWRlIHRoZQogYXBwcm9wcmlhdGUgYWNjZXNzb3J5IHN1cHBvcnQuIFRvIHJlcXVlc3QgZmlsdGVyaW5nLCBhZGQgdGhlIGVsZW1lbnQgYmVsb3cKIHRvIHRoZSBhcHBsaWNhdGlvbiBtYW5pZmVzdDo8L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLmpkIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy5qZAppbmRleCBmYzRmNWFhLi5iNDY2OTEzIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuamQKQEAgLTE1MCw3ICsxNTAsNyBAQAogYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24KIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlVTRV9TSVAiJmd0OzwvY29kZT4gaW4gdGhlaXIgbWFuaWZlc3QgZmlsZXMuPC9wPgogCi08cD5BZGRpdGlvbmFsbHksIGRldmVsb3BlcnMgY2FuIHJlcXVlc3QgZmlsdGVyaW5nIG9uIEFuZHJvaWQgTWFya2V0LCBzdWNoIHRoYXQKKzxwPkFkZGl0aW9uYWxseSwgZGV2ZWxvcGVycyBjYW4gcmVxdWVzdCBmaWx0ZXJpbmcgb24gR29vZ2xlIFBsYXksIHN1Y2ggdGhhdAogdGhlaXIgYXBwbGljYXRpb25zIGFyZSBub3QgZGlzY292ZXJhYmxlIHRvIHVzZXJzIHdob3NlIGRldmljZXMgZG8gbm90IGluY2x1ZGUKIHRoZSBwbGF0Zm9ybeKAmXMgU0lQIHN0YWNrIGFuZCBzZXJ2aWNlcy4gVG8gcmVxdWVzdCBmaWx0ZXJpbmcsIGFkZCA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlCiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc29mdHdhcmUuc2lwIgpAQCAtMTk3LDcgKzE5Nyw3IEBACiBkZWNsYXJpbmcgPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbgogYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTkZDIiZndDs8L2NvZGU+IGluIHRoZWlyIG1hbmlmZXN0IGZpbGVzLjwvcD4KIAotPHA+QWRkaXRpb25hbGx5LCBkZXZlbG9wZXJzIGNhbiByZXF1ZXN0IGZpbHRlcmluZyBvbiBBbmRyb2lkIE1hcmtldCwgc3VjaCB0aGF0Cis8cD5BZGRpdGlvbmFsbHksIGRldmVsb3BlcnMgY2FuIHJlcXVlc3QgZmlsdGVyaW5nIG9uIEdvb2dsZSBQbGF5LCBzdWNoIHRoYXQKIHRoZWlyIGFwcGxpY2F0aW9ucyBhcmUgbm90IGRpc2NvdmVyYWJsZSB0byB1c2VycyB3aG9zZSBkZXZpY2VzIGRvIG5vdCBzdXBwb3J0CiBORkMuIFRvIHJlcXVlc3QgZmlsdGVyaW5nLCBhZGQKIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLm5mYyIKQEAgLTIxOSw3ICsyMTksNyBAQAogPHA+Tm90ZSB0aGF0IHRoZSBzcGVjaWZpYyBzZXQgb2YgaGFyZHdhcmUgc2Vuc29ycyBhdmFpbGFibGUgb24gYW55IGdpdmVuIGRldmljZQogdmFyaWVzIGF0IHRoZSBkaXNjcmV0aW9uIG9mIHRoZSBkZXZpY2UgbWFudWZhY3R1cmVyLiA8L3A+CiAKLTxwPkRldmVsb3BlcnMgY2FuIHJlcXVlc3QgZmlsdGVyaW5nIGluIEFuZHJvaWQgTWFya2V0LCBzdWNoIHRoYXQgdGhlaXIKKzxwPkRldmVsb3BlcnMgY2FuIHJlcXVlc3QgZmlsdGVyaW5nIG9uIEdvb2dsZSBQbGF5LCBzdWNoIHRoYXQgdGhlaXIKIGFwcGxpY2F0aW9ucyBhcmUgbm90IGRpc2NvdmVyYWJsZSB0byB1c2VycyB3aG9zZSBkZXZpY2VzIGRvIG5vdCBvZmZlciBhCiBneXJvc2NvcGUgc2Vuc29yLiBUbyBkbyBzbywgYWRkIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUKIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuZ3lyb3Njb3BlIgpAQCAtNzI2LDcgKzcyNiw3IEBACiA8cD5UaGUgcGxhdGZvcm0gYWRkcyBzZXZlcmFsIG5ldyBoYXJkd2FyZSBmZWF0dXJlcyB0aGF0IGRldmVsb3BlcnMgY2FuIGRlY2xhcmUKIGluIHRoZWlyIGFwcGxpY2F0aW9uIG1hbmlmZXN0cyBhcyBiZWluZyByZXF1aXJlZCBieSB0aGVpciBhcHBsaWNhdGlvbnMuIFRoaXMKIGxldHMgZGV2ZWxvcGVycyBjb250cm9sIGhvdyB0aGVpciBhcHBsaWNhdGlvbiBpcyBmaWx0ZXJlZCwgd2hlbiBwdWJsaXNoZWQgb24KLUFuZHJvaWQgTWFya2V0LiA8L3A+CitHb29nbGUgUGxheS4gPC9wPgogCiA8dWw+CiA8bGk+e0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlciNGRUFUVVJFX0FVRElPX0xPV19MQVRFTkNZCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMy4wLmpkIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTMuMC5qZAppbmRleCA0OWZlZmVlLi4zOWEyMzRmIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMy4wLmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0zLjAuamQKQEAgLTkyMiw3ICs5MjIsNyBAQAogCiA8cD5UaGUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuaHRtbCI+e0Bjb2RlICZsdDt1c2VzLWZlYXR1cmUmZ3Q7fTwvYT4gCi1tYW5mZXN0IGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8gaW5mb3JtIGV4dGVybmFsIGVudGl0aWVzIChzdWNoIGFzIEFuZHJvaWQgTWFya2V0KSBvZiB0aGUgc2V0IG9mCittYW5mZXN0IGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8gaW5mb3JtIGV4dGVybmFsIGVudGl0aWVzIChzdWNoIGFzIEdvb2dsZSBQbGF5KSBvZiB0aGUgc2V0IG9mCiBoYXJkd2FyZSBhbmQgc29mdHdhcmUgZmVhdHVyZXMgb24gd2hpY2ggeW91ciBhcHBsaWNhdGlvbiBkZXBlbmRzLiBJbiB0aGlzIHJlbGVhc2UsIEFuZHJvaWQgYWRkcyB0aGUKIGZvbGxvd2luZyBuZXcgY29uc3RhbnRzIHRoYXQgYXBwbGljYXRpb25zIGNhbiBkZWNsYXJlIHdpdGggdGhpcyBlbGVtZW50OjwvcD4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTMuMS5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0zLjEuamQKaW5kZXggYjljZjk2OS4uN2VjN2UzMyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTMuMS5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMy4xLmpkCkBAIC0yMTQsNyArMjE0LDcgQEAKIHRoZWlyIG1hbnVmYWN0dXJlcnMuIEluIHBhcnRpY3VsYXIsIGhvc3QgbW9kZSByZWxpZXMgb24gYXBwcm9wcmlhdGUgVVNCCiBjb250cm9sbGVyIGhhcmR3YXJlIGluIHRoZSBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlLiA8L3A+CiAKLTxwPkFkZGl0aW9uYWxseSwgZGV2ZWxvcGVycyBjYW4gcmVxdWVzdCBmaWx0ZXJpbmcgb24gQW5kcm9pZCBNYXJrZXQsIHN1Y2ggdGhhdAorPHA+QWRkaXRpb25hbGx5LCBkZXZlbG9wZXJzIGNhbiByZXF1ZXN0IGZpbHRlcmluZyBvbiBHb29nbGUgUGxheSwgc3VjaCB0aGF0CiB0aGVpciBhcHBsaWNhdGlvbnMgYXJlIG5vdCBhdmFpbGFiZSB0byB1c2VycyB3aG9zZSBkZXZpY2VzIGRvIG5vdCBwcm92aWRlIHRoZQogYXBwcm9wcmlhdGUgVVNCIHN1cHBvcnQuIFRvIHJlcXVlc3QgZmlsdGVyaW5nLCBhZGQgb25lIG9yIGJvdGggb2YgdGhlIGVsZW1lbnRzCiBiZWxvdyB0byB0aGUgYXBwbGljYXRpb24gbWFuaWZlc3QsIGFzIGFwcHJvcHJpYXRlOiA8L3A+CkBAIC05MDgsOCArOTA4LDggQEAKIDxoMyBpZD0iZmVhdHVyZXMiPk5ldyBmZWF0dXJlIGNvbnN0YW50czwvaDM+CiAKIDxwPlRoZSBwbGF0Zm9ybSBhZGRzIG5ldyBoYXJkd2FyZSBmZWF0dXJlIGNvbnN0YW50cyB0aGF0IGRldmVsb3BlcnMgY2FuIGRlY2xhcmUKLWluIHRoZWlyIGFwcGxpY2F0aW9uIG1hbmlmZXN0cywgdG8gaW5mb3JtIGV4dGVybmFsIGVudGl0aWVzIHN1Y2ggYXMgQW5kcm9pZAotTWFya2V0IG9mIHRoZSBhcHBsaWNhdGlvbidzIHJlcXVpcmVtZW50IGZvciBuZXcgaGFyZHdhcmUgY2FwYWJpbGl0aWVzIHN1cHBvcnRlZAoraW4gdGhlaXIgYXBwbGljYXRpb24gbWFuaWZlc3RzLCB0byBpbmZvcm0gZXh0ZXJuYWwgZW50aXRpZXMgc3VjaCBhcyBHb29nbGUKK1BsYXkgb2YgdGhlIGFwcGxpY2F0aW9uJ3MgcmVxdWlyZW1lbnQgZm9yIG5ldyBoYXJkd2FyZSBjYXBhYmlsaXRpZXMgc3VwcG9ydGVkCiBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHBsYXRmb3JtLiBEZXZlbG9wZXJzIGRlY2xhcmUgdGhlc2UgYW5kIG90aGVyIGZlYXR1cmUKIGNvbnN0YW50cyBpbiA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5odG1sIj57QGNvZGUKQEAgLTkyNiwxMSArOTI2LDExIEBACiBkZXZpY2VzLjwvbGk+CiA8L3VsPgogCi08cD5BbmRyb2lkIE1hcmtldCBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBiYXNlZCBvbiBmZWF0dXJlcyBkZWNsYXJlZCBpbiA8YQorPHA+R29vZ2xlIFBsYXkgZmlsdGVycyBhcHBsaWNhdGlvbnMgYmFzZWQgb24gZmVhdHVyZXMgZGVjbGFyZWQgaW4gPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuaHRtbCI+e0Bjb2RlCiAmbHQ7dXNlcy1mZWF0dXJlJmd0O308L2E+IG1hbmlmZXN0IGVsZW1lbnRzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAogZGVjbGFyaW5nIGZlYXR1cmVzIGluIGFuIGFwcGxpY2F0aW9uIG1hbmlmZXN0LCByZWFkIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+QW5kcm9pZCBNYXJrZXQKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5Hb29nbGUgUGxheQogRmlsdGVyczwvYT4uPC9wPgogCiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0zLjIuamQgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMy4yLmpkCmluZGV4IGFlYWY5YzguLjI3ZGYyMmMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0zLjIuamQKKysrIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTMuMi5qZApAQCAtMzIwLDcgKzMyMCw3IEBACiBmcm9tIGJlaW5nIGluc3RhbGxlZCBhbmQgcnVuLjwvbGk+CiA8L3VsPgogCi08cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBBbmRyb2lkIE1hcmtldCBkb2VzIG5vdCBjdXJyZW50bHkgZmlsdGVyCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBHb29nbGUgUGxheSBkb2VzIG5vdCBjdXJyZW50bHkgZmlsdGVyCiBhcHBzIGJhc2VkIG9uIGFueSBvZiB0aGUgYXR0cmlidXRlcyBhYm92ZS4gU3VwcG9ydCBmb3IgZmlsdGVyaW5nIHdpbGwgYmUKIGFkZGVkIGluIGEgbGF0ZXIgcGxhdGZvcm0gcmVsZWFzZS4gQXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZQogZmlsdGVyaW5nIGJhc2VkIG9uIHNjcmVlbiBzaXplIGNhbiB1c2UgdGhlIGV4aXN0aW5nIDxjb2RlPiZsdDtzdXBwb3J0cy1zY3JlZW5zJmd0OzwvY29kZT4KQEAgLTUyNiwxMyArNTI2LDEzIEBACiA8aDMgaWQ9ImZlYXR1cmVzIj5OZXcgZmVhdHVyZSBjb25zdGFudHM8L2gzPgogCiA8cD5UaGUgcGxhdGZvcm0gYWRkcyBuZXcgaGFyZHdhcmUgZmVhdHVyZSBjb25zdGFudHMgdGhhdCB5b3UgY2FuIGRlY2xhcmUKLWluIHRoZWlyIGFwcGxpY2F0aW9uIG1hbmlmZXN0cywgdG8gaW5mb3JtIGV4dGVybmFsIGVudGl0aWVzIHN1Y2ggYXMgQW5kcm9pZAotTWFya2V0IG9mIHJlcXVpcmVkIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBjYXBhYmlsaXRpZXMuIFlvdSBkZWNsYXJlIHRoZXNlCitpbiB0aGVpciBhcHBsaWNhdGlvbiBtYW5pZmVzdHMsIHRvIGluZm9ybSBleHRlcm5hbCBlbnRpdGllcyBzdWNoIGFzIEdvb2dsZQorUGxheSBvZiByZXF1aXJlZCBoYXJkd2FyZSBhbmQgc29mdHdhcmUgY2FwYWJpbGl0aWVzLiBZb3UgZGVjbGFyZSB0aGVzZQogYW5kIG90aGVyIGZlYXR1cmUgY29uc3RhbnRzIGluIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtZmVhdHVyZS1lbGVtZW50Lmh0bWwiPntAY29kZQogJmx0O3VzZXMtZmVhdHVyZSZndDt9PC9hPiBtYW5pZmVzdCBlbGVtZW50cy4KIAotPHA+QW5kcm9pZCBNYXJrZXQgZmlsdGVycyBhcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlaXIgPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+IGF0dHJpYnV0ZXMsIHRvIGVuc3VyZSB0aGF0IHRoZXkgYXJlIGF2YWlsYWJsZSBvbmx5IHRvIGRldmljZXMgb24gd2hpY2ggdGhlaXIgcmVxdWlyZW1lbnRzIGFyZSBtZXQuIDwvcD4KKzxwPkdvb2dsZSBQbGF5IGZpbHRlcnMgYXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZWlyIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBhdHRyaWJ1dGVzLCB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZSBhdmFpbGFibGUgb25seSB0byBkZXZpY2VzIG9uIHdoaWNoIHRoZWlyIHJlcXVpcmVtZW50cyBhcmUgbWV0LiA8L3A+CiAKIDx1bD4KIDxsaT5GZWF0dXJlIGNvbnN0YW50cyBmb3IgbGFuZHNjYXBlIG9yIHBvcnRyYWl0IHJlcXVpcmVtZW50cwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTQuMC1oaWdobGlnaHRzLmpkIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTQuMC1oaWdobGlnaHRzLmpkCmluZGV4IDkyMmJiMDguLjUwZTlhMTQgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC00LjAtaGlnaGxpZ2h0cy5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtNC4wLWhpZ2hsaWdodHMuamQKQEAgLTUyOSw3ICs1MjksNyBAQAogSnVzdCB0b3VjaCBvbmUgQW5kcm9pZC1wb3dlcmVkIHBob25lIHRvIGFub3RoZXIsIHRoZW4gdGFwIHRvIHNlbmQuPC9wPgogCiA8cD5Gb3Igc2hhcmluZyBhcHBzLCBBbmRyb2lkIEJlYW0gcHVzaGVzIGEgbGluayB0byB0aGUgYXBwJ3MgZGV0YWlscyBwYWdlIGluCi1BbmRyb2lkIE1hcmtldC4gT24gdGhlIG90aGVyIGRldmljZSwgdGhlIE1hcmtldCBhcHAgbGF1bmNoZXMgYW5kIGxvYWRzIHRoZQorR29vZ2xlIFBsYXkuIE9uIHRoZSBvdGhlciBkZXZpY2UsIHRoZSBHb29nbGUgUGxheSBjbGllbnQgYXBwIGxhdW5jaGVzIGFuZCBsb2FkcyB0aGUKIGRldGFpbHMgcGFnZSwgZm9yIGVhc3kgZG93bmxvYWRpbmcgb2YgdGhlIGFwcC4gSW5kaXZpZHVhbCBhcHBzIGNhbiBidWlsZCBvbgogQW5kcm9pZCBCZWFtIHRvIGFkZCBvdGhlciB0eXBlcyBvZiBpbnRlcmFjdGlvbnMsIHN1Y2ggYXMgcGFzc2luZyBnYW1lIHNjb3JlcywKIGluaXRpYXRpbmcgYSBtdWx0aXBsYXllciBnYW1lIG9yIGNoYXQsIGFuZCBtb3JlLjwvcD4KQEAgLTcxNSw3ICs3MTUsNyBAQAogCiA8cD5FdmVuIGlmIGRldmVsb3BlcnMgZG8gbm90IGFkZCBjdXN0b20gaW50ZXJhY3Rpb25zIGJhc2VkIG9uIEFuZHJvaWQgQmVhbSB0aGV5CiBjYW4gc3RpbGwgYmVuZWZpdCBmcm9tIGl0IGJlaW5nIGRlZXBseSBpbnRlZ3JhdGVkIGludG8gQW5kcm9pZC4gQnkgZGVmYXVsdCB0aGUKLXN5c3RlbSBzaGFyZXMgdGhlIGFwcOKAmXMgQW5kcm9pZCBNYXJrZXQgVVJMLCBzbyBpdOKAmXMgZWFzeSBmb3IgdGhlIHVzZXIgdG8KK3N5c3RlbSBzaGFyZXMgdGhlIGFwcOKAmXMgR29vZ2xlIFBsYXkgVVJMLCBzbyBpdOKAmXMgZWFzeSBmb3IgdGhlIHVzZXIgdG8KIGRvd25sb2FkIG9yIHB1cmNoYXNlIHRoZSBhcHAgcmlnaHQgYXdheS48L3A+CiAKIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTQuMC5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC00LjAuamQKaW5kZXggMmNhZDg2Yi4uZTNiMTNjOCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTQuMC5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtNC4wLmpkCkBAIC02NjAsMTQgKzY2MCwxNCBAQAogYXBwbGljYXRpb24gcmVjb3JkIGFuZCBtdWx0aXBsZSBhcHBsaWNhdGlvbnMgY29udGFpbiBhY3Rpdml0aWVzIHRoYXQgaGFuZGxlIHRoZSBzcGVjaWZpZWQgaW50ZW50LAogdGhlIHN5c3RlbSBhbHdheXMgZGVsaXZlcnMgdGhlIG1lc3NhZ2UgdG8gdGhlIGFjdGl2aXR5IGluIHlvdXIgYXBwbGljYXRpb24gKGJhc2VkIG9uIHRoZSBtYXRjaGluZwogYXBwbGljYXRpb24gcmVjb3JkKS4gSWYgdGhlIHRhcmdldCBkZXZpY2UgZG9lcyBub3QgY3VycmVudGx5IGhhdmUgeW91ciBhcHBsaWNhdGlvbiBpbnN0YWxsZWQsIHRoZQotc3lzdGVtIHVzZXMgdGhlIEFuZHJvaWQgYXBwbGljYXRpb24gcmVjb3JkIHRvIGxhdW5jaCBBbmRyb2lkIE1hcmtldCBhbmQgdGFrZSB0aGUgdXNlciB0byB0aGUKK3N5c3RlbSB1c2VzIHRoZSBBbmRyb2lkIGFwcGxpY2F0aW9uIHJlY29yZCB0byBsYXVuY2ggR29vZ2xlIFBsYXkgYW5kIHRha2UgdGhlIHVzZXIgdG8gdGhlCiBhcHBsaWNhdGlvbiBpbiBvcmRlciB0byBpbnN0YWxsIGl0LjwvcD4KIAogPHA+SWYgeW91ciBhcHBsaWNhdGlvbiBkb2VzbuKAmXQgdXNlIE5GQyBBUElzIHRvIHBlcmZvcm0gTkRFRiBQdXNoIG1lc3NhZ2luZywgdGhlbiBBbmRyb2lkIHByb3ZpZGVzIGEKIGRlZmF1bHQgYmVoYXZpb3I6IFdoZW4geW91ciBhcHBsaWNhdGlvbiBpcyBpbiB0aGUgZm9yZWdyb3VuZCBvbiBvbmUgZGV2aWNlIGFuZCBBbmRyb2lkIEJlYW0gaXMKIGludm9rZWQgd2l0aCBhbm90aGVyIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2UsIHRoZW4gdGhlIG90aGVyIGRldmljZSByZWNlaXZlcyBhbiBOREVGIG1lc3NhZ2Ugd2l0aCBhbgogQW5kcm9pZCBhcHBsaWNhdGlvbiByZWNvcmQgdGhhdCBpZGVudGlmaWVzIHlvdXIgYXBwbGljYXRpb24uIElmIHRoZSByZWNlaXZpbmcgZGV2aWNlIGhhcyB0aGUKLWFwcGxpY2F0aW9uIGluc3RhbGxlZCwgdGhlIHN5c3RlbSBsYXVuY2hlcyBpdDsgaWYgaXTigJlzIG5vdCBpbnN0YWxsZWQsIEFuZHJvaWQgTWFya2V0IG9wZW5zIGFuZCB0YWtlcworYXBwbGljYXRpb24gaW5zdGFsbGVkLCB0aGUgc3lzdGVtIGxhdW5jaGVzIGl0OyBpZiBpdOKAmXMgbm90IGluc3RhbGxlZCwgR29vZ2xlIFBsYXkgb3BlbnMgYW5kIHRha2VzCiB0aGUgdXNlciB0byB5b3VyIGFwcGxpY2F0aW9uIGluIG9yZGVyIHRvIGluc3RhbGwgaXQuPC9wPgogCiA8cD5Zb3UgY2FuIHJlYWQgbW9yZSBhYm91dCBBbmRyb2lkIEJlYW0gYW5kIG90aGVyIE5GQyBmZWF0dXJlcyBpbiB0aGUgPGEKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvbmRrL2luZGV4LmpkIGIvZG9jcy9odG1sL3Nkay9uZGsvaW5kZXguamQKaW5kZXggMjlmMDc0OS4uYTFjNTllMyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9uZGsvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL3Nkay9uZGsvaW5kZXguamQKQEAgLTc1Niw3ICs3NTYsNyBAQAogICAgICAgICAgICAgPGxpPkluY2x1ZGVzIGltcHJvdmVtZW50cyB0byB0aGUgPGNvZGU+Y3B1ZmVhdHVyZXM8L2NvZGU+IGhlbHBlciBsaWJyYXJ5IHRoYXQgaW1wcm92ZXMgcmVwb3J0aW5nCiAgICAgICAgICAgICBvZiB0aGUgQ1BVIHR5cGUgKHNvbWUgZGV2aWNlcyBwcmV2aW91c2x5IHJlcG9ydGVkIEFSTXY3IENQVSB3aGVuIHRoZSBkZXZpY2UgcmVhbGx5IHdhcyBhbiBBUk12NikuIFdlCiAgICAgICAgICAgICByZWNvbW1lbmQgZGV2ZWxvcGVycyB0aGF0IHVzZSB0aGlzIGxpYnJhcnkgdG8gcmVidWlsZCB0aGVpciBhcHBsaWNhdGlvbnMgdGhlbgotICAgICAgICAgICAgdXBsb2FkIHRvIE1hcmtldCB0byBiZW5lZml0IGZyb20gdGhlIGltcHJvdmVtZW50cy48L2xpPgorICAgICAgICAgICAgdXBsb2FkIHRvIEdvb2dsZSBQbGF5IHRvIGJlbmVmaXQgZnJvbSB0aGUgaW1wcm92ZW1lbnRzLjwvbGk+CiAKICAgICAgICAgICAgIDxsaT5BZGRzIGFuIEVHTCBsaWJyYXJ5IHRoYXQgbGV0cyB5b3UgY3JlYXRlIGFuZCBtYW5hZ2UgT3BlbkdMIEVTIHRleHR1cmVzIGFuZAogICAgICAgICAgICAgICBzZXJ2aWNlcy48L2xpPgpAQCAtODMyLDcgKzgzMiw3IEBACiAgICAgICAgICAgICA8Y29kZT4uYXBrPC9jb2RlPi48L2xpPgogCiAgICAgICAgICAgICA8bGk+VG8gZW5zdXJlIHRoYXQgeW91ciBhcHBsaWNhdGlvbnMgYXJlIGF2YWlsYWJsZSB0byB1c2VycyBvbmx5IGlmIHRoZWlyIGRldmljZXMgYXJlCi0gICAgICAgICAgICBjYXBhYmxlIG9mIHJ1bm5pbmcgdGhlbSwgQW5kcm9pZCBNYXJrZXQgbm93IGZpbHRlcnMgYXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZQorICAgICAgICAgICAgY2FwYWJsZSBvZiBydW5uaW5nIHRoZW0sIEdvb2dsZSBQbGF5IG5vdyBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBiYXNlZCBvbiB0aGUKICAgICAgICAgICAgIGluc3RydWN0aW9uIHNldCBpbmZvcm1hdGlvbiBpbmNsdWRlZCBpbiB5b3VyIGFwcGxpY2F0aW9uICZtZGFzaDsgbm8gYWN0aW9uIGlzIG5lZWRlZCBvbgogICAgICAgICAgICAgeW91ciBwYXJ0IHRvIGVuYWJsZSB0aGUgZmlsdGVyaW5nLiBBZGRpdGlvbmFsbHksIHRoZSBBbmRyb2lkIHN5c3RlbSBpdHNlbGYgYWxzbyBjaGVja3MKICAgICAgICAgICAgIHlvdXIgYXBwbGljYXRpb24gYXQgaW5zdGFsbCB0aW1lIGFuZCBhbGxvd3MgdGhlIGluc3RhbGxhdGlvbiB0byBjb250aW51ZSBvbmx5IGlmIHRoZQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9uZGsvb3ZlcnZpZXcuamQgYi9kb2NzL2h0bWwvc2RrL25kay9vdmVydmlldy5qZAppbmRleCBlOTY5ZjVkLi5jOThlNjAwIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL25kay9vdmVydmlldy5qZAorKysgYi9kb2NzL2h0bWwvc2RrL25kay9vdmVydmlldy5qZApAQCAtNTM1LDcgKzUzNSw3IEBACiAgICAgPGxpPkFkZGl0aW9uYWxseSwgYW4gYXBwbGljYXRpb24gdXNpbmcgdGhlIE9wZW5HTCBFUyBBUElzIHNob3VsZCBkZWNsYXJlIGEKICAgICA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudCBpbiBpdHMgbWFuaWZlc3QsIHdpdGggYW4KICAgICA8Y29kZT5hbmRyb2lkOmdsRXNWZXJzaW9uPC9jb2RlPiBhdHRyaWJ1dGUgdGhhdCBzcGVjaWZpZXMgdGhlIG1pbmltdW0gT3BlbkdsIEVTIHZlcnNpb24KLSAgICByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24uIFRoaXMgZW5zdXJlcyB0aGF0IEFuZHJvaWQgTWFya2V0IHdpbGwgc2hvdyB5b3VyIGFwcGxpY2F0aW9uIG9ubHkKKyAgICByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24uIFRoaXMgZW5zdXJlcyB0aGF0IEdvb2dsZSBQbGF5IHdpbGwgc2hvdyB5b3VyIGFwcGxpY2F0aW9uIG9ubHkKICAgICB0byB1c2VycyB3aG9zZSBkZXZpY2VzIGFyZSBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgeW91ciBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGU6CiAgICAgICA8cHJlIHN0eWxlPSJtYXJnaW46MWVtOyI+CiAmbHQ7bWFuaWZlc3QmZ3Q7CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL29lbS11c2IuamQgYi9kb2NzL2h0bWwvc2RrL29lbS11c2IuamQKaW5kZXggZjk4MjU3ZC4uODE4YTBhZiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9vZW0tdXNiLmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvb2VtLXVzYi5qZApAQCAtMzQsNyArMzQsNyBAQAogaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvZGV2aWNlLmh0bWwiPlVzaW5nIEhhcmR3YXJlIERldmljZXM8L2E+LjwvcD4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91ciBkZXZpY2UgaXMgb25lIG9mIHRoZSBBbmRyb2lkIERldmVsb3BlciBQaG9uZXMKLShwdXJjaGFzZWQgZnJvbSB0aGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGUpLCBhIE5leHVzIE9uZSwgb3IgYSBOZXh1cyBTLCB0aGVuIHlvdSBuZWVkCisoQURQKSwgYSBOZXh1cyBPbmUsIG9yIGEgTmV4dXMgUywgdGhlbiB5b3UgbmVlZAogdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1zZGsvd2luLXVzYi5odG1sIj5Hb29nbGUgVVNCIERyaXZlcjwvYT4sIGluc3RlYWQgb2YgYW4gT0VNIGRyaXZlci4gVGhlIEdhbGF4eQogTmV4dXMgZHJpdmVyLCBob3dldmVyLCBpcyBkaXN0cmlidXRlZCBieSA8YQogaHJlZj0iaHR0cDovL3d3dy5zYW1zdW5nLmNvbS91cy9zdXBwb3J0L2Rvd25sb2Fkcy92ZXJpem9uLXdpcmVsZXNzL1NDSC1JNTE1TVNBVlpXIj5TYW1zdW5nPC9hPgpAQCAtMjExLDcgKzIxMSw3IEBACiA8aDIgaWQ9IkRyaXZlcnMiPk9FTSBEcml2ZXJzPC9oMj4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91ciBkZXZpY2UgaXMgb25lIG9mIHRoZSBBbmRyb2lkIERldmVsb3BlciBQaG9uZXMKLShwdXJjaGFzZWQgZnJvbSB0aGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGUpLCBhIE5leHVzIE9uZSwgb3IgYSBOZXh1cyBTLCB0aGVuIHlvdSBuZWVkCisocHVyY2hhc2VkIGZyb20gdGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlKSwgYSBOZXh1cyBPbmUsIG9yIGEgTmV4dXMgUywgdGhlbiB5b3UgbmVlZAogdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1zZGsvd2luLXVzYi5odG1sIj5Hb29nbGUgVVNCIERyaXZlcjwvYT4sIGluc3RlYWQgb2YgYW4gT0VNIGRyaXZlci4gVGhlIEdhbGF4eQogTmV4dXMgZHJpdmVyLCBob3dldmVyLCBpcyBkaXN0cmlidXRlZCBieSA8YQogaHJlZj0iaHR0cDovL3d3dy5zYW1zdW5nLmNvbS91cy9zdXBwb3J0L2Rvd25sb2Fkcy92ZXJpem9uLXdpcmVsZXNzL1NDSC1JNTE1TVNBVlpXIj5TYW1zdW5nPC9hPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3RyYWluaW5nL2NhbWVyYS9jYW1lcmFkaXJlY3QuamQgYi9kb2NzL2h0bWwvdHJhaW5pbmcvY2FtZXJhL2NhbWVyYWRpcmVjdC5qZAppbmRleCAwM2FkMTE5Li40YjZmMGQyIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvdHJhaW5pbmcvY2FtZXJhL2NhbWVyYWRpcmVjdC5qZAorKysgYi9kb2NzL2h0bWwvdHJhaW5pbmcvY2FtZXJhL2NhbWVyYWRpcmVjdC5qZApAQCAtMzUsNyArMzUsNyBAQAogdGhlIGZyYW1ld29yayBBUElzLjwvcD4KIAogPHA+RGlyZWN0bHkgY29udHJvbGxpbmcgYSBkZXZpY2UgY2FtZXJhIHJlcXVpcmVzIGEgbG90IG1vcmUgY29kZSB0aGFuIHJlcXVlc3RpbmcgcGljdHVyZXMgb3IgdmlkZW9zCi1mcm9tIGV4aXN0aW5nIGNhbWVyYSBhcHBsaWNhdGlvbnMuIEhvd2V2ZXIsIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgc3BlY2lhbGl6ZWQgY2FtZXJhIGFwcGxpY2F0aW9uIG9yCitmcm9tIGV4aXN0aW5nIGNhbWVyYSBhcHBsaWNhdGlvbnMuIEhvd2V2ZXIsIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgc3BlY2lhbGl6ZWQgY2FtZXJhIGFwcGxpY2F0aW9uCiBvciBzb21ldGhpbmcgZnVsbHkgaW50ZWdyYXRlZCBpbiB5b3VyIGFwcCBVSSwgdGhpcyBsZXNzb24gc2hvd3MgeW91IGhvdy48L3A+CiAKIApAQCAtOTUsNyArOTUsNyBAQAogPHA+VG8gZ2V0IHN0YXJ0ZWQgd2l0aCBkaXNwbGF5aW5nIGEgcHJldmlldywgeW91IG5lZWQgcHJldmlldyBjbGFzcy4gVGhlCiBwcmV2aWV3IHJlcXVpcmVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGNvZGUKIGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyLkNhbGxiYWNrfSBpbnRlcmZhY2UsIHdoaWNoIGlzIHVzZWQgdG8gcGFzcyBpbWFnZQotZGF0YSBmcm9tIHRoZSBjYW1lcmEgaGFyZHdhcmUgdGhlIGFwcGxpY2F0aW9uLjwvcD4KK2RhdGEgZnJvbSB0aGUgY2FtZXJhIGhhcmR3YXJlIHRvIHRoZSBhcHBsaWNhdGlvbi48L3A+CiAKIDxwcmU+CiBjbGFzcyBQcmV2aWV3IGV4dGVuZHMgVmlld0dyb3VwIGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7CkBAIC0yMTQsNyArMjE0LDcgQEAKIAogPGgyIGlkPSJUYXNrUmVzdGFydFByZXZpZXciPlJlc3RhcnQgdGhlIFByZXZpZXc8L2gyPgogCi08cD5BZnRlciBhIHBpY3R1cmUgaXMgdGFrZW4sIHlvdSBtdXN0IHRvIHJlc3RhcnQgdGhlIHByZXZpZXcgYmVmb3JlIHRoZSB1c2VyCis8cD5BZnRlciBhIHBpY3R1cmUgaXMgdGFrZW4sIHlvdSBtdXN0IHJlc3RhcnQgdGhlIHByZXZpZXcgYmVmb3JlIHRoZSB1c2VyCiBjYW4gdGFrZSBhbm90aGVyIHBpY3R1cmUuIEluIHRoaXMgZXhhbXBsZSwgdGhlIHJlc3RhcnQgaXMgZG9uZSBieSBvdmVybG9hZGluZwogdGhlIHNodXR0ZXIgYnV0dG9uLjwvcD4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3RyYWluaW5nL2NhbWVyYS9waG90b2Jhc2ljcy5qZCBiL2RvY3MvaHRtbC90cmFpbmluZy9jYW1lcmEvcGhvdG9iYXNpY3MuamQKaW5kZXggZTZhYjQzZS4uMzQyMDkxOCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3RyYWluaW5nL2NhbWVyYS9waG90b2Jhc2ljcy5qZAorKysgYi9kb2NzL2h0bWwvdHJhaW5pbmcvY2FtZXJhL3Bob3RvYmFzaWNzLmpkCkBAIC01NSw3ICs1NSw3IEBACiA8aDIgaWQ9IlRhc2tNYW5pZmVzdCI+UmVxdWVzdCBDYW1lcmEgUGVybWlzc2lvbjwvaDI+CiAKIDxwPklmIGFuIGVzc2VudGlhbCBmdW5jdGlvbiBvZiB5b3VyIGFwcGxpY2F0aW9uIGlzIHRha2luZyBwaWN0dXJlcywgdGhlbiByZXN0cmljdAotaXRzIHZpc2liaWxpdHkgaW4gQW5kcm9pZCBNYXJrZXQgdG8gZGV2aWNlcyB0aGF0IGhhdmUgYSBjYW1lcmEuICBUbyBhZHZlcnRpc2UKK2l0cyB2aXNpYmlsaXR5IG9uIEdvb2dsZSBQbGF5IHRvIGRldmljZXMgdGhhdCBoYXZlIGEgY2FtZXJhLiAgVG8gYWR2ZXJ0aXNlCiB0aGF0IHlvdXIgYXBwbGljYXRpb24gZGVwZW5kcyBvbiBoYXZpbmcgYSBjYW1lcmEsIHB1dCBhIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtZmVhdHVyZS1lbGVtZW50Lmh0bWwiPiB7QGNvZGUKICZsdDt1c2VzLWZlYXR1cmUmZ3Q7fTwvYT4gdGFnIGluIHlvdXIgbWFuaWZlc3QgZmlsZTo8L3A+CkBAIC02OCw3ICs2OCw3IEBACiA8L3ByZT4KIAogPHA+SWYgeW91ciBhcHBsaWNhdGlvbiB1c2VzLCBidXQgZG9lcyBub3QgcmVxdWlyZSBhIGNhbWVyYSBpbiBvcmRlciB0byBmdW5jdGlvbiwgYWRkIHtAY29kZQotYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UifSB0byB0aGUgdGFnLiBJbiBkb2luZyBzbywgQW5kcm9pZCBNYXJrZXQgd2lsbCBhbGxvdyBkZXZpY2VzIHdpdGhvdXQgYQorYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UifSB0byB0aGUgdGFnLiBJbiBkb2luZyBzbywgR29vZ2xlIFBsYXkgd2lsbCBhbGxvdyBkZXZpY2VzIHdpdGhvdXQgYQogY2FtZXJhIHRvIGRvd25sb2FkIHlvdXIgYXBwbGljYXRpb24uIEl0J3MgdGhlbiB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGNoZWNrIGZvciB0aGUgYXZhaWxhYmlsaXR5CiBvZiB0aGUgY2FtZXJhIGF0IHJ1bnRpbWUgYnkgY2FsbGluZyB7QGxpbmsKIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlciNoYXNTeXN0ZW1GZWF0dXJlIGhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9DQU1FUkEpfS4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC90cmFpbmluZy9jYW1lcmEvdmlkZW9iYXNpY3MuamQgYi9kb2NzL2h0bWwvdHJhaW5pbmcvY2FtZXJhL3ZpZGVvYmFzaWNzLmpkCmluZGV4IGEzNTEyYjAuLjVmZTFhM2EgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC90cmFpbmluZy9jYW1lcmEvdmlkZW9iYXNpY3MuamQKKysrIGIvZG9jcy9odG1sL3RyYWluaW5nL2NhbWVyYS92aWRlb2Jhc2ljcy5qZApAQCAtNjIsNyArNjIsNyBAQAogPC9wcmU+CiAKIDxwPklmIHlvdXIgYXBwbGljYXRpb24gdXNlcywgYnV0IGRvZXMgbm90IHJlcXVpcmUgYSBjYW1lcmEgaW4gb3JkZXIgdG8gZnVuY3Rpb24sIGFkZCB7QGNvZGUKLWFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIn0gdG8gdGhlIHRhZy4gSW4gZG9pbmcgc28sIEFuZHJvaWQgTWFya2V0IHdpbGwgYWxsb3cgZGV2aWNlcyB3aXRob3V0IGEKK2FuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIn0gdG8gdGhlIHRhZy4gSW4gZG9pbmcgc28sIEdvb2dsZSBQbGF5IHdpbGwgYWxsb3cgZGV2aWNlcyB3aXRob3V0IGEKIGNhbWVyYSB0byBkb3dubG9hZCB5b3VyIGFwcGxpY2F0aW9uLiBJdCdzIHRoZW4geW91ciByZXNwb25zaWJpbGl0eSB0byBjaGVjayBmb3IgdGhlIGF2YWlsYWJpbGl0eQogb2YgdGhlIGNhbWVyYSBhdCBydW50aW1lIGJ5IGNhbGxpbmcge0BsaW5rCiBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIjaGFzU3lzdGVtRmVhdHVyZSBoYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQ0FNRVJBKX0uCkBAIC0xMDcsNyArMTA3LDcgQEAKIDxwPlRoZSBBbmRyb2lkIENhbWVyYSBhcHBsaWNhdGlvbiByZXR1cm5zIHRoZSB2aWRlbyBpbiB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnR9IGRlbGl2ZXJlZAogdG8ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uQWN0aXZpdHlSZXN1bHQgb25BY3Rpdml0eVJlc3VsdCgpfSBhcyBhIHtAbGluawogYW5kcm9pZC5uZXQuVXJpfSBwb2ludGluZyB0byB0aGUgdmlkZW8gbG9jYXRpb24gaW4gc3RvcmFnZS4gVGhlIGZvbGxvd2luZyBjb2RlCi1yZXRyaWV2ZXMgdGhpcyBpbWFnZSBhbmQgZGlzcGxheXMgaXQgaW4gYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3fS48L3A+CityZXRyaWV2ZXMgdGhpcyB2aWRlbyBhbmQgZGlzcGxheXMgaXQgaW4gYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3fS48L3A+CiAKIDxwcmU+CiBwcml2YXRlIHZvaWQgaGFuZGxlQ2FtZXJhVmlkZW8oSW50ZW50IGludGVudCkgewpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3RyYWluaW5nL2lkLWF1dGgvY3VzdG9tX2F1dGguamQgYi9kb2NzL2h0bWwvdHJhaW5pbmcvaWQtYXV0aC9jdXN0b21fYXV0aC5qZAppbmRleCBlMmJkNzc4Li4wNTA5YzZlIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvdHJhaW5pbmcvaWQtYXV0aC9jdXN0b21fYXV0aC5qZAorKysgYi9kb2NzL2h0bWwvdHJhaW5pbmcvaWQtYXV0aC9jdXN0b21fYXV0aC5qZApAQCAtMTgxLDYgKzE4MSw2IEBACiA8cD5PbmUgc29sdXRpb24gaXMgdG8gcGxhY2UgdGhlIHNlcnZpY2UgaW4gb25lIHNtYWxsLCBzcGVjaWFsLXB1cnBvc2UgQVBLLiBXaGVuCiBhbiBhcHAgd2lzaGVzIHRvIHVzZSB5b3VyIGN1c3RvbSBhY2NvdW50IHR5cGUsIGl0IGNhbiBjaGVjayB0aGUgZGV2aWNlIHRvIHNlZSBpZgogeW91ciBjdXN0b20gYWNjb3VudCBzZXJ2aWNlIGlzIGF2YWlsYWJsZS4gSWYgbm90LCBpdCBjYW4gZGlyZWN0IHRoZSB1c2VyIHRvCi1BbmRyb2lkIE1hcmtldCB0byBkb3dubG9hZCB0aGUgc2VydmljZS4gVGhpcyBtYXkgc2VlbSBsaWtlIGEgZ3JlYXQgZGVhbCBvZgorR29vZ2xlIFBsYXkgdG8gZG93bmxvYWQgdGhlIHNlcnZpY2UuIFRoaXMgbWF5IHNlZW0gbGlrZSBhIGdyZWF0IGRlYWwgb2YKIHRyb3VibGUgYXQgZmlyc3QsIGJ1dCBjb21wYXJlZCB3aXRoIHRoZSBhbHRlcm5hdGl2ZSBvZiByZS1lbnRlcmluZyBjcmVkZW50aWFscwogZm9yIGV2ZXJ5IGFwcCB0aGF0IHVzZXMgeW91ciBjdXN0b20gYWNjb3VudCwgaXQncyByZWZyZXNoaW5nbHkgZWFzeS48L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy9hcGkuamQgYi9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy9hcGkuamQKaW5kZXggZDg1ODhkNC4uMzQ5MjI0NSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3MvYXBpLmpkCisrKyBiL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL2FwaS5qZApAQCAtNDQsNyArNDQsNyBAQAogPC9kaXY+CiAKIAotPHA+V2hlbiBkZXZlbG9waW5nIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbiB0byB0YWtlIGFkdmFudGFnZSBvZiBtdWx0aXBsZSBBUEtzIG9uIEFuZHJvaWQgTWFya2V0LAorPHA+V2hlbiBkZXZlbG9waW5nIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbiB0byB0YWtlIGFkdmFudGFnZSBvZiBtdWx0aXBsZSBBUEtzIG9uIEdvb2dsZSBQbGF5LAogaXTigJlzIGltcG9ydGFudCB0byBhZG9wdCBzb21lIGdvb2QgcHJhY3RpY2VzIGZyb20gdGhlIGdldC1nbywgYW5kIHByZXZlbnQgdW5uZWNlc3NhcnkgaGVhZGFjaGVzCiBmdXJ0aGVyIGludG8gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuICBUaGlzIGxlc3NvbiBzaG93cyB5b3UgaG93IHRvIGNyZWF0ZSBtdWx0aXBsZSBBUEtzIG9mIHlvdXIKIGFwcCwgZWFjaCBjb3ZlcmluZyBhIHNsaWdodGx5IGRpZmZlcmVudCByYW5nZSBvZiBBUEkgbGV2ZWxzLiAgWW91IHdpbGwgYWxzbyBnYWluIHNvbWUgdG9vbHMKQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAKIDxoMiBpZD0iQWRqdXN0TWFuaWZlc3RzIj5BZGp1c3QgdGhlIE1hbmlmZXN0czwvaDI+Ci08cD5XaGVuIGEgdXNlciBkb3dubG9hZHMgYW4gYXBwbGljYXRpb24gd2hpY2ggdXNlcyBtdWx0aXBsZSBBUEtzIHRocm91Z2ggQW5kcm9pZCBNYXJrZXQsIHRoZSBjb3JyZWN0Cis8cD5XaGVuIGEgdXNlciBkb3dubG9hZHMgYW4gYXBwbGljYXRpb24gd2hpY2ggdXNlcyBtdWx0aXBsZSBBUEtzIHRocm91Z2ggR29vZ2xlIFBsYXksIHRoZSBjb3JyZWN0CiBBUEsgdG8gdXNlIGlzIGNob3NlbiB1c2luZyB0d28gc2ltcGxlIHJ1bGVzOjwvcD4KIDx1bD4KIDxsaT5UaGUgbWFuaWZlc3QgaGFzIHRvIHNob3cgdGhhdCBwYXJ0aWN1bGFyIEFQSyBpcyBlbGlnaWJsZTwvbGk+CkBAIC0yNzgsMTkgKzI3OCwyMCBAQAogPC90YWJsZT4KIAogPHA+Ci1Ob3csIGxldOKAmXMgZnVydGhlciBhc3N1bWUgdGhhdCB0aGUgUmVkIEFQSyBoYXMgc29tZSByZXF1aXJlbWVudCBvbiBpdCB0aGF0IHRoZSBvdGhlciB0d28gZG9u4oCZdC4gIFRoZQotTWFya2V0IEZpbHRlcnMgcGFnZSBvZiB0aGUgQW5kcm9pZCBEZXZlbG9wZXIgZ3VpZGUgaGFzIGEgd2hvbGUgbGlzdCBvZiBwb3NzaWJsZSBjdWxwcml0cy4gIEZvciB0aGUKK05vdywgbGV04oCZcyBmdXJ0aGVyIGFzc3VtZSB0aGF0IHRoZSBSZWQgQVBLIGhhcyBzb21lIHJlcXVpcmVtZW50IG9uIGl0IHRoYXQgdGhlIG90aGVyIHR3byBkb27igJl0LiAgCis8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+RmlsdGVycyBvbiBHb29nbGUgUGxheTwvYT4gcGFnZSBvZgordGhlIEFuZHJvaWQgRGV2ZWxvcGVyIGd1aWRlIGhhcyBhIHdob2xlIGxpc3Qgb2YgcG9zc2libGUgY3VscHJpdHMuICBGb3IgdGhlCiBzYWtlIG9mIGV4YW1wbGUsIGxldOKAmXMgYXNzdW1lIHRoYXQgcmVkIHJlcXVpcmVzIGEgZnJvbnQtZmFjaW5nIGNhbWVyYS4gIEluIGZhY3QsIHRoZSBlbnRpcmUgcG9pbnQgb2YKIHRoZSByZWQgQVBLIGlzIHRvIGNvbWJpbmUgdGhlIGZyb250LWZhY2luZyBjYW1lcmEgd2l0aCBzd2VldCBuZXcgZnVuY3Rpb25hbGl0eSB0aGF0IHdhcyBhZGRlZCBpbiBBUEkKIDExLiAgQnV0LCBpdCB0dXJucyBvdXQsIG5vdCBhbGwgZGV2aWNlcyB0aGF0IHN1cHBvcnQgQVBJIDExIGV2ZW4gSEFWRSBmcm9udC1mYWNpbmcgY2FtZXJhcyEgIFRoZQogaG9ycm9yITwvcD4KIAotPHA+Rm9ydHVuYXRlbHksIGlmIGEgdXNlciBpcyBicm93c2luZyBNYXJrZXQgZnJvbSBvbmUgc3VjaCBkZXZpY2UsIEFuZHJvaWQgTWFya2V0IHdpbGwgbG9vayBhdCB0aGUKKzxwPkZvcnR1bmF0ZWx5LCBpZiBhIHVzZXIgaXMgYnJvd3NpbmcgR29vZ2xlIFBsYXkgZnJvbSBvbmUgc3VjaCBkZXZpY2UsIEdvb2dsZSBQbGF5IHdpbGwgbG9vayBhdCB0aGUKIG1hbmlmZXN0LCBzZWUgdGhhdCBSZWQgbGlzdHMgdGhlIGZyb250LWZhY2luZyBjYW1lcmEgYXMgYSByZXF1aXJlbWVudCwgYW5kIHF1aWV0bHkgaWdub3JlIGl0LCBoYXZpbmcKIGRldGVybWluZWQgdGhhdCBSZWQgYW5kIHRoYXQgZGV2aWNlIGFyZSBub3QgYSBtYXRjaCBtYWRlIGluIGRpZ2l0YWwgaGVhdmVuLiAgSXQgd2lsbCB0aGVuIHNlZSB0aGF0CiBHcmVlbiBpcyBub3Qgb25seSBmb3J3YXJkLWNvbXBhdGlibGUgd2l0aCBkZXZpY2VzIHdpdGggQVBJIDExIChzaW5jZSBubyBtYXhTZGtWZXJzaW9uIHdhcyBkZWZpbmVkKSwKIGJ1dCBhbHNvIGRvZXNu4oCZdCBjYXJlIHdoZXRoZXIgb3Igbm90IHRoZXJl4oCZcyBhIGZyb250LWZhY2luZyBjYW1lcmEhICBUaGUgYXBwIGNhbiBzdGlsbCBiZSBkb3dubG9hZGVkCi1mcm9tIEFuZHJvaWQgTWFya2V0IGJ5IHRoZSB1c2VyLCBiZWNhdXNlIGRlc3BpdGUgdGhlIHdob2xlIGZyb250LWNhbWVyYSBtaXNoYXAsIHRoZXJlIHdhcyBzdGlsbCBhbgorZnJvbSBHb29nbGUgUGxheSBieSB0aGUgdXNlciwgYmVjYXVzZSBkZXNwaXRlIHRoZSB3aG9sZSBmcm9udC1jYW1lcmEgbWlzaGFwLCB0aGVyZSB3YXMgc3RpbGwgYW4KIEFQSyB0aGF0IHN1cHBvcnRlZCB0aGF0IHBhcnRpY3VsYXIgQVBJIGxldmVsLjwvcD4KIAogPHA+ICBJbiBvcmRlciB0byBrZWVwIGFsbCB5b3VyIEFQS3Mgb24gc2VwYXJhdGUgInRyYWNrcyIsIGl04oCZcyBpbXBvcnRhbnQgdG8gaGF2ZSBhIGdvb2QgdmVyc2lvbiBjb2RlCkBAIC0zMzAsNyArMzMxLDcgQEAKIDwvcHJlPgogCiA8aDIgaWQ9IlByZUxhdW5jaCI+R28gT3ZlciBQcmUtbGF1bmNoIENoZWNrbGlzdDwvaDI+Ci08cD4gIEJlZm9yZSB1cGxvYWRpbmcgdG8gQW5kcm9pZCBNYXJrZXQsIGRvdWJsZS1jaGVjayB0aGUgZm9sbG93aW5nIGl0ZW1zLiAgUmVtZW1iZXIgdGhhdCB0aGVzZSBhcmUgc3BlY2lmaWNhbGx5IHJlbGV2YW50IHRvIG11bHRpcGxlIEFQS3MsIGFuZCBpbiBubyB3YXkgcmVwcmVzZW50IGEgY29tcGxldGUgY2hlY2tsaXN0IGZvciBhbGwgYXBwbGljYXRpb25zIGJlaW5nIHVwbG9hZGVkIHRvIEFuZHJvaWQgTWFya2V0LjwvcD4KKzxwPiAgQmVmb3JlIHVwbG9hZGluZyB0byBHb29nbGUgUGxheSwgZG91YmxlLWNoZWNrIHRoZSBmb2xsb3dpbmcgaXRlbXMuICBSZW1lbWJlciB0aGF0IHRoZXNlIGFyZSBzcGVjaWZpY2FsbHkgcmVsZXZhbnQgdG8gbXVsdGlwbGUgQVBLcywgYW5kIGluIG5vIHdheSByZXByZXNlbnQgYSBjb21wbGV0ZSBjaGVja2xpc3QgZm9yIGFsbCBhcHBsaWNhdGlvbnMgYmVpbmcgdXBsb2FkZWQgdG8gR29vZ2xlIFBsYXkuPC9wPgogCiA8dWw+CiA8bGk+QWxsIEFQS3MgbXVzdCBoYXZlIHRoZSBzYW1lIHBhY2thZ2UgbmFtZTwvbGk+CkBAIC0zNDIsNyArMzQzLDcgQEAKIDwvdWw+CiAKIDxwPkl04oCZcyBhbHNvIHdvcnRoIGluc3BlY3RpbmcgdGhlIGNvbXBpbGVkIEFQSyBiZWZvcmUgcHVzaGluZyB0byBtYXJrZXQsIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmVu4oCZdAotYW55IHN1cnByaXNlcyB0aGF0IGNvdWxkIGhpZGUgeW91ciBhcHBsaWNhdGlvbiBpbiBNYXJrZXQuICBUaGlzIGlzIGFjdHVhbGx5IHF1aXRlIHNpbXBsZSB1c2luZyB0aGUKK2FueSBzdXJwcmlzZXMgdGhhdCBjb3VsZCBoaWRlIHlvdXIgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkuICBUaGlzIGlzIGFjdHVhbGx5IHF1aXRlIHNpbXBsZSB1c2luZyB0aGUKICJhYXB0IiB0b29sLiAgQWFwdCAodGhlIEFuZHJvaWQgQXNzZXQgUGFja2FnaW5nIFRvb2wpIGlzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MgZm9yIGNyZWF0aW5nIGFuZAogcGFja2FnaW5nIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIGFuZCBpcyBhbHNvIGEgdmVyeSBoYW5keSB0b29sIGZvciBpbnNwZWN0aW5nIHRoZW0uIDwvcD4KIApAQCAtMzcwLDEwICszNzEsMTQgQEAKIHN1cHBvcnRzLXNjcmVlbnMgYW5kIGNvbXBhdGlibGUtc2NyZWVucywgYW5kIHRoYXQgeW91IGRvbuKAmXQgaGF2ZSB1bmludGVuZGVkICJ1c2VzLWZlYXR1cmUiIHZhbHVlcwogdGhhdCB3ZXJlIGFkZGVkIGFzIGEgcmVzdWx0IG9mIHBlcm1pc3Npb25zIHlvdSBzZXQgaW4gdGhlIG1hbmlmZXN0LiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIEFQSwogd29u4oCZdCBiZSB2aXNpYmxlIHRvIHZlcnkgbWFueSBkZXZpY2VzLjwvcD4KLTxwPldoeT8gIEJ5IGFkZGluZyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbiBTRU5EX1NNUywgdGhlIGZlYXR1cmUgcmVxdWlyZW1lbnQgb2YgYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkgd2FzIGltcGxpY2l0bHkgYWRkZWQuICBTaW5jZSBBUEkgMTEgaXMgSG9uZXljb21iICh0aGUgdmVyc2lvbiBvZiBBbmRyb2lkIG9wdGltaXplZCBzcGVjaWZpY2FsbHkgZm9yIHRhYmxldHMpLCBhbmQgbm8gSG9uZXljb21iIGRldmljZXMgaGF2ZSB0ZWxlcGhvbnkgaGFyZHdhcmUgaW4gdGhlbSwgTWFya2V0IHdpbGwgZmlsdGVyIG91dCB0aGlzIEFQSyBpbiBhbGwgY2FzZXMsIHVudGlsIGZ1dHVyZSBkZXZpY2VzIGNvbWUgYWxvbmcgd2hpY2ggYXJlIGhpZ2hlciBpbiBBUEkgbGV2ZWwgQU5EIHBvc3Nlc3MgdGVsZXBob255IGhhcmR3YXJlLgorPHA+V2h5PyAgQnkgYWRkaW5nIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uIFNFTkRfU01TLCB0aGUgZmVhdHVyZSByZXF1aXJlbWVudCBvZiBhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSB3YXMgaW1wbGljaXRseSBhZGRlZC4gIFNpbmNlIEFQSSAxMSBpcyBIb25leWNvbWIgKHRoZSB2ZXJzaW9uIG9mIEFuZHJvaWQgb3B0aW1pemVkIHNwZWNpZmljYWxseSBmb3IgdGFibGV0cyksIGFuZCBubyBIb25leWNvbWIgZGV2aWNlcyBoYXZlIHRlbGVwaG9ueSBoYXJkd2FyZSBpbiB0aGVtLCBHb29nbGUgUGxheSB3aWxsIGZpbHRlciBvdXQgdGhpcyBBUEsgaW4gYWxsIGNhc2VzLCB1bnRpbCBmdXR1cmUgZGV2aWNlcyBjb21lIGFsb25nIHdoaWNoIGFyZSBoaWdoZXIgaW4gQVBJIGxldmVsIEFORCBwb3NzZXNzIHRlbGVwaG9ueSBoYXJkd2FyZS4KIDwvcD4KIDxwPkZvcnR1bmF0ZWx5IHRoaXMgaXMgZWFzaWx5IGZpeGVkIGJ5IGFkZGluZyB0aGUgZm9sbG93aW5nIHRvIHlvdXIgbWFuaWZlc3Q6PC9wPgogPHByZT4KICZsdDt1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSIgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiIC8mZ3Q7CiA8L3ByZT4KLTxwPk9uY2UgeW914oCZdmUgY29tcGxldGVkIHRoZSBwcmUtbGF1bmNoIGNoZWNrbGlzdCwgdXBsb2FkIHlvdXIgQVBLcyB0byBBbmRyb2lkIE1hcmtldC4gIEl0IG1heSB0YWtlIGEgYml0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gc2hvdyB1cCB3aGVuIGJyb3dzaW5nIEFuZHJvaWQgTWFya2V0LCBidXQgd2hlbiBpdCBkb2VzLCBwZXJmb3JtIG9uZSBsYXN0IGNoZWNrLiAgRG93bmxvYWQgdGhlIGFwcGxpY2F0aW9uIG9udG8gYW55IHRlc3QgZGV2aWNlcyB5b3UgbWF5IGhhdmUsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBBUEtzIGFyZSB0YXJnZXRpbmcgdGhlIGludGVuZGVkIGRldmljZXMuICBDb25ncmF0dWxhdGlvbnMsIHlvdeKAmXJlIGRvbmUhPC9wPgorPHA+VGhlIDxjb2RlPmFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW48L2NvZGU+IHJlcXVpcmVtZW50IGlzIGFsc28gaW1wbGljaXRseSBhZGRlZC4gSWYgeW91IHdhbnQgeW91ciBBUEsgdG8gYmUgdmlzaWJsZSBvbiBUVnMgd2hpY2ggYXJlIG5vbi10b3VjaHNjcmVlbiBkZXZpY2VzIHlvdSBzaG91bGQgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBtYW5pZmVzdDo8L3A+Cis8cHJlPgorJmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4iIGFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIiAvJmd0OworPC9wcmU+Cis8cD5PbmNlIHlvdeKAmXZlIGNvbXBsZXRlZCB0aGUgcHJlLWxhdW5jaCBjaGVja2xpc3QsIHVwbG9hZCB5b3VyIEFQS3MgdG8gR29vZ2xlIFBsYXkuICBJdCBtYXkgdGFrZSBhIGJpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHNob3cgdXAgd2hlbiBicm93c2luZyBHb29nbGUgUGxheSwgYnV0IHdoZW4gaXQgZG9lcywgcGVyZm9ybSBvbmUgbGFzdCBjaGVjay4gIERvd25sb2FkIHRoZSBhcHBsaWNhdGlvbiBvbnRvIGFueSB0ZXN0IGRldmljZXMgeW91IG1heSBoYXZlLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgQVBLcyBhcmUgdGFyZ2V0aW5nIHRoZSBpbnRlbmRlZCBkZXZpY2VzLiAgQ29uZ3JhdHVsYXRpb25zLCB5b3XigJlyZSBkb25lITwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL2luZGV4LmpkIGIvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3MvaW5kZXguamQKaW5kZXggZjliMmI0My4uZDkyYzEwNiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3MvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3MvaW5kZXguamQKQEAgLTE2LDcgKzE2LDcgQEAKIAogPHVsPgogICA8bGk+QW5kcm9pZCAxLjAgYW5kIGhpZ2hlcjwvbGk+Ci0gIDxsaT5Zb3UgbXVzdCBoYXZlIGFuIDxhIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaCI+QW5kcm9pZCBNYXJrZXQ8L2E+IHB1Ymxpc2hlcgorICA8bGk+WW91IG11c3QgaGF2ZSBhbiA8YSBocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaCI+R29vZ2xlIFBsYXk8L2E+IHB1Ymxpc2hlcgogYWNjb3VudDwvbGk+CiA8L3VsPgogCkBAIC0zMCw3ICszMCw3IEBACiA8L2Rpdj4KIDwvZGl2PgogCi08cD5NdWx0aXBsZSBBUEsgc3VwcG9ydCBpcyBhIGZlYXR1cmUgaW4gQW5kcm9pZCBNYXJrZXQgdGhhdCBhbGxvd3MgeW91IHRvIHB1Ymxpc2ggbXVsdGlwbGUgQVBLcworPHA+TXVsdGlwbGUgQVBLIHN1cHBvcnQgaXMgYSBmZWF0dXJlIG9mIEdvb2dsZSBQbGF5IHRoYXQgYWxsb3dzIHlvdSB0byBwdWJsaXNoIG11bHRpcGxlIEFQS3MKIHVuZGVyIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGxpc3RpbmcuICBFYWNoIEFQSyBpcyBhIGNvbXBsZXRlIGluc3RhbmNlIG9mIHlvdXIgYXBwbGljYXRpb24sIG9wdGltaXplZAogdG8gdGFyZ2V0IHNwZWNpZmljIGRldmljZSBjb25maWd1cmF0aW9ucy4gIEVhY2ggQVBLIGNhbiB0YXJnZXQgYSBzcGVjaWZpYyBzZXQgb2YgR0wKIHRleHR1cmVzLCBBUEkgbGV2ZWxzLCBzY3JlZW4gc2l6ZXMsIG9yIHNvbWUgY29tYmluYXRpb24gdGhlcmVvZi48L3A+CkBAIC0zOSw3ICszOSw3IEBACiBjb25maWd1cmF0aW9uIHZhcmlhYmxlcy4gIEVhY2ggbGVzc29uIGNvdmVycyBiYXNpY3MgYWJvdXQgaG93IHRvIG9yZ2FuaXplIHlvdXIgY29kZWJhc2UgYW5kIHRhcmdldAogdGhlIHJpZ2h0IGRldmljZXMsIGFzIHdlbGwgYXMgdGhlIHNtYXJ0IHdheSB0byBhdm9pZCBwaXRmYWxscyBzdWNoIGFzIHVubmVjZXNzYXJ5IHJlZHVuZGFuY3kgYWNyb3NzCiB5b3VyIGNvZGViYXNlLCBhbmQgbWFraW5nIG1pc3Rha2VzIGluIHlvdXIgbWFuaWZlc3QgdGhhdCBjb3VsZCByZW5kZXIgYW4gQVBLIGludmlzaWJsZSB0byBhbGwKLWRldmljZXMgaW4gQW5kcm9pZCBNYXJrZXQuICBCeSBnb2luZyB0aHJvdWdoIGFueSBvZiB0aGVzZSBsZXNzb25zLCB5b3UnbGwga25vdyBob3cgdG8gZGV2ZWxvcAorZGV2aWNlcyBvbiBHb29nbGUgUGxheS4gIEJ5IGdvaW5nIHRocm91Z2ggYW55IG9mIHRoZXNlIGxlc3NvbnMsIHlvdSdsbCBrbm93IGhvdyB0byBkZXZlbG9wCiBtdWx0aXBsZSBBUEtzIHRoZSBzbWFydCB3YXksIG1ha2Ugc3VyZSB0aGV5J3JlIHRhcmdldGluZyB0aGUgZGV2aWNlcyB5b3Ugd2FudCB0aGVtIHRvLAogYW5kIGtub3cgaG93IHRvIGNhdGNoIG1pc3Rha2VzIDxlbT5iZWZvcmU8L2VtPiB5b3VyIGFwcCBnb2VzIGxpdmUuPC9wPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy9tdWx0aXBsZS5qZCBiL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL211bHRpcGxlLmpkCmluZGV4IDI2YTNhOTMuLmIzMDA2OGYgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL211bHRpcGxlLmpkCisrKyBiL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL211bHRpcGxlLmpkCkBAIC00MCw3ICs0MCw3IEBACiA8L2Rpdj4KIDwvZGl2PgogCi08cD5XaGVuIGRldmVsb3BpbmcgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uIHRvIHRha2UgYWR2YW50YWdlIG9mIG11bHRpcGxlIEFQS3Mgb24gQW5kcm9pZCBNYXJrZXQsCis8cD5XaGVuIGRldmVsb3BpbmcgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uIHRvIHRha2UgYWR2YW50YWdlIG9mIG11bHRpcGxlIEFQS3Mgb24gR29vZ2xlIFBsYXksCiBpdOKAmXMgaW1wb3J0YW50IHRvIGFkb3B0IHNvbWUgZ29vZCBwcmFjdGljZXMgZnJvbSB0aGUgZ2V0LWdvLCBhbmQgcHJldmVudCB1bm5lY2Vzc2FyeSBoZWFkYWNoZXMKIGZ1cnRoZXIgaW50byB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gIFRoaXMgbGVzc29uIHNob3dzIHlvdSBob3cgdG8gY3JlYXRlIG11bHRpcGxlIEFQS3Mgb2YgeW91cgogYXBwLCBlYWNoIGNvdmVyaW5nIGEgZGlmZmVyZW50IGNsYXNzIG9mIHNjcmVlbiBzaXplLiAgWW91IHdpbGwgYWxzbyBnYWluIHNvbWUgdG9vbHMgbmVjZXNzYXJ5IHRvCkBAIC0yMjcsNyArMjI3LDcgQEAKIAogCiA8aDIgaWQ9IkFkanVzdE1hbmlmZXN0cyI+QWRqdXN0IHRoZSBNYW5pZmVzdHM8L2gyPgotPHA+V2hlbiBhIHVzZXIgZG93bmxvYWRzIGFuIGFwcGxpY2F0aW9uIHdoaWNoIHVzZXMgbXVsdGlwbGUgQVBLcyB0aHJvdWdoIEFuZHJvaWQgTWFya2V0LCB0aGUgY29ycmVjdAorPHA+V2hlbiBhIHVzZXIgZG93bmxvYWRzIGFuIGFwcGxpY2F0aW9uIHdoaWNoIHVzZXMgbXVsdGlwbGUgQVBLcyB0aHJvdWdoIEdvb2dsZSBQbGF5LCB0aGUgY29ycmVjdAogQVBLIHRvIHVzZSBpcyBjaG9zZW4gdXNpbmcgdHdvIHNpbXBsZSBydWxlczoKIAogPHVsPgpAQCAtMzI5LDE3ICszMjksMTcgQEAKIFB1cnBsZSAmIzg4MDU7IFJlZCAmIzg4MDU7IEdyZWVuICYjODgwNTsgQmx1ZQogPC9wPjxwPgogV2h5IGFsbG93IGFsbCB0aGUgb3ZlcmxhcD8gIExldOKAmXMgcHJldGVuZCB0aGF0IHRoZSBQdXJwbGUgQVBLIGhhcyBzb21lIHJlcXVpcmVtZW50IG9uIGl0IHRoYXQgdGhlCi1vdGhlciB0d28gZG9u4oCZdC4gIFRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+TWFya2V0IEZpbHRlcnMgcGFnZTwvYT4KK290aGVyIHR3byBkb27igJl0LiAgVGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5GaWx0ZXJzIG9uIEdvb2dsZSBQbGF5PC9hPiBwYWdlCiBvZiB0aGUgQW5kcm9pZCBEZXZlbG9wZXIgZ3VpZGUgaGFzIGEgd2hvbGUgbGlzdCBvZiBwb3NzaWJsZSBjdWxwcml0cy4gIEZvciB0aGUgc2FrZSBvZiBleGFtcGxlLAogbGV04oCZcyBhc3N1bWUgdGhhdCBQdXJwbGUgcmVxdWlyZXMgYSBmcm9udC1mYWNpbmcgY2FtZXJhLiAgSW4gZmFjdCwgdGhlIGVudGlyZSBwb2ludCBvZiBQdXJwbGUgaXMgdG8KIHVzZSBlbnRlcnRhaW5pbmcgdGhpbmdzIHdpdGggdGhlIGZyb250LWZhY2luZyBjYW1lcmEhICBCdXQsIGl0IHR1cm5zIG91dCwgbm90IGFsbCBBUEkgMTErIGRldmljZXMKIGV2ZW4gSEFWRSBmcm9udC1mYWNpbmcgY2FtZXJhcyEgIFRoZSBob3Jyb3IhPC9wPgogCi08cD5Gb3J0dW5hdGVseSwgaWYgYSB1c2VyIGlzIGJyb3dzaW5nIE1hcmtldCBmcm9tIG9uZSBzdWNoIGRldmljZSwgQW5kcm9pZCBNYXJrZXQgd2lsbCBsb29rIGF0IHRoZQorPHA+Rm9ydHVuYXRlbHksIGlmIGEgdXNlciBpcyBicm93c2luZyBHb29nbGUgUGxheSBmcm9tIG9uZSBzdWNoIGRldmljZSwgR29vZ2xlIFBsYXkgd2lsbCBsb29rIGF0IHRoZQogbWFuaWZlc3QsIHNlZSB0aGF0IFB1cnBsZSBsaXN0cyB0aGUgZnJvbnQtZmFjaW5nIGNhbWVyYSBhcyBhIHJlcXVpcmVtZW50LCBhbmQgcXVpZXRseSBpZ25vcmUgaXQsCiBoYXZpbmcgZGV0ZXJtaW5lZCB0aGF0IFB1cnBsZSBhbmQgdGhhdCBkZXZpY2UgYXJlIG5vdCBhIG1hdGNoIG1hZGUgaW4gZGlnaXRhbCBoZWF2ZW4uICBJdCB3aWxsIHRoZW4KIHNlZSB0aGF0IFJlZCBpcyBub3Qgb25seSBjb21wYXRpYmxlIHdpdGggeGxhcmdlIGRldmljZXMsIGJ1dCBhbHNvIGRvZXNu4oCZdCBjYXJlIHdoZXRoZXIgb3Igbm90Ci10aGVyZeKAmXMgYSBmcm9udC1mYWNpbmcgY2FtZXJhISAgVGhlIGFwcCBjYW4gc3RpbGwgYmUgZG93bmxvYWRlZCBmcm9tIEFuZHJvaWQgTWFya2V0IGJ5IHRoZSB1c2VyLAordGhlcmXigJlzIGEgZnJvbnQtZmFjaW5nIGNhbWVyYSEgIFRoZSBhcHAgY2FuIHN0aWxsIGJlIGRvd25sb2FkZWQgZnJvbSBHb29nbGUgUGxheSBieSB0aGUgdXNlciwKIGJlY2F1c2UgZGVzcGl0ZSB0aGUgd2hvbGUgZnJvbnQtY2FtZXJhIG1pc2hhcCwgdGhlcmUgd2FzIHN0aWxsIGFuIEFQSyB0aGF0IHN1cHBvcnRlZCB0aGF0IHBhcnRpY3VsYXIKIEFQSSBsZXZlbC48L3A+CiAKQEAgLTQyMCw5ICs0MjAsOSBAQAogPC9wPgogCiA8aDIgaWQ9IlByZUxhdW5jaCI+R28gT3ZlciBQcmUtbGF1bmNoIENoZWNrbGlzdDwvaDI+Ci08cD4gIEJlZm9yZSB1cGxvYWRpbmcgdG8gQW5kcm9pZCBNYXJrZXQsIGRvdWJsZS1jaGVjayB0aGUgZm9sbG93aW5nIGl0ZW1zLiAgUmVtZW1iZXIgdGhhdCB0aGVzZSBhcmUKKzxwPiAgQmVmb3JlIHVwbG9hZGluZyB0byBHb29nbGUgUGxheSwgZG91YmxlLWNoZWNrIHRoZSBmb2xsb3dpbmcgaXRlbXMuICBSZW1lbWJlciB0aGF0IHRoZXNlIGFyZQogc3BlY2lmaWNhbGx5IHJlbGV2YW50IHRvIG11bHRpcGxlIEFQS3MsIGFuZCBpbiBubyB3YXkgcmVwcmVzZW50IGEgY29tcGxldGUgY2hlY2tsaXN0IGZvciBhbGwKLWFwcGxpY2F0aW9ucyBiZWluZyB1cGxvYWRlZCB0byBBbmRyb2lkIE1hcmtldC48L3A+CithcHBsaWNhdGlvbnMgYmVpbmcgdXBsb2FkZWQgdG8gR29vZ2xlIFBsYXkuPC9wPgogPHVsPgogPGxpPkFsbCBBUEtzIG11c3QgaGF2ZSB0aGUgc2FtZSBwYWNrYWdlIG5hbWUuPC9saT4KIDxsaT5BbGwgQVBLcyBtdXN0IGJlIHNpZ25lZCB3aXRoIHRoZSBzYW1lIGNlcnRpZmljYXRlLjwvbGk+CkBAIC00MzksNyArNDM5LDcgQEAKIDwvdWw+CiAKIDxwPkl04oCZcyBhbHNvIHdvcnRoIGluc3BlY3RpbmcgdGhlIGNvbXBpbGVkIEFQSyBiZWZvcmUgcHVzaGluZyB0byBtYXJrZXQsIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmVu4oCZdAotYW55IHN1cnByaXNlcyB0aGF0IGNvdWxkIGhpZGUgeW91ciBhcHBsaWNhdGlvbiBpbiBNYXJrZXQuICBUaGlzIGlzIGFjdHVhbGx5IHF1aXRlIHNpbXBsZSB1c2luZyB0aGUKK2FueSBzdXJwcmlzZXMgdGhhdCBjb3VsZCBoaWRlIHlvdXIgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkuICBUaGlzIGlzIGFjdHVhbGx5IHF1aXRlIHNpbXBsZSB1c2luZyB0aGUKICJhYXB0IiB0b29sLiAgQWFwdCAodGhlIEFuZHJvaWQgQXNzZXQgUGFja2FnaW5nIFRvb2wpIGlzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MgZm9yIGNyZWF0aW5nIGFuZAogcGFja2FnaW5nIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIGFuZCBpcyBhbHNvIGEgdmVyeSBoYW5keSB0b29sIGZvciBpbnNwZWN0aW5nIHRoZW0uIDwvcD4KIApAQCAtNDY3LDExICs0NjcsMTUgQEAKIHN1cHBvcnRzLXNjcmVlbnMgYW5kIGNvbXBhdGlibGUtc2NyZWVucywgYW5kIHRoYXQgeW91IGRvbuKAmXQgaGF2ZSB1bmludGVuZGVkICJ1c2VzLWZlYXR1cmUiIHZhbHVlcwogdGhhdCB3ZXJlIGFkZGVkIGFzIGEgcmVzdWx0IG9mIHBlcm1pc3Npb25zIHlvdSBzZXQgaW4gdGhlIG1hbmlmZXN0LiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIEFQSwogd2lsbCBiZSBpbnZpc2libGUgdG8gbW9zdCwgaWYgbm90IGFsbCBkZXZpY2VzLjwvcD4KLTxwPldoeT8gIEJ5IGFkZGluZyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbiBTRU5EX1NNUywgdGhlIGZlYXR1cmUgcmVxdWlyZW1lbnQgb2YgYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkgd2FzIGltcGxpY2l0bHkgYWRkZWQuICBTaW5jZSBtb3N0IChpZiBub3QgYWxsKSB4bGFyZ2UgZGV2aWNlcyBhcmUgdGFibGV0cyB3aXRob3V0IHRlbGVwaG9ueSBoYXJkd2FyZSBpbiB0aGVtLCBNYXJrZXQgd2lsbCBmaWx0ZXIgb3V0IHRoaXMgQVBLIGluIHRoZXNlIGNhc2VzLCB1bnRpbCBmdXR1cmUgZGV2aWNlcyBjb21lIGFsb25nIHdoaWNoIGFyZSBib3RoIGxhcmdlIGVub3VnaCB0byByZXBvcnQgYXMgeGxhcmdlIHNjcmVlbiBzaXplLCBhbmQgcG9zc2VzcyB0ZWxlcGhvbnkgaGFyZHdhcmUuCis8cD5XaHk/ICBCeSBhZGRpbmcgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gU0VORF9TTVMsIHRoZSBmZWF0dXJlIHJlcXVpcmVtZW50IG9mIGFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255IHdhcyBpbXBsaWNpdGx5IGFkZGVkLiAgU2luY2UgbW9zdCAoaWYgbm90IGFsbCkgeGxhcmdlIGRldmljZXMgYXJlIHRhYmxldHMgd2l0aG91dCB0ZWxlcGhvbnkgaGFyZHdhcmUgaW4gdGhlbSwgR29vZ2xlIFBsYXkgd2lsbCBmaWx0ZXIgb3V0IHRoaXMgQVBLIGluIHRoZXNlIGNhc2VzLCB1bnRpbCBmdXR1cmUgZGV2aWNlcyBjb21lIGFsb25nIHdoaWNoIGFyZSBib3RoIGxhcmdlIGVub3VnaCB0byByZXBvcnQgYXMgeGxhcmdlIHNjcmVlbiBzaXplLCBhbmQgcG9zc2VzcyB0ZWxlcGhvbnkgaGFyZHdhcmUuCiA8L3A+CiA8cD5Gb3J0dW5hdGVseSB0aGlzIGlzIGVhc2lseSBmaXhlZCBieSBhZGRpbmcgdGhlIGZvbGxvd2luZyB0byB5b3VyIG1hbmlmZXN0OjxwPgogPHByZT4KICZsdDt1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSIgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiIC8mZ3Q7CiA8L3ByZT4KKzxwPlRoZSA8Y29kZT5hbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuPC9jb2RlPiByZXF1aXJlbWVudCBpcyBhbHNvIGltcGxpY2l0bHkgYWRkZWQuIElmIHlvdSB3YW50IHlvdXIgQVBLIHRvIGJlIHZpc2libGUgb24gVFZzIHdoaWNoIGFyZSBub24tdG91Y2hzY3JlZW4gZGV2aWNlcyB5b3Ugc2hvdWxkIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgbWFuaWZlc3Q6PC9wPgorPHByZT4KKyZsdDt1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuIiBhbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSIgLyZndDsKKzwvcHJlPgogCi08cD5PbmNlIHlvdeKAmXZlIGNvbXBsZXRlZCB0aGUgcHJlLWxhdW5jaCBjaGVja2xpc3QsIHVwbG9hZCB5b3VyIEFQS3MgdG8gQW5kcm9pZCBNYXJrZXQuICBJdCBtYXkgdGFrZSBhIGJpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHNob3cgdXAgd2hlbiBicm93c2luZyBBbmRyb2lkIE1hcmtldCwgYnV0IHdoZW4gaXQgZG9lcywgcGVyZm9ybSBvbmUgbGFzdCBjaGVjay4gIERvd25sb2FkIHRoZSBhcHBsaWNhdGlvbiBvbnRvIGFueSB0ZXN0IGRldmljZXMgeW91IG1heSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBBUEtzIGFyZSB0YXJnZXRpbmcgdGhlIGludGVuZGVkIGRldmljZXMuIENvbmdyYXR1bGF0aW9ucywgeW914oCZcmUgZG9uZSE8L3A+Cis8cD5PbmNlIHlvdeKAmXZlIGNvbXBsZXRlZCB0aGUgcHJlLWxhdW5jaCBjaGVja2xpc3QsIHVwbG9hZCB5b3VyIEFQS3MgdG8gR29vZ2xlIFBsYXkuICBJdCBtYXkgdGFrZSBhIGJpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHNob3cgdXAgd2hlbiBicm93c2luZyBHb29nbGUgUGxheSwgYnV0IHdoZW4gaXQgZG9lcywgcGVyZm9ybSBvbmUgbGFzdCBjaGVjay4gIERvd25sb2FkIHRoZSBhcHBsaWNhdGlvbiBvbnRvIGFueSB0ZXN0IGRldmljZXMgeW91IG1heSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBBUEtzIGFyZSB0YXJnZXRpbmcgdGhlIGludGVuZGVkIGRldmljZXMuIENvbmdyYXR1bGF0aW9ucywgeW914oCZcmUgZG9uZSE8L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy9zY3JlZW5zaXplLmpkIGIvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3Mvc2NyZWVuc2l6ZS5qZAppbmRleCAwZWQ5NzJhLi5hYzY3OWE3IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy9zY3JlZW5zaXplLmpkCisrKyBiL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL3NjcmVlbnNpemUuamQKQEAgLTQzLDcgKzQzLDcgQEAKIDwvZGl2PgogCiAKLTxwPldoZW4gZGV2ZWxvcGluZyB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbXVsdGlwbGUgQVBLcyBvbiBBbmRyb2lkIE1hcmtldCwKKzxwPldoZW4gZGV2ZWxvcGluZyB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbXVsdGlwbGUgQVBLcyBvbiBHb29nbGUgUGxheSwKIGl04oCZcyBpbXBvcnRhbnQgdG8gYWRvcHQgc29tZSBnb29kIHByYWN0aWNlcyBmcm9tIHRoZSBnZXQtZ28sIGFuZCBwcmV2ZW50IHVubmVjZXNzYXJ5IGhlYWRhY2hlcwogZnVydGhlciBpbnRvIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLiAgVGhpcyBsZXNzb24gc2hvd3MgeW91IGhvdyB0byBjcmVhdGUgbXVsdGlwbGUgQVBLcyBvZiB5b3VyCiBhcHAsIGVhY2ggY292ZXJpbmcgYSBkaWZmZXJlbnQgY2xhc3Mgb2Ygc2NyZWVuIHNpemUuICBZb3Ugd2lsbCBhbHNvIGdhaW4gc29tZSB0b29scyBuZWNlc3NhcnkgdG8KQEAgLTE3OCw3ICsxNzgsNyBAQAogCiAKIDxoMiBpZD0iQWRqdXN0TWFuaWZlc3RzIj5BZGp1c3QgdGhlIE1hbmlmZXN0czwvaDI+Ci08cD5XaGVuIGEgdXNlciBkb3dubG9hZHMgYW4gYXBwbGljYXRpb24gd2hpY2ggdXNlcyBtdWx0aXBsZSBBUEtzIHRocm91Z2ggQW5kcm9pZCBNYXJrZXQsIHRoZSBjb3JyZWN0Cis8cD5XaGVuIGEgdXNlciBkb3dubG9hZHMgYW4gYXBwbGljYXRpb24gd2hpY2ggdXNlcyBtdWx0aXBsZSBBUEtzIHRocm91Z2ggR29vZ2xlIFBsYXksIHRoZSBjb3JyZWN0CiBBUEsgdG8gdXNlIGlzIGNob3NlbiB1c2luZyB0d28gc2ltcGxlIHJ1bGVzOjwvcD4KIDx1bD4KIDxsaT5UaGUgbWFuaWZlc3QgaGFzIHRvIHNob3cgdGhhdCBwYXJ0aWN1bGFyIEFQSyBpcyBlbGlnaWJsZTwvbGk+CkBAIC0yMjcsMTcgKzIyNywxNyBAQAogPC90YWJsZT4KIDxwPgogTm93LCBsZXTigJlzIGZ1cnRoZXIgYXNzdW1lIHRoYXQgdGhlIFJlZCBBUEsgaGFzIHNvbWUgcmVxdWlyZW1lbnQgb24gaXQgdGhhdCB0aGUgb3RoZXIgdHdvIGRvbuKAmXQuICBUaGUKLTxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5NYXJrZXQgRmlsdGVycyBwYWdlPC9hPiBvZiB0aGUgQW5kcm9pZAorPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+IHBhZ2Ugb2YgdGhlIEFuZHJvaWQKIERldmVsb3BlciBndWlkZSBoYXMgYSB3aG9sZSBsaXN0IG9mIHBvc3NpYmxlIGN1bHByaXRzLiAgRm9yIHRoZSBzYWtlIG9mIGV4YW1wbGUsIGxldOKAmXMgYXNzdW1lIHRoYXQKIHJlZCByZXF1aXJlcyBhIGZyb250LWZhY2luZyBjYW1lcmEuICBJbiBmYWN0LCB0aGUgZW50aXJlIHBvaW50IG9mIHRoZSByZWQgQVBLIGlzIHRvIHVzZSB0aGUgZXh0cmEKIGF2YWlsYWJsZSBzY3JlZW4gc3BhY2UgdG8gZG8gZW50ZXJ0YWluaW5nIHRoaW5ncyB3aXRoIHRoYXQgZnJvbnQtZmFjaW5nIGNhbWVyYS4gIEJ1dCwgaXQgdHVybnMgb3V0LAogbm90IGFsbCB4bGFyZ2UgZGV2aWNlcyBldmVuIEhBVkUgZnJvbnQtZmFjaW5nIGNhbWVyYXMhICBUaGUgaG9ycm9yITwvcD4KIAotPHA+Rm9ydHVuYXRlbHksIGlmIGEgdXNlciBpcyBicm93c2luZyBNYXJrZXQgZnJvbSBvbmUgc3VjaCBkZXZpY2UsIEFuZHJvaWQgTWFya2V0IHdpbGwgbG9vayBhdCB0aGUKKzxwPkZvcnR1bmF0ZWx5LCBpZiBhIHVzZXIgaXMgYnJvd3NpbmcgR29vZ2xlIFBsYXkgZnJvbSBvbmUgc3VjaCBkZXZpY2UsIEdvb2dsZSBQbGF5IHdpbGwgbG9vayBhdCB0aGUKIG1hbmlmZXN0LCBzZWUgdGhhdCBSZWQgbGlzdHMgdGhlIGZyb250LWZhY2luZyBjYW1lcmEgYXMgYSByZXF1aXJlbWVudCwgYW5kIHF1aWV0bHkgaWdub3JlIGl0LCBoYXZpbmcKIGRldGVybWluZWQgdGhhdCBSZWQgYW5kIHRoYXQgZGV2aWNlIGFyZSBub3QgYSBtYXRjaCBtYWRlIGluIGRpZ2l0YWwgaGVhdmVuLiAgSXQgd2lsbCB0aGVuIHNlZSB0aGF0CiBHcmVlbiBpcyBub3Qgb25seSBjb21wYXRpYmxlIHdpdGggeGxhcmdlIGRldmljZXMsIGJ1dCBhbHNvIGRvZXNu4oCZdCBjYXJlIHdoZXRoZXIgb3Igbm90IHRoZXJl4oCZcyBhCi1mcm9udC1mYWNpbmcgY2FtZXJhISAgVGhlIGFwcCBjYW4gc3RpbGwgYmUgZG93bmxvYWRlZCBmcm9tIEFuZHJvaWQgTWFya2V0IGJ5IHRoZSB1c2VyLCBiZWNhdXNlCitmcm9udC1mYWNpbmcgY2FtZXJhISAgVGhlIGFwcCBjYW4gc3RpbGwgYmUgZG93bmxvYWRlZCBmcm9tIEdvb2dsZSBQbGF5IGJ5IHRoZSB1c2VyLCBiZWNhdXNlCiBkZXNwaXRlIHRoZSB3aG9sZSBmcm9udC1jYW1lcmEgbWlzaGFwLCB0aGVyZSB3YXMgc3RpbGwgYW4gQVBLIHRoYXQgc3VwcG9ydGVkIHRoYXQgcGFydGljdWxhciBzY3JlZW4KIHNpemUuPC9wPgogCkBAIC0zMDAsOSArMzAwLDkgQEAKIDwvcD4KIAogPGgyIGlkPSJQcmVMYXVuY2giPkdvIE92ZXIgUHJlLWxhdW5jaCBDaGVja2xpc3Q8L2gyPgotPHA+ICBCZWZvcmUgdXBsb2FkaW5nIHRvIEFuZHJvaWQgTWFya2V0LCBkb3VibGUtY2hlY2sgdGhlIGZvbGxvd2luZyBpdGVtcy4gIFJlbWVtYmVyIHRoYXQgdGhlc2UgYXJlCis8cD4gIEJlZm9yZSB1cGxvYWRpbmcgdG8gR29vZ2xlIFBsYXksIGRvdWJsZS1jaGVjayB0aGUgZm9sbG93aW5nIGl0ZW1zLiAgUmVtZW1iZXIgdGhhdCB0aGVzZSBhcmUKIHNwZWNpZmljYWxseSByZWxldmFudCB0byBtdWx0aXBsZSBBUEtzLCBhbmQgaW4gbm8gd2F5IHJlcHJlc2VudCBhIGNvbXBsZXRlIGNoZWNrbGlzdCBmb3IgYWxsCi1hcHBsaWNhdGlvbnMgYmVpbmcgdXBsb2FkZWQgdG8gQW5kcm9pZCBNYXJrZXQuPC9wPgorYXBwbGljYXRpb25zIGJlaW5nIHVwbG9hZGVkIHRvIEdvb2dsZSBQbGF5LjwvcD4KIDx1bD4KIDxsaT5BbGwgQVBLcyBtdXN0IGhhdmUgdGhlIHNhbWUgcGFja2FnZSBuYW1lPC9saT4KIDxsaT5BbGwgQVBLcyBtdXN0IGJlIHNpZ25lZCB3aXRoIHRoZSBzYW1lIGNlcnRpZmljYXRlPC9saT4KQEAgLTMxNyw3ICszMTcsNyBAQAogPC91bD4KIAogPHA+SXTigJlzIGFsc28gd29ydGggaW5zcGVjdGluZyB0aGUgY29tcGlsZWQgQVBLIGJlZm9yZSBwdXNoaW5nIHRvIG1hcmtldCwgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZW7igJl0Ci1hbnkgc3VycHJpc2VzIHRoYXQgY291bGQgaGlkZSB5b3VyIGFwcGxpY2F0aW9uIGluIE1hcmtldC4gIFRoaXMgaXMgYWN0dWFsbHkgcXVpdGUgc2ltcGxlIHVzaW5nIHRoZQorYW55IHN1cnByaXNlcyB0aGF0IGNvdWxkIGhpZGUgeW91ciBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheS4gIFRoaXMgaXMgYWN0dWFsbHkgcXVpdGUgc2ltcGxlIHVzaW5nIHRoZQogImFhcHQiIHRvb2wuICBBYXB0ICh0aGUgQW5kcm9pZCBBc3NldCBQYWNrYWdpbmcgVG9vbCkgaXMgcGFydCBvZiB0aGUgYnVpbGQgcHJvY2VzcyBmb3IgY3JlYXRpbmcgYW5kCiBwYWNrYWdpbmcgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9ucywgYW5kIGlzIGFsc28gYSB2ZXJ5IGhhbmR5IHRvb2wgZm9yIGluc3BlY3RpbmcgdGhlbS4gPC9wPgogCkBAIC0zNDUsMTEgKzM0NSwxNiBAQAogc3VwcG9ydHMtc2NyZWVucyBhbmQgY29tcGF0aWJsZS1zY3JlZW5zLCBhbmQgdGhhdCB5b3UgZG9u4oCZdCBoYXZlIHVuaW50ZW5kZWQgInVzZXMtZmVhdHVyZSIgdmFsdWVzCiB0aGF0IHdlcmUgYWRkZWQgYXMgYSByZXN1bHQgb2YgcGVybWlzc2lvbnMgeW91IHNldCBpbiB0aGUgbWFuaWZlc3QuIEluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgQVBLCiB3aWxsIGJlIGludmlzaWJsZSB0byBtb3N0LCBpZiBub3QgYWxsIGRldmljZXMuPC9wPgotPHA+V2h5PyAgQnkgYWRkaW5nIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uIFNFTkRfU01TLCB0aGUgZmVhdHVyZSByZXF1aXJlbWVudCBvZiBhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSB3YXMgaW1wbGljaXRseSBhZGRlZC4gIFNpbmNlIG1vc3QgKGlmIG5vdCBhbGwpIHhsYXJnZSBkZXZpY2VzIGFyZSB0YWJsZXRzIHdpdGhvdXQgdGVsZXBob255IGhhcmR3YXJlIGluIHRoZW0sIE1hcmtldCB3aWxsIGZpbHRlciBvdXQgdGhpcyBBUEsgaW4gdGhlc2UgY2FzZXMsIHVudGlsIGZ1dHVyZSBkZXZpY2VzIGNvbWUgYWxvbmcgd2hpY2ggYXJlIGJvdGggbGFyZ2UgZW5vdWdoIHRvIHJlcG9ydCBhcyB4bGFyZ2Ugc2NyZWVuIHNpemUsIGFuZCBwb3NzZXNzIHRlbGVwaG9ueSBoYXJkd2FyZS4KKzxwPldoeT8gIEJ5IGFkZGluZyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbiBTRU5EX1NNUywgdGhlIGZlYXR1cmUgcmVxdWlyZW1lbnQgb2YgYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkgd2FzIGltcGxpY2l0bHkgYWRkZWQuICBTaW5jZSBtb3N0IChpZiBub3QgYWxsKSB4bGFyZ2UgZGV2aWNlcyBhcmUgdGFibGV0cyB3aXRob3V0IHRlbGVwaG9ueSBoYXJkd2FyZSBpbiB0aGVtLCBHb29nbGUgUGxheSB3aWxsIGZpbHRlciBvdXQgdGhpcyBBUEsgaW4gdGhlc2UgY2FzZXMsIHVudGlsIGZ1dHVyZSBkZXZpY2VzIGNvbWUgYWxvbmcgd2hpY2ggYXJlIGJvdGggbGFyZ2UgZW5vdWdoIHRvIHJlcG9ydCBhcyB4bGFyZ2Ugc2NyZWVuIHNpemUsIGFuZCBwb3NzZXNzIHRlbGVwaG9ueSBoYXJkd2FyZS4KIDwvcD4KIDxwPkZvcnR1bmF0ZWx5IHRoaXMgaXMgZWFzaWx5IGZpeGVkIGJ5IGFkZGluZyB0aGUgZm9sbG93aW5nIHRvIHlvdXIKIG1hbmlmZXN0OjwvcD4KIDxwcmU+CiAmbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkiIGFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIiAvJmd0OwogPC9wcmU+Ci08cD5PbmNlIHlvdeKAmXZlIGNvbXBsZXRlZCB0aGUgcHJlLWxhdW5jaCBjaGVja2xpc3QsIHVwbG9hZCB5b3VyIEFQS3MgdG8gQW5kcm9pZCBNYXJrZXQuICBJdCBtYXkgdGFrZSBhIGJpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHNob3cgdXAgd2hlbiBicm93c2luZyBBbmRyb2lkIE1hcmtldCwgYnV0IHdoZW4gaXQgZG9lcywgcGVyZm9ybSBvbmUgbGFzdCBjaGVjay4gIERvd25sb2FkIHRoZSBhcHBsaWNhdGlvbiBvbnRvIGFueSB0ZXN0IGRldmljZXMgeW91IG1heSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBBUEtzIGFyZSB0YXJnZXRpbmcgdGhlIGludGVuZGVkIGRldmljZXMuIENvbmdyYXR1bGF0aW9ucywgeW914oCZcmUgZG9uZSE8L3A+Cis8cD5UaGUgPGNvZGU+YW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbjwvY29kZT4gcmVxdWlyZW1lbnQgaXMgYWxzbyBpbXBsaWNpdGx5IGFkZGVkLiBJZiB5b3Ugd2FudCB5b3VyIEFQSyB0byBiZSB2aXNpYmxlIG9uIFRWcyB3aGljaCBhcmUgbm9uLXRvdWNoc2NyZWVuIGRldmljZXMgeW91IHNob3VsZCBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIG1hbmlmZXN0OjwvcD4KKzxwcmU+CismbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbiIgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiIC8mZ3Q7Cis8L3ByZT4KKworPHA+T25jZSB5b3XigJl2ZSBjb21wbGV0ZWQgdGhlIHByZS1sYXVuY2ggY2hlY2tsaXN0LCB1cGxvYWQgeW91ciBBUEtzIHRvIEdvb2dsZSBQbGF5LiAgSXQgbWF5IHRha2UgYSBiaXQgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBzaG93IHVwIHdoZW4gYnJvd3NpbmcgR29vZ2xlIFBsYXksIGJ1dCB3aGVuIGl0IGRvZXMsIHBlcmZvcm0gb25lIGxhc3QgY2hlY2suICBEb3dubG9hZCB0aGUgYXBwbGljYXRpb24gb250byBhbnkgdGVzdCBkZXZpY2VzIHlvdSBtYXkgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgQVBLcyBhcmUgdGFyZ2V0aW5nIHRoZSBpbnRlbmRlZCBkZXZpY2VzLiBDb25ncmF0dWxhdGlvbnMsIHlvdeKAmXJlIGRvbmUhPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3MvdGV4dHVyZS5qZCBiL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL3RleHR1cmUuamQKaW5kZXggMmJiZTUxMS4uNDk3ZDZiOCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3MvdGV4dHVyZS5qZAorKysgYi9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy90ZXh0dXJlLmpkCkBAIC00MCw3ICs0MCw3IEBACiA8L2Rpdj4KIDwvZGl2PgogCi08cD5XaGVuIGRldmVsb3BpbmcgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uIHRvIHRha2UgYWR2YW50YWdlIG9mIG11bHRpcGxlIEFQS3Mgb24gQW5kcm9pZCBNYXJrZXQsIGl04oCZcyBpbXBvcnRhbnQgdG8gYWRvcHQgc29tZSBnb29kIHByYWN0aWNlcyBmcm9tIHRoZSBnZXQtZ28sIGFuZCBwcmV2ZW50IHVubmVjZXNzYXJ5IGhlYWRhY2hlcyBmdXJ0aGVyIGludG8gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuICBUaGlzIGxlc3NvbiBzaG93cyB5b3UgaG93IHRvIGNyZWF0ZSBtdWx0aXBsZSBBUEtzIG9mIHlvdXIgYXBwLCBlYWNoIHN1cHBvcnRpbmcgYSBkaWZmZXJlbnQgc3Vic2V0IG9mIE9wZW5HTCB0ZXh0dXJlIGZvcm1hdHMuICBZb3Ugd2lsbCBhbHNvIGdhaW4gc29tZSB0b29scyBuZWNlc3NhcnkgdG8gbWFrZSBtYWludGFpbmluZyBhIG11bHRpcGxlIEFQSyBjb2RlYmFzZSBhcyBwYWlubGVzcyBhcyBwb3NzaWJsZS48L3A+Cis8cD5XaGVuIGRldmVsb3BpbmcgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uIHRvIHRha2UgYWR2YW50YWdlIG9mIG11bHRpcGxlIEFQS3Mgb24gR29vZ2xlIFBsYXksIGl04oCZcyBpbXBvcnRhbnQgdG8gYWRvcHQgc29tZSBnb29kIHByYWN0aWNlcyBmcm9tIHRoZSBnZXQtZ28sIGFuZCBwcmV2ZW50IHVubmVjZXNzYXJ5IGhlYWRhY2hlcyBmdXJ0aGVyIGludG8gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuICBUaGlzIGxlc3NvbiBzaG93cyB5b3UgaG93IHRvIGNyZWF0ZSBtdWx0aXBsZSBBUEtzIG9mIHlvdXIgYXBwLCBlYWNoIHN1cHBvcnRpbmcgYSBkaWZmZXJlbnQgc3Vic2V0IG9mIE9wZW5HTCB0ZXh0dXJlIGZvcm1hdHMuICBZb3Ugd2lsbCBhbHNvIGdhaW4gc29tZSB0b29scyBuZWNlc3NhcnkgdG8gbWFrZSBtYWludGFpbmluZyBhIG11bHRpcGxlIEFQSyBjb2RlYmFzZSBhcyBwYWlubGVzcyBhcyBwb3NzaWJsZS48L3A+CiAKIAogPGgyIGlkPSJDb25maXJtIj5Db25maXJtIFlvdSBOZWVkIE11bHRpcGxlIEFQS3M8L2gyPgpAQCAtMTU4LDcgKzE1OCw3IEBACiAKIAogPGgyIGlkPSJBZGp1c3RNYW5pZmVzdHMiPkFkanVzdCB0aGUgTWFuaWZlc3RzPC9oMj4KLTxwPldoZW4gYSB1c2VyIGRvd25sb2FkcyBhbiBhcHBsaWNhdGlvbiB3aGljaCB1c2VzIG11bHRpcGxlIEFQS3MgdGhyb3VnaCBBbmRyb2lkIE1hcmtldCwgdGhlIGNvcnJlY3QKKzxwPldoZW4gYSB1c2VyIGRvd25sb2FkcyBhbiBhcHBsaWNhdGlvbiB3aGljaCB1c2VzIG11bHRpcGxlIEFQS3MgdGhyb3VnaCBHb29nbGUgUGxheSwgdGhlIGNvcnJlY3QKIEFQSyB0byB1c2UgaXMgY2hvc2VuIHVzaW5nIHNvbWUgc2ltcGxlIHJ1bGVzOjwvcD4KIAogPHVsPgpAQCAtMjQ2LDkgKzI0Niw5IEBACiA8L3ByZT4KIAogPGgyIGlkPSJQcmVMYXVuY2giPkdvIE92ZXIgUHJlLWxhdW5jaCBDaGVja2xpc3Q8L2gyPgotPHA+QmVmb3JlIHVwbG9hZGluZyB0byBBbmRyb2lkIE1hcmtldCwgZG91YmxlLWNoZWNrIHRoZSBmb2xsb3dpbmcgaXRlbXMuICBSZW1lbWJlciB0aGF0IHRoZXNlIGFyZQorPHA+QmVmb3JlIHVwbG9hZGluZyB0byBHb29nbGUgUGxheSwgZG91YmxlLWNoZWNrIHRoZSBmb2xsb3dpbmcgaXRlbXMuICBSZW1lbWJlciB0aGF0IHRoZXNlIGFyZQogc3BlY2lmaWNhbGx5IHJlbGV2YW50IHRvIG11bHRpcGxlIEFQS3MsIGFuZCBpbiBubyB3YXkgcmVwcmVzZW50IGEgY29tcGxldGUgY2hlY2tsaXN0IGZvciBhbGwKLWFwcGxpY2F0aW9ucyBiZWluZyB1cGxvYWRlZCB0byBBbmRyb2lkIE1hcmtldC48L3A+CithcHBsaWNhdGlvbnMgYmVpbmcgdXBsb2FkZWQgdG8gR29vZ2xlIFBsYXkuPC9wPgogCiA8dWw+CiA8bGk+QWxsIEFQS3MgbXVzdCBoYXZlIHRoZSBzYW1lIHBhY2thZ2UgbmFtZTwvbGk+CkBAIC0yNjIsNyArMjYyLDcgQEAKIDwvdWw+CiAKIDxwPkl04oCZcyBhbHNvIHdvcnRoIGluc3BlY3RpbmcgdGhlIGNvbXBpbGVkIEFQSyBiZWZvcmUgcHVzaGluZyB0byBtYXJrZXQsIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmVu4oCZdAotYW55IHN1cnByaXNlcyB0aGF0IGNvdWxkIGhpZGUgeW91ciBhcHBsaWNhdGlvbiBpbiBNYXJrZXQuICBUaGlzIGlzIGFjdHVhbGx5IHF1aXRlIHNpbXBsZSB1c2luZyB0aGUKK2FueSBzdXJwcmlzZXMgdGhhdCBjb3VsZCBoaWRlIHlvdXIgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkuICBUaGlzIGlzIGFjdHVhbGx5IHF1aXRlIHNpbXBsZSB1c2luZyB0aGUKICJhYXB0IiB0b29sLiAgQWFwdCAodGhlIEFuZHJvaWQgQXNzZXQgUGFja2FnaW5nIFRvb2wpIGlzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MgZm9yIGNyZWF0aW5nIGFuZAogcGFja2FnaW5nIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIGFuZCBpcyBhbHNvIGEgdmVyeSBoYW5keSB0b29sIGZvciBpbnNwZWN0aW5nIHRoZW0uIDwvcD4KIApAQCAtMjkwLDEwICsyOTAsMTUgQEAKIHN1cHBvcnRzLXNjcmVlbnMgYW5kIGNvbXBhdGlibGUtc2NyZWVucywgYW5kIHRoYXQgeW91IGRvbuKAmXQgaGF2ZSB1bmludGVuZGVkICJ1c2VzLWZlYXR1cmUiIHZhbHVlcwogdGhhdCB3ZXJlIGFkZGVkIGFzIGEgcmVzdWx0IG9mIHBlcm1pc3Npb25zIHlvdSBzZXQgaW4gdGhlIG1hbmlmZXN0LiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIEFQSwogd2lsbCBiZSBpbnZpc2libGUgdG8gbW9zdCwgaWYgbm90IGFsbCBkZXZpY2VzLjwvcD4KLTxwPldoeT8gIEJ5IGFkZGluZyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbiBTRU5EX1NNUywgdGhlIGZlYXR1cmUgcmVxdWlyZW1lbnQgb2YgYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkgd2FzIGltcGxpY2l0bHkgYWRkZWQuICBTaW5jZSBtb3N0IChpZiBub3QgYWxsKSB4bGFyZ2UgZGV2aWNlcyBhcmUgdGFibGV0cyB3aXRob3V0IHRlbGVwaG9ueSBoYXJkd2FyZSBpbiB0aGVtLCBNYXJrZXQgd2lsbCBmaWx0ZXIgb3V0IHRoaXMgQVBLIGluIHRoZXNlIGNhc2VzLCB1bnRpbCBmdXR1cmUgZGV2aWNlcyBjb21lIGFsb25nIHdoaWNoIGFyZSBib3RoIGxhcmdlIGVub3VnaCB0byByZXBvcnQgYXMgeGxhcmdlIHNjcmVlbiBzaXplLCBhbmQgcG9zc2VzcyB0ZWxlcGhvbnkgaGFyZHdhcmUuICAKKzxwPldoeT8gIEJ5IGFkZGluZyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbiBTRU5EX1NNUywgdGhlIGZlYXR1cmUgcmVxdWlyZW1lbnQgb2YgYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkgd2FzIGltcGxpY2l0bHkgYWRkZWQuICBTaW5jZSBtb3N0IChpZiBub3QgYWxsKSB4bGFyZ2UgZGV2aWNlcyBhcmUgdGFibGV0cyB3aXRob3V0IHRlbGVwaG9ueSBoYXJkd2FyZSBpbiB0aGVtLCBHb29nbGUgUGxheSB3aWxsIGZpbHRlciBvdXQgdGhpcyBBUEsgaW4gdGhlc2UgY2FzZXMsIHVudGlsIGZ1dHVyZSBkZXZpY2VzIGNvbWUgYWxvbmcgd2hpY2ggYXJlIGJvdGggbGFyZ2UgZW5vdWdoIHRvIHJlcG9ydCBhcyB4bGFyZ2Ugc2NyZWVuIHNpemUsIGFuZCBwb3NzZXNzIHRlbGVwaG9ueSBoYXJkd2FyZS4gIAogPC9wPgogPHA+Rm9ydHVuYXRlbHkgdGhpcyBpcyBlYXNpbHkgZml4ZWQgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgdG8geW91ciBtYW5pZmVzdDo8L3A+CiA8cHJlPgogJmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255IiBhbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSIgLyZndDsKIDwvcHJlPgotPHA+T25jZSB5b3XigJl2ZSBjb21wbGV0ZWQgdGhlIHByZS1sYXVuY2ggY2hlY2tsaXN0LCB1cGxvYWQgeW91ciBBUEtzIHRvIEFuZHJvaWQgTWFya2V0LiAgSXQgbWF5IHRha2UgYSBiaXQgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBzaG93IHVwIHdoZW4gYnJvd3NpbmcgQW5kcm9pZCBNYXJrZXQsIGJ1dCB3aGVuIGl0IGRvZXMsIHBlcmZvcm0gb25lIGxhc3QgY2hlY2suICBEb3dubG9hZCB0aGUgYXBwbGljYXRpb24gb250byBhbnkgdGVzdCBkZXZpY2VzIHlvdSBtYXkgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgQVBLcyBhcmUgdGFyZ2V0aW5nIHRoZSBpbnRlbmRlZCBkZXZpY2VzLiBDb25ncmF0dWxhdGlvbnMsIHlvdeKAmXJlIGRvbmUhPC9wPgorPHA+VGhlIDxjb2RlPmFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW48L2NvZGU+IHJlcXVpcmVtZW50IGlzIGFsc28gaW1wbGljaXRseSBhZGRlZC4gSWYgeW91IHdhbnQgeW91ciBBUEsgdG8gYmUgdmlzaWJsZSBvbiBUVnMgd2hpY2ggYXJlIG5vbi10b3VjaHNjcmVlbiBkZXZpY2VzIHlvdSBzaG91bGQgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBtYW5pZmVzdDo8L3A+Cis8cHJlPgorJmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4iIGFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIiAvJmd0OworPC9wcmU+CisKKzxwPk9uY2UgeW914oCZdmUgY29tcGxldGVkIHRoZSBwcmUtbGF1bmNoIGNoZWNrbGlzdCwgdXBsb2FkIHlvdXIgQVBLcyB0byBHb29nbGUgUGxheS4gIEl0IG1heSB0YWtlIGEgYml0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gc2hvdyB1cCB3aGVuIGJyb3dzaW5nIEdvb2dsZSBQbGF5LCBidXQgd2hlbiBpdCBkb2VzLCBwZXJmb3JtIG9uZSBsYXN0IGNoZWNrLiAgRG93bmxvYWQgdGhlIGFwcGxpY2F0aW9uIG9udG8gYW55IHRlc3QgZGV2aWNlcyB5b3UgbWF5IGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIEFQS3MgYXJlIHRhcmdldGluZyB0aGUgaW50ZW5kZWQgZGV2aWNlcy4gQ29uZ3JhdHVsYXRpb25zLCB5b3XigJlyZSBkb25lITwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXNjcmVlbi9zY3JlZW5zaXplcy5qZCBiL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXNjcmVlbi9zY3JlZW5zaXplcy5qZAppbmRleCAyZGIwYjY3Li5iZjE5YjA4IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlzY3JlZW4vc2NyZWVuc2l6ZXMuamQKKysrIGIvZG9jcy9odG1sL3RyYWluaW5nL211bHRpc2NyZWVuL3NjcmVlbnNpemVzLmpkCkBAIC0xNjQsMTQgKzE2NCwxNCBAQAogCiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL3RyYWluaW5nL211bHRpc2NyZWVuL25ld3NyZWFkZXIvcmVzL2xheW91dC9vbmVwYW5lLnhtbCBhbGx9CiA8L2xpPgotICA8bGk+PGNvZGU+cmVzL2xheW91dC14bGFyZ2UvbWFpbi54bWw8L2NvZGU+LCB0d28tcGFuZSBsYXlvdXQ6CisgIDxsaT48Y29kZT5yZXMvbGF5b3V0LWxhcmdlL21haW4ueG1sPC9jb2RlPiwgdHdvLXBhbmUgbGF5b3V0OgogCiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL3RyYWluaW5nL211bHRpc2NyZWVuL25ld3NyZWFkZXIvcmVzL2xheW91dC90d29wYW5lcy54bWwgYWxsfQogPC9saT4KIDwvdWw+CiAKLTxwPk5vdGljZSB0aGUgPGNvZGU+eGxhcmdlPC9jb2RlPiBxdWFsaWZpZXIgaW4gdGhlIGRpcmVjdG9yeSBuYW1lIG9mIHRoZSBzZWNvbmQgbGF5b3V0LiBUaGlzIGxheW91dAotd2lsbCBiZSBzZWxlY3RlZCBvbiBkZXZpY2VzIHdpdGggc2NyZWVucyBjbGFzc2lmaWVkIGFzIGV4dHJhLWxhcmdlIChmb3IgZXhhbXBsZSwgMTAiIHRhYmxldHMpLiBUaGUKKzxwPk5vdGljZSB0aGUgPGNvZGU+bGFyZ2U8L2NvZGU+IHF1YWxpZmllciBpbiB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgdGhlIHNlY29uZCBsYXlvdXQuIFRoaXMgbGF5b3V0Cit3aWxsIGJlIHNlbGVjdGVkIG9uIGRldmljZXMgd2l0aCBzY3JlZW5zIGNsYXNzaWZpZWQgYXMgbGFyZ2UgKGZvciBleGFtcGxlLCA3IiB0YWJsZXRzIGFuZCBhYm92ZSkuIFRoZQogb3RoZXIgbGF5b3V0ICh3aXRob3V0IHF1YWxpZmllcnMpIHdpbGwgYmUgc2VsZWN0ZWQgZm9yIHNtYWxsZXIgZGV2aWNlcy48L3A+CiAKIApAQCAtMTg4LDcgKzE4OCw3IEBACiB3aWR0aCBnaXZlbiBpbiBkcC4gRm9yIGV4YW1wbGUsIHRoZSB0eXBpY2FsIDciIHRhYmxldCBoYXMgYSBtaW5pbXVtIHdpZHRoIG9mCiA2MDAgZHAsIHNvIGlmIHlvdSB3YW50IHlvdXIgVUkgdG8gaGF2ZSB0d28gcGFuZXMgb24gdGhvc2Ugc2NyZWVucyAoYnV0IGEgc2luZ2xlCiBsaXN0IG9uIHNtYWxsZXIgc2NyZWVucyksIHlvdSBjYW4gdXNlIHRoZSBzYW1lIHR3byBsYXlvdXRzIGZyb20gdGhlIHByZXZpb3VzIHNlY3Rpb24gZm9yIHNpbmdsZQotYW5kIHR3by1wYW5lIGxheW91dHMsIGJ1dCBpbnN0ZWFkIG9mIHRoZSA8Y29kZT54bGFyZ2U8L2NvZGU+IHNpemUgcXVhbGlmaWVyLCB1c2UKK2FuZCB0d28tcGFuZSBsYXlvdXRzLCBidXQgaW5zdGVhZCBvZiB0aGUgPGNvZGU+bGFyZ2U8L2NvZGU+IHNpemUgcXVhbGlmaWVyLCB1c2UKIDxjb2RlPnN3NjAwZHA8L2NvZGU+IHRvIGluZGljYXRlIHRoZSB0d28tcGFuZSBsYXlvdXQgaXMgZm9yIHNjcmVlbnMgb24gd2hpY2ggdGhlIHNtYWxsZXN0LXdpZHRoCiBpcyA2MDAgZHA6PC9wPgogCkBAIC0yMDksOSArMjA5LDkgQEAKIGxheW91dC48L3A+CiAKIDxwPkhvd2V2ZXIsIHRoaXMgd29uJ3Qgd29yayB3ZWxsIG9uIHByZS0zLjIgZGV2aWNlcywgYmVjYXVzZSB0aGV5IGRvbid0Ci1yZWNvZ25pemUgPGNvZGU+c3c2MDBkcDwvY29kZT4gYXMgYSBzaXplIHF1YWxpZmllciwgc28geW91IHN0aWxsIGhhdmUgdG8gdXNlIHRoZSA8Y29kZT54bGFyZ2U8L2NvZGU+CityZWNvZ25pemUgPGNvZGU+c3c2MDBkcDwvY29kZT4gYXMgYSBzaXplIHF1YWxpZmllciwgc28geW91IHN0aWxsIGhhdmUgdG8gdXNlIHRoZSA8Y29kZT5sYXJnZTwvY29kZT4KIHF1YWxpZmllciBhcyB3ZWxsLiBTbywgeW91IHNob3VsZCBoYXZlIGEgZmlsZSBuYW1lZCAKLTxjb2RlPnJlcy9sYXlvdXQteGxhcmdlL21haW4ueG1sPC9jb2RlPgorPGNvZGU+cmVzL2xheW91dC1sYXJnZS9tYWluLnhtbDwvY29kZT4KIHdoaWNoIGlzIGlkZW50aWNhbCB0byA8Y29kZT5yZXMvbGF5b3V0LXN3NjAwZHAvbWFpbi54bWw8L2NvZGU+LiBJbiB0aGUgbmV4dCBzZWN0aW9uCiB5b3UnbGwgc2VlIGEgdGVjaG5pcXVlIHRoYXQgYWxsb3dzIHlvdSB0byBhdm9pZCBkdXBsaWNhdGluZyB0aGUgbGF5b3V0IGZpbGVzIHRoaXMgd2F5LjwvcD4KIApAQCAtMjIyLDIwICsyMjIsMjAgQEAKIFRoZXJlZm9yZSwgeW91IHNob3VsZCBhbHNvIHN0aWxsIHVzZSB0aGUgYWJzdHJhY3Qgc2l6ZSBiaW5zIChzbWFsbCwgbm9ybWFsLAogbGFyZ2UgYW5kIHhsYXJnZSkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMuIEZvciBleGFtcGxlLCBpZiB5b3UKIHdhbnQgdG8gZGVzaWduIHlvdXIgVUkgc28gdGhhdCBpdCBzaG93cyBhIHNpbmdsZS1wYW5lIFVJIG9uIHBob25lcyBidXQgYQotbXVsdGktcGFuZSBVSSBvbiA3IiB0YWJsZXRzIGFuZCBsYXJnZXIgZGV2aWNlcywgeW91J2QgaGF2ZSB0byBzdXBwbHkgdGhlc2UKK211bHRpLXBhbmUgVUkgb24gNyIgdGFibGV0cywgVFZzIGFuZCBvdGhlciBsYXJnZSBkZXZpY2VzLCB5b3UnZCBoYXZlIHRvIHN1cHBseSB0aGVzZQogZmlsZXM6PC9wPgogCiA8cD48dWw+CiA8bGk+PGNvZGU+cmVzL2xheW91dC9tYWluLnhtbDo8L2NvZGU+IHNpbmdsZS1wYW5lIGxheW91dDwvbGk+Ci08bGk+PGNvZGU+cmVzL2xheW91dC14bGFyZ2U6PC9jb2RlPiBtdWx0aS1wYW5lIGxheW91dDwvbGk+Cis8bGk+PGNvZGU+cmVzL2xheW91dC1sYXJnZTo8L2NvZGU+IG11bHRpLXBhbmUgbGF5b3V0PC9saT4KIDxsaT48Y29kZT5yZXMvbGF5b3V0LXN3NjAwZHA6PC9jb2RlPiBtdWx0aS1wYW5lIGxheW91dDwvbGk+CiA8L3VsPjwvcD4KIAogPHA+VGhlIGxhc3QgdHdvIGZpbGVzIGFyZSBpZGVudGljYWwsIGJlY2F1c2Ugb25lIG9mIHRoZW0gd2lsbCBiZSBtYXRjaGVkIGJ5Ci1BbmRyb2lkIDMuMiBkZXZpY2VzLCBhbmQgdGhlIG90aGVyIG9uZSBpcyBmb3IgdGhlIGJlbmVmaXQgb2YgdGFibGV0cyB3aXRoCitBbmRyb2lkIDMuMiBkZXZpY2VzLCBhbmQgdGhlIG90aGVyIG9uZSBpcyBmb3IgdGhlIGJlbmVmaXQgb2YgdGFibGV0cyBhbmQgVFZzIHdpdGgKIGVhcmxpZXIgdmVyc2lvbnMgb2YgQW5kcm9pZC48L3A+CiAKLTxwPlRvIGF2b2lkIHRoaXMgZHVwbGljYXRpb24gb2YgdGhlIHNhbWUgZmlsZSBmb3IgdGFibGV0cyAoYW5kIHRoZSBtYWludGVuYW5jZQorPHA+VG8gYXZvaWQgdGhpcyBkdXBsaWNhdGlvbiBvZiB0aGUgc2FtZSBmaWxlIGZvciB0YWJsZXRzIGFuZCBUVnMgKGFuZCB0aGUgbWFpbnRlbmFuY2UKIGhlYWRhY2hlIHJlc3VsdGluZyBmcm9tIGl0KSwgeW91IGNhbiB1c2UgYWxpYXMgZmlsZXMuIEZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSB0aGUgZm9sbG93aW5nCiBsYXlvdXRzOjwvcD4KIApAQCAtMjQ3LDcgKzI0Nyw3IEBACiA8cD5BbmQgYWRkIHRoZXNlIHR3byBmaWxlczo8L3A+CiAKIDxwPjx1bD4KLTxsaT48Y29kZT5yZXMvdmFsdWVzLXhsYXJnZS9sYXlvdXQueG1sPC9jb2RlPjoKKzxsaT48Y29kZT5yZXMvdmFsdWVzLWxhcmdlL2xheW91dC54bWw8L2NvZGU+OgogPHByZT4KICZsdDtyZXNvdXJjZXM+CiAgICAgJmx0O2l0ZW0gbmFtZT0ibWFpbiIgdHlwZT0ibGF5b3V0Ij4mIzY0O2xheW91dC9tYWluX3R3b3BhbmVzJmx0Oy9pdGVtPgpAQCAtMjY3LDkgKzI2Nyw5IEBACiAKIDxwPlRoZXNlIGxhdHRlciB0d28gZmlsZXMgaGF2ZSBpZGVudGljYWwgY29udGVudCwgYnV0IHRoZXkgZG9u4oCZdCBhY3R1YWxseSBkZWZpbmUKIHRoZSBsYXlvdXQuIFRoZXkgbWVyZWx5IHNldCB1cCB7QGNvZGUgbWFpbn0gdG8gYmUgYW4gYWxpYXMgdG8ge0Bjb2RlIG1haW5fdHdvcGFuZXN9LiBTaW5jZQotdGhlc2UgZmlsZXMgaGF2ZSA8Y29kZT54bGFyZ2U8L2NvZGU+IGFuZCA8Y29kZT5zdzYwMGRwPC9jb2RlPiBzZWxlY3RvcnMsIHRoZXkgYXJlCi1hcHBsaWVkIHRvIHRhYmxldHMgcmVnYXJkbGVzcyBvZiBBbmRyb2lkIHZlcnNpb24gKHByZS0zLjIgdGFibGV0cyBtYXRjaAote0Bjb2RlIHhsYXJnZX0sIGFuZCBwb3N0LTMuMiB3aWxsIG1hdGNoIDxjb2RlPnN3NjAwZHA8L2NvZGU+KS48L3A+Cit0aGVzZSBmaWxlcyBoYXZlIDxjb2RlPmxhcmdlPC9jb2RlPiBhbmQgPGNvZGU+c3c2MDBkcDwvY29kZT4gc2VsZWN0b3JzLCB0aGV5IGFyZQorYXBwbGllZCB0byB0YWJsZXRzIGFuZCBUVnMgcmVnYXJkbGVzcyBvZiBBbmRyb2lkIHZlcnNpb24gKHByZS0zLjIgdGFibGV0cyBhbmQgVFZzIG1hdGNoCit7QGNvZGUgbGFyZ2V9LCBhbmQgcG9zdC0zLjIgd2lsbCBtYXRjaCA8Y29kZT5zdzYwMGRwPC9jb2RlPikuPC9wPgogCiAKIDxoMiBpZD0iVGFza1VzZU9yaVF1YWxpIj5Vc2UgT3JpZW50YXRpb24gUXVhbGlmaWVyczwvaDI+IApAQCAtMjg1LDYgKzI4NSw3IEBACiA8bGk+PGI+NyIgdGFibGV0LCBsYW5kc2NhcGU6PC9iPiBkdWFsIHBhbmUsIHdpZGUsIHdpdGggYWN0aW9uIGJhcjwvbGk+CiA8bGk+PGI+MTAiIHRhYmxldCwgcG9ydHJhaXQ6PC9iPiBkdWFsIHBhbmUsIG5hcnJvdywgd2l0aCBhY3Rpb24gYmFyPC9saT4KIDxsaT48Yj4xMCIgdGFibGV0LCBsYW5kc2NhcGU6PC9iPiBkdWFsIHBhbmUsIHdpZGUsIHdpdGggYWN0aW9uIGJhcjwvbGk+Cis8bGk+PGI+VFYsIGxhbmRzY2FwZTo8L2I+IGR1YWwgcGFuZSwgd2lkZSwgd2l0aCBhY3Rpb24gYmFyPC9saT4KIDwvdWw+PC9wPgogCiA8cD5TbyBlYWNoIG9mIHRoZXNlIGxheW91dHMgaXMgZGVmaW5lZCBpbiBhbiBYTUwgZmlsZSBpbiB0aGUgCkBAIC0zMTksMTEgKzMyMCwxMSBAQAoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy90cmFpbmluZy9tdWx0aXNjcmVlbi9uZXdzcmVhZGVyL3Jlcy92YWx1ZXMtc3c2MDBkcC1wb3J0L2xheW91dHMueG1sCiBhbGx9CiAKLTxwPjxjb2RlPnJlcy92YWx1ZXMteGxhcmdlLWxhbmQvbGF5b3V0cy54bWw8L2NvZGU+OjwvcD4KLXtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvdHJhaW5pbmcvbXVsdGlzY3JlZW4vbmV3c3JlYWRlci9yZXMvdmFsdWVzLXhsYXJnZS1sYW5kL2xheW91dHMueG1sIGFsbH0KKzxwPjxjb2RlPnJlcy92YWx1ZXMtbGFyZ2UtbGFuZC9sYXlvdXRzLnhtbDwvY29kZT46PC9wPgore0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy90cmFpbmluZy9tdWx0aXNjcmVlbi9uZXdzcmVhZGVyL3Jlcy92YWx1ZXMtbGFyZ2UtbGFuZC9sYXlvdXRzLnhtbCBhbGx9CiAKLTxwPjxjb2RlPnJlcy92YWx1ZXMteGxhcmdlLXBvcnQvbGF5b3V0cy54bWw8L2NvZGU+OjwvcD4KLXtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvdHJhaW5pbmcvbXVsdGlzY3JlZW4vbmV3c3JlYWRlci9yZXMvdmFsdWVzLXhsYXJnZS1wb3J0L2xheW91dHMueG1sIGFsbH0KKzxwPjxjb2RlPnJlcy92YWx1ZXMtbGFyZ2UtcG9ydC9sYXlvdXRzLnhtbDwvY29kZT46PC9wPgore0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy90cmFpbmluZy9tdWx0aXNjcmVlbi9uZXdzcmVhZGVyL3Jlcy92YWx1ZXMtbGFyZ2UtcG9ydC9sYXlvdXRzLnhtbCBhbGx9CiAKIAogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvdHJhaW5pbmcvc2hhcmluZy9yZWNlaXZlLmpkIGIvZG9jcy9odG1sL3RyYWluaW5nL3NoYXJpbmcvcmVjZWl2ZS5qZAppbmRleCBjYzU1OTY3Li5hMGE1YmM4IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvdHJhaW5pbmcvc2hhcmluZy9yZWNlaXZlLmpkCisrKyBiL2RvY3MvaHRtbC90cmFpbmluZy9zaGFyaW5nL3JlY2VpdmUuamQKQEAgLTM0LDcgKzM0LDcgQEAKIGZyb20gYXBwbGljYXRpb25zLiBUaGluayBhYm91dCBob3cgdXNlcnMgaW50ZXJhY3Qgd2l0aCB5b3VyIGFwcGxpY2F0aW9uLCBhbmQgd2hhdCBkYXRhIHR5cGVzIHlvdSAKIHdhbnQgdG8gcmVjZWl2ZSBmcm9tIG90aGVyIGFwcGxpY2F0aW9ucy4gRm9yIGV4YW1wbGUsIGEgc29jaWFsIG5ldHdvcmtpbmcgYXBwbGljYXRpb24gd291bGQgbGlrZWx5IAogYmUgaW50ZXJlc3RlZCBpbiByZWNlaXZpbmcgdGV4dCBjb250ZW50LCBsaWtlIGFuIGludGVyZXN0aW5nIHdlYiBVUkwsIGZyb20gYW5vdGhlciBhcHAuIFRoZSAKLTxhIGhyZWY9Imh0dHBzOi8vbWFya2V0LmFuZHJvaWQuY29tL2RldGFpbHM/aWQ9Y29tLmdvb2dsZS5hbmRyb2lkLmFwcHMucGx1cyI+R29vZ2xlKyBBbmRyb2lkCis8YSBocmVmPSJodHRwczovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9kZXRhaWxzP2lkPWNvbS5nb29nbGUuYW5kcm9pZC5hcHBzLnBsdXMiPkdvb2dsZSsgQW5kcm9pZAogYXBwbGljYXRpb248L2E+IAogYWNjZXB0cyBib3RoIHRleHQgPGVtPmFuZDwvZW0+IHNpbmdsZSBvciBtdWx0aXBsZSBpbWFnZXMuIFdpdGggdGhpcyBhcHAsIGEgdXNlciBjYW4gZWFzaWx5IHN0YXJ0IGEgCiBuZXcgR29vZ2xlKyBwb3N0IHdpdGggcGhvdG9zIGZyb20gdGhlIEFuZHJvaWQgR2FsbGVyeSBhcHAuPC9wPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvQmluZGVyLmggYi9pbmNsdWRlL2JpbmRlci9CaW5kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzYWM0Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JpbmRlci9CaW5kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0JJTkRFUl9ICi0jZGVmaW5lIEFORFJPSURfQklOREVSX0gKLQotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBCQmluZGVyIDogcHVibGljIElCaW5kZXIKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIEJCaW5kZXIoKTsKLQotICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nMTYmIGdldEludGVyZmFjZURlc2NyaXB0b3IoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzQmluZGVyQWxpdmUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHBpbmdCaW5kZXIoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgdHJhbnNhY3QoICAgdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBsaW5rVG9EZWF0aChjb25zdCBzcDxEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICB1bmxpbmtUb0RlYXRoKCAgY29uc3Qgd3A8RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29va2llID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3A8RGVhdGhSZWNpcGllbnQ+KiBvdXRSZWNpcGllbnQgPSBOVUxMKTsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYXR0YWNoT2JqZWN0KCAgIGNvbnN0IHZvaWQqIG9iamVjdElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjbGVhbnVwQ29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9jbGVhbnVwX2Z1bmMgZnVuYyk7Ci0gICAgdmlydHVhbCB2b2lkKiAgICAgICBmaW5kT2JqZWN0KGNvbnN0IHZvaWQqIG9iamVjdElEKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGRldGFjaE9iamVjdChjb25zdCB2b2lkKiBvYmplY3RJRCk7Ci0KLSAgICB2aXJ0dWFsIEJCaW5kZXIqICAgIGxvY2FsQmluZGVyKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsICAgICAgICAgICAgIH5CQmluZGVyKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLQotcHJpdmF0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIEJCaW5kZXIoY29uc3QgQkJpbmRlciYgbyk7Ci0gICAgICAgICAgICBCQmluZGVyJiAgICBvcGVyYXRvcj0oY29uc3QgQkJpbmRlciYgbyk7Ci0KLSAgICBjbGFzcyBFeHRyYXM7Ci0KLSAgICAgICAgICAgIEV4dHJhcyogICAgIG1FeHRyYXM7Ci0gICAgICAgICAgICB2b2lkKiAgICAgICBtUmVzZXJ2ZWQwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJwUmVmQmFzZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXByb3RlY3RlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcFJlZkJhc2UoY29uc3Qgc3A8SUJpbmRlcj4mIG8pOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5CcFJlZkJhc2UoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkZpcnN0UmVmKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25MYXN0U3Ryb25nUmVmKGNvbnN0IHZvaWQqIGlkKTsKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICBvbkluY1N0cm9uZ0F0dGVtcHRlZCh1aW50MzJfdCBmbGFncywgY29uc3Qgdm9pZCogaWQpOwotCi0gICAgaW5saW5lICBJQmluZGVyKiAgICAgICAgcmVtb3RlKCkgICAgICAgICAgICAgICAgeyByZXR1cm4gbVJlbW90ZTsgfQotICAgIGlubGluZSAgSUJpbmRlciogICAgICAgIHJlbW90ZSgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIG1SZW1vdGU7IH0KLQotcHJpdmF0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcFJlZkJhc2UoY29uc3QgQnBSZWZCYXNlJiBvKTsKLSAgICBCcFJlZkJhc2UmICAgICAgICAgICAgICBvcGVyYXRvcj0oY29uc3QgQnBSZWZCYXNlJiBvKTsKLQotICAgIElCaW5kZXIqIGNvbnN0ICAgICAgICAgIG1SZW1vdGU7Ci0gICAgUmVmQmFzZTo6d2Vha3JlZl90eXBlKiAgbVJlZnM7Ci0gICAgdm9sYXRpbGUgaW50MzJfdCAgICAgICAgbVN0YXRlOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX0JJTkRFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9CaW5kZXJTZXJ2aWNlLmggYi9pbmNsdWRlL2JpbmRlci9CaW5kZXJTZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTk0ZDMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvQmluZGVyU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9CSU5ERVJfU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfQklOREVSX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10ZW1wbGF0ZTx0eXBlbmFtZSBTRVJWSUNFPgotY2xhc3MgQmluZGVyU2VydmljZQotewotcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBwdWJsaXNoKGJvb2wgYWxsb3dJc29sYXRlZCA9IGZhbHNlKSB7Ci0gICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20oZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkpOwotICAgICAgICByZXR1cm4gc20tPmFkZFNlcnZpY2UoU3RyaW5nMTYoU0VSVklDRTo6Z2V0U2VydmljZU5hbWUoKSksIG5ldyBTRVJWSUNFKCksIGFsbG93SXNvbGF0ZWQpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHB1Ymxpc2hBbmRKb2luVGhyZWFkUG9vbChib29sIGFsbG93SXNvbGF0ZWQgPSBmYWxzZSkgewotICAgICAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwotICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKLSAgICAgICAgc20tPmFkZFNlcnZpY2UoU3RyaW5nMTYoU0VSVklDRTo6Z2V0U2VydmljZU5hbWUoKSksIG5ldyBTRVJWSUNFKCksIGFsbG93SXNvbGF0ZWQpOwotICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgaW5zdGFudGlhdGUoKSB7IHB1Ymxpc2goKTsgfQotCi0gICAgc3RhdGljIHN0YXR1c190IHNodXRkb3duKCkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotfTsKLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZW5kaWYgLy8gQU5EUk9JRF9CSU5ERVJfU0VSVklDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9CcEJpbmRlci5oIGIvaW5jbHVkZS9iaW5kZXIvQnBCaW5kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmOTNhYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JpbmRlci9CcEJpbmRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfQlBCSU5ERVJfSAotI2RlZmluZSBBTkRST0lEX0JQQklOREVSX0gKLQotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBCcEJpbmRlciA6IHB1YmxpYyBJQmluZGVyCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBCcEJpbmRlcihpbnQzMl90IGhhbmRsZSk7Ci0KLSAgICBpbmxpbmUgIGludDMyX3QgICAgIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KLQotICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nMTYmICAgIGdldEludGVyZmFjZURlc2NyaXB0b3IoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzQmluZGVyQWxpdmUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHBpbmdCaW5kZXIoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgdHJhbnNhY3QoICAgdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBsaW5rVG9EZWF0aChjb25zdCBzcDxEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgdW5saW5rVG9EZWF0aCggIGNvbnN0IHdwPERlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPERlYXRoUmVjaXBpZW50Piogb3V0UmVjaXBpZW50ID0gTlVMTCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF0dGFjaE9iamVjdCggICBjb25zdCB2b2lkKiBvYmplY3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2xlYW51cENvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfY2xlYW51cF9mdW5jIGZ1bmMpOwotICAgIHZpcnR1YWwgdm9pZCogICAgICAgZmluZE9iamVjdChjb25zdCB2b2lkKiBvYmplY3RJRCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBkZXRhY2hPYmplY3QoY29uc3Qgdm9pZCogb2JqZWN0SUQpOwotCi0gICAgdmlydHVhbCBCcEJpbmRlciogICByZW1vdGVCaW5kZXIoKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0Q29uc3RhbnREYXRhKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRPYml0dWFyeSgpOwotCi0gICAgY2xhc3MgT2JqZWN0TWFuYWdlcgotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdE1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfk9iamVjdE1hbmFnZXIoKTsKLQotICAgICAgICB2b2lkICAgICAgICBhdHRhY2goIGNvbnN0IHZvaWQqIG9iamVjdElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjbGVhbnVwQ29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCaW5kZXI6Om9iamVjdF9jbGVhbnVwX2Z1bmMgZnVuYyk7Ci0gICAgICAgIHZvaWQqICAgICAgIGZpbmQoY29uc3Qgdm9pZCogb2JqZWN0SUQpIGNvbnN0OwotICAgICAgICB2b2lkICAgICAgICBkZXRhY2goY29uc3Qgdm9pZCogb2JqZWN0SUQpOwotCi0gICAgICAgIHZvaWQgICAgICAgIGtpbGwoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdE1hbmFnZXIoY29uc3QgT2JqZWN0TWFuYWdlciYpOwotICAgICAgICBPYmplY3RNYW5hZ2VyJiBvcGVyYXRvcj0oY29uc3QgT2JqZWN0TWFuYWdlciYpOwotCi0gICAgICAgIHN0cnVjdCBlbnRyeV90Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZvaWQqIG9iamVjdDsKLSAgICAgICAgICAgIHZvaWQqIGNsZWFudXBDb29raWU7Ci0gICAgICAgICAgICBJQmluZGVyOjpvYmplY3RfY2xlYW51cF9mdW5jIGZ1bmM7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgS2V5ZWRWZWN0b3I8Y29uc3Qgdm9pZCosIGVudHJ5X3Q+IG1PYmplY3RzOwotICAgIH07Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsICAgICAgICAgICAgIH5CcEJpbmRlcigpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25MYXN0U3Ryb25nUmVmKGNvbnN0IHZvaWQqIGlkKTsKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgIG9uSW5jU3Ryb25nQXR0ZW1wdGVkKHVpbnQzMl90IGZsYWdzLCBjb25zdCB2b2lkKiBpZCk7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgICBpbnQzMl90ICAgICAgICAgICAgIG1IYW5kbGU7Ci0KLSAgICBzdHJ1Y3QgT2JpdHVhcnkgewotICAgICAgICB3cDxEZWF0aFJlY2lwaWVudD4gcmVjaXBpZW50OwotICAgICAgICB2b2lkKiBjb29raWU7Ci0gICAgICAgIHVpbnQzMl90IGZsYWdzOwotICAgIH07Ci0KLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgcmVwb3J0T25lRGVhdGgoY29uc3QgT2JpdHVhcnkmIG9iaXQpOwotICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBpc0Rlc2NyaXB0b3JDYWNoZWQoKSBjb25zdDsKLQotICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKLSAgICAgICAgICAgIHZvbGF0aWxlIGludDMyX3QgICAgbUFsaXZlOwotICAgICAgICAgICAgdm9sYXRpbGUgaW50MzJfdCAgICBtT2JpdHNTZW50OwotICAgICAgICAgICAgVmVjdG9yPE9iaXR1YXJ5PiogICBtT2JpdHVhcmllczsKLSAgICAgICAgICAgIE9iamVjdE1hbmFnZXIgICAgICAgbU9iamVjdHM7Ci0gICAgICAgICAgICBQYXJjZWwqICAgICAgICAgICAgIG1Db25zdGFudERhdGE7Ci0gICAgbXV0YWJsZSBTdHJpbmcxNiAgICAgICAgICAgIG1EZXNjcmlwdG9yQ2FjaGU7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfQlBCSU5ERVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvSUJpbmRlci5oIGIvaW5jbHVkZS9iaW5kZXIvSUJpbmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWI1NmMyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYmluZGVyL0lCaW5kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lCSU5ERVJfSAotI2RlZmluZSBBTkRST0lEX0lCSU5ERVJfSAotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLQotI2RlZmluZSBCX1BBQ0tfQ0hBUlMoYzEsIGMyLCBjMywgYzQpIFwKLSAgICAoKCgoYzEpPDwyNCkpIHwgKCgoYzIpPDwxNikpIHwgKCgoYzMpPDw4KSkgfCAoYzQpKQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQkJpbmRlcjsKLWNsYXNzIEJwQmluZGVyOwotY2xhc3MgSUludGVyZmFjZTsKLWNsYXNzIFBhcmNlbDsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGFuZCBsb3ctbGV2ZWwgcHJvdG9jb2wgZm9yIGEgcmVtb3RhYmxlIG9iamVjdC4KLSAqIFlvdSBjYW4gZGVyaXZlIGZyb20gdGhpcyBjbGFzcyB0byBjcmVhdGUgYW4gb2JqZWN0IGZvciB3aGljaCBvdGhlcgotICogcHJvY2Vzc2VzIGNhbiBob2xkIHJlZmVyZW5jZXMgdG8gaXQuICBDb21tdW5pY2F0aW9uIGJldHdlZW4gcHJvY2Vzc2VzCi0gKiAobWV0aG9kIGNhbGxzLCBwcm9wZXJ0eSBnZXQgYW5kIHNldCkgaXMgZG93biB0aHJvdWdoIGEgbG93LWxldmVsCi0gKiBwcm90b2NvbCBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhlIHRyYW5zYWN0KCkgQVBJLgotICovCi1jbGFzcyBJQmluZGVyIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQotewotcHVibGljOgotICAgIGVudW0gewotICAgICAgICBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OICA9IDB4MDAwMDAwMDEsCi0gICAgICAgIExBU1RfQ0FMTF9UUkFOU0FDVElPTiAgID0gMHgwMGZmZmZmZiwKLQotICAgICAgICBQSU5HX1RSQU5TQUNUSU9OICAgICAgICA9IEJfUEFDS19DSEFSUygnXycsJ1AnLCdOJywnRycpLAotICAgICAgICBEVU1QX1RSQU5TQUNUSU9OICAgICAgICA9IEJfUEFDS19DSEFSUygnXycsJ0QnLCdNJywnUCcpLAotICAgICAgICBJTlRFUkZBQ0VfVFJBTlNBQ1RJT04gICA9IEJfUEFDS19DSEFSUygnXycsICdOJywgJ1QnLCAnRicpLAotCi0gICAgICAgIC8vIENvcnJlc3BvbmRzIHRvIFRGX09ORV9XQVkgLS0gYW4gYXN5bmNocm9ub3VzIGNhbGwuCi0gICAgICAgIEZMQUdfT05FV0FZICAgICAgICAgICAgID0gMHgwMDAwMDAwMQotICAgIH07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSUJpbmRlcigpOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhpcyBJQmluZGVyIGltcGxlbWVudHMgdGhlIGludGVyZmFjZSBuYW1lZCBieQotICAgICAqIEBhIGRlc2NyaXB0b3IuICBJZiBpdCBkb2VzLCB0aGUgYmFzZSBwb2ludGVyIHRvIGl0IGlzIHJldHVybmVkLAotICAgICAqIHdoaWNoIHlvdSBjYW4gc2FmZWx5IHN0YXRpY19jYXN0PD4gdG8gdGhlIGNvbmNyZXRlIEMrKyBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgdmlydHVhbCBzcDxJSW50ZXJmYWNlPiAgcXVlcnlMb2NhbEludGVyZmFjZShjb25zdCBTdHJpbmcxNiYgZGVzY3JpcHRvcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhpcyBJQmluZGVyCi0gICAgICogb2JqZWN0LgotICAgICAqLwotICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nMTYmIGdldEludGVyZmFjZURlc2NyaXB0b3IoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICBpc0JpbmRlckFsaXZlKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHBpbmdCaW5kZXIoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHRyYW5zYWN0KCAgIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgeW91IHRvIGFkZCBkYXRhIHRoYXQgaXMgdHJhbnNwb3J0ZWQgdGhyb3VnaAotICAgICAqIElQQyBhbG9uZyB3aXRoIHlvdXIgSUJpbmRlciBwb2ludGVyLiAgV2hlbiBpbXBsZW1lbnRpbmcgYSBCaW5kZXIKLSAgICAgKiBvYmplY3QsIG92ZXJyaWRlIGl0IHRvIHdyaXRlIHlvdXIgZGVzaXJlZCBkYXRhIGluIHRvIEBhIG91dERhdGEuCi0gICAgICogWW91IGNhbiB0aGVuIGNhbGwgZ2V0Q29uc3RhbnREYXRhKCkgb24geW91ciBJQmluZGVyIHRvIHJldHJpZXZlCi0gICAgICogdGhhdCBkYXRhLCBmcm9tIGFueSBwcm9jZXNzLiAgWW91IE1VU1QgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgKiB3cml0dGVuIGluIHRvIHRoZSBwYXJjZWwgKGluY2x1ZGluZyBwYWRkaW5nKS4KLSAgICAgKi8KLSAgICBjbGFzcyBEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSA9IDA7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIHRoZSBAYSByZWNpcGllbnQgZm9yIGEgbm90aWZpY2F0aW9uIGlmIHRoaXMgYmluZGVyCi0gICAgICogZ29lcyBhd2F5LiAgSWYgdGhpcyBiaW5kZXIgb2JqZWN0IHVuZXhwZWN0ZWRseSBnb2VzIGF3YXkKLSAgICAgKiAodHlwaWNhbGx5IGJlY2F1c2UgaXRzIGhvc3RpbmcgcHJvY2VzcyBoYXMgYmVlbiBraWxsZWQpLAotICAgICAqIHRoZW4gRGVhdGhSZWNpcGllbnQ6OmJpbmRlckRpZWQoKSB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgcmVmZXJlbmNlCi0gICAgICogdG8gdGhpcy4KLSAgICAgKgotICAgICAqIFRoZSBAYSBjb29raWUgaXMgb3B0aW9uYWwgLS0gaWYgbm9uLU5VTEwsIGl0IHNob3VsZCBiZSBhCi0gICAgICogbWVtb3J5IGFkZHJlc3MgdGhhdCB5b3Ugb3duICh0aGF0IGlzLCB5b3Uga25vdyBpdCBpcyB1bmlxdWUpLgotICAgICAqCi0gICAgICogQG5vdGUgWW91IHdpbGwgb25seSByZWNlaXZlIGRlYXRoIG5vdGlmaWNhdGlvbnMgZm9yIHJlbW90ZSBiaW5kZXJzLAotICAgICAqIGFzIGxvY2FsIGJpbmRlcnMgYnkgZGVmaW5pdGlvbiBjYW4ndCBkaWUgd2l0aG91dCB5b3UgZHlpbmcgYXMgd2VsbC4KLSAgICAgKiBUcnlpbmcgdG8gdXNlIHRoaXMgZnVuY3Rpb24gb24gYSBsb2NhbCBiaW5kZXIgd2lsbCByZXN1bHQgaW4gYW4KLSAgICAgKiBJTlZBTElEX09QRVJBVElPTiBjb2RlIGJlaW5nIHJldHVybmVkIGFuZCBub3RoaW5nIGhhcHBlbmluZy4KLSAgICAgKgotICAgICAqIEBub3RlIFRoaXMgbGluayBhbHdheXMgaG9sZHMgYSB3ZWFrIHJlZmVyZW5jZSB0byBpdHMgcmVjaXBpZW50LgotICAgICAqCi0gICAgICogQG5vdGUgWW91IHdpbGwgb25seSByZWNlaXZlIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIGRlYWQKLSAgICAgKiBiaW5kZXIuICBZb3Ugc2hvdWxkIG5vdCB0cnkgdG8gcHJvbW90ZSB0aGlzIHRvIGEgc3Ryb25nIHJlZmVyZW5jZS4KLSAgICAgKiAoTm9yIHNob3VsZCB5b3UgbmVlZCB0bywgYXMgdGhlcmUgaXMgbm90aGluZyB1c2VmdWwgeW91IGNhbgotICAgICAqIGRpcmVjdGx5IGRvIHdpdGggaXQgbm93IHRoYXQgaXQgaGFzIHBhc3NlZCBvbi4pCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgbGlua1RvRGVhdGgoY29uc3Qgc3A8RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29va2llID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBkZWF0aCBub3RpZmljYXRpb24uCi0gICAgICogVGhlIEBhIHJlY2lwaWVudCB3aWxsIG5vIGxvbmdlciBiZSBjYWxsZWQgaWYgdGhpcyBvYmplY3QKLSAgICAgKiBkaWVzLiAgVGhlIEBhIGNvb2tpZSBpcyBvcHRpb25hbC4gIElmIG5vbi1OVUxMLCB5b3UgY2FuCi0gICAgICogc3VwcGx5IGEgTlVMTCBAYSByZWNpcGllbnQsIGFuZCB0aGUgcmVjaXBpZW50IHByZXZpb3VzbHkKLSAgICAgKiBhZGRlZCB3aXRoIHRoYXQgY29va2llIHdpbGwgYmUgdW5saW5rZWQuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdW5saW5rVG9EZWF0aCggIGNvbnN0IHdwPERlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb29raWUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPERlYXRoUmVjaXBpZW50Piogb3V0UmVjaXBpZW50ID0gTlVMTCkgPSAwOwotCi0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgY2hlY2tTdWJjbGFzcyhjb25zdCB2b2lkKiBzdWJjbGFzc0lEKSBjb25zdDsKLQotICAgIHR5cGVkZWYgdm9pZCAoKm9iamVjdF9jbGVhbnVwX2Z1bmMpKGNvbnN0IHZvaWQqIGlkLCB2b2lkKiBvYmosIHZvaWQqIGNsZWFudXBDb29raWUpOwotCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgYXR0YWNoT2JqZWN0KCAgIGNvbnN0IHZvaWQqIG9iamVjdElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNsZWFudXBDb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9jbGVhbnVwX2Z1bmMgZnVuYykgPSAwOwotICAgIHZpcnR1YWwgdm9pZCogICAgICAgICAgIGZpbmRPYmplY3QoY29uc3Qgdm9pZCogb2JqZWN0SUQpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkZXRhY2hPYmplY3QoY29uc3Qgdm9pZCogb2JqZWN0SUQpID0gMDsKLQotICAgIHZpcnR1YWwgQkJpbmRlciogICAgICAgIGxvY2FsQmluZGVyKCk7Ci0gICAgdmlydHVhbCBCcEJpbmRlciogICAgICAgcmVtb3RlQmluZGVyKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsICAgICAgICAgIH5JQmluZGVyKCk7Ci0KLXByaXZhdGU6Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfSUJJTkRFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9JSW50ZXJmYWNlLmggYi9pbmNsdWRlL2JpbmRlci9JSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOWY2OWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvSUludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotI2lmbmRlZiBBTkRST0lEX0lJTlRFUkZBQ0VfSAotI2RlZmluZSBBTkRST0lEX0lJTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSUludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgIElJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgYXNCaW5kZXIoKTsKLSAgICAgICAgICAgIHNwPGNvbnN0IElCaW5kZXI+ICAgYXNCaW5kZXIoKSBjb25zdDsKLSAgICAgICAgICAgIAotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgICAgICB+SUludGVyZmFjZSgpOwotICAgIHZpcnR1YWwgSUJpbmRlciogICAgICAgICAgICBvbkFzQmluZGVyKCkgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBJTlRFUkZBQ0U+Ci1pbmxpbmUgc3A8SU5URVJGQUNFPiBpbnRlcmZhY2VfY2FzdChjb25zdCBzcDxJQmluZGVyPiYgb2JqKQotewotICAgIHJldHVybiBJTlRFUkZBQ0U6OmFzSW50ZXJmYWNlKG9iaik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSU5URVJGQUNFPgotY2xhc3MgQm5JbnRlcmZhY2UgOiBwdWJsaWMgSU5URVJGQUNFLCBwdWJsaWMgQkJpbmRlcgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3A8SUludGVyZmFjZT4gICAgICBxdWVyeUxvY2FsSW50ZXJmYWNlKGNvbnN0IFN0cmluZzE2JiBfZGVzY3JpcHRvcik7Ci0gICAgdmlydHVhbCBjb25zdCBTdHJpbmcxNiYgICAgIGdldEludGVyZmFjZURlc2NyaXB0b3IoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgSUJpbmRlciogICAgICAgICAgICBvbkFzQmluZGVyKCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlPHR5cGVuYW1lIElOVEVSRkFDRT4KLWNsYXNzIEJwSW50ZXJmYWNlIDogcHVibGljIElOVEVSRkFDRSwgcHVibGljIEJwUmVmQmFzZQotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcEludGVyZmFjZShjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgSUJpbmRlciogICAgICAgICAgICBvbkFzQmluZGVyKCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShJTlRFUkZBQ0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYgZGVzY3JpcHRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGF0aWMgYW5kcm9pZDo6c3A8SSMjSU5URVJGQUNFPiBhc0ludGVyZmFjZSggICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklCaW5kZXI+JiBvYmopOyAgICAgICAgICAgICAgICAgIFwKLSAgICB2aXJ0dWFsIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkgY29uc3Q7ICAgIFwKLSAgICBJIyNJTlRFUkZBQ0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2aXJ0dWFsIH5JIyNJTlRFUkZBQ0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotCi0jZGVmaW5lIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShJTlRFUkZBQ0UsIE5BTUUpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYgSSMjSU5URVJGQUNFOjpkZXNjcmlwdG9yKE5BTUUpOyAgICAgICAgICAgICBcCi0gICAgY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBJIyNJTlRFUkZBQ0U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSBjb25zdCB7ICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiBJIyNJTlRFUkZBQ0U6OmRlc2NyaXB0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYW5kcm9pZDo6c3A8SSMjSU5URVJGQUNFPiBJIyNJTlRFUkZBQ0U6OmFzSW50ZXJmYWNlKCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJQmluZGVyPiYgb2JqKSAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGFuZHJvaWQ6OnNwPEkjI0lOVEVSRkFDRT4gaW50cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChvYmogIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpbnRyID0gc3RhdGljX2Nhc3Q8SSMjSU5URVJGQUNFKj4oICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgb2JqLT5xdWVyeUxvY2FsSW50ZXJmYWNlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBJIyNJTlRFUkZBQ0U6OmRlc2NyaXB0b3IpLmdldCgpKTsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZiAoaW50ciA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgaW50ciA9IG5ldyBCcCMjSU5URVJGQUNFKG9iaik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiBpbnRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgSSMjSU5URVJGQUNFOjpJIyNJTlRFUkZBQ0UoKSB7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgSSMjSU5URVJGQUNFOjp+SSMjSU5URVJGQUNFKCkgeyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLQotI2RlZmluZSBDSEVDS19JTlRFUkZBQ0UoaW50ZXJmYWNlLCBkYXRhLCByZXBseSkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghZGF0YS5jaGVja0ludGVyZmFjZSh0aGlzKSkgeyByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7IH0gICAgICAgXAotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vIHVzZXItc2VydmljZWFibGUgcGFydHMgYWZ0ZXIgdGhpcy4uLgotCi10ZW1wbGF0ZTx0eXBlbmFtZSBJTlRFUkZBQ0U+Ci1pbmxpbmUgc3A8SUludGVyZmFjZT4gQm5JbnRlcmZhY2U8SU5URVJGQUNFPjo6cXVlcnlMb2NhbEludGVyZmFjZSgKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIF9kZXNjcmlwdG9yKQotewotICAgIGlmIChfZGVzY3JpcHRvciA9PSBJTlRFUkZBQ0U6OmRlc2NyaXB0b3IpIHJldHVybiB0aGlzOwotICAgIHJldHVybiBOVUxMOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBJTlRFUkZBQ0U+Ci1pbmxpbmUgY29uc3QgU3RyaW5nMTYmIEJuSW50ZXJmYWNlPElOVEVSRkFDRT46OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSBjb25zdAotewotICAgIHJldHVybiBJTlRFUkZBQ0U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSU5URVJGQUNFPgotSUJpbmRlciogQm5JbnRlcmZhY2U8SU5URVJGQUNFPjo6b25Bc0JpbmRlcigpCi17Ci0gICAgcmV0dXJuIHRoaXM7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIElOVEVSRkFDRT4KLWlubGluZSBCcEludGVyZmFjZTxJTlRFUkZBQ0U+OjpCcEludGVyZmFjZShjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlKQotICAgIDogQnBSZWZCYXNlKHJlbW90ZSkKLXsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSU5URVJGQUNFPgotaW5saW5lIElCaW5kZXIqIEJwSW50ZXJmYWNlPElOVEVSRkFDRT46Om9uQXNCaW5kZXIoKQotewotICAgIHJldHVybiByZW1vdGUoKTsKLX0KLSAgICAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSUlOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9JTWVtb3J5LmggYi9pbmNsdWRlL2JpbmRlci9JTWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMGRiMDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvSU1lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSU1FTU9SWV9ICi0jZGVmaW5lIEFORFJPSURfSU1FTU9SWV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJTWVtb3J5SGVhcCA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZW1vcnlIZWFwKTsKLQotICAgIC8vIGZsYWdzIHJldHVybmVkIGJ5IGdldEZsYWdzKCkKLSAgICBlbnVtIHsKLSAgICAgICAgUkVBRF9PTkxZICAgPSAweDAwMDAwMDAxCi0gICAgfTsKLQotICAgIHZpcnR1YWwgaW50ICAgICAgICAgZ2V0SGVhcElEKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgdm9pZCogICAgICAgZ2V0QmFzZSgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGdldFNpemUoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRGbGFncygpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGdldE9mZnNldCgpIGNvbnN0ID0gMDsKLQotICAgIC8vIHRoZXNlIGFyZSB0aGVyZSBqdXN0IGZvciBiYWNrd2FyZCBzb3VyY2UgY29tcGF0aWJpbGl0eQotICAgIGludDMyX3QgaGVhcElEKCkgY29uc3QgeyByZXR1cm4gZ2V0SGVhcElEKCk7IH0KLSAgICB2b2lkKiAgIGJhc2UoKSBjb25zdCAgeyByZXR1cm4gZ2V0QmFzZSgpOyB9Ci0gICAgc2l6ZV90ICB2aXJ0dWFsU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFNpemUoKTsgfQotfTsKLQotY2xhc3MgQm5NZW1vcnlIZWFwIDogcHVibGljIEJuSW50ZXJmYWNlPElNZW1vcnlIZWFwPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCggCi0gICAgICAgICAgICB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci0gICAgCi0gICAgQm5NZW1vcnlIZWFwKCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+Qm5NZW1vcnlIZWFwKCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIElNZW1vcnkgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVtb3J5KTsKLQotICAgIHZpcnR1YWwgc3A8SU1lbW9yeUhlYXA+IGdldE1lbW9yeShzc2l6ZV90KiBvZmZzZXQ9MCwgc2l6ZV90KiBzaXplPTApIGNvbnN0ID0gMDsKLQotICAgIC8vIGhlbHBlcnMKLSAgICB2b2lkKiBmYXN0UG9pbnRlcihjb25zdCBzcDxJQmluZGVyPiYgaGVhcCwgc3NpemVfdCBvZmZzZXQpIGNvbnN0OwotICAgIHZvaWQqIHBvaW50ZXIoKSBjb25zdDsKLSAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OwotICAgIHNzaXplX3Qgb2Zmc2V0KCkgY29uc3Q7Ci19OwotCi1jbGFzcyBCbk1lbW9yeSA6IHB1YmxpYyBCbkludGVyZmFjZTxJTWVtb3J5PgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLQotICAgIEJuTWVtb3J5KCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+Qm5NZW1vcnkoKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSU1FTU9SWV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oIGIvaW5jbHVkZS9iaW5kZXIvSVBDVGhyZWFkU3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxYmEyZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSVBDX1RIUkVBRF9TVEFURV9ICi0jZGVmaW5lIEFORFJPSURfSVBDX1RIUkVBRF9TVEFURV9ICi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi0jaWZkZWYgSEFWRV9XSU4zMl9QUk9DCi10eXBlZGVmICBpbnQgIHVpZF90OwotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJUENUaHJlYWRTdGF0ZQotewotcHVibGljOgotICAgIHN0YXRpYyAgSVBDVGhyZWFkU3RhdGUqICAgICBzZWxmKCk7Ci0gICAgc3RhdGljICBJUENUaHJlYWRTdGF0ZSogICAgIHNlbGZPck51bGwoKTsgIC8vIHNlbGYoKSwgYnV0IHdvbid0IGluc3RhbnRpYXRlCi0gICAgCi0gICAgICAgICAgICBzcDxQcm9jZXNzU3RhdGU+ICAgIHByb2Nlc3MoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBjbGVhckxhc3RFcnJvcigpOwotCi0gICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1VpZCgpOwotICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBnZXRPcmlnQ2FsbGluZ1VpZCgpOwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNldFN0cmljdE1vZGVQb2xpY3koaW50MzJfdCBwb2xpY3kpOwotICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBnZXRTdHJpY3RNb2RlUG9saWN5KCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0TGFzdFRyYW5zYWN0aW9uQmluZGVyRmxhZ3MoaW50MzJfdCBmbGFncyk7Ci0gICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGdldExhc3RUcmFuc2FjdGlvbkJpbmRlckZsYWdzKCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpbnQ2NF90IHRva2VuKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBmbHVzaENvbW1hbmRzKCk7Ci0KLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgam9pblRocmVhZFBvb2woYm9vbCBpc01haW4gPSB0cnVlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU3RvcCB0aGUgbG9jYWwgcHJvY2Vzcy4KLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc3RvcFByb2Nlc3MoYm9vbCBpbW1lZGlhdGUgPSB0cnVlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICB0cmFuc2FjdChpbnQzMl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgaW5jU3Ryb25nSGFuZGxlKGludDMyX3QgaGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgZGVjU3Ryb25nSGFuZGxlKGludDMyX3QgaGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgaW5jV2Vha0hhbmRsZShpbnQzMl90IGhhbmRsZSk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIGRlY1dlYWtIYW5kbGUoaW50MzJfdCBoYW5kbGUpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBhdHRlbXB0SW5jU3Ryb25nSGFuZGxlKGludDMyX3QgaGFuZGxlKTsKLSAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICAgICAgZXhwdW5nZUhhbmRsZShpbnQzMl90IGhhbmRsZSwgSUJpbmRlciogYmluZGVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgcmVxdWVzdERlYXRoTm90aWZpY2F0aW9uKCAgIGludDMyX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnBCaW5kZXIqIHByb3h5KTsgCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIGNsZWFyRGVhdGhOb3RpZmljYXRpb24oIGludDMyX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcEJpbmRlciogcHJveHkpOyAKLQotICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgICAgICBzaHV0ZG93bigpOwotICAgIAotICAgIC8vIENhbGwgdGhpcyB0byBkaXNhYmxlIHN3aXRjaGluZyB0aHJlYWRzIHRvIGJhY2tncm91bmQgc2NoZWR1bGluZyB3aGVuCi0gICAgLy8gcmVjZWl2aW5nIGluY29taW5nIElQQyBjYWxscy4gIFRoaXMgaXMgc3BlY2lmaWNhbGx5IGhlcmUgZm9yIHRoZQotICAgIC8vIEFuZHJvaWQgc3lzdGVtIHByb2Nlc3MsIHNpbmNlIGl0IGV4cGVjdHMgdG8gaGF2ZSBiYWNrZ3JvdW5kIGFwcHMgY2FsbGluZwotICAgIC8vIGluIHRvIGl0IGJ1dCBkb2Vzbid0IHdhbnQgdG8gYWNxdWlyZSBsb2NrcyBpbiBpdHMgc2VydmljZXMgd2hpbGUgaW4KLSAgICAvLyB0aGUgYmFja2dyb3VuZC4KLSAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICAgICAgZGlzYWJsZUJhY2tncm91bmRTY2hlZHVsaW5nKGJvb2wgZGlzYWJsZSk7Ci0gICAgCi1wcml2YXRlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+SVBDVGhyZWFkU3RhdGUoKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBzZW5kUmVwbHkoY29uc3QgUGFyY2VsJiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICB3YWl0Rm9yUmVzcG9uc2UoUGFyY2VsICpyZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICphY3F1aXJlUmVzdWx0PU5VTEwpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICB0YWxrV2l0aERyaXZlcihib29sIGRvUmVjZWl2ZT10cnVlKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVUcmFuc2FjdGlvbkRhdGEoaW50MzJfdCBjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJpbmRlckZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCogc3RhdHVzQnVmZmVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgZXhlY3V0ZUNvbW1hbmQoaW50MzJfdCBjb21tYW5kKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBjbGVhckNhbGxlcigpOwotICAgICAgICAgICAgCi0gICAgc3RhdGljICB2b2lkICAgICAgICAgICAgICAgIHRocmVhZERlc3RydWN0b3Iodm9pZCAqc3QpOwotICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgICAgICBmcmVlQnVmZmVyKFBhcmNlbCogcGFyY2VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QqIG9iamVjdHMsIHNpemVfdCBvYmplY3RzU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb29raWUpOwotICAgIAotICAgIGNvbnN0ICAgc3A8UHJvY2Vzc1N0YXRlPiAgICBtUHJvY2VzczsKLSAgICBjb25zdCAgIHBpZF90ICAgICAgICAgICAgICAgbU15VGhyZWFkSWQ7Ci0gICAgICAgICAgICBWZWN0b3I8QkJpbmRlcio+ICAgIG1QZW5kaW5nU3Ryb25nRGVyZWZzOwotICAgICAgICAgICAgVmVjdG9yPFJlZkJhc2U6OndlYWtyZWZfdHlwZSo+IG1QZW5kaW5nV2Vha0RlcmVmczsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUGFyY2VsICAgICAgICAgICAgICBtSW47Ci0gICAgICAgICAgICBQYXJjZWwgICAgICAgICAgICAgIG1PdXQ7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIG1MYXN0RXJyb3I7Ci0gICAgICAgICAgICBwaWRfdCAgICAgICAgICAgICAgIG1DYWxsaW5nUGlkOwotICAgICAgICAgICAgdWlkX3QgICAgICAgICAgICAgICBtQ2FsbGluZ1VpZDsKLSAgICAgICAgICAgIHVpZF90ICAgICAgICAgICAgICAgbU9yaWdDYWxsaW5nVWlkOwotICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBtU3RyaWN0TW9kZVBvbGljeTsKLSAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgbUxhc3RUcmFuc2FjdGlvbkJpbmRlckZsYWdzOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX0lQQ19USFJFQURfU1RBVEVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvSVBlcm1pc3Npb25Db250cm9sbGVyLmggYi9pbmNsdWRlL2JpbmRlci9JUGVybWlzc2lvbkNvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkMzcxYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JpbmRlci9JUGVybWlzc2lvbkNvbnRyb2xsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotI2lmbmRlZiBBTkRST0lEX0lQRVJNSVNTSU9OX0NPTlRST0xMRVJfSAotI2RlZmluZSBBTkRST0lEX0lQRVJNSVNTSU9OX0NPTlRST0xMRVJfSAotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIElQZXJtaXNzaW9uQ29udHJvbGxlciA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShQZXJtaXNzaW9uQ29udHJvbGxlcik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwaWQsIGludDMyX3QgdWlkKSA9IDA7Ci0gICAgCi0gICAgZW51bSB7Ci0gICAgICAgIENIRUNLX1BFUk1JU1NJT05fVFJBTlNBQ1RJT04gPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OCi0gICAgfTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5QZXJtaXNzaW9uQ29udHJvbGxlciA6IHB1YmxpYyBCbkludGVyZmFjZTxJUGVybWlzc2lvbkNvbnRyb2xsZXI+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0lQRVJNSVNTSU9OX0NPTlRST0xMRVJfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9JU2VydmljZU1hbmFnZXIuaCBiL2luY2x1ZGUvYmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzI5N2Q2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotI2lmbmRlZiBBTkRST0lEX0lTRVJWSUNFX01BTkFHRVJfSAotI2RlZmluZSBBTkRST0lEX0lTRVJWSUNFX01BTkFHRVJfSAotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBlcm1pc3Npb25Db250cm9sbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIElTZXJ2aWNlTWFuYWdlciA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTZXJ2aWNlTWFuYWdlcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBhbiBleGlzdGluZyBzZXJ2aWNlLCBibG9ja2luZyBmb3IgYSBmZXcgc2Vjb25kcwotICAgICAqIGlmIGl0IGRvZXNuJ3QgeWV0IGV4aXN0LgotICAgICAqLwotICAgIHZpcnR1YWwgc3A8SUJpbmRlcj4gICAgICAgICBnZXRTZXJ2aWNlKCBjb25zdCBTdHJpbmcxNiYgbmFtZSkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYW4gZXhpc3Rpbmcgc2VydmljZSwgbm9uLWJsb2NraW5nLgotICAgICAqLwotICAgIHZpcnR1YWwgc3A8SUJpbmRlcj4gICAgICAgICBjaGVja1NlcnZpY2UoIGNvbnN0IFN0cmluZzE2JiBuYW1lKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIHNlcnZpY2UuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIGFkZFNlcnZpY2UoIGNvbnN0IFN0cmluZzE2JiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd0lzb2xhdGVkID0gZmFsc2UpID0gMDsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBsaXN0IG9mIGFsbCBleGlzdGluZyBzZXJ2aWNlcy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIFZlY3RvcjxTdHJpbmcxNj4gICAgbGlzdFNlcnZpY2VzKCkgPSAwOwotCi0gICAgZW51bSB7Ci0gICAgICAgIEdFVF9TRVJWSUNFX1RSQU5TQUNUSU9OID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICAgICAgQ0hFQ0tfU0VSVklDRV9UUkFOU0FDVElPTiwKLSAgICAgICAgQUREX1NFUlZJQ0VfVFJBTlNBQ1RJT04sCi0gICAgICAgIExJU1RfU0VSVklDRVNfVFJBTlNBQ1RJT04sCi0gICAgfTsKLX07Ci0KLXNwPElTZXJ2aWNlTWFuYWdlcj4gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIElOVEVSRkFDRT4KLXN0YXR1c190IGdldFNlcnZpY2UoY29uc3QgU3RyaW5nMTYmIG5hbWUsIHNwPElOVEVSRkFDRT4qIG91dFNlcnZpY2UpCi17Ci0gICAgY29uc3Qgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgIGlmIChzbSAhPSBOVUxMKSB7Ci0gICAgICAgICpvdXRTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU5URVJGQUNFPihzbS0+Z2V0U2VydmljZShuYW1lKSk7Ci0gICAgICAgIGlmICgoKm91dFNlcnZpY2UpICE9IE5VTEwpIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotfQotCi1ib29sIGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24pOwotYm9vbCBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dFBpZCwgaW50MzJfdCogb3V0VWlkKTsKLWJvb2wgY2hlY2tQZXJtaXNzaW9uKGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblNlcnZpY2VNYW5hZ2VyIDogcHVibGljIEJuSW50ZXJmYWNlPElTZXJ2aWNlTWFuYWdlcj4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSVNFUlZJQ0VfTUFOQUdFUl9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmluZGVyL01lbW9yeUJhc2UuaCBiL2luY2x1ZGUvYmluZGVyL01lbW9yeUJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzZTI2ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JpbmRlci9NZW1vcnlCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX01FTU9SWV9CQVNFX0gKLSNkZWZpbmUgQU5EUk9JRF9NRU1PUllfQkFTRV9ICi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTWVtb3J5QmFzZSA6IHB1YmxpYyBCbk1lbW9yeSAKLXsKLXB1YmxpYzoKLSAgICBNZW1vcnlCYXNlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc3NpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIH5NZW1vcnlCYXNlKCk7Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0TWVtb3J5KHNzaXplX3QqIG9mZnNldCwgc2l6ZV90KiBzaXplKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIHNpemVfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KLSAgICBzc2l6ZV90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1PZmZzZXQ7IH0KLSAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGdldEhlYXAoKSBjb25zdCB7IHJldHVybiBtSGVhcDsgfQotCi1wcml2YXRlOgotICAgIHNpemVfdCAgICAgICAgICBtU2l6ZTsKLSAgICBzc2l6ZV90ICAgICAgICAgbU9mZnNldDsKLSAgICBzcDxJTWVtb3J5SGVhcD4gbUhlYXA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX01FTU9SWV9CQVNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmluZGVyL01lbW9yeURlYWxlci5oIGIvaW5jbHVkZS9iaW5kZXIvTWVtb3J5RGVhbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MGYyMGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvTWVtb3J5RGVhbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX01FTU9SWV9ERUFMRVJfSAotI2RlZmluZSBBTkRST0lEX01FTU9SWV9ERUFMRVJfSAotCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU2ltcGxlQmVzdEZpdEFsbG9jYXRvcjsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBNZW1vcnlEZWFsZXIgOiBwdWJsaWMgUmVmQmFzZQotewotcHVibGljOgotICAgIE1lbW9yeURlYWxlcihzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogbmFtZSA9IDApOwotCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiBhbGxvY2F0ZShzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBkZWFsbG9jYXRlKHNpemVfdCBvZmZzZXQpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZHVtcChjb25zdCBjaGFyKiB3aGF0KSBjb25zdDsKLQotICAgIHNwPElNZW1vcnlIZWFwPiBnZXRNZW1vcnlIZWFwKCkgY29uc3QgeyByZXR1cm4gaGVhcCgpOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NZW1vcnlEZWFsZXIoKTsKLQotcHJpdmF0ZToKLSAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mICAgICAgaGVhcCgpIGNvbnN0OwotICAgIFNpbXBsZUJlc3RGaXRBbGxvY2F0b3IqICAgICBhbGxvY2F0b3IoKSBjb25zdDsKLQotICAgIHNwPElNZW1vcnlIZWFwPiAgICAgICAgICAgICBtSGVhcDsKLSAgICBTaW1wbGVCZXN0Rml0QWxsb2NhdG9yKiAgICAgbUFsbG9jYXRvcjsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfTUVNT1JZX0RFQUxFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9NZW1vcnlIZWFwQmFzZS5oIGIvaW5jbHVkZS9iaW5kZXIvTWVtb3J5SGVhcEJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiZGE5Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JpbmRlci9NZW1vcnlIZWFwQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfTUVNT1JZX0hFQVBfQkFTRV9ICi0jZGVmaW5lIEFORFJPSURfTUVNT1JZX0hFQVBfQkFTRV9ICi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTWVtb3J5SGVhcEJhc2UgOiBwdWJsaWMgdmlydHVhbCBCbk1lbW9yeUhlYXAKLXsKLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAgUkVBRF9PTkxZID0gSU1lbW9yeUhlYXA6OlJFQURfT05MWSwKLSAgICAgICAgLy8gbWVtb3J5IHdvbid0IGJlIG1hcHBlZCBsb2NhbGx5LCBidXQgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIHJlbW90ZQotICAgICAgICAvLyBwcm9jZXNzLgotICAgICAgICBET05UX01BUF9MT0NBTExZID0gMHgwMDAwMDEwMCwKLSAgICAgICAgTk9fQ0FDSElORyA9IDB4MDAwMDAyMDAKLSAgICB9OwotCi0gICAgLyoKLSAgICAgKiBtYXBzIHRoZSBtZW1vcnkgcmVmZXJlbmNlZCBieSBmZC4gYnV0IERPRVNOJ1QgdGFrZSBvd25lcnNoaXAKLSAgICAgKiBvZiB0aGUgZmlsZWRlc2NyaXB0b3IgKGl0IG1ha2VzIGEgY29weSB3aXRoIGR1cCgpCi0gICAgICovCi0gICAgTWVtb3J5SGVhcEJhc2UoaW50IGZkLCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MgPSAwLCB1aW50MzJfdCBvZmZzZXQgPSAwKTsKLQotICAgIC8qCi0gICAgICogbWFwcyBtZW1vcnkgZnJvbSB0aGUgZ2l2ZW4gZGV2aWNlCi0gICAgICovCi0gICAgTWVtb3J5SGVhcEJhc2UoY29uc3QgY2hhciogZGV2aWNlLCBzaXplX3Qgc2l6ZSA9IDAsIHVpbnQzMl90IGZsYWdzID0gMCk7Ci0KLSAgICAvKgotICAgICAqIG1hcHMgbWVtb3J5IGZyb20gYXNobWVtLCB3aXRoIHRoZSBnaXZlbiBuYW1lIGZvciBkZWJ1Z2dpbmcKLSAgICAgKi8KLSAgICBNZW1vcnlIZWFwQmFzZShzaXplX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MgPSAwLCBjaGFyIGNvbnN0KiBuYW1lID0gTlVMTCk7Ci0KLSAgICB2aXJ0dWFsIH5NZW1vcnlIZWFwQmFzZSgpOwotCi0gICAgLyogaW1wbGVtZW50IElNZW1vcnlIZWFwIGludGVyZmFjZSAqLwotICAgIHZpcnR1YWwgaW50ICAgICAgICAgZ2V0SGVhcElEKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkKiAgICAgICBnZXRCYXNlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzaXplX3QgICAgICBnZXRTaXplKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRGbGFncygpIGNvbnN0OwotICAgIHZpcnR1YWwgdWludDMyX3QgICAgICBnZXRPZmZzZXQoKSBjb25zdDsKLQotICAgIGNvbnN0IGNoYXIqICAgICAgICAgZ2V0RGV2aWNlKCkgY29uc3Q7Ci0KLSAgICAvKiB0aGlzIGNsb3NlcyB0aGlzIGhlYXAgLS0gdXNlIGNhcmVmdWxseSAqLwotICAgIHZvaWQgZGlzcG9zZSgpOwotCi0gICAgLyogdGhpcyBpcyBvbmx5IG5lZWRlZCBhcyBhIHdvcmthcm91bmQsIHVzZSBvbmx5IGlmIHlvdSBrbm93Ci0gICAgICogd2hhdCB5b3UgYXJlIGRvaW5nICovCi0gICAgc3RhdHVzX3Qgc2V0RGV2aWNlKGNvbnN0IGNoYXIqIGRldmljZSkgewotICAgICAgICBpZiAobURldmljZSA9PSAwKQotICAgICAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UgPyBOT19FUlJPUiA6IEFMUkVBRFlfRVhJU1RTOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgICAgICAgICAgTWVtb3J5SGVhcEJhc2UoKTsKLSAgICAvLyBpbml0KCkgdGFrZXMgb3duZXJzaGlwIG9mIGZkCi0gICAgc3RhdHVzX3QgaW5pdChpbnQgZmQsIHZvaWQgKmJhc2UsIGludCBzaXplLAotICAgICAgICAgICAgaW50IGZsYWdzID0gMCwgY29uc3QgY2hhciogZGV2aWNlID0gTlVMTCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdHVzX3QgbWFwZmQoaW50IGZkLCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgb2Zmc2V0ID0gMCk7Ci0KLSAgICBpbnQgICAgICAgICBtRkQ7Ci0gICAgc2l6ZV90ICAgICAgbVNpemU7Ci0gICAgdm9pZCogICAgICAgbUJhc2U7Ci0gICAgdWludDMyX3QgICAgbUZsYWdzOwotICAgIGNvbnN0IGNoYXIqIG1EZXZpY2U7Ci0gICAgYm9vbCAgICAgICAgbU5lZWRVbm1hcDsKLSAgICB1aW50MzJfdCAgICBtT2Zmc2V0OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9NRU1PUllfSEVBUF9CQVNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmluZGVyL1BhcmNlbC5oIGIvaW5jbHVkZS9iaW5kZXIvUGFyY2VsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYjJmMDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvUGFyY2VsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9QQVJDRUxfSAotI2RlZmluZSBBTkRST0lEX1BBUkNFTF9ICi0KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRmxhdHRlbmFibGU7Ci1jbGFzcyBJQmluZGVyOwotY2xhc3MgSVBDVGhyZWFkU3RhdGU7Ci1jbGFzcyBQcm9jZXNzU3RhdGU7Ci1jbGFzcyBTdHJpbmc4OwotY2xhc3MgVGV4dE91dHB1dDsKLQotc3RydWN0IGZsYXRfYmluZGVyX29iamVjdDsgIC8vIGRlZmluZWQgaW4gc3VwcG9ydF9wL2JpbmRlcl9tb2R1bGUuaAotCi1jbGFzcyBQYXJjZWwKLXsKLXB1YmxpYzoKLSAgICBjbGFzcyBSZWFkYWJsZUJsb2I7Ci0gICAgY2xhc3MgV3JpdGFibGVCbG9iOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH5QYXJjZWwoKTsKLSAgICAKLSAgICBjb25zdCB1aW50OF90KiAgICAgIGRhdGEoKSBjb25zdDsKLSAgICBzaXplX3QgICAgICAgICAgICAgIGRhdGFTaXplKCkgY29uc3Q7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICBkYXRhQXZhaWwoKSBjb25zdDsKLSAgICBzaXplX3QgICAgICAgICAgICAgIGRhdGFQb3NpdGlvbigpIGNvbnN0OwotICAgIHNpemVfdCAgICAgICAgICAgICAgZGF0YUNhcGFjaXR5KCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHNldERhdGFTaXplKHNpemVfdCBzaXplKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIHNldERhdGFQb3NpdGlvbihzaXplX3QgcG9zKSBjb25zdDsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHNldERhdGFDYXBhY2l0eShzaXplX3Qgc2l6ZSk7Ci0gICAgCi0gICAgc3RhdHVzX3QgICAgICAgICAgICBzZXREYXRhKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGxlbik7Ci0KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIGFwcGVuZEZyb20oY29uc3QgUGFyY2VsICpwYXJjZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbik7Ci0KLSAgICBib29sICAgICAgICAgICAgICAgIHB1c2hBbGxvd0Zkcyhib29sIGFsbG93RmRzKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIHJlc3RvcmVBbGxvd0Zkcyhib29sIGxhc3RWYWx1ZSk7Ci0KLSAgICBib29sICAgICAgICAgICAgICAgIGhhc0ZpbGVEZXNjcmlwdG9ycygpIGNvbnN0OwotCi0gICAgLy8gV3JpdGVzIHRoZSBSUEMgaGVhZGVyLgotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVJbnRlcmZhY2VUb2tlbihjb25zdCBTdHJpbmcxNiYgaW50ZXJmYWNlKTsKLQotICAgIC8vIFBhcnNlcyB0aGUgUlBDIGhlYWRlciwgcmV0dXJuaW5nIHRydWUgaWYgdGhlIGludGVyZmFjZSBuYW1lCi0gICAgLy8gaW4gdGhlIGhlYWRlciBtYXRjaGVzIHRoZSBleHBlY3RlZCBpbnRlcmZhY2UgZnJvbSB0aGUgY2FsbGVyLgotICAgIC8vCi0gICAgLy8gQWRkaXRpb25hbGx5LCBlbmZvcmNlSW50ZXJmYWNlIGRvZXMgcGFydCBvZiB0aGUgd29yayBvZgotICAgIC8vIHByb3BhZ2F0aW5nIHRoZSBTdHJpY3RNb2RlIHBvbGljeSBtYXNrLCBwb3B1bGF0aW5nIHRoZSBjdXJyZW50Ci0gICAgLy8gSVBDVGhyZWFkU3RhdGUsIHdoaWNoIGFzIGFuIG9wdGltaXphdGlvbiBtYXkgb3B0aW9uYWxseSBiZQotICAgIC8vIHBhc3NlZCBpbi4KLSAgICBib29sICAgICAgICAgICAgICAgIGVuZm9yY2VJbnRlcmZhY2UoY29uc3QgU3RyaW5nMTYmIGludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGUqIHRocmVhZFN0YXRlID0gTlVMTCkgY29uc3Q7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBjaGVja0ludGVyZmFjZShJQmluZGVyKikgY29uc3Q7Ci0KLSAgICB2b2lkICAgICAgICAgICAgICAgIGZyZWVEYXRhKCk7Ci0KLSAgICBjb25zdCBzaXplX3QqICAgICAgIG9iamVjdHMoKSBjb25zdDsKLSAgICBzaXplX3QgICAgICAgICAgICAgIG9iamVjdHNDb3VudCgpIGNvbnN0OwotICAgIAotICAgIHN0YXR1c190ICAgICAgICAgICAgZXJyb3JDaGVjaygpIGNvbnN0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0RXJyb3Ioc3RhdHVzX3QgZXJyKTsKLSAgICAKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pOwotICAgIHZvaWQqICAgICAgICAgICAgICAgd3JpdGVJbnBsYWNlKHNpemVfdCBsZW4pOwotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVVbnBhZGRlZChjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlSW50MzIoaW50MzJfdCB2YWwpOwotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVJbnQ2NChpbnQ2NF90IHZhbCk7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZUZsb2F0KGZsb2F0IHZhbCk7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZURvdWJsZShkb3VibGUgdmFsKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlSW50UHRyKGludHB0cl90IHZhbCk7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZUNTdHJpbmcoY29uc3QgY2hhciogc3RyKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlU3RyaW5nOChjb25zdCBTdHJpbmc4JiBzdHIpOwotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVTdHJpbmcxNihjb25zdCBTdHJpbmcxNiYgc3RyKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlU3RyaW5nMTYoY29uc3QgY2hhcjE2X3QqIHN0ciwgc2l6ZV90IGxlbik7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZVN0cm9uZ0JpbmRlcihjb25zdCBzcDxJQmluZGVyPiYgdmFsKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlV2Vha0JpbmRlcihjb25zdCB3cDxJQmluZGVyPiYgdmFsKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlKGNvbnN0IEZsYXR0ZW5hYmxlJiB2YWwpOwotCi0gICAgLy8gUGxhY2UgYSBuYXRpdmVfaGFuZGxlIGludG8gdGhlIHBhcmNlbCAodGhlIG5hdGl2ZV9oYW5kbGUncyBmaWxlLQotICAgIC8vIGRlc2NyaXB0b3JzIGFyZSBkdXAnZWQsIHNvIGl0IGlzIHNhZmUgdG8gZGVsZXRlIHRoZSBuYXRpdmVfaGFuZGxlCi0gICAgLy8gd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMpLiAKLSAgICAvLyBEb2Vzbid0IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBuYXRpdmVfaGFuZGxlLgotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVOYXRpdmVIYW5kbGUoY29uc3QgbmF0aXZlX2hhbmRsZSogaGFuZGxlKTsKLSAgICAKLSAgICAvLyBQbGFjZSBhIGZpbGUgZGVzY3JpcHRvciBpbnRvIHRoZSBwYXJjZWwuICBUaGUgZ2l2ZW4gZmQgbXVzdCByZW1haW4KLSAgICAvLyB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBwYXJjZWwuCi0gICAgLy8gVGhlIFBhcmNlbCBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gZmQgdW5sZXNzIHlvdSBhc2sgaXQgdG8uCi0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZUZpbGVEZXNjcmlwdG9yKGludCBmZCwgYm9vbCB0YWtlT3duZXJzaGlwID0gZmFsc2UpOwotICAgIAotICAgIC8vIFBsYWNlIGEgZmlsZSBkZXNjcmlwdG9yIGludG8gdGhlIHBhcmNlbC4gIEEgZHVwIG9mIHRoZSBmZCBpcyBtYWRlLCB3aGljaAotICAgIC8vIHdpbGwgYmUgY2xvc2VkIG9uY2UgdGhlIHBhcmNlbCBpcyBkZXN0cm95ZWQuCi0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZUR1cEZpbGVEZXNjcmlwdG9yKGludCBmZCk7Ci0KLSAgICAvLyBXcml0ZXMgYSBibG9iIHRvIHRoZSBwYXJjZWwuCi0gICAgLy8gSWYgdGhlIGJsb2IgaXMgc21hbGwsIHRoZW4gaXQgaXMgc3RvcmVkIGluLXBsYWNlLCBvdGhlcndpc2UgaXQgaXMKLSAgICAvLyB0cmFuc2ZlcnJlZCBieSB3YXkgb2YgYW4gYW5vbnltb3VzIHNoYXJlZCBtZW1vcnkgcmVnaW9uLgotICAgIC8vIFRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgcmVsZWFzZSgpIG9uIHRoZSBibG9iIGFmdGVyIHdyaXRpbmcgaXRzIGNvbnRlbnRzLgotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVCbG9iKHNpemVfdCBsZW4sIFdyaXRhYmxlQmxvYiogb3V0QmxvYik7Ci0KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlT2JqZWN0KGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCYgdmFsLCBib29sIG51bGxNZXRhRGF0YSk7Ci0KLSAgICAvLyBMaWtlIFBhcmNlbC5qYXZhJ3Mgd3JpdGVOb0V4Y2VwdGlvbigpLiAgSnVzdCB3cml0ZXMgYSB6ZXJvIGludDMyLgotICAgIC8vIEN1cnJlbnRseSB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgZG8gYW55IG9mIHRoZSBTdHJpY3RNb2RlCi0gICAgLy8gc3RhY2sgZ2F0aGVyaW5nIGFuZCBzZXJpYWxpemF0aW9uIHRoYXQgdGhlIEphdmEgaW1wbGVtZW50YXRpb24gZG9lcy4KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlTm9FeGNlcHRpb24oKTsKLQotICAgIHZvaWQgICAgICAgICAgICAgICAgcmVtb3ZlKHNpemVfdCBzdGFydCwgc2l6ZV90IGFtdCk7Ci0gICAgCi0gICAgc3RhdHVzX3QgICAgICAgICAgICByZWFkKHZvaWQqIG91dERhdGEsIHNpemVfdCBsZW4pIGNvbnN0OwotICAgIGNvbnN0IHZvaWQqICAgICAgICAgcmVhZElucGxhY2Uoc2l6ZV90IGxlbikgY29uc3Q7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICByZWFkSW50MzIoKSBjb25zdDsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlYWRJbnQzMihpbnQzMl90ICpwQXJnKSBjb25zdDsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgIHJlYWRJbnQ2NCgpIGNvbnN0OwotICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhZEludDY0KGludDY0X3QgKnBBcmcpIGNvbnN0OwotICAgIGZsb2F0ICAgICAgICAgICAgICAgcmVhZEZsb2F0KCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICByZWFkRmxvYXQoZmxvYXQgKnBBcmcpIGNvbnN0OwotICAgIGRvdWJsZSAgICAgICAgICAgICAgcmVhZERvdWJsZSgpIGNvbnN0OwotICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhZERvdWJsZShkb3VibGUgKnBBcmcpIGNvbnN0OwotICAgIGludHB0cl90ICAgICAgICAgICAgcmVhZEludFB0cigpIGNvbnN0OwotICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhZEludFB0cihpbnRwdHJfdCAqcEFyZykgY29uc3Q7Ci0KLSAgICBjb25zdCBjaGFyKiAgICAgICAgIHJlYWRDU3RyaW5nKCkgY29uc3Q7Ci0gICAgU3RyaW5nOCAgICAgICAgICAgICByZWFkU3RyaW5nOCgpIGNvbnN0OwotICAgIFN0cmluZzE2ICAgICAgICAgICAgcmVhZFN0cmluZzE2KCkgY29uc3Q7Ci0gICAgY29uc3QgY2hhcjE2X3QqICAgICByZWFkU3RyaW5nMTZJbnBsYWNlKHNpemVfdCogb3V0TGVuKSBjb25zdDsKLSAgICBzcDxJQmluZGVyPiAgICAgICAgIHJlYWRTdHJvbmdCaW5kZXIoKSBjb25zdDsKLSAgICB3cDxJQmluZGVyPiAgICAgICAgIHJlYWRXZWFrQmluZGVyKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICByZWFkKEZsYXR0ZW5hYmxlJiB2YWwpIGNvbnN0OwotCi0gICAgLy8gTGlrZSBQYXJjZWwuamF2YSdzIHJlYWRFeGNlcHRpb25Db2RlKCkuICBSZWFkcyB0aGUgZmlyc3QgaW50MzIKLSAgICAvLyBvZmYgb2YgYSBQYXJjZWwncyBoZWFkZXIsIHJldHVybmluZyAwIG9yIHRoZSBuZWdhdGl2ZSBlcnJvcgotICAgIC8vIGNvZGUgb24gZXhjZXB0aW9ucywgYnV0IGFsc28gZGVhbHMgd2l0aCBza2lwcGluZyBvdmVyIHJpY2gKLSAgICAvLyByZXNwb25zZSBoZWFkZXJzLiAgQ2FsbGVycyBzaG91bGQgdXNlIHRoaXMgdG8gcmVhZCAmIHBhcnNlIHRoZQotICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgcmF0aGVyIHRoYW4gZG9pbmcgaXQgYnkgaGFuZC4KLSAgICBpbnQzMl90ICAgICAgICAgICAgIHJlYWRFeGNlcHRpb25Db2RlKCkgY29uc3Q7Ci0KLSAgICAvLyBSZXRyaWV2ZSBuYXRpdmVfaGFuZGxlIGZyb20gdGhlIHBhcmNlbC4gVGhpcyByZXR1cm5zIGEgY29weSBvZiB0aGUKLSAgICAvLyBwYXJjZWwncyBuYXRpdmVfaGFuZGxlICh0aGUgY2FsbGVyIHRha2VzIG93bmVyc2hpcCkuIFRoZSBjYWxsZXIKLSAgICAvLyBtdXN0IGZyZWUgdGhlIG5hdGl2ZV9oYW5kbGUgd2l0aCBuYXRpdmVfaGFuZGxlX2Nsb3NlKCkgYW5kIAotICAgIC8vIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKCkuCi0gICAgbmF0aXZlX2hhbmRsZSogICAgIHJlYWROYXRpdmVIYW5kbGUoKSBjb25zdDsKLQotICAgIAotICAgIC8vIFJldHJpZXZlIGEgZmlsZSBkZXNjcmlwdG9yIGZyb20gdGhlIHBhcmNlbC4gIFRoaXMgcmV0dXJucyB0aGUgcmF3IGZkCi0gICAgLy8gaW4gdGhlIHBhcmNlbCwgd2hpY2ggeW91IGRvIG5vdCBvd24gLS0gdXNlIGR1cCgpIHRvIGdldCB5b3VyIG93biBjb3B5LgotICAgIGludCAgICAgICAgICAgICAgICAgcmVhZEZpbGVEZXNjcmlwdG9yKCkgY29uc3Q7Ci0KLSAgICAvLyBSZWFkcyBhIGJsb2IgZnJvbSB0aGUgcGFyY2VsLgotICAgIC8vIFRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgcmVsZWFzZSgpIG9uIHRoZSBibG9iIGFmdGVyIHJlYWRpbmcgaXRzIGNvbnRlbnRzLgotICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhZEJsb2Ioc2l6ZV90IGxlbiwgUmVhZGFibGVCbG9iKiBvdXRCbG9iKSBjb25zdDsKLQotICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCogcmVhZE9iamVjdChib29sIG51bGxNZXRhRGF0YSkgY29uc3Q7Ci0KLSAgICAvLyBFeHBsaWNpdGx5IGNsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGluIHRoZSBwYXJjZWwuCi0gICAgdm9pZCAgICAgICAgICAgICAgICBjbG9zZUZpbGVEZXNjcmlwdG9ycygpOwotICAgIAotICAgIHR5cGVkZWYgdm9pZCAgICAgICAgKCpyZWxlYXNlX2Z1bmMpKFBhcmNlbCogcGFyY2VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QqIG9iamVjdHMsIHNpemVfdCBvYmplY3RzU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb29raWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgY29uc3QgdWludDhfdCogICAgICBpcGNEYXRhKCkgY29uc3Q7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICBpcGNEYXRhU2l6ZSgpIGNvbnN0OwotICAgIGNvbnN0IHNpemVfdCogICAgICAgaXBjT2JqZWN0cygpIGNvbnN0OwotICAgIHNpemVfdCAgICAgICAgICAgICAgaXBjT2JqZWN0c0NvdW50KCkgY29uc3Q7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBpcGNTZXREYXRhUmVmZXJlbmNlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90KiBvYmplY3RzLCBzaXplX3Qgb2JqZWN0c0NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlX2Z1bmMgcmVsRnVuYywgdm9pZCogcmVsQ29va2llKTsKLSAgICAKLSAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KFRleHRPdXRwdXQmIHRvLCB1aW50MzJfdCBmbGFncyA9IDApIGNvbnN0OwotCi1wcml2YXRlOgotICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKGNvbnN0IFBhcmNlbCYgbyk7Ci0gICAgUGFyY2VsJiAgICAgICAgICAgICBvcGVyYXRvcj0oY29uc3QgUGFyY2VsJiBvKTsKLSAgICAKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIGZpbmlzaFdyaXRlKHNpemVfdCBsZW4pOwotICAgIHZvaWQgICAgICAgICAgICAgICAgcmVsZWFzZU9iamVjdHMoKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIGFjcXVpcmVPYmplY3RzKCk7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICBncm93RGF0YShzaXplX3QgbGVuKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlc3RhcnRXcml0ZShzaXplX3QgZGVzaXJlZCk7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICBjb250aW51ZVdyaXRlKHNpemVfdCBkZXNpcmVkKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIGZyZWVEYXRhTm9Jbml0KCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBpbml0U3RhdGUoKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIHNjYW5Gb3JGZHMoKSBjb25zdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRlbXBsYXRlPGNsYXNzIFQ+Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICByZWFkQWxpZ25lZChUICpwQXJnKSBjb25zdDsKLQotICAgIHRlbXBsYXRlPGNsYXNzIFQ+ICAgVCByZWFkQWxpZ25lZCgpIGNvbnN0OwotCi0gICAgdGVtcGxhdGU8Y2xhc3MgVD4KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlQWxpZ25lZChUIHZhbCk7Ci0KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIG1FcnJvcjsKLSAgICB1aW50OF90KiAgICAgICAgICAgIG1EYXRhOwotICAgIHNpemVfdCAgICAgICAgICAgICAgbURhdGFTaXplOwotICAgIHNpemVfdCAgICAgICAgICAgICAgbURhdGFDYXBhY2l0eTsKLSAgICBtdXRhYmxlIHNpemVfdCAgICAgIG1EYXRhUG9zOwotICAgIHNpemVfdCogICAgICAgICAgICAgbU9iamVjdHM7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICBtT2JqZWN0c1NpemU7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICBtT2JqZWN0c0NhcGFjaXR5OwotICAgIG11dGFibGUgc2l6ZV90ICAgICAgbU5leHRPYmplY3RIaW50OwotCi0gICAgbXV0YWJsZSBib29sICAgICAgICBtRmRzS25vd247Ci0gICAgbXV0YWJsZSBib29sICAgICAgICBtSGFzRmRzOwotICAgIGJvb2wgICAgICAgICAgICAgICAgbUFsbG93RmRzOwotICAgIAotICAgIHJlbGVhc2VfZnVuYyAgICAgICAgbU93bmVyOwotICAgIHZvaWQqICAgICAgICAgICAgICAgbU93bmVyQ29va2llOwotCi0gICAgY2xhc3MgQmxvYiB7Ci0gICAgcHVibGljOgotICAgICAgICBCbG9iKCk7Ci0gICAgICAgIH5CbG9iKCk7Ci0KLSAgICAgICAgdm9pZCByZWxlYXNlKCk7Ci0gICAgICAgIGlubGluZSBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZvaWQgaW5pdChib29sIG1hcHBlZCwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOwotICAgICAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICAgICAgYm9vbCBtTWFwcGVkOwotICAgICAgICB2b2lkKiBtRGF0YTsKLSAgICAgICAgc2l6ZV90IG1TaXplOwotICAgIH07Ci0KLXB1YmxpYzoKLSAgICBjbGFzcyBSZWFkYWJsZUJsb2IgOiBwdWJsaWMgQmxvYiB7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBQYXJjZWw7Ci0gICAgcHVibGljOgotICAgICAgICBpbmxpbmUgY29uc3Qgdm9pZCogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhOyB9Ci0gICAgfTsKLQotICAgIGNsYXNzIFdyaXRhYmxlQmxvYiA6IHB1YmxpYyBCbG9iIHsKLSAgICAgICAgZnJpZW5kIGNsYXNzIFBhcmNlbDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGlubGluZSB2b2lkKiBkYXRhKCkgeyByZXR1cm4gbURhdGE7IH0KLSAgICB9OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlubGluZSBUZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCBQYXJjZWwmIHBhcmNlbCkKLXsKLSAgICBwYXJjZWwucHJpbnQodG8pOwotICAgIHJldHVybiB0bzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEdlbmVyaWMgYWNxdWlyZSBhbmQgcmVsZWFzZSBvZiBvYmplY3RzLgotdm9pZCBhY3F1aXJlX29iamVjdChjb25zdCBzcDxQcm9jZXNzU3RhdGU+JiBwcm9jLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QmIG9iaiwgY29uc3Qgdm9pZCogd2hvKTsKLXZvaWQgcmVsZWFzZV9vYmplY3QoY29uc3Qgc3A8UHJvY2Vzc1N0YXRlPiYgcHJvYywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0JiBvYmosIGNvbnN0IHZvaWQqIHdobyk7Ci0KLXZvaWQgZmxhdHRlbl9iaW5kZXIoY29uc3Qgc3A8UHJvY2Vzc1N0YXRlPiYgcHJvYywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlciwgZmxhdF9iaW5kZXJfb2JqZWN0KiBvdXQpOwotdm9pZCBmbGF0dGVuX2JpbmRlcihjb25zdCBzcDxQcm9jZXNzU3RhdGU+JiBwcm9jLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyPiYgYmluZGVyLCBmbGF0X2JpbmRlcl9vYmplY3QqIG91dCk7Ci1zdGF0dXNfdCB1bmZsYXR0ZW5fYmluZGVyKGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4mIHByb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCYgZmxhdCwgc3A8SUJpbmRlcj4qIG91dCk7Ci1zdGF0dXNfdCB1bmZsYXR0ZW5fYmluZGVyKGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4mIHByb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCYgZmxhdCwgd3A8SUJpbmRlcj4qIG91dCk7Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9QQVJDRUxfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvUGVybWlzc2lvbkNhY2hlLmggYi9pbmNsdWRlL2JpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3MWQ0OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEJJTkRFUl9QRVJNSVNTSU9OX0gKLSNkZWZpbmUgQklOREVSX1BFUk1JU1NJT05fSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoKLSAqIFBlcm1pc3Npb25DYWNoZSBjYWNoZXMgcGVybWlzc2lvbiBjaGVja3MgZm9yIGEgZ2l2ZW4gdWlkLgotICoKLSAqIEN1cnJlbnRseSB0aGUgY2FjaGUgaXMgbm90IHVwZGF0ZWQgd2hlbiB0aGVyZSBpcyBhIHBlcm1pc3Npb24gY2hhbmdlLAotICogZm9yIGluc3RhbmNlIHdoZW4gYW4gYXBwbGljYXRpb24gaXMgdW5pbnN0YWxsZWQuCi0gKgotICogSU1QT1JUQU5UOiBmb3IgdGhlIHJlYXNvbiBzdGF0ZWQgYWJvdmUsIG9ubHkgc3lzdGVtIHBlcm1pc3Npb25zIGFyZSBzYWZlCi0gKiB0byBjYWNoZS4gVGhpcyByZXN0cmljdGlvbiBtYXkgYmUgbGlmdGVkIGF0IGEgbGF0ZXIgdGltZS4KLSAqCi0gKi8KLQotY2xhc3MgUGVybWlzc2lvbkNhY2hlIDogU2luZ2xldG9uPFBlcm1pc3Npb25DYWNoZT4gewotICAgIHN0cnVjdCBFbnRyeSB7Ci0gICAgICAgIFN0cmluZzE2ICAgIG5hbWU7Ci0gICAgICAgIHVpZF90ICAgICAgIHVpZDsKLSAgICAgICAgYm9vbCAgICAgICAgZ3JhbnRlZDsKLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgRW50cnkmIGUpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiAodWlkID09IGUudWlkKSA/IChuYW1lIDwgZS5uYW1lKSA6ICh1aWQgPCBlLnVpZCk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgLy8gd2UgcG9vbCBhbGwgdGhlIHBlcm1pc3Npb24gbmFtZXMgd2Ugc2VlLCBhcyBtYW55IHBlcm1pc3Npb25zIGNoZWNrcwotICAgIC8vIHdpbGwgaGF2ZSBpZGVudGljYWwgbmFtZXMKLSAgICBTb3J0ZWRWZWN0b3I8IFN0cmluZzE2ID4gbVBlcm1pc3Npb25OYW1lc1Bvb2w7Ci0gICAgLy8gdGhpcyBpcyBvdXIgY2FjaGUgcGVyIHNheS4gaXQgc3RvcmVzIHBvb2xlZCBuYW1lcy4KLSAgICBTb3J0ZWRWZWN0b3I8IEVudHJ5ID4gbUNhY2hlOwotCi0gICAgLy8gZnJlZSB0aGUgd2hvbGUgY2FjaGUsIGJ1dCBrZWVwIHRoZSBwZXJtaXNzaW9uIG5hbWUgcG9vbAotICAgIHZvaWQgcHVyZ2UoKTsKLQotICAgIHN0YXR1c190IGNoZWNrKGJvb2wqIGdyYW50ZWQsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbiwgdWlkX3QgdWlkKSBjb25zdDsKLQotICAgIHZvaWQgY2FjaGUoY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24sIHVpZF90IHVpZCwgYm9vbCBncmFudGVkKTsKLQotcHVibGljOgotICAgIFBlcm1pc3Npb25DYWNoZSgpOwotCi0gICAgc3RhdGljIGJvb2wgY2hlY2tDYWxsaW5nUGVybWlzc2lvbihjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbik7Ci0KLSAgICBzdGF0aWMgYm9vbCBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRQaWQsIGludDMyX3QqIG91dFVpZCk7Ci0KLSAgICBzdGF0aWMgYm9vbCBjaGVja1Blcm1pc3Npb24oY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24sCi0gICAgICAgICAgICBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvKiBCSU5ERVJfUEVSTUlTU0lPTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9Qcm9jZXNzU3RhdGUuaCBiL2luY2x1ZGUvYmluZGVyL1Byb2Nlc3NTdGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI1ODIyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYmluZGVyL1Byb2Nlc3NTdGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUFJPQ0VTU19TVEFURV9ICi0jZGVmaW5lIEFORFJPSURfUFJPQ0VTU19TVEFURV9ICi0KLSNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBHbG9iYWwgdmFyaWFibGVzCi1leHRlcm4gaW50ICAgICAgICAgICAgICAgICBtQXJnQzsKLWV4dGVybiBjb25zdCBjaGFyKiBjb25zdCogIG1BcmdWOwotZXh0ZXJuIGludCAgICAgICAgICAgICAgICAgbUFyZ0xlbjsKLQotY2xhc3MgSVBDVGhyZWFkU3RhdGU7Ci0KLWNsYXNzIFByb2Nlc3NTdGF0ZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgIHNwPFByb2Nlc3NTdGF0ZT4gICAgc2VsZigpOwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNldENvbnRleHRPYmplY3QoY29uc3Qgc3A8SUJpbmRlcj4mIG9iamVjdCk7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiAgICAgICAgIGdldENvbnRleHRPYmplY3QoY29uc3Qgc3A8SUJpbmRlcj4mIGNhbGxlcik7Ci0gICAgICAgIAotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDb250ZXh0T2JqZWN0KGNvbnN0IHNwPElCaW5kZXI+JiBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG5hbWUpOwotICAgICAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICBnZXRDb250ZXh0T2JqZWN0KGNvbnN0IFN0cmluZzE2JiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBjYWxsZXIpOwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHN0YXJ0VGhyZWFkUG9vbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdHlwZWRlZiBib29sICgqY29udGV4dF9jaGVja19mdW5jKShjb25zdCBTdHJpbmcxNiYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBjYWxsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyRGF0YSk7Ci0gICAgICAgIAotICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBpc0NvbnRleHRNYW5hZ2VyKHZvaWQpIGNvbnN0OwotICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBiZWNvbWVDb250ZXh0TWFuYWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfY2hlY2tfZnVuYyBjaGVja0Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyRGF0YSk7Ci0KLSAgICAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgZ2V0U3Ryb25nUHJveHlGb3JIYW5kbGUoaW50MzJfdCBoYW5kbGUpOwotICAgICAgICAgICAgd3A8SUJpbmRlcj4gICAgICAgICBnZXRXZWFrUHJveHlGb3JIYW5kbGUoaW50MzJfdCBoYW5kbGUpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBleHB1bmdlSGFuZGxlKGludDMyX3QgaGFuZGxlLCBJQmluZGVyKiBiaW5kZXIpOwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNldEFyZ3MoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSk7Ci0gICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGdldEFyZ0MoKSBjb25zdDsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiAgZ2V0QXJnVigpIGNvbnN0OwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNldEFyZ1YwKGNvbnN0IGNoYXIqIHR4dCk7Ci0KLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc3Bhd25Qb29sZWRUaHJlYWQoYm9vbCBpc01haW4pOwotICAgICAgICAgICAgCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBJUENUaHJlYWRTdGF0ZTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5Qcm9jZXNzU3RhdGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdGUoY29uc3QgUHJvY2Vzc1N0YXRlJiBvKTsKLSAgICAgICAgICAgIFByb2Nlc3NTdGF0ZSYgICAgICAgb3BlcmF0b3I9KGNvbnN0IFByb2Nlc3NTdGF0ZSYgbyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN0cnVjdCBoYW5kbGVfZW50cnkgewotICAgICAgICAgICAgICAgIElCaW5kZXIqIGJpbmRlcjsKLSAgICAgICAgICAgICAgICBSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqIHJlZnM7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBoYW5kbGVfZW50cnkqICAgICAgIGxvb2t1cEhhbmRsZUxvY2tlZChpbnQzMl90IGhhbmRsZSk7Ci0KLSAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbURyaXZlckZEOwotICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICBtVk1TdGFydDsKLSAgICAgICAgICAgIAotICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsgIC8vIHByb3RlY3RzIGV2ZXJ5dGhpbmcgYmVsb3cuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFZlY3RvcjxoYW5kbGVfZW50cnk+bUhhbmRsZVRvT2JqZWN0OwotCi0gICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIG1NYW5hZ2VzQ29udGV4dHM7Ci0gICAgICAgICAgICBjb250ZXh0X2NoZWNrX2Z1bmMgIG1CaW5kZXJDb250ZXh0Q2hlY2tGdW5jOwotICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICBtQmluZGVyQ29udGV4dFVzZXJEYXRhOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmcxNiwgc3A8SUJpbmRlcj4gPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dHM7Ci0KLQotICAgICAgICAgICAgU3RyaW5nOCAgICAgICAgICAgICBtUm9vdERpcjsKLSAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbVRocmVhZFBvb2xTdGFydGVkOwotICAgIHZvbGF0aWxlIGludDMyX3QgICAgICAgICAgICBtVGhyZWFkUG9vbFNlcTsKLX07Ci0gICAgCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfUFJPQ0VTU19TVEFURV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9CaXRUdWJlLmggYi9pbmNsdWRlL2d1aS9CaXRUdWJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2Mzg5YTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvQml0VHViZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9HVUlfU0VOU09SX0NIQU5ORUxfSAotI2RlZmluZSBBTkRST0lEX0dVSV9TRU5TT1JfQ0hBTk5FTF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jbGFzcyBQYXJjZWw7Ci0KLWNsYXNzIEJpdFR1YmUgOiBwdWJsaWMgUmVmQmFzZQotewotcHVibGljOgotCi0gICAgICAgICAgICBCaXRUdWJlKCk7Ci0gICAgICAgICAgICBCaXRUdWJlKGNvbnN0IFBhcmNlbCYgZGF0YSk7Ci0gICAgdmlydHVhbCB+Qml0VHViZSgpOwotCi0gICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0gICAgaW50IGdldEZkKCkgY29uc3Q7Ci0gICAgc3NpemVfdCB3cml0ZSh2b2lkIGNvbnN0KiB2YWRkciwgc2l6ZV90IHNpemUpOwotICAgIHNzaXplX3QgcmVhZCh2b2lkKiB2YWRkciwgc2l6ZV90IHNpemUpOwotCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHJlcGx5KSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBpbnQgbVNlbmRGZDsKLSAgICBtdXRhYmxlIGludCBtUmVjZWl2ZUZkOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX1NFTlNPUl9DSEFOTkVMX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0J1ZmZlclF1ZXVlLmggYi9pbmNsdWRlL2d1aS9CdWZmZXJRdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzIxYTI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ3VpL0J1ZmZlclF1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9HVUlfQlVGRkVSUVVFVUVfSAotI2RlZmluZSBBTkRST0lEX0dVSV9CVUZGRVJRVUVVRV9ICi0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJBbGxvYy5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZVRleHR1cmUuaD4KLQotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQnVmZmVyUXVldWUgOiBwdWJsaWMgQm5TdXJmYWNlVGV4dHVyZSB7Ci1wdWJsaWM6Ci0gICAgZW51bSB7IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgPSAyIH07Ci0gICAgZW51bSB7Ci0gICAgICAgIE1JTl9BU1lOQ19CVUZGRVJfU0xPVFMgPSBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTICsgMSwKLSAgICAgICAgTUlOX1NZTkNfQlVGRkVSX1NMT1RTICA9IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMKLSAgICB9OwotICAgIGVudW0geyBOVU1fQlVGRkVSX1NMT1RTID0gMzIgfTsKLSAgICBlbnVtIHsgTk9fQ09OTkVDVEVEX0FQSSA9IDAgfTsKLSAgICBlbnVtIHsgSU5WQUxJRF9CVUZGRVJfU0xPVCA9IC0xIH07Ci0KLSAgICBzdHJ1Y3QgRnJhbWVBdmFpbGFibGVMaXN0ZW5lciA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewotICAgICAgICAvLyBvbkZyYW1lQXZhaWxhYmxlKCkgaXMgY2FsbGVkIGZyb20gcXVldWVCdWZmZXIoKSBlYWNoIHRpbWUgYW4KLSAgICAgICAgLy8gYWRkaXRpb25hbCBmcmFtZSBiZWNvbWVzIGF2YWlsYWJsZSBmb3IgY29uc3VtcHRpb24uIFRoaXMgbWVhbnMgdGhhdAotICAgICAgICAvLyBmcmFtZXMgdGhhdCBhcmUgcXVldWVkIHdoaWxlIGluIGFzeW5jaHJvbm91cyBtb2RlIG9ubHkgdHJpZ2dlciB0aGUKLSAgICAgICAgLy8gY2FsbGJhY2sgaWYgbm8gcHJldmlvdXMgZnJhbWVzIGFyZSBwZW5kaW5nLiBGcmFtZXMgcXVldWVkIHdoaWxlIGluCi0gICAgICAgIC8vIHN5bmNocm9ub3VzIG1vZGUgYWx3YXlzIHRyaWdnZXIgdGhlIGNhbGxiYWNrLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aXRob3V0IGFueSBsb2NrIGhlbGQgYW5kIGNhbiBiZSBjYWxsZWQgY29uY3VycmVudGx5Ci0gICAgICAgIC8vIGJ5IG11bHRpcGxlIHRocmVhZHMuCi0gICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCkgPSAwOwotICAgIH07Ci0KLSAgICAvLyBCdWZmZXJRdWV1ZSBtYW5hZ2VzIGEgcG9vbCBvZiBncmFsbG9jIG1lbW9yeSBzbG90cyB0byBiZSB1c2VkCi0gICAgLy8gYnkgcHJvZHVjZXJzIGFuZCBjb25zdW1lcnMuCi0gICAgLy8gYWxsb3dTeW5jaHJvbm91c01vZGUgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHN5bmNocm9ub3VzIG1vZGUgY2FuIGJlCi0gICAgLy8gZW5hYmxlZC4KLSAgICBCdWZmZXJRdWV1ZShib29sIGFsbG93U3luY2hyb25vdXNNb2RlID0gdHJ1ZSk7Ci0gICAgdmlydHVhbCB+QnVmZmVyUXVldWUoKTsKLQotICAgIHZpcnR1YWwgaW50IHF1ZXJ5KGludCB3aGF0LCBpbnQqIHZhbHVlKTsKLQotICAgIC8vIHNldEJ1ZmZlckNvdW50IHVwZGF0ZXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgYnVmZmVyIHNsb3RzLiAgQWZ0ZXIKLSAgICAvLyBjYWxsaW5nIHRoaXMgYWxsIGJ1ZmZlciBzbG90cyBhcmUgYm90aCB1bmFsbG9jYXRlZCBhbmQgb3duZWQgYnkgdGhlCi0gICAgLy8gQnVmZmVyUXVldWUgb2JqZWN0IChpLmUuIHRoZXkgYXJlIG5vdCBvd25lZCBieSB0aGUgY2xpZW50KS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlcXVlc3RCdWZmZXIoaW50IHNsb3QsIHNwPEdyYXBoaWNCdWZmZXI+KiBidWYpOwotCi0gICAgLy8gZGVxdWV1ZUJ1ZmZlciBnZXRzIHRoZSBuZXh0IGJ1ZmZlciBzbG90IGluZGV4IGZvciB0aGUgY2xpZW50IHRvIHVzZS4gSWYgYQotICAgIC8vIGJ1ZmZlciBzbG90IGlzIGF2YWlsYWJsZSB0aGVuIHRoYXQgc2xvdCBpbmRleCBpcyB3cml0dGVuIHRvIHRoZSBsb2NhdGlvbgotICAgIC8vIHBvaW50ZWQgdG8gYnkgdGhlIGJ1ZiBhcmd1bWVudCBhbmQgYSBzdGF0dXMgb2YgT0sgaXMgcmV0dXJuZWQuICBJZiBubwotICAgIC8vIHNsb3QgaXMgYXZhaWxhYmxlIHRoZW4gYSBzdGF0dXMgb2YgLUVCVVNZIGlzIHJldHVybmVkIGFuZCBidWYgaXMKLSAgICAvLyB1bm1vZGlmaWVkLgotICAgIC8vIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IHBhcmFtZXRlcnMgbXVzdCBiZSBubyBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gb2YKLSAgICAvLyBHTF9NQVhfVklFV1BPUlRfRElNUyBhbmQgR0xfTUFYX1RFWFRVUkVfU0laRSAoc2VlOiBnbEdldEludGVnZXJ2KS4KLSAgICAvLyBBbiBlcnJvciBkdWUgdG8gaW52YWxpZCBkaW1lbnNpb25zIG1pZ2h0IG5vdCBiZSByZXBvcnRlZCB1bnRpbAotICAgIC8vIHVwZGF0ZVRleEltYWdlKCkgaXMgY2FsbGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUJ1ZmZlcihpbnQgKmJ1ZiwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpOwotCi0gICAgLy8gcXVldWVCdWZmZXIgcmV0dXJucyBhIGZpbGxlZCBidWZmZXIgdG8gdGhlIEJ1ZmZlclF1ZXVlLiBJbiBhZGRpdGlvbiwgYQotICAgIC8vIHRpbWVzdGFtcCBtdXN0IGJlIHByb3ZpZGVkIGZvciB0aGUgYnVmZmVyLiBUaGUgdGltZXN0YW1wIGlzIGluCi0gICAgLy8gbmFub3NlY29uZHMsIGFuZCBtdXN0IGJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4gSXRzIG90aGVyIHNlbWFudGljcwotICAgIC8vICh6ZXJvIHBvaW50LCBldGMpIGFyZSBjbGllbnQtZGVwZW5kZW50IGFuZCBzaG91bGQgYmUgZG9jdW1lbnRlZCBieSB0aGUKLSAgICAvLyBjbGllbnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUJ1ZmZlcihpbnQgYnVmLCBpbnQ2NF90IHRpbWVzdGFtcCwKLSAgICAgICAgICAgIHVpbnQzMl90KiBvdXRXaWR0aCwgdWludDMyX3QqIG91dEhlaWdodCwgdWludDMyX3QqIG91dFRyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCB2b2lkIGNhbmNlbEJ1ZmZlcihpbnQgYnVmKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENyb3AoY29uc3QgUmVjdCYgcmVnKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRyYW5zZm9ybSh1aW50MzJfdCB0cmFuc2Zvcm0pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U2NhbGluZ01vZGUoaW50IG1vZGUpOwotCi0gICAgLy8gc2V0U3luY2hyb25vdXNNb2RlIHNldCB3aGV0aGVyIGRlcXVldWVCdWZmZXIgaXMgc3luY2hyb25vdXMgb3IKLSAgICAvLyBhc3luY2hyb25vdXMuIEluIHN5bmNocm9ub3VzIG1vZGUsIGRlcXVldWVCdWZmZXIgYmxvY2tzIHVudGlsCi0gICAgLy8gYSBidWZmZXIgaXMgYXZhaWxhYmxlLCB0aGUgY3VycmVudGx5IGJvdW5kIGJ1ZmZlciBjYW4gYmUgZGVxdWV1ZWQgYW5kCi0gICAgLy8gcXVldWVkIGJ1ZmZlcnMgd2lsbCBiZSByZXRpcmVkIGluIG9yZGVyLgotICAgIC8vIFRoZSBkZWZhdWx0IG1vZGUgaXMgYXN5bmNocm9ub3VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY2hyb25vdXNNb2RlKGJvb2wgZW5hYmxlZCk7Ci0KLSAgICAvLyBjb25uZWN0IGF0dGVtcHRzIHRvIGNvbm5lY3QgYSBwcm9kdWNlciBjbGllbnQgQVBJIHRvIHRoZSBCdWZmZXJRdWV1ZS4KLSAgICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgSVN1cmZhY2VUZXh0dXJlIG1ldGhvZHMgYXJlIGNhbGxlZAotICAgIC8vIGV4Y2VwdCBmb3IgZ2V0QWxsb2NhdG9yLgotICAgIC8vCi0gICAgLy8gVGhpcyBtZXRob2Qgd2lsbCBmYWlsIGlmIHRoZSBjb25uZWN0IHdhcyBwcmV2aW91c2x5IGNhbGxlZCBvbiB0aGUKLSAgICAvLyBCdWZmZXJRdWV1ZSBhbmQgbm8gY29ycmVzcG9uZGluZyBkaXNjb25uZWN0IGNhbGwgd2FzIG1hZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KGludCBhcGksCi0gICAgICAgICAgICB1aW50MzJfdCogb3V0V2lkdGgsIHVpbnQzMl90KiBvdXRIZWlnaHQsIHVpbnQzMl90KiBvdXRUcmFuc2Zvcm0pOwotCi0gICAgLy8gZGlzY29ubmVjdCBhdHRlbXB0cyB0byBkaXNjb25uZWN0IGEgcHJvZHVjZXIgY2xpZW50IEFQSSBmcm9tIHRoZQotICAgIC8vIEJ1ZmZlclF1ZXVlLiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY2F1c2UgYW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gb3RoZXIKLSAgICAvLyBJU3VyZmFjZVRleHR1cmUgbWV0aG9kcyB0byBmYWlsIGV4Y2VwdCBmb3IgZ2V0QWxsb2NhdG9yIGFuZCBjb25uZWN0LgotICAgIC8vIFN1Y2Nlc3NmdWxseSBjYWxsaW5nIGNvbm5lY3QgYWZ0ZXIgdGhpcyB3aWxsIGFsbG93IHRoZSBvdGhlciBtZXRob2RzIHRvCi0gICAgLy8gc3VjY2VlZCBhZ2Fpbi4KLSAgICAvLwotICAgIC8vIFRoaXMgbWV0aG9kIHdpbGwgZmFpbCBpZiB0aGUgdGhlIEJ1ZmZlclF1ZXVlIGlzIG5vdCBjdXJyZW50bHkKLSAgICAvLyBjb25uZWN0ZWQgdG8gdGhlIHNwZWNpZmllZCBjbGllbnQgQVBJLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdChpbnQgYXBpKTsKLQotICAgIC8vIGR1bXAgb3VyIHN0YXRlIGluIGEgU3RyaW5nCi0gICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4JiByZXN1bHQsIGNvbnN0IGNoYXIqIHByZWZpeCwgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3Q7Ci0KLSAgICAvLyBwdWJsaWMgZmFjaW5nIHN0cnVjdHVyZSBmb3IgQnVmZmVyU2xvdAotICAgIHN0cnVjdCBCdWZmZXJJdGVtIHsKLQotICAgICAgICBCdWZmZXJJdGVtKCkKLSAgICAgICAgIDoKLSAgICAgICAgICAgbVRyYW5zZm9ybSgwKSwKLSAgICAgICAgICAgbVNjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX0ZSRUVaRSksCi0gICAgICAgICAgIG1UaW1lc3RhbXAoMCksCi0gICAgICAgICAgIG1GcmFtZU51bWJlcigwKSwKLSAgICAgICAgICAgbUJ1ZihJTlZBTElEX0JVRkZFUl9TTE9UKSB7Ci0gICAgICAgICAgICAgbUNyb3AubWFrZUludmFsaWQoKTsKLSAgICAgICAgIH0KLSAgICAgICAgLy8gbUdyYXBoaWNCdWZmZXIgcG9pbnRzIHRvIHRoZSBidWZmZXIgYWxsb2NhdGVkIGZvciB0aGlzIHNsb3Qgb3IgaXMgTlVMTAotICAgICAgICAvLyBpZiBubyBidWZmZXIgaGFzIGJlZW4gYWxsb2NhdGVkLgotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBtR3JhcGhpY0J1ZmZlcjsKLQotICAgICAgICAvLyBtQ3JvcCBpcyB0aGUgY3VycmVudCBjcm9wIHJlY3RhbmdsZSBmb3IgdGhpcyBidWZmZXIgc2xvdC4gVGhpcyBnZXRzCi0gICAgICAgIC8vIHNldCB0byBtTmV4dENyb3AgZWFjaCB0aW1lIHF1ZXVlQnVmZmVyIGdldHMgY2FsbGVkIGZvciB0aGlzIGJ1ZmZlci4KLSAgICAgICAgUmVjdCBtQ3JvcDsKLQotICAgICAgICAvLyBtVHJhbnNmb3JtIGlzIHRoZSBjdXJyZW50IHRyYW5zZm9ybSBmbGFncyBmb3IgdGhpcyBidWZmZXIgc2xvdC4gVGhpcwotICAgICAgICAvLyBnZXRzIHNldCB0byBtTmV4dFRyYW5zZm9ybSBlYWNoIHRpbWUgcXVldWVCdWZmZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLSAgICAgICAgLy8gc2xvdC4KLSAgICAgICAgdWludDMyX3QgbVRyYW5zZm9ybTsKLQotICAgICAgICAvLyBtU2NhbGluZ01vZGUgaXMgdGhlIGN1cnJlbnQgc2NhbGluZyBtb2RlIGZvciB0aGlzIGJ1ZmZlciBzbG90LiBUaGlzCi0gICAgICAgIC8vIGdldHMgc2V0IHRvIG1OZXh0U2NhbGluZ01vZGUgZWFjaCB0aW1lIHF1ZXVlQnVmZmVyIGdldHMgY2FsbGVkIGZvcgotICAgICAgICAvLyB0aGlzIHNsb3QuCi0gICAgICAgIHVpbnQzMl90IG1TY2FsaW5nTW9kZTsKLQotICAgICAgICAvLyBtVGltZXN0YW1wIGlzIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBmb3IgdGhpcyBidWZmZXIgc2xvdC4gVGhpcyBnZXRzCi0gICAgICAgIC8vIHRvIHNldCBieSBxdWV1ZUJ1ZmZlciBlYWNoIHRpbWUgdGhpcyBzbG90IGlzIHF1ZXVlZC4KLSAgICAgICAgaW50NjRfdCBtVGltZXN0YW1wOwotCi0gICAgICAgIC8vIG1GcmFtZU51bWJlciBpcyB0aGUgbnVtYmVyIG9mIHRoZSBxdWV1ZWQgZnJhbWUgZm9yIHRoaXMgc2xvdC4KLSAgICAgICAgdWludDY0X3QgbUZyYW1lTnVtYmVyOwotCi0gICAgICAgIC8vIGJ1ZiBpcyB0aGUgc2xvdCBpbmRleCBvZiB0aGlzIGJ1ZmZlcgotICAgICAgICBpbnQgbUJ1ZjsKLQotICAgIH07Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIHB1YmxpYyBmdW5jdGlvbnMgaXMgdGhlIGNvbnN1bWVyIGZhY2luZyBpbnRlcmZhY2UKLQotICAgIC8vIGFjcXVpcmUgY29uc3VtZXMgYSBidWZmZXIgYnkgdHJhbnNmZXJyaW5nIGl0cyBvd25lcnNoaXAgdG8gYSBjb25zdW1lci4KLSAgICAvLyBidWZmZXIgY29udGFpbnMgdGhlIEdyYXBoaWNCdWZmZXIgYW5kIGl0cyBjb3JyZXNwb25kaW5nIGluZm9ybWF0aW9uLgotICAgIC8vIGJ1ZmZlci5tR3JhcGhpY3NCdWZmZXIgd2lsbCBiZSBOVUxMIHdoZW4gdGhlIGJ1ZmZlciBoYXMgYmVlbiBhbHJlYWR5Ci0gICAgLy8gYWNxdWlyZWQgYnkgdGhlIGNvbnN1bWVyLgotCi0gICAgc3RhdHVzX3QgYWNxdWlyZShCdWZmZXJJdGVtICpidWZmZXIpOwotCi0gICAgLy8gcmVsZWFzZUJ1ZmZlciByZWxlYXNlcyBhIGJ1ZmZlciBzbG90IGZyb20gdGhlIGNvbnN1bWVyIGJhY2sgdG8gdGhlCi0gICAgLy8gQnVmZmVyUXVldWUgcGVuZGluZyBhIGZlbmNlIHN5bmMuCi0gICAgc3RhdHVzX3QgcmVsZWFzZUJ1ZmZlcihpbnQgYnVmLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN5bmNLSFIgZmVuY2UpOwotCi0gICAgLy8gY29uc3VtZXJEaXNjb25uZWN0IGRpc2Nvbm5lY3RzIGEgY29uc3VtZXIgZnJvbSB0aGUgQnVmZmVyUXVldWUuIEFsbAotICAgIC8vIGJ1ZmZlcnMgd2lsbCBiZSBmcmVlZC4KLSAgICBzdGF0dXNfdCBjb25zdW1lckRpc2Nvbm5lY3QoKTsKLQotICAgIC8vIHNldERlZmF1bHRCdWZmZXJTaXplIGlzIHVzZWQgdG8gc2V0IHRoZSBzaXplIG9mIGJ1ZmZlcnMgcmV0dXJuZWQgYnkKLSAgICAvLyByZXF1ZXN0QnVmZmVycyB3aGVuIGEgd2l0aCBhbmQgaGVpZ2h0IG9mIHplcm8gaXMgcmVxdWVzdGVkLgotICAgIHN0YXR1c190IHNldERlZmF1bHRCdWZmZXJTaXplKHVpbnQzMl90IHcsIHVpbnQzMl90IGgpOwotCi0gICAgLy8gc2V0QnVmZmVyQ291bnRTZXJ2ZXIgc2V0IHRoZSBidWZmZXIgY291bnQuIElmIHRoZSBjbGllbnQgaGFzIHJlcXVlc3RlZAotICAgIC8vIGEgYnVmZmVyIGNvdW50IHVzaW5nIHNldEJ1ZmZlckNvdW50LCB0aGUgc2VydmVyLWJ1ZmZlciBjb3VudCB3aWxsCi0gICAgLy8gdGFrZSBlZmZlY3Qgb25jZSB0aGUgY2xpZW50IHNldHMgdGhlIGNvdW50IGJhY2sgdG8gemVyby4KLSAgICBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudFNlcnZlcihpbnQgYnVmZmVyQ291bnQpOwotCi0gICAgLy8gaXNTeW5jaHJvbm91c01vZGUgcmV0dXJucyB3aGV0aGVyIHRoZSBTdXJmYWNlVGV4dHVyZSBpcyBjdXJyZW50bHkgaW4KLSAgICAvLyBzeW5jaHJvbm91cyBtb2RlLgotICAgIGJvb2wgaXNTeW5jaHJvbm91c01vZGUoKSBjb25zdDsKLQotICAgIC8vIHNldENvbnN1bWVyTmFtZSBzZXRzIHRoZSBuYW1lIHVzZWQgaW4gbG9nZ2luZwotICAgIHZvaWQgc2V0Q29uc3VtZXJOYW1lKGNvbnN0IFN0cmluZzgmIG5hbWUpOwotCi0gICAgLy8gc2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lciBzZXRzIHRoZSBsaXN0ZW5lciBvYmplY3QgdGhhdCB3aWxsIGJlIG5vdGlmaWVkCi0gICAgLy8gd2hlbiBhIG5ldyBmcmFtZSBiZWNvbWVzIGF2YWlsYWJsZS4KLSAgICB2b2lkIHNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIoY29uc3Qgc3A8RnJhbWVBdmFpbGFibGVMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKLQotCi1wcml2YXRlOgotICAgIC8vIGZyZWVCdWZmZXJMb2NrZWQgZnJlZXMgdGhlIHJlc291cmNlcyAoYm90aCBHcmFwaGljQnVmZmVyIGFuZCBFR0xJbWFnZSkKLSAgICAvLyBmb3IgdGhlIGdpdmVuIHNsb3QuCi0gICAgdm9pZCBmcmVlQnVmZmVyTG9ja2VkKGludCBpbmRleCk7Ci0KLSAgICAvLyBmcmVlQWxsQnVmZmVyc0xvY2tlZCBmcmVlcyB0aGUgcmVzb3VyY2VzIChib3RoIEdyYXBoaWNCdWZmZXIgYW5kCi0gICAgLy8gRUdMSW1hZ2UpIGZvciBhbGwgc2xvdHMuCi0gICAgdm9pZCBmcmVlQWxsQnVmZmVyc0xvY2tlZCgpOwotCi0gICAgLy8gZnJlZUFsbEJ1ZmZlcnNFeGNlcHRIZWFkTG9ja2VkIGZyZWVzIHRoZSByZXNvdXJjZXMgKGJvdGggR3JhcGhpY0J1ZmZlcgotICAgIC8vIGFuZCBFR0xJbWFnZSkgZm9yIGFsbCBzbG90cyBleGNlcHQgdGhlIGhlYWQgb2YgbVF1ZXVlCi0gICAgdm9pZCBmcmVlQWxsQnVmZmVyc0V4Y2VwdEhlYWRMb2NrZWQoKTsKLQotICAgIC8vIGRyYWluUXVldWVMb2NrZWQgZHJhaW5zIHRoZSBidWZmZXIgcXVldWUgaWYgd2UncmUgaW4gc3luY2hyb25vdXMgbW9kZQotICAgIC8vIHJldHVybnMgaW1tZWRpYXRlbHkgb3RoZXJ3aXNlLiBJdCByZXR1cm5zIE5PX0lOSVQgaWYgdGhlIEJ1ZmZlclF1ZXVlCi0gICAgLy8gYmVjYW1lIGFiYW5kb25lZCBvciBkaXNjb25uZWN0ZWQgZHVyaW5nIHRoaXMgY2FsbC4KLSAgICBzdGF0dXNfdCBkcmFpblF1ZXVlTG9ja2VkKCk7Ci0KLSAgICAvLyBkcmFpblF1ZXVlQW5kRnJlZUJ1ZmZlcnNMb2NrZWQgZHJhaW5zIHRoZSBidWZmZXIgcXVldWUgaWYgd2UncmUgaW4KLSAgICAvLyBzeW5jaHJvbm91cyBtb2RlIGFuZCBmcmVlIGFsbCBidWZmZXJzLiBJbiBhc3luY2hyb25vdXMgbW9kZSwgYWxsIGJ1ZmZlcnMKLSAgICAvLyBhcmUgZnJlZWQgZXhjZXB0IHRoZSBjdXJyZW50IGJ1ZmZlci4KLSAgICBzdGF0dXNfdCBkcmFpblF1ZXVlQW5kRnJlZUJ1ZmZlcnNMb2NrZWQoKTsKLQotICAgIHN0YXR1c190IHNldEJ1ZmZlckNvdW50U2VydmVyTG9ja2VkKGludCBidWZmZXJDb3VudCk7Ci0KLSAgICBzdHJ1Y3QgQnVmZmVyU2xvdCB7Ci0KLSAgICAgICAgQnVmZmVyU2xvdCgpCi0gICAgICAgIDogbUVnbERpc3BsYXkoRUdMX05PX0RJU1BMQVkpLAotICAgICAgICAgIG1CdWZmZXJTdGF0ZShCdWZmZXJTbG90OjpGUkVFKSwKLSAgICAgICAgICBtUmVxdWVzdEJ1ZmZlckNhbGxlZChmYWxzZSksCi0gICAgICAgICAgbVRyYW5zZm9ybSgwKSwKLSAgICAgICAgICBtU2NhbGluZ01vZGUoTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfRlJFRVpFKSwKLSAgICAgICAgICBtVGltZXN0YW1wKDApLAotICAgICAgICAgIG1GcmFtZU51bWJlcigwKSwKLSAgICAgICAgICBtRmVuY2UoRUdMX05PX1NZTkNfS0hSKSwKLSAgICAgICAgICBtQWNxdWlyZUNhbGxlZChmYWxzZSkgewotICAgICAgICAgICAgbUNyb3AubWFrZUludmFsaWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1HcmFwaGljQnVmZmVyIHBvaW50cyB0byB0aGUgYnVmZmVyIGFsbG9jYXRlZCBmb3IgdGhpcyBzbG90IG9yIGlzIE5VTEwKLSAgICAgICAgLy8gaWYgbm8gYnVmZmVyIGhhcyBiZWVuIGFsbG9jYXRlZC4KLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUdyYXBoaWNCdWZmZXI7Ci0KLSAgICAgICAgLy8gbUVnbERpc3BsYXkgaXMgdGhlIEVHTERpc3BsYXkgdXNlZCB0byBjcmVhdGUgbUVnbEltYWdlLgotICAgICAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotCi0gICAgICAgIC8vIEJ1ZmZlclN0YXRlIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBzdGF0ZXMgaW4gd2hpY2ggYSBidWZmZXIgc2xvdAotICAgICAgICAvLyBjYW4gYmUuCi0gICAgICAgIGVudW0gQnVmZmVyU3RhdGUgewotICAgICAgICAgICAgLy8gRlJFRSBpbmRpY2F0ZXMgdGhhdCB0aGUgYnVmZmVyIGlzIG5vdCBjdXJyZW50bHkgYmVpbmcgdXNlZCBhbmQKLSAgICAgICAgICAgIC8vIHdpbGwgbm90IGJlIHVzZWQgaW4gdGhlIGZ1dHVyZSB1bnRpbCBpdCBnZXRzIGRlcXVldWVkIGFuZAotICAgICAgICAgICAgLy8gc3Vic2VxdWVudGx5IHF1ZXVlZCBieSB0aGUgY2xpZW50LgotICAgICAgICAgICAgLy8gYWthICJvd25lZCBieSBCdWZmZXJRdWV1ZSwgcmVhZHkgdG8gYmUgZGVxdWV1ZWQiCi0gICAgICAgICAgICBGUkVFID0gMCwKLQotICAgICAgICAgICAgLy8gREVRVUVVRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiBkZXF1ZXVlZCBieSB0aGUKLSAgICAgICAgICAgIC8vIGNsaWVudCwgYnV0IGhhcyBub3QgeWV0IGJlZW4gcXVldWVkIG9yIGNhbmNlbGVkLiBUaGUgYnVmZmVyIGlzCi0gICAgICAgICAgICAvLyBjb25zaWRlcmVkICdvd25lZCcgYnkgdGhlIGNsaWVudCwgYW5kIHRoZSBzZXJ2ZXIgc2hvdWxkIG5vdCB1c2UKLSAgICAgICAgICAgIC8vIGl0IGZvciBhbnl0aGluZy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2hlbiBpbiBzeW5jaHJvbm91cy1tb2RlIChtU3luY2hyb25vdXNNb2RlID09IHRydWUpLAotICAgICAgICAgICAgLy8gdGhlIGJ1ZmZlciB0aGF0J3MgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoZSB0ZXh0dXJlIG1heSBiZQotICAgICAgICAgICAgLy8gZGVxdWV1ZWQgYnkgdGhlIGNsaWVudC4gIFRoYXQgbWVhbnMgdGhhdCB0aGUgY3VycmVudCBidWZmZXIgY2FuCi0gICAgICAgICAgICAvLyBiZSBpbiBlaXRoZXIgdGhlIERFUVVFVUVEIG9yIFFVRVVFRCBzdGF0ZS4gIEluIGFzeW5jaHJvbm91cyBtb2RlLAotICAgICAgICAgICAgLy8gaG93ZXZlciwgdGhlIGN1cnJlbnQgYnVmZmVyIGlzIGFsd2F5cyBpbiB0aGUgUVVFVUVEIHN0YXRlLgotICAgICAgICAgICAgLy8gYWthICJvd25lZCBieSBwcm9kdWNlciwgcmVhZHkgdG8gYmUgcXVldWVkIgotICAgICAgICAgICAgREVRVUVVRUQgPSAxLAotCi0gICAgICAgICAgICAvLyBRVUVVRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiBxdWV1ZWQgYnkgdGhlIGNsaWVudCwKLSAgICAgICAgICAgIC8vIGFuZCBoYXMgbm90IHNpbmNlIGJlZW4gbWFkZSBhdmFpbGFibGUgZm9yIHRoZSBjbGllbnQgdG8gZGVxdWV1ZS4KLSAgICAgICAgICAgIC8vIEF0dGFjaGluZyB0aGUgYnVmZmVyIHRvIHRoZSB0ZXh0dXJlIGRvZXMgTk9UIHRyYW5zaXRpb24gdGhlCi0gICAgICAgICAgICAvLyBidWZmZXIgYXdheSBmcm9tIHRoZSBRVUVVRUQgc3RhdGUuIEhvd2V2ZXIsIGluIFN5bmNocm9ub3VzIG1vZGUKLSAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IGJ1ZmZlciBtYXkgYmUgZGVxdWV1ZWQgYnkgdGhlIGNsaWVudCB1bmRlciBzb21lCi0gICAgICAgICAgICAvLyBjaXJjdW1zdGFuY2VzLiBTZWUgdGhlIG5vdGUgYWJvdXQgdGhlIGN1cnJlbnQgYnVmZmVyIGluIHRoZQotICAgICAgICAgICAgLy8gZG9jdW1lbnRhdGlvbiBmb3IgREVRVUVVRUQuCi0gICAgICAgICAgICAvLyBha2EgIm93bmVkIGJ5IEJ1ZmZlclF1ZXVlLCByZWFkeSB0byBiZSBhY3F1aXJlZCIKLSAgICAgICAgICAgIFFVRVVFRCA9IDIsCi0KLSAgICAgICAgICAgIC8vIGFrYSAib3duZWQgYnkgY29uc3VtZXIsIHJlYWR5IHRvIGJlIHJlbGVhc2VkIgotICAgICAgICAgICAgQUNRVUlSRUQgPSAzCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gbUJ1ZmZlclN0YXRlIGlzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgYnVmZmVyIHNsb3QuCi0gICAgICAgIEJ1ZmZlclN0YXRlIG1CdWZmZXJTdGF0ZTsKLQotICAgICAgICAvLyBtUmVxdWVzdEJ1ZmZlckNhbGxlZCBpcyB1c2VkIGZvciB2YWxpZGF0aW5nIHRoYXQgdGhlIGNsaWVudCBkaWQKLSAgICAgICAgLy8gY2FsbCByZXF1ZXN0QnVmZmVyKCkgd2hlbiB0b2xkIHRvIGRvIHNvLiBUZWNobmljYWxseSB0aGlzIGlzIG5vdAotICAgICAgICAvLyBuZWVkZWQgYnV0IHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBjYXRjaGluZyBjbGllbnQgYnVncy4KLSAgICAgICAgYm9vbCBtUmVxdWVzdEJ1ZmZlckNhbGxlZDsKLQotICAgICAgICAvLyBtQ3JvcCBpcyB0aGUgY3VycmVudCBjcm9wIHJlY3RhbmdsZSBmb3IgdGhpcyBidWZmZXIgc2xvdC4gVGhpcyBnZXRzCi0gICAgICAgIC8vIHNldCB0byBtTmV4dENyb3AgZWFjaCB0aW1lIHF1ZXVlQnVmZmVyIGdldHMgY2FsbGVkIGZvciB0aGlzIGJ1ZmZlci4KLSAgICAgICAgUmVjdCBtQ3JvcDsKLQotICAgICAgICAvLyBtVHJhbnNmb3JtIGlzIHRoZSBjdXJyZW50IHRyYW5zZm9ybSBmbGFncyBmb3IgdGhpcyBidWZmZXIgc2xvdC4gVGhpcwotICAgICAgICAvLyBnZXRzIHNldCB0byBtTmV4dFRyYW5zZm9ybSBlYWNoIHRpbWUgcXVldWVCdWZmZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKLSAgICAgICAgLy8gc2xvdC4KLSAgICAgICAgdWludDMyX3QgbVRyYW5zZm9ybTsKLQotICAgICAgICAvLyBtU2NhbGluZ01vZGUgaXMgdGhlIGN1cnJlbnQgc2NhbGluZyBtb2RlIGZvciB0aGlzIGJ1ZmZlciBzbG90LiBUaGlzCi0gICAgICAgIC8vIGdldHMgc2V0IHRvIG1OZXh0U2NhbGluZ01vZGUgZWFjaCB0aW1lIHF1ZXVlQnVmZmVyIGdldHMgY2FsbGVkIGZvcgotICAgICAgICAvLyB0aGlzIHNsb3QuCi0gICAgICAgIHVpbnQzMl90IG1TY2FsaW5nTW9kZTsKLQotICAgICAgICAvLyBtVGltZXN0YW1wIGlzIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBmb3IgdGhpcyBidWZmZXIgc2xvdC4gVGhpcyBnZXRzCi0gICAgICAgIC8vIHRvIHNldCBieSBxdWV1ZUJ1ZmZlciBlYWNoIHRpbWUgdGhpcyBzbG90IGlzIHF1ZXVlZC4KLSAgICAgICAgaW50NjRfdCBtVGltZXN0YW1wOwotCi0gICAgICAgIC8vIG1GcmFtZU51bWJlciBpcyB0aGUgbnVtYmVyIG9mIHRoZSBxdWV1ZWQgZnJhbWUgZm9yIHRoaXMgc2xvdC4KLSAgICAgICAgdWludDY0X3QgbUZyYW1lTnVtYmVyOwotCi0gICAgICAgIC8vIG1GZW5jZSBpcyB0aGUgRUdMIHN5bmMgb2JqZWN0IHRoYXQgbXVzdCBzaWduYWwgYmVmb3JlIHRoZSBidWZmZXIKLSAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyIHNsb3QgbWF5IGJlIGRlcXVldWVkLiBJdCBpcyBpbml0aWFsaXplZAotICAgICAgICAvLyB0byBFR0xfTk9fU1lOQ19LSFIgd2hlbiB0aGUgYnVmZmVyIGlzIGNyZWF0ZWQgYW5kIChvcHRpb25hbGx5LCBiYXNlZAotICAgICAgICAvLyBvbiBhIGNvbXBpbGUtdGltZSBvcHRpb24pIHNldCB0byBhIG5ldyBzeW5jIG9iamVjdCBpbiB1cGRhdGVUZXhJbWFnZS4KLSAgICAgICAgRUdMU3luY0tIUiBtRmVuY2U7Ci0KLSAgICAgICAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBidWZmZXIgaGFzIGJlZW4gc2VlbiBieSBhIGNvbnN1bWVyIHlldAotICAgICAgICBib29sIG1BY3F1aXJlQ2FsbGVkOwotICAgIH07Ci0KLSAgICAvLyBtU2xvdHMgaXMgdGhlIGFycmF5IG9mIGJ1ZmZlciBzbG90cyB0aGF0IG11c3QgYmUgbWlycm9yZWQgb24gdGhlIGNsaWVudAotICAgIC8vIHNpZGUuIFRoaXMgYWxsb3dzIGJ1ZmZlciBvd25lcnNoaXAgdG8gYmUgdHJhbnNmZXJyZWQgYmV0d2VlbiB0aGUgY2xpZW50Ci0gICAgLy8gYW5kIHNlcnZlciB3aXRob3V0IHNlbmRpbmcgYSBHcmFwaGljQnVmZmVyIG92ZXIgYmluZGVyLiBUaGUgZW50aXJlIGFycmF5Ci0gICAgLy8gaXMgaW5pdGlhbGl6ZWQgdG8gTlVMTCBhdCBjb25zdHJ1Y3Rpb24gdGltZSwgYW5kIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZAotICAgIC8vIGZvciBhIHNsb3Qgd2hlbiByZXF1ZXN0QnVmZmVyIGlzIGNhbGxlZCB3aXRoIHRoYXQgc2xvdCdzIGluZGV4LgotICAgIEJ1ZmZlclNsb3QgbVNsb3RzW05VTV9CVUZGRVJfU0xPVFNdOwotCi0gICAgLy8gbURlZmF1bHRXaWR0aCBob2xkcyB0aGUgZGVmYXVsdCB3aWR0aCBvZiBhbGxvY2F0ZWQgYnVmZmVycy4gSXQgaXMgdXNlZAotICAgIC8vIGluIHJlcXVlc3RCdWZmZXJzKCkgaWYgYSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHplcm8gaXMgc3BlY2lmaWVkLgotICAgIHVpbnQzMl90IG1EZWZhdWx0V2lkdGg7Ci0KLSAgICAvLyBtRGVmYXVsdEhlaWdodCBob2xkcyB0aGUgZGVmYXVsdCBoZWlnaHQgb2YgYWxsb2NhdGVkIGJ1ZmZlcnMuIEl0IGlzIHVzZWQKLSAgICAvLyBpbiByZXF1ZXN0QnVmZmVycygpIGlmIGEgd2lkdGggYW5kIGhlaWdodCBvZiB6ZXJvIGlzIHNwZWNpZmllZC4KLSAgICB1aW50MzJfdCBtRGVmYXVsdEhlaWdodDsKLQotICAgIC8vIG1QaXhlbEZvcm1hdCBob2xkcyB0aGUgcGl4ZWwgZm9ybWF0IG9mIGFsbG9jYXRlZCBidWZmZXJzLiBJdCBpcyB1c2VkCi0gICAgLy8gaW4gcmVxdWVzdEJ1ZmZlcnMoKSBpZiBhIGZvcm1hdCBvZiB6ZXJvIGlzIHNwZWNpZmllZC4KLSAgICB1aW50MzJfdCBtUGl4ZWxGb3JtYXQ7Ci0KLSAgICAvLyBtQnVmZmVyQ291bnQgaXMgdGhlIG51bWJlciBvZiBidWZmZXIgc2xvdHMgdGhhdCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIKLSAgICAvLyBtdXN0IG1haW50YWluLiBJdCBkZWZhdWx0cyB0byBNSU5fQVNZTkNfQlVGRkVSX1NMT1RTIGFuZCBjYW4gYmUgY2hhbmdlZAotICAgIC8vIGJ5IGNhbGxpbmcgc2V0QnVmZmVyQ291bnQgb3Igc2V0QnVmZmVyQ291bnRTZXJ2ZXIKLSAgICBpbnQgbUJ1ZmZlckNvdW50OwotCi0gICAgLy8gbUNsaWVudEJ1ZmZlckNvdW50IGlzIHRoZSBudW1iZXIgb2YgYnVmZmVyIHNsb3RzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LgotICAgIC8vIFRoZSBkZWZhdWx0IGlzIHplcm8sIHdoaWNoIG1lYW5zIHRoZSBjbGllbnQgZG9lc24ndCBjYXJlIGhvdyBtYW55IGJ1ZmZlcnMKLSAgICAvLyB0aGVyZSBpcy4KLSAgICBpbnQgbUNsaWVudEJ1ZmZlckNvdW50OwotCi0gICAgLy8gbVNlcnZlckJ1ZmZlckNvdW50IGJ1ZmZlciBjb3VudCByZXF1ZXN0ZWQgYnkgdGhlIHNlcnZlci1zaWRlCi0gICAgaW50IG1TZXJ2ZXJCdWZmZXJDb3VudDsKLQotICAgIC8vIG1OZXh0Q3JvcCBpcyB0aGUgY3JvcCByZWN0YW5nbGUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuZXh0IGJ1ZmZlcgotICAgIC8vIHRoYXQgZ2V0cyBxdWV1ZWQuIEl0IGlzIHNldCBieSBjYWxsaW5nIHNldENyb3AuCi0gICAgUmVjdCBtTmV4dENyb3A7Ci0KLSAgICAvLyBtTmV4dFRyYW5zZm9ybSBpcyB0aGUgdHJhbnNmb3JtIGlkZW50aWZpZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuZXh0Ci0gICAgLy8gYnVmZmVyIHRoYXQgZ2V0cyBxdWV1ZWQuIEl0IGlzIHNldCBieSBjYWxsaW5nIHNldFRyYW5zZm9ybS4KLSAgICB1aW50MzJfdCBtTmV4dFRyYW5zZm9ybTsKLQotICAgIC8vIG1OZXh0U2NhbGluZ01vZGUgaXMgdGhlIHNjYWxpbmcgbW9kZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5leHQKLSAgICAvLyBidWZmZXJzIHRoYXQgZ2V0IHF1ZXVlZC4gSXQgaXMgc2V0IGJ5IGNhbGxpbmcgc2V0U2NhbGluZ01vZGUuCi0gICAgaW50IG1OZXh0U2NhbGluZ01vZGU7Ci0KLSAgICAvLyBtR3JhcGhpY0J1ZmZlckFsbG9jIGlzIHRoZSBjb25uZWN0aW9uIHRvIFN1cmZhY2VGbGluZ2VyIHRoYXQgaXMgdXNlZCB0bwotICAgIC8vIGFsbG9jYXRlIG5ldyBHcmFwaGljQnVmZmVyIG9iamVjdHMuCi0gICAgc3A8SUdyYXBoaWNCdWZmZXJBbGxvYz4gbUdyYXBoaWNCdWZmZXJBbGxvYzsKLQotICAgIC8vIG1GcmFtZUF2YWlsYWJsZUxpc3RlbmVyIGlzIHRoZSBsaXN0ZW5lciBvYmplY3QgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEKLSAgICAvLyBuZXcgZnJhbWUgYmVjb21lcyBhdmFpbGFibGUuIElmIGl0IGlzIG5vdCBOVUxMIGl0IHdpbGwgYmUgY2FsbGVkIGZyb20KLSAgICAvLyBxdWV1ZUJ1ZmZlci4KLSAgICBzcDxGcmFtZUF2YWlsYWJsZUxpc3RlbmVyPiBtRnJhbWVBdmFpbGFibGVMaXN0ZW5lcjsKLQotICAgIC8vIG1TeW5jaHJvbm91c01vZGUgd2hldGhlciB3ZSdyZSBpbiBzeW5jaHJvbm91cyBtb2RlIG9yIG5vdAotICAgIGJvb2wgbVN5bmNocm9ub3VzTW9kZTsKLQotICAgIC8vIG1BbGxvd1N5bmNocm9ub3VzTW9kZSB3aGV0aGVyIHdlIGFsbG93IHN5bmNocm9ub3VzIG1vZGUgb3Igbm90Ci0gICAgY29uc3QgYm9vbCBtQWxsb3dTeW5jaHJvbm91c01vZGU7Ci0KLSAgICAvLyBtQ29ubmVjdGVkQXBpIGluZGljYXRlcyB0aGUgQVBJIHRoYXQgaXMgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGlzCi0gICAgLy8gQnVmZmVyUXVldWUuICBJdCBkZWZhdWx0cyB0byBOT19DT05ORUNURURfQVBJICg9IDApLCBhbmQgZ2V0cyB1cGRhdGVkCi0gICAgLy8gYnkgdGhlIGNvbm5lY3QgYW5kIGRpc2Nvbm5lY3QgbWV0aG9kcy4KLSAgICBpbnQgbUNvbm5lY3RlZEFwaTsKLQotICAgIC8vIG1EZXF1ZXVlQ29uZGl0aW9uIGNvbmRpdGlvbiB1c2VkIGZvciBkZXF1ZXVlQnVmZmVyIGluIHN5bmNocm9ub3VzIG1vZGUKLSAgICBtdXRhYmxlIENvbmRpdGlvbiBtRGVxdWV1ZUNvbmRpdGlvbjsKLQotICAgIC8vIG1RdWV1ZSBpcyBhIEZJRk8gb2YgcXVldWVkIGJ1ZmZlcnMgdXNlZCBpbiBzeW5jaHJvbm91cyBtb2RlCi0gICAgdHlwZWRlZiBWZWN0b3I8aW50PiBGaWZvOwotICAgIEZpZm8gbVF1ZXVlOwotCi0gICAgLy8gbUFiYW5kb25lZCBpbmRpY2F0ZXMgdGhhdCB0aGUgQnVmZmVyUXVldWUgd2lsbCBubyBsb25nZXIgYmUgdXNlZCB0bwotICAgIC8vIGNvbnN1bWUgaW1hZ2VzIGJ1ZmZlcnMgcHVzaGVkIHRvIGl0IHVzaW5nIHRoZSBJU3VyZmFjZVRleHR1cmUgaW50ZXJmYWNlLgotICAgIC8vIEl0IGlzIGluaXRpYWxpemVkIHRvIGZhbHNlLCBhbmQgc2V0IHRvIHRydWUgaW4gdGhlIGFiYW5kb24gbWV0aG9kLiAgQQotICAgIC8vIEJ1ZmZlclF1ZXVlIHRoYXQgaGFzIGJlZW4gYWJhbmRvbmVkIHdpbGwgcmV0dXJuIHRoZSBOT19JTklUIGVycm9yIGZyb20KLSAgICAvLyBhbGwgSVN1cmZhY2VUZXh0dXJlIG1ldGhvZHMgY2FwYWJsZSBvZiByZXR1cm5pbmcgYW4gZXJyb3IuCi0gICAgYm9vbCBtQWJhbmRvbmVkOwotCi0gICAgLy8gbU5hbWUgaXMgYSBzdHJpbmcgdXNlZCB0byBpZGVudGlmeSB0aGUgQnVmZmVyUXVldWUgaW4gbG9nIG1lc3NhZ2VzLgotICAgIC8vIEl0IGlzIHNldCBieSB0aGUgc2V0TmFtZSBtZXRob2QuCi0gICAgU3RyaW5nOCBtQ29uc3VtZXJOYW1lOwotCi0gICAgLy8gbU11dGV4IGlzIHRoZSBtdXRleCB1c2VkIHRvIHByZXZlbnQgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG1lbWJlcgotICAgIC8vIHZhcmlhYmxlcyBvZiBCdWZmZXJRdWV1ZSBvYmplY3RzLiBJdCBtdXN0IGJlIGxvY2tlZCB3aGVuZXZlciB0aGUKLSAgICAvLyBtZW1iZXIgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZC4KLSAgICBtdXRhYmxlIE11dGV4IG1NdXRleDsKLQotICAgIC8vIG1GcmFtZUNvdW50ZXIgaXMgdGhlIGZyZWUgcnVubmluZyBjb3VudGVyLCBpbmNyZW1lbnRlZCBmb3IgZXZlcnkgYnVmZmVyIHF1ZXVlZAotICAgIC8vIHdpdGggdGhlIHN1cmZhY2UgVGV4dHVyZS4KLSAgICB1aW50NjRfdCBtRnJhbWVDb3VudGVyOwotCi0gICAgYm9vbCBtQnVmZmVySGFzQmVlblF1ZXVlZDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9CVUZGRVJRVUVVRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9EaXNwbGF5RXZlbnRSZWNlaXZlci5oIGIvaW5jbHVkZS9ndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjYThkNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9EaXNwbGF5RXZlbnRSZWNlaXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX0RJU1BMQVlfRVZFTlRfSAotI2RlZmluZSBBTkRST0lEX0dVSV9ESVNQTEFZX0VWRU5UX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQml0VHViZTsKLWNsYXNzIElEaXNwbGF5RXZlbnRDb25uZWN0aW9uOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIERpc3BsYXlFdmVudFJlY2VpdmVyIHsKLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAgRElTUExBWV9FVkVOVF9WU1lOQyA9ICd2c3luJwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgRXZlbnQgewotCi0gICAgICAgIHN0cnVjdCBIZWFkZXIgewotICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wOwotICAgICAgICB9OwotCi0gICAgICAgIHN0cnVjdCBWU3luYyB7Ci0gICAgICAgICAgICB1aW50MzJfdCBjb3VudDsKLSAgICAgICAgfTsKLQotICAgICAgICBIZWFkZXIgaGVhZGVyOwotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICBWU3luYyB2c3luYzsKLSAgICAgICAgfTsKLSAgICB9OwotCi1wdWJsaWM6Ci0gICAgLyoKLSAgICAgKiBEaXNwbGF5RXZlbnRSZWNlaXZlciBjcmVhdGVzIGFuZCByZWdpc3RlcnMgYW4gZXZlbnQgY29ubmVjdGlvbiB3aXRoCi0gICAgICogU3VyZmFjZUZsaW5nZXIuIFZTeW5jIGV2ZW50cyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4gQ2FsbCBzZXRWU3luY1JhdGUKLSAgICAgKiBvciByZXF1ZXN0TmV4dFZzeW5jIHRvIHJlY2VpdmUgdGhlbS4KLSAgICAgKiBPdGhlciBldmVudHMgc3RhcnQgYmVpbmcgZGVsaXZlcmVkIGltbWVkaWF0ZWx5LgotICAgICAqLwotICAgIERpc3BsYXlFdmVudFJlY2VpdmVyKCk7Ci0KLSAgICAvKgotICAgICAqIH5EaXNwbGF5RXZlbnRSZWNlaXZlciBzZXZlcnMgdGhlIGNvbm5lY3Rpb24gd2l0aCBTdXJmYWNlRmxpbmdlciwgbmV3IGV2ZW50cwotICAgICAqIHN0b3AgYmVpbmcgZGVsaXZlcmVkIGltbWVkaWF0ZWx5LiBOb3RlIHRoYXQgdGhlIHF1ZXVlIGNvdWxkIGhhdmUKLSAgICAgKiBzb21lIGV2ZW50cyBwZW5kaW5nLiBUaGVzZSB3aWxsIGJlIGRlbGl2ZXJlZC4KLSAgICAgKi8KLSAgICB+RGlzcGxheUV2ZW50UmVjZWl2ZXIoKTsKLQotICAgIC8qCi0gICAgICogaW5pdENoZWNrIHJldHVybnMgdGhlIHN0YXRlIG9mIERpc3BsYXlFdmVudFJlY2VpdmVyIGFmdGVyIGNvbnN0cnVjdGlvbi4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIC8qCi0gICAgICogZ2V0RmQgcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHVzZSB0byByZWNlaXZlIGV2ZW50cy4KLSAgICAgKiBPV05FUlNISVAgSVMgUkVUQUlORUQgYnkgRGlzcGxheUV2ZW50UmVjZWl2ZXIuIERPIE5PVCBDTE9TRSB0aGlzCi0gICAgICogZmlsZS1kZXNjcmlwdG9yLgotICAgICAqLwotICAgIGludCBnZXRGZCgpIGNvbnN0OwotCi0gICAgLyoKLSAgICAgKiBnZXRFdmVudHMgcmVhZHMgZXZlbnQgZnJvbSB0aGUgcXVldWUgYW5kIHJldHVybnMgaG93IG1hbnkgZXZlbnRzIHdlcmUKLSAgICAgKiByZWFkLiBSZXR1cm5zIDAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAgICAgKiBJZiBOT1RfRU5PVUdIX0RBVEEgaXMgcmV0dXJuZWQsIHRoZSBvYmplY3QgaGFzIGJlY29tZSBpbnZhbGlkIGZvcmV2ZXIsIGl0Ci0gICAgICogc2hvdWxkIGJlIGRlc3Ryb3llZCBhbmQgZ2V0RXZlbnRzKCkgc2hvdWxkbid0IGJlIGNhbGxlZCBhZ2Fpbi4KLSAgICAgKi8KLSAgICBzc2l6ZV90IGdldEV2ZW50cyhFdmVudCogZXZlbnRzLCBzaXplX3QgY291bnQpOwotICAgIHN0YXRpYyBzc2l6ZV90IGdldEV2ZW50cyhjb25zdCBzcDxCaXRUdWJlPiYgZGF0YUNoYW5uZWwsCi0gICAgICAgICAgICBFdmVudCogZXZlbnRzLCBzaXplX3QgY291bnQpOwotCi0gICAgLyoKLSAgICAgKiBzZXRWc3luY1JhdGUoKSBzZXRzIHRoZSBFdmVudDo6VlN5bmMgZGVsaXZlcnkgcmF0ZS4gQSB2YWx1ZSBvZgotICAgICAqIDEgcmV0dXJucyBldmVyeSBFdmVudDo6VlN5bmMuIEEgdmFsdWUgb2YgMiByZXR1cm5zIGV2ZXJ5IG90aGVyIGV2ZW50LAotICAgICAqIGV0Yy4uLiBhIHZhbHVlIG9mIDAgcmV0dXJucyBubyBldmVudCB1bmxlc3MgIHJlcXVlc3ROZXh0VnN5bmMoKSBoYXMKLSAgICAgKiBiZWVuIGNhbGxlZC4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRWc3luY1JhdGUodWludDMyX3QgY291bnQpOwotCi0gICAgLyoKLSAgICAgKiByZXF1ZXN0TmV4dFZzeW5jKCkgc2NoZWR1bGVzIHRoZSBuZXh0IEV2ZW50OjpWU3luYy4gSXQgaGFzIG5vIGVmZmVjdAotICAgICAqIGlmIHRoZSB2c3luYyByYXRlIGlzID4gMC4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCByZXF1ZXN0TmV4dFZzeW5jKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8SURpc3BsYXlFdmVudENvbm5lY3Rpb24+IG1FdmVudENvbm5lY3Rpb247Ci0gICAgc3A8Qml0VHViZT4gbURhdGFDaGFubmVsOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX0RJU1BMQVlfRVZFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvSURpc3BsYXlFdmVudENvbm5lY3Rpb24uaCBiL2luY2x1ZGUvZ3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MjQ3ZGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvSURpc3BsYXlFdmVudENvbm5lY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX0lESVNQTEFZX0VWRU5UX0NPTk5FQ1RJT05fSAotI2RlZmluZSBBTkRST0lEX0dVSV9JRElTUExBWV9FVkVOVF9DT05ORUNUSU9OX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCaXRUdWJlOwotCi1jbGFzcyBJRGlzcGxheUV2ZW50Q29ubmVjdGlvbiA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0KLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKERpc3BsYXlFdmVudENvbm5lY3Rpb24pOwotCi0gICAgLyoKLSAgICAgKiBnZXREYXRhQ2hhbm5lbCgpIHJldHVybnMgYSBCaXRUdWJlIHdoZXJlIHRvIHJlY2VpdmUgdGhlIGV2ZW50cyBmcm9tCi0gICAgICovCi0gICAgdmlydHVhbCBzcDxCaXRUdWJlPiBnZXREYXRhQ2hhbm5lbCgpIGNvbnN0ID0gMDsKLQotICAgIC8qCi0gICAgICogc2V0VnN5bmNSYXRlKCkgc2V0cyB0aGUgdnN5bmMgZXZlbnQgZGVsaXZlcnkgcmF0ZS4gQSB2YWx1ZSBvZgotICAgICAqIDEgcmV0dXJucyBldmVyeSB2c3luYyBldmVudHMuIEEgdmFsdWUgb2YgMiByZXR1cm5zIGV2ZXJ5IG90aGVyIGV2ZW50cywKLSAgICAgKiBldGMuLi4gYSB2YWx1ZSBvZiAwIHJldHVybnMgbm8gZXZlbnQgdW5sZXNzICByZXF1ZXN0TmV4dFZzeW5jKCkgaGFzCi0gICAgICogYmVlbiBjYWxsZWQuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIHNldFZzeW5jUmF0ZSh1aW50MzJfdCBjb3VudCkgPSAwOwotCi0gICAgLyoKLSAgICAgKiByZXF1ZXN0TmV4dFZzeW5jKCkgc2NoZWR1bGVzIHRoZSBuZXh0IHZzeW5jIGV2ZW50LiBJdCBoYXMgbm8gZWZmZWN0Ci0gICAgICogaWYgdGhlIHZzeW5jIHJhdGUgaXMgPiAwLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCByZXF1ZXN0TmV4dFZzeW5jKCkgPSAwOyAgICAvLyBhc3luY2hyb25vdXMKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5EaXNwbGF5RXZlbnRDb25uZWN0aW9uIDogcHVibGljIEJuSW50ZXJmYWNlPElEaXNwbGF5RXZlbnRDb25uZWN0aW9uPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX0lESVNQTEFZX0VWRU5UX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvSUdyYXBoaWNCdWZmZXJBbGxvYy5oIGIvaW5jbHVkZS9ndWkvSUdyYXBoaWNCdWZmZXJBbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWU0MWQ5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX0lHUkFQSElDX0JVRkZFUl9BTExPQ19ICi0jZGVmaW5lIEFORFJPSURfR1VJX0lHUkFQSElDX0JVRkZFUl9BTExPQ19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgR3JhcGhpY0J1ZmZlcjsKLQotY2xhc3MgSUdyYXBoaWNCdWZmZXJBbGxvYyA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShHcmFwaGljQnVmZmVyQWxsb2MpOwotCi0gICAgLyogQ3JlYXRlIGEgbmV3IEdyYXBoaWNCdWZmZXIgZm9yIHRoZSBjbGllbnQgdG8gdXNlLgotICAgICAqLwotICAgIHZpcnR1YWwgc3A8R3JhcGhpY0J1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcih1aW50MzJfdCB3LCB1aW50MzJfdCBoLAotICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwgc3RhdHVzX3QqIGVycm9yKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuR3JhcGhpY0J1ZmZlckFsbG9jIDogcHVibGljIEJuSW50ZXJmYWNlPElHcmFwaGljQnVmZmVyQWxsb2M+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9JR1JBUEhJQ19CVUZGRVJfQUxMT0NfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvSVNlbnNvckV2ZW50Q29ubmVjdGlvbi5oIGIvaW5jbHVkZS9ndWkvSVNlbnNvckV2ZW50Q29ubmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDkwNjVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ3VpL0lTZW5zb3JFdmVudENvbm5lY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX0lTRU5TT1JfRVZFTlRfQ09OTkVDVElPTl9ICi0jZGVmaW5lIEFORFJPSURfR1VJX0lTRU5TT1JfRVZFTlRfQ09OTkVDVElPTl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQml0VHViZTsKLQotY2xhc3MgSVNlbnNvckV2ZW50Q29ubmVjdGlvbiA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTZW5zb3JFdmVudENvbm5lY3Rpb24pOwotCi0gICAgdmlydHVhbCBzcDxCaXRUdWJlPiBnZXRTZW5zb3JDaGFubmVsKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlRGlzYWJsZShpbnQgaGFuZGxlLCBib29sIGVuYWJsZWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEV2ZW50UmF0ZShpbnQgaGFuZGxlLCBuc2Vjc190IG5zKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuU2Vuc29yRXZlbnRDb25uZWN0aW9uIDogcHVibGljIEJuSW50ZXJmYWNlPElTZW5zb3JFdmVudENvbm5lY3Rpb24+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9HVUlfSVNFTlNPUl9FVkVOVF9DT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0lTZW5zb3JTZXJ2ZXIuaCBiL2luY2x1ZGUvZ3VpL0lTZW5zb3JTZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4YWZjNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9JU2Vuc29yU2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9JU0VOU09SU0VSVkVSX0gKLSNkZWZpbmUgQU5EUk9JRF9HVUlfSVNFTlNPUlNFUlZFUl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU2Vuc29yOwotY2xhc3MgSVNlbnNvckV2ZW50Q29ubmVjdGlvbjsKLQotY2xhc3MgSVNlbnNvclNlcnZlciA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTZW5zb3JTZXJ2ZXIpOwotCi0gICAgdmlydHVhbCBWZWN0b3I8U2Vuc29yPiBnZXRTZW5zb3JMaXN0KCkgPSAwOwotICAgIHZpcnR1YWwgc3A8SVNlbnNvckV2ZW50Q29ubmVjdGlvbj4gY3JlYXRlU2Vuc29yRXZlbnRDb25uZWN0aW9uKCkgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblNlbnNvclNlcnZlciA6IHB1YmxpYyBCbkludGVyZmFjZTxJU2Vuc29yU2VydmVyPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX0lTRU5TT1JTRVJWRVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvSVN1cmZhY2UuaCBiL2luY2x1ZGUvZ3VpL0lTdXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZmY5ZmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvSVN1cmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX0lTVVJGQUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9HVUlfSVNVUkZBQ0VfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotCi0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10eXBlZGVmIGludDMyX3QgICAgU3VyZmFjZUlEOwotCi1jbGFzcyBJU3VyZmFjZVRleHR1cmU7Ci0KLWNsYXNzIElTdXJmYWNlIDogcHVibGljIElJbnRlcmZhY2UKLXsKLXByb3RlY3RlZDoKLSAgICBlbnVtIHsKLSAgICAgICAgR0VUX1NVUkZBQ0VfVEVYVFVSRSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgfTsKLQotcHVibGljOiAKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFN1cmZhY2UpOwotCi0gICAgdmlydHVhbCBzcDxJU3VyZmFjZVRleHR1cmU+IGdldFN1cmZhY2VUZXh0dXJlKCkgY29uc3QgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblN1cmZhY2UgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVN1cmZhY2U+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9JU1VSRkFDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9JU3VyZmFjZUNvbXBvc2VyLmggYi9pbmNsdWRlL2d1aS9JU3VyZmFjZUNvbXBvc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzBlY2IuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvSVN1cmZhY2VDb21wb3Nlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX0lTVVJGQUNFX0NPTVBPU0VSX0gKLSNkZWZpbmUgQU5EUk9JRF9HVUlfSVNVUkZBQ0VfQ09NUE9TRVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotCi0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLQotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlckFsbG9jLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBDb21wb3NlclN0YXRlOwotY2xhc3MgSURpc3BsYXlFdmVudENvbm5lY3Rpb247Ci1jbGFzcyBJTWVtb3J5SGVhcDsKLQotY2xhc3MgSVN1cmZhY2VDb21wb3NlciA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTdXJmYWNlQ29tcG9zZXIpOwotCi0gICAgZW51bSB7IC8vIChrZWVwIGluIHN5bmMgd2l0aCBTdXJmYWNlLmphdmEpCi0gICAgICAgIGVIaWRkZW4gICAgICAgICAgICAgPSAweDAwMDAwMDA0LAotICAgICAgICBlRGVzdHJveUJhY2tidWZmZXIgID0gMHgwMDAwMDAyMCwKLSAgICAgICAgZVNlY3VyZSAgICAgICAgICAgICA9IDB4MDAwMDAwODAsCi0gICAgICAgIGVOb25QcmVtdWx0aXBsaWVkICAgPSAweDAwMDAwMTAwLAotICAgICAgICBlT3BhcXVlICAgICAgICAgICAgID0gMHgwMDAwMDQwMCwKLSAgICAgICAgZVByb3RlY3RlZEJ5QXBwICAgICA9IDB4MDAwMDA4MDAsCi0gICAgICAgIGVQcm90ZWN0ZWRCeURSTSAgICAgPSAweDAwMDAxMDAwLAotCi0gICAgICAgIGVGWFN1cmZhY2VOb3JtYWwgICAgPSAweDAwMDAwMDAwLAotICAgICAgICBlRlhTdXJmYWNlQmx1ciAgICAgID0gMHgwMDAxMDAwMCwKLSAgICAgICAgZUZYU3VyZmFjZURpbSAgICAgICA9IDB4MDAwMjAwMDAsCi0gICAgICAgIGVGWFN1cmZhY2VTY3JlZW5zaG90PSAweDAwMDMwMDAwLAotICAgICAgICBlRlhTdXJmYWNlTWFzayAgICAgID0gMHgwMDBGMDAwMCwKLSAgICB9OwotCi0gICAgZW51bSB7Ci0gICAgICAgIGVQb3NpdGlvbkNoYW5nZWQgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCi0gICAgICAgIGVMYXllckNoYW5nZWQgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCi0gICAgICAgIGVTaXplQ2hhbmdlZCAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCi0gICAgICAgIGVBbHBoYUNoYW5nZWQgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDgsCi0gICAgICAgIGVNYXRyaXhDaGFuZ2VkICAgICAgICAgICAgICA9IDB4MDAwMDAwMTAsCi0gICAgICAgIGVUcmFuc3BhcmVudFJlZ2lvbkNoYW5nZWQgICA9IDB4MDAwMDAwMjAsCi0gICAgICAgIGVWaXNpYmlsaXR5Q2hhbmdlZCAgICAgICAgICA9IDB4MDAwMDAwNDAsCi0gICAgICAgIGVGcmVlemVUaW50Q2hhbmdlZCAgICAgICAgICA9IDB4MDAwMDAwODAsCi0gICAgfTsKLQotICAgIGVudW0gewotICAgICAgICBlTGF5ZXJIaWRkZW4gICAgICAgID0gMHgwMSwKLSAgICAgICAgZUxheWVyRnJvemVuICAgICAgICA9IDB4MDIsCi0gICAgICAgIGVMYXllckRpdGhlciAgICAgICAgPSAweDA0LAotICAgICAgICBlTGF5ZXJGaWx0ZXIgICAgICAgID0gMHgwOCwKLSAgICAgICAgZUxheWVyQmx1ckZyZWV6ZSAgICA9IDB4MTAKLSAgICB9OwotCi0gICAgZW51bSB7Ci0gICAgICAgIGVPcmllbnRhdGlvbkRlZmF1bHQgICAgID0gMCwKLSAgICAgICAgZU9yaWVudGF0aW9uOTAgICAgICAgICAgPSAxLAotICAgICAgICBlT3JpZW50YXRpb24xODAgICAgICAgICA9IDIsCi0gICAgICAgIGVPcmllbnRhdGlvbjI3MCAgICAgICAgID0gMywKLSAgICAgICAgZU9yaWVudGF0aW9uVW5jaGFuZ2VkICAgPSA0LAotICAgICAgICBlT3JpZW50YXRpb25Td2FwTWFzayAgICA9IDB4MDEKLSAgICB9OwotCi0gICAgZW51bSB7Ci0gICAgICAgIGVTeW5jaHJvbm91cyAgICAgICAgICAgID0gMHgwMSwKLSAgICB9OwotCi0gICAgZW51bSB7Ci0gICAgICAgIGVFbGVjdHJvbkJlYW1BbmltYXRpb25PbiAgPSAweDAxLAotICAgICAgICBlRWxlY3Ryb25CZWFtQW5pbWF0aW9uT2ZmID0gMHgxMAotICAgIH07Ci0KLSAgICAvKiBjcmVhdGUgY29ubmVjdGlvbiB3aXRoIHN1cmZhY2UgZmxpbmdlciwgcmVxdWlyZXMKLSAgICAgKiBBQ0NFU1NfU1VSRkFDRV9GTElOR0VSIHBlcm1pc3Npb24KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHNwPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNyZWF0ZUNvbm5lY3Rpb24oKSA9IDA7Ci0KLSAgICAvKiBjcmVhdGUgYSBncmFwaGljIGJ1ZmZlciBhbGxvY2F0b3IKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHNwPElHcmFwaGljQnVmZmVyQWxsb2M+IGNyZWF0ZUdyYXBoaWNCdWZmZXJBbGxvYygpID0gMDsKLQotICAgIC8qIHJldHJpZXZlIHRoZSBjb250cm9sIGJsb2NrICovCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0Q2JsaygpIGNvbnN0ID0gMDsKLQotICAgIC8qIG9wZW4vY2xvc2UgdHJhbnNhY3Rpb25zLiByZXF1aXJlcyBBQ0NFU1NfU1VSRkFDRV9GTElOR0VSIHBlcm1pc3Npb24gKi8KLSAgICB2aXJ0dWFsIHZvaWQgc2V0VHJhbnNhY3Rpb25TdGF0ZShjb25zdCBWZWN0b3I8Q29tcG9zZXJTdGF0ZT4mIHN0YXRlLAotICAgICAgICAgICAgaW50IG9yaWVudGF0aW9uLCB1aW50MzJfdCBmbGFncykgPSAwOwotCi0gICAgLyogc2lnbmFsIHRoYXQgd2UncmUgZG9uZSBib290aW5nLgotICAgICAqIFJlcXVpcmVzIEFDQ0VTU19TVVJGQUNFX0ZMSU5HRVIgcGVybWlzc2lvbgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBib290RmluaXNoZWQoKSA9IDA7Ci0KLSAgICAvKiBDYXB0dXJlIHRoZSBzcGVjaWZpZWQgc2NyZWVuLiByZXF1aXJlcyBSRUFEX0ZSQU1FX0JVRkZFUiBwZXJtaXNzaW9uCi0gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgYSBzZWN1cmUgd2luZG93IG9uIHNjcmVlbi4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmVTY3JlZW4oRGlzcGxheUlEIGRweSwKLSAgICAgICAgICAgIHNwPElNZW1vcnlIZWFwPiogaGVhcCwKLSAgICAgICAgICAgIHVpbnQzMl90KiB3aWR0aCwgdWludDMyX3QqIGhlaWdodCwgUGl4ZWxGb3JtYXQqIGZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcVdpZHRoLCB1aW50MzJfdCByZXFIZWlnaHQsCi0gICAgICAgICAgICB1aW50MzJfdCBtaW5MYXllclosIHVpbnQzMl90IG1heExheWVyWikgPSAwOwotCi0gICAgLyogdHJpZ2dlcnMgc2NyZWVuIG9mZiBhbmltYXRpb24gKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHR1cm5FbGVjdHJvbkJlYW1PZmYoaW50MzJfdCBtb2RlKSA9IDA7Ci0KLSAgICAvKiB0cmlnZ2VycyBzY3JlZW4gb24gYW5pbWF0aW9uICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCB0dXJuRWxlY3Ryb25CZWFtT24oaW50MzJfdCBtb2RlKSA9IDA7Ci0KLSAgICAvKiB2ZXJpZnkgdGhhdCBhbiBJU3VyZmFjZVRleHR1cmUgd2FzIGNyZWF0ZWQgYnkgU3VyZmFjZUZsaW5nZXIuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIGF1dGhlbnRpY2F0ZVN1cmZhY2VUZXh0dXJlKAotICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2VUZXh0dXJlPiYgc3VyZmFjZSkgY29uc3QgPSAwOwotCi0gICAgLyogcmV0dXJuIGFuIElEaXNwbGF5RXZlbnRDb25uZWN0aW9uICovCi0gICAgdmlydHVhbCBzcDxJRGlzcGxheUV2ZW50Q29ubmVjdGlvbj4gY3JlYXRlRGlzcGxheUV2ZW50Q29ubmVjdGlvbigpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5TdXJmYWNlQ29tcG9zZXIgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVN1cmZhY2VDb21wb3Nlcj4KLXsKLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAgLy8gTm90ZTogQk9PVF9GSU5JU0hFRCBtdXN0IHJlbWFpbiB0aGlzIHZhbHVlLCBpdCBpcyBjYWxsZWQgZnJvbQotICAgICAgICAvLyBKYXZhIGJ5IEFjdGl2aXR5TWFuYWdlclNlcnZpY2UuCi0gICAgICAgIEJPT1RfRklOSVNIRUQgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgICAgICBDUkVBVEVfQ09OTkVDVElPTiwKLSAgICAgICAgQ1JFQVRFX0dSQVBISUNfQlVGRkVSX0FMTE9DLAotICAgICAgICBHRVRfQ0JMSywKLSAgICAgICAgU0VUX1RSQU5TQUNUSU9OX1NUQVRFLAotICAgICAgICBTRVRfT1JJRU5UQVRJT04sCi0gICAgICAgIENBUFRVUkVfU0NSRUVOLAotICAgICAgICBUVVJOX0VMRUNUUk9OX0JFQU1fT0ZGLAotICAgICAgICBUVVJOX0VMRUNUUk9OX0JFQU1fT04sCi0gICAgICAgIEFVVEhFTlRJQ0FURV9TVVJGQUNFLAotICAgICAgICBDUkVBVEVfRElTUExBWV9FVkVOVF9DT05ORUNUSU9OLAotICAgIH07Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX0lTVVJGQUNFX0NPTVBPU0VSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuaCBiL2luY2x1ZGUvZ3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5MzkzMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9JU1VSRkFDRV9DT01QT1NFUl9DTElFTlRfSAotI2RlZmluZSBBTkRST0lEX0dVSV9JU1VSRkFDRV9DT01QT1NFUl9DTElFTlRfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotCi0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLQotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdHlwZWRlZiBpbnQzMl90ICAgIERpc3BsYXlJRDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJU3VyZmFjZUNvbXBvc2VyQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFN1cmZhY2VDb21wb3NlckNsaWVudCk7Ci0KLSAgICBzdHJ1Y3Qgc3VyZmFjZV9kYXRhX3QgewotICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHRva2VuOwotICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlkZW50aXR5OwotICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIHBhcmNlbCk7Ci0gICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0OwotICAgIH07Ci0KLSAgICAvKgotICAgICAqIFJlcXVpcmVzIEFDQ0VTU19TVVJGQUNFX0ZMSU5HRVIgcGVybWlzc2lvbgotICAgICAqLwotICAgIHZpcnR1YWwgc3A8SVN1cmZhY2U+IGNyZWF0ZVN1cmZhY2UoIHN1cmZhY2VfZGF0YV90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheUlEIGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgPSAwOwotCi0gICAgLyoKLSAgICAgKiBSZXF1aXJlcyBBQ0NFU1NfU1VSRkFDRV9GTElOR0VSIHBlcm1pc3Npb24KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGRlc3Ryb3lTdXJmYWNlKFN1cmZhY2VJRCBzaWQpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5TdXJmYWNlQ29tcG9zZXJDbGllbnQgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVN1cmZhY2VDb21wb3NlckNsaWVudD4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX0lTVVJGQUNFX0NPTVBPU0VSX0NMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9JU3VyZmFjZVRleHR1cmUuaCBiL2luY2x1ZGUvZ3VpL0lTdXJmYWNlVGV4dHVyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDYyNmEwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ3VpL0lTdXJmYWNlVGV4dHVyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX0lTVVJGQUNFVEVYVFVSRV9ICi0jZGVmaW5lIEFORFJPSURfR1VJX0lTVVJGQUNFVEVYVFVSRV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8dWkvUmVjdC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFN1cmZhY2VUZXh0dXJlQ2xpZW50OwotCi1jbGFzcyBJU3VyZmFjZVRleHR1cmUgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoU3VyZmFjZVRleHR1cmUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgZnJpZW5kIGNsYXNzIFN1cmZhY2VUZXh0dXJlQ2xpZW50OwotCi0gICAgZW51bSB7Ci0gICAgICAgIEJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT04gPSAweDEsCi0gICAgICAgIFJFTEVBU0VfQUxMX0JVRkZFUlMgICAgICAgPSAweDIsCi0gICAgfTsKLQotICAgIC8vIHJlcXVlc3RCdWZmZXIgcmVxdWVzdHMgYSBuZXcgYnVmZmVyIGZvciB0aGUgZ2l2ZW4gaW5kZXguIFRoZSBzZXJ2ZXIgKGkuZS4KLSAgICAvLyB0aGUgSVN1cmZhY2VUZXh0dXJlIGltcGxlbWVudGF0aW9uKSBhc3NpZ25zIHRoZSBuZXdseSBjcmVhdGVkIGJ1ZmZlciB0bwotICAgIC8vIHRoZSBnaXZlbiBzbG90IGluZGV4LCBhbmQgdGhlIGNsaWVudCBpcyBleHBlY3RlZCB0byBtaXJyb3IgdGhlCi0gICAgLy8gc2xvdC0+YnVmZmVyIG1hcHBpbmcgc28gdGhhdCBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gdHJhbnNmZXIgYQotICAgIC8vIEdyYXBoaWNCdWZmZXIgZm9yIGV2ZXJ5IGRlcXVldWUgb3BlcmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVxdWVzdEJ1ZmZlcihpbnQgc2xvdCwgc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZikgPSAwOwotCi0gICAgLy8gc2V0QnVmZmVyQ291bnQgc2V0cyB0aGUgbnVtYmVyIG9mIGJ1ZmZlciBzbG90cyBhdmFpbGFibGUuIENhbGxpbmcgdGhpcwotICAgIC8vIHdpbGwgYWxzbyBjYXVzZSBhbGwgYnVmZmVyIHNsb3RzIHRvIGJlIGVtcHRpZWQuIFRoZSBjYWxsZXIgc2hvdWxkIGVtcHR5Ci0gICAgLy8gaXRzIG1pcnJvcmVkIGNvcHkgb2YgdGhlIGJ1ZmZlciBzbG90cyB3aGVuIGNhbGxpbmcgdGhpcyBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpID0gMDsKLQotICAgIC8vIGRlcXVldWVCdWZmZXIgcmVxdWVzdHMgYSBuZXcgYnVmZmVyIHNsb3QgZm9yIHRoZSBjbGllbnQgdG8gdXNlLiBPd25lcnNoaXAKLSAgICAvLyBvZiB0aGUgc2xvdCBpcyB0cmFuc2ZlcmVkIHRvIHRoZSBjbGllbnQsIG1lYW5pbmcgdGhhdCB0aGUgc2VydmVyIHdpbGwgbm90Ci0gICAgLy8gdXNlIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHNsb3QuIFRoZSBzbG90IGluZGV4Ci0gICAgLy8gcmV0dXJuZWQgbWF5IG9yIG1heSBub3QgY29udGFpbiBhIGJ1ZmZlci4gSWYgdGhlIHNsb3QgaXMgZW1wdHkgdGhlIGNsaWVudAotICAgIC8vIHNob3VsZCBjYWxsIHJlcXVlc3RCdWZmZXIgdG8gYXNzaWduIGEgbmV3IGJ1ZmZlciB0byB0aGF0IHNsb3QuIFRoZSBjbGllbnQKLSAgICAvLyBpcyBleHBlY3RlZCB0byBlaXRoZXIgY2FsbCBjYW5jZWxCdWZmZXIgb24gdGhlIGRlcXVldWVkIHNsb3Qgb3IgdG8gZmlsbAotICAgIC8vIGluIHRoZSBjb250ZW50cyBvZiBpdHMgYXNzb2NpYXRlZCBidWZmZXIgY29udGVudHMgYW5kIGNhbGwgcXVldWVCdWZmZXIuCi0gICAgLy8gSWYgZGVxdWV1ZUJ1ZmZlciByZXR1cm4gQlVGRkVSX05FRURTX1JFQUxMT0NBVElPTiwgdGhlIGNsaWVudCBpcwotICAgIC8vIGV4cGVjdGVkIHRvIGNhbGwgcmVxdWVzdEJ1ZmZlciBpbW1lZGlhdGVseS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVCdWZmZXIoaW50ICpzbG90LCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLAotICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgPSAwOwotCi0gICAgLy8gcXVldWVCdWZmZXIgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCBoYXMgZmluaXNoZWQgZmlsbGluZyBpbiB0aGUKLSAgICAvLyBjb250ZW50cyBvZiB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCBzbG90IGFuZCB0cmFuc2ZlcnMgb3duZXJzaGlwIG9mCi0gICAgLy8gdGhhdCBzbG90IGJhY2sgdG8gdGhlIHNlcnZlci4gSXQgaXMgbm90IHZhbGlkIHRvIGNhbGwgcXVldWVCdWZmZXIgb24gYQotICAgIC8vIHNsb3QgdGhhdCBpcyBub3Qgb3duZWQgYnkgdGhlIGNsaWVudCBvciBvbmUgZm9yIHdoaWNoIGEgYnVmZmVyIGFzc29jaWF0ZWQKLSAgICAvLyB2aWEgcmVxdWVzdEJ1ZmZlci4gSW4gYWRkaXRpb24sIGEgdGltZXN0YW1wIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlCi0gICAgLy8gY2xpZW50IGZvciB0aGlzIGJ1ZmZlci4gVGhlIHRpbWVzdGFtcCBpcyBtZWFzdXJlZCBpbiBuYW5vc2Vjb25kcywgYW5kCi0gICAgLy8gbXVzdCBiZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuIEl0cyBvdGhlciBwcm9wZXJ0aWVzICh6ZXJvIHBvaW50LCBldGMpCi0gICAgLy8gYXJlIGNsaWVudC1kZXBlbmRlbnQsIGFuZCBzaG91bGQgYmUgZG9jdW1lbnRlZCBieSB0aGUgY2xpZW50LgotICAgIC8vCi0gICAgLy8gb3V0V2lkdGgsIG91dEhlaWdodCBhbmQgb3V0VHJhbnNmb3JtIGFyZSBmaWxsZWQgd2l0aCB0aGUgZGVmYXVsdCB3aWR0aAotICAgIC8vIGFuZCBoZWlnaHQgb2YgdGhlIHdpbmRvdyBhbmQgY3VycmVudCB0cmFuc2Zvcm0gYXBwbGllZCB0byBidWZmZXJzLAotICAgIC8vIHJlc3BlY3RpdmVseS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlQnVmZmVyKGludCBzbG90LCBpbnQ2NF90IHRpbWVzdGFtcCwKLSAgICAgICAgICAgIHVpbnQzMl90KiBvdXRXaWR0aCwgdWludDMyX3QqIG91dEhlaWdodCwgdWludDMyX3QqIG91dFRyYW5zZm9ybSkgPSAwOwotCi0gICAgLy8gY2FuY2VsQnVmZmVyIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgZG9lcyBub3Qgd2lzaCB0byBmaWxsIGluIHRoZQotICAgIC8vIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggc2xvdCBhbmQgdHJhbnNmZXJzIG93bmVyc2hpcCBvZiB0aGUgc2xvdCBiYWNrIHRvCi0gICAgLy8gdGhlIHNlcnZlci4KLSAgICB2aXJ0dWFsIHZvaWQgY2FuY2VsQnVmZmVyKGludCBzbG90KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENyb3AoY29uc3QgUmVjdCYgcmVnKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUcmFuc2Zvcm0odWludDMyX3QgdHJhbnNmb3JtKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTY2FsaW5nTW9kZShpbnQgbW9kZSkgPSAwOwotCi0gICAgLy8gcXVlcnkgcmV0cmlldmVzIHNvbWUgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3VyZmFjZQotICAgIC8vICd3aGF0JyB0b2tlbnMgYWxsb3dlZCBhcmUgdGhhdCBvZiBhbmRyb2lkX25hdGl2ZXMuaAotICAgIHZpcnR1YWwgaW50IHF1ZXJ5KGludCB3aGF0LCBpbnQqIHZhbHVlKSA9IDA7Ci0KLSAgICAvLyBzZXRTeW5jaHJvbm91c01vZGUgc2V0IHdoZXRoZXIgZGVxdWV1ZUJ1ZmZlciBpcyBzeW5jaHJvbm91cyBvcgotICAgIC8vIGFzeW5jaHJvbm91cy4gSW4gc3luY2hyb25vdXMgbW9kZSwgZGVxdWV1ZUJ1ZmZlciBibG9ja3MgdW50aWwKLSAgICAvLyBhIGJ1ZmZlciBpcyBhdmFpbGFibGUsIHRoZSBjdXJyZW50bHkgYm91bmQgYnVmZmVyIGNhbiBiZSBkZXF1ZXVlZCBhbmQKLSAgICAvLyBxdWV1ZWQgYnVmZmVycyB3aWxsIGJlIHJldGlyZWQgaW4gb3JkZXIuCi0gICAgLy8gVGhlIGRlZmF1bHQgbW9kZSBpcyBhc3luY2hyb25vdXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTeW5jaHJvbm91c01vZGUoYm9vbCBlbmFibGVkKSA9IDA7Ci0KLSAgICAvLyBjb25uZWN0IGF0dGVtcHRzIHRvIGNvbm5lY3QgYSBjbGllbnQgQVBJIHRvIHRoZSBTdXJmYWNlVGV4dHVyZS4gIFRoaXMKLSAgICAvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIElTdXJmYWNlVGV4dHVyZSBtZXRob2RzIGFyZSBjYWxsZWQgZXhjZXB0Ci0gICAgLy8gZm9yIGdldEFsbG9jYXRvci4KLSAgICAvLwotICAgIC8vIFRoaXMgbWV0aG9kIHdpbGwgZmFpbCBpZiB0aGUgY29ubmVjdCB3YXMgcHJldmlvdXNseSBjYWxsZWQgb24gdGhlCi0gICAgLy8gU3VyZmFjZVRleHR1cmUgYW5kIG5vIGNvcnJlc3BvbmRpbmcgZGlzY29ubmVjdCBjYWxsIHdhcyBtYWRlLgotICAgIC8vCi0gICAgLy8gb3V0V2lkdGgsIG91dEhlaWdodCBhbmQgb3V0VHJhbnNmb3JtIGFyZSBmaWxsZWQgd2l0aCB0aGUgZGVmYXVsdCB3aWR0aAotICAgIC8vIGFuZCBoZWlnaHQgb2YgdGhlIHdpbmRvdyBhbmQgY3VycmVudCB0cmFuc2Zvcm0gYXBwbGllZCB0byBidWZmZXJzLAotICAgIC8vIHJlc3BlY3RpdmVseS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoaW50IGFwaSwKLSAgICAgICAgICAgIHVpbnQzMl90KiBvdXRXaWR0aCwgdWludDMyX3QqIG91dEhlaWdodCwgdWludDMyX3QqIG91dFRyYW5zZm9ybSkgPSAwOwotCi0gICAgLy8gZGlzY29ubmVjdCBhdHRlbXB0cyB0byBkaXNjb25uZWN0IGEgY2xpZW50IEFQSSBmcm9tIHRoZSBTdXJmYWNlVGV4dHVyZS4KLSAgICAvLyBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY2F1c2UgYW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gb3RoZXIKLSAgICAvLyBJU3VyZmFjZVRleHR1cmUgbWV0aG9kcyB0byBmYWlsIGV4Y2VwdCBmb3IgZ2V0QWxsb2NhdG9yIGFuZCBjb25uZWN0LgotICAgIC8vIFN1Y2Nlc3NmdWxseSBjYWxsaW5nIGNvbm5lY3QgYWZ0ZXIgdGhpcyB3aWxsIGFsbG93IHRoZSBvdGhlciBtZXRob2RzIHRvCi0gICAgLy8gc3VjY2VlZCBhZ2Fpbi4KLSAgICAvLwotICAgIC8vIFRoaXMgbWV0aG9kIHdpbGwgZmFpbCBpZiB0aGUgdGhlIFN1cmZhY2VUZXh0dXJlIGlzIG5vdCBjdXJyZW50bHkKLSAgICAvLyBjb25uZWN0ZWQgdG8gdGhlIHNwZWNpZmllZCBjbGllbnQgQVBJLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdChpbnQgYXBpKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuU3VyZmFjZVRleHR1cmUgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVN1cmZhY2VUZXh0dXJlPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX0lTVVJGQUNFVEVYVFVSRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9TZW5zb3IuaCBiL2luY2x1ZGUvZ3VpL1NlbnNvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTk3NTdhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ3VpL1NlbnNvci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9HVUlfU0VOU09SX0gKLSNkZWZpbmUgQU5EUk9JRF9HVUlfU0VOU09SX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRmxhdHRlbmFibGUuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL3NlbnNvci5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb25jcmV0ZSB0eXBlcyBmb3IgdGhlIE5ESwotc3RydWN0IEFTZW5zb3IgeyB9OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFBhcmNlbDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTZW5zb3IgOiBwdWJsaWMgQVNlbnNvciwgcHVibGljIEZsYXR0ZW5hYmxlCi17Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIFRZUEVfQUNDRUxFUk9NRVRFUiAgPSBBU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUiwKLSAgICAgICAgVFlQRV9NQUdORVRJQ19GSUVMRCA9IEFTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRCwKLSAgICAgICAgVFlQRV9HWVJPU0NPUEUgICAgICA9IEFTRU5TT1JfVFlQRV9HWVJPU0NPUEUsCi0gICAgICAgIFRZUEVfTElHSFQgICAgICAgICAgPSBBU0VOU09SX1RZUEVfTElHSFQsCi0gICAgICAgIFRZUEVfUFJPWElNSVRZICAgICAgPSBBU0VOU09SX1RZUEVfUFJPWElNSVRZCi0gICAgfTsKLQotICAgICAgICAgICAgU2Vuc29yKCk7Ci0gICAgICAgICAgICBTZW5zb3Ioc3RydWN0IHNlbnNvcl90IGNvbnN0KiBod1NlbnNvcik7Ci0gICAgdmlydHVhbCB+U2Vuc29yKCk7Ci0KLSAgICBjb25zdCBTdHJpbmc4JiBnZXROYW1lKCkgY29uc3Q7Ci0gICAgY29uc3QgU3RyaW5nOCYgZ2V0VmVuZG9yKCkgY29uc3Q7Ci0gICAgaW50MzJfdCBnZXRIYW5kbGUoKSBjb25zdDsKLSAgICBpbnQzMl90IGdldFR5cGUoKSBjb25zdDsKLSAgICBmbG9hdCBnZXRNaW5WYWx1ZSgpIGNvbnN0OwotICAgIGZsb2F0IGdldE1heFZhbHVlKCkgY29uc3Q7Ci0gICAgZmxvYXQgZ2V0UmVzb2x1dGlvbigpIGNvbnN0OwotICAgIGZsb2F0IGdldFBvd2VyVXNhZ2UoKSBjb25zdDsKLSAgICBpbnQzMl90IGdldE1pbkRlbGF5KCkgY29uc3Q7Ci0gICAgbnNlY3NfdCBnZXRNaW5EZWxheU5zKCkgY29uc3Q7Ci0gICAgaW50MzJfdCBnZXRWZXJzaW9uKCkgY29uc3Q7Ci0KLSAgICAvLyBGbGF0dGVuYWJsZSBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRGbGF0dGVuZWRTaXplKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzaXplX3QgZ2V0RmRDb3VudCgpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmxhdHRlbih2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgaW50IGZkc1tdLCBzaXplX3QgY291bnQpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5mbGF0dGVuKHZvaWQgY29uc3QqIGJ1ZmZlciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICBpbnQgZmRzW10sIHNpemVfdCBjb3VudCk7Ci0KLXByaXZhdGU6Ci0gICAgU3RyaW5nOCBtTmFtZTsKLSAgICBTdHJpbmc4IG1WZW5kb3I7Ci0gICAgaW50MzJfdCBtSGFuZGxlOwotICAgIGludDMyX3QgbVR5cGU7Ci0gICAgZmxvYXQgICBtTWluVmFsdWU7Ci0gICAgZmxvYXQgICBtTWF4VmFsdWU7Ci0gICAgZmxvYXQgICBtUmVzb2x1dGlvbjsKLSAgICBmbG9hdCAgIG1Qb3dlcjsKLSAgICBpbnQzMl90IG1NaW5EZWxheTsKLSAgICBpbnQzMl90IG1WZXJzaW9uOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX1NFTlNPUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9TZW5zb3JFdmVudFF1ZXVlLmggYi9pbmNsdWRlL2d1aS9TZW5zb3JFdmVudFF1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmN2M2ZTMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvU2Vuc29yRXZlbnRRdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TRU5TT1JfRVZFTlRfUVVFVUVfSAotI2RlZmluZSBBTkRST0lEX1NFTlNPUl9FVkVOVF9RVUVVRV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPGd1aS9CaXRUdWJlLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IEFMb29wZXI7Ci1zdHJ1Y3QgQVNlbnNvckV2ZW50OwotCi0vLyBDb25jcmV0ZSB0eXBlcyBmb3IgdGhlIE5ESwotc3RydWN0IEFTZW5zb3JFdmVudFF1ZXVlIHsKLSAgICBBTG9vcGVyKiBsb29wZXI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIElTZW5zb3JFdmVudENvbm5lY3Rpb247Ci1jbGFzcyBTZW5zb3I7Ci1jbGFzcyBMb29wZXI7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU2Vuc29yRXZlbnRRdWV1ZSA6IHB1YmxpYyBBU2Vuc29yRXZlbnRRdWV1ZSwgcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgIFNlbnNvckV2ZW50UXVldWUoY29uc3Qgc3A8SVNlbnNvckV2ZW50Q29ubmVjdGlvbj4mIGNvbm5lY3Rpb24pOwotICAgIHZpcnR1YWwgflNlbnNvckV2ZW50UXVldWUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0gICAgaW50IGdldEZkKCkgY29uc3Q7Ci0gICAgc3NpemVfdCB3cml0ZShBU2Vuc29yRXZlbnQgY29uc3QqIGV2ZW50cywgc2l6ZV90IG51bUV2ZW50cyk7Ci0gICAgc3NpemVfdCByZWFkKEFTZW5zb3JFdmVudCogZXZlbnRzLCBzaXplX3QgbnVtRXZlbnRzKTsKLQotICAgIHN0YXR1c190IHdhaXRGb3JFdmVudCgpIGNvbnN0OwotICAgIHN0YXR1c190IHdha2UoKSBjb25zdDsKLQotICAgIHN0YXR1c190IGVuYWJsZVNlbnNvcihTZW5zb3IgY29uc3QqIHNlbnNvcikgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZGlzYWJsZVNlbnNvcihTZW5zb3IgY29uc3QqIHNlbnNvcikgY29uc3Q7Ci0gICAgc3RhdHVzX3Qgc2V0RXZlbnRSYXRlKFNlbnNvciBjb25zdCogc2Vuc29yLCBuc2Vjc190IG5zKSBjb25zdDsKLQotICAgIC8vIHRoZXNlIGFyZSBoZXJlIG9ubHkgdG8gc3VwcG9ydCBTZW5zb3JNYW5hZ2VyLmphdmEKLSAgICBzdGF0dXNfdCBlbmFibGVTZW5zb3IoaW50MzJfdCBoYW5kbGUsIGludDMyX3QgdXMpIGNvbnN0OwotICAgIHN0YXR1c190IGRpc2FibGVTZW5zb3IoaW50MzJfdCBoYW5kbGUpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHNwPExvb3Blcj4gZ2V0TG9vcGVyKCkgY29uc3Q7Ci0gICAgc3A8SVNlbnNvckV2ZW50Q29ubmVjdGlvbj4gbVNlbnNvckV2ZW50Q29ubmVjdGlvbjsKLSAgICBzcDxCaXRUdWJlPiBtU2Vuc29yQ2hhbm5lbDsKLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIG11dGFibGUgc3A8TG9vcGVyPiBtTG9vcGVyOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfU0VOU09SX0VWRU5UX1FVRVVFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL1NlbnNvck1hbmFnZXIuaCBiL2luY2x1ZGUvZ3VpL1NlbnNvck1hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3NjQ2Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9TZW5zb3JNYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9TRU5TT1JfTUFOQUdFUl9ICi0jZGVmaW5lIEFORFJPSURfR1VJX1NFTlNPUl9NQU5BR0VSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotI2luY2x1ZGUgPGd1aS9TZW5zb3JFdmVudFF1ZXVlLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvbmNyZXRlIHR5cGVzIGZvciB0aGUgTkRLCi1zdHJ1Y3QgQVNlbnNvck1hbmFnZXIgeyB9OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIElTZW5zb3JTZXJ2ZXI7Ci1jbGFzcyBTZW5zb3I7Ci1jbGFzcyBTZW5zb3JFdmVudFF1ZXVlOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFNlbnNvck1hbmFnZXIgOgotICAgIHB1YmxpYyBBU2Vuc29yTWFuYWdlciwKLSAgICBwdWJsaWMgU2luZ2xldG9uPFNlbnNvck1hbmFnZXI+Ci17Ci1wdWJsaWM6Ci0gICAgU2Vuc29yTWFuYWdlcigpOwotICAgIH5TZW5zb3JNYW5hZ2VyKCk7Ci0KLSAgICBzc2l6ZV90IGdldFNlbnNvckxpc3QoU2Vuc29yIGNvbnN0KiBjb25zdCoqIGxpc3QpIGNvbnN0OwotICAgIFNlbnNvciBjb25zdCogZ2V0RGVmYXVsdFNlbnNvcihpbnQgdHlwZSk7Ci0gICAgc3A8U2Vuc29yRXZlbnRRdWV1ZT4gY3JlYXRlRXZlbnRRdWV1ZSgpOwotCi1wcml2YXRlOgotICAgIC8vIERlYXRoUmVjaXBpZW50IGludGVyZmFjZQotICAgIHZvaWQgc2Vuc29yTWFuYWdlckRpZWQoKTsKLQotICAgIHN0YXR1c190IGFzc2VydFN0YXRlTG9ja2VkKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBtdXRhYmxlIHNwPElTZW5zb3JTZXJ2ZXI+IG1TZW5zb3JTZXJ2ZXI7Ci0gICAgbXV0YWJsZSBTZW5zb3IgY29uc3QqKiBtU2Vuc29yTGlzdDsKLSAgICBtdXRhYmxlIFZlY3RvcjxTZW5zb3I+IG1TZW5zb3JzOwotICAgIG11dGFibGUgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+IG1EZWF0aE9ic2VydmVyOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX1NFTlNPUl9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL1N1cmZhY2UuaCBiL2luY2x1ZGUvZ3VpL1N1cmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5MGM1OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9TdXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9HVUlfU1VSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfR1VJX1NVUkZBQ0VfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgotI2luY2x1ZGUgPHVpL1JlZ2lvbi5oPgotCi0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLQotI2RlZmluZSBBTkRST0lEX1ZJRVdfU1VSRkFDRV9KTklfSUQgICAgIm1OYXRpdmVTdXJmYWNlIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJU3VyZmFjZVRleHR1cmU7Ci1jbGFzcyBTdXJmYWNlOwotY2xhc3MgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU3VyZmFjZUNvbnRyb2wgOiBwdWJsaWMgUmVmQmFzZQotewotcHVibGljOgotICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3Qgc3A8U3VyZmFjZUNvbnRyb2w+JiBzdXJmYWNlKSB7Ci0gICAgICAgIHJldHVybiAoc3VyZmFjZSAhPSAwKSAmJiBzdXJmYWNlLT5pc1ZhbGlkKCk7Ci0gICAgfQotICAgIGJvb2wgaXNWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ub2tlbj49MCAmJiBtQ2xpZW50IT0wOwotICAgIH0KLSAgICBzdGF0aWMgYm9vbCBpc1NhbWVTdXJmYWNlKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUNvbnRyb2w+JiBsaHMsIGNvbnN0IHNwPFN1cmZhY2VDb250cm9sPiYgcmhzKTsKLSAgICAgICAgCi0gICAgdWludDMyX3QgICAgZ2V0SWRlbnRpdHkoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpdHk7IH0KLQotICAgIC8vIHJlbGVhc2Ugc3VyZmFjZSBkYXRhIGZyb20gamF2YQotICAgIHZvaWQgICAgICAgIGNsZWFyKCk7Ci0gICAgCi0gICAgc3RhdHVzX3QgICAgc2V0TGF5ZXIoaW50MzJfdCBsYXllcik7Ci0gICAgc3RhdHVzX3QgICAgc2V0UG9zaXRpb24oaW50MzJfdCB4LCBpbnQzMl90IHkpOwotICAgIHN0YXR1c190ICAgIHNldFNpemUodWludDMyX3QgdywgdWludDMyX3QgaCk7Ci0gICAgc3RhdHVzX3QgICAgaGlkZSgpOwotICAgIHN0YXR1c190ICAgIHNob3coaW50MzJfdCBsYXllciA9IC0xKTsKLSAgICBzdGF0dXNfdCAgICBmcmVlemUoKTsKLSAgICBzdGF0dXNfdCAgICB1bmZyZWV6ZSgpOwotICAgIHN0YXR1c190ICAgIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBtYXNrKTsKLSAgICBzdGF0dXNfdCAgICBzZXRUcmFuc3BhcmVudFJlZ2lvbkhpbnQoY29uc3QgUmVnaW9uJiB0cmFuc3BhcmVudCk7Ci0gICAgc3RhdHVzX3QgICAgc2V0QWxwaGEoZmxvYXQgYWxwaGE9MS4wZik7Ci0gICAgc3RhdHVzX3QgICAgc2V0TWF0cml4KGZsb2F0IGRzZHgsIGZsb2F0IGR0ZHgsIGZsb2F0IGRzZHksIGZsb2F0IGR0ZHkpOwotICAgIHN0YXR1c190ICAgIHNldEZyZWV6ZVRpbnQodWludDMyX3QgdGludCk7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3Qgd3JpdGVTdXJmYWNlVG9QYXJjZWwoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlQ29udHJvbD4mIGNvbnRyb2wsIFBhcmNlbCogcGFyY2VsKTsKLQotICAgIHNwPFN1cmZhY2U+IGdldFN1cmZhY2UoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICAvLyBjYW4ndCBiZSBjb3BpZWQKLSAgICBTdXJmYWNlQ29udHJvbCYgb3BlcmF0b3IgPSAoU3VyZmFjZUNvbnRyb2wmIHJocyk7Ci0gICAgU3VyZmFjZUNvbnRyb2woY29uc3QgU3VyZmFjZUNvbnRyb2wmIHJocyk7Ci0KLSAgICBmcmllbmQgY2xhc3MgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwotICAgIGZyaWVuZCBjbGFzcyBTdXJmYWNlOwotCi0gICAgU3VyZmFjZUNvbnRyb2woCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UsCi0gICAgICAgICAgICBjb25zdCBJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzdXJmYWNlX2RhdGFfdCYgZGF0YSk7Ci0KLSAgICB+U3VyZmFjZUNvbnRyb2woKTsKLQotICAgIHN0YXR1c190IHZhbGlkYXRlKCkgY29uc3Q7Ci0gICAgdm9pZCBkZXN0cm95KCk7Ci0gICAgCi0gICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiAgIG1DbGllbnQ7Ci0gICAgc3A8SVN1cmZhY2U+ICAgICAgICAgICAgICAgIG1TdXJmYWNlOwotICAgIFN1cmZhY2VJRCAgICAgICAgICAgICAgICAgICBtVG9rZW47Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG1JZGVudGl0eTsKLSAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgCi0gICAgbXV0YWJsZSBzcDxTdXJmYWNlPiAgICAgICAgIG1TdXJmYWNlRGF0YTsKLX07Ci0gICAgCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU3VyZmFjZSA6IHB1YmxpYyBTdXJmYWNlVGV4dHVyZUNsaWVudAotewotcHVibGljOgotICAgIHN0cnVjdCBTdXJmYWNlSW5mbyB7Ci0gICAgICAgIHVpbnQzMl90ICAgIHc7Ci0gICAgICAgIHVpbnQzMl90ICAgIGg7Ci0gICAgICAgIHVpbnQzMl90ICAgIHM7Ci0gICAgICAgIHVpbnQzMl90ICAgIHVzYWdlOwotICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQ7Ci0gICAgICAgIHZvaWQqICAgICAgIGJpdHM7Ci0gICAgICAgIHVpbnQzMl90ICAgIHJlc2VydmVkWzJdOwotICAgIH07Ci0KLSAgICBleHBsaWNpdCBTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4mIHN0KTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IHNwPFN1cmZhY2U+JiBjb250cm9sLCBQYXJjZWwqIHBhcmNlbCk7Ci0KLSAgICBzdGF0aWMgc3A8U3VyZmFjZT4gcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhKTsKLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7Ci0gICAgICAgIHJldHVybiAoc3VyZmFjZSAhPSAwKSAmJiBzdXJmYWNlLT5pc1ZhbGlkKCk7Ci0gICAgfQotCi0gICAgYm9vbCAgICAgICAgaXNWYWxpZCgpOwotICAgIHVpbnQzMl90ICAgIGdldElkZW50aXR5KCkgY29uc3QgeyByZXR1cm4gbUlkZW50aXR5OyB9Ci0gICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBnZXRTdXJmYWNlVGV4dHVyZSgpOwotCi0gICAgLy8gdGhlIGxvY2svdW5sb2NrIEFQSXMgbXVzdCBiZSB1c2VkIGZyb20gdGhlIHNhbWUgdGhyZWFkCi0gICAgc3RhdHVzX3QgICAgbG9jayhTdXJmYWNlSW5mbyogaW5mbywgUmVnaW9uKiBkaXJ0eSA9IE5VTEwpOwotICAgIHN0YXR1c190ICAgIHVubG9ja0FuZFBvc3QoKTsKLQotICAgIHNwPElCaW5kZXI+IGFzQmluZGVyKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgLy8gdGhpcyBpcyBqdXN0IHRvIGJlIGFibGUgdG8gd3JpdGUgc29tZSB1bml0IHRlc3RzCi0gICAgZnJpZW5kIGNsYXNzIFRlc3Q7Ci0gICAgZnJpZW5kIGNsYXNzIFN1cmZhY2VDb250cm9sOwotCi0gICAgLy8gY2FuJ3QgYmUgY29waWVkCi0gICAgU3VyZmFjZSYgb3BlcmF0b3IgPSAoU3VyZmFjZSYgcmhzKTsKLSAgICBTdXJmYWNlKGNvbnN0IFN1cmZhY2UmIHJocyk7Ci0KLSAgICBleHBsaWNpdCBTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2VDb250cm9sPiYgY29udHJvbCk7Ci0gICAgU3VyZmFjZShjb25zdCBQYXJjZWwmIGRhdGEsIGNvbnN0IHNwPElCaW5kZXI+JiByZWYpOwotICAgIH5TdXJmYWNlKCk7Ci0KLSAgICAvKgotICAgICAqICBwcml2YXRlIHN0dWZmLi4uCi0gICAgICovCi0gICAgdm9pZCBpbml0KGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4mIHN1cmZhY2VUZXh0dXJlKTsKLQotICAgIHN0YXRpYyB2b2lkIGNsZWFuQ2FjaGVkU3VyZmFjZXNMb2NrZWQoKTsKLQotICAgIHZpcnR1YWwgaW50IHF1ZXJ5KGludCB3aGF0LCBpbnQqIHZhbHVlKSBjb25zdDsKLQotICAgIC8vIGNvbnN0YW50cwotICAgIHNwPElTdXJmYWNlPiAgICAgICAgICAgICAgICBtU3VyZmFjZTsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUlkZW50aXR5OwotCi0gICAgLy8gQSBjYWNoZSBvZiBTdXJmYWNlIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gZGVzZXJpYWxpemVkIGludG8gdGhpcyBwcm9jZXNzLgotICAgIHN0YXRpYyBNdXRleCBzQ2FjaGVkU3VyZmFjZXNMb2NrOwotICAgIHN0YXRpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8d3A8SUJpbmRlcj4sIHdwPFN1cmZhY2U+ID4gc0NhY2hlZFN1cmZhY2VzOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX1NVUkZBQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmggYi9pbmNsdWRlL2d1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk3MTAzMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9TVVJGQUNFX0NPTVBPU0VSX0NMSUVOVF9ICi0jZGVmaW5lIEFORFJPSURfR1VJX1NVUkZBQ0VfQ09NUE9TRVJfQ0xJRU5UX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgotCi0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgRGlzcGxheUluZm87Ci1jbGFzcyBDb21wb3NlcjsKLWNsYXNzIElNZW1vcnlIZWFwOwotY2xhc3MgSVN1cmZhY2VDb21wb3NlckNsaWVudDsKLWNsYXNzIFJlZ2lvbjsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFN1cmZhY2VDb21wb3NlckNsaWVudCA6IHB1YmxpYyBSZWZCYXNlCi17Ci0gICAgZnJpZW5kIGNsYXNzIENvbXBvc2VyOwotcHVibGljOiAgICAKLSAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQoKTsKLSAgICB2aXJ0dWFsICAgICB+U3VyZmFjZUNvbXBvc2VyQ2xpZW50KCk7Ci0KLSAgICAvLyBBbHdheXMgbWFrZSBzdXJlIHdlIGNvdWxkIGluaXRpYWxpemUKLSAgICBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIC8vIFJldHVybiB0aGUgY29ubmVjdGlvbiBvZiB0aGlzIGNsaWVudAotICAgIHNwPElCaW5kZXI+IGNvbm5lY3Rpb24oKSBjb25zdDsKLSAgICAKLSAgICAvLyBGb3JjaWJseSByZW1vdmUgY29ubmVjdGlvbiBiZWZvcmUgYWxsIHJlZmVyZW5jZXMgaGF2ZSBnb25lIGF3YXkuCi0gICAgdm9pZCAgICAgICAgZGlzcG9zZSgpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gc3VyZmFjZSBjcmVhdGlvbiAvIGRlc3RydWN0aW9uCi0KLSAgICAvLyEgQ3JlYXRlIGEgc3VyZmFjZQotICAgIHNwPFN1cmZhY2VDb250cm9sPiBjcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwvLyBuYW1lIG9mIHRoZSBzdXJmYWNlCi0gICAgICAgICAgICBEaXNwbGF5SUQgZGlzcGxheSwgIC8vIERpc3BsYXkgdG8gY3JlYXRlIHRoaXMgc3VyZmFjZSBvbgotICAgICAgICAgICAgdWludDMyX3QgdywgICAgICAgICAvLyB3aWR0aCBpbiBwaXhlbAotICAgICAgICAgICAgdWludDMyX3QgaCwgICAgICAgICAvLyBoZWlnaHQgaW4gcGl4ZWwKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgLy8gcGl4ZWwtZm9ybWF0IGRlc2lyZWQKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCAgLy8gdXNhZ2UgZmxhZ3MKLSAgICApOwotCi0gICAgc3A8U3VyZmFjZUNvbnRyb2w+IGNyZWF0ZVN1cmZhY2UoCi0gICAgICAgICAgICBEaXNwbGF5SUQgZGlzcGxheSwgIC8vIERpc3BsYXkgdG8gY3JlYXRlIHRoaXMgc3VyZmFjZSBvbgotICAgICAgICAgICAgdWludDMyX3QgdywgICAgICAgICAvLyB3aWR0aCBpbiBwaXhlbAotICAgICAgICAgICAgdWludDMyX3QgaCwgICAgICAgICAvLyBoZWlnaHQgaW4gcGl4ZWwKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgLy8gcGl4ZWwtZm9ybWF0IGRlc2lyZWQKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCAgLy8gdXNhZ2UgZmxhZ3MKLSAgICApOwotCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBDb21wb3NlciBwYXJhbWV0ZXJzCi0gICAgLy8gQWxsIGNvbXBvc2VyIHBhcmFtZXRlcnMgbXVzdCBiZSBjaGFuZ2VkIHdpdGhpbiBhIHRyYW5zYWN0aW9uCi0gICAgLy8gc2V2ZXJhbCBzdXJmYWNlcyBjYW4gYmUgdXBkYXRlZCBpbiBvbmUgdHJhbnNhY3Rpb24sIGFsbCBjaGFuZ2VzIGFyZQotICAgIC8vIGNvbW1pdHRlZCBhdCBvbmNlIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNsb3NlZC4KLSAgICAvLyBjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKCkgdXN1YWxseSByZXF1aXJlcyBhbiBJUEMgd2l0aCB0aGUgc2VydmVyLgotCi0gICAgLy8hIE9wZW4gYSBjb21wb3NlciB0cmFuc2FjdGlvbiBvbiBhbGwgYWN0aXZlIFN1cmZhY2VDb21wb3NlckNsaWVudHMuCi0gICAgc3RhdGljIHZvaWQgb3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIAotICAgIC8vISBDbG9zZSBhIGNvbXBvc2VyIHRyYW5zYWN0aW9uIG9uIGFsbCBhY3RpdmUgU3VyZmFjZUNvbXBvc2VyQ2xpZW50cy4KLSAgICBzdGF0aWMgdm9pZCBjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKGJvb2wgc3luY2hyb25vdXMgPSBmYWxzZSk7Ci0gICAgCi0gICAgLy8hIEZyZWV6ZSB0aGUgc3BlY2lmaWVkIGRpc3BsYXkgYnV0IG5vdCB0cmFuc2FjdGlvbnMuCi0gICAgc3RhdGljIHN0YXR1c190IGZyZWV6ZURpc3BsYXkoRGlzcGxheUlEIGRweSwgdWludDMyX3QgZmxhZ3MgPSAwKTsKLSAgICAgICAgCi0gICAgLy8hIFJlc3VtZSB1cGRhdGVzIG9uIHRoZSBzcGVjaWZpZWQgZGlzcGxheS4KLSAgICBzdGF0aWMgc3RhdHVzX3QgdW5mcmVlemVEaXNwbGF5KERpc3BsYXlJRCBkcHksIHVpbnQzMl90IGZsYWdzID0gMCk7Ci0KLSAgICAvLyEgU2V0IHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZGlzcGxheQotICAgIHN0YXRpYyBpbnQgc2V0T3JpZW50YXRpb24oRGlzcGxheUlEIGRweSwgaW50IG9yaWVudGF0aW9uLCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICAvLyBRdWVyeSB0aGUgbnVtYmVyIG9mIGRpc3BsYXlzCi0gICAgc3RhdGljIHNzaXplX3QgZ2V0TnVtYmVyT2ZEaXNwbGF5cygpOwotCi0gICAgLy8gR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgZGlzcGxheQotICAgIHN0YXRpYyBzdGF0dXNfdCBnZXREaXNwbGF5SW5mbyhEaXNwbGF5SUQgZHB5LCBEaXNwbGF5SW5mbyogaW5mbyk7Ci0gICAgc3RhdGljIHNzaXplX3QgZ2V0RGlzcGxheVdpZHRoKERpc3BsYXlJRCBkcHkpOwotICAgIHN0YXRpYyBzc2l6ZV90IGdldERpc3BsYXlIZWlnaHQoRGlzcGxheUlEIGRweSk7Ci0gICAgc3RhdGljIHNzaXplX3QgZ2V0RGlzcGxheU9yaWVudGF0aW9uKERpc3BsYXlJRCBkcHkpOwotCi0gICAgc3RhdHVzX3QgbGlua1RvQ29tcG9zZXJEZWF0aChjb25zdCBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKLSAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IE5VTEwsIHVpbnQzMl90IGZsYWdzID0gMCk7Ci0KLSAgICBzdGF0dXNfdCAgICBoaWRlKFN1cmZhY2VJRCBpZCk7Ci0gICAgc3RhdHVzX3QgICAgc2hvdyhTdXJmYWNlSUQgaWQsIGludDMyX3QgbGF5ZXIgPSAtMSk7Ci0gICAgc3RhdHVzX3QgICAgZnJlZXplKFN1cmZhY2VJRCBpZCk7Ci0gICAgc3RhdHVzX3QgICAgdW5mcmVlemUoU3VyZmFjZUlEIGlkKTsKLSAgICBzdGF0dXNfdCAgICBzZXRGbGFncyhTdXJmYWNlSUQgaWQsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBtYXNrKTsKLSAgICBzdGF0dXNfdCAgICBzZXRUcmFuc3BhcmVudFJlZ2lvbkhpbnQoU3VyZmFjZUlEIGlkLCBjb25zdCBSZWdpb24mIHRyYW5zcGFyZW50KTsKLSAgICBzdGF0dXNfdCAgICBzZXRMYXllcihTdXJmYWNlSUQgaWQsIGludDMyX3QgbGF5ZXIpOwotICAgIHN0YXR1c190ICAgIHNldEFscGhhKFN1cmZhY2VJRCBpZCwgZmxvYXQgYWxwaGE9MS4wZik7Ci0gICAgc3RhdHVzX3QgICAgc2V0RnJlZXplVGludChTdXJmYWNlSUQgaWQsIHVpbnQzMl90IHRpbnQpOwotICAgIHN0YXR1c190ICAgIHNldE1hdHJpeChTdXJmYWNlSUQgaWQsIGZsb2F0IGRzZHgsIGZsb2F0IGR0ZHgsIGZsb2F0IGRzZHksIGZsb2F0IGR0ZHkpOwotICAgIHN0YXR1c190ICAgIHNldFBvc2l0aW9uKFN1cmZhY2VJRCBpZCwgZmxvYXQgeCwgZmxvYXQgeSk7Ci0gICAgc3RhdHVzX3QgICAgc2V0U2l6ZShTdXJmYWNlSUQgaWQsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgpOwotICAgIHN0YXR1c190ICAgIGRlc3Ryb3lTdXJmYWNlKFN1cmZhY2VJRCBzaWQpOwotCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7Ci0gICAgQ29tcG9zZXImIGdldENvbXBvc2VyKCk7Ci0KLSAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgIG1TdGF0dXM7Ci0gICAgICAgICAgICAgICAgc3A8SVN1cmZhY2VDb21wb3NlckNsaWVudD4gIG1DbGllbnQ7Ci0gICAgICAgICAgICAgICAgQ29tcG9zZXImICAgICAgICAgICAgICAgICAgIG1Db21wb3NlcjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTY3JlZW5zaG90Q2xpZW50Ci17Ci0gICAgc3A8SU1lbW9yeUhlYXA+IG1IZWFwOwotICAgIHVpbnQzMl90IG1XaWR0aDsKLSAgICB1aW50MzJfdCBtSGVpZ2h0OwotICAgIFBpeGVsRm9ybWF0IG1Gb3JtYXQ7Ci1wdWJsaWM6Ci0gICAgU2NyZWVuc2hvdENsaWVudCgpOwotCi0gICAgLy8gZnJlZXMgdGhlIHByZXZpb3VzIHNjcmVlbnNob3QgYW5kIGNhcHR1cmUgYSBuZXcgb25lCi0gICAgc3RhdHVzX3QgdXBkYXRlKCk7Ci0gICAgc3RhdHVzX3QgdXBkYXRlKHVpbnQzMl90IHJlcVdpZHRoLCB1aW50MzJfdCByZXFIZWlnaHQpOwotICAgIHN0YXR1c190IHVwZGF0ZSh1aW50MzJfdCByZXFXaWR0aCwgdWludDMyX3QgcmVxSGVpZ2h0LAotICAgICAgICAgICAgdWludDMyX3QgbWluTGF5ZXJaLCB1aW50MzJfdCBtYXhMYXllclopOwotCi0gICAgLy8gcmVsZWFzZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIHNjcmVlbnNob3QKLSAgICB2b2lkIHJlbGVhc2UoKTsKLQotICAgIC8vIHBpeGVscyBhcmUgdmFsaWQgdW50aWwgdGhpcyBvYmplY3QgaXMgZnJlZWQgb3IKLSAgICAvLyByZWxlYXNlKCkgb3IgdXBkYXRlKCkgaXMgY2FsbGVkCi0gICAgdm9pZCBjb25zdCogZ2V0UGl4ZWxzKCkgY29uc3Q7Ci0KLSAgICB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0OwotICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0OwotICAgIFBpeGVsRm9ybWF0IGdldEZvcm1hdCgpIGNvbnN0OwotICAgIHVpbnQzMl90IGdldFN0cmlkZSgpIGNvbnN0OwotICAgIC8vIHNpemUgb2YgYWxsb2NhdGVkIG1lbW9yeSBpbiBieXRlcwotICAgIHNpemVfdCBnZXRTaXplKCkgY29uc3Q7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9TVVJGQUNFX0NPTVBPU0VSX0NMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZS5oIGIvaW5jbHVkZS9ndWkvU3VyZmFjZVRleHR1cmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzMWU1My4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX1NVUkZBQ0VURVhUVVJFX0gKLSNkZWZpbmUgQU5EUk9JRF9HVUlfU1VSRkFDRVRFWFRVUkVfSAotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZVRleHR1cmUuaD4KLSNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KLQotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNkZWZpbmUgQU5EUk9JRF9HUkFQSElDU19TVVJGQUNFVEVYVFVSRV9KTklfSUQgIm1TdXJmYWNlVGV4dHVyZSIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIFN1cmZhY2VUZXh0dXJlIDogcHVibGljIEJ1ZmZlclF1ZXVlIHsKLXB1YmxpYzoKLQotICAgIC8vIFN1cmZhY2VUZXh0dXJlIGNvbnN0cnVjdHMgYSBuZXcgU3VyZmFjZVRleHR1cmUgb2JqZWN0LiB0ZXggaW5kaWNhdGVzIHRoZQotICAgIC8vIG5hbWUgb2YgdGhlIE9wZW5HTCBFUyB0ZXh0dXJlIHRvIHdoaWNoIGltYWdlcyBhcmUgdG8gYmUgc3RyZWFtZWQuIFRoaXMKLSAgICAvLyB0ZXh0dXJlIG5hbWUgY2Fubm90IGJlIGNoYW5nZWQgb25jZSB0aGUgU3VyZmFjZVRleHR1cmUgaXMgY3JlYXRlZC4KLSAgICAvLyBhbGxvd1N5bmNocm9ub3VzTW9kZSBzcGVjaWZpZXMgd2hldGhlciBvciBub3Qgc3luY2hyb25vdXMgbW9kZSBjYW4gYmUKLSAgICAvLyBlbmFibGVkLiB0ZXhUYXJnZXQgc3BlY2lmaWVzIHRoZSBPcGVuR0wgRVMgdGV4dHVyZSB0YXJnZXQgdG8gd2hpY2ggdGhlCi0gICAgLy8gdGV4dHVyZSB3aWxsIGJlIGJvdW5kIGluIHVwZGF0ZVRleEltYWdlLiB1c2VGZW5jZVN5bmMgc3BlY2lmaWVzIHdoZXRoZXIKLSAgICAvLyBmZW5jZXMgc2hvdWxkIGJlIHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIGJ1ZmZlcnMgaWYgdGhhdCBiZWhhdmlvcgotICAgIC8vIGlzIGVuYWJsZWQgYXQgY29tcGlsZS10aW1lLgotICAgIFN1cmZhY2VUZXh0dXJlKEdMdWludCB0ZXgsIGJvb2wgYWxsb3dTeW5jaHJvbm91c01vZGUgPSB0cnVlLAotICAgICAgICAgICAgR0xlbnVtIHRleFRhcmdldCA9IEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBib29sIHVzZUZlbmNlU3luYyA9IHRydWUpOwotCi0gICAgdmlydHVhbCB+U3VyZmFjZVRleHR1cmUoKTsKLQotCi0KLSAgICAvLyB1cGRhdGVUZXhJbWFnZSBzZXRzIHRoZSBpbWFnZSBjb250ZW50cyBvZiB0aGUgdGFyZ2V0IHRleHR1cmUgdG8gdGhhdCBvZgotICAgIC8vIHRoZSBtb3N0IHJlY2VudGx5IHF1ZXVlZCBidWZmZXIuCi0gICAgLy8KLSAgICAvLyBUaGlzIGNhbGwgbWF5IG9ubHkgYmUgbWFkZSB3aGlsZSB0aGUgT3BlbkdMIEVTIGNvbnRleHQgdG8gd2hpY2ggdGhlCi0gICAgLy8gdGFyZ2V0IHRleHR1cmUgYmVsb25ncyBpcyBib3VuZCB0byB0aGUgY2FsbGluZyB0aHJlYWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlVGV4SW1hZ2UoKTsKLQotICAgIC8vIHNldEJ1ZmZlckNvdW50U2VydmVyIHNldCB0aGUgYnVmZmVyIGNvdW50LiBJZiB0aGUgY2xpZW50IGhhcyByZXF1ZXN0ZWQKLSAgICAvLyBhIGJ1ZmZlciBjb3VudCB1c2luZyBzZXRCdWZmZXJDb3VudCwgdGhlIHNlcnZlci1idWZmZXIgY291bnQgd2lsbAotICAgIC8vIHRha2UgZWZmZWN0IG9uY2UgdGhlIGNsaWVudCBzZXRzIHRoZSBjb3VudCBiYWNrIHRvIHplcm8uCi0gICAgc3RhdHVzX3Qgc2V0QnVmZmVyQ291bnRTZXJ2ZXIoaW50IGJ1ZmZlckNvdW50KTsKLQotICAgIC8vIGdldFRyYW5zZm9ybU1hdHJpeCByZXRyaWV2ZXMgdGhlIDR4NCB0ZXh0dXJlIGNvb3JkaW5hdGUgdHJhbnNmb3JtIG1hdHJpeAotICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGV4dHVyZSBpbWFnZSBzZXQgYnkgdGhlIG1vc3QgcmVjZW50IGNhbGwgdG8KLSAgICAvLyB1cGRhdGVUZXhJbWFnZS4KLSAgICAvLwotICAgIC8vIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBtYXBzIDJEIGhvbW9nZW5lb3VzIHRleHR1cmUgY29vcmRpbmF0ZXMgb2YgdGhlIGZvcm0KLSAgICAvLyAocywgdCwgMCwgMSkgd2l0aCBzIGFuZCB0IGluIHRoZSBpbmNsdXNpdmUgcmFuZ2UgWzAsIDFdIHRvIHRoZSB0ZXh0dXJlCi0gICAgLy8gY29vcmRpbmF0ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHNhbXBsZSB0aGF0IGxvY2F0aW9uIGZyb20gdGhlIHRleHR1cmUuCi0gICAgLy8gU2FtcGxpbmcgdGhlIHRleHR1cmUgb3V0c2lkZSBvZiB0aGUgcmFuZ2Ugb2YgdGhpcyB0cmFuc2Zvcm0gaXMgdW5kZWZpbmVkLgotICAgIC8vCi0gICAgLy8gVGhpcyB0cmFuc2Zvcm0gaXMgbmVjZXNzYXJ5IHRvIGNvbXBlbnNhdGUgZm9yIHRyYW5zZm9ybXMgdGhhdCB0aGUgc3RyZWFtCi0gICAgLy8gY29udGVudCBwcm9kdWNlciBtYXkgaW1wbGljaXRseSBhcHBseSB0byB0aGUgY29udGVudC4gQnkgZm9yY2luZyB1c2VycyBvZgotICAgIC8vIGEgU3VyZmFjZVRleHR1cmUgdG8gYXBwbHkgdGhpcyB0cmFuc2Zvcm0gd2UgYXZvaWQgcGVyZm9ybWluZyBhbiBleHRyYQotICAgIC8vIGNvcHkgb2YgdGhlIGRhdGEgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gaGlkZSB0aGUgdHJhbnNmb3JtIGZyb20gdGhlCi0gICAgLy8gdXNlci4KLSAgICAvLwotICAgIC8vIFRoZSBtYXRyaXggaXMgc3RvcmVkIGluIGNvbHVtbi1tYWpvciBvcmRlciBzbyB0aGF0IGl0IG1heSBiZSBwYXNzZWQKLSAgICAvLyBkaXJlY3RseSB0byBPcGVuR0wgRVMgdmlhIHRoZSBnbExvYWRNYXRyaXhmIG9yIGdsVW5pZm9ybU1hdHJpeDRmdgotICAgIC8vIGZ1bmN0aW9ucy4KLSAgICB2b2lkIGdldFRyYW5zZm9ybU1hdHJpeChmbG9hdCBtdHhbMTZdKTsKLQotICAgIC8vIGdldFRpbWVzdGFtcCByZXRyaWV2ZXMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHRleHR1cmUgaW1hZ2UKLSAgICAvLyBzZXQgYnkgdGhlIG1vc3QgcmVjZW50IGNhbGwgdG8gdXBkYXRlVGV4SW1hZ2UuCi0gICAgLy8KLSAgICAvLyBUaGUgdGltZXN0YW1wIGlzIGluIG5hbm9zZWNvbmRzLCBhbmQgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLiBJdHMKLSAgICAvLyBvdGhlciBzZW1hbnRpY3MgKHplcm8gcG9pbnQsIGV0YykgYXJlIHNvdXJjZS1kZXBlbmRlbnQgYW5kIHNob3VsZCBiZQotICAgIC8vIGRvY3VtZW50ZWQgYnkgdGhlIHNvdXJjZS4KLSAgICBpbnQ2NF90IGdldFRpbWVzdGFtcCgpOwotCi0gICAgLy8gc2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lciBzZXRzIHRoZSBsaXN0ZW5lciBvYmplY3QgdGhhdCB3aWxsIGJlIG5vdGlmaWVkCi0gICAgLy8gd2hlbiBhIG5ldyBmcmFtZSBiZWNvbWVzIGF2YWlsYWJsZS4KLSAgICB2b2lkIHNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIoY29uc3Qgc3A8RnJhbWVBdmFpbGFibGVMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKLQotICAgIC8vIGdldEFsbG9jYXRvciByZXRyaWV2ZXMgdGhlIGJpbmRlciBvYmplY3QgdGhhdCBtdXN0IGJlIHJlZmVyZW5jZWQgYXMgbG9uZwotICAgIC8vIGFzIHRoZSBHcmFwaGljQnVmZmVycyBkZXF1ZXVlZCBmcm9tIHRoaXMgU3VyZmFjZVRleHR1cmUgYXJlIHJlZmVyZW5jZWQuCi0gICAgLy8gSG9sZGluZyB0aGlzIGJpbmRlciByZWZlcmVuY2UgcHJldmVudHMgU3VyZmFjZUZsaW5nZXIgZnJvbSBmcmVlaW5nIHRoZQotICAgIC8vIGJ1ZmZlcnMgYmVmb3JlIHRoZSBjbGllbnQgaXMgZG9uZSB3aXRoIHRoZW0uCi0gICAgc3A8SUJpbmRlcj4gZ2V0QWxsb2NhdG9yKCk7Ci0KLSAgICAvLyBzZXREZWZhdWx0QnVmZmVyU2l6ZSBpcyB1c2VkIHRvIHNldCB0aGUgc2l6ZSBvZiBidWZmZXJzIHJldHVybmVkIGJ5Ci0gICAgLy8gcmVxdWVzdEJ1ZmZlcnMgd2hlbiBhIHdpdGggYW5kIGhlaWdodCBvZiB6ZXJvIGlzIHJlcXVlc3RlZC4KLSAgICAvLyBBIGNhbGwgdG8gc2V0RGVmYXVsdEJ1ZmZlclNpemUoKSBtYXkgdHJpZ2dlciByZXF1ZXN0QnVmZmVycygpIHRvCi0gICAgLy8gYmUgY2FsbGVkIGZyb20gdGhlIGNsaWVudC4KLSAgICAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBwYXJhbWV0ZXJzIG11c3QgYmUgbm8gZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtIG9mCi0gICAgLy8gR0xfTUFYX1ZJRVdQT1JUX0RJTVMgYW5kIEdMX01BWF9URVhUVVJFX1NJWkUgKHNlZTogZ2xHZXRJbnRlZ2VydikuCi0gICAgLy8gQW4gZXJyb3IgZHVlIHRvIGludmFsaWQgZGltZW5zaW9ucyBtaWdodCBub3QgYmUgcmVwb3J0ZWQgdW50aWwKLSAgICAvLyB1cGRhdGVUZXhJbWFnZSgpIGlzIGNhbGxlZC4KLSAgICBzdGF0dXNfdCBzZXREZWZhdWx0QnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKLQotICAgIC8vIGdldEN1cnJlbnRCdWZmZXIgcmV0dXJucyB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBpbWFnZS4KLSAgICBzcDxHcmFwaGljQnVmZmVyPiBnZXRDdXJyZW50QnVmZmVyKCkgY29uc3Q7Ci0KLSAgICAvLyBnZXRDdXJyZW50VGV4dHVyZVRhcmdldCByZXR1cm5zIHRoZSB0ZXh0dXJlIHRhcmdldCBvZiB0aGUgY3VycmVudAotICAgIC8vIHRleHR1cmUgYXMgcmV0dXJuZWQgYnkgdXBkYXRlVGV4SW1hZ2UoKS4KLSAgICBHTGVudW0gZ2V0Q3VycmVudFRleHR1cmVUYXJnZXQoKSBjb25zdDsKLQotICAgIC8vIGdldEN1cnJlbnRDcm9wIHJldHVybnMgdGhlIGNyb3BwaW5nIHJlY3RhbmdsZSBvZiB0aGUgY3VycmVudCBidWZmZXIKLSAgICBSZWN0IGdldEN1cnJlbnRDcm9wKCkgY29uc3Q7Ci0KLSAgICAvLyBnZXRDdXJyZW50VHJhbnNmb3JtIHJldHVybnMgdGhlIHRyYW5zZm9ybSBvZiB0aGUgY3VycmVudCBidWZmZXIKLSAgICB1aW50MzJfdCBnZXRDdXJyZW50VHJhbnNmb3JtKCkgY29uc3Q7Ci0KLSAgICAvLyBnZXRDdXJyZW50U2NhbGluZ01vZGUgcmV0dXJucyB0aGUgc2NhbGluZyBtb2RlIG9mIHRoZSBjdXJyZW50IGJ1ZmZlcgotICAgIHVpbnQzMl90IGdldEN1cnJlbnRTY2FsaW5nTW9kZSgpIGNvbnN0OwotCi0gICAgLy8gaXNTeW5jaHJvbm91c01vZGUgcmV0dXJucyB3aGV0aGVyIHRoZSBTdXJmYWNlVGV4dHVyZSBpcyBjdXJyZW50bHkgaW4KLSAgICAvLyBzeW5jaHJvbm91cyBtb2RlLgotICAgIGJvb2wgaXNTeW5jaHJvbm91c01vZGUoKSBjb25zdDsKLQotICAgIC8vIGFiYW5kb24gZnJlZXMgYWxsIHRoZSBidWZmZXJzIGFuZCBwdXRzIHRoZSBTdXJmYWNlVGV4dHVyZSBpbnRvIHRoZQotICAgIC8vICdhYmFuZG9uZWQnIHN0YXRlLiAgT25jZSBwdXQgaW4gdGhpcyBzdGF0ZSB0aGUgU3VyZmFjZVRleHR1cmUgY2FuIG5ldmVyCi0gICAgLy8gbGVhdmUgaXQuICBXaGVuIGluIHRoZSAnYWJhbmRvbmVkJyBzdGF0ZSwgYWxsIG1ldGhvZHMgb2YgdGhlCi0gICAgLy8gSVN1cmZhY2VUZXh0dXJlIGludGVyZmFjZSB3aWxsIGZhaWwgd2l0aCB0aGUgTk9fSU5JVCBlcnJvci4KLSAgICAvLwotICAgIC8vIE5vdGUgdGhhdCB3aGlsZSBjYWxsaW5nIHRoaXMgbWV0aG9kIGNhdXNlcyBhbGwgdGhlIGJ1ZmZlcnMgdG8gYmUgZnJlZWQKLSAgICAvLyBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgdGhlIFN1cmZhY2VUZXh0dXJlLCBpZiB0aGVyZSBhcmUgYWRkaXRpb25hbAotICAgIC8vIHJlZmVyZW5jZXMgb24gdGhlIGJ1ZmZlcnMgKGUuZy4gaWYgYSBidWZmZXIgaXMgcmVmZXJlbmNlZCBieSBhIGNsaWVudCBvcgotICAgIC8vIGJ5IE9wZW5HTCBFUyBhcyBhIHRleHR1cmUpIHRoZW4gdGhvc2UgYnVmZmVyIHdpbGwgcmVtYWluIGFsbG9jYXRlZC4KLSAgICB2b2lkIGFiYW5kb24oKTsKLQotICAgIC8vIHNldCB0aGUgbmFtZSBvZiB0aGUgU3VyZmFjZVRleHR1cmUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgaXQgaW4KLSAgICAvLyBsb2cgbWVzc2FnZXMuCi0gICAgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZzgmIG5hbWUpOwotCi0gICAgLy8gZHVtcCBvdXIgc3RhdGUgaW4gYSBTdHJpbmcKLSAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzgmIHJlc3VsdCwgY29uc3QgY2hhciogcHJlZml4LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdDsKLQotcHJvdGVjdGVkOgotCi0gICAgc3RhdGljIGJvb2wgaXNFeHRlcm5hbEZvcm1hdCh1aW50MzJfdCBmb3JtYXQpOwotCi1wcml2YXRlOgotCi0gICAgLy8gY3JlYXRlSW1hZ2UgY3JlYXRlcyBhIG5ldyBFR0xJbWFnZSBmcm9tIGEgR3JhcGhpY0J1ZmZlci4KLSAgICBFR0xJbWFnZUtIUiBjcmVhdGVJbWFnZShFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyKTsKLQotICAgIC8vIGNvbXB1dGVDdXJyZW50VHJhbnNmb3JtTWF0cml4IGNvbXB1dGVzIHRoZSB0cmFuc2Zvcm0gbWF0cml4IGZvciB0aGUKLSAgICAvLyBjdXJyZW50IHRleHR1cmUuICBJdCB1c2VzIG1DdXJyZW50VHJhbnNmb3JtIGFuZCB0aGUgY3VycmVudCBHcmFwaGljQnVmZmVyCi0gICAgLy8gdG8gY29tcHV0ZSB0aGlzIG1hdHJpeCBhbmQgc3RvcmVzIGl0IGluIG1DdXJyZW50VHJhbnNmb3JtTWF0cml4LgotICAgIHZvaWQgY29tcHV0ZUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXgoKTsKLQotICAgIC8vIG1DdXJyZW50VGV4dHVyZUJ1ZiBpcyB0aGUgZ3JhcGhpYyBidWZmZXIgb2YgdGhlIGN1cnJlbnQgdGV4dHVyZS4gSXQncwotICAgIC8vIHBvc3NpYmxlIHRoYXQgdGhpcyBidWZmZXIgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgYnVmZmVyIHNsb3QsIHNvIHdlCi0gICAgLy8gbXVzdCB0cmFjayBpdCBzZXBhcmF0ZWx5IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIGdldEN1cnJlbnRCdWZmZXIgbWV0aG9kLgotICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1DdXJyZW50VGV4dHVyZUJ1ZjsKLQotICAgIC8vIG1DdXJyZW50Q3JvcCBpcyB0aGUgY3JvcCByZWN0YW5nbGUgdGhhdCBhcHBsaWVzIHRvIHRoZSBjdXJyZW50IHRleHR1cmUuCi0gICAgLy8gSXQgZ2V0cyBzZXQgZWFjaCB0aW1lIHVwZGF0ZVRleEltYWdlIGlzIGNhbGxlZC4KLSAgICBSZWN0IG1DdXJyZW50Q3JvcDsKLQotICAgIC8vIG1DdXJyZW50VHJhbnNmb3JtIGlzIHRoZSB0cmFuc2Zvcm0gaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgdGV4dHVyZS4gSXQKLSAgICAvLyBnZXRzIHNldCBlYWNoIHRpbWUgdXBkYXRlVGV4SW1hZ2UgaXMgY2FsbGVkLgotICAgIHVpbnQzMl90IG1DdXJyZW50VHJhbnNmb3JtOwotCi0gICAgLy8gbUN1cnJlbnRTY2FsaW5nTW9kZSBpcyB0aGUgc2NhbGluZyBtb2RlIGZvciB0aGUgY3VycmVudCB0ZXh0dXJlLiBJdCBnZXRzCi0gICAgLy8gc2V0IHRvIGVhY2ggdGltZSB1cGRhdGVUZXhJbWFnZSBpcyBjYWxsZWQuCi0gICAgdWludDMyX3QgbUN1cnJlbnRTY2FsaW5nTW9kZTsKLQotICAgIC8vIG1DdXJyZW50VHJhbnNmb3JtTWF0cml4IGlzIHRoZSB0cmFuc2Zvcm0gbWF0cml4IGZvciB0aGUgY3VycmVudCB0ZXh0dXJlLgotICAgIC8vIEl0IGdldHMgY29tcHV0ZWQgYnkgY29tcHV0ZVRyYW5zZm9ybU1hdHJpeCBlYWNoIHRpbWUgdXBkYXRlVGV4SW1hZ2UgaXMKLSAgICAvLyBjYWxsZWQuCi0gICAgZmxvYXQgbUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXhbMTZdOwotCi0gICAgLy8gbUN1cnJlbnRUaW1lc3RhbXAgaXMgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIGN1cnJlbnQgdGV4dHVyZS4gSXQKLSAgICAvLyBnZXRzIHNldCBlYWNoIHRpbWUgdXBkYXRlVGV4SW1hZ2UgaXMgY2FsbGVkLgotICAgIGludDY0X3QgbUN1cnJlbnRUaW1lc3RhbXA7Ci0KLSAgICAvLyBtVGV4TmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgT3BlbkdMIHRleHR1cmUgdG8gd2hpY2ggc3RyZWFtZWQgaW1hZ2VzIHdpbGwKLSAgICAvLyBiZSBib3VuZCB3aGVuIHVwZGF0ZVRleEltYWdlIGlzIGNhbGxlZC4gSXQgaXMgc2V0IGF0IGNvbnN0cnVjdGlvbiB0aW1lCi0gICAgLy8gY2hhbmdlZCB3aXRoIGEgY2FsbCB0byBzZXRUZXhOYW1lLgotICAgIGNvbnN0IEdMdWludCBtVGV4TmFtZTsKLQotICAgIC8vIG1Vc2VGZW5jZVN5bmMgaW5kaWNhdGVzIHdoZXRoZXIgY3JlYXRpb24gb2YgdGhlIEVHTF9LSFJfZmVuY2Vfc3luYwotICAgIC8vIGV4dGVuc2lvbiBzaG91bGQgYmUgdXNlZCB0byBwcmV2ZW50IGJ1ZmZlcnMgZnJvbSBiZWluZyBkZXF1ZXVlZCBiZWZvcmUKLSAgICAvLyBpdCdzIHNhZmUgZm9yIHRoZW0gdG8gYmUgd3JpdHRlbi4gSXQgZ2V0cyBzZXQgYXQgY29uc3RydWN0aW9uIHRpbWUgYW5kCi0gICAgLy8gbmV2ZXIgY2hhbmdlcy4KLSAgICBjb25zdCBib29sIG1Vc2VGZW5jZVN5bmM7Ci0KLSAgICAvLyBtVGV4VGFyZ2V0IGlzIHRoZSBHTCB0ZXh0dXJlIHRhcmdldCB3aXRoIHdoaWNoIHRoZSBHTCB0ZXh0dXJlIG9iamVjdCBpcwotICAgIC8vIGFzc29jaWF0ZWQuICBJdCBpcyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBuZXZlciBjaGFuZ2VkLiAgSXQgaXMKLSAgICAvLyBhbG1vc3QgYWx3YXlzIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTIGV4Y2VwdCBmb3Igb25lIHVzZSBjYXNlIGluIEFuZHJvaWQKLSAgICAvLyBCcm93c2VyLiAgSW4gdGhhdCBjYXNlIGl0IGlzIHNldCB0byBHTF9URVhUVVJFXzJEIHRvIGFsbG93Ci0gICAgLy8gZ2xDb3B5VGV4U3ViSW1hZ2UgdG8gcmVhZCBmcm9tIHRoZSB0ZXh0dXJlLiAgVGhpcyBpcyBhIGhhY2sgdG8gd29yawotICAgIC8vIGFyb3VuZCBhIEdMIGRyaXZlciBsaW1pdGF0aW9uIG9uIHRoZSBudW1iZXIgb2YgRkJPIGF0dGFjaG1lbnRzLCB3aGljaCB0aGUKLSAgICAvLyBicm93c2VyJ3MgdGlsZSBjYWNoZSBleGNlZWRzLgotICAgIGNvbnN0IEdMZW51bSBtVGV4VGFyZ2V0OwotCi0gICAgLy8gU3VyZmFjZVRleHR1cmUgbWFpbnRhaW5zIEVHTCBpbmZvcm1hdGlvbiBhYm91dCBHcmFwaGljQnVmZmVycyB0aGF0IGNvcnJlc3BvbmRzCi0gICAgLy8gZGlyZWN0bHkgd2l0aCBCdWZmZXJRdWV1ZSdzIGJ1ZmZlcnMKLSAgICBzdHJ1Y3QgRUdMU2xvdCB7Ci0gICAgICAgIEVHTFNsb3QoKQotICAgICAgICA6IG1FZ2xJbWFnZShFR0xfTk9fSU1BR0VfS0hSKSwKLSAgICAgICAgICBtRWdsRGlzcGxheShFR0xfTk9fRElTUExBWSksCi0gICAgICAgICAgbUZlbmNlKEVHTF9OT19TWU5DX0tIUikgewotICAgICAgICB9Ci0KLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUdyYXBoaWNCdWZmZXI7Ci0KLSAgICAgICAgLy8gbUVnbEltYWdlIGlzIHRoZSBFR0xJbWFnZSBjcmVhdGVkIGZyb20gbUdyYXBoaWNCdWZmZXIuCi0gICAgICAgIEVHTEltYWdlS0hSIG1FZ2xJbWFnZTsKLQotICAgICAgICAvLyBtRWdsRGlzcGxheSBpcyB0aGUgRUdMRGlzcGxheSB1c2VkIHRvIGNyZWF0ZSBtRWdsSW1hZ2UuCi0gICAgICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7Ci0KLSAgICAgICAgLy8gbUZlbmNlIGlzIHRoZSBFR0wgc3luYyBvYmplY3QgdGhhdCBtdXN0IHNpZ25hbCBiZWZvcmUgdGhlIGJ1ZmZlcgotICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIgc2xvdCBtYXkgYmUgZGVxdWV1ZWQuIEl0IGlzIGluaXRpYWxpemVkCi0gICAgICAgIC8vIHRvIEVHTF9OT19TWU5DX0tIUiB3aGVuIHRoZSBidWZmZXIgaXMgY3JlYXRlZCBhbmQgKG9wdGlvbmFsbHksIGJhc2VkCi0gICAgICAgIC8vIG9uIGEgY29tcGlsZS10aW1lIG9wdGlvbikgc2V0IHRvIGEgbmV3IHN5bmMgb2JqZWN0IGluIHVwZGF0ZVRleEltYWdlLgotICAgICAgICBFR0xTeW5jS0hSIG1GZW5jZTsKLSAgICB9OwotCi0gICAgRUdMU2xvdCBtRUdMU2xvdHNbTlVNX0JVRkZFUl9TTE9UU107Ci0KLSAgICAvLyBtQWJhbmRvbmVkIGluZGljYXRlcyB0aGF0IHRoZSBCdWZmZXJRdWV1ZSB3aWxsIG5vIGxvbmdlciBiZSB1c2VkIHRvCi0gICAgLy8gY29uc3VtZSBpbWFnZXMgYnVmZmVycyBwdXNoZWQgdG8gaXQgdXNpbmcgdGhlIElTdXJmYWNlVGV4dHVyZSBpbnRlcmZhY2UuCi0gICAgLy8gSXQgaXMgaW5pdGlhbGl6ZWQgdG8gZmFsc2UsIGFuZCBzZXQgdG8gdHJ1ZSBpbiB0aGUgYWJhbmRvbiBtZXRob2QuICBBCi0gICAgLy8gQnVmZmVyUXVldWUgdGhhdCBoYXMgYmVlbiBhYmFuZG9uZWQgd2lsbCByZXR1cm4gdGhlIE5PX0lOSVQgZXJyb3IgZnJvbQotICAgIC8vIGFsbCBJU3VyZmFjZVRleHR1cmUgbWV0aG9kcyBjYXBhYmxlIG9mIHJldHVybmluZyBhbiBlcnJvci4KLSAgICBib29sIG1BYmFuZG9uZWQ7Ci0KLSAgICAvLyBtTmFtZSBpcyBhIHN0cmluZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBTdXJmYWNlVGV4dHVyZSBpbiBsb2cgbWVzc2FnZXMuCi0gICAgLy8gSXQgY2FuIGJlIHNldCBieSB0aGUgc2V0TmFtZSBtZXRob2QuCi0gICAgU3RyaW5nOCBtTmFtZTsKLQotICAgIC8vIG1NdXRleCBpcyB0aGUgbXV0ZXggdXNlZCB0byBwcmV2ZW50IGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBtZW1iZXIKLSAgICAvLyB2YXJpYWJsZXMgb2YgU3VyZmFjZVRleHR1cmUgb2JqZWN0cy4gSXQgbXVzdCBiZSBsb2NrZWQgd2hlbmV2ZXIgdGhlCi0gICAgLy8gbWVtYmVyIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQuCi0gICAgbXV0YWJsZSBNdXRleCBtTXV0ZXg7Ci0KLSAgICAvLyBtQ3VycmVudFRleHR1cmUgaXMgdGhlIGJ1ZmZlciBzbG90IGluZGV4IG9mIHRoZSBidWZmZXIgdGhhdCBpcyBjdXJyZW50bHkKLSAgICAvLyBib3VuZCB0byB0aGUgT3BlbkdMIHRleHR1cmUuIEl0IGlzIGluaXRpYWxpemVkIHRvIElOVkFMSURfQlVGRkVSX1NMT1QsCi0gICAgLy8gaW5kaWNhdGluZyB0aGF0IG5vIGJ1ZmZlciBzbG90IGlzIGN1cnJlbnRseSBib3VuZCB0byB0aGUgdGV4dHVyZS4gTm90ZSwKLSAgICAvLyBob3dldmVyLCB0aGF0IGEgdmFsdWUgb2YgSU5WQUxJRF9CVUZGRVJfU0xPVCBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuCi0gICAgLy8gdGhhdCBubyBidWZmZXIgaXMgYm91bmQgdG8gdGhlIHRleHR1cmUuIEEgY2FsbCB0byBzZXRCdWZmZXJDb3VudCB3aWxsCi0gICAgLy8gcmVzZXQgbUN1cnJlbnRUZXh0dXJlIHRvIElOVkFMSURfQlVGRkVSX1NMT1QuCi0gICAgaW50IG1DdXJyZW50VGV4dHVyZTsKLQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX1NVUkZBQ0VURVhUVVJFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50LmggYi9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTdmZTQ4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9HVUlfU1VSRkFDRVRFWFRVUkVDTElFTlRfSAotI2RlZmluZSBBTkRST0lEX0dVSV9TVVJGQUNFVEVYVFVSRUNMSUVOVF9ICi0KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VUZXh0dXJlLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlLmg+Ci0KLSNpbmNsdWRlIDx1aS9BTmF0aXZlT2JqZWN0QmFzZS5oPgotI2luY2x1ZGUgPHVpL1JlZ2lvbi5oPgotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdXJmYWNlOwotCi1jbGFzcyBTdXJmYWNlVGV4dHVyZUNsaWVudAotICAgIDogcHVibGljIEFOYXRpdmVPYmplY3RCYXNlPEFOYXRpdmVXaW5kb3csIFN1cmZhY2VUZXh0dXJlQ2xpZW50LCBSZWZCYXNlPgotewotcHVibGljOgotICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50KGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4mIHN1cmZhY2VUZXh0dXJlKTsKLQotICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gZ2V0SVN1cmZhY2VUZXh0dXJlKCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICBTdXJmYWNlVGV4dHVyZUNsaWVudCgpOwotICAgIHZpcnR1YWwgflN1cmZhY2VUZXh0dXJlQ2xpZW50KCk7Ci0gICAgdm9pZCBzZXRJU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SVN1cmZhY2VUZXh0dXJlPiYgc3VyZmFjZVRleHR1cmUpOwotCi1wcml2YXRlOgotICAgIC8vIGNhbid0IGJlIGNvcGllZAotICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50JiBvcGVyYXRvciA9IChjb25zdCBTdXJmYWNlVGV4dHVyZUNsaWVudCYgcmhzKTsKLSAgICBTdXJmYWNlVGV4dHVyZUNsaWVudChjb25zdCBTdXJmYWNlVGV4dHVyZUNsaWVudCYgcmhzKTsKLSAgICB2b2lkIGluaXQoKTsKLQotICAgIC8vIEFOYXRpdmVXaW5kb3cgaG9va3MKLSAgICBzdGF0aWMgaW50IGhvb2tfY2FuY2VsQnVmZmVyKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyKTsKLSAgICBzdGF0aWMgaW50IGhvb2tfZGVxdWV1ZUJ1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csIEFOYXRpdmVXaW5kb3dCdWZmZXIqKiBidWZmZXIpOwotICAgIHN0YXRpYyBpbnQgaG9va19sb2NrQnVmZmVyKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyKTsKLSAgICBzdGF0aWMgaW50IGhvb2tfcGVyZm9ybShBTmF0aXZlV2luZG93KiB3aW5kb3csIGludCBvcGVyYXRpb24sIC4uLik7Ci0gICAgc3RhdGljIGludCBob29rX3F1ZXJ5KGNvbnN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50IHdoYXQsIGludCogdmFsdWUpOwotICAgIHN0YXRpYyBpbnQgaG9va19xdWV1ZUJ1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgc3RhdGljIGludCBob29rX3NldFN3YXBJbnRlcnZhbChBTmF0aXZlV2luZG93KiB3aW5kb3csIGludCBpbnRlcnZhbCk7Ci0KLSAgICBpbnQgZGlzcGF0Y2hDb25uZWN0KHZhX2xpc3QgYXJncyk7Ci0gICAgaW50IGRpc3BhdGNoRGlzY29ubmVjdCh2YV9saXN0IGFyZ3MpOwotICAgIGludCBkaXNwYXRjaFNldEJ1ZmZlckNvdW50KHZhX2xpc3QgYXJncyk7Ci0gICAgaW50IGRpc3BhdGNoU2V0QnVmZmVyc0dlb21ldHJ5KHZhX2xpc3QgYXJncyk7Ci0gICAgaW50IGRpc3BhdGNoU2V0QnVmZmVyc0RpbWVuc2lvbnModmFfbGlzdCBhcmdzKTsKLSAgICBpbnQgZGlzcGF0Y2hTZXRCdWZmZXJzRm9ybWF0KHZhX2xpc3QgYXJncyk7Ci0gICAgaW50IGRpc3BhdGNoU2V0U2NhbGluZ01vZGUodmFfbGlzdCBhcmdzKTsKLSAgICBpbnQgZGlzcGF0Y2hTZXRCdWZmZXJzVHJhbnNmb3JtKHZhX2xpc3QgYXJncyk7Ci0gICAgaW50IGRpc3BhdGNoU2V0QnVmZmVyc1RpbWVzdGFtcCh2YV9saXN0IGFyZ3MpOwotICAgIGludCBkaXNwYXRjaFNldENyb3AodmFfbGlzdCBhcmdzKTsKLSAgICBpbnQgZGlzcGF0Y2hTZXRVc2FnZSh2YV9saXN0IGFyZ3MpOwotICAgIGludCBkaXNwYXRjaExvY2sodmFfbGlzdCBhcmdzKTsKLSAgICBpbnQgZGlzcGF0Y2hVbmxvY2tBbmRQb3N0KHZhX2xpc3QgYXJncyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGludCBjYW5jZWxCdWZmZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyKTsKLSAgICB2aXJ0dWFsIGludCBkZXF1ZXVlQnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqKiBidWZmZXIpOwotICAgIHZpcnR1YWwgaW50IGxvY2tCdWZmZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyKTsKLSAgICB2aXJ0dWFsIGludCBwZXJmb3JtKGludCBvcGVyYXRpb24sIHZhX2xpc3QgYXJncyk7Ci0gICAgdmlydHVhbCBpbnQgcXVlcnkoaW50IHdoYXQsIGludCogdmFsdWUpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IHF1ZXVlQnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgdmlydHVhbCBpbnQgc2V0U3dhcEludGVydmFsKGludCBpbnRlcnZhbCk7Ci0KLSAgICB2aXJ0dWFsIGludCBjb25uZWN0KGludCBhcGkpOwotICAgIHZpcnR1YWwgaW50IGRpc2Nvbm5lY3QoaW50IGFwaSk7Ci0gICAgdmlydHVhbCBpbnQgc2V0QnVmZmVyQ291bnQoaW50IGJ1ZmZlckNvdW50KTsKLSAgICB2aXJ0dWFsIGludCBzZXRCdWZmZXJzRGltZW5zaW9ucyhpbnQgdywgaW50IGgpOwotICAgIHZpcnR1YWwgaW50IHNldEJ1ZmZlcnNGb3JtYXQoaW50IGZvcm1hdCk7Ci0gICAgdmlydHVhbCBpbnQgc2V0U2NhbGluZ01vZGUoaW50IG1vZGUpOwotICAgIHZpcnR1YWwgaW50IHNldEJ1ZmZlcnNUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBpbnQgc2V0QnVmZmVyc1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcCk7Ci0gICAgdmlydHVhbCBpbnQgc2V0Q3JvcChSZWN0IGNvbnN0KiByZWN0KTsKLSAgICB2aXJ0dWFsIGludCBzZXRVc2FnZSh1aW50MzJfdCByZXFVc2FnZSk7Ci0gICAgdmlydHVhbCBpbnQgbG9jayhBTmF0aXZlV2luZG93X0J1ZmZlciogb3V0QnVmZmVyLCBBUmVjdCogaW5PdXREaXJ0eUJvdW5kcyk7Ci0gICAgdmlydHVhbCBpbnQgdW5sb2NrQW5kUG9zdCgpOwotCi0gICAgZW51bSB7IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgPSBTdXJmYWNlVGV4dHVyZTo6TUlOX1VOREVRVUVVRURfQlVGRkVSUyB9OwotICAgIGVudW0geyBOVU1fQlVGRkVSX1NMT1RTID0gU3VyZmFjZVRleHR1cmU6Ok5VTV9CVUZGRVJfU0xPVFMgfTsKLSAgICBlbnVtIHsgREVGQVVMVF9GT1JNQVQgPSBQSVhFTF9GT1JNQVRfUkdCQV84ODg4IH07Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBmcmVlQWxsQnVmZmVycygpOwotICAgIGludCBnZXRTbG90RnJvbUJ1ZmZlckxvY2tlZChhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmZmVyKSBjb25zdDsKLQotICAgIC8vIG1TdXJmYWNlVGV4dHVyZSBpcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBzdXJmYWNlIHRleHR1cmUgc2VydmVyLiBBbGwKLSAgICAvLyBvcGVyYXRpb25zIG9uIHRoZSBzdXJmYWNlIHRleHR1cmUgY2xpZW50IHVsdGltYXRlbHkgdHJhbnNsYXRlIGludG8KLSAgICAvLyBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgc2VydmVyIHVzaW5nIHRoaXMgaW50ZXJmYWNlLgotICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gbVN1cmZhY2VUZXh0dXJlOwotCi0gICAgLy8gbVNsb3RzIHN0b3JlcyB0aGUgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZm9yIGVhY2ggYnVmZmVyIHNsb3QuCi0gICAgLy8gSXQgaXMgaW5pdGlhbGl6ZWQgdG8gbnVsbCBwb2ludGVycywgYW5kIGdldHMgZmlsbGVkIGluIHdpdGggdGhlIHJlc3VsdCBvZgotICAgIC8vIElTdXJmYWNlVGV4dHVyZTo6cmVxdWVzdEJ1ZmZlciB3aGVuIHRoZSBjbGllbnQgZGVxdWV1ZXMgYSBidWZmZXIgZnJvbSBhCi0gICAgLy8gc2xvdCB0aGF0IGhhcyBub3QgeWV0IGJlZW4gdXNlZC4gVGhlIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gYSBzbG90IHdpbGwgYWxzbwotICAgIC8vIGJlIHJlcGxhY2VkIGlmIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIHVzYWdlIG9yIGdlb21ldHJ5IGRpZmZlcnMgZnJvbSB0aGF0Ci0gICAgLy8gb2YgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gYSBzbG90LgotICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1TbG90c1tOVU1fQlVGRkVSX1NMT1RTXTsKLQotICAgIC8vIG1SZXFXaWR0aCBpcyB0aGUgYnVmZmVyIHdpZHRoIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgYXQgdGhlIG5leHQgZGVxdWV1ZQotICAgIC8vIG9wZXJhdGlvbi4gSXQgaXMgaW5pdGlhbGl6ZWQgdG8gMS4KLSAgICB1aW50MzJfdCBtUmVxV2lkdGg7Ci0KLSAgICAvLyBtUmVxSGVpZ2h0IGlzIHRoZSBidWZmZXIgaGVpZ2h0IHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgYXQgdGhlIG5leHQgZGV1cXVlCi0gICAgLy8gb3BlcmF0aW9uLiBJdCBpcyBpbml0aWFsaXplZCB0byAxLgotICAgIHVpbnQzMl90IG1SZXFIZWlnaHQ7Ci0KLSAgICAvLyBtUmVxRm9ybWF0IGlzIHRoZSBidWZmZXIgcGl4ZWwgZm9ybWF0IHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgYXQgdGhlIG5leHQKLSAgICAvLyBkZXVxdWUgb3BlcmF0aW9uLiBJdCBpcyBpbml0aWFsaXplZCB0byBQSVhFTF9GT1JNQVRfUkdCQV84ODg4LgotICAgIHVpbnQzMl90IG1SZXFGb3JtYXQ7Ci0KLSAgICAvLyBtUmVxVXNhZ2UgaXMgdGhlIHNldCBvZiBidWZmZXIgdXNhZ2UgZmxhZ3MgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZAotICAgIC8vIGF0IHRoZSBuZXh0IGRldXF1ZSBvcGVyYXRpb24uIEl0IGlzIGluaXRpYWxpemVkIHRvIDAuCi0gICAgdWludDMyX3QgbVJlcVVzYWdlOwotCi0gICAgLy8gbVRpbWVzdGFtcCBpcyB0aGUgdGltZXN0YW1wIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgbmV4dCBidWZmZXIgcXVldWUKLSAgICAvLyBvcGVyYXRpb24uIEl0IGRlZmF1bHRzIHRvIE5BVElWRV9XSU5ET1dfVElNRVNUQU1QX0FVVE8sIHdoaWNoIG1lYW5zIHRoYXQKLSAgICAvLyBhIHRpbWVzdGFtcCBpcyBhdXRvLWdlbmVyYXRlZCB3aGVuIHF1ZXVlQnVmZmVyIGlzIGNhbGxlZC4KLSAgICBpbnQ2NF90IG1UaW1lc3RhbXA7Ci0KLSAgICAvLyBtRGVmYXVsdFdpZHRoIGlzIGRlZmF1bHQgd2lkdGggb2YgdGhlIHdpbmRvdywgcmVnYXJkbGVzcyBvZiB0aGUKLSAgICAvLyBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMgY2FsbAotICAgIHVpbnQzMl90IG1EZWZhdWx0V2lkdGg7Ci0KLSAgICAvLyBtRGVmYXVsdEhlaWdodCBpcyBkZWZhdWx0IHdpZHRoIG9mIHRoZSB3aW5kb3csIHJlZ2FyZGxlc3Mgb2YgdGhlCi0gICAgLy8gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zIGNhbGwKLSAgICB1aW50MzJfdCBtRGVmYXVsdEhlaWdodDsKLQotICAgIC8vIG1UcmFuc2Zvcm1IaW50IGlzIHRoZSB0cmFuc2Zvcm0gcHJvYmFibHkgYXBwbGllZCB0byBidWZmZXJzIG9mIHRoaXMKLSAgICAvLyB3aW5kb3cuIHRoaXMgaXMgb25seSBhIGhpbnQsIGFjdHVhbCB0cmFuc2Zvcm0gbWF5IGRpZmZlci4KLSAgICB1aW50MzJfdCBtVHJhbnNmb3JtSGludDsKLQotICAgIC8vIG1NdXRleCBpcyB0aGUgbXV0ZXggdXNlZCB0byBwcmV2ZW50IGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBtZW1iZXIKLSAgICAvLyB2YXJpYWJsZXMgb2YgU3VyZmFjZVRleHR1cmUgb2JqZWN0cy4gSXQgbXVzdCBiZSBsb2NrZWQgd2hlbmV2ZXIgdGhlCi0gICAgLy8gbWVtYmVyIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQuCi0gICAgbXV0YWJsZSBNdXRleCBtTXV0ZXg7Ci0KLSAgICAvLyBtdXN0IGJlIHVzZWQgZnJvbSB0aGUgbG9jay91bmxvY2sgdGhyZWFkCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gICAgICAgICAgIG1Mb2NrZWRCdWZmZXI7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gICAgICAgICAgIG1Qb3N0ZWRCdWZmZXI7Ci0gICAgbXV0YWJsZSBSZWdpb24gICAgICAgICAgICAgIG1PbGREaXJ0eVJlZ2lvbjsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZFRvQ3B1OwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX0dVSV9TVVJGQUNFVEVYVFVSRUNMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggODliYzk1ZC4uZDU0YWIzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMjE4LDggKzIxOCw4IEBACiAgICAgICAgIC8vIElBdWRpb0ZsaW5nZXJDbGllbnQKIAogICAgICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiB0aGUgY29uZmlndXJhdGlvbiBvZiBhbiBvdXRwdXQgb3IgaW5wdXQ6IGtlZXBzIHRoZSBjYWNoZWQKLSAgICAgICAgLy8gdmFsdWVzIGZvciBvdXRwdXQvaW5wdXQgcGFyYW1ldGVycyB1cHRvIGRhdGUgaW4gY2xpZW50IHByb2Nlc3MKLSAgICAgICAgdmlydHVhbCB2b2lkIGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCB2b2lkICpwYXJhbTIpOworICAgICAgICAvLyB2YWx1ZXMgZm9yIG91dHB1dC9pbnB1dCBwYXJhbWV0ZXJzIHVwLXRvLWRhdGUgaW4gY2xpZW50IHByb2Nlc3MKKyAgICAgICAgdmlydHVhbCB2b2lkIGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpOwogICAgIH07CiAKICAgICBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaAppbmRleCBmM2I0ZGYxLi43NWE5OTcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaApAQCAtMzMsNyArMzMsNyBAQAogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9GbGluZ2VyQ2xpZW50KTsKIAogICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIGF1ZGlvIGlucHV0L291dHB1dCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgdm9pZCAqcGFyYW0yKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpID0gMDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL2JpbmRlci9TdGF0aWMuaCBiL2luY2x1ZGUvcHJpdmF0ZS9iaW5kZXIvU3RhdGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMGY5ZmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wcml2YXRlL2JpbmRlci9TdGF0aWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBbGwgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlLCB0byBjb250cm9sIGluaXRpYWxpemF0aW9uIGFuZAotLy8gZGVzdHJ1Y3Rpb24gb3JkZXIgaW4gdGhlIGxpYnJhcnkuCi0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gRm9yIFByb2Nlc3NTdGF0ZS5jcHAKLWV4dGVybiBNdXRleCBnUHJvY2Vzc011dGV4OwotZXh0ZXJuIHNwPFByb2Nlc3NTdGF0ZT4gZ1Byb2Nlc3M7Ci0KLS8vIEZvciBTZXJ2aWNlTWFuYWdlci5jcHAKLWV4dGVybiBNdXRleCBnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyTG9jazsKLWV4dGVybiBzcDxJU2VydmljZU1hbmFnZXI+IGdEZWZhdWx0U2VydmljZU1hbmFnZXI7Ci1leHRlcm4gc3A8SVBlcm1pc3Npb25Db250cm9sbGVyPiBnUGVybWlzc2lvbkNvbnRyb2xsZXI7Ci0KLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL2JpbmRlci9iaW5kZXJfbW9kdWxlLmggYi9pbmNsdWRlL3ByaXZhdGUvYmluZGVyL2JpbmRlcl9tb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkZDY0Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvYmluZGVyL2JpbmRlcl9tb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9CSU5ERVJfTU9EVUxFX0hfCi0jZGVmaW5lIF9CSU5ERVJfTU9EVUxFX0hfCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIGFuZHJvaWQgewotI2VuZGlmCi0KLS8qIG9idGFpbiBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMgZnJvbSB0aGUga2VybmVsIGhlYWRlciAqLwotCi0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvYmluZGVyLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0jZW5kaWYKLQotI2VuZGlmIC8vIF9CSU5ERVJfTU9EVUxFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvZ3VpL0NvbXBvc2VyU2VydmljZS5oIGIvaW5jbHVkZS9wcml2YXRlL2d1aS9Db21wb3NlclNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDkxYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvZ3VpL0NvbXBvc2VyU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9QUklWQVRFX0dVSV9DT01QT1NFUl9TRVJWSUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9QUklWQVRFX0dVSV9DT01QT1NFUl9TRVJWSUNFX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIElNZW1vcnlIZWFwOwotY2xhc3MgSVN1cmZhY2VDb21wb3NlcjsKLWNsYXNzIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3Q7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBDb21wb3NlclNlcnZpY2UgOiBwdWJsaWMgU2luZ2xldG9uPENvbXBvc2VyU2VydmljZT4KLXsKLSAgICAvLyB0aGVzZSBhcmUgY29uc3RhbnRzCi0gICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gbUNvbXBvc2VyU2VydmljZTsKLSAgICBzcDxJTWVtb3J5SGVhcD4gbVNlcnZlckNibGtNZW1vcnk7Ci0gICAgc3VyZmFjZV9mbGluZ2VyX2NibGtfdCB2b2xhdGlsZSogbVNlcnZlckNibGs7Ci0gICAgQ29tcG9zZXJTZXJ2aWNlKCk7Ci0gICAgZnJpZW5kIGNsYXNzIFNpbmdsZXRvbjxDb21wb3NlclNlcnZpY2U+OwotcHVibGljOgotICAgIHN0YXRpYyBzcDxJU3VyZmFjZUNvbXBvc2VyPiBnZXRDb21wb3NlclNlcnZpY2UoKTsKLSAgICBzdGF0aWMgc3VyZmFjZV9mbGluZ2VyX2NibGtfdCBjb25zdCB2b2xhdGlsZSAqIGdldENvbnRyb2xCbG9jaygpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9QUklWQVRFX0dVSV9DT01QT1NFUl9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9ndWkvTGF5ZXJTdGF0ZS5oIGIvaW5jbHVkZS9wcml2YXRlL2d1aS9MYXllclN0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMjc3ZTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wcml2YXRlL2d1aS9MYXllclN0YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NGX0xBWUVSX1NUQVRFX0gKLSNkZWZpbmUgQU5EUk9JRF9TRl9MQVlFUl9TVEFURV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSA8dWkvUmVnaW9uLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgUGFyY2VsOwotY2xhc3MgSVN1cmZhY2VDb21wb3NlckNsaWVudDsKLQotc3RydWN0IGxheWVyX3N0YXRlX3QgewotCi0gICAgbGF5ZXJfc3RhdGVfdCgpCi0gICAgICAgIDogICBzdXJmYWNlKDApLCB3aGF0KDApLAotICAgICAgICAgICAgeCgwKSwgeSgwKSwgeigwKSwgdygwKSwgaCgwKSwKLSAgICAgICAgICAgIGFscGhhKDApLCB0aW50KDApLCBmbGFncygwKSwgbWFzaygwKSwKLSAgICAgICAgICAgIHJlc2VydmVkKDApCi0gICAgewotICAgICAgICBtYXRyaXguZHNkeCA9IG1hdHJpeC5kdGR5ID0gMS4wZjsKLSAgICAgICAgbWF0cml4LmRzZHkgPSBtYXRyaXguZHRkeCA9IDAuMGY7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgICAgd3JpdGUoUGFyY2VsJiBvdXRwdXQpIGNvbnN0OwotICAgIHN0YXR1c190ICAgIHJlYWQoY29uc3QgUGFyY2VsJiBpbnB1dCk7Ci0KLSAgICAgICAgICAgIHN0cnVjdCBtYXRyaXgyMl90IHsKLSAgICAgICAgICAgICAgICBmbG9hdCAgIGRzZHg7Ci0gICAgICAgICAgICAgICAgZmxvYXQgICBkdGR4OwotICAgICAgICAgICAgICAgIGZsb2F0ICAgZHNkeTsKLSAgICAgICAgICAgICAgICBmbG9hdCAgIGR0ZHk7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgU3VyZmFjZUlEICAgICAgIHN1cmZhY2U7Ci0gICAgICAgICAgICB1aW50MzJfdCAgICAgICAgd2hhdDsKLSAgICAgICAgICAgIGZsb2F0ICAgICAgICAgICB4OwotICAgICAgICAgICAgZmxvYXQgICAgICAgICAgIHk7Ci0gICAgICAgICAgICB1aW50MzJfdCAgICAgICAgejsKLSAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB3OwotICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGg7Ci0gICAgICAgICAgICBmbG9hdCAgICAgICAgICAgYWxwaGE7Ci0gICAgICAgICAgICB1aW50MzJfdCAgICAgICAgdGludDsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICBmbGFnczsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICBtYXNrOwotICAgICAgICAgICAgdWludDhfdCAgICAgICAgIHJlc2VydmVkOwotICAgICAgICAgICAgbWF0cml4MjJfdCAgICAgIG1hdHJpeDsKLSAgICAgICAgICAgIC8vIG5vbiBQT0QgbXVzdCBiZSBsYXN0LiBzZWUgd3JpdGUvcmVhZAotICAgICAgICAgICAgUmVnaW9uICAgICAgICAgIHRyYW5zcGFyZW50UmVnaW9uOwotfTsKLQotc3RydWN0IENvbXBvc2VyU3RhdGUgewotICAgIHNwPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNsaWVudDsKLSAgICBsYXllcl9zdGF0ZV90IHN0YXRlOwotICAgIHN0YXR1c190ICAgIHdyaXRlKFBhcmNlbCYgb3V0cHV0KSBjb25zdDsKLSAgICBzdGF0dXNfdCAgICByZWFkKGNvbnN0IFBhcmNlbCYgaW5wdXQpOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfU0ZfTEFZRVJfU1RBVEVfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvZ3VpL1NoYXJlZEJ1ZmZlclN0YWNrLmggYi9pbmNsdWRlL3ByaXZhdGUvZ3VpL1NoYXJlZEJ1ZmZlclN0YWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTAzZDEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wcml2YXRlL2d1aS9TaGFyZWRCdWZmZXJTdGFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TRl9TSEFSRURfQlVGRkVSX1NUQUNLX0gKLSNkZWZpbmUgQU5EUk9JRF9TRl9TSEFSRURfQlVGRkVSX1NUQUNLX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgTlVNX0RJU1BMQVlfTUFYIDQKLQotc3RydWN0IGRpc3BsYXlfY2Jsa190Ci17Ci0gICAgdWludDE2X3QgICAgdzsKLSAgICB1aW50MTZfdCAgICBoOwotICAgIHVpbnQ4X3QgICAgIGZvcm1hdDsKLSAgICB1aW50OF90ICAgICBvcmllbnRhdGlvbjsKLSAgICB1aW50OF90ICAgICByZXNlcnZlZFsyXTsKLSAgICBmbG9hdCAgICAgICBmcHM7Ci0gICAgZmxvYXQgICAgICAgZGVuc2l0eTsKLSAgICBmbG9hdCAgICAgICB4ZHBpOwotICAgIGZsb2F0ICAgICAgIHlkcGk7Ci0gICAgdWludDMyX3QgICAgcGFkWzJdOwotfTsKLQotc3RydWN0IHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QgICAvLyA0S0IgbWF4Ci17Ci0gICAgdWludDhfdCAgICAgICAgIGNvbm5lY3RlZDsKLSAgICB1aW50OF90ICAgICAgICAgcmVzZXJ2ZWRbM107Ci0gICAgdWludDMyX3QgICAgICAgIHBhZFs3XTsKLSAgICBkaXNwbGF5X2NibGtfdCAgZGlzcGxheXNbTlVNX0RJU1BMQVlfTUFYXTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DT01QSUxFX1RJTUVfQVNTRVJUKHNpemVvZihzdXJmYWNlX2ZsaW5nZXJfY2Jsa190KSA8PSA0MDk2KQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvKiBBTkRST0lEX1NGX1NIQVJFRF9CVUZGRVJfU1RBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL3VpL1JlZ2lvbkhlbHBlci5oIGIvaW5jbHVkZS9wcml2YXRlL3VpL1JlZ2lvbkhlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDc2NTMzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcHJpdmF0ZS91aS9SZWdpb25IZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1VJX1BSSVZBVEVfUkVHSU9OX0hFTFBFUl9ICi0jZGVmaW5lIEFORFJPSURfVUlfUFJJVkFURV9SRUdJT05fSEVMUEVSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFJFQ1Q+Ci1jbGFzcyByZWdpb25fb3BlcmF0b3IKLXsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFJFQ1Q6OnZhbHVlX3R5cGUgVFlQRTsgICAgCi0gICAgc3RhdGljIGNvbnN0IFRZUEUgbWF4X3ZhbHVlID0gMHg3RkZGRkZGOwotCi1wdWJsaWM6Ci0gICAgLyogCi0gICAgICogQ29tbW9uIGJvb2xlYW4gb3BlcmF0aW9uczoKLSAgICAgKiB2YWx1ZSBpcyBjb21wdXRlZCBhcyAwYjEwMSBvcCAwYjExMAotICAgICAqICAgIG90aGVyIGJvb2xlYW4gb3BlcmF0aW9uIGFyZSBwb3NzaWJsZSwgc2ltcGx5IGNvbXB1dGUKLSAgICAgKiAgICB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlIHdpdGggdGhlIGFib3ZlIGZvcm11bGFlIGFuZCB1c2UKLSAgICAgKiAgICBpdCB3aGVuIGluc3RhbnRpYXRpbmcgYSByZWdpb25fb3BlcmF0b3IuCi0gICAgICovCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IExIUyA9IDB4NTsgIC8vIDBiMTAxCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFJIUyA9IDB4NjsgIC8vIDBiMTEwCi0gICAgZW51bSB7Ci0gICAgICAgIG9wX25hbmQgPSBMSFMgJiB+UkhTLAotICAgICAgICBvcF9hbmQgID0gTEhTICYgIFJIUywKLSAgICAgICAgb3Bfb3IgICA9IExIUyB8ICBSSFMsCi0gICAgICAgIG9wX3hvciAgPSBMSFMgXiAgUkhTCi0gICAgfTsKLQotICAgIHN0cnVjdCByZWdpb24gewotICAgICAgICBSRUNUIGNvbnN0KiByZWN0czsKLSAgICAgICAgc2l6ZV90IGNvdW50OwotICAgICAgICBUWVBFIGR4OwotICAgICAgICBUWVBFIGR5OwotICAgICAgICBpbmxpbmUgcmVnaW9uKGNvbnN0IHJlZ2lvbiYgcmhzKSAKLSAgICAgICAgICAgIDogcmVjdHMocmhzLnJlY3RzKSwgY291bnQocmhzLmNvdW50KSwgZHgocmhzLmR4KSwgZHkocmhzLmR5KSB7IH0KLSAgICAgICAgaW5saW5lIHJlZ2lvbihSRUNUIGNvbnN0KiByLCBzaXplX3QgYykgCi0gICAgICAgICAgICA6IHJlY3RzKHIpLCBjb3VudChjKSwgZHgoKSwgZHkoKSB7IH0KLSAgICAgICAgaW5saW5lIHJlZ2lvbihSRUNUIGNvbnN0KiByLCBzaXplX3QgYywgVFlQRSBkeCwgVFlQRSBkeSkgCi0gICAgICAgICAgICA6IHJlY3RzKHIpLCBjb3VudChjKSwgZHgoZHgpLCBkeShkeSkgeyB9Ci0gICAgfTsKLQotICAgIGNsYXNzIHJlZ2lvbl9yYXN0ZXJpemVyIHsKLSAgICAgICAgZnJpZW5kIGNsYXNzIHJlZ2lvbl9vcGVyYXRvcjsKLSAgICAgICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUkVDVCYgcmVjdCkgPSAwOwotICAgIHB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB+cmVnaW9uX3Jhc3Rlcml6ZXIoKSB7IH07Ci0gICAgfTsKLSAgICAKLSAgICBpbmxpbmUgcmVnaW9uX29wZXJhdG9yKGludCBvcCwgY29uc3QgcmVnaW9uJiBsaHMsIGNvbnN0IHJlZ2lvbiYgcmhzKSAKLSAgICAgICAgOiBvcF9tYXNrKG9wKSwgc3Bhbm5lcihsaHMsIHJocykgCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgb3BlcmF0b3IoKShyZWdpb25fcmFzdGVyaXplciYgcmFzdGVyaXplcikgewotICAgICAgICBSRUNUIGN1cnJlbnQ7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIFNwYW5uZXJJbm5lciBzcGFubmVySW5uZXIoc3Bhbm5lci5saHMsIHNwYW5uZXIucmhzKTsKLSAgICAgICAgICAgIGludCBpbnNpZGUgPSBzcGFubmVyLm5leHQoY3VycmVudC50b3AsIGN1cnJlbnQuYm90dG9tKTsKLSAgICAgICAgICAgIHNwYW5uZXJJbm5lci5wcmVwYXJlKGluc2lkZSk7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgVFlQRSBsZWZ0LCByaWdodDsKLSAgICAgICAgICAgICAgICBpbnQgaW5zaWRlID0gc3Bhbm5lcklubmVyLm5leHQoY3VycmVudC5sZWZ0LCBjdXJyZW50LnJpZ2h0KTsKLSAgICAgICAgICAgICAgICBpZiAoKG9wX21hc2sgPj4gaW5zaWRlKSAmIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQubGVmdCA8IGN1cnJlbnQucmlnaHQgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50b3AgPCBjdXJyZW50LmJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyaXplcihjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUoIXNwYW5uZXJJbm5lci5pc0RvbmUoKSk7Ci0gICAgICAgIH0gd2hpbGUoIXNwYW5uZXIuaXNEb25lKCkpOwotICAgIH0KLQotcHJpdmF0ZTogICAgCi0gICAgdWludDMyX3Qgb3BfbWFzazsKLQotICAgIGNsYXNzIFNwYW5uZXJCYXNlCi0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBsaHNfYmVmb3JlX3JocyAgID0gMCwKLSAgICAgICAgICAgIGxoc19hZnRlcl9yaHMgICAgPSAxLAotICAgICAgICAgICAgbGhzX2NvaW5jaWRlX3JocyA9IDIKLSAgICAgICAgfTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgVFlQRSBsaHNfaGVhZDsKLSAgICAgICAgVFlQRSBsaHNfdGFpbDsKLSAgICAgICAgVFlQRSByaHNfaGVhZDsKLSAgICAgICAgVFlQRSByaHNfdGFpbDsKLQotICAgICAgICBpbmxpbmUgaW50IG5leHQoVFlQRSYgaGVhZCwgVFlQRSYgdGFpbCwKLSAgICAgICAgICAgICAgICBib29sJiBtb3JlX2xocywgYm9vbCYgbW9yZV9yaHMpIAotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaW5zaWRlOwotICAgICAgICAgICAgbW9yZV9saHMgPSBmYWxzZTsKLSAgICAgICAgICAgIG1vcmVfcmhzID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobGhzX2hlYWQgPCByaHNfaGVhZCkgewotICAgICAgICAgICAgICAgIGluc2lkZSA9IGxoc19iZWZvcmVfcmhzOwotICAgICAgICAgICAgICAgIGhlYWQgPSBsaHNfaGVhZDsKLSAgICAgICAgICAgICAgICBpZiAobGhzX3RhaWwgPD0gcmhzX2hlYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFpbCA9IGxoc190YWlsOwotICAgICAgICAgICAgICAgICAgICBtb3JlX2xocyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGhzX2hlYWQgPSByaHNfaGVhZDsKLSAgICAgICAgICAgICAgICAgICAgdGFpbCA9IHJoc19oZWFkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmhzX2hlYWQgPCBsaHNfaGVhZCkgewotICAgICAgICAgICAgICAgIGluc2lkZSA9IGxoc19hZnRlcl9yaHM7Ci0gICAgICAgICAgICAgICAgaGVhZCA9IHJoc19oZWFkOwotICAgICAgICAgICAgICAgIGlmIChyaHNfdGFpbCA8PSBsaHNfaGVhZCkgewotICAgICAgICAgICAgICAgICAgICB0YWlsID0gcmhzX3RhaWw7Ci0gICAgICAgICAgICAgICAgICAgIG1vcmVfcmhzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByaHNfaGVhZCA9IGxoc19oZWFkOwotICAgICAgICAgICAgICAgICAgICB0YWlsID0gbGhzX2hlYWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnNpZGUgPSBsaHNfY29pbmNpZGVfcmhzOwotICAgICAgICAgICAgICAgIGhlYWQgPSBsaHNfaGVhZDsKLSAgICAgICAgICAgICAgICBpZiAobGhzX3RhaWwgPD0gcmhzX3RhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFpbCA9IHJoc19oZWFkID0gbGhzX3RhaWw7Ci0gICAgICAgICAgICAgICAgICAgIG1vcmVfbGhzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJoc190YWlsIDw9IGxoc190YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhaWwgPSBsaHNfaGVhZCA9IHJoc190YWlsOwotICAgICAgICAgICAgICAgICAgICBtb3JlX3JocyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluc2lkZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBjbGFzcyBTcGFubmVyIDogcHJvdGVjdGVkIFNwYW5uZXJCYXNlIAotICAgIHsKLSAgICAgICAgZnJpZW5kIGNsYXNzIHJlZ2lvbl9vcGVyYXRvcjsKLSAgICAgICAgcmVnaW9uIGxoczsKLSAgICAgICAgcmVnaW9uIHJoczsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgaW5saW5lIFNwYW5uZXIoY29uc3QgcmVnaW9uJiBsaHMsIGNvbnN0IHJlZ2lvbiYgcmhzKQotICAgICAgICAgICAgOiBsaHMobGhzKSwgcmhzKHJocykgCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpsaHNfaGVhZCA9IGxocy5yZWN0cy0+dG9wICAgICAgKyBsaHMuZHk7Ci0gICAgICAgICAgICBTcGFubmVyQmFzZTo6bGhzX3RhaWwgPSBsaHMucmVjdHMtPmJvdHRvbSAgICsgbGhzLmR5OwotICAgICAgICAgICAgU3Bhbm5lckJhc2U6OnJoc19oZWFkID0gcmhzLnJlY3RzLT50b3AgICAgICArIHJocy5keTsKLSAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpyaHNfdGFpbCA9IHJocy5yZWN0cy0+Ym90dG9tICAgKyByaHMuZHk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgYm9vbCBpc0RvbmUoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gIXJocy5jb3VudCAmJiAhbGhzLmNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIGludCBuZXh0KFRZUEUmIHRvcCwgVFlQRSYgYm90dG9tKSAKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbCBtb3JlX2xocyA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCBtb3JlX3JocyA9IGZhbHNlOwotICAgICAgICAgICAgaW50IGluc2lkZSA9IFNwYW5uZXJCYXNlOjpuZXh0KHRvcCwgYm90dG9tLCBtb3JlX2xocywgbW9yZV9yaHMpOwotICAgICAgICAgICAgaWYgKG1vcmVfbGhzKSB7Ci0gICAgICAgICAgICAgICAgYWR2YW5jZShsaHMsIFNwYW5uZXJCYXNlOjpsaHNfaGVhZCwgU3Bhbm5lckJhc2U6Omxoc190YWlsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtb3JlX3JocykgewotICAgICAgICAgICAgICAgIGFkdmFuY2UocmhzLCBTcGFubmVyQmFzZTo6cmhzX2hlYWQsIFNwYW5uZXJCYXNlOjpyaHNfdGFpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5zaWRlOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgaW5saW5lIAotICAgICAgICB2b2lkIGFkdmFuY2UocmVnaW9uJiByZWcsIFRZUEUmIGFUb3AsIFRZUEUmIGFCb3R0b20pIHsKLSAgICAgICAgICAgIC8vIGdvdCB0byBuZXh0IHNwYW4KLSAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IHJlZy5jb3VudDsKLSAgICAgICAgICAgIFJFQ1QgY29uc3QgKiByZWN0cyA9IHJlZy5yZWN0czsKLSAgICAgICAgICAgIFJFQ1QgY29uc3QgKiBjb25zdCBlbmQgPSByZWN0cyArIGNvdW50OwotICAgICAgICAgICAgY29uc3QgaW50IHRvcCA9IHJlY3RzLT50b3A7Ci0gICAgICAgICAgICB3aGlsZSAocmVjdHMgIT0gZW5kICYmIHJlY3RzLT50b3AgPT0gdG9wKSB7Ci0gICAgICAgICAgICAgICAgcmVjdHMrKzsKLSAgICAgICAgICAgICAgICBjb3VudC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlY3RzICE9IGVuZCkgewotICAgICAgICAgICAgICAgIGFUb3AgICAgPSByZWN0cy0+dG9wICAgICsgcmVnLmR5OwotICAgICAgICAgICAgICAgIGFCb3R0b20gPSByZWN0cy0+Ym90dG9tICsgcmVnLmR5OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhVG9wICAgID0gbWF4X3ZhbHVlOwotICAgICAgICAgICAgICAgIGFCb3R0b20gPSBtYXhfdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWcucmVjdHMgPSByZWN0czsKLSAgICAgICAgICAgIHJlZy5jb3VudCA9IGNvdW50OwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIGNsYXNzIFNwYW5uZXJJbm5lciA6IHByb3RlY3RlZCBTcGFubmVyQmFzZSAKLSAgICB7Ci0gICAgICAgIHJlZ2lvbiBsaHM7Ci0gICAgICAgIHJlZ2lvbiByaHM7Ci0gICAgICAgIAotICAgIHB1YmxpYzoKLSAgICAgICAgaW5saW5lIFNwYW5uZXJJbm5lcihjb25zdCByZWdpb24mIGxocywgY29uc3QgcmVnaW9uJiByaHMpCi0gICAgICAgICAgICA6IGxocyhsaHMpLCByaHMocmhzKSAKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIHZvaWQgcHJlcGFyZShpbnQgaW5zaWRlKSB7Ci0gICAgICAgICAgICBpZiAoaW5zaWRlID09IFNwYW5uZXJCYXNlOjpsaHNfYmVmb3JlX3JocykgewotICAgICAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpsaHNfaGVhZCA9IGxocy5yZWN0cy0+bGVmdCAgKyBsaHMuZHg7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lckJhc2U6Omxoc190YWlsID0gbGhzLnJlY3RzLT5yaWdodCArIGxocy5keDsKLSAgICAgICAgICAgICAgICBTcGFubmVyQmFzZTo6cmhzX2hlYWQgPSBtYXhfdmFsdWU7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lckJhc2U6OnJoc190YWlsID0gbWF4X3ZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpbnNpZGUgPT0gU3Bhbm5lckJhc2U6Omxoc19hZnRlcl9yaHMpIHsKLSAgICAgICAgICAgICAgICBTcGFubmVyQmFzZTo6bGhzX2hlYWQgPSBtYXhfdmFsdWU7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lckJhc2U6Omxoc190YWlsID0gbWF4X3ZhbHVlOwotICAgICAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpyaHNfaGVhZCA9IHJocy5yZWN0cy0+bGVmdCAgKyByaHMuZHg7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lckJhc2U6OnJoc190YWlsID0gcmhzLnJlY3RzLT5yaWdodCArIHJocy5keDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lckJhc2U6Omxoc19oZWFkID0gbGhzLnJlY3RzLT5sZWZ0ICArIGxocy5keDsKLSAgICAgICAgICAgICAgICBTcGFubmVyQmFzZTo6bGhzX3RhaWwgPSBsaHMucmVjdHMtPnJpZ2h0ICsgbGhzLmR4OwotICAgICAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpyaHNfaGVhZCA9IHJocy5yZWN0cy0+bGVmdCAgKyByaHMuZHg7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lckJhc2U6OnJoc190YWlsID0gcmhzLnJlY3RzLT5yaWdodCArIHJocy5keDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBib29sIGlzRG9uZSgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBTcGFubmVyQmFzZTo6bGhzX2hlYWQgPT0gbWF4X3ZhbHVlICYmIAotICAgICAgICAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpyaHNfaGVhZCA9PSBtYXhfdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgaW50IG5leHQoVFlQRSYgbGVmdCwgVFlQRSYgcmlnaHQpIAotICAgICAgICB7Ci0gICAgICAgICAgICBib29sIG1vcmVfbGhzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIG1vcmVfcmhzID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgaW5zaWRlID0gU3Bhbm5lckJhc2U6Om5leHQobGVmdCwgcmlnaHQsIG1vcmVfbGhzLCBtb3JlX3Jocyk7Ci0gICAgICAgICAgICBpZiAobW9yZV9saHMpIHsKLSAgICAgICAgICAgICAgICBhZHZhbmNlKGxocywgU3Bhbm5lckJhc2U6Omxoc19oZWFkLCBTcGFubmVyQmFzZTo6bGhzX3RhaWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1vcmVfcmhzKSB7Ci0gICAgICAgICAgICAgICAgYWR2YW5jZShyaHMsIFNwYW5uZXJCYXNlOjpyaHNfaGVhZCwgU3Bhbm5lckJhc2U6OnJoc190YWlsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbnNpZGU7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHN0YXRpYyBpbmxpbmUgCi0gICAgICAgIHZvaWQgYWR2YW5jZShyZWdpb24mIHJlZywgVFlQRSYgbGVmdCwgVFlQRSYgcmlnaHQpIHsKLSAgICAgICAgICAgIGlmIChyZWcucmVjdHMgJiYgcmVnLmNvdW50KSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGN1cl9zcGFuX3RvcCA9IHJlZy5yZWN0cy0+dG9wOwotICAgICAgICAgICAgICAgIHJlZy5yZWN0cysrOwotICAgICAgICAgICAgICAgIHJlZy5jb3VudC0tOwotICAgICAgICAgICAgICAgIGlmICghcmVnLmNvdW50IHx8IHJlZy5yZWN0cy0+dG9wICE9IGN1cl9zcGFuX3RvcCkgewotICAgICAgICAgICAgICAgICAgICBsZWZ0ICA9IG1heF92YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBtYXhfdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCAgPSByZWcucmVjdHMtPmxlZnQgICsgcmVnLmR4OwotICAgICAgICAgICAgICAgICAgICByaWdodCA9IHJlZy5yZWN0cy0+cmlnaHQgKyByZWcuZHg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIFNwYW5uZXIgc3Bhbm5lcjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07Ci0KLSNlbmRpZiAvKiBBTkRST0lEX1VJX1BSSVZBVEVfUkVHSU9OX0hFTFBFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvdXRpbHMvU3RhdGljLmggYi9pbmNsdWRlL3ByaXZhdGUvdXRpbHMvU3RhdGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NWFlMGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wcml2YXRlL3V0aWxzL1N0YXRpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEFsbCBzdGF0aWMgdmFyaWFibGVzIGdvIGhlcmUsIHRvIGNvbnRyb2wgaW5pdGlhbGl6YXRpb24gYW5kCi0vLyBkZXN0cnVjdGlvbiBvcmRlciBpbiB0aGUgbGlicmFyeS4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyBGb3IgVGV4dFN0cmVhbS5jcHAKLWV4dGVybiBWZWN0b3I8aW50MzJfdD4gZ1RleHRCdWZmZXJzOwotCi0vLyBGb3IgU3RyaW5nOC5jcHAKLWV4dGVybiB2b2lkIGluaXRpYWxpemVfc3RyaW5nOCgpOwotZXh0ZXJuIHZvaWQgdGVybWluYXRlX3N0cmluZzgoKTsKLQotLy8gRm9yIFN0cmluZzE2LmNwcAotZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9zdHJpbmcxNigpOwotZXh0ZXJuIHZvaWQgdGVybWluYXRlX3N0cmluZzE2KCk7Ci0KLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9BTmF0aXZlT2JqZWN0QmFzZS5oIGIvaW5jbHVkZS91aS9BTmF0aXZlT2JqZWN0QmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4NTBmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWkvQU5hdGl2ZU9iamVjdEJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0FORFJPSURfTkFUSVZFU19ICi0jZGVmaW5lIEFORFJPSURfQU5EUk9JRF9OQVRJVkVTX0gKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgotI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qIEZJWE1FOiB0aGlzIGlzIGxlZ2FjeSBmb3IgcGl4bWFwcyAqLwotdHlwZWRlZiBzdHJ1Y3QgZWdsX25hdGl2ZV9waXhtYXBfdAotewotICAgIGludDMyX3QgICAgIHZlcnNpb247ICAgIC8qIG11c3QgYmUgMzIgKi8KLSAgICBpbnQzMl90ICAgICB3aWR0aDsKLSAgICBpbnQzMl90ICAgICBoZWlnaHQ7Ci0gICAgaW50MzJfdCAgICAgc3RyaWRlOwotICAgIHVpbnQ4X3QqICAgIGRhdGE7Ci0gICAgdWludDhfdCAgICAgZm9ybWF0OwotICAgIHVpbnQ4X3QgICAgIHJmdVszXTsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHVpbnQzMl90ICAgIGNvbXByZXNzZWRGb3JtYXQ7Ci0gICAgICAgIGludDMyX3QgICAgIHZzdHJpZGU7Ci0gICAgfTsKLSAgICBpbnQzMl90ICAgICByZXNlcnZlZDsKLX0gZWdsX25hdGl2ZV9waXhtYXBfdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKgotICogVGhpcyBoZWxwZXIgY2xhc3MgdHVybnMgYSBBTmF0aXZlWFhYIG9iamVjdCB0eXBlIGludG8gYSBDKysKLSAqIHJlZmVyZW5jZS1jb3VudGVkIG9iamVjdDsgd2l0aCBwcm9wZXIgdHlwZSBjb252ZXJzaW9ucy4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIE5BVElWRV9UWVBFLCB0eXBlbmFtZSBUWVBFLCB0eXBlbmFtZSBSRUY+Ci1jbGFzcyBBTmF0aXZlT2JqZWN0QmFzZSA6IHB1YmxpYyBOQVRJVkVfVFlQRSwgcHVibGljIFJFRgotewotcHVibGljOgotICAgIC8vIERpc2FtYmlndWF0ZSBiZXR3ZWVuIHRoZSBpbmNTdHJvbmcgaW4gUkVGIGFuZCBOQVRJVkVfVFlQRQotICAgIHZvaWQgaW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7Ci0gICAgICAgIFJFRjo6aW5jU3Ryb25nKGlkKTsKLSAgICB9Ci0gICAgdm9pZCBkZWNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0IHsKLSAgICAgICAgUkVGOjpkZWNTdHJvbmcoaWQpOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHR5cGVkZWYgQU5hdGl2ZU9iamVjdEJhc2U8TkFUSVZFX1RZUEUsIFRZUEUsIFJFRj4gQkFTRTsKLSAgICBBTmF0aXZlT2JqZWN0QmFzZSgpIDogTkFUSVZFX1RZUEUoKSwgUkVGKCkgewotICAgICAgICBOQVRJVkVfVFlQRTo6Y29tbW9uLmluY1JlZiA9IGluY1JlZjsKLSAgICAgICAgTkFUSVZFX1RZUEU6OmNvbW1vbi5kZWNSZWYgPSBkZWNSZWY7Ci0gICAgfQotICAgIHN0YXRpYyBpbmxpbmUgVFlQRSogZ2V0U2VsZihOQVRJVkVfVFlQRSogc2VsZikgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VFlQRSo+KHNlbGYpOwotICAgIH0KLSAgICBzdGF0aWMgaW5saW5lIFRZUEUgY29uc3QqIGdldFNlbGYoTkFUSVZFX1RZUEUgY29uc3QqIHNlbGYpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRZUEUgY29uc3QgKj4oc2VsZik7Ci0gICAgfQotICAgIHN0YXRpYyBpbmxpbmUgVFlQRSogZ2V0U2VsZihhbmRyb2lkX25hdGl2ZV9iYXNlX3QqIGJhc2UpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlbGYocmVpbnRlcnByZXRfY2FzdDxOQVRJVkVfVFlQRSo+KGJhc2UpKTsKLSAgICB9Ci0gICAgc3RhdGljIGlubGluZSBUWVBFIGNvbnN0ICogZ2V0U2VsZihhbmRyb2lkX25hdGl2ZV9iYXNlX3QgY29uc3QqIGJhc2UpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlbGYocmVpbnRlcnByZXRfY2FzdDxOQVRJVkVfVFlQRSBjb25zdCo+KGJhc2UpKTsKLSAgICB9Ci0gICAgc3RhdGljIHZvaWQgaW5jUmVmKGFuZHJvaWRfbmF0aXZlX2Jhc2VfdCogYmFzZSkgewotICAgICAgICBBTmF0aXZlT2JqZWN0QmFzZSogc2VsZiA9IGdldFNlbGYoYmFzZSk7Ci0gICAgICAgIHNlbGYtPmluY1N0cm9uZyhzZWxmKTsKLSAgICB9Ci0gICAgc3RhdGljIHZvaWQgZGVjUmVmKGFuZHJvaWRfbmF0aXZlX2Jhc2VfdCogYmFzZSkgewotICAgICAgICBBTmF0aXZlT2JqZWN0QmFzZSogc2VsZiA9IGdldFNlbGYoYmFzZSk7Ci0gICAgICAgIHNlbGYtPmRlY1N0cm9uZyhzZWxmKTsKLSAgICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0jZW5kaWYgLy8gX19jcGx1c3BsdXMKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZW5kaWYgLyogQU5EUk9JRF9BTkRST0lEX05BVElWRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9EaXNwbGF5SW5mby5oIGIvaW5jbHVkZS91aS9EaXNwbGF5SW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQyOGE2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWkvRGlzcGxheUluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgQU5EUk9JRF9VSV9ESVNQTEFZX0lORk9fSAotI2RlZmluZSBBTkRST0lEX1VJX0RJU1BMQVlfSU5GT19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IERpc3BsYXlJbmZvIHsKLSAgICB1aW50MzJfdCAgICAgICAgICAgIHc7Ci0gICAgdWludDMyX3QgICAgICAgICAgICBoOwotICAgIFBpeGVsRm9ybWF0SW5mbyAgICAgcGl4ZWxGb3JtYXRJbmZvOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgb3JpZW50YXRpb247Ci0gICAgdWludDhfdCAgICAgICAgICAgICByZXNlcnZlZFszXTsKLSAgICBmbG9hdCAgICAgICAgICAgICAgIGZwczsKLSAgICBmbG9hdCAgICAgICAgICAgICAgIGRlbnNpdHk7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICB4ZHBpOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgeWRwaTsKLX07Ci0KLS8qIERpc3BsYXkgb3JpZW50YXRpb25zIGFzIGRlZmluZWQgaW4gU3VyZmFjZS5qYXZhIGFuZCBJU3VyZmFjZUNvbXBvc2VyLmguICovCi1lbnVtIHsKLSAgICBESVNQTEFZX09SSUVOVEFUSU9OXzAgPSAwLAotICAgIERJU1BMQVlfT1JJRU5UQVRJT05fOTAgPSAxLAotICAgIERJU1BMQVlfT1JJRU5UQVRJT05fMTgwID0gMiwKLSAgICBESVNQTEFZX09SSUVOVEFUSU9OXzI3MCA9IDMKLX07Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfQ09NUE9TRVJfRElTUExBWV9JTkZPX0gKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oIGIvaW5jbHVkZS91aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjAyYjk1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRlJBTUVCVUZGRVJfTkFUSVZFX1dJTkRPV19ICi0jZGVmaW5lIEFORFJPSURfRlJBTUVCVUZGRVJfTkFUSVZFX1dJTkRPV19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDx1aS9BTmF0aXZlT2JqZWN0QmFzZS5oPgotI2luY2x1ZGUgPHVpL1JlY3QuaD4KLQotI2RlZmluZSBOVU1fRlJBTUVfQlVGRkVSUyAgMgotCi1leHRlcm4gIkMiIEVHTE5hdGl2ZVdpbmRvd1R5cGUgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSh2b2lkKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU3VyZmFjZTsKLWNsYXNzIE5hdGl2ZUJ1ZmZlcjsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEZyYW1lYnVmZmVyTmF0aXZlV2luZG93IAotICAgIDogcHVibGljIEFOYXRpdmVPYmplY3RCYXNlPAotICAgICAgICBBTmF0aXZlV2luZG93LCAKLSAgICAgICAgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3csIAotICAgICAgICBMaWdodFJlZkJhc2U8RnJhbWVidWZmZXJOYXRpdmVXaW5kb3c+ID4KLXsKLXB1YmxpYzoKLSAgICBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdygpOyAKLQotICAgIGZyYW1lYnVmZmVyX2RldmljZV90IGNvbnN0ICogZ2V0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gZmJEZXY7IH0gCi0KLSAgICBib29sIGlzVXBkYXRlT25EZW1hbmQoKSBjb25zdCB7IHJldHVybiBtVXBkYXRlT25EZW1hbmQ7IH0KLSAgICBzdGF0dXNfdCBzZXRVcGRhdGVSZWN0YW5nbGUoY29uc3QgUmVjdCYgdXBkYXRlUmVjdCk7Ci0gICAgc3RhdHVzX3QgY29tcG9zaXRpb25Db21wbGV0ZSgpOwotCi0gICAgdm9pZCBkdW1wKFN0cmluZzgmIHJlc3VsdCk7Ci0KLSAgICAvLyBmb3IgZGVidWdnaW5nIG9ubHkKLSAgICBpbnQgZ2V0Q3VycmVudEJ1ZmZlckluZGV4KCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIExpZ2h0UmVmQmFzZTxGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdz47ICAgIAotICAgIH5GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdygpOyAvLyB0aGlzIGNsYXNzIGNhbm5vdCBiZSBvdmVybG9hZGVkCi0gICAgc3RhdGljIGludCBzZXRTd2FwSW50ZXJ2YWwoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBpbnQgaW50ZXJ2YWwpOwotICAgIHN0YXRpYyBpbnQgZGVxdWV1ZUJ1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csIEFOYXRpdmVXaW5kb3dCdWZmZXIqKiBidWZmZXIpOwotICAgIHN0YXRpYyBpbnQgbG9ja0J1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgc3RhdGljIGludCBxdWV1ZUJ1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgc3RhdGljIGludCBxdWVyeShjb25zdCBBTmF0aXZlV2luZG93KiB3aW5kb3csIGludCB3aGF0LCBpbnQqIHZhbHVlKTsKLSAgICBzdGF0aWMgaW50IHBlcmZvcm0oQU5hdGl2ZVdpbmRvdyogd2luZG93LCBpbnQgb3BlcmF0aW9uLCAuLi4pOwotICAgIAotICAgIGZyYW1lYnVmZmVyX2RldmljZV90KiBmYkRldjsKLSAgICBhbGxvY19kZXZpY2VfdCogZ3JEZXY7Ci0KLSAgICBzcDxOYXRpdmVCdWZmZXI+IGJ1ZmZlcnNbTlVNX0ZSQU1FX0JVRkZFUlNdOwotICAgIHNwPE5hdGl2ZUJ1ZmZlcj4gZnJvbnQ7Ci0gICAgCi0gICAgbXV0YWJsZSBNdXRleCBtdXRleDsKLSAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKLSAgICBpbnQzMl90IG1OdW1CdWZmZXJzOwotICAgIGludDMyX3QgbU51bUZyZWVCdWZmZXJzOwotICAgIGludDMyX3QgbUJ1ZmZlckhlYWQ7Ci0gICAgaW50MzJfdCBtQ3VycmVudEJ1ZmZlckluZGV4OwotICAgIGJvb2wgbVVwZGF0ZU9uRGVtYW5kOwotfTsKLSAgICAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9GUkFNRUJVRkZFUl9OQVRJVkVfV0lORE9XX0gKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9HcmFwaGljQnVmZmVyLmggYi9pbmNsdWRlL3VpL0dyYXBoaWNCdWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxOGNkOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VpL0dyYXBoaWNCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dSQVBISUNfQlVGRkVSX0gKLSNkZWZpbmUgQU5EUk9JRF9HUkFQSElDX0JVRkZFUl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHVpL0FOYXRpdmVPYmplY3RCYXNlLmg+Ci0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLSNpbmNsdWRlIDx1aS9SZWN0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvRmxhdHRlbmFibGUuaD4KLQotCi1zdHJ1Y3QgQU5hdGl2ZVdpbmRvd0J1ZmZlcjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBHcmFwaGljQnVmZmVyTWFwcGVyOwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEdyYXBoaWNCdWZmZXIKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBHcmFwaGljQnVmZmVyCi0gICAgOiBwdWJsaWMgQU5hdGl2ZU9iamVjdEJhc2U8Ci0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIsCi0gICAgICAgIEdyYXBoaWNCdWZmZXIsIAotICAgICAgICBMaWdodFJlZkJhc2U8R3JhcGhpY0J1ZmZlcj4gPiwgcHVibGljIEZsYXR0ZW5hYmxlCi17Ci1wdWJsaWM6Ci0KLSAgICBlbnVtIHsKLSAgICAgICAgVVNBR0VfU1dfUkVBRF9ORVZFUiAgICAgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIsCi0gICAgICAgIFVTQUdFX1NXX1JFQURfUkFSRUxZICAgID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX1JBUkVMWSwKLSAgICAgICAgVVNBR0VfU1dfUkVBRF9PRlRFTiAgICAgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4sCi0gICAgICAgIFVTQUdFX1NXX1JFQURfTUFTSyAgICAgID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0ssCi0gICAgICAgIAotICAgICAgICBVU0FHRV9TV19XUklURV9ORVZFUiAgICA9IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTkVWRVIsCi0gICAgICAgIFVTQUdFX1NXX1dSSVRFX1JBUkVMWSAgID0gR1JBTExPQ19VU0FHRV9TV19XUklURV9SQVJFTFksCi0gICAgICAgIFVTQUdFX1NXX1dSSVRFX09GVEVOICAgID0gR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKLSAgICAgICAgVVNBR0VfU1dfV1JJVEVfTUFTSyAgICAgPSBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX01BU0ssCi0KLSAgICAgICAgVVNBR0VfU09GVFdBUkVfTUFTSyAgICAgPSBVU0FHRV9TV19SRUFEX01BU0t8VVNBR0VfU1dfV1JJVEVfTUFTSywKLQotICAgICAgICBVU0FHRV9QUk9URUNURUQgICAgICAgICA9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVELAotCi0gICAgICAgIFVTQUdFX0hXX1RFWFRVUkUgICAgICAgID0gR1JBTExPQ19VU0FHRV9IV19URVhUVVJFLAotICAgICAgICBVU0FHRV9IV19SRU5ERVIgICAgICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSLAotICAgICAgICBVU0FHRV9IV18yRCAgICAgICAgICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfMkQsCi0gICAgICAgIFVTQUdFX0hXX0NPTVBPU0VSICAgICAgID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiwKLSAgICAgICAgVVNBR0VfSFdfVklERU9fRU5DT0RFUiAgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCi0gICAgICAgIFVTQUdFX0hXX01BU0sgICAgICAgICAgID0gR1JBTExPQ19VU0FHRV9IV19NQVNLCi0gICAgfTsKLQotICAgIEdyYXBoaWNCdWZmZXIoKTsKLQotICAgIC8vIGNyZWF0ZXMgdyAqIGggYnVmZmVyCi0gICAgR3JhcGhpY0J1ZmZlcih1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKTsKLQotICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBmcm9tIGFuIGV4aXN0aW5nIGhhbmRsZQotICAgIEdyYXBoaWNCdWZmZXIodWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSwgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUsIGJvb2wga2VlcE93bmVyc2hpcCk7Ci0KLSAgICAvLyBjcmVhdGUgYSBidWZmZXIgZnJvbSBhbiBleGlzdGluZyBBTmF0aXZlV2luZG93QnVmZmVyCi0gICAgR3JhcGhpY0J1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGJvb2wga2VlcE93bmVyc2hpcCk7Ci0KLSAgICAvLyByZXR1cm4gc3RhdHVzCi0gICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KLSAgICB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0ICAgICAgICAgICB7IHJldHVybiB3aWR0aDsgfQotICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIGhlaWdodDsgfQotICAgIHVpbnQzMl90IGdldFN0cmlkZSgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIHN0cmlkZTsgfQotICAgIHVpbnQzMl90IGdldFVzYWdlKCkgY29uc3QgICAgICAgICAgIHsgcmV0dXJuIHVzYWdlOyB9Ci0gICAgUGl4ZWxGb3JtYXQgZ2V0UGl4ZWxGb3JtYXQoKSBjb25zdCAgeyByZXR1cm4gZm9ybWF0OyB9Ci0gICAgUmVjdCBnZXRCb3VuZHMoKSBjb25zdCAgICAgICAgICAgICAgeyByZXR1cm4gUmVjdCh3aWR0aCwgaGVpZ2h0KTsgfQotICAgIAotICAgIHN0YXR1c190IHJlYWxsb2NhdGUodWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZiwgdWludDMyX3QgdXNhZ2UpOwotCi0gICAgc3RhdHVzX3QgbG9jayh1aW50MzJfdCB1c2FnZSwgdm9pZCoqIHZhZGRyKTsKLSAgICBzdGF0dXNfdCBsb2NrKHVpbnQzMl90IHVzYWdlLCBjb25zdCBSZWN0JiByZWN0LCB2b2lkKiogdmFkZHIpOwotICAgIHN0YXR1c190IHVubG9jaygpOwotCi0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogZ2V0TmF0aXZlQnVmZmVyKCkgY29uc3Q7Ci0gICAgCi0gICAgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpOwotICAgIGludCBnZXRJbmRleCgpIGNvbnN0OwotCi0gICAgLy8gZm9yIGRlYnVnZ2luZwotICAgIHN0YXRpYyB2b2lkIGR1bXBBbGxvY2F0aW9uc1RvU3lzdGVtTG9nKCk7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCB+R3JhcGhpY0J1ZmZlcigpOwotCi0gICAgZW51bSB7Ci0gICAgICAgIG93bk5vbmUgICA9IDAsCi0gICAgICAgIG93bkhhbmRsZSA9IDEsCi0gICAgICAgIG93bkRhdGEgICA9IDIsCi0gICAgfTsKLQotICAgIGlubGluZSBjb25zdCBHcmFwaGljQnVmZmVyTWFwcGVyJiBnZXRCdWZmZXJNYXBwZXIoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtQnVmZmVyTWFwcGVyOwotICAgIH0KLSAgICBpbmxpbmUgR3JhcGhpY0J1ZmZlck1hcHBlciYgZ2V0QnVmZmVyTWFwcGVyKCkgewotICAgICAgICByZXR1cm4gbUJ1ZmZlck1hcHBlcjsKLSAgICB9Ci0gICAgdWludDhfdCBtT3duZXI7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIFN1cmZhY2U7Ci0gICAgZnJpZW5kIGNsYXNzIEJwU3VyZmFjZTsKLSAgICBmcmllbmQgY2xhc3MgQm5TdXJmYWNlOwotICAgIGZyaWVuZCBjbGFzcyBTdXJmYWNlVGV4dHVyZUNsaWVudDsKLSAgICBmcmllbmQgY2xhc3MgTGlnaHRSZWZCYXNlPEdyYXBoaWNCdWZmZXI+OwotICAgIEdyYXBoaWNCdWZmZXIoY29uc3QgR3JhcGhpY0J1ZmZlciYgcmhzKTsKLSAgICBHcmFwaGljQnVmZmVyJiBvcGVyYXRvciA9IChjb25zdCBHcmFwaGljQnVmZmVyJiByaHMpOwotICAgIGNvbnN0IEdyYXBoaWNCdWZmZXImIG9wZXJhdG9yID0gKGNvbnN0IEdyYXBoaWNCdWZmZXImIHJocykgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBpbml0U2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBQaXhlbEZvcm1hdCBmb3JtYXQsIAotICAgICAgICAgICAgdWludDMyX3QgdXNhZ2UpOwotCi0gICAgdm9pZCBmcmVlX2hhbmRsZSgpOwotCi0gICAgLy8gRmxhdHRlbmFibGUgaW50ZXJmYWNlCi0gICAgc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoKSBjb25zdDsKLSAgICBzaXplX3QgZ2V0RmRDb3VudCgpIGNvbnN0OwotICAgIHN0YXR1c190IGZsYXR0ZW4odm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIGludCBmZHNbXSwgc2l6ZV90IGNvdW50KSBjb25zdDsKLSAgICBzdGF0dXNfdCB1bmZsYXR0ZW4odm9pZCBjb25zdCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIGludCBmZHNbXSwgc2l6ZV90IGNvdW50KTsKLQotCi0gICAgR3JhcGhpY0J1ZmZlck1hcHBlciYgbUJ1ZmZlck1hcHBlcjsKLSAgICBzc2l6ZV90IG1Jbml0Q2hlY2s7Ci0gICAgaW50IG1JbmRleDsKLQotICAgIC8vIElmIHdlJ3JlIHdyYXBwaW5nIGFub3RoZXIgYnVmZmVyIHRoZW4gdGhpcyByZWZlcmVuY2Ugd2lsbCBtYWtlIHN1cmUgaXQKLSAgICAvLyBkb2Vzbid0IGdldCBmcmVlZC4KLSAgICBzcDxBTmF0aXZlV2luZG93QnVmZmVyPiBtV3JhcHBlZEJ1ZmZlcjsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dSQVBISUNfQlVGRkVSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvR3JhcGhpY0J1ZmZlckFsbG9jYXRvci5oIGIvaW5jbHVkZS91aS9HcmFwaGljQnVmZmVyQWxsb2NhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZmE3ODguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91aS9HcmFwaGljQnVmZmVyQWxsb2NhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKiAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaWZuZGVmIEFORFJPSURfQlVGRkVSX0FMTE9DQVRPUl9ICi0jZGVmaW5lIEFORFJPSURfQlVGRkVSX0FMTE9DQVRPUl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KLQotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIEdyYXBoaWNCdWZmZXJBbGxvY2F0b3IgOiBwdWJsaWMgU2luZ2xldG9uPEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I+Ci17Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIFVTQUdFX1NXX1JFQURfTkVWRVIgICAgID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSLAotICAgICAgICBVU0FHRV9TV19SRUFEX1JBUkVMWSAgICA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9SQVJFTFksCi0gICAgICAgIFVTQUdFX1NXX1JFQURfT0ZURU4gICAgID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOLAotICAgICAgICBVU0FHRV9TV19SRUFEX01BU0sgICAgICA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLLAotICAgICAgICAKLSAgICAgICAgVVNBR0VfU1dfV1JJVEVfTkVWRVIgICAgPSBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX05FVkVSLAotICAgICAgICBVU0FHRV9TV19XUklURV9SQVJFTFkgICA9IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfUkFSRUxZLAotICAgICAgICBVU0FHRV9TV19XUklURV9PRlRFTiAgICA9IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCi0gICAgICAgIFVTQUdFX1NXX1dSSVRFX01BU0sgICAgID0gR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLLAotICAgICAgICAKLSAgICAgICAgVVNBR0VfU09GVFdBUkVfTUFTSyAgICAgPSBVU0FHRV9TV19SRUFEX01BU0t8VVNBR0VfU1dfV1JJVEVfTUFTSywKLSAgICAgICAgCi0gICAgICAgIFVTQUdFX0hXX1RFWFRVUkUgICAgICAgID0gR1JBTExPQ19VU0FHRV9IV19URVhUVVJFLAotICAgICAgICBVU0FHRV9IV19SRU5ERVIgICAgICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSLAotICAgICAgICBVU0FHRV9IV18yRCAgICAgICAgICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfMkQsCi0gICAgICAgIFVTQUdFX0hXX01BU0sgICAgICAgICAgID0gR1JBTExPQ19VU0FHRV9IV19NQVNLCi0gICAgfTsKLQotICAgIHN0YXRpYyBpbmxpbmUgR3JhcGhpY0J1ZmZlckFsbG9jYXRvciYgZ2V0KCkgeyByZXR1cm4gZ2V0SW5zdGFuY2UoKTsgfQotICAgIAotCi0gICAgc3RhdHVzX3QgYWxsb2ModWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCBpbnQgdXNhZ2UsCi0gICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGhhbmRsZSwgaW50MzJfdCogc3RyaWRlKTsKLQotICAgIHN0YXR1c190IGZyZWUoYnVmZmVyX2hhbmRsZV90IGhhbmRsZSk7Ci0KLSAgICB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzKSBjb25zdDsKLSAgICBzdGF0aWMgdm9pZCBkdW1wVG9TeXN0ZW1Mb2coKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgYWxsb2NfcmVjX3QgewotICAgICAgICB1aW50MzJfdCB3OwotICAgICAgICB1aW50MzJfdCBoOwotICAgICAgICB1aW50MzJfdCBzOwotICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQ7Ci0gICAgICAgIHVpbnQzMl90IHVzYWdlOwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICB9OwotICAgIAotICAgIHN0YXRpYyBNdXRleCBzTG9jazsKLSAgICBzdGF0aWMgS2V5ZWRWZWN0b3I8YnVmZmVyX2hhbmRsZV90LCBhbGxvY19yZWNfdD4gc0FsbG9jTGlzdDsKLSAgICAKLSAgICBmcmllbmQgY2xhc3MgU2luZ2xldG9uPEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I+OwotICAgIEdyYXBoaWNCdWZmZXJBbGxvY2F0b3IoKTsKLSAgICB+R3JhcGhpY0J1ZmZlckFsbG9jYXRvcigpOwotICAgIAotICAgIGFsbG9jX2RldmljZV90ICAqbUFsbG9jRGV2OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9CVUZGRVJfQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oIGIvaW5jbHVkZS91aS9HcmFwaGljQnVmZmVyTWFwcGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5N2EwMmEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91aS9HcmFwaGljQnVmZmVyTWFwcGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1VJX0JVRkZFUl9NQVBQRVJfSAotI2RlZmluZSBBTkRST0lEX1VJX0JVRkZFUl9NQVBQRVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLQotCi1zdHJ1Y3QgZ3JhbGxvY19tb2R1bGVfdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVjdDsKLQotY2xhc3MgR3JhcGhpY0J1ZmZlck1hcHBlciA6IHB1YmxpYyBTaW5nbGV0b248R3JhcGhpY0J1ZmZlck1hcHBlcj4KLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgaW5saW5lIEdyYXBoaWNCdWZmZXJNYXBwZXImIGdldCgpIHsgcmV0dXJuIGdldEluc3RhbmNlKCk7IH0KLQotICAgIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyKGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgc3RhdHVzX3QgdW5yZWdpc3RlckJ1ZmZlcihidWZmZXJfaGFuZGxlX3QgaGFuZGxlKTsKLSAgICAKLSAgICBzdGF0dXNfdCBsb2NrKGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBpbnQgdXNhZ2UsIGNvbnN0IFJlY3QmIGJvdW5kcywgdm9pZCoqIHZhZGRyKTsKLQotICAgIHN0YXR1c190IHVubG9jayhidWZmZXJfaGFuZGxlX3QgaGFuZGxlKTsKLSAgICAKLSAgICAvLyBkdW1wcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWFwcGluZyBvZiB0aGlzIGhhbmRsZQotICAgIHZvaWQgZHVtcChidWZmZXJfaGFuZGxlX3QgaGFuZGxlKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgU2luZ2xldG9uPEdyYXBoaWNCdWZmZXJNYXBwZXI+OwotICAgIEdyYXBoaWNCdWZmZXJNYXBwZXIoKTsKLSAgICBncmFsbG9jX21vZHVsZV90IGNvbnN0ICptQWxsb2NNb2Q7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfVUlfQlVGRkVSX01BUFBFUl9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvUGl4ZWxGb3JtYXQuaCBiL2luY2x1ZGUvdWkvUGl4ZWxGb3JtYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYzZTI2Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VpL1BpeGVsRm9ybWF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0KLS8vIFBpeGVsIGZvcm1hdHMgdXNlZCBhY3Jvc3MgdGhlIHN5c3RlbS4KLS8vIFRoZXNlIGZvcm1hdHMgbWlnaHQgbm90IGFsbCBiZSBzdXBwb3J0ZWQgYnkgYWxsIHJlbmRlcmVycywgZm9yIGluc3RhbmNlCi0vLyBza2lhIG9yIFN1cmZhY2VGbGluZ2VyIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbGwgb2YgdGhlc2UgZm9ybWF0cwotLy8gKGVpdGhlciBhcyBzb3VyY2Ugb3IgZGVzdGluYXRpb24pCi0KLQotI2lmbmRlZiBVSV9QSVhFTEZPUk1BVF9ICi0jZGVmaW5lIFVJX1BJWEVMRk9STUFUX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgLy8KLSAgICAvLyB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBtYXRjaCB0aG9zZQotICAgIC8vIGluIGdyYXBoaWNzL1BpeGVsRm9ybWF0LmphdmEgJiBwaXhlbGZsaW5nZXIvZm9ybWF0LmgKLSAgICAvLwotICAgIFBJWEVMX0ZPUk1BVF9VTktOT1dOICAgID0gICAwLAotICAgIFBJWEVMX0ZPUk1BVF9OT05FICAgICAgID0gICAwLAotCi0gICAgLy8gbG9naWNhbCBwaXhlbCBmb3JtYXRzIHVzZWQgYnkgdGhlIFN1cmZhY2VGbGluZ2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUElYRUxfRk9STUFUX0NVU1RPTSAgICAgICAgID0gLTQsCi0gICAgICAgIC8vIEN1c3RvbSBwaXhlbC1mb3JtYXQgZGVzY3JpYmVkIGJ5IGEgUGl4ZWxGb3JtYXRJbmZvIHN0cnVjdHVyZQotCi0gICAgUElYRUxfRk9STUFUX1RSQU5TTFVDRU5UICAgID0gLTMsCi0gICAgICAgIC8vIFN5c3RlbSBjaG9vc2VzIGEgZm9ybWF0IHRoYXQgc3VwcG9ydHMgdHJhbnNsdWNlbmN5IChtYW55IGFscGhhIGJpdHMpCi0KLSAgICBQSVhFTF9GT1JNQVRfVFJBTlNQQVJFTlQgICAgPSAtMiwKLSAgICAgICAgLy8gU3lzdGVtIGNob29zZXMgYSBmb3JtYXQgdGhhdCBzdXBwb3J0cyB0cmFuc3BhcmVuY3kKLSAgICAgICAgLy8gKGF0IGxlYXN0IDEgYWxwaGEgYml0KQotCi0gICAgUElYRUxfRk9STUFUX09QQVFVRSAgICAgICAgID0gLTEsCi0gICAgICAgIC8vIFN5c3RlbSBjaG9vc2VzIGFuIG9wYXF1ZSBmb3JtYXQgKG5vIGFscGhhIGJpdHMgcmVxdWlyZWQpCi0KLSAgICAvLyByZWFsIHBpeGVsIGZvcm1hdHMgc3VwcG9ydGVkIGZvciByZW5kZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODggICA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LCAgLy8gNHg4LWJpdCBSR0JBCi0gICAgUElYRUxfRk9STUFUX1JHQlhfODg4OCAgID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODgsICAvLyA0eDgtYml0IFJHQjAKLSAgICBQSVhFTF9GT1JNQVRfUkdCXzg4OCAgICAgPSBIQUxfUElYRUxfRk9STUFUX1JHQl84ODgsICAgIC8vIDN4OC1iaXQgUkdCCi0gICAgUElYRUxfRk9STUFUX1JHQl81NjUgICAgID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LCAgICAvLyAxNi1iaXQgUkdCCi0gICAgUElYRUxfRk9STUFUX0JHUkFfODg4OCAgID0gSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgsICAvLyA0eDgtYml0IEJHUkEKLSAgICBQSVhFTF9GT1JNQVRfUkdCQV81NTUxICAgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfNTU1MSwgIC8vIDE2LWJpdCBBUkdCCi0gICAgUElYRUxfRk9STUFUX1JHQkFfNDQ0NCAgID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQsICAvLyAxNi1iaXQgQVJHQgotICAgIFBJWEVMX0ZPUk1BVF9BXzggICAgICAgICA9IDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOC1iaXQgQQotfTsKLQotdHlwZWRlZiBpbnQzMl90IFBpeGVsRm9ybWF0OwotCi1zdHJ1Y3QgUGl4ZWxGb3JtYXRJbmZvIHsKLSAgICBlbnVtIHsKLSAgICAgICAgSU5ERVhfQUxQSEEgICA9IDAsCi0gICAgICAgIElOREVYX1JFRCAgICAgPSAxLAotICAgICAgICBJTkRFWF9HUkVFTiAgID0gMiwKLSAgICAgICAgSU5ERVhfQkxVRSAgICA9IDMKLSAgICB9OwotCi0gICAgZW51bSB7IC8vIGNvbXBvbmVudHMKLSAgICAgICAgQUxQSEEgICA9IDEsCi0gICAgICAgIFJHQiAgICAgPSAyLAotICAgICAgICBSR0JBICAgID0gMywKLSAgICAgICAgTCAgICAgICA9IDQsCi0gICAgICAgIExBICAgICAgPSA1LAotICAgICAgICBPVEhFUiAgID0gMHhGRgotICAgIH07Ci0KLSAgICBzdHJ1Y3Qgc3ppbmZvIHsKLSAgICAgICAgdWludDhfdCBoOwotICAgICAgICB1aW50OF90IGw7Ci0gICAgfTsKLQotICAgIGlubGluZSBQaXhlbEZvcm1hdEluZm8oKSA6IHZlcnNpb24oc2l6ZW9mKFBpeGVsRm9ybWF0SW5mbykpIHsgfQotICAgIHNpemVfdCBnZXRTY2FubGluZVNpemUodW5zaWduZWQgaW50IHdpZHRoKSBjb25zdDsKLSAgICBzaXplX3QgZ2V0U2l6ZShzaXplX3QgY2kpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChjaSA8PSAzKSA/IChjaW5mb1tjaV0uaCAtIGNpbmZvW2NpXS5sKSA6IDA7Ci0gICAgfQotICAgIHNpemVfdCAgICAgIHZlcnNpb247Ci0gICAgUGl4ZWxGb3JtYXQgZm9ybWF0OwotICAgIHNpemVfdCAgICAgIGJ5dGVzUGVyUGl4ZWw7Ci0gICAgc2l6ZV90ICAgICAgYml0c1BlclBpeGVsOwotICAgIHVuaW9uIHsKLSAgICAgICAgc3ppbmZvICAgICAgY2luZm9bNF07Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICB1aW50OF90ICAgICBoX2FscGhhOwotICAgICAgICAgICAgdWludDhfdCAgICAgbF9hbHBoYTsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgIGhfcmVkOwotICAgICAgICAgICAgdWludDhfdCAgICAgbF9yZWQ7Ci0gICAgICAgICAgICB1aW50OF90ICAgICBoX2dyZWVuOwotICAgICAgICAgICAgdWludDhfdCAgICAgbF9ncmVlbjsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgIGhfYmx1ZTsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgIGxfYmx1ZTsKLSAgICAgICAgfTsKLSAgICB9OwotICAgIHVpbnQ4X3QgICAgIGNvbXBvbmVudHM7Ci0gICAgdWludDhfdCAgICAgcmVzZXJ2ZWQwWzNdOwotICAgIHVpbnQzMl90ICAgIHJlc2VydmVkMTsKLX07Ci0KLS8vIENvbnNpZGVyIGNhY2hpbmcgdGhlIHJlc3VsdHMgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSB0aGV5J3JlIG5vdAotLy8gZ3VhcmFudGVlZCB0byBiZSBmYXN0Lgotc3NpemVfdCAgICAgYnl0ZXNQZXJQaXhlbChQaXhlbEZvcm1hdCBmb3JtYXQpOwotc3NpemVfdCAgICAgYml0c1BlclBpeGVsKFBpeGVsRm9ybWF0IGZvcm1hdCk7Ci1zdGF0dXNfdCAgICBnZXRQaXhlbEZvcm1hdEluZm8oUGl4ZWxGb3JtYXQgZm9ybWF0LCBQaXhlbEZvcm1hdEluZm8qIGluZm8pOwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gVUlfUElYRUxGT1JNQVRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9Qb2ludC5oIGIvaW5jbHVkZS91aS9Qb2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjUzMTIwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWkvUG9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVUlfUE9JTlQKLSNkZWZpbmUgQU5EUk9JRF9VSV9QT0lOVAotCi0jaW5jbHVkZSA8dXRpbHMvVHlwZUhlbHBlcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBQb2ludAotewotcHVibGljOgotICAgIGludCB4OwotICAgIGludCB5OwotCi0gICAgLy8gd2UgZG9uJ3QgcHJvdmlkZSBjb3B5LWN0b3IgYW5kIG9wZXJhdG9yPSBvbiBwdXJwb3NlCi0gICAgLy8gYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciBnZW5lcmF0ZWQgdmVyc2lvbnMKLQotICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgZG9lc24ndCBpbml0aWFsaXplIHRoZSBQb2ludAotICAgIGlubGluZSBQb2ludCgpIHsKLSAgICB9Ci0gICAgaW5saW5lIFBvaW50KGludCB4LCBpbnQgeSkgOiB4KHgpLCB5KHkpIHsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgUG9pbnQmIHJocykgY29uc3QgewotICAgICAgICByZXR1cm4gKHggPT0gcmhzLngpICYmICh5ID09IHJocy55KTsKLSAgICB9Ci0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IFBvaW50JiByaHMpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICFvcGVyYXRvciA9PSAocmhzKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBpc09yaWdpbigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICEoeHx5KTsKLSAgICB9Ci0KLSAgICAvLyBvcGVyYXRvciA8IGRlZmluZXMgYW4gb3JkZXIgd2hpY2ggYWxsb3dzIHRvIHVzZSBwb2ludHMgaW4gc29ydGVkCi0gICAgLy8gdmVjdG9ycy4KLSAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IFBvaW50JiByaHMpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIHk8cmhzLnkgfHwgKHk9PXJocy55ICYmIHg8cmhzLngpOwotICAgIH0KLQotICAgIGlubGluZSBQb2ludCYgb3BlcmF0b3IgLSAoKSB7Ci0gICAgICAgIHggPSAteDsKLSAgICAgICAgeSA9IC15OwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIAotICAgIGlubGluZSBQb2ludCYgb3BlcmF0b3IgKz0gKGNvbnN0IFBvaW50JiByaHMpIHsKLSAgICAgICAgeCArPSByaHMueDsKLSAgICAgICAgeSArPSByaHMueTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBpbmxpbmUgUG9pbnQmIG9wZXJhdG9yIC09IChjb25zdCBQb2ludCYgcmhzKSB7Ci0gICAgICAgIHggLT0gcmhzLng7Ci0gICAgICAgIHkgLT0gcmhzLnk7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgCi0gICAgY29uc3QgUG9pbnQgb3BlcmF0b3IgKyAoY29uc3QgUG9pbnQmIHJocykgY29uc3QgewotICAgICAgICBjb25zdCBQb2ludCByZXN1bHQoeCtyaHMueCwgeStyaHMueSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGNvbnN0IFBvaW50IG9wZXJhdG9yIC0gKGNvbnN0IFBvaW50JiByaHMpIGNvbnN0IHsKLSAgICAgICAgY29uc3QgUG9pbnQgcmVzdWx0KHgtcmhzLngsIHktcmhzLnkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgCi19OwotCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyhQb2ludCkKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfVUlfUE9JTlQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvUmVjdC5oIGIvaW5jbHVkZS91aS9SZWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOThiYzUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91aS9SZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9VSV9SRUNUCi0jZGVmaW5lIEFORFJPSURfVUlfUkVDVAotCi0jaW5jbHVkZSA8dXRpbHMvVHlwZUhlbHBlcnMuaD4KLSNpbmNsdWRlIDx1aS9Qb2ludC5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9yZWN0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgUmVjdCA6IHB1YmxpYyBBUmVjdAotewotcHVibGljOgotICAgIHR5cGVkZWYgQVJlY3Q6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKLQotICAgIC8vIHdlIGRvbid0IHByb3ZpZGUgY29weS1jdG9yIGFuZCBvcGVyYXRvcj0gb24gcHVycG9zZQotICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgZ2VuZXJhdGVkIHZlcnNpb25zCi0KLSAgICBpbmxpbmUgUmVjdCgpIHsKLSAgICB9Ci0gICAgaW5saW5lIFJlY3QoaW50MzJfdCB3LCBpbnQzMl90IGgpIHsKLSAgICAgICAgbGVmdCA9IHRvcCA9IDA7IHJpZ2h0ID0gdzsgYm90dG9tID0gaDsKLSAgICB9Ci0gICAgaW5saW5lIFJlY3QoaW50MzJfdCBsLCBpbnQzMl90IHQsIGludDMyX3QgciwgaW50MzJfdCBiKSB7Ci0gICAgICAgIGxlZnQgPSBsOyB0b3AgPSB0OyByaWdodCA9IHI7IGJvdHRvbSA9IGI7Ci0gICAgfQotICAgIGlubGluZSBSZWN0KGNvbnN0IFBvaW50JiBsdCwgY29uc3QgUG9pbnQmIHJiKSB7Ci0gICAgICAgIGxlZnQgPSBsdC54OyB0b3AgPSBsdC55OyByaWdodCA9IHJiLng7IGJvdHRvbSA9IHJiLnk7Ci0gICAgfQotCi0gICAgdm9pZCBtYWtlSW52YWxpZCgpOwotCi0gICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGxlZnQgPSB0b3AgPSByaWdodCA9IGJvdHRvbSA9IDA7Ci0gICAgfQotCi0gICAgLy8gYSB2YWxpZCByZWN0YW5nbGUgaGFzIGEgbm9uIG5lZ2F0aXZlIHdpZHRoIGFuZCBoZWlnaHQKLSAgICBpbmxpbmUgYm9vbCBpc1ZhbGlkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gKHdpZHRoKCk+PTApICYmIChoZWlnaHQoKT49MCk7Ci0gICAgfQotCi0gICAgLy8gYW4gZW1wdHkgcmVjdCBoYXMgYSB6ZXJvIHdpZHRoIG9yIGhlaWdodCwgb3IgaXMgaW52YWxpZAotICAgIGlubGluZSBib29sIGlzRW1wdHkoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAod2lkdGgoKTw9MCkgfHwgKGhlaWdodCgpPD0wKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgdm9pZCBzZXQoY29uc3QgUmVjdCYgcmhzKSB7Ci0gICAgICAgIG9wZXJhdG9yID0gKHJocyk7Ci0gICAgfQotCi0gICAgLy8gcmVjdGFuZ2xlJ3Mgd2lkdGgKLSAgICBpbmxpbmUgaW50MzJfdCB3aWR0aCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIHJpZ2h0LWxlZnQ7Ci0gICAgfQotICAgIAotICAgIC8vIHJlY3RhbmdsZSdzIGhlaWdodAotICAgIGlubGluZSBpbnQzMl90IGhlaWdodCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGJvdHRvbS10b3A7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRMZWZ0VG9wKGNvbnN0IFBvaW50JiBsdCkgewotICAgICAgICBsZWZ0ID0gbHQueDsKLSAgICAgICAgdG9wICA9IGx0Lnk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRSaWdodEJvdHRvbShjb25zdCBQb2ludCYgcmIpIHsKLSAgICAgICAgcmlnaHQgPSByYi54OwotICAgICAgICBib3R0b20gID0gcmIueTsKLSAgICB9Ci0gICAgCi0gICAgLy8gdGhlIGZvbGxvd2luZyA0IGZ1bmN0aW9ucyByZXR1cm4gdGhlIDQgY29ybmVycyBvZiB0aGUgcmVjdCBhcyBQb2ludAotICAgIFBvaW50IGxlZnRUb3AoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBQb2ludChsZWZ0LCB0b3ApOwotICAgIH0KLSAgICBQb2ludCByaWdodEJvdHRvbSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIFBvaW50KHJpZ2h0LCBib3R0b20pOwotICAgIH0KLSAgICBQb2ludCByaWdodFRvcCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIFBvaW50KHJpZ2h0LCB0b3ApOwotICAgIH0KLSAgICBQb2ludCBsZWZ0Qm90dG9tKCkgY29uc3QgewotICAgICAgICByZXR1cm4gUG9pbnQobGVmdCwgYm90dG9tKTsKLSAgICB9Ci0KLSAgICAvLyBjb21wYXJpc29ucwotICAgIGlubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCBSZWN0JiByaHMpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChsZWZ0ID09IHJocy5sZWZ0KSAmJiAodG9wID09IHJocy50b3ApICYmCi0gICAgICAgICAgICAgICAocmlnaHQgPT0gcmhzLnJpZ2h0KSAmJiAoYm90dG9tID09IHJocy5ib3R0b20pOwotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCBSZWN0JiByaHMpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICFvcGVyYXRvciA9PSAocmhzKTsKLSAgICB9Ci0KLSAgICAvLyBvcGVyYXRvciA8IGRlZmluZXMgYW4gb3JkZXIgd2hpY2ggYWxsb3dzIHRvIHVzZSByZWN0YW5nbGVzIGluIHNvcnRlZAotICAgIC8vIHZlY3RvcnMuCi0gICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBSZWN0JiByaHMpIGNvbnN0OwotCi0gICAgUmVjdCYgb2Zmc2V0VG9PcmlnaW4oKSB7Ci0gICAgICAgIHJpZ2h0IC09IGxlZnQ7Ci0gICAgICAgIGJvdHRvbSAtPSB0b3A7Ci0gICAgICAgIGxlZnQgPSB0b3AgPSAwOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIFJlY3QmIG9mZnNldFRvKGNvbnN0IFBvaW50JiBwKSB7Ci0gICAgICAgIHJldHVybiBvZmZzZXRUbyhwLngsIHAueSk7Ci0gICAgfQotICAgIFJlY3QmIG9mZnNldEJ5KGNvbnN0IFBvaW50JiBkcCkgewotICAgICAgICByZXR1cm4gb2Zmc2V0QnkoZHAueCwgZHAueSk7Ci0gICAgfQotICAgIFJlY3QmIG9wZXJhdG9yICs9IChjb25zdCBQb2ludCYgcmhzKSB7Ci0gICAgICAgIHJldHVybiBvZmZzZXRCeShyaHMueCwgcmhzLnkpOwotICAgIH0KLSAgICBSZWN0JiBvcGVyYXRvciAtPSAoY29uc3QgUG9pbnQmIHJocykgewotICAgICAgICByZXR1cm4gb2Zmc2V0QnkoLXJocy54LCAtcmhzLnkpOwotICAgIH0KLSAgICBjb25zdCBSZWN0IG9wZXJhdG9yICsgKGNvbnN0IFBvaW50JiByaHMpIGNvbnN0OwotICAgIGNvbnN0IFJlY3Qgb3BlcmF0b3IgLSAoY29uc3QgUG9pbnQmIHJocykgY29uc3Q7Ci0KLSAgICB2b2lkIHRyYW5zbGF0ZShpbnQzMl90IGR4LCBpbnQzMl90IGR5KSB7IC8vIGxlZ2FjeSwgZG9uJ3QgdXNlLgotICAgICAgICBvZmZzZXRCeShkeCwgZHkpOwotICAgIH0KLSAKLSAgICBSZWN0JiAgIG9mZnNldFRvKGludDMyX3QgeCwgaW50MzJfdCB5KTsKLSAgICBSZWN0JiAgIG9mZnNldEJ5KGludDMyX3QgeCwgaW50MzJfdCB5KTsKLSAgICBib29sICAgIGludGVyc2VjdChjb25zdCBSZWN0JiB3aXRoLCBSZWN0KiByZXN1bHQpIGNvbnN0OwotfTsKLQotQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoUmVjdCkKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfVUlfUkVDVApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9SZWdpb24uaCBiL2luY2x1ZGUvdWkvUmVnaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDJmMTguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91aS9SZWdpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1VJX1JFR0lPTl9ICi0jZGVmaW5lIEFORFJPSURfVUlfUkVHSU9OX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLSNpbmNsdWRlIDx1aS9SZWN0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTdHJpbmc4OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNsYXNzIFJlZ2lvbgotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWdpb24oY29uc3QgUmVnaW9uJiByaHMpOwotICAgIGV4cGxpY2l0ICAgICAgICAgICAgUmVnaW9uKGNvbnN0IFJlY3QmIHJocyk7Ci0gICAgZXhwbGljaXQgICAgICAgICAgICBSZWdpb24oY29uc3Qgdm9pZCogYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH5SZWdpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBSZWdpb24mIG9wZXJhdG9yID0gKGNvbnN0IFJlZ2lvbiYgcmhzKTsKLQotICAgIGlubGluZSAgYm9vbCAgICAgICAgaXNFbXB0eSgpIGNvbnN0ICAgICB7IHJldHVybiBtQm91bmRzLmlzRW1wdHkoKTsgIH0KLSAgICBpbmxpbmUgIGJvb2wgICAgICAgIGlzUmVjdCgpIGNvbnN0ICAgICAgeyByZXR1cm4gbVN0b3JhZ2UuaXNFbXB0eSgpOyB9Ci0KLSAgICBpbmxpbmUgIFJlY3QgICAgICAgIGdldEJvdW5kcygpIGNvbnN0ICAgeyByZXR1cm4gbUJvdW5kczsgfQotICAgIGlubGluZSAgUmVjdCAgICAgICAgYm91bmRzKCkgY29uc3QgICAgICB7IHJldHVybiBnZXRCb3VuZHMoKTsgfQotCi0gICAgICAgICAgICAvLyB0aGUgcmVnaW9uIGJlY29tZXMgaXRzIGJvdW5kcwotICAgICAgICAgICAgUmVnaW9uJiAgICAgbWFrZUJvdW5kc1NlbGYoKTsKLSAgICAKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGNsZWFyKCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBzZXQoY29uc3QgUmVjdCYgcik7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBzZXQodWludDMyX3QgdywgdWludDMyX3QgaCk7Ci0gICAgICAgIAotICAgICAgICAgICAgUmVnaW9uJiAgICAgb3JTZWxmKGNvbnN0IFJlY3QmIHJocyk7Ci0gICAgICAgICAgICBSZWdpb24mICAgICB4b3JTZWxmKGNvbnN0IFJlY3QmIHJocyk7Ci0gICAgICAgICAgICBSZWdpb24mICAgICBhbmRTZWxmKGNvbnN0IFJlY3QmIHJocyk7Ci0gICAgICAgICAgICBSZWdpb24mICAgICBzdWJ0cmFjdFNlbGYoY29uc3QgUmVjdCYgcmhzKTsKLQotICAgICAgICAgICAgLy8gYm9vbGVhbiBvcGVyYXRvcnMsIGFwcGxpZWQgb24gdGhpcwotICAgICAgICAgICAgUmVnaW9uJiAgICAgb3JTZWxmKGNvbnN0IFJlZ2lvbiYgcmhzKTsKLSAgICAgICAgICAgIFJlZ2lvbiYgICAgIHhvclNlbGYoY29uc3QgUmVnaW9uJiByaHMpOwotICAgICAgICAgICAgUmVnaW9uJiAgICAgYW5kU2VsZihjb25zdCBSZWdpb24mIHJocyk7Ci0gICAgICAgICAgICBSZWdpb24mICAgICBzdWJ0cmFjdFNlbGYoY29uc3QgUmVnaW9uJiByaHMpOwotCi0gICAgICAgICAgICAvLyBib29sZWFuIG9wZXJhdG9ycwotICAgIGNvbnN0ICAgUmVnaW9uICAgICAgbWVyZ2UoY29uc3QgUmVjdCYgcmhzKSBjb25zdDsKLSAgICBjb25zdCAgIFJlZ2lvbiAgICAgIG1lcmdlRXhjbHVzaXZlKGNvbnN0IFJlY3QmIHJocykgY29uc3Q7Ci0gICAgY29uc3QgICBSZWdpb24gICAgICBpbnRlcnNlY3QoY29uc3QgUmVjdCYgcmhzKSBjb25zdDsKLSAgICBjb25zdCAgIFJlZ2lvbiAgICAgIHN1YnRyYWN0KGNvbnN0IFJlY3QmIHJocykgY29uc3Q7Ci0KLSAgICAgICAgICAgIC8vIGJvb2xlYW4gb3BlcmF0b3JzCi0gICAgY29uc3QgICBSZWdpb24gICAgICBtZXJnZShjb25zdCBSZWdpb24mIHJocykgY29uc3Q7Ci0gICAgY29uc3QgICBSZWdpb24gICAgICBtZXJnZUV4Y2x1c2l2ZShjb25zdCBSZWdpb24mIHJocykgY29uc3Q7Ci0gICAgY29uc3QgICBSZWdpb24gICAgICBpbnRlcnNlY3QoY29uc3QgUmVnaW9uJiByaHMpIGNvbnN0OwotICAgIGNvbnN0ICAgUmVnaW9uICAgICAgc3VidHJhY3QoY29uc3QgUmVnaW9uJiByaHMpIGNvbnN0OwotCi0gICAgICAgICAgICAvLyB0aGVzZSB0cmFuc2xhdGUgcmhzIGZpcnN0Ci0gICAgICAgICAgICBSZWdpb24mICAgICB0cmFuc2xhdGVTZWxmKGludCBkeCwgaW50IGR5KTsKLSAgICAgICAgICAgIFJlZ2lvbiYgICAgIG9yU2VsZihjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpOwotICAgICAgICAgICAgUmVnaW9uJiAgICAgeG9yU2VsZihjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpOwotICAgICAgICAgICAgUmVnaW9uJiAgICAgYW5kU2VsZihjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpOwotICAgICAgICAgICAgUmVnaW9uJiAgICAgc3VidHJhY3RTZWxmKGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgZHgsIGludCBkeSk7Ci0KLSAgICAgICAgICAgIC8vIHRoZXNlIHRyYW5zbGF0ZSByaHMgZmlyc3QKLSAgICBjb25zdCAgIFJlZ2lvbiAgICAgIHRyYW5zbGF0ZShpbnQgZHgsIGludCBkeSkgY29uc3Q7Ci0gICAgY29uc3QgICBSZWdpb24gICAgICBtZXJnZShjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpIGNvbnN0OwotICAgIGNvbnN0ICAgUmVnaW9uICAgICAgbWVyZ2VFeGNsdXNpdmUoY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KSBjb25zdDsKLSAgICBjb25zdCAgIFJlZ2lvbiAgICAgIGludGVyc2VjdChjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpIGNvbnN0OwotICAgIGNvbnN0ICAgUmVnaW9uICAgICAgc3VidHJhY3QoY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KSBjb25zdDsKLQotICAgIC8vIGNvbnZlbmllbmNlIG9wZXJhdG9ycyBvdmVybG9hZHMKLSAgICBpbmxpbmUgIGNvbnN0IFJlZ2lvbiAgICAgIG9wZXJhdG9yIHwgKGNvbnN0IFJlZ2lvbiYgcmhzKSBjb25zdDsKLSAgICBpbmxpbmUgIGNvbnN0IFJlZ2lvbiAgICAgIG9wZXJhdG9yIF4gKGNvbnN0IFJlZ2lvbiYgcmhzKSBjb25zdDsKLSAgICBpbmxpbmUgIGNvbnN0IFJlZ2lvbiAgICAgIG9wZXJhdG9yICYgKGNvbnN0IFJlZ2lvbiYgcmhzKSBjb25zdDsKLSAgICBpbmxpbmUgIGNvbnN0IFJlZ2lvbiAgICAgIG9wZXJhdG9yIC0gKGNvbnN0IFJlZ2lvbiYgcmhzKSBjb25zdDsKLSAgICBpbmxpbmUgIGNvbnN0IFJlZ2lvbiAgICAgIG9wZXJhdG9yICsgKGNvbnN0IFBvaW50JiBwdCkgY29uc3Q7Ci0KLSAgICBpbmxpbmUgIFJlZ2lvbiYgICAgIG9wZXJhdG9yIHw9IChjb25zdCBSZWdpb24mIHJocyk7Ci0gICAgaW5saW5lICBSZWdpb24mICAgICBvcGVyYXRvciBePSAoY29uc3QgUmVnaW9uJiByaHMpOwotICAgIGlubGluZSAgUmVnaW9uJiAgICAgb3BlcmF0b3IgJj0gKGNvbnN0IFJlZ2lvbiYgcmhzKTsKLSAgICBpbmxpbmUgIFJlZ2lvbiYgICAgIG9wZXJhdG9yIC09IChjb25zdCBSZWdpb24mIHJocyk7Ci0gICAgaW5saW5lICBSZWdpb24mICAgICBvcGVyYXRvciArPSAoY29uc3QgUG9pbnQmIHB0KTsKLQotICAgIAotICAgIC8qIHZhcmlvdXMgd2F5cyB0byBhY2Nlc3MgdGhlIHJlY3RhbmdsZSBsaXN0ICovCi0gICAgCi0gICAgdHlwZWRlZiBSZWN0IGNvbnN0KiBjb25zdF9pdGVyYXRvcjsKLSAgICAKLSAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7Ci0gICAgICAgICAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdDsKLQotICAgIC8qIG5vIHVzZXIgc2VydmljZWFibGUgcGFydHMgaGVyZS4uLiAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzaXplX3QgICAgICBnZXRSZWN0cyhWZWN0b3I8UmVjdD4mIHJlY3RMaXN0KSBjb25zdDsKLSAgICAgICAgICAgIFJlY3QgY29uc3QqIGdldEFycmF5KHNpemVfdCogY291bnQpIGNvbnN0OwotCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGFkZCBhIHJlY3RhbmdsZSB0byB0aGUgaW50ZXJuYWwgbGlzdC4gVGhpcyByZWN0YW5nbGUgbXVzdAotICAgICAgICAgICAgLy8gYmUgc29ydGVkIGluIFkgYW5kIFggYW5kIG11c3Qgbm90IG1ha2UgdGhlIHJlZ2lvbiBpbnZhbGlkLgotICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUmVjdFVuY2hlY2tlZChpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYik7Ci0KLSAgICAgICAgICAgIC8vIGZsYXR0ZW4vdW5mbGF0dGVuIGEgcmVnaW9uIHRvL2Zyb20gYSByYXcgYnVmZmVyCi0gICAgICAgICAgICBzc2l6ZV90ICAgICB3cml0ZSh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSBjb25zdDsKLSAgICBzdGF0aWMgIHNzaXplX3QgICAgIHdyaXRlRW1wdHkodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgICAgIHJlYWQoY29uc3Qgdm9pZCogYnVmZmVyKTsKLSAgICBzdGF0aWMgIGJvb2wgICAgICAgIGlzRW1wdHkodm9pZCogYnVmZmVyKTsKLQotICAgIHZvaWQgICAgICAgIGR1bXAoU3RyaW5nOCYgb3V0LCBjb25zdCBjaGFyKiB3aGF0LCB1aW50MzJfdCBmbGFncz0wKSBjb25zdDsKLSAgICB2b2lkICAgICAgICBkdW1wKGNvbnN0IGNoYXIqIHdoYXQsIHVpbnQzMl90IGZsYWdzPTApIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGNsYXNzIHJhc3Rlcml6ZXI7Ci0gICAgZnJpZW5kIGNsYXNzIHJhc3Rlcml6ZXI7Ci0gICAgCi0gICAgUmVnaW9uJiBvcGVyYXRpb25TZWxmKGNvbnN0IFJlY3QmIHIsIGludCBvcCk7Ci0gICAgUmVnaW9uJiBvcGVyYXRpb25TZWxmKGNvbnN0IFJlZ2lvbiYgciwgaW50IG9wKTsKLSAgICBSZWdpb24mIG9wZXJhdGlvblNlbGYoY29uc3QgUmVnaW9uJiByLCBpbnQgZHgsIGludCBkeSwgaW50IG9wKTsKLSAgICBjb25zdCBSZWdpb24gb3BlcmF0aW9uKGNvbnN0IFJlY3QmIHJocywgaW50IG9wKSBjb25zdDsKLSAgICBjb25zdCBSZWdpb24gb3BlcmF0aW9uKGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgb3ApIGNvbnN0OwotICAgIGNvbnN0IFJlZ2lvbiBvcGVyYXRpb24oY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5LCBpbnQgb3ApIGNvbnN0OwotCi0gICAgc3RhdGljIHZvaWQgYm9vbGVhbl9vcGVyYXRpb24oaW50IG9wLCBSZWdpb24mIGRzdCwKLSAgICAgICAgICAgIGNvbnN0IFJlZ2lvbiYgbGhzLCBjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpOwotICAgIHN0YXRpYyB2b2lkIGJvb2xlYW5fb3BlcmF0aW9uKGludCBvcCwgUmVnaW9uJiBkc3QsCi0gICAgICAgICAgICBjb25zdCBSZWdpb24mIGxocywgY29uc3QgUmVjdCYgcmhzLCBpbnQgZHgsIGludCBkeSk7Ci0KLSAgICBzdGF0aWMgdm9pZCBib29sZWFuX29wZXJhdGlvbihpbnQgb3AsIFJlZ2lvbiYgZHN0LAotICAgICAgICAgICAgY29uc3QgUmVnaW9uJiBsaHMsIGNvbnN0IFJlZ2lvbiYgcmhzKTsKLSAgICBzdGF0aWMgdm9pZCBib29sZWFuX29wZXJhdGlvbihpbnQgb3AsIFJlZ2lvbiYgZHN0LAotICAgICAgICAgICAgY29uc3QgUmVnaW9uJiBsaHMsIGNvbnN0IFJlY3QmIHJocyk7Ci0KLSAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoUmVnaW9uJiByZWcsIGludCBkeCwgaW50IGR5KTsKLSAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoUmVnaW9uJiBkc3QsIGNvbnN0IFJlZ2lvbiYgcmVnLCBpbnQgZHgsIGludCBkeSk7Ci0KLSAgICBzdGF0aWMgYm9vbCB2YWxpZGF0ZShjb25zdCBSZWdpb24mIHJlZywgY29uc3QgY2hhciogbmFtZSk7Ci0gICAgCi0gICAgUmVjdCAgICAgICAgICAgIG1Cb3VuZHM7Ci0gICAgVmVjdG9yPFJlY3Q+ICAgIG1TdG9yYWdlOwotfTsKLQotCi1jb25zdCBSZWdpb24gUmVnaW9uOjpvcGVyYXRvciB8IChjb25zdCBSZWdpb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBtZXJnZShyaHMpOwotfQotY29uc3QgUmVnaW9uIFJlZ2lvbjo6b3BlcmF0b3IgXiAoY29uc3QgUmVnaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gbWVyZ2VFeGNsdXNpdmUocmhzKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246Om9wZXJhdG9yICYgKGNvbnN0IFJlZ2lvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIGludGVyc2VjdChyaHMpOwotfQotY29uc3QgUmVnaW9uIFJlZ2lvbjo6b3BlcmF0b3IgLSAoY29uc3QgUmVnaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3VidHJhY3QocmhzKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246Om9wZXJhdG9yICsgKGNvbnN0IFBvaW50JiBwdCkgY29uc3QgewotICAgIHJldHVybiB0cmFuc2xhdGUocHQueCwgcHQueSk7Ci19Ci0KLQotUmVnaW9uJiBSZWdpb246Om9wZXJhdG9yIHw9IChjb25zdCBSZWdpb24mIHJocykgewotICAgIHJldHVybiBvclNlbGYocmhzKTsKLX0KLVJlZ2lvbiYgUmVnaW9uOjpvcGVyYXRvciBePSAoY29uc3QgUmVnaW9uJiByaHMpIHsKLSAgICByZXR1cm4geG9yU2VsZihyaHMpOwotfQotUmVnaW9uJiBSZWdpb246Om9wZXJhdG9yICY9IChjb25zdCBSZWdpb24mIHJocykgewotICAgIHJldHVybiBhbmRTZWxmKHJocyk7Ci19Ci1SZWdpb24mIFJlZ2lvbjo6b3BlcmF0b3IgLT0gKGNvbnN0IFJlZ2lvbiYgcmhzKSB7Ci0gICAgcmV0dXJuIHN1YnRyYWN0U2VsZihyaHMpOwotfQotUmVnaW9uJiBSZWdpb246Om9wZXJhdG9yICs9IChjb25zdCBQb2ludCYgcHQpIHsKLSAgICByZXR1cm4gdHJhbnNsYXRlU2VsZihwdC54LCBwdC55KTsKLX0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfVUlfUkVHSU9OX0gKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9BbmRyb2lkVGhyZWFkcy5oIGIvaW5jbHVkZS91dGlscy9BbmRyb2lkVGhyZWFkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWY3YWE0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvQW5kcm9pZFRocmVhZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTElCU19VVElMU19BTkRST0lEX1RIUkVBRFNfSAotI2RlZmluZSBfTElCU19VVElMU19BTkRST0lEX1RIUkVBRFNfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0jIGluY2x1ZGUgPHB0aHJlYWQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8dXRpbHMvVGhyZWFkRGVmcy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEMgQVBJCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gQ3JlYXRlIGFuZCBydW4gYSBuZXcgdGhyZWFkLgotZXh0ZXJuIGludCBhbmRyb2lkQ3JlYXRlVGhyZWFkKGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCwgdm9pZCAqKTsKLQotLy8gQ3JlYXRlIHRocmVhZCB3aXRoIGxvdHMgb2YgcGFyYW1ldGVycwotZXh0ZXJuIGludCBhbmRyb2lkQ3JlYXRlVGhyZWFkRXRjKGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCBlbnRyeUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRocmVhZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aHJlYWRQcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdGhyZWFkU3RhY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfdGhyZWFkX2lkX3QgKnRocmVhZElkKTsKLQotLy8gR2V0IHNvbWUgc29ydCBvZiB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotZXh0ZXJuIGFuZHJvaWRfdGhyZWFkX2lkX3QgYW5kcm9pZEdldFRocmVhZElkKCk7Ci0KLS8vIExvdy1sZXZlbCB0aHJlYWQgY3JlYXRpb24gLS0gbmV2ZXIgY3JlYXRlcyB0aHJlYWRzIHRoYXQgY2FuCi0vLyBpbnRlcmFjdCB3aXRoIHRoZSBKYXZhIFZNLgotZXh0ZXJuIGludCBhbmRyb2lkQ3JlYXRlUmF3VGhyZWFkRXRjKGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCBlbnRyeUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRocmVhZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aHJlYWRQcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdGhyZWFkU3RhY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfdGhyZWFkX2lkX3QgKnRocmVhZElkKTsKLQotLy8gVXNlZCBieSB0aGUgSmF2YSBSdW50aW1lIHRvIGNvbnRyb2wgaG93IHRocmVhZHMgYXJlIGNyZWF0ZWQsIHNvIHRoYXQKLS8vIHRoZXkgY2FuIGJlIHByb3BlciBhbmQgbG92ZWx5IEphdmEgdGhyZWFkcy4KLXR5cGVkZWYgaW50ICgqYW5kcm9pZF9jcmVhdGVfdGhyZWFkX2ZuKShhbmRyb2lkX3RocmVhZF9mdW5jX3QgZW50cnlGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0aHJlYWROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGhyZWFkUHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRocmVhZFN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3RocmVhZF9pZF90ICp0aHJlYWRJZCk7Ci0KLWV4dGVybiB2b2lkIGFuZHJvaWRTZXRDcmVhdGVUaHJlYWRGdW5jKGFuZHJvaWRfY3JlYXRlX3RocmVhZF9mbiBmdW5jKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFeHRyYSBmdW5jdGlvbnMgd29ya2luZyB3aXRoIHJhdyBwaWRzLgotCi0vLyBHZXQgcGlkIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCi1leHRlcm4gcGlkX3QgYW5kcm9pZEdldFRpZCgpOwotCi0vLyBDaGFuZ2UgdGhlIHNjaGVkdWxpbmcgZ3JvdXAgb2YgYSBwYXJ0aWN1bGFyIHRocmVhZC4gIFRoZSBncm91cAotLy8gc2hvdWxkIGJlIG9uZSBvZiB0aGUgQU5EUk9JRF9UR1JPVVAgY29uc3RhbnRzLiAgUmV0dXJucyBCQURfVkFMVUUgaWYKLS8vIGdycCBpcyBvdXQgb2YgcmFuZ2UsIGVsc2UgYW5vdGhlciBub24temVybyB2YWx1ZSB3aXRoIGVycm5vIHNldCBpZgotLy8gdGhlIG9wZXJhdGlvbiBmYWlsZWQuICBUaHJlYWQgSUQgemVybyBtZWFucyBjdXJyZW50IHRocmVhZC4KLWV4dGVybiBpbnQgYW5kcm9pZFNldFRocmVhZFNjaGVkdWxpbmdHcm91cChwaWRfdCB0aWQsIGludCBncnApOwotCi0vLyBDaGFuZ2UgdGhlIHByaW9yaXR5IEFORCBzY2hlZHVsaW5nIGdyb3VwIG9mIGEgcGFydGljdWxhciB0aHJlYWQuICBUaGUgcHJpb3JpdHkKLS8vIHNob3VsZCBiZSBvbmUgb2YgdGhlIEFORFJPSURfUFJJT1JJVFkgY29uc3RhbnRzLiAgUmV0dXJucyBJTlZBTElEX09QRVJBVElPTgotLy8gaWYgdGhlIHByaW9yaXR5IHNldCBmYWlsZWQsIGVsc2UgYW5vdGhlciB2YWx1ZSBpZiBqdXN0IHRoZSBncm91cCBzZXQgZmFpbGVkOwotLy8gaW4gZWl0aGVyIGNhc2UgZXJybm8gaXMgc2V0LiAgVGhyZWFkIElEIHplcm8gbWVhbnMgY3VycmVudCB0aHJlYWQuCi1leHRlcm4gaW50IGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eShwaWRfdCB0aWQsIGludCBwcmlvKTsKLQotLy8gR2V0IHRoZSBjdXJyZW50IHByaW9yaXR5IG9mIGEgcGFydGljdWxhciB0aHJlYWQuIFJldHVybnMgb25lIG9mIHRoZQotLy8gQU5EUk9JRF9QUklPUklUWSBjb25zdGFudHMgb3IgYSBuZWdhdGl2ZSByZXN1bHQgaW4gY2FzZSBvZiBlcnJvci4KLWV4dGVybiBpbnQgYW5kcm9pZEdldFRocmVhZFByaW9yaXR5KHBpZF90IHRpZCk7Ci0KLS8vIEdldCB0aGUgY3VycmVudCBzY2hlZHVsaW5nIGdyb3VwIG9mIGEgcGFydGljdWxhciB0aHJlYWQuIE5vcm1hbGx5IHJldHVybnMKLS8vIG9uZSBvZiB0aGUgQU5EUk9JRF9UR1JPVVAgY29uc3RhbnRzIG90aGVyIHRoYW4gQU5EUk9JRF9UR1JPVVBfREVGQVVMVC4KLS8vIFJldHVybnMgQU5EUk9JRF9UR1JPVVBfREVGQVVMVCBpZiBubyBwdGhyZWFkIHN1cHBvcnQgKGUuZy4gb24gaG9zdCkgb3IgaWYKLS8vIHNjaGVkdWxpbmcgZ3JvdXBzIGFyZSBkaXNhYmxlZC4gIFJldHVybnMgSU5WQUxJRF9PUEVSQVRJT04gaWYgdW5leHBlY3RlZCBlcnJvci4KLS8vIFRocmVhZCBJRCB6ZXJvIG1lYW5zIGN1cnJlbnQgdGhyZWFkLgotZXh0ZXJuIGludCBhbmRyb2lkR2V0VGhyZWFkU2NoZWR1bGluZ0dyb3VwKHBpZF90IHRpZCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQysrIEFQSQotI2lmZGVmIF9fY3BsdXNwbHVzCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIENyZWF0ZSBhbmQgcnVuIGEgbmV3IHRocmVhZC4KLWlubGluZSBib29sIGNyZWF0ZVRocmVhZCh0aHJlYWRfZnVuY190IGYsIHZvaWQgKmEpIHsKLSAgICByZXR1cm4gYW5kcm9pZENyZWF0ZVRocmVhZChmLCBhKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotLy8gQ3JlYXRlIHRocmVhZCB3aXRoIGxvdHMgb2YgcGFyYW1ldGVycwotaW5saW5lIGJvb2wgY3JlYXRlVGhyZWFkRXRjKHRocmVhZF9mdW5jX3QgZW50cnlGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0aHJlYWROYW1lID0gImFuZHJvaWQ6dW5uYW1lZF90aHJlYWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGhyZWFkUHJpb3JpdHkgPSBQUklPUklUWV9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0aHJlYWRTdGFja1NpemUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9pZF90ICp0aHJlYWRJZCA9IDApCi17Ci0gICAgcmV0dXJuIGFuZHJvaWRDcmVhdGVUaHJlYWRFdGMoZW50cnlGdW5jdGlvbiwgdXNlckRhdGEsIHRocmVhZE5hbWUsCi0gICAgICAgIHRocmVhZFByaW9yaXR5LCB0aHJlYWRTdGFja1NpemUsIHRocmVhZElkKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotLy8gR2V0IHNvbWUgc29ydCBvZiB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotaW5saW5lIHRocmVhZF9pZF90IGdldFRocmVhZElkKCkgewotICAgIHJldHVybiBhbmRyb2lkR2V0VGhyZWFkSWQoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLSNlbmRpZiAgLy8gX19jcGx1c3BsdXMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIF9MSUJTX1VUSUxTX0FORFJPSURfVEhSRUFEU19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0F0b21pYy5oIGIvaW5jbHVkZS91dGlscy9BdG9taWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViNDc2Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL0F0b21pYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9VVElMU19BVE9NSUNfSAotI2RlZmluZSBBTkRST0lEX1VUSUxTX0FUT01JQ19ICi0KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+Ci0KLSNlbmRpZiAvLyBBTkRST0lEX1VUSUxTX0FUT01JQ19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0Jhc2ljSGFzaHRhYmxlLmggYi9pbmNsdWRlL3V0aWxzL0Jhc2ljSGFzaHRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjk3MzguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9CYXNpY0hhc2h0YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfQkFTSUNfSEFTSFRBQkxFX0gKLSNkZWZpbmUgQU5EUk9JRF9CQVNJQ19IQVNIVEFCTEVfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU2hhcmVkQnVmZmVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVHlwZUhlbHBlcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBJbXBsZW1lbnRhdGlvbiB0eXBlLiAgTm90aGluZyB0byBzZWUgaGVyZS4gKi8KLWNsYXNzIEJhc2ljSGFzaHRhYmxlSW1wbCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgc3RydWN0IEJ1Y2tldCB7Ci0gICAgICAgIC8vIFRoZSBjb2xsaXNpb24gZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgYnVja2V0IGlzIHBhcnQgb2YgYSBjb2xsaXNpb24gY2hhaW4KLSAgICAgICAgLy8gc3VjaCB0aGF0IGF0IGxlYXN0IHR3byBlbnRyaWVzIGJvdGggaGFzaCB0byB0aGlzIGJ1Y2tldC4gIFdoZW4gdHJ1ZSwgd2UKLSAgICAgICAgLy8gbWF5IG5lZWQgdG8gc2VlayBmdXJ0aGVyIGFsb25nIHRoZSBjaGFpbiB0byBmaW5kIHRoZSBlbnRyeS4KLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IENPTExJU0lPTiA9IDB4ODAwMDAwMDBVTDsKLQotICAgICAgICAvLyBUaGUgcHJlc2VudCBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBidWNrZXQgY29udGFpbnMgYW4gaW5pdGlhbGl6ZWQgZW50cnkgdmFsdWUuCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBQUkVTRU5UICAgPSAweDQwMDAwMDAwVUw7Ci0KLSAgICAgICAgLy8gTWFzayBmb3IgMzAgYml0cyB3b3J0aCBvZiB0aGUgaGFzaCBjb2RlIHRoYXQgYXJlIHN0b3JlZCB3aXRoaW4gdGhlIGJ1Y2tldCB0bwotICAgICAgICAvLyBzcGVlZCB1cCBsb29rdXBzIGFuZCByZWhhc2hpbmcgYnkgZWxpbWluYXRpbmcgdGhlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlCi0gICAgICAgIC8vIGhhc2ggY29kZSBvZiB0aGUgZW50cnkncyBrZXkuCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBIQVNIX01BU0sgPSAweDNmZmZmZmZmVUw7Ci0KLSAgICAgICAgLy8gQ29tYmluZWQgdmFsdWUgdGhhdCBzdG9yZXMgdGhlIGNvbGxpc2lvbiBhbmQgcHJlc2VudCBmbGFncyBhcyB3ZWxsIGFzCi0gICAgICAgIC8vIGEgMzAgYml0IGhhc2ggY29kZS4KLSAgICAgICAgdWludDMyX3QgY29va2llOwotCi0gICAgICAgIC8vIFN0b3JhZ2UgZm9yIHRoZSBlbnRyeSBiZWdpbnMgaGVyZS4KLSAgICAgICAgY2hhciBlbnRyeVswXTsKLSAgICB9OwotCi0gICAgQmFzaWNIYXNodGFibGVJbXBsKHNpemVfdCBlbnRyeVNpemUsIGJvb2wgaGFzVHJpdmlhbERlc3RydWN0b3IsCi0gICAgICAgICAgICBzaXplX3QgbWluaW11bUluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3Rvcik7Ci0gICAgQmFzaWNIYXNodGFibGVJbXBsKGNvbnN0IEJhc2ljSGFzaHRhYmxlSW1wbCYgb3RoZXIpOwotCi0gICAgdm9pZCBkaXNwb3NlKCk7Ci0KLSAgICBpbmxpbmUgdm9pZCBlZGl0KCkgewotICAgICAgICBpZiAobUJ1Y2tldHMgJiYgIVNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobUJ1Y2tldHMpLT5vbmx5T3duZXIoKSkgewotICAgICAgICAgICAgY2xvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0VG8oY29uc3QgQmFzaWNIYXNodGFibGVJbXBsJiBvdGhlcik7Ci0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgc3NpemVfdCBuZXh0KHNzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgIHNzaXplX3QgZmluZChzc2l6ZV90IGluZGV4LCBoYXNoX3QgaGFzaCwgY29uc3Qgdm9pZCogX19yZXN0cmljdF9fIGtleSkgY29uc3Q7Ci0gICAgc2l6ZV90IGFkZChoYXNoX3QgaGFzaCwgY29uc3Qgdm9pZCogX19yZXN0cmljdF9fIGVudHJ5KTsKLSAgICB2b2lkIHJlbW92ZUF0KHNpemVfdCBpbmRleCk7Ci0gICAgdm9pZCByZWhhc2goc2l6ZV90IG1pbmltdW1DYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3Rvcik7Ci0KLSAgICBjb25zdCBzaXplX3QgbUJ1Y2tldFNpemU7IC8vIG51bWJlciBvZiBieXRlcyBwZXIgYnVja2V0IGluY2x1ZGluZyB0aGUgZW50cnkKLSAgICBjb25zdCBib29sIG1IYXNUcml2aWFsRGVzdHJ1Y3RvcjsgLy8gdHJ1ZSBpZiB0aGUgZW50cnkgdHlwZSBkb2VzIG5vdCByZXF1aXJlIGRlc3RydWN0aW9uCi0gICAgc2l6ZV90IG1DYXBhY2l0eTsgICAgICAgICAvLyBudW1iZXIgb2YgYnVja2V0cyB0aGF0IGNhbiBiZSBmaWxsZWQgYmVmb3JlIGV4Y2VlZGluZyBsb2FkIGZhY3RvcgotICAgIGZsb2F0IG1Mb2FkRmFjdG9yOyAgICAgICAgLy8gbG9hZCBmYWN0b3IKLSAgICBzaXplX3QgbVNpemU7ICAgICAgICAgICAgIC8vIG51bWJlciBvZiBlbGVtZW50cyBhY3R1YWxseSBpbiB0aGUgdGFibGUKLSAgICBzaXplX3QgbUZpbGxlZEJ1Y2tldHM7ICAgIC8vIG51bWJlciBvZiBidWNrZXRzIGZvciB3aGljaCBjb2xsaXNpb24gb3IgcHJlc2VudCBpcyB0cnVlCi0gICAgc2l6ZV90IG1CdWNrZXRDb3VudDsgICAgICAvLyBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIG1CdWNrZXRzIGFycmF5Ci0gICAgdm9pZCogbUJ1Y2tldHM7ICAgICAgICAgICAvLyBhcnJheSBvZiBidWNrZXRzLCBhcyBhIFNoYXJlZEJ1ZmZlcgotCi0gICAgaW5saW5lIGNvbnN0IEJ1Y2tldCYgYnVja2V0QXQoY29uc3Qgdm9pZCogX19yZXN0cmljdF9fIGJ1Y2tldHMsIHNpemVfdCBpbmRleCkgY29uc3QgewotICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQnVja2V0Kj4oCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1Y2tldHMpICsgaW5kZXggKiBtQnVja2V0U2l6ZSk7Ci0gICAgfQotCi0gICAgaW5saW5lIEJ1Y2tldCYgYnVja2V0QXQodm9pZCogX19yZXN0cmljdF9fIGJ1Y2tldHMsIHNpemVfdCBpbmRleCkgY29uc3QgewotICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVja2V0Kj4oc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1Y2tldHMpICsgaW5kZXggKiBtQnVja2V0U2l6ZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGNvbXBhcmVCdWNrZXRLZXkoY29uc3QgQnVja2V0JiBidWNrZXQsIGNvbnN0IHZvaWQqIF9fcmVzdHJpY3RfXyBrZXkpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZUJ1Y2tldEVudHJ5KEJ1Y2tldCYgYnVja2V0LCBjb25zdCB2b2lkKiBfX3Jlc3RyaWN0X18gZW50cnkpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveUJ1Y2tldEVudHJ5KEJ1Y2tldCYgYnVja2V0KSBjb25zdCA9IDA7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBjbG9uZSgpOwotCi0gICAgLy8gQWxsb2NhdGVzIGEgYnVja2V0IGFycmF5IGFzIGEgU2hhcmVkQnVmZmVyLgotICAgIHZvaWQqIGFsbG9jYXRlQnVja2V0cyhzaXplX3QgY291bnQpIGNvbnN0OwotCi0gICAgLy8gUmVsZWFzZXMgYSBidWNrZXQgYXJyYXkncyBhc3NvY2lhdGVkIFNoYXJlZEJ1ZmZlci4KLSAgICB2b2lkIHJlbGVhc2VCdWNrZXRzKHZvaWQqIF9fcmVzdHJpY3RfXyBidWNrZXRzLCBzaXplX3QgY291bnQpIGNvbnN0OwotCi0gICAgLy8gRGVzdHJveXMgdGhlIGNvbnRlbnRzIG9mIGJ1Y2tldHMgKGludm9rZXMgZGVzdHJveUJ1Y2tldEVudHJ5IGZvciBlYWNoCi0gICAgLy8gcG9wdWxhdGVkIGJ1Y2tldCBpZiBuZWVkZWQpLgotICAgIHZvaWQgZGVzdHJveUJ1Y2tldHModm9pZCogX19yZXN0cmljdF9fIGJ1Y2tldHMsIHNpemVfdCBjb3VudCkgY29uc3Q7Ci0KLSAgICAvLyBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgYnVja2V0cyAoY29waWVzIHRoZSBjb29raWUgYW5kIGludm9rZXMgY29weUJ1Y2tldEVudHJ5Ci0gICAgLy8gZm9yIGVhY2ggcG9wdWxhdGVkIGJ1Y2tldCBpZiBuZWVkZWQpLgotICAgIHZvaWQgY29weUJ1Y2tldHMoY29uc3Qgdm9pZCogX19yZXN0cmljdF9fIGZyb21CdWNrZXRzLAotICAgICAgICAgICAgdm9pZCogX19yZXN0cmljdF9fIHRvQnVja2V0cywgc2l6ZV90IGNvdW50KSBjb25zdDsKLQotICAgIC8vIERldGVybWluZXMgdGhlIGFwcHJvcHJpYXRlIHNpemUgb2YgYSBidWNrZXQgYXJyYXkgdG8gc3RvcmUgYSBjZXJ0YWluIG1pbmltdW0KLSAgICAvLyBudW1iZXIgb2YgZW50cmllcyBhbmQgcmV0dXJucyBpdHMgZWZmZWN0aXZlIGNhcGFjaXR5LgotICAgIHN0YXRpYyB2b2lkIGRldGVybWluZUNhcGFjaXR5KHNpemVfdCBtaW5pbXVtQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IsCi0gICAgICAgICAgICBzaXplX3QqIF9fcmVzdHJpY3RfXyBvdXRCdWNrZXRDb3VudCwgc2l6ZV90KiBfX3Jlc3RyaWN0X18gb3V0Q2FwYWNpdHkpOwotCi0gICAgLy8gVHJpbSBhIGhhc2ggY29kZSB0byAzMCBiaXRzIHRvIG1hdGNoIHdoYXQgd2Ugc3RvcmUgaW4gdGhlIGJ1Y2tldCdzIGNvb2tpZS4KLSAgICBpbmxpbmUgc3RhdGljIGhhc2hfdCB0cmltSGFzaChoYXNoX3QgaGFzaCkgewotICAgICAgICByZXR1cm4gKGhhc2ggJiBCdWNrZXQ6OkhBU0hfTUFTSykgXiAoaGFzaCA+PiAzMCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ1Y2tldCB0aGF0IGlzIGluIHRoZSBjb2xsaXNpb24gY2hhaW4KLSAgICAvLyBmb3IgdGhlIHNwZWNpZmllZCBoYXNoIGNvZGUsIGdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnVja2V0cy4KLSAgICAvLyAoUHJpbWFyeSBoYXNoKQotICAgIGlubGluZSBzdGF0aWMgc2l6ZV90IGNoYWluU3RhcnQoaGFzaF90IGhhc2gsIHNpemVfdCBjb3VudCkgewotICAgICAgICByZXR1cm4gaGFzaCAlIGNvdW50OwotICAgIH0KLQotICAgIC8vIFJldHVybnMgdGhlIGluY3JlbWVudCB0byBhZGQgdG8gYSBidWNrZXQgaW5kZXggdG8gc2VlayB0byB0aGUgbmV4dCBidWNrZXQKLSAgICAvLyBpbiB0aGUgY29sbGlzaW9uIGNoYWluIGZvciB0aGUgc3BlY2lmaWVkIGhhc2ggY29kZSwgZ2l2ZW4gdGhlIHRvdGFsIG51bWJlciBvZiBidWNrZXRzLgotICAgIC8vIChTZWNvbmRhcnkgaGFzaCkKLSAgICBpbmxpbmUgc3RhdGljIHNpemVfdCBjaGFpbkluY3JlbWVudChoYXNoX3QgaGFzaCwgc2l6ZV90IGNvdW50KSB7Ci0gICAgICAgIHJldHVybiAoKGhhc2ggPj4gNykgfCAoaGFzaCA8PCAyNSkpICUgKGNvdW50IC0gMSkgKyAxOwotICAgIH0KLQotICAgIC8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJ1Y2tldCB0aGF0IGlzIGluIHRoZSBjb2xsaXNpb24gY2hhaW4KLSAgICAvLyB0aGF0IGlzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCBpbmNyZW1lbnQsIGdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnVja2V0cy4KLSAgICBpbmxpbmUgc3RhdGljIHNpemVfdCBjaGFpblNlZWsoc2l6ZV90IGluZGV4LCBzaXplX3QgaW5jcmVtZW50LCBzaXplX3QgY291bnQpIHsKLSAgICAgICAgcmV0dXJuIChpbmRleCArIGluY3JlbWVudCkgJSBjb3VudDsKLSAgICB9Ci19OwotCi0vKgotICogQSBCYXNpY0hhc2h0YWJsZSBzdG9yZXMgZW50cmllcyB0aGF0IGFyZSBpbmRleGVkIGJ5IGhhc2ggY29kZSBpbiBwbGFjZQotICogd2l0aGluIGFuIGFycmF5LiAgVGhlIGJhc2ljIG9wZXJhdGlvbnMgYXJlIGZpbmRpbmcgZW50cmllcyBieSBrZXksCi0gKiBhZGRpbmcgbmV3IGVudHJpZXMgYW5kIHJlbW92aW5nIGV4aXN0aW5nIGVudHJpZXMuCi0gKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHZlcnkgbGltaXRlZCBzZXQgb2Ygb3BlcmF0aW9ucyB3aXRoIHNpbXBsZSBzZW1hbnRpY3MuCi0gKiBJdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgYnVpbGRpbmcgYmxvY2sgdG8gY29uc3RydWN0IG1vcmUgY29tcGxleAotICogYW5kIGludGVyZXN0aW5nIGRhdGEgc3RydWN0dXJlcyBzdWNoIGFzIEhhc2hNYXAuICBUaGluayB2ZXJ5IGhhcmQgYmVmb3JlCi0gKiBhZGRpbmcgYW55dGhpbmcgZXh0cmEgdG8gQmFzaWNIYXNodGFibGUsIGl0IHByb2JhYmx5IGJlbG9uZ3MgYXQgYQotICogaGlnaGVyIGxldmVsIG9mIGFic3RyYWN0aW9uLgotICoKLSAqIFRLZXk6IFRoZSBrZXkgdHlwZS4KLSAqIFRFbnRyeTogVGhlIGVudHJ5IHR5cGUgd2hpY2ggaXMgd2hhdCBpcyBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIGFycmF5LgotICoKLSAqIFRLZXkgbXVzdCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgY29udHJhY3Q6Ci0gKiAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRLZXkmIG90aGVyKSBjb25zdDsgIC8vIHJldHVybiB0cnVlIGlmIGVxdWFsCi0gKiAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRLZXkmIG90aGVyKSBjb25zdDsgIC8vIHJldHVybiB0cnVlIGlmIHVuZXF1YWwKLSAqCi0gKiBURW50cnkgbXVzdCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgY29udHJhY3Q6Ci0gKiAgICAgY29uc3QgVEtleSYgZ2V0S2V5KCkgY29uc3Q7ICAvLyBnZXQgdGhlIGtleSBmcm9tIHRoZSBlbnRyeQotICoKLSAqIFRoaXMgY2xhc3Mgc3VwcG9ydHMgc3RvcmluZyBlbnRyaWVzIHdpdGggZHVwbGljYXRlIGtleXMuICBPZiBjb3Vyc2UsIGl0IGNhbid0Ci0gKiB0ZWxsIHRoZW0gYXBhcnQgZHVyaW5nIHJlbW92YWwgc28gb25seSB0aGUgZmlyc3QgZW50cnkgd2lsbCBiZSByZW1vdmVkLgotICogV2UgZG8gdGhpcyBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgb3BlcmF0aW9ucyBsaWtlIGFkZCgpIGNhbid0IGZhaWwuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBUS2V5LCB0eXBlbmFtZSBURW50cnk+Ci1jbGFzcyBCYXNpY0hhc2h0YWJsZSA6IHByaXZhdGUgQmFzaWNIYXNodGFibGVJbXBsIHsKLXB1YmxpYzoKLSAgICAvKiBDcmVhdGVzIGEgaGFzaHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBtaW5pbXVtIGluaXRpYWwgY2FwYWNpdHkuCi0gICAgICogVGhlIHVuZGVybHlpbmcgYXJyYXkgd2lsbCBiZSBjcmVhdGVkIHdoZW4gdGhlIGZpcnN0IGVudHJ5IGlzIGFkZGVkLgotICAgICAqCi0gICAgICogbWluaW11bUluaXRpYWxDYXBhY2l0eTogVGhlIG1pbmltdW0gaW5pdGlhbCBjYXBhY2l0eSBmb3IgdGhlIGhhc2h0YWJsZS4KLSAgICAgKiAgICAgRGVmYXVsdCBpcyAwLgotICAgICAqIGxvYWRGYWN0b3I6IFRoZSBkZXNpcmVkIGxvYWQgZmFjdG9yIGZvciB0aGUgaGFzaHRhYmxlLCBiZXR3ZWVuIDAgYW5kIDEuCi0gICAgICogICAgIERlZmF1bHQgaXMgMC43NS4KLSAgICAgKi8KLSAgICBCYXNpY0hhc2h0YWJsZShzaXplX3QgbWluaW11bUluaXRpYWxDYXBhY2l0eSA9IDAsIGZsb2F0IGxvYWRGYWN0b3IgPSAwLjc1Zik7Ci0KLSAgICAvKiBDb3BpZXMgYSBoYXNodGFibGUuCi0gICAgICogVGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpcyBzaGFyZWQgY29weS1vbi13cml0ZS4KLSAgICAgKi8KLSAgICBCYXNpY0hhc2h0YWJsZShjb25zdCBCYXNpY0hhc2h0YWJsZSYgb3RoZXIpOwotCi0gICAgLyogQ2xlYXJzIGFuZCBkZXN0cm95cyB0aGUgaGFzaHRhYmxlLgotICAgICAqLwotICAgIHZpcnR1YWwgfkJhc2ljSGFzaHRhYmxlKCk7Ci0KLSAgICAvKiBNYWtpbmcgdGhpcyBoYXNodGFibGUgYSBjb3B5IG9mIHRoZSBvdGhlciBoYXNodGFibGUuCi0gICAgICogVGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpcyBzaGFyZWQgY29weS1vbi13cml0ZS4KLSAgICAgKgotICAgICAqIG90aGVyOiBUaGUgaGFzaHRhYmxlIHRvIGNvcHkuCi0gICAgICovCi0gICAgaW5saW5lIEJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT4mIG9wZXJhdG9yID0oY29uc3QgQmFzaWNIYXNodGFibGU8VEtleSwgVEVudHJ5PiAmIG90aGVyKSB7Ci0gICAgICAgIHNldFRvKG90aGVyKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBoYXNodGFibGUuCi0gICAgICovCi0gICAgaW5saW5lIHNpemVfdCBzaXplKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVNpemU7Ci0gICAgfQotCi0gICAgLyogUmV0dXJucyB0aGUgY2FwYWNpdHkgb2YgdGhlIGhhc2h0YWJsZSwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGNhbgotICAgICAqIGFkZGVkIHRvIHRoZSBoYXNodGFibGUgd2l0aG91dCByZXF1aXJpbmcgaXQgdG8gYmUgZ3Jvd24uCi0gICAgICovCi0gICAgaW5saW5lIHNpemVfdCBjYXBhY2l0eSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1DYXBhY2l0eTsKLSAgICB9Ci0KLSAgICAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnVja2V0cyB0aGF0IHRoZSBoYXNodGFibGUgaGFzLCB3aGljaCBpcyB0aGUgc2l6ZSBvZiBpdHMKLSAgICAgKiB1bmRlcmx5aW5nIGFycmF5LgotICAgICAqLwotICAgIGlubGluZSBzaXplX3QgYnVja2V0Q291bnQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtQnVja2V0Q291bnQ7Ci0gICAgfQotCi0gICAgLyogUmV0dXJucyB0aGUgbG9hZCBmYWN0b3Igb2YgdGhlIGhhc2h0YWJsZS4gKi8KLSAgICBpbmxpbmUgZmxvYXQgbG9hZEZhY3RvcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Mb2FkRmFjdG9yOwotICAgIH07Ci0KLSAgICAvKiBSZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbnRyeSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAqCi0gICAgICogaW5kZXg6ICAgVGhlIGluZGV4IG9mIHRoZSBlbnRyeSB0byByZXRyaWV2ZS4gIE11c3QgYmUgYSB2YWxpZCBpbmRleCB3aXRoaW4KLSAgICAgKiAgICAgICAgICB0aGUgYm91bmRzIG9mIHRoZSBoYXNodGFibGUuCi0gICAgICovCi0gICAgaW5saW5lIGNvbnN0IFRFbnRyeSYgZW50cnlBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGVudHJ5Rm9yKGJ1Y2tldEF0KG1CdWNrZXRzLCBpbmRleCkpOwotICAgIH0KLQotICAgIC8qIFJldHVybnMgYSBub24tY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbnRyeSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAqCi0gICAgICogaW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgZW50cnkgdG8gZWRpdC4gIE11c3QgYmUgYSB2YWxpZCBpbmRleCB3aXRoaW4KLSAgICAgKiAgICAgICAgdGhlIGJvdW5kcyBvZiB0aGUgaGFzaHRhYmxlLgotICAgICAqLwotICAgIGlubGluZSBURW50cnkmIGVkaXRFbnRyeUF0KHNpemVfdCBpbmRleCkgewotICAgICAgICBlZGl0KCk7Ci0gICAgICAgIHJldHVybiBlbnRyeUZvcihidWNrZXRBdChtQnVja2V0cywgaW5kZXgpKTsKLSAgICB9Ci0KLSAgICAvKiBDbGVhcnMgdGhlIGhhc2h0YWJsZS4KLSAgICAgKiBBbGwgZW50cmllcyBpbiB0aGUgaGFzaHRhYmxlIGFyZSBkZXN0cm95ZWQgaW1tZWRpYXRlbHkuCi0gICAgICogSWYgeW91IG5lZWQgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwgd2l0aCB0aGUgZW50cmllcyBpbiB0aGUgaGFzaHRhYmxlIHRoZW4gaXRlcmF0ZQotICAgICAqIG92ZXIgdGhlbSBhbmQgZG8gd2hhdCB5b3UgbmVlZCBiZWZvcmUgY2xlYXJpbmcgdGhlIGhhc2h0YWJsZS4KLSAgICAgKi8KLSAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgQmFzaWNIYXNodGFibGVJbXBsOjpjbGVhcigpOwotICAgIH0KLQotICAgIC8qIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBoYXNodGFibGUgZ2l2ZW4gdGhlIGluZGV4IG9mIGEgcHJldmlvdXMgZW50cnkuCi0gICAgICogSWYgdGhlIGdpdmVuIGluZGV4IGlzIC0xLCB0aGVuIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgaGFzaHRhYmxlLAotICAgICAqIGlmIHRoZXJlIGlzIG9uZSwgb3IgLTEgb3RoZXJ3aXNlLgotICAgICAqIElmIHRoZSBnaXZlbiBpbmRleCBpcyBub3QgLTEsIHRoZW4gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgZW50cnkgaW4gdGhlIGhhc2h0YWJsZSwKLSAgICAgKiBpbiBzdHJpY3RseSBpbmNyZWFzaW5nIG9yZGVyLCBvciAtMSBpZiB0aGVyZSBhcmUgbm9uZSBsZWZ0LgotICAgICAqCi0gICAgICogaW5kZXg6ICAgVGhlIGluZGV4IG9mIHRoZSBwcmV2aW91cyBlbnRyeSB0aGF0IHdhcyBpdGVyYXRlZCwgb3IgLTEgdG8gYmVnaW4KLSAgICAgKiAgICAgICAgICBpdGVyYXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGFzaHRhYmxlLgotICAgICAqLwotICAgIGlubGluZSBzc2l6ZV90IG5leHQoc3NpemVfdCBpbmRleCkgY29uc3QgewotICAgICAgICByZXR1cm4gQmFzaWNIYXNodGFibGVJbXBsOjpuZXh0KGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKiBGaW5kcyB0aGUgaW5kZXggb2YgYW4gZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKiBJZiB0aGUgZ2l2ZW4gaW5kZXggaXMgLTEsIHRoZW4gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGVudHJ5LAotICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBtYXRjaGluZyBlbnRyeS4KLSAgICAgKiBJZiB0aGUgaGFzaHRhYmxlIGNvbnRhaW5zIG11bHRpcGxlIGVudHJpZXMgd2l0aCBrZXlzIHRoYXQgbWF0Y2ggdGhlIHJlcXVlc3RlZAotICAgICAqIGtleSwgdGhlbiB0aGUgc2VxdWVuY2Ugb2YgZW50cmllcyByZXR1cm5lZCBpcyBhcmJpdHJhcnkuCi0gICAgICogUmV0dXJucyAtMSBpZiBubyBlbnRyeSB3YXMgZm91bmQuCi0gICAgICoKLSAgICAgKiBpbmRleDogICBUaGUgaW5kZXggb2YgdGhlIHByZXZpb3VzIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBrZXksIG9yIC0xIHRvCi0gICAgICogICAgICAgICAgZmluZCB0aGUgZmlyc3QgbWF0Y2hpbmcgZW50cnkuCi0gICAgICogaGFzaDogICAgVGhlIGhhc2hjb2RlIG9mIHRoZSBrZXkuCi0gICAgICoga2V5OiAgICAgVGhlIGtleS4KLSAgICAgKi8KLSAgICBpbmxpbmUgc3NpemVfdCBmaW5kKHNzaXplX3QgaW5kZXgsIGhhc2hfdCBoYXNoLCBjb25zdCBUS2V5JiBrZXkpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEJhc2ljSGFzaHRhYmxlSW1wbDo6ZmluZChpbmRleCwgaGFzaCwgJmtleSk7Ci0gICAgfQotCi0gICAgLyogQWRkcyB0aGUgZW50cnkgdG8gdGhlIGhhc2h0YWJsZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV3bHkgYWRkZWQgZW50cnkuCi0gICAgICogSWYgYW4gZW50cnkgd2l0aCB0aGUgc2FtZSBrZXkgYWxyZWFkeSBleGlzdHMsIHRoZW4gYSBkdXBsaWNhdGUgZW50cnkgaXMgYWRkZWQuCi0gICAgICogSWYgdGhlIGVudHJ5IHdpbGwgbm90IGZpdCwgdGhlbiB0aGUgaGFzaHRhYmxlJ3MgY2FwYWNpdHkgaXMgaW5jcmVhc2VkIGFuZAotICAgICAqIGl0cyBjb250ZW50cyBhcmUgcmVoYXNoZWQuICBTZWUgcmVoYXNoKCkuCi0gICAgICoKLSAgICAgKiBoYXNoOiAgICBUaGUgaGFzaGNvZGUgb2YgdGhlIGtleS4KLSAgICAgKiBlbnRyeTogICBUaGUgZW50cnkgdG8gYWRkLgotICAgICAqLwotICAgIGlubGluZSBzaXplX3QgYWRkKGhhc2hfdCBoYXNoLCBjb25zdCBURW50cnkmIGVudHJ5KSB7Ci0gICAgICAgIHJldHVybiBCYXNpY0hhc2h0YWJsZUltcGw6OmFkZChoYXNoLCAmZW50cnkpOwotICAgIH0KLQotICAgIC8qIFJlbW92ZXMgdGhlIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoZSBoYXNodGFibGUuCi0gICAgICogVGhlIGVudHJ5IGlzIGRlc3Ryb3llZCBpbW1lZGlhdGVseS4KLSAgICAgKiBUaGUgaW5kZXggbXVzdCBiZSB2YWxpZC4KLSAgICAgKgotICAgICAqIFRoZSBoYXNodGFibGUgaXMgbm90IGNvbXBhY3RlZCBhZnRlciBhbiBpdGVtIGlzIHJlbW92ZWQsIHNvIGl0IGlzIGxlZ2FsCi0gICAgICogdG8gY29udGludWUgaXRlcmF0aW5nIG92ZXIgdGhlIGhhc2h0YWJsZSB1c2luZyBuZXh0KCkgb3IgZmluZCgpLgotICAgICAqCi0gICAgICogaW5kZXg6ICAgVGhlIGluZGV4IG9mIHRoZSBlbnRyeSB0byByZW1vdmUuICBNdXN0IGJlIGEgdmFsaWQgaW5kZXggd2l0aGluIHRoZQotICAgICAqICAgICAgICAgIGJvdW5kcyBvZiB0aGUgaGFzaHRhYmxlLCBhbmQgaXQgbXVzdCByZWZlciB0byBhbiBleGlzdGluZyBlbnRyeS4KLSAgICAgKi8KLSAgICBpbmxpbmUgdm9pZCByZW1vdmVBdChzaXplX3QgaW5kZXgpIHsKLSAgICAgICAgQmFzaWNIYXNodGFibGVJbXBsOjpyZW1vdmVBdChpbmRleCk7Ci0gICAgfQotCi0gICAgLyogUmVoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBoYXNodGFibGUuCi0gICAgICogR3Jvd3MgdGhlIGhhc2h0YWJsZSB0byBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIG1pbmltdW0gY2FwYWNpdHkgb3IgdGhlCi0gICAgICogY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMsIHdoaWNoZXZlciBpcyBsYXJnZXIuCi0gICAgICoKLSAgICAgKiBSZWhhc2hpbmcgY2F1c2VzIGFsbCBlbnRyaWVzIHRvIGJlIGNvcGllZCBhbmQgdGhlIGVudHJ5IGluZGljZXMgbWF5IGNoYW5nZS4KLSAgICAgKiBBbHRob3VnaCB0aGUgaGFzaCBjb2RlcyBhcmUgY2FjaGVkIGJ5IHRoZSBoYXNodGFibGUsIHJlaGFzaGluZyBjYW4gYmUgYW4KLSAgICAgKiBleHBlbnNpdmUgb3BlcmF0aW9uIGFuZCBzaG91bGQgYmUgYXZvaWRlZCB1bmxlc3MgdGhlIGhhc2h0YWJsZSdzIHNpemUKLSAgICAgKiBuZWVkcyB0byBiZSBjaGFuZ2VkLgotICAgICAqCi0gICAgICogUmVoYXNoaW5nIGlzIHRoZSBvbmx5IHdheSB0byBjaGFuZ2UgdGhlIGNhcGFjaXR5IG9yIGxvYWQgZmFjdG9yIG9mIHRoZQotICAgICAqIGhhc2h0YWJsZSBvbmNlIGl0IGhhcyBiZWVuIGNyZWF0ZWQuICBJdCBjYW4gYmUgdXNlZCB0byBjb21wYWN0IHRoZQotICAgICAqIGhhc2h0YWJsZSBieSBjaG9vc2luZyBhIG1pbmltdW0gY2FwYWNpdHkgdGhhdCBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQKLSAgICAgKiBjYXBhY2l0eSAoc3VjaCBhcyAwKS4KLSAgICAgKgotICAgICAqIG1pbmltdW1DYXBhY2l0eTogVGhlIGRlc2lyZWQgbWluaW11bSBjYXBhY2l0eSBhZnRlciByZWhhc2hpbmcuCi0gICAgICogbG9hZEZhY3RvcjogVGhlIGRlc2lyZWQgbG9hZCBmYWN0b3IgYWZ0ZXIgcmVoYXNoaW5nLgotICAgICAqLwotICAgIGlubGluZSB2b2lkIHJlaGFzaChzaXplX3QgbWluaW11bUNhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0gICAgICAgIEJhc2ljSGFzaHRhYmxlSW1wbDo6cmVoYXNoKG1pbmltdW1DYXBhY2l0eSwgbG9hZEZhY3Rvcik7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGlubGluZSBjb25zdCBURW50cnkmIGVudHJ5Rm9yKGNvbnN0IEJ1Y2tldCYgYnVja2V0KSB7Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFRFbnRyeSY+KGJ1Y2tldC5lbnRyeSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGlubGluZSBURW50cnkmIGVudHJ5Rm9yKEJ1Y2tldCYgYnVja2V0KSB7Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFRFbnRyeSY+KGJ1Y2tldC5lbnRyeSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGNvbXBhcmVCdWNrZXRLZXkoY29uc3QgQnVja2V0JiBidWNrZXQsIGNvbnN0IHZvaWQqIF9fcmVzdHJpY3RfXyBrZXkpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplQnVja2V0RW50cnkoQnVja2V0JiBidWNrZXQsIGNvbnN0IHZvaWQqIF9fcmVzdHJpY3RfXyBlbnRyeSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGRlc3Ryb3lCdWNrZXRFbnRyeShCdWNrZXQmIGJ1Y2tldCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgLy8gRm9yIGR1bXBpbmcgdGhlIHJhdyBjb250ZW50cyBvZiBhIGhhc2h0YWJsZSBkdXJpbmcgdGVzdGluZy4KLSAgICBmcmllbmQgY2xhc3MgQmFzaWNIYXNodGFibGVUZXN0OwotICAgIGlubGluZSB1aW50MzJfdCBjb29raWVBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGJ1Y2tldEF0KG1CdWNrZXRzLCBpbmRleCkuY29va2llOwotICAgIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUS2V5LCB0eXBlbmFtZSBURW50cnk+Ci1CYXNpY0hhc2h0YWJsZTxUS2V5LCBURW50cnk+OjpCYXNpY0hhc2h0YWJsZShzaXplX3QgbWluaW11bUluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgOgotICAgICAgICBCYXNpY0hhc2h0YWJsZUltcGwoc2l6ZW9mKFRFbnRyeSksIHRyYWl0czxURW50cnk+OjpoYXNfdHJpdmlhbF9kdG9yLAotICAgICAgICAgICAgICAgIG1pbmltdW1Jbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IpIHsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRLZXksIHR5cGVuYW1lIFRFbnRyeT4KLUJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT46OkJhc2ljSGFzaHRhYmxlKGNvbnN0IEJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT4mIG90aGVyKSA6Ci0gICAgICAgIEJhc2ljSGFzaHRhYmxlSW1wbChvdGhlcikgewotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEtleSwgdHlwZW5hbWUgVEVudHJ5PgotQmFzaWNIYXNodGFibGU8VEtleSwgVEVudHJ5Pjo6fkJhc2ljSGFzaHRhYmxlKCkgewotICAgIGRpc3Bvc2UoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRLZXksIHR5cGVuYW1lIFRFbnRyeT4KLWJvb2wgQmFzaWNIYXNodGFibGU8VEtleSwgVEVudHJ5Pjo6Y29tcGFyZUJ1Y2tldEtleShjb25zdCBCdWNrZXQmIGJ1Y2tldCwKLSAgICAgICAgY29uc3Qgdm9pZCogX19yZXN0cmljdF9fIGtleSkgY29uc3QgewotICAgIHJldHVybiBlbnRyeUZvcihidWNrZXQpLmdldEtleSgpID09ICpzdGF0aWNfY2FzdDxjb25zdCBUS2V5Kj4oa2V5KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRLZXksIHR5cGVuYW1lIFRFbnRyeT4KLXZvaWQgQmFzaWNIYXNodGFibGU8VEtleSwgVEVudHJ5Pjo6aW5pdGlhbGl6ZUJ1Y2tldEVudHJ5KEJ1Y2tldCYgYnVja2V0LAotICAgICAgICBjb25zdCB2b2lkKiBfX3Jlc3RyaWN0X18gZW50cnkpIGNvbnN0IHsKLSAgICBpZiAoIXRyYWl0czxURW50cnk+OjpoYXNfdHJpdmlhbF9jb3B5KSB7Ci0gICAgICAgIG5ldyAoJmVudHJ5Rm9yKGJ1Y2tldCkpIFRFbnRyeSgqKHN0YXRpY19jYXN0PGNvbnN0IFRFbnRyeSo+KGVudHJ5KSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1lbWNweSgmZW50cnlGb3IoYnVja2V0KSwgZW50cnksIHNpemVvZihURW50cnkpKTsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUS2V5LCB0eXBlbmFtZSBURW50cnk+Ci12b2lkIEJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT46OmRlc3Ryb3lCdWNrZXRFbnRyeShCdWNrZXQmIGJ1Y2tldCkgY29uc3QgewotICAgIGlmICghdHJhaXRzPFRFbnRyeT46Omhhc190cml2aWFsX2R0b3IpIHsKLSAgICAgICAgZW50cnlGb3IoYnVja2V0KS5+VEVudHJ5KCk7Ci0gICAgfQotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9CQVNJQ19IQVNIVEFCTEVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9CaXRTZXQuaCBiL2luY2x1ZGUvdXRpbHMvQml0U2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTJlODYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9CaXRTZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBVVElMU19CSVRTRVRfSAotI2RlZmluZSBVVElMU19CSVRTRVRfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLS8qCi0gKiBDb250YWlucyBzb21lIGJpdCBtYW5pcHVsYXRpb24gaGVscGVycy4KLSAqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEEgc2ltcGxlIHNldCBvZiAzMiBiaXRzIHRoYXQgY2FuIGJlIGluZGl2aWR1YWxseSBtYXJrZWQgb3IgY2xlYXJlZC4KLXN0cnVjdCBCaXRTZXQzMiB7Ci0gICAgdWludDMyX3QgdmFsdWU7Ci0KLSAgICBpbmxpbmUgQml0U2V0MzIoKSA6IHZhbHVlKDApIHsgfQotICAgIGV4cGxpY2l0IGlubGluZSBCaXRTZXQzMih1aW50MzJfdCB2YWx1ZSkgOiB2YWx1ZSh2YWx1ZSkgeyB9Ci0KLSAgICAvLyBHZXRzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGJpdCBpbmRleC4KLSAgICBzdGF0aWMgaW5saW5lIHVpbnQzMl90IHZhbHVlRm9yQml0KHVpbnQzMl90IG4pIHsgcmV0dXJuIDB4ODAwMDAwMDAgPj4gbjsgfQotCi0gICAgLy8gQ2xlYXJzIHRoZSBiaXQgc2V0LgotICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeyB2YWx1ZSA9IDA7IH0KLQotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXJrZWQgYml0cyBpbiB0aGUgc2V0LgotICAgIGlubGluZSB1aW50MzJfdCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudCh2YWx1ZSk7IH0KLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYml0IHNldCBkb2VzIG5vdCBjb250YWluIGFueSBtYXJrZWQgYml0cy4KLSAgICBpbmxpbmUgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gISB2YWx1ZTsgfQotCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBiaXQgc2V0IGRvZXMgbm90IGNvbnRhaW4gYW55IHVubWFya2VkIGJpdHMuCi0gICAgaW5saW5lIGJvb2wgaXNGdWxsKCkgY29uc3QgeyByZXR1cm4gdmFsdWUgPT0gMHhmZmZmZmZmZjsgfQotCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYml0IGlzIG1hcmtlZC4KLSAgICBpbmxpbmUgYm9vbCBoYXNCaXQodWludDMyX3QgbikgY29uc3QgeyByZXR1cm4gdmFsdWUgJiB2YWx1ZUZvckJpdChuKTsgfQotCi0gICAgLy8gTWFya3MgdGhlIHNwZWNpZmllZCBiaXQuCi0gICAgaW5saW5lIHZvaWQgbWFya0JpdCh1aW50MzJfdCBuKSB7IHZhbHVlIHw9IHZhbHVlRm9yQml0KG4pOyB9Ci0KLSAgICAvLyBDbGVhcnMgdGhlIHNwZWNpZmllZCBiaXQuCi0gICAgaW5saW5lIHZvaWQgY2xlYXJCaXQodWludDMyX3QgbikgeyB2YWx1ZSAmPSB+IHZhbHVlRm9yQml0KG4pOyB9Ci0KLSAgICAvLyBGaW5kcyB0aGUgZmlyc3QgbWFya2VkIGJpdCBpbiB0aGUgc2V0LgotICAgIC8vIFJlc3VsdCBpcyB1bmRlZmluZWQgaWYgYWxsIGJpdHMgYXJlIHVubWFya2VkLgotICAgIGlubGluZSB1aW50MzJfdCBmaXJzdE1hcmtlZEJpdCgpIGNvbnN0IHsgcmV0dXJuIF9fYnVpbHRpbl9jbHoodmFsdWUpOyB9Ci0KLSAgICAvLyBGaW5kcyB0aGUgZmlyc3QgdW5tYXJrZWQgYml0IGluIHRoZSBzZXQuCi0gICAgLy8gUmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBhbGwgYml0cyBhcmUgbWFya2VkLgotICAgIGlubGluZSB1aW50MzJfdCBmaXJzdFVubWFya2VkQml0KCkgY29uc3QgeyByZXR1cm4gX19idWlsdGluX2Nseih+IHZhbHVlKTsgfQotCi0gICAgLy8gRmluZHMgdGhlIGxhc3QgbWFya2VkIGJpdCBpbiB0aGUgc2V0LgotICAgIC8vIFJlc3VsdCBpcyB1bmRlZmluZWQgaWYgYWxsIGJpdHMgYXJlIHVubWFya2VkLgotICAgIGlubGluZSB1aW50MzJfdCBsYXN0TWFya2VkQml0KCkgY29uc3QgeyByZXR1cm4gMzEgLSBfX2J1aWx0aW5fY3R6KHZhbHVlKTsgfQotCi0gICAgLy8gRmluZHMgdGhlIGZpcnN0IG1hcmtlZCBiaXQgaW4gdGhlIHNldCBhbmQgY2xlYXJzIGl0LiAgUmV0dXJucyB0aGUgYml0IGluZGV4LgotICAgIC8vIFJlc3VsdCBpcyB1bmRlZmluZWQgaWYgYWxsIGJpdHMgYXJlIHVubWFya2VkLgotICAgIGlubGluZSB1aW50MzJfdCBjbGVhckZpcnN0TWFya2VkQml0KCkgewotICAgICAgICB1aW50MzJfdCBuID0gZmlyc3RNYXJrZWRCaXQoKTsKLSAgICAgICAgY2xlYXJCaXQobik7Ci0gICAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIC8vIEZpbmRzIHRoZSBmaXJzdCB1bm1hcmtlZCBiaXQgaW4gdGhlIHNldCBhbmQgbWFya3MgaXQuICBSZXR1cm5zIHRoZSBiaXQgaW5kZXguCi0gICAgLy8gUmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBhbGwgYml0cyBhcmUgbWFya2VkLgotICAgIGlubGluZSB1aW50MzJfdCBtYXJrRmlyc3RVbm1hcmtlZEJpdCgpIHsKLSAgICAgICAgdWludDMyX3QgbiA9IGZpcnN0VW5tYXJrZWRCaXQoKTsKLSAgICAgICAgbWFya0JpdChuKTsKLSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQotCi0gICAgLy8gRmluZHMgdGhlIGxhc3QgbWFya2VkIGJpdCBpbiB0aGUgc2V0IGFuZCBjbGVhcnMgaXQuICBSZXR1cm5zIHRoZSBiaXQgaW5kZXguCi0gICAgLy8gUmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBhbGwgYml0cyBhcmUgdW5tYXJrZWQuCi0gICAgaW5saW5lIHVpbnQzMl90IGNsZWFyTGFzdE1hcmtlZEJpdCgpIHsKLSAgICAgICAgdWludDMyX3QgbiA9IGxhc3RNYXJrZWRCaXQoKTsKLSAgICAgICAgY2xlYXJCaXQobik7Ci0gICAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIC8vIEdldHMgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgYml0IGluIHRoZSBzZXQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YKLSAgICAvLyBtYXJrZWQgYml0cyB0aGF0IGFwcGVhciBiZWZvcmUgdGhlIHNwZWNpZmllZCBiaXQuCi0gICAgaW5saW5lIHVpbnQzMl90IGdldEluZGV4T2ZCaXQodWludDMyX3QgbikgY29uc3QgewotICAgICAgICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50KHZhbHVlICYgfigweGZmZmZmZmZmVUwgPj4gbikpOwotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0gKGNvbnN0IEJpdFNldDMyJiBvdGhlcikgY29uc3QgeyByZXR1cm4gdmFsdWUgPT0gb3RoZXIudmFsdWU7IH0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9IChjb25zdCBCaXRTZXQzMiYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIHZhbHVlICE9IG90aGVyLnZhbHVlOyB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBVVElMU19CSVRTRVRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9CbG9iQ2FjaGUuaCBiL2luY2x1ZGUvdXRpbHMvQmxvYkNhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzQyYTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9CbG9iQ2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0JMT0JfQ0FDSEVfSAotI2RlZmluZSBBTkRST0lEX0JMT0JfQ0FDSEVfSAotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9GbGF0dGVuYWJsZS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gQSBCbG9iQ2FjaGUgaXMgYW4gaW4tbWVtb3J5IGNhY2hlIGZvciBiaW5hcnkga2V5L3ZhbHVlIHBhaXJzLiAgQSBCbG9iQ2FjaGUKLS8vIGRvZXMgTk9UIHByb3ZpZGUgYW55IHRocmVhZC1zYWZldHkgZ3VhcmFudGVlcy4KLS8vCi0vLyBUaGUgY2FjaGUgY29udGVudHMgY2FuIGJlIHNlcmlhbGl6ZWQgdG8gYW4gaW4tbWVtb3J5IGJ1ZmZlciBvciBtbWFwJ2QgZmlsZQotLy8gYW5kIHRoZW4gcmVsb2FkZWQgaW4gYSBzdWJzZXF1ZW50IGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbS4gIFRoaXMKLS8vIHNlcmlhbGl6YXRpb24gaXMgbm9uLXBvcnRhYmxlIGFuZCB0aGUgZGF0YSBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBkZXZpY2UKLS8vIHRoYXQgZ2VuZXJhdGVkIGl0LgotY2xhc3MgQmxvYkNhY2hlIDogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBGbGF0dGVuYWJsZSB7Ci1wdWJsaWM6Ci0KLSAgICAvLyBDcmVhdGUgYW4gZW1wdHkgYmxvYiBjYWNoZS4gVGhlIGJsb2IgY2FjaGUgd2lsbCBjYWNoZSBrZXkvdmFsdWUgcGFpcnMKLSAgICAvLyB3aXRoIGtleSBhbmQgdmFsdWUgc2l6ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1heEtleVNpemUgYW5kCi0gICAgLy8gbWF4VmFsdWVTaXplLCByZXNwZWN0aXZlbHkuIFRoZSB0b3RhbCBjb21iaW5lZCBzaXplIG9mIEFMTCBjYWNoZSBlbnRyaWVzCi0gICAgLy8gKGtleSBzaXplcyBwbHVzIHZhbHVlIHNpemVzKSB3aWxsIG5vdCBleGNlZWQgbWF4VG90YWxTaXplLgotICAgIEJsb2JDYWNoZShzaXplX3QgbWF4S2V5U2l6ZSwgc2l6ZV90IG1heFZhbHVlU2l6ZSwgc2l6ZV90IG1heFRvdGFsU2l6ZSk7Ci0KLSAgICAvLyBzZXQgaW5zZXJ0cyBhIG5ldyBiaW5hcnkgdmFsdWUgaW50byB0aGUgY2FjaGUgYW5kIGFzc29jaWF0ZXMgaXQgd2l0aCB0aGUKLSAgICAvLyBnaXZlbiBiaW5hcnkga2V5LiAgSWYgdGhlIGtleSBvciB2YWx1ZSBhcmUgdG9vIGxhcmdlIGZvciB0aGUgY2FjaGUgdGhlbgotICAgIC8vIHRoZSBjYWNoZSByZW1haW5zIHVuY2hhbmdlZC4gIFRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgYSBkaWZmZXJlbnQKLSAgICAvLyB2YWx1ZSB3YXMgcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSAtIHRoZSBvbGQgdmFsdWUgd2lsbAotICAgIC8vIHJlbWFpbiBpbiB0aGUgY2FjaGUuICBJZiB0aGUgZ2l2ZW4ga2V5IGFuZCB2YWx1ZSBhcmUgc21hbGwgZW5vdWdoIHRvIGJlCi0gICAgLy8gcHV0IGluIHRoZSBjYWNoZSAoYmFzZWQgb24gdGhlIG1heEtleVNpemUsIG1heFZhbHVlU2l6ZSwgYW5kIG1heFRvdGFsU2l6ZQotICAgIC8vIHZhbHVlcyBzcGVjaWZpZWQgdG8gdGhlIEJsb2JDYWNoZSBjb25zdHJ1Y3RvciksIHRoZW4gdGhlIGtleS92YWx1ZSBwYWlyCi0gICAgLy8gd2lsbCBiZSBpbiB0aGUgY2FjaGUgYWZ0ZXIgc2V0IHJldHVybnMuICBOb3RlLCBob3dldmVyLCB0aGF0IGEgc3Vic2VxdWVudAotICAgIC8vIGNhbGwgdG8gc2V0IG1heSBldmljdCBvbGQga2V5L3ZhbHVlIHBhaXJzIGZyb20gdGhlIGNhY2hlLgotICAgIC8vCi0gICAgLy8gUHJlY29uZGl0aW9uczoKLSAgICAvLyAgIGtleSAhPSBOVUxMCi0gICAgLy8gICAwIDwga2V5U2l6ZQotICAgIC8vICAgdmFsdWUgIT0gTlVMTAotICAgIC8vICAgMCA8IHZhbHVlU2l6ZQotICAgIHZvaWQgc2V0KGNvbnN0IHZvaWQqIGtleSwgc2l6ZV90IGtleVNpemUsIGNvbnN0IHZvaWQqIHZhbHVlLAotICAgICAgICAgICAgc2l6ZV90IHZhbHVlU2l6ZSk7Ci0KLSAgICAvLyBnZXQgcmV0cmlldmVzIGZyb20gdGhlIGNhY2hlIHRoZSBiaW5hcnkgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KLSAgICAvLyBiaW5hcnkga2V5LiAgSWYgdGhlIGtleSBpcyBwcmVzZW50IGluIHRoZSBjYWNoZSB0aGVuIHRoZSBsZW5ndGggb2YgdGhlCi0gICAgLy8gYmluYXJ5IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGtleSBpcyByZXR1cm5lZC4gIElmIHRoZSB2YWx1ZSBhcmd1bWVudAotICAgIC8vIGlzIG5vbi1OVUxMIGFuZCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGVkIHZhbHVlIGlzIGxlc3MgdGhhbiB2YWx1ZVNpemUgYnl0ZXMKLSAgICAvLyB0aGVuIHRoZSBjYWNoZWQgdmFsdWUgaXMgY29waWVkIGludG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHRoZSB2YWx1ZQotICAgIC8vIGFyZ3VtZW50LiAgSWYgdGhlIGtleSBpcyBub3QgcHJlc2VudCBpbiB0aGUgY2FjaGUgdGhlbiAwIGlzIHJldHVybmVkIGFuZAotICAgIC8vIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUgdmFsdWUgYXJndW1lbnQgaXMgbm90IG1vZGlmaWVkLgotICAgIC8vCi0gICAgLy8gTm90ZSB0aGF0IHdoZW4gY2FsbGluZyBnZXQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBrZXksIHRoZSBsYXRlcgotICAgIC8vIGNhbGxzIG1heSBmYWlsLCByZXR1cm5pbmcgMCwgZXZlbiBpZiBlYXJsaWVyIGNhbGxzIHN1Y2NlZWRlZC4gIFRoZSByZXR1cm4KLSAgICAvLyB2YWx1ZSBtdXN0IGJlIGNoZWNrZWQgZm9yIGVhY2ggY2FsbC4KLSAgICAvLwotICAgIC8vIFByZWNvbmRpdGlvbnM6Ci0gICAgLy8gICBrZXkgIT0gTlVMTAotICAgIC8vICAgMCA8IGtleVNpemUKLSAgICAvLyAgIDAgPD0gdmFsdWVTaXplCi0gICAgc2l6ZV90IGdldChjb25zdCB2b2lkKiBrZXksIHNpemVfdCBrZXlTaXplLCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHZhbHVlU2l6ZSk7Ci0KLSAgICAvLyBnZXRGbGF0dGVuZWRTaXplIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gc3RvcmUgdGhlIGVudGlyZQotICAgIC8vIHNlcmlhbGl6ZWQgY2FjaGUuCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZSgpIGNvbnN0OwotCi0gICAgLy8gZ2V0RmRDb3VudCByZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB0aGF0IHdpbGwgcmVzdWx0IGZyb20KLSAgICAvLyBmbGF0dGVuaW5nIHRoZSBjYWNoZS4gIFRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIDAgc28gYXMgdG8gYWxsb3cgdGhlCi0gICAgLy8gZmxhdHRlbmVkIGNhY2hlIHRvIGJlIHNhdmVkIHRvIGRpc2sgYW5kIHRoZW4gbGF0ZXIgcmVzdG9yZWQuCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0RmRDb3VudCgpIGNvbnN0OwotCi0gICAgLy8gZmxhdHRlbiBzZXJpYWxpemVzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBjYWNoZSBpbnRvIHRoZSBtZW1vcnkKLSAgICAvLyBwb2ludGVkIHRvIGJ5ICdidWZmZXInLiAgVGhlIHNlcmlhbGl6ZWQgY2FjaGUgY29udGVudHMgY2FuIGxhdGVyIGJlCi0gICAgLy8gbG9hZGVkIGludG8gYSBCbG9iQ2FjaGUgb2JqZWN0IHVzaW5nIHRoZSB1bmZsYXR0ZW4gbWV0aG9kLiAgVGhlIGNvbnRlbnRzCi0gICAgLy8gb2YgdGhlIEJsb2JDYWNoZSBvYmplY3Qgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0gICAgLy8KLSAgICAvLyBQcmVjb25kaXRpb25zOgotICAgIC8vICAgc2l6ZSA+PSB0aGlzLmdldEZsYXR0ZW5lZFNpemUoKQotICAgIC8vICAgY291bnQgPT0gMAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmxhdHRlbih2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBpbnQgZmRzW10sCi0gICAgICAgICAgICBzaXplX3QgY291bnQpIGNvbnN0OwotCi0gICAgLy8gdW5mbGF0dGVuIHJlcGxhY2VzIHRoZSBjb250ZW50cyBvZiB0aGUgY2FjaGUgd2l0aCB0aGUgc2VyaWFsaXplZCBjYWNoZQotICAgIC8vIGNvbnRlbnRzIGluIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSAnYnVmZmVyJy4gIFRoZSBwcmV2aW91cyBjb250ZW50cyBvZgotICAgIC8vIHRoZSBCbG9iQ2FjaGUgd2lsbCBiZSBldmljdGVkIGZyb20gdGhlIGNhY2hlLiAgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0gICAgLy8gdW5mbGF0dGVuaW5nIHRoZSBzZXJpYWxpemVkIGNhY2hlIGNvbnRlbnRzIHRoZW4gdGhlIEJsb2JDYWNoZSB3aWxsIGJlCi0gICAgLy8gbGVmdCBpbiBhbiBlbXB0eSBzdGF0ZS4KLSAgICAvLwotICAgIC8vIFByZWNvbmRpdGlvbnM6Ci0gICAgLy8gICBjb3VudCA9PSAwCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1bmZsYXR0ZW4odm9pZCBjb25zdCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgaW50IGZkc1tdLAotICAgICAgICAgICAgc2l6ZV90IGNvdW50KTsKLQotcHJpdmF0ZToKLSAgICAvLyBDb3B5aW5nIGlzIGRpc2FsbG93ZWQuCi0gICAgQmxvYkNhY2hlKGNvbnN0IEJsb2JDYWNoZSYpOwotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEJsb2JDYWNoZSYpOwotCi0gICAgLy8gQSByYW5kb20gZnVuY3Rpb24gaGVscGVyIHRvIGdldCBhcm91bmQgTWluR1cgbm90IGhhdmluZyBucmFuZDQ4KCkKLSAgICBsb25nIGludCBibG9iX3JhbmRvbSgpOwotCi0gICAgLy8gY2xlYW4gZXZpY3RzIGEgcmFuZG9tbHkgY2hvc2VuIHNldCBvZiBlbnRyaWVzIGZyb20gdGhlIGNhY2hlIHN1Y2ggdGhhdAotICAgIC8vIHRoZSB0b3RhbCBzaXplIG9mIGFsbCByZW1haW5pbmcgZW50cmllcyBpcyBsZXNzIHRoYW4gbU1heFRvdGFsU2l6ZS8yLgotICAgIHZvaWQgY2xlYW4oKTsKLQotICAgIC8vIGlzQ2xlYW5hYmxlIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FjaGUgaXMgZnVsbCBlbm91Z2ggZm9yIHRoZSBjbGVhbiBtZXRob2QKLSAgICAvLyB0byBoYXZlIHNvbWUgZWZmZWN0LCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgIGJvb2wgaXNDbGVhbmFibGUoKSBjb25zdDsKLQotICAgIC8vIEEgQmxvYiBpcyBhbiBpbW11dGFibGUgc2l6ZWQgdW5zdHJ1Y3R1cmVkIGRhdGEgYmxvYi4KLSAgICBjbGFzcyBCbG9iIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgQmxvYihjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBjb3B5RGF0YSk7Ci0gICAgICAgIH5CbG9iKCk7Ci0KLSAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQmxvYiYgcmhzKSBjb25zdDsKLQotICAgICAgICBjb25zdCB2b2lkKiBnZXREYXRhKCkgY29uc3Q7Ci0gICAgICAgIHNpemVfdCBnZXRTaXplKCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBDb3B5aW5nIGlzIG5vdCBhbGxvd2VkLgotICAgICAgICBCbG9iKGNvbnN0IEJsb2ImKTsKLSAgICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQmxvYiYpOwotCi0gICAgICAgIC8vIG1EYXRhIHBvaW50cyB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGJsb2IgZGF0YS4KLSAgICAgICAgY29uc3Qgdm9pZCogbURhdGE7Ci0KLSAgICAgICAgLy8gbVNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJsb2IgZGF0YSBpbiBieXRlcy4KLSAgICAgICAgc2l6ZV90IG1TaXplOwotCi0gICAgICAgIC8vIG1Pd25zRGF0YSBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyBCbG9iIG9iamVjdCBzaG91bGQgZnJlZSB0aGUKLSAgICAgICAgLy8gbWVtb3J5IHBvaW50ZWQgdG8gYnkgbURhdGEgd2hlbiB0aGUgQmxvYiBnZXRzIGRlc3RydWN0ZWQuCi0gICAgICAgIGJvb2wgbU93bnNEYXRhOwotICAgIH07Ci0KLSAgICAvLyBBIENhY2hlRW50cnkgaXMgYSBzaW5nbGUga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIGNhY2hlLgotICAgIGNsYXNzIENhY2hlRW50cnkgewotICAgIHB1YmxpYzoKLSAgICAgICAgQ2FjaGVFbnRyeSgpOwotICAgICAgICBDYWNoZUVudHJ5KGNvbnN0IHNwPEJsb2I+JiBrZXksIGNvbnN0IHNwPEJsb2I+JiB2YWx1ZSk7Ci0gICAgICAgIENhY2hlRW50cnkoY29uc3QgQ2FjaGVFbnRyeSYgY2UpOwotCi0gICAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENhY2hlRW50cnkmIHJocykgY29uc3Q7Ci0gICAgICAgIGNvbnN0IENhY2hlRW50cnkmIG9wZXJhdG9yPShjb25zdCBDYWNoZUVudHJ5Jik7Ci0KLSAgICAgICAgc3A8QmxvYj4gZ2V0S2V5KCkgY29uc3Q7Ci0gICAgICAgIHNwPEJsb2I+IGdldFZhbHVlKCkgY29uc3Q7Ci0KLSAgICAgICAgdm9pZCBzZXRWYWx1ZShjb25zdCBzcDxCbG9iPiYgdmFsdWUpOwotCi0gICAgcHJpdmF0ZToKLQotICAgICAgICAvLyBtS2V5IGlzIHRoZSBrZXkgdGhhdCBpZGVudGlmaWVzIHRoZSBjYWNoZSBlbnRyeS4KLSAgICAgICAgc3A8QmxvYj4gbUtleTsKLQotICAgICAgICAvLyBtVmFsdWUgaXMgdGhlIGNhY2hlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LgotICAgICAgICBzcDxCbG9iPiBtVmFsdWU7Ci0gICAgfTsKLQotICAgIC8vIEEgSGVhZGVyIGlzIHRoZSBoZWFkZXIgZm9yIHRoZSBlbnRpcmUgQmxvYkNhY2hlIHNlcmlhbGl6YXRpb24gZm9ybWF0LiBObwotICAgIC8vIG5lZWQgdG8gbWFrZSB0aGlzIHBvcnRhYmxlLCBzbyB3ZSBzaW1wbHkgd3JpdGUgdGhlIHN0cnVjdCBvdXQuCi0gICAgc3RydWN0IEhlYWRlciB7Ci0gICAgICAgIC8vIG1NYWdpY051bWJlciBpcyB0aGUgbWFnaWMgbnVtYmVyIHRoYXQgaWRlbnRpZmllcyB0aGUgZGF0YSBhcwotICAgICAgICAvLyBzZXJpYWxpemVkIEJsb2JDYWNoZSBjb250ZW50cy4gIEl0IG11c3QgYWx3YXlzIGNvbnRhaW4gJ0JsYiQnLgotICAgICAgICB1aW50MzJfdCBtTWFnaWNOdW1iZXI7Ci0KLSAgICAgICAgLy8gbUJsb2JDYWNoZVZlcnNpb24gaXMgdGhlIHNlcmlhbGl6YXRpb24gZm9ybWF0IHZlcnNpb24uCi0gICAgICAgIHVpbnQzMl90IG1CbG9iQ2FjaGVWZXJzaW9uOwotCi0gICAgICAgIC8vIG1EZXZpY2VWZXJzaW9uIGlzIHRoZSBkZXZpY2Utc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgY2FjaGUuICBUaGlzIGNhbgotICAgICAgICAvLyBiZSB1c2VkIHRvIGludmFsaWRhdGUgdGhlIGNhY2hlLgotICAgICAgICB1aW50MzJfdCBtRGV2aWNlVmVyc2lvbjsKLQotICAgICAgICAvLyBtTnVtRW50cmllcyBpcyBudW1iZXIgb2YgY2FjaGUgZW50cmllcyBmb2xsb3dpbmcgdGhlIGhlYWRlciBpbiB0aGUKLSAgICAgICAgLy8gZGF0YS4KLSAgICAgICAgc2l6ZV90IG1OdW1FbnRyaWVzOwotICAgIH07Ci0KLSAgICAvLyBBbiBFbnRyeUhlYWRlciBpcyB0aGUgaGVhZGVyIGZvciBhIHNlcmlhbGl6ZWQgY2FjaGUgZW50cnkuICBObyBuZWVkIHRvCi0gICAgLy8gbWFrZSB0aGlzIHBvcnRhYmxlLCBzbyB3ZSBzaW1wbHkgd3JpdGUgdGhlIHN0cnVjdCBvdXQuICBFYWNoIEVudHJ5SGVhZGVyCi0gICAgLy8gaXMgZm9sbG93ZWQgaW1lZGlhdGVseSBieSB0aGUga2V5IGRhdGEgYW5kIHRoZW4gdGhlIHZhbHVlIGRhdGEuCi0gICAgLy8KLSAgICAvLyBUaGUgYmVnaW5uaW5nIG9mIGVhY2ggc2VyaWFsaXplZCBFbnRyeUhlYWRlciBpcyA0LWJ5dGUgYWxpZ25lZCwgc28gdGhlCi0gICAgLy8gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBzZXJpYWxpemVkIGNhY2hlIGVudHJ5IHdpbGwgb2NjdXB5IGlzOgotICAgIC8vCi0gICAgLy8gICAoKHNpemVvZihFbnRyeUhlYWRlcikgKyBrZXlTaXplICsgdmFsdWVTaXplKSArIDMpICYgfjMKLSAgICAvLwotICAgIHN0cnVjdCBFbnRyeUhlYWRlciB7Ci0gICAgICAgIC8vIG1LZXlTaXplIGlzIHRoZSBzaXplIG9mIHRoZSBlbnRyeSBrZXkgaW4gYnl0ZXMuCi0gICAgICAgIHNpemVfdCBtS2V5U2l6ZTsKLQotICAgICAgICAvLyBtVmFsdWVTaXplIGlzIHRoZSBzaXplIG9mIHRoZSBlbnRyeSB2YWx1ZSBpbiBieXRlcy4KLSAgICAgICAgc2l6ZV90IG1WYWx1ZVNpemU7Ci0KLSAgICAgICAgLy8gbURhdGEgY29udGFpbnMgYm90aCB0aGUga2V5IGFuZCB2YWx1ZSBkYXRhIGZvciB0aGUgY2FjaGUgZW50cnkuICBUaGUKLSAgICAgICAgLy8ga2V5IGNvbWVzIGZpcnN0IGZvbGxvd2VkIGltbWVkaWF0ZWx5IGJ5IHRoZSB2YWx1ZS4KLSAgICAgICAgdWludDhfdCBtRGF0YVtdOwotICAgIH07Ci0KLSAgICAvLyBtTWF4S2V5U2l6ZSBpcyB0aGUgbWF4aW11bSBrZXkgc2l6ZSB0aGF0IHdpbGwgYmUgY2FjaGVkLiBDYWxscyB0bwotICAgIC8vIEJsb2JDYWNoZTo6c2V0IHdpdGggYSBrZXlTaXplIHBhcmFtZXRlciBsYXJnZXIgdGhhbiBtTWF4S2V5U2l6ZSB3aWxsCi0gICAgLy8gc2ltcGx5IG5vdCBhZGQgdGhlIGtleS92YWx1ZSBwYWlyIHRvIHRoZSBjYWNoZS4KLSAgICBjb25zdCBzaXplX3QgbU1heEtleVNpemU7Ci0KLSAgICAvLyBtTWF4VmFsdWVTaXplIGlzIHRoZSBtYXhpbXVtIHZhbHVlIHNpemUgdGhhdCB3aWxsIGJlIGNhY2hlZC4gQ2FsbHMgdG8KLSAgICAvLyBCbG9iQ2FjaGU6OnNldCB3aXRoIGEgdmFsdWVTaXplIHBhcmFtZXRlciBsYXJnZXIgdGhhbiBtTWF4VmFsdWVTaXplIHdpbGwKLSAgICAvLyBzaW1wbHkgbm90IGFkZCB0aGUga2V5L3ZhbHVlIHBhaXIgdG8gdGhlIGNhY2hlLgotICAgIGNvbnN0IHNpemVfdCBtTWF4VmFsdWVTaXplOwotCi0gICAgLy8gbU1heFRvdGFsU2l6ZSBpcyB0aGUgbWF4aW11bSBzaXplIHRoYXQgYWxsIGNhY2hlIGVudHJpZXMgY2FuIG9jY3VweS4gVGhpcwotICAgIC8vIGluY2x1ZGVzIHNwYWNlIGZvciBib3RoIGtleXMgYW5kIHZhbHVlcy4gV2hlbiBhIGNhbGwgdG8gQmxvYkNhY2hlOjpzZXQKLSAgICAvLyB3b3VsZCBvdGhlcndpc2UgY2F1c2UgdGhpcyBsaW1pdCB0byBiZSBleGNlZWRlZCwgZWl0aGVyIHRoZSBrZXkvdmFsdWUKLSAgICAvLyBwYWlyIHBhc3NlZCB0byBCbG9iQ2FjaGU6OnNldCB3aWxsIG5vdCBiZSBjYWNoZWQgb3Igb3RoZXIgY2FjaGUgZW50cmllcwotICAgIC8vIHdpbGwgYmUgZXZpY3RlZCBmcm9tIHRoZSBjYWNoZSB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXcgZW50cnkuCi0gICAgY29uc3Qgc2l6ZV90IG1NYXhUb3RhbFNpemU7Ci0KLSAgICAvLyBtVG90YWxTaXplIGlzIHRoZSB0b3RhbCBjb21iaW5lZCBzaXplIG9mIGFsbCBrZXlzIGFuZCB2YWx1ZXMgY3VycmVudGx5IGluCi0gICAgLy8gdGhlIGNhY2hlLgotICAgIHNpemVfdCBtVG90YWxTaXplOwotCi0gICAgLy8gbVJhbmRTdGF0ZSBpcyB0aGUgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHN0YXRlLiBJdCBpcyBwYXNzZWQgdG8KLSAgICAvLyBucmFuZDQ4IHRvIGdlbmVyYXRlIHJhbmRvbSBudW1iZXJzIHdoZW4gbmVlZGVkLgotICAgIHVuc2lnbmVkIHNob3J0IG1SYW5kU3RhdGVbM107Ci0KLSAgICAvLyBtQ2FjaGVFbnRyaWVzIHN0b3JlcyBhbGwgdGhlIGNhY2hlIGVudHJpZXMgdGhhdCBhcmUgcmVzaWRlbnQgaW4gbWVtb3J5LgotICAgIC8vIENhY2hlIGVudHJpZXMgYXJlIGFkZGVkIHRvIGl0IGJ5IHRoZSAnc2V0JyBtZXRob2QuCi0gICAgU29ydGVkVmVjdG9yPENhY2hlRW50cnk+IG1DYWNoZUVudHJpZXM7Ci19OwotCi19Ci0KLSNlbmRpZiAvLyBBTkRST0lEX0JMT0JfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9CdWZmZXJlZFRleHRPdXRwdXQuaCBiL2luY2x1ZGUvdXRpbHMvQnVmZmVyZWRUZXh0T3V0cHV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YzYyNDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9CdWZmZXJlZFRleHRPdXRwdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfQlVGRkVSRURURVhUT1VUUFVUX0gKLSNkZWZpbmUgQU5EUk9JRF9CVUZGRVJFRFRFWFRPVVRQVVRfSAotCi0jaW5jbHVkZSA8dXRpbHMvVGV4dE91dHB1dC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvdWlvLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBCdWZmZXJlZFRleHRPdXRwdXQgOiBwdWJsaWMgVGV4dE91dHB1dAotewotcHVibGljOgotICAgIC8vKiogRmxhZ3MgZm9yIGNvbnN0cnVjdG9yICovCi0gICAgZW51bSB7Ci0gICAgICAgIE1VTFRJVEhSRUFERUQgPSAweDAwMDEKLSAgICB9OwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRUZXh0T3V0cHV0KHVpbnQzMl90IGZsYWdzID0gMCk7Ci0gICAgdmlydHVhbCAgICAgICAgICAgICB+QnVmZmVyZWRUZXh0T3V0cHV0KCk7Ci0gICAgCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmludChjb25zdCBjaGFyKiB0eHQsIHNpemVfdCBsZW4pOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgbW92ZUluZGVudChpbnQgZGVsdGEpOwotICAgIAotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcHVzaEJ1bmRsZSgpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcG9wQnVuZGxlKCk7Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICB3cml0ZUxpbmVzKGNvbnN0IHN0cnVjdCBpb3ZlYyYgdmVjLCBzaXplX3QgTikgPSAwOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBCdWZmZXJTdGF0ZTsKLSAgICBzdHJ1Y3QgVGhyZWFkU3RhdGU7Ci0gICAgCi0gICAgc3RhdGljICBUaHJlYWRTdGF0ZSpnZXRUaHJlYWRTdGF0ZSgpOwotICAgIHN0YXRpYyAgdm9pZCAgICAgICAgdGhyZWFkRGVzdHJ1Y3Rvcih2b2lkICpzdCk7Ci0gICAgCi0gICAgICAgICAgICBCdWZmZXJTdGF0ZSpnZXRCdWZmZXIoKSBjb25zdDsKLSAgICAgICAgICAgIAotICAgIHVpbnQzMl90ICAgICAgICAgICAgbUZsYWdzOwotICAgIGNvbnN0IGludDMyX3QgICAgICAgbVNlcTsKLSAgICBjb25zdCBpbnQzMl90ICAgICAgIG1JbmRleDsKLSAgICAKLSAgICBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIEJ1ZmZlclN0YXRlKiAgICAgICAgbUdsb2JhbFN0YXRlOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9CVUZGRVJFRFRFWFRPVVRQVVRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9CeXRlT3JkZXIuaCBiL2luY2x1ZGUvdXRpbHMvQnl0ZU9yZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYTNhODMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9CeXRlT3JkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotCi0jaWZuZGVmIF9MSUJTX1VUSUxTX0JZVEVfT1JERVJfSAotI2RlZmluZSBfTElCU19VVElMU19CWVRFX09SREVSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfV0lOU09DSwotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0jZWxzZQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNlbmRpZgotCi0vKgotICogVGhlc2UgbWFjcm9zIGFyZSBsaWtlIHRoZSBodG9uL250b2ggYnl0ZSBzd2FwcGluZyBtYWNyb3MsCi0gKiBleGNlcHQgdGhleSBhbGxvdyB5b3UgdG8gc3dhcCB0byBhbmQgZnJvbSB0aGUgImRldmljZSIgYnl0ZQotICogb3JkZXIuICBUaGUgZGV2aWNlIGJ5dGUgb3JkZXIgaXMgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHRhcmdldAotICogZGV2aWNlIC0tIGZvciB0aGUgQVJNIENQVXMgd2UgdXNlIHRvZGF5LCB0aGlzIGlzIGxpdHRsZSBlbmRpYW4uCi0gKgotICogTm90ZSB0aGF0IHRoZSBieXRlIHN3YXBwaW5nIGZ1bmN0aW9ucyBoYXZlIG5vdCBiZWVuIG9wdGltaXplZAotICogbXVjaDsgcGVyZm9ybWFuY2UgaXMgY3VycmVudGx5IG5vdCBhbiBpc3N1ZSBmb3IgdGhlbSBzaW5jZSB0aGUKLSAqIGludGVudCBpcyB0byBhbGxvdyB1cyB0byBhdm9pZCBieXRlIHN3YXBwaW5nIG9uIHRoZSBkZXZpY2UuCi0gKi8KLQotc3RhdGljIGlubGluZSB1aW50MzJfdCBhbmRyb2lkX3N3YXBfbG9uZyh1aW50MzJfdCB2KQotewotICAgIHJldHVybiAodjw8MjQpIHwgKCh2PDw4KSYweDAwRkYwMDAwKSB8ICgodj4+OCkmMHgwMDAwRkYwMCkgfCAodj4+MjQpOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQxNl90IGFuZHJvaWRfc3dhcF9zaG9ydCh1aW50MTZfdCB2KQotewotICAgIHJldHVybiAodjw8OCkgfCAodj4+OCk7Ci19Ci0KLSNkZWZpbmUgREVWSUNFX0JZVEVfT1JERVIgTElUVExFX0VORElBTgotCi0jaWYgQllURV9PUkRFUiA9PSBERVZJQ0VfQllURV9PUkRFUgotCi0jZGVmaW5lCWR0b2hsKHgpCSh4KQotI2RlZmluZQlkdG9ocyh4KQkoeCkKLSNkZWZpbmUJaHRvZGwoeCkJKHgpCi0jZGVmaW5lCWh0b2RzKHgpCSh4KQotCi0jZWxzZQotCi0jZGVmaW5lCWR0b2hsKHgpCShhbmRyb2lkX3N3YXBfbG9uZyh4KSkKLSNkZWZpbmUJZHRvaHMoeCkJKGFuZHJvaWRfc3dhcF9zaG9ydCh4KSkKLSNkZWZpbmUJaHRvZGwoeCkJKGFuZHJvaWRfc3dhcF9sb25nKHgpKQotI2RlZmluZQlodG9kcyh4KQkoYW5kcm9pZF9zd2FwX3Nob3J0KHgpKQotCi0jZW5kaWYKLQotI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgotI2RlZmluZSBmcm9tbGVsKHgpICh4KQotI2RlZmluZSBmcm9tbGVzKHgpICh4KQotI2RlZmluZSB0b2xlbCh4KSAoeCkKLSNkZWZpbmUgdG9sZXMoeCkgKHgpCi0jZWxzZQotI2RlZmluZSBmcm9tbGVsKHgpIChhbmRyb2lkX3N3YXBfbG9uZyh4KSkKLSNkZWZpbmUgZnJvbWxlcyh4KSAoYW5kcm9pZF9zd2FwX3Nob3J0KHgpKQotI2RlZmluZSB0b2xlbCh4KSAoYW5kcm9pZF9zd2FwX2xvbmcoeCkpCi0jZGVmaW5lIHRvbGVzKHgpIChhbmRyb2lkX3N3YXBfc2hvcnQoeCkpCi0jZW5kaWYKLQotI2VuZGlmIC8vIF9MSUJTX1VUSUxTX0JZVEVfT1JERVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9DYWxsU3RhY2suaCBiL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWUyMGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9DYWxsU3RhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfQ0FMTFNUQUNLX0gKLSNkZWZpbmUgQU5EUk9JRF9DQUxMU1RBQ0tfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8Y29ya3NjcmV3L2JhY2t0cmFjZS5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBDYWxsU3RhY2sKLXsKLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAgTUFYX0RFUFRIID0gMzEKLSAgICB9OwotCi0gICAgQ2FsbFN0YWNrKCk7Ci0gICAgQ2FsbFN0YWNrKGNvbnN0IENhbGxTdGFjayYgcmhzKTsKLSAgICB+Q2FsbFN0YWNrKCk7Ci0KLSAgICBDYWxsU3RhY2smIG9wZXJhdG9yID0gKGNvbnN0IENhbGxTdGFjayYgcmhzKTsKLSAgICAKLSAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBDYWxsU3RhY2smIHJocykgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ2FsbFN0YWNrJiByaHMpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgQ2FsbFN0YWNrJiByaHMpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3IgPj0gKGNvbnN0IENhbGxTdGFjayYgcmhzKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IENhbGxTdGFjayYgcmhzKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yIDw9IChjb25zdCBDYWxsU3RhY2smIHJocykgY29uc3Q7Ci0gICAgCi0gICAgY29uc3Qgdm9pZCogb3BlcmF0b3IgW10gKGludCBpbmRleCkgY29uc3Q7Ci0gICAgCi0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgdm9pZCB1cGRhdGUoaW50MzJfdCBpZ25vcmVEZXB0aD0xLCBpbnQzMl90IG1heERlcHRoPU1BWF9ERVBUSCk7Ci0KLSAgICAvLyBEdW1wIGEgc3RhY2sgdHJhY2UgdG8gdGhlIGxvZwotICAgIHZvaWQgZHVtcChjb25zdCBjaGFyKiBwcmVmaXggPSAwKSBjb25zdDsKLQotICAgIC8vIFJldHVybiBhIHN0cmluZyAocG9zc2libHkgdmVyeSBsb25nKSBjb250YWluaW5nIHRoZSBjb21wbGV0ZSBzdGFjayB0cmFjZQotICAgIFN0cmluZzggdG9TdHJpbmcoY29uc3QgY2hhciogcHJlZml4ID0gMCkgY29uc3Q7Ci0gICAgCi0gICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtQ291bnQ7IH0KLQotcHJpdmF0ZToKLSAgICBzaXplX3QgbUNvdW50OwotICAgIGJhY2t0cmFjZV9mcmFtZV90IG1TdGFja1tNQVhfREVQVEhdOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfQ0FMTFNUQUNLX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvQ29tcGF0LmggYi9pbmNsdWRlL3V0aWxzL0NvbXBhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODE5MjY2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvQ29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0xJQl9VVElMU19DT01QQVRfSAotI2RlZmluZSBfX0xJQl9VVElMU19DT01QQVRfSAotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLS8qIENvbXBhdGliaWxpdHkgZGVmaW5pdGlvbnMgZm9yIG5vbi1MaW51eCAoaS5lLiwgQlNELWJhc2VkKSBob3N0cy4gKi8KLSNpZm5kZWYgSEFWRV9PRkY2NF9UCi0jaWYgX0ZJTEVfT0ZGU0VUX0JJVFMgPCA2NAotI2Vycm9yICJfRklMRV9PRkZTRVRfQklUUyA8IDY0OyBsYXJnZSBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIgotI2VuZGlmIC8qIF9GSUxFX09GRlNFVF9CSVRTIDwgNjQgKi8KLQotdHlwZWRlZiBvZmZfdCBvZmY2NF90OwotCi1zdGF0aWMgaW5saW5lIG9mZjY0X3QgbHNlZWs2NChpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSB7Ci0gICAgcmV0dXJuIGxzZWVrKGZkLCBvZmZzZXQsIHdoZW5jZSk7Ci19Ci0KLSNpZmRlZiBIQVZFX1BSRUFECi1zdGF0aWMgaW5saW5lIHNzaXplX3QgcHJlYWQ2NChpbnQgZmQsIHZvaWQqIGJ1Ziwgc2l6ZV90IG5ieXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICByZXR1cm4gcHJlYWQoZmQsIGJ1ZiwgbmJ5dGVzLCBvZmZzZXQpOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhSEFWRV9PRkY2NF9UICovCi0KLSNlbmRpZiAvKiBfX0xJQl9VVElMU19DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9Db25kaXRpb24uaCBiL2luY2x1ZGUvdXRpbHMvQ29uZGl0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NTJkNTMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9Db25kaXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTElCU19VVElMU19DT05ESVRJT05fSAotI2RlZmluZSBfTElCU19VVElMU19DT05ESVRJT05fSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaWYgZGVmaW5lZChIQVZFX1BUSFJFQURTKQotIyBpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gKiBDb25kaXRpb24gdmFyaWFibGUgY2xhc3MuICBUaGUgaW1wbGVtZW50YXRpb24gaXMgc3lzdGVtLWRlcGVuZGVudC4KLSAqCi0gKiBDb25kaXRpb24gdmFyaWFibGVzIGFyZSBwYWlyZWQgdXAgd2l0aCBtdXRleGVzLiAgTG9jayB0aGUgbXV0ZXgsCi0gKiBjYWxsIHdhaXQoKSwgdGhlbiBlaXRoZXIgcmUtd2FpdCgpIGlmIHRoaW5ncyBhcmVuJ3QgcXVpdGUgd2hhdCB5b3Ugd2FudCwKLSAqIG9yIHVubG9jayB0aGUgbXV0ZXggYW5kIGNvbnRpbnVlLiAgQWxsIHRocmVhZHMgY2FsbGluZyB3YWl0KCkgbXVzdAotICogdXNlIHRoZSBzYW1lIG11dGV4IGZvciBhIGdpdmVuIENvbmRpdGlvbi4KLSAqLwotY2xhc3MgQ29uZGl0aW9uIHsKLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAgUFJJVkFURSA9IDAsCi0gICAgICAgIFNIQVJFRCA9IDEKLSAgICB9OwotCi0gICAgQ29uZGl0aW9uKCk7Ci0gICAgQ29uZGl0aW9uKGludCB0eXBlKTsKLSAgICB+Q29uZGl0aW9uKCk7Ci0gICAgLy8gV2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlLiAgTG9jayB0aGUgbXV0ZXggYmVmb3JlIGNhbGxpbmcuCi0gICAgc3RhdHVzX3Qgd2FpdChNdXRleCYgbXV0ZXgpOwotICAgIC8vIHNhbWUgd2l0aCByZWxhdGl2ZSB0aW1lb3V0Ci0gICAgc3RhdHVzX3Qgd2FpdFJlbGF0aXZlKE11dGV4JiBtdXRleCwgbnNlY3NfdCByZWx0aW1lKTsKLSAgICAvLyBTaWduYWwgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwgYWxsb3dpbmcgb25lIHRocmVhZCB0byBjb250aW51ZS4KLSAgICB2b2lkIHNpZ25hbCgpOwotICAgIC8vIFNpZ25hbCB0aGUgY29uZGl0aW9uIHZhcmlhYmxlLCBhbGxvd2luZyBhbGwgdGhyZWFkcyB0byBjb250aW51ZS4KLSAgICB2b2lkIGJyb2FkY2FzdCgpOwotCi1wcml2YXRlOgotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLSAgICBwdGhyZWFkX2NvbmRfdCBtQ29uZDsKLSNlbHNlCi0gICAgdm9pZCogICBtU3RhdGU7Ci0jZW5kaWYKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChIQVZFX1BUSFJFQURTKQotCi1pbmxpbmUgQ29uZGl0aW9uOjpDb25kaXRpb24oKSB7Ci0gICAgcHRocmVhZF9jb25kX2luaXQoJm1Db25kLCBOVUxMKTsKLX0KLWlubGluZSBDb25kaXRpb246OkNvbmRpdGlvbihpbnQgdHlwZSkgewotICAgIGlmICh0eXBlID09IFNIQVJFRCkgewotICAgICAgICBwdGhyZWFkX2NvbmRhdHRyX3QgYXR0cjsKLSAgICAgICAgcHRocmVhZF9jb25kYXR0cl9pbml0KCZhdHRyKTsKLSAgICAgICAgcHRocmVhZF9jb25kYXR0cl9zZXRwc2hhcmVkKCZhdHRyLCBQVEhSRUFEX1BST0NFU1NfU0hBUkVEKTsKLSAgICAgICAgcHRocmVhZF9jb25kX2luaXQoJm1Db25kLCAmYXR0cik7Ci0gICAgICAgIHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveSgmYXR0cik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHRocmVhZF9jb25kX2luaXQoJm1Db25kLCBOVUxMKTsKLSAgICB9Ci19Ci1pbmxpbmUgQ29uZGl0aW9uOjp+Q29uZGl0aW9uKCkgewotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZtQ29uZCk7Ci19Ci1pbmxpbmUgc3RhdHVzX3QgQ29uZGl0aW9uOjp3YWl0KE11dGV4JiBtdXRleCkgewotICAgIHJldHVybiAtcHRocmVhZF9jb25kX3dhaXQoJm1Db25kLCAmbXV0ZXgubU11dGV4KTsKLX0KLWlubGluZSBzdGF0dXNfdCBDb25kaXRpb246OndhaXRSZWxhdGl2ZShNdXRleCYgbXV0ZXgsIG5zZWNzX3QgcmVsdGltZSkgewotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEX0NPTkRfVElNRURXQUlUX1JFTEFUSVZFKQotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgICB0cy50dl9zZWMgID0gcmVsdGltZS8xMDAwMDAwMDAwOwotICAgIHRzLnR2X25zZWMgPSByZWx0aW1lJTEwMDAwMDAwMDA7Ci0gICAgcmV0dXJuIC1wdGhyZWFkX2NvbmRfdGltZWR3YWl0X3JlbGF0aXZlX25wKCZtQ29uZCwgJm11dGV4Lm1NdXRleCwgJnRzKTsKLSNlbHNlIC8vIEhBVkVfUFRIUkVBRF9DT05EX1RJTUVEV0FJVF9SRUxBVElWRQotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLSNpZiBkZWZpbmVkKEhBVkVfUE9TSVhfQ0xPQ0tTKQotICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7Ci0jZWxzZSAvLyBIQVZFX1BPU0lYX0NMT0NLUwotICAgIC8vIHdlIGRvbid0IHN1cHBvcnQgdGhlIGNsb2NrcyBoZXJlLgotICAgIHN0cnVjdCB0aW1ldmFsIHQ7Ci0gICAgZ2V0dGltZW9mZGF5KCZ0LCBOVUxMKTsKLSAgICB0cy50dl9zZWMgPSB0LnR2X3NlYzsKLSAgICB0cy50dl9uc2VjPSB0LnR2X3VzZWMqMTAwMDsKLSNlbmRpZiAvLyBIQVZFX1BPU0lYX0NMT0NLUwotICAgIHRzLnR2X3NlYyArPSByZWx0aW1lLzEwMDAwMDAwMDA7Ci0gICAgdHMudHZfbnNlYys9IHJlbHRpbWUlMTAwMDAwMDAwMDsKLSAgICBpZiAodHMudHZfbnNlYyA+PSAxMDAwMDAwMDAwKSB7Ci0gICAgICAgIHRzLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKLSAgICAgICAgdHMudHZfc2VjICArPSAxOwotICAgIH0KLSAgICByZXR1cm4gLXB0aHJlYWRfY29uZF90aW1lZHdhaXQoJm1Db25kLCAmbXV0ZXgubU11dGV4LCAmdHMpOwotI2VuZGlmIC8vIEhBVkVfUFRIUkVBRF9DT05EX1RJTUVEV0FJVF9SRUxBVElWRQotfQotaW5saW5lIHZvaWQgQ29uZGl0aW9uOjpzaWduYWwoKSB7Ci0gICAgcHRocmVhZF9jb25kX3NpZ25hbCgmbUNvbmQpOwotfQotaW5saW5lIHZvaWQgQ29uZGl0aW9uOjpicm9hZGNhc3QoKSB7Ci0gICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmbUNvbmQpOwotfQotCi0jZW5kaWYgLy8gSEFWRV9QVEhSRUFEUwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIF9MSUJTX1VUSUxTX0NPTkRJVE9OX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvRGVidWcuaCBiL2luY2x1ZGUvdXRpbHMvRGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllZDMyZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL0RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0RFQlVHX0gKLSNkZWZpbmUgQU5EUk9JRF9ERUJVR19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotdGVtcGxhdGU8Ym9vbD4gc3RydWN0IENvbXBpbGVUaW1lQXNzZXJ0OwotdGVtcGxhdGU8PiBzdHJ1Y3QgQ29tcGlsZVRpbWVBc3NlcnQ8dHJ1ZT4ge307Ci0jZGVmaW5lIENPTVBJTEVfVElNRV9BU1NFUlQoX2V4cCkgXAotICAgIHRlbXBsYXRlIGNsYXNzIENvbXBpbGVUaW1lQXNzZXJ0PCAoX2V4cCkgPjsKLSNlbmRpZgotI2RlZmluZSBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKF9leHApIFwKLSAgICBDb21waWxlVGltZUFzc2VydDwoIF9leHAgKT4oKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotdGVtcGxhdGU8Ym9vbCBDLCB0eXBlbmFtZSBMU0gsIHR5cGVuYW1lIFJIUz4gc3RydWN0IENvbXBpbGVUaW1lSWZFbHNlOwotdGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+IAotc3RydWN0IENvbXBpbGVUaW1lSWZFbHNlPHRydWUsICBMSFMsIFJIUz4geyB0eXBlZGVmIExIUyBUWVBFOyB9OwotdGVtcGxhdGU8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+IAotc3RydWN0IENvbXBpbGVUaW1lSWZFbHNlPGZhbHNlLCBMSFMsIFJIUz4geyB0eXBlZGVmIFJIUyBUWVBFOyB9OwotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLWNvbnN0IGNoYXIqIHN0cmluZ0ZvckluZGVudChpbnQzMl90IGluZGVudExldmVsKTsKLQotdHlwZWRlZiB2b2lkICgqZGVidWdQcmludEZ1bmMpKHZvaWQqIGNvb2tpZSwgY29uc3QgY2hhciogdHh0KTsKLQotdm9pZCBwcmludFR5cGVDb2RlKHVpbnQzMl90IHR5cGVDb2RlLAotICAgIGRlYnVnUHJpbnRGdW5jIGZ1bmMgPSAwLCB2b2lkKiBjb29raWUgPSAwKTsKLQotdm9pZCBwcmludEhleERhdGEoaW50MzJfdCBpbmRlbnQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbmd0aCwKLSAgICBzaXplX3QgYnl0ZXNQZXJMaW5lPTE2LCBpbnQzMl90IHNpbmdsZUxpbmVCeXRlc0N1dG9mZj0xNiwKLSAgICBzaXplX3QgYWxpZ25tZW50PTAsIGJvb2wgY0FycmF5U3R5bGU9ZmFsc2UsCi0gICAgZGVidWdQcmludEZ1bmMgZnVuYyA9IDAsIHZvaWQqIGNvb2tpZSA9IDApOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0RFQlVHX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvRW5kaWFuLmggYi9pbmNsdWRlL3V0aWxzL0VuZGlhbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWYyNTA0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvRW5kaWFuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEFuZHJvaWQgZW5kaWFuLW5lc3MgZGVmaW5lcy4KLS8vCi0jaWZuZGVmIF9MSUJTX1VUSUxTX0VORElBTl9ICi0jZGVmaW5lIF9MSUJTX1VUSUxTX0VORElBTl9ICi0KLSNpZiBkZWZpbmVkKEhBVkVfRU5ESUFOX0gpCi0KLSNpbmNsdWRlIDxlbmRpYW4uaD4KLQotI2Vsc2UgLypub3QgSEFWRV9FTkRJQU5fSCovCi0KLSNkZWZpbmUgX19CSUdfRU5ESUFOIDB4MTAwMAotI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4gMHgwMDAxCi0KLSNpZiBkZWZpbmVkKEhBVkVfTElUVExFX0VORElBTikKLSMgZGVmaW5lIF9fQllURV9PUkRFUiBfX0xJVFRMRV9FTkRJQU4KLSNlbHNlCi0jIGRlZmluZSBfX0JZVEVfT1JERVIgX19CSUdfRU5ESUFOCi0jZW5kaWYKLQotI2VuZGlmIC8qbm90IEhBVkVfRU5ESUFOX0gqLwotCi0jZW5kaWYgLypfTElCU19VVElMU19FTkRJQU5fSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oIGIvaW5jbHVkZS91dGlscy9FcnJvcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3NWIxOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FUlJPUlNfSAotI2RlZmluZSBBTkRST0lEX0VSUk9SU19ICi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHVzZSB0aGlzIHR5cGUgdG8gcmV0dXJuIGVycm9yIGNvZGVzCi0jaWZkZWYgSEFWRV9NU19DX1JVTlRJTUUKLXR5cGVkZWYgaW50ICAgICAgICAgc3RhdHVzX3Q7Ci0jZWxzZQotdHlwZWRlZiBpbnQzMl90ICAgICBzdGF0dXNfdDsKLSNlbmRpZgotCi0vKiB0aGUgTVMgQyBydW50aW1lIGxhY2tzIGEgZmV3IGVycm9yIGNvZGVzICovCi0KLS8qCi0gKiBFcnJvciBjb2Rlcy4gCi0gKiBBbGwgZXJyb3IgY29kZXMgYXJlIG5lZ2F0aXZlIHZhbHVlcy4KLSAqLwotCi0vLyBXaW4zMiAjZGVmaW5lcyBOT19FUlJPUiBhcyB3ZWxsLiAgSXQgaGFzIHRoZSBzYW1lIHZhbHVlLCBzbyB0aGVyZSdzIG5vCi0vLyByZWFsIGNvbmZsaWN0LCB0aG91Z2ggaXQncyBhIGJpdCBhd2t3YXJkLgotI2lmZGVmIF9XSU4zMgotIyB1bmRlZiBOT19FUlJPUgotI2VuZGlmCi0gCi1lbnVtIHsKLSAgICBPSyAgICAgICAgICAgICAgICA9IDAsICAgIC8vIEV2ZXJ5dGhpbmcncyBzd2VsbC4KLSAgICBOT19FUlJPUiAgICAgICAgICA9IDAsICAgIC8vIE5vIGVycm9ycy4KLSAgICAKLSAgICBVTktOT1dOX0VSUk9SICAgICAgID0gMHg4MDAwMDAwMCwKLQotICAgIE5PX01FTU9SWSAgICAgICAgICAgPSAtRU5PTUVNLAotICAgIElOVkFMSURfT1BFUkFUSU9OICAgPSAtRU5PU1lTLAotICAgIEJBRF9WQUxVRSAgICAgICAgICAgPSAtRUlOVkFMLAotICAgIEJBRF9UWVBFICAgICAgICAgICAgPSAweDgwMDAwMDAxLAotICAgIE5BTUVfTk9UX0ZPVU5EICAgICAgPSAtRU5PRU5ULAotICAgIFBFUk1JU1NJT05fREVOSUVEICAgPSAtRVBFUk0sCi0gICAgTk9fSU5JVCAgICAgICAgICAgICA9IC1FTk9ERVYsCi0gICAgQUxSRUFEWV9FWElTVFMgICAgICA9IC1FRVhJU1QsCi0gICAgREVBRF9PQkpFQ1QgICAgICAgICA9IC1FUElQRSwKLSAgICBGQUlMRURfVFJBTlNBQ1RJT04gID0gMHg4MDAwMDAwMiwKLSAgICBKUEFSS1NfQlJPS0VfSVQgICAgID0gLUVQSVBFLAotI2lmICFkZWZpbmVkKEhBVkVfTVNfQ19SVU5USU1FKQotICAgIEJBRF9JTkRFWCAgICAgICAgICAgPSAtRU9WRVJGTE9XLAotICAgIE5PVF9FTk9VR0hfREFUQSAgICAgPSAtRU5PREFUQSwKLSAgICBXT1VMRF9CTE9DSyAgICAgICAgID0gLUVXT1VMREJMT0NLLCAKLSAgICBUSU1FRF9PVVQgICAgICAgICAgID0gLUVUSU1FRE9VVCwKLSAgICBVTktOT1dOX1RSQU5TQUNUSU9OID0gLUVCQURNU0csCi0jZWxzZSAgICAKLSAgICBCQURfSU5ERVggICAgICAgICAgID0gLUUyQklHLAotICAgIE5PVF9FTk9VR0hfREFUQSAgICAgPSAweDgwMDAwMDAzLAotICAgIFdPVUxEX0JMT0NLICAgICAgICAgPSAweDgwMDAwMDA0LAotICAgIFRJTUVEX09VVCAgICAgICAgICAgPSAweDgwMDAwMDA1LAotICAgIFVOS05PV05fVFJBTlNBQ1RJT04gPSAweDgwMDAwMDA2LAotI2VuZGlmICAgIAotICAgIEZEU19OT1RfQUxMT1dFRCAgICAgPSAweDgwMDAwMDA3LAotfTsKLQotLy8gUmVzdG9yZSBkZWZpbmU7IGVudW1lcmF0aW9uIGlzIGluICJhbmRyb2lkIiBuYW1lc3BhY2UsIHNvIHRoZSB2YWx1ZSBkZWZpbmVkCi0vLyB0aGVyZSB3b24ndCB3b3JrIGZvciBXaW4zMiBjb2RlIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZS4KLSNpZmRlZiBfV0lOMzIKLSMgZGVmaW5lIE5PX0VSUk9SIDBMCi0jZW5kaWYKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLSAgICAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotI2VuZGlmIC8vIEFORFJPSURfRVJST1JTX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oIGIvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZTZkNTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBFbmNhcHN1bGF0ZSBhIHNoYXJlZCBmaWxlIG1hcHBpbmcuCi0vLwotI2lmbmRlZiBfX0xJQlNfRklMRV9NQVBfSAotI2RlZmluZSBfX0xJQlNfRklMRV9NQVBfSAotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Db21wYXQuaD4KLQotI2lmZGVmIEhBVkVfV0lOMzJfRklMRU1BUAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qCi0gKiBUaGlzIHJlcHJlc2VudHMgYSBtZW1vcnktbWFwcGVkIGZpbGUuICBJdCBtaWdodCBiZSB0aGUgZW50aXJlIGZpbGUgb3IKLSAqIG9ubHkgcGFydCBvZiBpdC4gIFRoaXMgcmVxdWlyZXMgYSBsaXR0bGUgYm9va2tlZXBpbmcgYmVjYXVzZSB0aGUgbWFwcGluZwotICogbmVlZHMgdG8gYmUgYWxpZ25lZCBvbiBwYWdlIGJvdW5kYXJpZXMsIGFuZCBpbiBzb21lIGNhc2VzIHdlJ2QgbGlrZSB0bwotICogaGF2ZSBtdWx0aXBsZSByZWZlcmVuY2VzIHRvIHRoZSBtYXBwZWQgYXJlYSB3aXRob3V0IGNyZWF0aW5nIGFkZGl0aW9uYWwKLSAqIG1hcHMuCi0gKgotICogVGhpcyBhbHdheXMgdXNlcyBNQVBfU0hBUkVELgotICoKLSAqIFRPRE86IHdlIHNob3VsZCBiZSBhYmxlIHRvIGNyZWF0ZSBhIG5ldyBGaWxlTWFwIHRoYXQgaXMgYSBzdWJzZXQgb2YKLSAqIGFuIGV4aXN0aW5nIEZpbGVNYXAgYW5kIHNoYXJlcyB0aGUgdW5kZXJseWluZyBtYXBwZWQgcGFnZXMuICBSZXF1aXJlcwotICogY29tcGxldGluZyB0aGUgcmVmY291bnRpbmcgc3R1ZmYgYW5kIHBvc3NpYmx5IGludHJvZHVjaW5nIHRoZSBub3Rpb24KLSAqIG9mIGEgRmlsZU1hcCBoaWVyYXJjaHkuCi0gKi8KLWNsYXNzIEZpbGVNYXAgewotcHVibGljOgotICAgIEZpbGVNYXAodm9pZCk7Ci0KLSAgICAvKgotICAgICAqIENyZWF0ZSBhIG5ldyBtYXBwaW5nIG9uIGFuIG9wZW4gZmlsZS4KLSAgICAgKgotICAgICAqIENsb3NpbmcgdGhlIGZpbGUgZGVzY3JpcHRvciBkb2VzIG5vdCB1bm1hcCB0aGUgcGFnZXMsIHNvIHdlIGRvbid0Ci0gICAgICogY2xhaW0gb3duZXJzaGlwIG9mIHRoZSBmZC4KLSAgICAgKgotICAgICAqIFJldHVybnMgImZhbHNlIiBvbiBmYWlsdXJlLgotICAgICAqLwotICAgIGJvb2wgY3JlYXRlKGNvbnN0IGNoYXIqIG9yaWdGaWxlTmFtZSwgaW50IGZkLAotICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoLCBib29sIHJlYWRPbmx5KTsKLQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoaXMgbWFwIGNhbWUgZnJvbSwgaWYga25vd24uCi0gICAgICovCi0gICAgY29uc3QgY2hhciogZ2V0RmlsZU5hbWUodm9pZCkgY29uc3QgeyByZXR1cm4gbUZpbGVOYW1lOyB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBwaWVjZSBvZiB0aGUgZmlsZSB3ZSByZXF1ZXN0ZWQuCi0gICAgICovCi0gICAgdm9pZCogZ2V0RGF0YVB0cih2b2lkKSBjb25zdCB7IHJldHVybiBtRGF0YVB0cjsgfQotCi0gICAgLyoKLSAgICAgKiBHZXQgdGhlIGxlbmd0aCB3ZSByZXF1ZXN0ZWQuCi0gICAgICovCi0gICAgc2l6ZV90IGdldERhdGFMZW5ndGgodm9pZCkgY29uc3QgeyByZXR1cm4gbURhdGFMZW5ndGg7IH0KLQotICAgIC8qCi0gICAgICogR2V0IHRoZSBkYXRhIG9mZnNldCB1c2VkIHRvIGNyZWF0ZSB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBvZmY2NF90IGdldERhdGFPZmZzZXQodm9pZCkgY29uc3QgeyByZXR1cm4gbURhdGFPZmZzZXQ7IH0KLQotICAgIC8qCi0gICAgICogR2V0IGEgImNvcHkiIG9mIHRoZSBvYmplY3QuCi0gICAgICovCi0gICAgRmlsZU1hcCogYWNxdWlyZSh2b2lkKSB7IG1SZWZDb3VudCsrOyByZXR1cm4gdGhpczsgfQotCi0gICAgLyoKLSAgICAgKiBDYWxsIHRoaXMgd2hlbiBtYXBwaW5nIGlzIG5vIGxvbmdlciBuZWVkZWQuCi0gICAgICovCi0gICAgdm9pZCByZWxlYXNlKHZvaWQpIHsKLSAgICAgICAgaWYgKC0tbVJlZkNvdW50IDw9IDApCi0gICAgICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoaXMgbWFwcyBkaXJlY3RseSB0byBtYWR2aXNlKCkgdmFsdWVzLCBidXQgYWxsb3dzIHVzIHRvIGF2b2lkCi0gICAgICogaW5jbHVkaW5nIDxzeXMvbW1hbi5oPiBldmVyeXdoZXJlLgotICAgICAqLwotICAgIGVudW0gTWFwQWR2aWNlIHsKLSAgICAgICAgTk9STUFMLCBSQU5ET00sIFNFUVVFTlRJQUwsIFdJTExORUVELCBET05UTkVFRAotICAgIH07Ci0KLSAgICAvKgotICAgICAqIEFwcGx5IGFuIG1hZHZpc2UoKSBjYWxsIHRvIHRoZSBlbnRpcmUgZmlsZS4KLSAgICAgKgotICAgICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgotICAgICAqLwotICAgIGludCBhZHZpc2UoTWFwQWR2aWNlIGFkdmljZSk7Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBkb24ndCBkZWxldGUgb2JqZWN0czsgY2FsbCByZWxlYXNlKCkKLSAgICB+RmlsZU1hcCh2b2lkKTsKLQotcHJpdmF0ZToKLSAgICAvLyB0aGVzZSBhcmUgbm90IGltcGxlbWVudGVkCi0gICAgRmlsZU1hcChjb25zdCBGaWxlTWFwJiBzcmMpOwotICAgIGNvbnN0IEZpbGVNYXAmIG9wZXJhdG9yPShjb25zdCBGaWxlTWFwJiBzcmMpOwotCi0gICAgaW50ICAgICAgICAgbVJlZkNvdW50OyAgICAgIC8vIHJlZmVyZW5jZSBjb3VudAotICAgIGNoYXIqICAgICAgIG1GaWxlTmFtZTsgICAgICAvLyBvcmlnaW5hbCBmaWxlIG5hbWUsIGlmIGtub3duCi0gICAgdm9pZCogICAgICAgbUJhc2VQdHI7ICAgICAgIC8vIGJhc2Ugb2YgbW1hcCBhcmVhOyBwYWdlIGFsaWduZWQKLSAgICBzaXplX3QgICAgICBtQmFzZUxlbmd0aDsgICAgLy8gbGVuZ3RoLCBtZWFzdXJlZCBmcm9tICJtQmFzZVB0ciIKLSAgICBvZmY2NF90ICAgICBtRGF0YU9mZnNldDsgICAgLy8gb2Zmc2V0IHVzZWQgd2hlbiBtYXAgd2FzIGNyZWF0ZWQKLSAgICB2b2lkKiAgICAgICBtRGF0YVB0cjsgICAgICAgLy8gc3RhcnQgb2YgcmVxdWVzdGVkIGRhdGEsIG9mZnNldCBmcm9tIGJhc2UKLSAgICBzaXplX3QgICAgICBtRGF0YUxlbmd0aDsgICAgLy8gbGVuZ3RoLCBtZWFzdXJlZCBmcm9tICJtRGF0YVB0ciIKLSNpZmRlZiBIQVZFX1dJTjMyX0ZJTEVNQVAKLSAgICBIQU5ETEUgICAgICBtRmlsZUhhbmRsZTsgICAgLy8gV2luMzIgZmlsZSBoYW5kbGUKLSAgICBIQU5ETEUgICAgICBtRmlsZU1hcHBpbmc7ICAgLy8gV2luMzIgZmlsZSBtYXBwaW5nIGhhbmRsZQotI2VuZGlmCi0KLSAgICBzdGF0aWMgbG9uZyBtUGFnZVNpemU7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gX19MSUJTX0ZJTEVfTUFQX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvRmxhdHRlbmFibGUuaCBiL2luY2x1ZGUvdXRpbHMvRmxhdHRlbmFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyYmUzYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL0ZsYXR0ZW5hYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1VUSUxTX0ZMQVRURU5BQkxFX0gKLSNkZWZpbmUgQU5EUk9JRF9VVElMU19GTEFUVEVOQUJMRV9ICi0KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEZsYXR0ZW5hYmxlCi17Ci1wdWJsaWM6Ci0gICAgLy8gc2l6ZSBpbiBieXRlcyBvZiB0aGUgZmxhdHRlbmVkIG9iamVjdAotICAgIHZpcnR1YWwgc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoKSBjb25zdCA9IDA7Ci0KLSAgICAvLyBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB0byBmbGF0dGVuCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0RmRDb3VudCgpIGNvbnN0ID0gMDsKLQotICAgIC8vIGZsYXR0ZW5zIHRoZSBvYmplY3QgaW50byBidWZmZXIuCi0gICAgLy8gc2l6ZSBzaG91bGQgYmUgYXQgbGVhc3Qgb2YgZ2V0RmxhdHRlbmVkU2l6ZSgpCi0gICAgLy8gZmlsZSBkZXNjcmlwdG9ycyBhcmUgd3JpdHRlbiBpbiB0aGUgZmRzW10gYXJyYXkgYnV0IG93bmVyc2hpcCBpcwotICAgIC8vIG5vdCB0cmFuc2ZlcmVkIChpZTogdGhleSBtdXN0IGJlIGR1cHBlZCBieSB0aGUgY2FsbGVyIG9mCi0gICAgLy8gZmxhdHRlbigpIGlmIG5lZWRlZCkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbGF0dGVuKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICBpbnQgZmRzW10sIHNpemVfdCBjb3VudCkgY29uc3QgPSAwOwotCi0gICAgLy8gdW5mbGF0dGVucyB0aGUgb2JqZWN0IGZyb20gYnVmZmVyLgotICAgIC8vIHNpemUgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiBnZXRGbGF0dGVuZWRTaXplKCkgd2hlbiB0aGUKLSAgICAvLyBvYmplY3Qgd2FzIGZsYXR0ZW5lZC4KLSAgICAvLyB1bmZsYXR0ZW5lZCBmaWxlIGRlc2NyaXB0b3JzIGFyZSBmb3VuZCBpbiB0aGUgZmRzW10gYXJyYXkgYW5kCi0gICAgLy8gZG9uJ3QgbmVlZCB0byBiZSBkdXBwZWQoKS4gaWU6IHRoZSBjYWxsZXIgb2YgdW5mbGF0dGVuIGRvZXNuJ3QKLSAgICAvLyBrZWVwIG93bmVyc2hpcC4gSWYgYSBmZCBpcyBub3QgcmV0YWluZWQgYnkgdW5mbGF0dGVuKCkgaXQgbXVzdCBiZQotICAgIC8vIGV4cGxpY2l0bHkgY2xvc2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5mbGF0dGVuKHZvaWQgY29uc3QqIGJ1ZmZlciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICBpbnQgZmRzW10sIHNpemVfdCBjb3VudCkgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RmxhdHRlbmFibGUoKSA9IDA7Ci0KLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQotI2VuZGlmIC8qIEFORFJPSURfVVRJTFNfRkxBVFRFTkFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9GdW5jdG9yLmggYi9pbmNsdWRlL3V0aWxzL0Z1bmN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0ZGVkNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL0Z1bmN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRlVOQ1RPUl9ICi0jZGVmaW5lIEFORFJPSURfRlVOQ1RPUl9ICi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotbmFtZXNwYWNlICBhbmRyb2lkIHsKLQotY2xhc3MgRnVuY3RvciB7Ci1wdWJsaWM6Ci0gICAgRnVuY3RvcigpIHt9Ci0gICAgdmlydHVhbCB+RnVuY3RvcigpIHt9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVyYXRvciAoKShpbnQgd2hhdCwgdm9pZCogZGF0YSkgeyByZXR1cm4gTk9fRVJST1I7IH0KLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0ZVTkNUT1JfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9HZW5lcmF0aW9uQ2FjaGUuaCBiL2luY2x1ZGUvdXRpbHMvR2VuZXJhdGlvbkNhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNzIyZDEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9HZW5lcmF0aW9uQ2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1VUSUxTX0dFTkVSQVRJT05fQ0FDSEVfSAotI2RlZmluZSBBTkRST0lEX1VUSUxTX0dFTkVSQVRJT05fQ0FDSEVfSAotCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoqCi0gKiBHZW5lcmF0aW9uQ2FjaGUgY2FsbGJhY2sgdXNlZCB3aGVuIGFuIGl0ZW0gaXMgcmVtb3ZlZAotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBFbnRyeUtleSwgdHlwZW5hbWUgRW50cnlWYWx1ZT4KLWNsYXNzIE9uRW50cnlSZW1vdmVkIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5PbkVudHJ5UmVtb3ZlZCgpIHsgfTsKLSAgICB2aXJ0dWFsIHZvaWQgb3BlcmF0b3IoKShFbnRyeUtleSYga2V5LCBFbnRyeVZhbHVlJiB2YWx1ZSkgPSAwOwotfTsgLy8gY2xhc3MgT25FbnRyeVJlbW92ZWQKLQotdGVtcGxhdGU8dHlwZW5hbWUgRW50cnlLZXksIHR5cGVuYW1lIEVudHJ5VmFsdWU+Ci1zdHJ1Y3QgRW50cnk6IHB1YmxpYyBMaWdodFJlZkJhc2U8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gewotICAgIEVudHJ5KGNvbnN0IEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiYgZSkgOgotICAgICAgICAgICAga2V5KGUua2V5KSwgdmFsdWUoZS52YWx1ZSksCi0gICAgICAgICAgICBwYXJlbnQoZS5wYXJlbnQpLCBjaGlsZChlLmNoaWxkKSB7IH0KLSAgICBFbnRyeShjb25zdCBFbnRyeUtleSYga2V5LCBjb25zdCBFbnRyeVZhbHVlJiB2YWx1ZSkgOgotICAgICAgICAgICAga2V5KGtleSksIHZhbHVlKHZhbHVlKSB7IH0KLQotICAgIEVudHJ5S2V5IGtleTsKLSAgICBFbnRyeVZhbHVlIHZhbHVlOwotCi0gICAgc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gcGFyZW50OyAvLyBuZXh0IG9sZGVyIGVudHJ5Ci0gICAgc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gY2hpbGQ7ICAvLyBuZXh0IHlvdW5nZXIgZW50cnkKLX07IC8vIHN0cnVjdCBFbnRyeQotCi0vKioKLSAqIEEgTFJVIHR5cGUgY2FjaGUKLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLWNsYXNzIEdlbmVyYXRpb25DYWNoZSB7Ci1wdWJsaWM6Ci0gICAgR2VuZXJhdGlvbkNhY2hlKHVpbnQzMl90IG1heENhcGFjaXR5KTsKLSAgICB2aXJ0dWFsIH5HZW5lcmF0aW9uQ2FjaGUoKTsKLQotICAgIGVudW0gQ2FwYWNpdHkgewotICAgICAgICBrVW5saW1pdGVkQ2FwYWNpdHksCi0gICAgfTsKLQotICAgIHZvaWQgc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihPbkVudHJ5UmVtb3ZlZDxLLCBWPiogbGlzdGVuZXIpOwotCi0gICAgc2l6ZV90IHNpemUoKSBjb25zdDsKLQotICAgIHZvaWQgY2xlYXIoKTsKLQotICAgIGJvb2wgY29udGFpbnMoY29uc3QgSyYga2V5KSBjb25zdDsKLSAgICBjb25zdCBLJiBnZXRLZXlBdChzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgIGNvbnN0IFYmIGdldFZhbHVlQXQoc2l6ZV90IGluZGV4KSBjb25zdDsKLQotICAgIGNvbnN0IFYmIGdldChjb25zdCBLJiBrZXkpOwotICAgIGJvb2wgcHV0KGNvbnN0IEsmIGtleSwgY29uc3QgViYgdmFsdWUpOwotCi0gICAgdm9pZCByZW1vdmVBdChzc2l6ZV90IGluZGV4KTsKLSAgICBib29sIHJlbW92ZShjb25zdCBLJiBrZXkpOwotICAgIGJvb2wgcmVtb3ZlT2xkZXN0KCk7Ci0KLXByaXZhdGU6Ci0gICAgS2V5ZWRWZWN0b3I8Sywgc3A8RW50cnk8SywgVj4gPiA+IG1DYWNoZTsKLSAgICB1aW50MzJfdCBtTWF4Q2FwYWNpdHk7Ci0KLSAgICBPbkVudHJ5UmVtb3ZlZDxLLCBWPiogbUxpc3RlbmVyOwotCi0gICAgc3A8RW50cnk8SywgVj4gPiBtT2xkZXN0OwotICAgIHNwPEVudHJ5PEssIFY+ID4gbVlvdW5nZXN0OwotCi0gICAgdm9pZCBhdHRhY2hUb0NhY2hlKGNvbnN0IHNwPEVudHJ5PEssIFY+ID4mIGVudHJ5KTsKLSAgICB2b2lkIGRldGFjaEZyb21DYWNoZShjb25zdCBzcDxFbnRyeTxLLCBWPiA+JiBlbnRyeSk7Ci0KLSAgICBjb25zdCBWIG1OdWxsVmFsdWU7Ci19OyAvLyBjbGFzcyBHZW5lcmF0aW9uQ2FjaGUKLQotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLUdlbmVyYXRpb25DYWNoZTxLLCBWPjo6R2VuZXJhdGlvbkNhY2hlKHVpbnQzMl90IG1heENhcGFjaXR5KTogbU1heENhcGFjaXR5KG1heENhcGFjaXR5KSwKLSAgICBtTGlzdGVuZXIoTlVMTCksIG1OdWxsVmFsdWUoTlVMTCkgewotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLUdlbmVyYXRpb25DYWNoZTxLLCBWPjo6fkdlbmVyYXRpb25DYWNoZSgpIHsKLSAgICBjbGVhcigpOwotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLXVpbnQzMl90IEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6c2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNhY2hlLnNpemUoKTsKLX0KLQotLyoqCi0gKiBTaG91bGQgYmUgc2V0IGJ5IHRoZSB1c2VyIG9mIHRoZSBDYWNoZSBzbyB0aGF0IHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpcwotICogcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotdm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIoT25FbnRyeVJlbW92ZWQ8SywgVj4qIGxpc3RlbmVyKSB7Ci0gICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci12b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Y2xlYXIoKSB7Ci0gICAgaWYgKG1MaXN0ZW5lcikgewotICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxFbnRyeTxLLCBWPiA+IGVudHJ5ID0gbUNhY2hlLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAobUxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgKCptTGlzdGVuZXIpKGVudHJ5LT5rZXksIGVudHJ5LT52YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUNhY2hlLmNsZWFyKCk7Ci0gICAgbVlvdW5nZXN0LmNsZWFyKCk7Ci0gICAgbU9sZGVzdC5jbGVhcigpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotYm9vbCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmNvbnRhaW5zKGNvbnN0IEsmIGtleSkgY29uc3QgewotICAgIHJldHVybiBtQ2FjaGUuaW5kZXhPZktleShrZXkpID49IDA7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1jb25zdCBLJiBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmdldEtleUF0KHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiBtQ2FjaGUua2V5QXQoaW5kZXgpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotY29uc3QgViYgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpnZXRWYWx1ZUF0KHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiBtQ2FjaGUudmFsdWVBdChpbmRleCktPnZhbHVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotY29uc3QgViYgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpnZXQoY29uc3QgSyYga2V5KSB7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgY29uc3Qgc3A8RW50cnk8SywgVj4gPiYgZW50cnkgPSBtQ2FjaGUudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGRldGFjaEZyb21DYWNoZShlbnRyeSk7Ci0gICAgICAgIGF0dGFjaFRvQ2FjaGUoZW50cnkpOwotICAgICAgICByZXR1cm4gZW50cnktPnZhbHVlOwotICAgIH0KLQotICAgIHJldHVybiBtTnVsbFZhbHVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotYm9vbCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnB1dChjb25zdCBLJiBrZXksIGNvbnN0IFYmIHZhbHVlKSB7Ci0gICAgaWYgKG1NYXhDYXBhY2l0eSAhPSBrVW5saW1pdGVkQ2FwYWNpdHkgJiYgbUNhY2hlLnNpemUoKSA+PSBtTWF4Q2FwYWNpdHkpIHsKLSAgICAgICAgcmVtb3ZlT2xkZXN0KCk7Ci0gICAgfQotCi0gICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBzcDxFbnRyeTxLLCBWPiA+IGVudHJ5ID0gbmV3IEVudHJ5PEssIFY+KGtleSwgdmFsdWUpOwotICAgICAgICBtQ2FjaGUuYWRkKGtleSwgZW50cnkpOwotICAgICAgICBhdHRhY2hUb0NhY2hlKGVudHJ5KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotYm9vbCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnJlbW92ZShjb25zdCBLJiBrZXkpIHsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICByZW1vdmVBdChpbmRleCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLXZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpyZW1vdmVBdChzc2l6ZV90IGluZGV4KSB7Ci0gICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKLSAgICBpZiAobUxpc3RlbmVyKSB7Ci0gICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOwotICAgIH0KLSAgICBtQ2FjaGUucmVtb3ZlSXRlbXNBdChpbmRleCwgMSk7Ci0gICAgZGV0YWNoRnJvbUNhY2hlKGVudHJ5KTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLWJvb2wgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpyZW1vdmVPbGRlc3QoKSB7Ci0gICAgaWYgKG1PbGRlc3QuZ2V0KCkpIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KG1PbGRlc3QtPmtleSk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICByZW1vdmVBdChpbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBBTE9HRSgiR2VuZXJhdGlvbkNhY2hlOiByZW1vdmVPbGRlc3QgZmFpbGVkIHRvIGZpbmQgdGhlIGl0ZW0gaW4gdGhlIGNhY2hlICIKLSAgICAgICAgICAgICAgICAid2l0aCB0aGUgZ2l2ZW4ga2V5LCBidXQgd2Uga25vdyBpdCBtdXN0IGJlIGluIHRoZXJlLiAgIgotICAgICAgICAgICAgICAgICJJcyB0aGUga2V5IGNvbXBhcmF0b3Iga2FwdXQ/Iik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotdm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmF0dGFjaFRvQ2FjaGUoY29uc3Qgc3A8RW50cnk8SywgVj4gPiYgZW50cnkpIHsKLSAgICBpZiAoIW1Zb3VuZ2VzdC5nZXQoKSkgewotICAgICAgICBtWW91bmdlc3QgPSBtT2xkZXN0ID0gZW50cnk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZW50cnktPnBhcmVudCA9IG1Zb3VuZ2VzdDsKLSAgICAgICAgbVlvdW5nZXN0LT5jaGlsZCA9IGVudHJ5OwotICAgICAgICBtWW91bmdlc3QgPSBlbnRyeTsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci12b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6ZGV0YWNoRnJvbUNhY2hlKGNvbnN0IHNwPEVudHJ5PEssIFY+ID4mIGVudHJ5KSB7Ci0gICAgaWYgKGVudHJ5LT5wYXJlbnQuZ2V0KCkpIHsKLSAgICAgICAgZW50cnktPnBhcmVudC0+Y2hpbGQgPSBlbnRyeS0+Y2hpbGQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbU9sZGVzdCA9IGVudHJ5LT5jaGlsZDsKLSAgICB9Ci0KLSAgICBpZiAoZW50cnktPmNoaWxkLmdldCgpKSB7Ci0gICAgICAgIGVudHJ5LT5jaGlsZC0+cGFyZW50ID0gZW50cnktPnBhcmVudDsKLSAgICB9IGVsc2UgewotICAgICAgICBtWW91bmdlc3QgPSBlbnRyeS0+cGFyZW50OwotICAgIH0KLQotICAgIGVudHJ5LT5wYXJlbnQuY2xlYXIoKTsKLSAgICBlbnRyeS0+Y2hpbGQuY2xlYXIoKTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfVVRJTFNfR0VORVJBVElPTl9DQUNIRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0tleWVkVmVjdG9yLmggYi9pbmNsdWRlL3V0aWxzL0tleWVkVmVjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NTM1YmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9LZXllZFZlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfS0VZRURfVkVDVE9SX0gKLSNkZWZpbmUgQU5EUk9JRF9LRVlFRF9WRUNUT1JfSAotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4KLWNsYXNzIEtleWVkVmVjdG9yCi17Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBLRVkgICAga2V5X3R5cGU7Ci0gICAgdHlwZWRlZiBWQUxVRSAgdmFsdWVfdHlwZTsKLQotICAgIGlubGluZSAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yKCk7Ci0KLSAgICAvKgotICAgICAqIGVtcHR5IHRoZSB2ZWN0b3IKLSAgICAgKi8KLQotICAgIGlubGluZSAgdm9pZCAgICAgICAgICAgIGNsZWFyKCkgICAgICAgICAgICAgICAgICAgICB7IG1WZWN0b3IuY2xlYXIoKTsgfQotCi0gICAgLyohIAotICAgICAqIHZlY3RvciBzdGF0cwotICAgICAqLwotCi0gICAgLy8hIHJldHVybnMgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSB2ZWN0b3IKLSAgICBpbmxpbmUgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgICAgICAgICAgICAgICAgeyByZXR1cm4gbVZlY3Rvci5zaXplKCk7IH0KLSAgICAvLyEgcmV0dXJucyB3ZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3IgaXMgZW1wdHkKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICBpc0VtcHR5KCkgY29uc3QgICAgICAgICAgICAgeyByZXR1cm4gbVZlY3Rvci5pc0VtcHR5KCk7IH0KLSAgICAvLyEgcmV0dXJucyBob3cgbWFueSBpdGVtcyBjYW4gYmUgc3RvcmVkIHdpdGhvdXQgcmVhbGxvY2F0aW5nIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgaW5saW5lICBzaXplX3QgICAgICAgICAgY2FwYWNpdHkoKSBjb25zdCAgICAgICAgICAgIHsgcmV0dXJuIG1WZWN0b3IuY2FwYWNpdHkoKTsgfQotICAgIC8vISBzZXRzdCB0aGUgY2FwYWNpdHkuIGNhcGFjaXR5IGNhbiBuZXZlciBiZSByZWR1Y2VkIGxlc3MgdGhhbiBzaXplKCkKLSAgICBpbmxpbmUgc3NpemVfdCAgICAgICAgICBzZXRDYXBhY2l0eShzaXplX3Qgc2l6ZSkgICAgeyByZXR1cm4gbVZlY3Rvci5zZXRDYXBhY2l0eShzaXplKTsgfQotICAgIAotICAgIC8qISAKLSAgICAgKiBhY2Nlc3NvcnMKLSAgICAgKi8KLSAgICAgICAgICAgIGNvbnN0IFZBTFVFJiAgICB2YWx1ZUZvcihjb25zdCBLRVkmIGtleSkgY29uc3Q7Ci0gICAgICAgICAgICBjb25zdCBWQUxVRSYgICAgdmFsdWVBdChzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgICAgICAgICAgY29uc3QgS0VZJiAgICAgIGtleUF0KHNpemVfdCBpbmRleCkgY29uc3Q7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5kZXhPZktleShjb25zdCBLRVkmIGtleSkgY29uc3Q7Ci0KLSAgICAvKiEKLSAgICAgKiBtb2RpZnlpbmcgdGhlIGFycmF5Ci0gICAgICovCi0KLSAgICAgICAgICAgIFZBTFVFJiAgICAgICAgICBlZGl0VmFsdWVGb3IoY29uc3QgS0VZJiBrZXkpOwotICAgICAgICAgICAgVkFMVUUmICAgICAgICAgIGVkaXRWYWx1ZUF0KHNpemVfdCBpbmRleCk7Ci0KLSAgICAgICAgICAgIC8qISAKLSAgICAgICAgICAgICAqIGFkZC9pbnNlcnQvcmVwbGFjZSBpdGVtcwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IEtFWSYga2V5LCBjb25zdCBWQUxVRSYgaXRlbSk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgcmVwbGFjZVZhbHVlRm9yKGNvbnN0IEtFWSYga2V5LCBjb25zdCBWQUxVRSYgaXRlbSk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgcmVwbGFjZVZhbHVlQXQoc2l6ZV90IGluZGV4LCBjb25zdCBWQUxVRSYgaXRlbSk7Ci0KLSAgICAvKiEKLSAgICAgKiByZW1vdmUgaXRlbXMKLSAgICAgKi8KLQotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlbW92ZUl0ZW0oY29uc3QgS0VZJiBrZXkpOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlbW92ZUl0ZW1zQXQoc2l6ZV90IGluZGV4LCBzaXplX3QgY291bnQgPSAxKTsKLSAgICAgICAgICAgIAotcHJpdmF0ZToKLSAgICAgICAgICAgIFNvcnRlZFZlY3Rvcjwga2V5X3ZhbHVlX3BhaXJfdDxLRVksIFZBTFVFPiA+ICAgIG1WZWN0b3I7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoqCi0gKiBWYXJpYXRpb24gb2YgS2V5ZWRWZWN0b3IgdGhhdCBob2xkcyBhIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIHdoZW4KLSAqIHZhbHVlRm9yKCkgaXMgY2FsbGVkIHdpdGggYSBrZXkgdGhhdCBkb2Vzbid0IGV4aXN0LgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4KLWNsYXNzIERlZmF1bHRLZXllZFZlY3RvciA6IHB1YmxpYyBLZXllZFZlY3RvcjxLRVksIFZBTFVFPgotewotcHVibGljOgotICAgIGlubGluZSAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3Rvcihjb25zdCBWQUxVRSYgZGVmVmFsdWUgPSBWQUxVRSgpKTsKLSAgICAgICAgICAgIGNvbnN0IFZBTFVFJiAgICB2YWx1ZUZvcihjb25zdCBLRVkmIGtleSkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICBWQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLRVksIHR5cGVuYW1lIFZBTFVFPiBpbmxpbmUKLUtleWVkVmVjdG9yPEtFWSxWQUxVRT46OktleWVkVmVjdG9yKCkKLXsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1zc2l6ZV90IEtleWVkVmVjdG9yPEtFWSxWQUxVRT46OmluZGV4T2ZLZXkoY29uc3QgS0VZJiBrZXkpIGNvbnN0IHsKLSAgICByZXR1cm4gbVZlY3Rvci5pbmRleE9mKCBrZXlfdmFsdWVfcGFpcl90PEtFWSxWQUxVRT4oa2V5KSApOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLRVksIHR5cGVuYW1lIFZBTFVFPiBpbmxpbmUKLWNvbnN0IFZBTFVFJiBLZXllZFZlY3RvcjxLRVksVkFMVUU+Ojp2YWx1ZUZvcihjb25zdCBLRVkmIGtleSkgY29uc3QgewotICAgIHNzaXplX3QgaSA9IHRoaXMtPmluZGV4T2ZLZXkoa2V5KTsKLSAgICBhc3NlcnQoaT49MCk7Ci0gICAgcmV0dXJuIG1WZWN0b3IuaXRlbUF0KGkpLnZhbHVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLRVksIHR5cGVuYW1lIFZBTFVFPiBpbmxpbmUKLWNvbnN0IFZBTFVFJiBLZXllZFZlY3RvcjxLRVksVkFMVUU+Ojp2YWx1ZUF0KHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiBtVmVjdG9yLml0ZW1BdChpbmRleCkudmFsdWU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+IGlubGluZQotY29uc3QgS0VZJiBLZXllZFZlY3RvcjxLRVksVkFMVUU+OjprZXlBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVZlY3Rvci5pdGVtQXQoaW5kZXgpLmtleTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1WQUxVRSYgS2V5ZWRWZWN0b3I8S0VZLFZBTFVFPjo6ZWRpdFZhbHVlRm9yKGNvbnN0IEtFWSYga2V5KSB7Ci0gICAgc3NpemVfdCBpID0gdGhpcy0+aW5kZXhPZktleShrZXkpOwotICAgIGFzc2VydChpPj0wKTsKLSAgICByZXR1cm4gbVZlY3Rvci5lZGl0SXRlbUF0KGkpLnZhbHVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLRVksIHR5cGVuYW1lIFZBTFVFPiBpbmxpbmUKLVZBTFVFJiBLZXllZFZlY3RvcjxLRVksVkFMVUU+OjplZGl0VmFsdWVBdChzaXplX3QgaW5kZXgpIHsKLSAgICByZXR1cm4gbVZlY3Rvci5lZGl0SXRlbUF0KGluZGV4KS52YWx1ZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1zc2l6ZV90IEtleWVkVmVjdG9yPEtFWSxWQUxVRT46OmFkZChjb25zdCBLRVkmIGtleSwgY29uc3QgVkFMVUUmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIG1WZWN0b3IuYWRkKCBrZXlfdmFsdWVfcGFpcl90PEtFWSxWQUxVRT4oa2V5LCB2YWx1ZSkgKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1zc2l6ZV90IEtleWVkVmVjdG9yPEtFWSxWQUxVRT46OnJlcGxhY2VWYWx1ZUZvcihjb25zdCBLRVkmIGtleSwgY29uc3QgVkFMVUUmIHZhbHVlKSB7Ci0gICAga2V5X3ZhbHVlX3BhaXJfdDxLRVksVkFMVUU+IHBhaXIoa2V5LCB2YWx1ZSk7Ci0gICAgbVZlY3Rvci5yZW1vdmUocGFpcik7Ci0gICAgcmV0dXJuIG1WZWN0b3IuYWRkKHBhaXIpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLRVksIHR5cGVuYW1lIFZBTFVFPiBpbmxpbmUKLXNzaXplX3QgS2V5ZWRWZWN0b3I8S0VZLFZBTFVFPjo6cmVwbGFjZVZhbHVlQXQoc2l6ZV90IGluZGV4LCBjb25zdCBWQUxVRSYgaXRlbSkgewotICAgIGlmIChpbmRleDxzaXplKCkpIHsKLSAgICAgICAgbVZlY3Rvci5lZGl0SXRlbUF0KGluZGV4KS52YWx1ZSA9IGl0ZW07Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9JTkRFWDsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1zc2l6ZV90IEtleWVkVmVjdG9yPEtFWSxWQUxVRT46OnJlbW92ZUl0ZW0oY29uc3QgS0VZJiBrZXkpIHsKLSAgICByZXR1cm4gbVZlY3Rvci5yZW1vdmUoa2V5X3ZhbHVlX3BhaXJfdDxLRVksVkFMVUU+KGtleSkpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLRVksIHR5cGVuYW1lIFZBTFVFPiBpbmxpbmUKLXNzaXplX3QgS2V5ZWRWZWN0b3I8S0VZLCBWQUxVRT46OnJlbW92ZUl0ZW1zQXQoc2l6ZV90IGluZGV4LCBzaXplX3QgY291bnQpIHsKLSAgICByZXR1cm4gbVZlY3Rvci5yZW1vdmVJdGVtc0F0KGluZGV4LCBjb3VudCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLRVksIHR5cGVuYW1lIFZBTFVFPiBpbmxpbmUKLURlZmF1bHRLZXllZFZlY3RvcjxLRVksVkFMVUU+OjpEZWZhdWx0S2V5ZWRWZWN0b3IoY29uc3QgVkFMVUUmIGRlZlZhbHVlKQotICAgIDogbURlZmF1bHQoZGVmVmFsdWUpCi17Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+IGlubGluZQotY29uc3QgVkFMVUUmIERlZmF1bHRLZXllZFZlY3RvcjxLRVksVkFMVUU+Ojp2YWx1ZUZvcihjb25zdCBLRVkmIGtleSkgY29uc3QgewotICAgIHNzaXplX3QgaSA9IHRoaXMtPmluZGV4T2ZLZXkoa2V5KTsKLSAgICByZXR1cm4gaSA+PSAwID8gS2V5ZWRWZWN0b3I8S0VZLFZBTFVFPjo6dmFsdWVBdChpKSA6IG1EZWZhdWx0OwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfS0VZRURfVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvTGluZWFyVHJhbnNmb3JtLmggYi9pbmNsdWRlL3V0aWxzL0xpbmVhclRyYW5zZm9ybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGNiMzU1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvTGluZWFyVHJhbnNmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTElCU19VVElMU19MSU5FQVJfVFJBTlNGT1JNX0gKLSNkZWZpbmUgX0xJQlNfVVRJTFNfTElORUFSX1RSQU5TRk9STV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBMaW5lYXJUcmFuc2Zvcm0gZGVmaW5lcyBhIHN0cnVjdHVyZSB3aGljaCBob2xkIHRoZSBkZWZpbml0aW9uIG9mIGEKLS8vIHRyYW5zZm9ybWF0aW9uIGZyb20gc2luZ2xlIGRpbWVuc2lvbmFsIGNvb3JkaW5hdGUgc3lzdGVtIEEgaW50byBjb29yZGluYXRlCi0vLyBzeXN0ZW0gQiAoYW5kIGJhY2sgYWdhaW4pLiAgVmFsdWVzIGluIEEgYW5kIGluIEIgYXJlIDY0IGJpdCwgdGhlIGxpbmVhcgotLy8gc2NhbGUgZmFjdG9yIGlzIGV4cHJlc3NlZCBhcyBhIHJhdGlvbmFsIG51bWJlciB1c2luZyB0d28gMzIgYml0IHZhbHVlcy4KLS8vCi0vLyBTcGVjaWZpY2FsbHksIGxldAotLy8gZihhKSA9IGIKLS8vIEYoYikgPSBmXi0xKGIpID0gYQotLy8gdGhlbgotLy8KLS8vIGYoYSkgPSAoKChhIC0gYV96ZXJvKSAqIGFfdG9fYl9udW1lcikgLyBhX3RvX2JfZGVub20pICsgYl96ZXJvOwotLy8KLS8vIGFuZAotLy8KLS8vIEYoYikgPSAoKChiIC0gYl96ZXJvKSAqIGFfdG9fYl9kZW5vbSkgLyBhX3RvX2JfbnVtZXIpICsgYV96ZXJvOwotLy8KLXN0cnVjdCBMaW5lYXJUcmFuc2Zvcm0gewotICBpbnQ2NF90ICBhX3plcm87Ci0gIGludDY0X3QgIGJfemVybzsKLSAgaW50MzJfdCAgYV90b19iX251bWVyOwotICB1aW50MzJfdCBhX3RvX2JfZGVub207Ci0KLSAgLy8gVHJhbnNmb3JtIGZyb20gQS0+QgotICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3IgZmFsc2UgaW4gdGhlIGNhc2Ugb2YgYSBzaW5ndWxhcml0eSBvciBhbgotICAvLyBvdmVyZmxvdy4KLSAgYm9vbCBkb0ZvcndhcmRUcmFuc2Zvcm0oaW50NjRfdCBhX2luLCBpbnQ2NF90KiBiX291dCkgY29uc3Q7Ci0KLSAgLy8gVHJhbnNmb3JtIGZyb20gQi0+QQotICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3IgZmFsc2UgaW4gdGhlIGNhc2Ugb2YgYSBzaW5ndWxhcml0eSBvciBhbgotICAvLyBvdmVyZmxvdy4KLSAgYm9vbCBkb1JldmVyc2VUcmFuc2Zvcm0oaW50NjRfdCBiX2luLCBpbnQ2NF90KiBhX291dCkgY29uc3Q7Ci0KLSAgLy8gSGVscGVycyB3aGljaCB3aWxsIHJlZHVjZSB0aGUgZnJhY3Rpb24gTi9EIHVzaW5nIEV1Y2xpZCdzIG1ldGhvZC4KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIHJlZHVjZShUKiBOLCBUKiBEKTsKLSAgc3RhdGljIHZvaWQgcmVkdWNlKGludDMyX3QqIE4sIHVpbnQzMl90KiBEKTsKLX07Ci0KLQotfQotCi0jZW5kaWYgIC8vIF9MSUJTX1VUSUxTX0xJTkVBUl9UUkFOU0ZPUk1fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9MaXN0LmggYi9pbmNsdWRlL3V0aWxzL0xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzY2Q3Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL0xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRlbXBsYXRlZCBsaXN0IGNsYXNzLiAgTm9ybWFsbHkgd2UnZCB1c2UgU1RMLCBidXQgd2UgZG9uJ3QgaGF2ZSB0aGF0LgotLy8gVGhpcyBjbGFzcyBtaW1pY3MgU1RMJ3MgaW50ZXJmYWNlcy4KLS8vCi0vLyBPYmplY3RzIGFyZSBjb3BpZWQgaW50byB0aGUgbGlzdCB3aXRoIHRoZSAnPScgb3BlcmF0b3Igb3Igd2l0aCBjb3B5LQotLy8gY29uc3RydWN0aW9uLCBzbyBpZiB0aGUgY29tcGlsZXIncyBhdXRvLWdlbmVyYXRlZCB2ZXJzaW9ucyB3b24ndCB3b3JrIGZvcgotLy8geW91LCBkZWZpbmUgeW91ciBvd24uCi0vLwotLy8gVGhlIG9ubHkgY2xhc3MgeW91IHdhbnQgdG8gdXNlIGZyb20gaGVyZSBpcyAiTGlzdCIuCi0vLwotI2lmbmRlZiBfTElCU19VVElMU19MSVNUX0gKLSNkZWZpbmUgX0xJQlNfVVRJTFNfTElTVF9ICi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKgotICogRG91Ymx5LWxpbmtlZCBsaXN0LiAgSW5zdGFudGlhdGUgd2l0aCAiTGlzdDxNeUNsYXNzPiBteUxpc3QiLgotICoKLSAqIE9iamVjdHMgYWRkZWQgdG8gdGhlIGxpc3QgYXJlIGNvcGllZCB1c2luZyB0aGUgYXNzaWdubWVudCBvcGVyYXRvciwKLSAqIHNvIHRoaXMgbXVzdCBiZSBkZWZpbmVkLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiAKLWNsYXNzIExpc3QgCi17Ci1wcm90ZWN0ZWQ6Ci0gICAgLyoKLSAgICAgKiBPbmUgZWxlbWVudCBpbiB0aGUgbGlzdC4KLSAgICAgKi8KLSAgICBjbGFzcyBfTm9kZSB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBfTm9kZShjb25zdCBUJiB2YWwpIDogbVZhbCh2YWwpIHt9Ci0gICAgICAgIH5fTm9kZSgpIHt9Ci0gICAgICAgIGlubGluZSBUJiBnZXRSZWYoKSB7IHJldHVybiBtVmFsOyB9Ci0gICAgICAgIGlubGluZSBjb25zdCBUJiBnZXRSZWYoKSBjb25zdCB7IHJldHVybiBtVmFsOyB9Ci0gICAgICAgIGlubGluZSBfTm9kZSogZ2V0UHJldigpIGNvbnN0IHsgcmV0dXJuIG1wUHJldjsgfQotICAgICAgICBpbmxpbmUgX05vZGUqIGdldE5leHQoKSBjb25zdCB7IHJldHVybiBtcE5leHQ7IH0KLSAgICAgICAgaW5saW5lIHZvaWQgc2V0VmFsKGNvbnN0IFQmIHZhbCkgeyBtVmFsID0gdmFsOyB9Ci0gICAgICAgIGlubGluZSB2b2lkIHNldFByZXYoX05vZGUqIHB0cikgeyBtcFByZXYgPSBwdHI7IH0KLSAgICAgICAgaW5saW5lIHZvaWQgc2V0TmV4dChfTm9kZSogcHRyKSB7IG1wTmV4dCA9IHB0cjsgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBMaXN0OwotICAgICAgICBmcmllbmQgY2xhc3MgX0xpc3RJdGVyYXRvcjsKLSAgICAgICAgVCAgICAgICAgICAgbVZhbDsKLSAgICAgICAgX05vZGUqICAgICAgbXBQcmV2OwotICAgICAgICBfTm9kZSogICAgICBtcE5leHQ7Ci0gICAgfTsKLQotICAgIC8qCi0gICAgICogSXRlcmF0b3IgZm9yIHdhbGtpbmcgdGhyb3VnaCB0aGUgbGlzdC4KLSAgICAgKi8KLSAgICAKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KLSAgICBzdHJ1Y3QgQ09OU1RfSVRFUkFUT1IgewotICAgICAgICB0eXBlZGVmIF9Ob2RlIGNvbnN0ICogTm9kZVB0cjsKLSAgICAgICAgdHlwZWRlZiBjb25zdCBUWVBFIFR5cGU7Ci0gICAgfTsKLSAgICAKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KLSAgICBzdHJ1Y3QgTk9OX0NPTlNUX0lURVJBVE9SIHsKLSAgICAgICAgdHlwZWRlZiBfTm9kZSogTm9kZVB0cjsKLSAgICAgICAgdHlwZWRlZiBUWVBFIFR5cGU7Ci0gICAgfTsKLSAgICAKLSAgICB0ZW1wbGF0ZTwKLSAgICAgICAgdHlwZW5hbWUgVSwKLSAgICAgICAgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBDb25zdG5lc3MKLSAgICA+IAotICAgIGNsYXNzIF9MaXN0SXRlcmF0b3IgewotICAgICAgICB0eXBlZGVmIF9MaXN0SXRlcmF0b3I8VSwgQ29uc3RuZXNzPiAgICAgX0l0ZXI7Ci0gICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQ29uc3RuZXNzPFU+OjpOb2RlUHRyICBfTm9kZVB0cjsKLSAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBDb25zdG5lc3M8VT46OlR5cGUgICAgIF9UeXBlOwotCi0gICAgICAgIGV4cGxpY2l0IF9MaXN0SXRlcmF0b3IoX05vZGVQdHIgcHRyKSA6IG1wTm9kZShwdHIpIHt9Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIF9MaXN0SXRlcmF0b3IoKSB7fQotICAgICAgICBfTGlzdEl0ZXJhdG9yKGNvbnN0IF9JdGVyJiByaHMpIDogbXBOb2RlKHJocy5tcE5vZGUpIHt9Ci0gICAgICAgIH5fTGlzdEl0ZXJhdG9yKCkge30KLSAgICAgICAgCi0gICAgICAgIC8vIHRoaXMgd2lsbCBoYW5kbGUgY29udmVyc2lvbnMgZnJvbSBpdGVyYXRvciB0byBjb25zdF9pdGVyYXRvcgotICAgICAgICAvLyAoYW5kIGFsc28gYWxsIGNvbnZlcnRpYmxlIGl0ZXJhdG9ycykKLSAgICAgICAgLy8gSGVyZSwgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhlIGl0ZXJhdG9ycyBjYW4gYmUgY29udmVydGVkCi0gICAgICAgIC8vIGlmIHRoZSBub2RlcyBjYW4gYmUgY29udmVydGVkCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFY+IGV4cGxpY2l0IAotICAgICAgICBfTGlzdEl0ZXJhdG9yKGNvbnN0IFYmIHJocykgOiBtcE5vZGUocmhzLm1wTm9kZSkge30KLSAgICAgICAgCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogRGVyZWZlcmVuY2Ugb3BlcmF0b3IuICBVc2VkIHRvIGdldCBhdCB0aGUganVpY3kgaW5zaWRlcy4KLSAgICAgICAgICovCi0gICAgICAgIF9UeXBlJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBtcE5vZGUtPmdldFJlZigpOyB9Ci0gICAgICAgIF9UeXBlKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJihtcE5vZGUtPmdldFJlZigpKTsgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEl0ZXJhdG9yIGNvbXBhcmlzb24uCi0gICAgICAgICAqLwotICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9JdGVyJiByaWdodCkgY29uc3QgeyAKLSAgICAgICAgICAgIHJldHVybiBtcE5vZGUgPT0gcmlnaHQubXBOb2RlOyB9Ci0gICAgICAgIAotICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9JdGVyJiByaWdodCkgY29uc3QgeyAKLSAgICAgICAgICAgIHJldHVybiBtcE5vZGUgIT0gcmlnaHQubXBOb2RlOyB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogaGFuZGxlIGNvbXBhcmlzb25zIGJldHdlZW4gaXRlcmF0b3IgYW5kIGNvbnN0X2l0ZXJhdG9yCi0gICAgICAgICAqLwotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPVEhFUj4KLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBPVEhFUiYgcmlnaHQpIGNvbnN0IHsgCi0gICAgICAgICAgICByZXR1cm4gbXBOb2RlID09IHJpZ2h0Lm1wTm9kZTsgfQotICAgICAgICAKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT1RIRVI+Ci0gICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgT1RIRVImIHJpZ2h0KSBjb25zdCB7IAotICAgICAgICAgICAgcmV0dXJuIG1wTm9kZSAhPSByaWdodC5tcE5vZGU7IH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBJbmNyL2RlY3IsIHVzZWQgdG8gbW92ZSB0aHJvdWdoIHRoZSBsaXN0LgotICAgICAgICAgKi8KLSAgICAgICAgaW5saW5lIF9JdGVyJiBvcGVyYXRvcisrKCkgeyAgICAgLy8gcHJlLWluY3JlbWVudAotICAgICAgICAgICAgbXBOb2RlID0gbXBOb2RlLT5nZXROZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgX0l0ZXIgb3BlcmF0b3IrKyhpbnQpIHsgICAgLy8gcG9zdC1pbmNyZW1lbnQKLSAgICAgICAgICAgIF9JdGVyIHRtcCgqdGhpcyk7Ci0gICAgICAgICAgICBtcE5vZGUgPSBtcE5vZGUtPmdldE5leHQoKTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgaW5saW5lIF9JdGVyJiBvcGVyYXRvci0tKCkgeyAgICAgLy8gcHJlLWluY3JlbWVudAotICAgICAgICAgICAgbXBOb2RlID0gbXBOb2RlLT5nZXRQcmV2KCk7Ci0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgX0l0ZXIgb3BlcmF0b3ItLShpbnQpIHsgICAvLyBwb3N0LWluY3JlbWVudAotICAgICAgICAgICAgX0l0ZXIgdG1wKCp0aGlzKTsKLSAgICAgICAgICAgIG1wTm9kZSA9IG1wTm9kZS0+Z2V0UHJldigpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBfTm9kZVB0ciBnZXROb2RlKCkgY29uc3QgeyByZXR1cm4gbXBOb2RlOyB9Ci0KLSAgICAgICAgX05vZGVQdHIgbXBOb2RlOyAgICAvKiBzaG91bGQgYmUgcHJpdmF0ZSwgYnV0IG9sZGVyIGdjYyBmYWlscyAqLwotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBMaXN0OwotICAgIH07Ci0KLXB1YmxpYzoKLSAgICBMaXN0KCkgewotICAgICAgICBwcmVwKCk7Ci0gICAgfQotICAgIExpc3QoY29uc3QgTGlzdDxUPiYgc3JjKSB7ICAgICAgLy8gY29weS1jb25zdHJ1Y3RvcgotICAgICAgICBwcmVwKCk7Ci0gICAgICAgIGluc2VydChiZWdpbigpLCBzcmMuYmVnaW4oKSwgc3JjLmVuZCgpKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+TGlzdCgpIHsKLSAgICAgICAgY2xlYXIoKTsKLSAgICAgICAgZGVsZXRlW10gKHVuc2lnbmVkIGNoYXIqKSBtcE1pZGRsZTsKLSAgICB9Ci0KLSAgICB0eXBlZGVmIF9MaXN0SXRlcmF0b3I8VCwgTk9OX0NPTlNUX0lURVJBVE9SPiBpdGVyYXRvcjsKLSAgICB0eXBlZGVmIF9MaXN0SXRlcmF0b3I8VCwgQ09OU1RfSVRFUkFUT1I+IGNvbnN0X2l0ZXJhdG9yOwotCi0gICAgTGlzdDxUPiYgb3BlcmF0b3I9KGNvbnN0IExpc3Q8VD4mIHJpZ2h0KTsKLQotICAgIC8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgbGlzdCBpcyBlbXB0eSAqLwotICAgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gbXBNaWRkbGUtPmdldE5leHQoKSA9PSBtcE1pZGRsZTsgfQotCi0gICAgLyogcmV0dXJuICNvZiBlbGVtZW50cyBpbiBsaXN0ICovCi0gICAgc2l6ZV90IHNpemUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBzaXplX3QoZGlzdGFuY2UoYmVnaW4oKSwgZW5kKCkpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBvciBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50LiAgVGhlCi0gICAgICogX05vZGUqIHdlJ3JlIHJldHVybmluZyBpcyBjb252ZXJ0ZWQgdG8gYW4gIml0ZXJhdG9yIiBieSBhCi0gICAgICogY29uc3RydWN0b3IgaW4gX0xpc3RJdGVyYXRvci4KLSAgICAgKi8KLSAgICBpbmxpbmUgaXRlcmF0b3IgYmVnaW4oKSB7IAotICAgICAgICByZXR1cm4gaXRlcmF0b3IobXBNaWRkbGUtPmdldE5leHQoKSk7IAotICAgIH0KLSAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IAotICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZSBjb25zdCo+KG1wTWlkZGxlLT5nZXROZXh0KCkpKTsgCi0gICAgfQotICAgIGlubGluZSBpdGVyYXRvciBlbmQoKSB7IAotICAgICAgICByZXR1cm4gaXRlcmF0b3IobXBNaWRkbGUpOyAKLSAgICB9Ci0gICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgCi0gICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlIGNvbnN0Kj4obXBNaWRkbGUpKTsgCi0gICAgfQotCi0gICAgLyogYWRkIHRoZSBvYmplY3QgdG8gdGhlIGhlYWQgb3IgdGFpbCBvZiB0aGUgbGlzdCAqLwotICAgIHZvaWQgcHVzaF9mcm9udChjb25zdCBUJiB2YWwpIHsgaW5zZXJ0KGJlZ2luKCksIHZhbCk7IH0KLSAgICB2b2lkIHB1c2hfYmFjayhjb25zdCBUJiB2YWwpIHsgaW5zZXJ0KGVuZCgpLCB2YWwpOyB9Ci0KLSAgICAvKiBpbnNlcnQgYmVmb3JlIHRoZSBjdXJyZW50IG5vZGU7IHJldHVybnMgaXRlcmF0b3IgYXQgbmV3IG5vZGUgKi8KLSAgICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgcG9zbiwgY29uc3QgVCYgdmFsKSAKLSAgICB7Ci0gICAgICAgIF9Ob2RlKiBuZXdOb2RlID0gbmV3IF9Ob2RlKHZhbCk7ICAgICAgICAvLyBhbGxvYyAmIGNvcHktY29uc3RydWN0Ci0gICAgICAgIG5ld05vZGUtPnNldE5leHQocG9zbi5nZXROb2RlKCkpOwotICAgICAgICBuZXdOb2RlLT5zZXRQcmV2KHBvc24uZ2V0Tm9kZSgpLT5nZXRQcmV2KCkpOwotICAgICAgICBwb3NuLmdldE5vZGUoKS0+Z2V0UHJldigpLT5zZXROZXh0KG5ld05vZGUpOwotICAgICAgICBwb3NuLmdldE5vZGUoKS0+c2V0UHJldihuZXdOb2RlKTsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKG5ld05vZGUpOwotICAgIH0KLQotICAgIC8qIGluc2VydCBhIHJhbmdlIG9mIGVsZW1lbnRzIGJlZm9yZSB0aGUgY3VycmVudCBub2RlICovCi0gICAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgcG9zbiwgY29uc3RfaXRlcmF0b3IgZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIGxhc3QpIHsKLSAgICAgICAgZm9yICggOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0KQotICAgICAgICAgICAgaW5zZXJ0KHBvc24sICpmaXJzdCk7Ci0gICAgfQotCi0gICAgLyogcmVtb3ZlIG9uZSBlbnRyeTsgcmV0dXJucyBpdGVyYXRvciBhdCBuZXh0IG5vZGUgKi8KLSAgICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBwb3NuKSB7Ci0gICAgICAgIF9Ob2RlKiBwTmV4dCA9IHBvc24uZ2V0Tm9kZSgpLT5nZXROZXh0KCk7Ci0gICAgICAgIF9Ob2RlKiBwUHJldiA9IHBvc24uZ2V0Tm9kZSgpLT5nZXRQcmV2KCk7Ci0gICAgICAgIHBQcmV2LT5zZXROZXh0KHBOZXh0KTsKLSAgICAgICAgcE5leHQtPnNldFByZXYocFByZXYpOwotICAgICAgICBkZWxldGUgcG9zbi5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvcihwTmV4dCk7Ci0gICAgfQotCi0gICAgLyogcmVtb3ZlIGEgcmFuZ2Ugb2YgZWxlbWVudHMgKi8KLSAgICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBmaXJzdCwgaXRlcmF0b3IgbGFzdCkgewotICAgICAgICB3aGlsZSAoZmlyc3QgIT0gbGFzdCkKLSAgICAgICAgICAgIGVyYXNlKGZpcnN0KyspOyAgICAgLy8gZG9uJ3QgZXJhc2UgdGhhbiBpbmNyIGxhdGVyIQotICAgICAgICByZXR1cm4gaXRlcmF0b3IobGFzdCk7Ci0gICAgfQotCi0gICAgLyogcmVtb3ZlIGFsbCBjb250ZW50cyBvZiB0aGUgbGlzdCAqLwotICAgIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIF9Ob2RlKiBwQ3VycmVudCA9IG1wTWlkZGxlLT5nZXROZXh0KCk7Ci0gICAgICAgIF9Ob2RlKiBwTmV4dDsKLQotICAgICAgICB3aGlsZSAocEN1cnJlbnQgIT0gbXBNaWRkbGUpIHsKLSAgICAgICAgICAgIHBOZXh0ID0gcEN1cnJlbnQtPmdldE5leHQoKTsKLSAgICAgICAgICAgIGRlbGV0ZSBwQ3VycmVudDsKLSAgICAgICAgICAgIHBDdXJyZW50ID0gcE5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgbXBNaWRkbGUtPnNldFByZXYobXBNaWRkbGUpOwotICAgICAgICBtcE1pZGRsZS0+c2V0TmV4dChtcE1pZGRsZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNZWFzdXJlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBpdGVyYXRvcnMuICBPbiBleGlzdCwgImZpcnN0IgotICAgICAqIHdpbGwgYmUgZXF1YWwgdG8gImxhc3QiLiAgVGhlIGl0ZXJhdG9ycyBtdXN0IHJlZmVyIHRvIHRoZSBzYW1lCi0gICAgICogbGlzdC4KLSAgICAgKgotICAgICAqIEZJWE1FOiBUaGlzIGlzIGFjdHVhbGx5IGEgZ2VuZXJpYyBpdGVyYXRvciBmdW5jdGlvbi4gSXQgc2hvdWxkIGJlIGEgCi0gICAgICogdGVtcGxhdGUgZnVuY3Rpb24gYXQgdGhlIHRvcC1sZXZlbCB3aXRoIHNwZWNpYWxpemF0aW9ucyBmb3IgdGhpbmdzIGxpa2UKLSAgICAgKiB2ZWN0b3I8Piwgd2hpY2ggY2FuIGp1c3QgZG8gcG9pbnRlciBtYXRoKS4gSGVyZSB3ZSBsaW1pdCBpdCB0bwotICAgICAqIF9MaXN0SXRlcmF0b3Igb2YgdGhlIHNhbWUgdHlwZSBidXQgZGlmZmVyZW50IGNvbnN0bmVzcy4KLSAgICAgKi8KLSAgICB0ZW1wbGF0ZTwKLSAgICAgICAgdHlwZW5hbWUgVSwKLSAgICAgICAgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBDTCwKLSAgICAgICAgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBDUgotICAgID4gCi0gICAgcHRyZGlmZl90IGRpc3RhbmNlKAotICAgICAgICAgICAgX0xpc3RJdGVyYXRvcjxVLCBDTD4gZmlyc3QsIF9MaXN0SXRlcmF0b3I8VSwgQ1I+IGxhc3QpIGNvbnN0IAotICAgIHsKLSAgICAgICAgcHRyZGlmZl90IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGZpcnN0ICE9IGxhc3QpIHsKLSAgICAgICAgICAgICsrZmlyc3Q7Ci0gICAgICAgICAgICArK2NvdW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgLyoKLSAgICAgKiBJIHdhbnQgYSBfTm9kZSBidXQgZG9uJ3QgbmVlZCBpdCB0byBob2xkIHZhbGlkIGRhdGEuICBNb3JlCi0gICAgICogdG8gdGhlIHBvaW50LCBJIGRvbid0IHdhbnQgVCdzIGNvbnN0cnVjdG9yIHRvIGZpcmUsIHNpbmNlIGl0Ci0gICAgICogbWlnaHQgaGF2ZSBzaWRlLWVmZmVjdHMgb3IgcmVxdWlyZSBhcmd1bWVudHMuICBTbywgd2UgZG8gdGhpcwotICAgICAqIHNsaWdodGx5IHVuY291dGggc3RvcmFnZSBhbGxvYy4KLSAgICAgKi8KLSAgICB2b2lkIHByZXAoKSB7Ci0gICAgICAgIG1wTWlkZGxlID0gKF9Ob2RlKikgbmV3IHVuc2lnbmVkIGNoYXJbc2l6ZW9mKF9Ob2RlKV07Ci0gICAgICAgIG1wTWlkZGxlLT5zZXRQcmV2KG1wTWlkZGxlKTsKLSAgICAgICAgbXBNaWRkbGUtPnNldE5leHQobXBNaWRkbGUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhpcyBub2RlIHBsYXlzIHRoZSByb2xlIG9mICJwb2ludGVyIHRvIGhlYWQiIGFuZCAicG9pbnRlciB0byB0YWlsIi4KLSAgICAgKiBJdCBzaXRzIGluIHRoZSBtaWRkbGUgb2YgYSBjaXJjdWxhciBsaXN0IG9mIG5vZGVzLiAgVGhlIGl0ZXJhdG9yCi0gICAgICogcnVucyBhcm91bmQgdGhlIGNpcmNsZSB1bnRpbCBpdCBlbmNvdW50ZXJzIHRoaXMgb25lLgotICAgICAqLwotICAgIF9Ob2RlKiAgICAgIG1wTWlkZGxlOwotfTsKLQotLyoKLSAqIEFzc2lnbm1lbnQgb3BlcmF0b3IuCi0gKgotICogVGhlIHNpbXBsZXN0IHdheSB0byBkbyB0aGlzIHdvdWxkIGJlIHRvIGNsZWFyIG91dCB0aGUgdGFyZ2V0IGxpc3QgYW5kCi0gKiBmaWxsIGl0IHdpdGggdGhlIHNvdXJjZS4gIEhvd2V2ZXIsIHdlIGNhbiBzcGVlZCB0aGluZ3MgYWxvbmcgYnkKLSAqIHJlLXVzaW5nIGV4aXN0aW5nIGVsZW1lbnRzLgotICovCi10ZW1wbGF0ZTxjbGFzcyBUPgotTGlzdDxUPiYgTGlzdDxUPjo6b3BlcmF0b3I9KGNvbnN0IExpc3Q8VD4mIHJpZ2h0KQotewotICAgIGlmICh0aGlzID09ICZyaWdodCkKLSAgICAgICAgcmV0dXJuICp0aGlzOyAgICAgICAvLyBzZWxmLWFzc2lnbm1lbnQKLSAgICBpdGVyYXRvciBmaXJzdERzdCA9IGJlZ2luKCk7Ci0gICAgaXRlcmF0b3IgbGFzdERzdCA9IGVuZCgpOwotICAgIGNvbnN0X2l0ZXJhdG9yIGZpcnN0U3JjID0gcmlnaHQuYmVnaW4oKTsKLSAgICBjb25zdF9pdGVyYXRvciBsYXN0U3JjID0gcmlnaHQuZW5kKCk7Ci0gICAgd2hpbGUgKGZpcnN0U3JjICE9IGxhc3RTcmMgJiYgZmlyc3REc3QgIT0gbGFzdERzdCkKLSAgICAgICAgKmZpcnN0RHN0KysgPSAqZmlyc3RTcmMrKzsKLSAgICBpZiAoZmlyc3RTcmMgPT0gbGFzdFNyYykgICAgICAgIC8vIHJhbiBvdXQgb2YgZWxlbWVudHMgaW4gc291cmNlPwotICAgICAgICBlcmFzZShmaXJzdERzdCwgbGFzdERzdCk7ICAgLy8geWVzLCBlcmFzZSBhbnkgZXh0cmFzCi0gICAgZWxzZQotICAgICAgICBpbnNlcnQobGFzdERzdCwgZmlyc3RTcmMsIGxhc3RTcmMpOyAgICAgLy8gY29weSByZW1haW5pbmcgb3ZlcgotICAgIHJldHVybiAqdGhpczsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIF9MSUJTX1VUSUxTX0xJU1RfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9Mb2cuaCBiL2luY2x1ZGUvdXRpbHMvTG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNmNjOGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9Mb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gQy9DKysgbG9nZ2luZyBmdW5jdGlvbnMuICBTZWUgdGhlIGxvZ2dpbmcgZG9jdW1lbnRhdGlvbiBmb3IgQVBJIGRldGFpbHMuCi0vLwotLy8gV2UnZCBsaWtlIHRoZXNlIHRvIGJlIGF2YWlsYWJsZSBmcm9tIEMgY29kZSAoaW4gY2FzZSB3ZSBpbXBvcnQgc29tZSBmcm9tCi0vLyBzb21ld2hlcmUpLCBzbyB0aGlzIGhhcyBhIEMgaW50ZXJmYWNlLgotLy8KLS8vIFRoZSBvdXRwdXQgd2lsbCBiZSBjb3JyZWN0IHdoZW4gdGhlIGxvZyBmaWxlIGlzIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlCi0vLyB0aHJlYWRzIGFuZC9vciBtdWx0aXBsZSBwcm9jZXNzZXMgc28gbG9uZyBhcyB0aGUgb3BlcmF0aW5nIHN5c3RlbQotLy8gc3VwcG9ydHMgT19BUFBFTkQuICBUaGVzZSBjYWxscyBoYXZlIG11dGV4LXByb3RlY3RlZCBkYXRhIHN0cnVjdHVyZXMKLS8vIGFuZCBzbyBhcmUgTk9UIHJlZW50cmFudC4gIERvIG5vdCB1c2UgTE9HIGluIGEgc2lnbmFsIGhhbmRsZXIuCi0vLwotI2lmbmRlZiBfTElCU19VVElMU19MT0dfSAotI2RlZmluZSBfTElCU19VVElMU19MT0dfSAotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCi0jZW5kaWYgLy8gX0xJQlNfVVRJTFNfTE9HX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmggYi9pbmNsdWRlL3V0aWxzL0xvb3Blci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzI5MDVkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVVRJTFNfTE9PUEVSX0gKLSNkZWZpbmUgVVRJTFNfTE9PUEVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvbG9vcGVyLmg+Ci0KLS8vIFdoZW4gZGVmaW5lZCwgdXNlcyBlcG9sbF93YWl0KCkgZm9yIHBvbGxpbmcsIG90aGVyd2lzZSB1c2VzIHBvbGwoKS4KLSNkZWZpbmUgTE9PUEVSX1VTRVNfRVBPTEwKLQotLy8gV2hlbiBkZWZpbmVkLCBsb2dzIHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MgZm9yIHR1bmluZyBhbmQgZGVidWdnaW5nIHB1cnBvc2VzLgotLy8jZGVmaW5lIExPT1BFUl9TVEFUSVNUSUNTCi0KLSNpZmRlZiBMT09QRVJfVVNFU19FUE9MTAotI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotI2VuZGlmCi0KLS8qCi0gKiBEZWNsYXJlIGEgY29uY3JldGUgdHlwZSBmb3IgdGhlIE5ESydzIGxvb3BlciBmb3J3YXJkIGRlY2xhcmF0aW9uLgotICovCi1zdHJ1Y3QgQUxvb3BlciB7Ci19OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qKgotICogQSBtZXNzYWdlIHRoYXQgY2FuIGJlIHBvc3RlZCB0byBhIExvb3Blci4KLSAqLwotc3RydWN0IE1lc3NhZ2UgewotICAgIE1lc3NhZ2UoKSA6IHdoYXQoMCkgeyB9Ci0gICAgTWVzc2FnZShpbnQgd2hhdCkgOiB3aGF0KHdoYXQpIHsgfQotCi0gICAgLyogVGhlIG1lc3NhZ2UgdHlwZS4gKGludGVycHJldGF0aW9uIGlzIGxlZnQgdXAgdG8gdGhlIGhhbmRsZXIpICovCi0gICAgaW50IHdoYXQ7Ci19OwotCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIExvb3BlciBtZXNzYWdlIGhhbmRsZXIuCi0gKgotICogVGhlIExvb3BlciBob2xkcyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIG1lc3NhZ2UgaGFuZGxlciB3aGVuZXZlciBpdCBoYXMKLSAqIGEgbWVzc2FnZSB0byBkZWxpdmVyIHRvIGl0LiAgTWFrZSBzdXJlIHRvIGNhbGwgTG9vcGVyOjpyZW1vdmVNZXNzYWdlcwotICogdG8gcmVtb3ZlIGFueSBwZW5kaW5nIG1lc3NhZ2VzIGRlc3RpbmVkIGZvciB0aGUgaGFuZGxlciBzbyB0aGF0IHRoZSBoYW5kbGVyCi0gKiBjYW4gYmUgZGVzdHJveWVkLgotICovCi1jbGFzcyBNZXNzYWdlSGFuZGxlciA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk1lc3NhZ2VIYW5kbGVyKCkgeyB9Ci0KLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIGEgbWVzc2FnZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSA9IDA7Ci19OwotCi0KLS8qKgotICogQSBzaW1wbGUgcHJveHkgdGhhdCBob2xkcyBhIHdlYWsgcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBoYW5kbGVyLgotICovCi1jbGFzcyBXZWFrTWVzc2FnZUhhbmRsZXIgOiBwdWJsaWMgTWVzc2FnZUhhbmRsZXIgewotcHVibGljOgotICAgIFdlYWtNZXNzYWdlSGFuZGxlcihjb25zdCB3cDxNZXNzYWdlSGFuZGxlcj4mIGhhbmRsZXIpOwotICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOwotCi1wcml2YXRlOgotICAgIHdwPE1lc3NhZ2VIYW5kbGVyPiBtSGFuZGxlcjsKLX07Ci0KLQotLyoqCi0gKiBBIHBvbGxpbmcgbG9vcCB0aGF0IHN1cHBvcnRzIG1vbml0b3JpbmcgZmlsZSBkZXNjcmlwdG9yIGV2ZW50cywgb3B0aW9uYWxseQotICogdXNpbmcgY2FsbGJhY2tzLiAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgZXBvbGwoKSBpbnRlcm5hbGx5LgotICoKLSAqIEEgbG9vcGVyIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSB0aHJlYWQgYWx0aG91Z2ggdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdGhhdCBpdCBtdXN0IGJlLgotICovCi1jbGFzcyBMb29wZXIgOiBwdWJsaWMgQUxvb3BlciwgcHVibGljIFJlZkJhc2UgewotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkxvb3BlcigpOwotCi1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGxvb3Blci4KLSAgICAgKgotICAgICAqIElmIGFsbG93Tm9uQ2FsbGJha3MgaXMgdHJ1ZSwgdGhlIGxvb3BlciB3aWxsIGFsbG93IGZpbGUgZGVzY3JpcHRvcnMgdG8gYmUKLSAgICAgKiByZWdpc3RlcmVkIHdpdGhvdXQgYXNzb2NpYXRlZCBjYWxsYmFja3MuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgY2FsbGVyIG9mCi0gICAgICogcG9sbE9uY2UoKSBpcyBwcmVwYXJlZCB0byBoYW5kbGUgY2FsbGJhY2stbGVzcyBldmVudHMgaXRzZWxmLgotICAgICAqLwotICAgIExvb3Blcihib29sIGFsbG93Tm9uQ2FsbGJhY2tzKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGxvb3BlciBpbnN0YW5jZSBhbGxvd3MgdGhlIHJlZ2lzdHJhdGlvbiBvZiBmaWxlIGRlc2NyaXB0b3JzCi0gICAgICogdXNpbmcgaWRlbnRpZmllcnMgaW5zdGVhZCBvZiBjYWxsYmFja3MuCi0gICAgICovCi0gICAgYm9vbCBnZXRBbGxvd05vbkNhbGxiYWNrcygpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogV2FpdHMgZm9yIGV2ZW50cyB0byBiZSBhdmFpbGFibGUsIHdpdGggb3B0aW9uYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICogSW52b2tlcyBjYWxsYmFja3MgZm9yIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9uIHdoaWNoIGFuIGV2ZW50IG9jY3VycmVkLgotICAgICAqCi0gICAgICogSWYgdGhlIHRpbWVvdXQgaXMgemVybywgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRob3V0IGJsb2NraW5nLgotICAgICAqIElmIHRoZSB0aW1lb3V0IGlzIG5lZ2F0aXZlLCB3YWl0cyBpbmRlZmluaXRlbHkgdW50aWwgYW4gZXZlbnQgYXBwZWFycy4KLSAgICAgKgotICAgICAqIFJldHVybnMgQUxPT1BFUl9QT0xMX1dBS0UgaWYgdGhlIHBvbGwgd2FzIGF3b2tlbiB1c2luZyB3YWtlKCkgYmVmb3JlCi0gICAgICogdGhlIHRpbWVvdXQgZXhwaXJlZCBhbmQgbm8gY2FsbGJhY2tzIHdlcmUgaW52b2tlZCBhbmQgbm8gb3RoZXIgZmlsZQotICAgICAqIGRlc2NyaXB0b3JzIHdlcmUgcmVhZHkuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBpZiBvbmUgb3IgbW9yZSBjYWxsYmFja3Mgd2VyZSBpbnZva2VkLgotICAgICAqCi0gICAgICogUmV0dXJucyBBTE9PUEVSX1BPTExfVElNRU9VVCBpZiB0aGVyZSB3YXMgbm8gZGF0YSBiZWZvcmUgdGhlIGdpdmVuCi0gICAgICogdGltZW91dCBleHBpcmVkLgotICAgICAqCi0gICAgICogUmV0dXJucyBBTE9PUEVSX1BPTExfRVJST1IgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIGEgdmFsdWUgPj0gMCBjb250YWluaW5nIGFuIGlkZW50aWZpZXIgaWYgaXRzIGZpbGUgZGVzY3JpcHRvciBoYXMgZGF0YQotICAgICAqIGFuZCBpdCBoYXMgbm8gY2FsbGJhY2sgZnVuY3Rpb24gKHJlcXVpcmluZyB0aGUgY2FsbGVyIGhlcmUgdG8gaGFuZGxlIGl0KS4KLSAgICAgKiBJbiB0aGlzIChhbmQgb25seSB0aGlzKSBjYXNlIG91dEZkLCBvdXRFdmVudHMgYW5kIG91dERhdGEgd2lsbCBjb250YWluIHRoZSBwb2xsCi0gICAgICogZXZlbnRzIGFuZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmQsIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgc2V0IHRvIE5VTEwuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gdW50aWwgaXQgaGFzIGZpbmlzaGVkIGludm9raW5nIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKLSAgICAgKiBmb3IgYWxsIGZpbGUgZGVzY3JpcHRvcnMgdGhhdCB3ZXJlIHNpZ25hbGxlZC4KLSAgICAgKi8KLSAgICBpbnQgcG9sbE9uY2UoaW50IHRpbWVvdXRNaWxsaXMsIGludCogb3V0RmQsIGludCogb3V0RXZlbnRzLCB2b2lkKiogb3V0RGF0YSk7Ci0gICAgaW5saW5lIGludCBwb2xsT25jZShpbnQgdGltZW91dE1pbGxpcykgewotICAgICAgICByZXR1cm4gcG9sbE9uY2UodGltZW91dE1pbGxpcywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlrZSBwb2xsT25jZSgpLCBidXQgcGVyZm9ybXMgYWxsIHBlbmRpbmcgY2FsbGJhY2tzIHVudGlsIGFsbAotICAgICAqIGRhdGEgaGFzIGJlZW4gY29uc3VtZWQgb3IgYSBmaWxlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlIHdpdGggbm8gY2FsbGJhY2suCi0gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIG5ldmVyIHJldHVybiBBTE9PUEVSX1BPTExfQ0FMTEJBQ0suCi0gICAgICovCi0gICAgaW50IHBvbGxBbGwoaW50IHRpbWVvdXRNaWxsaXMsIGludCogb3V0RmQsIGludCogb3V0RXZlbnRzLCB2b2lkKiogb3V0RGF0YSk7Ci0gICAgaW5saW5lIGludCBwb2xsQWxsKGludCB0aW1lb3V0TWlsbGlzKSB7Ci0gICAgICAgIHJldHVybiBwb2xsQWxsKHRpbWVvdXRNaWxsaXMsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdha2VzIHRoZSBwb2xsIGFzeW5jaHJvbm91c2x5LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBvbiBhbnkgdGhyZWFkLgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAgICovCi0gICAgdm9pZCB3YWtlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbmV3IGZpbGUgZGVzY3JpcHRvciB0byBiZSBwb2xsZWQgYnkgdGhlIGxvb3Blci4KLSAgICAgKiBJZiB0aGUgc2FtZSBmaWxlIGRlc2NyaXB0b3Igd2FzIHByZXZpb3VzbHkgYWRkZWQsIGl0IGlzIHJlcGxhY2VkLgotICAgICAqCi0gICAgICogImZkIiBpcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIGFkZGVkLgotICAgICAqICJpZGVudCIgaXMgYW4gaWRlbnRpZmllciBmb3IgdGhpcyBldmVudCwgd2hpY2ggaXMgcmV0dXJuZWQgZnJvbSBBTG9vcGVyX3BvbGxPbmNlKCkuCi0gICAgICogVGhlIGlkZW50aWZpZXIgbXVzdCBiZSA+PSAwLCBvciBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgaWYgcHJvdmlkaW5nIGEgbm9uLU5VTEwgY2FsbGJhY2suCi0gICAgICogImV2ZW50cyIgYXJlIHRoZSBwb2xsIGV2ZW50cyB0byB3YWtlIHVwIG9uLiAgVHlwaWNhbGx5IHRoaXMgaXMgQUxPT1BFUl9FVkVOVF9JTlBVVC4KLSAgICAgKiAiY2FsbGJhY2siIGlzIHRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlcmUgaXMgYW4gZXZlbnQgb24gdGhlIGZpbGUgZGVzY3JpcHRvci4KLSAgICAgKiAiZGF0YSIgaXMgYSBwcml2YXRlIGRhdGEgcG9pbnRlciB0byBzdXBwbHkgdG8gdGhlIGNhbGxiYWNrLgotICAgICAqCi0gICAgICogVGhlcmUgYXJlIHR3byBtYWluIHVzZXMgb2YgdGhpcyBmdW5jdGlvbjoKLSAgICAgKgotICAgICAqICgxKSBJZiAiY2FsbGJhY2siIGlzIG5vbi1OVUxMLCB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcwotICAgICAqIGRhdGEgb24gdGhlIGZpbGUgZGVzY3JpcHRvci4gIEl0IHNob3VsZCBleGVjdXRlIGFueSBldmVudHMgaXQgaGFzIHBlbmRpbmcsCi0gICAgICogYXBwcm9wcmlhdGVseSByZWFkaW5nIGZyb20gdGhlIGZpbGUgZGVzY3JpcHRvci4gIFRoZSAnaWRlbnQnIGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgotICAgICAqCi0gICAgICogKDIpIElmICJjYWxsYmFjayIgaXMgTlVMTCwgdGhlICdpZGVudCcgd2lsbCBiZSByZXR1cm5lZCBieSBBTG9vcGVyX3BvbGxPbmNlCi0gICAgICogd2hlbiBpdHMgZmlsZSBkZXNjcmlwdG9yIGhhcyBkYXRhIGF2YWlsYWJsZSwgcmVxdWlyaW5nIHRoZSBjYWxsZXIgdG8gdGFrZQotICAgICAqIGNhcmUgb2YgcHJvY2Vzc2luZyBpdC4KLSAgICAgKgotICAgICAqIFJldHVybnMgMSBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIHdhcyBhZGRlZCwgMCBpZiB0aGUgYXJndW1lbnRzIHdlcmUgaW52YWxpZC4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgb24gYW55IHRocmVhZC4KLSAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmxvY2sgYnJpZWZseSBpZiBpdCBuZWVkcyB0byB3YWtlIHRoZSBwb2xsLgotICAgICAqLwotICAgIGludCBhZGRGZChpbnQgZmQsIGludCBpZGVudCwgaW50IGV2ZW50cywgQUxvb3Blcl9jYWxsYmFja0Z1bmMgY2FsbGJhY2ssIHZvaWQqIGRhdGEpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgYWRkZWQgZmlsZSBkZXNjcmlwdG9yIGZyb20gdGhlIGxvb3Blci4KLSAgICAgKgotICAgICAqIFdoZW4gdGhpcyBtZXRob2QgcmV0dXJucywgaXQgaXMgc2FmZSB0byBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIHNpbmNlIHRoZSBsb29wZXIKLSAgICAgKiB3aWxsIG5vIGxvbmdlciBoYXZlIGEgcmVmZXJlbmNlIHRvIGl0LiAgSG93ZXZlciwgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBjYWxsYmFjayB0bwotICAgICAqIGFscmVhZHkgYmUgcnVubmluZyBvciBmb3IgaXQgdG8gcnVuIG9uZSBsYXN0IHRpbWUgaWYgdGhlIGZpbGUgZGVzY3JpcHRvciB3YXMgYWxyZWFkeQotICAgICAqIHNpZ25hbGxlZC4gIENhbGxpbmcgY29kZSBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGlzIGNhc2UgaXMgc2FmZWx5IGhhbmRsZWQuCi0gICAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBjYWxsYmFjayB0YWtlcyBjYXJlIG9mIHJlbW92aW5nIGl0c2VsZiBkdXJpbmcgaXRzIG93biBleGVjdXRpb24gZWl0aGVyCi0gICAgICogYnkgcmV0dXJuaW5nIDAgb3IgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlbiBpdCBjYW4gYmUgZ3VhcmFudGVlZCB0byBub3QgYmUgaW52b2tlZAotICAgICAqIGFnYWluIGF0IGFueSBsYXRlciB0aW1lIHVubGVzcyByZWdpc3RlcmVkIGFuZXcuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIDEgaWYgdGhlIGZpbGUgZGVzY3JpcHRvciB3YXMgcmVtb3ZlZCwgMCBpZiBub25lIHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQuCi0gICAgICogVGhpcyBtZXRob2QgbWF5IGJsb2NrIGJyaWVmbHkgaWYgaXQgbmVlZHMgdG8gd2FrZSB0aGUgcG9sbC4KLSAgICAgKi8KLSAgICBpbnQgcmVtb3ZlRmQoaW50IGZkKTsKLQotICAgIC8qKgotICAgICAqIEVucXVldWVzIGEgbWVzc2FnZSB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHNwZWNpZmllZCBoYW5kbGVyLgotICAgICAqCi0gICAgICogVGhlIGhhbmRsZXIgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQuCi0gICAgICovCi0gICAgdm9pZCBzZW5kTWVzc2FnZShjb25zdCBzcDxNZXNzYWdlSGFuZGxlcj4mIGhhbmRsZXIsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOwotCi0gICAgLyoqCi0gICAgICogRW5xdWV1ZXMgYSBtZXNzYWdlIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgc3BlY2lmaWVkIGhhbmRsZXIgYWZ0ZXIgYWxsIHBlbmRpbmcgbWVzc2FnZXMKLSAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LgotICAgICAqCi0gICAgICogVGhlIHRpbWUgZGVsYXkgaXMgc3BlY2lmaWVkIGluIHVwdGltZSBuYW5vc2Vjb25kcy4KLSAgICAgKiBUaGUgaGFuZGxlciBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgb24gYW55IHRocmVhZC4KLSAgICAgKi8KLSAgICB2b2lkIHNlbmRNZXNzYWdlRGVsYXllZChuc2Vjc190IHVwdGltZURlbGF5LCBjb25zdCBzcDxNZXNzYWdlSGFuZGxlcj4mIGhhbmRsZXIsCi0gICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKLQotICAgIC8qKgotICAgICAqIEVucXVldWVzIGEgbWVzc2FnZSB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHNwZWNpZmllZCBoYW5kbGVyIGFmdGVyIGFsbCBwZW5kaW5nIG1lc3NhZ2VzCi0gICAgICogYXQgdGhlIHNwZWNpZmllZCB0aW1lLgotICAgICAqCi0gICAgICogVGhlIHRpbWUgaXMgc3BlY2lmaWVkIGluIHVwdGltZSBuYW5vc2Vjb25kcy4KLSAgICAgKiBUaGUgaGFuZGxlciBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgb24gYW55IHRocmVhZC4KLSAgICAgKi8KLSAgICB2b2lkIHNlbmRNZXNzYWdlQXRUaW1lKG5zZWNzX3QgdXB0aW1lLCBjb25zdCBzcDxNZXNzYWdlSGFuZGxlcj4mIGhhbmRsZXIsCi0gICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIG1lc3NhZ2VzIGZvciB0aGUgc3BlY2lmaWVkIGhhbmRsZXIgZnJvbSB0aGUgcXVldWUuCi0gICAgICoKLSAgICAgKiBUaGUgaGFuZGxlciBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgb24gYW55IHRocmVhZC4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZU1lc3NhZ2VzKGNvbnN0IHNwPE1lc3NhZ2VIYW5kbGVyPiYgaGFuZGxlcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBtZXNzYWdlcyBvZiBhIHBhcnRpY3VsYXIgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBoYW5kbGVyIGZyb20gdGhlIHF1ZXVlLgotICAgICAqCi0gICAgICogVGhlIGhhbmRsZXIgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVNZXNzYWdlcyhjb25zdCBzcDxNZXNzYWdlSGFuZGxlcj4mIGhhbmRsZXIsIGludCB3aGF0KTsKLQotICAgIC8qKgotICAgICAqIFByZXBhcmVzIGEgbG9vcGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyB0aHJlYWQsIGFuZCByZXR1cm5zIGl0LgotICAgICAqIElmIHRoZSB0aHJlYWQgYWxyZWFkeSBoYXMgYSBsb29wZXIsIGl0IGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBhIG5ldwotICAgICAqIG9uZSBpcyBjcmVhdGVkLCBhc3NvY2lhdGVkIHdpdGggdGhlIHRocmVhZCwgYW5kIHJldHVybmVkLgotICAgICAqCi0gICAgICogVGhlIG9wdHMgbWF5IGJlIEFMT09QRVJfUFJFUEFSRV9BTExPV19OT05fQ0FMTEJBQ0tTIG9yIDAuCi0gICAgICovCi0gICAgc3RhdGljIHNwPExvb3Blcj4gcHJlcGFyZShpbnQgb3B0cyk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBnaXZlbiBsb29wZXIgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsaW5nIHRocmVhZC4KLSAgICAgKiBJZiBhbm90aGVyIGxvb3BlciBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdGhyZWFkLCBpdCBpcyByZXBsYWNlZC4KLSAgICAgKgotICAgICAqIElmICJsb29wZXIiIGlzIE5VTEwsIHJlbW92ZXMgdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGxvb3Blci4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBzZXRGb3JUaHJlYWQoY29uc3Qgc3A8TG9vcGVyPiYgbG9vcGVyKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvb3BlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgdGhyZWFkLCBvciBOVUxMIGlmCi0gICAgICogdGhlcmUgaXMgbm90IG9uZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgc3A8TG9vcGVyPiBnZXRGb3JUaHJlYWQoKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgUmVxdWVzdCB7Ci0gICAgICAgIGludCBmZDsKLSAgICAgICAgaW50IGlkZW50OwotICAgICAgICBBTG9vcGVyX2NhbGxiYWNrRnVuYyBjYWxsYmFjazsKLSAgICAgICAgdm9pZCogZGF0YTsKLSAgICB9OwotCi0gICAgc3RydWN0IFJlc3BvbnNlIHsKLSAgICAgICAgaW50IGV2ZW50czsKLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0OwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgTWVzc2FnZUVudmVsb3BlIHsKLSAgICAgICAgTWVzc2FnZUVudmVsb3BlKCkgOiB1cHRpbWUoMCkgeyB9Ci0KLSAgICAgICAgTWVzc2FnZUVudmVsb3BlKG5zZWNzX3QgdXB0aW1lLCBjb25zdCBzcDxNZXNzYWdlSGFuZGxlcj4gaGFuZGxlciwKLSAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSA6IHVwdGltZSh1cHRpbWUpLCBoYW5kbGVyKGhhbmRsZXIpLCBtZXNzYWdlKG1lc3NhZ2UpIHsKLSAgICAgICAgfQotCi0gICAgICAgIG5zZWNzX3QgdXB0aW1lOwotICAgICAgICBzcDxNZXNzYWdlSGFuZGxlcj4gaGFuZGxlcjsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlOwotICAgIH07Ci0KLSAgICBjb25zdCBib29sIG1BbGxvd05vbkNhbGxiYWNrczsgLy8gaW1tdXRhYmxlCi0KLSAgICBpbnQgbVdha2VSZWFkUGlwZUZkOyAgLy8gaW1tdXRhYmxlCi0gICAgaW50IG1XYWtlV3JpdGVQaXBlRmQ7IC8vIGltbXV0YWJsZQotICAgIE11dGV4IG1Mb2NrOwotCi0gICAgVmVjdG9yPE1lc3NhZ2VFbnZlbG9wZT4gbU1lc3NhZ2VFbnZlbG9wZXM7IC8vIGd1YXJkZWQgYnkgbUxvY2sKLSAgICBib29sIG1TZW5kaW5nTWVzc2FnZTsgLy8gZ3VhcmRlZCBieSBtTG9jawotCi0jaWZkZWYgTE9PUEVSX1VTRVNfRVBPTEwKLSAgICBpbnQgbUVwb2xsRmQ7IC8vIGltbXV0YWJsZQotCi0gICAgLy8gTG9ja2VkIGxpc3Qgb2YgZmlsZSBkZXNjcmlwdG9yIG1vbml0b3JpbmcgcmVxdWVzdHMuCi0gICAgS2V5ZWRWZWN0b3I8aW50LCBSZXF1ZXN0PiBtUmVxdWVzdHM7ICAvLyBndWFyZGVkIGJ5IG1Mb2NrCi0jZWxzZQotICAgIC8vIFRoZSBsb2NrIGd1YXJkcyBzdGF0ZSB1c2VkIHRvIHRyYWNrIHdoZXRoZXIgdGhlcmUgaXMgYSBwb2xsKCkgaW4gcHJvZ3Jlc3MgYW5kIHdoZXRoZXIKLSAgICAvLyB0aGVyZSBhcmUgYW55IG90aGVyIHRocmVhZHMgd2FpdGluZyBpbiB3YWtlQW5kTG9jaygpLiAgVGhlIGNvbmRpdGlvbiB2YXJpYWJsZXMKLSAgICAvLyBhcmUgdXNlZCB0byB0cmFuc2ZlciBjb250cm9sIGFtb25nIHRoZXNlIHRocmVhZHMgc3VjaCB0aGF0IGFsbCB3YWl0ZXJzIGFyZQotICAgIC8vIHNlcnZpY2VkIGJlZm9yZSBhIG5ldyBwb2xsIGNhbiBiZWdpbi4KLSAgICAvLyBUaGUgd2FrZUFuZExvY2soKSBtZXRob2QgaW5jcmVtZW50cyBtV2FpdGVycywgd2FrZXMgdGhlIHBvbGwsIGJsb2NrcyBvbiBtQXdha2UKLSAgICAvLyB1bnRpbCBtUG9sbGluZyBiZWNvbWVzIGZhbHNlLCB0aGVuIGRlY3JlbWVudHMgbVdhaXRlcnMgYWdhaW4uCi0gICAgLy8gVGhlIHBvbGwoKSBtZXRob2QgYmxvY2tzIG9uIG1SZXN1bWUgdW50aWwgbVdhaXRlcnMgYmVjb21lcyAwLCB0aGVuIHNldHMKLSAgICAvLyBtUG9sbGluZyB0byB0cnVlLCBibG9ja3MgdW50aWwgdGhlIHBvbGwgY29tcGxldGVzLCB0aGVuIHJlc2V0cyBtUG9sbGluZyB0byBmYWxzZQotICAgIC8vIGFuZCBzaWduYWxzIG1SZXN1bWUgaWYgdGhlcmUgYXJlIHdhaXRlcnMuCi0gICAgYm9vbCBtUG9sbGluZzsgICAgICAvLyBndWFyZGVkIGJ5IG1Mb2NrCi0gICAgdWludDMyX3QgbVdhaXRlcnM7ICAvLyBndWFyZGVkIGJ5IG1Mb2NrCi0gICAgQ29uZGl0aW9uIG1Bd2FrZTsgICAvLyBndWFyZGVkIGJ5IG1Mb2NrCi0gICAgQ29uZGl0aW9uIG1SZXN1bWU7ICAvLyBndWFyZGVkIGJ5IG1Mb2NrCi0KLSAgICBWZWN0b3I8c3RydWN0IHBvbGxmZD4gbVJlcXVlc3RlZEZkczsgIC8vIG11c3QgaG9sZCBtTG9jayBhbmQgbVBvbGxpbmcgbXVzdCBiZSBmYWxzZSB0byBtb2RpZnkKLSAgICBWZWN0b3I8UmVxdWVzdD4gbVJlcXVlc3RzOyAgICAgICAgICAgIC8vIG11c3QgaG9sZCBtTG9jayBhbmQgbVBvbGxpbmcgbXVzdCBiZSBmYWxzZSB0byBtb2RpZnkKLQotICAgIHNzaXplX3QgZ2V0UmVxdWVzdEluZGV4TG9ja2VkKGludCBmZCk7Ci0gICAgdm9pZCB3YWtlQW5kTG9jaygpOwotI2VuZGlmCi0KLSNpZmRlZiBMT09QRVJfU1RBVElTVElDUwotICAgIHN0YXRpYyBjb25zdCBpbnQgU0FNUExFRF9XQUtFX0NZQ0xFU19UT19BR0dSRUdBVEUgPSAxMDA7Ci0gICAgc3RhdGljIGNvbnN0IGludCBTQU1QTEVEX1BPTExTX1RPX0FHR1JFR0FURSA9IDEwMDA7Ci0KLSAgICBuc2Vjc190IG1QZW5kaW5nV2FrZVRpbWU7Ci0gICAgaW50IG1QZW5kaW5nV2FrZUNvdW50OwotCi0gICAgaW50IG1TYW1wbGVkV2FrZUN5Y2xlczsKLSAgICBpbnQgbVNhbXBsZWRXYWtlQ291bnRTdW07Ci0gICAgbnNlY3NfdCBtU2FtcGxlZFdha2VMYXRlbmN5U3VtOwotCi0gICAgaW50IG1TYW1wbGVkUG9sbHM7Ci0gICAgaW50IG1TYW1wbGVkWmVyb1BvbGxDb3VudDsKLSAgICBpbnQgbVNhbXBsZWRaZXJvUG9sbExhdGVuY3lTdW07Ci0gICAgaW50IG1TYW1wbGVkVGltZW91dFBvbGxDb3VudDsKLSAgICBpbnQgbVNhbXBsZWRUaW1lb3V0UG9sbExhdGVuY3lTdW07Ci0jZW5kaWYKLQotICAgIC8vIFRoaXMgc3RhdGUgaXMgb25seSB1c2VkIHByaXZhdGVseSBieSBwb2xsT25jZSBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIGxvY2sgc2luY2UKLSAgICAvLyBpdCBydW5zIG9uIGEgc2luZ2xlIHRocmVhZC4KLSAgICBWZWN0b3I8UmVzcG9uc2U+IG1SZXNwb25zZXM7Ci0gICAgc2l6ZV90IG1SZXNwb25zZUluZGV4OwotICAgIG5zZWNzX3QgbU5leHRNZXNzYWdlVXB0aW1lOyAvLyBzZXQgdG8gTExPTkdfTUFYIHdoZW4gbm9uZQotCi0gICAgaW50IHBvbGxJbm5lcihpbnQgdGltZW91dE1pbGxpcyk7Ci0gICAgdm9pZCBhd29rZW4oKTsKLSAgICB2b2lkIHB1c2hSZXNwb25zZShpbnQgZXZlbnRzLCBjb25zdCBSZXF1ZXN0JiByZXF1ZXN0KTsKLQotICAgIHN0YXRpYyB2b2lkIGluaXRUTFNLZXkoKTsKLSAgICBzdGF0aWMgdm9pZCB0aHJlYWREZXN0cnVjdG9yKHZvaWQgKnN0KTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIFVUSUxTX0xPT1BFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL011dGV4LmggYi9pbmNsdWRlL3V0aWxzL011dGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmZiMzkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9NdXRleC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9MSUJTX1VUSUxTX01VVEVYX0gKLSNkZWZpbmUgX0xJQlNfVVRJTFNfTVVURVhfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaWYgZGVmaW5lZChIQVZFX1BUSFJFQURTKQotIyBpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBDb25kaXRpb247Ci0KLS8qCi0gKiBTaW1wbGUgbXV0ZXggY2xhc3MuICBUaGUgaW1wbGVtZW50YXRpb24gaXMgc3lzdGVtLWRlcGVuZGVudC4KLSAqCi0gKiBUaGUgbXV0ZXggbXVzdCBiZSB1bmxvY2tlZCBieSB0aGUgdGhyZWFkIHRoYXQgbG9ja2VkIGl0LiAgVGhleSBhcmUgbm90Ci0gKiByZWN1cnNpdmUsIGkuZS4gdGhlIHNhbWUgdGhyZWFkIGNhbid0IGxvY2sgaXQgbXVsdGlwbGUgdGltZXMuCi0gKi8KLWNsYXNzIE11dGV4IHsKLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAgUFJJVkFURSA9IDAsCi0gICAgICAgIFNIQVJFRCA9IDEKLSAgICB9OwotICAgIAotICAgICAgICAgICAgICAgIE11dGV4KCk7Ci0gICAgICAgICAgICAgICAgTXV0ZXgoY29uc3QgY2hhciogbmFtZSk7Ci0gICAgICAgICAgICAgICAgTXV0ZXgoaW50IHR5cGUsIGNvbnN0IGNoYXIqIG5hbWUgPSBOVUxMKTsKLSAgICAgICAgICAgICAgICB+TXV0ZXgoKTsKLQotICAgIC8vIGxvY2sgb3IgdW5sb2NrIHRoZSBtdXRleAotICAgIHN0YXR1c190ICAgIGxvY2soKTsKLSAgICB2b2lkICAgICAgICB1bmxvY2soKTsKLQotICAgIC8vIGxvY2sgaWYgcG9zc2libGU7IHJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJvciBvdGhlcndpc2UKLSAgICBzdGF0dXNfdCAgICB0cnlMb2NrKCk7Ci0KLSAgICAvLyBNYW5hZ2VzIHRoZSBtdXRleCBhdXRvbWF0aWNhbGx5LiBJdCdsbCBiZSBsb2NrZWQgd2hlbiBBdXRvbG9jayBpcwotICAgIC8vIGNvbnN0cnVjdGVkIGFuZCByZWxlYXNlZCB3aGVuIEF1dG9sb2NrIGdvZXMgb3V0IG9mIHNjb3BlLgotICAgIGNsYXNzIEF1dG9sb2NrIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGlubGluZSBBdXRvbG9jayhNdXRleCYgbXV0ZXgpIDogbUxvY2sobXV0ZXgpICB7IG1Mb2NrLmxvY2soKTsgfQotICAgICAgICBpbmxpbmUgQXV0b2xvY2soTXV0ZXgqIG11dGV4KSA6IG1Mb2NrKCptdXRleCkgeyBtTG9jay5sb2NrKCk7IH0KLSAgICAgICAgaW5saW5lIH5BdXRvbG9jaygpIHsgbUxvY2sudW5sb2NrKCk7IH0KLSAgICBwcml2YXRlOgotICAgICAgICBNdXRleCYgbUxvY2s7Ci0gICAgfTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQ29uZGl0aW9uOwotICAgIAotICAgIC8vIEEgbXV0ZXggY2Fubm90IGJlIGNvcGllZAotICAgICAgICAgICAgICAgIE11dGV4KGNvbnN0IE11dGV4Jik7Ci0gICAgTXV0ZXgmICAgICAgb3BlcmF0b3IgPSAoY29uc3QgTXV0ZXgmKTsKLSAgICAKLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0gICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKLSNlbHNlCi0gICAgdm9pZCAgICBfaW5pdCgpOwotICAgIHZvaWQqICAgbVN0YXRlOwotI2VuZGlmCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLQotaW5saW5lIE11dGV4OjpNdXRleCgpIHsKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7Ci19Ci1pbmxpbmUgTXV0ZXg6Ok11dGV4KGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7Ci19Ci1pbmxpbmUgTXV0ZXg6Ok11dGV4KGludCB0eXBlLCBjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgaWYgKHR5cGUgPT0gU0hBUkVEKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cjsKLSAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmYXR0cik7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHBzaGFyZWQoJmF0dHIsIFBUSFJFQURfUFJPQ0VTU19TSEFSRUQpOwotICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgJmF0dHIpOwotICAgICAgICBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZhdHRyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7Ci0gICAgfQotfQotaW5saW5lIE11dGV4Ojp+TXV0ZXgoKSB7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOwotfQotaW5saW5lIHN0YXR1c190IE11dGV4Ojpsb2NrKCkgewotICAgIHJldHVybiAtcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOwotfQotaW5saW5lIHZvaWQgTXV0ZXg6OnVubG9jaygpIHsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKLX0KLWlubGluZSBzdGF0dXNfdCBNdXRleDo6dHJ5TG9jaygpIHsKLSAgICByZXR1cm4gLXB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmbU11dGV4KTsKLX0KLQotI2VuZGlmIC8vIEhBVkVfUFRIUkVBRFMKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gKiBBdXRvbWF0aWMgbXV0ZXguICBEZWNsYXJlIG9uZSBvZiB0aGVzZSBhdCB0aGUgdG9wIG9mIGEgZnVuY3Rpb24uCi0gKiBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLCBpdCB3aWxsIGdvIG91dCBvZiBzY29wZSwgYW5kIHJlbGVhc2UgdGhlCi0gKiBtdXRleC4KLSAqLwotIAotdHlwZWRlZiBNdXRleDo6QXV0b2xvY2sgQXV0b011dGV4OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIF9MSUJTX1VUSUxTX01VVEVYX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvUHJvcGVydHlNYXAuaCBiL2luY2x1ZGUvdXRpbHMvUHJvcGVydHlNYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllNjc0Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1Byb3BlcnR5TWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1VUSUxTX1BST1BFUlRZX01BUF9ICi0jZGVmaW5lIF9VVElMU19QUk9QRVJUWV9NQVBfSAotCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVG9rZW5pemVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoKLSAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBwYXNzaW5nIGFyb3VuZCBzdHJpbmctYmFzZWQgcHJvcGVydHkga2V5IC8gdmFsdWUgcGFpcnMKLSAqIGFuZCBsb2FkaW5nIHRoZW0gZnJvbSBwcm9wZXJ0eSBmaWxlcy4KLSAqCi0gKiBUaGUgcHJvcGVydHkgZmlsZXMgaGF2ZSB0aGUgZm9sbG93aW5nIHNpbXBsZSBzdHJ1Y3R1cmU6Ci0gKgotICogIyBDb21tZW50Ci0gKiBrZXkgPSB2YWx1ZQotICoKLSAqIEtleXMgYW5kIHZhbHVlcyBhcmUgYW55IHNlcXVlbmNlIG9mIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzLgotICogVGhlICc9JyBzZXBhcmF0ZXMgdGhlIGtleSBmcm9tIHRoZSB2YWx1ZS4KLSAqIFRoZSBrZXkgYW5kIHZhbHVlIG1heSBub3QgY29udGFpbiB3aGl0ZXNwYWNlLgotICoKLSAqIFRoZSAnXCcgY2hhcmFjdGVyIGlzIHJlc2VydmVkIGZvciBlc2NhcGUgc2VxdWVuY2VzIGFuZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KLSAqIFRoZSAnIiIgY2hhcmFjdGVyIGlzIHJlc2VydmVkIGZvciBxdW90aW5nIGFuZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KLSAqIEZpbGVzIHRoYXQgY29udGFpbiB0aGUgJ1wnIG9yICciJyBjaGFyYWN0ZXIgd2lsbCBmYWlsIHRvIHBhcnNlLgotICoKLSAqIFRoZSBmaWxlIG11c3Qgbm90IGNvbnRhaW4gZHVwbGljYXRlIGtleXMuCi0gKgotICogVE9ETyBTdXBwb3J0IGVzY2FwZSBzZXF1ZW5jZXMgYW5kIHF1b3RlZCB2YWx1ZXMgd2hlbiBuZWVkZWQuCi0gKi8KLWNsYXNzIFByb3BlcnR5TWFwIHsKLXB1YmxpYzoKLSAgICAvKiBDcmVhdGVzIGFuIGVtcHR5IHByb3BlcnR5IG1hcC4gKi8KLSAgICBQcm9wZXJ0eU1hcCgpOwotICAgIH5Qcm9wZXJ0eU1hcCgpOwotCi0gICAgLyogQ2xlYXJzIHRoZSBwcm9wZXJ0eSBtYXAuICovCi0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgLyogQWRkcyBhIHByb3BlcnR5LgotICAgICAqIFJlcGxhY2VzIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuCi0gICAgICovCi0gICAgdm9pZCBhZGRQcm9wZXJ0eShjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IFN0cmluZzgmIHZhbHVlKTsKLQotICAgIC8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgbWFwIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQga2V5LiAqLwotICAgIGJvb2wgaGFzUHJvcGVydHkoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdDsKLQotICAgIC8qIEdldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgYW5kIHBhcnNlcyBpdC4KLSAgICAgKiBSZXR1cm5zIHRydWUgYW5kIHNldHMgb3V0VmFsdWUgaWYgdGhlIGtleSB3YXMgZm91bmQgYW5kIGl0cyB2YWx1ZSB3YXMgcGFyc2VkIHN1Y2Nlc3NmdWxseS4KLSAgICAgKiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgZG9lcyBub3QgbW9kaWZ5IG91dFZhbHVlLiAgKEFsc28gbG9ncyBhIHdhcm5pbmcuKQotICAgICAqLwotICAgIGJvb2wgdHJ5R2V0UHJvcGVydHkoY29uc3QgU3RyaW5nOCYga2V5LCBTdHJpbmc4JiBvdXRWYWx1ZSkgY29uc3Q7Ci0gICAgYm9vbCB0cnlHZXRQcm9wZXJ0eShjb25zdCBTdHJpbmc4JiBrZXksIGJvb2wmIG91dFZhbHVlKSBjb25zdDsKLSAgICBib29sIHRyeUdldFByb3BlcnR5KGNvbnN0IFN0cmluZzgmIGtleSwgaW50MzJfdCYgb3V0VmFsdWUpIGNvbnN0OwotICAgIGJvb2wgdHJ5R2V0UHJvcGVydHkoY29uc3QgU3RyaW5nOCYga2V5LCBmbG9hdCYgb3V0VmFsdWUpIGNvbnN0OwotCi0gICAgLyogQWRkcyBhbGwgdmFsdWVzIGZyb20gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBtYXAuICovCi0gICAgdm9pZCBhZGRBbGwoY29uc3QgUHJvcGVydHlNYXAqIG1hcCk7Ci0KLSAgICAvKiBHZXRzIHRoZSB1bmRlcmx5aW5nIHByb3BlcnR5IG1hcC4gKi8KLSAgICBpbmxpbmUgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGdldFByb3BlcnRpZXMoKSBjb25zdCB7IHJldHVybiBtUHJvcGVydGllczsgfQotCi0gICAgLyogTG9hZHMgYSBwcm9wZXJ0eSBtYXAgZnJvbSBhIGZpbGUuICovCi0gICAgc3RhdGljIHN0YXR1c190IGxvYWQoY29uc3QgU3RyaW5nOCYgZmlsZW5hbWUsIFByb3BlcnR5TWFwKiogb3V0TWFwKTsKLQotcHJpdmF0ZToKLSAgICBjbGFzcyBQYXJzZXIgewotICAgICAgICBQcm9wZXJ0eU1hcCogbU1hcDsKLSAgICAgICAgVG9rZW5pemVyKiBtVG9rZW5pemVyOwotCi0gICAgcHVibGljOgotICAgICAgICBQYXJzZXIoUHJvcGVydHlNYXAqIG1hcCwgVG9rZW5pemVyKiB0b2tlbml6ZXIpOwotICAgICAgICB+UGFyc2VyKCk7Ci0gICAgICAgIHN0YXR1c190IHBhcnNlKCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0dXNfdCBwYXJzZVR5cGUoKTsKLSAgICAgICAgc3RhdHVzX3QgcGFyc2VLZXkoKTsKLSAgICAgICAgc3RhdHVzX3QgcGFyc2VLZXlQcm9wZXJ0eSgpOwotICAgICAgICBzdGF0dXNfdCBwYXJzZU1vZGlmaWVyKGNvbnN0IFN0cmluZzgmIHRva2VuLCBpbnQzMl90KiBvdXRNZXRhU3RhdGUpOwotICAgICAgICBzdGF0dXNfdCBwYXJzZUNoYXJhY3RlckxpdGVyYWwoY2hhcjE2X3QqIG91dENoYXJhY3Rlcik7Ci0gICAgfTsKLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1Qcm9wZXJ0aWVzOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gX1VUSUxTX1BST1BFUlRZX01BUF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1JXTG9jay5oIGIvaW5jbHVkZS91dGlscy9SV0xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhYmVhMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1JXTG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9MSUJTX1VUSUxTX1JXTE9DS19ICi0jZGVmaW5lIF9MSUJTX1VUSUxTX1JXTE9DS19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLSMgaW5jbHVkZSA8cHRocmVhZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9UaHJlYWREZWZzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0KLS8qCi0gKiBTaW1wbGUgbXV0ZXggY2xhc3MuICBUaGUgaW1wbGVtZW50YXRpb24gaXMgc3lzdGVtLWRlcGVuZGVudC4KLSAqCi0gKiBUaGUgbXV0ZXggbXVzdCBiZSB1bmxvY2tlZCBieSB0aGUgdGhyZWFkIHRoYXQgbG9ja2VkIGl0LiAgVGhleSBhcmUgbm90Ci0gKiByZWN1cnNpdmUsIGkuZS4gdGhlIHNhbWUgdGhyZWFkIGNhbid0IGxvY2sgaXQgbXVsdGlwbGUgdGltZXMuCi0gKi8KLWNsYXNzIFJXTG9jayB7Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIFBSSVZBVEUgPSAwLAotICAgICAgICBTSEFSRUQgPSAxCi0gICAgfTsKLQotICAgICAgICAgICAgICAgIFJXTG9jaygpOwotICAgICAgICAgICAgICAgIFJXTG9jayhjb25zdCBjaGFyKiBuYW1lKTsKLSAgICAgICAgICAgICAgICBSV0xvY2soaW50IHR5cGUsIGNvbnN0IGNoYXIqIG5hbWUgPSBOVUxMKTsKLSAgICAgICAgICAgICAgICB+UldMb2NrKCk7Ci0KLSAgICBzdGF0dXNfdCAgICByZWFkTG9jaygpOwotICAgIHN0YXR1c190ICAgIHRyeVJlYWRMb2NrKCk7Ci0gICAgc3RhdHVzX3QgICAgd3JpdGVMb2NrKCk7Ci0gICAgc3RhdHVzX3QgICAgdHJ5V3JpdGVMb2NrKCk7Ci0gICAgdm9pZCAgICAgICAgdW5sb2NrKCk7Ci0KLSAgICBjbGFzcyBBdXRvUkxvY2sgewotICAgIHB1YmxpYzoKLSAgICAgICAgaW5saW5lIEF1dG9STG9jayhSV0xvY2smIHJ3bG9jaykgOiBtTG9jayhyd2xvY2spICB7IG1Mb2NrLnJlYWRMb2NrKCk7IH0KLSAgICAgICAgaW5saW5lIH5BdXRvUkxvY2soKSB7IG1Mb2NrLnVubG9jaygpOyB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgUldMb2NrJiBtTG9jazsKLSAgICB9OwotCi0gICAgY2xhc3MgQXV0b1dMb2NrIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGlubGluZSBBdXRvV0xvY2soUldMb2NrJiByd2xvY2spIDogbUxvY2socndsb2NrKSAgeyBtTG9jay53cml0ZUxvY2soKTsgfQotICAgICAgICBpbmxpbmUgfkF1dG9XTG9jaygpIHsgbUxvY2sudW5sb2NrKCk7IH0KLSAgICBwcml2YXRlOgotICAgICAgICBSV0xvY2smIG1Mb2NrOwotICAgIH07Ci0KLXByaXZhdGU6Ci0gICAgLy8gQSBSV0xvY2sgY2Fubm90IGJlIGNvcGllZAotICAgICAgICAgICAgICAgIFJXTG9jayhjb25zdCBSV0xvY2smKTsKLSAgIFJXTG9jayYgICAgICBvcGVyYXRvciA9IChjb25zdCBSV0xvY2smKTsKLQotICAgcHRocmVhZF9yd2xvY2tfdCBtUldMb2NrOwotfTsKLQotaW5saW5lIFJXTG9jazo6UldMb2NrKCkgewotICAgIHB0aHJlYWRfcndsb2NrX2luaXQoJm1SV0xvY2ssIE5VTEwpOwotfQotaW5saW5lIFJXTG9jazo6UldMb2NrKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICBwdGhyZWFkX3J3bG9ja19pbml0KCZtUldMb2NrLCBOVUxMKTsKLX0KLWlubGluZSBSV0xvY2s6OlJXTG9jayhpbnQgdHlwZSwgY29uc3QgY2hhciogbmFtZSkgewotICAgIGlmICh0eXBlID09IFNIQVJFRCkgewotICAgICAgICBwdGhyZWFkX3J3bG9ja2F0dHJfdCBhdHRyOwotICAgICAgICBwdGhyZWFkX3J3bG9ja2F0dHJfaW5pdCgmYXR0cik7Ci0gICAgICAgIHB0aHJlYWRfcndsb2NrYXR0cl9zZXRwc2hhcmVkKCZhdHRyLCBQVEhSRUFEX1BST0NFU1NfU0hBUkVEKTsKLSAgICAgICAgcHRocmVhZF9yd2xvY2tfaW5pdCgmbVJXTG9jaywgJmF0dHIpOwotICAgICAgICBwdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveSgmYXR0cik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHRocmVhZF9yd2xvY2tfaW5pdCgmbVJXTG9jaywgTlVMTCk7Ci0gICAgfQotfQotaW5saW5lIFJXTG9jazo6flJXTG9jaygpIHsKLSAgICBwdGhyZWFkX3J3bG9ja19kZXN0cm95KCZtUldMb2NrKTsKLX0KLWlubGluZSBzdGF0dXNfdCBSV0xvY2s6OnJlYWRMb2NrKCkgewotICAgIHJldHVybiAtcHRocmVhZF9yd2xvY2tfcmRsb2NrKCZtUldMb2NrKTsKLX0KLWlubGluZSBzdGF0dXNfdCBSV0xvY2s6OnRyeVJlYWRMb2NrKCkgewotICAgIHJldHVybiAtcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKCZtUldMb2NrKTsKLX0KLWlubGluZSBzdGF0dXNfdCBSV0xvY2s6OndyaXRlTG9jaygpIHsKLSAgICByZXR1cm4gLXB0aHJlYWRfcndsb2NrX3dybG9jaygmbVJXTG9jayk7Ci19Ci1pbmxpbmUgc3RhdHVzX3QgUldMb2NrOjp0cnlXcml0ZUxvY2soKSB7Ci0gICAgcmV0dXJuIC1wdGhyZWFkX3J3bG9ja190cnl3cmxvY2soJm1SV0xvY2spOwotfQotaW5saW5lIHZvaWQgUldMb2NrOjp1bmxvY2soKSB7Ci0gICAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZtUldMb2NrKTsKLX0KLQotI2VuZGlmIC8vIEhBVkVfUFRIUkVBRFMKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBfTElCU19VVElMU19SV0xPQ0tfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9SZWZCYXNlLmggYi9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhOWI3OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JFRl9CQVNFX0gKLSNkZWZpbmUgQU5EUk9JRF9SRUZfQkFTRV9ICi0KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFRleHRPdXRwdXQ7Ci1UZXh0T3V0cHV0JiBwcmludFdlYWtQb2ludGVyKFRleHRPdXRwdXQmIHRvLCBjb25zdCB2b2lkKiB2YWwpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2RlZmluZSBDT01QQVJFX1dFQUsoX29wXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWlubGluZSBib29sIG9wZXJhdG9yIF9vcF8gKGNvbnN0IHNwPFQ+JiBvKSBjb25zdCB7ICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIG1fcHRyIF9vcF8gby5tX3B0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWlubGluZSBib29sIG9wZXJhdG9yIF9vcF8gKGNvbnN0IFQqIG8pIGNvbnN0IHsgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIG1fcHRyIF9vcF8gbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXRlbXBsYXRlPHR5cGVuYW1lIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1pbmxpbmUgYm9vbCBvcGVyYXRvciBfb3BfIChjb25zdCBzcDxVPiYgbykgY29uc3QgeyAgICAgICAgICAgICAgXAotICAgIHJldHVybiBtX3B0ciBfb3BfIG8ubV9wdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi10ZW1wbGF0ZTx0eXBlbmFtZSBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotaW5saW5lIGJvb2wgb3BlcmF0b3IgX29wXyAoY29uc3QgVSogbykgY29uc3QgeyAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gbV9wdHIgX29wXyBvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY2xhc3MgUmVmZXJlbmNlTW92ZXI7Ci1jbGFzcyBSZWZlcmVuY2VDb252ZXJ0ZXJCYXNlIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRSZWZlcmVuY2VUeXBlU2l6ZSgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQqIGdldFJlZmVyZW5jZUJhc2Uodm9pZCBjb25zdCopIGNvbnN0ID0gMDsKLSAgICBpbmxpbmUgdmlydHVhbCB+UmVmZXJlbmNlQ29udmVydGVyQmFzZSgpIHsgfQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBpbmNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0OwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGRlY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3Q7Ci0gICAgCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgZm9yY2VJbmNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0OwotCi0gICAgICAgICAgICAvLyEgREVCVUdHSU5HIE9OTFk6IEdldCBjdXJyZW50IHN0cm9uZyByZWYgY291bnQuCi0gICAgICAgICAgICBpbnQzMl90ICAgICAgICAgZ2V0U3Ryb25nQ291bnQoKSBjb25zdDsKLQotICAgIGNsYXNzIHdlYWtyZWZfdHlwZQotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFJlZkJhc2UqICAgICAgICAgICAgcmVmQmFzZSgpIGNvbnN0OwotICAgICAgICAKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBpbmNXZWFrKGNvbnN0IHZvaWQqIGlkKTsKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBkZWNXZWFrKGNvbnN0IHZvaWQqIGlkKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFjcXVpcmVzIGEgc3Ryb25nIHJlZmVyZW5jZSBpZiB0aGVyZSBpcyBhbHJlYWR5IG9uZS4KLSAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBhdHRlbXB0SW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFjcXVpcmVzIGEgd2VhayByZWZlcmVuY2UgaWYgdGhlcmUgaXMgYWxyZWFkeSBvbmUuCi0gICAgICAgIC8vIFRoaXMgaXMgbm90IGFsd2F5cyBzYWZlLiBzZWUgUHJvY2Vzc1N0YXRlLmNwcCBhbmQgQnBCaW5kZXIuY3BwCi0gICAgICAgIC8vIGZvciBwcm9wZXIgdXNlLgotICAgICAgICBib29sICAgICAgICAgICAgICAgIGF0dGVtcHRJbmNXZWFrKGNvbnN0IHZvaWQqIGlkKTsKLQotICAgICAgICAvLyEgREVCVUdHSU5HIE9OTFk6IEdldCBjdXJyZW50IHdlYWsgcmVmIGNvdW50LgotICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGdldFdlYWtDb3VudCgpIGNvbnN0OwotCi0gICAgICAgIC8vISBERUJVR0dJTkcgT05MWTogUHJpbnQgcmVmZXJlbmNlcyBoZWxkIG9uIG9iamVjdC4KLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBwcmludFJlZnMoKSBjb25zdDsKLQotICAgICAgICAvLyEgREVCVUdHSU5HIE9OTFk6IEVuYWJsZSB0cmFja2luZyBmb3IgdGhpcyBvYmplY3QuCi0gICAgICAgIC8vIGVuYWJsZSAtLSBlbmFibGUvZGlzYWJsZSB0cmFja2luZwotICAgICAgICAvLyByZXRhaW4gLS0gd2hlbiB0cmFja2luZyBpcyBlbmFibGUsIGlmIHRydWUsIHRoZW4gd2Ugc2F2ZSBhIHN0YWNrIHRyYWNlCi0gICAgICAgIC8vICAgICAgICAgICBmb3IgZWFjaCByZWZlcmVuY2UgYW5kIGRlcmVmZXJlbmNlOyB3aGVuIHJldGFpbiA9PSBmYWxzZSwgd2UKLSAgICAgICAgLy8gICAgICAgICAgIG1hdGNoIHVwIHJlZmVyZW5jZXMgYW5kIGRlcmVmZXJlbmNlcyBhbmQga2VlcCBvbmx5IHRoZSAKLSAgICAgICAgLy8gICAgICAgICAgIG91dHN0YW5kaW5nIG9uZXMuCi0gICAgICAgIAotICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHRyYWNrTWUoYm9vbCBlbmFibGUsIGJvb2wgcmV0YWluKTsKLSAgICB9OwotICAgIAotICAgICAgICAgICAgd2Vha3JlZl90eXBlKiAgIGNyZWF0ZVdlYWsoY29uc3Qgdm9pZCogaWQpIGNvbnN0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3ZWFrcmVmX3R5cGUqICAgZ2V0V2Vha1JlZnMoKSBjb25zdDsKLQotICAgICAgICAgICAgLy8hIERFQlVHR0lORyBPTkxZOiBQcmludCByZWZlcmVuY2VzIGhlbGQgb24gb2JqZWN0LgotICAgIGlubGluZSAgdm9pZCAgICAgICAgICAgIHByaW50UmVmcygpIGNvbnN0IHsgZ2V0V2Vha1JlZnMoKS0+cHJpbnRSZWZzKCk7IH0KLQotICAgICAgICAgICAgLy8hIERFQlVHR0lORyBPTkxZOiBFbmFibGUgdHJhY2tpbmcgb2Ygb2JqZWN0LgotICAgIGlubGluZSAgdm9pZCAgICAgICAgICAgIHRyYWNrTWUoYm9vbCBlbmFibGUsIGJvb2wgcmV0YWluKQotICAgIHsgCi0gICAgICAgIGdldFdlYWtSZWZzKCktPnRyYWNrTWUoZW5hYmxlLCByZXRhaW4pOyAKLSAgICB9Ci0KLSAgICB0eXBlZGVmIFJlZkJhc2UgYmFzZXR5cGU7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZCYXNlKCk7Ci0gICAgdmlydHVhbCAgICAgICAgICAgICAgICAgflJlZkJhc2UoKTsKLQotICAgIC8vISBGbGFncyBmb3IgZXh0ZW5kT2JqZWN0TGlmZXRpbWUoKQotICAgIGVudW0gewotICAgICAgICBPQkpFQ1RfTElGRVRJTUVfU1RST05HICA9IDB4MDAwMCwKLSAgICAgICAgT0JKRUNUX0xJRkVUSU1FX1dFQUsgICAgPSAweDAwMDEsCi0gICAgICAgIE9CSkVDVF9MSUZFVElNRV9NQVNLICAgID0gMHgwMDAxCi0gICAgfTsKLSAgICAKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBleHRlbmRPYmplY3RMaWZldGltZShpbnQzMl90IG1vZGUpOwotICAgICAgICAgICAgCi0gICAgLy8hIEZsYWdzIGZvciBvbkluY1N0cm9uZ0F0dGVtcHRlZCgpCi0gICAgZW51bSB7Ci0gICAgICAgIEZJUlNUX0lOQ19TVFJPTkcgPSAweDAwMDEKLSAgICB9OwotICAgIAotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uRmlyc3RSZWYoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkxhc3RTdHJvbmdSZWYoY29uc3Qgdm9pZCogaWQpOwotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIG9uSW5jU3Ryb25nQXR0ZW1wdGVkKHVpbnQzMl90IGZsYWdzLCBjb25zdCB2b2lkKiBpZCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25MYXN0V2Vha1JlZihjb25zdCB2b2lkKiBpZCk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIFJlZmVyZW5jZU1vdmVyOwotICAgIHN0YXRpYyB2b2lkIG1vdmVSZWZlcmVuY2VzKHZvaWQqIGQsIHZvaWQgY29uc3QqIHMsIHNpemVfdCBuLAotICAgICAgICAgICAgY29uc3QgUmVmZXJlbmNlQ29udmVydGVyQmFzZSYgY2FzdGVyKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3Mgd2Vha3JlZl90eXBlOwotICAgIGNsYXNzIHdlYWtyZWZfaW1wbDsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZCYXNlKGNvbnN0IFJlZkJhc2UmIG8pOwotICAgICAgICAgICAgUmVmQmFzZSYgICAgICAgIG9wZXJhdG9yPShjb25zdCBSZWZCYXNlJiBvKTsKLQotICAgICAgICB3ZWFrcmVmX2ltcGwqIGNvbnN0IG1SZWZzOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlIDxjbGFzcyBUPgotY2xhc3MgTGlnaHRSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgaW5saW5lIExpZ2h0UmVmQmFzZSgpIDogbUNvdW50KDApIHsgfQotICAgIGlubGluZSB2b2lkIGluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3QgewotICAgICAgICBhbmRyb2lkX2F0b21pY19pbmMoJm1Db3VudCk7Ci0gICAgfQotICAgIGlubGluZSB2b2lkIGRlY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3QgewotICAgICAgICBpZiAoYW5kcm9pZF9hdG9taWNfZGVjKCZtQ291bnQpID09IDEpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxjb25zdCBUKj4odGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8hIERFQlVHR0lORyBPTkxZOiBHZXQgY3VycmVudCBzdHJvbmcgcmVmIGNvdW50LgotICAgIGlubGluZSBpbnQzMl90IGdldFN0cm9uZ0NvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUNvdW50OwotICAgIH0KLQotICAgIHR5cGVkZWYgTGlnaHRSZWZCYXNlPFQ+IGJhc2V0eXBlOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW5saW5lIH5MaWdodFJlZkJhc2UoKSB7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgUmVmZXJlbmNlTW92ZXI7Ci0gICAgaW5saW5lIHN0YXRpYyB2b2lkIG1vdmVSZWZlcmVuY2VzKHZvaWQqIGQsIHZvaWQgY29uc3QqIHMsIHNpemVfdCBuLAotICAgICAgICAgICAgY29uc3QgUmVmZXJlbmNlQ29udmVydGVyQmFzZSYgY2FzdGVyKSB7IH0KLQotcHJpdmF0ZToKLSAgICBtdXRhYmxlIHZvbGF0aWxlIGludDMyX3QgbUNvdW50OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3Mgd3AKLXsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFJlZkJhc2U6OndlYWtyZWZfdHlwZSB3ZWFrcmVmX3R5cGU7Ci0gICAgCi0gICAgaW5saW5lIHdwKCkgOiBtX3B0cigwKSB7IH0KLQotICAgIHdwKFQqIG90aGVyKTsKLSAgICB3cChjb25zdCB3cDxUPiYgb3RoZXIpOwotICAgIHdwKGNvbnN0IHNwPFQ+JiBvdGhlcik7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gd3AoVSogb3RoZXIpOwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHdwKGNvbnN0IHNwPFU+JiBvdGhlcik7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gd3AoY29uc3Qgd3A8VT4mIG90aGVyKTsKLQotICAgIH53cCgpOwotICAgIAotICAgIC8vIEFzc2lnbm1lbnQKLQotICAgIHdwJiBvcGVyYXRvciA9IChUKiBvdGhlcik7Ci0gICAgd3AmIG9wZXJhdG9yID0gKGNvbnN0IHdwPFQ+JiBvdGhlcik7Ci0gICAgd3AmIG9wZXJhdG9yID0gKGNvbnN0IHNwPFQ+JiBvdGhlcik7Ci0gICAgCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gd3AmIG9wZXJhdG9yID0gKFUqIG90aGVyKTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiB3cCYgb3BlcmF0b3IgPSAoY29uc3Qgd3A8VT4mIG90aGVyKTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiB3cCYgb3BlcmF0b3IgPSAoY29uc3Qgc3A8VT4mIG90aGVyKTsKLSAgICAKLSAgICB2b2lkIHNldF9vYmplY3RfYW5kX3JlZnMoVCogb3RoZXIsIHdlYWtyZWZfdHlwZSogcmVmcyk7Ci0KLSAgICAvLyBwcm9tb3Rpb24gdG8gc3AKLSAgICAKLSAgICBzcDxUPiBwcm9tb3RlKCkgY29uc3Q7Ci0KLSAgICAvLyBSZXNldAotICAgIAotICAgIHZvaWQgY2xlYXIoKTsKLQotICAgIC8vIEFjY2Vzc29ycwotICAgIAotICAgIGlubGluZSAgd2Vha3JlZl90eXBlKiBnZXRfcmVmcygpIGNvbnN0IHsgcmV0dXJuIG1fcmVmczsgfQotICAgIAotICAgIGlubGluZSAgVCogdW5zYWZlX2dldCgpIGNvbnN0IHsgcmV0dXJuIG1fcHRyOyB9Ci0KLSAgICAvLyBPcGVyYXRvcnMKLQotICAgIENPTVBBUkVfV0VBSyg9PSkKLSAgICBDT01QQVJFX1dFQUsoIT0pCi0gICAgQ09NUEFSRV9XRUFLKD4pCi0gICAgQ09NUEFSRV9XRUFLKDwpCi0gICAgQ09NUEFSRV9XRUFLKDw9KQotICAgIENPTVBBUkVfV0VBSyg+PSkKLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCB3cDxUPiYgbykgY29uc3QgewotICAgICAgICByZXR1cm4gKG1fcHRyID09IG8ubV9wdHIpICYmIChtX3JlZnMgPT0gby5tX3JlZnMpOwotICAgIH0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgotICAgIGlubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCB3cDxVPiYgbykgY29uc3QgewotICAgICAgICByZXR1cm4gbV9wdHIgPT0gby5tX3B0cjsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA+IChjb25zdCB3cDxUPiYgbykgY29uc3QgewotICAgICAgICByZXR1cm4gKG1fcHRyID09IG8ubV9wdHIpID8gKG1fcmVmcyA+IG8ubV9yZWZzKSA6IChtX3B0ciA+IG8ubV9wdHIpOwotICAgIH0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgotICAgIGlubGluZSBib29sIG9wZXJhdG9yID4gKGNvbnN0IHdwPFU+JiBvKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAobV9wdHIgPT0gby5tX3B0cikgPyAobV9yZWZzID4gby5tX3JlZnMpIDogKG1fcHRyID4gby5tX3B0cik7Ci0gICAgfQotCi0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPCAoY29uc3Qgd3A8VD4mIG8pIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChtX3B0ciA9PSBvLm1fcHRyKSA/IChtX3JlZnMgPCBvLm1fcmVmcykgOiAobV9wdHIgPCBvLm1fcHRyKTsKLSAgICB9Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA8IChjb25zdCB3cDxVPiYgbykgY29uc3QgewotICAgICAgICByZXR1cm4gKG1fcHRyID09IG8ubV9wdHIpID8gKG1fcmVmcyA8IG8ubV9yZWZzKSA6IChtX3B0ciA8IG8ubV9wdHIpOwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciAhPSAoY29uc3Qgd3A8VD4mIG8pIGNvbnN0IHsgcmV0dXJuIG1fcmVmcyAhPSBvLm1fcmVmczsgfQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IGlubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCB3cDxVPiYgbykgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yID09IChvKTsgfQotICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yIDw9IChjb25zdCB3cDxUPiYgbykgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yID4gKG8pOyB9Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gaW5saW5lIGJvb2wgb3BlcmF0b3IgPD0gKGNvbnN0IHdwPFU+JiBvKSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3IgPiAobyk7IH0KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA+PSAoY29uc3Qgd3A8VD4mIG8pIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciA8IChvKTsgfQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IGlubGluZSBib29sIG9wZXJhdG9yID49IChjb25zdCB3cDxVPiYgbykgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yIDwgKG8pOyB9Ci0KLXByaXZhdGU6Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgWT4gZnJpZW5kIGNsYXNzIHNwOwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFk+IGZyaWVuZCBjbGFzcyB3cDsKLQotICAgIFQqICAgICAgICAgICAgICBtX3B0cjsKLSAgICB3ZWFrcmVmX3R5cGUqICAgbV9yZWZzOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCB3cDxUPiYgdmFsKTsKLQotI3VuZGVmIENPTVBBUkVfV0VBSwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vIHVzZXIgc2VydmljZWFibGUgcGFydHMgYmVsb3cgaGVyZS4KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXdwPFQ+Ojp3cChUKiBvdGhlcikKLSAgICA6IG1fcHRyKG90aGVyKQotewotICAgIGlmIChvdGhlcikgbV9yZWZzID0gb3RoZXItPmNyZWF0ZVdlYWsodGhpcyk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci13cDxUPjo6d3AoY29uc3Qgd3A8VD4mIG90aGVyKQotICAgIDogbV9wdHIob3RoZXIubV9wdHIpLCBtX3JlZnMob3RoZXIubV9yZWZzKQotewotICAgIGlmIChtX3B0cikgbV9yZWZzLT5pbmNXZWFrKHRoaXMpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotd3A8VD46OndwKGNvbnN0IHNwPFQ+JiBvdGhlcikKLSAgICA6IG1fcHRyKG90aGVyLm1fcHRyKQotewotICAgIGlmIChtX3B0cikgewotICAgICAgICBtX3JlZnMgPSBtX3B0ci0+Y3JlYXRlV2Vhayh0aGlzKTsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci13cDxUPjo6d3AoVSogb3RoZXIpCi0gICAgOiBtX3B0cihvdGhlcikKLXsKLSAgICBpZiAob3RoZXIpIG1fcmVmcyA9IG90aGVyLT5jcmVhdGVXZWFrKHRoaXMpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgotd3A8VD46OndwKGNvbnN0IHdwPFU+JiBvdGhlcikKLSAgICA6IG1fcHRyKG90aGVyLm1fcHRyKQotewotICAgIGlmIChtX3B0cikgewotICAgICAgICBtX3JlZnMgPSBvdGhlci5tX3JlZnM7Ci0gICAgICAgIG1fcmVmcy0+aW5jV2Vhayh0aGlzKTsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci13cDxUPjo6d3AoY29uc3Qgc3A8VT4mIG90aGVyKQotICAgIDogbV9wdHIob3RoZXIubV9wdHIpCi17Ci0gICAgaWYgKG1fcHRyKSB7Ci0gICAgICAgIG1fcmVmcyA9IG1fcHRyLT5jcmVhdGVXZWFrKHRoaXMpOwotICAgIH0KLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXdwPFQ+Ojp+d3AoKQotewotICAgIGlmIChtX3B0cikgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotd3A8VD4mIHdwPFQ+OjpvcGVyYXRvciA9IChUKiBvdGhlcikKLXsKLSAgICB3ZWFrcmVmX3R5cGUqIG5ld1JlZnMgPQotICAgICAgICBvdGhlciA/IG90aGVyLT5jcmVhdGVXZWFrKHRoaXMpIDogMDsKLSAgICBpZiAobV9wdHIpIG1fcmVmcy0+ZGVjV2Vhayh0aGlzKTsKLSAgICBtX3B0ciA9IG90aGVyOwotICAgIG1fcmVmcyA9IG5ld1JlZnM7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotd3A8VD4mIHdwPFQ+OjpvcGVyYXRvciA9IChjb25zdCB3cDxUPiYgb3RoZXIpCi17Ci0gICAgd2Vha3JlZl90eXBlKiBvdGhlclJlZnMob3RoZXIubV9yZWZzKTsKLSAgICBUKiBvdGhlclB0cihvdGhlci5tX3B0cik7Ci0gICAgaWYgKG90aGVyUHRyKSBvdGhlclJlZnMtPmluY1dlYWsodGhpcyk7Ci0gICAgaWYgKG1fcHRyKSBtX3JlZnMtPmRlY1dlYWsodGhpcyk7Ci0gICAgbV9wdHIgPSBvdGhlclB0cjsKLSAgICBtX3JlZnMgPSBvdGhlclJlZnM7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotd3A8VD4mIHdwPFQ+OjpvcGVyYXRvciA9IChjb25zdCBzcDxUPiYgb3RoZXIpCi17Ci0gICAgd2Vha3JlZl90eXBlKiBuZXdSZWZzID0KLSAgICAgICAgb3RoZXIgIT0gTlVMTCA/IG90aGVyLT5jcmVhdGVXZWFrKHRoaXMpIDogMDsKLSAgICBUKiBvdGhlclB0cihvdGhlci5tX3B0cik7Ci0gICAgaWYgKG1fcHRyKSBtX3JlZnMtPmRlY1dlYWsodGhpcyk7Ci0gICAgbV9wdHIgPSBvdGhlclB0cjsKLSAgICBtX3JlZnMgPSBuZXdSZWZzOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KLXdwPFQ+JiB3cDxUPjo6b3BlcmF0b3IgPSAoVSogb3RoZXIpCi17Ci0gICAgd2Vha3JlZl90eXBlKiBuZXdSZWZzID0KLSAgICAgICAgb3RoZXIgPyBvdGhlci0+Y3JlYXRlV2Vhayh0aGlzKSA6IDA7Ci0gICAgaWYgKG1fcHRyKSBtX3JlZnMtPmRlY1dlYWsodGhpcyk7Ci0gICAgbV9wdHIgPSBvdGhlcjsKLSAgICBtX3JlZnMgPSBuZXdSZWZzOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KLXdwPFQ+JiB3cDxUPjo6b3BlcmF0b3IgPSAoY29uc3Qgd3A8VT4mIG90aGVyKQotewotICAgIHdlYWtyZWZfdHlwZSogb3RoZXJSZWZzKG90aGVyLm1fcmVmcyk7Ci0gICAgVSogb3RoZXJQdHIob3RoZXIubV9wdHIpOwotICAgIGlmIChvdGhlclB0cikgb3RoZXJSZWZzLT5pbmNXZWFrKHRoaXMpOwotICAgIGlmIChtX3B0cikgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOwotICAgIG1fcHRyID0gb3RoZXJQdHI7Ci0gICAgbV9yZWZzID0gb3RoZXJSZWZzOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KLXdwPFQ+JiB3cDxUPjo6b3BlcmF0b3IgPSAoY29uc3Qgc3A8VT4mIG90aGVyKQotewotICAgIHdlYWtyZWZfdHlwZSogbmV3UmVmcyA9Ci0gICAgICAgIG90aGVyICE9IE5VTEwgPyBvdGhlci0+Y3JlYXRlV2Vhayh0aGlzKSA6IDA7Ci0gICAgVSogb3RoZXJQdHIob3RoZXIubV9wdHIpOwotICAgIGlmIChtX3B0cikgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOwotICAgIG1fcHRyID0gb3RoZXJQdHI7Ci0gICAgbV9yZWZzID0gbmV3UmVmczsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci12b2lkIHdwPFQ+OjpzZXRfb2JqZWN0X2FuZF9yZWZzKFQqIG90aGVyLCB3ZWFrcmVmX3R5cGUqIHJlZnMpCi17Ci0gICAgaWYgKG90aGVyKSByZWZzLT5pbmNXZWFrKHRoaXMpOwotICAgIGlmIChtX3B0cikgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOwotICAgIG1fcHRyID0gb3RoZXI7Ci0gICAgbV9yZWZzID0gcmVmczsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXNwPFQ+IHdwPFQ+Ojpwcm9tb3RlKCkgY29uc3QKLXsKLSAgICBzcDxUPiByZXN1bHQ7Ci0gICAgaWYgKG1fcHRyICYmIG1fcmVmcy0+YXR0ZW1wdEluY1N0cm9uZygmcmVzdWx0KSkgewotICAgICAgICByZXN1bHQuc2V0X3BvaW50ZXIobV9wdHIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCB3cDxUPjo6Y2xlYXIoKQotewotICAgIGlmIChtX3B0cikgewotICAgICAgICBtX3JlZnMtPmRlY1dlYWsodGhpcyk7Ci0gICAgICAgIG1fcHRyID0gMDsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIFRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGNvbnN0IHdwPFQ+JiB2YWwpCi17Ci0gICAgcmV0dXJuIHByaW50V2Vha1BvaW50ZXIodG8sIHZhbC51bnNhZmVfZ2V0KCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gdGhpcyBjbGFzcyBqdXN0IHNlcnZlcyBhcyBhIG5hbWVzcGFjZSBzbyBUWVBFOjptb3ZlUmVmZXJlbmNlcyBjYW4gc3RheQotLy8gcHJpdmF0ZS4KLQotY2xhc3MgUmVmZXJlbmNlTW92ZXIgewotICAgIC8vIFN0cm9uZ1JlZmVyZW5jZUNhc3QgYW5kIFdlYWtSZWZlcmVuY2VDYXN0IGRvIHRoZSBpbXBlZGFuY2UgbWF0Y2hpbmcKLSAgICAvLyBiZXR3ZWVuIHRoZSBnZW5lcmljICh2b2lkKikgaW1wbGVtZW50YXRpb24gaW4gUmVmYmFzZSBhbmQgdGhlIHN0cm9uZ2x5IHR5cGVkCi0gICAgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGJlbG93LgotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+Ci0gICAgc3RydWN0IFN0cm9uZ1JlZmVyZW5jZUNhc3QgOiBwdWJsaWMgUmVmZXJlbmNlQ29udmVydGVyQmFzZSB7Ci0gICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldFJlZmVyZW5jZVR5cGVTaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZW9mKCBzcDxUWVBFPiApOyB9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCogZ2V0UmVmZXJlbmNlQmFzZSh2b2lkIGNvbnN0KiBwKSBjb25zdCB7Ci0gICAgICAgICAgICBzcDxUWVBFPiBjb25zdCogc3B0cihyZWludGVycHJldF9jYXN0PHNwPFRZUEU+IGNvbnN0Kj4ocCkpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIFRZUEU6OmJhc2V0eXBlICo+KHNwdHItPmdldCgpKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KLSAgICBzdHJ1Y3QgV2Vha1JlZmVyZW5jZUNhc3QgOiBwdWJsaWMgUmVmZXJlbmNlQ29udmVydGVyQmFzZSB7Ci0gICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldFJlZmVyZW5jZVR5cGVTaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZW9mKCB3cDxUWVBFPiApOyB9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCogZ2V0UmVmZXJlbmNlQmFzZSh2b2lkIGNvbnN0KiBwKSBjb25zdCB7Ci0gICAgICAgICAgICB3cDxUWVBFPiBjb25zdCogc3B0cihyZWludGVycHJldF9jYXN0PHdwPFRZUEU+IGNvbnN0Kj4ocCkpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIFRZUEU6OmJhc2V0eXBlICo+KHNwdHItPnVuc2FmZV9nZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi1wdWJsaWM6Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gc3RhdGljIGlubGluZQotICAgIHZvaWQgbW92ZV9yZWZlcmVuY2VzKHNwPFRZUEU+KiBkLCBzcDxUWVBFPiBjb25zdCogcywgc2l6ZV90IG4pIHsKLSAgICAgICAgbWVtbW92ZShkLCBzLCBuKnNpemVvZihzcDxUWVBFPikpOwotICAgICAgICBTdHJvbmdSZWZlcmVuY2VDYXN0PFRZUEU+IGNhc3RlcjsKLSAgICAgICAgVFlQRTo6bW92ZVJlZmVyZW5jZXMoZCwgcywgbiwgY2FzdGVyKTsKLSAgICB9Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gc3RhdGljIGlubGluZQotICAgIHZvaWQgbW92ZV9yZWZlcmVuY2VzKHdwPFRZUEU+KiBkLCB3cDxUWVBFPiBjb25zdCogcywgc2l6ZV90IG4pIHsKLSAgICAgICAgbWVtbW92ZShkLCBzLCBuKnNpemVvZih3cDxUWVBFPikpOwotICAgICAgICBXZWFrUmVmZXJlbmNlQ2FzdDxUWVBFPiBjYXN0ZXI7Ci0gICAgICAgIFRZUEU6Om1vdmVSZWZlcmVuY2VzKGQsIHMsIG4sIGNhc3Rlcik7Ci0gICAgfQotfTsKLQotLy8gc3BlY2lhbGl6YXRpb24gZm9yIG1vdmluZyBzcDw+IGFuZCB3cDw+IHR5cGVzLgotLy8gdGhlc2UgYXJlIHVzZWQgYnkgdGhlIFtTb3J0ZWR8S2V5ZWRdVmVjdG9yPD4gaW1wbGVtZW50YXRpb25zCi0vLyBzcDw+IGFuZCB3cDw+IG5lZWQgdG8gYmUgaGFuZGxlZCBzcGVjaWFsbHksIGJlY2F1c2UgdGhleSBkbyBub3QKLS8vIGhhdmUgdHJpdmlhbCBjb3B5IG9wZXJhdGlvbiBpbiB0aGUgZ2VuZXJhbCBjYXNlIChzZWUgUmVmQmFzZS5jcHAKLS8vIHdoZW4gREVCVUcgb3BzIGFyZSBlbmFibGVkKSwgYnV0IGNhbiBiZSBpbXBsZW1lbnRlZCB2ZXJ5Ci0vLyBlZmZpY2llbnRseSBpbiBtb3N0IGNhc2VzLgotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKLXZvaWQgbW92ZV9mb3J3YXJkX3R5cGUoc3A8VFlQRT4qIGQsIHNwPFRZUEU+IGNvbnN0KiBzLCBzaXplX3QgbikgewotICAgIFJlZmVyZW5jZU1vdmVyOjptb3ZlX3JlZmVyZW5jZXMoZCwgcywgbik7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IGlubGluZQotdm9pZCBtb3ZlX2JhY2t3YXJkX3R5cGUoc3A8VFlQRT4qIGQsIHNwPFRZUEU+IGNvbnN0KiBzLCBzaXplX3QgbikgewotICAgIFJlZmVyZW5jZU1vdmVyOjptb3ZlX3JlZmVyZW5jZXMoZCwgcywgbik7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IGlubGluZQotdm9pZCBtb3ZlX2ZvcndhcmRfdHlwZSh3cDxUWVBFPiogZCwgd3A8VFlQRT4gY29uc3QqIHMsIHNpemVfdCBuKSB7Ci0gICAgUmVmZXJlbmNlTW92ZXI6Om1vdmVfcmVmZXJlbmNlcyhkLCBzLCBuKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCi12b2lkIG1vdmVfYmFja3dhcmRfdHlwZSh3cDxUWVBFPiogZCwgd3A8VFlQRT4gY29uc3QqIHMsIHNpemVfdCBuKSB7Ci0gICAgUmVmZXJlbmNlTW92ZXI6Om1vdmVfcmVmZXJlbmNlcyhkLCBzLCBuKTsKLX0KLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfUkVGX0JBU0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9TaGFyZWRCdWZmZXIuaCBiL2luY2x1ZGUvdXRpbHMvU2hhcmVkQnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NTA4YjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9TaGFyZWRCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NIQVJFRF9CVUZGRVJfSAotI2RlZmluZSBBTkRST0lEX1NIQVJFRF9CVUZGRVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFNoYXJlZEJ1ZmZlcgotewotcHVibGljOgotCi0gICAgLyogZmxhZ3MgdG8gdXNlIHdpdGggcmVsZWFzZSgpICovCi0gICAgZW51bSB7Ci0gICAgICAgIGVLZWVwU3RvcmFnZSA9IDB4MDAwMDAwMDEKLSAgICB9OwotCi0gICAgLyohIGFsbG9jYXRlIGEgYnVmZmVyIG9mIHNpemUgJ3NpemUnIGFuZCBhY3F1aXJlKCkgaXQuCi0gICAgICogIGNhbGwgcmVsZWFzZSgpIHRvIGZyZWUgaXQuCi0gICAgICovCi0gICAgc3RhdGljICAgICAgICAgIFNoYXJlZEJ1ZmZlciogICAgICAgICAgIGFsbG9jKHNpemVfdCBzaXplKTsKLSAgICAKLSAgICAvKiEgZnJlZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgU2hhcmVkQnVmZmVyLgotICAgICAqIEZhaWxzIGlmIHRoZXJlIGFyZSBhbnkgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2hhcmVkQnVmZmVyLgotICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGUgYnVmZmVyIG11c3QgaGF2ZSBiZWVuIHJlbGVhc2UgYnkgYWxsIGl0cwotICAgICAqIHVzZXJzLgotICAgICAqLwotICAgIHN0YXRpYyAgICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICBkZWFsbG9jKGNvbnN0IFNoYXJlZEJ1ZmZlciogcmVsZWFzZWQpOwotICAgIAotICAgIC8vISBnZXQgdGhlIFNoYXJlZEJ1ZmZlciBmcm9tIHRoZSBkYXRhIHBvaW50ZXIKLSAgICBzdGF0aWMgIGlubGluZSAgY29uc3QgU2hhcmVkQnVmZmVyKiAgICAgc2hhcmVkQnVmZmVyKGNvbnN0IHZvaWQqIGRhdGEpOwotCi0gICAgLy8hIGFjY2VzcyB0aGUgZGF0YSBmb3IgcmVhZAotICAgIGlubGluZSAgICAgICAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICBkYXRhKCkgY29uc3Q7Ci0gICAgCi0gICAgLy8hIGFjY2VzcyB0aGUgZGF0YSBmb3IgcmVhZC93cml0ZQotICAgIGlubGluZSAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBkYXRhKCk7Ci0KLSAgICAvLyEgZ2V0IHNpemUgb2YgdGhlIGJ1ZmZlcgotICAgIGlubGluZSAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBzaXplKCkgY29uc3Q7Ci0gCi0gICAgLy8hIGdldCBiYWNrIGEgU2hhcmVkQnVmZmVyIG9iamVjdCBmcm9tIGl0cyBkYXRhCi0gICAgc3RhdGljICBpbmxpbmUgIFNoYXJlZEJ1ZmZlciogICAgICAgICAgIGJ1ZmZlckZyb21EYXRhKHZvaWQqIGRhdGEpOwotICAgIAotICAgIC8vISBnZXQgYmFjayBhIFNoYXJlZEJ1ZmZlciBvYmplY3QgZnJvbSBpdHMgZGF0YQotICAgIHN0YXRpYyAgaW5saW5lICBjb25zdCBTaGFyZWRCdWZmZXIqICAgICBidWZmZXJGcm9tRGF0YShjb25zdCB2b2lkKiBkYXRhKTsKLQotICAgIC8vISBnZXQgdGhlIHNpemUgb2YgYSBTaGFyZWRCdWZmZXIgb2JqZWN0IGZyb20gaXRzIGRhdGEKLSAgICBzdGF0aWMgIGlubGluZSAgc2l6ZV90ICAgICAgICAgICAgICAgICAgc2l6ZUZyb21EYXRhKGNvbnN0IHZvaWQqIGRhdGEpOwotICAgIAotICAgIC8vISBlZGl0IHRoZSBidWZmZXIgKGdldCBhIHdyaXR0YWJsZSwgb3Igbm9uLWNvbnN0LCB2ZXJzaW9uIG9mIGl0KQotICAgICAgICAgICAgICAgICAgICBTaGFyZWRCdWZmZXIqICAgICAgICAgICBlZGl0KCkgY29uc3Q7Ci0KLSAgICAvLyEgZWRpdCB0aGUgYnVmZmVyLCByZXNpemluZyBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgU2hhcmVkQnVmZmVyKiAgICAgICAgICAgZWRpdFJlc2l6ZShzaXplX3Qgc2l6ZSkgY29uc3Q7Ci0KLSAgICAvLyEgbGlrZSBlZGl0KCkgYnV0IGZhaWxzIGlmIGEgY29weSBpcyByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICBTaGFyZWRCdWZmZXIqICAgICAgICAgICBhdHRlbXB0RWRpdCgpIGNvbnN0OwotICAgIAotICAgIC8vISByZXNpemUgYW5kIGVkaXQgdGhlIGJ1ZmZlciwgbG9vc2UgaXQncyBjb250ZW50LgotICAgICAgICAgICAgICAgICAgICBTaGFyZWRCdWZmZXIqICAgICAgICAgICByZXNldChzaXplX3Qgc2l6ZSkgY29uc3Q7Ci0KLSAgICAvLyEgYWNxdWlyZS9yZWxlYXNlIGEgcmVmZXJlbmNlIG9uIHRoaXMgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGFjcXVpcmUoKSBjb25zdDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgLyohIHJlbGVhc2UgYSByZWZlcmVuY2Ugb24gdGhpcyBidWZmZXIsIHdpdGggdGhlIG9wdGlvbiBvZiBub3QKLSAgICAgKiBmcmVlaW5nIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGl0IGlmIGl0IHdhcyB0aGUgbGFzdCByZWZlcmVuY2UKLSAgICAgKiByZXR1cm5zIHRoZSBwcmV2aW91cyByZWZlcmVuY2UgY291bnQKLSAgICAgKi8gICAgIAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICByZWxlYXNlKHVpbnQzMl90IGZsYWdzID0gMCkgY29uc3Q7Ci0gICAgCi0gICAgLy8hIHJldHVybnMgd2V0aGVyIG9yIG5vdCB3ZSdyZSB0aGUgb25seSBvd25lcgotICAgIGlubGluZSAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBvbmx5T3duZXIoKSBjb25zdDsKLSAgICAKLQotcHJpdmF0ZToKLSAgICAgICAgaW5saW5lIFNoYXJlZEJ1ZmZlcigpIHsgfQotICAgICAgICBpbmxpbmUgflNoYXJlZEJ1ZmZlcigpIHsgfQotICAgICAgICBpbmxpbmUgU2hhcmVkQnVmZmVyKGNvbnN0IFNoYXJlZEJ1ZmZlciYpOwotIAotICAgICAgICAvLyAxNiBieXRlcy4gbXVzdCBiZSBzaXplZCB0byBwcmVzZXJ2ZSBjb3JyZWN0IGFsaW5nbWVudC4KLSAgICAgICAgbXV0YWJsZSBpbnQzMl90ICAgICAgICBtUmVmczsKLSAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBtU2l6ZTsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBtUmVzZXJ2ZWRbMl07Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgU2hhcmVkQnVmZmVyKiBTaGFyZWRCdWZmZXI6OnNoYXJlZEJ1ZmZlcihjb25zdCB2b2lkKiBkYXRhKSB7Ci0gICAgcmV0dXJuIGRhdGEgPyByZWludGVycHJldF9jYXN0PGNvbnN0IFNoYXJlZEJ1ZmZlciAqPihkYXRhKS0xIDogMDsKLX0KLQotY29uc3Qgdm9pZCogU2hhcmVkQnVmZmVyOjpkYXRhKCkgY29uc3QgewotICAgIHJldHVybiB0aGlzICsgMTsKLX0KLQotdm9pZCogU2hhcmVkQnVmZmVyOjpkYXRhKCkgewotICAgIHJldHVybiB0aGlzICsgMTsKLX0KLQotc2l6ZV90IFNoYXJlZEJ1ZmZlcjo6c2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNpemU7Ci19Ci0KLVNoYXJlZEJ1ZmZlciogU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YSh2b2lkKiBkYXRhKQotewotICAgIHJldHVybiAoKFNoYXJlZEJ1ZmZlciopZGF0YSktMTsKLX0KLSAgICAKLWNvbnN0IFNoYXJlZEJ1ZmZlciogU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShjb25zdCB2b2lkKiBkYXRhKQotewotICAgIHJldHVybiAoKGNvbnN0IFNoYXJlZEJ1ZmZlciopZGF0YSktMTsKLX0KLQotc2l6ZV90IFNoYXJlZEJ1ZmZlcjo6c2l6ZUZyb21EYXRhKGNvbnN0IHZvaWQqIGRhdGEpCi17Ci0gICAgcmV0dXJuICgoKGNvbnN0IFNoYXJlZEJ1ZmZlciopZGF0YSktMSktPm1TaXplOwotfQotCi1ib29sIFNoYXJlZEJ1ZmZlcjo6b25seU93bmVyKCkgY29uc3QgewotICAgIHJldHVybiAobVJlZnMgPT0gMSk7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9WRUNUT1JfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9TaW5nbGV0b24uaCBiL2luY2x1ZGUvdXRpbHMvU2luZ2xldG9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmNlMjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9TaW5nbGV0b24uaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVVRJTFNfU0lOR0xFVE9OX0gKLSNkZWZpbmUgQU5EUk9JRF9VVElMU19TSU5HTEVUT05fSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+Ci1jbGFzcyBBTkRST0lEX0FQSSBTaW5nbGV0b24KLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgVFlQRSYgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChzTG9jayk7Ci0gICAgICAgIFRZUEUqIGluc3RhbmNlID0gc0luc3RhbmNlOwotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gMCkgewotICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgVFlQRSgpOwotICAgICAgICAgICAgc0luc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICppbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbCBoYXNJbnN0YW5jZSgpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNMb2NrKTsKLSAgICAgICAgcmV0dXJuIHNJbnN0YW5jZSAhPSAwOwotICAgIH0KLSAgICAKLXByb3RlY3RlZDoKLSAgICB+U2luZ2xldG9uKCkgeyB9OwotICAgIFNpbmdsZXRvbigpIHsgfTsKLQotcHJpdmF0ZToKLSAgICBTaW5nbGV0b24oY29uc3QgU2luZ2xldG9uJik7Ci0gICAgU2luZ2xldG9uJiBvcGVyYXRvciA9IChjb25zdCBTaW5nbGV0b24mKTsKLSAgICBzdGF0aWMgTXV0ZXggc0xvY2s7Ci0gICAgc3RhdGljIFRZUEUqIHNJbnN0YW5jZTsKLX07Ci0KLS8qCi0gKiB1c2UgQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKFRZUEUpIGluIHlvdXIgaW1wbGVtZW50YXRpb24gZmlsZQotICogKGVnOiA8VFlQRT4uY3BwKSB0byBjcmVhdGUgdGhlIHN0YXRpYyBpbnN0YW5jZSBvZiBTaW5nbGV0b248PidzIGF0dHJpYnV0ZXMsCi0gKiBhbmQgYXZvaWQgdG8gaGF2ZSBhIGNvcHkgb2YgdGhlbSBpbiBlYWNoIGNvbXBpbGF0aW9uIHVuaXRzIFNpbmdsZXRvbjxUWVBFPgotICogaXMgdXNlZC4KLSAqIE5PVEU6IHdlIHVzZSBhIHZlcnNpb24gb2YgTXV0ZXggY3RvciB0aGF0IHRha2VzIGEgcGFyYW1ldGVyLCBiZWNhdXNlCi0gKiBmb3Igc29tZSB1bmtub3duIHJlYXNvbiB1c2luZyB0aGUgZGVmYXVsdCBjdG9yIGRvZXNuJ3QgZW1pdCB0aGUgdmFyaWFibGUhCi0gKi8KLQotI2RlZmluZSBBTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoVFlQRSkgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW1wbGF0ZSBjbGFzcyBTaW5nbGV0b248IFRZUEUgPjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGVtcGxhdGU8PiBNdXRleCBTaW5nbGV0b248IFRZUEUgPjo6c0xvY2soTXV0ZXg6OlBSSVZBVEUpOyAgXAotICAgIHRlbXBsYXRlPD4gVFlQRSogU2luZ2xldG9uPCBUWVBFID46OnNJbnN0YW5jZSgwKTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1VUSUxTX1NJTkdMRVRPTl9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvU29ydGVkVmVjdG9yLmggYi9pbmNsdWRlL3V0aWxzL1NvcnRlZFZlY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTk4YWViLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvU29ydGVkVmVjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TT1JURURfVkVDVE9SX0gKLSNkZWZpbmUgQU5EUk9JRF9TT1JURURfVkVDVE9SX0gKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9ySW1wbC5oPgotI2luY2x1ZGUgPHV0aWxzL1R5cGVIZWxwZXJzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXRlbXBsYXRlIDxjbGFzcyBUWVBFPgotY2xhc3MgU29ydGVkVmVjdG9yIDogcHJpdmF0ZSBTb3J0ZWRWZWN0b3JJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIFZlY3RvcjxUWVBFPjsKLQotcHVibGljOgotICAgICAgICAgICAgdHlwZWRlZiBUWVBFICAgIHZhbHVlX3R5cGU7Ci0gICAgCi0gICAgLyohIAotICAgICAqIENvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMKLSAgICAgKi8KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3IoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiByaHMpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5Tb3J0ZWRWZWN0b3IoKTsKLQotICAgIC8qISBjb3B5IG9wZXJhdG9yICovCi0gICAgY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiAgIG9wZXJhdG9yID0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKSBjb25zdDsgICAgCi0gICAgU29ydGVkVmVjdG9yPFRZUEU+JiAgICAgICAgIG9wZXJhdG9yID0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKTsgICAgCi0KLSAgICAvKgotICAgICAqIGVtcHR5IHRoZSB2ZWN0b3IKLSAgICAgKi8KLQotICAgIGlubGluZSAgdm9pZCAgICAgICAgICAgIGNsZWFyKCkgICAgICAgICAgICAgeyBWZWN0b3JJbXBsOjpjbGVhcigpOyB9Ci0KLSAgICAvKiEgCi0gICAgICogdmVjdG9yIHN0YXRzCi0gICAgICovCi0KLSAgICAvLyEgcmV0dXJucyBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHZlY3RvcgotICAgIGlubGluZSAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCAgICAgICAgICAgICAgICB7IHJldHVybiBWZWN0b3JJbXBsOjpzaXplKCk7IH0KLSAgICAvLyEgcmV0dXJucyB3ZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3IgaXMgZW1wdHkKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICBpc0VtcHR5KCkgY29uc3QgICAgICAgICAgICAgeyByZXR1cm4gVmVjdG9ySW1wbDo6aXNFbXB0eSgpOyB9Ci0gICAgLy8hIHJldHVybnMgaG93IG1hbnkgaXRlbXMgY2FuIGJlIHN0b3JlZCB3aXRob3V0IHJlYWxsb2NhdGluZyB0aGUgYmFja2luZyBzdG9yZQotICAgIGlubGluZSAgc2l6ZV90ICAgICAgICAgIGNhcGFjaXR5KCkgY29uc3QgICAgICAgICAgICB7IHJldHVybiBWZWN0b3JJbXBsOjpjYXBhY2l0eSgpOyB9Ci0gICAgLy8hIHNldHN0IHRoZSBjYXBhY2l0eS4gY2FwYWNpdHkgY2FuIG5ldmVyIGJlIHJlZHVjZWQgbGVzcyB0aGFuIHNpemUoKQotICAgIGlubGluZSAgc3NpemVfdCAgICAgICAgIHNldENhcGFjaXR5KHNpemVfdCBzaXplKSAgICB7IHJldHVybiBWZWN0b3JJbXBsOjpzZXRDYXBhY2l0eShzaXplKTsgfQotCi0gICAgLyohIAotICAgICAqIEMtc3R5bGUgYXJyYXkgYWNjZXNzCi0gICAgICovCi0gICAgIAotICAgIC8vISByZWFkLW9ubHkgQy1zdHlsZSBhY2Nlc3MgCi0gICAgaW5saW5lICBjb25zdCBUWVBFKiAgICAgYXJyYXkoKSBjb25zdDsKLQotICAgIC8vISByZWFkLXdyaXRlIEMtc3R5bGUgYWNjZXNzLiBCRSBWRVJZIENBUkVGVUwgd2hlbiBtb2RpZnlpbmcgdGhlIGFycmF5Ci0gICAgLy8hIHlvdSB1c3Qga2VlcCBpdCBzb3J0ZWQhIFlvdSB1c3VhbGx5IGRvbid0IHVzZSB0aGlzIGZ1bmN0aW9uLgotICAgICAgICAgICAgVFlQRSogICAgICAgICAgIGVkaXRBcnJheSgpOwotCi0gICAgICAgICAgICAvLyEgZmluZHMgdGhlIGluZGV4IG9mIGFuIGl0ZW0KLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbmRleE9mKGNvbnN0IFRZUEUmIGl0ZW0pIGNvbnN0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyEgZmluZHMgd2hlcmUgdGhpcyBpdGVtIHNob3VsZCBiZSBpbnNlcnRlZAotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG9yZGVyT2YoY29uc3QgVFlQRSYgaXRlbSkgY29uc3Q7Ci0gICAgICAgICAgICAKLSAgICAKLSAgICAvKiEgCi0gICAgICogYWNjZXNzb3JzCi0gICAgICovCi0KLSAgICAvLyEgcmVhZC1vbmx5IGFjY2VzcyB0byBhbiBpdGVtIGF0IGEgZ2l2ZW4gaW5kZXgKLSAgICBpbmxpbmUgIGNvbnN0IFRZUEUmICAgICBvcGVyYXRvciBbXSAoc2l6ZV90IGluZGV4KSBjb25zdDsKLSAgICAvLyEgYWx0ZXJuYXRlIG5hbWUgZm9yIG9wZXJhdG9yIFtdCi0gICAgaW5saW5lICBjb25zdCBUWVBFJiAgICAgaXRlbUF0KHNpemVfdCBpbmRleCkgY29uc3Q7Ci0gICAgLy8hIHN0YWNrLXVzYWdlIG9mIHRoZSB2ZWN0b3IuIHJldHVybnMgdGhlIHRvcCBvZiB0aGUgc3RhY2sgKGxhc3QgZWxlbWVudCkKLSAgICAgICAgICAgIGNvbnN0IFRZUEUmICAgICB0b3AoKSBjb25zdDsKLSAgICAvLyEgc2FtZSBhcyBvcGVyYXRvciBbXSwgYnV0IGFsbG93cyB0byBhY2Nlc3MgdGhlIHZlY3RvciBiYWNrd2FyZCAoZnJvbSB0aGUgZW5kKSB3aXRoIGEgbmVnYXRpdmUgaW5kZXgKLSAgICAgICAgICAgIGNvbnN0IFRZUEUmICAgICBtaXJyb3JJdGVtQXQoc3NpemVfdCBpbmRleCkgY29uc3Q7Ci0KLSAgICAvKiEKLSAgICAgKiBtb2RpZmluZyB0aGUgYXJyYXkKLSAgICAgKi8KLQotICAgICAgICAgICAgLy8hIGFkZCBhbiBpdGVtIGluIHRoZSByaWdodCBwbGFjZSAoYW5kIHJlcGxhY2UgdGhlIG9uZSB0aGF0IGlzIHRoZXJlKQotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBUWVBFJiBpdGVtKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8hIGVkaXRJdGVtQXQoKSBNVVNUIE5PVCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoaXMgaXRlbQotICAgICAgICAgICAgVFlQRSYgICAgICAgICAgIGVkaXRJdGVtQXQoc2l6ZV90IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICooIHN0YXRpY19jYXN0PFRZUEUgKj4oVmVjdG9ySW1wbDo6ZWRpdEl0ZW1Mb2NhdGlvbihpbmRleCkpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vISBtZXJnZXMgYSB2ZWN0b3IgaW50byB0aGlzIG9uZQotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIG1lcmdlKGNvbnN0IFZlY3RvcjxUWVBFPiYgdmVjdG9yKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBtZXJnZShjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHZlY3Rvcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vISByZW1vdmVzIGFuIGl0ZW0KLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmUoY29uc3QgVFlQRSYpOwotCi0gICAgLy8hIHJlbW92ZSBzZXZlcmFsIGl0ZW1zCi0gICAgaW5saW5lICBzc2l6ZV90ICAgICAgICAgcmVtb3ZlSXRlbXNBdChzaXplX3QgaW5kZXgsIHNpemVfdCBjb3VudCA9IDEpOwotICAgIC8vISByZW1vdmUgb25lIGl0ZW0KLSAgICBpbmxpbmUgIHNzaXplX3QgICAgICAgICByZW1vdmVBdChzaXplX3QgaW5kZXgpICB7IHJldHVybiByZW1vdmVJdGVtc0F0KGluZGV4KTsgfQotICAgICAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkICAgIGRvX2NvbnN0cnVjdCh2b2lkKiBzdG9yYWdlLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgZG9fZGVzdHJveSh2b2lkKiBzdG9yYWdlLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgZG9fY29weSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgZG9fc3BsYXQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90IG51bSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkICAgIGRvX21vdmVfZm9yd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgZG9fbW92ZV9iYWNrd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCAgICAgZG9fY29tcGFyZShjb25zdCB2b2lkKiBsaHMsIGNvbnN0IHZvaWQqIHJocykgY29uc3Q7Ci19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm8gdXNlciBzZXJ2aWNlYWJsZSBwYXJ0cyBmcm9tIGhlcmUuLi4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLVNvcnRlZFZlY3RvcjxUWVBFPjo6U29ydGVkVmVjdG9yKCkKLSAgICA6IFNvcnRlZFZlY3RvckltcGwoc2l6ZW9mKFRZUEUpLAotICAgICAgICAgICAgICAgICgodHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9jdG9yICAgPyBIQVNfVFJJVklBTF9DVE9SICAgOiAwKQotICAgICAgICAgICAgICAgIHwodHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9kdG9yICAgPyBIQVNfVFJJVklBTF9EVE9SICAgOiAwKQotICAgICAgICAgICAgICAgIHwodHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9jb3B5ICAgPyBIQVNfVFJJVklBTF9DT1BZICAgOiAwKSkKLSAgICAgICAgICAgICAgICApCi17Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotU29ydGVkVmVjdG9yPFRZUEU+OjpTb3J0ZWRWZWN0b3IoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiByaHMpCi0gICAgOiBTb3J0ZWRWZWN0b3JJbXBsKHJocykgewotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLVNvcnRlZFZlY3RvcjxUWVBFPjo6flNvcnRlZFZlY3RvcigpIHsKLSAgICBmaW5pc2hfdmVjdG9yKCk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotU29ydGVkVmVjdG9yPFRZUEU+JiBTb3J0ZWRWZWN0b3I8VFlQRT46Om9wZXJhdG9yID0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKSB7Ci0gICAgU29ydGVkVmVjdG9ySW1wbDo6b3BlcmF0b3IgPSAocmhzKTsKLSAgICByZXR1cm4gKnRoaXM7IAotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLWNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgU29ydGVkVmVjdG9yPFRZUEU+OjpvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocykgY29uc3QgewotICAgIFNvcnRlZFZlY3RvckltcGw6Om9wZXJhdG9yID0gKHJocyk7Ci0gICAgcmV0dXJuICp0aGlzOyAKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1jb25zdCBUWVBFKiBTb3J0ZWRWZWN0b3I8VFlQRT46OmFycmF5KCkgY29uc3QgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBUWVBFICo+KGFycmF5SW1wbCgpKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1UWVBFKiBTb3J0ZWRWZWN0b3I8VFlQRT46OmVkaXRBcnJheSgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VFlQRSAqPihlZGl0QXJyYXlJbXBsKCkpOwotfQotCi0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVFlQRSYgU29ydGVkVmVjdG9yPFRZUEU+OjpvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIGFzc2VydCggaW5kZXg8c2l6ZSgpICk7Ci0gICAgcmV0dXJuICooYXJyYXkoKSArIGluZGV4KTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1jb25zdCBUWVBFJiBTb3J0ZWRWZWN0b3I8VFlQRT46Oml0ZW1BdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0b3JbXShpbmRleCk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVFlQRSYgU29ydGVkVmVjdG9yPFRZUEU+OjptaXJyb3JJdGVtQXQoc3NpemVfdCBpbmRleCkgY29uc3QgewotICAgIGFzc2VydCggKGluZGV4PjAgPyBpbmRleCA6IC1pbmRleCk8c2l6ZSgpICk7Ci0gICAgcmV0dXJuICooYXJyYXkoKSArICgoaW5kZXg8MCkgPyAoc2l6ZSgpLWluZGV4KSA6IGluZGV4KSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVFlQRSYgU29ydGVkVmVjdG9yPFRZUEU+Ojp0b3AoKSBjb25zdCB7Ci0gICAgcmV0dXJuICooYXJyYXkoKSArIHNpemUoKSAtIDEpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgU29ydGVkVmVjdG9yPFRZUEU+OjphZGQoY29uc3QgVFlQRSYgaXRlbSkgewotICAgIHJldHVybiBTb3J0ZWRWZWN0b3JJbXBsOjphZGQoJml0ZW0pOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgU29ydGVkVmVjdG9yPFRZUEU+OjppbmRleE9mKGNvbnN0IFRZUEUmIGl0ZW0pIGNvbnN0IHsKLSAgICByZXR1cm4gU29ydGVkVmVjdG9ySW1wbDo6aW5kZXhPZigmaXRlbSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotc2l6ZV90IFNvcnRlZFZlY3RvcjxUWVBFPjo6b3JkZXJPZihjb25zdCBUWVBFJiBpdGVtKSBjb25zdCB7Ci0gICAgcmV0dXJuIFNvcnRlZFZlY3RvckltcGw6Om9yZGVyT2YoJml0ZW0pOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgU29ydGVkVmVjdG9yPFRZUEU+OjptZXJnZShjb25zdCBWZWN0b3I8VFlQRT4mIHZlY3RvcikgewotICAgIHJldHVybiBTb3J0ZWRWZWN0b3JJbXBsOjptZXJnZShyZWludGVycHJldF9jYXN0PGNvbnN0IFZlY3RvckltcGwmPih2ZWN0b3IpKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFNvcnRlZFZlY3RvcjxUWVBFPjo6bWVyZ2UoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiB2ZWN0b3IpIHsKLSAgICByZXR1cm4gU29ydGVkVmVjdG9ySW1wbDo6bWVyZ2UocmVpbnRlcnByZXRfY2FzdDxjb25zdCBTb3J0ZWRWZWN0b3JJbXBsJj4odmVjdG9yKSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotc3NpemVfdCBTb3J0ZWRWZWN0b3I8VFlQRT46OnJlbW92ZShjb25zdCBUWVBFJiBpdGVtKSB7Ci0gICAgcmV0dXJuIFNvcnRlZFZlY3RvckltcGw6OnJlbW92ZSgmaXRlbSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotc3NpemVfdCBTb3J0ZWRWZWN0b3I8VFlQRT46OnJlbW92ZUl0ZW1zQXQoc2l6ZV90IGluZGV4LCBzaXplX3QgY291bnQpIHsKLSAgICByZXR1cm4gVmVjdG9ySW1wbDo6cmVtb3ZlSXRlbXNBdChpbmRleCwgY291bnQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4KLXZvaWQgU29ydGVkVmVjdG9yPFRZUEU+Ojpkb19jb25zdHJ1Y3Qodm9pZCogc3RvcmFnZSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIGNvbnN0cnVjdF90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihzdG9yYWdlKSwgbnVtICk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+Ci12b2lkIFNvcnRlZFZlY3RvcjxUWVBFPjo6ZG9fZGVzdHJveSh2b2lkKiBzdG9yYWdlLCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgZGVzdHJveV90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihzdG9yYWdlKSwgbnVtICk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+Ci12b2lkIFNvcnRlZFZlY3RvcjxUWVBFPjo6ZG9fY29weSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgY29weV90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihkZXN0KSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4oZnJvbSksIG51bSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPgotdm9pZCBTb3J0ZWRWZWN0b3I8VFlQRT46OmRvX3NwbGF0KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGl0ZW0sIHNpemVfdCBudW0pIGNvbnN0IHsKLSAgICBzcGxhdF90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihkZXN0KSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4oaXRlbSksIG51bSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPgotdm9pZCBTb3J0ZWRWZWN0b3I8VFlQRT46OmRvX21vdmVfZm9yd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgbW92ZV9mb3J3YXJkX3R5cGUoIHJlaW50ZXJwcmV0X2Nhc3Q8VFlQRSo+KGRlc3QpLCByZWludGVycHJldF9jYXN0PGNvbnN0IFRZUEUqPihmcm9tKSwgbnVtICk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+Ci12b2lkIFNvcnRlZFZlY3RvcjxUWVBFPjo6ZG9fbW92ZV9iYWNrd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgbW92ZV9iYWNrd2FyZF90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihkZXN0KSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4oZnJvbSksIG51bSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPgotaW50IFNvcnRlZFZlY3RvcjxUWVBFPjo6ZG9fY29tcGFyZShjb25zdCB2b2lkKiBsaHMsIGNvbnN0IHZvaWQqIHJocykgY29uc3QgewotICAgIHJldHVybiBjb21wYXJlX3R5cGUoICpyZWludGVycHJldF9jYXN0PGNvbnN0IFRZUEUqPihsaHMpLCAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4ocmhzKSApOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9TT1JURURfVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvU3RvcFdhdGNoLmggYi9pbmNsdWRlL3V0aWxzL1N0b3BXYXRjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTNkZDNjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvU3RvcFdhdGNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NUT1BXQVRDSF9ICi0jZGVmaW5lIEFORFJPSURfU1RPUFdBVENIX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0b3BXYXRjaAotewotcHVibGljOgotICAgICAgICBTdG9wV2F0Y2goICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICBpbnQgY2xvY2sgPSBTWVNURU1fVElNRV9NT05PVE9OSUMsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci0gICAgICAgIH5TdG9wV2F0Y2goKTsKLSAgICAgICAgCi0gICAgICAgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKLSAgICAgICAgbnNlY3NfdCAgICAgbGFwKCk7Ci0gICAgICAgIG5zZWNzX3QgICAgIGVsYXBzZWRUaW1lKCkgY29uc3Q7Ci0KLSAgICAgICAgdm9pZCAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgCi1wcml2YXRlOgotICAgIGNvbnN0IGNoYXIqICAgICBtTmFtZTsKLSAgICBpbnQgICAgICAgICAgICAgbUNsb2NrOwotICAgIHVpbnQzMl90ICAgICAgICBtRmxhZ3M7Ci0gICAgCi0gICAgc3RydWN0IGxhcF90IHsKLSAgICAgICAgbnNlY3NfdCAgICAgc29GYXI7Ci0gICAgICAgIG5zZWNzX3QgICAgIHRoaXNMYXA7Ci0gICAgfTsKLSAgICAKLSAgICBuc2Vjc190ICAgICAgICAgbVN0YXJ0VGltZTsKLSAgICBsYXBfdCAgICAgICAgICAgbUxhcHNbOF07Ci0gICAgaW50ICAgICAgICAgICAgIG1OdW1MYXBzOwotfTsKLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9TVE9QV0FUQ0hfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIGIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjBmNDA3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NUUklORzE2X0gKLSNkZWZpbmUgQU5EUk9JRF9TVFJJTkcxNl9ICi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9TaGFyZWRCdWZmZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Vbmljb2RlLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1leHRlcm4gIkMiIHsKLQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU3RyaW5nODsKLWNsYXNzIFRleHRPdXRwdXQ7Ci0KLS8vISBUaGlzIGlzIGEgc3RyaW5nIGhvbGRpbmcgVVRGLTE2IGNoYXJhY3RlcnMuCi1jbGFzcyBTdHJpbmcxNgotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNihjb25zdCBTdHJpbmcxNiYgbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KGNvbnN0IFN0cmluZzE2JiBvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYmVnaW49MCk7Ci0gICAgZXhwbGljaXQgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KGNvbnN0IGNoYXIxNl90KiBvKTsKLSAgICBleHBsaWNpdCAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoY29uc3QgY2hhcjE2X3QqIG8sIHNpemVfdCBsZW4pOwotICAgIGV4cGxpY2l0ICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNihjb25zdCBTdHJpbmc4JiBvKTsKLSAgICBleHBsaWNpdCAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoY29uc3QgY2hhciogbyk7Ci0gICAgZXhwbGljaXQgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KGNvbnN0IGNoYXIqIG8sIHNpemVfdCBsZW4pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5TdHJpbmcxNigpOwotICAgIAotICAgIGlubGluZSAgY29uc3QgY2hhcjE2X3QqICAgICBzdHJpbmcoKSBjb25zdDsKLSAgICBpbmxpbmUgIHNpemVfdCAgICAgICAgICAgICAgc2l6ZSgpIGNvbnN0OwotICAgIAotICAgIGlubGluZSAgY29uc3QgU2hhcmVkQnVmZmVyKiBzaGFyZWRCdWZmZXIoKSBjb25zdDsKLSAgICAKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0VG8oY29uc3QgU3RyaW5nMTYmIG90aGVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgc2V0VG8oY29uc3QgY2hhcjE2X3QqIG90aGVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgc2V0VG8oY29uc3QgY2hhcjE2X3QqIG90aGVyLCBzaXplX3QgbGVuKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgc2V0VG8oY29uc3QgU3RyaW5nMTYmIG90aGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYmVnaW49MCk7Ci0gICAgCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIGFwcGVuZChjb25zdCBTdHJpbmcxNiYgb3RoZXIpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBhcHBlbmQoY29uc3QgY2hhcjE2X3QqIG90aGVyLCBzaXplX3QgbGVuKTsKLSAgICAgICAgICAgIAotICAgIGlubGluZSAgU3RyaW5nMTYmICAgICAgICAgICBvcGVyYXRvcj0oY29uc3QgU3RyaW5nMTYmIG90aGVyKTsKLSAgICAKLSAgICBpbmxpbmUgIFN0cmluZzE2JiAgICAgICAgICAgb3BlcmF0b3IrPShjb25zdCBTdHJpbmcxNiYgb3RoZXIpOwotICAgIGlubGluZSAgU3RyaW5nMTYgICAgICAgICAgICBvcGVyYXRvcisoY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdDsKLQotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBpbnNlcnQoc2l6ZV90IHBvcywgY29uc3QgY2hhcjE2X3QqIGNocnMpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBpbnNlcnQoc2l6ZV90IHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIxNl90KiBjaHJzLCBzaXplX3QgbGVuKTsKLQotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICBmaW5kRmlyc3QoY2hhcjE2X3QgYykgY29uc3Q7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgIGZpbmRMYXN0KGNoYXIxNl90IGMpIGNvbnN0OwotCi0gICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIHN0YXJ0c1dpdGgoY29uc3QgU3RyaW5nMTYmIHByZWZpeCkgY29uc3Q7Ci0gICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIHN0YXJ0c1dpdGgoY29uc3QgY2hhcjE2X3QqIHByZWZpeCkgY29uc3Q7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgbWFrZUxvd2VyKCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgcmVwbGFjZUFsbChjaGFyMTZfdCByZXBsYWNlVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyMTZfdCB3aXRoVGhpcyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgcmVtb3ZlKHNpemVfdCBsZW4sIHNpemVfdCBiZWdpbj0wKTsKLQotICAgIGlubGluZSAgaW50ICAgICAgICAgICAgICAgICBjb21wYXJlKGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3Q7Ci0KLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I8KGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPD0oY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I9PShjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPj0oY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I+KGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3Q7Ci0gICAgCi0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPChjb25zdCBjaGFyMTZfdCogb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcjw9KGNvbnN0IGNoYXIxNl90KiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgY2hhcjE2X3QqIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3IhPShjb25zdCBjaGFyMTZfdCogb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcj49KGNvbnN0IGNoYXIxNl90KiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPihjb25zdCBjaGFyMTZfdCogb3RoZXIpIGNvbnN0OwotICAgIAotICAgIGlubGluZSAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBjb25zdCBjaGFyMTZfdCooKSBjb25zdDsKLSAgICAKLXByaXZhdGU6Ci0gICAgICAgICAgICBjb25zdCBjaGFyMTZfdCogICAgIG1TdHJpbmc7Ci19OwotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCBTdHJpbmcxNiYgdmFsKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBObyB1c2VyIHNlcnZpY2FibGUgcGFydHMgYmVsb3cuCi0KLWlubGluZSBpbnQgY29tcGFyZV90eXBlKGNvbnN0IFN0cmluZzE2JiBsaHMsIGNvbnN0IFN0cmluZzE2JiByaHMpCi17Ci0gICAgcmV0dXJuIGxocy5jb21wYXJlKHJocyk7Ci19Ci0KLWlubGluZSBpbnQgc3RyaWN0bHlfb3JkZXJfdHlwZShjb25zdCBTdHJpbmcxNiYgbGhzLCBjb25zdCBTdHJpbmcxNiYgcmhzKQotewotICAgIHJldHVybiBjb21wYXJlX3R5cGUobGhzLCByaHMpIDwgMDsKLX0KLQotaW5saW5lIGNvbnN0IGNoYXIxNl90KiBTdHJpbmcxNjo6c3RyaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVN0cmluZzsKLX0KLQotaW5saW5lIHNpemVfdCBTdHJpbmcxNjo6c2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFNoYXJlZEJ1ZmZlcjo6c2l6ZUZyb21EYXRhKG1TdHJpbmcpL3NpemVvZihjaGFyMTZfdCktMTsKLX0KLQotaW5saW5lIGNvbnN0IFNoYXJlZEJ1ZmZlciogU3RyaW5nMTY6OnNoYXJlZEJ1ZmZlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZyk7Ci19Ci0KLWlubGluZSBTdHJpbmcxNiYgU3RyaW5nMTY6Om9wZXJhdG9yPShjb25zdCBTdHJpbmcxNiYgb3RoZXIpCi17Ci0gICAgc2V0VG8ob3RoZXIpOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotaW5saW5lIFN0cmluZzE2JiBTdHJpbmcxNjo6b3BlcmF0b3IrPShjb25zdCBTdHJpbmcxNiYgb3RoZXIpCi17Ci0gICAgYXBwZW5kKG90aGVyKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLWlubGluZSBTdHJpbmcxNiBTdHJpbmcxNjo6b3BlcmF0b3IrKGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3QKLXsKLSAgICBTdHJpbmcxNiB0bXAoKnRoaXMpOwotICAgIHRtcCArPSBvdGhlcjsKLSAgICByZXR1cm4gdG1wOwotfQotCi1pbmxpbmUgaW50IFN0cmluZzE2Ojpjb21wYXJlKGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyemNtcDE2KG1TdHJpbmcsIHNpemUoKSwgb3RoZXIubVN0cmluZywgb3RoZXIuc2l6ZSgpKTsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yPChjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cnpjbXAxNihtU3RyaW5nLCBzaXplKCksIG90aGVyLm1TdHJpbmcsIG90aGVyLnNpemUoKSkgPCAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmcxNjo6b3BlcmF0b3I8PShjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cnpjbXAxNihtU3RyaW5nLCBzaXplKCksIG90aGVyLm1TdHJpbmcsIG90aGVyLnNpemUoKSkgPD0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yPT0oY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJ6Y21wMTYobVN0cmluZywgc2l6ZSgpLCBvdGhlci5tU3RyaW5nLCBvdGhlci5zaXplKCkpID09IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzE2OjpvcGVyYXRvciE9KGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyemNtcDE2KG1TdHJpbmcsIHNpemUoKSwgb3RoZXIubVN0cmluZywgb3RoZXIuc2l6ZSgpKSAhPSAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmcxNjo6b3BlcmF0b3I+PShjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cnpjbXAxNihtU3RyaW5nLCBzaXplKCksIG90aGVyLm1TdHJpbmcsIG90aGVyLnNpemUoKSkgPj0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yPihjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cnpjbXAxNihtU3RyaW5nLCBzaXplKCksIG90aGVyLm1TdHJpbmcsIG90aGVyLnNpemUoKSkgPiAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmcxNjo6b3BlcmF0b3I8KGNvbnN0IGNoYXIxNl90KiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wMTYobVN0cmluZywgb3RoZXIpIDwgMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yPD0oY29uc3QgY2hhcjE2X3QqIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAxNihtU3RyaW5nLCBvdGhlcikgPD0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yPT0oY29uc3QgY2hhcjE2X3QqIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAxNihtU3RyaW5nLCBvdGhlcikgPT0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yIT0oY29uc3QgY2hhcjE2X3QqIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAxNihtU3RyaW5nLCBvdGhlcikgIT0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yPj0oY29uc3QgY2hhcjE2X3QqIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAxNihtU3RyaW5nLCBvdGhlcikgPj0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yPihjb25zdCBjaGFyMTZfdCogb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcDE2KG1TdHJpbmcsIG90aGVyKSA+IDA7Ci19Ci0KLWlubGluZSBTdHJpbmcxNjo6b3BlcmF0b3IgY29uc3QgY2hhcjE2X3QqKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVN0cmluZzsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX1NUUklORzE2X0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIGIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNjM2OTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TVFJJTkc4X0gKLSNkZWZpbmUgQU5EUk9JRF9TVFJJTkc4X0gKLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1NoYXJlZEJ1ZmZlci5oPgotI2luY2x1ZGUgPHV0aWxzL1VuaWNvZGUuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPiAvLyBmb3Igc3RyY21wCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmluZzE2OwotY2xhc3MgVGV4dE91dHB1dDsKLQotLy8hIFRoaXMgaXMgYSBzdHJpbmcgaG9sZGluZyBVVEYtOCBjaGFyYWN0ZXJzLiBEb2VzIG5vdCBhbGxvdyB0aGUgdmFsdWUgbW9yZQotLy8gdGhhbiAweDEwRkZGRiwgd2hpY2ggaXMgbm90IHZhbGlkIHVuaWNvZGUgY29kZXBvaW50LgotY2xhc3MgU3RyaW5nOAotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY29uc3QgU3RyaW5nOCYgbyk7Ci0gICAgZXhwbGljaXQgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY29uc3QgY2hhciogbyk7Ci0gICAgZXhwbGljaXQgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY29uc3QgY2hhciogbywgc2l6ZV90IG51bUNoYXJzKTsKLSAgICAKLSAgICBleHBsaWNpdCAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChjb25zdCBTdHJpbmcxNiYgbyk7Ci0gICAgZXhwbGljaXQgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY29uc3QgY2hhcjE2X3QqIG8pOwotICAgIGV4cGxpY2l0ICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNvbnN0IGNoYXIxNl90KiBvLCBzaXplX3QgbnVtQ2hhcnMpOwotICAgIGV4cGxpY2l0ICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNvbnN0IGNoYXIzMl90KiBvKTsKLSAgICBleHBsaWNpdCAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChjb25zdCBjaGFyMzJfdCogbywgc2l6ZV90IG51bUNoYXJzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgflN0cmluZzgoKTsKLQotICAgIHN0YXRpYyBpbmxpbmUgY29uc3QgU3RyaW5nOCBlbXB0eSgpOwotCi0gICAgc3RhdGljIFN0cmluZzggICAgICAgICAgICAgIGZvcm1hdChjb25zdCBjaGFyKiBmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7Ci0gICAgc3RhdGljIFN0cmluZzggICAgICAgICAgICAgIGZvcm1hdFYoY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFyZ3MpOwotCi0gICAgaW5saW5lICBjb25zdCBjaGFyKiAgICAgICAgIHN0cmluZygpIGNvbnN0OwotICAgIGlubGluZSAgc2l6ZV90ICAgICAgICAgICAgICBzaXplKCkgY29uc3Q7Ci0gICAgaW5saW5lICBzaXplX3QgICAgICAgICAgICAgIGxlbmd0aCgpIGNvbnN0OwotICAgIGlubGluZSAgc2l6ZV90ICAgICAgICAgICAgICBieXRlcygpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBpc0VtcHR5KCkgY29uc3Q7Ci0gICAgCi0gICAgaW5saW5lICBjb25zdCBTaGFyZWRCdWZmZXIqIHNoYXJlZEJ1ZmZlcigpIGNvbnN0OwotICAgIAotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBjbGVhcigpOwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNldFRvKGNvbnN0IFN0cmluZzgmIG90aGVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgc2V0VG8oY29uc3QgY2hhciogb3RoZXIpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBzZXRUbyhjb25zdCBjaGFyKiBvdGhlciwgc2l6ZV90IG51bUNoYXJzKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgc2V0VG8oY29uc3QgY2hhcjE2X3QqIG90aGVyLCBzaXplX3QgbnVtQ2hhcnMpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBzZXRUbyhjb25zdCBjaGFyMzJfdCogb3RoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIGFwcGVuZChjb25zdCBTdHJpbmc4JiBvdGhlcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIGFwcGVuZChjb25zdCBjaGFyKiBvdGhlcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIGFwcGVuZChjb25zdCBjaGFyKiBvdGhlciwgc2l6ZV90IG51bUNoYXJzKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBhcHBlbmRGb3JtYXQoY29uc3QgY2hhciogZm10LCAuLi4pCi0gICAgICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBhcHBlbmRGb3JtYXRWKGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcmdzKTsKLQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgTyhOKSB0aW1lIHRvIGNhbGN1bGF0ZSB0aGUgdmFsdWUuCi0gICAgICAgICAgICAvLyBObyBjYWNoZSB2YWx1ZSBpcyBzdG9yZWQuCi0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIGdldFV0ZjMyTGVuZ3RoKCkgY29uc3Q7Ci0gICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGdldFV0ZjMyQXQoc2l6ZV90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbmV4dF9pbmRleCkgY29uc3Q7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIGdldFV0ZjMyKGNoYXIzMl90KiBkc3QpIGNvbnN0OwotCi0gICAgaW5saW5lICBTdHJpbmc4JiAgICAgICAgICAgIG9wZXJhdG9yPShjb25zdCBTdHJpbmc4JiBvdGhlcik7Ci0gICAgaW5saW5lICBTdHJpbmc4JiAgICAgICAgICAgIG9wZXJhdG9yPShjb25zdCBjaGFyKiBvdGhlcik7Ci0gICAgCi0gICAgaW5saW5lICBTdHJpbmc4JiAgICAgICAgICAgIG9wZXJhdG9yKz0oY29uc3QgU3RyaW5nOCYgb3RoZXIpOwotICAgIGlubGluZSAgU3RyaW5nOCAgICAgICAgICAgICBvcGVyYXRvcisoY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0OwotICAgIAotICAgIGlubGluZSAgU3RyaW5nOCYgICAgICAgICAgICBvcGVyYXRvcis9KGNvbnN0IGNoYXIqIG90aGVyKTsKLSAgICBpbmxpbmUgIFN0cmluZzggICAgICAgICAgICAgb3BlcmF0b3IrKGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdDsKLQotICAgIGlubGluZSAgaW50ICAgICAgICAgICAgICAgICBjb21wYXJlKGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdDsKLQotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcjwoY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcjw9KGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I9PShjb25zdCBTdHJpbmc4JiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcj49KGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I+KGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdDsKLSAgICAKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I8KGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I8PShjb25zdCBjaGFyKiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgY2hhciogb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I+PShjb25zdCBjaGFyKiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPihjb25zdCBjaGFyKiBvdGhlcikgY29uc3Q7Ci0gICAgCi0gICAgaW5saW5lICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCkgY29uc3Q7Ci0gICAgCi0gICAgICAgICAgICBjaGFyKiAgICAgICAgICAgICAgIGxvY2tCdWZmZXIoc2l6ZV90IHNpemUpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICB1bmxvY2tCdWZmZXIoKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgdW5sb2NrQnVmZmVyKHNpemVfdCBzaXplKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBvZiBvdGhlciBpbiB0aGlzIGF0IG9yIGFmdGVyCi0gICAgICAgICAgICAvLyBzdGFydCwgb3IgLTEgaWYgbm90IGZvdW5kCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgIGZpbmQoY29uc3QgY2hhciogb3RoZXIsIHNpemVfdCBzdGFydCA9IDApIGNvbnN0OwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHRvTG93ZXIoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgdG9Mb3dlcihzaXplX3Qgc3RhcnQsIHNpemVfdCBudW1DaGFycyk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHRvVXBwZXIoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgdG9VcHBlcihzaXplX3Qgc3RhcnQsIHNpemVfdCBudW1DaGFycyk7Ci0KLSAgICAvKgotICAgICAqIFRoZXNlIG1ldGhvZHMgb3BlcmF0ZSBvbiB0aGUgc3RyaW5nIGFzIGlmIGl0IHdlcmUgYSBwYXRoIG5hbWUuCi0gICAgICovCi0KLSAgICAvKgotICAgICAqIFNldCB0aGUgZmlsZW5hbWUgZmllbGQgdG8gYSBzcGVjaWZpYyB2YWx1ZS4KLSAgICAgKgotICAgICAqIE5vcm1hbGl6ZXMgdGhlIGZpbGVuYW1lLCByZW1vdmluZyBhIHRyYWlsaW5nICcvJyBpZiBwcmVzZW50LgotICAgICAqLwotICAgIHZvaWQgc2V0UGF0aE5hbWUoY29uc3QgY2hhciogbmFtZSk7Ci0gICAgdm9pZCBzZXRQYXRoTmFtZShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgbnVtQ2hhcnMpOwotCi0gICAgLyoKLSAgICAgKiBHZXQganVzdCB0aGUgZmlsZW5hbWUgY29tcG9uZW50LgotICAgICAqCi0gICAgICogIi90bXAvZm9vL2Jhci5jIiAtLT4gImJhci5jIgotICAgICAqLwotICAgIFN0cmluZzggZ2V0UGF0aExlYWYodm9pZCkgY29uc3Q7Ci0KLSAgICAvKgotICAgICAqIFJlbW92ZSB0aGUgbGFzdCAoZmlsZSBuYW1lKSBjb21wb25lbnQsIGxlYXZpbmcganVzdCB0aGUgZGlyZWN0b3J5Ci0gICAgICogbmFtZS4KLSAgICAgKgotICAgICAqICIvdG1wL2Zvby9iYXIuYyIgLS0+ICIvdG1wL2ZvbyIKLSAgICAgKiAiL3RtcCIgLS0+ICIiIC8vID8/Pz8/IHNob3VsZG4ndCB0aGlzIGJlICIvIiA/Pz8/IFhYWAotICAgICAqICJiYXIuYyIgLS0+ICIiCi0gICAgICovCi0gICAgU3RyaW5nOCBnZXRQYXRoRGlyKHZvaWQpIGNvbnN0OwotCi0gICAgLyoKLSAgICAgKiBSZXRyaWV2ZSB0aGUgZnJvbnQgKHJvb3QgZGlyKSBjb21wb25lbnQuICBPcHRpb25hbGx5IGFsc28gcmV0dXJuIHRoZQotICAgICAqIHJlbWFpbmluZyBjb21wb25lbnRzLgotICAgICAqCi0gICAgICogIi90bXAvZm9vL2Jhci5jIiAtLT4gInRtcCIgKHJlbWFpbiA9ICJmb28vYmFyLmMiKQotICAgICAqICIvdG1wIiAtLT4gInRtcCIgKHJlbWFpbiA9ICIiKQotICAgICAqICJiYXIuYyIgLS0+ICJiYXIuYyIgKHJlbWFpbiA9ICIiKQotICAgICAqLwotICAgIFN0cmluZzggd2Fsa1BhdGgoU3RyaW5nOCogb3V0UmVtYWlucyA9IE5VTEwpIGNvbnN0OwotCi0gICAgLyoKLSAgICAgKiBSZXR1cm4gdGhlIGZpbGVuYW1lIGV4dGVuc2lvbi4gIFRoaXMgaXMgdGhlIGxhc3QgJy4nIGFuZCBhbnkgbnVtYmVyCi0gICAgICogb2YgY2hhcmFjdGVycyB0aGF0IGZvbGxvdyBpdC4gIFRoZSAnLicgaXMgaW5jbHVkZWQgaW4gY2FzZSB3ZQotICAgICAqIGRlY2lkZSB0byBleHBhbmQgb3VyIGRlZmluaXRpb24gb2Ygd2hhdCBjb25zdGl0dXRlcyBhbiBleHRlbnNpb24uCi0gICAgICoKLSAgICAgKiAiL3RtcC9mb28vYmFyLmMiIC0tPiAiLmMiCi0gICAgICogIi90bXAiIC0tPiAiIgotICAgICAqICIvdG1wL2Zvby5iYXIvYmF6IiAtLT4gIiIKLSAgICAgKiAiZm9vLmpwZWciIC0tPiAiLmpwZWciCi0gICAgICogImZvby4iIC0tPiAiIgotICAgICAqLwotICAgIFN0cmluZzggZ2V0UGF0aEV4dGVuc2lvbih2b2lkKSBjb25zdDsKLQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBwYXRoIHdpdGhvdXQgdGhlIGV4dGVuc2lvbi4gIFJ1bGVzIGZvciB3aGF0IGNvbnN0aXR1dGVzCi0gICAgICogYW4gZXh0ZW5zaW9uIGFyZSBkZXNjcmliZWQgaW4gdGhlIGNvbW1lbnQgZm9yIGdldFBhdGhFeHRlbnNpb24oKS4KLSAgICAgKgotICAgICAqICIvdG1wL2Zvby9iYXIuYyIgLS0+ICIvdG1wL2Zvby9iYXIiCi0gICAgICovCi0gICAgU3RyaW5nOCBnZXRCYXNlUGF0aCh2b2lkKSBjb25zdDsKLQotICAgIC8qCi0gICAgICogQWRkIGEgY29tcG9uZW50IHRvIHRoZSBwYXRobmFtZS4gIFdlIGd1YXJhbnRlZSB0aGF0IHRoZXJlIGlzCi0gICAgICogZXhhY3RseSBvbmUgcGF0aCBzZXBhcmF0b3IgYmV0d2VlbiB0aGUgb2xkIHBhdGggYW5kIHRoZSBuZXcuCi0gICAgICogSWYgdGhlcmUgaXMgbm8gZXhpc3RpbmcgbmFtZSwgd2UganVzdCBjb3B5IHRoZSBuZXcgbmFtZSBpbi4KLSAgICAgKgotICAgICAqIElmIGxlYWYgaXMgYSBmdWxseSBxdWFsaWZpZWQgcGF0aCAoaS5lLiBzdGFydHMgd2l0aCAnLycsIGl0Ci0gICAgICogcmVwbGFjZXMgd2hhdGV2ZXIgd2FzIHRoZXJlIGJlZm9yZS4KLSAgICAgKi8KLSAgICBTdHJpbmc4JiBhcHBlbmRQYXRoKGNvbnN0IGNoYXIqIGxlYWYpOwotICAgIFN0cmluZzgmIGFwcGVuZFBhdGgoY29uc3QgU3RyaW5nOCYgbGVhZikgIHsgcmV0dXJuIGFwcGVuZFBhdGgobGVhZi5zdHJpbmcoKSk7IH0KLQotICAgIC8qCi0gICAgICogTGlrZSBhcHBlbmRQYXRoKCksIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhpcyBzdHJpbmcuICBSZXR1cm5zIGEgbmV3IG9uZSBpbnN0ZWFkLgotICAgICAqLwotICAgIFN0cmluZzggYXBwZW5kUGF0aENvcHkoY29uc3QgY2hhciogbGVhZikgY29uc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU3RyaW5nOCBwKCp0aGlzKTsgcC5hcHBlbmRQYXRoKGxlYWYpOyByZXR1cm4gcDsgfQotICAgIFN0cmluZzggYXBwZW5kUGF0aENvcHkoY29uc3QgU3RyaW5nOCYgbGVhZikgY29uc3QgeyByZXR1cm4gYXBwZW5kUGF0aENvcHkobGVhZi5zdHJpbmcoKSk7IH0KLQotICAgIC8qCi0gICAgICogQ29udmVydHMgYWxsIHNlcGFyYXRvcnMgaW4gdGhpcyBzdHJpbmcgdG8gLywgdGhlIGRlZmF1bHQgcGF0aCBzZXBhcmF0b3IuCi0gICAgICoKLSAgICAgKiBJZiB0aGUgZGVmYXVsdCBPUyBzZXBhcmF0b3IgaXMgYmFja3NsYXNoLCB0aGlzIGNvbnZlcnRzIGFsbAotICAgICAqIGJhY2tzbGFzaGVzIHRvIHNsYXNoZXMsIGluLXBsYWNlLiBPdGhlcndpc2UgaXQgZG9lcyBub3RoaW5nLgotICAgICAqIFJldHVybnMgc2VsZi4KLSAgICAgKi8KLSAgICBTdHJpbmc4JiBjb252ZXJ0VG9SZXNQYXRoKCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlYWxfYXBwZW5kKGNvbnN0IGNoYXIqIG90aGVyLCBzaXplX3QgbnVtQ2hhcnMpOwotICAgICAgICAgICAgY2hhciogICAgICAgICAgICAgICBmaW5kX2V4dGVuc2lvbih2b2lkKSBjb25zdDsKLQotICAgICAgICAgICAgY29uc3QgY2hhciogbVN0cmluZzsKLX07Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGNvbnN0IFN0cmluZzE2JiB2YWwpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vIHVzZXIgc2VydmljYWJsZSBwYXJ0cyBiZWxvdy4KLQotaW5saW5lIGludCBjb21wYXJlX3R5cGUoY29uc3QgU3RyaW5nOCYgbGhzLCBjb25zdCBTdHJpbmc4JiByaHMpCi17Ci0gICAgcmV0dXJuIGxocy5jb21wYXJlKHJocyk7Ci19Ci0KLWlubGluZSBpbnQgc3RyaWN0bHlfb3JkZXJfdHlwZShjb25zdCBTdHJpbmc4JiBsaHMsIGNvbnN0IFN0cmluZzgmIHJocykKLXsKLSAgICByZXR1cm4gY29tcGFyZV90eXBlKGxocywgcmhzKSA8IDA7Ci19Ci0KLWlubGluZSBjb25zdCBTdHJpbmc4IFN0cmluZzg6OmVtcHR5KCkgewotICAgIHJldHVybiBTdHJpbmc4KCk7Ci19Ci0KLWlubGluZSBjb25zdCBjaGFyKiBTdHJpbmc4OjpzdHJpbmcoKSBjb25zdAotewotICAgIHJldHVybiBtU3RyaW5nOwotfQotCi1pbmxpbmUgc2l6ZV90IFN0cmluZzg6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFNoYXJlZEJ1ZmZlcjo6c2l6ZUZyb21EYXRhKG1TdHJpbmcpLTE7Ci19Ci0KLWlubGluZSBzaXplX3QgU3RyaW5nODo6c2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGxlbmd0aCgpOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmc4Ojppc0VtcHR5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbGVuZ3RoKCkgPT0gMDsKLX0KLQotaW5saW5lIHNpemVfdCBTdHJpbmc4OjpieXRlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFNoYXJlZEJ1ZmZlcjo6c2l6ZUZyb21EYXRhKG1TdHJpbmcpLTE7Ci19Ci0KLWlubGluZSBjb25zdCBTaGFyZWRCdWZmZXIqIFN0cmluZzg6OnNoYXJlZEJ1ZmZlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZyk7Ci19Ci0KLWlubGluZSBTdHJpbmc4JiBTdHJpbmc4OjpvcGVyYXRvcj0oY29uc3QgU3RyaW5nOCYgb3RoZXIpCi17Ci0gICAgc2V0VG8ob3RoZXIpOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotaW5saW5lIFN0cmluZzgmIFN0cmluZzg6Om9wZXJhdG9yPShjb25zdCBjaGFyKiBvdGhlcikKLXsKLSAgICBzZXRUbyhvdGhlcik7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1pbmxpbmUgU3RyaW5nOCYgU3RyaW5nODo6b3BlcmF0b3IrPShjb25zdCBTdHJpbmc4JiBvdGhlcikKLXsKLSAgICBhcHBlbmQob3RoZXIpOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotaW5saW5lIFN0cmluZzggU3RyaW5nODo6b3BlcmF0b3IrKGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdAotewotICAgIFN0cmluZzggdG1wKCp0aGlzKTsKLSAgICB0bXAgKz0gb3RoZXI7Ci0gICAgcmV0dXJuIHRtcDsKLX0KLQotaW5saW5lIFN0cmluZzgmIFN0cmluZzg6Om9wZXJhdG9yKz0oY29uc3QgY2hhciogb3RoZXIpCi17Ci0gICAgYXBwZW5kKG90aGVyKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLWlubGluZSBTdHJpbmc4IFN0cmluZzg6Om9wZXJhdG9yKyhjb25zdCBjaGFyKiBvdGhlcikgY29uc3QKLXsKLSAgICBTdHJpbmc4IHRtcCgqdGhpcyk7Ci0gICAgdG1wICs9IG90aGVyOwotICAgIHJldHVybiB0bXA7Ci19Ci0KLWlubGluZSBpbnQgU3RyaW5nODo6Y29tcGFyZShjb25zdCBTdHJpbmc4JiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wKG1TdHJpbmcsIG90aGVyLm1TdHJpbmcpOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmc4OjpvcGVyYXRvcjwoY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlci5tU3RyaW5nKSA8IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzg6Om9wZXJhdG9yPD0oY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlci5tU3RyaW5nKSA8PSAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmc4OjpvcGVyYXRvcj09KGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAobVN0cmluZywgb3RoZXIubVN0cmluZykgPT0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nODo6b3BlcmF0b3IhPShjb25zdCBTdHJpbmc4JiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wKG1TdHJpbmcsIG90aGVyLm1TdHJpbmcpICE9IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzg6Om9wZXJhdG9yPj0oY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlci5tU3RyaW5nKSA+PSAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmc4OjpvcGVyYXRvcj4oY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlci5tU3RyaW5nKSA+IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzg6Om9wZXJhdG9yPChjb25zdCBjaGFyKiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wKG1TdHJpbmcsIG90aGVyKSA8IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzg6Om9wZXJhdG9yPD0oY29uc3QgY2hhciogb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlcikgPD0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nODo6b3BlcmF0b3I9PShjb25zdCBjaGFyKiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wKG1TdHJpbmcsIG90aGVyKSA9PSAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmc4OjpvcGVyYXRvciE9KGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAobVN0cmluZywgb3RoZXIpICE9IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzg6Om9wZXJhdG9yPj0oY29uc3QgY2hhciogb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlcikgPj0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nODo6b3BlcmF0b3I+KGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAobVN0cmluZywgb3RoZXIpID4gMDsKLX0KLQotaW5saW5lIFN0cmluZzg6Om9wZXJhdG9yIGNvbnN0IGNoYXIqKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVN0cmluZzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX1NUUklORzhfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9TdHJpbmdBcnJheS5oIGIvaW5jbHVkZS91dGlscy9TdHJpbmdBcnJheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjQ0NTg3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvU3RyaW5nQXJyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gU29ydGFibGUgYXJyYXkgb2Ygc3RyaW5ncy4gIFNUTC1pc2gsIGJ1dCBTVEwtZnJlZS4KLS8vICAKLSNpZm5kZWYgX0xJQlNfVVRJTFNfU1RSSU5HX0FSUkFZX0gKLSNkZWZpbmUgX0xJQlNfVVRJTFNfU1RSSU5HX0FSUkFZX0gKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vCi0vLyBBbiBleHBhbmRpbmcgYXJyYXkgb2Ygc3RyaW5ncy4gIEFkZCwgZ2V0LCBzb3J0LCBkZWxldGUuCi0vLwotY2xhc3MgU3RyaW5nQXJyYXkgewotcHVibGljOgotICAgIFN0cmluZ0FycmF5KCk7Ci0gICAgdmlydHVhbCB+U3RyaW5nQXJyYXkoKTsKLQotICAgIC8vCi0gICAgLy8gQWRkIGEgc3RyaW5nLiAgQSBjb3B5IG9mIHRoZSBzdHJpbmcgaXMgbWFkZS4KLSAgICAvLwotICAgIGJvb2wgcHVzaF9iYWNrKGNvbnN0IGNoYXIqIHN0cik7Ci0KLSAgICAvLwotICAgIC8vIERlbGV0ZSBhbiBlbnRyeS4KLSAgICAvLwotICAgIHZvaWQgZXJhc2UoaW50IGlkeCk7Ci0KLSAgICAvLwotICAgIC8vIFNvcnQgdGhlIGFycmF5LgotICAgIC8vCi0gICAgdm9pZCBzb3J0KGludCAoKmNvbXBhcmUpKGNvbnN0IHZvaWQqLCBjb25zdCB2b2lkKikpOwotICAgIAotICAgIC8vCi0gICAgLy8gUGFzcyB0aGlzIHRvIHRoZSBzb3J0IHJvdXRpbmUgdG8gZG8gYW4gYXNjZW5kaW5nIGFscGhhYmV0aWNhbCBzb3J0LgotICAgIC8vCi0gICAgc3RhdGljIGludCBjbXBBc2NlbmRpbmdBbHBoYShjb25zdCB2b2lkKiBwc3RyMSwgY29uc3Qgdm9pZCogcHN0cjIpOwotICAgIAotICAgIC8vCi0gICAgLy8gR2V0IHRoZSAjb2YgaXRlbXMgaW4gdGhlIGFycmF5LgotICAgIC8vCi0gICAgaW5saW5lIGludCBzaXplKHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50OyB9Ci0KLSAgICAvLwotICAgIC8vIFJldHVybiBlbnRyeSBOLgotICAgIC8vIFtzaG91bGQgdXNlIG9wZXJhdG9yW10gaGVyZV0KLSAgICAvLwotICAgIGNvbnN0IGNoYXIqIGdldEVudHJ5KGludCBpZHgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICh1bnNpZ25lZChpZHgpID49IHVuc2lnbmVkKG1DdXJyZW50KSkgPyBOVUxMIDogbUFycmF5W2lkeF07Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBTZXQgZW50cnkgTiB0byBzcGVjaWZpZWQgc3RyaW5nLgotICAgIC8vIFtzaG91bGQgdXNlIG9wZXJhdG9yW10gaGVyZV0KLSAgICAvLwotICAgIHZvaWQgc2V0RW50cnkoaW50IGlkeCwgY29uc3QgY2hhciogc3RyKTsKLQotcHJpdmF0ZToKLSAgICBpbnQgICAgIG1NYXg7Ci0gICAgaW50ICAgICBtQ3VycmVudDsKLSAgICBjaGFyKiogIG1BcnJheTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBfTElCU19VVElMU19TVFJJTkdfQVJSQVlfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmggYi9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmYTNhOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NUUk9OR19QT0lOVEVSX0gKLSNkZWZpbmUgQU5EUk9JRF9TVFJPTkdfUE9JTlRFUl9ICi0KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFRleHRPdXRwdXQ7Ci1UZXh0T3V0cHV0JiBwcmludFN0cm9uZ1BvaW50ZXIoVGV4dE91dHB1dCYgdG8sIGNvbnN0IHZvaWQqIHZhbCk7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIHdwOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2RlZmluZSBDT01QQVJFKF9vcF8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWlubGluZSBib29sIG9wZXJhdG9yIF9vcF8gKGNvbnN0IHNwPFQ+JiBvKSBjb25zdCB7ICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIG1fcHRyIF9vcF8gby5tX3B0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWlubGluZSBib29sIG9wZXJhdG9yIF9vcF8gKGNvbnN0IFQqIG8pIGNvbnN0IHsgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIG1fcHRyIF9vcF8gbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXRlbXBsYXRlPHR5cGVuYW1lIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1pbmxpbmUgYm9vbCBvcGVyYXRvciBfb3BfIChjb25zdCBzcDxVPiYgbykgY29uc3QgeyAgICAgICAgICAgICAgXAotICAgIHJldHVybiBtX3B0ciBfb3BfIG8ubV9wdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi10ZW1wbGF0ZTx0eXBlbmFtZSBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotaW5saW5lIGJvb2wgb3BlcmF0b3IgX29wXyAoY29uc3QgVSogbykgY29uc3QgeyAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gbV9wdHIgX29wXyBvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotaW5saW5lIGJvb2wgb3BlcmF0b3IgX29wXyAoY29uc3Qgd3A8VD4mIG8pIGNvbnN0IHsgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gbV9wdHIgX29wXyBvLm1fcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdGVtcGxhdGU8dHlwZW5hbWUgVT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWlubGluZSBib29sIG9wZXJhdG9yIF9vcF8gKGNvbnN0IHdwPFU+JiBvKSBjb25zdCB7ICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIG1fcHRyIF9vcF8gby5tX3B0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBzcAotewotcHVibGljOgotICAgIGlubGluZSBzcCgpIDogbV9wdHIoMCkgeyB9Ci0KLSAgICBzcChUKiBvdGhlcik7Ci0gICAgc3AoY29uc3Qgc3A8VD4mIG90aGVyKTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzcChVKiBvdGhlcik7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3AoY29uc3Qgc3A8VT4mIG90aGVyKTsKLQotICAgIH5zcCgpOwotCi0gICAgLy8gQXNzaWdubWVudAotCi0gICAgc3AmIG9wZXJhdG9yID0gKFQqIG90aGVyKTsKLSAgICBzcCYgb3BlcmF0b3IgPSAoY29uc3Qgc3A8VD4mIG90aGVyKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHNwJiBvcGVyYXRvciA9IChjb25zdCBzcDxVPiYgb3RoZXIpOwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHNwJiBvcGVyYXRvciA9IChVKiBvdGhlcik7Ci0KLSAgICAvLyEgU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIHVzZSBieSBQcm9jZXNzU3RhdGUgKGFuZCBub2JvZHkgZWxzZSkuCi0gICAgdm9pZCBmb3JjZV9zZXQoVCogb3RoZXIpOwotCi0gICAgLy8gUmVzZXQKLQotICAgIHZvaWQgY2xlYXIoKTsKLQotICAgIC8vIEFjY2Vzc29ycwotCi0gICAgaW5saW5lICBUJiAgICAgIG9wZXJhdG9yKiAoKSBjb25zdCAgeyByZXR1cm4gKm1fcHRyOyB9Ci0gICAgaW5saW5lICBUKiAgICAgIG9wZXJhdG9yLT4gKCkgY29uc3QgeyByZXR1cm4gbV9wdHI7ICB9Ci0gICAgaW5saW5lICBUKiAgICAgIGdldCgpIGNvbnN0ICAgICAgICAgeyByZXR1cm4gbV9wdHI7IH0KLQotICAgIC8vIE9wZXJhdG9ycwotCi0gICAgQ09NUEFSRSg9PSkKLSAgICBDT01QQVJFKCE9KQotICAgIENPTVBBUkUoPikKLSAgICBDT01QQVJFKDwpCi0gICAgQ09NUEFSRSg8PSkKLSAgICBDT01QQVJFKD49KQotCi1wcml2YXRlOiAgICAKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBZPiBmcmllbmQgY2xhc3Mgc3A7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgWT4gZnJpZW5kIGNsYXNzIHdwOwotICAgIHZvaWQgc2V0X3BvaW50ZXIoVCogcHRyKTsKLSAgICBUKiBtX3B0cjsKLX07Ci0KLSN1bmRlZiBDT01QQVJFCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3Qgc3A8VD4mIHZhbCk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm8gdXNlciBzZXJ2aWNlYWJsZSBwYXJ0cyBiZWxvdyBoZXJlLgotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3A8VD46OnNwKFQqIG90aGVyKQotOiBtX3B0cihvdGhlcikKLSAgewotICAgIGlmIChvdGhlcikgb3RoZXItPmluY1N0cm9uZyh0aGlzKTsKLSAgfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3A8VD46OnNwKGNvbnN0IHNwPFQ+JiBvdGhlcikKLTogbV9wdHIob3RoZXIubV9wdHIpCi0gIHsKLSAgICBpZiAobV9wdHIpIG1fcHRyLT5pbmNTdHJvbmcodGhpcyk7Ci0gIH0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KLXNwPFQ+OjpzcChVKiBvdGhlcikgOiBtX3B0cihvdGhlcikKLXsKLSAgICBpZiAob3RoZXIpICgoVCopb3RoZXIpLT5pbmNTdHJvbmcodGhpcyk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci1zcDxUPjo6c3AoY29uc3Qgc3A8VT4mIG90aGVyKQotOiBtX3B0cihvdGhlci5tX3B0cikKLSAgewotICAgIGlmIChtX3B0cikgbV9wdHItPmluY1N0cm9uZyh0aGlzKTsKLSAgfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3A8VD46On5zcCgpCi17Ci0gICAgaWYgKG1fcHRyKSBtX3B0ci0+ZGVjU3Ryb25nKHRoaXMpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3A8VD4mIHNwPFQ+OjpvcGVyYXRvciA9IChjb25zdCBzcDxUPiYgb3RoZXIpIHsKLSAgICBUKiBvdGhlclB0cihvdGhlci5tX3B0cik7Ci0gICAgaWYgKG90aGVyUHRyKSBvdGhlclB0ci0+aW5jU3Ryb25nKHRoaXMpOwotICAgIGlmIChtX3B0cikgbV9wdHItPmRlY1N0cm9uZyh0aGlzKTsKLSAgICBtX3B0ciA9IG90aGVyUHRyOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXNwPFQ+JiBzcDxUPjo6b3BlcmF0b3IgPSAoVCogb3RoZXIpCi17Ci0gICAgaWYgKG90aGVyKSBvdGhlci0+aW5jU3Ryb25nKHRoaXMpOwotICAgIGlmIChtX3B0cikgbV9wdHItPmRlY1N0cm9uZyh0aGlzKTsKLSAgICBtX3B0ciA9IG90aGVyOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KLXNwPFQ+JiBzcDxUPjo6b3BlcmF0b3IgPSAoY29uc3Qgc3A8VT4mIG90aGVyKQotewotICAgIFQqIG90aGVyUHRyKG90aGVyLm1fcHRyKTsKLSAgICBpZiAob3RoZXJQdHIpIG90aGVyUHRyLT5pbmNTdHJvbmcodGhpcyk7Ci0gICAgaWYgKG1fcHRyKSBtX3B0ci0+ZGVjU3Ryb25nKHRoaXMpOwotICAgIG1fcHRyID0gb3RoZXJQdHI7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgotc3A8VD4mIHNwPFQ+OjpvcGVyYXRvciA9IChVKiBvdGhlcikKLXsKLSAgICBpZiAob3RoZXIpICgoVCopb3RoZXIpLT5pbmNTdHJvbmcodGhpcyk7Ci0gICAgaWYgKG1fcHRyKSBtX3B0ci0+ZGVjU3Ryb25nKHRoaXMpOwotICAgIG1fcHRyID0gb3RoZXI7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiAgICAKLXZvaWQgc3A8VD46OmZvcmNlX3NldChUKiBvdGhlcikKLXsKLSAgICBvdGhlci0+Zm9yY2VJbmNTdHJvbmcodGhpcyk7Ci0gICAgbV9wdHIgPSBvdGhlcjsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQgc3A8VD46OmNsZWFyKCkKLXsKLSAgICBpZiAobV9wdHIpIHsKLSAgICAgICAgbV9wdHItPmRlY1N0cm9uZyh0aGlzKTsKLSAgICAgICAgbV9wdHIgPSAwOwotICAgIH0KLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQgc3A8VD46OnNldF9wb2ludGVyKFQqIHB0cikgewotICAgIG1fcHRyID0gcHRyOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBUZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCBzcDxUPiYgdmFsKQotewotICAgIHJldHVybiBwcmludFN0cm9uZ1BvaW50ZXIodG8sIHZhbC5nZXQoKSk7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9TVFJPTkdfUE9JTlRFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1N5c3RlbUNsb2NrLmggYi9pbmNsdWRlL3V0aWxzL1N5c3RlbUNsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMzE5YmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9TeXN0ZW1DbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9VVElMU19TWVNURU1DTE9DS19ICi0jZGVmaW5lIEFORFJPSURfVVRJTFNfU1lTVEVNQ0xPQ0tfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotaW50IHNldEN1cnJlbnRUaW1lTWlsbGlzKGludDY0X3QgbWlsbGlzKTsKLWludDY0X3QgdXB0aW1lTWlsbGlzKCk7Ci1pbnQ2NF90IGVsYXBzZWRSZWFsdGltZSgpOwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9VVElMU19TWVNURU1DTE9DS19ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvVGV4dE91dHB1dC5oIGIvaW5jbHVkZS91dGlscy9UZXh0T3V0cHV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMmZiYmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9UZXh0T3V0cHV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9URVhUT1VUUFVUX0gKLSNkZWZpbmUgQU5EUk9JRF9URVhUT1VUUFVUX0gKLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBUZXh0T3V0cHV0Ci17Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0T3V0cHV0KCk7Ci0gICAgdmlydHVhbCAgICAgICAgICAgICB+VGV4dE91dHB1dCgpOwotICAgIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJpbnQoY29uc3QgY2hhciogdHh0LCBzaXplX3QgbGVuKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBtb3ZlSW5kZW50KGludCBkZWx0YSkgPSAwOwotICAgIAotICAgIGNsYXNzIEJ1bmRsZSB7Ci0gICAgcHVibGljOgotICAgICAgICBpbmxpbmUgQnVuZGxlKFRleHRPdXRwdXQmIHRvKSA6IG1UTyh0bykgeyB0by5wdXNoQnVuZGxlKCk7IH0KLSAgICAgICAgaW5saW5lIH5CdW5kbGUoKSB7IG1UTy5wb3BCdW5kbGUoKTsgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRleHRPdXRwdXQmICAgICBtVE87Ci0gICAgfTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHB1c2hCdW5kbGUoKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBwb3BCdW5kbGUoKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVGV4dCBvdXRwdXQgc3RyZWFtIGZvciBwcmludGluZyB0byB0aGUgbG9nICh2aWEgdXRpbHMvTG9nLmgpLgotZXh0ZXJuIFRleHRPdXRwdXQmIGFsb2c7Ci0KLS8vIFRleHQgb3V0cHV0IHN0cmVhbSBmb3IgcHJpbnRpbmcgdG8gc3Rkb3V0LgotZXh0ZXJuIFRleHRPdXRwdXQmIGFvdXQ7Ci0KLS8vIFRleHQgb3V0cHV0IHN0cmVhbSBmb3IgcHJpbnRpbmcgdG8gc3RkZXJyLgotZXh0ZXJuIFRleHRPdXRwdXQmIGFlcnI7Ci0KLXR5cGVkZWYgVGV4dE91dHB1dCYgKCpUZXh0T3V0cHV0TWFuaXBGdW5jKShUZXh0T3V0cHV0Jik7Ci0KLVRleHRPdXRwdXQmIGVuZGwoVGV4dE91dHB1dCYgdG8pOwotVGV4dE91dHB1dCYgaW5kZW50KFRleHRPdXRwdXQmIHRvKTsKLVRleHRPdXRwdXQmIGRlZGVudChUZXh0T3V0cHV0JiB0byk7Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGNvbnN0IGNoYXIqIHN0cik7Ci1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjaGFyKTsgICAgIC8vIHdyaXRlcyByYXcgY2hhcmFjdGVyCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBib29sKTsKLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGludCk7Ci1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBsb25nKTsKLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIHVuc2lnbmVkIGludCk7Ci1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCB1bnNpZ25lZCBsb25nKTsKLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGxvbmcgbG9uZyk7Ci1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCB1bnNpZ25lZCBsb25nIGxvbmcpOwotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgZmxvYXQpOwotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgZG91YmxlKTsKLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIFRleHRPdXRwdXRNYW5pcEZ1bmMgZnVuYyk7Ci1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCB2b2lkKik7Ci0KLWNsYXNzIFR5cGVDb2RlIAotewotcHVibGljOgotICAgIGlubGluZSBUeXBlQ29kZSh1aW50MzJfdCBjb2RlKTsKLSAgICBpbmxpbmUgflR5cGVDb2RlKCk7Ci0KLSAgICBpbmxpbmUgdWludDMyX3QgdHlwZUNvZGUoKSBjb25zdDsKLSAgICAKLXByaXZhdGU6Ci0gICAgdWludDMyX3QgbUNvZGU7Ci19OwotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCBUeXBlQ29kZSYgdmFsKTsKLQotY2xhc3MgSGV4RHVtcAotewotcHVibGljOgotICAgIEhleER1bXAoY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGJ5dGVzUGVyTGluZT0xNik7Ci0gICAgaW5saW5lIH5IZXhEdW1wKCk7Ci0gICAgCi0gICAgaW5saW5lIEhleER1bXAmIHNldEJ5dGVzUGVyTGluZShzaXplX3QgYnl0ZXNQZXJMaW5lKTsKLSAgICBpbmxpbmUgSGV4RHVtcCYgc2V0U2luZ2xlTGluZUN1dG9mZihpbnQzMl90IGJ5dGVzKTsKLSAgICBpbmxpbmUgSGV4RHVtcCYgc2V0QWxpZ25tZW50KHNpemVfdCBhbGlnbm1lbnQpOwotICAgIGlubGluZSBIZXhEdW1wJiBzZXRDQXJyYXlTdHlsZShib29sIGVuYWJsZWQpOwotICAgIAotICAgIGlubGluZSBjb25zdCB2b2lkKiBidWZmZXIoKSBjb25zdDsKLSAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdDsKLSAgICBpbmxpbmUgc2l6ZV90IGJ5dGVzUGVyTGluZSgpIGNvbnN0OwotICAgIGlubGluZSBpbnQzMl90IHNpbmdsZUxpbmVDdXRvZmYoKSBjb25zdDsKLSAgICBpbmxpbmUgc2l6ZV90IGFsaWdubWVudCgpIGNvbnN0OwotICAgIGlubGluZSBib29sIGNhcnJheVN0eWxlKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3Qgdm9pZCogbUJ1ZmZlcjsKLSAgICBzaXplX3QgbVNpemU7Ci0gICAgc2l6ZV90IG1CeXRlc1BlckxpbmU7Ci0gICAgaW50MzJfdCBtU2luZ2xlTGluZUN1dG9mZjsKLSAgICBzaXplX3QgbUFsaWdubWVudDsKLSAgICBib29sIG1DQXJyYXlTdHlsZTsKLX07Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGNvbnN0IEhleER1bXAmIHZhbCk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm8gdXNlciBzZXJ2aWNhYmxlIHBhcnRzIGJlbG93LgotCi1pbmxpbmUgVGV4dE91dHB1dCYgZW5kbChUZXh0T3V0cHV0JiB0bykKLXsKLSAgICB0by5wcmludCgiXG4iLCAxKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLWlubGluZSBUZXh0T3V0cHV0JiBpbmRlbnQoVGV4dE91dHB1dCYgdG8pCi17Ci0gICAgdG8ubW92ZUluZGVudCgxKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLWlubGluZSBUZXh0T3V0cHV0JiBkZWRlbnQoVGV4dE91dHB1dCYgdG8pCi17Ci0gICAgdG8ubW92ZUluZGVudCgtMSk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi1pbmxpbmUgVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3QgY2hhciogc3RyKQotewotICAgIHRvLnByaW50KHN0ciwgc3RybGVuKHN0cikpOwotICAgIHJldHVybiB0bzsKLX0KLQotaW5saW5lIFRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGNoYXIgYykKLXsKLSAgICB0by5wcmludCgmYywgMSk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi1pbmxpbmUgVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgVGV4dE91dHB1dE1hbmlwRnVuYyBmdW5jKQotewotICAgIHJldHVybiAoKmZ1bmMpKHRvKTsKLX0KLQotaW5saW5lIFR5cGVDb2RlOjpUeXBlQ29kZSh1aW50MzJfdCBjb2RlKSA6IG1Db2RlKGNvZGUpIHsgfQotaW5saW5lIFR5cGVDb2RlOjp+VHlwZUNvZGUoKSB7IH0KLWlubGluZSB1aW50MzJfdCBUeXBlQ29kZTo6dHlwZUNvZGUoKSBjb25zdCB7IHJldHVybiBtQ29kZTsgfQotCi1pbmxpbmUgSGV4RHVtcDo6fkhleER1bXAoKSB7IH0KLQotaW5saW5lIEhleER1bXAmIEhleER1bXA6OnNldEJ5dGVzUGVyTGluZShzaXplX3QgYnl0ZXNQZXJMaW5lKSB7Ci0gICAgbUJ5dGVzUGVyTGluZSA9IGJ5dGVzUGVyTGluZTsgcmV0dXJuICp0aGlzOwotfQotaW5saW5lIEhleER1bXAmIEhleER1bXA6OnNldFNpbmdsZUxpbmVDdXRvZmYoaW50MzJfdCBieXRlcykgewotICAgIG1TaW5nbGVMaW5lQ3V0b2ZmID0gYnl0ZXM7IHJldHVybiAqdGhpczsKLX0KLWlubGluZSBIZXhEdW1wJiBIZXhEdW1wOjpzZXRBbGlnbm1lbnQoc2l6ZV90IGFsaWdubWVudCkgewotICAgIG1BbGlnbm1lbnQgPSBhbGlnbm1lbnQ7IHJldHVybiAqdGhpczsKLX0KLWlubGluZSBIZXhEdW1wJiBIZXhEdW1wOjpzZXRDQXJyYXlTdHlsZShib29sIGVuYWJsZWQpIHsKLSAgICBtQ0FycmF5U3R5bGUgPSBlbmFibGVkOyByZXR1cm4gKnRoaXM7Ci19Ci0KLWlubGluZSBjb25zdCB2b2lkKiBIZXhEdW1wOjpidWZmZXIoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyOyB9Ci1pbmxpbmUgc2l6ZV90IEhleER1bXA6OnNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQotaW5saW5lIHNpemVfdCBIZXhEdW1wOjpieXRlc1BlckxpbmUoKSBjb25zdCB7IHJldHVybiBtQnl0ZXNQZXJMaW5lOyB9Ci1pbmxpbmUgaW50MzJfdCBIZXhEdW1wOjpzaW5nbGVMaW5lQ3V0b2ZmKCkgY29uc3QgeyByZXR1cm4gbVNpbmdsZUxpbmVDdXRvZmY7IH0KLWlubGluZSBzaXplX3QgSGV4RHVtcDo6YWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gbUFsaWdubWVudDsgfQotaW5saW5lIGJvb2wgSGV4RHVtcDo6Y2FycmF5U3R5bGUoKSBjb25zdCB7IHJldHVybiBtQ0FycmF5U3R5bGU7IH0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9URVhUT1VUUFVUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvVGhyZWFkLmggYi9pbmNsdWRlL3V0aWxzL1RocmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTM0YWJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvVGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0xJQlNfVVRJTFNfVEhSRUFEX0gKLSNkZWZpbmUgX0xJQlNfVVRJTFNfVEhSRUFEX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLSMgaW5jbHVkZSA8cHRocmVhZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9UaHJlYWREZWZzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFRocmVhZCA6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAvLyBDcmVhdGUgYSBUaHJlYWQgb2JqZWN0LCBidXQgZG9lc24ndCBjcmVhdGUgb3Igc3RhcnQgdGhlIGFzc29jaWF0ZWQKLSAgICAvLyB0aHJlYWQuIFNlZSB0aGUgcnVuKCkgbWV0aG9kLgotICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkKGJvb2wgY2FuQ2FsbEphdmEgPSB0cnVlKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UaHJlYWQoKTsKLQotICAgIC8vIFN0YXJ0IHRoZSB0aHJlYWQgaW4gdGhyZWFkTG9vcCgpIHdoaWNoIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcnVuKCAgICBjb25zdCBjaGFyKiBuYW1lID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IFBSSU9SSVRZX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdGFjayA9IDApOwotICAgIAotICAgIC8vIEFzayB0aGlzIG9iamVjdCdzIHRocmVhZCB0byBleGl0LiBUaGlzIGZ1bmN0aW9uIGlzIGFzeW5jaHJvbm91cywgd2hlbiB0aGUKLSAgICAvLyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aHJlYWQgbWlnaHQgc3RpbGwgYmUgcnVubmluZy4gT2YgY291cnNlLCB0aGlzCi0gICAgLy8gZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZC4KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlcXVlc3RFeGl0KCk7Ci0KLSAgICAvLyBHb29kIHBsYWNlIHRvIGRvIG9uZS10aW1lIGluaXRpYWxpemF0aW9ucwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpOwotICAgIAotICAgIC8vIENhbGwgcmVxdWVzdEV4aXQoKSBhbmQgd2FpdCB1bnRpbCB0aGlzIG9iamVjdCdzIHRocmVhZCBleGl0cy4KLSAgICAvLyBCRSBWRVJZIENBUkVGVUwgb2YgZGVhZGxvY2tzLiBJbiBwYXJ0aWN1bGFyLCBpdCB3b3VsZCBiZSBzaWxseSB0byBjYWxsCi0gICAgLy8gdGhpcyBmdW5jdGlvbiBmcm9tIHRoaXMgb2JqZWN0J3MgdGhyZWFkLiBXaWxsIHJldHVybiBXT1VMRF9CTE9DSyBpbgotICAgIC8vIHRoYXQgY2FzZS4KLSAgICAgICAgICAgIHN0YXR1c190ICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOwotCi0gICAgLy8gV2FpdCB1bnRpbCB0aGlzIG9iamVjdCdzIHRocmVhZCBleGl0cy4gUmV0dXJucyBpbW1lZGlhdGVseSBpZiBub3QgeWV0IHJ1bm5pbmcuCi0gICAgLy8gRG8gbm90IGNhbGwgZnJvbSB0aGlzIG9iamVjdCdzIHRocmVhZDsgd2lsbCByZXR1cm4gV09VTERfQkxPQ0sgaW4gdGhhdCBjYXNlLgotICAgICAgICAgICAgc3RhdHVzX3QgICAgam9pbigpOwotCi0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi0gICAgLy8gUmV0dXJuIHRoZSB0aHJlYWQncyBrZXJuZWwgSUQsIHNhbWUgYXMgdGhlIHRocmVhZCBpdHNlbGYgY2FsbGluZyBnZXR0aWQoKSBvcgotICAgIC8vIGFuZHJvaWRHZXRUaWQoKSwgb3IgLTEgaWYgdGhlIHRocmVhZCBpcyBub3QgcnVubmluZy4KLSAgICAgICAgICAgIHBpZF90ICAgICAgIGdldFRpZCgpIGNvbnN0OwotI2VuZGlmCi0KLXByb3RlY3RlZDoKLSAgICAvLyBleGl0UGVuZGluZygpIHJldHVybnMgdHJ1ZSBpZiByZXF1ZXN0RXhpdCgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgICAgICAgIGJvb2wgICAgICAgIGV4aXRQZW5kaW5nKCkgY29uc3Q7Ci0gICAgCi1wcml2YXRlOgotICAgIC8vIERlcml2ZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhyZWFkTG9vcCgpLiBUaGUgdGhyZWFkIHN0YXJ0cyBpdHMgbGlmZQotICAgIC8vIGhlcmUuIFRoZXJlIGFyZSB0d28gd2F5cyBvZiB1c2luZyB0aGUgVGhyZWFkIG9iamVjdDoKLSAgICAvLyAxKSBsb29wOiBpZiB0aHJlYWRMb29wKCkgcmV0dXJucyB0cnVlLCBpdCB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBpZgotICAgIC8vICAgICAgICAgIHJlcXVlc3RFeGl0KCkgd2Fzbid0IGNhbGxlZC4KLSAgICAvLyAyKSBvbmNlOiBpZiB0aHJlYWRMb29wKCkgcmV0dXJucyBmYWxzZSwgdGhlIHRocmVhZCB3aWxsIGV4aXQgdXBvbiByZXR1cm4uCi0gICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCkgPSAwOwotCi1wcml2YXRlOgotICAgIFRocmVhZCYgb3BlcmF0b3I9KGNvbnN0IFRocmVhZCYpOwotICAgIHN0YXRpYyAgaW50ICAgICAgICAgICAgIF90aHJlYWRMb29wKHZvaWQqIHVzZXIpOwotICAgIGNvbnN0ICAgYm9vbCAgICAgICAgICAgIG1DYW5DYWxsSmF2YTsKLSAgICAvLyBhbHdheXMgaG9sZCBtTG9jayB3aGVuIHJlYWRpbmcgb3Igd3JpdGluZwotICAgICAgICAgICAgdGhyZWFkX2lkX3QgICAgIG1UaHJlYWQ7Ci0gICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7Ci0gICAgICAgICAgICBDb25kaXRpb24gICAgICAgbVRocmVhZEV4aXRlZENvbmRpdGlvbjsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBtU3RhdHVzOwotICAgIC8vIG5vdGUgdGhhdCBhbGwgYWNjZXNzZXMgb2YgbUV4aXRQZW5kaW5nIGFuZCBtUnVubmluZyBuZWVkIHRvIGhvbGQgbUxvY2sKLSAgICB2b2xhdGlsZSBib29sICAgICAgICAgICBtRXhpdFBlbmRpbmc7Ci0gICAgdm9sYXRpbGUgYm9vbCAgICAgICAgICAgbVJ1bm5pbmc7Ci0gICAgICAgICAgICBzcDxUaHJlYWQ+ICAgICAgbUhvbGRTZWxmOwotI2lmZGVmIEhBVkVfQU5EUk9JRF9PUwotICAgIC8vIGxlZ2FjeSBmb3IgZGVidWdnaW5nLCBub3QgdXNlZCBieSBnZXRUaWQoKSBhcyBpdCBpcyBzZXQgYnkgdGhlIGNoaWxkIHRocmVhZAotICAgIC8vIGFuZCBzbyBpcyBub3QgaW5pdGlhbGl6ZWQgdW50aWwgdGhlIGNoaWxkIHJlYWNoZXMgdGhhdCBwb2ludAotICAgICAgICAgICAgcGlkX3QgICAgICAgICAgIG1UaWQ7Ci0jZW5kaWYKLX07Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZW5kaWYgLy8gX0xJQlNfVVRJTFNfVEhSRUFEX0gKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9UaHJlYWREZWZzLmggYi9pbmNsdWRlL3V0aWxzL1RocmVhZERlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1NjM3My4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1RocmVhZERlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTElCU19VVElMU19USFJFQURfREVGU19ICi0jZGVmaW5lIF9MSUJTX1VUSUxTX1RIUkVBRF9ERUZTX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEMgQVBJCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdHlwZWRlZiB2b2lkKiBhbmRyb2lkX3RocmVhZF9pZF90OwotCi10eXBlZGVmIGludCAoKmFuZHJvaWRfdGhyZWFkX2Z1bmNfdCkodm9pZCopOwotCi1lbnVtIHsKLSAgICAvKgotICAgICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICogKiogS2VlcCBpbiBzeW5jIHdpdGggYW5kcm9pZC5vcy5Qcm9jZXNzLmphdmEgKioKLSAgICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAqIAotICAgICAqIFRoaXMgbWFwcyBkaXJlY3RseSB0byB0aGUgIm5pY2UiIHByaW9yaXRpZXMgd2UgdXNlIGluIEFuZHJvaWQuCi0gICAgICogQSB0aHJlYWQgcHJpb3JpdHkgc2hvdWxkIGJlIGNob3NlbiBpbnZlcnNlLXByb3BvcnRpb25hbGx5IHRvCi0gICAgICogdGhlIGFtb3VudCBvZiB3b3JrIHRoZSB0aHJlYWQgaXMgZXhwZWN0ZWQgdG8gZG8uIFRoZSBtb3JlIHdvcmsKLSAgICAgKiBhIHRocmVhZCB3aWxsIGRvLCB0aGUgbGVzcyBmYXZvcmFibGUgcHJpb3JpdHkgaXQgc2hvdWxkIGdldCBzbyB0aGF0IAotICAgICAqIGl0IGRvZXNuJ3Qgc3RhcnZlIHRoZSBzeXN0ZW0uIFRocmVhZHMgbm90IGJlaGF2aW5nIHByb3Blcmx5IG1pZ2h0Ci0gICAgICogYmUgInB1bmlzaGVkIiBieSB0aGUga2VybmVsLgotICAgICAqIFVzZSB0aGUgbGV2ZWxzIGJlbG93IHdoZW4gYXBwcm9wcmlhdGUuIEludGVybWVkaWF0ZSB2YWx1ZXMgYXJlCi0gICAgICogYWNjZXB0YWJsZSwgcHJlZmVyYWJseSB1c2UgdGhlIHtNT1JFfExFU1N9X0ZBVk9SQUJMRSBjb25zdGFudHMgYmVsb3cuCi0gICAgICovCi0gICAgQU5EUk9JRF9QUklPUklUWV9MT1dFU1QgICAgICAgICA9ICAxOSwKLQotICAgIC8qIHVzZSBmb3IgYmFja2dyb3VuZCB0YXNrcyAqLwotICAgIEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCAgICAgPSAgMTAsCi0gICAgCi0gICAgLyogbW9zdCB0aHJlYWRzIHJ1biBhdCBub3JtYWwgcHJpb3JpdHkgKi8KLSAgICBBTkRST0lEX1BSSU9SSVRZX05PUk1BTCAgICAgICAgID0gICAwLAotICAgIAotICAgIC8qIHRocmVhZHMgY3VycmVudGx5IHJ1bm5pbmcgYSBVSSB0aGF0IHRoZSB1c2VyIGlzIGludGVyYWN0aW5nIHdpdGggKi8KLSAgICBBTkRST0lEX1BSSU9SSVRZX0ZPUkVHUk9VTkQgICAgID0gIC0yLAotCi0gICAgLyogdGhlIG1haW4gVUkgdGhyZWFkIGhhcyBhIHNsaWdodGx5IG1vcmUgZmF2b3JhYmxlIHByaW9yaXR5ICovCi0gICAgQU5EUk9JRF9QUklPUklUWV9ESVNQTEFZICAgICAgICA9ICAtNCwKLSAgICAKLSAgICAvKiB1aSBzZXJ2aWNlIHRyZWFkcyBtaWdodCB3YW50IHRvIHJ1biBhdCBhIHVyZ2VudCBkaXNwbGF5ICh1bmNvbW1vbikgKi8KLSAgICBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9ESVNQTEFZID0gIEhBTF9QUklPUklUWV9VUkdFTlRfRElTUExBWSwKLSAgICAKLSAgICAvKiBhbGwgbm9ybWFsIGF1ZGlvIHRocmVhZHMgKi8KLSAgICBBTkRST0lEX1BSSU9SSVRZX0FVRElPICAgICAgICAgID0gLTE2LAotICAgIAotICAgIC8qIHNlcnZpY2UgYXVkaW8gdGhyZWFkcyAodW5jb21tb24pICovCi0gICAgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8gICA9IC0xOSwKLQotICAgIC8qIHNob3VsZCBuZXZlciBiZSB1c2VkIGluIHByYWN0aWNlLiByZWd1bGFyIHByb2Nlc3MgbWlnaHQgbm90IAotICAgICAqIGJlIGFsbG93ZWQgdG8gdXNlIHRoaXMgbGV2ZWwgKi8KLSAgICBBTkRST0lEX1BSSU9SSVRZX0hJR0hFU1QgICAgICAgID0gLTIwLAotCi0gICAgQU5EUk9JRF9QUklPUklUWV9ERUZBVUxUICAgICAgICA9IEFORFJPSURfUFJJT1JJVFlfTk9STUFMLAotICAgIEFORFJPSURfUFJJT1JJVFlfTU9SRV9GQVZPUkFCTEUgPSAtMSwKLSAgICBBTkRST0lEX1BSSU9SSVRZX0xFU1NfRkFWT1JBQkxFID0gKzEsCi19OwotCi1lbnVtIHsKLSAgICBBTkRST0lEX1RHUk9VUF9ERUZBVUxUICAgICAgICAgID0gMCwKLSAgICBBTkRST0lEX1RHUk9VUF9CR19OT05JTlRFUkFDVCAgID0gMSwKLSAgICBBTkRST0lEX1RHUk9VUF9GR19CT09TVCAgICAgICAgID0gMiwKLSAgICBBTkRST0lEX1RHUk9VUF9NQVggICAgICAgICAgICAgID0gQU5EUk9JRF9UR1JPVVBfRkdfQk9PU1QsCi19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQysrIEFQSQotI2lmZGVmIF9fY3BsdXNwbHVzCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdHlwZWRlZiBhbmRyb2lkX3RocmVhZF9pZF90IHRocmVhZF9pZF90OwotdHlwZWRlZiBhbmRyb2lkX3RocmVhZF9mdW5jX3QgdGhyZWFkX2Z1bmNfdDsKLQotZW51bSB7Ci0gICAgUFJJT1JJVFlfTE9XRVNUICAgICAgICAgPSBBTkRST0lEX1BSSU9SSVRZX0xPV0VTVCwKLSAgICBQUklPUklUWV9CQUNLR1JPVU5EICAgICA9IEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCwKLSAgICBQUklPUklUWV9OT1JNQUwgICAgICAgICA9IEFORFJPSURfUFJJT1JJVFlfTk9STUFMLAotICAgIFBSSU9SSVRZX0ZPUkVHUk9VTkQgICAgID0gQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5ELAotICAgIFBSSU9SSVRZX0RJU1BMQVkgICAgICAgID0gQU5EUk9JRF9QUklPUklUWV9ESVNQTEFZLAotICAgIFBSSU9SSVRZX1VSR0VOVF9ESVNQTEFZID0gQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfRElTUExBWSwKLSAgICBQUklPUklUWV9BVURJTyAgICAgICAgICA9IEFORFJPSURfUFJJT1JJVFlfQVVESU8sCi0gICAgUFJJT1JJVFlfVVJHRU5UX0FVRElPICAgPSBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTywKLSAgICBQUklPUklUWV9ISUdIRVNUICAgICAgICA9IEFORFJPSURfUFJJT1JJVFlfSElHSEVTVCwKLSAgICBQUklPUklUWV9ERUZBVUxUICAgICAgICA9IEFORFJPSURfUFJJT1JJVFlfREVGQVVMVCwKLSAgICBQUklPUklUWV9NT1JFX0ZBVk9SQUJMRSA9IEFORFJPSURfUFJJT1JJVFlfTU9SRV9GQVZPUkFCTEUsCi0gICAgUFJJT1JJVFlfTEVTU19GQVZPUkFCTEUgPSBBTkRST0lEX1BSSU9SSVRZX0xFU1NfRkFWT1JBQkxFLAotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotI2VuZGlmICAvLyBfX2NwbHVzcGx1cwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotI2VuZGlmIC8vIF9MSUJTX1VUSUxTX1RIUkVBRF9ERUZTX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvVGltZXJzLmggYi9pbmNsdWRlL3V0aWxzL1RpbWVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRkMzIyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvVGltZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaW1lciBmdW5jdGlvbnMuCi0vLwotI2lmbmRlZiBfTElCU19VVElMU19USU1FUlNfSAotI2RlZmluZSBfTElCU19VVElMU19USU1FUlNfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDIEFQSQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXR5cGVkZWYgaW50NjRfdCBuc2Vjc190OyAgICAgICAvLyBuYW5vLXNlY29uZHMKLQotc3RhdGljIGlubGluZSBuc2Vjc190IHNlY29uZHNfdG9fbmFub3NlY29uZHMobnNlY3NfdCBzZWNzKQotewotICAgIHJldHVybiBzZWNzKjEwMDAwMDAwMDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBtaWxsaXNlY29uZHNfdG9fbmFub3NlY29uZHMobnNlY3NfdCBzZWNzKQotewotICAgIHJldHVybiBzZWNzKjEwMDAwMDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBtaWNyb3NlY29uZHNfdG9fbmFub3NlY29uZHMobnNlY3NfdCBzZWNzKQotewotICAgIHJldHVybiBzZWNzKjEwMDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBuYW5vc2Vjb25kc190b19zZWNvbmRzKG5zZWNzX3Qgc2VjcykKLXsKLSAgICByZXR1cm4gc2Vjcy8xMDAwMDAwMDAwOwotfQotCi1zdGF0aWMgaW5saW5lIG5zZWNzX3QgbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKG5zZWNzX3Qgc2VjcykKLXsKLSAgICByZXR1cm4gc2Vjcy8xMDAwMDAwOwotfQotCi1zdGF0aWMgaW5saW5lIG5zZWNzX3QgbmFub3NlY29uZHNfdG9fbWljcm9zZWNvbmRzKG5zZWNzX3Qgc2VjcykKLXsKLSAgICByZXR1cm4gc2Vjcy8xMDAwOwotfQotCi1zdGF0aWMgaW5saW5lIG5zZWNzX3QgczJucyhuc2Vjc190IHYpICB7cmV0dXJuIHNlY29uZHNfdG9fbmFub3NlY29uZHModik7fQotc3RhdGljIGlubGluZSBuc2Vjc190IG1zMm5zKG5zZWNzX3Qgdikge3JldHVybiBtaWxsaXNlY29uZHNfdG9fbmFub3NlY29uZHModik7fQotc3RhdGljIGlubGluZSBuc2Vjc190IHVzMm5zKG5zZWNzX3Qgdikge3JldHVybiBtaWNyb3NlY29uZHNfdG9fbmFub3NlY29uZHModik7fQotc3RhdGljIGlubGluZSBuc2Vjc190IG5zMnMobnNlY3NfdCB2KSAge3JldHVybiBuYW5vc2Vjb25kc190b19zZWNvbmRzKHYpO30KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBuczJtcyhuc2Vjc190IHYpIHtyZXR1cm4gbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHYpO30KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBuczJ1cyhuc2Vjc190IHYpIHtyZXR1cm4gbmFub3NlY29uZHNfdG9fbWljcm9zZWNvbmRzKHYpO30KLQotc3RhdGljIGlubGluZSBuc2Vjc190IHNlY29uZHMobnNlY3NfdCB2KSAgICAgIHsgcmV0dXJuIHMybnModik7IH0KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBtaWxsaXNlY29uZHMobnNlY3NfdCB2KSB7IHJldHVybiBtczJucyh2KTsgfQotc3RhdGljIGlubGluZSBuc2Vjc190IG1pY3Jvc2Vjb25kcyhuc2Vjc190IHYpIHsgcmV0dXJuIHVzMm5zKHYpOyB9Ci0KLWVudW0gewotICAgIFNZU1RFTV9USU1FX1JFQUxUSU1FID0gMCwgIC8vIHN5c3RlbS13aWRlIHJlYWx0aW1lIGNsb2NrCi0gICAgU1lTVEVNX1RJTUVfTU9OT1RPTklDID0gMSwgLy8gbW9ub3RvbmljIHRpbWUgc2luY2UgdW5zcGVjaWZpZWQgc3RhcnRpbmcgcG9pbnQKLSAgICBTWVNURU1fVElNRV9QUk9DRVNTID0gMiwgICAvLyBoaWdoLXJlc29sdXRpb24gcGVyLXByb2Nlc3MgY2xvY2sKLSAgICBTWVNURU1fVElNRV9USFJFQUQgPSAzICAgICAvLyBoaWdoLXJlc29sdXRpb24gcGVyLXRocmVhZCBjbG9jawotfTsKLSAgICAKLS8vIHJldHVybiB0aGUgc3lzdGVtLXRpbWUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgY2xvY2sKLSNpZmRlZiBfX2NwbHVzcGx1cwotbnNlY3NfdCBzeXN0ZW1UaW1lKGludCBjbG9jayA9IFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0jZWxzZQotbnNlY3NfdCBzeXN0ZW1UaW1lKGludCBjbG9jayk7Ci0jZW5kaWYgLy8gZGVmIF9fY3BsdXNwbHVzCi0KLS8qKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJldHdlZW4gdGhlIHJlZmVyZW5jZSB0aW1lIGFuZCB0aGUgdGltZW91dCB0aW1lLgotICogSWYgdGhlIHRpbWVvdXQgaXMgaW4gdGhlIHBhc3QgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZSB0aW1lLCByZXR1cm5zIDAuCi0gKiBJZiB0aGUgdGltZW91dCBpcyBtb3JlIHRoYW4gSU5UX01BWCBtaWxsaXNlY29uZHMgaW4gdGhlIGZ1dHVyZSByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNlIHRpbWUsCi0gKiBzdWNoIGFzIHdoZW4gdGltZW91dFRpbWUgPT0gTExPTkdfTUFYLCByZXR1cm5zIC0xIHRvIGluZGljYXRlIGFuIGluZmluaXRlIHRpbWVvdXQgZGVsYXkuCi0gKiBPdGhlcndpc2UsIHJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVmZXJlbmNlIHRpbWUgYW5kIHRpbWVvdXQgdGltZQotICogcm91bmRlZCB1cCB0byB0aGUgbmV4dCBtaWxsaXNlY29uZC4KLSAqLwotaW50IHRvTWlsbGlzZWNvbmRUaW1lb3V0RGVsYXkobnNlY3NfdCByZWZlcmVuY2VUaW1lLCBuc2Vjc190IHRpbWVvdXRUaW1lKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEMrKyBBUEkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8qCi0gKiBUaW1lIHRoZSBkdXJhdGlvbiBvZiBzb21ldGhpbmcuCi0gKgotICogSW5jbHVkZXMgc29tZSB0aW1ldmFsIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMuCi0gKi8KLWNsYXNzIER1cmF0aW9uVGltZXIgewotcHVibGljOgotICAgIER1cmF0aW9uVGltZXIoKSB7fQotICAgIH5EdXJhdGlvblRpbWVyKCkge30KLQotICAgIC8vIFN0YXJ0IHRoZSB0aW1lci4KLSAgICB2b2lkIHN0YXJ0KCk7Ci0gICAgLy8gU3RvcCB0aGUgdGltZXIuCi0gICAgdm9pZCBzdG9wKCk7Ci0gICAgLy8gR2V0IHRoZSBkdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMuCi0gICAgbG9uZyBsb25nIGR1cmF0aW9uVXNlY3MoKSBjb25zdDsKLQotICAgIC8vIFN1YnRyYWN0IHR3byB0aW1ldmFscy4gIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgKHB0djEtcHR2MikgaW4KLSAgICAvLyBtaWNyb3NlY29uZHMuCi0gICAgc3RhdGljIGxvbmcgbG9uZyBzdWJ0cmFjdFRpbWV2YWxzKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiBwdHYxLAotICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCogcHR2Mik7Ci0KLSAgICAvLyBBZGQgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSB0byB0aGUgdGltZXZhbC4KLSAgICBzdGF0aWMgdm9pZCBhZGRUb1RpbWV2YWwoc3RydWN0IHRpbWV2YWwqIHB0diwgbG9uZyB1c2VjKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgdGltZXZhbCAgbVN0YXJ0V2hlbjsKLSAgICBzdHJ1Y3QgdGltZXZhbCAgbVN0b3BXaGVuOwotfTsKLQotfTsgLy8gYW5kcm9pZAotI2VuZGlmIC8vIGRlZiBfX2NwbHVzcGx1cwotCi0jZW5kaWYgLy8gX0xJQlNfVVRJTFNfVElNRVJTX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvVG9rZW5pemVyLmggYi9pbmNsdWRlL3V0aWxzL1Rva2VuaXplci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2RiNWZiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvVG9rZW5pemVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1VUSUxTX1RPS0VOSVpFUl9ICi0jZGVmaW5lIF9VVElMU19UT0tFTklaRVJfSAotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRmlsZU1hcC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKioKLSAqIEEgc2ltcGxlIHRva2VuaXplciBmb3IgbG9hZGluZyBhbmQgcGFyc2luZyBBU0NJSSB0ZXh0IGZpbGVzIGxpbmUgYnkgbGluZS4KLSAqLwotY2xhc3MgVG9rZW5pemVyIHsKLSAgICBUb2tlbml6ZXIoY29uc3QgU3RyaW5nOCYgZmlsZW5hbWUsIEZpbGVNYXAqIGZpbGVNYXAsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7Ci0KLXB1YmxpYzoKLSAgICB+VG9rZW5pemVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhIGZpbGUgYW5kIG1hcHMgaXQgaW50byBtZW1vcnkuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGFuZCBhIHRva2VuaXplciBmb3IgdGhlIGZpbGUsIGlmIHN1Y2Nlc3NmdWwuCi0gICAgICogT3RoZXJ3aXNlIHJldHVybnMgYW4gZXJyb3IgYW5kIHNldHMgb3V0VG9rZW5pemVyIHRvIE5VTEwuCi0gICAgICovCi0gICAgc3RhdGljIHN0YXR1c190IG9wZW4oY29uc3QgU3RyaW5nOCYgZmlsZW5hbWUsIFRva2VuaXplcioqIG91dFRva2VuaXplcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICAgKi8KLSAgICBpbmxpbmUgYm9vbCBpc0VvZigpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50ID09IGdldEVuZCgpOyB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBvciBlbmQgb2YgdGhlIGZpbGUuCi0gICAgICovCi0gICAgaW5saW5lIGJvb2wgaXNFb2woKSBjb25zdCB7IHJldHVybiBpc0VvZigpIHx8ICptQ3VycmVudCA9PSAnXG4nOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgICAqLwotICAgIGlubGluZSBTdHJpbmc4IGdldEZpbGVuYW1lKCkgY29uc3QgeyByZXR1cm4gbUZpbGVuYW1lOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgMS1iYXNlZCBsaW5lIG51bWJlciBpbmRleCBmb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gICAgICovCi0gICAgaW5saW5lIGludDMyX3QgZ2V0TGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1MaW5lTnVtYmVyOyB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JtYXRzIGEgbG9jYXRpb24gc3RyaW5nIGNvbnNpc3Rpbmcgb2YgdGhlIGZpbGVuYW1lIGFuZCBjdXJyZW50IGxpbmUgbnVtYmVyLgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgbGlrZSAiTXlGaWxlLnR4dDozMyIuCi0gICAgICovCi0gICAgU3RyaW5nOCBnZXRMb2NhdGlvbigpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICAgICAqIFJldHVybnMgbnVsbCBhdCBlbmQgb2YgZmlsZS4KLSAgICAgKi8KLSAgICBpbmxpbmUgY2hhciBwZWVrQ2hhcigpIGNvbnN0IHsgcmV0dXJuIGlzRW9mKCkgPyAnXDAnIDogKm1DdXJyZW50OyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgbGluZSBhcyBhIHN0cmluZywgZXhjbHVkaW5nIHRoZSBuZXdsaW5lIGNoYXJhY3Rlci4KLSAgICAgKi8KLSAgICBTdHJpbmc4IHBlZWtSZW1haW5kZXJPZkxpbmUoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNoYXJhY3RlciBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgYWR2YW5jZXMgcGFzdCBpdC4KLSAgICAgKiBSZXR1cm5zIG51bGwgYXQgZW5kIG9mIGZpbGUuCi0gICAgICovCi0gICAgaW5saW5lIGNoYXIgbmV4dENoYXIoKSB7IHJldHVybiBpc0VvZigpID8gJ1wwJyA6ICoobUN1cnJlbnQrKyk7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG5leHQgdG9rZW4gb24gdGhpcyBsaW5lIHN0b3BwaW5nIGF0IHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVycwotICAgICAqIG9yIHRoZSBlbmQgb2YgdGhlIGxpbmUgd2hpY2hldmVyIGNvbWVzIGZpcnN0IGFuZCBhZHZhbmNlcyBwYXN0IGl0LgotICAgICAqIEFsc28gc3RvcHMgYXQgZW1iZWRkZWQgbnVsbHMuCi0gICAgICogUmV0dXJucyB0aGUgdG9rZW4gb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBhIGRlbGltaXRlcgotICAgICAqIG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuCi0gICAgICovCi0gICAgU3RyaW5nOCBuZXh0VG9rZW4oY29uc3QgY2hhciogZGVsaW1pdGVycyk7Ci0KLSAgICAvKioKLSAgICAgKiBBZHZhbmNlcyB0byB0aGUgbmV4dCBsaW5lLgotICAgICAqIERvZXMgbm90aGluZyBpZiBhbHJlYWR5IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBuZXh0TGluZSgpOwotCi0gICAgLyoqCi0gICAgICogU2tpcHMgb3ZlciB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcnMgaW4gdGhlIGxpbmUuCi0gICAgICogQWxzbyBza2lwcyBlbWJlZGRlZCBudWxscy4KLSAgICAgKi8KLSAgICB2b2lkIHNraXBEZWxpbWl0ZXJzKGNvbnN0IGNoYXIqIGRlbGltaXRlcnMpOwotCi1wcml2YXRlOgotICAgIFRva2VuaXplcihjb25zdCBUb2tlbml6ZXImIG90aGVyKTsgLy8gbm90IGNvcHlhYmxlCi0KLSAgICBTdHJpbmc4IG1GaWxlbmFtZTsKLSAgICBGaWxlTWFwKiBtRmlsZU1hcDsKLSAgICBjaGFyKiBtQnVmZmVyOwotICAgIHNpemVfdCBtTGVuZ3RoOwotCi0gICAgY29uc3QgY2hhciogbUN1cnJlbnQ7Ci0gICAgaW50MzJfdCBtTGluZU51bWJlcjsKLQotICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRFbmQoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyICsgbUxlbmd0aDsgfQotCi19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBfVVRJTFNfVE9LRU5JWkVSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvVHJhY2UuaCBiL2luY2x1ZGUvdXRpbHMvVHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzZGRmNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1RyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9UUkFDRV9ICi0jZGVmaW5lIEFORFJPSURfVFJBQ0VfSAotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLS8vIFRoZSBBVFJBQ0VfVEFHIG1hY3JvIGNhbiBiZSBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgdG8gdHJhY2UKLS8vIHVzaW5nIG9uZSBvZiB0aGUgdGFncyBkZWZpbmVkIGJlbG93LiAgSXQgbXVzdCBiZSBkZWZpbmVkIHRvIG9uZSBvZiB0aGUKLS8vIGZvbGxvd2luZyBBVFJBQ0VfVEFHXyogbWFjcm9zLiAgVGhlIHRyYWNlIHRhZyBpcyB1c2VkIHRvIGZpbHRlciB0cmFjaW5nIGluCi0vLyB1c2VybGFuZCB0byBhdm9pZCBzb21lIG9mIHRoZSBydW50aW1lIGNvc3Qgb2YgdHJhY2luZyB3aGVuIGl0IGlzIG5vdCBkZXNpcmVkLgotLy8KLS8vIERlZmluaW5nIEFUUkFDRV9UQUcgdG8gYmUgQVRSQUNFX1RBR19BTFdBWVMgd2lsbCByZXN1bHQgaW4gdGhlIHRyYWNpbmcgYWx3YXlzCi0vLyBiZWluZyBlbmFibGVkIC0gdGhpcyBzaG91bGQgT05MWSBiZSBkb25lIGZvciBkZWJ1ZyBjb2RlLCBhcyB1c2VybGFuZCB0cmFjaW5nCi0vLyBoYXMgYSBwZXJmb3JtYW5jZSBjb3N0IGV2ZW4gd2hlbiB0aGUgdHJhY2UgaXMgbm90IGJlaW5nIHJlY29yZGVkLiAgRGVmaW5pbmcKLS8vIEFUUkFDRV9UQUcgdG8gYmUgQVRSQUNFX1RBR19ORVZFUiBvciBsZWF2aW5nIEFUUkFDRV9UQUcgdW5kZWZpbmVkIHdpbGwgcmVzdWx0Ci0vLyBpbiB0aGUgdHJhY2luZyBhbHdheXMgYmVpbmcgZGlzYWJsZWQuCi0jZGVmaW5lIEFUUkFDRV9UQUdfTkVWRVIgICAgMCAgICAgICAgICAgLy8gVGhlICJuZXZlciIgdGFnIGlzIG5ldmVyIGVuYWJsZWQuCi0jZGVmaW5lIEFUUkFDRV9UQUdfQUxXQVlTICAgKDE8PDApICAgICAgLy8gVGhlICJhbHdheXMiIHRhZyBpcyBhbHdheXMgZW5hYmxlZC4KLSNkZWZpbmUgQVRSQUNFX1RBR19HUkFQSElDUyAoMTw8MSkKLSNkZWZpbmUgQVRSQUNFX1RBR19MQVNUICAgICAoMTw8MSkKLQotI2RlZmluZSBBVFJBQ0VfVEFHX0lOVkFMSUQgKH4oKEFUUkFDRV9UQUdfTEFTVCAtIDEpIHwgQVRSQUNFX1RBR19MQVNUKSkKLQotI2lmbmRlZiBBVFJBQ0VfVEFHCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19ORVZFUgotI2VsaWYgQVRSQUNFX1RBRyA+IEFUUkFDRV9UQUdfTEFTVAotI2Vycm9yIEFUUkFDRV9UQUcgbXVzdCBiZSBkZWZpbmVkIHRvIGJlIG9uZSBvZiB0aGUgdGFncyBkZWZpbmVkIGluIHV0aWxzL1RyYWNlLmgKLSNlbmRpZgotCi0vLyBBVFJBQ0VfQ0FMTCB0cmFjZXMgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVG8gdHJhY2UKLS8vIHRoZSBjb3JyZWN0IHN0YXJ0IGFuZCBlbmQgdGltZXMgdGhpcyBtYWNybyBzaG91bGQgYmUgdGhlIGZpcnN0IGxpbmUgb2YgdGhlCi0vLyBmdW5jdGlvbiBib2R5LgotI2RlZmluZSBBVFJBQ0VfQ0FMTCgpIGFuZHJvaWQ6OlNjb3BlZFRyYWNlIF9fX3RyYWNlcihBVFJBQ0VfVEFHLCBfX0ZVTkNUSU9OX18pCi0KLS8vIEFUUkFDRV9JTlQgdHJhY2VzIGEgbmFtZWQgaW50ZWdlciB2YWx1ZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gdHJhY2sgaG93IHRoZQotLy8gdmFsdWUgY2hhbmdlcyBvdmVyIHRpbWUgaW4gYSB0cmFjZS4KLSNkZWZpbmUgQVRSQUNFX0lOVChuYW1lLCB2YWx1ZSkgYW5kcm9pZDo6VHJhY2VyOjp0cmFjZUNvdW50ZXIoQVRSQUNFX1RBRywgbmFtZSwgdmFsdWUpCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgVHJhY2VyIHsKLQotcHVibGljOgotCi0gICAgc3RhdGljIGlubGluZSB2b2lkIHRyYWNlQ291bnRlcih1aW50NjRfdCB0YWcsIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICBpbnQzMl90IHZhbHVlKSB7Ci0gICAgICAgIGlmICghYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZzSXNSZWFkeSkpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgdHJhY2VGRCA9IHNUcmFjZUZEOwotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodGFnRW5hYmxlZCh0YWcpICYmIHRyYWNlRkQgIT0gLTEpKSB7Ci0gICAgICAgICAgICBjaGFyIGJ1ZlsxMDI0XTsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgMTAyNCwgIkN8JWR8JXN8JWQiLCBnZXRwaWQoKSwgbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgd3JpdGUodHJhY2VGRCwgYnVmLCBzdHJsZW4oYnVmKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhY2VCZWdpbih1aW50NjRfdCB0YWcsIGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICAgICAgaWYgKENDX1VOTElLRUxZKCFhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJnNJc1JlYWR5KSkpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgdHJhY2VGRCA9IHNUcmFjZUZEOwotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodGFnRW5hYmxlZCh0YWcpICYmICh0cmFjZUZEICE9IC0xKSkpIHsKLSAgICAgICAgICAgIGNoYXIgYnVmWzEwMjRdOwotICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHNucHJpbnRmKGJ1ZiwgMTAyNCwgIkJ8JWR8JXMiLCBnZXRwaWQoKSwgbmFtZSk7Ci0gICAgICAgICAgICB3cml0ZSh0cmFjZUZELCBidWYsIGxlbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZUVuZCh1aW50NjRfdCB0YWcpIHsKLSAgICAgICAgaWYgKENDX1VOTElLRUxZKCFhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJnNJc1JlYWR5KSkpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgdHJhY2VGRCA9IHNUcmFjZUZEOwotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodGFnRW5hYmxlZCh0YWcpICYmICh0cmFjZUZEICE9IC0xKSkpIHsKLSAgICAgICAgICAgIGNoYXIgYnVmID0gJ0UnOwotICAgICAgICAgICAgd3JpdGUodHJhY2VGRCwgJmJ1ZiwgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXByaXZhdGU6Ci0KLSAgICBzdGF0aWMgaW5saW5lIGJvb2wgdGFnRW5hYmxlZCh1aW50NjRfdCB0YWcpIHsKLSAgICAgICAgcmV0dXJuICEodGFnICYgQVRSQUNFX1RBR19JTlZBTElEKSAmJiAodGFnICYgc0VuYWJsZWRUYWdzKTsKLSAgICB9Ci0KLSAgICAvLyBpbml0IG9wZW5zIHRoZSB0cmFjZSBtYXJrZXIgZmlsZSBmb3Igd3JpdGluZyBhbmQgcmVhZHMgdGhlCi0gICAgLy8gYXRyYWNlLnRhZ3MuZW5hYmxlZmxhZ3Mgc3lzdGVtIHByb3BlcnR5LiAgSXQgZG9lcyB0aGlzIG9ubHkgdGhlIGZpcnN0Ci0gICAgLy8gdGltZSBpdCBpcyBydW4sIHVzaW5nIHNNdXRleCBmb3Igc3luY2hyb25pemF0aW9uLgotICAgIHN0YXRpYyB2b2lkIGluaXQoKTsKLQotICAgIC8vIHNJc1JlYWR5IGlzIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBjYWxsIHRvIGluaXQoKSBoYXMKLSAgICAvLyBjb21wbGV0ZWQgaW4gdGhpcyBwcm9jZXNzLiAgSXQgaXMgaW5pdGlhbGl6ZWQgdG8gMCBhbmQgc2V0IHRvIDEgd2hlbiB0aGUKLSAgICAvLyBmaXJzdCBpbml0KCkgY2FsbCBjb21wbGV0ZXMuICBJdCBpcyBzZXQgdG8gMSBldmVuIGlmIGEgZmFpbHVyZSBvY2N1cnJlZAotICAgIC8vIGluIGluaXQgKGUuZy4gdGhlIHRyYWNlIG1hcmtlciBmaWxlIGNvdWxkbid0IGJlIG9wZW5lZCkuCi0gICAgLy8KLSAgICAvLyBUaGlzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGFsbCB0cmFjaW5nIGZ1bmN0aW9ucyB1c2luZyBhbiBhdG9taWMgYWNxdWlyZQotICAgIC8vIGxvYWQgb3BlcmF0aW9uIGJlZm9yZSBjYWxsaW5nIGluaXQoKS4gIFRoaXMgY2hlY2sgYXZvaWRzIHRoZSBuZWVkIHRvIGxvY2sKLSAgICAvLyBhIG11dGV4IGVhY2ggdGltZSBhIHRyYWNlIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgotICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IHNJc1JlYWR5OwotCi0gICAgLy8gc1RyYWNlRkQgaXMgdGhlIGZpbGUgZGVzY3JpcHRvciB1c2VkIHRvIHdyaXRlIHRvIHRoZSBrZXJuZWwncyB0cmFjZQotICAgIC8vIGJ1ZmZlci4gIEl0IGlzIGluaXRpYWxpemVkIHRvIC0xIGFuZCBzZXQgdG8gYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgaW4KLSAgICAvLyBpbml0KCkgd2hpbGUgYSBsb2NrIG9uIHNNdXRleCBpcyBoZWxkLgotICAgIC8vCi0gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGEgdHJhY2UgZnVuY3Rpb24gYWZ0ZXIgaW5pdCgpIGhhcwotICAgIC8vIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCi0gICAgc3RhdGljIGludCBzVHJhY2VGRDsKLQotICAgIC8vIHNFbmFibGVkVGFncyBpcyB0aGUgc2V0IG9mIHRhZyBiaXRzIGZvciB3aGljaCB0cmFjaW5nIGlzIGN1cnJlbnRseQotICAgIC8vIGVuYWJsZWQuICBJdCBpcyBpbml0aWFsaXplZCB0byAwIGFuZCBzZXQgYmFzZWQgb24gdGhlCi0gICAgLy8gYXRyYWNlLnRhZ3MuZW5hYmxlZmxhZ3Mgc3lzdGVtIHByb3BlcnR5IGluIGluaXQoKSB3aGlsZSBhIGxvY2sgb24gc011dGV4Ci0gICAgLy8gaXMgaGVsZC4KLSAgICAvLwotICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBhIHRyYWNlIGZ1bmN0aW9uIGFmdGVyIGluaXQoKSBoYXMKLSAgICAvLyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLgotICAgIHN0YXRpYyB1aW50NjRfdCBzRW5hYmxlZFRhZ3M7Ci0KLSAgICAvLyBzTXV0ZXggaXMgdXNlZCB0byBwcm90ZWN0IHRoZSBleGVjdXRpb24gb2YgaW5pdCgpLgotICAgIHN0YXRpYyBNdXRleCBzTXV0ZXg7Ci19OwotCi1jbGFzcyBTY29wZWRUcmFjZSB7Ci0KLXB1YmxpYzoKLSAgICBpbmxpbmUgU2NvcGVkVHJhY2UodWludDY0X3QgdGFnLCBjb25zdCBjaGFyKiBuYW1lKSA6Ci0gICAgICAgICAgICBtVGFnKHRhZykgewotICAgICAgICBUcmFjZXI6OnRyYWNlQmVnaW4obVRhZywgbmFtZSk7Ci0gICAgfQotCi0gICAgaW5saW5lIH5TY29wZWRUcmFjZSgpIHsKLSAgICAgICAgVHJhY2VyOjp0cmFjZUVuZChtVGFnKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0KLSAgICB1aW50NjRfdCBtVGFnOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfVFJBQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIGIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjJjMmQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1RZUEVfSEVMUEVSU19ICi0jZGVmaW5lIEFORFJPSURfVFlQRV9IRUxQRVJTX0gKLQotI2luY2x1ZGUgPG5ldz4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoKLSAqIFR5cGVzIHRyYWl0cwotICovCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRfdHJpdmlhbF9jdG9yIHsgZW51bSB7IHZhbHVlID0gZmFsc2UgfTsgfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRfdHJpdmlhbF9kdG9yIHsgZW51bSB7IHZhbHVlID0gZmFsc2UgfTsgfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRfdHJpdmlhbF9jb3B5IHsgZW51bSB7IHZhbHVlID0gZmFsc2UgfTsgfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRfdHJpdmlhbF9tb3ZlIHsgZW51bSB7IHZhbHVlID0gZmFsc2UgfTsgfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRfcG9pbnRlciAgICAgIHsgZW51bSB7IHZhbHVlID0gZmFsc2UgfTsgfTsgICAgCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHRyYWl0X3BvaW50ZXI8VCo+ICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+Ci1zdHJ1Y3QgdHJhaXRzIHsKLSAgICBlbnVtIHsKLSAgICAgICAgLy8gd2hldGhlciB0aGlzIHR5cGUgaXMgYSBwb2ludGVyCi0gICAgICAgIGlzX3BvaW50ZXIgICAgICAgICAgPSB0cmFpdF9wb2ludGVyPFRZUEU+Ojp2YWx1ZSwKLSAgICAgICAgLy8gd2hldGhlciB0aGlzIHR5cGUncyBjb25zdHJ1Y3RvciBpcyBhIG5vLW9wCi0gICAgICAgIGhhc190cml2aWFsX2N0b3IgICAgPSBpc19wb2ludGVyIHx8IHRyYWl0X3RyaXZpYWxfY3RvcjxUWVBFPjo6dmFsdWUsCi0gICAgICAgIC8vIHdoZXRoZXIgdGhpcyB0eXBlJ3MgZGVzdHJ1Y3RvciBpcyBhIG5vLW9wCi0gICAgICAgIGhhc190cml2aWFsX2R0b3IgICAgPSBpc19wb2ludGVyIHx8IHRyYWl0X3RyaXZpYWxfZHRvcjxUWVBFPjo6dmFsdWUsCi0gICAgICAgIC8vIHdoZXRoZXIgdGhpcyB0eXBlIHR5cGUgY2FuIGJlIGNvcHktY29uc3RydWN0ZWQgd2l0aCBtZW1jcHkKLSAgICAgICAgaGFzX3RyaXZpYWxfY29weSAgICA9IGlzX3BvaW50ZXIgfHwgdHJhaXRfdHJpdmlhbF9jb3B5PFRZUEU+Ojp2YWx1ZSwKLSAgICAgICAgLy8gd2hldGhlciB0aGlzIHR5cGUgY2FuIGJlIG1vdmVkIHdpdGggbWVtbW92ZQotICAgICAgICBoYXNfdHJpdmlhbF9tb3ZlICAgID0gaXNfcG9pbnRlciB8fCB0cmFpdF90cml2aWFsX21vdmU8VFlQRT46OnZhbHVlCi0gICAgfTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotc3RydWN0IGFnZ3JlZ2F0ZV90cmFpdHMgewotICAgIGVudW0gewotICAgICAgICBpc19wb2ludGVyICAgICAgICAgID0gZmFsc2UsCi0gICAgICAgIGhhc190cml2aWFsX2N0b3IgICAgPSAKLSAgICAgICAgICAgIHRyYWl0czxUPjo6aGFzX3RyaXZpYWxfY3RvciAmJiB0cmFpdHM8VT46Omhhc190cml2aWFsX2N0b3IsCi0gICAgICAgIGhhc190cml2aWFsX2R0b3IgICAgPSAKLSAgICAgICAgICAgIHRyYWl0czxUPjo6aGFzX3RyaXZpYWxfZHRvciAmJiB0cmFpdHM8VT46Omhhc190cml2aWFsX2R0b3IsCi0gICAgICAgIGhhc190cml2aWFsX2NvcHkgICAgPSAKLSAgICAgICAgICAgIHRyYWl0czxUPjo6aGFzX3RyaXZpYWxfY29weSAmJiB0cmFpdHM8VT46Omhhc190cml2aWFsX2NvcHksCi0gICAgICAgIGhhc190cml2aWFsX21vdmUgICAgPSAKLSAgICAgICAgICAgIHRyYWl0czxUPjo6aGFzX3RyaXZpYWxfbW92ZSAmJiB0cmFpdHM8VT46Omhhc190cml2aWFsX21vdmUKLSAgICB9OwotfTsKLQotI2RlZmluZSBBTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW1wbGF0ZTw+IHN0cnVjdCB0cmFpdF90cml2aWFsX2N0b3I8IFQgPiAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OyBcCi0gICAgdGVtcGxhdGU8PiBzdHJ1Y3QgdHJhaXRfdHJpdmlhbF9kdG9yPCBUID4gICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsgXAotICAgIHRlbXBsYXRlPD4gc3RydWN0IHRyYWl0X3RyaXZpYWxfY29weTwgVCA+ICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07IFwKLSAgICB0ZW1wbGF0ZTw+IHN0cnVjdCB0cmFpdF90cml2aWFsX21vdmU8IFQgPiAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoKLSAqIGJhc2ljIHR5cGVzIHRyYWl0cwotICovCi0KLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCB2b2lkICkKLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBib29sICkKLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBjaGFyICkKLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCB1bnNpZ25lZCBjaGFyICkKLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBzaG9ydCApCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggdW5zaWduZWQgc2hvcnQgKQotQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIGludCApCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggdW5zaWduZWQgaW50ICkKLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBsb25nICkKLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCB1bnNpZ25lZCBsb25nICkKLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBsb25nIGxvbmcgKQotQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIHVuc2lnbmVkIGxvbmcgbG9uZyApCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggZmxvYXQgKQotQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIGRvdWJsZSApCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLS8qCi0gKiBjb21wYXJlIGFuZCBvcmRlciB0eXBlcwotICovCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IGlubGluZQotaW50IHN0cmljdGx5X29yZGVyX3R5cGUoY29uc3QgVFlQRSYgbGhzLCBjb25zdCBUWVBFJiByaHMpIHsKLSAgICByZXR1cm4gKGxocyA8IHJocykgPyAxIDogMDsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCi1pbnQgY29tcGFyZV90eXBlKGNvbnN0IFRZUEUmIGxocywgY29uc3QgVFlQRSYgcmhzKSB7Ci0gICAgcmV0dXJuIHN0cmljdGx5X29yZGVyX3R5cGUocmhzLCBsaHMpIC0gc3RyaWN0bHlfb3JkZXJfdHlwZShsaHMsIHJocyk7Ci19Ci0KLS8qCi0gKiBjcmVhdGUsIGRlc3Ryb3ksIGNvcHkgYW5kIG1vdmUgdHlwZXMuLi4KLSAqLwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKLXZvaWQgY29uc3RydWN0X3R5cGUoVFlQRSogcCwgc2l6ZV90IG4pIHsKLSAgICBpZiAoIXRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY3RvcikgewotICAgICAgICB3aGlsZSAobi0tKSB7Ci0gICAgICAgICAgICBuZXcocCsrKSBUWVBFOwotICAgICAgICB9Ci0gICAgfQotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKLXZvaWQgZGVzdHJveV90eXBlKFRZUEUqIHAsIHNpemVfdCBuKSB7Ci0gICAgaWYgKCF0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2R0b3IpIHsKLSAgICAgICAgd2hpbGUgKG4tLSkgewotICAgICAgICAgICAgcC0+flRZUEUoKTsKLSAgICAgICAgICAgIHArKzsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCi12b2lkIGNvcHlfdHlwZShUWVBFKiBkLCBjb25zdCBUWVBFKiBzLCBzaXplX3QgbikgewotICAgIGlmICghdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9jb3B5KSB7Ci0gICAgICAgIHdoaWxlIChuLS0pIHsKLSAgICAgICAgICAgIG5ldyhkKSBUWVBFKCpzKTsKLSAgICAgICAgICAgIGQrKywgcysrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWVtY3B5KGQscyxuKnNpemVvZihUWVBFKSk7Ci0gICAgfQotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKLXZvaWQgc3BsYXRfdHlwZShUWVBFKiB3aGVyZSwgY29uc3QgVFlQRSogd2hhdCwgc2l6ZV90IG4pIHsKLSAgICBpZiAoIXRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY29weSkgewotICAgICAgICB3aGlsZSAobi0tKSB7Ci0gICAgICAgICAgICBuZXcod2hlcmUpIFRZUEUoKndoYXQpOwotICAgICAgICAgICAgd2hlcmUrKzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdoaWxlIChuLS0pIHsKLSAgICAgICAgICAgICp3aGVyZSsrID0gKndoYXQ7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IGlubGluZQotdm9pZCBtb3ZlX2ZvcndhcmRfdHlwZShUWVBFKiBkLCBjb25zdCBUWVBFKiBzLCBzaXplX3QgbiA9IDEpIHsKLSAgICBpZiAoKHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfZHRvciAmJiB0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2NvcHkpIAotICAgICAgICAgICAgfHwgdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9tb3ZlKSAKLSAgICB7Ci0gICAgICAgIG1lbW1vdmUoZCxzLG4qc2l6ZW9mKFRZUEUpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBkICs9IG47Ci0gICAgICAgIHMgKz0gbjsKLSAgICAgICAgd2hpbGUgKG4tLSkgewotICAgICAgICAgICAgLS1kLCAtLXM7Ci0gICAgICAgICAgICBpZiAoIXRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY29weSkgewotICAgICAgICAgICAgICAgIG5ldyhkKSBUWVBFKCpzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmQgPSAqczsgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9kdG9yKSB7Ci0gICAgICAgICAgICAgICAgcy0+flRZUEUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCi12b2lkIG1vdmVfYmFja3dhcmRfdHlwZShUWVBFKiBkLCBjb25zdCBUWVBFKiBzLCBzaXplX3QgbiA9IDEpIHsKLSAgICBpZiAoKHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfZHRvciAmJiB0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2NvcHkpIAotICAgICAgICAgICAgfHwgdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9tb3ZlKSAKLSAgICB7Ci0gICAgICAgIG1lbW1vdmUoZCxzLG4qc2l6ZW9mKFRZUEUpKTsKLSAgICB9IGVsc2UgewotICAgICAgICB3aGlsZSAobi0tKSB7Ci0gICAgICAgICAgICBpZiAoIXRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY29weSkgewotICAgICAgICAgICAgICAgIG5ldyhkKSBUWVBFKCpzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmQgPSAqczsgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9kdG9yKSB7Ci0gICAgICAgICAgICAgICAgcy0+flRZUEUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGQrKywgcysrOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoKLSAqIGEga2V5L3ZhbHVlIHBhaXIKLSAqLwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4KLXN0cnVjdCBrZXlfdmFsdWVfcGFpcl90IHsKLSAgICB0eXBlZGVmIEtFWSBrZXlfdDsKLSAgICB0eXBlZGVmIFZBTFVFIHZhbHVlX3Q7Ci0KLSAgICBLRVkgICAgIGtleTsKLSAgICBWQUxVRSAgIHZhbHVlOwotICAgIGtleV92YWx1ZV9wYWlyX3QoKSB7IH0KLSAgICBrZXlfdmFsdWVfcGFpcl90KGNvbnN0IGtleV92YWx1ZV9wYWlyX3QmIG8pIDoga2V5KG8ua2V5KSwgdmFsdWUoby52YWx1ZSkgeyB9Ci0gICAga2V5X3ZhbHVlX3BhaXJfdChjb25zdCBLRVkmIGssIGNvbnN0IFZBTFVFJiB2KSA6IGtleShrKSwgdmFsdWUodikgIHsgfQotICAgIGtleV92YWx1ZV9wYWlyX3QoY29uc3QgS0VZJiBrKSA6IGtleShrKSB7IH0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA8IChjb25zdCBrZXlfdmFsdWVfcGFpcl90JiBvKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBzdHJpY3RseV9vcmRlcl90eXBlKGtleSwgby5rZXkpOwotICAgIH0KLSAgICBpbmxpbmUgY29uc3QgS0VZJiBnZXRLZXkoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotICAgIGlubGluZSBjb25zdCBWQUxVRSYgZ2V0VmFsdWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLXN0cnVjdCB0cmFpdF90cml2aWFsX2N0b3I8IGtleV92YWx1ZV9wYWlyX3Q8SywgVj4gPgoteyBlbnVtIHsgdmFsdWUgPSBhZ2dyZWdhdGVfdHJhaXRzPEssVj46Omhhc190cml2aWFsX2N0b3IgfTsgfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotc3RydWN0IHRyYWl0X3RyaXZpYWxfZHRvcjwga2V5X3ZhbHVlX3BhaXJfdDxLLCBWPiA+Ci17IGVudW0geyB2YWx1ZSA9IGFnZ3JlZ2F0ZV90cmFpdHM8SyxWPjo6aGFzX3RyaXZpYWxfZHRvciB9OyB9OwotdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1zdHJ1Y3QgdHJhaXRfdHJpdmlhbF9jb3B5PCBrZXlfdmFsdWVfcGFpcl90PEssIFY+ID4KLXsgZW51bSB7IHZhbHVlID0gYWdncmVnYXRlX3RyYWl0czxLLFY+OjpoYXNfdHJpdmlhbF9jb3B5IH07IH07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLXN0cnVjdCB0cmFpdF90cml2aWFsX21vdmU8IGtleV92YWx1ZV9wYWlyX3Q8SywgVj4gPgoteyBlbnVtIHsgdmFsdWUgPSBhZ2dyZWdhdGVfdHJhaXRzPEssVj46Omhhc190cml2aWFsX21vdmUgfTsgfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gKiBIYXNoIGNvZGVzLgotICovCi10eXBlZGVmIHVpbnQzMl90IGhhc2hfdDsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRLZXk+Ci1oYXNoX3QgaGFzaF90eXBlKGNvbnN0IFRLZXkmIGtleSk7Ci0KLS8qIEJ1aWx0LWluIGhhc2ggY29kZSBzcGVjaWFsaXphdGlvbnMuCi0gKiBBc3N1bWVzIHBvaW50ZXJzIGFyZSAzMmJpdC4gKi8KLSNkZWZpbmUgQU5EUk9JRF9JTlQzMl9IQVNIKFQpIFwKLSAgICAgICAgdGVtcGxhdGUgPD4gaW5saW5lIGhhc2hfdCBoYXNoX3R5cGUoY29uc3QgVCYgdmFsdWUpIHsgcmV0dXJuIGhhc2hfdCh2YWx1ZSk7IH0KLSNkZWZpbmUgQU5EUk9JRF9JTlQ2NF9IQVNIKFQpIFwKLSAgICAgICAgdGVtcGxhdGUgPD4gaW5saW5lIGhhc2hfdCBoYXNoX3R5cGUoY29uc3QgVCYgdmFsdWUpIHsgXAotICAgICAgICAgICAgICAgIHJldHVybiBoYXNoX3QoKHZhbHVlID4+IDMyKSBeIHZhbHVlKTsgfQotI2RlZmluZSBBTkRST0lEX1JFSU5URVJQUkVUX0hBU0goVCwgUikgXAotICAgICAgICB0ZW1wbGF0ZSA8PiBpbmxpbmUgaGFzaF90IGhhc2hfdHlwZShjb25zdCBUJiB2YWx1ZSkgeyBcCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hfdHlwZSgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSKj4oJnZhbHVlKSk7IH0KLQotQU5EUk9JRF9JTlQzMl9IQVNIKGJvb2wpCi1BTkRST0lEX0lOVDMyX0hBU0goaW50OF90KQotQU5EUk9JRF9JTlQzMl9IQVNIKHVpbnQ4X3QpCi1BTkRST0lEX0lOVDMyX0hBU0goaW50MTZfdCkKLUFORFJPSURfSU5UMzJfSEFTSCh1aW50MTZfdCkKLUFORFJPSURfSU5UMzJfSEFTSChpbnQzMl90KQotQU5EUk9JRF9JTlQzMl9IQVNIKHVpbnQzMl90KQotQU5EUk9JRF9JTlQ2NF9IQVNIKGludDY0X3QpCi1BTkRST0lEX0lOVDY0X0hBU0godWludDY0X3QpCi1BTkRST0lEX1JFSU5URVJQUkVUX0hBU0goZmxvYXQsIHVpbnQzMl90KQotQU5EUk9JRF9SRUlOVEVSUFJFVF9IQVNIKGRvdWJsZSwgdWludDY0X3QpCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbmxpbmUgaGFzaF90IGhhc2hfdHlwZShjb25zdCBUKiYgdmFsdWUpIHsKLSAgICByZXR1cm4gaGFzaF90eXBlKHVpbnRwdHJfdCh2YWx1ZSkpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfVFlQRV9IRUxQRVJTX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIGIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNzM1MzMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9VTklDT0RFX0gKLSNkZWZpbmUgQU5EUk9JRF9VTklDT0RFX0gKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1leHRlcm4gIkMiIHsKLQotdHlwZWRlZiB1aW50MzJfdCBjaGFyMzJfdDsKLXR5cGVkZWYgdWludDE2X3QgY2hhcjE2X3Q7Ci0KLS8vIFN0YW5kYXJkIHN0cmluZyBmdW5jdGlvbnMgb24gY2hhcjE2X3Qgc3RyaW5ncy4KLWludCBzdHJjbXAxNihjb25zdCBjaGFyMTZfdCAqLCBjb25zdCBjaGFyMTZfdCAqKTsKLWludCBzdHJuY21wMTYoY29uc3QgY2hhcjE2X3QgKnMxLCBjb25zdCBjaGFyMTZfdCAqczIsIHNpemVfdCBuKTsKLXNpemVfdCBzdHJsZW4xNihjb25zdCBjaGFyMTZfdCAqKTsKLXNpemVfdCBzdHJubGVuMTYoY29uc3QgY2hhcjE2X3QgKiwgc2l6ZV90KTsKLWNoYXIxNl90ICpzdHJjcHkxNihjaGFyMTZfdCAqLCBjb25zdCBjaGFyMTZfdCAqKTsKLWNoYXIxNl90ICpzdHJuY3B5MTYoY2hhcjE2X3QgKiwgY29uc3QgY2hhcjE2X3QgKiwgc2l6ZV90KTsKLQotLy8gVmVyc2lvbiBvZiBjb21wYXJpc29uIHRoYXQgc3VwcG9ydHMgZW1iZWRkZWQgbnVsbHMuCi0vLyBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHN0cm5jbXAoKSBiZWNhdXNlIHdlIGRvbid0IHN0b3AKLS8vIGF0IGEgbnVsIGNoYXJhY3RlciBhbmQgY29uc2lkZXIgdGhlIHN0cmluZ3MgdG8gYmUgZGlmZmVyZW50Ci0vLyBpZiB0aGUgbGVuZ3RocyBhcmUgZGlmZmVyZW50ICh0aHVzIHdlIG5lZWQgdG8gc3VwcGx5IHRoZQotLy8gbGVuZ3RocyBvZiBib3RoIHN0cmluZ3MpLiAgVGhpcyBjYW4gYWxzbyBiZSB1c2VkIHdoZW4KLS8vIHlvdXIgc3RyaW5nIGlzIG5vdCBudWwtdGVybWluYXRlZCBhcyBpdCB3aWxsIGhhdmUgdGhlCi0vLyBlcXVpdmFsZW50IHJlc3VsdCBhcyBzdHJjbXAxNiAodW5saWtlIHN0cm5jbXAxNikuCi1pbnQgc3RyemNtcDE2KGNvbnN0IGNoYXIxNl90ICpzMSwgc2l6ZV90IG4xLCBjb25zdCBjaGFyMTZfdCAqczIsIHNpemVfdCBuMik7Ci0KLS8vIFZlcnNpb24gb2Ygc3RyemNtcDE2IGZvciBjb21wYXJpbmcgc3RyaW5ncyBpbiBkaWZmZXJlbnQgZW5kaWFubmVzcy4KLWludCBzdHJ6Y21wMTZfaF9uKGNvbnN0IGNoYXIxNl90ICpzMUgsIHNpemVfdCBuMSwgY29uc3QgY2hhcjE2X3QgKnMyTiwgc2l6ZV90IG4yKTsKLQotLy8gU3RhbmRhcmQgc3RyaW5nIGZ1bmN0aW9ucyBvbiBjaGFyMzJfdCBzdHJpbmdzLgotc2l6ZV90IHN0cmxlbjMyKGNvbnN0IGNoYXIzMl90ICopOwotc2l6ZV90IHN0cm5sZW4zMihjb25zdCBjaGFyMzJfdCAqLCBzaXplX3QpOwotCi0vKioKLSAqIE1lYXN1cmUgdGhlIGxlbmd0aCBvZiBhIFVURi0zMiBzdHJpbmcgaW4gVVRGLTguIElmIHRoZSBzdHJpbmcgaXMgaW52YWxpZAotICogc3VjaCBhcyBjb250YWluaW5nIGEgc3Vycm9nYXRlIGNoYXJhY3RlciwgLTEgd2lsbCBiZSByZXR1cm5lZC4KLSAqLwotc3NpemVfdCB1dGYzMl90b191dGY4X2xlbmd0aChjb25zdCBjaGFyMzJfdCAqc3JjLCBzaXplX3Qgc3JjX2xlbik7Ci0KLS8qKgotICogU3RvcmVzIGEgVVRGLTggc3RyaW5nIGNvbnZlcnRlZCBmcm9tICJzcmMiIGluICJkc3QiLCBpZiAiZHN0X2xlbmd0aCIgaXMgbm90Ci0gKiBsYXJnZSBlbm91Z2ggdG8gc3RvcmUgdGhlIHN0cmluZywgdGhlIHBhcnQgb2YgdGhlICJzcmMiIHN0cmluZyBpcyBzdG9yZWQKLSAqIGludG8gImRzdCIgYXMgbXVjaCBhcyBwb3NzaWJsZS4gU2VlIHRoZSBleGFtcGxlcyBmb3IgbW9yZSBkZXRhaWwuCi0gKiBSZXR1cm5zIHRoZSBzaXplIGFjdHVhbGx5IHVzZWQgZm9yIHN0b3JpbmcgdGhlIHN0cmluZy4KLSAqIGRzdCIgaXMgbm90IG51bGwtdGVybWluYXRlZCB3aGVuIGRzdF9sZW4gaXMgZnVsbHkgdXNlZCAobGlrZSBzdHJuY3B5KS4KLSAqCi0gKiBFeGFtcGxlIDEKLSAqICJzcmMiID09IFx1MzA0Mlx1MzA0NCAoXHhFM1x4ODFceDgyXHhFM1x4ODFceDg0KQotICogInNyY19sZW4iID09IDIKLSAqICJkc3RfbGVuIiA+PSA3Ci0gKiAtPgotICogUmV0dXJuZWQgdmFsdWUgPT0gNgotICogImRzdCIgYmVjb21lcyBceEUzXHg4MVx4ODJceEUzXHg4MVx4ODRcMAotICogKG5vdGUgdGhhdCAiZHN0IiBpcyBudWxsLXRlcm1pbmF0ZWQpCi0gKgotICogRXhhbXBsZSAyCi0gKiAic3JjIiA9PSBcdTMwNDJcdTMwNDQgKFx4RTNceDgxXHg4Mlx4RTNceDgxXHg4NCkKLSAqICJzcmNfbGVuIiA9PSAyCi0gKiAiZHN0X2xlbiIgPT0gNQotICogLT4KLSAqIFJldHVybmVkIHZhbHVlID09IDMKLSAqICJkc3QiIGJlY29tZXMgXHhFM1x4ODFceDgyXDAKLSAqIChub3RlIHRoYXQgImRzdCIgaXMgbnVsbC10ZXJtaW5hdGVkLCBidXQgXHUzMDQ0IGlzIG5vdCBzdG9yZWQgaW4gImRzdCIKLSAqIHNpbmNlICJkc3QiIGRvZXMgbm90IGhhdmUgZW5vdWdoIHNpemUgdG8gc3RvcmUgdGhlIGNoYXJhY3RlcikKLSAqCi0gKiBFeGFtcGxlIDMKLSAqICJzcmMiID09IFx1MzA0Mlx1MzA0NCAoXHhFM1x4ODFceDgyXHhFM1x4ODFceDg0KQotICogInNyY19sZW4iID09IDIKLSAqICJkc3RfbGVuIiA9PSA2Ci0gKiAtPgotICogUmV0dXJuZWQgdmFsdWUgPT0gNgotICogImRzdCIgYmVjb21lcyBceEUzXHg4MVx4ODJceEUzXHg4MVx4ODQKLSAqIChub3RlIHRoYXQgImRzdCIgaXMgTk9UIG51bGwtdGVybWluYXRlZCwgbGlrZSBzdHJuY3B5KQotICovCi12b2lkIHV0ZjMyX3RvX3V0ZjgoY29uc3QgY2hhcjMyX3QqIHNyYywgc2l6ZV90IHNyY19sZW4sIGNoYXIqIGRzdCk7Ci0KLS8qKgotICogUmV0dXJucyB0aGUgdW5pY29kZSB2YWx1ZSBhdCAiaW5kZXgiLgotICogUmV0dXJucyAtMSB3aGVuIHRoZSBpbmRleCBpcyBpbnZhbGlkIChlcXVhbHMgdG8gb3IgbW9yZSB0aGFuICJzcmNfbGVuIikuCi0gKiBJZiByZXR1cm5lZCB2YWx1ZSBpcyBwb3NpdGl2ZSwgaXQgaXMgYWJsZSB0byBiZSBjb252ZXJ0ZWQgdG8gY2hhcjMyX3QsIHdoaWNoCi0gKiBpcyB1bnNpZ25lZC4gVGhlbiwgaWYgIm5leHRfaW5kZXgiIGlzIG5vdCBOVUxMLCB0aGUgbmV4dCBpbmRleCB0byBiZSB1c2VkIGlzCi0gKiBzdG9yZWQgaW4gIm5leHRfaW5kZXgiLiAibmV4dF9pbmRleCIgY2FuIGJlIE5VTEwuCi0gKi8KLWludDMyX3QgdXRmMzJfZnJvbV91dGY4X2F0KGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNyY19sZW4sIHNpemVfdCBpbmRleCwgc2l6ZV90ICpuZXh0X2luZGV4KTsKLQotCi0vKioKLSAqIFJldHVybnMgdGhlIFVURi04IGxlbmd0aCBvZiBVVEYtMTYgc3RyaW5nICJzcmMiLgotICovCi1zc2l6ZV90IHV0ZjE2X3RvX3V0ZjhfbGVuZ3RoKGNvbnN0IGNoYXIxNl90ICpzcmMsIHNpemVfdCBzcmNfbGVuKTsKLQotLyoqCi0gKiBDb252ZXJ0cyBhIFVURi0xNiBzdHJpbmcgdG8gVVRGLTguIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIgbXVzdCBiZSBsYXJnZQotICogZW5vdWdoIHRvIGZpdCB0aGUgVVRGLTE2IGFzIG1lYXN1cmVkIGJ5IHV0ZjE2X3RvX3V0ZjhfbGVuZ3RoIHdpdGggYW4gYWRkZWQKLSAqIE5VTEwgdGVybWluYXRvci4KLSAqLwotdm9pZCB1dGYxNl90b191dGY4KGNvbnN0IGNoYXIxNl90KiBzcmMsIHNpemVfdCBzcmNfbGVuLCBjaGFyKiBkc3QpOwotCi0vKioKLSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiAic3JjIiB3aGVuICJzcmMiIGlzIHZhbGlkIFVURi04IHN0cmluZy4KLSAqIFJldHVybnMgMCBpZiBzcmMgaXMgTlVMTCBvciAwLWxlbmd0aCBzdHJpbmcuIFJldHVybnMgLTEgd2hlbiB0aGUgc291cmNlCi0gKiBpcyBhbiBpbnZhbGlkIHN0cmluZy4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyICJzcmMiIGlzIHZhbGlkIFVURi04Ci0gKiBjaGFyYWN0ZXJzIHdpdGggdmFsaWQgdW5pY29kZSBjb2RlcG9pbnRzLiAic3JjIiBtdXN0IGJlIG51bGwtdGVybWluYXRlZC4KLSAqCi0gKiBJZiB5b3UgYXJlIGdvaW5nIHRvIHVzZSBvdGhlciB1dGY4X3RvXy4uLiBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIGhlYWRlcgotICogd2l0aCBzdHJpbmcgd2hpY2ggbWF5IG5vdCBiZSB2YWxpZCBVVEYtOCB3aXRoIHZhbGlkIGNvZGVwb2ludCAoZm9ybSAwIHRvCi0gKiAweDEwRkZGRiksIHlvdSBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgb3RoZXJzLCBzaW5jZSB0aGUKLSAqIG90aGVyIGZ1bmN0aW9ucyBkbyBub3QgY2hlY2sgd2hldGhlciB0aGUgc3RyaW5nIGlzIHZhbGlkIFVURi04IG9yIG5vdC4KLSAqCi0gKiBJZiB5b3UgZG8gbm90IGNhcmUgd2hldGhlciAic3JjIiBpcyB2YWxpZCBVVEYtOCBvciBub3QsIHlvdSBzaG91bGQgdXNlCi0gKiBzdHJsZW4oKSBhcyB1c3VhbCwgd2hpY2ggc2hvdWxkIGJlIG11Y2ggZmFzdGVyLgotICovCi1zc2l6ZV90IHV0ZjhfbGVuZ3RoKGNvbnN0IGNoYXIgKnNyYyk7Ci0KLS8qKgotICogTWVhc3VyZSB0aGUgbGVuZ3RoIG9mIGEgVVRGLTMyIHN0cmluZy4KLSAqLwotc2l6ZV90IHV0ZjhfdG9fdXRmMzJfbGVuZ3RoKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNyY19sZW4pOwotCi0vKioKLSAqIFN0b3JlcyBhIFVURi0zMiBzdHJpbmcgY29udmVydGVkIGZyb20gInNyYyIgaW4gImRzdCIuICJkc3QiIG11c3QgYmUgbGFyZ2UKLSAqIGVub3VnaCB0byBzdG9yZSB0aGUgZW50aXJlIGNvbnZlcnRlZCBzdHJpbmcgYXMgbWVhc3VyZWQgYnkKLSAqIHV0ZjhfdG9fdXRmMzJfbGVuZ3RoIHBsdXMgc3BhY2UgZm9yIGEgTlVMTCB0ZXJtaW5hdG9yLgotICovCi12b2lkIHV0ZjhfdG9fdXRmMzIoY29uc3QgY2hhciogc3JjLCBzaXplX3Qgc3JjX2xlbiwgY2hhcjMyX3QqIGRzdCk7Ci0KLS8qKgotICogUmV0dXJucyB0aGUgVVRGLTE2IGxlbmd0aCBvZiBVVEYtOCBzdHJpbmcgInNyYyIuCi0gKi8KLXNzaXplX3QgdXRmOF90b191dGYxNl9sZW5ndGgoY29uc3QgdWludDhfdCogc3JjLCBzaXplX3Qgc3JjTGVuKTsKLQotLyoqCi0gKiBDb252ZXJ0IFVURi04IHRvIFVURi0xNiBpbmNsdWRpbmcgc3Vycm9nYXRlIHBhaXJzLgotICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nICh3aGVyZSBhIG51bGwgdGVybWluYXRvciBtaWdodCBnbwotICogaWYgeW91IHdhbnRlZCB0byBhZGQgb25lKS4KLSAqLwotY2hhcjE2X3QqIHV0ZjhfdG9fdXRmMTZfbm9fbnVsbF90ZXJtaW5hdG9yKGNvbnN0IHVpbnQ4X3QqIHNyYywgc2l6ZV90IHNyY0xlbiwgY2hhcjE2X3QqIGRzdCk7Ci0KLS8qKgotICogQ29udmVydCBVVEYtOCB0byBVVEYtMTYgaW5jbHVkaW5nIHN1cnJvZ2F0ZSBwYWlycy4gVGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICogbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgcmVzdWx0IGFzIG1lYXN1cmVkIGJ5IHV0ZjhfdG9fdXRmMTZfbGVuZ3RoCi0gKiBwbHVzIGFuIGFkZGVkIE5VTEwgdGVybWluYXRvci4KLSAqLwotdm9pZCB1dGY4X3RvX3V0ZjE2KGNvbnN0IHVpbnQ4X3QqIHNyYywgc2l6ZV90IHNyY0xlbiwgY2hhcjE2X3QqIGRzdCk7Ci0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIGIvaW5jbHVkZS91dGlscy9WZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1Mjk2Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVkVDVE9SX0gKLSNkZWZpbmUgQU5EUk9JRF9WRUNUT1JfSAotCi0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9ySW1wbC5oPgotI2luY2x1ZGUgPHV0aWxzL1R5cGVIZWxwZXJzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUWVBFPgotY2xhc3MgU29ydGVkVmVjdG9yOwotCi0vKiEKLSAqIFRoZSBtYWluIHRlbXBsYXRlZCB2ZWN0b3IgY2xhc3MgZW5zdXJpbmcgdHlwZSBzYWZldHkKLSAqIHdoaWxlIG1ha2luZyB1c2Ugb2YgVmVjdG9ySW1wbC4KLSAqIFRoaXMgaXMgdGhlIGNsYXNzIHVzZXJzIHdhbnQgdG8gdXNlLgotICovCi0KLXRlbXBsYXRlIDxjbGFzcyBUWVBFPgotY2xhc3MgVmVjdG9yIDogcHJpdmF0ZSBWZWN0b3JJbXBsCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICB0eXBlZGVmIFRZUEUgICAgdmFsdWVfdHlwZTsKLSAgICAKLSAgICAvKiEgCi0gICAgICogQ29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycwotICAgICAqLwotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcihjb25zdCBWZWN0b3I8VFlQRT4mIHJocyk7Ci0gICAgZXhwbGljaXQgICAgICAgICAgICAgICAgVmVjdG9yKGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+VmVjdG9yKCk7Ci0KLSAgICAvKiEgY29weSBvcGVyYXRvciAqLwotICAgICAgICAgICAgY29uc3QgVmVjdG9yPFRZUEU+JiAgICAgb3BlcmF0b3IgPSAoY29uc3QgVmVjdG9yPFRZUEU+JiByaHMpIGNvbnN0OwotICAgICAgICAgICAgVmVjdG9yPFRZUEU+JiAgICAgICAgICAgb3BlcmF0b3IgPSAoY29uc3QgVmVjdG9yPFRZUEU+JiByaHMpOyAgICAKLQotICAgICAgICAgICAgY29uc3QgVmVjdG9yPFRZUEU+JiAgICAgb3BlcmF0b3IgPSAoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiByaHMpIGNvbnN0OwotICAgICAgICAgICAgVmVjdG9yPFRZUEU+JiAgICAgICAgICAgb3BlcmF0b3IgPSAoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiByaHMpOwotCi0gICAgICAgICAgICAvKgotICAgICAqIGVtcHR5IHRoZSB2ZWN0b3IKLSAgICAgKi8KLQotICAgIGlubGluZSAgdm9pZCAgICAgICAgICAgIGNsZWFyKCkgICAgICAgICAgICAgeyBWZWN0b3JJbXBsOjpjbGVhcigpOyB9Ci0KLSAgICAvKiEgCi0gICAgICogdmVjdG9yIHN0YXRzCi0gICAgICovCi0KLSAgICAvLyEgcmV0dXJucyBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHZlY3RvcgotICAgIGlubGluZSAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCAgICAgICAgICAgICAgICB7IHJldHVybiBWZWN0b3JJbXBsOjpzaXplKCk7IH0KLSAgICAvLyEgcmV0dXJucyB3ZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3IgaXMgZW1wdHkKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICBpc0VtcHR5KCkgY29uc3QgICAgICAgICAgICAgeyByZXR1cm4gVmVjdG9ySW1wbDo6aXNFbXB0eSgpOyB9Ci0gICAgLy8hIHJldHVybnMgaG93IG1hbnkgaXRlbXMgY2FuIGJlIHN0b3JlZCB3aXRob3V0IHJlYWxsb2NhdGluZyB0aGUgYmFja2luZyBzdG9yZQotICAgIGlubGluZSAgc2l6ZV90ICAgICAgICAgIGNhcGFjaXR5KCkgY29uc3QgICAgICAgICAgICB7IHJldHVybiBWZWN0b3JJbXBsOjpjYXBhY2l0eSgpOyB9Ci0gICAgLy8hIHNldHN0IHRoZSBjYXBhY2l0eS4gY2FwYWNpdHkgY2FuIG5ldmVyIGJlIHJlZHVjZWQgbGVzcyB0aGFuIHNpemUoKQotICAgIGlubGluZSAgc3NpemVfdCAgICAgICAgIHNldENhcGFjaXR5KHNpemVfdCBzaXplKSAgICB7IHJldHVybiBWZWN0b3JJbXBsOjpzZXRDYXBhY2l0eShzaXplKTsgfQotCi0gICAgLyohIAotICAgICAqIEMtc3R5bGUgYXJyYXkgYWNjZXNzCi0gICAgICovCi0gICAgIAotICAgIC8vISByZWFkLW9ubHkgQy1zdHlsZSBhY2Nlc3MgCi0gICAgaW5saW5lICBjb25zdCBUWVBFKiAgICAgYXJyYXkoKSBjb25zdDsKLSAgICAvLyEgcmVhZC13cml0ZSBDLXN0eWxlIGFjY2VzcwotICAgICAgICAgICAgVFlQRSogICAgICAgICAgIGVkaXRBcnJheSgpOwotICAgIAotICAgIC8qISAKLSAgICAgKiBhY2Nlc3NvcnMKLSAgICAgKi8KLQotICAgIC8vISByZWFkLW9ubHkgYWNjZXNzIHRvIGFuIGl0ZW0gYXQgYSBnaXZlbiBpbmRleAotICAgIGlubGluZSAgY29uc3QgVFlQRSYgICAgIG9wZXJhdG9yIFtdIChzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgIC8vISBhbHRlcm5hdGUgbmFtZSBmb3Igb3BlcmF0b3IgW10KLSAgICBpbmxpbmUgIGNvbnN0IFRZUEUmICAgICBpdGVtQXQoc2l6ZV90IGluZGV4KSBjb25zdDsKLSAgICAvLyEgc3RhY2stdXNhZ2Ugb2YgdGhlIHZlY3Rvci4gcmV0dXJucyB0aGUgdG9wIG9mIHRoZSBzdGFjayAobGFzdCBlbGVtZW50KQotICAgICAgICAgICAgY29uc3QgVFlQRSYgICAgIHRvcCgpIGNvbnN0OwotICAgIC8vISBzYW1lIGFzIG9wZXJhdG9yIFtdLCBidXQgYWxsb3dzIHRvIGFjY2VzcyB0aGUgdmVjdG9yIGJhY2t3YXJkIChmcm9tIHRoZSBlbmQpIHdpdGggYSBuZWdhdGl2ZSBpbmRleAotICAgICAgICAgICAgY29uc3QgVFlQRSYgICAgIG1pcnJvckl0ZW1BdChzc2l6ZV90IGluZGV4KSBjb25zdDsKLQotICAgIC8qIQotICAgICAqIG1vZGlmaW5nIHRoZSBhcnJheQotICAgICAqLwotCi0gICAgLy8hIGNvcHktb24gd3JpdGUgc3VwcG9ydCwgZ3JhbnRzIHdyaXRlIGFjY2VzcyB0byBhbiBpdGVtCi0gICAgICAgICAgICBUWVBFJiAgICAgICAgICAgZWRpdEl0ZW1BdChzaXplX3QgaW5kZXgpOwotICAgIC8vISBncmFudHMgcmlnaHQgYWNjZXMgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sgKGxhc3QgZWxlbWVudCkKLSAgICAgICAgICAgIFRZUEUmICAgICAgICAgICBlZGl0VG9wKCk7Ci0KLSAgICAgICAgICAgIC8qISAKLSAgICAgICAgICAgICAqIGFwcGVuZC9pbnNlcnQgYW5vdGhlciB2ZWN0b3IKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0gICAgLy8hIGluc2VydCBhbm90aGVyIHZlY3RvciBhdCBhIGdpdmVuIGluZGV4Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5zZXJ0VmVjdG9yQXQoY29uc3QgVmVjdG9yPFRZUEU+JiB2ZWN0b3IsIHNpemVfdCBpbmRleCk7Ci0KLSAgICAvLyEgYXBwZW5kIGFub3RoZXIgdmVjdG9yIGF0IHRoZSBlbmQgb2YgdGhpcyBvbmUKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhcHBlbmRWZWN0b3IoY29uc3QgVmVjdG9yPFRZUEU+JiB2ZWN0b3IpOwotCi0KLSAgICAvLyEgaW5zZXJ0IGFuIGFycmF5IGF0IGEgZ2l2ZW4gaW5kZXgKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbnNlcnRBcnJheUF0KGNvbnN0IFRZUEUqIGFycmF5LCBzaXplX3QgaW5kZXgsIHNpemVfdCBsZW5ndGgpOwotCi0gICAgLy8hIGFwcGVuZCBhbiBhcnJheSBhdCB0aGUgZW5kIG9mIHRoaXMgdmVjdG9yCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYXBwZW5kQXJyYXkoY29uc3QgVFlQRSogYXJyYXksIHNpemVfdCBsZW5ndGgpOwotCi0gICAgICAgICAgICAvKiEgCi0gICAgICAgICAgICAgKiBhZGQvaW5zZXJ0L3JlcGxhY2UgaXRlbXMKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgIAotICAgIC8vISBpbnNlcnQgb25lIG9yIHNldmVyYWwgaXRlbXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGVpciBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgaW5saW5lICBzc2l6ZV90ICAgICAgICAgaW5zZXJ0QXQoc2l6ZV90IGluZGV4LCBzaXplX3QgbnVtSXRlbXMgPSAxKTsKLSAgICAvLyEgaW5zZXJ0IG9uZSBvciBzZXZlcmFsIGl0ZW1zIGluaXRpYWxpemVkIGZyb20gYSBwcm90b3R5cGUgaXRlbQotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluc2VydEF0KGNvbnN0IFRZUEUmIHByb3RvdHlwZV9pdGVtLCBzaXplX3QgaW5kZXgsIHNpemVfdCBudW1JdGVtcyA9IDEpOwotICAgIC8vISBwb3AgdGhlIHRvcCBvZiB0aGUgc3RhY2sgKHJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCkuIE5vLW9wIGlmIHRoZSBzdGFjaydzIGVtcHR5Ci0gICAgaW5saW5lICB2b2lkICAgICAgICAgICAgcG9wKCk7Ci0gICAgLy8hIHB1c2hlcyBhbiBpdGVtIGluaXRpYWxpemVkIHdpdGggaXRzIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICBpbmxpbmUgIHZvaWQgICAgICAgICAgICBwdXNoKCk7Ci0gICAgLy8hIHB1c2hlcyBhbiBpdGVtIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgcHVzaChjb25zdCBUWVBFJiBpdGVtKTsKLSAgICAvLyEgc2FtZSBhcyBwdXNoKCkgYnV0IHJldHVybnMgdGhlIGluZGV4IHRoZSBpdGVtIHdhcyBhZGRlZCBhdCAob3IgYW4gZXJyb3IpCi0gICAgaW5saW5lICBzc2l6ZV90ICAgICAgICAgYWRkKCk7Ci0gICAgLy8hIHNhbWUgYXMgcHVzaCgpIGJ1dCByZXR1cm5zIHRoZSBpbmRleCB0aGUgaXRlbSB3YXMgYWRkZWQgYXQgKG9yIGFuIGVycm9yKQotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBUWVBFJiBpdGVtKTsgICAgICAgICAgICAKLSAgICAvLyEgcmVwbGFjZSBhbiBpdGVtIHdpdGggYSBuZXcgb25lIGluaXRpYWxpemVkIHdpdGggaXRzIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICBpbmxpbmUgIHNzaXplX3QgICAgICAgICByZXBsYWNlQXQoc2l6ZV90IGluZGV4KTsKLSAgICAvLyEgcmVwbGFjZSBhbiBpdGVtIHdpdGggYSBuZXcgb25lCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgcmVwbGFjZUF0KGNvbnN0IFRZUEUmIGl0ZW0sIHNpemVfdCBpbmRleCk7Ci0KLSAgICAvKiEKLSAgICAgKiByZW1vdmUgaXRlbXMKLSAgICAgKi8KLQotICAgIC8vISByZW1vdmUgc2V2ZXJhbCBpdGVtcwotICAgIGlubGluZSAgc3NpemVfdCAgICAgICAgIHJlbW92ZUl0ZW1zQXQoc2l6ZV90IGluZGV4LCBzaXplX3QgY291bnQgPSAxKTsKLSAgICAvLyEgcmVtb3ZlIG9uZSBpdGVtCi0gICAgaW5saW5lICBzc2l6ZV90ICAgICAgICAgcmVtb3ZlQXQoc2l6ZV90IGluZGV4KSAgeyByZXR1cm4gcmVtb3ZlSXRlbXNBdChpbmRleCk7IH0KLQotICAgIC8qIQotICAgICAqIHNvcnQgKHN0YWJsZSkgdGhlIGFycmF5Ci0gICAgICovCi0gICAgIAotICAgICB0eXBlZGVmIGludCAoKmNvbXBhcl90KShjb25zdCBUWVBFKiBsaHMsIGNvbnN0IFRZUEUqIHJocyk7Ci0gICAgIHR5cGVkZWYgaW50ICgqY29tcGFyX3JfdCkoY29uc3QgVFlQRSogbGhzLCBjb25zdCBUWVBFKiByaHMsIHZvaWQqIHN0YXRlKTsKLSAgICAgCi0gICAgIGlubGluZSBzdGF0dXNfdCAgICAgICAgc29ydChjb21wYXJfdCBjbXApOwotICAgICBpbmxpbmUgc3RhdHVzX3QgICAgICAgIHNvcnQoY29tcGFyX3JfdCBjbXAsIHZvaWQqIHN0YXRlKTsKLQotICAgICAvLyBmb3IgZGVidWdnaW5nIG9ubHkKLSAgICAgaW5saW5lIHNpemVfdCBnZXRJdGVtU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGl0ZW1TaXplKCk7IH0KLQotCi0gICAgIC8qCi0gICAgICAqIHRoZXNlIGlubGluZXMgYWRkIHNvbWUgbGV2ZWwgb2YgY29tcGF0aWJpbGl0eSB3aXRoIFNUTC4gZXZlbnR1YWxseQotICAgICAgKiB3ZSBzaG91bGQgcHJvYmFibHkgdHVybiB0aGluZ3MgYXJvdW5kLgotICAgICAgKi8KLSAgICAgdHlwZWRlZiBUWVBFKiBpdGVyYXRvcjsKLSAgICAgdHlwZWRlZiBUWVBFIGNvbnN0KiBjb25zdF9pdGVyYXRvcjsKLQotICAgICBpbmxpbmUgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBlZGl0QXJyYXkoKTsgfQotICAgICBpbmxpbmUgaXRlcmF0b3IgZW5kKCkgICB7IHJldHVybiBlZGl0QXJyYXkoKSArIHNpemUoKTsgfQotICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcnJheSgpOyB9Ci0gICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHsgcmV0dXJuIGFycmF5KCkgKyBzaXplKCk7IH0KLSAgICAgaW5saW5lIHZvaWQgcmVzZXJ2ZShzaXplX3QgbikgeyBzZXRDYXBhY2l0eShuKTsgfQotICAgICBpbmxpbmUgYm9vbCBlbXB0eSgpIGNvbnN0eyByZXR1cm4gaXNFbXB0eSgpOyB9Ci0gICAgIGlubGluZSB2b2lkIHB1c2hfYmFjayhjb25zdCBUWVBFJiBpdGVtKSAgeyBpbnNlcnRBdChpdGVtLCBzaXplKCksIDEpOyB9Ci0gICAgIGlubGluZSB2b2lkIHB1c2hfZnJvbnQoY29uc3QgVFlQRSYgaXRlbSkgeyBpbnNlcnRBdChpdGVtLCAwLCAxKTsgfQotICAgICBpbmxpbmUgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgcG9zKSB7Ci0gICAgICAgICByZXR1cm4gYmVnaW4oKSArIHJlbW92ZUl0ZW1zQXQocG9zLWFycmF5KCkpOwotICAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgICAgZG9fY29uc3RydWN0KHZvaWQqIHN0b3JhZ2UsIHNpemVfdCBudW0pIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCAgICBkb19kZXN0cm95KHZvaWQqIHN0b3JhZ2UsIHNpemVfdCBudW0pIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCAgICBkb19jb3B5KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGZyb20sIHNpemVfdCBudW0pIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCAgICBkb19zcGxhdCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBpdGVtLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgZG9fbW92ZV9mb3J3YXJkKHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGZyb20sIHNpemVfdCBudW0pIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCAgICBkb19tb3ZlX2JhY2t3YXJkKHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGZyb20sIHNpemVfdCBudW0pIGNvbnN0OwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vIHVzZXIgc2VydmljZWFibGUgcGFydHMgZnJvbSBoZXJlLi4uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1WZWN0b3I8VFlQRT46OlZlY3RvcigpCi0gICAgOiBWZWN0b3JJbXBsKHNpemVvZihUWVBFKSwKLSAgICAgICAgICAgICAgICAoKHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY3RvciAgID8gSEFTX1RSSVZJQUxfQ1RPUiAgIDogMCkKLSAgICAgICAgICAgICAgICB8KHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfZHRvciAgID8gSEFTX1RSSVZJQUxfRFRPUiAgIDogMCkKLSAgICAgICAgICAgICAgICB8KHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY29weSAgID8gSEFTX1RSSVZJQUxfQ09QWSAgIDogMCkpCi0gICAgICAgICAgICAgICAgKQotewotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLVZlY3RvcjxUWVBFPjo6VmVjdG9yKGNvbnN0IFZlY3RvcjxUWVBFPiYgcmhzKQotICAgIDogVmVjdG9ySW1wbChyaHMpIHsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1WZWN0b3I8VFlQRT46OlZlY3Rvcihjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocykKLSAgICA6IFZlY3RvckltcGwoc3RhdGljX2Nhc3Q8Y29uc3QgVmVjdG9ySW1wbCY+KHJocykpIHsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1WZWN0b3I8VFlQRT46On5WZWN0b3IoKSB7Ci0gICAgZmluaXNoX3ZlY3RvcigpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLVZlY3RvcjxUWVBFPiYgVmVjdG9yPFRZUEU+OjpvcGVyYXRvciA9IChjb25zdCBWZWN0b3I8VFlQRT4mIHJocykgewotICAgIFZlY3RvckltcGw6Om9wZXJhdG9yID0gKHJocyk7Ci0gICAgcmV0dXJuICp0aGlzOyAKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1jb25zdCBWZWN0b3I8VFlQRT4mIFZlY3RvcjxUWVBFPjo6b3BlcmF0b3IgPSAoY29uc3QgVmVjdG9yPFRZUEU+JiByaHMpIGNvbnN0IHsKLSAgICBWZWN0b3JJbXBsOjpvcGVyYXRvciA9IChzdGF0aWNfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4ocmhzKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLVZlY3RvcjxUWVBFPiYgVmVjdG9yPFRZUEU+OjpvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocykgewotICAgIFZlY3RvckltcGw6Om9wZXJhdG9yID0gKHN0YXRpY19jYXN0PGNvbnN0IFZlY3RvckltcGwmPihyaHMpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVmVjdG9yPFRZUEU+JiBWZWN0b3I8VFlQRT46Om9wZXJhdG9yID0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKSBjb25zdCB7Ci0gICAgVmVjdG9ySW1wbDo6b3BlcmF0b3IgPSAocmhzKTsKLSAgICByZXR1cm4gKnRoaXM7IAotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLWNvbnN0IFRZUEUqIFZlY3RvcjxUWVBFPjo6YXJyYXkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFRZUEUgKj4oYXJyYXlJbXBsKCkpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLVRZUEUqIFZlY3RvcjxUWVBFPjo6ZWRpdEFycmF5KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUWVBFICo+KGVkaXRBcnJheUltcGwoKSk7Ci19Ci0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1jb25zdCBUWVBFJiBWZWN0b3I8VFlQRT46Om9wZXJhdG9yW10oc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgTE9HX0ZBVEFMX0lGKCBpbmRleD49c2l6ZSgpLAotICAgICAgICAgICAgICAgICAgIml0ZW1BdDogaW5kZXggJWQgaXMgcGFzdCBzaXplICVkIiwgKGludClpbmRleCwgKGludClzaXplKCkgKTsKLSAgICByZXR1cm4gKihhcnJheSgpICsgaW5kZXgpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLWNvbnN0IFRZUEUmIFZlY3RvcjxUWVBFPjo6aXRlbUF0KHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiBvcGVyYXRvcltdKGluZGV4KTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1jb25zdCBUWVBFJiBWZWN0b3I8VFlQRT46Om1pcnJvckl0ZW1BdChzc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgTE9HX0ZBVEFMX0lGKCAoaW5kZXg+MCA/IGluZGV4IDogLWluZGV4KT49c2l6ZSgpLAotICAgICAgICAgICAgICAgICAgIm1pcnJvckl0ZW1BdDogaW5kZXggJWQgaXMgcGFzdCBzaXplICVkIiwKLSAgICAgICAgICAgICAgICAgIChpbnQpaW5kZXgsIChpbnQpc2l6ZSgpICk7Ci0gICAgcmV0dXJuICooYXJyYXkoKSArICgoaW5kZXg8MCkgPyAoc2l6ZSgpLWluZGV4KSA6IGluZGV4KSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVFlQRSYgVmVjdG9yPFRZUEU+Ojp0b3AoKSBjb25zdCB7Ci0gICAgcmV0dXJuICooYXJyYXkoKSArIHNpemUoKSAtIDEpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLVRZUEUmIFZlY3RvcjxUWVBFPjo6ZWRpdEl0ZW1BdChzaXplX3QgaW5kZXgpIHsKLSAgICByZXR1cm4gKiggc3RhdGljX2Nhc3Q8VFlQRSAqPihlZGl0SXRlbUxvY2F0aW9uKGluZGV4KSkgKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1UWVBFJiBWZWN0b3I8VFlQRT46OmVkaXRUb3AoKSB7Ci0gICAgcmV0dXJuICooIHN0YXRpY19jYXN0PFRZUEUgKj4oZWRpdEl0ZW1Mb2NhdGlvbihzaXplKCktMSkpICk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotc3NpemVfdCBWZWN0b3I8VFlQRT46Omluc2VydFZlY3RvckF0KGNvbnN0IFZlY3RvcjxUWVBFPiYgdmVjdG9yLCBzaXplX3QgaW5kZXgpIHsKLSAgICByZXR1cm4gVmVjdG9ySW1wbDo6aW5zZXJ0VmVjdG9yQXQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4odmVjdG9yKSwgaW5kZXgpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgVmVjdG9yPFRZUEU+OjphcHBlbmRWZWN0b3IoY29uc3QgVmVjdG9yPFRZUEU+JiB2ZWN0b3IpIHsKLSAgICByZXR1cm4gVmVjdG9ySW1wbDo6YXBwZW5kVmVjdG9yKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmVjdG9ySW1wbCY+KHZlY3RvcikpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgVmVjdG9yPFRZUEU+OjppbnNlcnRBcnJheUF0KGNvbnN0IFRZUEUqIGFycmF5LCBzaXplX3QgaW5kZXgsIHNpemVfdCBsZW5ndGgpIHsKLSAgICByZXR1cm4gVmVjdG9ySW1wbDo6aW5zZXJ0QXJyYXlBdChhcnJheSwgaW5kZXgsIGxlbmd0aCk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotc3NpemVfdCBWZWN0b3I8VFlQRT46OmFwcGVuZEFycmF5KGNvbnN0IFRZUEUqIGFycmF5LCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIFZlY3RvckltcGw6OmFwcGVuZEFycmF5KGFycmF5LCBsZW5ndGgpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgVmVjdG9yPFRZUEU+OjppbnNlcnRBdChjb25zdCBUWVBFJiBpdGVtLCBzaXplX3QgaW5kZXgsIHNpemVfdCBudW1JdGVtcykgewotICAgIHJldHVybiBWZWN0b3JJbXBsOjppbnNlcnRBdCgmaXRlbSwgaW5kZXgsIG51bUl0ZW1zKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi12b2lkIFZlY3RvcjxUWVBFPjo6cHVzaChjb25zdCBUWVBFJiBpdGVtKSB7Ci0gICAgcmV0dXJuIFZlY3RvckltcGw6OnB1c2goJml0ZW0pOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgVmVjdG9yPFRZUEU+OjphZGQoY29uc3QgVFlQRSYgaXRlbSkgewotICAgIHJldHVybiBWZWN0b3JJbXBsOjphZGQoJml0ZW0pOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgVmVjdG9yPFRZUEU+OjpyZXBsYWNlQXQoY29uc3QgVFlQRSYgaXRlbSwgc2l6ZV90IGluZGV4KSB7Ci0gICAgcmV0dXJuIFZlY3RvckltcGw6OnJlcGxhY2VBdCgmaXRlbSwgaW5kZXgpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgVmVjdG9yPFRZUEU+OjppbnNlcnRBdChzaXplX3QgaW5kZXgsIHNpemVfdCBudW1JdGVtcykgewotICAgIHJldHVybiBWZWN0b3JJbXBsOjppbnNlcnRBdChpbmRleCwgbnVtSXRlbXMpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXZvaWQgVmVjdG9yPFRZUEU+Ojpwb3AoKSB7Ci0gICAgVmVjdG9ySW1wbDo6cG9wKCk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotdm9pZCBWZWN0b3I8VFlQRT46OnB1c2goKSB7Ci0gICAgVmVjdG9ySW1wbDo6cHVzaCgpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgVmVjdG9yPFRZUEU+OjphZGQoKSB7Ci0gICAgcmV0dXJuIFZlY3RvckltcGw6OmFkZCgpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgVmVjdG9yPFRZUEU+OjpyZXBsYWNlQXQoc2l6ZV90IGluZGV4KSB7Ci0gICAgcmV0dXJuIFZlY3RvckltcGw6OnJlcGxhY2VBdChpbmRleCk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotc3NpemVfdCBWZWN0b3I8VFlQRT46OnJlbW92ZUl0ZW1zQXQoc2l6ZV90IGluZGV4LCBzaXplX3QgY291bnQpIHsKLSAgICByZXR1cm4gVmVjdG9ySW1wbDo6cmVtb3ZlSXRlbXNBdChpbmRleCwgY291bnQpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXN0YXR1c190IFZlY3RvcjxUWVBFPjo6c29ydChWZWN0b3I8VFlQRT46OmNvbXBhcl90IGNtcCkgewotICAgIHJldHVybiBWZWN0b3JJbXBsOjpzb3J0KChWZWN0b3JJbXBsOjpjb21wYXJfdCljbXApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXN0YXR1c190IFZlY3RvcjxUWVBFPjo6c29ydChWZWN0b3I8VFlQRT46OmNvbXBhcl9yX3QgY21wLCB2b2lkKiBzdGF0ZSkgewotICAgIHJldHVybiBWZWN0b3JJbXBsOjpzb3J0KChWZWN0b3JJbXBsOjpjb21wYXJfcl90KWNtcCwgc3RhdGUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4KLXZvaWQgVmVjdG9yPFRZUEU+Ojpkb19jb25zdHJ1Y3Qodm9pZCogc3RvcmFnZSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIGNvbnN0cnVjdF90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihzdG9yYWdlKSwgbnVtICk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+Ci12b2lkIFZlY3RvcjxUWVBFPjo6ZG9fZGVzdHJveSh2b2lkKiBzdG9yYWdlLCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgZGVzdHJveV90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihzdG9yYWdlKSwgbnVtICk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+Ci12b2lkIFZlY3RvcjxUWVBFPjo6ZG9fY29weSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgY29weV90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihkZXN0KSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4oZnJvbSksIG51bSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPgotdm9pZCBWZWN0b3I8VFlQRT46OmRvX3NwbGF0KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGl0ZW0sIHNpemVfdCBudW0pIGNvbnN0IHsKLSAgICBzcGxhdF90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihkZXN0KSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4oaXRlbSksIG51bSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPgotdm9pZCBWZWN0b3I8VFlQRT46OmRvX21vdmVfZm9yd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgbW92ZV9mb3J3YXJkX3R5cGUoIHJlaW50ZXJwcmV0X2Nhc3Q8VFlQRSo+KGRlc3QpLCByZWludGVycHJldF9jYXN0PGNvbnN0IFRZUEUqPihmcm9tKSwgbnVtICk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+Ci12b2lkIFZlY3RvcjxUWVBFPjo6ZG9fbW92ZV9iYWNrd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgbW92ZV9iYWNrd2FyZF90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihkZXN0KSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4oZnJvbSksIG51bSApOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9WRUNUT1JfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmggYi9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlYzJmZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZFQ1RPUl9JTVBMX0gKLSNkZWZpbmUgQU5EUk9JRF9WRUNUT1JfSU1QTF9ICi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBObyB1c2VyIHNlcnZpY2VhYmxlIHBhcnRzIGluIGhlcmUuLi4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qIQotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGd1dHMgb2YgdGhlIHZlY3Rvcjw+IGNsYXNzCi0gKiB0aGlzIGVuc3VyZXMgYmFja3dhcmQgYmluYXJ5IGNvbXBhdGliaWxpdHkgYW5kCi0gKiByZWR1Y2VzIGNvZGUgc2l6ZS4KLSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZSBleHBvc2UgbVN0b3JhZ2UgYW5kIG1Db3VudAotICogc28gdGhlc2UgZmllbGRzIGFyZSBzZXQgaW4gc3RvbmUuCi0gKgotICovCi0KLWNsYXNzIFZlY3RvckltcGwKLXsKLXB1YmxpYzoKLSAgICBlbnVtIHsgLy8gZmxhZ3MgcGFzc2VkIHRvIHRoZSBjdG9yCi0gICAgICAgIEhBU19UUklWSUFMX0NUT1IgICAgPSAweDAwMDAwMDAxLAotICAgICAgICBIQVNfVFJJVklBTF9EVE9SICAgID0gMHgwMDAwMDAwMiwKLSAgICAgICAgSEFTX1RSSVZJQUxfQ09QWSAgICA9IDB4MDAwMDAwMDQsCi0gICAgfTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvckltcGwoc2l6ZV90IGl0ZW1TaXplLCB1aW50MzJfdCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9ySW1wbChjb25zdCBWZWN0b3JJbXBsJiByaHMpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5WZWN0b3JJbXBsKCk7Ci0KLSAgICAvKiEgbXVzdCBiZSBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzIGRlc3RydWN0b3IgKi8KLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBmaW5pc2hfdmVjdG9yKCk7Ci0KLSAgICAgICAgICAgIFZlY3RvckltcGwmICAgICBvcGVyYXRvciA9IChjb25zdCBWZWN0b3JJbXBsJiByaHMpOyAgICAKLSAgICAgICAgICAgIAotICAgIC8qISBDLXN0eWxlIGFycmF5IGFjY2VzcyAqLwotICAgIGlubGluZSAgY29uc3Qgdm9pZCogICAgIGFycmF5SW1wbCgpIGNvbnN0ICAgICAgIHsgcmV0dXJuIG1TdG9yYWdlOyB9Ci0gICAgICAgICAgICB2b2lkKiAgICAgICAgICAgZWRpdEFycmF5SW1wbCgpOwotICAgICAgICAgICAgCi0gICAgLyohIHZlY3RvciBzdGF0cyAqLwotICAgIGlubGluZSAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCAgICAgICAgeyByZXR1cm4gbUNvdW50OyB9Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0ICAgICB7IHJldHVybiBtQ291bnQgPT0gMDsgfQotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIGNhcGFjaXR5KCkgY29uc3Q7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgc2V0Q2FwYWNpdHkoc2l6ZV90IHNpemUpOwotCi0gICAgICAgICAgICAvKiEgYXBwZW5kL2luc2VydCBhbm90aGVyIHZlY3RvciBvciBhcnJheSAqLwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluc2VydFZlY3RvckF0KGNvbnN0IFZlY3RvckltcGwmIHZlY3Rvciwgc2l6ZV90IGluZGV4KTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhcHBlbmRWZWN0b3IoY29uc3QgVmVjdG9ySW1wbCYgdmVjdG9yKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbnNlcnRBcnJheUF0KGNvbnN0IHZvaWQqIGFycmF5LCBzaXplX3QgaW5kZXgsIHNpemVfdCBsZW5ndGgpOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGFwcGVuZEFycmF5KGNvbnN0IHZvaWQqIGFycmF5LCBzaXplX3QgbGVuZ3RoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyohIGFkZC9pbnNlcnQvcmVwbGFjZSBpdGVtcyAqLwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluc2VydEF0KHNpemVfdCB3aGVyZSwgc2l6ZV90IG51bUl0ZW1zID0gMSk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5zZXJ0QXQoY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90IHdoZXJlLCBzaXplX3QgbnVtSXRlbXMgPSAxKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBwb3AoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBwdXNoKCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgcHVzaChjb25zdCB2b2lkKiBpdGVtKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgdm9pZCogaXRlbSk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgcmVwbGFjZUF0KHNpemVfdCBpbmRleCk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgcmVwbGFjZUF0KGNvbnN0IHZvaWQqIGl0ZW0sIHNpemVfdCBpbmRleCk7Ci0KLSAgICAgICAgICAgIC8qISByZW1vdmUgaXRlbXMgKi8KLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmVJdGVtc0F0KHNpemVfdCBpbmRleCwgc2l6ZV90IGNvdW50ID0gMSk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgY2xlYXIoKTsKLQotICAgICAgICAgICAgY29uc3Qgdm9pZCogICAgIGl0ZW1Mb2NhdGlvbihzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgICAgICAgICAgdm9pZCogICAgICAgICAgIGVkaXRJdGVtTG9jYXRpb24oc2l6ZV90IGluZGV4KTsKLQotICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpjb21wYXJfdCkoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpOwotICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpjb21wYXJfcl90KShjb25zdCB2b2lkKiBsaHMsIGNvbnN0IHZvaWQqIHJocywgdm9pZCogc3RhdGUpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNvcnQoY29tcGFyX3QgY21wKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzb3J0KGNvbXBhcl9yX3QgY21wLCB2b2lkKiBzdGF0ZSk7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBpdGVtU2l6ZSgpIGNvbnN0OwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHJlbGVhc2Vfc3RvcmFnZSgpOwotCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZG9fY29uc3RydWN0KHZvaWQqIHN0b3JhZ2UsIHNpemVfdCBudW0pIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkb19kZXN0cm95KHZvaWQqIHN0b3JhZ2UsIHNpemVfdCBudW0pIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkb19jb3B5KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGZyb20sIHNpemVfdCBudW0pIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkb19zcGxhdCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBpdGVtLCBzaXplX3QgbnVtKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZG9fbW92ZV9mb3J3YXJkKHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGZyb20sIHNpemVfdCBudW0pIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkb19tb3ZlX2JhY2t3YXJkKHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGZyb20sIHNpemVfdCBudW0pIGNvbnN0ID0gMDsKLQotICAgIC8vIHRha2UgY2FyZSBvZiBGQkMuLi4KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZXNlcnZlZFZlY3RvckltcGwxKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVzZXJ2ZWRWZWN0b3JJbXBsMigpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlc2VydmVkVmVjdG9ySW1wbDMoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZXNlcnZlZFZlY3RvckltcGw0KCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVzZXJ2ZWRWZWN0b3JJbXBsNSgpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlc2VydmVkVmVjdG9ySW1wbDYoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZXNlcnZlZFZlY3RvckltcGw3KCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVzZXJ2ZWRWZWN0b3JJbXBsOCgpOwotICAgIAotcHJpdmF0ZToKLSAgICAgICAgdm9pZCogX2dyb3coc2l6ZV90IHdoZXJlLCBzaXplX3QgYW1vdW50KTsKLSAgICAgICAgdm9pZCAgX3NocmluayhzaXplX3Qgd2hlcmUsIHNpemVfdCBhbW91bnQpOwotCi0gICAgICAgIGlubGluZSB2b2lkIF9kb19jb25zdHJ1Y3Qodm9pZCogc3RvcmFnZSwgc2l6ZV90IG51bSkgY29uc3Q7Ci0gICAgICAgIGlubGluZSB2b2lkIF9kb19kZXN0cm95KHZvaWQqIHN0b3JhZ2UsIHNpemVfdCBudW0pIGNvbnN0OwotICAgICAgICBpbmxpbmUgdm9pZCBfZG9fY29weSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICAgICAgaW5saW5lIHZvaWQgX2RvX3NwbGF0KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGl0ZW0sIHNpemVfdCBudW0pIGNvbnN0OwotICAgICAgICBpbmxpbmUgdm9pZCBfZG9fbW92ZV9mb3J3YXJkKHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGZyb20sIHNpemVfdCBudW0pIGNvbnN0OwotICAgICAgICBpbmxpbmUgdm9pZCBfZG9fbW92ZV9iYWNrd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdDsKLQotICAgICAgICAgICAgLy8gVGhlc2UgMiBmaWVsZHMgYXJlIGV4cG9zZWQgaW4gdGhlIGlubGluZXMgYmVsb3csCi0gICAgICAgICAgICAvLyBzbyB0aGV5J3JlIHNldCBpbiBzdG9uZS4KLSAgICAgICAgICAgIHZvaWQgKiAgICAgIG1TdG9yYWdlOyAgIC8vIGJhc2UgYWRkcmVzcyBvZiB0aGUgdmVjdG9yCi0gICAgICAgICAgICBzaXplX3QgICAgICBtQ291bnQ7ICAgICAvLyBudW1iZXIgb2YgaXRlbXMKLQotICAgIGNvbnN0ICAgdWludDMyX3QgICAgbUZsYWdzOwotICAgIGNvbnN0ICAgc2l6ZV90ICAgICAgbUl0ZW1TaXplOwotfTsKLQotCi0KLWNsYXNzIFNvcnRlZFZlY3RvckltcGwgOiBwdWJsaWMgVmVjdG9ySW1wbAotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvckltcGwoc2l6ZV90IGl0ZW1TaXplLCB1aW50MzJfdCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9ySW1wbChjb25zdCBWZWN0b3JJbXBsJiByaHMpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5Tb3J0ZWRWZWN0b3JJbXBsKCk7Ci0gICAgCi0gICAgU29ydGVkVmVjdG9ySW1wbCYgICAgIG9wZXJhdG9yID0gKGNvbnN0IFNvcnRlZFZlY3RvckltcGwmIHJocyk7ICAgIAotCi0gICAgLy8hIGZpbmRzIHRoZSBpbmRleCBvZiBhbiBpdGVtCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5kZXhPZihjb25zdCB2b2lkKiBpdGVtKSBjb25zdDsKLQotICAgIC8vISBmaW5kcyB3aGVyZSB0aGlzIGl0ZW0gc2hvdWxkIGJlIGluc2VydGVkCi0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgb3JkZXJPZihjb25zdCB2b2lkKiBpdGVtKSBjb25zdDsKLQotICAgIC8vISBhZGQgYW4gaXRlbSBpbiB0aGUgcmlnaHQgcGxhY2UgKG9yIHJlcGxhY2VzIGl0IGlmIHRoZXJlIGlzIG9uZSkKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgdm9pZCogaXRlbSk7Ci0KLSAgICAvLyEgbWVyZ2VzIGEgdmVjdG9yIGludG8gdGhpcyBvbmUKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBtZXJnZShjb25zdCBWZWN0b3JJbXBsJiB2ZWN0b3IpOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIG1lcmdlKGNvbnN0IFNvcnRlZFZlY3RvckltcGwmIHZlY3Rvcik7Ci0gICAgICAgICAgICAgCi0gICAgLy8hIHJlbW92ZXMgYW4gaXRlbQotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlbW92ZShjb25zdCB2b2lkKiBpdGVtKTsKLSAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgZG9fY29tcGFyZShjb25zdCB2b2lkKiBsaHMsIGNvbnN0IHZvaWQqIHJocykgY29uc3QgPSAwOwotCi0gICAgLy8gdGFrZSBjYXJlIG9mIEZCQy4uLgotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDEoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZXNlcnZlZFNvcnRlZFZlY3RvckltcGwyKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsMygpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZXNlcnZlZFNvcnRlZFZlY3RvckltcGw1KCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsNigpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDcoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZXNlcnZlZFNvcnRlZFZlY3RvckltcGw4KCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgX2luZGV4T3JkZXJPZihjb25zdCB2b2lkKiBpdGVtLCBzaXplX3QqIG9yZGVyID0gMCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIC8vIHRoZXNlIGFyZSBtYWRlIHByaXZhdGUsIGJlY2F1c2UgdGhleSBjYW4ndCBiZSB1c2VkIG9uIGEgU29ydGVkVmVjdG9yCi0gICAgICAgICAgICAvLyAodGhleSBkb24ndCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIGVpdGhlcikKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBwb3AoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBwdXNoKCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgcHVzaChjb25zdCB2b2lkKiBpdGVtKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbnNlcnRWZWN0b3JBdChjb25zdCBWZWN0b3JJbXBsJiB2ZWN0b3IsIHNpemVfdCBpbmRleCk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYXBwZW5kVmVjdG9yKGNvbnN0IFZlY3RvckltcGwmIHZlY3Rvcik7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5zZXJ0QXJyYXlBdChjb25zdCB2b2lkKiBhcnJheSwgc2l6ZV90IGluZGV4LCBzaXplX3QgbGVuZ3RoKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhcHBlbmRBcnJheShjb25zdCB2b2lkKiBhcnJheSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5zZXJ0QXQoc2l6ZV90IHdoZXJlLCBzaXplX3QgbnVtSXRlbXMgPSAxKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbnNlcnRBdChjb25zdCB2b2lkKiBpdGVtLCBzaXplX3Qgd2hlcmUsIHNpemVfdCBudW1JdGVtcyA9IDEpOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlcGxhY2VBdChzaXplX3QgaW5kZXgpOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlcGxhY2VBdChjb25zdCB2b2lkKiBpdGVtLCBzaXplX3QgaW5kZXgpOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfVkVDVE9SX0lNUExfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9hc2htZW0uaCBiL2luY2x1ZGUvdXRpbHMvYXNobWVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTQ3NzUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9hc2htZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIHV0aWxzL2FzaG1lbS5oCi0gKioKLSAqKiBDb3B5cmlnaHQgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZC4gIEl0IG1heSBiZSByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZAotICoqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIDIuMCBMaWNlbnNlIE9SIHZlcnNpb24gMiBvZiB0aGUgR05VCi0gKiogR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9VVElMU19BU0hNRU1fSAotI2RlZmluZSBfVVRJTFNfQVNITUVNX0gKLQotI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0KLSNkZWZpbmUgQVNITUVNX05BTUVfTEVOCQkyNTYKLQotI2RlZmluZSBBU0hNRU1fTkFNRV9ERUYJCSJkZXYvYXNobWVtIgotCi0vKiBSZXR1cm4gdmFsdWVzIGZyb20gQVNITUVNX1BJTjogV2FzIHRoZSBtYXBwaW5nIHB1cmdlZCB3aGlsZSB1bnBpbm5lZD8gKi8KLSNkZWZpbmUgQVNITUVNX05PVF9SRUFQRUQJMAotI2RlZmluZSBBU0hNRU1fV0FTX1JFQVBFRAkxCi0KLS8qIFJldHVybiB2YWx1ZXMgZnJvbSBBU0hNRU1fVU5QSU46IElzIHRoZSBtYXBwaW5nIG5vdyBwaW5uZWQgb3IgdW5waW5uZWQ/ICovCi0jZGVmaW5lIEFTSE1FTV9OT1dfVU5QSU5ORUQJMAotI2RlZmluZSBBU0hNRU1fTk9XX1BJTk5FRAkxCi0KLSNkZWZpbmUgX19BU0hNRU1JT0MJCTB4NzcKLQotI2RlZmluZSBBU0hNRU1fU0VUX05BTUUJCV9JT1coX19BU0hNRU1JT0MsIDEsIGNoYXJbQVNITUVNX05BTUVfTEVOXSkKLSNkZWZpbmUgQVNITUVNX0dFVF9OQU1FCQlfSU9SKF9fQVNITUVNSU9DLCAyLCBjaGFyW0FTSE1FTV9OQU1FX0xFTl0pCi0jZGVmaW5lIEFTSE1FTV9TRVRfU0laRQkJX0lPVyhfX0FTSE1FTUlPQywgMywgc2l6ZV90KQotI2RlZmluZSBBU0hNRU1fR0VUX1NJWkUJCV9JTyhfX0FTSE1FTUlPQywgNCkKLSNkZWZpbmUgQVNITUVNX1NFVF9QUk9UX01BU0sJX0lPVyhfX0FTSE1FTUlPQywgNSwgdW5zaWduZWQgbG9uZykKLSNkZWZpbmUgQVNITUVNX0dFVF9QUk9UX01BU0sJX0lPKF9fQVNITUVNSU9DLCA2KQotI2RlZmluZSBBU0hNRU1fUElOCQlfSU8oX19BU0hNRU1JT0MsIDcpCi0jZGVmaW5lIEFTSE1FTV9VTlBJTgkJX0lPKF9fQVNITUVNSU9DLCA4KQotI2RlZmluZSBBU0hNRU1fSVNQSU5ORUQJCV9JTyhfX0FTSE1FTUlPQywgOSkKLSNkZWZpbmUgQVNITUVNX1BVUkdFX0FMTF9DQUNIRVMJX0lPKF9fQVNITUVNSU9DLCAxMCkKLQotI2VuZGlmCS8qIF9VVElMU19BU0hNRU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9taXNjLmggYi9pbmNsdWRlL3V0aWxzL21pc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmMmE0Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL21pc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gSGFuZHkgdXRpbGl0eSBmdW5jdGlvbnMgYW5kIHBvcnRhYmlsaXR5IGNvZGUuCi0vLwotI2lmbmRlZiBfTElCU19VVElMU19NSVNDX0gKLSNkZWZpbmUgX0xJQlNfVVRJTFNfTUlTQ19ICi0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHV0aWxzL0VuZGlhbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qIGdldCAjb2YgZWxlbWVudHMgaW4gYSBzdGF0aWMgYXJyYXkgKi8KLSNpZm5kZWYgTkVMRU0KLSMgZGVmaW5lIE5FTEVNKHgpICgoaW50KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpKQotI2VuZGlmCi0KLS8qCi0gKiBNYWtlIGEgY29weSBvZiB0aGUgc3RyaW5nLCB1c2luZyAibmV3W10iIGluc3RlYWQgb2YgIm1hbGxvYyIuICBGcmVlIHRoZQotICogc3RyaW5nIHdpdGggZGVsZXRlW10uCi0gKgotICogUmV0dXJucyBOVUxMIGlmICJzdHIiIGlzIE5VTEwuCi0gKi8KLWNoYXIqIHN0cmR1cE5ldyhjb25zdCBjaGFyKiBzdHIpOwotCi0vKgotICogQ29uY2F0ZW5hdGUgYW4gYXJndW1lbnQgdmVjdG9yIGludG8gYSBzaW5nbGUgc3RyaW5nLiAgSWYgYXJnYyBpcyA+PSAwCi0gKiBpdCB3aWxsIGJlIHVzZWQ7IGlmIGl0J3MgPCAwIHRoZW4gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJnIHZlY3RvcgotICogbXVzdCBiZSBOVUxMLgotICoKLSAqIFRoaXMgaW5zZXJ0cyBhIHNwYWNlIGJldHdlZW4gZWFjaCBhcmd1bWVudC4KLSAqCi0gKiBUaGlzIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgYWRkIGRvdWJsZSBxdW90ZXMgYXJvdW5kIGFyZ3VtZW50cyB3aXRoCi0gKiBzcGFjZXMgaW4gdGhlbS4gIFRoaXMgcHJhY3RpY2UgaXMgbmVjZXNzYXJ5IGZvciBXaW4zMiwgYmVjYXVzZSBXaW4zMidzCi0gKiBDcmVhdGVQcm9jZXNzIGNhbGwgaXMgc3R1cGlkLgotICoKLSAqIFRoZSBjYWxsZXIgc2hvdWxkIGRlbGV0ZVtdIHRoZSByZXR1cm5lZCBzdHJpbmcuCi0gKi8KLWNoYXIqIGNvbmNhdEFyZ3YoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSk7Ci0KLS8qCi0gKiBDb3VudCB1cCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiAiYXJndiIuICBUaGUgY291bnQgZG9lcyBub3QgaW5jbHVkZQotICogdGhlIGZpbmFsIE5VTEwgZW50cnkuCi0gKi8KLWludCBjb3VudEFyZ3YoY29uc3QgY2hhciogY29uc3QgYXJndltdKTsKLQotLyoKLSAqIFNvbWUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBmaWxlcy4gIFRoZXNlIGNvdWxkIGJlIG1hZGUKLSAqIHBhcnQgb2YgYSAiRmlsZSIgY2xhc3MuCi0gKi8KLXR5cGVkZWYgZW51bSBGaWxlVHlwZSB7Ci0gICAga0ZpbGVUeXBlVW5rbm93biA9IDAsCi0gICAga0ZpbGVUeXBlTm9uZXhpc3RlbnQsICAgICAgIC8vIGkuZS4gRU5PRU5UCi0gICAga0ZpbGVUeXBlUmVndWxhciwKLSAgICBrRmlsZVR5cGVEaXJlY3RvcnksCi0gICAga0ZpbGVUeXBlQ2hhckRldiwKLSAgICBrRmlsZVR5cGVCbG9ja0RldiwKLSAgICBrRmlsZVR5cGVGaWZvLAotICAgIGtGaWxlVHlwZVN5bWxpbmssCi0gICAga0ZpbGVUeXBlU29ja2V0LAotfSBGaWxlVHlwZTsKLS8qIGdldCB0aGUgZmlsZSdzIHR5cGU7IGZvbGxvd3Mgc3ltbGlua3MgKi8KLUZpbGVUeXBlIGdldEZpbGVUeXBlKGNvbnN0IGNoYXIqIGZpbGVOYW1lKTsKLS8qIGdldCB0aGUgZmlsZSdzIG1vZGlmaWNhdGlvbiBkYXRlOyByZXR1cm5zIC0xIHcvZXJybm8gc2V0IG9uIGZhaWx1cmUgKi8KLXRpbWVfdCBnZXRGaWxlTW9kRGF0ZShjb25zdCBjaGFyKiBmaWxlTmFtZSk7Ci0KLS8qCi0gKiBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBwb3dlciBvZiAyLiAgSGFuZHkgZm9yIGhhc2ggdGFibGVzLgotICovCi11bnNpZ25lZCBpbnQgcm91bmRVcFBvd2VyMih1bnNpZ25lZCBpbnQgdmFsKTsKLQotdm9pZCBzdHJyZXZlcnNlKGNoYXIqIGJlZ2luLCBjaGFyKiBlbmQpOwotdm9pZCBrX2l0b2EoaW50IHZhbHVlLCBjaGFyKiBzdHIsIGludCBiYXNlKTsKLWNoYXIqIGl0b2EoaW50IHZhbCwgaW50IGJhc2UpOwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gX0xJQlNfVVRJTFNfTUlTQ19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL3RocmVhZHMuaCBiL2luY2x1ZGUvdXRpbHMvdGhyZWFkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGUzMzgyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvdGhyZWFkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0xJQlNfVVRJTFNfVEhSRUFEU19ICi0jZGVmaW5lIF9MSUJTX1VUSUxTX1RIUkVBRFNfSAotCi0vKgotICogUGxlYXNlLCBETyBOT1QgVVNFIQotICoKLSAqIFRoaXMgZmlsZSBpcyBoZXJlIG9ubHkgZm9yIGxlZ2FjeSByZWFzb25zLiBJbnN0ZWFkLCBpbmNsdWRlIGRpcmVjdGx5Ci0gKiB0aGUgaGVhZGVycyB5b3UgbmVlZCBiZWxvdy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHV0aWxzL0FuZHJvaWRUaHJlYWRzLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvUldMb2NrLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+Ci0jZW5kaWYKLQotI2VuZGlmIC8vIF9MSUJTX1VUSUxTX1RIUkVBRFNfSApkaWZmIC0tZ2l0IGEvbGlicy9hbmRyb2lkZncvdGVzdHMvSW5wdXRDaGFubmVsX3Rlc3QuY3BwIGIvbGlicy9hbmRyb2lkZncvdGVzdHMvSW5wdXRDaGFubmVsX3Rlc3QuY3BwCmluZGV4IDBlNWQxOWQuLjdmZmY4YWYgMTAwNjQ0Ci0tLSBhL2xpYnMvYW5kcm9pZGZ3L3Rlc3RzL0lucHV0Q2hhbm5lbF90ZXN0LmNwcAorKysgYi9saWJzL2FuZHJvaWRmdy90ZXN0cy9JbnB1dENoYW5uZWxfdGVzdC5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KIAotI2luY2x1ZGUgIi4uLy4uL3V0aWxzL3Rlc3RzL1Rlc3RIZWxwZXJzLmgiCisjaW5jbHVkZSAiVGVzdEhlbHBlcnMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9saWJzL2FuZHJvaWRmdy90ZXN0cy9JbnB1dFB1Ymxpc2hlckFuZENvbnN1bWVyX3Rlc3QuY3BwIGIvbGlicy9hbmRyb2lkZncvdGVzdHMvSW5wdXRQdWJsaXNoZXJBbmRDb25zdW1lcl90ZXN0LmNwcAppbmRleCBiYjQ1MjQ3Li40NDJiNjJmIDEwMDY0NAotLS0gYS9saWJzL2FuZHJvaWRmdy90ZXN0cy9JbnB1dFB1Ymxpc2hlckFuZENvbnN1bWVyX3Rlc3QuY3BwCisrKyBiL2xpYnMvYW5kcm9pZGZ3L3Rlc3RzL0lucHV0UHVibGlzaGVyQW5kQ29uc3VtZXJfdGVzdC5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KIAotI2luY2x1ZGUgIi4uLy4uL3V0aWxzL3Rlc3RzL1Rlc3RIZWxwZXJzLmgiCisjaW5jbHVkZSAiVGVzdEhlbHBlcnMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL3Rlc3RzL1Rlc3RIZWxwZXJzLmggYi9saWJzL2FuZHJvaWRmdy90ZXN0cy9UZXN0SGVscGVycy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJzL3V0aWxzL3Rlc3RzL1Rlc3RIZWxwZXJzLmgKcmVuYW1lIHRvIGxpYnMvYW5kcm9pZGZ3L3Rlc3RzL1Rlc3RIZWxwZXJzLmgKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL0FuZHJvaWQubWsgYi9saWJzL2JpbmRlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ5Mjk4Li4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIHdlIGhhdmUgdGhlIGNvbW1vbiBzb3VyY2VzLCBwbHVzIHNvbWUgZGV2aWNlLXNwZWNpZmljIHN0dWZmCi1zb3VyY2VzIDo9IFwKLSAgICBCaW5kZXIuY3BwIFwKLSAgICBCcEJpbmRlci5jcHAgXAotICAgIElJbnRlcmZhY2UuY3BwIFwKLSAgICBJTWVtb3J5LmNwcCBcCi0gICAgSVBDVGhyZWFkU3RhdGUuY3BwIFwKLSAgICBJUGVybWlzc2lvbkNvbnRyb2xsZXIuY3BwIFwKLSAgICBJU2VydmljZU1hbmFnZXIuY3BwIFwKLSAgICBNZW1vcnlEZWFsZXIuY3BwIFwKLSAgICBNZW1vcnlCYXNlLmNwcCBcCi0gICAgTWVtb3J5SGVhcEJhc2UuY3BwIFwKLSAgICBQYXJjZWwuY3BwIFwKLSAgICBQZXJtaXNzaW9uQ2FjaGUuY3BwIFwKLSAgICBQcm9jZXNzU3RhdGUuY3BwIFwKLSAgICBTdGF0aWMuY3BwCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0xETElCUyArPSAtbHB0aHJlYWQKLUxPQ0FMX01PRFVMRSA6PSBsaWJiaW5kZXIKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nIGxpYmN1dGlscyBsaWJ1dGlscwotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoc291cmNlcykKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkCi1MT0NBTF9NT0RVTEUgOj0gbGliYmluZGVyCi1MT0NBTF9TUkNfRklMRVMgOj0gJChzb3VyY2VzKQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvQmluZGVyLmNwcCBiL2xpYnMvYmluZGVyL0JpbmRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMGQ4YTMuLjAwMDAwMDAKLS0tIGEvbGlicy9iaW5kZXIvQmluZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgotI2luY2x1ZGUgPGJpbmRlci9CcEJpbmRlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSUJpbmRlcjo6SUJpbmRlcigpCi0gICAgOiBSZWZCYXNlKCkKLXsKLX0KLQotSUJpbmRlcjo6fklCaW5kZXIoKQotewotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3A8SUludGVyZmFjZT4gIElCaW5kZXI6OnF1ZXJ5TG9jYWxJbnRlcmZhY2UoY29uc3QgU3RyaW5nMTYmIGRlc2NyaXB0b3IpCi17Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLUJCaW5kZXIqIElCaW5kZXI6OmxvY2FsQmluZGVyKCkKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotQnBCaW5kZXIqIElCaW5kZXI6OnJlbW90ZUJpbmRlcigpCi17Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWJvb2wgSUJpbmRlcjo6Y2hlY2tTdWJjbGFzcyhjb25zdCB2b2lkKiAvKnN1YmNsYXNzSUQqLykgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCQmluZGVyOjpFeHRyYXMKLXsKLXB1YmxpYzoKLSAgICBNdXRleCBtTG9jazsKLSAgICBCcEJpbmRlcjo6T2JqZWN0TWFuYWdlciBtT2JqZWN0czsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CQmluZGVyOjpCQmluZGVyKCkKLSAgICA6IG1FeHRyYXMoTlVMTCkKLXsKLX0KLQotYm9vbCBCQmluZGVyOjppc0JpbmRlckFsaXZlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdHVzX3QgQkJpbmRlcjo6cGluZ0JpbmRlcigpCi17Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1jb25zdCBTdHJpbmcxNiYgQkJpbmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpIGNvbnN0Ci17Ci0gICAgLy8gVGhpcyBpcyBhIGxvY2FsIHN0YXRpYyByYXRoZXIgdGhhbiBhIGdsb2JhbCBzdGF0aWMsCi0gICAgLy8gdG8gYXZvaWQgc3RhdGljIGluaXRpYWxpemVyIG9yZGVyaW5nIGlzc3Vlcy4KLSAgICBzdGF0aWMgU3RyaW5nMTYgc0VtcHR5RGVzY3JpcHRvcjsKLSAgICBBTE9HVygicmVhY2hlZCBCQmluZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yICh0aGlzPSVwKSIsIHRoaXMpOwotICAgIHJldHVybiBzRW1wdHlEZXNjcmlwdG9yOwotfQotCi1zdGF0dXNfdCBCQmluZGVyOjp0cmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKDApOwotCi0gICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7Ci0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgUElOR19UUkFOU0FDVElPTjoKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHBpbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IG9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChyZXBseSAhPSBOVUxMKSB7Ci0gICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24oMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQkJpbmRlcjo6bGlua1RvRGVhdGgoCi0gICAgY29uc3Qgc3A8RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsIHZvaWQqIGNvb2tpZSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBCQmluZGVyOjp1bmxpbmtUb0RlYXRoKAotICAgIGNvbnN0IHdwPERlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LCB2b2lkKiBjb29raWUsIHVpbnQzMl90IGZsYWdzLAotICAgIHdwPERlYXRoUmVjaXBpZW50Piogb3V0UmVjaXBpZW50KQotewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgQkJpbmRlcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEJCaW5kZXI6OmF0dGFjaE9iamVjdCgKLSAgICBjb25zdCB2b2lkKiBvYmplY3RJRCwgdm9pZCogb2JqZWN0LCB2b2lkKiBjbGVhbnVwQ29va2llLAotICAgIG9iamVjdF9jbGVhbnVwX2Z1bmMgZnVuYykKLXsKLSAgICBFeHRyYXMqIGUgPSBtRXh0cmFzOwotCi0gICAgaWYgKCFlKSB7Ci0gICAgICAgIGUgPSBuZXcgRXh0cmFzOwotICAgICAgICBpZiAoYW5kcm9pZF9hdG9taWNfY21weGNoZygwLCByZWludGVycHJldF9jYXN0PGludDMyX3Q+KGUpLAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgaW50MzJfdCo+KCZtRXh0cmFzKSkgIT0gMCkgewotICAgICAgICAgICAgZGVsZXRlIGU7Ci0gICAgICAgICAgICBlID0gbUV4dHJhczsKLSAgICAgICAgfQotICAgICAgICBpZiAoZSA9PSAwKSByZXR1cm47IC8vIG91dCBvZiBtZW1vcnkKLSAgICB9Ci0KLSAgICBBdXRvTXV0ZXggX2woZS0+bUxvY2spOwotICAgIGUtPm1PYmplY3RzLmF0dGFjaChvYmplY3RJRCwgb2JqZWN0LCBjbGVhbnVwQ29va2llLCBmdW5jKTsKLX0KLQotdm9pZCogQkJpbmRlcjo6ZmluZE9iamVjdChjb25zdCB2b2lkKiBvYmplY3RJRCkgY29uc3QKLXsKLSAgICBFeHRyYXMqIGUgPSBtRXh0cmFzOwotICAgIGlmICghZSkgcmV0dXJuIE5VTEw7Ci0KLSAgICBBdXRvTXV0ZXggX2woZS0+bUxvY2spOwotICAgIHJldHVybiBlLT5tT2JqZWN0cy5maW5kKG9iamVjdElEKTsKLX0KLQotdm9pZCBCQmluZGVyOjpkZXRhY2hPYmplY3QoY29uc3Qgdm9pZCogb2JqZWN0SUQpCi17Ci0gICAgRXh0cmFzKiBlID0gbUV4dHJhczsKLSAgICBpZiAoIWUpIHJldHVybjsKLQotICAgIEF1dG9NdXRleCBfbChlLT5tTG9jayk7Ci0gICAgZS0+bU9iamVjdHMuZGV0YWNoKG9iamVjdElEKTsKLX0KLQotQkJpbmRlciogQkJpbmRlcjo6bG9jYWxCaW5kZXIoKQotewotICAgIHJldHVybiB0aGlzOwotfQotCi1CQmluZGVyOjp+QkJpbmRlcigpCi17Ci0gICAgaWYgKG1FeHRyYXMpIGRlbGV0ZSBtRXh0cmFzOwotfQotCi0KLXN0YXR1c190IEJCaW5kZXI6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT046Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmcxNihnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotCi0gICAgICAgIGNhc2UgRFVNUF9UUkFOU0FDVElPTjogewotICAgICAgICAgICAgaW50IGZkID0gZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIGludCBhcmdjID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYyAmJiBkYXRhLmRhdGFBdmFpbCgpID4gMDsgaSsrKSB7Ci0gICAgICAgICAgICAgICBhcmdzLmFkZChkYXRhLnJlYWRTdHJpbmcxNigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkdW1wKGZkLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fVFJBTlNBQ1RJT047Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZW51bSB7Ci0gICAgLy8gVGhpcyBpcyB1c2VkIHRvIHRyYW5zZmVyIG93bmVyc2hpcCBvZiB0aGUgcmVtb3RlIGJpbmRlciBmcm9tCi0gICAgLy8gdGhlIEJwUmVmQmFzZSBvYmplY3QgaG9sZGluZyBpdCAod2hlbiBpdCBpcyBjb25zdHJ1Y3RlZCksIHRvIHRoZQotICAgIC8vIG93bmVyIG9mIHRoZSBCcFJlZkJhc2Ugb2JqZWN0IHdoZW4gaXQgZmlyc3QgYWNxdWlyZXMgdGhhdCBCcFJlZkJhc2UuCi0gICAga1JlbW90ZUFjcXVpcmVkID0gMHgwMDAwMDAwMQotfTsKLQotQnBSZWZCYXNlOjpCcFJlZkJhc2UoY29uc3Qgc3A8SUJpbmRlcj4mIG8pCi0gICAgOiBtUmVtb3RlKG8uZ2V0KCkpLCBtUmVmcyhOVUxMKSwgbVN0YXRlKDApCi17Ci0gICAgZXh0ZW5kT2JqZWN0TGlmZXRpbWUoT0JKRUNUX0xJRkVUSU1FX1dFQUspOwotCi0gICAgaWYgKG1SZW1vdGUpIHsKLSAgICAgICAgbVJlbW90ZS0+aW5jU3Ryb25nKHRoaXMpOyAgICAgICAgICAgLy8gUmVtb3ZlZCBvbiBmaXJzdCBJbmNTdHJvbmcoKS4KLSAgICAgICAgbVJlZnMgPSBtUmVtb3RlLT5jcmVhdGVXZWFrKHRoaXMpOyAgLy8gSGVsZCBmb3Igb3VyIGVudGlyZSBsaWZldGltZS4KLSAgICB9Ci19Ci0KLUJwUmVmQmFzZTo6fkJwUmVmQmFzZSgpCi17Ci0gICAgaWYgKG1SZW1vdGUpIHsKLSAgICAgICAgaWYgKCEobVN0YXRlJmtSZW1vdGVBY3F1aXJlZCkpIHsKLSAgICAgICAgICAgIG1SZW1vdGUtPmRlY1N0cm9uZyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBtUmVmcy0+ZGVjV2Vhayh0aGlzKTsKLSAgICB9Ci19Ci0KLXZvaWQgQnBSZWZCYXNlOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBhbmRyb2lkX2F0b21pY19vcihrUmVtb3RlQWNxdWlyZWQsICZtU3RhdGUpOwotfQotCi12b2lkIEJwUmVmQmFzZTo6b25MYXN0U3Ryb25nUmVmKGNvbnN0IHZvaWQqIGlkKQotewotICAgIGlmIChtUmVtb3RlKSB7Ci0gICAgICAgIG1SZW1vdGUtPmRlY1N0cm9uZyh0aGlzKTsKLSAgICB9Ci19Ci0KLWJvb2wgQnBSZWZCYXNlOjpvbkluY1N0cm9uZ0F0dGVtcHRlZCh1aW50MzJfdCBmbGFncywgY29uc3Qgdm9pZCogaWQpCi17Ci0gICAgcmV0dXJuIG1SZW1vdGUgPyBtUmVmcy0+YXR0ZW1wdEluY1N0cm9uZyh0aGlzKSA6IGZhbHNlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL0JwQmluZGVyLmNwcCBiL2xpYnMvYmluZGVyL0JwQmluZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhNjJkYi4uMDAwMDAwMAotLS0gYS9saWJzL2JpbmRlci9CcEJpbmRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQnBCaW5kZXIiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxiaW5kZXIvQnBCaW5kZXIuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLy8jdW5kZWYgQUxPR1YKLS8vI2RlZmluZSBBTE9HViguLi4pIGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXykKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQnBCaW5kZXI6Ok9iamVjdE1hbmFnZXI6Ok9iamVjdE1hbmFnZXIoKQotewotfQotCi1CcEJpbmRlcjo6T2JqZWN0TWFuYWdlcjo6fk9iamVjdE1hbmFnZXIoKQotewotICAgIGtpbGwoKTsKLX0KLQotdm9pZCBCcEJpbmRlcjo6T2JqZWN0TWFuYWdlcjo6YXR0YWNoKAotICAgIGNvbnN0IHZvaWQqIG9iamVjdElELCB2b2lkKiBvYmplY3QsIHZvaWQqIGNsZWFudXBDb29raWUsCi0gICAgSUJpbmRlcjo6b2JqZWN0X2NsZWFudXBfZnVuYyBmdW5jKQotewotICAgIGVudHJ5X3QgZTsKLSAgICBlLm9iamVjdCA9IG9iamVjdDsKLSAgICBlLmNsZWFudXBDb29raWUgPSBjbGVhbnVwQ29va2llOwotICAgIGUuZnVuYyA9IGZ1bmM7Ci0KLSAgICBpZiAobU9iamVjdHMuaW5kZXhPZktleShvYmplY3RJRCkgPj0gMCkgewotICAgICAgICBBTE9HRSgiVHJ5aW5nIHRvIGF0dGFjaCBvYmplY3QgSUQgJXAgdG8gYmluZGVyIE9iamVjdE1hbmFnZXIgJXAgd2l0aCBvYmplY3QgJXAsIGJ1dCBvYmplY3QgSUQgYWxyZWFkeSBpbiB1c2UiLAotICAgICAgICAgICAgICAgIG9iamVjdElELCB0aGlzLCAgb2JqZWN0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1PYmplY3RzLmFkZChvYmplY3RJRCwgZSk7Ci19Ci0KLXZvaWQqIEJwQmluZGVyOjpPYmplY3RNYW5hZ2VyOjpmaW5kKGNvbnN0IHZvaWQqIG9iamVjdElEKSBjb25zdAotewotICAgIGNvbnN0IHNzaXplX3QgaSA9IG1PYmplY3RzLmluZGV4T2ZLZXkob2JqZWN0SUQpOwotICAgIGlmIChpIDwgMCkgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIG1PYmplY3RzLnZhbHVlQXQoaSkub2JqZWN0OwotfQotCi12b2lkIEJwQmluZGVyOjpPYmplY3RNYW5hZ2VyOjpkZXRhY2goY29uc3Qgdm9pZCogb2JqZWN0SUQpCi17Ci0gICAgbU9iamVjdHMucmVtb3ZlSXRlbShvYmplY3RJRCk7Ci19Ci0KLXZvaWQgQnBCaW5kZXI6Ok9iamVjdE1hbmFnZXI6OmtpbGwoKQotewotICAgIGNvbnN0IHNpemVfdCBOID0gbU9iamVjdHMuc2l6ZSgpOwotICAgIEFMT0dWKCJLaWxsaW5nICVkIG9iamVjdHMgaW4gbWFuYWdlciAlcCIsIE4sIHRoaXMpOwotICAgIGZvciAoc2l6ZV90IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgY29uc3QgZW50cnlfdCYgZSA9IG1PYmplY3RzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChlLmZ1bmMgIT0gTlVMTCkgewotICAgICAgICAgICAgZS5mdW5jKG1PYmplY3RzLmtleUF0KGkpLCBlLm9iamVjdCwgZS5jbGVhbnVwQ29va2llKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1PYmplY3RzLmNsZWFyKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CcEJpbmRlcjo6QnBCaW5kZXIoaW50MzJfdCBoYW5kbGUpCi0gICAgOiBtSGFuZGxlKGhhbmRsZSkKLSAgICAsIG1BbGl2ZSgxKQotICAgICwgbU9iaXRzU2VudCgwKQotICAgICwgbU9iaXR1YXJpZXMoTlVMTCkKLXsKLSAgICBBTE9HVigiQ3JlYXRpbmcgQnBCaW5kZXIgJXAgaGFuZGxlICVkXG4iLCB0aGlzLCBtSGFuZGxlKTsKLQotICAgIGV4dGVuZE9iamVjdExpZmV0aW1lKE9CSkVDVF9MSUZFVElNRV9XRUFLKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pbmNXZWFrSGFuZGxlKGhhbmRsZSk7Ci19Ci0KLWJvb2wgQnBCaW5kZXI6OmlzRGVzY3JpcHRvckNhY2hlZCgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtRGVzY3JpcHRvckNhY2hlLnNpemUoKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotY29uc3QgU3RyaW5nMTYmIEJwQmluZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkgY29uc3QKLXsKLSAgICBpZiAoaXNEZXNjcmlwdG9yQ2FjaGVkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgUGFyY2VsIHNlbmQsIHJlcGx5OwotICAgICAgICAvLyBkbyB0aGUgSVBDIHdpdGhvdXQgYSBsb2NrIGhlbGQuCi0gICAgICAgIHN0YXR1c190IGVyciA9IGNvbnN0X2Nhc3Q8QnBCaW5kZXIqPih0aGlzKS0+dHJhbnNhY3QoCi0gICAgICAgICAgICAgICAgSU5URVJGQUNFX1RSQU5TQUNUSU9OLCBzZW5kLCAmcmVwbHkpOwotICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBTdHJpbmcxNiByZXMocmVwbHkucmVhZFN0cmluZzE2KCkpOwotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgICAgIC8vIG1EZXNjcmlwdG9yQ2FjaGUgY291bGQgaGF2ZSBiZWVuIGFzc2lnbmVkIHdoaWxlIHRoZSBsb2NrIHdhcwotICAgICAgICAgICAgLy8gcmVsZWFzZWQuCi0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3JDYWNoZS5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvckNhY2hlID0gcmVzOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIHdlJ3JlIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIG5vbi1zdGF0aWMgb2JqZWN0IGhlcmUuIFVzdWFsbHkgdGhpcwotICAgIC8vIGlzIG5vdCBzb21ldGhpbmcgc21hcnQgdG8gZG8sIGhvd2V2ZXIsIHdpdGggYmluZGVyIG9iamVjdHMgaXQgaXMgCi0gICAgLy8gKHVzdWFsbHkpIHNhZmUgYmVjYXVzZSB0aGV5IGFyZSByZWZlcmVuY2UtY291bnRlZC4KLSAgICAKLSAgICByZXR1cm4gbURlc2NyaXB0b3JDYWNoZTsKLX0KLQotYm9vbCBCcEJpbmRlcjo6aXNCaW5kZXJBbGl2ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1BbGl2ZSAhPSAwOwotfQotCi1zdGF0dXNfdCBCcEJpbmRlcjo6cGluZ0JpbmRlcigpCi17Ci0gICAgUGFyY2VsIHNlbmQ7Ci0gICAgUGFyY2VsIHJlcGx5OwotICAgIHN0YXR1c190IGVyciA9IHRyYW5zYWN0KFBJTkdfVFJBTlNBQ1RJT04sIHNlbmQsICZyZXBseSk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgcmV0dXJuIGVycjsKLSAgICBpZiAocmVwbHkuZGF0YVNpemUoKSA8IHNpemVvZihzdGF0dXNfdCkpIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgcmV0dXJuIChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLX0KLQotc3RhdHVzX3QgQnBCaW5kZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIFBhcmNlbCBzZW5kOwotICAgIFBhcmNlbCByZXBseTsKLSAgICBzZW5kLndyaXRlRmlsZURlc2NyaXB0b3IoZmQpOwotICAgIGNvbnN0IHNpemVfdCBudW1BcmdzID0gYXJncy5zaXplKCk7Ci0gICAgc2VuZC53cml0ZUludDMyKG51bUFyZ3MpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgIHNlbmQud3JpdGVTdHJpbmcxNihhcmdzW2ldKTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gdHJhbnNhY3QoRFVNUF9UUkFOU0FDVElPTiwgc2VuZCwgJnJlcGx5KTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBCcEJpbmRlcjo6dHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICAvLyBPbmNlIGEgYmluZGVyIGhhcyBkaWVkLCBpdCB3aWxsIG5ldmVyIGNvbWUgYmFjayB0byBsaWZlLgotICAgIGlmIChtQWxpdmUpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+dHJhbnNhY3QoCi0gICAgICAgICAgICBtSGFuZGxlLCBjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgICAgICBpZiAoc3RhdHVzID09IERFQURfT0JKRUNUKSBtQWxpdmUgPSAwOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHJldHVybiBERUFEX09CSkVDVDsKLX0KLQotc3RhdHVzX3QgQnBCaW5kZXI6OmxpbmtUb0RlYXRoKAotICAgIGNvbnN0IHNwPERlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LCB2b2lkKiBjb29raWUsIHVpbnQzMl90IGZsYWdzKQotewotICAgIE9iaXR1YXJ5IG9iOwotICAgIG9iLnJlY2lwaWVudCA9IHJlY2lwaWVudDsKLSAgICBvYi5jb29raWUgPSBjb29raWU7Ci0gICAgb2IuZmxhZ3MgPSBmbGFnczsKLQotICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVjaXBpZW50ID09IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAibGlua1RvRGVhdGgoKTogcmVjaXBpZW50IG11c3QgYmUgbm9uLU5VTEwiKTsKLQotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLQotICAgICAgICBpZiAoIW1PYml0c1NlbnQpIHsKLSAgICAgICAgICAgIGlmICghbU9iaXR1YXJpZXMpIHsKLSAgICAgICAgICAgICAgICBtT2JpdHVhcmllcyA9IG5ldyBWZWN0b3I8T2JpdHVhcnk+OwotICAgICAgICAgICAgICAgIGlmICghbU9iaXR1YXJpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlJlcXVlc3RpbmcgZGVhdGggbm90aWZpY2F0aW9uOiAlcCBoYW5kbGUgJWRcbiIsIHRoaXMsIG1IYW5kbGUpOwotICAgICAgICAgICAgICAgIGdldFdlYWtSZWZzKCktPmluY1dlYWsodGhpcyk7Ci0gICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGUqIHNlbGYgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgICAgICAgICAgICAgIHNlbGYtPnJlcXVlc3REZWF0aE5vdGlmaWNhdGlvbihtSGFuZGxlLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBzZWxmLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzc2l6ZV90IHJlcyA9IG1PYml0dWFyaWVzLT5hZGQob2IpOwotICAgICAgICAgICAgcmV0dXJuIHJlcyA+PSAoc3NpemVfdClOT19FUlJPUiA/IChzdGF0dXNfdClOT19FUlJPUiA6IHJlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBERUFEX09CSkVDVDsKLX0KLQotc3RhdHVzX3QgQnBCaW5kZXI6OnVubGlua1RvRGVhdGgoCi0gICAgY29uc3Qgd3A8RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsIHZvaWQqIGNvb2tpZSwgdWludDMyX3QgZmxhZ3MsCi0gICAgd3A8RGVhdGhSZWNpcGllbnQ+KiBvdXRSZWNpcGllbnQpCi17Ci0gICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLQotICAgIGlmIChtT2JpdHNTZW50KSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICBjb25zdCBzaXplX3QgTiA9IG1PYml0dWFyaWVzID8gbU9iaXR1YXJpZXMtPnNpemUoKSA6IDA7Ci0gICAgZm9yIChzaXplX3QgaT0wOyBpPE47IGkrKykgewotICAgICAgICBjb25zdCBPYml0dWFyeSYgb2JpdCA9IG1PYml0dWFyaWVzLT5pdGVtQXQoaSk7Ci0gICAgICAgIGlmICgob2JpdC5yZWNpcGllbnQgPT0gcmVjaXBpZW50Ci0gICAgICAgICAgICAgICAgICAgIHx8IChyZWNpcGllbnQgPT0gTlVMTCAmJiBvYml0LmNvb2tpZSA9PSBjb29raWUpKQotICAgICAgICAgICAgICAgICYmIG9iaXQuZmxhZ3MgPT0gZmxhZ3MpIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGFsbEZsYWdzID0gb2JpdC5mbGFnc3xmbGFnczsKLSAgICAgICAgICAgIGlmIChvdXRSZWNpcGllbnQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpvdXRSZWNpcGllbnQgPSBtT2JpdHVhcmllcy0+aXRlbUF0KGkpLnJlY2lwaWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1PYml0dWFyaWVzLT5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGlmIChtT2JpdHVhcmllcy0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiQ2xlYXJpbmcgZGVhdGggbm90aWZpY2F0aW9uOiAlcCBoYW5kbGUgJWRcbiIsIHRoaXMsIG1IYW5kbGUpOwotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlKiBzZWxmID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICAgICAgICAgICAgICBzZWxmLT5jbGVhckRlYXRoTm90aWZpY2F0aW9uKG1IYW5kbGUsIHRoaXMpOwotICAgICAgICAgICAgICAgIHNlbGYtPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgbU9iaXR1YXJpZXM7Ci0gICAgICAgICAgICAgICAgbU9iaXR1YXJpZXMgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotfQotCi12b2lkIEJwQmluZGVyOjpzZW5kT2JpdHVhcnkoKQotewotICAgIEFMT0dWKCJTZW5kaW5nIG9iaXR1YXJ5IGZvciBwcm94eSAlcCBoYW5kbGUgJWQsIG1PYml0c1NlbnQ9JXNcbiIsCi0gICAgICAgIHRoaXMsIG1IYW5kbGUsIG1PYml0c1NlbnQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQotICAgIG1BbGl2ZSA9IDA7Ci0gICAgaWYgKG1PYml0c1NlbnQpIHJldHVybjsKLQotICAgIG1Mb2NrLmxvY2soKTsKLSAgICBWZWN0b3I8T2JpdHVhcnk+KiBvYml0cyA9IG1PYml0dWFyaWVzOwotICAgIGlmKG9iaXRzICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIkNsZWFyaW5nIHNlbnQgZGVhdGggbm90aWZpY2F0aW9uOiAlcCBoYW5kbGUgJWRcbiIsIHRoaXMsIG1IYW5kbGUpOwotICAgICAgICBJUENUaHJlYWRTdGF0ZSogc2VsZiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgICAgIHNlbGYtPmNsZWFyRGVhdGhOb3RpZmljYXRpb24obUhhbmRsZSwgdGhpcyk7Ci0gICAgICAgIHNlbGYtPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgbU9iaXR1YXJpZXMgPSBOVUxMOwotICAgIH0KLSAgICBtT2JpdHNTZW50ID0gMTsKLSAgICBtTG9jay51bmxvY2soKTsKLQotICAgIEFMT0dWKCJSZXBvcnRpbmcgZGVhdGggb2YgcHJveHkgJXAgZm9yICVkIHJlY2lwaWVudHNcbiIsCi0gICAgICAgIHRoaXMsIG9iaXRzID8gb2JpdHMtPnNpemUoKSA6IDApOwotCi0gICAgaWYgKG9iaXRzICE9IE5VTEwpIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90IE4gPSBvYml0cy0+c2l6ZSgpOwotICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICByZXBvcnRPbmVEZWF0aChvYml0cy0+aXRlbUF0KGkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlbGV0ZSBvYml0czsKLSAgICB9Ci19Ci0KLXZvaWQgQnBCaW5kZXI6OnJlcG9ydE9uZURlYXRoKGNvbnN0IE9iaXR1YXJ5JiBvYml0KQotewotICAgIHNwPERlYXRoUmVjaXBpZW50PiByZWNpcGllbnQgPSBvYml0LnJlY2lwaWVudC5wcm9tb3RlKCk7Ci0gICAgQUxPR1YoIlJlcG9ydGluZyBkZWF0aCB0byByZWNpcGllbnQ6ICVwXG4iLCByZWNpcGllbnQuZ2V0KCkpOwotICAgIGlmIChyZWNpcGllbnQgPT0gTlVMTCkgcmV0dXJuOwotCi0gICAgcmVjaXBpZW50LT5iaW5kZXJEaWVkKHRoaXMpOwotfQotCi0KLXZvaWQgQnBCaW5kZXI6OmF0dGFjaE9iamVjdCgKLSAgICBjb25zdCB2b2lkKiBvYmplY3RJRCwgdm9pZCogb2JqZWN0LCB2b2lkKiBjbGVhbnVwQ29va2llLAotICAgIG9iamVjdF9jbGVhbnVwX2Z1bmMgZnVuYykKLXsKLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIEFMT0dWKCJBdHRhY2hpbmcgb2JqZWN0ICVwIHRvIGJpbmRlciAlcCAobWFuYWdlcj0lcCkiLCBvYmplY3QsIHRoaXMsICZtT2JqZWN0cyk7Ci0gICAgbU9iamVjdHMuYXR0YWNoKG9iamVjdElELCBvYmplY3QsIGNsZWFudXBDb29raWUsIGZ1bmMpOwotfQotCi12b2lkKiBCcEJpbmRlcjo6ZmluZE9iamVjdChjb25zdCB2b2lkKiBvYmplY3RJRCkgY29uc3QKLXsKLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIHJldHVybiBtT2JqZWN0cy5maW5kKG9iamVjdElEKTsKLX0KLQotdm9pZCBCcEJpbmRlcjo6ZGV0YWNoT2JqZWN0KGNvbnN0IHZvaWQqIG9iamVjdElEKQotewotICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgbU9iamVjdHMuZGV0YWNoKG9iamVjdElEKTsKLX0KLQotQnBCaW5kZXIqIEJwQmluZGVyOjpyZW1vdGVCaW5kZXIoKQotewotICAgIHJldHVybiB0aGlzOwotfQotCi1CcEJpbmRlcjo6fkJwQmluZGVyKCkKLXsKLSAgICBBTE9HVigiRGVzdHJveWluZyBCcEJpbmRlciAlcCBoYW5kbGUgJWRcbiIsIHRoaXMsIG1IYW5kbGUpOwotCi0gICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0KLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgVmVjdG9yPE9iaXR1YXJ5Piogb2JpdHMgPSBtT2JpdHVhcmllczsKLSAgICBpZihvYml0cyAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChpcGMpIGlwYy0+Y2xlYXJEZWF0aE5vdGlmaWNhdGlvbihtSGFuZGxlLCB0aGlzKTsKLSAgICAgICAgbU9iaXR1YXJpZXMgPSBOVUxMOwotICAgIH0KLSAgICBtTG9jay51bmxvY2soKTsKLQotICAgIGlmIChvYml0cyAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFhYWCBTaG91bGQgd2UgdGVsbCBhbnkgcmVtYWluaW5nIERlYXRoUmVjaXBpZW50Ci0gICAgICAgIC8vIG9iamVjdHMgdGhhdCB0aGUgbGFzdCBzdHJvbmcgcmVmIGhhcyBnb25lIGF3YXksIHNvIHRoZXkKLSAgICAgICAgLy8gYXJlIG5vIGxvbmdlciBsaW5rZWQ/Ci0gICAgICAgIGRlbGV0ZSBvYml0czsKLSAgICB9Ci0KLSAgICBpZiAoaXBjKSB7Ci0gICAgICAgIGlwYy0+ZXhwdW5nZUhhbmRsZShtSGFuZGxlLCB0aGlzKTsKLSAgICAgICAgaXBjLT5kZWNXZWFrSGFuZGxlKG1IYW5kbGUpOwotICAgIH0KLX0KLQotdm9pZCBCcEJpbmRlcjo6b25GaXJzdFJlZigpCi17Ci0gICAgQUxPR1YoIm9uRmlyc3RSZWYgQnBCaW5kZXIgJXAgaGFuZGxlICVkXG4iLCB0aGlzLCBtSGFuZGxlKTsKLSAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICBpZiAoaXBjKSBpcGMtPmluY1N0cm9uZ0hhbmRsZShtSGFuZGxlKTsKLX0KLQotdm9pZCBCcEJpbmRlcjo6b25MYXN0U3Ryb25nUmVmKGNvbnN0IHZvaWQqIGlkKQotewotICAgIEFMT0dWKCJvbkxhc3RTdHJvbmdSZWYgQnBCaW5kZXIgJXAgaGFuZGxlICVkXG4iLCB0aGlzLCBtSGFuZGxlKTsKLSAgICBJRl9BTE9HVigpIHsKLSAgICAgICAgcHJpbnRSZWZzKCk7Ci0gICAgfQotICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgIGlmIChpcGMpIGlwYy0+ZGVjU3Ryb25nSGFuZGxlKG1IYW5kbGUpOwotfQotCi1ib29sIEJwQmluZGVyOjpvbkluY1N0cm9uZ0F0dGVtcHRlZCh1aW50MzJfdCBmbGFncywgY29uc3Qgdm9pZCogaWQpCi17Ci0gICAgQUxPR1YoIm9uSW5jU3Ryb25nQXR0ZW1wdGVkIEJwQmluZGVyICVwIGhhbmRsZSAlZFxuIiwgdGhpcywgbUhhbmRsZSk7Ci0gICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgcmV0dXJuIGlwYyA/IGlwYy0+YXR0ZW1wdEluY1N0cm9uZ0hhbmRsZShtSGFuZGxlKSA9PSBOT19FUlJPUiA6IGZhbHNlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL0lJbnRlcmZhY2UuY3BwIGIvbGlicy9iaW5kZXIvSUludGVyZmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YWNmNWQuLjAwMDAwMDAKLS0tIGEvbGlicy9iaW5kZXIvSUludGVyZmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlJbnRlcmZhY2U6OklJbnRlcmZhY2UoKSAKLSAgICA6IFJlZkJhc2UoKSB7Ci19Ci0KLUlJbnRlcmZhY2U6On5JSW50ZXJmYWNlKCkgewotfQotCi1zcDxJQmluZGVyPiBJSW50ZXJmYWNlOjphc0JpbmRlcigpCi17Ci0gICAgcmV0dXJuIHRoaXMgPyBvbkFzQmluZGVyKCkgOiBOVUxMOwotfQotCi1zcDxjb25zdCBJQmluZGVyPiBJSW50ZXJmYWNlOjphc0JpbmRlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHRoaXMgPyBjb25zdF9jYXN0PElJbnRlcmZhY2UqPih0aGlzKS0+b25Bc0JpbmRlcigpIDogTlVMTDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9JTWVtb3J5LmNwcCBiL2xpYnMvYmluZGVyL0lNZW1vcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDI0NTFhLi4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL0lNZW1vcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIklNZW1vcnkiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+Ci0KLSNkZWZpbmUgVkVSQk9TRSAgIDAKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhlYXBDYWNoZSA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAotewotcHVibGljOgotICAgIEhlYXBDYWNoZSgpOwotICAgIHZpcnR1YWwgfkhlYXBDYWNoZSgpOwotCi0gICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7Ci0KLSAgICBzcDxJTWVtb3J5SGVhcD4gZmluZF9oZWFwKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpOwotICAgIHZvaWQgZnJlZV9oZWFwKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpOwotICAgIHNwPElNZW1vcnlIZWFwPiBnZXRfaGVhcChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKTsKLSAgICB2b2lkIGR1bXBfaGVhcHMoKTsKLQotcHJpdmF0ZToKLSAgICAvLyBGb3IgSU1lbW9yeS5jcHAKLSAgICBzdHJ1Y3QgaGVhcF9pbmZvX3QgewotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcDsKLSAgICAgICAgaW50MzJfdCAgICAgICAgIGNvdW50OwotICAgIH07Ci0KLSAgICB2b2lkIGZyZWVfaGVhcChjb25zdCB3cDxJQmluZGVyPiYgYmluZGVyKTsKLQotICAgIE11dGV4IG1IZWFwQ2FjaGVMb2NrOwotICAgIEtleWVkVmVjdG9yPCB3cDxJQmluZGVyPiwgaGVhcF9pbmZvX3QgPiBtSGVhcENhY2hlOwotfTsKLQotc3RhdGljIHNwPEhlYXBDYWNoZT4gZ0hlYXBDYWNoZSA9IG5ldyBIZWFwQ2FjaGUoKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotZW51bSB7Ci0gICAgSEVBUF9JRCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04KLX07Ci0KLWNsYXNzIEJwTWVtb3J5SGVhcCA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVtb3J5SGVhcD4KLXsKLXB1YmxpYzoKLSAgICBCcE1lbW9yeUhlYXAoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpOwotICAgIHZpcnR1YWwgfkJwTWVtb3J5SGVhcCgpOwotCi0gICAgdmlydHVhbCBpbnQgZ2V0SGVhcElEKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkKiBnZXRCYXNlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldE9mZnNldCgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBJTWVtb3J5OwotICAgIGZyaWVuZCBjbGFzcyBIZWFwQ2FjaGU7Ci0KLSAgICAvLyBmb3IgZGVidWdnaW5nIGluIHRoaXMgbW9kdWxlCi0gICAgc3RhdGljIGlubGluZSBzcDxJTWVtb3J5SGVhcD4gZmluZF9oZWFwKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpIHsKLSAgICAgICAgcmV0dXJuIGdIZWFwQ2FjaGUtPmZpbmRfaGVhcChiaW5kZXIpOwotICAgIH0KLSAgICBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9oZWFwKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpIHsKLSAgICAgICAgZ0hlYXBDYWNoZS0+ZnJlZV9oZWFwKGJpbmRlcik7Ci0gICAgfQotICAgIHN0YXRpYyBpbmxpbmUgc3A8SU1lbW9yeUhlYXA+IGdldF9oZWFwKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpIHsKLSAgICAgICAgcmV0dXJuIGdIZWFwQ2FjaGUtPmdldF9oZWFwKGJpbmRlcik7Ci0gICAgfQotICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2hlYXBzKCkgewotICAgICAgICBnSGVhcENhY2hlLT5kdW1wX2hlYXBzKCk7Ci0gICAgfQotCi0gICAgdm9pZCBhc3NlcnRNYXBwZWQoKSBjb25zdDsKLSAgICB2b2lkIGFzc2VydFJlYWxseU1hcHBlZCgpIGNvbnN0OwotCi0gICAgbXV0YWJsZSB2b2xhdGlsZSBpbnQzMl90IG1IZWFwSWQ7Ci0gICAgbXV0YWJsZSB2b2lkKiAgICAgICBtQmFzZTsKLSAgICBtdXRhYmxlIHNpemVfdCAgICAgIG1TaXplOwotICAgIG11dGFibGUgdWludDMyX3QgICAgbUZsYWdzOwotICAgIG11dGFibGUgdWludDMyX3QgICAgbU9mZnNldDsKLSAgICBtdXRhYmxlIGJvb2wgICAgICAgIG1SZWFsSGVhcDsKLSAgICBtdXRhYmxlIE11dGV4ICAgICAgIG1Mb2NrOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lbnVtIHsKLSAgICBHRVRfTUVNT1JZID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTgotfTsKLQotY2xhc3MgQnBNZW1vcnkgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lbW9yeT4KLXsKLXB1YmxpYzoKLSAgICBCcE1lbW9yeShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCk7Ci0gICAgdmlydHVhbCB+QnBNZW1vcnkoKTsKLSAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiBnZXRNZW1vcnkoc3NpemVfdCogb2Zmc2V0PTAsIHNpemVfdCogc2l6ZT0wKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBtdXRhYmxlIHNwPElNZW1vcnlIZWFwPiBtSGVhcDsKLSAgICBtdXRhYmxlIHNzaXplX3QgbU9mZnNldDsKLSAgICBtdXRhYmxlIHNpemVfdCBtU2l6ZTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQqIElNZW1vcnk6OmZhc3RQb2ludGVyKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIsIHNzaXplX3Qgb2Zmc2V0KSBjb25zdAotewotICAgIHNwPElNZW1vcnlIZWFwPiByZWFsSGVhcCA9IEJwTWVtb3J5SGVhcDo6Z2V0X2hlYXAoYmluZGVyKTsKLSAgICB2b2lkKiBjb25zdCBiYXNlID0gcmVhbEhlYXAtPmJhc2UoKTsKLSAgICBpZiAoYmFzZSA9PSBNQVBfRkFJTEVEKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcio+KGJhc2UpICsgb2Zmc2V0OwotfQotCi12b2lkKiBJTWVtb3J5Ojpwb2ludGVyKCkgY29uc3QgewotICAgIHNzaXplX3Qgb2Zmc2V0OwotICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gZ2V0TWVtb3J5KCZvZmZzZXQpOwotICAgIHZvaWQqIGNvbnN0IGJhc2UgPSBoZWFwIT0wID8gaGVhcC0+YmFzZSgpIDogTUFQX0ZBSUxFRDsKLSAgICBpZiAoYmFzZSA9PSBNQVBfRkFJTEVEKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcio+KGJhc2UpICsgb2Zmc2V0OwotfQotCi1zaXplX3QgSU1lbW9yeTo6c2l6ZSgpIGNvbnN0IHsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBnZXRNZW1vcnkoTlVMTCwgJnNpemUpOwotICAgIHJldHVybiBzaXplOwotfQotCi1zc2l6ZV90IElNZW1vcnk6Om9mZnNldCgpIGNvbnN0IHsKLSAgICBzc2l6ZV90IG9mZnNldDsKLSAgICBnZXRNZW1vcnkoJm9mZnNldCk7Ci0gICAgcmV0dXJuIG9mZnNldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQnBNZW1vcnk6OkJwTWVtb3J5KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgIDogQnBJbnRlcmZhY2U8SU1lbW9yeT4oaW1wbCksIG1PZmZzZXQoMCksIG1TaXplKDApCi17Ci19Ci0KLUJwTWVtb3J5Ojp+QnBNZW1vcnkoKQotewotfQotCi1zcDxJTWVtb3J5SGVhcD4gQnBNZW1vcnk6OmdldE1lbW9yeShzc2l6ZV90KiBvZmZzZXQsIHNpemVfdCogc2l6ZSkgY29uc3QKLXsKLSAgICBpZiAobUhlYXAgPT0gMCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVtb3J5OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBpZiAocmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NRU1PUlksIGRhdGEsICZyZXBseSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGhlYXAgPSByZXBseS5yZWFkU3Ryb25nQmluZGVyKCk7Ci0gICAgICAgICAgICBzc2l6ZV90IG8gPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNpemVfdCBzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoaGVhcCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbUhlYXAgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5SGVhcD4oaGVhcCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1IZWFwICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbU9mZnNldCA9IG87Ci0gICAgICAgICAgICAgICAgICAgIG1TaXplID0gczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG9mZnNldCkgKm9mZnNldCA9IG1PZmZzZXQ7Ci0gICAgaWYgKHNpemUpICpzaXplID0gbVNpemU7Ci0gICAgcmV0dXJuIG1IZWFwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lbW9yeSwgImFuZHJvaWQudXRpbHMuSU1lbW9yeSIpOwotCi1Cbk1lbW9yeTo6Qm5NZW1vcnkoKSB7Ci19Ci0KLUJuTWVtb3J5Ojp+Qm5NZW1vcnkoKSB7Ci19Ci0KLXN0YXR1c190IEJuTWVtb3J5OjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBHRVRfTUVNT1JZOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lbW9yeSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlciggZ2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKS0+YXNCaW5kZXIoKSApOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIob2Zmc2V0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQnBNZW1vcnlIZWFwOjpCcE1lbW9yeUhlYXAoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgOiBCcEludGVyZmFjZTxJTWVtb3J5SGVhcD4oaW1wbCksCi0gICAgICAgIG1IZWFwSWQoLTEpLCBtQmFzZShNQVBfRkFJTEVEKSwgbVNpemUoMCksIG1GbGFncygwKSwgbU9mZnNldCgwKSwgbVJlYWxIZWFwKGZhbHNlKQotewotfQotCi1CcE1lbW9yeUhlYXA6On5CcE1lbW9yeUhlYXAoKSB7Ci0gICAgaWYgKG1IZWFwSWQgIT0gLTEpIHsKLSAgICAgICAgY2xvc2UobUhlYXBJZCk7Ci0gICAgICAgIGlmIChtUmVhbEhlYXApIHsKLSAgICAgICAgICAgIC8vIGJ5IGNvbnN0cnVjdGlvbiB3ZSdyZSB0aGUgbGFzdCBvbmUKLSAgICAgICAgICAgIGlmIChtQmFzZSAhPSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gY29uc3RfY2FzdDxCcE1lbW9yeUhlYXAqPih0aGlzKS0+YXNCaW5kZXIoKTsKLQotICAgICAgICAgICAgICAgIGlmIChWRVJCT1NFKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVTk1BUFBJTkcgYmluZGVyPSVwLCBoZWFwPSVwLCBzaXplPSVkLCBmZD0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGVyLmdldCgpLCB0aGlzLCBtU2l6ZSwgbUhlYXBJZCk7Ci0gICAgICAgICAgICAgICAgICAgIENhbGxTdGFjayBzdGFjazsKLSAgICAgICAgICAgICAgICAgICAgc3RhY2sudXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YWNrLmR1bXAoImNhbGxzdGFjayIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG11bm1hcChtQmFzZSwgbVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gbGlzdCBvbmx5IGlmIGl0IHdhcyBtYXBwZWQgYmVmb3JlCi0gICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBjb25zdF9jYXN0PEJwTWVtb3J5SGVhcCo+KHRoaXMpLT5hc0JpbmRlcigpOwotICAgICAgICAgICAgZnJlZV9oZWFwKGJpbmRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQnBNZW1vcnlIZWFwOjphc3NlcnRNYXBwZWQoKSBjb25zdAotewotICAgIGlmIChtSGVhcElkID09IC0xKSB7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlcihjb25zdF9jYXN0PEJwTWVtb3J5SGVhcCo+KHRoaXMpLT5hc0JpbmRlcigpKTsKLSAgICAgICAgc3A8QnBNZW1vcnlIZWFwPiBoZWFwKHN0YXRpY19jYXN0PEJwTWVtb3J5SGVhcCo+KGZpbmRfaGVhcChiaW5kZXIpLmdldCgpKSk7Ci0gICAgICAgIGhlYXAtPmFzc2VydFJlYWxseU1hcHBlZCgpOwotICAgICAgICBpZiAoaGVhcC0+bUJhc2UgIT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgICAgIGlmIChtSGVhcElkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbUJhc2UgICA9IGhlYXAtPm1CYXNlOwotICAgICAgICAgICAgICAgIG1TaXplICAgPSBoZWFwLT5tU2l6ZTsKLSAgICAgICAgICAgICAgICBtT2Zmc2V0ID0gaGVhcC0+bU9mZnNldDsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY193cml0ZSggZHVwKCBoZWFwLT5tSGVhcElkICksICZtSGVhcElkICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZwotICAgICAgICAgICAgZnJlZV9oZWFwKGJpbmRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQnBNZW1vcnlIZWFwOjphc3NlcnRSZWFsbHlNYXBwZWQoKSBjb25zdAotewotICAgIGlmIChtSGVhcElkID09IC0xKSB7Ci0KLSAgICAgICAgLy8gcmVtb3RlIGNhbGwgd2l0aG91dCBtTG9jayBoZWxkLCB3b3JzZSBjYXNlIHNjZW5hcmlvLCB3ZSBlbmQgdXAKLSAgICAgICAgLy8gY2FsbGluZyB0cmFuc2FjdCgpIGZyb20gbXVsdGlwbGUgdGhyZWFkcywgYnV0IHRoYXQncyBub3QgYSBwcm9ibGVtLAotICAgICAgICAvLyBvbmx5IG1tYXAgYmVsb3cgbXVzdCBiZSBpbiB0aGUgY3JpdGljYWwgc2VjdGlvbi4KLQotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVtb3J5SGVhcDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KEhFQVBfSUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGludCBwYXJjZWxfZmQgPSByZXBseS5yZWFkRmlsZURlc2NyaXB0b3IoKTsKLSAgICAgICAgc3NpemVfdCBzaXplID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHVpbnQzMl90IGZsYWdzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHVpbnQzMl90IG9mZnNldCA9IHJlcGx5LnJlYWRJbnQzMigpOwotCi0gICAgICAgIEFMT0dFX0lGKGVyciwgImJpbmRlcj0lcCB0cmFuc2FjdGlvbiBmYWlsZWQgZmQ9JWQsIHNpemU9JWxkLCBlcnI9JWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgYXNCaW5kZXIoKS5nZXQoKSwgcGFyY2VsX2ZkLCBzaXplLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgICAgICBpbnQgZmQgPSBkdXAoIHBhcmNlbF9mZCApOwotICAgICAgICBBTE9HRV9JRihmZD09LTEsICJjYW5ub3QgZHVwIGZkPSVkLCBzaXplPSVsZCwgZXJyPSVkICglcykiLAotICAgICAgICAgICAgICAgIHBhcmNlbF9mZCwgc2l6ZSwgZXJyLCBzdHJlcnJvcihlcnJubykpOwotCi0gICAgICAgIGludCBhY2Nlc3MgPSBQUk9UX1JFQUQ7Ci0gICAgICAgIGlmICghKGZsYWdzICYgUkVBRF9PTkxZKSkgewotICAgICAgICAgICAgYWNjZXNzIHw9IFBST1RfV1JJVEU7Ci0gICAgICAgIH0KLQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBpZiAobUhlYXBJZCA9PSAtMSkgewotICAgICAgICAgICAgbVJlYWxIZWFwID0gdHJ1ZTsKLSAgICAgICAgICAgIG1CYXNlID0gbW1hcCgwLCBzaXplLCBhY2Nlc3MsIE1BUF9TSEFSRUQsIGZkLCBvZmZzZXQpOwotICAgICAgICAgICAgaWYgKG1CYXNlID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiY2Fubm90IG1hcCBCcE1lbW9yeUhlYXAgKGJpbmRlcj0lcCksIHNpemU9JWxkLCBmZD0lZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzQmluZGVyKCkuZ2V0KCksIHNpemUsIGZkLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNpemUgPSBzaXplOwotICAgICAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICAgICAgICAgIG1PZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfd3JpdGUoZmQsICZtSGVhcElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotaW50IEJwTWVtb3J5SGVhcDo6Z2V0SGVhcElEKCkgY29uc3QgewotICAgIGFzc2VydE1hcHBlZCgpOwotICAgIHJldHVybiBtSGVhcElkOwotfQotCi12b2lkKiBCcE1lbW9yeUhlYXA6OmdldEJhc2UoKSBjb25zdCB7Ci0gICAgYXNzZXJ0TWFwcGVkKCk7Ci0gICAgcmV0dXJuIG1CYXNlOwotfQotCi1zaXplX3QgQnBNZW1vcnlIZWFwOjpnZXRTaXplKCkgY29uc3QgewotICAgIGFzc2VydE1hcHBlZCgpOwotICAgIHJldHVybiBtU2l6ZTsKLX0KLQotdWludDMyX3QgQnBNZW1vcnlIZWFwOjpnZXRGbGFncygpIGNvbnN0IHsKLSAgICBhc3NlcnRNYXBwZWQoKTsKLSAgICByZXR1cm4gbUZsYWdzOwotfQotCi11aW50MzJfdCBCcE1lbW9yeUhlYXA6OmdldE9mZnNldCgpIGNvbnN0IHsKLSAgICBhc3NlcnRNYXBwZWQoKTsKLSAgICByZXR1cm4gbU9mZnNldDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZW1vcnlIZWFwLCAiYW5kcm9pZC51dGlscy5JTWVtb3J5SGVhcCIpOwotCi1Cbk1lbW9yeUhlYXA6OkJuTWVtb3J5SGVhcCgpIHsKLX0KLQotQm5NZW1vcnlIZWFwOjp+Qm5NZW1vcnlIZWFwKCkgewotfQotCi1zdGF0dXNfdCBCbk1lbW9yeUhlYXA6Om9uVHJhbnNhY3QoCi0gICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICBjYXNlIEhFQVBfSUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVtb3J5SGVhcCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlRmlsZURlc2NyaXB0b3IoZ2V0SGVhcElEKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0U2l6ZSgpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldEZsYWdzKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0T2Zmc2V0KCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotSGVhcENhY2hlOjpIZWFwQ2FjaGUoKQotICAgIDogRGVhdGhSZWNpcGllbnQoKQotewotfQotCi1IZWFwQ2FjaGU6On5IZWFwQ2FjaGUoKQotewotfQotCi12b2lkIEhlYXBDYWNoZTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgYmluZGVyKQotewotICAgIC8vQUxPR0QoImJpbmRlckRpZWQgYmluZGVyPSVwIiwgYmluZGVyLnVuc2FmZV9nZXQoKSk7Ci0gICAgZnJlZV9oZWFwKGJpbmRlcik7Ci19Ci0KLXNwPElNZW1vcnlIZWFwPiBIZWFwQ2FjaGU6OmZpbmRfaGVhcChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtSGVhcENhY2hlTG9jayk7Ci0gICAgc3NpemVfdCBpID0gbUhlYXBDYWNoZS5pbmRleE9mS2V5KGJpbmRlcik7Ci0gICAgaWYgKGk+PTApIHsKLSAgICAgICAgaGVhcF9pbmZvX3QmIGluZm8gPSBtSGVhcENhY2hlLmVkaXRWYWx1ZUF0KGkpOwotICAgICAgICBBTE9HRF9JRihWRVJCT1NFLAotICAgICAgICAgICAgICAgICJmb3VuZCBiaW5kZXI9JXAsIGhlYXA9JXAsIHNpemU9JWQsIGZkPSVkLCBjb3VudD0lZCIsCi0gICAgICAgICAgICAgICAgYmluZGVyLmdldCgpLCBpbmZvLmhlYXAuZ2V0KCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QnBNZW1vcnlIZWFwKj4oaW5mby5oZWFwLmdldCgpKS0+bVNpemUsCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QnBNZW1vcnlIZWFwKj4oaW5mby5oZWFwLmdldCgpKS0+bUhlYXBJZCwKLSAgICAgICAgICAgICAgICBpbmZvLmNvdW50KTsKLSAgICAgICAgYW5kcm9pZF9hdG9taWNfaW5jKCZpbmZvLmNvdW50KTsKLSAgICAgICAgcmV0dXJuIGluZm8uaGVhcDsKLSAgICB9IGVsc2UgewotICAgICAgICBoZWFwX2luZm9fdCBpbmZvOwotICAgICAgICBpbmZvLmhlYXAgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5SGVhcD4oYmluZGVyKTsKLSAgICAgICAgaW5mby5jb3VudCA9IDE7Ci0gICAgICAgIC8vQUxPR0QoImFkZGluZyBiaW5kZXI9JXAsIGhlYXA9JXAsIGNvdW50PSVkIiwKLSAgICAgICAgLy8gICAgICBiaW5kZXIuZ2V0KCksIGluZm8uaGVhcC5nZXQoKSwgaW5mby5jb3VudCk7Ci0gICAgICAgIG1IZWFwQ2FjaGUuYWRkKGJpbmRlciwgaW5mbyk7Ci0gICAgICAgIHJldHVybiBpbmZvLmhlYXA7Ci0gICAgfQotfQotCi12b2lkIEhlYXBDYWNoZTo6ZnJlZV9oZWFwKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpICB7Ci0gICAgZnJlZV9oZWFwKCB3cDxJQmluZGVyPihiaW5kZXIpICk7Ci19Ci0KLXZvaWQgSGVhcENhY2hlOjpmcmVlX2hlYXAoY29uc3Qgd3A8SUJpbmRlcj4mIGJpbmRlcikKLXsKLSAgICBzcDxJTWVtb3J5SGVhcD4gcmVsOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1IZWFwQ2FjaGVMb2NrKTsKLSAgICAgICAgc3NpemVfdCBpID0gbUhlYXBDYWNoZS5pbmRleE9mS2V5KGJpbmRlcik7Ci0gICAgICAgIGlmIChpPj0wKSB7Ci0gICAgICAgICAgICBoZWFwX2luZm9fdCYgaW5mbyhtSGVhcENhY2hlLmVkaXRWYWx1ZUF0KGkpKTsKLSAgICAgICAgICAgIGludDMyX3QgYyA9IGFuZHJvaWRfYXRvbWljX2RlYygmaW5mby5jb3VudCk7Ci0gICAgICAgICAgICBpZiAoYyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0RfSUYoVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmluZyBiaW5kZXI9JXAsIGhlYXA9JXAsIHNpemU9JWQsIGZkPSVkLCBjb3VudD0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kZXIudW5zYWZlX2dldCgpLCBpbmZvLmhlYXAuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxCcE1lbW9yeUhlYXAqPihpbmZvLmhlYXAuZ2V0KCkpLT5tU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEJwTWVtb3J5SGVhcCo+KGluZm8uaGVhcC5nZXQoKSktPm1IZWFwSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmNvdW50KTsKLSAgICAgICAgICAgICAgICByZWwgPSBtSGVhcENhY2hlLnZhbHVlQXQoaSkuaGVhcDsKLSAgICAgICAgICAgICAgICBtSGVhcENhY2hlLnJlbW92ZUl0ZW1zQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiZnJlZV9oZWFwIGJpbmRlcj0lcCBub3QgZm91bmQhISEiLCBiaW5kZXIudW5zYWZlX2dldCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3A8SU1lbW9yeUhlYXA+IEhlYXBDYWNoZTo6Z2V0X2hlYXAoY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcikKLXsKLSAgICBzcDxJTWVtb3J5SGVhcD4gcmVhbEhlYXA7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1IZWFwQ2FjaGVMb2NrKTsKLSAgICBzc2l6ZV90IGkgPSBtSGVhcENhY2hlLmluZGV4T2ZLZXkoYmluZGVyKTsKLSAgICBpZiAoaT49MCkgICByZWFsSGVhcCA9IG1IZWFwQ2FjaGUudmFsdWVBdChpKS5oZWFwOwotICAgIGVsc2UgICAgICAgIHJlYWxIZWFwID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KGJpbmRlcik7Ci0gICAgcmV0dXJuIHJlYWxIZWFwOwotfQotCi12b2lkIEhlYXBDYWNoZTo6ZHVtcF9oZWFwcygpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1IZWFwQ2FjaGVMb2NrKTsKLSAgICBpbnQgYyA9IG1IZWFwQ2FjaGUuc2l6ZSgpOwotICAgIGZvciAoaW50IGk9MCA7IGk8YyA7IGkrKykgewotICAgICAgICBjb25zdCBoZWFwX2luZm9fdCYgaW5mbyA9IG1IZWFwQ2FjaGUudmFsdWVBdChpKTsKLSAgICAgICAgQnBNZW1vcnlIZWFwIGNvbnN0KiBoKHN0YXRpY19jYXN0PEJwTWVtb3J5SGVhcCBjb25zdCAqPihpbmZvLmhlYXAuZ2V0KCkpKTsKLSAgICAgICAgQUxPR0QoImhleT0lcCwgaGVhcD0lcCwgY291bnQ9JWQsIChmZD0lZCwgYmFzZT0lcCwgc2l6ZT0lZCkiLAotICAgICAgICAgICAgICAgIG1IZWFwQ2FjaGUua2V5QXQoaSkudW5zYWZlX2dldCgpLAotICAgICAgICAgICAgICAgIGluZm8uaGVhcC5nZXQoKSwgaW5mby5jb3VudCwKLSAgICAgICAgICAgICAgICBoLT5tSGVhcElkLCBoLT5tQmFzZSwgaC0+bVNpemUpOwotICAgIH0KLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9JUENUaHJlYWRTdGF0ZS5jcHAgYi9saWJzL2JpbmRlci9JUENUaHJlYWRTdGF0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Y2VmMmMuLjAwMDAwMDAKLS0tIGEvbGlicy9iaW5kZXIvSVBDVGhyZWFkU3RhdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJJUENUaHJlYWRTdGF0ZSIKLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgotI2luY2x1ZGUgPGJpbmRlci9CcEJpbmRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGV4dE91dHB1dC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvYmluZGVyL2JpbmRlcl9tb2R1bGUuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2JpbmRlci9TdGF0aWMuaD4KLQotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmZGVmIEhBVkVfUFRIUkVBRFMKLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfV0lOMzJfVEhSRUFEUwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi0KLSNpZiBMT0dfTkRFQlVHCi0KLSNkZWZpbmUgSUZfTE9HX1RSQU5TQUNUSU9OUygpIGlmIChmYWxzZSkKLSNkZWZpbmUgSUZfTE9HX0NPTU1BTkRTKCkgaWYgKGZhbHNlKQotI2RlZmluZSBMT0dfUkVNT1RFUkVGUyguLi4pIAotI2RlZmluZSBJRl9MT0dfUkVNT1RFUkVGUygpIGlmIChmYWxzZSkKLSNkZWZpbmUgTE9HX1RIUkVBRFBPT0woLi4uKSAKLSNkZWZpbmUgTE9HX09ORVdBWSguLi4pIAotCi0jZWxzZQotCi0jZGVmaW5lIElGX0xPR19UUkFOU0FDVElPTlMoKSBJRl9BTE9HKExPR19WRVJCT1NFLCAidHJhbnNhY3QiKQotI2RlZmluZSBJRl9MT0dfQ09NTUFORFMoKSBJRl9BTE9HKExPR19WRVJCT1NFLCAiaXBjIikKLSNkZWZpbmUgTE9HX1JFTU9URVJFRlMoLi4uKSBBTE9HKExPR19ERUJVRywgInJlbW90ZXJlZnMiLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgSUZfTE9HX1JFTU9URVJFRlMoKSBJRl9BTE9HKExPR19ERUJVRywgInJlbW90ZXJlZnMiKQotI2RlZmluZSBMT0dfVEhSRUFEUE9PTCguLi4pIEFMT0coTE9HX0RFQlVHLCAidGhyZWFkcG9vbCIsIF9fVkFfQVJHU19fKQotI2RlZmluZSBMT0dfT05FV0FZKC4uLikgQUxPRyhMT0dfREVCVUcsICJpcGMiLCBfX1ZBX0FSR1NfXykKLQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBnZXRSZXR1cm5TdHJpbmcoc2l6ZV90IGlkeCk7Ci1zdGF0aWMgY29uc3QgY2hhciogZ2V0Q29tbWFuZFN0cmluZyhzaXplX3QgaWR4KTsKLXN0YXRpYyBjb25zdCB2b2lkKiBwcmludFJldHVybkNvbW1hbmQoVGV4dE91dHB1dCYgb3V0LCBjb25zdCB2b2lkKiBfY21kKTsKLXN0YXRpYyBjb25zdCB2b2lkKiBwcmludENvbW1hbmQoVGV4dE91dHB1dCYgb3V0LCBjb25zdCB2b2lkKiBfY21kKTsKLQotLy8gVGhpcyB3aWxsIHJlc3VsdCBpbiBhIG1pc3Npbmcgc3ltYm9sIGZhaWx1cmUgaWYgdGhlIElGX0xPR19DT01NQU5EUygpCi0vLyBjb25kaXRpb25hbHMgZG9uJ3QgZ2V0IHN0cmlwcGVkLi4uICBidXQgdGhhdCBpcyBwcm9iYWJseSB3aGF0IHdlIHdhbnQuCi0jaWYgIUxPR19OREVCVUcKLXN0YXRpYyBjb25zdCBjaGFyICprUmV0dXJuU3RyaW5nc1tdID0gewotICAgICJCUl9FUlJPUiIsCi0gICAgIkJSX09LIiwKLSAgICAiQlJfVFJBTlNBQ1RJT04iLAotICAgICJCUl9SRVBMWSIsCi0gICAgIkJSX0FDUVVJUkVfUkVTVUxUIiwKLSAgICAiQlJfREVBRF9SRVBMWSIsCi0gICAgIkJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFIiwKLSAgICAiQlJfSU5DUkVGUyIsCi0gICAgIkJSX0FDUVVJUkUiLAotICAgICJCUl9SRUxFQVNFIiwKLSAgICAiQlJfREVDUkVGUyIsCi0gICAgIkJSX0FUVEVNUFRfQUNRVUlSRSIsCi0gICAgIkJSX05PT1AiLAotICAgICJCUl9TUEFXTl9MT09QRVIiLAotICAgICJCUl9GSU5JU0hFRCIsCi0gICAgIkJSX0RFQURfQklOREVSIiwKLSAgICAiQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkUiLAotICAgICJCUl9GQUlMRURfUkVQTFkiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqa0NvbW1hbmRTdHJpbmdzW10gPSB7Ci0gICAgIkJDX1RSQU5TQUNUSU9OIiwKLSAgICAiQkNfUkVQTFkiLAotICAgICJCQ19BQ1FVSVJFX1JFU1VMVCIsCi0gICAgIkJDX0ZSRUVfQlVGRkVSIiwKLSAgICAiQkNfSU5DUkVGUyIsCi0gICAgIkJDX0FDUVVJUkUiLAotICAgICJCQ19SRUxFQVNFIiwKLSAgICAiQkNfREVDUkVGUyIsCi0gICAgIkJDX0lOQ1JFRlNfRE9ORSIsCi0gICAgIkJDX0FDUVVJUkVfRE9ORSIsCi0gICAgIkJDX0FUVEVNUFRfQUNRVUlSRSIsCi0gICAgIkJDX1JFR0lTVEVSX0xPT1BFUiIsCi0gICAgIkJDX0VOVEVSX0xPT1BFUiIsCi0gICAgIkJDX0VYSVRfTE9PUEVSIiwKLSAgICAiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04iLAotICAgICJCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04iLAotICAgICJCQ19ERUFEX0JJTkRFUl9ET05FIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIqIGdldFJldHVyblN0cmluZyhzaXplX3QgaWR4KQotewotICAgIGlmIChpZHggPCBzaXplb2Yoa1JldHVyblN0cmluZ3MpIC8gc2l6ZW9mKGtSZXR1cm5TdHJpbmdzWzBdKSkKLSAgICAgICAgcmV0dXJuIGtSZXR1cm5TdHJpbmdzW2lkeF07Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gInVua25vd24iOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciogZ2V0Q29tbWFuZFN0cmluZyhzaXplX3QgaWR4KQotewotICAgIGlmIChpZHggPCBzaXplb2Yoa0NvbW1hbmRTdHJpbmdzKSAvIHNpemVvZihrQ29tbWFuZFN0cmluZ3NbMF0pKQotICAgICAgICByZXR1cm4ga0NvbW1hbmRTdHJpbmdzW2lkeF07Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gInVua25vd24iOwotfQotCi1zdGF0aWMgY29uc3Qgdm9pZCogcHJpbnRCaW5kZXJUcmFuc2FjdGlvbkRhdGEoVGV4dE91dHB1dCYgb3V0LCBjb25zdCB2b2lkKiBkYXRhKQotewotICAgIGNvbnN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKiBidGQgPQotICAgICAgICAoY29uc3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEqKWRhdGE7Ci0gICAgaWYgKGJ0ZC0+dGFyZ2V0LmhhbmRsZSA8IDEwMjQpIHsKLSAgICAgICAgLyogd2FudCB0byBwcmludCBkZXNjcmlwdG9ycyBpbiBkZWNpbWFsOyBndWVzcyBiYXNlZCBvbiB2YWx1ZSAqLwotICAgICAgICBvdXQgPDwgInRhcmdldC5kZXNjPSIgPDwgYnRkLT50YXJnZXQuaGFuZGxlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAidGFyZ2V0LnB0cj0iIDw8IGJ0ZC0+dGFyZ2V0LnB0cjsKLSAgICB9Ci0gICAgb3V0IDw8ICIgKGNvb2tpZSAiIDw8IGJ0ZC0+Y29va2llIDw8ICIpIiA8PCBlbmRsCi0gICAgICAgIDw8ICJjb2RlPSIgPDwgVHlwZUNvZGUoYnRkLT5jb2RlKSA8PCAiLCBmbGFncz0iIDw8ICh2b2lkKilidGQtPmZsYWdzIDw8IGVuZGwKLSAgICAgICAgPDwgImRhdGE9IiA8PCBidGQtPmRhdGEucHRyLmJ1ZmZlciA8PCAiICgiIDw8ICh2b2lkKilidGQtPmRhdGFfc2l6ZQotICAgICAgICA8PCAiIGJ5dGVzKSIgPDwgZW5kbAotICAgICAgICA8PCAib2Zmc2V0cz0iIDw8IGJ0ZC0+ZGF0YS5wdHIub2Zmc2V0cyA8PCAiICgiIDw8ICh2b2lkKilidGQtPm9mZnNldHNfc2l6ZQotICAgICAgICA8PCAiIGJ5dGVzKSI7Ci0gICAgcmV0dXJuIGJ0ZCsxOwotfQotCi1zdGF0aWMgY29uc3Qgdm9pZCogcHJpbnRSZXR1cm5Db21tYW5kKFRleHRPdXRwdXQmIG91dCwgY29uc3Qgdm9pZCogX2NtZCkKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IE4gPSBzaXplb2Yoa1JldHVyblN0cmluZ3MpL3NpemVvZihrUmV0dXJuU3RyaW5nc1swXSk7Ci0gICAgY29uc3QgaW50MzJfdCogY21kID0gKGNvbnN0IGludDMyX3QqKV9jbWQ7Ci0gICAgaW50MzJfdCBjb2RlID0gKmNtZCsrOwotICAgIHNpemVfdCBjbWRJbmRleCA9IGNvZGUgJiAweGZmOwotICAgIGlmIChjb2RlID09IChpbnQzMl90KSBCUl9FUlJPUikgewotICAgICAgICBvdXQgPDwgIkJSX0VSUk9SOiAiIDw8ICh2b2lkKikoKmNtZCsrKSA8PCBlbmRsOwotICAgICAgICByZXR1cm4gY21kOwotICAgIH0gZWxzZSBpZiAoY21kSW5kZXggPj0gTikgewotICAgICAgICBvdXQgPDwgIlVua25vd24gcmVwbHk6ICIgPDwgY29kZSA8PCBlbmRsOwotICAgICAgICByZXR1cm4gY21kOwotICAgIH0KLSAgICBvdXQgPDwga1JldHVyblN0cmluZ3NbY21kSW5kZXhdOwotICAgIAotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIEJSX1RSQU5TQUNUSU9OOgotICAgICAgICBjYXNlIEJSX1JFUExZOiB7Ci0gICAgICAgICAgICBvdXQgPDwgIjogIiA8PCBpbmRlbnQ7Ci0gICAgICAgICAgICBjbWQgPSAoY29uc3QgaW50MzJfdCAqKXByaW50QmluZGVyVHJhbnNhY3Rpb25EYXRhKG91dCwgY21kKTsKLSAgICAgICAgICAgIG91dCA8PCBkZWRlbnQ7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIAotICAgICAgICBjYXNlIEJSX0FDUVVJUkVfUkVTVUxUOiB7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHJlcyA9ICpjbWQrKzsKLSAgICAgICAgICAgIG91dCA8PCAiOiAiIDw8IHJlcyA8PCAocmVzID8gIiAoU1VDQ0VTUykiIDogIiAoRkFJTFVSRSkiKTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgCi0gICAgICAgIGNhc2UgQlJfSU5DUkVGUzoKLSAgICAgICAgY2FzZSBCUl9BQ1FVSVJFOgotICAgICAgICBjYXNlIEJSX1JFTEVBU0U6Ci0gICAgICAgIGNhc2UgQlJfREVDUkVGUzogewotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBiID0gKmNtZCsrOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBjID0gKmNtZCsrOwotICAgICAgICAgICAgb3V0IDw8ICI6IHRhcmdldD0iIDw8ICh2b2lkKiliIDw8ICIgKGNvb2tpZSAiIDw8ICh2b2lkKiljIDw8ICIpIjsKLSAgICAgICAgfSBicmVhazsKLSAgICAKLSAgICAgICAgY2FzZSBCUl9BVFRFTVBUX0FDUVVJUkU6IHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgcCA9ICpjbWQrKzsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYiA9ICpjbWQrKzsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYyA9ICpjbWQrKzsKLSAgICAgICAgICAgIG91dCA8PCAiOiB0YXJnZXQ9IiA8PCAodm9pZCopYiA8PCAiIChjb29raWUgIiA8PCAodm9pZCopYwotICAgICAgICAgICAgICAgIDw8ICIpLCBwcmk9IiA8PCBwOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlJfREVBRF9CSU5ERVI6Ci0gICAgICAgIGNhc2UgQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkU6IHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYyA9ICpjbWQrKzsKLSAgICAgICAgICAgIG91dCA8PCAiOiBkZWF0aCBjb29raWUgIiA8PCAodm9pZCopYzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gbm8gZGV0YWlscyB0byBzaG93IGZvcjogQlJfT0ssIEJSX0RFQURfUkVQTFksCi0gICAgICAgICAgICAvLyBCUl9UUkFOU0FDVElPTl9DT01QTEVURSwgQlJfRklOSVNIRUQKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICBvdXQgPDwgZW5kbDsKLSAgICByZXR1cm4gY21kOwotfQotCi1zdGF0aWMgY29uc3Qgdm9pZCogcHJpbnRDb21tYW5kKFRleHRPdXRwdXQmIG91dCwgY29uc3Qgdm9pZCogX2NtZCkKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IE4gPSBzaXplb2Yoa0NvbW1hbmRTdHJpbmdzKS9zaXplb2Yoa0NvbW1hbmRTdHJpbmdzWzBdKTsKLSAgICBjb25zdCBpbnQzMl90KiBjbWQgPSAoY29uc3QgaW50MzJfdCopX2NtZDsKLSAgICBpbnQzMl90IGNvZGUgPSAqY21kKys7Ci0gICAgc2l6ZV90IGNtZEluZGV4ID0gY29kZSAmIDB4ZmY7Ci0KLSAgICBpZiAoY21kSW5kZXggPj0gTikgewotICAgICAgICBvdXQgPDwgIlVua25vd24gY29tbWFuZDogIiA8PCBjb2RlIDw8IGVuZGw7Ci0gICAgICAgIHJldHVybiBjbWQ7Ci0gICAgfQotICAgIG91dCA8PCBrQ29tbWFuZFN0cmluZ3NbY21kSW5kZXhdOwotCi0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgQkNfVFJBTlNBQ1RJT046Ci0gICAgICAgIGNhc2UgQkNfUkVQTFk6IHsKLSAgICAgICAgICAgIG91dCA8PCAiOiAiIDw8IGluZGVudDsKLSAgICAgICAgICAgIGNtZCA9IChjb25zdCBpbnQzMl90ICopcHJpbnRCaW5kZXJUcmFuc2FjdGlvbkRhdGEob3V0LCBjbWQpOwotICAgICAgICAgICAgb3V0IDw8IGRlZGVudDsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgCi0gICAgICAgIGNhc2UgQkNfQUNRVUlSRV9SRVNVTFQ6IHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgcmVzID0gKmNtZCsrOwotICAgICAgICAgICAgb3V0IDw8ICI6ICIgPDwgcmVzIDw8IChyZXMgPyAiIChTVUNDRVNTKSIgOiAiIChGQUlMVVJFKSIpOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICAKLSAgICAgICAgY2FzZSBCQ19GUkVFX0JVRkZFUjogewotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBidWYgPSAqY21kKys7Ci0gICAgICAgICAgICBvdXQgPDwgIjogYnVmZmVyPSIgPDwgKHZvaWQqKWJ1ZjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgCi0gICAgICAgIGNhc2UgQkNfSU5DUkVGUzoKLSAgICAgICAgY2FzZSBCQ19BQ1FVSVJFOgotICAgICAgICBjYXNlIEJDX1JFTEVBU0U6Ci0gICAgICAgIGNhc2UgQkNfREVDUkVGUzogewotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkID0gKmNtZCsrOwotICAgICAgICAgICAgb3V0IDw8ICI6IGRlc2M9IiA8PCBkOwotICAgICAgICB9IGJyZWFrOwotICAgIAotICAgICAgICBjYXNlIEJDX0lOQ1JFRlNfRE9ORToKLSAgICAgICAgY2FzZSBCQ19BQ1FVSVJFX0RPTkU6IHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYiA9ICpjbWQrKzsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYyA9ICpjbWQrKzsKLSAgICAgICAgICAgIG91dCA8PCAiOiB0YXJnZXQ9IiA8PCAodm9pZCopYiA8PCAiIChjb29raWUgIiA8PCAodm9pZCopYyA8PCAiKSI7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIAotICAgICAgICBjYXNlIEJDX0FUVEVNUFRfQUNRVUlSRTogewotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBwID0gKmNtZCsrOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkID0gKmNtZCsrOwotICAgICAgICAgICAgb3V0IDw8ICI6IGRlc2M9IiA8PCBkIDw8ICIsIHByaT0iIDw8IHA7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIAotICAgICAgICBjYXNlIEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OOgotICAgICAgICBjYXNlIEJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjogewotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBoID0gKmNtZCsrOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBjID0gKmNtZCsrOwotICAgICAgICAgICAgb3V0IDw8ICI6IGhhbmRsZT0iIDw8IGggPDwgIiAoZGVhdGggY29va2llICIgPDwgKHZvaWQqKWMgPDwgIikiOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgQkNfREVBRF9CSU5ERVJfRE9ORTogewotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBjID0gKmNtZCsrOwotICAgICAgICAgICAgb3V0IDw8ICI6IGRlYXRoIGNvb2tpZSAiIDw8ICh2b2lkKiljOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBubyBkZXRhaWxzIHRvIHNob3cgZm9yOiBCQ19SRUdJU1RFUl9MT09QRVIsIEJDX0VOVEVSX0xPT1BFUiwKLSAgICAgICAgICAgIC8vIEJDX0VYSVRfTE9PUEVSCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgCi0gICAgb3V0IDw8IGVuZGw7Ci0gICAgcmV0dXJuIGNtZDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgcHRocmVhZF9tdXRleF90IGdUTFNNdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgYm9vbCBnSGF2ZVRMUyA9IGZhbHNlOwotc3RhdGljIHB0aHJlYWRfa2V5X3QgZ1RMUyA9IDA7Ci1zdGF0aWMgYm9vbCBnU2h1dGRvd24gPSBmYWxzZTsKLXN0YXRpYyBib29sIGdEaXNhYmxlQmFja2dyb3VuZFNjaGVkdWxpbmcgPSBmYWxzZTsKLQotSVBDVGhyZWFkU3RhdGUqIElQQ1RocmVhZFN0YXRlOjpzZWxmKCkKLXsKLSAgICBpZiAoZ0hhdmVUTFMpIHsKLXJlc3RhcnQ6Ci0gICAgICAgIGNvbnN0IHB0aHJlYWRfa2V5X3QgayA9IGdUTFM7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlKiBzdCA9IChJUENUaHJlYWRTdGF0ZSopcHRocmVhZF9nZXRzcGVjaWZpYyhrKTsKLSAgICAgICAgaWYgKHN0KSByZXR1cm4gc3Q7Ci0gICAgICAgIHJldHVybiBuZXcgSVBDVGhyZWFkU3RhdGU7Ci0gICAgfQotICAgIAotICAgIGlmIChnU2h1dGRvd24pIHJldHVybiBOVUxMOwotICAgIAotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ1RMU011dGV4KTsKLSAgICBpZiAoIWdIYXZlVExTKSB7Ci0gICAgICAgIGlmIChwdGhyZWFkX2tleV9jcmVhdGUoJmdUTFMsIHRocmVhZERlc3RydWN0b3IpICE9IDApIHsKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnVExTTXV0ZXgpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZ0hhdmVUTFMgPSB0cnVlOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1RMU011dGV4KTsKLSAgICBnb3RvIHJlc3RhcnQ7Ci19Ci0KLUlQQ1RocmVhZFN0YXRlKiBJUENUaHJlYWRTdGF0ZTo6c2VsZk9yTnVsbCgpCi17Ci0gICAgaWYgKGdIYXZlVExTKSB7Ci0gICAgICAgIGNvbnN0IHB0aHJlYWRfa2V5X3QgayA9IGdUTFM7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlKiBzdCA9IChJUENUaHJlYWRTdGF0ZSopcHRocmVhZF9nZXRzcGVjaWZpYyhrKTsKLSAgICAgICAgcmV0dXJuIHN0OwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBJUENUaHJlYWRTdGF0ZTo6c2h1dGRvd24oKQotewotICAgIGdTaHV0ZG93biA9IHRydWU7Ci0gICAgCi0gICAgaWYgKGdIYXZlVExTKSB7Ci0gICAgICAgIC8vIFhYWCBOZWVkIHRvIHdhaXQgZm9yIGFsbCB0aHJlYWQgcG9vbCB0aHJlYWRzIHRvIGV4aXQhCi0gICAgICAgIElQQ1RocmVhZFN0YXRlKiBzdCA9IChJUENUaHJlYWRTdGF0ZSopcHRocmVhZF9nZXRzcGVjaWZpYyhnVExTKTsKLSAgICAgICAgaWYgKHN0KSB7Ci0gICAgICAgICAgICBkZWxldGUgc3Q7Ci0gICAgICAgICAgICBwdGhyZWFkX3NldHNwZWNpZmljKGdUTFMsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGdIYXZlVExTID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjpkaXNhYmxlQmFja2dyb3VuZFNjaGVkdWxpbmcoYm9vbCBkaXNhYmxlKQotewotICAgIGdEaXNhYmxlQmFja2dyb3VuZFNjaGVkdWxpbmcgPSBkaXNhYmxlOwotfQotCi1zcDxQcm9jZXNzU3RhdGU+IElQQ1RocmVhZFN0YXRlOjpwcm9jZXNzKCkKLXsKLSAgICByZXR1cm4gbVByb2Nlc3M7Ci19Ci0KLXN0YXR1c190IElQQ1RocmVhZFN0YXRlOjpjbGVhckxhc3RFcnJvcigpCi17Ci0gICAgY29uc3Qgc3RhdHVzX3QgZXJyID0gbUxhc3RFcnJvcjsKLSAgICBtTGFzdEVycm9yID0gTk9fRVJST1I7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotaW50IElQQ1RocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkKLXsKLSAgICByZXR1cm4gbUNhbGxpbmdQaWQ7Ci19Ci0KLWludCBJUENUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpCi17Ci0gICAgcmV0dXJuIG1DYWxsaW5nVWlkOwotfQotCi1pbnQgSVBDVGhyZWFkU3RhdGU6OmdldE9yaWdDYWxsaW5nVWlkKCkKLXsKLSAgICByZXR1cm4gbU9yaWdDYWxsaW5nVWlkOwotfQotCi1pbnQ2NF90IElQQ1RocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpCi17Ci0gICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCltQ2FsbGluZ1VpZDw8MzIpIHwgbUNhbGxpbmdQaWQ7Ci0gICAgY2xlYXJDYWxsZXIoKTsKLSAgICByZXR1cm4gdG9rZW47Ci19Ci0KLXZvaWQgSVBDVGhyZWFkU3RhdGU6OnNldFN0cmljdE1vZGVQb2xpY3koaW50MzJfdCBwb2xpY3kpCi17Ci0gICAgbVN0cmljdE1vZGVQb2xpY3kgPSBwb2xpY3k7Ci19Ci0KLWludDMyX3QgSVBDVGhyZWFkU3RhdGU6OmdldFN0cmljdE1vZGVQb2xpY3koKSBjb25zdAotewotICAgIHJldHVybiBtU3RyaWN0TW9kZVBvbGljeTsKLX0KLQotdm9pZCBJUENUaHJlYWRTdGF0ZTo6c2V0TGFzdFRyYW5zYWN0aW9uQmluZGVyRmxhZ3MoaW50MzJfdCBmbGFncykKLXsKLSAgICBtTGFzdFRyYW5zYWN0aW9uQmluZGVyRmxhZ3MgPSBmbGFnczsKLX0KLQotaW50MzJfdCBJUENUaHJlYWRTdGF0ZTo6Z2V0TGFzdFRyYW5zYWN0aW9uQmluZGVyRmxhZ3MoKSBjb25zdAotewotICAgIHJldHVybiBtTGFzdFRyYW5zYWN0aW9uQmluZGVyRmxhZ3M7Ci19Ci0KLXZvaWQgSVBDVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaW50NjRfdCB0b2tlbikKLXsKLSAgICBtQ2FsbGluZ1VpZCA9IChpbnQpKHRva2VuPj4zMik7Ci0gICAgbUNhbGxpbmdQaWQgPSAoaW50KXRva2VuOwotfQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjpjbGVhckNhbGxlcigpCi17Ci0gICAgbUNhbGxpbmdQaWQgPSBnZXRwaWQoKTsKLSAgICBtQ2FsbGluZ1VpZCA9IGdldHVpZCgpOwotfQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjpmbHVzaENvbW1hbmRzKCkKLXsKLSAgICBpZiAobVByb2Nlc3MtPm1Ecml2ZXJGRCA8PSAwKQotICAgICAgICByZXR1cm47Ci0gICAgdGFsa1dpdGhEcml2ZXIoZmFsc2UpOwotfQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjpqb2luVGhyZWFkUG9vbChib29sIGlzTWFpbikKLXsKLSAgICBMT0dfVEhSRUFEUE9PTCgiKioqKiBUSFJFQUQgJXAgKFBJRCAlZCkgSVMgSk9JTklORyBUSEUgVEhSRUFEIFBPT0xcbiIsICh2b2lkKilwdGhyZWFkX3NlbGYoKSwgZ2V0cGlkKCkpOwotCi0gICAgbU91dC53cml0ZUludDMyKGlzTWFpbiA/IEJDX0VOVEVSX0xPT1BFUiA6IEJDX1JFR0lTVEVSX0xPT1BFUik7Ci0gICAgCi0gICAgLy8gVGhpcyB0aHJlYWQgbWF5IGhhdmUgYmVlbiBzcGF3bmVkIGJ5IGEgdGhyZWFkIHRoYXQgd2FzIGluIHRoZSBiYWNrZ3JvdW5kCi0gICAgLy8gc2NoZWR1bGluZyBncm91cCwgc28gZmlyc3Qgd2Ugd2lsbCBtYWtlIHN1cmUgaXQgaXMgaW4gdGhlIGRlZmF1bHQvZm9yZWdyb3VuZAotICAgIC8vIG9uZSB0byBhdm9pZCBwZXJmb3JtaW5nIGFuIGluaXRpYWwgdHJhbnNhY3Rpb24gaW4gdGhlIGJhY2tncm91bmQuCi0gICAgYW5kcm9pZFNldFRocmVhZFNjaGVkdWxpbmdHcm91cChtTXlUaHJlYWRJZCwgQU5EUk9JRF9UR1JPVVBfREVGQVVMVCk7Ci0gICAgICAgIAotICAgIHN0YXR1c190IHJlc3VsdDsKLSAgICBkbyB7Ci0gICAgICAgIGludDMyX3QgY21kOwotICAgICAgICAKLSAgICAgICAgLy8gV2hlbiB3ZSd2ZSBjbGVhcmVkIHRoZSBpbmNvbWluZyBjb21tYW5kIHF1ZXVlLCBwcm9jZXNzIGFueSBwZW5kaW5nIGRlcmVmcwotICAgICAgICBpZiAobUluLmRhdGFQb3NpdGlvbigpID49IG1Jbi5kYXRhU2l6ZSgpKSB7Ci0gICAgICAgICAgICBzaXplX3QgbnVtUGVuZGluZyA9IG1QZW5kaW5nV2Vha0RlcmVmcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAobnVtUGVuZGluZyA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBlbmRpbmc7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqIHJlZnMgPSBtUGVuZGluZ1dlYWtEZXJlZnNbaV07Ci0gICAgICAgICAgICAgICAgICAgIHJlZnMtPmRlY1dlYWsobVByb2Nlc3MuZ2V0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGVuZGluZ1dlYWtEZXJlZnMuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbnVtUGVuZGluZyA9IG1QZW5kaW5nU3Ryb25nRGVyZWZzLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChudW1QZW5kaW5nID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGVuZGluZzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJCaW5kZXIqIG9iaiA9IG1QZW5kaW5nU3Ryb25nRGVyZWZzW2ldOwotICAgICAgICAgICAgICAgICAgICBvYmotPmRlY1N0cm9uZyhtUHJvY2Vzcy5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QZW5kaW5nU3Ryb25nRGVyZWZzLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgZ2V0IHRoZSBuZXh0IGNvbW1hbmQgdG8gYmUgcHJvY2Vzc2VkLCB3YWl0aW5nIGlmIG5lY2Vzc2FyeQotICAgICAgICByZXN1bHQgPSB0YWxrV2l0aERyaXZlcigpOwotICAgICAgICBpZiAocmVzdWx0ID49IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzaXplX3QgSU4gPSBtSW4uZGF0YUF2YWlsKCk7Ci0gICAgICAgICAgICBpZiAoSU4gPCBzaXplb2YoaW50MzJfdCkpIGNvbnRpbnVlOwotICAgICAgICAgICAgY21kID0gbUluLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgSUZfTE9HX0NPTU1BTkRTKCkgewotICAgICAgICAgICAgICAgIGFsb2cgPDwgIlByb2Nlc3NpbmcgdG9wLWxldmVsIENvbW1hbmQ6ICIKLSAgICAgICAgICAgICAgICAgICAgPDwgZ2V0UmV0dXJuU3RyaW5nKGNtZCkgPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICByZXN1bHQgPSBleGVjdXRlQ29tbWFuZChjbWQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBBZnRlciBleGVjdXRpbmcgdGhlIGNvbW1hbmQsIGVuc3VyZSB0aGF0IHRoZSB0aHJlYWQgaXMgcmV0dXJuZWQgdG8gdGhlCi0gICAgICAgIC8vIGRlZmF1bHQgY2dyb3VwIGJlZm9yZSByZWpvaW5pbmcgdGhlIHBvb2wuICBUaGUgZHJpdmVyIHRha2VzIGNhcmUgb2YKLSAgICAgICAgLy8gcmVzdG9yaW5nIHRoZSBwcmlvcml0eSwgYnV0IGRvZXNuJ3QgZG8gYW55dGhpbmcgd2l0aCBjZ3JvdXBzIHNvIHdlCi0gICAgICAgIC8vIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHRoYXQgaGVyZSBpbiB1c2Vyc3BhY2UuICBOb3RlIHRoYXQgd2UgZG8gbWFrZQotICAgICAgICAvLyBzdXJlIHRvIGdvIGluIHRoZSBmb3JlZ3JvdW5kIGFmdGVyIGV4ZWN1dGluZyBhIHRyYW5zYWN0aW9uLCBidXQKLSAgICAgICAgLy8gdGhlcmUgYXJlIG90aGVyIGNhbGxiYWNrcyBpbnRvIHVzZXIgY29kZSB0aGF0IGNvdWxkIGhhdmUgY2hhbmdlZAotICAgICAgICAvLyBvdXIgZ3JvdXAgc28gd2Ugd2FudCB0byBtYWtlIGFic29sdXRlbHkgc3VyZSBpdCBpcyBwdXQgYmFjay4KLSAgICAgICAgYW5kcm9pZFNldFRocmVhZFNjaGVkdWxpbmdHcm91cChtTXlUaHJlYWRJZCwgQU5EUk9JRF9UR1JPVVBfREVGQVVMVCk7Ci0KLSAgICAgICAgLy8gTGV0IHRoaXMgdGhyZWFkIGV4aXQgdGhlIHRocmVhZCBwb29sIGlmIGl0IGlzIG5vIGxvbmdlcgotICAgICAgICAvLyBuZWVkZWQgYW5kIGl0IGlzIG5vdCB0aGUgbWFpbiBwcm9jZXNzIHRocmVhZC4KLSAgICAgICAgaWYocmVzdWx0ID09IFRJTUVEX09VVCAmJiAhaXNNYWluKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKHJlc3VsdCAhPSAtRUNPTk5SRUZVU0VEICYmIHJlc3VsdCAhPSAtRUJBREYpOwotCi0gICAgTE9HX1RIUkVBRFBPT0woIioqKiogVEhSRUFEICVwIChQSUQgJWQpIElTIExFQVZJTkcgVEhFIFRIUkVBRCBQT09MIGVycj0lcFxuIiwKLSAgICAgICAgKHZvaWQqKXB0aHJlYWRfc2VsZigpLCBnZXRwaWQoKSwgKHZvaWQqKXJlc3VsdCk7Ci0gICAgCi0gICAgbU91dC53cml0ZUludDMyKEJDX0VYSVRfTE9PUEVSKTsKLSAgICB0YWxrV2l0aERyaXZlcihmYWxzZSk7Ci19Ci0KLXZvaWQgSVBDVGhyZWFkU3RhdGU6OnN0b3BQcm9jZXNzKGJvb2wgaW1tZWRpYXRlKQotewotICAgIC8vQUxPR0koIioqKiogU1RPUFBJTkcgUFJPQ0VTUyIpOwotICAgIGZsdXNoQ29tbWFuZHMoKTsKLSAgICBpbnQgZmQgPSBtUHJvY2Vzcy0+bURyaXZlckZEOwotICAgIG1Qcm9jZXNzLT5tRHJpdmVyRkQgPSAtMTsKLSAgICBjbG9zZShmZCk7Ci0gICAgLy9raWxsKGdldHBpZCgpLCBTSUdLSUxMKTsKLX0KLQotc3RhdHVzX3QgSVBDVGhyZWFkU3RhdGU6OnRyYW5zYWN0KGludDMyX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzdGF0dXNfdCBlcnIgPSBkYXRhLmVycm9yQ2hlY2soKTsKLQotICAgIGZsYWdzIHw9IFRGX0FDQ0VQVF9GRFM7Ci0KLSAgICBJRl9MT0dfVFJBTlNBQ1RJT05TKCkgewotICAgICAgICBUZXh0T3V0cHV0OjpCdW5kbGUgX2IoYWxvZyk7Ci0gICAgICAgIGFsb2cgPDwgIkJDX1RSQU5TQUNUSU9OIHRociAiIDw8ICh2b2lkKilwdGhyZWFkX3NlbGYoKSA8PCAiIC8gaGFuZCAiCi0gICAgICAgICAgICA8PCBoYW5kbGUgPDwgIiAvIGNvZGUgIiA8PCBUeXBlQ29kZShjb2RlKSA8PCAiOiAiCi0gICAgICAgICAgICA8PCBpbmRlbnQgPDwgZGF0YSA8PCBkZWRlbnQgPDwgZW5kbDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICBMT0dfT05FV0FZKCI+Pj4+IFNFTkQgZnJvbSBwaWQgJWQgdWlkICVkICVzIiwgZ2V0cGlkKCksIGdldHVpZCgpLAotICAgICAgICAgICAgKGZsYWdzICYgVEZfT05FX1dBWSkgPT0gMCA/ICJSRUFEIFJFUExZIiA6ICJPTkUgV0FZIik7Ci0gICAgICAgIGVyciA9IHdyaXRlVHJhbnNhY3Rpb25EYXRhKEJDX1RSQU5TQUNUSU9OLCBmbGFncywgaGFuZGxlLCBjb2RlLCBkYXRhLCBOVUxMKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBpZiAocmVwbHkpIHJlcGx5LT5zZXRFcnJvcihlcnIpOwotICAgICAgICByZXR1cm4gKG1MYXN0RXJyb3IgPSBlcnIpOwotICAgIH0KLSAgICAKLSAgICBpZiAoKGZsYWdzICYgVEZfT05FX1dBWSkgPT0gMCkgewotICAgICAgICAjaWYgMAotICAgICAgICBpZiAoY29kZSA9PSA0KSB7IC8vIHJlbGF5b3V0Ci0gICAgICAgICAgICBBTE9HSSgiPj4+Pj4+IENBTExJTkcgdHJhbnNhY3Rpb24gNCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0koIj4+Pj4+PiBDQUxMSU5HIHRyYW5zYWN0aW9uICVkIiwgY29kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZGlmCi0gICAgICAgIGlmIChyZXBseSkgewotICAgICAgICAgICAgZXJyID0gd2FpdEZvclJlc3BvbnNlKHJlcGx5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFBhcmNlbCBmYWtlUmVwbHk7Ci0gICAgICAgICAgICBlcnIgPSB3YWl0Rm9yUmVzcG9uc2UoJmZha2VSZXBseSk7Ci0gICAgICAgIH0KLSAgICAgICAgI2lmIDAKLSAgICAgICAgaWYgKGNvZGUgPT0gNCkgeyAvLyByZWxheW91dAotICAgICAgICAgICAgQUxPR0koIjw8PDw8PCBSRVRVUk5JTkcgdHJhbnNhY3Rpb24gNCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0koIjw8PDw8PCBSRVRVUk5JTkcgdHJhbnNhY3Rpb24gJWQiLCBjb2RlKTsKLSAgICAgICAgfQotICAgICAgICAjZW5kaWYKLSAgICAgICAgCi0gICAgICAgIElGX0xPR19UUkFOU0FDVElPTlMoKSB7Ci0gICAgICAgICAgICBUZXh0T3V0cHV0OjpCdW5kbGUgX2IoYWxvZyk7Ci0gICAgICAgICAgICBhbG9nIDw8ICJCUl9SRVBMWSB0aHIgIiA8PCAodm9pZCopcHRocmVhZF9zZWxmKCkgPDwgIiAvIGhhbmQgIgotICAgICAgICAgICAgICAgIDw8IGhhbmRsZSA8PCAiOiAiOwotICAgICAgICAgICAgaWYgKHJlcGx5KSBhbG9nIDw8IGluZGVudCA8PCAqcmVwbHkgPDwgZGVkZW50IDw8IGVuZGw7Ci0gICAgICAgICAgICBlbHNlIGFsb2cgPDwgIihub25lIHJlcXVlc3RlZCkiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSB3YWl0Rm9yUmVzcG9uc2UoTlVMTCwgTlVMTCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgSVBDVGhyZWFkU3RhdGU6OmluY1N0cm9uZ0hhbmRsZShpbnQzMl90IGhhbmRsZSkKLXsKLSAgICBMT0dfUkVNT1RFUkVGUygiSVBDVGhyZWFkU3RhdGU6OmluY1N0cm9uZ0hhbmRsZSglZClcbiIsIGhhbmRsZSk7Ci0gICAgbU91dC53cml0ZUludDMyKEJDX0FDUVVJUkUpOwotICAgIG1PdXQud3JpdGVJbnQzMihoYW5kbGUpOwotfQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjpkZWNTdHJvbmdIYW5kbGUoaW50MzJfdCBoYW5kbGUpCi17Ci0gICAgTE9HX1JFTU9URVJFRlMoIklQQ1RocmVhZFN0YXRlOjpkZWNTdHJvbmdIYW5kbGUoJWQpXG4iLCBoYW5kbGUpOwotICAgIG1PdXQud3JpdGVJbnQzMihCQ19SRUxFQVNFKTsKLSAgICBtT3V0LndyaXRlSW50MzIoaGFuZGxlKTsKLX0KLQotdm9pZCBJUENUaHJlYWRTdGF0ZTo6aW5jV2Vha0hhbmRsZShpbnQzMl90IGhhbmRsZSkKLXsKLSAgICBMT0dfUkVNT1RFUkVGUygiSVBDVGhyZWFkU3RhdGU6OmluY1dlYWtIYW5kbGUoJWQpXG4iLCBoYW5kbGUpOwotICAgIG1PdXQud3JpdGVJbnQzMihCQ19JTkNSRUZTKTsKLSAgICBtT3V0LndyaXRlSW50MzIoaGFuZGxlKTsKLX0KLQotdm9pZCBJUENUaHJlYWRTdGF0ZTo6ZGVjV2Vha0hhbmRsZShpbnQzMl90IGhhbmRsZSkKLXsKLSAgICBMT0dfUkVNT1RFUkVGUygiSVBDVGhyZWFkU3RhdGU6OmRlY1dlYWtIYW5kbGUoJWQpXG4iLCBoYW5kbGUpOwotICAgIG1PdXQud3JpdGVJbnQzMihCQ19ERUNSRUZTKTsKLSAgICBtT3V0LndyaXRlSW50MzIoaGFuZGxlKTsKLX0KLQotc3RhdHVzX3QgSVBDVGhyZWFkU3RhdGU6OmF0dGVtcHRJbmNTdHJvbmdIYW5kbGUoaW50MzJfdCBoYW5kbGUpCi17Ci0gICAgTE9HX1JFTU9URVJFRlMoIklQQ1RocmVhZFN0YXRlOjphdHRlbXB0SW5jU3Ryb25nSGFuZGxlKCVkKVxuIiwgaGFuZGxlKTsKLSAgICBtT3V0LndyaXRlSW50MzIoQkNfQVRURU1QVF9BQ1FVSVJFKTsKLSAgICBtT3V0LndyaXRlSW50MzIoMCk7IC8vIHh4eCB3YXMgdGhyZWFkIHByaW9yaXR5Ci0gICAgbU91dC53cml0ZUludDMyKGhhbmRsZSk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gVU5LTk9XTl9FUlJPUjsKLSAgICAKLSAgICB3YWl0Rm9yUmVzcG9uc2UoTlVMTCwgJnJlc3VsdCk7Ci0gICAgCi0jaWYgTE9HX1JFRkNPVU5UUwotICAgIHByaW50ZigiSVBDVGhyZWFkU3RhdGU6OmF0dGVtcHRJbmNTdHJvbmdIYW5kbGUoJWxkKSA9ICVzXG4iLAotICAgICAgICBoYW5kbGUsIHJlc3VsdCA9PSBOT19FUlJPUiA/ICJTVUNDRVNTIiA6ICJGQUlMVVJFIik7Ci0jZW5kaWYKLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjpleHB1bmdlSGFuZGxlKGludDMyX3QgaGFuZGxlLCBJQmluZGVyKiBiaW5kZXIpCi17Ci0jaWYgTE9HX1JFRkNPVU5UUwotICAgIHByaW50ZigiSVBDVGhyZWFkU3RhdGU6OmV4cHVuZ2VIYW5kbGUoJWxkKVxuIiwgaGFuZGxlKTsKLSNlbmRpZgotICAgIHNlbGYoKS0+bVByb2Nlc3MtPmV4cHVuZ2VIYW5kbGUoaGFuZGxlLCBiaW5kZXIpOwotfQotCi1zdGF0dXNfdCBJUENUaHJlYWRTdGF0ZTo6cmVxdWVzdERlYXRoTm90aWZpY2F0aW9uKGludDMyX3QgaGFuZGxlLCBCcEJpbmRlciogcHJveHkpCi17Ci0gICAgbU91dC53cml0ZUludDMyKEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OKTsKLSAgICBtT3V0LndyaXRlSW50MzIoKGludDMyX3QpaGFuZGxlKTsKLSAgICBtT3V0LndyaXRlSW50MzIoKGludDMyX3QpcHJveHkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgSVBDVGhyZWFkU3RhdGU6OmNsZWFyRGVhdGhOb3RpZmljYXRpb24oaW50MzJfdCBoYW5kbGUsIEJwQmluZGVyKiBwcm94eSkKLXsKLSAgICBtT3V0LndyaXRlSW50MzIoQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OKTsKLSAgICBtT3V0LndyaXRlSW50MzIoKGludDMyX3QpaGFuZGxlKTsKLSAgICBtT3V0LndyaXRlSW50MzIoKGludDMyX3QpcHJveHkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotSVBDVGhyZWFkU3RhdGU6OklQQ1RocmVhZFN0YXRlKCkKLSAgICA6IG1Qcm9jZXNzKFByb2Nlc3NTdGF0ZTo6c2VsZigpKSwKLSAgICAgIG1NeVRocmVhZElkKGFuZHJvaWRHZXRUaWQoKSksCi0gICAgICBtU3RyaWN0TW9kZVBvbGljeSgwKSwKLSAgICAgIG1MYXN0VHJhbnNhY3Rpb25CaW5kZXJGbGFncygwKQotewotICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoZ1RMUywgdGhpcyk7Ci0gICAgY2xlYXJDYWxsZXIoKTsKLSAgICBtT3JpZ0NhbGxpbmdVaWQgPSBtQ2FsbGluZ1VpZDsKLSAgICBtSW4uc2V0RGF0YUNhcGFjaXR5KDI1Nik7Ci0gICAgbU91dC5zZXREYXRhQ2FwYWNpdHkoMjU2KTsKLX0KLQotSVBDVGhyZWFkU3RhdGU6On5JUENUaHJlYWRTdGF0ZSgpCi17Ci19Ci0KLXN0YXR1c190IElQQ1RocmVhZFN0YXRlOjpzZW5kUmVwbHkoY29uc3QgUGFyY2VsJiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIHN0YXR1c190IHN0YXR1c0J1ZmZlcjsKLSAgICBlcnIgPSB3cml0ZVRyYW5zYWN0aW9uRGF0YShCQ19SRVBMWSwgZmxhZ3MsIC0xLCAwLCByZXBseSwgJnN0YXR1c0J1ZmZlcik7Ci0gICAgaWYgKGVyciA8IE5PX0VSUk9SKSByZXR1cm4gZXJyOwotICAgIAotICAgIHJldHVybiB3YWl0Rm9yUmVzcG9uc2UoTlVMTCwgTlVMTCk7Ci19Ci0KLXN0YXR1c190IElQQ1RocmVhZFN0YXRlOjp3YWl0Rm9yUmVzcG9uc2UoUGFyY2VsICpyZXBseSwgc3RhdHVzX3QgKmFjcXVpcmVSZXN1bHQpCi17Ci0gICAgaW50MzJfdCBjbWQ7Ci0gICAgaW50MzJfdCBlcnI7Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoKGVycj10YWxrV2l0aERyaXZlcigpKSA8IE5PX0VSUk9SKSBicmVhazsKLSAgICAgICAgZXJyID0gbUluLmVycm9yQ2hlY2soKTsKLSAgICAgICAgaWYgKGVyciA8IE5PX0VSUk9SKSBicmVhazsKLSAgICAgICAgaWYgKG1Jbi5kYXRhQXZhaWwoKSA9PSAwKSBjb250aW51ZTsKLSAgICAgICAgCi0gICAgICAgIGNtZCA9IG1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgCi0gICAgICAgIElGX0xPR19DT01NQU5EUygpIHsKLSAgICAgICAgICAgIGFsb2cgPDwgIlByb2Nlc3Npbmcgd2FpdEZvclJlc3BvbnNlIENvbW1hbmQ6ICIKLSAgICAgICAgICAgICAgICA8PCBnZXRSZXR1cm5TdHJpbmcoY21kKSA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChjbWQpIHsKLSAgICAgICAgY2FzZSBCUl9UUkFOU0FDVElPTl9DT01QTEVURToKLSAgICAgICAgICAgIGlmICghcmVwbHkgJiYgIWFjcXVpcmVSZXN1bHQpIGdvdG8gZmluaXNoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgICAgICBjYXNlIEJSX0RFQURfUkVQTFk6Ci0gICAgICAgICAgICBlcnIgPSBERUFEX09CSkVDVDsKLSAgICAgICAgICAgIGdvdG8gZmluaXNoOwotCi0gICAgICAgIGNhc2UgQlJfRkFJTEVEX1JFUExZOgotICAgICAgICAgICAgZXJyID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgICAgICAgICAgZ290byBmaW5pc2g7Ci0gICAgICAgIAotICAgICAgICBjYXNlIEJSX0FDUVVJUkVfUkVTVUxUOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGFjcXVpcmVSZXN1bHQgIT0gTlVMTCwgIlVuZXhwZWN0ZWQgYnJBQ1FVSVJFX1JFU1VMVCIpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgcmVzdWx0ID0gbUluLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIGlmICghYWNxdWlyZVJlc3VsdCkgY29udGludWU7Ci0gICAgICAgICAgICAgICAgKmFjcXVpcmVSZXN1bHQgPSByZXN1bHQgPyBOT19FUlJPUiA6IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ290byBmaW5pc2g7Ci0gICAgICAgIAotICAgICAgICBjYXNlIEJSX1JFUExZOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHRyOwotICAgICAgICAgICAgICAgIGVyciA9IG1Jbi5yZWFkKCZ0ciwgc2l6ZW9mKHRyKSk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoZXJyID09IE5PX0VSUk9SLCAiTm90IGVub3VnaCBjb21tYW5kIGRhdGEgZm9yIGJyUkVQTFkiKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSBnb3RvIGZpbmlzaDsKLQotICAgICAgICAgICAgICAgIGlmIChyZXBseSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKHRyLmZsYWdzICYgVEZfU1RBVFVTX0NPREUpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LT5pcGNTZXREYXRhUmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRyLmRhdGEucHRyLmJ1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIuZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2l6ZV90Kj4odHIuZGF0YS5wdHIub2Zmc2V0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIub2Zmc2V0c19zaXplL3NpemVvZihzaXplX3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVCdWZmZXIsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gKnN0YXRpY19jYXN0PGNvbnN0IHN0YXR1c190Kj4odHIuZGF0YS5wdHIuYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVCdWZmZXIoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0ci5kYXRhLnB0ci5idWZmZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyLmRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHNpemVfdCo+KHRyLmRhdGEucHRyLm9mZnNldHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyLm9mZnNldHNfc2l6ZS9zaXplb2Yoc2l6ZV90KSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmcmVlQnVmZmVyKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0ci5kYXRhLnB0ci5idWZmZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgdHIuZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzaXplX3QqPih0ci5kYXRhLnB0ci5vZmZzZXRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyLm9mZnNldHNfc2l6ZS9zaXplb2Yoc2l6ZV90KSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdvdG8gZmluaXNoOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlcnIgPSBleGVjdXRlQ29tbWFuZChjbWQpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgZ290byBmaW5pc2g7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotZmluaXNoOgotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKGFjcXVpcmVSZXN1bHQpICphY3F1aXJlUmVzdWx0ID0gZXJyOwotICAgICAgICBpZiAocmVwbHkpIHJlcGx5LT5zZXRFcnJvcihlcnIpOwotICAgICAgICBtTGFzdEVycm9yID0gZXJyOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBJUENUaHJlYWRTdGF0ZTo6dGFsa1dpdGhEcml2ZXIoYm9vbCBkb1JlY2VpdmUpCi17Ci0gICAgQUxPR19BU1NFUlQobVByb2Nlc3MtPm1Ecml2ZXJGRCA+PSAwLCAiQmluZGVyIGRyaXZlciBpcyBub3Qgb3BlbmVkIik7Ci0gICAgCi0gICAgYmluZGVyX3dyaXRlX3JlYWQgYndyOwotICAgIAotICAgIC8vIElzIHRoZSByZWFkIGJ1ZmZlciBlbXB0eT8KLSAgICBjb25zdCBib29sIG5lZWRSZWFkID0gbUluLmRhdGFQb3NpdGlvbigpID49IG1Jbi5kYXRhU2l6ZSgpOwotICAgIAotICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gd3JpdGUgYW55dGhpbmcgaWYgd2UgYXJlIHN0aWxsIHJlYWRpbmcKLSAgICAvLyBmcm9tIGRhdGEgbGVmdCBpbiB0aGUgaW5wdXQgYnVmZmVyIGFuZCB0aGUgY2FsbGVyCi0gICAgLy8gaGFzIHJlcXVlc3RlZCB0byByZWFkIHRoZSBuZXh0IGRhdGEuCi0gICAgY29uc3Qgc2l6ZV90IG91dEF2YWlsID0gKCFkb1JlY2VpdmUgfHwgbmVlZFJlYWQpID8gbU91dC5kYXRhU2l6ZSgpIDogMDsKLSAgICAKLSAgICBid3Iud3JpdGVfc2l6ZSA9IG91dEF2YWlsOwotICAgIGJ3ci53cml0ZV9idWZmZXIgPSAobG9uZyB1bnNpZ25lZCBpbnQpbU91dC5kYXRhKCk7Ci0KLSAgICAvLyBUaGlzIGlzIHdoYXQgd2UnbGwgcmVhZC4KLSAgICBpZiAoZG9SZWNlaXZlICYmIG5lZWRSZWFkKSB7Ci0gICAgICAgIGJ3ci5yZWFkX3NpemUgPSBtSW4uZGF0YUNhcGFjaXR5KCk7Ci0gICAgICAgIGJ3ci5yZWFkX2J1ZmZlciA9IChsb25nIHVuc2lnbmVkIGludCltSW4uZGF0YSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ3ci5yZWFkX3NpemUgPSAwOwotICAgICAgICBid3IucmVhZF9idWZmZXIgPSAwOwotICAgIH0KLQotICAgIElGX0xPR19DT01NQU5EUygpIHsKLSAgICAgICAgVGV4dE91dHB1dDo6QnVuZGxlIF9iKGFsb2cpOwotICAgICAgICBpZiAob3V0QXZhaWwgIT0gMCkgewotICAgICAgICAgICAgYWxvZyA8PCAiU2VuZGluZyBjb21tYW5kcyB0byBkcml2ZXI6ICIgPDwgaW5kZW50OwotICAgICAgICAgICAgY29uc3Qgdm9pZCogY21kcyA9IChjb25zdCB2b2lkKilid3Iud3JpdGVfYnVmZmVyOwotICAgICAgICAgICAgY29uc3Qgdm9pZCogZW5kID0gKChjb25zdCB1aW50OF90KiljbWRzKStid3Iud3JpdGVfc2l6ZTsKLSAgICAgICAgICAgIGFsb2cgPDwgSGV4RHVtcChjbWRzLCBid3Iud3JpdGVfc2l6ZSkgPDwgZW5kbDsKLSAgICAgICAgICAgIHdoaWxlIChjbWRzIDwgZW5kKSBjbWRzID0gcHJpbnRDb21tYW5kKGFsb2csIGNtZHMpOwotICAgICAgICAgICAgYWxvZyA8PCBkZWRlbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgYWxvZyA8PCAiU2l6ZSBvZiByZWNlaXZlIGJ1ZmZlcjogIiA8PCBid3IucmVhZF9zaXplCi0gICAgICAgICAgICA8PCAiLCBuZWVkUmVhZDogIiA8PCBuZWVkUmVhZCA8PCAiLCBkb1JlY2VpdmU6ICIgPDwgZG9SZWNlaXZlIDw8IGVuZGw7Ci0gICAgfQotICAgIAotICAgIC8vIFJldHVybiBpbW1lZGlhdGVseSBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgotICAgIGlmICgoYndyLndyaXRlX3NpemUgPT0gMCkgJiYgKGJ3ci5yZWFkX3NpemUgPT0gMCkpIHJldHVybiBOT19FUlJPUjsKLQotICAgIGJ3ci53cml0ZV9jb25zdW1lZCA9IDA7Ci0gICAgYndyLnJlYWRfY29uc3VtZWQgPSAwOwotICAgIHN0YXR1c190IGVycjsKLSAgICBkbyB7Ci0gICAgICAgIElGX0xPR19DT01NQU5EUygpIHsKLSAgICAgICAgICAgIGFsb2cgPDwgIkFib3V0IHRvIHJlYWQvd3JpdGUsIHdyaXRlIHNpemUgPSAiIDw8IG1PdXQuZGF0YVNpemUoKSA8PCBlbmRsOwotICAgICAgICB9Ci0jaWYgZGVmaW5lZChIQVZFX0FORFJPSURfT1MpCi0gICAgICAgIGlmIChpb2N0bChtUHJvY2Vzcy0+bURyaXZlckZELCBCSU5ERVJfV1JJVEVfUkVBRCwgJmJ3cikgPj0gMCkKLSAgICAgICAgICAgIGVyciA9IE5PX0VSUk9SOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0jZWxzZQotICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKLSNlbmRpZgotICAgICAgICBJRl9MT0dfQ09NTUFORFMoKSB7Ci0gICAgICAgICAgICBhbG9nIDw8ICJGaW5pc2hlZCByZWFkL3dyaXRlLCB3cml0ZSBzaXplID0gIiA8PCBtT3V0LmRhdGFTaXplKCkgPDwgZW5kbDsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGVyciA9PSAtRUlOVFIpOwotCi0gICAgSUZfTE9HX0NPTU1BTkRTKCkgewotICAgICAgICBhbG9nIDw8ICJPdXIgZXJyOiAiIDw8ICh2b2lkKillcnIgPDwgIiwgd3JpdGUgY29uc3VtZWQ6ICIKLSAgICAgICAgICAgIDw8IGJ3ci53cml0ZV9jb25zdW1lZCA8PCAiIChvZiAiIDw8IG1PdXQuZGF0YVNpemUoKQotCQkJPDwgIiksIHJlYWQgY29uc3VtZWQ6ICIgPDwgYndyLnJlYWRfY29uc3VtZWQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoZXJyID49IE5PX0VSUk9SKSB7Ci0gICAgICAgIGlmIChid3Iud3JpdGVfY29uc3VtZWQgPiAwKSB7Ci0gICAgICAgICAgICBpZiAoYndyLndyaXRlX2NvbnN1bWVkIDwgKHNzaXplX3QpbU91dC5kYXRhU2l6ZSgpKQotICAgICAgICAgICAgICAgIG1PdXQucmVtb3ZlKDAsIGJ3ci53cml0ZV9jb25zdW1lZCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbU91dC5zZXREYXRhU2l6ZSgwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYndyLnJlYWRfY29uc3VtZWQgPiAwKSB7Ci0gICAgICAgICAgICBtSW4uc2V0RGF0YVNpemUoYndyLnJlYWRfY29uc3VtZWQpOwotICAgICAgICAgICAgbUluLnNldERhdGFQb3NpdGlvbigwKTsKLSAgICAgICAgfQotICAgICAgICBJRl9MT0dfQ09NTUFORFMoKSB7Ci0gICAgICAgICAgICBUZXh0T3V0cHV0OjpCdW5kbGUgX2IoYWxvZyk7Ci0gICAgICAgICAgICBhbG9nIDw8ICJSZW1haW5pbmcgZGF0YSBzaXplOiAiIDw8IG1PdXQuZGF0YVNpemUoKSA8PCBlbmRsOwotICAgICAgICAgICAgYWxvZyA8PCAiUmVjZWl2ZWQgY29tbWFuZHMgZnJvbSBkcml2ZXI6ICIgPDwgaW5kZW50OwotICAgICAgICAgICAgY29uc3Qgdm9pZCogY21kcyA9IG1Jbi5kYXRhKCk7Ci0gICAgICAgICAgICBjb25zdCB2b2lkKiBlbmQgPSBtSW4uZGF0YSgpICsgbUluLmRhdGFTaXplKCk7Ci0gICAgICAgICAgICBhbG9nIDw8IEhleER1bXAoY21kcywgbUluLmRhdGFTaXplKCkpIDw8IGVuZGw7Ci0gICAgICAgICAgICB3aGlsZSAoY21kcyA8IGVuZCkgY21kcyA9IHByaW50UmV0dXJuQ29tbWFuZChhbG9nLCBjbWRzKTsKLSAgICAgICAgICAgIGFsb2cgPDwgZGVkZW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgSVBDVGhyZWFkU3RhdGU6OndyaXRlVHJhbnNhY3Rpb25EYXRhKGludDMyX3QgY21kLCB1aW50MzJfdCBiaW5kZXJGbGFncywKLSAgICBpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBzdGF0dXNfdCogc3RhdHVzQnVmZmVyKQotewotICAgIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHRyOwotCi0gICAgdHIudGFyZ2V0LmhhbmRsZSA9IGhhbmRsZTsKLSAgICB0ci5jb2RlID0gY29kZTsKLSAgICB0ci5mbGFncyA9IGJpbmRlckZsYWdzOwotICAgIHRyLmNvb2tpZSA9IDA7Ci0gICAgdHIuc2VuZGVyX3BpZCA9IDA7Ci0gICAgdHIuc2VuZGVyX2V1aWQgPSAwOwotICAgIAotICAgIGNvbnN0IHN0YXR1c190IGVyciA9IGRhdGEuZXJyb3JDaGVjaygpOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgdHIuZGF0YV9zaXplID0gZGF0YS5pcGNEYXRhU2l6ZSgpOwotICAgICAgICB0ci5kYXRhLnB0ci5idWZmZXIgPSBkYXRhLmlwY0RhdGEoKTsKLSAgICAgICAgdHIub2Zmc2V0c19zaXplID0gZGF0YS5pcGNPYmplY3RzQ291bnQoKSpzaXplb2Yoc2l6ZV90KTsKLSAgICAgICAgdHIuZGF0YS5wdHIub2Zmc2V0cyA9IGRhdGEuaXBjT2JqZWN0cygpOwotICAgIH0gZWxzZSBpZiAoc3RhdHVzQnVmZmVyKSB7Ci0gICAgICAgIHRyLmZsYWdzIHw9IFRGX1NUQVRVU19DT0RFOwotICAgICAgICAqc3RhdHVzQnVmZmVyID0gZXJyOwotICAgICAgICB0ci5kYXRhX3NpemUgPSBzaXplb2Yoc3RhdHVzX3QpOwotICAgICAgICB0ci5kYXRhLnB0ci5idWZmZXIgPSBzdGF0dXNCdWZmZXI7Ci0gICAgICAgIHRyLm9mZnNldHNfc2l6ZSA9IDA7Ci0gICAgICAgIHRyLmRhdGEucHRyLm9mZnNldHMgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAobUxhc3RFcnJvciA9IGVycik7Ci0gICAgfQotICAgIAotICAgIG1PdXQud3JpdGVJbnQzMihjbWQpOwotICAgIG1PdXQud3JpdGUoJnRyLCBzaXplb2YodHIpKTsKLSAgICAKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXNwPEJCaW5kZXI+IHRoZV9jb250ZXh0X29iamVjdDsKLQotdm9pZCBzZXRUaGVDb250ZXh0T2JqZWN0KHNwPEJCaW5kZXI+IG9iaikKLXsKLSAgICB0aGVfY29udGV4dF9vYmplY3QgPSBvYmo7Ci19Ci0KLXN0YXR1c190IElQQ1RocmVhZFN0YXRlOjpleGVjdXRlQ29tbWFuZChpbnQzMl90IGNtZCkKLXsKLSAgICBCQmluZGVyKiBvYmo7Ci0gICAgUmVmQmFzZTo6d2Vha3JlZl90eXBlKiByZWZzOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0VSUk9SOwotICAgIAotICAgIHN3aXRjaCAoY21kKSB7Ci0gICAgY2FzZSBCUl9FUlJPUjoKLSAgICAgICAgcmVzdWx0ID0gbUluLnJlYWRJbnQzMigpOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgY2FzZSBCUl9PSzoKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgQlJfQUNRVUlSRToKLSAgICAgICAgcmVmcyA9IChSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqKW1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgb2JqID0gKEJCaW5kZXIqKW1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgQUxPR19BU1NFUlQocmVmcy0+cmVmQmFzZSgpID09IG9iaiwKLSAgICAgICAgICAgICAgICAgICAiQlJfQUNRVUlSRTogb2JqZWN0ICVwIGRvZXMgbm90IG1hdGNoIGNvb2tpZSAlcCAoZXhwZWN0ZWQgJXApIiwKLSAgICAgICAgICAgICAgICAgICByZWZzLCBvYmosIHJlZnMtPnJlZkJhc2UoKSk7Ci0gICAgICAgIG9iai0+aW5jU3Ryb25nKG1Qcm9jZXNzLmdldCgpKTsKLSAgICAgICAgSUZfTE9HX1JFTU9URVJFRlMoKSB7Ci0gICAgICAgICAgICBMT0dfUkVNT1RFUkVGUygiQlJfQUNRVUlSRSBmcm9tIGRyaXZlciBvbiAlcCIsIG9iaik7Ci0gICAgICAgICAgICBvYmotPnByaW50UmVmcygpOwotICAgICAgICB9Ci0gICAgICAgIG1PdXQud3JpdGVJbnQzMihCQ19BQ1FVSVJFX0RPTkUpOwotICAgICAgICBtT3V0LndyaXRlSW50MzIoKGludDMyX3QpcmVmcyk7Ci0gICAgICAgIG1PdXQud3JpdGVJbnQzMigoaW50MzJfdClvYmopOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgY2FzZSBCUl9SRUxFQVNFOgotICAgICAgICByZWZzID0gKFJlZkJhc2U6OndlYWtyZWZfdHlwZSopbUluLnJlYWRJbnQzMigpOwotICAgICAgICBvYmogPSAoQkJpbmRlciopbUluLnJlYWRJbnQzMigpOwotICAgICAgICBBTE9HX0FTU0VSVChyZWZzLT5yZWZCYXNlKCkgPT0gb2JqLAotICAgICAgICAgICAgICAgICAgICJCUl9SRUxFQVNFOiBvYmplY3QgJXAgZG9lcyBub3QgbWF0Y2ggY29va2llICVwIChleHBlY3RlZCAlcCkiLAotICAgICAgICAgICAgICAgICAgIHJlZnMsIG9iaiwgcmVmcy0+cmVmQmFzZSgpKTsKLSAgICAgICAgSUZfTE9HX1JFTU9URVJFRlMoKSB7Ci0gICAgICAgICAgICBMT0dfUkVNT1RFUkVGUygiQlJfUkVMRUFTRSBmcm9tIGRyaXZlciBvbiAlcCIsIG9iaik7Ci0gICAgICAgICAgICBvYmotPnByaW50UmVmcygpOwotICAgICAgICB9Ci0gICAgICAgIG1QZW5kaW5nU3Ryb25nRGVyZWZzLnB1c2gob2JqKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgQlJfSU5DUkVGUzoKLSAgICAgICAgcmVmcyA9IChSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqKW1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgb2JqID0gKEJCaW5kZXIqKW1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgcmVmcy0+aW5jV2VhayhtUHJvY2Vzcy5nZXQoKSk7Ci0gICAgICAgIG1PdXQud3JpdGVJbnQzMihCQ19JTkNSRUZTX0RPTkUpOwotICAgICAgICBtT3V0LndyaXRlSW50MzIoKGludDMyX3QpcmVmcyk7Ci0gICAgICAgIG1PdXQud3JpdGVJbnQzMigoaW50MzJfdClvYmopOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgY2FzZSBCUl9ERUNSRUZTOgotICAgICAgICByZWZzID0gKFJlZkJhc2U6OndlYWtyZWZfdHlwZSopbUluLnJlYWRJbnQzMigpOwotICAgICAgICBvYmogPSAoQkJpbmRlciopbUluLnJlYWRJbnQzMigpOwotICAgICAgICAvLyBOT1RFOiBUaGlzIGFzc2VydGlvbiBpcyBub3QgdmFsaWQsIGJlY2F1c2UgdGhlIG9iamVjdCBtYXkgbm8KLSAgICAgICAgLy8gbG9uZ2VyIGV4aXN0ICh0aHVzIHRoZSAoQkJpbmRlciopY2FzdCBhYm92ZSByZXN1bHRpbmcgaW4gYSBkaWZmZXJlbnQKLSAgICAgICAgLy8gbWVtb3J5IGFkZHJlc3MpLgotICAgICAgICAvL0FMT0dfQVNTRVJUKHJlZnMtPnJlZkJhc2UoKSA9PSBvYmosCi0gICAgICAgIC8vICAgICAgICAgICAiQlJfREVDUkVGUzogb2JqZWN0ICVwIGRvZXMgbm90IG1hdGNoIGNvb2tpZSAlcCAoZXhwZWN0ZWQgJXApIiwKLSAgICAgICAgLy8gICAgICAgICAgIHJlZnMsIG9iaiwgcmVmcy0+cmVmQmFzZSgpKTsKLSAgICAgICAgbVBlbmRpbmdXZWFrRGVyZWZzLnB1c2gocmVmcyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBjYXNlIEJSX0FUVEVNUFRfQUNRVUlSRToKLSAgICAgICAgcmVmcyA9IChSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqKW1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgb2JqID0gKEJCaW5kZXIqKW1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBib29sIHN1Y2Nlc3MgPSByZWZzLT5hdHRlbXB0SW5jU3Ryb25nKG1Qcm9jZXNzLmdldCgpKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKHN1Y2Nlc3MgJiYgcmVmcy0+cmVmQmFzZSgpID09IG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkJSX0FUVEVNUFRfQUNRVUlSRTogb2JqZWN0ICVwIGRvZXMgbm90IG1hdGNoIGNvb2tpZSAlcCAoZXhwZWN0ZWQgJXApIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVmcywgb2JqLCByZWZzLT5yZWZCYXNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtT3V0LndyaXRlSW50MzIoQkNfQUNRVUlSRV9SRVNVTFQpOwotICAgICAgICAgICAgbU91dC53cml0ZUludDMyKChpbnQzMl90KXN1Y2Nlc3MpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIAotICAgIGNhc2UgQlJfVFJBTlNBQ1RJT046Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHRyOwotICAgICAgICAgICAgcmVzdWx0ID0gbUluLnJlYWQoJnRyLCBzaXplb2YodHIpKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKHJlc3VsdCA9PSBOT19FUlJPUiwKLSAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBjb21tYW5kIGRhdGEgZm9yIGJyVFJBTlNBQ1RJT04iKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBQYXJjZWwgYnVmZmVyOwotICAgICAgICAgICAgYnVmZmVyLmlwY1NldERhdGFSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odHIuZGF0YS5wdHIuYnVmZmVyKSwKLSAgICAgICAgICAgICAgICB0ci5kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzaXplX3QqPih0ci5kYXRhLnB0ci5vZmZzZXRzKSwKLSAgICAgICAgICAgICAgICB0ci5vZmZzZXRzX3NpemUvc2l6ZW9mKHNpemVfdCksIGZyZWVCdWZmZXIsIHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb25zdCBwaWRfdCBvcmlnUGlkID0gbUNhbGxpbmdQaWQ7Ci0gICAgICAgICAgICBjb25zdCB1aWRfdCBvcmlnVWlkID0gbUNhbGxpbmdVaWQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1DYWxsaW5nUGlkID0gdHIuc2VuZGVyX3BpZDsKLSAgICAgICAgICAgIG1DYWxsaW5nVWlkID0gdHIuc2VuZGVyX2V1aWQ7Ci0gICAgICAgICAgICBtT3JpZ0NhbGxpbmdVaWQgPSB0ci5zZW5kZXJfZXVpZDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGN1clByaW8gPSBnZXRwcmlvcml0eShQUklPX1BST0NFU1MsIG1NeVRocmVhZElkKTsKLSAgICAgICAgICAgIGlmIChnRGlzYWJsZUJhY2tncm91bmRTY2hlZHVsaW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1clByaW8gPiBBTkRST0lEX1BSSU9SSVRZX05PUk1BTCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGluaGVyaXRlZCBhIHJlZHVjZWQgcHJpb3JpdHkgZnJvbSB0aGUgY2FsbGVyLCBidXQgZG8gbm90Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gcnVuIGluIHRoYXQgc3RhdGUgaW4gdGhpcyBwcm9jZXNzLiAgVGhlIGRyaXZlciBzZXQgb3VyCi0gICAgICAgICAgICAgICAgICAgIC8vIHByaW9yaXR5IGFscmVhZHkgKHRob3VnaCBub3Qgb3VyIHNjaGVkdWxpbmcgY2xhc3MpLCBzbyBib3VuY2UKLSAgICAgICAgICAgICAgICAgICAgLy8gaXQgYmFjayB0byB0aGUgZGVmYXVsdCBiZWZvcmUgaW52b2tpbmcgdGhlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAgICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIG1NeVRocmVhZElkLCBBTkRST0lEX1BSSU9SSVRZX05PUk1BTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VyUHJpbyA+PSBBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgdGhlIGluaGVyaXRlZCBwcmlvcml0eSBmcm9tIHRoZSBjYWxsZXIuCi0gICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGlzIHRocmVhZCBpcyBpbiB0aGUgYmFja2dyb3VuZCBzY2hlZHVsaW5nIGNsYXNzLAotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgZHJpdmVyIHdvbid0IG1vZGlmeSBzY2hlZHVsaW5nIGNsYXNzZXMgZm9yIHVzLgotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2NoZWR1bGluZyBncm91cCBpcyByZXNldCB0byBkZWZhdWx0IGJ5IHRoZSBjYWxsZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gb25jZSB0aGlzIG1ldGhvZCByZXR1cm5zIGFmdGVyIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZFNldFRocmVhZFNjaGVkdWxpbmdHcm91cChtTXlUaHJlYWRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1RHUk9VUF9CR19OT05JTlRFUkFDVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0FMT0dJKCI+Pj4+IFRSQU5TQUNUIGZyb20gcGlkICVkIHVpZCAlZFxuIiwgbUNhbGxpbmdQaWQsIG1DYWxsaW5nVWlkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUGFyY2VsIHJlcGx5OwotICAgICAgICAgICAgSUZfTE9HX1RSQU5TQUNUSU9OUygpIHsKLSAgICAgICAgICAgICAgICBUZXh0T3V0cHV0OjpCdW5kbGUgX2IoYWxvZyk7Ci0gICAgICAgICAgICAgICAgYWxvZyA8PCAiQlJfVFJBTlNBQ1RJT04gdGhyICIgPDwgKHZvaWQqKXB0aHJlYWRfc2VsZigpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgLyBvYmogIiA8PCB0ci50YXJnZXQucHRyIDw8ICIgLyBjb2RlICIKLSAgICAgICAgICAgICAgICAgICAgPDwgVHlwZUNvZGUodHIuY29kZSkgPDwgIjogIiA8PCBpbmRlbnQgPDwgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIDw8IGRlZGVudCA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgIDw8ICJEYXRhIGFkZHIgPSAiCi0gICAgICAgICAgICAgICAgICAgIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRyLmRhdGEucHRyLmJ1ZmZlcikKLSAgICAgICAgICAgICAgICAgICAgPDwgIiwgb2Zmc2V0cyBhZGRyPSIKLSAgICAgICAgICAgICAgICAgICAgPDwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzaXplX3QqPih0ci5kYXRhLnB0ci5vZmZzZXRzKSA8PCBlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRyLnRhcmdldC5wdHIpIHsKLSAgICAgICAgICAgICAgICBzcDxCQmluZGVyPiBiKChCQmluZGVyKil0ci5jb29raWUpOwotICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1c190IGVycm9yID0gYi0+dHJhbnNhY3QodHIuY29kZSwgYnVmZmVyLCAmcmVwbHksIHRyLmZsYWdzKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBOT19FUlJPUikgcmVwbHkuc2V0RXJyb3IoZXJyb3IpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1c190IGVycm9yID0gdGhlX2NvbnRleHRfb2JqZWN0LT50cmFuc2FjdCh0ci5jb2RlLCBidWZmZXIsICZyZXBseSwgdHIuZmxhZ3MpOwotICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IE5PX0VSUk9SKSByZXBseS5zZXRFcnJvcihlcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vQUxPR0koIjw8PDwgVFJBTlNBQ1QgZnJvbSBwaWQgJWQgcmVzdG9yZSBwaWQgJWQgdWlkICVkXG4iLAotICAgICAgICAgICAgLy8gICAgIG1DYWxsaW5nUGlkLCBvcmlnUGlkLCBvcmlnVWlkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCh0ci5mbGFncyAmIFRGX09ORV9XQVkpID09IDApIHsKLSAgICAgICAgICAgICAgICBMT0dfT05FV0FZKCJTZW5kaW5nIHJlcGx5IHRvICVkISIsIG1DYWxsaW5nUGlkKTsKLSAgICAgICAgICAgICAgICBzZW5kUmVwbHkocmVwbHksIDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0dfT05FV0FZKCJOT1Qgc2VuZGluZyByZXBseSB0byAlZCEiLCBtQ2FsbGluZ1BpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1DYWxsaW5nUGlkID0gb3JpZ1BpZDsKLSAgICAgICAgICAgIG1DYWxsaW5nVWlkID0gb3JpZ1VpZDsKLSAgICAgICAgICAgIG1PcmlnQ2FsbGluZ1VpZCA9IG9yaWdVaWQ7Ci0KLSAgICAgICAgICAgIElGX0xPR19UUkFOU0FDVElPTlMoKSB7Ci0gICAgICAgICAgICAgICAgVGV4dE91dHB1dDo6QnVuZGxlIF9iKGFsb2cpOwotICAgICAgICAgICAgICAgIGFsb2cgPDwgIkJDX1JFUExZIHRociAiIDw8ICh2b2lkKilwdGhyZWFkX3NlbGYoKSA8PCAiIC8gb2JqICIKLSAgICAgICAgICAgICAgICAgICAgPDwgdHIudGFyZ2V0LnB0ciA8PCAiOiAiIDw8IGluZGVudCA8PCByZXBseSA8PCBkZWRlbnQgPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIAotICAgIGNhc2UgQlJfREVBRF9CSU5ERVI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEJwQmluZGVyICpwcm94eSA9IChCcEJpbmRlciopbUluLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcHJveHktPnNlbmRPYml0dWFyeSgpOwotICAgICAgICAgICAgbU91dC53cml0ZUludDMyKEJDX0RFQURfQklOREVSX0RPTkUpOwotICAgICAgICAgICAgbU91dC53cml0ZUludDMyKChpbnQzMl90KXByb3h5KTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgCi0gICAgY2FzZSBCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORToKLSAgICAgICAgewotICAgICAgICAgICAgQnBCaW5kZXIgKnByb3h5ID0gKEJwQmluZGVyKiltSW4ucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBwcm94eS0+Z2V0V2Vha1JlZnMoKS0+ZGVjV2Vhayhwcm94eSk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgQlJfRklOSVNIRUQ6Ci0gICAgICAgIHJlc3VsdCA9IFRJTUVEX09VVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgQlJfTk9PUDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgQlJfU1BBV05fTE9PUEVSOgotICAgICAgICBtUHJvY2Vzcy0+c3Bhd25Qb29sZWRUaHJlYWQoZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcHJpbnRmKCIqKiogQkFEIENPTU1BTkQgJWQgcmVjZWl2ZWQgZnJvbSBCaW5kZXIgZHJpdmVyXG4iLCBjbWQpOwotICAgICAgICByZXN1bHQgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1MYXN0RXJyb3IgPSByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgSVBDVGhyZWFkU3RhdGU6OnRocmVhZERlc3RydWN0b3Iodm9pZCAqc3QpCi17Ci0JSVBDVGhyZWFkU3RhdGUqIGNvbnN0IHNlbGYgPSBzdGF0aWNfY2FzdDxJUENUaHJlYWRTdGF0ZSo+KHN0KTsKLQlpZiAoc2VsZikgewotCQlzZWxmLT5mbHVzaENvbW1hbmRzKCk7Ci0jaWYgZGVmaW5lZChIQVZFX0FORFJPSURfT1MpCi0gICAgICAgIGlvY3RsKHNlbGYtPm1Qcm9jZXNzLT5tRHJpdmVyRkQsIEJJTkRFUl9USFJFQURfRVhJVCwgMCk7Ci0jZW5kaWYKLQkJZGVsZXRlIHNlbGY7Ci0JfQotfQotCi0KLXZvaWQgSVBDVGhyZWFkU3RhdGU6OmZyZWVCdWZmZXIoUGFyY2VsKiBwYXJjZWwsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90KiBvYmplY3RzLCBzaXplX3Qgb2JqZWN0c1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvb2tpZSkKLXsKLSAgICAvL0FMT0dJKCJGcmVlaW5nIHBhcmNlbCAlcCIsICZwYXJjZWwpOwotICAgIElGX0xPR19DT01NQU5EUygpIHsKLSAgICAgICAgYWxvZyA8PCAiV3JpdGluZyBCQ19GUkVFX0JVRkZFUiBmb3IgIiA8PCBkYXRhIDw8IGVuZGw7Ci0gICAgfQotICAgIEFMT0dfQVNTRVJUKGRhdGEgIT0gTlVMTCwgIkNhbGxlZCB3aXRoIE5VTEwgZGF0YSIpOwotICAgIGlmIChwYXJjZWwgIT0gTlVMTCkgcGFyY2VsLT5jbG9zZUZpbGVEZXNjcmlwdG9ycygpOwotICAgIElQQ1RocmVhZFN0YXRlKiBzdGF0ZSA9IHNlbGYoKTsKLSAgICBzdGF0ZS0+bU91dC53cml0ZUludDMyKEJDX0ZSRUVfQlVGRkVSKTsKLSAgICBzdGF0ZS0+bU91dC53cml0ZUludDMyKChpbnQzMl90KWRhdGEpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvSVBlcm1pc3Npb25Db250cm9sbGVyLmNwcCBiL2xpYnMvYmluZGVyL0lQZXJtaXNzaW9uQ29udHJvbGxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzAzNmYuLjAwMDAwMDAKLS0tIGEvbGlicy9iaW5kZXIvSVBlcm1pc3Npb25Db250cm9sbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlBlcm1pc3Npb25Db250cm9sbGVyIgotCi0jaW5jbHVkZSA8YmluZGVyL0lQZXJtaXNzaW9uQ29udHJvbGxlci5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9iaW5kZXIvU3RhdGljLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCcFBlcm1pc3Npb25Db250cm9sbGVyIDogcHVibGljIEJwSW50ZXJmYWNlPElQZXJtaXNzaW9uQ29udHJvbGxlcj4KLXsKLXB1YmxpYzoKLSAgICBCcFBlcm1pc3Npb25Db250cm9sbGVyKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElQZXJtaXNzaW9uQ29udHJvbGxlcj4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGNoZWNrUGVybWlzc2lvbihjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbiwgaW50MzJfdCBwaWQsIGludDMyX3QgdWlkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVBlcm1pc3Npb25Db250cm9sbGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYocGVybWlzc2lvbik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENIRUNLX1BFUk1JU1NJT05fVFJBTlNBQ1RJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIC8vIGZhaWwgb24gZXhjZXB0aW9uCi0gICAgICAgIGlmIChyZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpICE9IDApIHJldHVybiAwOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCkgIT0gMDsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoUGVybWlzc2lvbkNvbnRyb2xsZXIsICJhbmRyb2lkLm9zLklQZXJtaXNzaW9uQ29udHJvbGxlciIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuUGVybWlzc2lvbkNvbnRyb2xsZXI6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICAvL3ByaW50ZigiUGVybWlzc2lvbkNvbnRyb2xsZXIgcmVjZWl2ZWQ6ICIpOyBkYXRhLnByaW50KCk7Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBDSEVDS19QRVJNSVNTSU9OX1RSQU5TQUNUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVBlcm1pc3Npb25Db250cm9sbGVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBTdHJpbmcxNiBwZXJtaXNzaW9uID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKLSAgICAgICAgICAgIGludDMyX3QgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGludDMyX3QgdWlkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJvb2wgcmVzID0gY2hlY2tQZXJtaXNzaW9uKHBlcm1pc3Npb24sIHBpZCwgdWlkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXMgPyAxIDogMCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL0lTZXJ2aWNlTWFuYWdlci5jcHAgYi9saWJzL2JpbmRlci9JU2VydmljZU1hbmFnZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzUwNjQwLi4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL0lTZXJ2aWNlTWFuYWdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU2VydmljZU1hbmFnZXIiCi0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3lzdGVtQ2xvY2suaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvYmluZGVyL1N0YXRpYy5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3A8SVNlcnZpY2VNYW5hZ2VyPiBkZWZhdWx0U2VydmljZU1hbmFnZXIoKQotewotICAgIGlmIChnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyICE9IE5VTEwpIHJldHVybiBnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyOwotICAgIAotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKGdEZWZhdWx0U2VydmljZU1hbmFnZXJMb2NrKTsKLSAgICAgICAgaWYgKGdEZWZhdWx0U2VydmljZU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElTZXJ2aWNlTWFuYWdlcj4oCi0gICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPmdldENvbnRleHRPYmplY3QoTlVMTCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyOwotfQotCi1ib29sIGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24pCi17Ci0gICAgcmV0dXJuIGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24ocGVybWlzc2lvbiwgTlVMTCwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBTdHJpbmcxNiBfcGVybWlzc2lvbigicGVybWlzc2lvbiIpOwotCi0KLWJvb2wgY2hlY2tDYWxsaW5nUGVybWlzc2lvbihjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbiwgaW50MzJfdCogb3V0UGlkLCBpbnQzMl90KiBvdXRVaWQpCi17Ci0gICAgSVBDVGhyZWFkU3RhdGUqIGlwY1N0YXRlID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICBwaWRfdCBwaWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIHVpZF90IHVpZCA9IGlwY1N0YXRlLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKG91dFBpZCkgKm91dFBpZCA9IHBpZDsKLSAgICBpZiAob3V0VWlkKSAqb3V0VWlkID0gdWlkOwotICAgIHJldHVybiBjaGVja1Blcm1pc3Npb24ocGVybWlzc2lvbiwgcGlkLCB1aWQpOwotfQotCi1ib29sIGNoZWNrUGVybWlzc2lvbihjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbiwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpCi17Ci0gICAgc3A8SVBlcm1pc3Npb25Db250cm9sbGVyPiBwYzsKLSAgICBnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyTG9jay5sb2NrKCk7Ci0gICAgcGMgPSBnUGVybWlzc2lvbkNvbnRyb2xsZXI7Ci0gICAgZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlckxvY2sudW5sb2NrKCk7Ci0gICAgCi0gICAgaW50NjRfdCBzdGFydFRpbWUgPSAwOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaWYgKHBjICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGJvb2wgcmVzID0gcGMtPmNoZWNrUGVybWlzc2lvbihwZXJtaXNzaW9uLCBwaWQsIHVpZCk7Ci0gICAgICAgICAgICBpZiAocmVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0VGltZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJDaGVjayBwYXNzZWQgYWZ0ZXIgJWQgc2Vjb25kcyBmb3IgJXMgZnJvbSB1aWQ9JWQgcGlkPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgodXB0aW1lTWlsbGlzKCktc3RhcnRUaW1lKS8xMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHBlcm1pc3Npb24pLnN0cmluZygpLCB1aWQsIHBpZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElzIHRoaXMgYSBwZXJtaXNzaW9uIGZhaWx1cmUsIG9yIGRpZCB0aGUgY29udHJvbGxlciBnbyBhd2F5PwotICAgICAgICAgICAgaWYgKHBjLT5hc0JpbmRlcigpLT5pc0JpbmRlckFsaXZlKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiUGVybWlzc2lvbiBmYWlsdXJlOiAlcyBmcm9tIHVpZD0lZCBwaWQ9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChwZXJtaXNzaW9uKS5zdHJpbmcoKSwgdWlkLCBwaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gT2JqZWN0IGlzIGRlYWQhCi0gICAgICAgICAgICBnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICBpZiAoZ1Blcm1pc3Npb25Db250cm9sbGVyID09IHBjKSB7Ci0gICAgICAgICAgICAgICAgZ1Blcm1pc3Npb25Db250cm9sbGVyID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdEZWZhdWx0U2VydmljZU1hbmFnZXJMb2NrLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIC8vIE5lZWQgdG8gcmV0cmlldmUgdGhlIHBlcm1pc3Npb24gY29udHJvbGxlci4KLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShfcGVybWlzc2lvbik7Ci0gICAgICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHBlcm1pc3Npb24gY29udHJvbGxlciB0byBjb21lIGJhY2suLi4KLSAgICAgICAgICAgIGlmIChzdGFydFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IHVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIEFMT0dJKCJXYWl0aW5nIHRvIGNoZWNrIHBlcm1pc3Npb24gJXMgZnJvbSB1aWQ9JWQgcGlkPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgocGVybWlzc2lvbikuc3RyaW5nKCksIHVpZCwgcGlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGMgPSBpbnRlcmZhY2VfY2FzdDxJUGVybWlzc2lvbkNvbnRyb2xsZXI+KGJpbmRlcik7Ci0gICAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBuZXcgcGVybWlzc2lvbiBjb250cm9sbGVyLCBhbmQgdHJ5IGFnYWluLiAgICAgICAgCi0gICAgICAgICAgICBnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICBnUGVybWlzc2lvbkNvbnRyb2xsZXIgPSBwYzsKLSAgICAgICAgICAgIGdEZWZhdWx0U2VydmljZU1hbmFnZXJMb2NrLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJwU2VydmljZU1hbmFnZXIgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVNlcnZpY2VNYW5hZ2VyPgotewotcHVibGljOgotICAgIEJwU2VydmljZU1hbmFnZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SVNlcnZpY2VNYW5hZ2VyPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPElCaW5kZXI+IGdldFNlcnZpY2UoY29uc3QgU3RyaW5nMTYmIG5hbWUpIGNvbnN0Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBuOwotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgNTsgbisrKXsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IHN2YyA9IGNoZWNrU2VydmljZShuYW1lKTsKLSAgICAgICAgICAgIGlmIChzdmMgIT0gTlVMTCkgcmV0dXJuIHN2YzsKLSAgICAgICAgICAgIEFMT0dJKCJXYWl0aW5nIGZvciBzZXJ2aWNlICVzLi4uXG4iLCBTdHJpbmc4KG5hbWUpLnN0cmluZygpKTsKLSAgICAgICAgICAgIHNsZWVwKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SUJpbmRlcj4gY2hlY2tTZXJ2aWNlKCBjb25zdCBTdHJpbmcxNiYgbmFtZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTZXJ2aWNlTWFuYWdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG5hbWUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0hFQ0tfU0VSVklDRV9UUkFOU0FDVElPTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNlcnZpY2UoY29uc3QgU3RyaW5nMTYmIG5hbWUsIGNvbnN0IHNwPElCaW5kZXI+JiBzZXJ2aWNlLAotICAgICAgICAgICAgYm9vbCBhbGxvd0lzb2xhdGVkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNlcnZpY2VNYW5hZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYobmFtZSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc2VydmljZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihhbGxvd0lzb2xhdGVkID8gMSA6IDApOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoQUREX1NFUlZJQ0VfVFJBTlNBQ1RJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBlcnIgPT0gTk9fRVJST1IgPyByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpIDogZXJyOwotICAgIH0KLQotICAgIHZpcnR1YWwgVmVjdG9yPFN0cmluZzE2PiBsaXN0U2VydmljZXMoKQotICAgIHsKLSAgICAgICAgVmVjdG9yPFN0cmluZzE2PiByZXM7Ci0gICAgICAgIGludCBuID0gMDsKLQotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNlcnZpY2VNYW5hZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKG4rKyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9TRVJWSUNFU19UUkFOU0FDVElPTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICByZXMuYWRkKHJlcGx5LnJlYWRTdHJpbmcxNigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTZXJ2aWNlTWFuYWdlciwgImFuZHJvaWQub3MuSVNlcnZpY2VNYW5hZ2VyIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5TZXJ2aWNlTWFuYWdlcjo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIC8vcHJpbnRmKCJTZXJ2aWNlTWFuYWdlciByZWNlaXZlZDogIik7IGRhdGEucHJpbnQoKTsKLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIEdFVF9TRVJWSUNFX1RSQU5TQUNUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNlcnZpY2VNYW5hZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBTdHJpbmcxNiB3aGljaCA9IGRhdGEucmVhZFN0cmluZzE2KCk7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiID0gY29uc3RfY2FzdDxCblNlcnZpY2VNYW5hZ2VyKj4odGhpcyktPmdldFNlcnZpY2Uod2hpY2gpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIENIRUNLX1NFUlZJQ0VfVFJBTlNBQ1RJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU2VydmljZU1hbmFnZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIFN0cmluZzE2IHdoaWNoID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGIgPSBjb25zdF9jYXN0PEJuU2VydmljZU1hbmFnZXIqPih0aGlzKS0+Y2hlY2tTZXJ2aWNlKHdoaWNoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihiKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBBRERfU0VSVklDRV9UUkFOU0FDVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTZXJ2aWNlTWFuYWdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgU3RyaW5nMTYgd2hpY2ggPSBkYXRhLnJlYWRTdHJpbmcxNigpOwotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYiA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gYWRkU2VydmljZSh3aGljaCwgYik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIExJU1RfU0VSVklDRVNfVFJBTlNBQ1RJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU2VydmljZU1hbmFnZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gbGlzdCA9IGxpc3RTZXJ2aWNlcygpOwotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IE4gPSBsaXN0LnNpemUoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE4pOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KGxpc3RbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9NZW1vcnlCYXNlLmNwcCBiL2xpYnMvYmluZGVyL01lbW9yeUJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzMwNjZiLi4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL01lbW9yeUJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1NZW1vcnlCYXNlOjpNZW1vcnlCYXNlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKLSAgICAgICAgc3NpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQotICAgIDogbVNpemUoc2l6ZSksIG1PZmZzZXQob2Zmc2V0KSwgbUhlYXAoaGVhcCkKLXsKLX0KLQotc3A8SU1lbW9yeUhlYXA+IE1lbW9yeUJhc2U6OmdldE1lbW9yeShzc2l6ZV90KiBvZmZzZXQsIHNpemVfdCogc2l6ZSkgY29uc3QKLXsKLSAgICBpZiAob2Zmc2V0KSAqb2Zmc2V0ID0gbU9mZnNldDsKLSAgICBpZiAoc2l6ZSkgICAqc2l6ZSA9IG1TaXplOwotICAgIHJldHVybiBtSGVhcDsKLX0KLQotTWVtb3J5QmFzZTo6fk1lbW9yeUJhc2UoKQotewotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9NZW1vcnlEZWFsZXIuY3BwIGIvbGlicy9iaW5kZXIvTWVtb3J5RGVhbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwZTBhNy4uMDAwMDAwMAotLS0gYS9saWJzL2JpbmRlci9NZW1vcnlEZWFsZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lbW9yeURlYWxlciIKLQotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoKLSAqIEEgc2ltcGxlIHRlbXBsYXRpemVkIGRvdWJseSBsaW5rZWQtbGlzdCBpbXBsZW1lbnRhdGlvbgotICovCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBOT0RFPgotY2xhc3MgTGlua2VkTGlzdAotewotICAgIE5PREUqICBtRmlyc3Q7Ci0gICAgTk9ERSogIG1MYXN0OwotCi1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgTGlua2VkTGlzdCgpIDogbUZpcnN0KDApLCBtTGFzdCgwKSB7IH0KLSAgICBib29sICAgICAgICBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbUZpcnN0ID09IDA7IH0KLSAgICBOT0RFIGNvbnN0KiBoZWFkKCkgY29uc3QgeyByZXR1cm4gbUZpcnN0OyB9Ci0gICAgTk9ERSogICAgICAgaGVhZCgpIHsgcmV0dXJuIG1GaXJzdDsgfQotICAgIE5PREUgY29uc3QqIHRhaWwoKSBjb25zdCB7IHJldHVybiBtTGFzdDsgfQotICAgIE5PREUqICAgICAgIHRhaWwoKSB7IHJldHVybiBtTGFzdDsgfQotCi0gICAgdm9pZCBpbnNlcnRBZnRlcihOT0RFKiBub2RlLCBOT0RFKiBuZXdOb2RlKSB7Ci0gICAgICAgIG5ld05vZGUtPnByZXYgPSBub2RlOwotICAgICAgICBuZXdOb2RlLT5uZXh0ID0gbm9kZS0+bmV4dDsKLSAgICAgICAgaWYgKG5vZGUtPm5leHQgPT0gMCkgbUxhc3QgPSBuZXdOb2RlOwotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICBub2RlLT5uZXh0LT5wcmV2ID0gbmV3Tm9kZTsKLSAgICAgICAgbm9kZS0+bmV4dCA9IG5ld05vZGU7Ci0gICAgfQotCi0gICAgdm9pZCBpbnNlcnRCZWZvcmUoTk9ERSogbm9kZSwgTk9ERSogbmV3Tm9kZSkgewotICAgICAgICAgbmV3Tm9kZS0+cHJldiA9IG5vZGUtPnByZXY7Ci0gICAgICAgICBuZXdOb2RlLT5uZXh0ID0gbm9kZTsKLSAgICAgICAgIGlmIChub2RlLT5wcmV2ID09IDApICAgbUZpcnN0ID0gbmV3Tm9kZTsKLSAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IG5ld05vZGU7Ci0gICAgICAgICBub2RlLT5wcmV2ID0gbmV3Tm9kZTsKLSAgICB9Ci0KLSAgICB2b2lkIGluc2VydEhlYWQoTk9ERSogbmV3Tm9kZSkgewotICAgICAgICBpZiAobUZpcnN0ID09IDApIHsKLSAgICAgICAgICAgIG1GaXJzdCA9IG1MYXN0ID0gbmV3Tm9kZTsKLSAgICAgICAgICAgIG5ld05vZGUtPnByZXYgPSBuZXdOb2RlLT5uZXh0ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld05vZGUtPnByZXYgPSAwOwotICAgICAgICAgICAgbmV3Tm9kZS0+bmV4dCA9IG1GaXJzdDsKLSAgICAgICAgICAgIG1GaXJzdC0+cHJldiA9IG5ld05vZGU7Ci0gICAgICAgICAgICBtRmlyc3QgPSBuZXdOb2RlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBpbnNlcnRUYWlsKE5PREUqIG5ld05vZGUpIHsKLSAgICAgICAgaWYgKG1MYXN0ID09IDApIHsKLSAgICAgICAgICAgIGluc2VydEhlYWQobmV3Tm9kZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXdOb2RlLT5wcmV2ID0gbUxhc3Q7Ci0gICAgICAgICAgICBuZXdOb2RlLT5uZXh0ID0gMDsKLSAgICAgICAgICAgIG1MYXN0LT5uZXh0ID0gbmV3Tm9kZTsKLSAgICAgICAgICAgIG1MYXN0ID0gbmV3Tm9kZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE5PREUqIHJlbW92ZShOT0RFKiBub2RlKSB7Ci0gICAgICAgIGlmIChub2RlLT5wcmV2ID09IDApICAgIG1GaXJzdCA9IG5vZGUtPm5leHQ7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBub2RlLT5uZXh0OwotICAgICAgICBpZiAobm9kZS0+bmV4dCA9PSAwKSAgICBtTGFzdCA9IG5vZGUtPnByZXY7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBub2RlLT5wcmV2OwotICAgICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEFsbG9jYXRpb24gOiBwdWJsaWMgTWVtb3J5QmFzZSB7Ci1wdWJsaWM6Ci0gICAgQWxsb2NhdGlvbihjb25zdCBzcDxNZW1vcnlEZWFsZXI+JiBkZWFsZXIsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCB+QWxsb2NhdGlvbigpOwotcHJpdmF0ZToKLSAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFNpbXBsZUJlc3RGaXRBbGxvY2F0b3IKLXsKLSAgICBlbnVtIHsKLSAgICAgICAgUEFHRV9BTElHTkVEID0gMHgwMDAwMDAwMQotICAgIH07Ci1wdWJsaWM6Ci0gICAgU2ltcGxlQmVzdEZpdEFsbG9jYXRvcihzaXplX3Qgc2l6ZSk7Ci0gICAgflNpbXBsZUJlc3RGaXRBbGxvY2F0b3IoKTsKLQotICAgIHNpemVfdCAgICAgIGFsbG9jYXRlKHNpemVfdCBzaXplLCB1aW50MzJfdCBmbGFncyA9IDApOwotICAgIHN0YXR1c190ICAgIGRlYWxsb2NhdGUoc2l6ZV90IG9mZnNldCk7Ci0gICAgc2l6ZV90ICAgICAgc2l6ZSgpIGNvbnN0OwotICAgIHZvaWQgICAgICAgIGR1bXAoY29uc3QgY2hhciogd2hhdCkgY29uc3Q7Ci0gICAgdm9pZCAgICAgICAgZHVtcChTdHJpbmc4JiByZXMsIGNvbnN0IGNoYXIqIHdoYXQpIGNvbnN0OwotCi1wcml2YXRlOgotCi0gICAgc3RydWN0IGNodW5rX3QgewotICAgICAgICBjaHVua190KHNpemVfdCBzdGFydCwgc2l6ZV90IHNpemUpCi0gICAgICAgIDogc3RhcnQoc3RhcnQpLCBzaXplKHNpemUpLCBmcmVlKDEpLCBwcmV2KDApLCBuZXh0KDApIHsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgICAgICAgICAgICAgIHN0YXJ0OwotICAgICAgICBzaXplX3QgICAgICAgICAgICAgIHNpemUgOiAyODsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICBmcmVlIDogNDsKLSAgICAgICAgbXV0YWJsZSBjaHVua190KiAgICBwcmV2OwotICAgICAgICBtdXRhYmxlIGNodW5rX3QqICAgIG5leHQ7Ci0gICAgfTsKLQotICAgIHNzaXplX3QgIGFsbG9jKHNpemVfdCBzaXplLCB1aW50MzJfdCBmbGFncyk7Ci0gICAgY2h1bmtfdCogZGVhbGxvYyhzaXplX3Qgc3RhcnQpOwotICAgIHZvaWQgICAgIGR1bXBfbChjb25zdCBjaGFyKiB3aGF0KSBjb25zdDsKLSAgICB2b2lkICAgICBkdW1wX2woU3RyaW5nOCYgcmVzLCBjb25zdCBjaGFyKiB3aGF0KSBjb25zdDsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQgICAga01lbW9yeUFsaWduOwotICAgIG11dGFibGUgTXV0ZXggICAgICAgbUxvY2s7Ci0gICAgTGlua2VkTGlzdDxjaHVua190PiBtTGlzdDsKLSAgICBzaXplX3QgICAgICAgICAgICAgIG1IZWFwU2l6ZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQWxsb2NhdGlvbjo6QWxsb2NhdGlvbigKLSAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiYgZGVhbGVyLAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLSAgICA6IE1lbW9yeUJhc2UoaGVhcCwgb2Zmc2V0LCBzaXplKSwgbURlYWxlcihkZWFsZXIpCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgIHZvaWQqIGNvbnN0IHN0YXJ0X3B0ciA9ICh2b2lkKikoaW50cHRyX3QoaGVhcC0+YmFzZSgpKSArIG9mZnNldCk7Ci0gICAgbWVtc2V0KHN0YXJ0X3B0ciwgMHhkYSwgc2l6ZSk7Ci0jZW5kaWYKLX0KLQotQWxsb2NhdGlvbjo6fkFsbG9jYXRpb24oKQotewotICAgIHNpemVfdCBmcmVlZE9mZnNldCA9IGdldE9mZnNldCgpOwotICAgIHNpemVfdCBmcmVlZFNpemUgICA9IGdldFNpemUoKTsKLSAgICBpZiAoZnJlZWRTaXplKSB7Ci0gICAgICAgIC8qIE5PVEU6IGl0J3MgVkVSWSBpbXBvcnRhbnQgdG8gbm90IGZyZWUgYWxsb2NhdGlvbnMgb2Ygc2l6ZSAwIGJlY2F1c2UKLSAgICAgICAgICogdGhleSdyZSBzcGVjaWFsIGFzIHRoZXkgZG9uJ3QgaGF2ZSBhbnkgcmVjb3JkIGluIHRoZSBhbGxvY2F0b3IKLSAgICAgICAgICogYW5kIGNvdWxkIGFsaWFzIHNvbWUgcmVhbCBhbGxvY2F0aW9uICh0aGVpciBvZmZzZXQgaXMgemVybykuICovCi0KLSAgICAgICAgLy8ga2VlcCB0aGUgc2l6ZSB0byB1bm1hcCBpbiBleGNlc3MKLSAgICAgICAgc2l6ZV90IHBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLSAgICAgICAgc2l6ZV90IHN0YXJ0ID0gZnJlZWRPZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBlbmQgPSBzdGFydCArIGZyZWVkU2l6ZTsKLSAgICAgICAgc3RhcnQgJj0gfihwYWdlc2l6ZS0xKTsKLSAgICAgICAgZW5kID0gKGVuZCArIHBhZ2VzaXplLTEpICYgfihwYWdlc2l6ZS0xKTsKLQotICAgICAgICAvLyBnaXZlIGJhY2sgdG8gdGhlIGtlcm5lbCB0aGUgcGFnZXMgd2UgZG9uJ3QgbmVlZAotICAgICAgICBzaXplX3QgZnJlZV9zdGFydCA9IGZyZWVkT2Zmc2V0OwotICAgICAgICBzaXplX3QgZnJlZV9lbmQgPSBmcmVlX3N0YXJ0ICsgZnJlZWRTaXplOwotICAgICAgICBpZiAoc3RhcnQgPCBmcmVlX3N0YXJ0KQotICAgICAgICAgICAgc3RhcnQgPSBmcmVlX3N0YXJ0OwotICAgICAgICBpZiAoZW5kID4gZnJlZV9lbmQpCi0gICAgICAgICAgICBlbmQgPSBmcmVlX2VuZDsKLSAgICAgICAgc3RhcnQgPSAoc3RhcnQgKyBwYWdlc2l6ZS0xKSAmIH4ocGFnZXNpemUtMSk7Ci0gICAgICAgIGVuZCAmPSB+KHBhZ2VzaXplLTEpOwotCi0gICAgICAgIGlmIChzdGFydCA8IGVuZCkgewotICAgICAgICAgICAgdm9pZCogY29uc3Qgc3RhcnRfcHRyID0gKHZvaWQqKShpbnRwdHJfdChnZXRIZWFwKCktPmJhc2UoKSkgKyBzdGFydCk7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGVuZC1zdGFydDsKLQotI2lmbmRlZiBOREVCVUcKLSAgICAgICAgICAgIG1lbXNldChzdGFydF9wdHIsIDB4ZGYsIHNpemUpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIC8vIE1BRFZfUkVNT1ZFIGlzIG5vdCBkZWZpbmVkIG9uIERhcHBlciBiYXNlZCBHb29idW50dQotI2lmZGVmIE1BRFZfUkVNT1ZFCi0gICAgICAgICAgICBpZiAoc2l6ZSkgewotICAgICAgICAgICAgICAgIGludCBlcnIgPSBtYWR2aXNlKHN0YXJ0X3B0ciwgc2l6ZSwgTUFEVl9SRU1PVkUpOwotICAgICAgICAgICAgICAgIEFMT0dXX0lGKGVyciwgIm1hZHZpc2UoJXAsICV1LCBNQURWX1JFTU9WRSkgcmV0dXJuZWQgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcHRyLCBzaXplLCBlcnI8MCA/IHN0cmVycm9yKGVycm5vKSA6ICJPayIpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBkb25lIGFmdGVyIG1hZHZpc2UoTUFEVl9SRU1PVkUpLCBvdGhlcndpc2UgbWFkdmlzZSgpCi0gICAgICAgIC8vIG1pZ2h0IGtpY2sgb3V0IHRoZSBtZW1vcnkgcmVnaW9uIHRoYXQncyBhbGxvY2F0ZWQgYW5kL29yIHdyaXR0ZW4KLSAgICAgICAgLy8gcmlnaHQgYWZ0ZXIgdGhlIGRlYWxsb2NhdGlvbi4KLSAgICAgICAgbURlYWxlci0+ZGVhbGxvY2F0ZShmcmVlZE9mZnNldCk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU1lbW9yeURlYWxlcjo6TWVtb3J5RGVhbGVyKHNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBuYW1lKQotICAgIDogbUhlYXAobmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsIG5hbWUpKSwKLSAgICBtQWxsb2NhdG9yKG5ldyBTaW1wbGVCZXN0Rml0QWxsb2NhdG9yKHNpemUpKQoteyAgICAKLX0KLQotTWVtb3J5RGVhbGVyOjp+TWVtb3J5RGVhbGVyKCkKLXsKLSAgICBkZWxldGUgbUFsbG9jYXRvcjsKLX0KLQotc3A8SU1lbW9yeT4gTWVtb3J5RGVhbGVyOjphbGxvY2F0ZShzaXplX3Qgc2l6ZSkKLXsKLSAgICBzcDxJTWVtb3J5PiBtZW1vcnk7Ci0gICAgY29uc3Qgc3NpemVfdCBvZmZzZXQgPSBhbGxvY2F0b3IoKS0+YWxsb2NhdGUoc2l6ZSk7Ci0gICAgaWYgKG9mZnNldCA+PSAwKSB7Ci0gICAgICAgIG1lbW9yeSA9IG5ldyBBbGxvY2F0aW9uKHRoaXMsIGhlYXAoKSwgb2Zmc2V0LCBzaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1lbW9yeTsKLX0KLQotdm9pZCBNZW1vcnlEZWFsZXI6OmRlYWxsb2NhdGUoc2l6ZV90IG9mZnNldCkKLXsKLSAgICBhbGxvY2F0b3IoKS0+ZGVhbGxvY2F0ZShvZmZzZXQpOwotfQotCi12b2lkIE1lbW9yeURlYWxlcjo6ZHVtcChjb25zdCBjaGFyKiB3aGF0KSBjb25zdAotewotICAgIGFsbG9jYXRvcigpLT5kdW1wKHdoYXQpOwotfQotCi1jb25zdCBzcDxJTWVtb3J5SGVhcD4mIE1lbW9yeURlYWxlcjo6aGVhcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUhlYXA7Ci19Ci0KLVNpbXBsZUJlc3RGaXRBbGxvY2F0b3IqIE1lbW9yeURlYWxlcjo6YWxsb2NhdG9yKCkgY29uc3QgewotICAgIHJldHVybiBtQWxsb2NhdG9yOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIGFsaWduIGFsbCB0aGUgbWVtb3J5IGJsb2NrcyBvbiBhIGNhY2hlLWxpbmUgYm91bmRhcnkKLWNvbnN0IGludCBTaW1wbGVCZXN0Rml0QWxsb2NhdG9yOjprTWVtb3J5QWxpZ24gPSAzMjsKLQotU2ltcGxlQmVzdEZpdEFsbG9jYXRvcjo6U2ltcGxlQmVzdEZpdEFsbG9jYXRvcihzaXplX3Qgc2l6ZSkKLXsKLSAgICBzaXplX3QgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotICAgIG1IZWFwU2l6ZSA9ICgoc2l6ZSArIHBhZ2VzaXplLTEpICYgfihwYWdlc2l6ZS0xKSk7Ci0KLSAgICBjaHVua190KiBub2RlID0gbmV3IGNodW5rX3QoMCwgbUhlYXBTaXplIC8ga01lbW9yeUFsaWduKTsKLSAgICBtTGlzdC5pbnNlcnRIZWFkKG5vZGUpOwotfQotCi1TaW1wbGVCZXN0Rml0QWxsb2NhdG9yOjp+U2ltcGxlQmVzdEZpdEFsbG9jYXRvcigpCi17Ci0gICAgd2hpbGUoIW1MaXN0LmlzRW1wdHkoKSkgewotICAgICAgICBkZWxldGUgbUxpc3QucmVtb3ZlKG1MaXN0LmhlYWQoKSk7Ci0gICAgfQotfQotCi1zaXplX3QgU2ltcGxlQmVzdEZpdEFsbG9jYXRvcjo6c2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1IZWFwU2l6ZTsKLX0KLQotc2l6ZV90IFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I6OmFsbG9jYXRlKHNpemVfdCBzaXplLCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHNzaXplX3Qgb2Zmc2V0ID0gYWxsb2Moc2l6ZSwgZmxhZ3MpOwotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KLXN0YXR1c190IFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I6OmRlYWxsb2NhdGUoc2l6ZV90IG9mZnNldCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGNodW5rX3QgY29uc3QgKiBjb25zdCBmcmVlZCA9IGRlYWxsb2Mob2Zmc2V0KTsKLSAgICBpZiAoZnJlZWQpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci19Ci0KLXNzaXplX3QgU2ltcGxlQmVzdEZpdEFsbG9jYXRvcjo6YWxsb2Moc2l6ZV90IHNpemUsIHVpbnQzMl90IGZsYWdzKQotewotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHNpemUgPSAoc2l6ZSArIGtNZW1vcnlBbGlnbi0xKSAvIGtNZW1vcnlBbGlnbjsKLSAgICBjaHVua190KiBmcmVlX2NodW5rID0gMDsKLSAgICBjaHVua190KiBjdXIgPSBtTGlzdC5oZWFkKCk7Ci0KLSAgICBzaXplX3QgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotICAgIHdoaWxlIChjdXIpIHsKLSAgICAgICAgaW50IGV4dHJhID0gMDsKLSAgICAgICAgaWYgKGZsYWdzICYgUEFHRV9BTElHTkVEKQotICAgICAgICAgICAgZXh0cmEgPSAoIC1jdXItPnN0YXJ0ICYgKChwYWdlc2l6ZS9rTWVtb3J5QWxpZ24pLTEpICkgOwotCi0gICAgICAgIC8vIGJlc3QgZml0Ci0gICAgICAgIGlmIChjdXItPmZyZWUgJiYgKGN1ci0+c2l6ZSA+PSAoc2l6ZStleHRyYSkpKSB7Ci0gICAgICAgICAgICBpZiAoKCFmcmVlX2NodW5rKSB8fCAoY3VyLT5zaXplIDwgZnJlZV9jaHVuay0+c2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBmcmVlX2NodW5rID0gY3VyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGN1ci0+c2l6ZSA9PSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY3VyID0gY3VyLT5uZXh0OwotICAgIH0KLQotICAgIGlmIChmcmVlX2NodW5rKSB7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBmcmVlX3NpemUgPSBmcmVlX2NodW5rLT5zaXplOwotICAgICAgICBmcmVlX2NodW5rLT5mcmVlID0gMDsKLSAgICAgICAgZnJlZV9jaHVuay0+c2l6ZSA9IHNpemU7Ci0gICAgICAgIGlmIChmcmVlX3NpemUgPiBzaXplKSB7Ci0gICAgICAgICAgICBpbnQgZXh0cmEgPSAwOwotICAgICAgICAgICAgaWYgKGZsYWdzICYgUEFHRV9BTElHTkVEKQotICAgICAgICAgICAgICAgIGV4dHJhID0gKCAtZnJlZV9jaHVuay0+c3RhcnQgJiAoKHBhZ2VzaXplL2tNZW1vcnlBbGlnbiktMSkgKSA7Ci0gICAgICAgICAgICBpZiAoZXh0cmEpIHsKLSAgICAgICAgICAgICAgICBjaHVua190KiBzcGxpdCA9IG5ldyBjaHVua190KGZyZWVfY2h1bmstPnN0YXJ0LCBleHRyYSk7Ci0gICAgICAgICAgICAgICAgZnJlZV9jaHVuay0+c3RhcnQgKz0gZXh0cmE7Ci0gICAgICAgICAgICAgICAgbUxpc3QuaW5zZXJ0QmVmb3JlKGZyZWVfY2h1bmssIHNwbGl0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR0VfSUYoKGZsYWdzJlBBR0VfQUxJR05FRCkgJiYgCi0gICAgICAgICAgICAgICAgICAgICgoZnJlZV9jaHVuay0+c3RhcnQqa01lbW9yeUFsaWduKSYocGFnZXNpemUtMSkpLAotICAgICAgICAgICAgICAgICAgICAiUEFHRV9BTElHTkVEIHJlcXVlc3RlZCwgYnV0IHBhZ2UgaXMgbm90IGFsaWduZWQhISEiKTsKLQotICAgICAgICAgICAgY29uc3Qgc3NpemVfdCB0YWlsX2ZyZWUgPSBmcmVlX3NpemUgLSAoc2l6ZStleHRyYSk7Ci0gICAgICAgICAgICBpZiAodGFpbF9mcmVlID4gMCkgewotICAgICAgICAgICAgICAgIGNodW5rX3QqIHNwbGl0ID0gbmV3IGNodW5rX3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2NodW5rLT5zdGFydCArIGZyZWVfY2h1bmstPnNpemUsIHRhaWxfZnJlZSk7Ci0gICAgICAgICAgICAgICAgbUxpc3QuaW5zZXJ0QWZ0ZXIoZnJlZV9jaHVuaywgc3BsaXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoZnJlZV9jaHVuay0+c3RhcnQpKmtNZW1vcnlBbGlnbjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX01FTU9SWTsKLX0KLQotU2ltcGxlQmVzdEZpdEFsbG9jYXRvcjo6Y2h1bmtfdCogU2ltcGxlQmVzdEZpdEFsbG9jYXRvcjo6ZGVhbGxvYyhzaXplX3Qgc3RhcnQpCi17Ci0gICAgc3RhcnQgPSBzdGFydCAvIGtNZW1vcnlBbGlnbjsKLSAgICBjaHVua190KiBjdXIgPSBtTGlzdC5oZWFkKCk7Ci0gICAgd2hpbGUgKGN1cikgewotICAgICAgICBpZiAoY3VyLT5zdGFydCA9PSBzdGFydCkgewotICAgICAgICAgICAgTE9HX0ZBVEFMX0lGKGN1ci0+ZnJlZSwKLSAgICAgICAgICAgICAgICAiYmxvY2sgYXQgb2Zmc2V0IDB4JTA4bFggb2Ygc2l6ZSAweCUwOGxYIGFscmVhZHkgZnJlZWQiLAotICAgICAgICAgICAgICAgIGN1ci0+c3RhcnQqa01lbW9yeUFsaWduLCBjdXItPnNpemUqa01lbW9yeUFsaWduKTsKLQotICAgICAgICAgICAgLy8gbWVyZ2UgZnJlZWQgYmxvY2tzIHRvZ2V0aGVyCi0gICAgICAgICAgICBjaHVua190KiBmcmVlZCA9IGN1cjsKLSAgICAgICAgICAgIGN1ci0+ZnJlZSA9IDE7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgY2h1bmtfdCogY29uc3QgcCA9IGN1ci0+cHJldjsKLSAgICAgICAgICAgICAgICBjaHVua190KiBjb25zdCBuID0gY3VyLT5uZXh0OwotICAgICAgICAgICAgICAgIGlmIChwICYmIChwLT5mcmVlIHx8ICFjdXItPnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWVkID0gcDsKLSAgICAgICAgICAgICAgICAgICAgcC0+c2l6ZSArPSBjdXItPnNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0LnJlbW92ZShjdXIpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgY3VyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXIgPSBuOwotICAgICAgICAgICAgfSB3aGlsZSAoY3VyICYmIGN1ci0+ZnJlZSk7Ci0KLSAgICAgICAgICAgICNpZm5kZWYgTkRFQlVHCi0gICAgICAgICAgICAgICAgaWYgKCFmcmVlZC0+ZnJlZSkgewotICAgICAgICAgICAgICAgICAgICBkdW1wX2woImRlYWxsb2MgKCFmcmVlZC0+ZnJlZSkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgIExPR19GQVRBTF9JRighZnJlZWQtPmZyZWUsCi0gICAgICAgICAgICAgICAgImZyZWVkIGJsb2NrIGF0IG9mZnNldCAweCUwOGxYIG9mIHNpemUgMHglMDhsWCBpcyBub3QgZnJlZSEiLAotICAgICAgICAgICAgICAgIGZyZWVkLT5zdGFydCAqIGtNZW1vcnlBbGlnbiwgZnJlZWQtPnNpemUgKiBrTWVtb3J5QWxpZ24pOwotCi0gICAgICAgICAgICByZXR1cm4gZnJlZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyID0gY3VyLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBTaW1wbGVCZXN0Rml0QWxsb2NhdG9yOjpkdW1wKGNvbnN0IGNoYXIqIHdoYXQpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBkdW1wX2wod2hhdCk7Ci19Ci0KLXZvaWQgU2ltcGxlQmVzdEZpdEFsbG9jYXRvcjo6ZHVtcF9sKGNvbnN0IGNoYXIqIHdoYXQpIGNvbnN0Ci17Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgZHVtcF9sKHJlc3VsdCwgd2hhdCk7Ci0gICAgQUxPR0QoIiVzIiwgcmVzdWx0LnN0cmluZygpKTsKLX0KLQotdm9pZCBTaW1wbGVCZXN0Rml0QWxsb2NhdG9yOjpkdW1wKFN0cmluZzgmIHJlc3VsdCwKLSAgICAgICAgY29uc3QgY2hhciogd2hhdCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGR1bXBfbChyZXN1bHQsIHdoYXQpOwotfQotCi12b2lkIFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I6OmR1bXBfbChTdHJpbmc4JiByZXN1bHQsCi0gICAgICAgIGNvbnN0IGNoYXIqIHdoYXQpIGNvbnN0Ci17Ci0gICAgc2l6ZV90IHNpemUgPSAwOwotICAgIGludDMyX3QgaSA9IDA7Ci0gICAgY2h1bmtfdCBjb25zdCogY3VyID0gbUxpc3QuaGVhZCgpOwotICAgIAotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgJXMgKCVwLCBzaXplPSV1KVxuIiwKLSAgICAgICAgICAgIHdoYXQsIHRoaXMsICh1bnNpZ25lZCBpbnQpbUhlYXBTaXplKTsKLSAgICAKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICAKLSAgICB3aGlsZSAoY3VyKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGVycnNbXSA9IHsiIiwgInwgbGluayBib2d1cyBOUCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInwgbGluayBib2d1cyBQTiIsICJ8IGxpbmsgYm9ndXMgTlArUE4iIH07Ci0gICAgICAgIGludCBucCA9ICgoY3VyLT5uZXh0KSAmJiBjdXItPm5leHQtPnByZXYgIT0gY3VyKSA/IDEgOiAwOwotICAgICAgICBpbnQgcG4gPSAoKGN1ci0+cHJldikgJiYgY3VyLT5wcmV2LT5uZXh0ICE9IGN1cikgPyAyIDogMDsKLQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICUzdTogJTA4eCB8IDB4JTA4WCB8IDB4JTA4WCB8ICVzICVzXG4iLAotICAgICAgICAgICAgaSwgaW50KGN1ciksIGludChjdXItPnN0YXJ0KmtNZW1vcnlBbGlnbiksCi0gICAgICAgICAgICBpbnQoY3VyLT5zaXplKmtNZW1vcnlBbGlnbiksCi0gICAgICAgICAgICAgICAgICAgIGludChjdXItPmZyZWUpID8gIkYiIDogIkEiLAotICAgICAgICAgICAgICAgICAgICBlcnJzW25wfHBuXSk7Ci0gICAgICAgIAotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICAgICAgaWYgKCFjdXItPmZyZWUpCi0gICAgICAgICAgICBzaXplICs9IGN1ci0+c2l6ZSprTWVtb3J5QWxpZ247Ci0KLSAgICAgICAgaSsrOwotICAgICAgICBjdXIgPSBjdXItPm5leHQ7Ci0gICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICIgIHNpemUgYWxsb2NhdGVkOiAldSAoJXUgS0IpXG4iLCBpbnQoc2l6ZSksIGludChzaXplLzEwMjQpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci19Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL01lbW9yeUhlYXBCYXNlLmNwcCBiL2xpYnMvYmluZGVyL01lbW9yeUhlYXBCYXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjYmYxYy4uMDAwMDAwMAotLS0gYS9saWJzL2JpbmRlci9NZW1vcnlIZWFwQmFzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWVtb3J5SGVhcEJhc2UiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+Ci0KLSNpZmRlZiBIQVZFX0FORFJPSURfT1MKLSNpbmNsdWRlIDxsaW51eC9hbmRyb2lkX3BtZW0uaD4KLSNlbmRpZgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU1lbW9yeUhlYXBCYXNlOjpNZW1vcnlIZWFwQmFzZSgpCi0gICAgOiBtRkQoLTEpLCBtU2l6ZSgwKSwgbUJhc2UoTUFQX0ZBSUxFRCksCi0gICAgICBtRGV2aWNlKE5VTEwpLCBtTmVlZFVubWFwKGZhbHNlKSwgbU9mZnNldCgwKQotewotfQotCi1NZW1vcnlIZWFwQmFzZTo6TWVtb3J5SGVhcEJhc2Uoc2l6ZV90IHNpemUsIHVpbnQzMl90IGZsYWdzLCBjaGFyIGNvbnN0ICogbmFtZSkKLSAgICA6IG1GRCgtMSksIG1TaXplKDApLCBtQmFzZShNQVBfRkFJTEVEKSwgbUZsYWdzKGZsYWdzKSwKLSAgICAgIG1EZXZpY2UoMCksIG1OZWVkVW5tYXAoZmFsc2UpLCBtT2Zmc2V0KDApCi17Ci0gICAgY29uc3Qgc2l6ZV90IHBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLSAgICBzaXplID0gKChzaXplICsgcGFnZXNpemUtMSkgJiB+KHBhZ2VzaXplLTEpKTsKLSAgICBpbnQgZmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbihuYW1lID09IE5VTEwgPyAiTWVtb3J5SGVhcEJhc2UiIDogbmFtZSwgc2l6ZSk7Ci0gICAgQUxPR0VfSUYoZmQ8MCwgImVycm9yIGNyZWF0aW5nIGFzaG1lbSByZWdpb246ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICBpZiAobWFwZmQoZmQsIHNpemUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBSRUFEX09OTFkpIHsKLSAgICAgICAgICAgICAgICBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKGZkLCBQUk9UX1JFQUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1NZW1vcnlIZWFwQmFzZTo6TWVtb3J5SGVhcEJhc2UoY29uc3QgY2hhciogZGV2aWNlLCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MpCi0gICAgOiBtRkQoLTEpLCBtU2l6ZSgwKSwgbUJhc2UoTUFQX0ZBSUxFRCksIG1GbGFncyhmbGFncyksCi0gICAgICBtRGV2aWNlKDApLCBtTmVlZFVubWFwKGZhbHNlKSwgbU9mZnNldCgwKQotewotICAgIGludCBvcGVuX2ZsYWdzID0gT19SRFdSOwotICAgIGlmIChmbGFncyAmIE5PX0NBQ0hJTkcpCi0gICAgICAgIG9wZW5fZmxhZ3MgfD0gT19TWU5DOwotCi0gICAgaW50IGZkID0gb3BlbihkZXZpY2UsIG9wZW5fZmxhZ3MpOwotICAgIEFMT0dFX0lGKGZkPDAsICJlcnJvciBvcGVuaW5nICVzOiAlcyIsIGRldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICBjb25zdCBzaXplX3QgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotICAgICAgICBzaXplID0gKChzaXplICsgcGFnZXNpemUtMSkgJiB+KHBhZ2VzaXplLTEpKTsKLSAgICAgICAgaWYgKG1hcGZkKGZkLCBzaXplKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotTWVtb3J5SGVhcEJhc2U6Ok1lbW9yeUhlYXBCYXNlKGludCBmZCwgc2l6ZV90IHNpemUsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBvZmZzZXQpCi0gICAgOiBtRkQoLTEpLCBtU2l6ZSgwKSwgbUJhc2UoTUFQX0ZBSUxFRCksIG1GbGFncyhmbGFncyksCi0gICAgICBtRGV2aWNlKDApLCBtTmVlZFVubWFwKGZhbHNlKSwgbU9mZnNldCgwKQotewotICAgIGNvbnN0IHNpemVfdCBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0gICAgc2l6ZSA9ICgoc2l6ZSArIHBhZ2VzaXplLTEpICYgfihwYWdlc2l6ZS0xKSk7Ci0gICAgbWFwZmQoZHVwKGZkKSwgc2l6ZSwgb2Zmc2V0KTsKLX0KLQotc3RhdHVzX3QgTWVtb3J5SGVhcEJhc2U6OmluaXQoaW50IGZkLCB2b2lkICpiYXNlLCBpbnQgc2l6ZSwgaW50IGZsYWdzLCBjb25zdCBjaGFyKiBkZXZpY2UpCi17Ci0gICAgaWYgKG1GRCAhPSAtMSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIG1GRCA9IGZkOwotICAgIG1CYXNlID0gYmFzZTsKLSAgICBtU2l6ZSA9IHNpemU7Ci0gICAgbUZsYWdzID0gZmxhZ3M7Ci0gICAgbURldmljZSA9IGRldmljZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lbW9yeUhlYXBCYXNlOjptYXBmZChpbnQgZmQsIHNpemVfdCBzaXplLCB1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAvLyB0cnkgdG8gZmlndXJlIG91dCB0aGUgc2l6ZSBhdXRvbWF0aWNhbGx5Ci0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi0gICAgICAgIC8vIGZpcnN0IHRyeSB0aGUgUE1FTSBpb2N0bAotICAgICAgICBwbWVtX3JlZ2lvbiByZWc7Ci0gICAgICAgIGludCBlcnIgPSBpb2N0bChmZCwgUE1FTV9HRVRfVE9UQUxfU0laRSwgJnJlZyk7Ci0gICAgICAgIGlmIChlcnIgPT0gMCkKLSAgICAgICAgICAgIHNpemUgPSByZWcubGVuOwotI2VuZGlmCi0gICAgICAgIGlmIChzaXplID09IDApIHsgLy8gdHJ5IGZzdGF0Ci0gICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzYjsKLSAgICAgICAgICAgIGlmIChmc3RhdChmZCwgJnNiKSA9PSAwKQotICAgICAgICAgICAgICAgIHNpemUgPSBzYi5zdF9zaXplOwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIGl0IGRpZG4ndCB3b3JrLCBsZXQgbW1hcCgpIGZhaWwuCi0gICAgfQotCi0gICAgaWYgKChtRmxhZ3MgJiBET05UX01BUF9MT0NBTExZKSA9PSAwKSB7Ci0gICAgICAgIHZvaWQqIGJhc2UgPSAodWludDhfdCopbW1hcCgwLCBzaXplLAotICAgICAgICAgICAgICAgIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGJhc2UgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgQUxPR0UoIm1tYXAoZmQ9JWQsIHNpemU9JXUpIGZhaWxlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgZmQsIHVpbnQzMl90KHNpemUpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICAgICAgfQotICAgICAgICAvL0FMT0dEKCJtbWFwKGZkPSVkLCBiYXNlPSVwLCBzaXplPSVsdSkiLCBmZCwgYmFzZSwgc2l6ZSk7Ci0gICAgICAgIG1CYXNlID0gYmFzZTsKLSAgICAgICAgbU5lZWRVbm1hcCA9IHRydWU7Ci0gICAgfSBlbHNlICB7Ci0gICAgICAgIG1CYXNlID0gMDsgLy8gbm90IE1BUF9GQUlMRUQKLSAgICAgICAgbU5lZWRVbm1hcCA9IGZhbHNlOwotICAgIH0KLSAgICBtRkQgPSBmZDsKLSAgICBtU2l6ZSA9IHNpemU7Ci0gICAgbU9mZnNldCA9IG9mZnNldDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLU1lbW9yeUhlYXBCYXNlOjp+TWVtb3J5SGVhcEJhc2UoKQotewotICAgIGRpc3Bvc2UoKTsKLX0KLQotdm9pZCBNZW1vcnlIZWFwQmFzZTo6ZGlzcG9zZSgpCi17Ci0gICAgaW50IGZkID0gYW5kcm9pZF9hdG9taWNfb3IoLTEsICZtRkQpOwotICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgIGlmIChtTmVlZFVubWFwKSB7Ci0gICAgICAgICAgICAvL0FMT0dEKCJtdW5tYXAoZmQ9JWQsIGJhc2U9JXAsIHNpemU9JWx1KSIsIGZkLCBtQmFzZSwgbVNpemUpOwotICAgICAgICAgICAgbXVubWFwKG1CYXNlLCBtU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJhc2UgPSAwOwotICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgIGNsb3NlKGZkKTsKLSAgICB9Ci19Ci0KLWludCBNZW1vcnlIZWFwQmFzZTo6Z2V0SGVhcElEKCkgY29uc3QgewotICAgIHJldHVybiBtRkQ7Ci19Ci0KLXZvaWQqIE1lbW9yeUhlYXBCYXNlOjpnZXRCYXNlKCkgY29uc3QgewotICAgIHJldHVybiBtQmFzZTsKLX0KLQotc2l6ZV90IE1lbW9yeUhlYXBCYXNlOjpnZXRTaXplKCkgY29uc3QgewotICAgIHJldHVybiBtU2l6ZTsKLX0KLQotdWludDMyX3QgTWVtb3J5SGVhcEJhc2U6OmdldEZsYWdzKCkgY29uc3QgewotICAgIHJldHVybiBtRmxhZ3M7Ci19Ci0KLWNvbnN0IGNoYXIqIE1lbW9yeUhlYXBCYXNlOjpnZXREZXZpY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1EZXZpY2U7Ci19Ci0KLXVpbnQzMl90IE1lbW9yeUhlYXBCYXNlOjpnZXRPZmZzZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1PZmZzZXQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL1BhcmNlbC5jcHAgYi9saWJzL2JpbmRlci9QYXJjZWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWExNGJiLi4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL1BhcmNlbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlBhcmNlbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQnBCaW5kZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgotI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9UZXh0T3V0cHV0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgPHV0aWxzL0ZsYXR0ZW5hYmxlLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9iaW5kZXIvYmluZGVyX21vZHVsZS5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaWZuZGVmIElOVDMyX01BWAotI2RlZmluZSBJTlQzMl9NQVggKChpbnQzMl90KSgyMTQ3NDgzNjQ3KSkKLSNlbmRpZgotCi0jZGVmaW5lIExPR19SRUZTKC4uLikKLS8vI2RlZmluZSBMT0dfUkVGUyguLi4pIEFMT0coTE9HX0RFQlVHLCAiUGFyY2VsIiwgX19WQV9BUkdTX18pCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZGVmaW5lIFBBRF9TSVpFKHMpICgoKHMpKzMpJn4zKQotCi0vLyBOb3RlOiBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIGFuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhJ3MgUEVOQUxUWV9HQVRIRVIKLSNkZWZpbmUgU1RSSUNUX01PREVfUEVOQUxUWV9HQVRIRVIgMHgxMDAKLQotLy8gTm90ZTogbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBhbmRyb2lkL29zL1BhcmNlbC5qYXZhJ3MgRVhfSEFTX1JFUExZX0hFQURFUgotI2RlZmluZSBFWF9IQVNfUkVQTFlfSEVBREVSIC0xMjgKLQotLy8gTWF4aW11bSBzaXplIG9mIGEgYmxvYiB0byB0cmFuc2ZlciBpbi1wbGFjZS4KLXN0YXRpYyBjb25zdCBzaXplX3QgSU5fUExBQ0VfQkxPQl9MSU1JVCA9IDQwICogMTAyNDsKLQotLy8gWFhYIFRoaXMgY2FuIGJlIG1hZGUgcHVibGljIGlmIHdlIHdhbnQgdG8gcHJvdmlkZQotLy8gc3VwcG9ydCBmb3IgdHlwZWQgZGF0YS4KLXN0cnVjdCBzbWFsbF9mbGF0X2RhdGEKLXsKLSAgICB1aW50MzJfdCB0eXBlOwotICAgIHVpbnQzMl90IGRhdGE7Ci19OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXZvaWQgYWNxdWlyZV9vYmplY3QoY29uc3Qgc3A8UHJvY2Vzc1N0YXRlPiYgcHJvYywKLSAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QmIG9iaiwgY29uc3Qgdm9pZCogd2hvKQotewotICAgIHN3aXRjaCAob2JqLnR5cGUpIHsKLSAgICAgICAgY2FzZSBCSU5ERVJfVFlQRV9CSU5ERVI6Ci0gICAgICAgICAgICBpZiAob2JqLmJpbmRlcikgewotICAgICAgICAgICAgICAgIExPR19SRUZTKCJQYXJjZWwgJXAgYWNxdWlyaW5nIHJlZmVyZW5jZSBvbiBsb2NhbCAlcCIsIHdobywgb2JqLmNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SUJpbmRlcio+KG9iai5jb29raWUpLT5pbmNTdHJvbmcod2hvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUjoKLSAgICAgICAgICAgIGlmIChvYmouYmluZGVyKQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlZkJhc2U6OndlYWtyZWZfdHlwZSo+KG9iai5iaW5kZXIpLT5pbmNXZWFrKHdobyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgQklOREVSX1RZUEVfSEFORExFOiB7Ci0gICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiBiID0gcHJvYy0+Z2V0U3Ryb25nUHJveHlGb3JIYW5kbGUob2JqLmhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoYiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgTE9HX1JFRlMoIlBhcmNlbCAlcCBhY3F1aXJpbmcgcmVmZXJlbmNlIG9uIHJlbW90ZSAlcCIsIHdobywgYi5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgYi0+aW5jU3Ryb25nKHdobyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTogewotICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4gYiA9IHByb2MtPmdldFdlYWtQcm94eUZvckhhbmRsZShvYmouaGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChiICE9IE5VTEwpIGIuZ2V0X3JlZnMoKS0+aW5jV2Vhayh3aG8pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQklOREVSX1RZUEVfRkQ6IHsKLSAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgYmxhbmsgLS0gbm90aGluZyB0byBkbyB0byBhY3F1aXJlIHRoaXMsIGJ1dCB3ZSBkbwotICAgICAgICAgICAgLy8gcmVjb2duaXplIGl0IGFzIGEgbGVnaXRpbWF0ZSBvYmplY3QgdHlwZS4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dEKCJJbnZhbGlkIG9iamVjdCB0eXBlIDB4JTA4bHgiLCBvYmoudHlwZSk7Ci19Ci0KLXZvaWQgcmVsZWFzZV9vYmplY3QoY29uc3Qgc3A8UHJvY2Vzc1N0YXRlPiYgcHJvYywKLSAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QmIG9iaiwgY29uc3Qgdm9pZCogd2hvKQotewotICAgIHN3aXRjaCAob2JqLnR5cGUpIHsKLSAgICAgICAgY2FzZSBCSU5ERVJfVFlQRV9CSU5ERVI6Ci0gICAgICAgICAgICBpZiAob2JqLmJpbmRlcikgewotICAgICAgICAgICAgICAgIExPR19SRUZTKCJQYXJjZWwgJXAgcmVsZWFzaW5nIHJlZmVyZW5jZSBvbiBsb2NhbCAlcCIsIHdobywgb2JqLmNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SUJpbmRlcio+KG9iai5jb29raWUpLT5kZWNTdHJvbmcod2hvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUjoKLSAgICAgICAgICAgIGlmIChvYmouYmluZGVyKQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlZkJhc2U6OndlYWtyZWZfdHlwZSo+KG9iai5iaW5kZXIpLT5kZWNXZWFrKHdobyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgQklOREVSX1RZUEVfSEFORExFOiB7Ci0gICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiBiID0gcHJvYy0+Z2V0U3Ryb25nUHJveHlGb3JIYW5kbGUob2JqLmhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoYiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgTE9HX1JFRlMoIlBhcmNlbCAlcCByZWxlYXNpbmcgcmVmZXJlbmNlIG9uIHJlbW90ZSAlcCIsIHdobywgYi5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgYi0+ZGVjU3Ryb25nKHdobyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTogewotICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4gYiA9IHByb2MtPmdldFdlYWtQcm94eUZvckhhbmRsZShvYmouaGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChiICE9IE5VTEwpIGIuZ2V0X3JlZnMoKS0+ZGVjV2Vhayh3aG8pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQklOREVSX1RZUEVfRkQ6IHsKLSAgICAgICAgICAgIGlmIChvYmouY29va2llICE9ICh2b2lkKikwKSBjbG9zZShvYmouaGFuZGxlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dFKCJJbnZhbGlkIG9iamVjdCB0eXBlIDB4JTA4bHgiLCBvYmoudHlwZSk7Ci19Ci0KLWlubGluZSBzdGF0aWMgc3RhdHVzX3QgZmluaXNoX2ZsYXR0ZW5fYmluZGVyKAotICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIsIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCYgZmxhdCwgUGFyY2VsKiBvdXQpCi17Ci0gICAgcmV0dXJuIG91dC0+d3JpdGVPYmplY3QoZmxhdCwgZmFsc2UpOwotfQotCi1zdGF0dXNfdCBmbGF0dGVuX2JpbmRlcihjb25zdCBzcDxQcm9jZXNzU3RhdGU+JiBwcm9jLAotICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIsIFBhcmNlbCogb3V0KQotewotICAgIGZsYXRfYmluZGVyX29iamVjdCBvYmo7Ci0gICAgCi0gICAgb2JqLmZsYWdzID0gMHg3ZiB8IEZMQVRfQklOREVSX0ZMQUdfQUNDRVBUU19GRFM7Ci0gICAgaWYgKGJpbmRlciAhPSBOVUxMKSB7Ci0gICAgICAgIElCaW5kZXIgKmxvY2FsID0gYmluZGVyLT5sb2NhbEJpbmRlcigpOwotICAgICAgICBpZiAoIWxvY2FsKSB7Ci0gICAgICAgICAgICBCcEJpbmRlciAqcHJveHkgPSBiaW5kZXItPnJlbW90ZUJpbmRlcigpOwotICAgICAgICAgICAgaWYgKHByb3h5ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibnVsbCBwcm94eSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBoYW5kbGUgPSBwcm94eSA/IHByb3h5LT5oYW5kbGUoKSA6IDA7Ci0gICAgICAgICAgICBvYmoudHlwZSA9IEJJTkRFUl9UWVBFX0hBTkRMRTsKLSAgICAgICAgICAgIG9iai5oYW5kbGUgPSBoYW5kbGU7Ci0gICAgICAgICAgICBvYmouY29va2llID0gTlVMTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9iai50eXBlID0gQklOREVSX1RZUEVfQklOREVSOwotICAgICAgICAgICAgb2JqLmJpbmRlciA9IGxvY2FsLT5nZXRXZWFrUmVmcygpOwotICAgICAgICAgICAgb2JqLmNvb2tpZSA9IGxvY2FsOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgb2JqLnR5cGUgPSBCSU5ERVJfVFlQRV9CSU5ERVI7Ci0gICAgICAgIG9iai5iaW5kZXIgPSBOVUxMOwotICAgICAgICBvYmouY29va2llID0gTlVMTDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZpbmlzaF9mbGF0dGVuX2JpbmRlcihiaW5kZXIsIG9iaiwgb3V0KTsKLX0KLQotc3RhdHVzX3QgZmxhdHRlbl9iaW5kZXIoY29uc3Qgc3A8UHJvY2Vzc1N0YXRlPiYgcHJvYywKLSAgICBjb25zdCB3cDxJQmluZGVyPiYgYmluZGVyLCBQYXJjZWwqIG91dCkKLXsKLSAgICBmbGF0X2JpbmRlcl9vYmplY3Qgb2JqOwotICAgIAotICAgIG9iai5mbGFncyA9IDB4N2YgfCBGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTOwotICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgewotICAgICAgICBzcDxJQmluZGVyPiByZWFsID0gYmluZGVyLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHJlYWwgIT0gTlVMTCkgewotICAgICAgICAgICAgSUJpbmRlciAqbG9jYWwgPSByZWFsLT5sb2NhbEJpbmRlcigpOwotICAgICAgICAgICAgaWYgKCFsb2NhbCkgewotICAgICAgICAgICAgICAgIEJwQmluZGVyICpwcm94eSA9IHJlYWwtPnJlbW90ZUJpbmRlcigpOwotICAgICAgICAgICAgICAgIGlmIChwcm94eSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJudWxsIHByb3h5Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaGFuZGxlID0gcHJveHkgPyBwcm94eS0+aGFuZGxlKCkgOiAwOwotICAgICAgICAgICAgICAgIG9iai50eXBlID0gQklOREVSX1RZUEVfV0VBS19IQU5ETEU7Ci0gICAgICAgICAgICAgICAgb2JqLmhhbmRsZSA9IGhhbmRsZTsKLSAgICAgICAgICAgICAgICBvYmouY29va2llID0gTlVMTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2JqLnR5cGUgPSBCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUjsKLSAgICAgICAgICAgICAgICBvYmouYmluZGVyID0gYmluZGVyLmdldF9yZWZzKCk7Ci0gICAgICAgICAgICAgICAgb2JqLmNvb2tpZSA9IGJpbmRlci51bnNhZmVfZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmluaXNoX2ZsYXR0ZW5fYmluZGVyKHJlYWwsIG9iaiwgb3V0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gWFhYIEhvdyB0byBkZWFsPyAgSW4gb3JkZXIgdG8gZmxhdHRlbiB0aGUgZ2l2ZW4gYmluZGVyLAotICAgICAgICAvLyB3ZSBuZWVkIHRvIHByb2JlIGl0IGZvciBpbmZvcm1hdGlvbiwgd2hpY2ggcmVxdWlyZXMgYSBwcmltYXJ5Ci0gICAgICAgIC8vIHJlZmVyZW5jZS4uLiAgYnV0IHdlIGRvbid0IGhhdmUgb25lLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgT3BlbkJpbmRlciBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgZHluYW1pY19jYXN0PD4gaGVyZSwKLSAgICAgICAgLy8gYnV0IHdlIGNhbid0IGRvIHRoYXQgd2l0aCB0aGUgZGlmZmVyZW50IHJlZmVyZW5jZSBjb3VudGluZwotICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiB3ZSBhcmUgdXNpbmcuCi0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gdW5mbGF0dGVuIEJpbmRlciB3ZWFrIHJlZmVyZW5jZSEiKTsKLSAgICAgICAgb2JqLnR5cGUgPSBCSU5ERVJfVFlQRV9CSU5ERVI7Ci0gICAgICAgIG9iai5iaW5kZXIgPSBOVUxMOwotICAgICAgICBvYmouY29va2llID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGZpbmlzaF9mbGF0dGVuX2JpbmRlcihOVUxMLCBvYmosIG91dCk7Ci0gICAgCi0gICAgfSBlbHNlIHsKLSAgICAgICAgb2JqLnR5cGUgPSBCSU5ERVJfVFlQRV9CSU5ERVI7Ci0gICAgICAgIG9iai5iaW5kZXIgPSBOVUxMOwotICAgICAgICBvYmouY29va2llID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGZpbmlzaF9mbGF0dGVuX2JpbmRlcihOVUxMLCBvYmosIG91dCk7Ci0gICAgfQotfQotCi1pbmxpbmUgc3RhdGljIHN0YXR1c190IGZpbmlzaF91bmZsYXR0ZW5fYmluZGVyKAotICAgIEJwQmluZGVyKiBwcm94eSwgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0JiBmbGF0LCBjb25zdCBQYXJjZWwmIGluKQotewotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLSAgICAKLXN0YXR1c190IHVuZmxhdHRlbl9iaW5kZXIoY29uc3Qgc3A8UHJvY2Vzc1N0YXRlPiYgcHJvYywKLSAgICBjb25zdCBQYXJjZWwmIGluLCBzcDxJQmluZGVyPiogb3V0KQotewotICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCogZmxhdCA9IGluLnJlYWRPYmplY3QoZmFsc2UpOwotICAgIAotICAgIGlmIChmbGF0KSB7Ci0gICAgICAgIHN3aXRjaCAoZmxhdC0+dHlwZSkgewotICAgICAgICAgICAgY2FzZSBCSU5ERVJfVFlQRV9CSU5ERVI6Ci0gICAgICAgICAgICAgICAgKm91dCA9IHN0YXRpY19jYXN0PElCaW5kZXIqPihmbGF0LT5jb29raWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBmaW5pc2hfdW5mbGF0dGVuX2JpbmRlcihOVUxMLCAqZmxhdCwgaW4pOwotICAgICAgICAgICAgY2FzZSBCSU5ERVJfVFlQRV9IQU5ETEU6Ci0gICAgICAgICAgICAgICAgKm91dCA9IHByb2MtPmdldFN0cm9uZ1Byb3h5Rm9ySGFuZGxlKGZsYXQtPmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmlzaF91bmZsYXR0ZW5fYmluZGVyKAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxCcEJpbmRlcio+KG91dC0+Z2V0KCkpLCAqZmxhdCwgaW4pOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9UWVBFOwotfQotCi1zdGF0dXNfdCB1bmZsYXR0ZW5fYmluZGVyKGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4mIHByb2MsCi0gICAgY29uc3QgUGFyY2VsJiBpbiwgd3A8SUJpbmRlcj4qIG91dCkKLXsKLSAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QqIGZsYXQgPSBpbi5yZWFkT2JqZWN0KGZhbHNlKTsKLSAgICAKLSAgICBpZiAoZmxhdCkgewotICAgICAgICBzd2l0Y2ggKGZsYXQtPnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQklOREVSX1RZUEVfQklOREVSOgotICAgICAgICAgICAgICAgICpvdXQgPSBzdGF0aWNfY2FzdDxJQmluZGVyKj4oZmxhdC0+Y29va2llKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluaXNoX3VuZmxhdHRlbl9iaW5kZXIoTlVMTCwgKmZsYXQsIGluKTsKLSAgICAgICAgICAgIGNhc2UgQklOREVSX1RZUEVfV0VBS19CSU5ERVI6Ci0gICAgICAgICAgICAgICAgaWYgKGZsYXQtPmJpbmRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC0+c2V0X29iamVjdF9hbmRfcmVmcygKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PElCaW5kZXIqPihmbGF0LT5jb29raWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVmQmFzZTo6d2Vha3JlZl90eXBlKj4oZmxhdC0+YmluZGVyKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKm91dCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmaW5pc2hfdW5mbGF0dGVuX2JpbmRlcihOVUxMLCAqZmxhdCwgaW4pOwotICAgICAgICAgICAgY2FzZSBCSU5ERVJfVFlQRV9IQU5ETEU6Ci0gICAgICAgICAgICBjYXNlIEJJTkRFUl9UWVBFX1dFQUtfSEFORExFOgotICAgICAgICAgICAgICAgICpvdXQgPSBwcm9jLT5nZXRXZWFrUHJveHlGb3JIYW5kbGUoZmxhdC0+aGFuZGxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluaXNoX3VuZmxhdHRlbl9iaW5kZXIoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEJwQmluZGVyKj4ob3V0LT51bnNhZmVfZ2V0KCkpLCAqZmxhdCwgaW4pOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBCQURfVFlQRTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVBhcmNlbDo6UGFyY2VsKCkKLXsKLSAgICBpbml0U3RhdGUoKTsKLX0KLQotUGFyY2VsOjp+UGFyY2VsKCkKLXsKLSAgICBmcmVlRGF0YU5vSW5pdCgpOwotfQotCi1jb25zdCB1aW50OF90KiBQYXJjZWw6OmRhdGEoKSBjb25zdAotewotICAgIHJldHVybiBtRGF0YTsKLX0KLQotc2l6ZV90IFBhcmNlbDo6ZGF0YVNpemUoKSBjb25zdAotewotICAgIHJldHVybiAobURhdGFTaXplID4gbURhdGFQb3MgPyBtRGF0YVNpemUgOiBtRGF0YVBvcyk7Ci19Ci0KLXNpemVfdCBQYXJjZWw6OmRhdGFBdmFpbCgpIGNvbnN0Ci17Ci0gICAgLy8gVE9ETzogZGVjaWRlIHdoYXQgdG8gZG8gYWJvdXQgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhpcyBjYW4KLSAgICAvLyByZXBvcnQgYW4gYXZhaWxhYmxlLWRhdGEgc2l6ZSB0aGF0IGV4Y2VlZHMgYSBKYXZhIGludCdzIG1heAotICAgIC8vIHBvc2l0aXZlIHZhbHVlLCBjYXVzaW5nIGhhdm9jLiAgRm9ydHVuYXRlbHkgdGhpcyB3aWxsIG9ubHkKLSAgICAvLyBoYXBwZW4gaWYgc29tZW9uZSBjb25zdHJ1Y3RzIGEgUGFyY2VsIGNvbnRhaW5pbmcgbW9yZSB0aGFuIHR3bwotICAgIC8vIGdpZ2FieXRlcyBvZiBkYXRhLCB3aGljaCBvbiB0eXBpY2FsIHBob25lIGhhcmR3YXJlIGlzIHNpbXBseQotICAgIC8vIG5vdCBwb3NzaWJsZS4KLSAgICByZXR1cm4gZGF0YVNpemUoKSAtIGRhdGFQb3NpdGlvbigpOwotfQotCi1zaXplX3QgUGFyY2VsOjpkYXRhUG9zaXRpb24oKSBjb25zdAotewotICAgIHJldHVybiBtRGF0YVBvczsKLX0KLQotc2l6ZV90IFBhcmNlbDo6ZGF0YUNhcGFjaXR5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbURhdGFDYXBhY2l0eTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjpzZXREYXRhU2l6ZShzaXplX3Qgc2l6ZSkKLXsKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgZXJyID0gY29udGludWVXcml0ZShzaXplKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1EYXRhU2l6ZSA9IHNpemU7Ci0gICAgICAgIEFMT0dWKCJzZXREYXRhU2l6ZSBTZXR0aW5nIGRhdGEgc2l6ZSBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBQYXJjZWw6OnNldERhdGFQb3NpdGlvbihzaXplX3QgcG9zKSBjb25zdAotewotICAgIG1EYXRhUG9zID0gcG9zOwotICAgIG1OZXh0T2JqZWN0SGludCA9IDA7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6c2V0RGF0YUNhcGFjaXR5KHNpemVfdCBzaXplKQotewotICAgIGlmIChzaXplID4gbURhdGFDYXBhY2l0eSkgcmV0dXJuIGNvbnRpbnVlV3JpdGUoc2l6ZSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OnNldERhdGEoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3QgbGVuKQotewotICAgIHN0YXR1c190IGVyciA9IHJlc3RhcnRXcml0ZShsZW4pOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbWVtY3B5KGNvbnN0X2Nhc3Q8dWludDhfdCo+KGRhdGEoKSksIGJ1ZmZlciwgbGVuKTsKLSAgICAgICAgbURhdGFTaXplID0gbGVuOwotICAgICAgICBtRmRzS25vd24gPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjphcHBlbmRGcm9tKGNvbnN0IFBhcmNlbCAqcGFyY2VsLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuKQotewotICAgIGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBwYXJjZWwtPm1EYXRhOwotICAgIGNvbnN0IHNpemVfdCAqb2JqZWN0cyA9IHBhcmNlbC0+bU9iamVjdHM7Ci0gICAgc2l6ZV90IHNpemUgPSBwYXJjZWwtPm1PYmplY3RzU2l6ZTsKLSAgICBpbnQgc3RhcnRQb3MgPSBtRGF0YVBvczsKLSAgICBpbnQgZmlyc3RJbmRleCA9IC0xLCBsYXN0SW5kZXggPSAtMjsKLQotICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gcmFuZ2UgY2hlY2tzIGFnYWluc3QgdGhlIHNvdXJjZSBwYXJjZWwgc2l6ZQotICAgIGlmICgob2Zmc2V0ID4gcGFyY2VsLT5tRGF0YVNpemUpCi0gICAgICAgICAgICB8fCAobGVuID4gcGFyY2VsLT5tRGF0YVNpemUpCi0gICAgICAgICAgICB8fCAob2Zmc2V0ICsgbGVuID4gcGFyY2VsLT5tRGF0YVNpemUpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gQ291bnQgb2JqZWN0cyBpbiByYW5nZQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHNpemVfdCBvZmYgPSBvYmplY3RzW2ldOwotICAgICAgICBpZiAoKG9mZiA+PSBvZmZzZXQpICYmIChvZmYgPCBvZmZzZXQgKyBsZW4pKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3RJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgIGZpcnN0SW5kZXggPSBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGFzdEluZGV4ID0gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgbnVtT2JqZWN0cyA9IGxhc3RJbmRleCAtIGZpcnN0SW5kZXggKyAxOwotCi0gICAgaWYgKChtRGF0YVNpemUrbGVuKSA+IG1EYXRhQ2FwYWNpdHkpIHsKLSAgICAgICAgLy8gZ3JvdyBkYXRhCi0gICAgICAgIGVyciA9IGdyb3dEYXRhKGxlbik7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBhcHBlbmQgZGF0YQotICAgIG1lbWNweShtRGF0YSArIG1EYXRhUG9zLCBkYXRhICsgb2Zmc2V0LCBsZW4pOwotICAgIG1EYXRhUG9zICs9IGxlbjsKLSAgICBtRGF0YVNpemUgKz0gbGVuOwotCi0gICAgZXJyID0gTk9fRVJST1I7Ci0KLSAgICBpZiAobnVtT2JqZWN0cyA+IDApIHsKLSAgICAgICAgLy8gZ3JvdyBvYmplY3RzCi0gICAgICAgIGlmIChtT2JqZWN0c0NhcGFjaXR5IDwgbU9iamVjdHNTaXplICsgbnVtT2JqZWN0cykgewotICAgICAgICAgICAgaW50IG5ld1NpemUgPSAoKG1PYmplY3RzU2l6ZSArIG51bU9iamVjdHMpKjMpLzI7Ci0gICAgICAgICAgICBzaXplX3QgKm9iamVjdHMgPQotICAgICAgICAgICAgICAgIChzaXplX3QqKXJlYWxsb2MobU9iamVjdHMsIG5ld1NpemUqc2l6ZW9mKHNpemVfdCkpOwotICAgICAgICAgICAgaWYgKG9iamVjdHMgPT0gKHNpemVfdCopMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtT2JqZWN0cyA9IG9iamVjdHM7Ci0gICAgICAgICAgICBtT2JqZWN0c0NhcGFjaXR5ID0gbmV3U2l6ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gYXBwZW5kIGFuZCBhY3F1aXJlIG9iamVjdHMKLSAgICAgICAgaW50IGlkeCA9IG1PYmplY3RzU2l6ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0SW5kZXg7IGkgPD0gbGFzdEluZGV4OyBpKyspIHsKLSAgICAgICAgICAgIHNpemVfdCBvZmYgPSBvYmplY3RzW2ldIC0gb2Zmc2V0ICsgc3RhcnRQb3M7Ci0gICAgICAgICAgICBtT2JqZWN0c1tpZHgrK10gPSBvZmY7Ci0gICAgICAgICAgICBtT2JqZWN0c1NpemUrKzsKLQotICAgICAgICAgICAgZmxhdF9iaW5kZXJfb2JqZWN0KiBmbGF0Ci0gICAgICAgICAgICAgICAgPSByZWludGVycHJldF9jYXN0PGZsYXRfYmluZGVyX29iamVjdCo+KG1EYXRhICsgb2ZmKTsKLSAgICAgICAgICAgIGFjcXVpcmVfb2JqZWN0KHByb2MsICpmbGF0LCB0aGlzKTsKLQotICAgICAgICAgICAgaWYgKGZsYXQtPnR5cGUgPT0gQklOREVSX1RZUEVfRkQpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgZmlsZSBkZXNjcmlwdG9yLCB3ZSBuZWVkIHRvIGR1cCBpdCBzbyB0aGUKLSAgICAgICAgICAgICAgICAvLyBuZXcgUGFyY2VsIG5vdyBvd25zIGl0cyBvd24gZmQsIGFuZCBjYW4gZGVjbGFyZSB0aGF0IHdlCi0gICAgICAgICAgICAgICAgLy8gb2ZmaWNpYWxseSBrbm93IHdlIGhhdmUgZmRzLgotICAgICAgICAgICAgICAgIGZsYXQtPmhhbmRsZSA9IGR1cChmbGF0LT5oYW5kbGUpOwotICAgICAgICAgICAgICAgIGZsYXQtPmNvb2tpZSA9ICh2b2lkKikxOwotICAgICAgICAgICAgICAgIG1IYXNGZHMgPSBtRmRzS25vd24gPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICghbUFsbG93RmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IEZEU19OT1RfQUxMT1dFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1ib29sIFBhcmNlbDo6cHVzaEFsbG93RmRzKGJvb2wgYWxsb3dGZHMpCi17Ci0gICAgY29uc3QgYm9vbCBvcmlnVmFsdWUgPSBtQWxsb3dGZHM7Ci0gICAgaWYgKCFhbGxvd0ZkcykgewotICAgICAgICBtQWxsb3dGZHMgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIG9yaWdWYWx1ZTsKLX0KLQotdm9pZCBQYXJjZWw6OnJlc3RvcmVBbGxvd0Zkcyhib29sIGxhc3RWYWx1ZSkKLXsKLSAgICBtQWxsb3dGZHMgPSBsYXN0VmFsdWU7Ci19Ci0KLWJvb2wgUGFyY2VsOjpoYXNGaWxlRGVzY3JpcHRvcnMoKSBjb25zdAotewotICAgIGlmICghbUZkc0tub3duKSB7Ci0gICAgICAgIHNjYW5Gb3JGZHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYXNGZHM7Ci19Ci0KLS8vIFdyaXRlIFJQQyBoZWFkZXJzLiAgKHByZXZpb3VzbHkganVzdCB0aGUgaW50ZXJmYWNlIHRva2VuKQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZUludGVyZmFjZVRva2VuKGNvbnN0IFN0cmluZzE2JiBpbnRlcmZhY2UpCi17Ci0gICAgd3JpdGVJbnQzMihJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRTdHJpY3RNb2RlUG9saWN5KCkgfAotICAgICAgICAgICAgICAgU1RSSUNUX01PREVfUEVOQUxUWV9HQVRIRVIpOwotICAgIC8vIGN1cnJlbnRseSB0aGUgaW50ZXJmYWNlIGlkZW50aWZpY2F0aW9uIHRva2VuIGlzIGp1c3QgaXRzIG5hbWUgYXMgYSBzdHJpbmcKLSAgICByZXR1cm4gd3JpdGVTdHJpbmcxNihpbnRlcmZhY2UpOwotfQotCi1ib29sIFBhcmNlbDo6Y2hlY2tJbnRlcmZhY2UoSUJpbmRlciogYmluZGVyKSBjb25zdAotewotICAgIHJldHVybiBlbmZvcmNlSW50ZXJmYWNlKGJpbmRlci0+Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLX0KLQotYm9vbCBQYXJjZWw6OmVuZm9yY2VJbnRlcmZhY2UoY29uc3QgU3RyaW5nMTYmIGludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlKiB0aHJlYWRTdGF0ZSkgY29uc3QKLXsKLSAgICBpbnQzMl90IHN0cmljdFBvbGljeSA9IHJlYWRJbnQzMigpOwotICAgIGlmICh0aHJlYWRTdGF0ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocmVhZFN0YXRlID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICB9Ci0gICAgaWYgKCh0aHJlYWRTdGF0ZS0+Z2V0TGFzdFRyYW5zYWN0aW9uQmluZGVyRmxhZ3MoKSAmCi0gICAgICAgICBJQmluZGVyOjpGTEFHX09ORVdBWSkgIT0gMCkgewotICAgICAgLy8gRm9yIG9uZS13YXkgY2FsbHMsIHRoZSBjYWxsZWUgaXMgcnVubmluZyBlbnRpcmVseQotICAgICAgLy8gZGlzY29ubmVjdGVkIGZyb20gdGhlIGNhbGxlciwgc28gZGlzYWJsZSBTdHJpY3RNb2RlIGVudGlyZWx5LgotICAgICAgLy8gTm90IG9ubHkgZG9lcyBkaXNrL25ldHdvcmsgdXNhZ2Ugbm90IGltcGFjdCB0aGUgY2FsbGVyLCBidXQKLSAgICAgIC8vIHRoZXJlJ3Mgbm8gd2F5IHRvIGNvbW11aWNhdGUgYmFjayBhbnkgdmlvbGF0aW9ucyBhbnl3YXkuCi0gICAgICB0aHJlYWRTdGF0ZS0+c2V0U3RyaWN0TW9kZVBvbGljeSgwKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyZWFkU3RhdGUtPnNldFN0cmljdE1vZGVQb2xpY3koc3RyaWN0UG9saWN5KTsKLSAgICB9Ci0gICAgY29uc3QgU3RyaW5nMTYgc3RyKHJlYWRTdHJpbmcxNigpKTsKLSAgICBpZiAoc3RyID09IGludGVyZmFjZSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiKioqKiBlbmZvcmNlSW50ZXJmYWNlKCkgZXhwZWN0ZWQgJyVzJyBidXQgcmVhZCAnJXMnXG4iLAotICAgICAgICAgICAgICAgIFN0cmluZzgoaW50ZXJmYWNlKS5zdHJpbmcoKSwgU3RyaW5nOChzdHIpLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotY29uc3Qgc2l6ZV90KiBQYXJjZWw6Om9iamVjdHMoKSBjb25zdAotewotICAgIHJldHVybiBtT2JqZWN0czsKLX0KLQotc2l6ZV90IFBhcmNlbDo6b2JqZWN0c0NvdW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbU9iamVjdHNTaXplOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OmVycm9yQ2hlY2soKSBjb25zdAotewotICAgIHJldHVybiBtRXJyb3I7Ci19Ci0KLXZvaWQgUGFyY2VsOjpzZXRFcnJvcihzdGF0dXNfdCBlcnIpCi17Ci0gICAgbUVycm9yID0gZXJyOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OmZpbmlzaFdyaXRlKHNpemVfdCBsZW4pCi17Ci0gICAgLy9wcmludGYoIkZpbmlzaCB3cml0ZSBvZiAlZFxuIiwgbGVuKTsKLSAgICBtRGF0YVBvcyArPSBsZW47Ci0gICAgQUxPR1YoImZpbmlzaFdyaXRlIFNldHRpbmcgZGF0YSBwb3Mgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhUG9zKTsKLSAgICBpZiAobURhdGFQb3MgPiBtRGF0YVNpemUpIHsKLSAgICAgICAgbURhdGFTaXplID0gbURhdGFQb3M7Ci0gICAgICAgIEFMT0dWKCJmaW5pc2hXcml0ZSBTZXR0aW5nIGRhdGEgc2l6ZSBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFTaXplKTsKLSAgICB9Ci0gICAgLy9wcmludGYoIk5ldyBwb3M9JWQsIHNpemU9JWRcbiIsIG1EYXRhUG9zLCBtRGF0YVNpemUpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZVVucGFkZGVkKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pCi17Ci0gICAgc2l6ZV90IGVuZCA9IG1EYXRhUG9zICsgbGVuOwotICAgIGlmIChlbmQgPCBtRGF0YVBvcykgewotICAgICAgICAvLyBpbnRlZ2VyIG92ZXJmbG93Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKGVuZCA8PSBtRGF0YUNhcGFjaXR5KSB7Ci1yZXN0YXJ0X3dyaXRlOgotICAgICAgICBtZW1jcHkobURhdGErbURhdGFQb3MsIGRhdGEsIGxlbik7Ci0gICAgICAgIHJldHVybiBmaW5pc2hXcml0ZShsZW4pOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IGdyb3dEYXRhKGxlbik7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgZ290byByZXN0YXJ0X3dyaXRlOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGUoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbikKLXsKLSAgICB2b2lkKiBjb25zdCBkID0gd3JpdGVJbnBsYWNlKGxlbik7Ci0gICAgaWYgKGQpIHsKLSAgICAgICAgbWVtY3B5KGQsIGRhdGEsIGxlbik7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIG1FcnJvcjsKLX0KLQotdm9pZCogUGFyY2VsOjp3cml0ZUlucGxhY2Uoc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBzaXplX3QgcGFkZGVkID0gUEFEX1NJWkUobGVuKTsKLQotICAgIC8vIHNhbml0eSBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdwotICAgIGlmIChtRGF0YVBvcytwYWRkZWQgPCBtRGF0YVBvcykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoKG1EYXRhUG9zK3BhZGRlZCkgPD0gbURhdGFDYXBhY2l0eSkgewotcmVzdGFydF93cml0ZToKLSAgICAgICAgLy9wcmludGYoIldyaXRpbmcgJWxkIGJ5dGVzLCBwYWRkZWQgdG8gJWxkXG4iLCBsZW4sIHBhZGRlZCk7Ci0gICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRhdGEgPSBtRGF0YSttRGF0YVBvczsKLQotICAgICAgICAvLyBOZWVkIHRvIHBhZCBhdCBlbmQ/Ci0gICAgICAgIGlmIChwYWRkZWQgIT0gbGVuKSB7Ci0jaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCi0gICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbWFza1s0XSA9IHsKLSAgICAgICAgICAgICAgICAweDAwMDAwMDAwLCAweGZmZmZmZjAwLCAweGZmZmYwMDAwLCAweGZmMDAwMDAwCi0gICAgICAgICAgICB9OwotI2VuZGlmCi0jaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbWFza1s0XSA9IHsKLSAgICAgICAgICAgICAgICAweDAwMDAwMDAwLCAweDAwZmZmZmZmLCAweDAwMDBmZmZmLCAweDAwMDAwMGZmCi0gICAgICAgICAgICB9OwotI2VuZGlmCi0gICAgICAgICAgICAvL3ByaW50ZigiQXBwbHlpbmcgcGFkIG1hc2s6ICVwIHRvICVwXG4iLCAodm9pZCopbWFza1twYWRkZWQtbGVuXSwKLSAgICAgICAgICAgIC8vICAgICpyZWludGVycHJldF9jYXN0PHZvaWQqKj4oZGF0YStwYWRkZWQtNCkpOwotICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihkYXRhK3BhZGRlZC00KSAmPSBtYXNrW3BhZGRlZC1sZW5dOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluaXNoV3JpdGUocGFkZGVkKTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gZ3Jvd0RhdGEocGFkZGVkKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSBnb3RvIHJlc3RhcnRfd3JpdGU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVJbnQzMihpbnQzMl90IHZhbCkKLXsKLSAgICByZXR1cm4gd3JpdGVBbGlnbmVkKHZhbCk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVJbnQ2NChpbnQ2NF90IHZhbCkKLXsKLSAgICByZXR1cm4gd3JpdGVBbGlnbmVkKHZhbCk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVGbG9hdChmbG9hdCB2YWwpCi17Ci0gICAgcmV0dXJuIHdyaXRlQWxpZ25lZCh2YWwpOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlRG91YmxlKGRvdWJsZSB2YWwpCi17Ci0gICAgcmV0dXJuIHdyaXRlQWxpZ25lZCh2YWwpOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlSW50UHRyKGludHB0cl90IHZhbCkKLXsKLSAgICByZXR1cm4gd3JpdGVBbGlnbmVkKHZhbCk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVDU3RyaW5nKGNvbnN0IGNoYXIqIHN0cikKLXsKLSAgICByZXR1cm4gd3JpdGUoc3RyLCBzdHJsZW4oc3RyKSsxKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZVN0cmluZzgoY29uc3QgU3RyaW5nOCYgc3RyKQotewotICAgIHN0YXR1c190IGVyciA9IHdyaXRlSW50MzIoc3RyLmJ5dGVzKCkpOwotICAgIC8vIG9ubHkgd3JpdGUgc3RyaW5nIGlmIGl0cyBsZW5ndGggaXMgbW9yZSB0aGFuIHplcm8gY2hhcmFjdGVycywKLSAgICAvLyBhcyByZWFkU3RyaW5nOCB3aWxsIG9ubHkgcmVhZCBpZiB0aGUgbGVuZ3RoIGZpZWxkIGlzIG5vbi16ZXJvLgotICAgIC8vIHRoaXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gaG93IHdyaXRlU3RyaW5nMTYgd29ya3MuCi0gICAgaWYgKHN0ci5ieXRlcygpID4gMCAmJiBlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgZXJyID0gd3JpdGUoc3RyLnN0cmluZygpLCBzdHIuYnl0ZXMoKSsxKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZVN0cmluZzE2KGNvbnN0IFN0cmluZzE2JiBzdHIpCi17Ci0gICAgcmV0dXJuIHdyaXRlU3RyaW5nMTYoc3RyLnN0cmluZygpLCBzdHIuc2l6ZSgpKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZVN0cmluZzE2KGNvbnN0IGNoYXIxNl90KiBzdHIsIHNpemVfdCBsZW4pCi17Ci0gICAgaWYgKHN0ciA9PSBOVUxMKSByZXR1cm4gd3JpdGVJbnQzMigtMSk7Ci0gICAgCi0gICAgc3RhdHVzX3QgZXJyID0gd3JpdGVJbnQzMihsZW4pOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbGVuICo9IHNpemVvZihjaGFyMTZfdCk7Ci0gICAgICAgIHVpbnQ4X3QqIGRhdGEgPSAodWludDhfdCopd3JpdGVJbnBsYWNlKGxlbitzaXplb2YoY2hhcjE2X3QpKTsKLSAgICAgICAgaWYgKGRhdGEpIHsKLSAgICAgICAgICAgIG1lbWNweShkYXRhLCBzdHIsIGxlbik7Ci0gICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjaGFyMTZfdCo+KGRhdGErbGVuKSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyID0gbUVycm9yOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlU3Ryb25nQmluZGVyKGNvbnN0IHNwPElCaW5kZXI+JiB2YWwpCi17Ci0gICAgcmV0dXJuIGZsYXR0ZW5fYmluZGVyKFByb2Nlc3NTdGF0ZTo6c2VsZigpLCB2YWwsIHRoaXMpOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlV2Vha0JpbmRlcihjb25zdCB3cDxJQmluZGVyPiYgdmFsKQotewotICAgIHJldHVybiBmbGF0dGVuX2JpbmRlcihQcm9jZXNzU3RhdGU6OnNlbGYoKSwgdmFsLCB0aGlzKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZU5hdGl2ZUhhbmRsZShjb25zdCBuYXRpdmVfaGFuZGxlKiBoYW5kbGUpCi17Ci0gICAgaWYgKCFoYW5kbGUgfHwgaGFuZGxlLT52ZXJzaW9uICE9IHNpemVvZihuYXRpdmVfaGFuZGxlKSkKLSAgICAgICAgcmV0dXJuIEJBRF9UWVBFOwotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIGVyciA9IHdyaXRlSW50MzIoaGFuZGxlLT5udW1GZHMpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHJldHVybiBlcnI7Ci0KLSAgICBlcnIgPSB3cml0ZUludDMyKGhhbmRsZS0+bnVtSW50cyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgcmV0dXJuIGVycjsKLQotICAgIGZvciAoaW50IGk9MCA7IGVycj09Tk9fRVJST1IgJiYgaTxoYW5kbGUtPm51bUZkcyA7IGkrKykKLSAgICAgICAgZXJyID0gd3JpdGVEdXBGaWxlRGVzY3JpcHRvcihoYW5kbGUtPmRhdGFbaV0pOwotCi0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRCgid3JpdGUgbmF0aXZlIGhhbmRsZSwgd3JpdGUgZHVwIGZkIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSB3cml0ZShoYW5kbGUtPmRhdGEgKyBoYW5kbGUtPm51bUZkcywgc2l6ZW9mKGludCkqaGFuZGxlLT5udW1JbnRzKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlRmlsZURlc2NyaXB0b3IoaW50IGZkLCBib29sIHRha2VPd25lcnNoaXApCi17Ci0gICAgZmxhdF9iaW5kZXJfb2JqZWN0IG9iajsKLSAgICBvYmoudHlwZSA9IEJJTkRFUl9UWVBFX0ZEOwotICAgIG9iai5mbGFncyA9IDB4N2YgfCBGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTOwotICAgIG9iai5oYW5kbGUgPSBmZDsKLSAgICBvYmouY29va2llID0gKHZvaWQqKSAodGFrZU93bmVyc2hpcCA/IDEgOiAwKTsKLSAgICByZXR1cm4gd3JpdGVPYmplY3Qob2JqLCB0cnVlKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZUR1cEZpbGVEZXNjcmlwdG9yKGludCBmZCkKLXsKLSAgICBpbnQgZHVwRmQgPSBkdXAoZmQpOwotICAgIGlmIChkdXBGZCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gd3JpdGVGaWxlRGVzY3JpcHRvcihkdXBGZCwgdHJ1ZSAvKnRha2VPd25lcnNoaXAqLyk7Ci0gICAgaWYgKGVycikgewotICAgICAgICBjbG9zZShkdXBGZCk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVCbG9iKHNpemVfdCBsZW4sIFdyaXRhYmxlQmxvYiogb3V0QmxvYikKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0KLSAgICBpZiAoIW1BbGxvd0ZkcyB8fCBsZW4gPD0gSU5fUExBQ0VfQkxPQl9MSU1JVCkgewotICAgICAgICBBTE9HVigid3JpdGVCbG9iOiB3cml0ZSBpbiBwbGFjZSIpOwotICAgICAgICBzdGF0dXMgPSB3cml0ZUludDMyKDApOwotICAgICAgICBpZiAoc3RhdHVzKSByZXR1cm4gc3RhdHVzOwotCi0gICAgICAgIHZvaWQqIHB0ciA9IHdyaXRlSW5wbGFjZShsZW4pOwotICAgICAgICBpZiAoIXB0cikgcmV0dXJuIE5PX01FTU9SWTsKLQotICAgICAgICBvdXRCbG9iLT5pbml0KGZhbHNlIC8qbWFwcGVkKi8sIHB0ciwgbGVuKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIEFMT0dWKCJ3cml0ZUJsb2I6IHdyaXRlIHRvIGFzaG1lbSIpOwotICAgIGludCBmZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKCJQYXJjZWwgQmxvYiIsIGxlbik7Ci0gICAgaWYgKGZkIDwgMCkgcmV0dXJuIE5PX01FTU9SWTsKLQotICAgIGludCByZXN1bHQgPSBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKGZkLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKLSAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICBzdGF0dXMgPSByZXN1bHQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdm9pZCogcHRyID0gOjptbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOwotICAgICAgICBpZiAocHRyID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1lcnJubzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFzaG1lbV9zZXRfcHJvdF9yZWdpb24oZmQsIFBST1RfUkVBRCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3VsdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gd3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB3cml0ZUZpbGVEZXNjcmlwdG9yKGZkLCB0cnVlIC8qdGFrZU93bmVyc2hpcCovKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dEJsb2ItPmluaXQodHJ1ZSAvKm1hcHBlZCovLCBwdHIsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgOjptdW5tYXAocHRyLCBsZW4pOwotICAgIH0KLSAgICA6OmNsb3NlKGZkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlKGNvbnN0IEZsYXR0ZW5hYmxlJiB2YWwpCi17Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgLy8gc2l6ZSBpZiBuZWVkZWQKLSAgICBzaXplX3QgbGVuID0gdmFsLmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICBzaXplX3QgZmRfY291bnQgPSB2YWwuZ2V0RmRDb3VudCgpOwotCi0gICAgZXJyID0gdGhpcy0+d3JpdGVJbnQzMihsZW4pOwotICAgIGlmIChlcnIpIHJldHVybiBlcnI7Ci0KLSAgICBlcnIgPSB0aGlzLT53cml0ZUludDMyKGZkX2NvdW50KTsKLSAgICBpZiAoZXJyKSByZXR1cm4gZXJyOwotCi0gICAgLy8gcGF5bG9hZAotICAgIHZvaWQqIGJ1ZiA9IHRoaXMtPndyaXRlSW5wbGFjZShQQURfU0laRShsZW4pKTsKLSAgICBpZiAoYnVmID09IE5VTEwpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBpbnQqIGZkcyA9IE5VTEw7Ci0gICAgaWYgKGZkX2NvdW50KSB7Ci0gICAgICAgIGZkcyA9IG5ldyBpbnRbZmRfY291bnRdOwotICAgIH0KLQotICAgIGVyciA9IHZhbC5mbGF0dGVuKGJ1ZiwgbGVuLCBmZHMsIGZkX2NvdW50KTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGZkX2NvdW50ICYmIGVycj09Tk9fRVJST1IgOyBpKyspIHsKLSAgICAgICAgZXJyID0gdGhpcy0+d3JpdGVEdXBGaWxlRGVzY3JpcHRvciggZmRzW2ldICk7Ci0gICAgfQotCi0gICAgaWYgKGZkX2NvdW50KSB7Ci0gICAgICAgIGRlbGV0ZSBbXSBmZHM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZU9iamVjdChjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QmIHZhbCwgYm9vbCBudWxsTWV0YURhdGEpCi17Ci0gICAgY29uc3QgYm9vbCBlbm91Z2hEYXRhID0gKG1EYXRhUG9zK3NpemVvZih2YWwpKSA8PSBtRGF0YUNhcGFjaXR5OwotICAgIGNvbnN0IGJvb2wgZW5vdWdoT2JqZWN0cyA9IG1PYmplY3RzU2l6ZSA8IG1PYmplY3RzQ2FwYWNpdHk7Ci0gICAgaWYgKGVub3VnaERhdGEgJiYgZW5vdWdoT2JqZWN0cykgewotcmVzdGFydF93cml0ZToKLSAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxhdF9iaW5kZXJfb2JqZWN0Kj4obURhdGErbURhdGFQb3MpID0gdmFsOwotICAgICAgICAKLSAgICAgICAgLy8gTmVlZCB0byB3cml0ZSBtZXRhLWRhdGE/Ci0gICAgICAgIGlmIChudWxsTWV0YURhdGEgfHwgdmFsLmJpbmRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtT2JqZWN0c1ttT2JqZWN0c1NpemVdID0gbURhdGFQb3M7Ci0gICAgICAgICAgICBhY3F1aXJlX29iamVjdChQcm9jZXNzU3RhdGU6OnNlbGYoKSwgdmFsLCB0aGlzKTsKLSAgICAgICAgICAgIG1PYmplY3RzU2l6ZSsrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyByZW1lbWJlciBpZiBpdCdzIGEgZmlsZSBkZXNjcmlwdG9yCi0gICAgICAgIGlmICh2YWwudHlwZSA9PSBCSU5ERVJfVFlQRV9GRCkgewotICAgICAgICAgICAgaWYgKCFtQWxsb3dGZHMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkRTX05PVF9BTExPV0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUhhc0ZkcyA9IG1GZHNLbm93biA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmluaXNoV3JpdGUoc2l6ZW9mKGZsYXRfYmluZGVyX29iamVjdCkpOwotICAgIH0KLQotICAgIGlmICghZW5vdWdoRGF0YSkgewotICAgICAgICBjb25zdCBzdGF0dXNfdCBlcnIgPSBncm93RGF0YShzaXplb2YodmFsKSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGlmICghZW5vdWdoT2JqZWN0cykgewotICAgICAgICBzaXplX3QgbmV3U2l6ZSA9ICgobU9iamVjdHNTaXplKzIpKjMpLzI7Ci0gICAgICAgIHNpemVfdCogb2JqZWN0cyA9IChzaXplX3QqKXJlYWxsb2MobU9iamVjdHMsIG5ld1NpemUqc2l6ZW9mKHNpemVfdCkpOwotICAgICAgICBpZiAob2JqZWN0cyA9PSBOVUxMKSByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICBtT2JqZWN0cyA9IG9iamVjdHM7Ci0gICAgICAgIG1PYmplY3RzQ2FwYWNpdHkgPSBuZXdTaXplOwotICAgIH0KLSAgICAKLSAgICBnb3RvIHJlc3RhcnRfd3JpdGU7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVOb0V4Y2VwdGlvbigpCi17Ci0gICAgcmV0dXJuIHdyaXRlSW50MzIoMCk7Ci19Ci0KLXZvaWQgUGFyY2VsOjpyZW1vdmUoc2l6ZV90IHN0YXJ0LCBzaXplX3QgYW10KQotewotICAgIExPR19BTFdBWVNfRkFUQUwoIlBhcmNlbDo6cmVtb3ZlKCkgbm90IHlldCBpbXBsZW1lbnRlZCEiKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjpyZWFkKHZvaWQqIG91dERhdGEsIHNpemVfdCBsZW4pIGNvbnN0Ci17Ci0gICAgaWYgKChtRGF0YVBvcytQQURfU0laRShsZW4pKSA+PSBtRGF0YVBvcyAmJiAobURhdGFQb3MrUEFEX1NJWkUobGVuKSkgPD0gbURhdGFTaXplKSB7Ci0gICAgICAgIG1lbWNweShvdXREYXRhLCBtRGF0YSttRGF0YVBvcywgbGVuKTsKLSAgICAgICAgbURhdGFQb3MgKz0gUEFEX1NJWkUobGVuKTsKLSAgICAgICAgQUxPR1YoInJlYWQgU2V0dGluZyBkYXRhIHBvcyBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFQb3MpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci19Ci0KLWNvbnN0IHZvaWQqIFBhcmNlbDo6cmVhZElucGxhY2Uoc2l6ZV90IGxlbikgY29uc3QKLXsKLSAgICBpZiAoKG1EYXRhUG9zK1BBRF9TSVpFKGxlbikpID49IG1EYXRhUG9zICYmIChtRGF0YVBvcytQQURfU0laRShsZW4pKSA8PSBtRGF0YVNpemUpIHsKLSAgICAgICAgY29uc3Qgdm9pZCogZGF0YSA9IG1EYXRhK21EYXRhUG9zOwotICAgICAgICBtRGF0YVBvcyArPSBQQURfU0laRShsZW4pOwotICAgICAgICBBTE9HVigicmVhZElucGxhY2UgU2V0dGluZyBkYXRhIHBvcyBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFQb3MpOwotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1zdGF0dXNfdCBQYXJjZWw6OnJlYWRBbGlnbmVkKFQgKnBBcmcpIGNvbnN0IHsKLSAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKFBBRF9TSVpFKHNpemVvZihUKSkgPT0gc2l6ZW9mKFQpKTsKLQotICAgIGlmICgobURhdGFQb3Mrc2l6ZW9mKFQpKSA8PSBtRGF0YVNpemUpIHsKLSAgICAgICAgY29uc3Qgdm9pZCogZGF0YSA9IG1EYXRhK21EYXRhUG9zOwotICAgICAgICBtRGF0YVBvcyArPSBzaXplb2YoVCk7Ci0gICAgICAgICpwQXJnID0gICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihkYXRhKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgfQotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotVCBQYXJjZWw6OnJlYWRBbGlnbmVkKCkgY29uc3QgewotICAgIFQgcmVzdWx0OwotICAgIGlmIChyZWFkQWxpZ25lZCgmcmVzdWx0KSAhPSBOT19FUlJPUikgewotICAgICAgICByZXN1bHQgPSAwOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1zdGF0dXNfdCBQYXJjZWw6OndyaXRlQWxpZ25lZChUIHZhbCkgewotICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoUEFEX1NJWkUoc2l6ZW9mKFQpKSA9PSBzaXplb2YoVCkpOwotCi0gICAgaWYgKChtRGF0YVBvcytzaXplb2YodmFsKSkgPD0gbURhdGFDYXBhY2l0eSkgewotcmVzdGFydF93cml0ZToKLSAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8VCo+KG1EYXRhK21EYXRhUG9zKSA9IHZhbDsKLSAgICAgICAgcmV0dXJuIGZpbmlzaFdyaXRlKHNpemVvZih2YWwpKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBncm93RGF0YShzaXplb2YodmFsKSk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgZ290byByZXN0YXJ0X3dyaXRlOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6cmVhZEludDMyKGludDMyX3QgKnBBcmcpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlYWRBbGlnbmVkKHBBcmcpOwotfQotCi1pbnQzMl90IFBhcmNlbDo6cmVhZEludDMyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVhZEFsaWduZWQ8aW50MzJfdD4oKTsKLX0KLQotCi1zdGF0dXNfdCBQYXJjZWw6OnJlYWRJbnQ2NChpbnQ2NF90ICpwQXJnKSBjb25zdAotewotICAgIHJldHVybiByZWFkQWxpZ25lZChwQXJnKTsKLX0KLQotCi1pbnQ2NF90IFBhcmNlbDo6cmVhZEludDY0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVhZEFsaWduZWQ8aW50NjRfdD4oKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjpyZWFkRmxvYXQoZmxvYXQgKnBBcmcpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlYWRBbGlnbmVkKHBBcmcpOwotfQotCi0KLWZsb2F0IFBhcmNlbDo6cmVhZEZsb2F0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVhZEFsaWduZWQ8ZmxvYXQ+KCk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6cmVhZERvdWJsZShkb3VibGUgKnBBcmcpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlYWRBbGlnbmVkKHBBcmcpOwotfQotCi0KLWRvdWJsZSBQYXJjZWw6OnJlYWREb3VibGUoKSBjb25zdAotewotICAgIHJldHVybiByZWFkQWxpZ25lZDxkb3VibGU+KCk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6cmVhZEludFB0cihpbnRwdHJfdCAqcEFyZykgY29uc3QKLXsKLSAgICByZXR1cm4gcmVhZEFsaWduZWQocEFyZyk7Ci19Ci0KLQotaW50cHRyX3QgUGFyY2VsOjpyZWFkSW50UHRyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVhZEFsaWduZWQ8aW50cHRyX3Q+KCk7Ci19Ci0KLQotY29uc3QgY2hhciogUGFyY2VsOjpyZWFkQ1N0cmluZygpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IGF2YWlsID0gbURhdGFTaXplLW1EYXRhUG9zOwotICAgIGlmIChhdmFpbCA+IDApIHsKLSAgICAgICAgY29uc3QgY2hhciogc3RyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obURhdGErbURhdGFQb3MpOwotICAgICAgICAvLyBpcyB0aGUgc3RyaW5nJ3MgdHJhaWxpbmcgTlVMIHdpdGhpbiB0aGUgcGFyY2VsJ3MgdmFsaWQgYm91bmRzPwotICAgICAgICBjb25zdCBjaGFyKiBlb3MgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihtZW1jaHIoc3RyLCAwLCBhdmFpbCkpOwotICAgICAgICBpZiAoZW9zKSB7Ci0gICAgICAgICAgICBjb25zdCBzaXplX3QgbGVuID0gZW9zIC0gc3RyOwotICAgICAgICAgICAgbURhdGFQb3MgKz0gUEFEX1NJWkUobGVuKzEpOwotICAgICAgICAgICAgQUxPR1YoInJlYWRDU3RyaW5nIFNldHRpbmcgZGF0YSBwb3Mgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBzdHI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLVN0cmluZzggUGFyY2VsOjpyZWFkU3RyaW5nOCgpIGNvbnN0Ci17Ci0gICAgaW50MzJfdCBzaXplID0gcmVhZEludDMyKCk7Ci0gICAgLy8gd2F0Y2ggZm9yIHBvdGVudGlhbCBpbnQgb3ZlcmZsb3cgYWRkaW5nIDEgZm9yIHRyYWlsaW5nIE5VTAotICAgIGlmIChzaXplID4gMCAmJiBzaXplIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHN0ciA9IChjb25zdCBjaGFyKilyZWFkSW5wbGFjZShzaXplKzEpOwotICAgICAgICBpZiAoc3RyKSByZXR1cm4gU3RyaW5nOChzdHIsIHNpemUpOwotICAgIH0KLSAgICByZXR1cm4gU3RyaW5nOCgpOwotfQotCi1TdHJpbmcxNiBQYXJjZWw6OnJlYWRTdHJpbmcxNigpIGNvbnN0Ci17Ci0gICAgc2l6ZV90IGxlbjsKLSAgICBjb25zdCBjaGFyMTZfdCogc3RyID0gcmVhZFN0cmluZzE2SW5wbGFjZSgmbGVuKTsKLSAgICBpZiAoc3RyKSByZXR1cm4gU3RyaW5nMTYoc3RyLCBsZW4pOwotICAgIEFMT0dFKCJSZWFkaW5nIGEgTlVMTCBzdHJpbmcgbm90IHN1cHBvcnRlZCBoZXJlLiIpOwotICAgIHJldHVybiBTdHJpbmcxNigpOwotfQotCi1jb25zdCBjaGFyMTZfdCogUGFyY2VsOjpyZWFkU3RyaW5nMTZJbnBsYWNlKHNpemVfdCogb3V0TGVuKSBjb25zdAotewotICAgIGludDMyX3Qgc2l6ZSA9IHJlYWRJbnQzMigpOwotICAgIC8vIHdhdGNoIGZvciBwb3RlbnRpYWwgaW50IG92ZXJmbG93IGZyb20gc2l6ZSsxCi0gICAgaWYgKHNpemUgPj0gMCAmJiBzaXplIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICpvdXRMZW4gPSBzaXplOwotICAgICAgICBjb25zdCBjaGFyMTZfdCogc3RyID0gKGNvbnN0IGNoYXIxNl90KilyZWFkSW5wbGFjZSgoc2l6ZSsxKSpzaXplb2YoY2hhcjE2X3QpKTsKLSAgICAgICAgaWYgKHN0ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RyOwotICAgICAgICB9Ci0gICAgfQotICAgICpvdXRMZW4gPSAwOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zcDxJQmluZGVyPiBQYXJjZWw6OnJlYWRTdHJvbmdCaW5kZXIoKSBjb25zdAotewotICAgIHNwPElCaW5kZXI+IHZhbDsKLSAgICB1bmZsYXR0ZW5fYmluZGVyKFByb2Nlc3NTdGF0ZTo6c2VsZigpLCAqdGhpcywgJnZhbCk7Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotd3A8SUJpbmRlcj4gUGFyY2VsOjpyZWFkV2Vha0JpbmRlcigpIGNvbnN0Ci17Ci0gICAgd3A8SUJpbmRlcj4gdmFsOwotICAgIHVuZmxhdHRlbl9iaW5kZXIoUHJvY2Vzc1N0YXRlOjpzZWxmKCksICp0aGlzLCAmdmFsKTsKLSAgICByZXR1cm4gdmFsOwotfQotCi1pbnQzMl90IFBhcmNlbDo6cmVhZEV4Y2VwdGlvbkNvZGUoKSBjb25zdAotewotICBpbnQzMl90IGV4Y2VwdGlvbl9jb2RlID0gcmVhZEFsaWduZWQ8aW50MzJfdD4oKTsKLSAgaWYgKGV4Y2VwdGlvbl9jb2RlID09IEVYX0hBU19SRVBMWV9IRUFERVIpIHsKLSAgICBpbnQzMl90IGhlYWRlcl9zaXplID0gcmVhZEFsaWduZWQ8aW50MzJfdD4oKTsKLSAgICAvLyBTa2lwIG92ZXIgZmF0IHJlc3BvbnNlcyBoZWFkZXJzLiAgTm90IHVzZWQgKG9yIHByb3BhZ2F0ZWQpIGluCi0gICAgLy8gbmF0aXZlIGNvZGUKLSAgICBzZXREYXRhUG9zaXRpb24oZGF0YVBvc2l0aW9uKCkgKyBoZWFkZXJfc2l6ZSk7Ci0gICAgLy8gQW5kIGZhdCByZXNwb25zZSBoZWFkZXJzIGFyZSBjdXJyZW50bHkgb25seSB1c2VkIHdoZW4gdGhlcmUgYXJlIG5vCi0gICAgLy8gZXhjZXB0aW9ucywgc28gcmV0dXJuIG5vIGVycm9yOgotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBleGNlcHRpb25fY29kZTsKLX0KLQotbmF0aXZlX2hhbmRsZSogUGFyY2VsOjpyZWFkTmF0aXZlSGFuZGxlKCkgY29uc3QKLXsKLSAgICBpbnQgbnVtRmRzLCBudW1JbnRzOwotICAgIHN0YXR1c190IGVycjsKLSAgICBlcnIgPSByZWFkSW50MzIoJm51bUZkcyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgcmV0dXJuIDA7Ci0gICAgZXJyID0gcmVhZEludDMyKCZudW1JbnRzKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSByZXR1cm4gMDsKLQotICAgIG5hdGl2ZV9oYW5kbGUqIGggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShudW1GZHMsIG51bUludHMpOwotICAgIGZvciAoaW50IGk9MCA7IGVycj09Tk9fRVJST1IgJiYgaTxudW1GZHMgOyBpKyspIHsKLSAgICAgICAgaC0+ZGF0YVtpXSA9IGR1cChyZWFkRmlsZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChoLT5kYXRhW2ldIDwgMCkgZXJyID0gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBlcnIgPSByZWFkKGgtPmRhdGEgKyBudW1GZHMsIHNpemVvZihpbnQpKm51bUludHMpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaCk7Ci0gICAgICAgIGggPSAwOwotICAgIH0KLSAgICByZXR1cm4gaDsKLX0KLQotCi1pbnQgUGFyY2VsOjpyZWFkRmlsZURlc2NyaXB0b3IoKSBjb25zdAotewotICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCogZmxhdCA9IHJlYWRPYmplY3QodHJ1ZSk7Ci0gICAgaWYgKGZsYXQpIHsKLSAgICAgICAgc3dpdGNoIChmbGF0LT50eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEJJTkRFUl9UWVBFX0ZEOgotICAgICAgICAgICAgICAgIC8vQUxPR0koIlJldHVybmluZyBmaWxlIGRlc2NyaXB0b3IgJWxkIGZyb20gcGFyY2VsICVwXG4iLCBmbGF0LT5oYW5kbGUsIHRoaXMpOwotICAgICAgICAgICAgICAgIHJldHVybiBmbGF0LT5oYW5kbGU7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICByZXR1cm4gQkFEX1RZUEU7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6cmVhZEJsb2Ioc2l6ZV90IGxlbiwgUmVhZGFibGVCbG9iKiBvdXRCbG9iKSBjb25zdAotewotICAgIGludDMyX3QgdXNlQXNobWVtOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHJlYWRJbnQzMigmdXNlQXNobWVtKTsKLSAgICBpZiAoc3RhdHVzKSByZXR1cm4gc3RhdHVzOwotCi0gICAgaWYgKCF1c2VBc2htZW0pIHsKLSAgICAgICAgQUxPR1YoInJlYWRCbG9iOiByZWFkIGluIHBsYWNlIik7Ci0gICAgICAgIGNvbnN0IHZvaWQqIHB0ciA9IHJlYWRJbnBsYWNlKGxlbik7Ci0gICAgICAgIGlmICghcHRyKSByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgICAgIG91dEJsb2ItPmluaXQoZmFsc2UgLyptYXBwZWQqLywgY29uc3RfY2FzdDx2b2lkKj4ocHRyKSwgbGVuKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIEFMT0dWKCJyZWFkQmxvYjogcmVhZCBmcm9tIGFzaG1lbSIpOwotICAgIGludCBmZCA9IHJlYWRGaWxlRGVzY3JpcHRvcigpOwotICAgIGlmIChmZCA9PSBpbnQoQkFEX1RZUEUpKSByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgdm9pZCogcHRyID0gOjptbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7Ci0gICAgaWYgKCFwdHIpIHJldHVybiBOT19NRU1PUlk7Ci0KLSAgICBvdXRCbG9iLT5pbml0KHRydWUgLyptYXBwZWQqLywgcHRyLCBsZW4pOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjpyZWFkKEZsYXR0ZW5hYmxlJiB2YWwpIGNvbnN0Ci17Ci0gICAgLy8gc2l6ZQotICAgIGNvbnN0IHNpemVfdCBsZW4gPSB0aGlzLT5yZWFkSW50MzIoKTsKLSAgICBjb25zdCBzaXplX3QgZmRfY291bnQgPSB0aGlzLT5yZWFkSW50MzIoKTsKLQotICAgIC8vIHBheWxvYWQKLSAgICB2b2lkIGNvbnN0KiBidWYgPSB0aGlzLT5yZWFkSW5wbGFjZShQQURfU0laRShsZW4pKTsKLSAgICBpZiAoYnVmID09IE5VTEwpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBpbnQqIGZkcyA9IE5VTEw7Ci0gICAgaWYgKGZkX2NvdW50KSB7Ci0gICAgICAgIGZkcyA9IG5ldyBpbnRbZmRfY291bnRdOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8ZmRfY291bnQgJiYgZXJyPT1OT19FUlJPUiA7IGkrKykgewotICAgICAgICBmZHNbaV0gPSBkdXAodGhpcy0+cmVhZEZpbGVEZXNjcmlwdG9yKCkpOwotICAgICAgICBpZiAoZmRzW2ldIDwgMCkgZXJyID0gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgZXJyID0gdmFsLnVuZmxhdHRlbihidWYsIGxlbiwgZmRzLCBmZF9jb3VudCk7Ci0gICAgfQotCi0gICAgaWYgKGZkX2NvdW50KSB7Ci0gICAgICAgIGRlbGV0ZSBbXSBmZHM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLWNvbnN0IGZsYXRfYmluZGVyX29iamVjdCogUGFyY2VsOjpyZWFkT2JqZWN0KGJvb2wgbnVsbE1ldGFEYXRhKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBEUE9TID0gbURhdGFQb3M7Ci0gICAgaWYgKChEUE9TK3NpemVvZihmbGF0X2JpbmRlcl9vYmplY3QpKSA8PSBtRGF0YVNpemUpIHsKLSAgICAgICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0KiBvYmoKLSAgICAgICAgICAgICAgICA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0Kj4obURhdGErRFBPUyk7Ci0gICAgICAgIG1EYXRhUG9zID0gRFBPUyArIHNpemVvZihmbGF0X2JpbmRlcl9vYmplY3QpOwotICAgICAgICBpZiAoIW51bGxNZXRhRGF0YSAmJiAob2JqLT5jb29raWUgPT0gTlVMTCAmJiBvYmotPmJpbmRlciA9PSBOVUxMKSkgewotICAgICAgICAgICAgLy8gV2hlbiB0cmFuc2ZlcnJpbmcgYSBOVUxMIG9iamVjdCwgd2UgZG9uJ3Qgd3JpdGUgaXQgaW50bwotICAgICAgICAgICAgLy8gdGhlIG9iamVjdCBsaXN0LCBzbyB3ZSBkb24ndCB3YW50IHRvIGNoZWNrIGZvciBpdCB3aGVuCi0gICAgICAgICAgICAvLyByZWFkaW5nLgotICAgICAgICAgICAgQUxPR1YoInJlYWRPYmplY3QgU2V0dGluZyBkYXRhIHBvcyBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFQb3MpOwotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhpcyBvYmplY3QgaXMgdmFsaWQuLi4KLSAgICAgICAgc2l6ZV90KiBjb25zdCBPQkpTID0gbU9iamVjdHM7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBOID0gbU9iamVjdHNTaXplOwotICAgICAgICBzaXplX3Qgb3BvcyA9IG1OZXh0T2JqZWN0SGludDsKLSAgICAgICAgCi0gICAgICAgIGlmIChOID4gMCkgewotICAgICAgICAgICAgQUxPR1YoIlBhcmNlbCAlcCBsb29raW5nIGZvciBvYmogYXQgJWQsIGhpbnQ9JWRcbiIsCi0gICAgICAgICAgICAgICAgIHRoaXMsIERQT1MsIG9wb3MpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBTdGFydCBhdCB0aGUgY3VycmVudCBoaW50IHBvc2l0aW9uLCBsb29raW5nIGZvciBhbiBvYmplY3QgYXQKLSAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IGRhdGEgcG9zaXRpb24uCi0gICAgICAgICAgICBpZiAob3BvcyA8IE4pIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAob3BvcyA8IChOLTEpICYmIE9CSlNbb3Bvc10gPCBEUE9TKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wb3MrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9wb3MgPSBOLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoT0JKU1tvcG9zXSA9PSBEUE9TKSB7Ci0gICAgICAgICAgICAgICAgLy8gRm91bmQgaXQhCi0gICAgICAgICAgICAgICAgQUxPR1YoIlBhcmNlbCBmb3VuZCBvYmogJWQgYXQgaW5kZXggJWQgd2l0aCBmb3J3YXJkIHNlYXJjaCIsCi0gICAgICAgICAgICAgICAgICAgICB0aGlzLCBEUE9TLCBvcG9zKTsKLSAgICAgICAgICAgICAgICBtTmV4dE9iamVjdEhpbnQgPSBvcG9zKzE7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJlYWRPYmplY3QgU2V0dGluZyBkYXRhIHBvcyBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFQb3MpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAgICAgLy8gTG9vayBiYWNrd2FyZHMgZm9yIGl0Li4uCi0gICAgICAgICAgICB3aGlsZSAob3BvcyA+IDAgJiYgT0JKU1tvcG9zXSA+IERQT1MpIHsKLSAgICAgICAgICAgICAgICBvcG9zLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoT0JKU1tvcG9zXSA9PSBEUE9TKSB7Ci0gICAgICAgICAgICAgICAgLy8gRm91bmQgaXQhCi0gICAgICAgICAgICAgICAgQUxPR1YoIlBhcmNlbCBmb3VuZCBvYmogJWQgYXQgaW5kZXggJWQgd2l0aCBiYWNrd2FyZCBzZWFyY2giLAotICAgICAgICAgICAgICAgICAgICAgdGhpcywgRFBPUywgb3Bvcyk7Ci0gICAgICAgICAgICAgICAgbU5leHRPYmplY3RIaW50ID0gb3BvcysxOwotICAgICAgICAgICAgICAgIEFMT0dWKCJyZWFkT2JqZWN0IFNldHRpbmcgZGF0YSBwb3Mgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhUG9zKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFMT0dXKCJBdHRlbXB0IHRvIHJlYWQgb2JqZWN0IGZyb20gUGFyY2VsICVwIGF0IG9mZnNldCAlZCB0aGF0IGlzIG5vdCBpbiB0aGUgb2JqZWN0IGxpc3QiLAotICAgICAgICAgICAgIHRoaXMsIERQT1MpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQYXJjZWw6OmNsb3NlRmlsZURlc2NyaXB0b3JzKCkKLXsKLSAgICBzaXplX3QgaSA9IG1PYmplY3RzU2l6ZTsKLSAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgLy9BTE9HSSgiQ2xvc2luZyBmaWxlIGRlc2NyaXB0b3JzIGZvciAlZCBvYmplY3RzLi4uIiwgbU9iamVjdHNTaXplKTsKLSAgICB9Ci0gICAgd2hpbGUgKGkgPiAwKSB7Ci0gICAgICAgIGktLTsKLSAgICAgICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0KiBmbGF0Ci0gICAgICAgICAgICA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxhdF9iaW5kZXJfb2JqZWN0Kj4obURhdGErbU9iamVjdHNbaV0pOwotICAgICAgICBpZiAoZmxhdC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9GRCkgewotICAgICAgICAgICAgLy9BTE9HSSgiQ2xvc2luZyBmZDogJWxkXG4iLCBmbGF0LT5oYW5kbGUpOwotICAgICAgICAgICAgY2xvc2UoZmxhdC0+aGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotY29uc3QgdWludDhfdCogUGFyY2VsOjppcGNEYXRhKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbURhdGE7Ci19Ci0KLXNpemVfdCBQYXJjZWw6OmlwY0RhdGFTaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKG1EYXRhU2l6ZSA+IG1EYXRhUG9zID8gbURhdGFTaXplIDogbURhdGFQb3MpOwotfQotCi1jb25zdCBzaXplX3QqIFBhcmNlbDo6aXBjT2JqZWN0cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1PYmplY3RzOwotfQotCi1zaXplX3QgUGFyY2VsOjppcGNPYmplY3RzQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiBtT2JqZWN0c1NpemU7Ci19Ci0KLXZvaWQgUGFyY2VsOjppcGNTZXREYXRhUmVmZXJlbmNlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwKLSAgICBjb25zdCBzaXplX3QqIG9iamVjdHMsIHNpemVfdCBvYmplY3RzQ291bnQsIHJlbGVhc2VfZnVuYyByZWxGdW5jLCB2b2lkKiByZWxDb29raWUpCi17Ci0gICAgZnJlZURhdGFOb0luaXQoKTsKLSAgICBtRXJyb3IgPSBOT19FUlJPUjsKLSAgICBtRGF0YSA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KGRhdGEpOwotICAgIG1EYXRhU2l6ZSA9IG1EYXRhQ2FwYWNpdHkgPSBkYXRhU2l6ZTsKLSAgICAvL0FMT0dJKCJzZXREYXRhUmVmZXJlbmNlIFNldHRpbmcgZGF0YSBzaXplIG9mICVwIHRvICVsdSAocGlkPSVkKVxuIiwgdGhpcywgbURhdGFTaXplLCBnZXRwaWQoKSk7Ci0gICAgbURhdGFQb3MgPSAwOwotICAgIEFMT0dWKCJzZXREYXRhUmVmZXJlbmNlIFNldHRpbmcgZGF0YSBwb3Mgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhUG9zKTsKLSAgICBtT2JqZWN0cyA9IGNvbnN0X2Nhc3Q8c2l6ZV90Kj4ob2JqZWN0cyk7Ci0gICAgbU9iamVjdHNTaXplID0gbU9iamVjdHNDYXBhY2l0eSA9IG9iamVjdHNDb3VudDsKLSAgICBtTmV4dE9iamVjdEhpbnQgPSAwOwotICAgIG1Pd25lciA9IHJlbEZ1bmM7Ci0gICAgbU93bmVyQ29va2llID0gcmVsQ29va2llOwotICAgIHNjYW5Gb3JGZHMoKTsKLX0KLQotdm9pZCBQYXJjZWw6OnByaW50KFRleHRPdXRwdXQmIHRvLCB1aW50MzJfdCBmbGFncykgY29uc3QKLXsKLSAgICB0byA8PCAiUGFyY2VsKCI7Ci0gICAgCi0gICAgaWYgKGVycm9yQ2hlY2soKSAhPSBOT19FUlJPUikgewotICAgICAgICBjb25zdCBzdGF0dXNfdCBlcnIgPSBlcnJvckNoZWNrKCk7Ci0gICAgICAgIHRvIDw8ICJFcnJvcjogIiA8PCAodm9pZCopZXJyIDw8ICIgXCIiIDw8IHN0cmVycm9yKC1lcnIpIDw8ICJcIiI7Ci0gICAgfSBlbHNlIGlmIChkYXRhU2l6ZSgpID4gMCkgewotICAgICAgICBjb25zdCB1aW50OF90KiBEQVRBID0gZGF0YSgpOwotICAgICAgICB0byA8PCBpbmRlbnQgPDwgSGV4RHVtcChEQVRBLCBkYXRhU2l6ZSgpKSA8PCBkZWRlbnQ7Ci0gICAgICAgIGNvbnN0IHNpemVfdCogT0JKUyA9IG9iamVjdHMoKTsKLSAgICAgICAgY29uc3Qgc2l6ZV90IE4gPSBvYmplY3RzQ291bnQoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0KiBmbGF0Ci0gICAgICAgICAgICAgICAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCo+KERBVEErT0JKU1tpXSk7Ci0gICAgICAgICAgICB0byA8PCBlbmRsIDw8ICJPYmplY3QgIyIgPDwgaSA8PCAiIEAgIiA8PCAodm9pZCopT0JKU1tpXSA8PCAiOiAiCi0gICAgICAgICAgICAgICAgPDwgVHlwZUNvZGUoZmxhdC0+dHlwZSAmIDB4N2Y3ZjdmMDApCi0gICAgICAgICAgICAgICAgPDwgIiA9ICIgPDwgZmxhdC0+YmluZGVyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdG8gPDwgIk5VTEwiOwotICAgIH0KLSAgICAKLSAgICB0byA8PCAiKSI7Ci19Ci0KLXZvaWQgUGFyY2VsOjpyZWxlYXNlT2JqZWN0cygpCi17Ci0gICAgY29uc3Qgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKLSAgICBzaXplX3QgaSA9IG1PYmplY3RzU2l6ZTsKLSAgICB1aW50OF90KiBjb25zdCBkYXRhID0gbURhdGE7Ci0gICAgc2l6ZV90KiBjb25zdCBvYmplY3RzID0gbU9iamVjdHM7Ci0gICAgd2hpbGUgKGkgPiAwKSB7Ci0gICAgICAgIGktLTsKLSAgICAgICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0KiBmbGF0Ci0gICAgICAgICAgICA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxhdF9iaW5kZXJfb2JqZWN0Kj4oZGF0YStvYmplY3RzW2ldKTsKLSAgICAgICAgcmVsZWFzZV9vYmplY3QocHJvYywgKmZsYXQsIHRoaXMpOwotICAgIH0KLX0KLQotdm9pZCBQYXJjZWw6OmFjcXVpcmVPYmplY3RzKCkKLXsKLSAgICBjb25zdCBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwotICAgIHNpemVfdCBpID0gbU9iamVjdHNTaXplOwotICAgIHVpbnQ4X3QqIGNvbnN0IGRhdGEgPSBtRGF0YTsKLSAgICBzaXplX3QqIGNvbnN0IG9iamVjdHMgPSBtT2JqZWN0czsKLSAgICB3aGlsZSAoaSA+IDApIHsKLSAgICAgICAgaS0tOwotICAgICAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QqIGZsYXQKLSAgICAgICAgICAgID0gcmVpbnRlcnByZXRfY2FzdDxmbGF0X2JpbmRlcl9vYmplY3QqPihkYXRhK29iamVjdHNbaV0pOwotICAgICAgICBhY3F1aXJlX29iamVjdChwcm9jLCAqZmxhdCwgdGhpcyk7Ci0gICAgfQotfQotCi12b2lkIFBhcmNlbDo6ZnJlZURhdGEoKQotewotICAgIGZyZWVEYXRhTm9Jbml0KCk7Ci0gICAgaW5pdFN0YXRlKCk7Ci19Ci0KLXZvaWQgUGFyY2VsOjpmcmVlRGF0YU5vSW5pdCgpCi17Ci0gICAgaWYgKG1Pd25lcikgewotICAgICAgICAvL0FMT0dJKCJGcmVlaW5nIGRhdGEgcmVmIG9mICVwIChwaWQ9JWQpXG4iLCB0aGlzLCBnZXRwaWQoKSk7Ci0gICAgICAgIG1Pd25lcih0aGlzLCBtRGF0YSwgbURhdGFTaXplLCBtT2JqZWN0cywgbU9iamVjdHNTaXplLCBtT3duZXJDb29raWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbGVhc2VPYmplY3RzKCk7Ci0gICAgICAgIGlmIChtRGF0YSkgZnJlZShtRGF0YSk7Ci0gICAgICAgIGlmIChtT2JqZWN0cykgZnJlZShtT2JqZWN0cyk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQYXJjZWw6Omdyb3dEYXRhKHNpemVfdCBsZW4pCi17Ci0gICAgc2l6ZV90IG5ld1NpemUgPSAoKG1EYXRhU2l6ZStsZW4pKjMpLzI7Ci0gICAgcmV0dXJuIChuZXdTaXplIDw9IG1EYXRhU2l6ZSkKLSAgICAgICAgICAgID8gKHN0YXR1c190KSBOT19NRU1PUlkKLSAgICAgICAgICAgIDogY29udGludWVXcml0ZShuZXdTaXplKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjpyZXN0YXJ0V3JpdGUoc2l6ZV90IGRlc2lyZWQpCi17Ci0gICAgaWYgKG1Pd25lcikgewotICAgICAgICBmcmVlRGF0YSgpOwotICAgICAgICByZXR1cm4gY29udGludWVXcml0ZShkZXNpcmVkKTsKLSAgICB9Ci0gICAgCi0gICAgdWludDhfdCogZGF0YSA9ICh1aW50OF90KilyZWFsbG9jKG1EYXRhLCBkZXNpcmVkKTsKLSAgICBpZiAoIWRhdGEgJiYgZGVzaXJlZCA+IG1EYXRhQ2FwYWNpdHkpIHsKLSAgICAgICAgbUVycm9yID0gTk9fTUVNT1JZOwotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICAKLSAgICByZWxlYXNlT2JqZWN0cygpOwotICAgIAotICAgIGlmIChkYXRhKSB7Ci0gICAgICAgIG1EYXRhID0gZGF0YTsKLSAgICAgICAgbURhdGFDYXBhY2l0eSA9IGRlc2lyZWQ7Ci0gICAgfQotICAgIAotICAgIG1EYXRhU2l6ZSA9IG1EYXRhUG9zID0gMDsKLSAgICBBTE9HVigicmVzdGFydFdyaXRlIFNldHRpbmcgZGF0YSBzaXplIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVNpemUpOwotICAgIEFMT0dWKCJyZXN0YXJ0V3JpdGUgU2V0dGluZyBkYXRhIHBvcyBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFQb3MpOwotICAgICAgICAKLSAgICBmcmVlKG1PYmplY3RzKTsKLSAgICBtT2JqZWN0cyA9IE5VTEw7Ci0gICAgbU9iamVjdHNTaXplID0gbU9iamVjdHNDYXBhY2l0eSA9IDA7Ci0gICAgbU5leHRPYmplY3RIaW50ID0gMDsKLSAgICBtSGFzRmRzID0gZmFsc2U7Ci0gICAgbUZkc0tub3duID0gdHJ1ZTsKLSAgICBtQWxsb3dGZHMgPSB0cnVlOwotICAgIAotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjpjb250aW51ZVdyaXRlKHNpemVfdCBkZXNpcmVkKQotewotICAgIC8vIElmIHNocmlua2luZywgZmlyc3QgYWRqdXN0IGZvciBhbnkgb2JqZWN0cyB0aGF0IGFwcGVhcgotICAgIC8vIGFmdGVyIHRoZSBuZXcgZGF0YSBzaXplLgotICAgIHNpemVfdCBvYmplY3RzU2l6ZSA9IG1PYmplY3RzU2l6ZTsKLSAgICBpZiAoZGVzaXJlZCA8IG1EYXRhU2l6ZSkgewotICAgICAgICBpZiAoZGVzaXJlZCA9PSAwKSB7Ci0gICAgICAgICAgICBvYmplY3RzU2l6ZSA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3aGlsZSAob2JqZWN0c1NpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1PYmplY3RzW29iamVjdHNTaXplLTFdIDwgZGVzaXJlZCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgb2JqZWN0c1NpemUtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAobU93bmVyKSB7Ci0gICAgICAgIC8vIElmIHRoZSBzaXplIGlzIGdvaW5nIHRvIHplcm8sIGp1c3QgcmVsZWFzZSB0aGUgb3duZXIncyBkYXRhLgotICAgICAgICBpZiAoZGVzaXJlZCA9PSAwKSB7Ci0gICAgICAgICAgICBmcmVlRGF0YSgpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBkaWZmZXJlbnQgb3duZXIsIHdlIG5lZWQgdG8gdGFrZQotICAgICAgICAvLyBwb3Nlc3Npb24uCi0gICAgICAgIHVpbnQ4X3QqIGRhdGEgPSAodWludDhfdCopbWFsbG9jKGRlc2lyZWQpOwotICAgICAgICBpZiAoIWRhdGEpIHsKLSAgICAgICAgICAgIG1FcnJvciA9IE5PX01FTU9SWTsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZV90KiBvYmplY3RzID0gTlVMTDsKLSAgICAgICAgCi0gICAgICAgIGlmIChvYmplY3RzU2l6ZSkgewotICAgICAgICAgICAgb2JqZWN0cyA9IChzaXplX3QqKW1hbGxvYyhvYmplY3RzU2l6ZSpzaXplb2Yoc2l6ZV90KSk7Ci0gICAgICAgICAgICBpZiAoIW9iamVjdHMpIHsKLSAgICAgICAgICAgICAgICBtRXJyb3IgPSBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTGl0dGxlIGhhY2sgdG8gb25seSBhY3F1aXJlIHJlZmVyZW5jZXMgb24gb2JqZWN0cwotICAgICAgICAgICAgLy8gd2Ugd2lsbCBiZSBrZWVwaW5nLgotICAgICAgICAgICAgc2l6ZV90IG9sZE9iamVjdHNTaXplID0gbU9iamVjdHNTaXplOwotICAgICAgICAgICAgbU9iamVjdHNTaXplID0gb2JqZWN0c1NpemU7Ci0gICAgICAgICAgICBhY3F1aXJlT2JqZWN0cygpOwotICAgICAgICAgICAgbU9iamVjdHNTaXplID0gb2xkT2JqZWN0c1NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtRGF0YSkgewotICAgICAgICAgICAgbWVtY3B5KGRhdGEsIG1EYXRhLCBtRGF0YVNpemUgPCBkZXNpcmVkID8gbURhdGFTaXplIDogZGVzaXJlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iamVjdHMgJiYgbU9iamVjdHMpIHsKLSAgICAgICAgICAgIG1lbWNweShvYmplY3RzLCBtT2JqZWN0cywgb2JqZWN0c1NpemUqc2l6ZW9mKHNpemVfdCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vQUxPR0koIkZyZWVpbmcgZGF0YSByZWYgb2YgJXAgKHBpZD0lZClcbiIsIHRoaXMsIGdldHBpZCgpKTsKLSAgICAgICAgbU93bmVyKHRoaXMsIG1EYXRhLCBtRGF0YVNpemUsIG1PYmplY3RzLCBtT2JqZWN0c1NpemUsIG1Pd25lckNvb2tpZSk7Ci0gICAgICAgIG1Pd25lciA9IE5VTEw7Ci0KLSAgICAgICAgbURhdGEgPSBkYXRhOwotICAgICAgICBtT2JqZWN0cyA9IG9iamVjdHM7Ci0gICAgICAgIG1EYXRhU2l6ZSA9IChtRGF0YVNpemUgPCBkZXNpcmVkKSA/IG1EYXRhU2l6ZSA6IGRlc2lyZWQ7Ci0gICAgICAgIEFMT0dWKCJjb250aW51ZVdyaXRlIFNldHRpbmcgZGF0YSBzaXplIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVNpemUpOwotICAgICAgICBtRGF0YUNhcGFjaXR5ID0gZGVzaXJlZDsKLSAgICAgICAgbU9iamVjdHNTaXplID0gbU9iamVjdHNDYXBhY2l0eSA9IG9iamVjdHNTaXplOwotICAgICAgICBtTmV4dE9iamVjdEhpbnQgPSAwOwotCi0gICAgfSBlbHNlIGlmIChtRGF0YSkgewotICAgICAgICBpZiAob2JqZWN0c1NpemUgPCBtT2JqZWN0c1NpemUpIHsKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gcmVsZWFzZSByZWZzIG9uIGFueSBvYmplY3RzIHdlIGFyZSBkcm9wcGluZy4KLSAgICAgICAgICAgIGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpPW9iamVjdHNTaXplOyBpPG1PYmplY3RzU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0KiBmbGF0Ci0gICAgICAgICAgICAgICAgICAgID0gcmVpbnRlcnByZXRfY2FzdDxmbGF0X2JpbmRlcl9vYmplY3QqPihtRGF0YSttT2JqZWN0c1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZsYXQtPnR5cGUgPT0gQklOREVSX1RZUEVfRkQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBuZWVkIHRvIHJlc2NhbiBiZWNhdXNlIHdlIG1heSBoYXZlIGxvcHBlZCBvZmYgdGhlIG9ubHkgRkRzCi0gICAgICAgICAgICAgICAgICAgIG1GZHNLbm93biA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWxlYXNlX29iamVjdChwcm9jLCAqZmxhdCwgdGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaXplX3QqIG9iamVjdHMgPQotICAgICAgICAgICAgICAgIChzaXplX3QqKXJlYWxsb2MobU9iamVjdHMsIG9iamVjdHNTaXplKnNpemVvZihzaXplX3QpKTsKLSAgICAgICAgICAgIGlmIChvYmplY3RzKSB7Ci0gICAgICAgICAgICAgICAgbU9iamVjdHMgPSBvYmplY3RzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU9iamVjdHNTaXplID0gb2JqZWN0c1NpemU7Ci0gICAgICAgICAgICBtTmV4dE9iamVjdEhpbnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2Ugb3duIHRoZSBkYXRhLCBzbyB3ZSBjYW4ganVzdCBkbyBhIHJlYWxsb2MoKS4KLSAgICAgICAgaWYgKGRlc2lyZWQgPiBtRGF0YUNhcGFjaXR5KSB7Ci0gICAgICAgICAgICB1aW50OF90KiBkYXRhID0gKHVpbnQ4X3QqKXJlYWxsb2MobURhdGEsIGRlc2lyZWQpOwotICAgICAgICAgICAgaWYgKGRhdGEpIHsKLSAgICAgICAgICAgICAgICBtRGF0YSA9IGRhdGE7Ci0gICAgICAgICAgICAgICAgbURhdGFDYXBhY2l0eSA9IGRlc2lyZWQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2lyZWQgPiBtRGF0YUNhcGFjaXR5KSB7Ci0gICAgICAgICAgICAgICAgbUVycm9yID0gTk9fTUVNT1JZOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobURhdGFTaXplID4gZGVzaXJlZCkgewotICAgICAgICAgICAgICAgIG1EYXRhU2l6ZSA9IGRlc2lyZWQ7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNvbnRpbnVlV3JpdGUgU2V0dGluZyBkYXRhIHNpemUgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobURhdGFQb3MgPiBkZXNpcmVkKSB7Ci0gICAgICAgICAgICAgICAgbURhdGFQb3MgPSBkZXNpcmVkOwotICAgICAgICAgICAgICAgIEFMT0dWKCJjb250aW51ZVdyaXRlIFNldHRpbmcgZGF0YSBwb3Mgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhUG9zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBkYXRhLiAgRWFzeSEKLSAgICAgICAgdWludDhfdCogZGF0YSA9ICh1aW50OF90KiltYWxsb2MoZGVzaXJlZCk7Ci0gICAgICAgIGlmICghZGF0YSkgewotICAgICAgICAgICAgbUVycm9yID0gTk9fTUVNT1JZOwotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIShtRGF0YUNhcGFjaXR5ID09IDAgJiYgbU9iamVjdHMgPT0gTlVMTAotICAgICAgICAgICAgICYmIG1PYmplY3RzQ2FwYWNpdHkgPT0gMCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjb250aW51ZVdyaXRlOiAlZC8lcC8lZC8lZCIsIG1EYXRhQ2FwYWNpdHksIG1PYmplY3RzLCBtT2JqZWN0c0NhcGFjaXR5LCBkZXNpcmVkKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbURhdGEgPSBkYXRhOwotICAgICAgICBtRGF0YVNpemUgPSBtRGF0YVBvcyA9IDA7Ci0gICAgICAgIEFMT0dWKCJjb250aW51ZVdyaXRlIFNldHRpbmcgZGF0YSBzaXplIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVNpemUpOwotICAgICAgICBBTE9HVigiY29udGludWVXcml0ZSBTZXR0aW5nIGRhdGEgcG9zIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVBvcyk7Ci0gICAgICAgIG1EYXRhQ2FwYWNpdHkgPSBkZXNpcmVkOwotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBQYXJjZWw6OmluaXRTdGF0ZSgpCi17Ci0gICAgbUVycm9yID0gTk9fRVJST1I7Ci0gICAgbURhdGEgPSAwOwotICAgIG1EYXRhU2l6ZSA9IDA7Ci0gICAgbURhdGFDYXBhY2l0eSA9IDA7Ci0gICAgbURhdGFQb3MgPSAwOwotICAgIEFMT0dWKCJpbml0U3RhdGUgU2V0dGluZyBkYXRhIHNpemUgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhU2l6ZSk7Ci0gICAgQUxPR1YoImluaXRTdGF0ZSBTZXR0aW5nIGRhdGEgcG9zIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVBvcyk7Ci0gICAgbU9iamVjdHMgPSBOVUxMOwotICAgIG1PYmplY3RzU2l6ZSA9IDA7Ci0gICAgbU9iamVjdHNDYXBhY2l0eSA9IDA7Ci0gICAgbU5leHRPYmplY3RIaW50ID0gMDsKLSAgICBtSGFzRmRzID0gZmFsc2U7Ci0gICAgbUZkc0tub3duID0gdHJ1ZTsKLSAgICBtQWxsb3dGZHMgPSB0cnVlOwotICAgIG1Pd25lciA9IE5VTEw7Ci19Ci0KLXZvaWQgUGFyY2VsOjpzY2FuRm9yRmRzKCkgY29uc3QKLXsKLSAgICBib29sIGhhc0ZkcyA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGk9MDsgaTxtT2JqZWN0c1NpemU7IGkrKykgewotICAgICAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QqIGZsYXQKLSAgICAgICAgICAgID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QqPihtRGF0YSArIG1PYmplY3RzW2ldKTsKLSAgICAgICAgaWYgKGZsYXQtPnR5cGUgPT0gQklOREVSX1RZUEVfRkQpIHsKLSAgICAgICAgICAgIGhhc0ZkcyA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBtSGFzRmRzID0gaGFzRmRzOwotICAgIG1GZHNLbm93biA9IHRydWU7Ci19Ci0KLS8vIC0tLSBQYXJjZWw6OkJsb2IgLS0tCi0KLVBhcmNlbDo6QmxvYjo6QmxvYigpIDoKLSAgICAgICAgbU1hcHBlZChmYWxzZSksIG1EYXRhKE5VTEwpLCBtU2l6ZSgwKSB7Ci19Ci0KLVBhcmNlbDo6QmxvYjo6fkJsb2IoKSB7Ci0gICAgcmVsZWFzZSgpOwotfQotCi12b2lkIFBhcmNlbDo6QmxvYjo6cmVsZWFzZSgpIHsKLSAgICBpZiAobU1hcHBlZCAmJiBtRGF0YSkgewotICAgICAgICA6Om11bm1hcChtRGF0YSwgbVNpemUpOwotICAgIH0KLSAgICBjbGVhcigpOwotfQotCi12b2lkIFBhcmNlbDo6QmxvYjo6aW5pdChib29sIG1hcHBlZCwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBtTWFwcGVkID0gbWFwcGVkOwotICAgIG1EYXRhID0gZGF0YTsKLSAgICBtU2l6ZSA9IHNpemU7Ci19Ci0KLXZvaWQgUGFyY2VsOjpCbG9iOjpjbGVhcigpIHsKLSAgICBtTWFwcGVkID0gZmFsc2U7Ci0gICAgbURhdGEgPSBOVUxMOwotICAgIG1TaXplID0gMDsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL1Blcm1pc3Npb25DYWNoZS5jcHAgYi9saWJzL2JpbmRlci9QZXJtaXNzaW9uQ2FjaGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTAzYmU4Li4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL1Blcm1pc3Npb25DYWNoZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUGVybWlzc2lvbkNhY2hlIgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoUGVybWlzc2lvbkNhY2hlKSA7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUGVybWlzc2lvbkNhY2hlOjpQZXJtaXNzaW9uQ2FjaGUoKSB7Ci19Ci0KLXN0YXR1c190IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2soYm9vbCogZ3JhbnRlZCwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24sIHVpZF90IHVpZCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgRW50cnkgZTsKLSAgICBlLm5hbWUgPSBwZXJtaXNzaW9uOwotICAgIGUudWlkICA9IHVpZDsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2YoZSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgKmdyYW50ZWQgPSBtQ2FjaGUuaXRlbUF0KGluZGV4KS5ncmFudGVkOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKLX0KLQotdm9pZCBQZXJtaXNzaW9uQ2FjaGU6OmNhY2hlKGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uLAotICAgICAgICB1aWRfdCB1aWQsIGJvb2wgZ3JhbnRlZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgRW50cnkgZTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbVBlcm1pc3Npb25OYW1lc1Bvb2wuaW5kZXhPZihwZXJtaXNzaW9uKTsKLSAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgIGUubmFtZSA9IG1QZXJtaXNzaW9uTmFtZXNQb29sLml0ZW1BdChpbmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVBlcm1pc3Npb25OYW1lc1Bvb2wuYWRkKHBlcm1pc3Npb24pOwotICAgICAgICBlLm5hbWUgPSBwZXJtaXNzaW9uOwotICAgIH0KLSAgICAvLyBub3RlLCB3ZSBkb24ndCBuZWVkIHRvIHN0b3JlIHRoZSBwaWQsIHdoaWNoIGlzIG5vdCBhY3R1YWxseSB1c2VkIGluCi0gICAgLy8gcGVybWlzc2lvbiBjaGVja3MKLSAgICBlLnVpZCAgPSB1aWQ7Ci0gICAgZS5ncmFudGVkID0gZ3JhbnRlZDsKLSAgICBpbmRleCA9IG1DYWNoZS5pbmRleE9mKGUpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgbUNhY2hlLmFkZChlKTsKLSAgICB9Ci19Ci0KLXZvaWQgUGVybWlzc2lvbkNhY2hlOjpwdXJnZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1DYWNoZS5jbGVhcigpOwotfQotCi1ib29sIFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbikgewotICAgIHJldHVybiBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24ocGVybWlzc2lvbiwgTlVMTCwgTlVMTCk7Ci19Ci0KLWJvb2wgUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbiwgaW50MzJfdCogb3V0UGlkLCBpbnQzMl90KiBvdXRVaWQpIHsKLSAgICBJUENUaHJlYWRTdGF0ZSogaXBjU3RhdGUgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgIHBpZF90IHBpZCA9IGlwY1N0YXRlLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgdWlkX3QgdWlkID0gaXBjU3RhdGUtPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAob3V0UGlkKSAqb3V0UGlkID0gcGlkOwotICAgIGlmIChvdXRVaWQpICpvdXRVaWQgPSB1aWQ7Ci0gICAgcmV0dXJuIFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHBlcm1pc3Npb24sIHBpZCwgdWlkKTsKLX0KLQotYm9vbCBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbigKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24sIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgaWYgKCh1aWQgPT0gMCkgfHwgKHBpZCA9PSBnZXRwaWQoKSkpIHsKLSAgICAgICAgLy8gcm9vdCBhbmQgb3Vyc2VsdmVzIGlzIGFsd2F5cyBva2F5Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIFBlcm1pc3Npb25DYWNoZSYgcGMoUGVybWlzc2lvbkNhY2hlOjpnZXRJbnN0YW5jZSgpKTsKLSAgICBib29sIGdyYW50ZWQgPSBmYWxzZTsKLSAgICBpZiAocGMuY2hlY2soJmdyYW50ZWQsIHBlcm1pc3Npb24sIHVpZCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbnNlY3NfdCB0ID0gLXN5c3RlbVRpbWUoKTsKLSAgICAgICAgZ3JhbnRlZCA9IGFuZHJvaWQ6OmNoZWNrUGVybWlzc2lvbihwZXJtaXNzaW9uLCBwaWQsIHVpZCk7Ci0gICAgICAgIHQgKz0gc3lzdGVtVGltZSgpOwotICAgICAgICBBTE9HRCgiY2hlY2tpbmcgJXMgZm9yIHVpZD0lZCA9PiAlcyAoJWQgdXMpIiwKLSAgICAgICAgICAgICAgICBTdHJpbmc4KHBlcm1pc3Npb24pLnN0cmluZygpLCB1aWQsCi0gICAgICAgICAgICAgICAgZ3JhbnRlZD8iZ3JhbnRlZCI6ImRlbmllZCIsIChpbnQpbnMydXModCkpOwotICAgICAgICBwYy5jYWNoZShwZXJtaXNzaW9uLCB1aWQsIGdyYW50ZWQpOwotICAgIH0KLSAgICByZXR1cm4gZ3JhbnRlZDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvUHJvY2Vzc1N0YXRlLmNwcCBiL2xpYnMvYmluZGVyL1Byb2Nlc3NTdGF0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYTQxMmMuLjAwMDAwMDAKLS0tIGEvbGlicy9iaW5kZXIvUHJvY2Vzc1N0YXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJQcm9jZXNzU3RhdGUiCi0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvY2Vzc19uYW1lLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQnBCaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL2JpbmRlci9iaW5kZXJfbW9kdWxlLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9iaW5kZXIvU3RhdGljLmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNkZWZpbmUgQklOREVSX1ZNX1NJWkUgKCgxKjEwMjQqMTAyNCkgLSAoNDA5NiAqMikpCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLSAKLS8vIEdsb2JhbCB2YXJpYWJsZXMKLWludCAgICAgICAgICAgICAgICAgbUFyZ0M7Ci1jb25zdCBjaGFyKiBjb25zdCogIG1BcmdWOwotaW50ICAgICAgICAgICAgICAgICBtQXJnTGVuOwotCi1jbGFzcyBQb29sVGhyZWFkIDogcHVibGljIFRocmVhZAotewotcHVibGljOgotICAgIFBvb2xUaHJlYWQoYm9vbCBpc01haW4pCi0gICAgICAgIDogbUlzTWFpbihpc01haW4pCi0gICAgewotICAgIH0KLSAgICAKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpCi0gICAgewotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbChtSXNNYWluKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBjb25zdCBib29sIG1Jc01haW47Ci19OwotCi1zcDxQcm9jZXNzU3RhdGU+IFByb2Nlc3NTdGF0ZTo6c2VsZigpCi17Ci0gICAgaWYgKGdQcm9jZXNzICE9IE5VTEwpIHJldHVybiBnUHJvY2VzczsKLSAgICAKLSAgICBBdXRvTXV0ZXggX2woZ1Byb2Nlc3NNdXRleCk7Ci0gICAgaWYgKGdQcm9jZXNzID09IE5VTEwpIGdQcm9jZXNzID0gbmV3IFByb2Nlc3NTdGF0ZTsKLSAgICByZXR1cm4gZ1Byb2Nlc3M7Ci19Ci0KLXZvaWQgUHJvY2Vzc1N0YXRlOjpzZXRDb250ZXh0T2JqZWN0KGNvbnN0IHNwPElCaW5kZXI+JiBvYmplY3QpCi17Ci0gICAgc2V0Q29udGV4dE9iamVjdChvYmplY3QsIFN0cmluZzE2KCJkZWZhdWx0IikpOwotfQotCi1zcDxJQmluZGVyPiBQcm9jZXNzU3RhdGU6OmdldENvbnRleHRPYmplY3QoY29uc3Qgc3A8SUJpbmRlcj4mIGNhbGxlcikKLXsKLSAgICByZXR1cm4gZ2V0U3Ryb25nUHJveHlGb3JIYW5kbGUoMCk7Ci19Ci0KLXZvaWQgUHJvY2Vzc1N0YXRlOjpzZXRDb250ZXh0T2JqZWN0KGNvbnN0IHNwPElCaW5kZXI+JiBvYmplY3QsIGNvbnN0IFN0cmluZzE2JiBuYW1lKQotewotICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgbUNvbnRleHRzLmFkZChuYW1lLCBvYmplY3QpOwotfQotCi1zcDxJQmluZGVyPiBQcm9jZXNzU3RhdGU6OmdldENvbnRleHRPYmplY3QoY29uc3QgU3RyaW5nMTYmIG5hbWUsIGNvbnN0IHNwPElCaW5kZXI+JiBjYWxsZXIpCi17Ci0gICAgbUxvY2subG9jaygpOwotICAgIHNwPElCaW5kZXI+IG9iamVjdCgKLSAgICAgICAgbUNvbnRleHRzLmluZGV4T2ZLZXkobmFtZSkgPj0gMCA/IG1Db250ZXh0cy52YWx1ZUZvcihuYW1lKSA6IE5VTEwpOwotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIAotICAgIC8vcHJpbnRmKCJHZXR0aW5nIGNvbnRleHQgb2JqZWN0ICVzIGZvciAlcFxuIiwgU3RyaW5nOChuYW1lKS5zdHJpbmcoKSwgY2FsbGVyLmdldCgpKTsKLSAgICAKLSAgICBpZiAob2JqZWN0ICE9IE5VTEwpIHJldHVybiBvYmplY3Q7Ci0KLSAgICAvLyBEb24ndCBhdHRlbXB0IHRvIHJldHJpZXZlIGNvbnRleHRzIGlmIHdlIG1hbmFnZSB0aGVtCi0gICAgaWYgKG1NYW5hZ2VzQ29udGV4dHMpIHsKLSAgICAgICAgQUxPR0UoImdldENvbnRleHRPYmplY3QoJXMpIGZhaWxlZCwgYnV0IHdlIG1hbmFnZSB0aGUgY29udGV4dHMhXG4iLAotICAgICAgICAgICAgU3RyaW5nOChuYW1lKS5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAKLSAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgLy8gbm8gaW50ZXJmYWNlIHRva2VuIG9uIHRoaXMgbWFnaWMgdHJhbnNhY3Rpb24KLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG5hbWUpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNhbGxlcik7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGlwYy0+dHJhbnNhY3QoMCAvKm1hZ2ljKi8sIDAsIGRhdGEsICZyZXBseSwgMCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG9iamVjdCA9IHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpcGMtPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAKLSAgICBpZiAob2JqZWN0ICE9IE5VTEwpIHNldENvbnRleHRPYmplY3Qob2JqZWN0LCBuYW1lKTsKLSAgICByZXR1cm4gb2JqZWN0OwotfQotCi12b2lkIFByb2Nlc3NTdGF0ZTo6c3RhcnRUaHJlYWRQb29sKCkKLXsKLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIGlmICghbVRocmVhZFBvb2xTdGFydGVkKSB7Ci0gICAgICAgIG1UaHJlYWRQb29sU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIHNwYXduUG9vbGVkVGhyZWFkKHRydWUpOwotICAgIH0KLX0KLQotYm9vbCBQcm9jZXNzU3RhdGU6OmlzQ29udGV4dE1hbmFnZXIodm9pZCkgY29uc3QKLXsKLSAgICByZXR1cm4gbU1hbmFnZXNDb250ZXh0czsKLX0KLQotYm9vbCBQcm9jZXNzU3RhdGU6OmJlY29tZUNvbnRleHRNYW5hZ2VyKGNvbnRleHRfY2hlY2tfZnVuYyBjaGVja0Z1bmMsIHZvaWQqIHVzZXJEYXRhKQotewotICAgIGlmICghbU1hbmFnZXNDb250ZXh0cykgewotICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgICAgICBtQmluZGVyQ29udGV4dENoZWNrRnVuYyA9IGNoZWNrRnVuYzsKLSAgICAgICAgbUJpbmRlckNvbnRleHRVc2VyRGF0YSA9IHVzZXJEYXRhOwotCi0gICAgICAgIGludCBkdW1teSA9IDA7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGlvY3RsKG1Ecml2ZXJGRCwgQklOREVSX1NFVF9DT05URVhUX01HUiwgJmR1bW15KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7Ci0gICAgICAgICAgICBtTWFuYWdlc0NvbnRleHRzID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgICAgIG1CaW5kZXJDb250ZXh0Q2hlY2tGdW5jID0gTlVMTDsKLSAgICAgICAgICAgIG1CaW5kZXJDb250ZXh0VXNlckRhdGEgPSBOVUxMOwotICAgICAgICAgICAgQUxPR0UoIkJpbmRlciBpb2N0bCB0byBiZWNvbWUgY29udGV4dCBtYW5hZ2VyIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1NYW5hZ2VzQ29udGV4dHM7Ci19Ci0KLVByb2Nlc3NTdGF0ZTo6aGFuZGxlX2VudHJ5KiBQcm9jZXNzU3RhdGU6Omxvb2t1cEhhbmRsZUxvY2tlZChpbnQzMl90IGhhbmRsZSkKLXsKLSAgICBjb25zdCBzaXplX3QgTj1tSGFuZGxlVG9PYmplY3Quc2l6ZSgpOwotICAgIGlmIChOIDw9IChzaXplX3QpaGFuZGxlKSB7Ci0gICAgICAgIGhhbmRsZV9lbnRyeSBlOwotICAgICAgICBlLmJpbmRlciA9IE5VTEw7Ci0gICAgICAgIGUucmVmcyA9IE5VTEw7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1IYW5kbGVUb09iamVjdC5pbnNlcnRBdChlLCBOLCBoYW5kbGUrMS1OKTsKLSAgICAgICAgaWYgKGVyciA8IE5PX0VSUk9SKSByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuICZtSGFuZGxlVG9PYmplY3QuZWRpdEl0ZW1BdChoYW5kbGUpOwotfQotCi1zcDxJQmluZGVyPiBQcm9jZXNzU3RhdGU6OmdldFN0cm9uZ1Byb3h5Rm9ySGFuZGxlKGludDMyX3QgaGFuZGxlKQotewotICAgIHNwPElCaW5kZXI+IHJlc3VsdDsKLQotICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0KLSAgICBoYW5kbGVfZW50cnkqIGUgPSBsb29rdXBIYW5kbGVMb2NrZWQoaGFuZGxlKTsKLQotICAgIGlmIChlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgQnBCaW5kZXIgaWYgdGhlcmUgaXNuJ3QgY3VycmVudGx5IG9uZSwgT1Igd2UKLSAgICAgICAgLy8gYXJlIHVuYWJsZSB0byBhY3F1aXJlIGEgd2VhayByZWZlcmVuY2Ugb24gdGhpcyBjdXJyZW50IG9uZS4gIFNlZSBjb21tZW50Ci0gICAgICAgIC8vIGluIGdldFdlYWtQcm94eUZvckhhbmRsZSgpIGZvciBtb3JlIGluZm8gYWJvdXQgdGhpcy4KLSAgICAgICAgSUJpbmRlciogYiA9IGUtPmJpbmRlcjsKLSAgICAgICAgaWYgKGIgPT0gTlVMTCB8fCAhZS0+cmVmcy0+YXR0ZW1wdEluY1dlYWsodGhpcykpIHsKLSAgICAgICAgICAgIGIgPSBuZXcgQnBCaW5kZXIoaGFuZGxlKTsgCi0gICAgICAgICAgICBlLT5iaW5kZXIgPSBiOwotICAgICAgICAgICAgaWYgKGIpIGUtPnJlZnMgPSBiLT5nZXRXZWFrUmVmcygpOwotICAgICAgICAgICAgcmVzdWx0ID0gYjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoaXMgbGl0dGxlIGJpdCBvZiBuYXN0eW5lc3MgaXMgdG8gYWxsb3cgdXMgdG8gYWRkIGEgcHJpbWFyeQotICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSByZW1vdGUgcHJveHkgd2hlbiB0aGlzIHRlYW0gZG9lc24ndCBoYXZlIG9uZQotICAgICAgICAgICAgLy8gYnV0IGFub3RoZXIgdGVhbSBpcyBzZW5kaW5nIHRoZSBoYW5kbGUgdG8gdXMuCi0gICAgICAgICAgICByZXN1bHQuZm9yY2Vfc2V0KGIpOwotICAgICAgICAgICAgZS0+cmVmcy0+ZGVjV2Vhayh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXdwPElCaW5kZXI+IFByb2Nlc3NTdGF0ZTo6Z2V0V2Vha1Byb3h5Rm9ySGFuZGxlKGludDMyX3QgaGFuZGxlKQotewotICAgIHdwPElCaW5kZXI+IHJlc3VsdDsKLQotICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0KLSAgICBoYW5kbGVfZW50cnkqIGUgPSBsb29rdXBIYW5kbGVMb2NrZWQoaGFuZGxlKTsKLQotICAgIGlmIChlICE9IE5VTEwpIHsgICAgICAgIAotICAgICAgICAvLyBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBCcEJpbmRlciBpZiB0aGVyZSBpc24ndCBjdXJyZW50bHkgb25lLCBPUiB3ZQotICAgICAgICAvLyBhcmUgdW5hYmxlIHRvIGFjcXVpcmUgYSB3ZWFrIHJlZmVyZW5jZSBvbiB0aGlzIGN1cnJlbnQgb25lLiAgVGhlCi0gICAgICAgIC8vIGF0dGVtcHRJbmNXZWFrKCkgaXMgc2FmZSBiZWNhdXNlIHdlIGtub3cgdGhlIEJwQmluZGVyIGRlc3RydWN0b3Igd2lsbCBhbHdheXMKLSAgICAgICAgLy8gY2FsbCBleHB1bmdlSGFuZGxlKCksIHdoaWNoIGFjcXVpcmVzIHRoZSBzYW1lIGxvY2sgd2UgYXJlIGhvbGRpbmcgbm93LgotICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gc29tZW9uZQotICAgICAgICAvLyByZWxlYXNpbmcgYSByZWZlcmVuY2Ugb24gdGhpcyBCcEJpbmRlciwgYW5kIGEgbmV3IHJlZmVyZW5jZSBvbiBpdHMgaGFuZGxlCi0gICAgICAgIC8vIGFycml2aW5nIGZyb20gdGhlIGRyaXZlci4KLSAgICAgICAgSUJpbmRlciogYiA9IGUtPmJpbmRlcjsKLSAgICAgICAgaWYgKGIgPT0gTlVMTCB8fCAhZS0+cmVmcy0+YXR0ZW1wdEluY1dlYWsodGhpcykpIHsKLSAgICAgICAgICAgIGIgPSBuZXcgQnBCaW5kZXIoaGFuZGxlKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGI7Ci0gICAgICAgICAgICBlLT5iaW5kZXIgPSBiOwotICAgICAgICAgICAgaWYgKGIpIGUtPnJlZnMgPSBiLT5nZXRXZWFrUmVmcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gYjsKLSAgICAgICAgICAgIGUtPnJlZnMtPmRlY1dlYWsodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIFByb2Nlc3NTdGF0ZTo6ZXhwdW5nZUhhbmRsZShpbnQzMl90IGhhbmRsZSwgSUJpbmRlciogYmluZGVyKQotewotICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgCi0gICAgaGFuZGxlX2VudHJ5KiBlID0gbG9va3VwSGFuZGxlTG9ja2VkKGhhbmRsZSk7Ci0KLSAgICAvLyBUaGlzIGhhbmRsZSBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVwbGFjZWQgd2l0aCBhIG5ldyBCcEJpbmRlcgotICAgIC8vIChpZiBzb21lb25lIGZhaWxlZCB0aGUgQXR0ZW1wdEluY1dlYWsoKSBhYm92ZSk7IHdlIGRvbid0IHdhbnQKLSAgICAvLyB0byBvdmVyd3JpdGUgaXQuCi0gICAgaWYgKGUgJiYgZS0+YmluZGVyID09IGJpbmRlcikgZS0+YmluZGVyID0gTlVMTDsKLX0KLQotdm9pZCBQcm9jZXNzU3RhdGU6OnNldEFyZ3MoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSkKLXsKLSAgICBtQXJnQyA9IGFyZ2M7Ci0gICAgbUFyZ1YgPSAoY29uc3QgY2hhciAqKilhcmd2OwotCi0gICAgbUFyZ0xlbiA9IDA7Ci0gICAgZm9yIChpbnQgaT0wOyBpPGFyZ2M7IGkrKykgewotICAgICAgICBtQXJnTGVuICs9IHN0cmxlbihhcmd2W2ldKSArIDE7Ci0gICAgfQotICAgIG1BcmdMZW4tLTsKLX0KLQotaW50IFByb2Nlc3NTdGF0ZTo6Z2V0QXJnQygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1BcmdDOwotfQotCi1jb25zdCBjaGFyKiBjb25zdCogUHJvY2Vzc1N0YXRlOjpnZXRBcmdWKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbUFyZ1Y7Ci19Ci0KLXZvaWQgUHJvY2Vzc1N0YXRlOjpzZXRBcmdWMChjb25zdCBjaGFyKiB0eHQpCi17Ci0gICAgaWYgKG1BcmdWICE9IE5VTEwpIHsKLSAgICAgICAgc3RybmNweSgoY2hhciopbUFyZ1ZbMF0sIHR4dCwgbUFyZ0xlbik7Ci0gICAgICAgIHNldF9wcm9jZXNzX25hbWUodHh0KTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJvY2Vzc1N0YXRlOjpzcGF3blBvb2xlZFRocmVhZChib29sIGlzTWFpbikKLXsKLSAgICBpZiAobVRocmVhZFBvb2xTdGFydGVkKSB7Ci0gICAgICAgIGludDMyX3QgcyA9IGFuZHJvaWRfYXRvbWljX2FkZCgxLCAmbVRocmVhZFBvb2xTZXEpOwotICAgICAgICBjaGFyIGJ1ZlsxNl07Ci0gICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJCaW5kZXJfJVgiLCBzKTsKLSAgICAgICAgQUxPR1YoIlNwYXduaW5nIG5ldyBwb29sZWQgdGhyZWFkLCBuYW1lPSVzXG4iLCBidWYpOwotICAgICAgICBzcDxUaHJlYWQ+IHQgPSBuZXcgUG9vbFRocmVhZChpc01haW4pOwotICAgICAgICB0LT5ydW4oYnVmKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgb3Blbl9kcml2ZXIoKQotewotICAgIGludCBmZCA9IG9wZW4oIi9kZXYvYmluZGVyIiwgT19SRFdSKTsKLSAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICBmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0gICAgICAgIGludCB2ZXJzOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBpb2N0bChmZCwgQklOREVSX1ZFUlNJT04sICZ2ZXJzKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICAgICAgQUxPR0UoIkJpbmRlciBpb2N0bCB0byBvYnRhaW4gdmVyc2lvbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIGZkID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSAwIHx8IHZlcnMgIT0gQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTikgewotICAgICAgICAgICAgQUxPR0UoIkJpbmRlciBkcml2ZXIgcHJvdG9jb2wgZG9lcyBub3QgbWF0Y2ggdXNlciBzcGFjZSBwcm90b2NvbCEiKTsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIGZkID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZV90IG1heFRocmVhZHMgPSAxNTsKLSAgICAgICAgcmVzdWx0ID0gaW9jdGwoZmQsIEJJTkRFUl9TRVRfTUFYX1RIUkVBRFMsICZtYXhUaHJlYWRzKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICAgICAgQUxPR0UoIkJpbmRlciBpb2N0bCB0byBzZXQgbWF4IHRocmVhZHMgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiT3BlbmluZyAnL2Rldi9iaW5kZXInIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICAgIHJldHVybiBmZDsKLX0KLQotUHJvY2Vzc1N0YXRlOjpQcm9jZXNzU3RhdGUoKQotICAgIDogbURyaXZlckZEKG9wZW5fZHJpdmVyKCkpCi0gICAgLCBtVk1TdGFydChNQVBfRkFJTEVEKQotICAgICwgbU1hbmFnZXNDb250ZXh0cyhmYWxzZSkKLSAgICAsIG1CaW5kZXJDb250ZXh0Q2hlY2tGdW5jKE5VTEwpCi0gICAgLCBtQmluZGVyQ29udGV4dFVzZXJEYXRhKE5VTEwpCi0gICAgLCBtVGhyZWFkUG9vbFN0YXJ0ZWQoZmFsc2UpCi0gICAgLCBtVGhyZWFkUG9vbFNlcSgxKQotewotICAgIGlmIChtRHJpdmVyRkQgPj0gMCkgewotICAgICAgICAvLyBYWFggSWRlYWxseSwgdGhlcmUgc2hvdWxkIGJlIGEgc3BlY2lmaWMgZGVmaW5lIGZvciB3aGV0aGVyIHdlCi0gICAgICAgIC8vIGhhdmUgbW1hcCAob3Igd2hldGhlciB3ZSBjb3VsZCBwb3NzaWJseSBoYXZlIHRoZSBrZXJuZWwgbW9kdWxlCi0gICAgICAgIC8vIGF2YWlsYWJsYSkuCi0jaWYgIWRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCi0gICAgICAgIC8vIG1tYXAgdGhlIGJpbmRlciwgcHJvdmlkaW5nIGEgY2h1bmsgb2YgdmlydHVhbCBhZGRyZXNzIHNwYWNlIHRvIHJlY2VpdmUgdHJhbnNhY3Rpb25zLgotICAgICAgICBtVk1TdGFydCA9IG1tYXAoMCwgQklOREVSX1ZNX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUgfCBNQVBfTk9SRVNFUlZFLCBtRHJpdmVyRkQsIDApOwotICAgICAgICBpZiAobVZNU3RhcnQgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgLy8gKnNpZ2gqCi0gICAgICAgICAgICBBTE9HRSgiVXNpbmcgL2Rldi9iaW5kZXIgZmFpbGVkOiB1bmFibGUgdG8gbW1hcCB0cmFuc2FjdGlvbiBtZW1vcnkuXG4iKTsKLSAgICAgICAgICAgIGNsb3NlKG1Ecml2ZXJGRCk7Ci0gICAgICAgICAgICBtRHJpdmVyRkQgPSAtMTsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgbURyaXZlckZEID0gLTE7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Ecml2ZXJGRCA8IDAsICJCaW5kZXIgZHJpdmVyIGNvdWxkIG5vdCBiZSBvcGVuZWQuICBUZXJtaW5hdGluZy4iKTsKLX0KLQotUHJvY2Vzc1N0YXRlOjp+UHJvY2Vzc1N0YXRlKCkKLXsKLX0KLSAgICAgICAgCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvU3RhdGljLmNwcCBiL2xpYnMvYmluZGVyL1N0YXRpYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYjAzMDguLjAwMDAwMDAKLS0tIGEvbGlicy9iaW5kZXIvU3RhdGljLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBbGwgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlLCB0byBjb250cm9sIGluaXRpYWxpemF0aW9uIGFuZAotLy8gZGVzdHJ1Y3Rpb24gb3JkZXIgaW4gdGhlIGxpYnJhcnkuCi0KLSNpbmNsdWRlIDxwcml2YXRlL2JpbmRlci9TdGF0aWMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLSBQcm9jZXNzU3RhdGUuY3BwCi0KLU11dGV4IGdQcm9jZXNzTXV0ZXg7Ci1zcDxQcm9jZXNzU3RhdGU+IGdQcm9jZXNzOwotCi1jbGFzcyBMaWJVdGlsc0lQQ3RTdGF0aWNzCi17Ci1wdWJsaWM6Ci0gICAgTGliVXRpbHNJUEN0U3RhdGljcygpCi0gICAgewotICAgIH0KLSAgICAKLSAgICB+TGliVXRpbHNJUEN0U3RhdGljcygpCi0gICAgewotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2h1dGRvd24oKTsKLSAgICB9Ci19OwotCi1zdGF0aWMgTGliVXRpbHNJUEN0U3RhdGljcyBnSVBDU3RhdGljczsKLQotLy8gLS0tLS0tLS0tLS0tIFNlcnZpY2VNYW5hZ2VyLmNwcAotCi1NdXRleCBnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyTG9jazsKLXNwPElTZXJ2aWNlTWFuYWdlcj4gZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlcjsKLXNwPElQZXJtaXNzaW9uQ29udHJvbGxlcj4gZ1Blcm1pc3Npb25Db250cm9sbGVyOwotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0FuZHJvaWQubWsgYi9saWJzL2d1aS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRhYzYyLi4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JQml0VHViZS5jcHAgXAotCUJ1ZmZlclF1ZXVlLmNwcCBcCi0JRGlzcGxheUV2ZW50UmVjZWl2ZXIuY3BwIFwKLQlJRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5jcHAgXAotCUlTZW5zb3JFdmVudENvbm5lY3Rpb24uY3BwIFwKLQlJU2Vuc29yU2VydmVyLmNwcCBcCi0JSVN1cmZhY2VUZXh0dXJlLmNwcCBcCi0JU2Vuc29yLmNwcCBcCi0JU2Vuc29yRXZlbnRRdWV1ZS5jcHAgXAotCVNlbnNvck1hbmFnZXIuY3BwIFwKLQlTdXJmYWNlVGV4dHVyZS5jcHAgXAotCVN1cmZhY2VUZXh0dXJlQ2xpZW50LmNwcCBcCi0JSVN1cmZhY2VDb21wb3Nlci5jcHAgXAotCUlTdXJmYWNlLmNwcCBcCi0JSVN1cmZhY2VDb21wb3NlckNsaWVudC5jcHAgXAotCUlHcmFwaGljQnVmZmVyQWxsb2MuY3BwIFwKLQlMYXllclN0YXRlLmNwcCBcCi0JU3VyZmFjZS5jcHAgXAotCVN1cmZhY2VDb21wb3NlckNsaWVudC5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYnV0aWxzIFwKLQlsaWJiaW5kZXIgXAotCWxpYmhhcmR3YXJlIFwKLQlsaWJoYXJkd2FyZV9sZWdhY3kgXAotCWxpYnVpIFwKLQlsaWJFR0wgXAotCWxpYkdMRVN2MiBcCi0KLQotTE9DQUxfTU9EVUxFOj0gbGliZ3VpCi0KLWlmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSwgb21hcDQpCi0JTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0ZFTkNFX1NZTkMKLWVuZGlmCi1pZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksIHM1cGMxMTApCi0JTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0ZFTkNFX1NZTkMKLWVuZGlmCi0KLWlmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSwgdGVncmEpCi0JTE9DQUxfQ0ZMQUdTICs9IC1EQUxMT1dfREVRVUVVRV9DVVJSRU5UX0JVRkZFUgotZW5kaWYKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1pZmVxICgsJChPTkVfU0hPVF9NQUtFRklMRSkpCi1pbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKLWVuZGlmCmRpZmYgLS1naXQgYS9saWJzL2d1aS9CaXRUdWJlLmNwcCBiL2xpYnMvZ3VpL0JpdFR1YmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWY0MTc4Li4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL0JpdFR1YmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0KLSNpbmNsdWRlIDxndWkvQml0VHViZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUJpdFR1YmU6OkJpdFR1YmUoKQotICAgIDogbVNlbmRGZCgtMSksIG1SZWNlaXZlRmQoLTEpCi17Ci0gICAgaW50IGZkc1syXTsKLSAgICBpZiAocGlwZShmZHMpID09IDApIHsKLSAgICAgICAgbVJlY2VpdmVGZCA9IGZkc1swXTsKLSAgICAgICAgbVNlbmRGZCA9IGZkc1sxXTsKLSAgICAgICAgZmNudGwobVJlY2VpdmVGZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7Ci0gICAgICAgIGZjbnRsKG1TZW5kRmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotICAgICAgICAvLyBpZ25vcmUgU0lHUElQRSwgd2UgaGFuZGxlIHdyaXRlIGVycm9ycyB0aHJvdWdoIEVQSVBFIGluc3RlYWQKLSAgICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1SZWNlaXZlRmQgPSAtZXJybm87Ci0gICAgICAgIEFMT0dFKCJCaXRUdWJlOiBwaXBlIGNyZWF0aW9uIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoLW1SZWNlaXZlRmQpKTsKLSAgICB9Ci19Ci0KLUJpdFR1YmU6OkJpdFR1YmUoY29uc3QgUGFyY2VsJiBkYXRhKQotICAgIDogbVNlbmRGZCgtMSksIG1SZWNlaXZlRmQoLTEpCi17Ci0gICAgbVJlY2VpdmVGZCA9IGR1cChkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpKTsKLSAgICBpZiAobVJlY2VpdmVGZCA+PSAwKSB7Ci0gICAgICAgIGZjbnRsKG1SZWNlaXZlRmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1SZWNlaXZlRmQgPSAtZXJybm87Ci0gICAgICAgIEFMT0dFKCJCaXRUdWJlKFBhcmNlbCk6IGNhbid0IGR1cCBmaWxlZGVzY3JpcHRvciAoJXMpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtbVJlY2VpdmVGZCkpOwotICAgIH0KLX0KLQotQml0VHViZTo6fkJpdFR1YmUoKQotewotICAgIGlmIChtU2VuZEZkID49IDApCi0gICAgICAgIGNsb3NlKG1TZW5kRmQpOwotCi0gICAgaWYgKG1SZWNlaXZlRmQgPj0gMCkKLSAgICAgICAgY2xvc2UobVJlY2VpdmVGZCk7Ci19Ci0KLXN0YXR1c190IEJpdFR1YmU6OmluaXRDaGVjaygpIGNvbnN0Ci17Ci0gICAgaWYgKG1SZWNlaXZlRmQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXNfdChtUmVjZWl2ZUZkKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1pbnQgQml0VHViZTo6Z2V0RmQoKSBjb25zdAotewotICAgIHJldHVybiBtUmVjZWl2ZUZkOwotfQotCi1zc2l6ZV90IEJpdFR1YmU6OndyaXRlKHZvaWQgY29uc3QqIHZhZGRyLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBzc2l6ZV90IGVyciwgbGVuOwotICAgIGRvIHsKLSAgICAgICAgbGVuID0gOjp3cml0ZShtU2VuZEZkLCB2YWRkciwgc2l6ZSk7Ci0gICAgICAgIGVyciA9IGxlbiA8IDAgPyBlcnJubyA6IDA7Ci0gICAgfSB3aGlsZSAoZXJyID09IEVJTlRSKTsKLSAgICByZXR1cm4gZXJyID09IDAgPyBsZW4gOiAtZXJyOwotCi19Ci0KLXNzaXplX3QgQml0VHViZTo6cmVhZCh2b2lkKiB2YWRkciwgc2l6ZV90IHNpemUpCi17Ci0gICAgc3NpemVfdCBlcnIsIGxlbjsKLSAgICBkbyB7Ci0gICAgICAgIGxlbiA9IDo6cmVhZChtUmVjZWl2ZUZkLCB2YWRkciwgc2l6ZSk7Ci0gICAgICAgIGVyciA9IGxlbiA8IDAgPyBlcnJubyA6IDA7Ci0gICAgfSB3aGlsZSAoZXJyID09IEVJTlRSKTsKLSAgICBpZiAoZXJyID09IEVBR0FJTiB8fCBlcnIgPT0gRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgLy8gRUFHQUlOIG1lYW5zIHRoYXQgd2UgaGF2ZSBub24tYmxvY2tpbmcgSS9PIGJ1dCB0aGVyZSB3YXMKLSAgICAgICAgLy8gbm8gZGF0YSB0byBiZSByZWFkLiBOb3RoaW5nIHRoZSBjbGllbnQgc2hvdWxkIGNhcmUgYWJvdXQuCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gZXJyID09IDAgPyBsZW4gOiAtZXJyOwotfQotCi1zdGF0dXNfdCBCaXRUdWJlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcmVwbHkpIGNvbnN0Ci17Ci0gICAgaWYgKG1SZWNlaXZlRmQgPCAwKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgIHN0YXR1c190IHJlc3VsdCA9IHJlcGx5LT53cml0ZUR1cEZpbGVEZXNjcmlwdG9yKG1SZWNlaXZlRmQpOwotICAgIGNsb3NlKG1SZWNlaXZlRmQpOwotICAgIG1SZWNlaXZlRmQgPSAtMTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvQnVmZmVyUXVldWUuY3BwIGIvbGlicy9ndWkvQnVmZmVyUXVldWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWE0YzIyLi4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL0J1ZmZlclF1ZXVlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJCdWZmZXJRdWV1ZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCi0KLSNkZWZpbmUgR0xfR0xFWFRfUFJPVE9UWVBFUwotI2RlZmluZSBFR0xfRUdMRVhUX1BST1RPVFlQRVMKLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0KLSNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgotI2luY2x1ZGUgPHByaXZhdGUvZ3VpL0NvbXBvc2VyU2VydmljZS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotLy8gVGhpcyBjb21waWxlIG9wdGlvbiBjYXVzZXMgU3VyZmFjZVRleHR1cmUgdG8gcmV0dXJuIHRoZSBidWZmZXIgdGhhdCBpcyBjdXJyZW50bHkKLS8vIGF0dGFjaGVkIHRvIHRoZSBHTCB0ZXh0dXJlIGZyb20gZGVxdWV1ZUJ1ZmZlciB3aGVuIG5vIG90aGVyIGJ1ZmZlcnMgYXJlCi0vLyBhdmFpbGFibGUuICBJdCByZXF1aXJlcyB0aGUgZHJpdmVycyAoR3JhbGxvYywgR0wsIE9NWCBJTCwgYW5kIENhbWVyYSkgdG8gZG8KLS8vIGltcGxpY2l0IGNyb3NzLXByb2Nlc3Mgc3luY2hyb25pemF0aW9uIHRvIHByZXZlbnQgdGhlIGJ1ZmZlciBmcm9tIGJlaW5nCi0vLyB3cml0dGVuIHRvIGJlZm9yZSB0aGUgYnVmZmVyIGhhcyAoYSkgYmVlbiBkZXRhY2hlZCBmcm9tIHRoZSBHTCB0ZXh0dXJlIGFuZAotLy8gKGIpIGFsbCBHTCByZWFkcyBmcm9tIHRoZSBidWZmZXIgaGF2ZSBjb21wbGV0ZWQuCi0KLS8vIER1cmluZyByZWZhY3RvcmluZywgZG8gbm90IHN1cHBvcnQgZGVxdWV1aW5nIHRoZSBjdXJyZW50IGJ1ZmZlcgotI3VuZGVmIEFMTE9XX0RFUVVFVUVfQ1VSUkVOVF9CVUZGRVIKLQotI2lmZGVmIEFMTE9XX0RFUVVFVUVfQ1VSUkVOVF9CVUZGRVIKLSNkZWZpbmUgRkxBR19BTExPV19ERVFVRVVFX0NVUlJFTlRfQlVGRkVSICAgIHRydWUKLSN3YXJuaW5nICJBTExPV19ERVFVRVVFX0NVUlJFTlRfQlVGRkVSIGVuYWJsZWQiCi0jZWxzZQotI2RlZmluZSBGTEFHX0FMTE9XX0RFUVVFVUVfQ1VSUkVOVF9CVUZGRVIgICAgZmFsc2UKLSNlbmRpZgotCi0vLyBNYWNyb3MgZm9yIGluY2x1ZGluZyB0aGUgQnVmZmVyUXVldWUgbmFtZSBpbiBsb2cgbWVzc2FnZXMKLSNkZWZpbmUgU1RfTE9HVih4LCAuLi4pIEFMT0dWKCJbJXNdICJ4LCBtQ29uc3VtZXJOYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBTVF9MT0dEKHgsIC4uLikgQUxPR0QoIlslc10gIngsIG1Db25zdW1lck5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIFNUX0xPR0koeCwgLi4uKSBBTE9HSSgiWyVzXSAieCwgbUNvbnN1bWVyTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgU1RfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICJ4LCBtQ29uc3VtZXJOYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBTVF9MT0dFKHgsIC4uLikgQUxPR0UoIlslc10gIngsIG1Db25zdW1lck5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgQVRSQUNFX0JVRkZFUl9JTkRFWChpbmRleCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyIF9fX3RyYWNlQnVmWzEwMjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzbnByaW50ZihfX190cmFjZUJ1ZiwgMTAyNCwgIiVzOiAlZCIsIG1Db25zdW1lck5hbWUuc3RyaW5nKCksIChpbmRleCkpOyAgIFwKLSAgICBhbmRyb2lkOjpTY29wZWRUcmFjZSBfX19idWZUcmFjZXIoQVRSQUNFX1RBRywgX19fdHJhY2VCdWYpOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEdldCBhbiBJRCB0aGF0J3MgdW5pcXVlIHdpdGhpbiB0aGlzIHByb2Nlc3MuCi1zdGF0aWMgaW50MzJfdCBjcmVhdGVQcm9jZXNzVW5pcXVlSWQoKSB7Ci0gICAgc3RhdGljIHZvbGF0aWxlIGludDMyX3QgZ2xvYmFsQ291bnRlciA9IDA7Ci0gICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2luYygmZ2xvYmFsQ291bnRlcik7Ci19Ci0KLUJ1ZmZlclF1ZXVlOjpCdWZmZXJRdWV1ZSggYm9vbCBhbGxvd1N5bmNocm9ub3VzTW9kZSApIDoKLSAgICBtRGVmYXVsdFdpZHRoKDEpLAotICAgIG1EZWZhdWx0SGVpZ2h0KDEpLAotICAgIG1QaXhlbEZvcm1hdChQSVhFTF9GT1JNQVRfUkdCQV84ODg4KSwKLSAgICBtQnVmZmVyQ291bnQoTUlOX0FTWU5DX0JVRkZFUl9TTE9UUyksCi0gICAgbUNsaWVudEJ1ZmZlckNvdW50KDApLAotICAgIG1TZXJ2ZXJCdWZmZXJDb3VudChNSU5fQVNZTkNfQlVGRkVSX1NMT1RTKSwKLSAgICBtTmV4dFRyYW5zZm9ybSgwKSwKLSAgICBtTmV4dFNjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX0ZSRUVaRSksCi0gICAgbVN5bmNocm9ub3VzTW9kZShmYWxzZSksCi0gICAgbUFsbG93U3luY2hyb25vdXNNb2RlKGFsbG93U3luY2hyb25vdXNNb2RlKSwKLSAgICBtQ29ubmVjdGVkQXBpKE5PX0NPTk5FQ1RFRF9BUEkpLAotICAgIG1BYmFuZG9uZWQoZmFsc2UpLAotICAgIG1GcmFtZUNvdW50ZXIoMCksCi0gICAgbUJ1ZmZlckhhc0JlZW5RdWV1ZWQoZmFsc2UpCi17Ci0gICAgLy8gQ2hvb3NlIGEgbmFtZSB1c2luZyB0aGUgUElEIGFuZCBhIHByb2Nlc3MtdW5pcXVlIElELgotICAgIG1Db25zdW1lck5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoInVubmFtZWQtJWQtJWQiLCBnZXRwaWQoKSwgY3JlYXRlUHJvY2Vzc1VuaXF1ZUlkKCkpOwotCi0gICAgU1RfTE9HVigiQnVmZmVyUXVldWUiKTsKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBjb21wb3NlcihDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpKTsKLSAgICBtR3JhcGhpY0J1ZmZlckFsbG9jID0gY29tcG9zZXItPmNyZWF0ZUdyYXBoaWNCdWZmZXJBbGxvYygpOwotICAgIG1OZXh0Q3JvcC5tYWtlSW52YWxpZCgpOwotfQotCi1CdWZmZXJRdWV1ZTo6fkJ1ZmZlclF1ZXVlKCkgewotICAgIFNUX0xPR1YoIn5CdWZmZXJRdWV1ZSIpOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6c2V0QnVmZmVyQ291bnRTZXJ2ZXJMb2NrZWQoaW50IGJ1ZmZlckNvdW50KSB7Ci0gICAgaWYgKGJ1ZmZlckNvdW50ID4gTlVNX0JVRkZFUl9TTE9UUykKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIC8vIHNwZWNpYWwtY2FzZSwgbm90aGluZyB0byBkbwotICAgIGlmIChidWZmZXJDb3VudCA9PSBtQnVmZmVyQ291bnQpCi0gICAgICAgIHJldHVybiBPSzsKLQotICAgIGlmICghbUNsaWVudEJ1ZmZlckNvdW50ICYmCi0gICAgICAgIGJ1ZmZlckNvdW50ID49IG1CdWZmZXJDb3VudCkgewotICAgICAgICAvLyBlYXN5LCB3ZSBqdXN0IGhhdmUgbW9yZSBidWZmZXJzCi0gICAgICAgIG1CdWZmZXJDb3VudCA9IGJ1ZmZlckNvdW50OwotICAgICAgICBtU2VydmVyQnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDsKLSAgICAgICAgbURlcXVldWVDb25kaXRpb24uc2lnbmFsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gd2UncmUgaGVyZSBiZWNhdXNlIHdlJ3JlIGVpdGhlcgotICAgICAgICAvLyAtIHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJ1ZmZlcnMKLSAgICAgICAgLy8gLSBvciB0aGVyZSBpcyBhIGNsaWVudC1idWZmZXItY291bnQgaW4gZWZmZWN0Ci0KLSAgICAgICAgLy8gbGVzcyB0aGFuIDIgYnVmZmVycyBpcyBuZXZlciBhbGxvd2VkCi0gICAgICAgIGlmIChidWZmZXJDb3VudCA8IDIpCi0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgICAgIC8vIHdoZW4gdGhlcmUgaXMgbm9uIGNsaWVudC1idWZmZXItY291bnQgaW4gZWZmZWN0LCB0aGUgY2xpZW50IGlzIG5vdAotICAgICAgICAvLyBhbGxvd2VkIHRvIGRlcXVldWUgbW9yZSB0aGFuIG9uZSBidWZmZXIgYXQgYSB0aW1lLAotICAgICAgICAvLyBzbyB0aGUgbmV4dCB0aW1lIHRoZXkgZGVxdWV1ZSBhIGJ1ZmZlciwgd2Uga25vdyB0aGF0IHRoZXkgZG9uJ3QKLSAgICAgICAgLy8gb3duIG9uZS4gdGhlIGFjdHVhbCByZXNpemluZyB3aWxsIGhhcHBlbiBkdXJpbmcgdGhlIG5leHQKLSAgICAgICAgLy8gZGVxdWV1ZUJ1ZmZlci4KLQotICAgICAgICBtU2VydmVyQnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIEJ1ZmZlclF1ZXVlOjppc1N5bmNocm9ub3VzTW9kZSgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBtU3luY2hyb25vdXNNb2RlOwotfQotCi12b2lkIEJ1ZmZlclF1ZXVlOjpzZXRDb25zdW1lck5hbWUoY29uc3QgU3RyaW5nOCYgbmFtZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgbUNvbnN1bWVyTmFtZSA9IG5hbWU7Ci19Ci0KLXZvaWQgQnVmZmVyUXVldWU6OnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIoCi0gICAgICAgIGNvbnN0IHNwPEZyYW1lQXZhaWxhYmxlTGlzdGVuZXI+JiBsaXN0ZW5lcikgewotICAgIFNUX0xPR1YoInNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIG1GcmFtZUF2YWlsYWJsZUxpc3RlbmVyID0gbGlzdGVuZXI7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpIHsKLSAgICBTVF9MT0dWKCJzZXRCdWZmZXJDb3VudDogY291bnQ9JWQiLCBidWZmZXJDb3VudCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgIFNUX0xPR0UoInNldEJ1ZmZlckNvdW50OiBTdXJmYWNlVGV4dHVyZSBoYXMgYmVlbiBhYmFuZG9uZWQhIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoYnVmZmVyQ291bnQgPiBOVU1fQlVGRkVSX1NMT1RTKSB7Ci0gICAgICAgIFNUX0xPR0UoInNldEJ1ZmZlckNvdW50OiBidWZmZXJDb3VudCBsYXJnZXIgdGhhbiBzbG90cyBhdmFpbGFibGUiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBFcnJvciBvdXQgaWYgdGhlIHVzZXIgaGFzIGRlcXVldWVkIGJ1ZmZlcnMKLSAgICBmb3IgKGludCBpPTAgOyBpPG1CdWZmZXJDb3VudCA7IGkrKykgewotICAgICAgICBpZiAobVNsb3RzW2ldLm1CdWZmZXJTdGF0ZSA9PSBCdWZmZXJTbG90OjpERVFVRVVFRCkgewotICAgICAgICAgICAgU1RfTE9HRSgic2V0QnVmZmVyQ291bnQ6IGNsaWVudCBvd25zIHNvbWUgYnVmZmVycyIpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCBpbnQgbWluQnVmZmVyU2xvdHMgPSBtU3luY2hyb25vdXNNb2RlID8KLSAgICAgICAgICAgIE1JTl9TWU5DX0JVRkZFUl9TTE9UUyA6IE1JTl9BU1lOQ19CVUZGRVJfU0xPVFM7Ci0gICAgaWYgKGJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgbUNsaWVudEJ1ZmZlckNvdW50ID0gMDsKLSAgICAgICAgYnVmZmVyQ291bnQgPSAobVNlcnZlckJ1ZmZlckNvdW50ID49IG1pbkJ1ZmZlclNsb3RzKSA/Ci0gICAgICAgICAgICAgICAgbVNlcnZlckJ1ZmZlckNvdW50IDogbWluQnVmZmVyU2xvdHM7Ci0gICAgICAgIHJldHVybiBzZXRCdWZmZXJDb3VudFNlcnZlckxvY2tlZChidWZmZXJDb3VudCk7Ci0gICAgfQotCi0gICAgaWYgKGJ1ZmZlckNvdW50IDwgbWluQnVmZmVyU2xvdHMpIHsKLSAgICAgICAgU1RfTE9HRSgic2V0QnVmZmVyQ291bnQ6IHJlcXVlc3RlZCBidWZmZXIgY291bnQgKCVkKSBpcyBsZXNzIHRoYW4gIgotICAgICAgICAgICAgICAgICJtaW5pbXVtICglZCkiLCBidWZmZXJDb3VudCwgbWluQnVmZmVyU2xvdHMpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIC8vIGhlcmUgd2UncmUgZ3VhcmFudGVlZCB0aGF0IHRoZSBjbGllbnQgZG9lc24ndCBoYXZlIGRlcXVldWVkIGJ1ZmZlcnMKLSAgICAvLyBhbmQgd2lsbCByZWxlYXNlIGFsbCBvZiBpdHMgYnVmZmVyIHJlZmVyZW5jZXMuCi0gICAgZnJlZUFsbEJ1ZmZlcnNMb2NrZWQoKTsKLSAgICBtQnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDsKLSAgICBtQ2xpZW50QnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDsKLSAgICBtQnVmZmVySGFzQmVlblF1ZXVlZCA9IGZhbHNlOwotICAgIG1RdWV1ZS5jbGVhcigpOwotICAgIG1EZXF1ZXVlQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotaW50IEJ1ZmZlclF1ZXVlOjpxdWVyeShpbnQgd2hhdCwgaW50KiBvdXRWYWx1ZSkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBpZiAobUFiYW5kb25lZCkgewotICAgICAgICBTVF9MT0dFKCJxdWVyeTogU3VyZmFjZVRleHR1cmUgaGFzIGJlZW4gYWJhbmRvbmVkISIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBpbnQgdmFsdWU7Ci0gICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1dJRFRIOgotICAgICAgICB2YWx1ZSA9IG1EZWZhdWx0V2lkdGg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19IRUlHSFQ6Ci0gICAgICAgIHZhbHVlID0gbURlZmF1bHRIZWlnaHQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19GT1JNQVQ6Ci0gICAgICAgIHZhbHVlID0gbVBpeGVsRm9ybWF0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUzoKLSAgICAgICAgdmFsdWUgPSBtU3luY2hyb25vdXNNb2RlID8KLSAgICAgICAgICAgICAgICAoTUlOX1VOREVRVUVVRURfQlVGRkVSUy0xKSA6IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlM7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG91dFZhbHVlWzBdID0gdmFsdWU7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6cmVxdWVzdEJ1ZmZlcihpbnQgc2xvdCwgc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZikgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgU1RfTE9HVigicmVxdWVzdEJ1ZmZlcjogc2xvdD0lZCIsIHNsb3QpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgaWYgKG1BYmFuZG9uZWQpIHsKLSAgICAgICAgU1RfTE9HRSgicmVxdWVzdEJ1ZmZlcjogU3VyZmFjZVRleHR1cmUgaGFzIGJlZW4gYWJhbmRvbmVkISIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKHNsb3QgPCAwIHx8IG1CdWZmZXJDb3VudCA8PSBzbG90KSB7Ci0gICAgICAgIFNUX0xPR0UoInJlcXVlc3RCdWZmZXI6IHNsb3QgaW5kZXggb3V0IG9mIHJhbmdlIFswLCAlZF06ICVkIiwKLSAgICAgICAgICAgICAgICBtQnVmZmVyQ291bnQsIHNsb3QpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtU2xvdHNbc2xvdF0ubVJlcXVlc3RCdWZmZXJDYWxsZWQgPSB0cnVlOwotICAgICpidWYgPSBtU2xvdHNbc2xvdF0ubUdyYXBoaWNCdWZmZXI7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6ZGVxdWV1ZUJ1ZmZlcihpbnQgKm91dEJ1ZiwgdWludDMyX3QgdywgdWludDMyX3QgaCwKLSAgICAgICAgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgU1RfTE9HVigiZGVxdWV1ZUJ1ZmZlcjogdz0lZCBoPSVkIGZtdD0lI3ggdXNhZ2U9JSN4IiwgdywgaCwgZm9ybWF0LCB1c2FnZSk7Ci0KLSAgICBpZiAoKHcgJiYgIWgpIHx8ICghdyAmJiBoKSkgewotICAgICAgICBTVF9MT0dFKCJkZXF1ZXVlQnVmZmVyOiBpbnZhbGlkIHNpemU6IHc9JXUsIGg9JXUiLCB3LCBoKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCByZXR1cm5GbGFncyhPSyk7Ci0gICAgRUdMRGlzcGxheSBkcHkgPSBFR0xfTk9fRElTUExBWTsKLSAgICBFR0xTeW5jS0hSIGZlbmNlID0gRUdMX05PX1NZTkNfS0hSOwotCi0gICAgeyAvLyBTY29wZSBmb3IgdGhlIGxvY2sKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgICAgICBpbnQgZm91bmQgPSAtMTsKLSAgICAgICAgaW50IGZvdW5kU3luYyA9IC0xOwotICAgICAgICBpbnQgZGVxdWV1ZWRDb3VudCA9IDA7Ci0gICAgICAgIGJvb2wgdHJ5QWdhaW4gPSB0cnVlOwotICAgICAgICB3aGlsZSAodHJ5QWdhaW4pIHsKLSAgICAgICAgICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgICAgICAgICAgU1RfTE9HRSgiZGVxdWV1ZUJ1ZmZlcjogU3VyZmFjZVRleHR1cmUgaGFzIGJlZW4gYWJhbmRvbmVkISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBGSUZPIHRvIGRyYWluIGlmIHRoZSBudW1iZXIgb2YgYnVmZmVyCi0gICAgICAgICAgICAvLyBuZWVkcyB0byBjaGFuZ2UuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVGhlIGNvbmRpdGlvbiAibnVtYmVyIG9mIGJ1ZmZlcnMgbmVlZHMgdG8gY2hhbmdlIiBpcyB0cnVlIGlmCi0gICAgICAgICAgICAvLyAtIHRoZSBjbGllbnQgZG9lc24ndCBjYXJlIGFib3V0IGhvdyBtYW55IGJ1ZmZlcnMgdGhlcmUgYXJlCi0gICAgICAgICAgICAvLyAtIEFORCB0aGUgYWN0dWFsIG51bWJlciBvZiBidWZmZXIgaXMgZGlmZmVyZW50IGZyb20gd2hhdCB3YXMKLSAgICAgICAgICAgIC8vICAgc2V0IGluIHRoZSBsYXN0IHNldEJ1ZmZlckNvdW50U2VydmVyKCkKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC0gT1IgLQotICAgICAgICAgICAgLy8gICBzZXRCdWZmZXJDb3VudFNlcnZlcigpIHdhcyBzZXQgdG8gYSB2YWx1ZSBpbmNvbXBhdGlibGUgd2l0aAotICAgICAgICAgICAgLy8gICB0aGUgc3luY2hyb25pemF0aW9uIG1vZGUgKGZvciBpbnN0YW5jZSBiZWNhdXNlIHRoZSBzeW5jIG1vZGUKLSAgICAgICAgICAgIC8vICAgY2hhbmdlZCBzaW5jZSkKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBcyBsb25nIGFzIHRoaXMgY29uZGl0aW9uIGlzIHRydWUgQU5EIHRoZSBGSUZPIGlzIG5vdCBlbXB0eSwgd2UKLSAgICAgICAgICAgIC8vIHdhaXQgb24gbURlcXVldWVDb25kaXRpb24uCi0KLSAgICAgICAgICAgIGNvbnN0IGludCBtaW5CdWZmZXJDb3VudE5lZWRlZCA9IG1TeW5jaHJvbm91c01vZGUgPwotICAgICAgICAgICAgICAgICAgICBNSU5fU1lOQ19CVUZGRVJfU0xPVFMgOiBNSU5fQVNZTkNfQlVGRkVSX1NMT1RTOwotCi0gICAgICAgICAgICBjb25zdCBib29sIG51bWJlck9mQnVmZmVyc05lZWRzVG9DaGFuZ2UgPSAhbUNsaWVudEJ1ZmZlckNvdW50ICYmCi0gICAgICAgICAgICAgICAgICAgICgobVNlcnZlckJ1ZmZlckNvdW50ICE9IG1CdWZmZXJDb3VudCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVNlcnZlckJ1ZmZlckNvdW50IDwgbWluQnVmZmVyQ291bnROZWVkZWQpKTsKLQotICAgICAgICAgICAgaWYgKCFtUXVldWUuaXNFbXB0eSgpICYmIG51bWJlck9mQnVmZmVyc05lZWRzVG9DaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgRklGTyB0byBkcmFpbgotICAgICAgICAgICAgICAgIG1EZXF1ZXVlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBjb250aW51ZSBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byByZWV2YWx1YXRlIG91cgotICAgICAgICAgICAgICAgIC8vIHdob2xlIHN0YXRlIChlZzogd2UgY291bGQgYmUgYWJhbmRvbmVkIG9yIGRpc2Nvbm5lY3RlZCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG51bWJlck9mQnVmZmVyc05lZWRzVG9DaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICAvLyBoZXJlIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdCBtUXVldWUgaXMgZW1wdHkKLSAgICAgICAgICAgICAgICBmcmVlQWxsQnVmZmVyc0xvY2tlZCgpOwotICAgICAgICAgICAgICAgIG1CdWZmZXJDb3VudCA9IG1TZXJ2ZXJCdWZmZXJDb3VudDsKLSAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlckNvdW50IDwgbWluQnVmZmVyQ291bnROZWVkZWQpCi0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXJDb3VudCA9IG1pbkJ1ZmZlckNvdW50TmVlZGVkOwotICAgICAgICAgICAgICAgIG1CdWZmZXJIYXNCZWVuUXVldWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuRmxhZ3MgfD0gSVN1cmZhY2VUZXh0dXJlOjpSRUxFQVNFX0FMTF9CVUZGRVJTOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBsb29rIGZvciBhIGZyZWUgYnVmZmVyIHRvIGdpdmUgdG8gdGhlIGNsaWVudAotICAgICAgICAgICAgZm91bmQgPSBJTlZBTElEX0JVRkZFUl9TTE9UOwotICAgICAgICAgICAgZm91bmRTeW5jID0gSU5WQUxJRF9CVUZGRVJfU0xPVDsKLSAgICAgICAgICAgIGRlcXVldWVkQ291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQnVmZmVyQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdGF0ZSA9IG1TbG90c1tpXS5tQnVmZmVyU3RhdGU7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEJ1ZmZlclNsb3Q6OkRFUVVFVUVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlcXVldWVkQ291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB0aGlzIGxvZ2ljIHVzZWQgdG8gYmUgaWYgKEZMQUdfQUxMT1dfREVRVUVVRV9DVVJSRU5UX0JVRkZFUikKLSAgICAgICAgICAgICAgICAvLyBidXQgZGVxdWV1aW5nIHRoZSBjdXJyZW50IGJ1ZmZlciBpcyBkaXNhYmxlZC4KLSAgICAgICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIHRlbXBvcmFyaWx5IHJlbW92ZWQgc28KLSAgICAgICAgICAgICAgICAgICAgLy8gQnVmZmVyUXVldWUgYW5kIFN1cmZhY2VUZXh0dXJlIGNhbiBiZSByZWZhY3RvcmVkIGludG8KLSAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgb2JqZWN0cwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCdWZmZXJTbG90OjpGUkVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSByZXR1cm4gdGhlIG9sZGVzdCBvZiB0aGUgZnJlZSBidWZmZXJzIHRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGFsbGluZyB0aGUgcHJvZHVjZXIgaWYgcG9zc2libGUuICBUaGlzIGlzIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBjb25zdW1lciBtYXkgc3RpbGwgaGF2ZSBwZW5kaW5nIHJlYWRzIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICogYnVmZmVycyBpbiBmbGlnaHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPbGRlciA9IG1TbG90c1tpXS5tRnJhbWVOdW1iZXIgPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2xvdHNbZm91bmRdLm1GcmFtZU51bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCA8IDAgfHwgaXNPbGRlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU3luYyA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjbGllbnRzIGFyZSBub3QgYWxsb3dlZCB0byBkZXF1ZXVlIG1vcmUgdGhhbiBvbmUgYnVmZmVyCi0gICAgICAgICAgICAvLyBpZiB0aGV5IGRpZG4ndCBzZXQgYSBidWZmZXIgY291bnQuCi0gICAgICAgICAgICBpZiAoIW1DbGllbnRCdWZmZXJDb3VudCAmJiBkZXF1ZXVlZENvdW50KSB7Ci0gICAgICAgICAgICAgICAgU1RfTE9HRSgiZGVxdWV1ZUJ1ZmZlcjogY2FuJ3QgZGVxdWV1ZSBtdWx0aXBsZSBidWZmZXJzIHdpdGhvdXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgInNldHRpbmcgdGhlIGJ1ZmZlciBjb3VudCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZWUgd2hldGhlciBhIGJ1ZmZlciBoYXMgYmVlbiBxdWV1ZWQgc2luY2UgdGhlIGxhc3QKLSAgICAgICAgICAgIC8vIHNldEJ1ZmZlckNvdW50IHNvIHdlIGtub3cgd2hldGhlciB0byBwZXJmb3JtIHRoZQotICAgICAgICAgICAgLy8gTUlOX1VOREVRVUVVRURfQlVGRkVSUyBjaGVjayBiZWxvdy4KLSAgICAgICAgICAgIGlmIChtQnVmZmVySGFzQmVlblF1ZXVlZCkgewotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgY2xpZW50IGlzIG5vdCB0cnlpbmcgdG8gZGVxdWV1ZSBtb3JlIGJ1ZmZlcnMKLSAgICAgICAgICAgICAgICAvLyB0aGFuIGFsbG93ZWQuCi0gICAgICAgICAgICAgICAgY29uc3QgaW50IGF2YWlsID0gbUJ1ZmZlckNvdW50IC0gKGRlcXVldWVkQ291bnQrMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF2YWlsIDwgKE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMtaW50KG1TeW5jaHJvbm91c01vZGUpKSkgewotICAgICAgICAgICAgICAgICAgICBTVF9MT0dFKCJkZXF1ZXVlQnVmZmVyOiBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTPSVkIGV4Y2VlZGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGRlcXVldWVkPSVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOX1VOREVRVUVVRURfQlVGRkVSUy1pbnQobVN5bmNocm9ub3VzTW9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVxdWV1ZWRDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3ZSdyZSBpbiBzeW5jaHJvbm91cyBtb2RlIGFuZCBkaWRuJ3QgZmluZCBhIGJ1ZmZlciwgd2UgbmVlZCB0bwotICAgICAgICAgICAgLy8gd2FpdCBmb3Igc29tZSBidWZmZXJzIHRvIGJlIGNvbnN1bWVkCi0gICAgICAgICAgICB0cnlBZ2FpbiA9IG1TeW5jaHJvbm91c01vZGUgJiYgKGZvdW5kU3luYyA9PSBJTlZBTElEX0JVRkZFUl9TTE9UKTsKLSAgICAgICAgICAgIGlmICh0cnlBZ2FpbikgewotICAgICAgICAgICAgICAgIG1EZXF1ZXVlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU3luY2hyb25vdXNNb2RlICYmIGZvdW5kID09IElOVkFMSURfQlVGRkVSX1NMT1QpIHsKLSAgICAgICAgICAgIC8vIGZvdW5kU3luYyBndWFyYW50ZWVkIHRvIGJlICE9IElOVkFMSURfQlVGRkVSX1NMT1QKLSAgICAgICAgICAgIGZvdW5kID0gZm91bmRTeW5jOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZvdW5kID09IElOVkFMSURfQlVGRkVSX1NMT1QpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCi0gICAgICAgICAgICBTVF9MT0dFKCJkZXF1ZXVlQnVmZmVyOiBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3RzIik7Ci0gICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgaW50IGJ1ZiA9IGZvdW5kOwotICAgICAgICAqb3V0QnVmID0gZm91bmQ7Ci0KLSAgICAgICAgQVRSQUNFX0JVRkZFUl9JTkRFWChidWYpOwotCi0gICAgICAgIGNvbnN0IGJvb2wgdXNlRGVmYXVsdFNpemUgPSAhdyAmJiAhaDsKLSAgICAgICAgaWYgKHVzZURlZmF1bHRTaXplKSB7Ci0gICAgICAgICAgICAvLyB1c2UgdGhlIGRlZmF1bHQgc2l6ZQotICAgICAgICAgICAgdyA9IG1EZWZhdWx0V2lkdGg7Ci0gICAgICAgICAgICBoID0gbURlZmF1bHRIZWlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBib29sIHVwZGF0ZUZvcm1hdCA9IChmb3JtYXQgIT0gMCk7Ci0gICAgICAgIGlmICghdXBkYXRlRm9ybWF0KSB7Ci0gICAgICAgICAgICAvLyBrZWVwIHRoZSBjdXJyZW50IChvciBkZWZhdWx0KSBmb3JtYXQKLSAgICAgICAgICAgIGZvcm1hdCA9IG1QaXhlbEZvcm1hdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1ZmZlciBpcyBub3cgaW4gREVRVUVVRUQgKGJ1dCBjYW4gYWxzbyBiZSBjdXJyZW50IGF0IHRoZSBzYW1lIHRpbWUsCi0gICAgICAgIC8vIGlmIHdlJ3JlIGluIHN5bmNocm9ub3VzIG1vZGUpCi0gICAgICAgIG1TbG90c1tidWZdLm1CdWZmZXJTdGF0ZSA9IEJ1ZmZlclNsb3Q6OkRFUVVFVUVEOwotCi0gICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIobVNsb3RzW2J1Zl0ubUdyYXBoaWNCdWZmZXIpOwotICAgICAgICBpZiAoKGJ1ZmZlciA9PSBOVUxMKSB8fAotICAgICAgICAgICAgKHVpbnQzMl90KGJ1ZmZlci0+d2lkdGgpICAhPSB3KSB8fAotICAgICAgICAgICAgKHVpbnQzMl90KGJ1ZmZlci0+aGVpZ2h0KSAhPSBoKSB8fAotICAgICAgICAgICAgKHVpbnQzMl90KGJ1ZmZlci0+Zm9ybWF0KSAhPSBmb3JtYXQpIHx8Ci0gICAgICAgICAgICAoKHVpbnQzMl90KGJ1ZmZlci0+dXNhZ2UpICYgdXNhZ2UpICE9IHVzYWdlKSkKLSAgICAgICAgewotICAgICAgICAgICAgdXNhZ2UgfD0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRTsKLSAgICAgICAgICAgIHN0YXR1c190IGVycm9yOwotICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgbUdyYXBoaWNCdWZmZXJBbGxvYy0+Y3JlYXRlR3JhcGhpY0J1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoLCBmb3JtYXQsIHVzYWdlLCAmZXJyb3IpKTsKLSAgICAgICAgICAgIGlmIChncmFwaGljQnVmZmVyID09IDApIHsKLSAgICAgICAgICAgICAgICBTVF9MT0dFKCJkZXF1ZXVlQnVmZmVyOiBTdXJmYWNlQ29tcG9zZXI6OmNyZWF0ZUdyYXBoaWNCdWZmZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh1cGRhdGVGb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBtUGl4ZWxGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TbG90c1tidWZdLm1BY3F1aXJlQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlciA9IGdyYXBoaWNCdWZmZXI7Ci0gICAgICAgICAgICBtU2xvdHNbYnVmXS5tUmVxdWVzdEJ1ZmZlckNhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgbVNsb3RzW2J1Zl0ubUZlbmNlID0gRUdMX05PX1NZTkNfS0hSOwotICAgICAgICAgICAgbVNsb3RzW2J1Zl0ubUVnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsKLQotCi0KLQotICAgICAgICAgICAgcmV0dXJuRmxhZ3MgfD0gSVN1cmZhY2VUZXh0dXJlOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgZHB5ID0gbVNsb3RzW2J1Zl0ubUVnbERpc3BsYXk7Ci0gICAgICAgIGZlbmNlID0gbVNsb3RzW2J1Zl0ubUZlbmNlOwotICAgICAgICBtU2xvdHNbYnVmXS5tRmVuY2UgPSBFR0xfTk9fU1lOQ19LSFI7Ci0gICAgfSAgLy8gZW5kIGxvY2sgc2NvcGUKLQotICAgIGlmIChmZW5jZSAhPSBFR0xfTk9fU1lOQ19LSFIpIHsKLSAgICAgICAgRUdMaW50IHJlc3VsdCA9IGVnbENsaWVudFdhaXRTeW5jS0hSKGRweSwgZmVuY2UsIDAsIDEwMDAwMDAwMDApOwotICAgICAgICAvLyBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZywgbG9nIHRoZSBlcnJvciwgYnV0IHJldHVybiB0aGUgYnVmZmVyIHdpdGhvdXQKLSAgICAgICAgLy8gc3luY2hyb25pemluZyBhY2Nlc3MgdG8gaXQuICBJdCdzIHRvbyBsYXRlIGF0IHRoaXMgcG9pbnQgdG8gYWJvcnQgdGhlCi0gICAgICAgIC8vIGRlcXVldWUgb3BlcmF0aW9uLgotICAgICAgICBpZiAocmVzdWx0ID09IEVHTF9GQUxTRSkgewotICAgICAgICAgICAgQUxPR0UoImRlcXVldWVCdWZmZXI6IGVycm9yIHdhaXRpbmcgZm9yIGZlbmNlOiAlI3giLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gRUdMX1RJTUVPVVRfRVhQSVJFRF9LSFIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlQnVmZmVyOiB0aW1lb3V0IHdhaXRpbmcgZm9yIGZlbmNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWdsRGVzdHJveVN5bmNLSFIoZHB5LCBmZW5jZSk7Ci0KLSAgICB9Ci0KLSAgICBTVF9MT0dWKCJkZXF1ZXVlQnVmZmVyOiByZXR1cm5pbmcgc2xvdD0lZCBidWY9JXAgZmxhZ3M9JSN4IiwgKm91dEJ1ZiwKLSAgICAgICAgICAgIG1TbG90c1sqb3V0QnVmXS5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlLCByZXR1cm5GbGFncyk7Ci0KLSAgICByZXR1cm4gcmV0dXJuRmxhZ3M7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpzZXRTeW5jaHJvbm91c01vZGUoYm9vbCBlbmFibGVkKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBTVF9MT0dWKCJzZXRTeW5jaHJvbm91c01vZGU6IGVuYWJsZWQ9JWQiLCBlbmFibGVkKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKG1BYmFuZG9uZWQpIHsKLSAgICAgICAgU1RfTE9HRSgic2V0U3luY2hyb25vdXNNb2RlOiBTdXJmYWNlVGV4dHVyZSBoYXMgYmVlbiBhYmFuZG9uZWQhIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIGlmICghbUFsbG93U3luY2hyb25vdXNNb2RlICYmIGVuYWJsZWQpCi0gICAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpZiAoIWVuYWJsZWQpIHsKLSAgICAgICAgLy8gZ29pbmcgdG8gYXN5bmNocm9ub3VzIG1vZGUsIGRyYWluIHRoZSBxdWV1ZQotICAgICAgICBlcnIgPSBkcmFpblF1ZXVlTG9ja2VkKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChtU3luY2hyb25vdXNNb2RlICE9IGVuYWJsZWQpIHsKLSAgICAgICAgLy8gLSBpZiB3ZSdyZSBnb2luZyB0byBhc3luY2hyb25vdXMgbW9kZSwgdGhlIHF1ZXVlIGlzIGd1YXJhbnRlZWQgdG8gYmUKLSAgICAgICAgLy8gZW1wdHkgaGVyZQotICAgICAgICAvLyAtIGlmIHRoZSBjbGllbnQgc2V0IHRoZSBudW1iZXIgb2YgYnVmZmVycywgd2UncmUgZ3VhcmFudGVlZCB0aGF0Ci0gICAgICAgIC8vIHdlIGhhdmUgYXQgbGVhc3QgMyAoYmVjYXVzZSB3ZSBkb24ndCBhbGxvdyBsZXNzKQotICAgICAgICBtU3luY2hyb25vdXNNb2RlID0gZW5hYmxlZDsKLSAgICAgICAgbURlcXVldWVDb25kaXRpb24uc2lnbmFsKCk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpxdWV1ZUJ1ZmZlcihpbnQgYnVmLCBpbnQ2NF90IHRpbWVzdGFtcCwKLSAgICAgICAgdWludDMyX3QqIG91dFdpZHRoLCB1aW50MzJfdCogb3V0SGVpZ2h0LCB1aW50MzJfdCogb3V0VHJhbnNmb3JtKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBVFJBQ0VfQlVGRkVSX0lOREVYKGJ1Zik7Ci0KLSAgICBTVF9MT0dWKCJxdWV1ZUJ1ZmZlcjogc2xvdD0lZCB0aW1lPSVsbGQiLCBidWYsIHRpbWVzdGFtcCk7Ci0KLSAgICBzcDxGcmFtZUF2YWlsYWJsZUxpc3RlbmVyPiBsaXN0ZW5lcjsKLQotICAgIHsgLy8gc2NvcGUgZm9yIHRoZSBsb2NrCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgICAgICBTVF9MT0dFKCJxdWV1ZUJ1ZmZlcjogU3VyZmFjZVRleHR1cmUgaGFzIGJlZW4gYWJhbmRvbmVkISIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZiA8IDAgfHwgYnVmID49IG1CdWZmZXJDb3VudCkgewotICAgICAgICAgICAgU1RfTE9HRSgicXVldWVCdWZmZXI6IHNsb3QgaW5kZXggb3V0IG9mIHJhbmdlIFswLCAlZF06ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckNvdW50LCBidWYpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0gZWxzZSBpZiAobVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlICE9IEJ1ZmZlclNsb3Q6OkRFUVVFVUVEKSB7Ci0gICAgICAgICAgICBTVF9MT0dFKCJxdWV1ZUJ1ZmZlcjogc2xvdCAlZCBpcyBub3Qgb3duZWQgYnkgdGhlIGNsaWVudCAiCi0gICAgICAgICAgICAgICAgICAgICIoc3RhdGU9JWQpIiwgYnVmLCBtU2xvdHNbYnVmXS5tQnVmZmVyU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1TbG90c1tidWZdLm1SZXF1ZXN0QnVmZmVyQ2FsbGVkKSB7Ci0gICAgICAgICAgICBTVF9MT0dFKCJxdWV1ZUJ1ZmZlcjogc2xvdCAlZCB3YXMgZW5xdWV1ZWQgd2l0aG91dCByZXF1ZXN0aW5nIGEgIgotICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIiwgYnVmKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TeW5jaHJvbm91c01vZGUpIHsKLSAgICAgICAgICAgIC8vIEluIHN5bmNocm9ub3VzIG1vZGUgd2UgcXVldWUgYWxsIGJ1ZmZlcnMgaW4gYSBGSUZPLgotICAgICAgICAgICAgbVF1ZXVlLnB1c2hfYmFjayhidWYpOwotCi0gICAgICAgICAgICAvLyBTeW5jaHJvbm91cyBtb2RlIGFsd2F5cyBzaWduYWxzIHRoYXQgYW4gYWRkaXRpb25hbCBmcmFtZSBzaG91bGQKLSAgICAgICAgICAgIC8vIGJlIGNvbnN1bWVkLgotICAgICAgICAgICAgbGlzdGVuZXIgPSBtRnJhbWVBdmFpbGFibGVMaXN0ZW5lcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEluIGFzeW5jaHJvbm91cyBtb2RlIHdlIG9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgYnVmZmVyLgotICAgICAgICAgICAgaWYgKG1RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVF1ZXVlLnB1c2hfYmFjayhidWYpOwotCi0gICAgICAgICAgICAgICAgLy8gQXN5bmNocm9ub3VzIG1vZGUgb25seSBzaWduYWxzIHRoYXQgYSBmcmFtZSBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAvLyBjb25zdW1lZCBpZiBubyBwcmV2aW91cyBmcmFtZSB3YXMgcGVuZGluZy4gSWYgYSBmcmFtZSB3ZXJlCi0gICAgICAgICAgICAgICAgLy8gcGVuZGluZyB0aGVuIHRoZSBjb25zdW1lciB3b3VsZCBoYXZlIGFscmVhZHkgYmVlbiBub3RpZmllZC4KLSAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG1GcmFtZUF2YWlsYWJsZUxpc3RlbmVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGaWZvOjppdGVyYXRvciBmcm9udChtUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgLy8gYnVmZmVyIGN1cnJlbnRseSBxdWV1ZWQgaXMgZnJlZWQKLSAgICAgICAgICAgICAgICBtU2xvdHNbKmZyb250XS5tQnVmZmVyU3RhdGUgPSBCdWZmZXJTbG90OjpGUkVFOwotICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSByZWNvcmQgdGhlIG5ldyBidWZmZXIgaW5kZXggaW4gdGhlIHF1ZXVlZCBsaXN0Ci0gICAgICAgICAgICAgICAgKmZyb250ID0gYnVmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlID0gQnVmZmVyU2xvdDo6UVVFVUVEOwotICAgICAgICBtU2xvdHNbYnVmXS5tQ3JvcCA9IG1OZXh0Q3JvcDsKLSAgICAgICAgbVNsb3RzW2J1Zl0ubVRyYW5zZm9ybSA9IG1OZXh0VHJhbnNmb3JtOwotICAgICAgICBtU2xvdHNbYnVmXS5tU2NhbGluZ01vZGUgPSBtTmV4dFNjYWxpbmdNb2RlOwotICAgICAgICBtU2xvdHNbYnVmXS5tVGltZXN0YW1wID0gdGltZXN0YW1wOwotICAgICAgICBtRnJhbWVDb3VudGVyKys7Ci0gICAgICAgIG1TbG90c1tidWZdLm1GcmFtZU51bWJlciA9IG1GcmFtZUNvdW50ZXI7Ci0KLSAgICAgICAgbUJ1ZmZlckhhc0JlZW5RdWV1ZWQgPSB0cnVlOwotICAgICAgICBtRGVxdWV1ZUNvbmRpdGlvbi5zaWduYWwoKTsKLQotICAgICAgICAqb3V0V2lkdGggPSBtRGVmYXVsdFdpZHRoOwotICAgICAgICAqb3V0SGVpZ2h0ID0gbURlZmF1bHRIZWlnaHQ7Ci0gICAgICAgICpvdXRUcmFuc2Zvcm0gPSAwOwotCi0gICAgICAgIEFUUkFDRV9JTlQobUNvbnN1bWVyTmFtZS5zdHJpbmcoKSwgbVF1ZXVlLnNpemUoKSk7Ci0gICAgfSAvLyBzY29wZSBmb3IgdGhlIGxvY2sKLQotICAgIC8vIGNhbGwgYmFjayB3aXRob3V0IGxvY2sgaGVsZAotICAgIGlmIChsaXN0ZW5lciAhPSAwKSB7Ci0gICAgICAgIGxpc3RlbmVyLT5vbkZyYW1lQXZhaWxhYmxlKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBCdWZmZXJRdWV1ZTo6Y2FuY2VsQnVmZmVyKGludCBidWYpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIFNUX0xPR1YoImNhbmNlbEJ1ZmZlcjogc2xvdD0lZCIsIGJ1Zik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgIFNUX0xPR1coImNhbmNlbEJ1ZmZlcjogQnVmZmVyUXVldWUgaGFzIGJlZW4gYWJhbmRvbmVkISIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGJ1ZiA8IDAgfHwgYnVmID49IG1CdWZmZXJDb3VudCkgewotICAgICAgICBTVF9MT0dFKCJjYW5jZWxCdWZmZXI6IHNsb3QgaW5kZXggb3V0IG9mIHJhbmdlIFswLCAlZF06ICVkIiwKLSAgICAgICAgICAgICAgICBtQnVmZmVyQ291bnQsIGJ1Zik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKG1TbG90c1tidWZdLm1CdWZmZXJTdGF0ZSAhPSBCdWZmZXJTbG90OjpERVFVRVVFRCkgewotICAgICAgICBTVF9MT0dFKCJjYW5jZWxCdWZmZXI6IHNsb3QgJWQgaXMgbm90IG93bmVkIGJ5IHRoZSBjbGllbnQgKHN0YXRlPSVkKSIsCi0gICAgICAgICAgICAgICAgYnVmLCBtU2xvdHNbYnVmXS5tQnVmZmVyU3RhdGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1TbG90c1tidWZdLm1CdWZmZXJTdGF0ZSA9IEJ1ZmZlclNsb3Q6OkZSRUU7Ci0gICAgbVNsb3RzW2J1Zl0ubUZyYW1lTnVtYmVyID0gMDsKLSAgICBtRGVxdWV1ZUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotc3RhdHVzX3QgQnVmZmVyUXVldWU6OnNldENyb3AoY29uc3QgUmVjdCYgY3JvcCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgU1RfTE9HVigic2V0Q3JvcDogY3JvcD1bJWQsJWQsJWQsJWRdIiwgY3JvcC5sZWZ0LCBjcm9wLnRvcCwgY3JvcC5yaWdodCwKLSAgICAgICAgICAgIGNyb3AuYm90dG9tKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgaWYgKG1BYmFuZG9uZWQpIHsKLSAgICAgICAgU1RfTE9HRSgic2V0Q3JvcDogQnVmZmVyUXVldWUgaGFzIGJlZW4gYWJhbmRvbmVkISIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgbU5leHRDcm9wID0gY3JvcDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpzZXRUcmFuc2Zvcm0odWludDMyX3QgdHJhbnNmb3JtKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBTVF9MT0dWKCJzZXRUcmFuc2Zvcm06IHhmb3JtPSUjeCIsIHRyYW5zZm9ybSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBpZiAobUFiYW5kb25lZCkgewotICAgICAgICBTVF9MT0dFKCJzZXRUcmFuc2Zvcm06IEJ1ZmZlclF1ZXVlIGhhcyBiZWVuIGFiYW5kb25lZCEiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIG1OZXh0VHJhbnNmb3JtID0gdHJhbnNmb3JtOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQnVmZmVyUXVldWU6OnNldFNjYWxpbmdNb2RlKGludCBtb2RlKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBTVF9MT0dWKCJzZXRTY2FsaW5nTW9kZTogbW9kZT0lZCIsIG1vZGUpOwotCi0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfRlJFRVpFOgotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgU1RfTE9HRSgidW5rbm93biBzY2FsaW5nIG1vZGU6ICVkIiwgbW9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgbU5leHRTY2FsaW5nTW9kZSA9IG1vZGU7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6Y29ubmVjdChpbnQgYXBpLAotICAgICAgICB1aW50MzJfdCogb3V0V2lkdGgsIHVpbnQzMl90KiBvdXRIZWlnaHQsIHVpbnQzMl90KiBvdXRUcmFuc2Zvcm0pIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIFNUX0xPR1YoImNvbm5lY3Q6IGFwaT0lZCIsIGFwaSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgIFNUX0xPR0UoImNvbm5lY3Q6IEJ1ZmZlclF1ZXVlIGhhcyBiZWVuIGFiYW5kb25lZCEiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgaW50IGVyciA9IE5PX0VSUk9SOwotICAgIHN3aXRjaCAoYXBpKSB7Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfRUdMOgotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0NQVToKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9NRURJQToKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkE6Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3RlZEFwaSAhPSBOT19DT05ORUNURURfQVBJKSB7Ci0gICAgICAgICAgICAgICAgU1RfTE9HRSgiY29ubmVjdDogYWxyZWFkeSBjb25uZWN0ZWQgKGN1cj0lZCwgcmVxPSVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkQXBpLCBhcGkpOwotICAgICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRBcGkgPSBhcGk7Ci0gICAgICAgICAgICAgICAgKm91dFdpZHRoID0gbURlZmF1bHRXaWR0aDsKLSAgICAgICAgICAgICAgICAqb3V0SGVpZ2h0ID0gbURlZmF1bHRIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgKm91dFRyYW5zZm9ybSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBtQnVmZmVySGFzQmVlblF1ZXVlZCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQnVmZmVyUXVldWU6OmRpc2Nvbm5lY3QoaW50IGFwaSkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgU1RfTE9HVigiZGlzY29ubmVjdDogYXBpPSVkIiwgYXBpKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKG1BYmFuZG9uZWQpIHsKLSAgICAgICAgLy8gaXQgaXMgbm90IHJlYWxseSBhbiBlcnJvciB0byBkaXNjb25uZWN0IGFmdGVyIHRoZSBzdXJmYWNlCi0gICAgICAgIC8vIGhhcyBiZWVuIGFiYW5kb25lZCwgaXQgc2hvdWxkIGp1c3QgYmUgYSBuby1vcC4KLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIGludCBlcnIgPSBOT19FUlJPUjsKLSAgICBzd2l0Y2ggKGFwaSkgewotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0VHTDoKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9DUFU6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfTUVESUE6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBOgotICAgICAgICAgICAgaWYgKG1Db25uZWN0ZWRBcGkgPT0gYXBpKSB7Ci0gICAgICAgICAgICAgICAgZHJhaW5RdWV1ZUFuZEZyZWVCdWZmZXJzTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3RlZEFwaSA9IE5PX0NPTk5FQ1RFRF9BUEk7Ci0gICAgICAgICAgICAgICAgbU5leHRDcm9wLm1ha2VJbnZhbGlkKCk7Ci0gICAgICAgICAgICAgICAgbU5leHRTY2FsaW5nTW9kZSA9IE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX0ZSRUVaRTsKLSAgICAgICAgICAgICAgICBtTmV4dFRyYW5zZm9ybSA9IDA7Ci0gICAgICAgICAgICAgICAgbURlcXVldWVDb25kaXRpb24uc2lnbmFsKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNUX0xPR0UoImRpc2Nvbm5lY3Q6IGNvbm5lY3RlZCB0byBhbm90aGVyIGFwaSAoY3VyPSVkLCByZXE9JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRBcGksIGFwaSk7Ci0gICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgU1RfTE9HRSgiZGlzY29ubmVjdDogdW5rbm93biBBUEkgJWQiLCBhcGkpOwotICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIEJ1ZmZlclF1ZXVlOjpkdW1wKFN0cmluZzgmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKLSAgICBCdWZmZXJRdWV1ZTo6ZHVtcChyZXN1bHQsICIiLCBidWZmZXIsIDEwMjQpOwotfQotCi12b2lkIEJ1ZmZlclF1ZXVlOjpkdW1wKFN0cmluZzgmIHJlc3VsdCwgY29uc3QgY2hhciogcHJlZml4LAotICAgICAgICBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICIlc25leHQgICA6IHtjcm9wPVslZCwlZCwlZCwlZF0sIHRyYW5zZm9ybT0weCUwMnh9XG4iCi0gICAgICAgICAgICAscHJlZml4LCBtTmV4dENyb3AubGVmdCwgbU5leHRDcm9wLnRvcCwgbU5leHRDcm9wLnJpZ2h0LAotICAgICAgICAgICAgbU5leHRDcm9wLmJvdHRvbSwgbU5leHRUcmFuc2Zvcm0KLSAgICApOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIFN0cmluZzggZmlmbzsKLSAgICBpbnQgZmlmb1NpemUgPSAwOwotICAgIEZpZm86OmNvbnN0X2l0ZXJhdG9yIGkobVF1ZXVlLmJlZ2luKCkpOwotICAgIHdoaWxlIChpICE9IG1RdWV1ZS5lbmQoKSkgewotICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUwMmQgIiwgKmkrKyk7Ci0gICAgICAgZmlmb1NpemUrKzsKLSAgICAgICBmaWZvLmFwcGVuZChidWZmZXIpOwotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICIlcy1CdWZmZXJRdWV1ZSBtQnVmZmVyQ291bnQ9JWQsIG1TeW5jaHJvbm91c01vZGU9JWQsIGRlZmF1bHQtc2l6ZT1bJWR4JWRdLCAiCi0gICAgICAgICAgICAibVBpeGVsRm9ybWF0PSVkLCBGSUZPKCVkKT17JXN9XG4iLAotICAgICAgICAgICAgcHJlZml4LCBtQnVmZmVyQ291bnQsIG1TeW5jaHJvbm91c01vZGUsIG1EZWZhdWx0V2lkdGgsCi0gICAgICAgICAgICBtRGVmYXVsdEhlaWdodCwgbVBpeGVsRm9ybWF0LCBmaWZvU2l6ZSwgZmlmby5zdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0KLSAgICBzdHJ1Y3QgewotICAgICAgICBjb25zdCBjaGFyICogb3BlcmF0b3IoKShpbnQgc3RhdGUpIGNvbnN0IHsKLSAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEJ1ZmZlclNsb3Q6OkRFUVVFVUVEOiByZXR1cm4gIkRFUVVFVUVEIjsKLSAgICAgICAgICAgICAgICBjYXNlIEJ1ZmZlclNsb3Q6OlFVRVVFRDogcmV0dXJuICJRVUVVRUQiOwotICAgICAgICAgICAgICAgIGNhc2UgQnVmZmVyU2xvdDo6RlJFRTogcmV0dXJuICJGUkVFIjsKLSAgICAgICAgICAgICAgICBjYXNlIEJ1ZmZlclNsb3Q6OkFDUVVJUkVEOiByZXR1cm4gIkFDUVVJUkVEIjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVua25vd24iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBzdGF0ZU5hbWU7Ci0KLSAgICBmb3IgKGludCBpPTAgOyBpPG1CdWZmZXJDb3VudCA7IGkrKykgewotICAgICAgICBjb25zdCBCdWZmZXJTbG90JiBzbG90KG1TbG90c1tpXSk7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICAgICAiJXMlc1slMDJkXSAiCi0gICAgICAgICAgICAgICAgInN0YXRlPSUtOHMsIGNyb3A9WyVkLCVkLCVkLCVkXSwgIgotICAgICAgICAgICAgICAgICJ0cmFuc2Zvcm09MHglMDJ4LCB0aW1lc3RhbXA9JWxsZCIsCi0gICAgICAgICAgICAgICAgcHJlZml4LCAoc2xvdC5tQnVmZmVyU3RhdGUgPT0gQnVmZmVyU2xvdDo6QUNRVUlSRUQpPyI+IjoiICIsIGksCi0gICAgICAgICAgICAgICAgc3RhdGVOYW1lKHNsb3QubUJ1ZmZlclN0YXRlKSwKLSAgICAgICAgICAgICAgICBzbG90Lm1Dcm9wLmxlZnQsIHNsb3QubUNyb3AudG9wLCBzbG90Lm1Dcm9wLnJpZ2h0LAotICAgICAgICAgICAgICAgIHNsb3QubUNyb3AuYm90dG9tLCBzbG90Lm1UcmFuc2Zvcm0sIHNsb3QubVRpbWVzdGFtcAotICAgICAgICApOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZihzbG90Lm1HcmFwaGljQnVmZmVyKTsKLSAgICAgICAgaWYgKGJ1ZiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAgICAgICAgICIsICVwIFslNHV4JTR1OiU0dSwlM1hdIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmLT5oYW5kbGUsIGJ1Zi0+d2lkdGgsIGJ1Zi0+aGVpZ2h0LCBidWYtPnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgYnVmLT5mb3JtYXQpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgfQotfQotCi12b2lkIEJ1ZmZlclF1ZXVlOjpmcmVlQnVmZmVyTG9ja2VkKGludCBpKSB7Ci0gICAgbVNsb3RzW2ldLm1HcmFwaGljQnVmZmVyID0gMDsKLSAgICBtU2xvdHNbaV0ubUJ1ZmZlclN0YXRlID0gQnVmZmVyU2xvdDo6RlJFRTsKLSAgICBtU2xvdHNbaV0ubUZyYW1lTnVtYmVyID0gMDsKLSAgICBtU2xvdHNbaV0ubUFjcXVpcmVDYWxsZWQgPSBmYWxzZTsKLQotICAgIC8vIGRlc3Ryb3kgZmVuY2UgYXMgQnVmZmVyUXVldWUgbm93IHRha2VzIG93bmVyc2hpcAotICAgIGlmIChtU2xvdHNbaV0ubUZlbmNlICE9IEVHTF9OT19TWU5DX0tIUikgewotICAgICAgICBlZ2xEZXN0cm95U3luY0tIUihtU2xvdHNbaV0ubUVnbERpc3BsYXksIG1TbG90c1tpXS5tRmVuY2UpOwotICAgICAgICBtU2xvdHNbaV0ubUZlbmNlID0gRUdMX05PX1NZTkNfS0hSOwotICAgIH0KLX0KLQotdm9pZCBCdWZmZXJRdWV1ZTo6ZnJlZUFsbEJ1ZmZlcnNMb2NrZWQoKSB7Ci0gICAgQUxPR1dfSUYoIW1RdWV1ZS5pc0VtcHR5KCksCi0gICAgICAgICAgICAiZnJlZUFsbEJ1ZmZlcnNMb2NrZWQgY2FsbGVkIGJ1dCBtUXVldWUgaXMgbm90IGVtcHR5Iik7Ci0gICAgbVF1ZXVlLmNsZWFyKCk7Ci0gICAgbUJ1ZmZlckhhc0JlZW5RdWV1ZWQgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7IGkrKykgewotICAgICAgICBmcmVlQnVmZmVyTG9ja2VkKGkpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQnVmZmVyUXVldWU6OmFjcXVpcmUoQnVmZmVySXRlbSAqYnVmZmVyKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICAvLyBjaGVjayBpZiBxdWV1ZSBpcyBlbXB0eQotICAgIC8vIEluIGFzeW5jaHJvbm91cyBtb2RlIHRoZSBsaXN0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb25lIGJ1ZmZlcgotICAgIC8vIGRlZXAsIHdoaWxlIGluIHN5bmNocm9ub3VzIG1vZGUgd2UgdXNlIHRoZSBvbGRlc3QgYnVmZmVyLgotICAgIGlmICghbVF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgRmlmbzo6aXRlcmF0b3IgZnJvbnQobVF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBpbnQgYnVmID0gKmZyb250OwotCi0gICAgICAgIEFUUkFDRV9CVUZGRVJfSU5ERVgoYnVmKTsKLQotICAgICAgICBpZiAobVNsb3RzW2J1Zl0ubUFjcXVpcmVDYWxsZWQpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+bUdyYXBoaWNCdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYnVmZmVyLT5tR3JhcGhpY0J1ZmZlciA9IG1TbG90c1tidWZdLm1HcmFwaGljQnVmZmVyOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlci0+bUNyb3AgPSBtU2xvdHNbYnVmXS5tQ3JvcDsKLSAgICAgICAgYnVmZmVyLT5tVHJhbnNmb3JtID0gbVNsb3RzW2J1Zl0ubVRyYW5zZm9ybTsKLSAgICAgICAgYnVmZmVyLT5tU2NhbGluZ01vZGUgPSBtU2xvdHNbYnVmXS5tU2NhbGluZ01vZGU7Ci0gICAgICAgIGJ1ZmZlci0+bUZyYW1lTnVtYmVyID0gbVNsb3RzW2J1Zl0ubUZyYW1lTnVtYmVyOwotICAgICAgICBidWZmZXItPm1UaW1lc3RhbXAgPSBtU2xvdHNbYnVmXS5tVGltZXN0YW1wOwotICAgICAgICBidWZmZXItPm1CdWYgPSBidWY7Ci0gICAgICAgIG1TbG90c1tidWZdLm1BY3F1aXJlQ2FsbGVkID0gdHJ1ZTsKLQotICAgICAgICBtU2xvdHNbYnVmXS5tQnVmZmVyU3RhdGUgPSBCdWZmZXJTbG90OjpBQ1FVSVJFRDsKLSAgICAgICAgbVF1ZXVlLmVyYXNlKGZyb250KTsKLQotICAgICAgICBBVFJBQ0VfSU5UKG1Db25zdW1lck5hbWUuc3RyaW5nKCksIG1RdWV1ZS5zaXplKCkpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7IC8vc2hvdWxkIGJlIGEgYmV0dGVyIHJldHVybiBjb2RlCi0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6cmVsZWFzZUJ1ZmZlcihpbnQgYnVmLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgIEVHTFN5bmNLSFIgZmVuY2UpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFUUkFDRV9CVUZGRVJfSU5ERVgoYnVmKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotCi0gICAgaWYgKGJ1ZiA9PSBJTlZBTElEX0JVRkZFUl9TTE9UKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1TbG90c1tidWZdLm1FZ2xEaXNwbGF5ID0gZGlzcGxheTsKLSAgICBtU2xvdHNbYnVmXS5tRmVuY2UgPSBmZW5jZTsKLQotICAgIC8vIFRoZSBjdXJyZW50IGJ1ZmZlciBiZWNvbWVzIEZSRUUgaWYgaXQgd2FzIHN0aWxsIGluIHRoZSBxdWV1ZWQKLSAgICAvLyBzdGF0ZS4gSWYgaXQgaGFzIGFscmVhZHkgYmVlbiBnaXZlbiB0byB0aGUgY2xpZW50Ci0gICAgLy8gKHN5bmNocm9ub3VzIG1vZGUpLCB0aGVuIGl0IHN0YXlzIGluIERFUVVFVUVEIHN0YXRlLgotICAgIGlmIChtU2xvdHNbYnVmXS5tQnVmZmVyU3RhdGUgPT0gQnVmZmVyU2xvdDo6UVVFVUVECi0gICAgICAgICAgICB8fCBtU2xvdHNbYnVmXS5tQnVmZmVyU3RhdGUgPT0gQnVmZmVyU2xvdDo6QUNRVUlSRUQpIHsKLSAgICAgICAgbVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlID0gQnVmZmVyU2xvdDo6RlJFRTsKLSAgICB9Ci0gICAgbURlcXVldWVDb25kaXRpb24uc2lnbmFsKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpjb25zdW1lckRpc2Nvbm5lY3QoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICAvLyBPbmNlIHRoZSBTdXJmYWNlVGV4dHVyZSBkaXNjb25uZWN0cywgdGhlIEJ1ZmZlclF1ZXVlCi0gICAgLy8gaXMgY29uc2lkZXJlZCBhYmFuZG9uZWQKLSAgICBtQWJhbmRvbmVkID0gdHJ1ZTsKLSAgICBmcmVlQWxsQnVmZmVyc0xvY2tlZCgpOwotICAgIG1EZXF1ZXVlQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQnVmZmVyUXVldWU6OnNldERlZmF1bHRCdWZmZXJTaXplKHVpbnQzMl90IHcsIHVpbnQzMl90IGgpCi17Ci0gICAgU1RfTE9HVigic2V0RGVmYXVsdEJ1ZmZlclNpemU6IHc9JWQsIGg9JWQiLCB3LCBoKTsKLSAgICBpZiAoIXcgfHwgIWgpIHsKLSAgICAgICAgU1RfTE9HRSgic2V0RGVmYXVsdEJ1ZmZlclNpemU6IGRpbWVuc2lvbnMgY2Fubm90IGJlIDAgKHc9JWQsIGg9JWQpIiwKLSAgICAgICAgICAgICAgICB3LCBoKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIG1EZWZhdWx0V2lkdGggPSB3OwotICAgIG1EZWZhdWx0SGVpZ2h0ID0gaDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpzZXRCdWZmZXJDb3VudFNlcnZlcihpbnQgYnVmZmVyQ291bnQpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgcmV0dXJuIHNldEJ1ZmZlckNvdW50U2VydmVyTG9ja2VkKGJ1ZmZlckNvdW50KTsKLX0KLQotdm9pZCBCdWZmZXJRdWV1ZTo6ZnJlZUFsbEJ1ZmZlcnNFeGNlcHRIZWFkTG9ja2VkKCkgewotICAgIEFMT0dXX0lGKCFtUXVldWUuaXNFbXB0eSgpLAotICAgICAgICAgICAgImZyZWVBbGxCdWZmZXJzRXhjZXB0Q3VycmVudExvY2tlZCBjYWxsZWQgYnV0IG1RdWV1ZSBpcyBub3QgZW1wdHkiKTsKLSAgICBpbnQgaGVhZCA9IC0xOwotICAgIGlmICghbVF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgRmlmbzo6aXRlcmF0b3IgZnJvbnQobVF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBoZWFkID0gKmZyb250OwotICAgIH0KLSAgICBtQnVmZmVySGFzQmVlblF1ZXVlZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgaSsrKSB7Ci0gICAgICAgIGlmIChpICE9IGhlYWQpIHsKLSAgICAgICAgICAgIGZyZWVCdWZmZXJMb2NrZWQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpkcmFpblF1ZXVlTG9ja2VkKCkgewotICAgIHdoaWxlIChtU3luY2hyb25vdXNNb2RlICYmICFtUXVldWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIG1EZXF1ZXVlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICAgICAgaWYgKG1BYmFuZG9uZWQpIHsKLSAgICAgICAgICAgIFNUX0xPR0UoImRyYWluUXVldWVMb2NrZWQ6IEJ1ZmZlclF1ZXVlIGhhcyBiZWVuIGFiYW5kb25lZCEiKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ29ubmVjdGVkQXBpID09IE5PX0NPTk5FQ1RFRF9BUEkpIHsKLSAgICAgICAgICAgIFNUX0xPR0UoImRyYWluUXVldWVMb2NrZWQ6IEJ1ZmZlclF1ZXVlIGlzIG5vdCBjb25uZWN0ZWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpkcmFpblF1ZXVlQW5kRnJlZUJ1ZmZlcnNMb2NrZWQoKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gZHJhaW5RdWV1ZUxvY2tlZCgpOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKG1TeW5jaHJvbm91c01vZGUpIHsKLSAgICAgICAgICAgIGZyZWVBbGxCdWZmZXJzTG9ja2VkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcmVlQWxsQnVmZmVyc0V4Y2VwdEhlYWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuY3BwIGIvbGlicy9ndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjc5MGFkLi4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL0Rpc3BsYXlFdmVudFJlY2VpdmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxndWkvQml0VHViZS5oPgotI2luY2x1ZGUgPGd1aS9EaXNwbGF5RXZlbnRSZWNlaXZlci5oPgotI2luY2x1ZGUgPGd1aS9JRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL2d1aS9Db21wb3NlclNlcnZpY2UuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURpc3BsYXlFdmVudFJlY2VpdmVyOjpEaXNwbGF5RXZlbnRSZWNlaXZlcigpIHsKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBzZihDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpKTsKLSAgICBpZiAoc2YgIT0gTlVMTCkgewotICAgICAgICBtRXZlbnRDb25uZWN0aW9uID0gc2YtPmNyZWF0ZURpc3BsYXlFdmVudENvbm5lY3Rpb24oKTsKLSAgICAgICAgaWYgKG1FdmVudENvbm5lY3Rpb24gIT0gTlVMTCkgewotICAgICAgICAgICAgbURhdGFDaGFubmVsID0gbUV2ZW50Q29ubmVjdGlvbi0+Z2V0RGF0YUNoYW5uZWwoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotRGlzcGxheUV2ZW50UmVjZWl2ZXI6On5EaXNwbGF5RXZlbnRSZWNlaXZlcigpIHsKLX0KLQotc3RhdHVzX3QgRGlzcGxheUV2ZW50UmVjZWl2ZXI6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICBpZiAobURhdGFDaGFubmVsICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotaW50IERpc3BsYXlFdmVudFJlY2VpdmVyOjpnZXRGZCgpIGNvbnN0IHsKLSAgICBpZiAobURhdGFDaGFubmVsID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOT19JTklUOwotCi0gICAgcmV0dXJuIG1EYXRhQ2hhbm5lbC0+Z2V0RmQoKTsKLX0KLQotc3RhdHVzX3QgRGlzcGxheUV2ZW50UmVjZWl2ZXI6OnNldFZzeW5jUmF0ZSh1aW50MzJfdCBjb3VudCkgewotICAgIGlmIChpbnQzMl90KGNvdW50KSA8IDApCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBpZiAobUV2ZW50Q29ubmVjdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgIG1FdmVudENvbm5lY3Rpb24tPnNldFZzeW5jUmF0ZShjb3VudCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLXN0YXR1c190IERpc3BsYXlFdmVudFJlY2VpdmVyOjpyZXF1ZXN0TmV4dFZzeW5jKCkgewotICAgIGlmIChtRXZlbnRDb25uZWN0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgbUV2ZW50Q29ubmVjdGlvbi0+cmVxdWVzdE5leHRWc3luYygpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi0KLXNzaXplX3QgRGlzcGxheUV2ZW50UmVjZWl2ZXI6OmdldEV2ZW50cyhEaXNwbGF5RXZlbnRSZWNlaXZlcjo6RXZlbnQqIGV2ZW50cywKLSAgICAgICAgc2l6ZV90IGNvdW50KSB7Ci0gICAgcmV0dXJuIERpc3BsYXlFdmVudFJlY2VpdmVyOjpnZXRFdmVudHMobURhdGFDaGFubmVsLCBldmVudHMsIGNvdW50KTsKLX0KLQotc3NpemVfdCBEaXNwbGF5RXZlbnRSZWNlaXZlcjo6Z2V0RXZlbnRzKGNvbnN0IHNwPEJpdFR1YmU+JiBkYXRhQ2hhbm5lbCwKLSAgICAgICAgRXZlbnQqIGV2ZW50cywgc2l6ZV90IGNvdW50KQotewotICAgIHNzaXplX3Qgc2l6ZSA9IGRhdGFDaGFubmVsLT5yZWFkKGV2ZW50cywgc2l6ZW9mKGV2ZW50c1swXSkqY291bnQpOwotICAgIEFMT0dFX0lGKHNpemU8MCwKLSAgICAgICAgICAgICJEaXNwbGF5RXZlbnRSZWNlaXZlcjo6Z2V0RXZlbnRzIGVycm9yICglcykiLAotICAgICAgICAgICAgc3RyZXJyb3IoLXNpemUpKTsKLSAgICBpZiAoc2l6ZSA+PSAwKSB7Ci0gICAgICAgIC8vIE5vdGU6IGlmIChzaXplICUgc2l6ZW9mKGV2ZW50c1swXSkpICE9IDAsIHdlJ3ZlIGdvdCBhCi0gICAgICAgIC8vIHBhcnRpYWwgcmVhZC4gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBxdWV1ZSBmaWxlZCB1cCAoaWU6IGlmIHdlCi0gICAgICAgIC8vIGRpZG4ndCBwdWxsIGZyb20gaXQgZmFzdCBlbm91Z2gpLgotICAgICAgICAvLyBXZSBkaXNjYXJkIHRoZSBwYXJ0aWFsIGV2ZW50IGFuZCByZWx5IG9uIHRoZSBzZW5kZXIgdG8KLSAgICAgICAgLy8gcmUtc2VuZCB0aGUgZXZlbnQgaWYgYXBwcm9wcmlhdGUgKHNvbWUgZXZlbnRzLCBsaWtlIFZTWU5DCi0gICAgICAgIC8vIGNhbiBiZSBsb3N0IGZvcmV2ZXIpLgotCi0gICAgICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIGV2ZW50cyByZWFkCi0gICAgICAgIHNpemUgLz0gc2l6ZW9mKGV2ZW50c1swXSk7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmNwcCBiL2xpYnMvZ3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3ZDE3Ni4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9JRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlIDxndWkvSURpc3BsYXlFdmVudENvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxndWkvQml0VHViZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWVudW0gewotICAgIEdFVF9EQVRBX0NIQU5ORUwgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIFNFVF9WU1lOQ19SQVRFLAotICAgIFJFUVVFU1RfTkVYVF9WU1lOQwotfTsKLQotY2xhc3MgQnBEaXNwbGF5RXZlbnRDb25uZWN0aW9uIDogcHVibGljIEJwSW50ZXJmYWNlPElEaXNwbGF5RXZlbnRDb25uZWN0aW9uPgotewotcHVibGljOgotICAgIEJwRGlzcGxheUV2ZW50Q29ubmVjdGlvbihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJRGlzcGxheUV2ZW50Q29ubmVjdGlvbj4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzcDxCaXRUdWJlPiBnZXREYXRhQ2hhbm5lbCgpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRGlzcGxheUV2ZW50Q29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9EQVRBX0NIQU5ORUwsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBuZXcgQml0VHViZShyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldFZzeW5jUmF0ZSh1aW50MzJfdCBjb3VudCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRGlzcGxheUV2ZW50Q29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNvdW50KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9WU1lOQ19SQVRFLCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCByZXF1ZXN0TmV4dFZzeW5jKCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRGlzcGxheUV2ZW50Q29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFUVVFU1RfTkVYVF9WU1lOQywgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKERpc3BsYXlFdmVudENvbm5lY3Rpb24sICJhbmRyb2lkLmd1aS5EaXNwbGF5RXZlbnRDb25uZWN0aW9uIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5EaXNwbGF5RXZlbnRDb25uZWN0aW9uOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBHRVRfREFUQV9DSEFOTkVMOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURpc3BsYXlFdmVudENvbm5lY3Rpb24sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPEJpdFR1YmU+IGNoYW5uZWwoZ2V0RGF0YUNoYW5uZWwoKSk7Ci0gICAgICAgICAgICBjaGFubmVsLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfVlNZTkNfUkFURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEaXNwbGF5RXZlbnRDb25uZWN0aW9uLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzZXRWc3luY1JhdGUoZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVRVUVTVF9ORVhUX1ZTWU5DOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURpc3BsYXlFdmVudENvbm5lY3Rpb24sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcXVlc3ROZXh0VnN5bmMoKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuY3BwIGIvbGlicy9ndWkvSUdyYXBoaWNCdWZmZXJBbGxvYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MGE1ZTguLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvSUdyYXBoaWNCdWZmZXJBbGxvYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIHRhZyBhcyBzdXJmYWNlZmxpbmdlcgotI2RlZmluZSBMT0dfVEFHICJTdXJmYWNlRmxpbmdlciIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotCi0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgQ1JFQVRFX0dSQVBISUNfQlVGRkVSID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLX07Ci0KLWNsYXNzIEJwR3JhcGhpY0J1ZmZlckFsbG9jIDogcHVibGljIEJwSW50ZXJmYWNlPElHcmFwaGljQnVmZmVyQWxsb2M+Ci17Ci1wdWJsaWM6Ci0gICAgQnBHcmFwaGljQnVmZmVyQWxsb2MoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUdyYXBoaWNCdWZmZXJBbGxvYz4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzcDxHcmFwaGljQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCi0gICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlLCBzdGF0dXNfdCogZXJyb3IpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUdyYXBoaWNCdWZmZXJBbGxvYzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHcpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIodXNhZ2UpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX0dSQVBISUNfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7Ci0gICAgICAgICAgICByZXBseS5yZWFkKCpncmFwaGljQnVmZmVyKTsKLSAgICAgICAgICAgIC8vIHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKTsKLSAgICAgICAgICAgIC8vIGhlcmUgd2UgZG9uJ3QgZXZlbiBoYXZlIHRvIHJlYWQgdGhlIEJ1ZmZlclJlZmVyZW5jZSBmcm9tCi0gICAgICAgICAgICAvLyB0aGUgcGFyY2VsLCBpdCdsbCBkaWUgd2l0aCB0aGUgcGFyY2VsLgotICAgICAgICB9Ci0gICAgICAgICplcnJvciA9IHJlc3VsdDsKLSAgICAgICAgcmV0dXJuIGdyYXBoaWNCdWZmZXI7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEdyYXBoaWNCdWZmZXJBbGxvYywgImFuZHJvaWQudWkuSUdyYXBoaWNCdWZmZXJBbGxvYyIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuR3JhcGhpY0J1ZmZlckFsbG9jOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgLy8gY29kZXMgdGhhdCBkb24ndCByZXF1aXJlIHBlcm1pc3Npb24gY2hlY2sKLQotICAgIC8qIEJ1ZmZlclJlZmVyZW5jZSBqdXN0IGtlZXBzIGEgc3Ryb25nIHJlZmVyZW5jZSB0byBhCi0gICAgICogR3JhcGhpY0J1ZmZlciB1bnRpbCBpdCBpcyBkZXN0cm95ZWQgKHRoYXQgaXMsIHVudGlsCi0gICAgICogbm8gbG9jYWwgb3IgcmVtb3RlIHByb2Nlc3MgaGF2ZSBhIHJlZmVyZW5jZSB0byBpdCkuCi0gICAgICovCi0gICAgY2xhc3MgQnVmZmVyUmVmZXJlbmNlIDogcHVibGljIEJCaW5kZXIgewotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXI7Ci0gICAgcHVibGljOgotICAgICAgICBCdWZmZXJSZWZlcmVuY2UoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlcikgOiBidWZmZXIoYnVmZmVyKSB7IH0KLSAgICB9OwotCi0KLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIENSRUFURV9HUkFQSElDX0JVRkZFUjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElHcmFwaGljQnVmZmVyQWxsb2MsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQzMl90IHcgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgaCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgdXNhZ2UgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyb3I7Ci0gICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiByZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICBjcmVhdGVHcmFwaGljQnVmZmVyKHcsIGgsIGZvcm1hdCwgdXNhZ2UsICZlcnJvcik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnJvcik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoKnJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYWRkIGEgQnVmZmVyUmVmZXJlbmNlIHRvIHRoaXMgcGFyY2VsIHRvIG1ha2Ugc3VyZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBidWZmZXIgc3RheXMgYWxpdmUgdW50aWwgdGhlIEdyYXBoaWNCdWZmZXIgb2JqZWN0IG9uCi0gICAgICAgICAgICAgICAgLy8gdGhlIG90aGVyIHNpZGUgaGFzIGJlZW4gY3JlYXRlZC4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IHRoZSBidWZmZXIgaGFuZGxlIGNhbiBiZQotICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBidWZmZXIgaXMgZGVzdHJveWVkIG9uIGltcGxlbWVudGF0aW9ucwotICAgICAgICAgICAgICAgIC8vIHRoYXQgZG8gbm90IHVzZSBmaWxlLWRlc2NyaXB0b3JzIHRvIHRyYWNrIHRoZWlyIGJ1ZmZlcnMuCi0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKCBuZXcgQnVmZmVyUmVmZXJlbmNlKHJlc3VsdCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvSVNlbnNvckV2ZW50Q29ubmVjdGlvbi5jcHAgYi9saWJzL2d1aS9JU2Vuc29yRXZlbnRDb25uZWN0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1MWU4ZS4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9JU2Vuc29yRXZlbnRDb25uZWN0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlIDxndWkvSVNlbnNvckV2ZW50Q29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPGd1aS9CaXRUdWJlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZW51bSB7Ci0gICAgR0VUX1NFTlNPUl9DSEFOTkVMID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBFTkFCTEVfRElTQUJMRSwKLSAgICBTRVRfRVZFTlRfUkFURQotfTsKLQotY2xhc3MgQnBTZW5zb3JFdmVudENvbm5lY3Rpb24gOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVNlbnNvckV2ZW50Q29ubmVjdGlvbj4KLXsKLXB1YmxpYzoKLSAgICBCcFNlbnNvckV2ZW50Q29ubmVjdGlvbihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJU2Vuc29yRXZlbnRDb25uZWN0aW9uPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPEJpdFR1YmU+IGdldFNlbnNvckNoYW5uZWwoKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNlbnNvckV2ZW50Q29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TRU5TT1JfQ0hBTk5FTCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIG5ldyBCaXRUdWJlKHJlcGx5KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZURpc2FibGUoaW50IGhhbmRsZSwgYm9vbCBlbmFibGVkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNlbnNvckV2ZW50Q29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbmRsZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihlbmFibGVkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVOQUJMRV9ESVNBQkxFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFdmVudFJhdGUoaW50IGhhbmRsZSwgbnNlY3NfdCBucykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTZW5zb3JFdmVudENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlSW50NjQobnMpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0VWRU5UX1JBVEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU2Vuc29yRXZlbnRDb25uZWN0aW9uLCAiYW5kcm9pZC5ndWkuU2Vuc29yRXZlbnRDb25uZWN0aW9uIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5TZW5zb3JFdmVudENvbm5lY3Rpb246Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIEdFVF9TRU5TT1JfQ0hBTk5FTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTZW5zb3JFdmVudENvbm5lY3Rpb24sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPEJpdFR1YmU+IGNoYW5uZWwoZ2V0U2Vuc29yQ2hhbm5lbCgpKTsKLSAgICAgICAgICAgIGNoYW5uZWwtPndyaXRlVG9QYXJjZWwocmVwbHkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEVOQUJMRV9ESVNBQkxFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNlbnNvckV2ZW50Q29ubmVjdGlvbiwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGhhbmRsZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgZW5hYmxlZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBlbmFibGVEaXNhYmxlKGhhbmRsZSwgZW5hYmxlZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9FVkVOVF9SQVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNlbnNvckV2ZW50Q29ubmVjdGlvbiwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGhhbmRsZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgbnMgPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gc2V0RXZlbnRSYXRlKGhhbmRsZSwgbnMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0lTZW5zb3JTZXJ2ZXIuY3BwIGIvbGlicy9ndWkvSVNlbnNvclNlcnZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMTEwOTIuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvSVNlbnNvclNlcnZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotCi0jaW5jbHVkZSA8Z3VpL1NlbnNvci5oPgotI2luY2x1ZGUgPGd1aS9JU2Vuc29yU2VydmVyLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTZW5zb3JFdmVudENvbm5lY3Rpb24uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lbnVtIHsKLSAgICBHRVRfU0VOU09SX0xJU1QgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIENSRUFURV9TRU5TT1JfRVZFTlRfQ09OTkVDVElPTiwKLX07Ci0KLWNsYXNzIEJwU2Vuc29yU2VydmVyIDogcHVibGljIEJwSW50ZXJmYWNlPElTZW5zb3JTZXJ2ZXI+Ci17Ci1wdWJsaWM6Ci0gICAgQnBTZW5zb3JTZXJ2ZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SVNlbnNvclNlcnZlcj4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBWZWN0b3I8U2Vuc29yPiBnZXRTZW5zb3JMaXN0KCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTZW5zb3JTZXJ2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU0VOU09SX0xJU1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIFNlbnNvciBzOwotICAgICAgICBWZWN0b3I8U2Vuc29yPiB2OwotICAgICAgICBpbnQzMl90IG4gPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgdi5zZXRDYXBhY2l0eShuKTsKLSAgICAgICAgd2hpbGUgKG4tLSkgewotICAgICAgICAgICAgcmVwbHkucmVhZChzdGF0aWNfY2FzdDxGbGF0dGVuYWJsZSY+KHMpKTsKLSAgICAgICAgICAgIHYuYWRkKHMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2OwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SVNlbnNvckV2ZW50Q29ubmVjdGlvbj4gY3JlYXRlU2Vuc29yRXZlbnRDb25uZWN0aW9uKCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTZW5zb3JTZXJ2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfU0VOU09SX0VWRU5UX0NPTk5FQ1RJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJU2Vuc29yRXZlbnRDb25uZWN0aW9uPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTZW5zb3JTZXJ2ZXIsICJhbmRyb2lkLmd1aS5TZW5zb3JTZXJ2ZXIiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCblNlbnNvclNlcnZlcjo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgR0VUX1NFTlNPUl9MSVNUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNlbnNvclNlcnZlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgVmVjdG9yPFNlbnNvcj4gdihnZXRTZW5zb3JMaXN0KCkpOwotICAgICAgICAgICAgc2l6ZV90IG4gPSB2LnNpemUoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG4pOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHN0YXRpY19jYXN0PGNvbnN0IEZsYXR0ZW5hYmxlJj4odltpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIENSRUFURV9TRU5TT1JfRVZFTlRfQ09OTkVDVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTZW5zb3JTZXJ2ZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElTZW5zb3JFdmVudENvbm5lY3Rpb24+IGNvbm5lY3Rpb24oY3JlYXRlU2Vuc29yRXZlbnRDb25uZWN0aW9uKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGNvbm5lY3Rpb24tPmFzQmluZGVyKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvSVN1cmZhY2UuY3BwIGIvbGlicy9ndWkvSVN1cmZhY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmVhMTgzLi4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL0lTdXJmYWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIklTdXJmYWNlIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLQotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZVRleHR1cmUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJwU3VyZmFjZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJU3VyZmFjZT4KLXsKLXB1YmxpYzoKLSAgICBCcFN1cmZhY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SVN1cmZhY2U+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SVN1cmZhY2VUZXh0dXJlPiBnZXRTdXJmYWNlVGV4dHVyZSgpIGNvbnN0IHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1VSRkFDRV9URVhUVVJFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2VUZXh0dXJlPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTdXJmYWNlLCAiYW5kcm9pZC51aS5JU3VyZmFjZSIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuU3VyZmFjZTo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgR0VUX1NVUkZBQ0VfVEVYVFVSRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoIGdldFN1cmZhY2VUZXh0dXJlKCktPmFzQmluZGVyKCkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9JU3VyZmFjZUNvbXBvc2VyLmNwcCBiL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjE3OTRjLi4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyB0YWcgYXMgc3VyZmFjZWZsaW5nZXIKLSNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZUZsaW5nZXIiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotI2luY2x1ZGUgPGd1aS9CaXRUdWJlLmg+Ci0jaW5jbHVkZSA8Z3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VUZXh0dXJlLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL2d1aS9MYXllclN0YXRlLmg+Ci0KLSNpbmNsdWRlIDx1aS9EaXNwbGF5SW5mby5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElEaXNwbGF5RXZlbnRDb25uZWN0aW9uOwotCi1jbGFzcyBCcFN1cmZhY2VDb21wb3NlciA6IHB1YmxpYyBCcEludGVyZmFjZTxJU3VyZmFjZUNvbXBvc2VyPgotewotcHVibGljOgotICAgIEJwU3VyZmFjZUNvbXBvc2VyKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElTdXJmYWNlQ29tcG9zZXI+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SVN1cmZhY2VDb21wb3NlckNsaWVudD4gY3JlYXRlQ29ubmVjdGlvbigpCi0gICAgewotICAgICAgICB1aW50MzJfdCBuOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZUNvbXBvc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5TdXJmYWNlQ29tcG9zZXI6OkNSRUFURV9DT05ORUNUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2VDb21wb3NlckNsaWVudD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPElHcmFwaGljQnVmZmVyQWxsb2M+IGNyZWF0ZUdyYXBoaWNCdWZmZXJBbGxvYygpCi0gICAgewotICAgICAgICB1aW50MzJfdCBuOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZUNvbXBvc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5TdXJmYWNlQ29tcG9zZXI6OkNSRUFURV9HUkFQSElDX0JVRkZFUl9BTExPQywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElHcmFwaGljQnVmZmVyQWxsb2M+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0Q2JsaygpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZUNvbXBvc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5TdXJmYWNlQ29tcG9zZXI6OkdFVF9DQkxLLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldFRyYW5zYWN0aW9uU3RhdGUoY29uc3QgVmVjdG9yPENvbXBvc2VyU3RhdGU+JiBzdGF0ZSwKLSAgICAgICAgICAgIGludCBvcmllbnRhdGlvbiwgdWludDMyX3QgZmxhZ3MpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZUNvbXBvc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBWZWN0b3I8Q29tcG9zZXJTdGF0ZT46OmNvbnN0X2l0ZXJhdG9yIGIoc3RhdGUuYmVnaW4oKSk7Ci0gICAgICAgIFZlY3RvcjxDb21wb3NlclN0YXRlPjo6Y29uc3RfaXRlcmF0b3IgZShzdGF0ZS5lbmQoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0ZS5zaXplKCkpOwotICAgICAgICBmb3IgKCA7IGIgIT0gZSA7ICsrYiApIHsKLSAgICAgICAgICAgIGItPndyaXRlKGRhdGEpOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihvcmllbnRhdGlvbik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCblN1cmZhY2VDb21wb3Nlcjo6U0VUX1RSQU5TQUNUSU9OX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBib290RmluaXNoZWQoKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VDb21wb3Nlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEJuU3VyZmFjZUNvbXBvc2VyOjpCT09UX0ZJTklTSEVELCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZVNjcmVlbihEaXNwbGF5SUQgZHB5LAotICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+KiBoZWFwLAotICAgICAgICAgICAgdWludDMyX3QqIHdpZHRoLCB1aW50MzJfdCogaGVpZ2h0LCBQaXhlbEZvcm1hdCogZm9ybWF0LAotICAgICAgICAgICAgdWludDMyX3QgcmVxV2lkdGgsIHVpbnQzMl90IHJlcUhlaWdodCwKLSAgICAgICAgICAgIHVpbnQzMl90IG1pbkxheWVyWiwgdWludDMyX3QgbWF4TGF5ZXJaKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VDb21wb3Nlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGRweSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihyZXFXaWR0aCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihyZXFIZWlnaHQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobWluTGF5ZXJaKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG1heExheWVyWik7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCblN1cmZhY2VDb21wb3Nlcjo6Q0FQVFVSRV9TQ1JFRU4sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgICpoZWFwID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICp3aWR0aCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAqaGVpZ2h0ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICpmb3JtYXQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVybkVsZWN0cm9uQmVhbU9mZihpbnQzMl90IG1vZGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZUNvbXBvc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobW9kZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCblN1cmZhY2VDb21wb3Nlcjo6VFVSTl9FTEVDVFJPTl9CRUFNX09GRiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVybkVsZWN0cm9uQmVhbU9uKGludDMyX3QgbW9kZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlQ29tcG9zZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtb2RlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEJuU3VyZmFjZUNvbXBvc2VyOjpUVVJOX0VMRUNUUk9OX0JFQU1fT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgYXV0aGVudGljYXRlU3VyZmFjZVRleHR1cmUoCi0gICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZVRleHR1cmU+JiBzdXJmYWNlVGV4dHVyZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgaW50IGVyciA9IE5PX0VSUk9SOwotICAgICAgICBlcnIgPSBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCi0gICAgICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIklTdXJmYWNlQ29tcG9zZXI6OmF1dGhlbnRpY2F0ZVN1cmZhY2VUZXh0dXJlOiBlcnJvciB3cml0aW5nICIKLSAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBkZXNjcmlwdG9yOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc3VyZmFjZVRleHR1cmUtPmFzQmluZGVyKCkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSVN1cmZhY2VDb21wb3Nlcjo6YXV0aGVudGljYXRlU3VyZmFjZVRleHR1cmU6IGVycm9yIHdyaXRpbmcgIgotICAgICAgICAgICAgICAgICAgICAic3Ryb25nIGJpbmRlciB0byBwYXJjZWw6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KEJuU3VyZmFjZUNvbXBvc2VyOjpBVVRIRU5USUNBVEVfU1VSRkFDRSwgZGF0YSwKLSAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSVN1cmZhY2VDb21wb3Nlcjo6YXV0aGVudGljYXRlU3VyZmFjZVRleHR1cmU6IGVycm9yICIKLSAgICAgICAgICAgICAgICAgICAgInBlcmZvcm1pbmcgdHJhbnNhY3Rpb246ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCByZXN1bHQgPSAwOwotICAgICAgICBlcnIgPSByZXBseS5yZWFkSW50MzIoJnJlc3VsdCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJU3VyZmFjZUNvbXBvc2VyOjphdXRoZW50aWNhdGVTdXJmYWNlVGV4dHVyZTogZXJyb3IgIgotICAgICAgICAgICAgICAgICAgICAicmV0cmlldmluZyByZXN1bHQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdCAhPSAwOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SURpc3BsYXlFdmVudENvbm5lY3Rpb24+IGNyZWF0ZURpc3BsYXlFdmVudENvbm5lY3Rpb24oKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBzcDxJRGlzcGxheUV2ZW50Q29ubmVjdGlvbj4gcmVzdWx0OwotICAgICAgICBpbnQgZXJyID0gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAotICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KAotICAgICAgICAgICAgICAgIEJuU3VyZmFjZUNvbXBvc2VyOjpDUkVBVEVfRElTUExBWV9FVkVOVF9DT05ORUNUSU9OLAotICAgICAgICAgICAgICAgIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJU3VyZmFjZUNvbXBvc2VyOjpjcmVhdGVEaXNwbGF5RXZlbnRDb25uZWN0aW9uOiBlcnJvciBwZXJmb3JtaW5nICIKLSAgICAgICAgICAgICAgICAgICAgInRyYW5zYWN0aW9uOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSBpbnRlcmZhY2VfY2FzdDxJRGlzcGxheUV2ZW50Q29ubmVjdGlvbj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU3VyZmFjZUNvbXBvc2VyLCAiYW5kcm9pZC51aS5JU3VyZmFjZUNvbXBvc2VyIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5TdXJmYWNlQ29tcG9zZXI6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIENSRUFURV9DT05ORUNUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYiA9IGNyZWF0ZUNvbm5lY3Rpb24oKS0+YXNCaW5kZXIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihiKTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBDUkVBVEVfR1JBUEhJQ19CVUZGRVJfQUxMT0M6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZUNvbXBvc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiID0gY3JlYXRlR3JhcGhpY0J1ZmZlckFsbG9jKCktPmFzQmluZGVyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoYik7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1RSQU5TQUNUSU9OX1NUQVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIENvbXBvc2VyU3RhdGUgczsKLSAgICAgICAgICAgIFZlY3RvcjxDb21wb3NlclN0YXRlPiBzdGF0ZTsKLSAgICAgICAgICAgIHN0YXRlLnNldENhcGFjaXR5KGNvdW50KTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzLnJlYWQoZGF0YSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUuYWRkKHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IG9yaWVudGF0aW9uID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNldFRyYW5zYWN0aW9uU3RhdGUoc3RhdGUsIG9yaWVudGF0aW9uLCBmbGFncyk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgQk9PVF9GSU5JU0hFRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb3RGaW5pc2hlZCgpOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9DQkxLOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYiA9IGdldENibGsoKS0+YXNCaW5kZXIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihiKTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBDQVBUVVJFX1NDUkVFTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIERpc3BsYXlJRCBkcHkgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgcmVxV2lkdGggPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgcmVxSGVpZ2h0ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IG1pbkxheWVyWiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBtYXhMYXllclogPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXA7Ci0gICAgICAgICAgICB1aW50MzJfdCB3LCBoOwotICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZjsKLSAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGNhcHR1cmVTY3JlZW4oZHB5LCAmaGVhcCwgJncsICZoLCAmZiwKLSAgICAgICAgICAgICAgICAgICAgcmVxV2lkdGgsIHJlcUhlaWdodCwgbWluTGF5ZXJaLCBtYXhMYXllclopOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGhlYXAtPmFzQmluZGVyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGYpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzKTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBUVVJOX0VMRUNUUk9OX0JFQU1fT0ZGOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50MzJfdCBtb2RlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHR1cm5FbGVjdHJvbkJlYW1PZmYobW9kZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXMpOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFRVUk5fRUxFQ1RST05fQkVBTV9PTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludDMyX3QgbW9kZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSB0dXJuRWxlY3Ryb25CZWFtT24obW9kZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXMpOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEFVVEhFTlRJQ0FURV9TVVJGQUNFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBzdXJmYWNlVGV4dHVyZSA9Ci0gICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElTdXJmYWNlVGV4dHVyZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgaW50MzJfdCByZXN1bHQgPSBhdXRoZW50aWNhdGVTdXJmYWNlVGV4dHVyZShzdXJmYWNlVGV4dHVyZSkgPyAxIDogMDsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1JFQVRFX0RJU1BMQVlfRVZFTlRfQ09OTkVDVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiBjb25uZWN0aW9uKGNyZWF0ZURpc3BsYXlFdmVudENvbm5lY3Rpb24oKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoY29ubmVjdGlvbi0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuY3BwIGIvbGlicy9ndWkvSVN1cmZhY2VDb21wb3NlckNsaWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOWVkNWIuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvSVN1cmZhY2VDb21wb3NlckNsaWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIHRhZyBhcyBzdXJmYWNlZmxpbmdlcgotI2RlZmluZSBMT0dfVEFHICJTdXJmYWNlRmxpbmdlciIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLSNpbmNsdWRlIDx1aS9Qb2ludC5oPgotI2luY2x1ZGUgPHVpL1JlY3QuaD4KLQotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9ndWkvTGF5ZXJTdGF0ZS5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBDUkVBVEVfU1VSRkFDRSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgREVTVFJPWV9TVVJGQUNFCi19OwotCi1jbGFzcyBCcFN1cmZhY2VDb21wb3NlckNsaWVudCA6IHB1YmxpYyBCcEludGVyZmFjZTxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PgotewotcHVibGljOgotICAgIEJwU3VyZmFjZUNvbXBvc2VyQ2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SVN1cmZhY2U+IGNyZWF0ZVN1cmZhY2UoIHN1cmZhY2VfZGF0YV90KiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzgobmFtZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihkaXNwbGF5KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHcpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHBhcmFtcy0+cmVhZEZyb21QYXJjZWwocmVwbHkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2U+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95U3VyZmFjZShTdXJmYWNlSUQgc2lkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERVNUUk9ZX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU3VyZmFjZUNvbXBvc2VyQ2xpZW50LCAiYW5kcm9pZC51aS5JU3VyZmFjZUNvbXBvc2VyQ2xpZW50Iik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5TdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBDUkVBVEVfU1VSRkFDRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN1cmZhY2VfZGF0YV90IHBhcmFtczsKLSAgICAgICAgICAgIFN0cmluZzggbmFtZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKLSAgICAgICAgICAgIERpc3BsYXlJRCBkaXNwbGF5ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHcgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgaCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3A8SVN1cmZhY2U+IHMgPSBjcmVhdGVTdXJmYWNlKCZwYXJhbXMsIG5hbWUsIGRpc3BsYXksIHcsIGgsCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZmxhZ3MpOwotICAgICAgICAgICAgcGFyYW1zLndyaXRlVG9QYXJjZWwocmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKHMtPmFzQmluZGVyKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIERFU1RST1lfU1VSRkFDRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBkZXN0cm95U3VyZmFjZSggZGF0YS5yZWFkSW50MzIoKSApICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzdXJmYWNlX2RhdGFfdDo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBwYXJjZWwpCi17Ci0gICAgdG9rZW4gICAgPSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgaWRlbnRpdHkgPSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzdXJmYWNlX2RhdGFfdDo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QKLXsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIodG9rZW4pOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihpZGVudGl0eSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvSVN1cmZhY2VUZXh0dXJlLmNwcCBiL2xpYnMvZ3VpL0lTdXJmYWNlVGV4dHVyZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTU2MjcuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvSVN1cmZhY2VUZXh0dXJlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VUZXh0dXJlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZW51bSB7Ci0gICAgUkVRVUVTVF9CVUZGRVIgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIFNFVF9CVUZGRVJfQ09VTlQsCi0gICAgREVRVUVVRV9CVUZGRVIsCi0gICAgUVVFVUVfQlVGRkVSLAotICAgIENBTkNFTF9CVUZGRVIsCi0gICAgU0VUX0NST1AsCi0gICAgU0VUX1RSQU5TRk9STSwKLSAgICBRVUVSWSwKLSAgICBTRVRfU1lOQ0hST05PVVNfTU9ERSwKLSAgICBDT05ORUNULAotICAgIERJU0NPTk5FQ1QsCi0gICAgU0VUX1NDQUxJTkdfTU9ERSwKLX07Ci0KLQotY2xhc3MgQnBTdXJmYWNlVGV4dHVyZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJU3VyZmFjZVRleHR1cmU+Ci17Ci1wdWJsaWM6Ci0gICAgQnBTdXJmYWNlVGV4dHVyZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJU3VyZmFjZVRleHR1cmU+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVxdWVzdEJ1ZmZlcihpbnQgYnVmZmVySWR4LCBzcDxHcmFwaGljQnVmZmVyPiogYnVmKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlVGV4dHVyZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGJ1ZmZlcklkeCk7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9cmVtb3RlKCktPnRyYW5zYWN0KFJFUVVFU1RfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgbm9uTnVsbCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAobm9uTnVsbCkgewotICAgICAgICAgICAgKmJ1ZiA9IG5ldyBHcmFwaGljQnVmZmVyKCk7Ci0gICAgICAgICAgICByZXBseS5yZWFkKCoqYnVmKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlVGV4dHVyZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGJ1ZmZlckNvdW50KTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID1yZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0JVRkZFUl9DT1VOVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVCdWZmZXIoaW50ICpidWYsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCi0gICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlVGV4dHVyZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHcpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIodXNhZ2UpOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZW1vdGUoKS0+dHJhbnNhY3QoREVRVUVVRV9CVUZGRVIsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgKmJ1ZiA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlQnVmZmVyKGludCBidWYsIGludDY0X3QgdGltZXN0YW1wLAotICAgICAgICAgICAgdWludDMyX3QqIG91dFdpZHRoLCB1aW50MzJfdCogb3V0SGVpZ2h0LCB1aW50MzJfdCogb3V0VHJhbnNmb3JtKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlVGV4dHVyZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGJ1Zik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NCh0aW1lc3RhbXApOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZW1vdGUoKS0+dHJhbnNhY3QoUVVFVUVfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgICpvdXRXaWR0aCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAqb3V0SGVpZ2h0ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICpvdXRUcmFuc2Zvcm0gPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmVzdWx0ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGNhbmNlbEJ1ZmZlcihpbnQgYnVmKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlVGV4dHVyZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGJ1Zik7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDQU5DRUxfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q3JvcChjb25zdCBSZWN0JiByZWcpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VUZXh0dXJlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlRmxvYXQocmVnLmxlZnQpOwotICAgICAgICBkYXRhLndyaXRlRmxvYXQocmVnLnRvcCk7Ci0gICAgICAgIGRhdGEud3JpdGVGbG9hdChyZWcucmlnaHQpOwotICAgICAgICBkYXRhLndyaXRlRmxvYXQocmVnLmJvdHRvbSk7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQ1JPUCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRyYW5zZm9ybSh1aW50MzJfdCB0cmFuc2Zvcm0pIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VUZXh0dXJlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIodHJhbnNmb3JtKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9UUkFOU0ZPUk0sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTY2FsaW5nTW9kZShpbnQgbW9kZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZVRleHR1cmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtb2RlKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9TQ0FMSU5HX01PREUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdmlydHVhbCBpbnQgcXVlcnkoaW50IHdoYXQsIGludCogdmFsdWUpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VUZXh0dXJlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIod2hhdCk7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHJlbW90ZSgpLT50cmFuc2FjdChRVUVSWSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZVswXSA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN5bmNocm9ub3VzTW9kZShib29sIGVuYWJsZWQpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VUZXh0dXJlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZW5hYmxlZCk7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfU1lOQ0hST05PVVNfTU9ERSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoaW50IGFwaSwKLSAgICAgICAgICAgIHVpbnQzMl90KiBvdXRXaWR0aCwgdWludDMyX3QqIG91dEhlaWdodCwgdWludDMyX3QqIG91dFRyYW5zZm9ybSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZVRleHR1cmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihhcGkpOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAqb3V0V2lkdGggPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgKm91dEhlaWdodCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAqb3V0VHJhbnNmb3JtID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJlc3VsdCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdChpbnQgYXBpKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlVGV4dHVyZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGFwaSk7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9cmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFN1cmZhY2VUZXh0dXJlLCAiYW5kcm9pZC5ndWkuU3VyZmFjZVRleHR1cmUiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCblN1cmZhY2VUZXh0dXJlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBSRVFVRVNUX0JVRkZFUjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlVGV4dHVyZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGJ1ZmZlcklkeCAgID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcjsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSByZXF1ZXN0QnVmZmVyKGJ1ZmZlcklkeCwgJmJ1ZmZlcik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXIgIT0gMCk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoKmJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9CVUZGRVJfQ09VTlQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZVRleHR1cmUsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBidWZmZXJDb3VudCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gc2V0QnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBERVFVRVVFX0JVRkZFUjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlVGV4dHVyZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3QgdyAgICAgID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGggICAgICA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgdXNhZ2UgID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGludCBidWY7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gZGVxdWV1ZUJ1ZmZlcigmYnVmLCB3LCBoLCBmb3JtYXQsIHVzYWdlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1Zik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFFVRVVFX0JVRkZFUjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlVGV4dHVyZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGJ1ZiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBvdXRUcmFuc2Zvcm07Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBxdWV1ZUJ1ZmZlcihidWYsIHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgJm91dFdpZHRoLCAmb3V0SGVpZ2h0LCAmb3V0VHJhbnNmb3JtKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG91dFdpZHRoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG91dEhlaWdodCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvdXRUcmFuc2Zvcm0pOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBDQU5DRUxfQlVGRkVSOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VUZXh0dXJlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgYnVmID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGNhbmNlbEJ1ZmZlcihidWYpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9DUk9QOiB7Ci0gICAgICAgICAgICBSZWN0IHJlZzsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZVRleHR1cmUsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlZy5sZWZ0ID0gZGF0YS5yZWFkRmxvYXQoKTsKLSAgICAgICAgICAgIHJlZy50b3AgPSBkYXRhLnJlYWRGbG9hdCgpOwotICAgICAgICAgICAgcmVnLnJpZ2h0ID0gZGF0YS5yZWFkRmxvYXQoKTsKLSAgICAgICAgICAgIHJlZy5ib3R0b20gPSBkYXRhLnJlYWRGbG9hdCgpOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gc2V0Q3JvcChyZWcpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfVFJBTlNGT1JNOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VUZXh0dXJlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCB0cmFuc2Zvcm0gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9TQ0FMSU5HX01PREU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZVRleHR1cmUsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBtb2RlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHNldFNjYWxpbmdNb2RlKG1vZGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBRVUVSWTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlVGV4dHVyZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgICAgaW50IHdoYXQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaW50IHJlcyA9IHF1ZXJ5KHdoYXQsICZ2YWx1ZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih2YWx1ZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9TWU5DSFJPTk9VU19NT0RFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VUZXh0dXJlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIGVuYWJsZWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gc2V0U3luY2hyb25vdXNNb2RlKGVuYWJsZWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBDT05ORUNUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VUZXh0dXJlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgYXBpID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IG91dFdpZHRoLCBvdXRIZWlnaHQsIG91dFRyYW5zZm9ybTsKLSAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGNvbm5lY3QoYXBpLAotICAgICAgICAgICAgICAgICAgICAmb3V0V2lkdGgsICZvdXRIZWlnaHQsICZvdXRUcmFuc2Zvcm0pOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIob3V0V2lkdGgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIob3V0SGVpZ2h0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG91dFRyYW5zZm9ybSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZVRleHR1cmUsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBhcGkgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gZGlzY29ubmVjdChhcGkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvTGF5ZXJTdGF0ZS5jcHAgYi9saWJzL2d1aS9MYXllclN0YXRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0YzMwNS4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9MYXllclN0YXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9ndWkvTGF5ZXJTdGF0ZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXR1c190IGxheWVyX3N0YXRlX3Q6OndyaXRlKFBhcmNlbCYgb3V0cHV0KSBjb25zdAotewotICAgIHN0YXR1c190IGVycjsKLQotICAgIHNpemVfdCBsZW4gPSB0cmFuc3BhcmVudFJlZ2lvbi53cml0ZShOVUxMLCAwKTsKLSAgICBlcnIgPSBvdXRwdXQud3JpdGVJbnQzMihsZW4pOwotICAgIGlmIChlcnIgPCBOT19FUlJPUikgcmV0dXJuIGVycjsKLQotICAgIHZvaWQqIGJ1ZiA9IG91dHB1dC53cml0ZUlucGxhY2UobGVuKTsKLSAgICBpZiAoYnVmID09IE5VTEwpIHJldHVybiBOT19NRU1PUlk7Ci0KLSAgICBlcnIgPSB0cmFuc3BhcmVudFJlZ2lvbi53cml0ZShidWYsIGxlbik7Ci0gICAgaWYgKGVyciA8IE5PX0VSUk9SKSByZXR1cm4gZXJyOwotCi0gICAgLy8gTk9URTogcmVnaW9ucyBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlCi0gICAgc2l6ZV90IHNpemUgPSBzaXplb2YobGF5ZXJfc3RhdGVfdCk7Ci0gICAgc2l6ZSAtPSBzaXplb2YodHJhbnNwYXJlbnRSZWdpb24pOwotICAgIGVyciA9IG91dHB1dC53cml0ZSh0aGlzLCBzaXplKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBsYXllcl9zdGF0ZV90OjpyZWFkKGNvbnN0IFBhcmNlbCYgaW5wdXQpCi17Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIHNpemVfdCBsZW4gPSBpbnB1dC5yZWFkSW50MzIoKTsKLSAgICB2b2lkIGNvbnN0KiBidWYgPSBpbnB1dC5yZWFkSW5wbGFjZShsZW4pOwotICAgIGlmIChidWYgPT0gTlVMTCkgcmV0dXJuIE5PX01FTU9SWTsKLQotICAgIGVyciA9IHRyYW5zcGFyZW50UmVnaW9uLnJlYWQoYnVmKTsKLSAgICBpZiAoZXJyIDwgTk9fRVJST1IpIHJldHVybiBlcnI7Ci0KLSAgICAvLyBOT1RFOiByZWdpb25zIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUKLSAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihsYXllcl9zdGF0ZV90KTsKLSAgICBzaXplIC09IHNpemVvZih0cmFuc3BhcmVudFJlZ2lvbik7Ci0gICAgaW5wdXQucmVhZCh0aGlzLCBzaXplKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IENvbXBvc2VyU3RhdGU6OndyaXRlKFBhcmNlbCYgb3V0cHV0KSBjb25zdCB7Ci0gICAgb3V0cHV0LndyaXRlU3Ryb25nQmluZGVyKGNsaWVudC0+YXNCaW5kZXIoKSk7Ci0gICAgcmV0dXJuIHN0YXRlLndyaXRlKG91dHB1dCk7Ci19Ci0KLXN0YXR1c190IENvbXBvc2VyU3RhdGU6OnJlYWQoY29uc3QgUGFyY2VsJiBpbnB1dCkgewotICAgIGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+KGlucHV0LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgcmV0dXJuIHN0YXRlLnJlYWQoaW5wdXQpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvU2Vuc29yLmNwcCBiL2xpYnMvZ3VpL1NlbnNvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTJjMDQ2Li4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL1NlbnNvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9GbGF0dGVuYWJsZS5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgotCi0jaW5jbHVkZSA8Z3VpL1NlbnNvci5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNlbnNvcjo6U2Vuc29yKCkKLSAgICA6IG1IYW5kbGUoMCksIG1UeXBlKDApLAotICAgICAgbU1pblZhbHVlKDApLCBtTWF4VmFsdWUoMCksIG1SZXNvbHV0aW9uKDApLAotICAgICAgbVBvd2VyKDApLCBtTWluRGVsYXkoMCkKLXsKLX0KLQotU2Vuc29yOjpTZW5zb3Ioc3RydWN0IHNlbnNvcl90IGNvbnN0KiBod1NlbnNvcikKLXsKLSAgICBtTmFtZSA9IGh3U2Vuc29yLT5uYW1lOwotICAgIG1WZW5kb3IgPSBod1NlbnNvci0+dmVuZG9yOwotICAgIG1IYW5kbGUgPSBod1NlbnNvci0+aGFuZGxlOwotICAgIG1UeXBlID0gaHdTZW5zb3ItPnR5cGU7Ci0gICAgbU1pblZhbHVlID0gMDsgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1pblZhbHVlCi0gICAgbU1heFZhbHVlID0gaHdTZW5zb3ItPm1heFJhbmdlOyAgICAgLy8gRklYTUU6IG1heFZhbHVlCi0gICAgbVJlc29sdXRpb24gPSBod1NlbnNvci0+cmVzb2x1dGlvbjsKLSAgICBtUG93ZXIgPSBod1NlbnNvci0+cG93ZXI7Ci0gICAgbU1pbkRlbGF5ID0gaHdTZW5zb3ItPm1pbkRlbGF5OwotfQotCi1TZW5zb3I6On5TZW5zb3IoKQotewotfQotCi1jb25zdCBTdHJpbmc4JiBTZW5zb3I6OmdldE5hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1OYW1lOwotfQotCi1jb25zdCBTdHJpbmc4JiBTZW5zb3I6OmdldFZlbmRvcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbVZlbmRvcjsKLX0KLQotaW50MzJfdCBTZW5zb3I6OmdldEhhbmRsZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUhhbmRsZTsKLX0KLQotaW50MzJfdCBTZW5zb3I6OmdldFR5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1UeXBlOwotfQotCi1mbG9hdCBTZW5zb3I6OmdldE1pblZhbHVlKCkgY29uc3QgewotICAgIHJldHVybiBtTWluVmFsdWU7Ci19Ci0KLWZsb2F0IFNlbnNvcjo6Z2V0TWF4VmFsdWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1NYXhWYWx1ZTsKLX0KLQotZmxvYXQgU2Vuc29yOjpnZXRSZXNvbHV0aW9uKCkgY29uc3QgewotICAgIHJldHVybiBtUmVzb2x1dGlvbjsKLX0KLQotZmxvYXQgU2Vuc29yOjpnZXRQb3dlclVzYWdlKCkgY29uc3QgewotICAgIHJldHVybiBtUG93ZXI7Ci19Ci0KLWludDMyX3QgU2Vuc29yOjpnZXRNaW5EZWxheSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbU1pbkRlbGF5OwotfQotCi1uc2Vjc190IFNlbnNvcjo6Z2V0TWluRGVsYXlOcygpIGNvbnN0IHsKLSAgICByZXR1cm4gZ2V0TWluRGVsYXkoKSAqIDEwMDA7Ci19Ci0KLWludDMyX3QgU2Vuc29yOjpnZXRWZXJzaW9uKCkgY29uc3QgewotICAgIHJldHVybiBtVmVyc2lvbjsKLX0KLQotc2l6ZV90IFNlbnNvcjo6Z2V0RmxhdHRlbmVkU2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICBzaXplb2YoaW50MzJfdCkgKyAoKG1OYW1lLmxlbmd0aCgpICsgMykgJiB+MykgKwotICAgICAgICAgICAgc2l6ZW9mKGludDMyX3QpICsgKChtVmVuZG9yLmxlbmd0aCgpICsgMykgJiB+MykgKwotICAgICAgICAgICAgc2l6ZW9mKGludDMyX3QpICogMiArCi0gICAgICAgICAgICBzaXplb2YoZmxvYXQpICogNCArCi0gICAgICAgICAgICBzaXplb2YoaW50MzJfdCk7Ci19Ci0KLXNpemVfdCBTZW5zb3I6OmdldEZkQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lCi1zaXplX3Qgd3JpdGUodm9pZCogYnVmZmVyLCBzaXplX3Qgb2Zmc2V0LCBjb25zdCBTdHJpbmc4JiB2YWx1ZSkgewotICAgIG1lbWNweShzdGF0aWNfY2FzdDxjaGFyKj4oYnVmZmVyKSArIG9mZnNldCwgdmFsdWUuc3RyaW5nKCksIHZhbHVlLmxlbmd0aCgpKTsKLSAgICByZXR1cm4gKHZhbHVlLmxlbmd0aCgpICsgMykgJiB+MzsKLX0KLQotc3RhdGljIGlubGluZQotc2l6ZV90IHdyaXRlKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IG9mZnNldCwgZmxvYXQgdmFsdWUpIHsKLSAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KHN0YXRpY19jYXN0PGNoYXIqPihidWZmZXIpICsgb2Zmc2V0KSA9IHZhbHVlOwotICAgIHJldHVybiBzaXplb2YoZmxvYXQpOwotfQotCi1zdGF0aWMgaW5saW5lCi1zaXplX3Qgd3JpdGUodm9pZCogYnVmZmVyLCBzaXplX3Qgb2Zmc2V0LCBpbnQzMl90IHZhbHVlKSB7Ci0gICAgKnJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KHN0YXRpY19jYXN0PGNoYXIqPihidWZmZXIpICsgb2Zmc2V0KSA9IHZhbHVlOwotICAgIHJldHVybiBzaXplb2YoaW50MzJfdCk7Ci19Ci0KLXN0YXR1c190IFNlbnNvcjo6ZmxhdHRlbih2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLAotICAgICAgICBpbnQgZmRzW10sIHNpemVfdCBjb3VudCkgY29uc3QKLXsKLSAgICBpZiAoc2l6ZSA8IFNlbnNvcjo6Z2V0RmxhdHRlbmVkU2l6ZSgpKQotICAgICAgICByZXR1cm4gLUVOT01FTTsKLQotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCArPSB3cml0ZShidWZmZXIsIG9mZnNldCwgaW50MzJfdChtTmFtZS5sZW5ndGgoKSkpOwotICAgIG9mZnNldCArPSB3cml0ZShidWZmZXIsIG9mZnNldCwgbU5hbWUpOwotICAgIG9mZnNldCArPSB3cml0ZShidWZmZXIsIG9mZnNldCwgaW50MzJfdChtVmVuZG9yLmxlbmd0aCgpKSk7Ci0gICAgb2Zmc2V0ICs9IHdyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBtVmVuZG9yKTsKLSAgICBvZmZzZXQgKz0gd3JpdGUoYnVmZmVyLCBvZmZzZXQsIG1IYW5kbGUpOwotICAgIG9mZnNldCArPSB3cml0ZShidWZmZXIsIG9mZnNldCwgbVR5cGUpOwotICAgIG9mZnNldCArPSB3cml0ZShidWZmZXIsIG9mZnNldCwgbU1pblZhbHVlKTsKLSAgICBvZmZzZXQgKz0gd3JpdGUoYnVmZmVyLCBvZmZzZXQsIG1NYXhWYWx1ZSk7Ci0gICAgb2Zmc2V0ICs9IHdyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBtUmVzb2x1dGlvbik7Ci0gICAgb2Zmc2V0ICs9IHdyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBtUG93ZXIpOwotICAgIG9mZnNldCArPSB3cml0ZShidWZmZXIsIG9mZnNldCwgbU1pbkRlbGF5KTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdGljIGlubGluZQotc2l6ZV90IHJlYWQodm9pZCBjb25zdCogYnVmZmVyLCBzaXplX3Qgb2Zmc2V0LCBTdHJpbmc4KiB2YWx1ZSwgaW50MzJfdCBsZW4pIHsKLSAgICB2YWx1ZS0+c2V0VG8oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KGJ1ZmZlcikgKyBvZmZzZXQsIGxlbik7Ci0gICAgcmV0dXJuIChsZW4gKyAzKSAmIH4zOwotfQotCi1zdGF0aWMgaW5saW5lCi1zaXplX3QgcmVhZCh2b2lkIGNvbnN0KiBidWZmZXIsIHNpemVfdCBvZmZzZXQsIGZsb2F0KiB2YWx1ZSkgewotICAgICp2YWx1ZSA9ICpyZWludGVycHJldF9jYXN0PGZsb2F0IGNvbnN0Kj4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KGJ1ZmZlcikgKyBvZmZzZXQpOwotICAgIHJldHVybiBzaXplb2YoZmxvYXQpOwotfQotCi1zdGF0aWMgaW5saW5lCi1zaXplX3QgcmVhZCh2b2lkIGNvbnN0KiBidWZmZXIsIHNpemVfdCBvZmZzZXQsIGludDMyX3QqIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCBjb25zdCo+KHN0YXRpY19jYXN0PGNoYXIgY29uc3QqPihidWZmZXIpICsgb2Zmc2V0KTsKLSAgICByZXR1cm4gc2l6ZW9mKGludDMyX3QpOwotfQotCi1zdGF0dXNfdCBTZW5zb3I6OnVuZmxhdHRlbih2b2lkIGNvbnN0KiBidWZmZXIsIHNpemVfdCBzaXplLAotICAgICAgICBpbnQgZmRzW10sIHNpemVfdCBjb3VudCkKLXsKLSAgICBpbnQzMl90IGxlbjsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgKz0gcmVhZChidWZmZXIsIG9mZnNldCwgJmxlbik7Ci0gICAgb2Zmc2V0ICs9IHJlYWQoYnVmZmVyLCBvZmZzZXQsICZtTmFtZSwgbGVuKTsKLSAgICBvZmZzZXQgKz0gcmVhZChidWZmZXIsIG9mZnNldCwgJmxlbik7Ci0gICAgb2Zmc2V0ICs9IHJlYWQoYnVmZmVyLCBvZmZzZXQsICZtVmVuZG9yLCBsZW4pOwotICAgIG9mZnNldCArPSByZWFkKGJ1ZmZlciwgb2Zmc2V0LCAmbUhhbmRsZSk7Ci0gICAgb2Zmc2V0ICs9IHJlYWQoYnVmZmVyLCBvZmZzZXQsICZtVHlwZSk7Ci0gICAgb2Zmc2V0ICs9IHJlYWQoYnVmZmVyLCBvZmZzZXQsICZtTWluVmFsdWUpOwotICAgIG9mZnNldCArPSByZWFkKGJ1ZmZlciwgb2Zmc2V0LCAmbU1heFZhbHVlKTsKLSAgICBvZmZzZXQgKz0gcmVhZChidWZmZXIsIG9mZnNldCwgJm1SZXNvbHV0aW9uKTsKLSAgICBvZmZzZXQgKz0gcmVhZChidWZmZXIsIG9mZnNldCwgJm1Qb3dlcik7Ci0gICAgb2Zmc2V0ICs9IHJlYWQoYnVmZmVyLCBvZmZzZXQsICZtTWluRGVsYXkpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvU2Vuc29yRXZlbnRRdWV1ZS5jcHAgYi9saWJzL2d1aS9TZW5zb3JFdmVudFF1ZXVlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1ZGQ5MDIuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvU2Vuc29yRXZlbnRRdWV1ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU2Vuc29ycyIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvb3Blci5oPgotCi0jaW5jbHVkZSA8Z3VpL1NlbnNvci5oPgotI2luY2x1ZGUgPGd1aS9CaXRUdWJlLmg+Ci0jaW5jbHVkZSA8Z3VpL1NlbnNvckV2ZW50UXVldWUuaD4KLSNpbmNsdWRlIDxndWkvSVNlbnNvckV2ZW50Q29ubmVjdGlvbi5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9zZW5zb3IuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TZW5zb3JFdmVudFF1ZXVlOjpTZW5zb3JFdmVudFF1ZXVlKGNvbnN0IHNwPElTZW5zb3JFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKQotICAgIDogbVNlbnNvckV2ZW50Q29ubmVjdGlvbihjb25uZWN0aW9uKQotewotfQotCi1TZW5zb3JFdmVudFF1ZXVlOjp+U2Vuc29yRXZlbnRRdWV1ZSgpCi17Ci19Ci0KLXZvaWQgU2Vuc29yRXZlbnRRdWV1ZTo6b25GaXJzdFJlZigpCi17Ci0gICAgbVNlbnNvckNoYW5uZWwgPSBtU2Vuc29yRXZlbnRDb25uZWN0aW9uLT5nZXRTZW5zb3JDaGFubmVsKCk7Ci19Ci0KLWludCBTZW5zb3JFdmVudFF1ZXVlOjpnZXRGZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1TZW5zb3JDaGFubmVsLT5nZXRGZCgpOwotfQotCi1zc2l6ZV90IFNlbnNvckV2ZW50UXVldWU6OndyaXRlKEFTZW5zb3JFdmVudCBjb25zdCogZXZlbnRzLCBzaXplX3QgbnVtRXZlbnRzKQotewotICAgIHNzaXplX3Qgc2l6ZSA9IG1TZW5zb3JDaGFubmVsLT53cml0ZShldmVudHMsIG51bUV2ZW50cyAqIHNpemVvZihldmVudHNbMF0pKTsKLSAgICBpZiAoc2l6ZSA+PSAwKSB7Ci0gICAgICAgIGlmIChzaXplICUgc2l6ZW9mKGV2ZW50c1swXSkpIHsKLSAgICAgICAgICAgIC8vIHBhcnRpYWwgd3JpdGUhISEgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIGV2ZW50cyB3cml0dGVuCi0gICAgICAgIHNpemUgLz0gc2l6ZW9mKGV2ZW50c1swXSk7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotfQotCi1zc2l6ZV90IFNlbnNvckV2ZW50UXVldWU6OnJlYWQoQVNlbnNvckV2ZW50KiBldmVudHMsIHNpemVfdCBudW1FdmVudHMpCi17Ci0gICAgc3NpemVfdCBzaXplID0gbVNlbnNvckNoYW5uZWwtPnJlYWQoZXZlbnRzLCBudW1FdmVudHMqc2l6ZW9mKGV2ZW50c1swXSkpOwotICAgIEFMT0dFX0lGKHNpemU8MCAmJiBzaXplIT0tRUFHQUlOLAotICAgICAgICAgICAgIlNlbnNvckNoYW5uZWw6OnJlYWQgZXJyb3IgKCVzKSIsIHN0cmVycm9yKC1zaXplKSk7Ci0gICAgaWYgKHNpemUgPj0gMCkgewotICAgICAgICBpZiAoc2l6ZSAlIHNpemVvZihldmVudHNbMF0pKSB7Ci0gICAgICAgICAgICAvLyBwYXJ0aWFsIHJlYWQhISEgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLSAgICAgICAgICAgIEFMT0dFKCJTZW5zb3JFdmVudFF1ZXVlIHBhcnRpYWwgcmVhZCAoZXZlbnQtc2l6ZT0ldSwgcmVhZD0lZCkiLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoZXZlbnRzWzBdKSwgaW50KHNpemUpKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIGV2ZW50cyByZWFkCi0gICAgICAgIHNpemUgLz0gc2l6ZW9mKGV2ZW50c1swXSk7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotfQotCi1zcDxMb29wZXI+IFNlbnNvckV2ZW50UXVldWU6OmdldExvb3BlcigpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUxvb3BlciA9PSAwKSB7Ci0gICAgICAgIG1Mb29wZXIgPSBuZXcgTG9vcGVyKHRydWUpOwotICAgICAgICBtTG9vcGVyLT5hZGRGZChnZXRGZCgpLCBnZXRGZCgpLCBBTE9PUEVSX0VWRU5UX0lOUFVULCBOVUxMLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Mb29wZXI7Ci19Ci0KLXN0YXR1c190IFNlbnNvckV2ZW50UXVldWU6OndhaXRGb3JFdmVudCgpIGNvbnN0Ci17Ci0gICAgY29uc3QgaW50IGZkID0gZ2V0RmQoKTsKLSAgICBzcDxMb29wZXI+IGxvb3BlcihnZXRMb29wZXIoKSk7Ci0KLSAgICBpbnQzMl90IHJlc3VsdDsKLSAgICBkbyB7Ci0gICAgICAgIHJlc3VsdCA9IGxvb3Blci0+cG9sbE9uY2UoLTEpOwotICAgICAgICBpZiAocmVzdWx0ID09IEFMT09QRVJfRVZFTlRfRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTZW5zb3JFdmVudFF1ZXVlOjp3YWl0Rm9yRXZlbnQgZXJyb3IgKGVycm5vPSVkKSIsIGVycm5vKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IC1FUElQRTsgLy8gdW5rbm93biBlcnJvciwgc28gd2UgbWFrZSB1cCBvbmUKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAocmVzdWx0ICE9IGZkKTsKLQotICAgIHJldHVybiAgKHJlc3VsdCA9PSBmZCkgPyBzdGF0dXNfdChOT19FUlJPUikgOiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IFNlbnNvckV2ZW50UXVldWU6Ondha2UoKSBjb25zdAotewotICAgIHNwPExvb3Blcj4gbG9vcGVyKGdldExvb3BlcigpKTsKLSAgICBsb29wZXItPndha2UoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFNlbnNvckV2ZW50UXVldWU6OmVuYWJsZVNlbnNvcihTZW5zb3IgY29uc3QqIHNlbnNvcikgY29uc3QgewotICAgIHJldHVybiBtU2Vuc29yRXZlbnRDb25uZWN0aW9uLT5lbmFibGVEaXNhYmxlKHNlbnNvci0+Z2V0SGFuZGxlKCksIHRydWUpOwotfQotCi1zdGF0dXNfdCBTZW5zb3JFdmVudFF1ZXVlOjpkaXNhYmxlU2Vuc29yKFNlbnNvciBjb25zdCogc2Vuc29yKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZW5zb3JFdmVudENvbm5lY3Rpb24tPmVuYWJsZURpc2FibGUoc2Vuc29yLT5nZXRIYW5kbGUoKSwgZmFsc2UpOwotfQotCi1zdGF0dXNfdCBTZW5zb3JFdmVudFF1ZXVlOjplbmFibGVTZW5zb3IoaW50MzJfdCBoYW5kbGUsIGludDMyX3QgdXMpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBlcnIgPSBtU2Vuc29yRXZlbnRDb25uZWN0aW9uLT5lbmFibGVEaXNhYmxlKGhhbmRsZSwgdHJ1ZSk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICBtU2Vuc29yRXZlbnRDb25uZWN0aW9uLT5zZXRFdmVudFJhdGUoaGFuZGxlLCB1czJucyh1cykpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBTZW5zb3JFdmVudFF1ZXVlOjpkaXNhYmxlU2Vuc29yKGludDMyX3QgaGFuZGxlKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZW5zb3JFdmVudENvbm5lY3Rpb24tPmVuYWJsZURpc2FibGUoaGFuZGxlLCBmYWxzZSk7Ci19Ci0KLXN0YXR1c190IFNlbnNvckV2ZW50UXVldWU6OnNldEV2ZW50UmF0ZShTZW5zb3IgY29uc3QqIHNlbnNvciwgbnNlY3NfdCBucykgY29uc3QgewotICAgIHJldHVybiBtU2Vuc29yRXZlbnRDb25uZWN0aW9uLT5zZXRFdmVudFJhdGUoc2Vuc29yLT5nZXRIYW5kbGUoKSwgbnMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9saWJzL2d1aS9TZW5zb3JNYW5hZ2VyLmNwcCBiL2xpYnMvZ3VpL1NlbnNvck1hbmFnZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODBkYTU2Li4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL1NlbnNvck1hbmFnZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlNlbnNvcnMiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi0jaW5jbHVkZSA8Z3VpL0lTZW5zb3JTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxndWkvSVNlbnNvckV2ZW50Q29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPGd1aS9TZW5zb3IuaD4KLSNpbmNsdWRlIDxndWkvU2Vuc29yTWFuYWdlci5oPgotI2luY2x1ZGUgPGd1aS9TZW5zb3JFdmVudFF1ZXVlLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKFNlbnNvck1hbmFnZXIpCi0KLVNlbnNvck1hbmFnZXI6OlNlbnNvck1hbmFnZXIoKQotICAgIDogbVNlbnNvckxpc3QoMCkKLXsKLSAgICAvLyBva2F5IHdlJ3JlIG5vdCBsb2NrZWQgaGVyZSwgYnV0IGl0J3Mgbm90IG5lZWRlZCBkdXJpbmcgY29uc3RydWN0aW9uCi0gICAgYXNzZXJ0U3RhdGVMb2NrZWQoKTsKLX0KLQotU2Vuc29yTWFuYWdlcjo6flNlbnNvck1hbmFnZXIoKQotewotICAgIGZyZWUobVNlbnNvckxpc3QpOwotfQotCi12b2lkIFNlbnNvck1hbmFnZXI6OnNlbnNvck1hbmFnZXJEaWVkKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1TZW5zb3JTZXJ2ZXIuY2xlYXIoKTsKLSAgICBmcmVlKG1TZW5zb3JMaXN0KTsKLSAgICBtU2Vuc29yTGlzdCA9IE5VTEw7Ci0gICAgbVNlbnNvcnMuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgU2Vuc29yTWFuYWdlcjo6YXNzZXJ0U3RhdGVMb2NrZWQoKSBjb25zdCB7Ci0gICAgaWYgKG1TZW5zb3JTZXJ2ZXIgPT0gTlVMTCkgewotICAgICAgICAvLyB0cnkgZm9yIG9uZSBzZWNvbmQKLSAgICAgICAgY29uc3QgU3RyaW5nMTYgbmFtZSgic2Vuc29yc2VydmljZSIpOwotICAgICAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldFNlcnZpY2UobmFtZSwgJm1TZW5zb3JTZXJ2ZXIpOwotICAgICAgICAgICAgaWYgKGVyciA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICAgICAgICAgIHVzbGVlcCgyNTAwMDApOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNsYXNzIERlYXRoT2JzZXJ2ZXIgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewotICAgICAgICAgICAgU2Vuc29yTWFuYWdlciYgbVNlbnNvck1hbmdlcjsKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2Vuc29yc2VydmljZSBkaWVkIFslcF0iLCB3aG8udW5zYWZlX2dldCgpKTsKLSAgICAgICAgICAgICAgICBtU2Vuc29yTWFuZ2VyLnNlbnNvck1hbmFnZXJEaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIERlYXRoT2JzZXJ2ZXIoU2Vuc29yTWFuYWdlciYgbWdyKSA6IG1TZW5zb3JNYW5nZXIobWdyKSB7IH0KLSAgICAgICAgfTsKLQotICAgICAgICBtRGVhdGhPYnNlcnZlciA9IG5ldyBEZWF0aE9ic2VydmVyKCpjb25zdF9jYXN0PFNlbnNvck1hbmFnZXIgKj4odGhpcykpOwotICAgICAgICBtU2Vuc29yU2VydmVyLT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChtRGVhdGhPYnNlcnZlcik7Ci0KLSAgICAgICAgbVNlbnNvcnMgPSBtU2Vuc29yU2VydmVyLT5nZXRTZW5zb3JMaXN0KCk7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IG1TZW5zb3JzLnNpemUoKTsKLSAgICAgICAgbVNlbnNvckxpc3QgPSAoU2Vuc29yIGNvbnN0KiopbWFsbG9jKGNvdW50ICogc2l6ZW9mKFNlbnNvciopKTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgbVNlbnNvckxpc3RbaV0gPSBtU2Vuc29ycy5hcnJheSgpICsgaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi0KLXNzaXplX3QgU2Vuc29yTWFuYWdlcjo6Z2V0U2Vuc29yTGlzdChTZW5zb3IgY29uc3QqIGNvbnN0KiogbGlzdCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHN0YXR1c190IGVyciA9IGFzc2VydFN0YXRlTG9ja2VkKCk7Ci0gICAgaWYgKGVyciA8IDApIHsKLSAgICAgICAgcmV0dXJuIHNzaXplX3QoZXJyKTsKLSAgICB9Ci0gICAgKmxpc3QgPSBtU2Vuc29yTGlzdDsKLSAgICByZXR1cm4gbVNlbnNvcnMuc2l6ZSgpOwotfQotCi1TZW5zb3IgY29uc3QqIFNlbnNvck1hbmFnZXI6OmdldERlZmF1bHRTZW5zb3IoaW50IHR5cGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAoYXNzZXJ0U3RhdGVMb2NrZWQoKSA9PSBOT19FUlJPUikgewotICAgICAgICAvLyBGb3Igbm93IHdlIGp1c3QgcmV0dXJuIHRoZSBmaXJzdCBzZW5zb3Igb2YgdGhhdCB0eXBlIHdlIGZpbmQuCi0gICAgICAgIC8vIGluIHRoZSBmdXR1cmUgaXQgd2lsbCBtYWtlIHNlbnNlIHRvIGxldCB0aGUgU2Vuc29yU2VydmljZSBtYWtlCi0gICAgICAgIC8vIHRoYXQgZGVjaXNpb24uCi0gICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8bVNlbnNvcnMuc2l6ZSgpIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobVNlbnNvckxpc3RbaV0tPmdldFR5cGUoKSA9PSB0eXBlKQotICAgICAgICAgICAgICAgIHJldHVybiBtU2Vuc29yTGlzdFtpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3A8U2Vuc29yRXZlbnRRdWV1ZT4gU2Vuc29yTWFuYWdlcjo6Y3JlYXRlRXZlbnRRdWV1ZSgpCi17Ci0gICAgc3A8U2Vuc29yRXZlbnRRdWV1ZT4gcXVldWU7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHdoaWxlIChhc3NlcnRTdGF0ZUxvY2tlZCgpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHNwPElTZW5zb3JFdmVudENvbm5lY3Rpb24+IGNvbm5lY3Rpb24gPQotICAgICAgICAgICAgICAgIG1TZW5zb3JTZXJ2ZXItPmNyZWF0ZVNlbnNvckV2ZW50Q29ubmVjdGlvbigpOwotICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBTZW5zb3JTZXJ2aWNlIGp1c3QgZGllZC4KLSAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVFdmVudFF1ZXVlOiBjb25uZWN0aW9uIGlzIE5VTEwuIFNlbnNvclNlcnZpY2UgZGllZC4iKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHF1ZXVlID0gbmV3IFNlbnNvckV2ZW50UXVldWUoY29ubmVjdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gcXVldWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9TdXJmYWNlLmNwcCBiL2xpYnMvZ3VpL1N1cmZhY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmIyN2VkLi4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL1N1cmZhY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN1cmZhY2UiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLQotI2luY2x1ZGUgPHVpL0Rpc3BsYXlJbmZvLmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPHVpL1JlY3QuaD4KLQotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIFN1cmZhY2VDb250cm9sCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVN1cmZhY2VDb250cm9sOjpTdXJmYWNlQ29udHJvbCgKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LCAKLSAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlLAotICAgICAgICBjb25zdCBJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzdXJmYWNlX2RhdGFfdCYgZGF0YSkKLSAgICA6IG1DbGllbnQoY2xpZW50KSwgbVN1cmZhY2Uoc3VyZmFjZSksCi0gICAgICBtVG9rZW4oZGF0YS50b2tlbiksIG1JZGVudGl0eShkYXRhLmlkZW50aXR5KQotewotfQotICAgICAgICAKLVN1cmZhY2VDb250cm9sOjp+U3VyZmFjZUNvbnRyb2woKQotewotICAgIGRlc3Ryb3koKTsKLX0KLQotdm9pZCBTdXJmYWNlQ29udHJvbDo6ZGVzdHJveSgpCi17Ci0gICAgaWYgKGlzVmFsaWQoKSkgewotICAgICAgICBtQ2xpZW50LT5kZXN0cm95U3VyZmFjZShtVG9rZW4pOwotICAgIH0KLQotICAgIC8vIGNsZWFyIGFsbCByZWZlcmVuY2VzIGFuZCB0cmlnZ2VyIGFuIElQQyBub3csIHRvIG1ha2Ugc3VyZSB0aGluZ3MKLSAgICAvLyBoYXBwZW4gd2l0aG91dCBkZWxheSwgc2luY2UgdGhlc2UgcmVzb3VyY2VzIGFyZSBxdWl0ZSBoZWF2eS4KLSAgICBtQ2xpZW50LmNsZWFyKCk7Ci0gICAgbVN1cmZhY2UuY2xlYXIoKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci19Ci0KLXZvaWQgU3VyZmFjZUNvbnRyb2w6OmNsZWFyKCkgCi17Ci0gICAgLy8gaGVyZSwgdGhlIHdpbmRvdyBtYW5hZ2VyIHRlbGxzIHVzIGV4cGxpY2l0bHkgdGhhdCB3ZSBzaG91bGQgZGVzdHJveQotICAgIC8vIHRoZSBzdXJmYWNlJ3MgcmVzb3VyY2UuIFNvb24gYWZ0ZXIgdGhpcyBjYWxsLCBpdCB3aWxsIGFsc28gcmVsZWFzZQotICAgIC8vIGl0cyBsYXN0IHJlZmVyZW5jZSAod2hpY2ggd2lsbCBjYWxsIHRoZSBkdG9yKTsgaG93ZXZlciwgaXQgaXMgcG9zc2libGUKLSAgICAvLyB0aGF0IGEgY2xpZW50IGxpdmluZyBpbiB0aGUgc2FtZSBwcm9jZXNzIHN0aWxsIGhvbGRzIHJlZmVyZW5jZXMgd2hpY2gKLSAgICAvLyB3b3VsZCBkZWxheSB0aGUgY2FsbCB0byB0aGUgZHRvciAtLSB0aGF0IGlzIHdoeSB3ZSBuZWVkIHRoaXMgZXhwbGljaXQKLSAgICAvLyAiY2xlYXIoKSIgY2FsbC4KLSAgICBkZXN0cm95KCk7Ci19Ci0KLWJvb2wgU3VyZmFjZUNvbnRyb2w6OmlzU2FtZVN1cmZhY2UoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2VDb250cm9sPiYgbGhzLCBjb25zdCBzcDxTdXJmYWNlQ29udHJvbD4mIHJocykgCi17Ci0gICAgaWYgKGxocyA9PSAwIHx8IHJocyA9PSAwKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIGxocy0+bVN1cmZhY2UtPmFzQmluZGVyKCkgPT0gcmhzLT5tU3VyZmFjZS0+YXNCaW5kZXIoKTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUNvbnRyb2w6OnNldExheWVyKGludDMyX3QgbGF5ZXIpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSB2YWxpZGF0ZSgpOwotICAgIGlmIChlcnIgPCAwKSByZXR1cm4gZXJyOwotICAgIGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudChtQ2xpZW50KTsKLSAgICByZXR1cm4gY2xpZW50LT5zZXRMYXllcihtVG9rZW4sIGxheWVyKTsKLX0KLXN0YXR1c190IFN1cmZhY2VDb250cm9sOjpzZXRQb3NpdGlvbihpbnQzMl90IHgsIGludDMyX3QgeSkgewotICAgIHN0YXR1c190IGVyciA9IHZhbGlkYXRlKCk7Ci0gICAgaWYgKGVyciA8IDApIHJldHVybiBlcnI7Ci0gICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50KG1DbGllbnQpOwotICAgIHJldHVybiBjbGllbnQtPnNldFBvc2l0aW9uKG1Ub2tlbiwgeCwgeSk7Ci19Ci1zdGF0dXNfdCBTdXJmYWNlQ29udHJvbDo6c2V0U2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKLSAgICBpZiAoZXJyIDwgMCkgcmV0dXJuIGVycjsKLSAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQobUNsaWVudCk7Ci0gICAgcmV0dXJuIGNsaWVudC0+c2V0U2l6ZShtVG9rZW4sIHcsIGgpOwotfQotc3RhdHVzX3QgU3VyZmFjZUNvbnRyb2w6OmhpZGUoKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKLSAgICBpZiAoZXJyIDwgMCkgcmV0dXJuIGVycjsKLSAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQobUNsaWVudCk7Ci0gICAgcmV0dXJuIGNsaWVudC0+aGlkZShtVG9rZW4pOwotfQotc3RhdHVzX3QgU3VyZmFjZUNvbnRyb2w6OnNob3coaW50MzJfdCBsYXllcikgewotICAgIHN0YXR1c190IGVyciA9IHZhbGlkYXRlKCk7Ci0gICAgaWYgKGVyciA8IDApIHJldHVybiBlcnI7Ci0gICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50KG1DbGllbnQpOwotICAgIHJldHVybiBjbGllbnQtPnNob3cobVRva2VuLCBsYXllcik7Ci19Ci1zdGF0dXNfdCBTdXJmYWNlQ29udHJvbDo6ZnJlZXplKCkgewotICAgIHN0YXR1c190IGVyciA9IHZhbGlkYXRlKCk7Ci0gICAgaWYgKGVyciA8IDApIHJldHVybiBlcnI7Ci0gICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50KG1DbGllbnQpOwotICAgIHJldHVybiBjbGllbnQtPmZyZWV6ZShtVG9rZW4pOwotfQotc3RhdHVzX3QgU3VyZmFjZUNvbnRyb2w6OnVuZnJlZXplKCkgewotICAgIHN0YXR1c190IGVyciA9IHZhbGlkYXRlKCk7Ci0gICAgaWYgKGVyciA8IDApIHJldHVybiBlcnI7Ci0gICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50KG1DbGllbnQpOwotICAgIHJldHVybiBjbGllbnQtPnVuZnJlZXplKG1Ub2tlbik7Ci19Ci1zdGF0dXNfdCBTdXJmYWNlQ29udHJvbDo6c2V0RmxhZ3ModWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IG1hc2spIHsKLSAgICBzdGF0dXNfdCBlcnIgPSB2YWxpZGF0ZSgpOwotICAgIGlmIChlcnIgPCAwKSByZXR1cm4gZXJyOwotICAgIGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudChtQ2xpZW50KTsKLSAgICByZXR1cm4gY2xpZW50LT5zZXRGbGFncyhtVG9rZW4sIGZsYWdzLCBtYXNrKTsKLX0KLXN0YXR1c190IFN1cmZhY2VDb250cm9sOjpzZXRUcmFuc3BhcmVudFJlZ2lvbkhpbnQoY29uc3QgUmVnaW9uJiB0cmFuc3BhcmVudCkgewotICAgIHN0YXR1c190IGVyciA9IHZhbGlkYXRlKCk7Ci0gICAgaWYgKGVyciA8IDApIHJldHVybiBlcnI7Ci0gICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50KG1DbGllbnQpOwotICAgIHJldHVybiBjbGllbnQtPnNldFRyYW5zcGFyZW50UmVnaW9uSGludChtVG9rZW4sIHRyYW5zcGFyZW50KTsKLX0KLXN0YXR1c190IFN1cmZhY2VDb250cm9sOjpzZXRBbHBoYShmbG9hdCBhbHBoYSkgewotICAgIHN0YXR1c190IGVyciA9IHZhbGlkYXRlKCk7Ci0gICAgaWYgKGVyciA8IDApIHJldHVybiBlcnI7Ci0gICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50KG1DbGllbnQpOwotICAgIHJldHVybiBjbGllbnQtPnNldEFscGhhKG1Ub2tlbiwgYWxwaGEpOwotfQotc3RhdHVzX3QgU3VyZmFjZUNvbnRyb2w6OnNldE1hdHJpeChmbG9hdCBkc2R4LCBmbG9hdCBkdGR4LCBmbG9hdCBkc2R5LCBmbG9hdCBkdGR5KSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKLSAgICBpZiAoZXJyIDwgMCkgcmV0dXJuIGVycjsKLSAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQobUNsaWVudCk7Ci0gICAgcmV0dXJuIGNsaWVudC0+c2V0TWF0cml4KG1Ub2tlbiwgZHNkeCwgZHRkeCwgZHNkeSwgZHRkeSk7Ci19Ci1zdGF0dXNfdCBTdXJmYWNlQ29udHJvbDo6c2V0RnJlZXplVGludCh1aW50MzJfdCB0aW50KSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKLSAgICBpZiAoZXJyIDwgMCkgcmV0dXJuIGVycjsKLSAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQobUNsaWVudCk7Ci0gICAgcmV0dXJuIGNsaWVudC0+c2V0RnJlZXplVGludChtVG9rZW4sIHRpbnQpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29udHJvbDo6dmFsaWRhdGUoKSBjb25zdAotewotICAgIGlmIChtVG9rZW48MCB8fCBtQ2xpZW50PT0wKSB7Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIHRva2VuICglZCwgaWRlbnRpdHk9JXUpIG9yIGNsaWVudCAoJXApIiwgCi0gICAgICAgICAgICAgICAgbVRva2VuLCBtSWRlbnRpdHksIG1DbGllbnQuZ2V0KCkpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29udHJvbDo6d3JpdGVTdXJmYWNlVG9QYXJjZWwoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2VDb250cm9sPiYgY29udHJvbCwgUGFyY2VsKiBwYXJjZWwpCi17Ci0gICAgc3A8SVN1cmZhY2U+IHN1cjsKLSAgICB1aW50MzJfdCBpZGVudGl0eSA9IDA7Ci0gICAgaWYgKFN1cmZhY2VDb250cm9sOjppc1ZhbGlkKGNvbnRyb2wpKSB7Ci0gICAgICAgIHN1ciAgICAgID0gY29udHJvbC0+bVN1cmZhY2U7Ci0gICAgICAgIGlkZW50aXR5ID0gY29udHJvbC0+bUlkZW50aXR5OwotICAgIH0KLSAgICBwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKHN1ciE9MCA/IHN1ci0+YXNCaW5kZXIoKSA6IE5VTEwpOwotICAgIHBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoTlVMTCk7ICAvLyBOVUxMIElTdXJmYWNlVGV4dHVyZSBpbiB0aGlzIGNhc2UuCi0gICAgcGFyY2VsLT53cml0ZUludDMyKGlkZW50aXR5KTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXNwPFN1cmZhY2U+IFN1cmZhY2VDb250cm9sOjpnZXRTdXJmYWNlKCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtU3VyZmFjZURhdGEgPT0gMCkgewotICAgICAgICBzcDxTdXJmYWNlQ29udHJvbD4gc3VyZmFjZV9jb250cm9sKGNvbnN0X2Nhc3Q8U3VyZmFjZUNvbnRyb2wqPih0aGlzKSk7Ci0gICAgICAgIG1TdXJmYWNlRGF0YSA9IG5ldyBTdXJmYWNlKHN1cmZhY2VfY29udHJvbCk7Ci0gICAgfQotICAgIHJldHVybiBtU3VyZmFjZURhdGE7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vICBTdXJmYWNlCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TdXJmYWNlOjpTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2VDb250cm9sPiYgc3VyZmFjZSkKLSAgICA6IFN1cmZhY2VUZXh0dXJlQ2xpZW50KCksCi0gICAgICBtU3VyZmFjZShzdXJmYWNlLT5tU3VyZmFjZSksCi0gICAgICBtSWRlbnRpdHkoc3VyZmFjZS0+bUlkZW50aXR5KQotewotICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gc3Q7Ci0gICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKLSAgICAgICAgc3QgPSBtU3VyZmFjZS0+Z2V0U3VyZmFjZVRleHR1cmUoKTsKLSAgICB9Ci0gICAgaW5pdChzdCk7Ci19Ci0KLVN1cmZhY2U6OlN1cmZhY2UoY29uc3QgUGFyY2VsJiBwYXJjZWwsIGNvbnN0IHNwPElCaW5kZXI+JiByZWYpCi0gICAgOiBTdXJmYWNlVGV4dHVyZUNsaWVudCgpCi17Ci0gICAgbVN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4ocmVmKTsKLSAgICBzcDxJQmluZGVyPiBzdF9iaW5kZXIocGFyY2VsLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBzdDsKLSAgICBpZiAoc3RfYmluZGVyICE9IE5VTEwpIHsKLSAgICAgICAgc3QgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZVRleHR1cmU+KHN0X2JpbmRlcik7Ci0gICAgfSBlbHNlIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHN0ID0gbVN1cmZhY2UtPmdldFN1cmZhY2VUZXh0dXJlKCk7Ci0gICAgfQotCi0gICAgbUlkZW50aXR5ICAgPSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgaW5pdChzdCk7Ci19Ci0KLVN1cmZhY2U6OlN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2VUZXh0dXJlPiYgc3QpCi0gICAgOiBTdXJmYWNlVGV4dHVyZUNsaWVudCgpLAotICAgICAgbVN1cmZhY2UoTlVMTCksCi0gICAgICBtSWRlbnRpdHkoMCkKLXsKLSAgICBpbml0KHN0KTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZTo6d3JpdGVUb1BhcmNlbCgKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIFBhcmNlbCogcGFyY2VsKQotewotICAgIHNwPElTdXJmYWNlPiBzdXI7Ci0gICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBzdDsKLSAgICB1aW50MzJfdCBpZGVudGl0eSA9IDA7Ci0gICAgaWYgKFN1cmZhY2U6OmlzVmFsaWQoc3VyZmFjZSkpIHsKLSAgICAgICAgc3VyICAgICAgPSBzdXJmYWNlLT5tU3VyZmFjZTsKLSAgICAgICAgc3QgICAgICAgPSBzdXJmYWNlLT5nZXRJU3VyZmFjZVRleHR1cmUoKTsKLSAgICAgICAgaWRlbnRpdHkgPSBzdXJmYWNlLT5tSWRlbnRpdHk7Ci0gICAgfSBlbHNlIGlmIChzdXJmYWNlICE9IDAgJiYKLSAgICAgICAgICAgIChzdXJmYWNlLT5tU3VyZmFjZSAhPSBOVUxMIHx8Ci0gICAgICAgICAgICAgc3VyZmFjZS0+Z2V0SVN1cmZhY2VUZXh0dXJlKCkgIT0gTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoIlBhcmNlbGluZyBpbnZhbGlkIHN1cmZhY2Ugd2l0aCBub24tTlVMTCBJU3VyZmFjZS9JU3VyZmFjZVRleHR1cmUgYXMgTlVMTDogIgotICAgICAgICAgICAgICJtU3VyZmFjZSA9ICVwLCBzdXJmYWNlVGV4dHVyZSA9ICVwLCBtSWRlbnRpdHkgPSAlZCwgIiwKLSAgICAgICAgICAgICBzdXJmYWNlLT5tU3VyZmFjZS5nZXQoKSwgc3VyZmFjZS0+Z2V0SVN1cmZhY2VUZXh0dXJlKCkuZ2V0KCksCi0gICAgICAgICAgICAgc3VyZmFjZS0+bUlkZW50aXR5KTsKLSAgICB9Ci0KLSAgICBwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKHN1ciAhPSBOVUxMID8gc3VyLT5hc0JpbmRlcigpIDogTlVMTCk7Ci0gICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihzdCAhPSBOVUxMID8gc3QtPmFzQmluZGVyKCkgOiBOVUxMKTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIoaWRlbnRpdHkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLQotfQotCi1NdXRleCBTdXJmYWNlOjpzQ2FjaGVkU3VyZmFjZXNMb2NrOwotRGVmYXVsdEtleWVkVmVjdG9yPHdwPElCaW5kZXI+LCB3cDxTdXJmYWNlPiA+IFN1cmZhY2U6OnNDYWNoZWRTdXJmYWNlczsKLQotc3A8U3VyZmFjZT4gU3VyZmFjZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNDYWNoZWRTdXJmYWNlc0xvY2spOwotICAgIHNwPElCaW5kZXI+IGJpbmRlcihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IHNDYWNoZWRTdXJmYWNlcy52YWx1ZUZvcihiaW5kZXIpLnByb21vdGUoKTsKLSAgICBpZiAoc3VyZmFjZSA9PSAwKSB7Ci0gICAgICAgc3VyZmFjZSA9IG5ldyBTdXJmYWNlKGRhdGEsIGJpbmRlcik7Ci0gICAgICAgc0NhY2hlZFN1cmZhY2VzLmFkZChiaW5kZXIsIHN1cmZhY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBTdXJmYWNlIHdhcyBmb3VuZCBpbiB0aGUgY2FjaGUsIGJ1dCB3ZSBzdGlsbCBzaG91bGQgY2xlYXIgYW55Ci0gICAgICAgIC8vIHJlbWFpbmluZyBkYXRhIGZyb20gdGhlIHBhcmNlbC4KLSAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCk7ICAvLyBJU3VyZmFjZVRleHR1cmUKLSAgICAgICAgZGF0YS5yZWFkSW50MzIoKTsgICAgICAgICAvLyBpZGVudGl0eQotICAgIH0KLSAgICBpZiAoc3VyZmFjZS0+bVN1cmZhY2UgPT0gTlVMTCAmJiBzdXJmYWNlLT5nZXRJU3VyZmFjZVRleHR1cmUoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHN1cmZhY2UgPSAwOwotICAgIH0KLSAgICBjbGVhbkNhY2hlZFN1cmZhY2VzTG9ja2VkKCk7Ci0gICAgcmV0dXJuIHN1cmZhY2U7Ci19Ci0KLS8vIFJlbW92ZSB0aGUgc3RhbGUgZW50cmllcyBmcm9tIHRoZSBzdXJmYWNlIGNhY2hlLiAgVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQKLS8vIHdpdGggc0NhY2hlZFN1cmZhY2VzTG9jayBoZWxkLgotdm9pZCBTdXJmYWNlOjpjbGVhbkNhY2hlZFN1cmZhY2VzTG9ja2VkKCkgewotICAgIGZvciAoaW50IGkgPSBzQ2FjaGVkU3VyZmFjZXMuc2l6ZSgpLTE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgIHdwPFN1cmZhY2U+IHMoc0NhY2hlZFN1cmZhY2VzLnZhbHVlQXQoaSkpOwotICAgICAgICBpZiAocyA9PSAwIHx8IHMucHJvbW90ZSgpID09IDApIHsKLSAgICAgICAgICAgIHNDYWNoZWRTdXJmYWNlcy5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFN1cmZhY2U6OmluaXQoY29uc3Qgc3A8SVN1cmZhY2VUZXh0dXJlPiYgc3VyZmFjZVRleHR1cmUpCi17Ci0gICAgaWYgKG1TdXJmYWNlICE9IE5VTEwgfHwgc3VyZmFjZVRleHR1cmUgIT0gTlVMTCkgewotICAgICAgICBBTE9HRV9JRihzdXJmYWNlVGV4dHVyZT09MCwgImdvdCBhIE5VTEwgSVN1cmZhY2VUZXh0dXJlIGZyb20gSVN1cmZhY2UiKTsKLSAgICAgICAgaWYgKHN1cmZhY2VUZXh0dXJlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNldElTdXJmYWNlVGV4dHVyZShzdXJmYWNlVGV4dHVyZSk7Ci0gICAgICAgICAgICBzZXRVc2FnZShHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19SRU5ERVIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGlzcGxheUluZm8gZGluZm87Ci0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oMCwgJmRpbmZvKTsKLSAgICAgICAgY29uc3RfY2FzdDxmbG9hdCY+KEFOYXRpdmVXaW5kb3c6OnhkcGkpID0gZGluZm8ueGRwaTsKLSAgICAgICAgY29uc3RfY2FzdDxmbG9hdCY+KEFOYXRpdmVXaW5kb3c6OnlkcGkpID0gZGluZm8ueWRwaTsKLSAgICAgICAgY29uc3RfY2FzdDx1aW50MzJfdCY+KEFOYXRpdmVXaW5kb3c6OmZsYWdzKSA9IDA7Ci0gICAgfQotfQotCi1TdXJmYWNlOjp+U3VyZmFjZSgpCi17Ci0gICAgLy8gY2xlYXIgYWxsIHJlZmVyZW5jZXMgYW5kIHRyaWdnZXIgYW4gSVBDIG5vdywgdG8gbWFrZSBzdXJlIHRoaW5ncwotICAgIC8vIGhhcHBlbiB3aXRob3V0IGRlbGF5LCBzaW5jZSB0aGVzZSByZXNvdXJjZXMgYXJlIHF1aXRlIGhlYXZ5LgotICAgIG1TdXJmYWNlLmNsZWFyKCk7Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotfQotCi1ib29sIFN1cmZhY2U6OmlzVmFsaWQoKSB7Ci0gICAgcmV0dXJuIGdldElTdXJmYWNlVGV4dHVyZSgpICE9IE5VTEw7Ci19Ci0KLXNwPElTdXJmYWNlVGV4dHVyZT4gU3VyZmFjZTo6Z2V0U3VyZmFjZVRleHR1cmUoKSB7Ci0gICAgcmV0dXJuIGdldElTdXJmYWNlVGV4dHVyZSgpOwotfQotCi1zcDxJQmluZGVyPiBTdXJmYWNlOjphc0JpbmRlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbVN1cmZhY2UhPTAgPyBtU3VyZmFjZS0+YXNCaW5kZXIoKSA6IDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IFN1cmZhY2U6OnF1ZXJ5KGludCB3aGF0LCBpbnQqIHZhbHVlKSBjb25zdCB7Ci0gICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX0NPTkNSRVRFX1RZUEU6Ci0gICAgICAgICp2YWx1ZSA9IE5BVElWRV9XSU5ET1dfU1VSRkFDRTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gU3VyZmFjZVRleHR1cmVDbGllbnQ6OnF1ZXJ5KHdoYXQsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBTdXJmYWNlOjpsb2NrKFN1cmZhY2VJbmZvKiBvdGhlciwgUmVnaW9uKiBpbk91dERpcnR5UmVnaW9uKSB7Ci0gICAgQU5hdGl2ZVdpbmRvd19CdWZmZXIgb3V0QnVmZmVyOwotCi0gICAgQVJlY3QgdGVtcDsKLSAgICBBUmVjdCogaW5PdXREaXJ0eUJvdW5kcyA9IE5VTEw7Ci0gICAgaWYgKGluT3V0RGlydHlSZWdpb24pIHsKLSAgICAgICAgdGVtcCA9IGluT3V0RGlydHlSZWdpb24tPmdldEJvdW5kcygpOwotICAgICAgICBpbk91dERpcnR5Qm91bmRzID0gJnRlbXA7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gU3VyZmFjZVRleHR1cmVDbGllbnQ6OmxvY2soJm91dEJ1ZmZlciwgaW5PdXREaXJ0eUJvdW5kcyk7Ci0KLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG90aGVyLT53ID0gdWludDMyX3Qob3V0QnVmZmVyLndpZHRoKTsKLSAgICAgICAgb3RoZXItPmggPSB1aW50MzJfdChvdXRCdWZmZXIuaGVpZ2h0KTsKLSAgICAgICAgb3RoZXItPnMgPSB1aW50MzJfdChvdXRCdWZmZXIuc3RyaWRlKTsKLSAgICAgICAgb3RoZXItPnVzYWdlID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTjsKLSAgICAgICAgb3RoZXItPmZvcm1hdCA9IHVpbnQzMl90KG91dEJ1ZmZlci5mb3JtYXQpOwotICAgICAgICBvdGhlci0+Yml0cyA9IG91dEJ1ZmZlci5iaXRzOwotICAgIH0KLQotICAgIGlmIChpbk91dERpcnR5UmVnaW9uKSB7Ci0gICAgICAgIGluT3V0RGlydHlSZWdpb24tPnNldCggc3RhdGljX2Nhc3Q8UmVjdCBjb25zdCY+KHRlbXApICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZTo6dW5sb2NrQW5kUG9zdCgpIHsKLSAgICByZXR1cm4gU3VyZmFjZVRleHR1cmVDbGllbnQ6OnVubG9ja0FuZFBvc3QoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5jcHAgYi9saWJzL2d1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWIxYmE2Li4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZUNvbXBvc2VyQ2xpZW50IgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLSNpbmNsdWRlIDx1aS9EaXNwbGF5SW5mby5oPgotCi0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3NlckNsaWVudC5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvZ3VpL0NvbXBvc2VyU2VydmljZS5oPgotI2luY2x1ZGUgPHByaXZhdGUvZ3VpL0xheWVyU3RhdGUuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2d1aS9TaGFyZWRCdWZmZXJTdGFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKENvbXBvc2VyU2VydmljZSk7Ci0KLUNvbXBvc2VyU2VydmljZTo6Q29tcG9zZXJTZXJ2aWNlKCkKLTogU2luZ2xldG9uPENvbXBvc2VyU2VydmljZT4oKSB7Ci0gICAgY29uc3QgU3RyaW5nMTYgbmFtZSgiU3VyZmFjZUZsaW5nZXIiKTsKLSAgICB3aGlsZSAoZ2V0U2VydmljZShuYW1lLCAmbUNvbXBvc2VyU2VydmljZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgdXNsZWVwKDI1MDAwMCk7Ci0gICAgfQotICAgIG1TZXJ2ZXJDYmxrTWVtb3J5ID0gbUNvbXBvc2VyU2VydmljZS0+Z2V0Q2JsaygpOwotICAgIG1TZXJ2ZXJDYmxrID0gc3RhdGljX2Nhc3Q8c3VyZmFjZV9mbGluZ2VyX2NibGtfdCB2b2xhdGlsZSAqPigKLSAgICAgICAgICAgIG1TZXJ2ZXJDYmxrTWVtb3J5LT5nZXRCYXNlKCkpOwotfQotCi1zcDxJU3VyZmFjZUNvbXBvc2VyPiBDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpIHsKLSAgICByZXR1cm4gQ29tcG9zZXJTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLm1Db21wb3NlclNlcnZpY2U7Ci19Ci0KLXN1cmZhY2VfZmxpbmdlcl9jYmxrX3QgY29uc3Qgdm9sYXRpbGUgKiBDb21wb3NlclNlcnZpY2U6OmdldENvbnRyb2xCbG9jaygpIHsKLSAgICByZXR1cm4gQ29tcG9zZXJTZXJ2aWNlOjpnZXRJbnN0YW5jZSgpLm1TZXJ2ZXJDYmxrOwotfQotCi1zdGF0aWMgaW5saW5lIHNwPElTdXJmYWNlQ29tcG9zZXI+IGdldENvbXBvc2VyU2VydmljZSgpIHsKLSAgICByZXR1cm4gQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKTsKLX0KLQotc3RhdGljIGlubGluZSBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190IGNvbnN0IHZvbGF0aWxlICogZ2V0X2NibGsoKSB7Ci0gICAgcmV0dXJuIENvbXBvc2VyU2VydmljZTo6Z2V0Q29udHJvbEJsb2NrKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBOT1RFOiB0aGlzIGlzIE5PVCBhIG1lbWJlciBmdW5jdGlvbiAoaXQncyBhIGZyaWVuZCBkZWZpbmVkIHdpdGggaXRzCi0vLyBkZWNsYXJhdGlvbikuCi1zdGF0aWMgaW5saW5lCi1pbnQgY29tcGFyZV90eXBlKCBjb25zdCBDb21wb3NlclN0YXRlJiBsaHMsIGNvbnN0IENvbXBvc2VyU3RhdGUmIHJocykgewotICAgIGlmIChsaHMuY2xpZW50IDwgcmhzLmNsaWVudCkgIHJldHVybiAtMTsKLSAgICBpZiAobGhzLmNsaWVudCA+IHJocy5jbGllbnQpICByZXR1cm4gMTsKLSAgICBpZiAobGhzLnN0YXRlLnN1cmZhY2UgPCByaHMuc3RhdGUuc3VyZmFjZSkgIHJldHVybiAtMTsKLSAgICBpZiAobGhzLnN0YXRlLnN1cmZhY2UgPiByaHMuc3RhdGUuc3VyZmFjZSkgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi1jbGFzcyBDb21wb3NlciA6IHB1YmxpYyBTaW5nbGV0b248Q29tcG9zZXI+Ci17Ci0gICAgZnJpZW5kIGNsYXNzIFNpbmdsZXRvbjxDb21wb3Nlcj47Ci0KLSAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgU29ydGVkVmVjdG9yPENvbXBvc2VyU3RhdGU+IG1TdGF0ZXM7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbjsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUZvcmNlU3luY2hyb25vdXM7Ci0KLSAgICBDb21wb3NlcigpIDogU2luZ2xldG9uPENvbXBvc2VyPigpLAotICAgICAgICBtT3JpZW50YXRpb24oSVN1cmZhY2VDb21wb3Nlcjo6ZU9yaWVudGF0aW9uVW5jaGFuZ2VkKSwKLSAgICAgICAgbUZvcmNlU3luY2hyb25vdXMoMCkKLSAgICB7IH0KLQotICAgIHZvaWQgY2xvc2VHbG9iYWxUcmFuc2FjdGlvbkltcGwoYm9vbCBzeW5jaHJvbm91cyk7Ci0KLSAgICBsYXllcl9zdGF0ZV90KiBnZXRMYXllclN0YXRlTG9ja2VkKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LCBTdXJmYWNlSUQgaWQpOwotCi1wdWJsaWM6Ci0KLSAgICBzdGF0dXNfdCBzZXRQb3NpdGlvbihjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBpZCwKLSAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHkpOwotICAgIHN0YXR1c190IHNldFNpemUoY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LCBTdXJmYWNlSUQgaWQsCi0gICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKLSAgICBzdGF0dXNfdCBzZXRMYXllcihjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBpZCwKLSAgICAgICAgICAgIGludDMyX3Qgeik7Ci0gICAgc3RhdHVzX3Qgc2V0RmxhZ3MoY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LCBTdXJmYWNlSUQgaWQsCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncywgdWludDMyX3QgbWFzayk7Ci0gICAgc3RhdHVzX3Qgc2V0VHJhbnNwYXJlbnRSZWdpb25IaW50KAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LCBTdXJmYWNlSUQgaWQsCi0gICAgICAgICAgICBjb25zdCBSZWdpb24mIHRyYW5zcGFyZW50UmVnaW9uKTsKLSAgICBzdGF0dXNfdCBzZXRBbHBoYShjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBpZCwKLSAgICAgICAgICAgIGZsb2F0IGFscGhhKTsKLSAgICBzdGF0dXNfdCBzZXRNYXRyaXgoY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LCBTdXJmYWNlSUQgaWQsCi0gICAgICAgICAgICBmbG9hdCBkc2R4LCBmbG9hdCBkdGR4LCBmbG9hdCBkc2R5LCBmbG9hdCBkdGR5KTsKLSAgICBzdGF0dXNfdCBzZXRGcmVlemVUaW50KAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LCBTdXJmYWNlSUQgaWQsCi0gICAgICAgICAgICB1aW50MzJfdCB0aW50KTsKLSAgICBzdGF0dXNfdCBzZXRPcmllbnRhdGlvbihpbnQgb3JpZW50YXRpb24pOwotCi0gICAgc3RhdGljIHZvaWQgY2xvc2VHbG9iYWxUcmFuc2FjdGlvbihib29sIHN5bmNocm9ub3VzKSB7Ci0gICAgICAgIENvbXBvc2VyOjpnZXRJbnN0YW5jZSgpLmNsb3NlR2xvYmFsVHJhbnNhY3Rpb25JbXBsKHN5bmNocm9ub3VzKTsKLSAgICB9Ci19OwotCi1BTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoQ29tcG9zZXIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBDb21wb3Nlcjo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbkltcGwoYm9vbCBzeW5jaHJvbm91cykgewotICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IHNtKGdldENvbXBvc2VyU2VydmljZSgpKTsKLQotICAgIFZlY3RvcjxDb21wb3NlclN0YXRlPiB0cmFuc2FjdGlvbjsKLSAgICBpbnQgb3JpZW50YXRpb247Ci0gICAgdWludDMyX3QgZmxhZ3MgPSAwOwotCi0gICAgeyAvLyBzY29wZSBmb3IgdGhlIGxvY2sKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgdHJhbnNhY3Rpb24gPSBtU3RhdGVzOwotICAgICAgICBtU3RhdGVzLmNsZWFyKCk7Ci0KLSAgICAgICAgb3JpZW50YXRpb24gPSBtT3JpZW50YXRpb247Ci0gICAgICAgIG1PcmllbnRhdGlvbiA9IElTdXJmYWNlQ29tcG9zZXI6OmVPcmllbnRhdGlvblVuY2hhbmdlZDsKLQotICAgICAgICBpZiAoc3luY2hyb25vdXMgfHwgbUZvcmNlU3luY2hyb25vdXMpIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IElTdXJmYWNlQ29tcG9zZXI6OmVTeW5jaHJvbm91czsKLSAgICAgICAgfQotICAgICAgICBtRm9yY2VTeW5jaHJvbm91cyA9IGZhbHNlOwotICAgIH0KLQotICAgc20tPnNldFRyYW5zYWN0aW9uU3RhdGUodHJhbnNhY3Rpb24sIG9yaWVudGF0aW9uLCBmbGFncyk7Ci19Ci0KLWxheWVyX3N0YXRlX3QqIENvbXBvc2VyOjpnZXRMYXllclN0YXRlTG9ja2VkKAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBpZCkgewotCi0gICAgQ29tcG9zZXJTdGF0ZSBzOwotICAgIHMuY2xpZW50ID0gY2xpZW50LT5tQ2xpZW50OwotICAgIHMuc3RhdGUuc3VyZmFjZSA9IGlkOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TdGF0ZXMuaW5kZXhPZihzKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIC8vIHdlIGRvbid0IGhhdmUgaXQsIGFkZCBhbiBpbml0aWFsaXplZCBsYXllcl9zdGF0ZSB0byBvdXIgbGlzdAotICAgICAgICBpbmRleCA9IG1TdGF0ZXMuYWRkKHMpOwotICAgIH0KLQotICAgIENvbXBvc2VyU3RhdGUqIGNvbnN0IG91dCA9IG1TdGF0ZXMuZWRpdEFycmF5KCk7Ci0gICAgcmV0dXJuICYob3V0W2luZGV4XS5zdGF0ZSk7Ci19Ci0KLXN0YXR1c190IENvbXBvc2VyOjpzZXRQb3NpdGlvbihjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIFN1cmZhY2VJRCBpZCwgZmxvYXQgeCwgZmxvYXQgeSkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbGF5ZXJfc3RhdGVfdCogcyA9IGdldExheWVyU3RhdGVMb2NrZWQoY2xpZW50LCBpZCk7Ci0gICAgaWYgKCFzKQotICAgICAgICByZXR1cm4gQkFEX0lOREVYOwotICAgIHMtPndoYXQgfD0gSVN1cmZhY2VDb21wb3Nlcjo6ZVBvc2l0aW9uQ2hhbmdlZDsKLSAgICBzLT54ID0geDsKLSAgICBzLT55ID0geTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IENvbXBvc2VyOjpzZXRTaXplKGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgU3VyZmFjZUlEIGlkLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBsYXllcl9zdGF0ZV90KiBzID0gZ2V0TGF5ZXJTdGF0ZUxvY2tlZChjbGllbnQsIGlkKTsKLSAgICBpZiAoIXMpCi0gICAgICAgIHJldHVybiBCQURfSU5ERVg7Ci0gICAgcy0+d2hhdCB8PSBJU3VyZmFjZUNvbXBvc2VyOjplU2l6ZUNoYW5nZWQ7Ci0gICAgcy0+dyA9IHc7Ci0gICAgcy0+aCA9IGg7Ci0KLSAgICAvLyBSZXNpemluZyBhIHN1cmZhY2UgbWFrZXMgdGhlIHRyYW5zYWN0aW9uIHN5bmNocm9ub3VzLgotICAgIG1Gb3JjZVN5bmNocm9ub3VzID0gdHJ1ZTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQ29tcG9zZXI6OnNldExheWVyKGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgU3VyZmFjZUlEIGlkLCBpbnQzMl90IHopIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGxheWVyX3N0YXRlX3QqIHMgPSBnZXRMYXllclN0YXRlTG9ja2VkKGNsaWVudCwgaWQpOwotICAgIGlmICghcykKLSAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKLSAgICBzLT53aGF0IHw9IElTdXJmYWNlQ29tcG9zZXI6OmVMYXllckNoYW5nZWQ7Ci0gICAgcy0+eiA9IHo7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBDb21wb3Nlcjo6c2V0RmxhZ3MoY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBTdXJmYWNlSUQgaWQsIHVpbnQzMl90IGZsYWdzLAotICAgICAgICB1aW50MzJfdCBtYXNrKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBsYXllcl9zdGF0ZV90KiBzID0gZ2V0TGF5ZXJTdGF0ZUxvY2tlZChjbGllbnQsIGlkKTsKLSAgICBpZiAoIXMpCi0gICAgICAgIHJldHVybiBCQURfSU5ERVg7Ci0gICAgcy0+d2hhdCB8PSBJU3VyZmFjZUNvbXBvc2VyOjplVmlzaWJpbGl0eUNoYW5nZWQ7Ci0gICAgcy0+ZmxhZ3MgJj0gfm1hc2s7Ci0gICAgcy0+ZmxhZ3MgfD0gKGZsYWdzICYgbWFzayk7Ci0gICAgcy0+bWFzayB8PSBtYXNrOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQ29tcG9zZXI6OnNldFRyYW5zcGFyZW50UmVnaW9uSGludCgKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LCBTdXJmYWNlSUQgaWQsCi0gICAgICAgIGNvbnN0IFJlZ2lvbiYgdHJhbnNwYXJlbnRSZWdpb24pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGxheWVyX3N0YXRlX3QqIHMgPSBnZXRMYXllclN0YXRlTG9ja2VkKGNsaWVudCwgaWQpOwotICAgIGlmICghcykKLSAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKLSAgICBzLT53aGF0IHw9IElTdXJmYWNlQ29tcG9zZXI6OmVUcmFuc3BhcmVudFJlZ2lvbkNoYW5nZWQ7Ci0gICAgcy0+dHJhbnNwYXJlbnRSZWdpb24gPSB0cmFuc3BhcmVudFJlZ2lvbjsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IENvbXBvc2VyOjpzZXRBbHBoYShjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIFN1cmZhY2VJRCBpZCwgZmxvYXQgYWxwaGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGxheWVyX3N0YXRlX3QqIHMgPSBnZXRMYXllclN0YXRlTG9ja2VkKGNsaWVudCwgaWQpOwotICAgIGlmICghcykKLSAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKLSAgICBzLT53aGF0IHw9IElTdXJmYWNlQ29tcG9zZXI6OmVBbHBoYUNoYW5nZWQ7Ci0gICAgcy0+YWxwaGEgPSBhbHBoYTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IENvbXBvc2VyOjpzZXRNYXRyaXgoY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBTdXJmYWNlSUQgaWQsIGZsb2F0IGRzZHgsIGZsb2F0IGR0ZHgsCi0gICAgICAgIGZsb2F0IGRzZHksIGZsb2F0IGR0ZHkpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGxheWVyX3N0YXRlX3QqIHMgPSBnZXRMYXllclN0YXRlTG9ja2VkKGNsaWVudCwgaWQpOwotICAgIGlmICghcykKLSAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKLSAgICBzLT53aGF0IHw9IElTdXJmYWNlQ29tcG9zZXI6OmVNYXRyaXhDaGFuZ2VkOwotICAgIGxheWVyX3N0YXRlX3Q6Om1hdHJpeDIyX3QgbWF0cml4OwotICAgIG1hdHJpeC5kc2R4ID0gZHNkeDsKLSAgICBtYXRyaXguZHRkeCA9IGR0ZHg7Ci0gICAgbWF0cml4LmRzZHkgPSBkc2R5OwotICAgIG1hdHJpeC5kdGR5ID0gZHRkeTsKLSAgICBzLT5tYXRyaXggPSBtYXRyaXg7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBDb21wb3Nlcjo6c2V0RnJlZXplVGludChjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIFN1cmZhY2VJRCBpZCwgdWludDMyX3QgdGludCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbGF5ZXJfc3RhdGVfdCogcyA9IGdldExheWVyU3RhdGVMb2NrZWQoY2xpZW50LCBpZCk7Ci0gICAgaWYgKCFzKQotICAgICAgICByZXR1cm4gQkFEX0lOREVYOwotICAgIHMtPndoYXQgfD0gSVN1cmZhY2VDb21wb3Nlcjo6ZUZyZWV6ZVRpbnRDaGFuZ2VkOwotICAgIHMtPnRpbnQgPSB0aW50OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQ29tcG9zZXI6OnNldE9yaWVudGF0aW9uKGludCBvcmllbnRhdGlvbikgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbU9yaWVudGF0aW9uID0gb3JpZW50YXRpb247Ci0KLSAgICAvLyBDaGFuZ2luZyB0aGUgb3JpZW50YXRpb24gbWFrZXMgdGhlIHRyYW5zYWN0aW9uIHN5bmNocm9ub3VzLgotICAgIG1Gb3JjZVN5bmNocm9ub3VzID0gdHJ1ZTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVN1cmZhY2VDb21wb3NlckNsaWVudDo6U3VyZmFjZUNvbXBvc2VyQ2xpZW50KCkKLSAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1Db21wb3NlcihDb21wb3Nlcjo6Z2V0SW5zdGFuY2UoKSkKLXsKLX0KLQotdm9pZCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9uRmlyc3RSZWYoKSB7Ci0gICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gc20oZ2V0Q29tcG9zZXJTZXJ2aWNlKCkpOwotICAgIGlmIChzbSAhPSAwKSB7Ci0gICAgICAgIHNwPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbm4gPSBzbS0+Y3JlYXRlQ29ubmVjdGlvbigpOwotICAgICAgICBpZiAoY29ubiAhPSAwKSB7Ci0gICAgICAgICAgICBtQ2xpZW50ID0gY29ubjsKLSAgICAgICAgICAgIG1TdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotU3VyZmFjZUNvbXBvc2VyQ2xpZW50Ojp+U3VyZmFjZUNvbXBvc2VyQ2xpZW50KCkgewotICAgIGRpc3Bvc2UoKTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50Ojppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TdGF0dXM7Ci19Ci0KLXNwPElCaW5kZXI+IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y29ubmVjdGlvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gKG1DbGllbnQgIT0gMCkgPyBtQ2xpZW50LT5hc0JpbmRlcigpIDogMDsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpsaW5rVG9Db21wb3NlckRlYXRoKAotICAgICAgICBjb25zdCBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKLSAgICAgICAgdm9pZCogY29va2llLCB1aW50MzJfdCBmbGFncykgewotICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IHNtKGdldENvbXBvc2VyU2VydmljZSgpKTsKLSAgICByZXR1cm4gc20tPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKHJlY2lwaWVudCwgY29va2llLCBmbGFncyk7Ci19Ci0KLXZvaWQgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpkaXNwb3NlKCkgewotICAgIC8vIHRoaXMgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4KLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjbGllbnQ7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sbShtTG9jayk7Ci0gICAgaWYgKG1DbGllbnQgIT0gMCkgewotICAgICAgICBjbGllbnQgPSBtQ2xpZW50OyAvLyBob2xkIHJlZiB3aGlsZSBsb2NrIGlzIGhlbGQKLSAgICAgICAgbUNsaWVudC5jbGVhcigpOwotICAgIH0KLSAgICBtU3RhdHVzID0gTk9fSU5JVDsKLX0KLQotc3A8U3VyZmFjZUNvbnRyb2w+IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y3JlYXRlU3VyZmFjZSgKLSAgICAgICAgRGlzcGxheUlEIGRpc3BsYXksCi0gICAgICAgIHVpbnQzMl90IHcsCi0gICAgICAgIHVpbnQzMl90IGgsCi0gICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgU3RyaW5nOCBuYW1lOwotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMTI4OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIjxwaWRfJWQ+IiwgZ2V0cGlkKCkpOwotICAgIG5hbWUuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICByZXR1cm4gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjcmVhdGVTdXJmYWNlKG5hbWUsIGRpc3BsYXksCi0gICAgICAgICAgICB3LCBoLCBmb3JtYXQsIGZsYWdzKTsKLX0KLQotc3A8U3VyZmFjZUNvbnRyb2w+IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y3JlYXRlU3VyZmFjZSgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwKLSAgICAgICAgRGlzcGxheUlEIGRpc3BsYXksCi0gICAgICAgIHVpbnQzMl90IHcsCi0gICAgICAgIHVpbnQzMl90IGgsCi0gICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3A8U3VyZmFjZUNvbnRyb2w+IHJlc3VsdDsKLSAgICBpZiAobVN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzdXJmYWNlX2RhdGFfdCBkYXRhOwotICAgICAgICBzcDxJU3VyZmFjZT4gc3VyZmFjZSA9IG1DbGllbnQtPmNyZWF0ZVN1cmZhY2UoJmRhdGEsIG5hbWUsCi0gICAgICAgICAgICAgICAgZGlzcGxheSwgdywgaCwgZm9ybWF0LCBmbGFncyk7Ci0gICAgICAgIGlmIChzdXJmYWNlICE9IDApIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdXJmYWNlQ29udHJvbCh0aGlzLCBzdXJmYWNlLCBkYXRhKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmRlc3Ryb3lTdXJmYWNlKFN1cmZhY2VJRCBzaWQpIHsKLSAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUikKLSAgICAgICAgcmV0dXJuIG1TdGF0dXM7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudC0+ZGVzdHJveVN1cmZhY2Uoc2lkKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1pbmxpbmUgQ29tcG9zZXImIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0Q29tcG9zZXIoKSB7Ci0gICAgcmV0dXJuIG1Db21wb3NlcjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCkgewotICAgIC8vIEN1cnJlbnRseSBhIG5vLW9wCi19Ci0KLXZvaWQgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKGJvb2wgc3luY2hyb25vdXMpIHsKLSAgICBDb21wb3Nlcjo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbihzeW5jaHJvbm91cyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzZXRGcmVlemVUaW50KFN1cmZhY2VJRCBpZCwgdWludDMyX3QgdGludCkgewotICAgIHJldHVybiBnZXRDb21wb3NlcigpLnNldEZyZWV6ZVRpbnQodGhpcywgaWQsIHRpbnQpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnNldFBvc2l0aW9uKFN1cmZhY2VJRCBpZCwgZmxvYXQgeCwgZmxvYXQgeSkgewotICAgIHJldHVybiBnZXRDb21wb3NlcigpLnNldFBvc2l0aW9uKHRoaXMsIGlkLCB4LCB5KTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzZXRTaXplKFN1cmZhY2VJRCBpZCwgdWludDMyX3QgdywgdWludDMyX3QgaCkgewotICAgIHJldHVybiBnZXRDb21wb3NlcigpLnNldFNpemUodGhpcywgaWQsIHcsIGgpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnNldExheWVyKFN1cmZhY2VJRCBpZCwgaW50MzJfdCB6KSB7Ci0gICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0TGF5ZXIodGhpcywgaWQsIHopOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmhpZGUoU3VyZmFjZUlEIGlkKSB7Ci0gICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0RmxhZ3ModGhpcywgaWQsCi0gICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplTGF5ZXJIaWRkZW4sCi0gICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplTGF5ZXJIaWRkZW4pOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnNob3coU3VyZmFjZUlEIGlkLCBpbnQzMl90KSB7Ci0gICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0RmxhZ3ModGhpcywgaWQsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6ZUxheWVySGlkZGVuKTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpmcmVlemUoU3VyZmFjZUlEIGlkKSB7Ci0gICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0RmxhZ3ModGhpcywgaWQsCi0gICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplTGF5ZXJGcm96ZW4sCi0gICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplTGF5ZXJGcm96ZW4pOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnVuZnJlZXplKFN1cmZhY2VJRCBpZCkgewotICAgIHJldHVybiBnZXRDb21wb3NlcigpLnNldEZsYWdzKHRoaXMsIGlkLAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVMYXllckZyb3plbik7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6c2V0RmxhZ3MoU3VyZmFjZUlEIGlkLCB1aW50MzJfdCBmbGFncywKLSAgICAgICAgdWludDMyX3QgbWFzaykgewotICAgIHJldHVybiBnZXRDb21wb3NlcigpLnNldEZsYWdzKHRoaXMsIGlkLCBmbGFncywgbWFzayk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6c2V0VHJhbnNwYXJlbnRSZWdpb25IaW50KFN1cmZhY2VJRCBpZCwKLSAgICAgICAgY29uc3QgUmVnaW9uJiB0cmFuc3BhcmVudFJlZ2lvbikgewotICAgIHJldHVybiBnZXRDb21wb3NlcigpLnNldFRyYW5zcGFyZW50UmVnaW9uSGludCh0aGlzLCBpZCwgdHJhbnNwYXJlbnRSZWdpb24pOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnNldEFscGhhKFN1cmZhY2VJRCBpZCwgZmxvYXQgYWxwaGEpIHsKLSAgICByZXR1cm4gZ2V0Q29tcG9zZXIoKS5zZXRBbHBoYSh0aGlzLCBpZCwgYWxwaGEpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnNldE1hdHJpeChTdXJmYWNlSUQgaWQsIGZsb2F0IGRzZHgsIGZsb2F0IGR0ZHgsCi0gICAgICAgIGZsb2F0IGRzZHksIGZsb2F0IGR0ZHkpIHsKLSAgICByZXR1cm4gZ2V0Q29tcG9zZXIoKS5zZXRNYXRyaXgodGhpcywgaWQsIGRzZHgsIGR0ZHgsIGRzZHksIGR0ZHkpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnNldE9yaWVudGF0aW9uKERpc3BsYXlJRCBkcHksCi0gICAgICAgIGludCBvcmllbnRhdGlvbiwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgcmV0dXJuIENvbXBvc2VyOjpnZXRJbnN0YW5jZSgpLnNldE9yaWVudGF0aW9uKG9yaWVudGF0aW9uKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKAotICAgICAgICBEaXNwbGF5SUQgZHB5LCBEaXNwbGF5SW5mbyogaW5mbykKLXsKLSAgICBpZiAodWludDMyX3QoZHB5KT49TlVNX0RJU1BMQVlfTUFYKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgdm9sYXRpbGUgc3VyZmFjZV9mbGluZ2VyX2NibGtfdCBjb25zdCAqIGNibGsgPSBnZXRfY2JsaygpOwotICAgIHZvbGF0aWxlIGRpc3BsYXlfY2Jsa190IGNvbnN0ICogZGNibGsgPSBjYmxrLT5kaXNwbGF5cyArIGRweTsKLQotICAgIGluZm8tPncgICAgICAgICAgICAgID0gZGNibGstPnc7Ci0gICAgaW5mby0+aCAgICAgICAgICAgICAgPSBkY2Jsay0+aDsKLSAgICBpbmZvLT5vcmllbnRhdGlvbiAgICA9IGRjYmxrLT5vcmllbnRhdGlvbjsKLSAgICBpbmZvLT54ZHBpICAgICAgICAgICA9IGRjYmxrLT54ZHBpOwotICAgIGluZm8tPnlkcGkgICAgICAgICAgID0gZGNibGstPnlkcGk7Ci0gICAgaW5mby0+ZnBzICAgICAgICAgICAgPSBkY2Jsay0+ZnBzOwotICAgIGluZm8tPmRlbnNpdHkgICAgICAgID0gZGNibGstPmRlbnNpdHk7Ci0gICAgcmV0dXJuIGdldFBpeGVsRm9ybWF0SW5mbyhkY2Jsay0+Zm9ybWF0LCAmKGluZm8tPnBpeGVsRm9ybWF0SW5mbykpOwotfQotCi1zc2l6ZV90IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheVdpZHRoKERpc3BsYXlJRCBkcHkpCi17Ci0gICAgaWYgKHVpbnQzMl90KGRweSk+PU5VTV9ESVNQTEFZX01BWCkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB2b2xhdGlsZSBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190IGNvbnN0ICogY2JsayA9IGdldF9jYmxrKCk7Ci0gICAgdm9sYXRpbGUgZGlzcGxheV9jYmxrX3QgY29uc3QgKiBkY2JsayA9IGNibGstPmRpc3BsYXlzICsgZHB5OwotICAgIHJldHVybiBkY2Jsay0+dzsKLX0KLQotc3NpemVfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlIZWlnaHQoRGlzcGxheUlEIGRweSkKLXsKLSAgICBpZiAodWludDMyX3QoZHB5KT49TlVNX0RJU1BMQVlfTUFYKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIHZvbGF0aWxlIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QgY29uc3QgKiBjYmxrID0gZ2V0X2NibGsoKTsKLSAgICB2b2xhdGlsZSBkaXNwbGF5X2NibGtfdCBjb25zdCAqIGRjYmxrID0gY2Jsay0+ZGlzcGxheXMgKyBkcHk7Ci0gICAgcmV0dXJuIGRjYmxrLT5oOwotfQotCi1zc2l6ZV90IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheU9yaWVudGF0aW9uKERpc3BsYXlJRCBkcHkpCi17Ci0gICAgaWYgKHVpbnQzMl90KGRweSk+PU5VTV9ESVNQTEFZX01BWCkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB2b2xhdGlsZSBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190IGNvbnN0ICogY2JsayA9IGdldF9jYmxrKCk7Ci0gICAgdm9sYXRpbGUgZGlzcGxheV9jYmxrX3QgY29uc3QgKiBkY2JsayA9IGNibGstPmRpc3BsYXlzICsgZHB5OwotICAgIHJldHVybiBkY2Jsay0+b3JpZW50YXRpb247Ci19Ci0KLXNzaXplX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXROdW1iZXJPZkRpc3BsYXlzKCkKLXsKLSAgICB2b2xhdGlsZSBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190IGNvbnN0ICogY2JsayA9IGdldF9jYmxrKCk7Ci0gICAgdWludDMyX3QgY29ubmVjdGVkID0gY2Jsay0+Y29ubmVjdGVkOwotICAgIGludCBuID0gMDsKLSAgICB3aGlsZSAoY29ubmVjdGVkKSB7Ci0gICAgICAgIGlmIChjb25uZWN0ZWQmMSkgbisrOwotICAgICAgICBjb25uZWN0ZWQgPj49IDE7Ci0gICAgfQotICAgIHJldHVybiBuOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6ZnJlZXplRGlzcGxheShEaXNwbGF5SUQgZHB5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICAvLyBUaGlzIGhhcyBiZWVuIG1hZGUgYSBuby1vcCBiZWNhdXNlIGl0IGNhbiBjYXVzZSBHcmFsbG9jIGJ1ZmZlciBkZWFkbG9ja3MuCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnVuZnJlZXplRGlzcGxheShEaXNwbGF5SUQgZHB5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICAvLyBUaGlzIGhhcyBiZWVuIG1hZGUgYSBuby1vcCBiZWNhdXNlIGl0IGNhbiBjYXVzZSBHcmFsbG9jIGJ1ZmZlciBkZWFkbG9ja3MuCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNjcmVlbnNob3RDbGllbnQ6OlNjcmVlbnNob3RDbGllbnQoKQotICAgIDogbVdpZHRoKDApLCBtSGVpZ2h0KDApLCBtRm9ybWF0KFBJWEVMX0ZPUk1BVF9OT05FKSB7Ci19Ci0KLXN0YXR1c190IFNjcmVlbnNob3RDbGllbnQ6OnVwZGF0ZSgpIHsKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBzKENvbXBvc2VyU2VydmljZTo6Z2V0Q29tcG9zZXJTZXJ2aWNlKCkpOwotICAgIGlmIChzID09IE5VTEwpIHJldHVybiBOT19JTklUOwotICAgIG1IZWFwID0gMDsKLSAgICByZXR1cm4gcy0+Y2FwdHVyZVNjcmVlbigwLCAmbUhlYXAsCi0gICAgICAgICAgICAmbVdpZHRoLCAmbUhlaWdodCwgJm1Gb3JtYXQsIDAsIDAsCi0gICAgICAgICAgICAwLCAtMVVMKTsKLX0KLQotc3RhdHVzX3QgU2NyZWVuc2hvdENsaWVudDo6dXBkYXRlKHVpbnQzMl90IHJlcVdpZHRoLCB1aW50MzJfdCByZXFIZWlnaHQpIHsKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBzKENvbXBvc2VyU2VydmljZTo6Z2V0Q29tcG9zZXJTZXJ2aWNlKCkpOwotICAgIGlmIChzID09IE5VTEwpIHJldHVybiBOT19JTklUOwotICAgIG1IZWFwID0gMDsKLSAgICByZXR1cm4gcy0+Y2FwdHVyZVNjcmVlbigwLCAmbUhlYXAsCi0gICAgICAgICAgICAmbVdpZHRoLCAmbUhlaWdodCwgJm1Gb3JtYXQsIHJlcVdpZHRoLCByZXFIZWlnaHQsCi0gICAgICAgICAgICAwLCAtMVVMKTsKLX0KLQotc3RhdHVzX3QgU2NyZWVuc2hvdENsaWVudDo6dXBkYXRlKHVpbnQzMl90IHJlcVdpZHRoLCB1aW50MzJfdCByZXFIZWlnaHQsCi0gICAgICAgIHVpbnQzMl90IG1pbkxheWVyWiwgdWludDMyX3QgbWF4TGF5ZXJaKSB7Ci0gICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gcyhDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpKTsKLSAgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gTk9fSU5JVDsKLSAgICBtSGVhcCA9IDA7Ci0gICAgcmV0dXJuIHMtPmNhcHR1cmVTY3JlZW4oMCwgJm1IZWFwLAotICAgICAgICAgICAgJm1XaWR0aCwgJm1IZWlnaHQsICZtRm9ybWF0LCByZXFXaWR0aCwgcmVxSGVpZ2h0LAotICAgICAgICAgICAgbWluTGF5ZXJaLCBtYXhMYXllclopOwotfQotCi12b2lkIFNjcmVlbnNob3RDbGllbnQ6OnJlbGVhc2UoKSB7Ci0gICAgbUhlYXAgPSAwOwotfQotCi12b2lkIGNvbnN0KiBTY3JlZW5zaG90Q2xpZW50OjpnZXRQaXhlbHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1IZWFwLT5nZXRCYXNlKCk7Ci19Ci0KLXVpbnQzMl90IFNjcmVlbnNob3RDbGllbnQ6OmdldFdpZHRoKCkgY29uc3QgewotICAgIHJldHVybiBtV2lkdGg7Ci19Ci0KLXVpbnQzMl90IFNjcmVlbnNob3RDbGllbnQ6OmdldEhlaWdodCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUhlaWdodDsKLX0KLQotUGl4ZWxGb3JtYXQgU2NyZWVuc2hvdENsaWVudDo6Z2V0Rm9ybWF0KCkgY29uc3QgewotICAgIHJldHVybiBtRm9ybWF0OwotfQotCi11aW50MzJfdCBTY3JlZW5zaG90Q2xpZW50OjpnZXRTdHJpZGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1XaWR0aDsKLX0KLQotc2l6ZV90IFNjcmVlbnNob3RDbGllbnQ6OmdldFNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1IZWFwLT5nZXRTaXplKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9TdXJmYWNlVGV4dHVyZS5jcHAgYi9saWJzL2d1aS9TdXJmYWNlVGV4dHVyZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmFhMzQuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvU3VyZmFjZVRleHR1cmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN1cmZhY2VUZXh0dXJlIgotI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCi0jZGVmaW5lIEVHTF9FR0xFWFRfUFJPVE9UWVBFUwotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJBbGxvYy5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZS5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9ndWkvQ29tcG9zZXJTZXJ2aWNlLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotLy8gVGhpcyBjb21waWxlIG9wdGlvbiBtYWtlcyBTdXJmYWNlVGV4dHVyZSB1c2UgdGhlIEVHTF9LSFJfZmVuY2Vfc3luYyBleHRlbnNpb24KLS8vIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgYnVmZmVycy4gIEl0IHdpbGwgY2F1c2UgZGVxdWV1ZUJ1ZmZlciB0byBzdGFsbCwKLS8vIHdhaXRpbmcgZm9yIHRoZSBHTCByZWFkcyBmb3IgdGhlIGJ1ZmZlciBiZWluZyBkZXF1ZXVlZCB0byBjb21wbGV0ZSBiZWZvcmUKLS8vIGFsbG93aW5nIHRoZSBidWZmZXIgdG8gYmUgZGVxdWV1ZWQuCi0jaWZkZWYgVVNFX0ZFTkNFX1NZTkMKLSNpZmRlZiBBTExPV19ERVFVRVVFX0NVUlJFTlRfQlVGRkVSCi0jZXJyb3IgIlVTRV9GRU5DRV9TWU5DIGFuZCBBTExPV19ERVFVRVVFX0NVUlJFTlRfQlVGRkVSIGFyZSBpbmNvbXBhdGlibGUiCi0jZW5kaWYKLSNlbmRpZgotCi0vLyBNYWNyb3MgZm9yIGluY2x1ZGluZyB0aGUgU3VyZmFjZVRleHR1cmUgbmFtZSBpbiBsb2cgbWVzc2FnZXMKLSNkZWZpbmUgU1RfTE9HVih4LCAuLi4pIEFMT0dWKCJbJXNdICJ4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgU1RfTE9HRCh4LCAuLi4pIEFMT0dEKCJbJXNdICJ4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgU1RfTE9HSSh4LCAuLi4pIEFMT0dJKCJbJXNdICJ4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgU1RfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICJ4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgU1RfTE9HRSh4LCAuLi4pIEFMT0dFKCJbJXNdICJ4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUcmFuc2Zvcm0gbWF0cmljZXMKLXN0YXRpYyBmbG9hdCBtdHhJZGVudGl0eVsxNl0gPSB7Ci0gICAgMSwgMCwgMCwgMCwKLSAgICAwLCAxLCAwLCAwLAotICAgIDAsIDAsIDEsIDAsCi0gICAgMCwgMCwgMCwgMSwKLX07Ci1zdGF0aWMgZmxvYXQgbXR4RmxpcEhbMTZdID0gewotICAgIC0xLCAwLCAwLCAwLAotICAgIDAsIDEsIDAsIDAsCi0gICAgMCwgMCwgMSwgMCwKLSAgICAxLCAwLCAwLCAxLAotfTsKLXN0YXRpYyBmbG9hdCBtdHhGbGlwVlsxNl0gPSB7Ci0gICAgMSwgMCwgMCwgMCwKLSAgICAwLCAtMSwgMCwgMCwKLSAgICAwLCAwLCAxLCAwLAotICAgIDAsIDEsIDAsIDEsCi19Owotc3RhdGljIGZsb2F0IG10eFJvdDkwWzE2XSA9IHsKLSAgICAwLCAxLCAwLCAwLAotICAgIC0xLCAwLCAwLCAwLAotICAgIDAsIDAsIDEsIDAsCi0gICAgMSwgMCwgMCwgMSwKLX07Ci1zdGF0aWMgZmxvYXQgbXR4Um90MTgwWzE2XSA9IHsKLSAgICAtMSwgMCwgMCwgMCwKLSAgICAwLCAtMSwgMCwgMCwKLSAgICAwLCAwLCAxLCAwLAotICAgIDEsIDEsIDAsIDEsCi19Owotc3RhdGljIGZsb2F0IG10eFJvdDI3MFsxNl0gPSB7Ci0gICAgMCwgLTEsIDAsIDAsCi0gICAgMSwgMCwgMCwgMCwKLSAgICAwLCAwLCAxLCAwLAotICAgIDAsIDEsIDAsIDEsCi19OwotCi1zdGF0aWMgdm9pZCBtdHhNdWwoZmxvYXQgb3V0WzE2XSwgY29uc3QgZmxvYXQgYVsxNl0sIGNvbnN0IGZsb2F0IGJbMTZdKTsKLQotLy8gR2V0IGFuIElEIHRoYXQncyB1bmlxdWUgd2l0aGluIHRoaXMgcHJvY2Vzcy4KLXN0YXRpYyBpbnQzMl90IGNyZWF0ZVByb2Nlc3NVbmlxdWVJZCgpIHsKLSAgICBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBnbG9iYWxDb3VudGVyID0gMDsKLSAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZnbG9iYWxDb3VudGVyKTsKLX0KLQotU3VyZmFjZVRleHR1cmU6OlN1cmZhY2VUZXh0dXJlKEdMdWludCB0ZXgsIGJvb2wgYWxsb3dTeW5jaHJvbm91c01vZGUsCi0gICAgICAgIEdMZW51bSB0ZXhUYXJnZXQsIGJvb2wgdXNlRmVuY2VTeW5jKSA6Ci0gICAgQnVmZmVyUXVldWUoYWxsb3dTeW5jaHJvbm91c01vZGUpLAotICAgIG1DdXJyZW50VHJhbnNmb3JtKDApLAotICAgIG1DdXJyZW50VGltZXN0YW1wKDApLAotICAgIG1UZXhOYW1lKHRleCksCi0jaWZkZWYgVVNFX0ZFTkNFX1NZTkMKLSAgICBtVXNlRmVuY2VTeW5jKHVzZUZlbmNlU3luYyksCi0jZWxzZQotICAgIG1Vc2VGZW5jZVN5bmMoZmFsc2UpLAotI2VuZGlmCi0gICAgbVRleFRhcmdldCh0ZXhUYXJnZXQpLAotICAgIG1BYmFuZG9uZWQoZmFsc2UpLAotICAgIG1DdXJyZW50VGV4dHVyZShCdWZmZXJRdWV1ZTo6SU5WQUxJRF9CVUZGRVJfU0xPVCkKLXsKLSAgICAvLyBDaG9vc2UgYSBuYW1lIHVzaW5nIHRoZSBQSUQgYW5kIGEgcHJvY2Vzcy11bmlxdWUgSUQuCi0gICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoInVubmFtZWQtJWQtJWQiLCBnZXRwaWQoKSwgY3JlYXRlUHJvY2Vzc1VuaXF1ZUlkKCkpOwotICAgIEJ1ZmZlclF1ZXVlOjpzZXRDb25zdW1lck5hbWUobU5hbWUpOwotCi0gICAgU1RfTE9HVigiU3VyZmFjZVRleHR1cmUiKTsKLSAgICBtZW1jcHkobUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXgsIG10eElkZW50aXR5LAotICAgICAgICAgICAgc2l6ZW9mKG1DdXJyZW50VHJhbnNmb3JtTWF0cml4KSk7Ci19Ci0KLVN1cmZhY2VUZXh0dXJlOjp+U3VyZmFjZVRleHR1cmUoKSB7Ci0gICAgU1RfTE9HVigiflN1cmZhY2VUZXh0dXJlIik7Ci0gICAgYWJhbmRvbigpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlVGV4dHVyZTo6c2V0QnVmZmVyQ291bnRTZXJ2ZXIoaW50IGJ1ZmZlckNvdW50KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gQnVmZmVyUXVldWU6OnNldEJ1ZmZlckNvdW50U2VydmVyKGJ1ZmZlckNvdW50KTsKLX0KLQotCi1zdGF0dXNfdCBTdXJmYWNlVGV4dHVyZTo6c2V0RGVmYXVsdEJ1ZmZlclNpemUodWludDMyX3QgdywgdWludDMyX3QgaCkKLXsKLSAgICByZXR1cm4gQnVmZmVyUXVldWU6OnNldERlZmF1bHRCdWZmZXJTaXplKHcsIGgpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlVGV4dHVyZTo6dXBkYXRlVGV4SW1hZ2UoKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBTVF9MT0dWKCJ1cGRhdGVUZXhJbWFnZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBpZiAobUFiYW5kb25lZCkgewotICAgICAgICBTVF9MT0dFKCJjYWxsaW5nIHVwZGF0ZVRleEltYWdlKCkgb24gYW4gYWJhbmRvbmVkIFN1cmZhY2VUZXh0dXJlIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIEJ1ZmZlckl0ZW0gaXRlbTsKLQotICAgIC8vIEluIGFzeW5jaHJvbm91cyBtb2RlIHRoZSBsaXN0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb25lIGJ1ZmZlcgotICAgIC8vIGRlZXAsIHdoaWxlIGluIHN5bmNocm9ub3VzIG1vZGUgd2UgdXNlIHRoZSBvbGRlc3QgYnVmZmVyLgotICAgIGlmIChhY3F1aXJlKCZpdGVtKSA9PSBOT19FUlJPUikgewotICAgICAgICBpbnQgYnVmID0gaXRlbS5tQnVmOwotICAgICAgICAvLyBUaGlzIGJ1ZmZlciB3YXMgbmV3bHkgYWxsb2NhdGVkLCBzbyB3ZSBuZWVkIHRvIGNsZWFuIHVwIG9uIG91ciBzaWRlCi0gICAgICAgIGlmIChpdGVtLm1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1FR0xTbG90c1tidWZdLm1HcmFwaGljQnVmZmVyID0gMDsKLSAgICAgICAgICAgIGlmIChtRUdMU2xvdHNbYnVmXS5tRWdsSW1hZ2UgIT0gRUdMX05PX0lNQUdFX0tIUikgewotICAgICAgICAgICAgICAgIGVnbERlc3Ryb3lJbWFnZUtIUihtRUdMU2xvdHNbYnVmXS5tRWdsRGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FR0xTbG90c1tidWZdLm1FZ2xJbWFnZSk7Ci0gICAgICAgICAgICAgICAgbUVHTFNsb3RzW2J1Zl0ubUVnbEltYWdlID0gRUdMX05PX0lNQUdFX0tIUjsKLSAgICAgICAgICAgICAgICBtRUdMU2xvdHNbYnVmXS5tRWdsRGlzcGxheSA9IEVHTF9OT19ESVNQTEFZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVHTFNsb3RzW2J1Zl0ubUdyYXBoaWNCdWZmZXIgPSBpdGVtLm1HcmFwaGljQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBHTCB0ZXh0dXJlIG9iamVjdC4KLSAgICAgICAgRUdMSW1hZ2VLSFIgaW1hZ2UgPSBtRUdMU2xvdHNbYnVmXS5tRWdsSW1hZ2U7Ci0gICAgICAgIEVHTERpc3BsYXkgZHB5ID0gZWdsR2V0Q3VycmVudERpc3BsYXkoKTsKLSAgICAgICAgaWYgKGltYWdlID09IEVHTF9OT19JTUFHRV9LSFIpIHsKLSAgICAgICAgICAgIGlmIChpdGVtLm1HcmFwaGljQnVmZmVyID09IDApIHsKLSAgICAgICAgICAgICAgICBTVF9MT0dFKCJidWZmZXIgYXQgc2xvdCAlZCBpcyBudWxsIiwgYnVmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW1hZ2UgPSBjcmVhdGVJbWFnZShkcHksIGl0ZW0ubUdyYXBoaWNCdWZmZXIpOwotICAgICAgICAgICAgbUVHTFNsb3RzW2J1Zl0ubUVnbEltYWdlID0gaW1hZ2U7Ci0gICAgICAgICAgICBtRUdMU2xvdHNbYnVmXS5tRWdsRGlzcGxheSA9IGRweTsKLSAgICAgICAgICAgIGlmIChpbWFnZSA9PSBFR0xfTk9fSU1BR0VfS0hSKSB7Ci0gICAgICAgICAgICAgICAgLy8gTk9URTogaWYgZHB5IHdhcyBpbnZhbGlkLCBjcmVhdGVJbWFnZSgpIGlzIGd1YXJhbnRlZWQgdG8KLSAgICAgICAgICAgICAgICAvLyBmYWlsLiBzbyB3ZSdkIGVuZCB1cCBoZXJlLgotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgR0xpbnQgZXJyb3I7Ci0gICAgICAgIHdoaWxlICgoZXJyb3IgPSBnbEdldEVycm9yKCkpICE9IEdMX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICBTVF9MT0dXKCJ1cGRhdGVUZXhJbWFnZTogY2xlYXJpbmcgR0wgZXJyb3I6ICUjMDR4IiwgZXJyb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2xCaW5kVGV4dHVyZShtVGV4VGFyZ2V0LCBtVGV4TmFtZSk7Ci0gICAgICAgIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMobVRleFRhcmdldCwgKEdMZWdsSW1hZ2VPRVMpaW1hZ2UpOwotCi0gICAgICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlICgoZXJyb3IgPSBnbEdldEVycm9yKCkpICE9IEdMX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICBTVF9MT0dFKCJlcnJvciBiaW5kaW5nIGV4dGVybmFsIHRleHR1cmUgaW1hZ2UgJXAgKHNsb3QgJWQpOiAlIzA0eCIsCi0gICAgICAgICAgICAgICAgICAgIGltYWdlLCBidWYsIGVycm9yKTsKLSAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhaWxlZCkgewotICAgICAgICAgICAgcmVsZWFzZUJ1ZmZlcihidWYsIG1FR0xTbG90c1tidWZdLm1FZ2xEaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICBtRUdMU2xvdHNbYnVmXS5tRmVuY2UpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnJlbnRUZXh0dXJlICE9IElOVkFMSURfQlVGRkVSX1NMT1QpIHsKLSAgICAgICAgICAgIGlmIChtVXNlRmVuY2VTeW5jKSB7Ci0gICAgICAgICAgICAgICAgRUdMU3luY0tIUiBmZW5jZSA9IGVnbENyZWF0ZVN5bmNLSFIoZHB5LCBFR0xfU1lOQ19GRU5DRV9LSFIsCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgICAgICAgICBpZiAoZmVuY2UgPT0gRUdMX05PX1NZTkNfS0hSKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ1cGRhdGVUZXhJbWFnZTogZXJyb3IgY3JlYXRpbmcgZmVuY2U6ICUjeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VCdWZmZXIoYnVmLCBtRUdMU2xvdHNbYnVmXS5tRWdsRGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRUdMU2xvdHNbYnVmXS5tRmVuY2UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2xGbHVzaCgpOwotICAgICAgICAgICAgICAgIG1FR0xTbG90c1ttQ3VycmVudFRleHR1cmVdLm1GZW5jZSA9IGZlbmNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU1RfTE9HVigidXBkYXRlVGV4SW1hZ2U6IChzbG90PSVkIGJ1Zj0lcCkgLT4gKHNsb3Q9JWQgYnVmPSVwKSIsCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRUZXh0dXJlLAotICAgICAgICAgICAgICAgIG1DdXJyZW50VGV4dHVyZUJ1ZiAhPSBOVUxMID8gbUN1cnJlbnRUZXh0dXJlQnVmLT5oYW5kbGUgOiAwLAotICAgICAgICAgICAgICAgIGJ1ZiwgaXRlbS5tR3JhcGhpY0J1ZmZlciAhPSBOVUxMID8gaXRlbS5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlIDogMCk7Ci0KLSAgICAgICAgLy8gcmVsZWFzZSBvbGQgYnVmZmVyCi0gICAgICAgIHJlbGVhc2VCdWZmZXIobUN1cnJlbnRUZXh0dXJlLAotICAgICAgICAgICAgICAgIG1FR0xTbG90c1ttQ3VycmVudFRleHR1cmVdLm1FZ2xEaXNwbGF5LAotICAgICAgICAgICAgICAgIG1FR0xTbG90c1ttQ3VycmVudFRleHR1cmVdLm1GZW5jZSk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBTdXJmYWNlVGV4dHVyZSBzdGF0ZS4KLSAgICAgICAgbUN1cnJlbnRUZXh0dXJlID0gYnVmOwotICAgICAgICBtQ3VycmVudFRleHR1cmVCdWYgPSBtRUdMU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlcjsKLSAgICAgICAgbUN1cnJlbnRDcm9wID0gaXRlbS5tQ3JvcDsKLSAgICAgICAgbUN1cnJlbnRUcmFuc2Zvcm0gPSBpdGVtLm1UcmFuc2Zvcm07Ci0gICAgICAgIG1DdXJyZW50U2NhbGluZ01vZGUgPSBpdGVtLm1TY2FsaW5nTW9kZTsKLSAgICAgICAgbUN1cnJlbnRUaW1lc3RhbXAgPSBpdGVtLm1UaW1lc3RhbXA7Ci0gICAgICAgIGNvbXB1dGVDdXJyZW50VHJhbnNmb3JtTWF0cml4KCk7Ci0KLSAgICAgICAgLy8gTm93IHRoYXQgd2UndmUgcGFzc2VkIHRoZSBwb2ludCBhdCB3aGljaCBmYWlsdXJlcyBjYW4gaGFwcGVuLAotICAgICAgICAvLyBpdCdzIHNhZmUgdG8gcmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLgotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2UgYWx3YXlzIGJpbmQgdGhlIHRleHR1cmUgZXZlbiBpZiB3ZSBkb24ndCB1cGRhdGUgaXRzIGNvbnRlbnRzLgotICAgICAgICBnbEJpbmRUZXh0dXJlKG1UZXhUYXJnZXQsIG1UZXhOYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgU3VyZmFjZVRleHR1cmU6OmlzRXh0ZXJuYWxGb3JtYXQodWludDMyX3QgZm9ybWF0KQotewotICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgLy8gc3VwcG9ydGVkIFlVViBmb3JtYXRzCi0gICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6Ci0gICAgLy8gTGVnYWN5L2RlcHJlY2F0ZWQgWVVWIGZvcm1hdHMKLSAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1A6Ci0gICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9JOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBBbnkgT0VNIGZvcm1hdCBuZWVkcyB0byBiZSBjb25zaWRlcmVkCi0gICAgaWYgKGZvcm1hdD49MHgxMDAgJiYgZm9ybWF0PD0weDFGRikKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUdMZW51bSBTdXJmYWNlVGV4dHVyZTo6Z2V0Q3VycmVudFRleHR1cmVUYXJnZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1UZXhUYXJnZXQ7Ci19Ci0KLXZvaWQgU3VyZmFjZVRleHR1cmU6OmdldFRyYW5zZm9ybU1hdHJpeChmbG9hdCBtdHhbMTZdKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBtZW1jcHkobXR4LCBtQ3VycmVudFRyYW5zZm9ybU1hdHJpeCwgc2l6ZW9mKG1DdXJyZW50VHJhbnNmb3JtTWF0cml4KSk7Ci19Ci0KLXZvaWQgU3VyZmFjZVRleHR1cmU6OmNvbXB1dGVDdXJyZW50VHJhbnNmb3JtTWF0cml4KCkgewotICAgIFNUX0xPR1YoImNvbXB1dGVDdXJyZW50VHJhbnNmb3JtTWF0cml4Iik7Ci0KLSAgICBmbG9hdCB4Zm9ybVsxNl07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgICAgIHhmb3JtW2ldID0gbXR4SWRlbnRpdHlbaV07Ci0gICAgfQotICAgIGlmIChtQ3VycmVudFRyYW5zZm9ybSAmIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSCkgewotICAgICAgICBmbG9hdCByZXN1bHRbMTZdOwotICAgICAgICBtdHhNdWwocmVzdWx0LCB4Zm9ybSwgbXR4RmxpcEgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAgICAgICAgIHhmb3JtW2ldID0gcmVzdWx0W2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtQ3VycmVudFRyYW5zZm9ybSAmIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfVikgewotICAgICAgICBmbG9hdCByZXN1bHRbMTZdOwotICAgICAgICBtdHhNdWwocmVzdWx0LCB4Zm9ybSwgbXR4RmxpcFYpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAgICAgICAgIHhmb3JtW2ldID0gcmVzdWx0W2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtQ3VycmVudFRyYW5zZm9ybSAmIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF85MCkgewotICAgICAgICBmbG9hdCByZXN1bHRbMTZdOwotICAgICAgICBtdHhNdWwocmVzdWx0LCB4Zm9ybSwgbXR4Um90OTApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAgICAgICAgIHhmb3JtW2ldID0gcmVzdWx0W2ldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZihtQ3VycmVudFRleHR1cmVCdWYpOwotICAgIGZsb2F0IHR4LCB0eSwgc3gsIHN5OwotICAgIGlmICghbUN1cnJlbnRDcm9wLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IGJpbGluZWFyIHNhbXBsaW5nIGF0IHRoZSBvZiB0aGUgY3JvcCByZWN0YW5nbGUgd2UKLSAgICAgICAgLy8gbWF5IG5lZWQgdG8gc2hyaW5rIGl0IGJ5IDIgdGV4ZWxzIGluIGVhY2ggZGlyZWN0aW9uLiAgTm9ybWFsbHkgdGhpcwotICAgICAgICAvLyB3b3VsZCBqdXN0IG5lZWQgdG8gdGFrZSAxLzIgYSB0ZXhlbCBvZmYgZWFjaCBlbmQsIGJ1dCBiZWNhdXNlIHRoZQotICAgICAgICAvLyBjaHJvbWEgY2hhbm5lbHMgd2lsbCBsaWtlbHkgYmUgc3Vic2FtcGxlZCB3ZSBuZWVkIHRvIGNob3Agb2ZmIGEgd2hvbGUKLSAgICAgICAgLy8gdGV4ZWwuICBUaGlzIHdpbGwgY2F1c2UgYXJ0aWZhY3RzIGlmIHNvbWVvbmUgZG9lcyBuZWFyZXN0IHNhbXBsaW5nCi0gICAgICAgIC8vIHdpdGggMToxIHBpeGVsOnRleGVsIHJhdGlvLCBidXQgaXQncyBpbXBvc3NpYmxlIHRvIHNpbXVsdGFuZW91c2x5Ci0gICAgICAgIC8vIGFjY29tb2RhdGUgdGhlIGJpbGluZWFyIGFuZCBuZWFyZXN0IHNhbXBsaW5nIHVzZXMuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmIG5lYXJlc3Qgc2FtcGxpbmcgdHVybnMgb3V0IHRvIGJlIGEgZGVzaXJhYmxlIHVzYWdlIG9mIHRoZXNlCi0gICAgICAgIC8vIHRleHR1cmVzIHRoZW4gd2UgY291bGQgYWRkIHRoZSBhYmlsaXR5IHRvIHN3aXRjaCBhIFN1cmZhY2VUZXh0dXJlIHRvCi0gICAgICAgIC8vIG5lYXJlc3QtbW9kZS4gIFByZWZlcmFibHksIGhvd2V2ZXIsIHRoZSBpbWFnZSBwcm9kdWNlcnMgKHZpZGVvCi0gICAgICAgIC8vIGRlY29kZXIsIGNhbWVyYSwgZXRjLikgd291bGQgc2ltcGx5IG5vdCB1c2UgYSBjcm9wIHJlY3RhbmdsZSAob3IgYXQKLSAgICAgICAgLy8gbGVhc3Qgbm90IHRlbGwgdGhlIGZyYW1ld29yayBhYm91dCBpdCkgc28gdGhhdCB0aGUgR1BVIGNhbiBkbyB0aGUKLSAgICAgICAgLy8gY29ycmVjdCBlZGdlIGJlaGF2aW9yLgotICAgICAgICBpbnQgeHNocmluayA9IDAsIHlzaHJpbmsgPSAwOwotICAgICAgICBpZiAobUN1cnJlbnRDcm9wLmxlZnQgPiAwKSB7Ci0gICAgICAgICAgICB0eCA9IGZsb2F0KG1DdXJyZW50Q3JvcC5sZWZ0ICsgMSkgLyBmbG9hdChidWYtPmdldFdpZHRoKCkpOwotICAgICAgICAgICAgeHNocmluaysrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHggPSAwLjBmOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3VycmVudENyb3AucmlnaHQgPCBpbnQzMl90KGJ1Zi0+Z2V0V2lkdGgoKSkpIHsKLSAgICAgICAgICAgIHhzaHJpbmsrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAobUN1cnJlbnRDcm9wLmJvdHRvbSA8IGludDMyX3QoYnVmLT5nZXRIZWlnaHQoKSkpIHsKLSAgICAgICAgICAgIHR5ID0gKGZsb2F0KGJ1Zi0+Z2V0SGVpZ2h0KCkgLSBtQ3VycmVudENyb3AuYm90dG9tKSArIDEuMGYpIC8KLSAgICAgICAgICAgICAgICAgICAgZmxvYXQoYnVmLT5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICB5c2hyaW5rKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0eSA9IDAuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DdXJyZW50Q3JvcC50b3AgPiAwKSB7Ci0gICAgICAgICAgICB5c2hyaW5rKys7Ci0gICAgICAgIH0KLSAgICAgICAgc3ggPSBmbG9hdChtQ3VycmVudENyb3Aud2lkdGgoKSAtIHhzaHJpbmspIC8gZmxvYXQoYnVmLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgc3kgPSBmbG9hdChtQ3VycmVudENyb3AuaGVpZ2h0KCkgLSB5c2hyaW5rKSAvIGZsb2F0KGJ1Zi0+Z2V0SGVpZ2h0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHR4ID0gMC4wZjsKLSAgICAgICAgdHkgPSAwLjBmOwotICAgICAgICBzeCA9IDEuMGY7Ci0gICAgICAgIHN5ID0gMS4wZjsKLSAgICB9Ci0gICAgZmxvYXQgY3JvcFsxNl0gPSB7Ci0gICAgICAgIHN4LCAwLCAwLCAwLAotICAgICAgICAwLCBzeSwgMCwgMCwKLSAgICAgICAgMCwgMCwgMSwgMCwKLSAgICAgICAgdHgsIHR5LCAwLCAxLAotICAgIH07Ci0KLSAgICBmbG9hdCBtdHhCZWZvcmVGbGlwVlsxNl07Ci0gICAgbXR4TXVsKG10eEJlZm9yZUZsaXBWLCBjcm9wLCB4Zm9ybSk7Ci0KLSAgICAvLyBTdXJmYWNlRmxpbmdlciBleHBlY3RzIHRoZSB0b3Agb2YgaXRzIHdpbmRvdyB0ZXh0dXJlcyB0byBiZSBhdCBhIFkKLSAgICAvLyBjb29yZGluYXRlIG9mIDAsIHNvIFN1cmZhY2VUZXh0dXJlIG11c3QgYmVoYXZlIHRoZSBzYW1lIHdheS4gIFdlIGRvbid0Ci0gICAgLy8gd2FudCB0byBleHBvc2UgdGhpcyB0byBhcHBsaWNhdGlvbnMsIGhvd2V2ZXIsIHNvIHdlIG11c3QgYWRkIGFuCi0gICAgLy8gYWRkaXRpb25hbCB2ZXJ0aWNhbCBmbGlwIHRvIHRoZSB0cmFuc2Zvcm0gYWZ0ZXIgYWxsIHRoZSBvdGhlciB0cmFuc2Zvcm1zLgotICAgIG10eE11bChtQ3VycmVudFRyYW5zZm9ybU1hdHJpeCwgbXR4RmxpcFYsIG10eEJlZm9yZUZsaXBWKTsKLX0KLQotbnNlY3NfdCBTdXJmYWNlVGV4dHVyZTo6Z2V0VGltZXN0YW1wKCkgewotICAgIFNUX0xPR1YoImdldFRpbWVzdGFtcCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgcmV0dXJuIG1DdXJyZW50VGltZXN0YW1wOwotfQotCi12b2lkIFN1cmZhY2VUZXh0dXJlOjpzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKAotICAgICAgICBjb25zdCBzcDxGcmFtZUF2YWlsYWJsZUxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKLSAgICBTVF9MT0dWKCJzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBCdWZmZXJRdWV1ZTo6c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLUVHTEltYWdlS0hSIFN1cmZhY2VUZXh0dXJlOjpjcmVhdGVJbWFnZShFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdyYXBoaWNCdWZmZXIpIHsKLSAgICBFR0xDbGllbnRCdWZmZXIgY2J1ZiA9IChFR0xDbGllbnRCdWZmZXIpZ3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCk7Ci0gICAgRUdMaW50IGF0dHJzW10gPSB7Ci0gICAgICAgIEVHTF9JTUFHRV9QUkVTRVJWRURfS0hSLCAgICBFR0xfVFJVRSwKLSAgICAgICAgRUdMX05PTkUsCi0gICAgfTsKLSAgICBFR0xJbWFnZUtIUiBpbWFnZSA9IGVnbENyZWF0ZUltYWdlS0hSKGRweSwgRUdMX05PX0NPTlRFWFQsCi0gICAgICAgICAgICBFR0xfTkFUSVZFX0JVRkZFUl9BTkRST0lELCBjYnVmLCBhdHRycyk7Ci0gICAgaWYgKGltYWdlID09IEVHTF9OT19JTUFHRV9LSFIpIHsKLSAgICAgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgU1RfTE9HRSgiZXJyb3IgY3JlYXRpbmcgRUdMSW1hZ2U6ICUjeCIsIGVycm9yKTsKLSAgICB9Ci0gICAgcmV0dXJuIGltYWdlOwotfQotCi1zcDxHcmFwaGljQnVmZmVyPiBTdXJmYWNlVGV4dHVyZTo6Z2V0Q3VycmVudEJ1ZmZlcigpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBtQ3VycmVudFRleHR1cmVCdWY7Ci19Ci0KLVJlY3QgU3VyZmFjZVRleHR1cmU6OmdldEN1cnJlbnRDcm9wKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgcmV0dXJuIG1DdXJyZW50Q3JvcDsKLX0KLQotdWludDMyX3QgU3VyZmFjZVRleHR1cmU6OmdldEN1cnJlbnRUcmFuc2Zvcm0oKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gbUN1cnJlbnRUcmFuc2Zvcm07Ci19Ci0KLXVpbnQzMl90IFN1cmZhY2VUZXh0dXJlOjpnZXRDdXJyZW50U2NhbGluZ01vZGUoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gbUN1cnJlbnRTY2FsaW5nTW9kZTsKLX0KLQotYm9vbCBTdXJmYWNlVGV4dHVyZTo6aXNTeW5jaHJvbm91c01vZGUoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gQnVmZmVyUXVldWU6OmlzU3luY2hyb25vdXNNb2RlKCk7Ci19Ci0KLXZvaWQgU3VyZmFjZVRleHR1cmU6OmFiYW5kb24oKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBtQWJhbmRvbmVkID0gdHJ1ZTsKLSAgICBtQ3VycmVudFRleHR1cmVCdWYuY2xlYXIoKTsKLQotICAgIC8vIGRlc3Ryb3kgYWxsIGVnbCBidWZmZXJzCi0gICAgZm9yIChpbnQgaSA9MDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7IGkrKykgewotICAgICAgICBtRUdMU2xvdHNbaV0ubUdyYXBoaWNCdWZmZXIgPSAwOwotICAgICAgICBpZiAobUVHTFNsb3RzW2ldLm1FZ2xJbWFnZSAhPSBFR0xfTk9fSU1BR0VfS0hSKSB7Ci0gICAgICAgICAgICBlZ2xEZXN0cm95SW1hZ2VLSFIobUVHTFNsb3RzW2ldLm1FZ2xEaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICBtRUdMU2xvdHNbaV0ubUVnbEltYWdlKTsKLSAgICAgICAgICAgIG1FR0xTbG90c1tpXS5tRWdsSW1hZ2UgPSBFR0xfTk9fSU1BR0VfS0hSOwotICAgICAgICAgICAgbUVHTFNsb3RzW2ldLm1FZ2xEaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBkaXNjb25uZWN0IGZyb20gdGhlIEJ1ZmZlclF1ZXVlCi0gICAgQnVmZmVyUXVldWU6OmNvbnN1bWVyRGlzY29ubmVjdCgpOwotfQotCi12b2lkIFN1cmZhY2VUZXh0dXJlOjpzZXROYW1lKGNvbnN0IFN0cmluZzgmIG5hbWUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICBtTmFtZSA9IG5hbWU7Ci0gICAgQnVmZmVyUXVldWU6OnNldENvbnN1bWVyTmFtZShuYW1lKTsKLX0KLQotdm9pZCBTdXJmYWNlVGV4dHVyZTo6ZHVtcChTdHJpbmc4JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgY2hhciBidWZmZXJbMTAyNF07Ci0gICAgZHVtcChyZXN1bHQsICIiLCBidWZmZXIsIDEwMjQpOwotfQotCi12b2lkIFN1cmZhY2VUZXh0dXJlOjpkdW1wKFN0cmluZzgmIHJlc3VsdCwgY29uc3QgY2hhciogcHJlZml4LAotICAgICAgICBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzbVRleE5hbWU9JWRcbiIsIHByZWZpeCwgbVRleE5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICIlc25leHQgICA6IHtjcm9wPVslZCwlZCwlZCwlZF0sIHRyYW5zZm9ybT0weCUwMngsIGN1cnJlbnQ9JWR9XG4iCi0gICAgICAgICAgICAscHJlZml4LCBtQ3VycmVudENyb3AubGVmdCwKLSAgICAgICAgICAgIG1DdXJyZW50Q3JvcC50b3AsIG1DdXJyZW50Q3JvcC5yaWdodCwgbUN1cnJlbnRDcm9wLmJvdHRvbSwKLSAgICAgICAgICAgIG1DdXJyZW50VHJhbnNmb3JtLCBtQ3VycmVudFRleHR1cmUKLSAgICApOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotCi0gICAgQnVmZmVyUXVldWU6OmR1bXAocmVzdWx0LCBwcmVmaXgsIGJ1ZmZlciwgU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG10eE11bChmbG9hdCBvdXRbMTZdLCBjb25zdCBmbG9hdCBhWzE2XSwgY29uc3QgZmxvYXQgYlsxNl0pIHsKLSAgICBvdXRbMF0gPSBhWzBdKmJbMF0gKyBhWzRdKmJbMV0gKyBhWzhdKmJbMl0gKyBhWzEyXSpiWzNdOwotICAgIG91dFsxXSA9IGFbMV0qYlswXSArIGFbNV0qYlsxXSArIGFbOV0qYlsyXSArIGFbMTNdKmJbM107Ci0gICAgb3V0WzJdID0gYVsyXSpiWzBdICsgYVs2XSpiWzFdICsgYVsxMF0qYlsyXSArIGFbMTRdKmJbM107Ci0gICAgb3V0WzNdID0gYVszXSpiWzBdICsgYVs3XSpiWzFdICsgYVsxMV0qYlsyXSArIGFbMTVdKmJbM107Ci0KLSAgICBvdXRbNF0gPSBhWzBdKmJbNF0gKyBhWzRdKmJbNV0gKyBhWzhdKmJbNl0gKyBhWzEyXSpiWzddOwotICAgIG91dFs1XSA9IGFbMV0qYls0XSArIGFbNV0qYls1XSArIGFbOV0qYls2XSArIGFbMTNdKmJbN107Ci0gICAgb3V0WzZdID0gYVsyXSpiWzRdICsgYVs2XSpiWzVdICsgYVsxMF0qYls2XSArIGFbMTRdKmJbN107Ci0gICAgb3V0WzddID0gYVszXSpiWzRdICsgYVs3XSpiWzVdICsgYVsxMV0qYls2XSArIGFbMTVdKmJbN107Ci0KLSAgICBvdXRbOF0gPSBhWzBdKmJbOF0gKyBhWzRdKmJbOV0gKyBhWzhdKmJbMTBdICsgYVsxMl0qYlsxMV07Ci0gICAgb3V0WzldID0gYVsxXSpiWzhdICsgYVs1XSpiWzldICsgYVs5XSpiWzEwXSArIGFbMTNdKmJbMTFdOwotICAgIG91dFsxMF0gPSBhWzJdKmJbOF0gKyBhWzZdKmJbOV0gKyBhWzEwXSpiWzEwXSArIGFbMTRdKmJbMTFdOwotICAgIG91dFsxMV0gPSBhWzNdKmJbOF0gKyBhWzddKmJbOV0gKyBhWzExXSpiWzEwXSArIGFbMTVdKmJbMTFdOwotCi0gICAgb3V0WzEyXSA9IGFbMF0qYlsxMl0gKyBhWzRdKmJbMTNdICsgYVs4XSpiWzE0XSArIGFbMTJdKmJbMTVdOwotICAgIG91dFsxM10gPSBhWzFdKmJbMTJdICsgYVs1XSpiWzEzXSArIGFbOV0qYlsxNF0gKyBhWzEzXSpiWzE1XTsKLSAgICBvdXRbMTRdID0gYVsyXSpiWzEyXSArIGFbNl0qYlsxM10gKyBhWzEwXSpiWzE0XSArIGFbMTRdKmJbMTVdOwotICAgIG91dFsxNV0gPSBhWzNdKmJbMTJdICsgYVs3XSpiWzEzXSArIGFbMTFdKmJbMTRdICsgYVsxNV0qYlsxNV07Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5jcHAgYi9saWJzL2d1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OGRjYWYuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN1cmZhY2VUZXh0dXJlQ2xpZW50IgotI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+Ci0KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvZ3VpL0NvbXBvc2VyU2VydmljZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVN1cmZhY2VUZXh0dXJlQ2xpZW50OjpTdXJmYWNlVGV4dHVyZUNsaWVudCgKLSAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2VUZXh0dXJlPiYgc3VyZmFjZVRleHR1cmUpCi17Ci0gICAgU3VyZmFjZVRleHR1cmVDbGllbnQ6OmluaXQoKTsKLSAgICBTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0SVN1cmZhY2VUZXh0dXJlKHN1cmZhY2VUZXh0dXJlKTsKLX0KLQotU3VyZmFjZVRleHR1cmVDbGllbnQ6OlN1cmZhY2VUZXh0dXJlQ2xpZW50KCkgewotICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojppbml0KCk7Ci19Ci0KLVN1cmZhY2VUZXh0dXJlQ2xpZW50Ojp+U3VyZmFjZVRleHR1cmVDbGllbnQoKSB7Ci0gICAgaWYgKG1Db25uZWN0ZWRUb0NwdSkgewotICAgICAgICBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzY29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotICAgIH0KLX0KLQotdm9pZCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6aW5pdCgpIHsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBBTmF0aXZlV2luZG93IGZ1bmN0aW9uIHBvaW50ZXJzLgotICAgIEFOYXRpdmVXaW5kb3c6OnNldFN3YXBJbnRlcnZhbCAgPSBob29rX3NldFN3YXBJbnRlcnZhbDsKLSAgICBBTmF0aXZlV2luZG93OjpkZXF1ZXVlQnVmZmVyICAgID0gaG9va19kZXF1ZXVlQnVmZmVyOwotICAgIEFOYXRpdmVXaW5kb3c6OmNhbmNlbEJ1ZmZlciAgICAgPSBob29rX2NhbmNlbEJ1ZmZlcjsKLSAgICBBTmF0aXZlV2luZG93Ojpsb2NrQnVmZmVyICAgICAgID0gaG9va19sb2NrQnVmZmVyOwotICAgIEFOYXRpdmVXaW5kb3c6OnF1ZXVlQnVmZmVyICAgICAgPSBob29rX3F1ZXVlQnVmZmVyOwotICAgIEFOYXRpdmVXaW5kb3c6OnF1ZXJ5ICAgICAgICAgICAgPSBob29rX3F1ZXJ5OwotICAgIEFOYXRpdmVXaW5kb3c6OnBlcmZvcm0gICAgICAgICAgPSBob29rX3BlcmZvcm07Ci0KLSAgICBjb25zdF9jYXN0PGludCY+KEFOYXRpdmVXaW5kb3c6Om1pblN3YXBJbnRlcnZhbCkgPSAwOwotICAgIGNvbnN0X2Nhc3Q8aW50Jj4oQU5hdGl2ZVdpbmRvdzo6bWF4U3dhcEludGVydmFsKSA9IDE7Ci0KLSAgICBtUmVxV2lkdGggPSAwOwotICAgIG1SZXFIZWlnaHQgPSAwOwotICAgIG1SZXFGb3JtYXQgPSAwOwotICAgIG1SZXFVc2FnZSA9IDA7Ci0gICAgbVRpbWVzdGFtcCA9IE5BVElWRV9XSU5ET1dfVElNRVNUQU1QX0FVVE87Ci0gICAgbURlZmF1bHRXaWR0aCA9IDA7Ci0gICAgbURlZmF1bHRIZWlnaHQgPSAwOwotICAgIG1UcmFuc2Zvcm1IaW50ID0gMDsKLSAgICBtQ29ubmVjdGVkVG9DcHUgPSBmYWxzZTsKLX0KLQotdm9pZCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0SVN1cmZhY2VUZXh0dXJlKAotICAgICAgICBjb25zdCBzcDxJU3VyZmFjZVRleHR1cmU+JiBzdXJmYWNlVGV4dHVyZSkKLXsKLSAgICBtU3VyZmFjZVRleHR1cmUgPSBzdXJmYWNlVGV4dHVyZTsKLX0KLQotc3A8SVN1cmZhY2VUZXh0dXJlPiBTdXJmYWNlVGV4dHVyZUNsaWVudDo6Z2V0SVN1cmZhY2VUZXh0dXJlKCkgY29uc3QgewotICAgIHJldHVybiBtU3VyZmFjZVRleHR1cmU7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6aG9va19zZXRTd2FwSW50ZXJ2YWwoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBpbnQgaW50ZXJ2YWwpIHsKLSAgICBTdXJmYWNlVGV4dHVyZUNsaWVudCogYyA9IGdldFNlbGYod2luZG93KTsKLSAgICByZXR1cm4gYy0+c2V0U3dhcEludGVydmFsKGludGVydmFsKTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojpob29rX2RlcXVldWVCdWZmZXIoQU5hdGl2ZVdpbmRvdyogd2luZG93LAotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiogYnVmZmVyKSB7Ci0gICAgU3VyZmFjZVRleHR1cmVDbGllbnQqIGMgPSBnZXRTZWxmKHdpbmRvdyk7Ci0gICAgcmV0dXJuIGMtPmRlcXVldWVCdWZmZXIoYnVmZmVyKTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojpob29rX2NhbmNlbEJ1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csCi0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcikgewotICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50KiBjID0gZ2V0U2VsZih3aW5kb3cpOwotICAgIHJldHVybiBjLT5jYW5jZWxCdWZmZXIoYnVmZmVyKTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojpob29rX2xvY2tCdWZmZXIoQU5hdGl2ZVdpbmRvdyogd2luZG93LAotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpIHsKLSAgICBTdXJmYWNlVGV4dHVyZUNsaWVudCogYyA9IGdldFNlbGYod2luZG93KTsKLSAgICByZXR1cm4gYy0+bG9ja0J1ZmZlcihidWZmZXIpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6Omhvb2tfcXVldWVCdWZmZXIoQU5hdGl2ZVdpbmRvdyogd2luZG93LAotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpIHsKLSAgICBTdXJmYWNlVGV4dHVyZUNsaWVudCogYyA9IGdldFNlbGYod2luZG93KTsKLSAgICByZXR1cm4gYy0+cXVldWVCdWZmZXIoYnVmZmVyKTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojpob29rX3F1ZXJ5KGNvbnN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoYXQsIGludCogdmFsdWUpIHsKLSAgICBjb25zdCBTdXJmYWNlVGV4dHVyZUNsaWVudCogYyA9IGdldFNlbGYod2luZG93KTsKLSAgICByZXR1cm4gYy0+cXVlcnkod2hhdCwgdmFsdWUpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6Omhvb2tfcGVyZm9ybShBTmF0aXZlV2luZG93KiB3aW5kb3csIGludCBvcGVyYXRpb24sIC4uLikgewotICAgIHZhX2xpc3QgYXJnczsKLSAgICB2YV9zdGFydChhcmdzLCBvcGVyYXRpb24pOwotICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50KiBjID0gZ2V0U2VsZih3aW5kb3cpOwotICAgIHJldHVybiBjLT5wZXJmb3JtKG9wZXJhdGlvbiwgYXJncyk7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0U3dhcEludGVydmFsKGludCBpbnRlcnZhbCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgLy8gRUdMIHNwZWNpZmljYXRpb24gc3RhdGVzOgotICAgIC8vICBpbnRlcnZhbCBpcyBzaWxlbnRseSBjbGFtcGVkIHRvIG1pbmltdW0gYW5kIG1heGltdW0gaW1wbGVtZW50YXRpb24KLSAgICAvLyAgZGVwZW5kZW50IHZhbHVlcyBiZWZvcmUgYmVpbmcgc3RvcmVkLgotICAgIC8vIEFsdGhvdWdoIHdlIGRvbid0IGhhdmUgdG8sIHdlIGFwcGx5IHRoZSBzYW1lIGxvZ2ljIGhlcmUuCi0KLSAgICBpZiAoaW50ZXJ2YWwgPCBtaW5Td2FwSW50ZXJ2YWwpCi0gICAgICAgIGludGVydmFsID0gbWluU3dhcEludGVydmFsOwotCi0gICAgaWYgKGludGVydmFsID4gbWF4U3dhcEludGVydmFsKQotICAgICAgICBpbnRlcnZhbCA9IG1heFN3YXBJbnRlcnZhbDsKLQotICAgIHN0YXR1c190IHJlcyA9IG1TdXJmYWNlVGV4dHVyZS0+c2V0U3luY2hyb25vdXNNb2RlKGludGVydmFsID8gdHJ1ZSA6IGZhbHNlKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGVxdWV1ZUJ1ZmZlcihhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCoqIGJ1ZmZlcikgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50OjpkZXF1ZXVlQnVmZmVyIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBpbnQgYnVmID0gLTE7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN1cmZhY2VUZXh0dXJlLT5kZXF1ZXVlQnVmZmVyKCZidWYsIG1SZXFXaWR0aCwgbVJlcUhlaWdodCwKLSAgICAgICAgICAgIG1SZXFGb3JtYXQsIG1SZXFVc2FnZSk7Ci0gICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgQUxPR1YoImRlcXVldWVCdWZmZXI6IElTdXJmYWNlVGV4dHVyZTo6ZGVxdWV1ZUJ1ZmZlciglZCwgJWQsICVkLCAlZCkiCi0gICAgICAgICAgICAgImZhaWxlZDogJWQiLCBtUmVxV2lkdGgsIG1SZXFIZWlnaHQsIG1SZXFGb3JtYXQsIG1SZXFVc2FnZSwKLSAgICAgICAgICAgICByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBzcDxHcmFwaGljQnVmZmVyPiYgZ2J1ZihtU2xvdHNbYnVmXSk7Ci0gICAgaWYgKHJlc3VsdCAmIElTdXJmYWNlVGV4dHVyZTo6UkVMRUFTRV9BTExfQlVGRkVSUykgewotICAgICAgICBmcmVlQWxsQnVmZmVycygpOwotICAgIH0KLQotICAgIGlmICgocmVzdWx0ICYgSVN1cmZhY2VUZXh0dXJlOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OKSB8fCBnYnVmID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gbVN1cmZhY2VUZXh0dXJlLT5yZXF1ZXN0QnVmZmVyKGJ1ZiwgJmdidWYpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZUJ1ZmZlcjogSVN1cmZhY2VUZXh0dXJlOjpyZXF1ZXN0QnVmZmVyIGZhaWxlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLSAgICAqYnVmZmVyID0gZ2J1Zi5nZXQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6Y2FuY2VsQnVmZmVyKGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZmZXIpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJTdXJmYWNlVGV4dHVyZUNsaWVudDo6Y2FuY2VsQnVmZmVyIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBpbnQgaSA9IGdldFNsb3RGcm9tQnVmZmVyTG9ja2VkKGJ1ZmZlcik7Ci0gICAgaWYgKGkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLSAgICBtU3VyZmFjZVRleHR1cmUtPmNhbmNlbEJ1ZmZlcihpKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6Z2V0U2xvdEZyb21CdWZmZXJMb2NrZWQoCi0gICAgICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZmZXIpIGNvbnN0IHsKLSAgICBib29sIGR1bXBlZFN0YXRlID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyBpKyspIHsKLSAgICAgICAgLy8gWFhYOiBEdW1wIHRoZSBzbG90cyB3aGVuZXZlciB3ZSBoaXQgYSBOVUxMIGVudHJ5IHdoaWxlIHNlYXJjaGluZyBmb3IKLSAgICAgICAgLy8gYSBidWZmZXIuCi0gICAgICAgIGlmIChtU2xvdHNbaV0gPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKCFkdW1wZWRTdGF0ZSkgewotICAgICAgICAgICAgICAgIEFMT0dEKCJnZXRTbG90RnJvbUJ1ZmZlckxvY2tlZDogZW5jb3VudGVyZWQgTlVMTCBidWZmZXIgaW4gc2xvdCAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAibG9va2luZyBmb3IgYnVmZmVyICVwIiwgaSwgYnVmZmVyLT5oYW5kbGUpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTlVNX0JVRkZFUl9TTE9UUzsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2xvdHNbal0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImdldFNsb3RGcm9tQnVmZmVyTG9ja2VkOiAgICUwMmQ6IE5VTEwiLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJnZXRTbG90RnJvbUJ1ZmZlckxvY2tlZDogICAlMDJkOiAlcCIsIGosIG1TbG90c1tqXS0+aGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkdW1wZWRTdGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVNsb3RzW2ldICE9IE5VTEwgJiYgbVNsb3RzW2ldLT5oYW5kbGUgPT0gYnVmZmVyLT5oYW5kbGUpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dFKCJnZXRTbG90RnJvbUJ1ZmZlckxvY2tlZDogdW5rbm93biBidWZmZXI6ICVwIiwgYnVmZmVyLT5oYW5kbGUpOwotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6bG9ja0J1ZmZlcihhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmZmVyKSB7Ci0gICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50Ojpsb2NrQnVmZmVyIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6cXVldWVCdWZmZXIoYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGJ1ZmZlcikgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50OjpxdWV1ZUJ1ZmZlciIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgaW50NjRfdCB0aW1lc3RhbXA7Ci0gICAgaWYgKG1UaW1lc3RhbXAgPT0gTkFUSVZFX1dJTkRPV19USU1FU1RBTVBfQVVUTykgewotICAgICAgICB0aW1lc3RhbXAgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgICAgIEFMT0dWKCJTdXJmYWNlVGV4dHVyZUNsaWVudDo6cXVldWVCdWZmZXIgbWFraW5nIHVwIHRpbWVzdGFtcDogJS4yZiBtcyIsCi0gICAgICAgICAgICAgdGltZXN0YW1wIC8gMTAwMDAwMC5mKTsKLSAgICB9IGVsc2UgewotICAgICAgICB0aW1lc3RhbXAgPSBtVGltZXN0YW1wOwotICAgIH0KLSAgICBpbnQgaSA9IGdldFNsb3RGcm9tQnVmZmVyTG9ja2VkKGJ1ZmZlcik7Ci0gICAgaWYgKGkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU3VyZmFjZVRleHR1cmUtPnF1ZXVlQnVmZmVyKGksIHRpbWVzdGFtcCwKLSAgICAgICAgICAgICZtRGVmYXVsdFdpZHRoLCAmbURlZmF1bHRIZWlnaHQsICZtVHJhbnNmb3JtSGludCk7Ci0gICAgaWYgKGVyciAhPSBPSykgIHsKLSAgICAgICAgQUxPR0UoInF1ZXVlQnVmZmVyOiBlcnJvciBxdWV1aW5nIGJ1ZmZlciB0byBTdXJmYWNlVGV4dHVyZSwgJWQiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OnF1ZXJ5KGludCB3aGF0LCBpbnQqIHZhbHVlKSBjb25zdCB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiU3VyZmFjZVRleHR1cmVDbGllbnQ6OnF1ZXJ5Iik7Ci0gICAgeyAvLyBzY29wZSBmb3IgdGhlIGxvY2sKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfRk9STUFUOgotICAgICAgICAgICAgICAgIGlmIChtUmVxRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICp2YWx1ZSA9IG1SZXFGb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfUVVFVUVTX1RPX1dJTkRPV19DT01QT1NFUjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IGNvbXBvc2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2VyU2VydmljZTo6Z2V0Q29tcG9zZXJTZXJ2aWNlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zZXItPmF1dGhlbnRpY2F0ZVN1cmZhY2VUZXh0dXJlKG1TdXJmYWNlVGV4dHVyZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19DT05DUkVURV9UWVBFOgotICAgICAgICAgICAgICAgICp2YWx1ZSA9IE5BVElWRV9XSU5ET1dfU1VSRkFDRV9URVhUVVJFX0NMSUVOVDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfREVGQVVMVF9XSURUSDoKLSAgICAgICAgICAgICAgICAqdmFsdWUgPSBtRGVmYXVsdFdpZHRoOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19ERUZBVUxUX0hFSUdIVDoKLSAgICAgICAgICAgICAgICAqdmFsdWUgPSBtRGVmYXVsdEhlaWdodDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0hJTlQ6Ci0gICAgICAgICAgICAgICAgKnZhbHVlID0gbVRyYW5zZm9ybUhpbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtU3VyZmFjZVRleHR1cmUtPnF1ZXJ5KHdoYXQsIHZhbHVlKTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpwZXJmb3JtKGludCBvcGVyYXRpb24sIHZhX2xpc3QgYXJncykKLXsKLSAgICBpbnQgcmVzID0gTk9fRVJST1I7Ci0gICAgc3dpdGNoIChvcGVyYXRpb24pIHsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfQ09OTkVDVDoKLSAgICAgICAgLy8gZGVwcmVjYXRlZC4gbXVzdCByZXR1cm4gTk9fRVJST1IuCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19ESVNDT05ORUNUOgotICAgICAgICAvLyBkZXByZWNhdGVkLiBtdXN0IHJldHVybiBOT19FUlJPUi4KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9VU0FHRToKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hTZXRVc2FnZShhcmdzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9DUk9QOgotICAgICAgICByZXMgPSBkaXNwYXRjaFNldENyb3AoYXJncyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSX0NPVU5UOgotICAgICAgICByZXMgPSBkaXNwYXRjaFNldEJ1ZmZlckNvdW50KGFyZ3MpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfR0VPTUVUUlk6Ci0gICAgICAgIHJlcyA9IGRpc3BhdGNoU2V0QnVmZmVyc0dlb21ldHJ5KGFyZ3MpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfVFJBTlNGT1JNOgotICAgICAgICByZXMgPSBkaXNwYXRjaFNldEJ1ZmZlcnNUcmFuc2Zvcm0oYXJncyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19USU1FU1RBTVA6Ci0gICAgICAgIHJlcyA9IGRpc3BhdGNoU2V0QnVmZmVyc1RpbWVzdGFtcChhcmdzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0RJTUVOU0lPTlM6Ci0gICAgICAgIHJlcyA9IGRpc3BhdGNoU2V0QnVmZmVyc0RpbWVuc2lvbnMoYXJncyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19GT1JNQVQ6Ci0gICAgICAgIHJlcyA9IGRpc3BhdGNoU2V0QnVmZmVyc0Zvcm1hdChhcmdzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX0xPQ0s6Ci0gICAgICAgIHJlcyA9IGRpc3BhdGNoTG9jayhhcmdzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1VOTE9DS19BTkRfUE9TVDoKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hVbmxvY2tBbmRQb3N0KGFyZ3MpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX1NDQUxJTkdfTU9ERToKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hTZXRTY2FsaW5nTW9kZShhcmdzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9DT05ORUNUOgotICAgICAgICByZXMgPSBkaXNwYXRjaENvbm5lY3QoYXJncyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfRElTQ09OTkVDVDoKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hEaXNjb25uZWN0KGFyZ3MpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXMgPSBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hDb25uZWN0KHZhX2xpc3QgYXJncykgewotICAgIGludCBhcGkgPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICByZXR1cm4gY29ubmVjdChhcGkpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OmRpc3BhdGNoRGlzY29ubmVjdCh2YV9saXN0IGFyZ3MpIHsKLSAgICBpbnQgYXBpID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgcmV0dXJuIGRpc2Nvbm5lY3QoYXBpKTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpkaXNwYXRjaFNldFVzYWdlKHZhX2xpc3QgYXJncykgewotICAgIGludCB1c2FnZSA9IHZhX2FyZyhhcmdzLCBpbnQpOwotICAgIHJldHVybiBzZXRVc2FnZSh1c2FnZSk7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hTZXRDcm9wKHZhX2xpc3QgYXJncykgewotICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBjb25zdCogcmVjdCA9IHZhX2FyZyhhcmdzLCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QqKTsKLSAgICByZXR1cm4gc2V0Q3JvcChyZWludGVycHJldF9jYXN0PFJlY3QgY29uc3QqPihyZWN0KSk7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hTZXRCdWZmZXJDb3VudCh2YV9saXN0IGFyZ3MpIHsKLSAgICBzaXplX3QgYnVmZmVyQ291bnQgPSB2YV9hcmcoYXJncywgc2l6ZV90KTsKLSAgICByZXR1cm4gc2V0QnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OmRpc3BhdGNoU2V0QnVmZmVyc0dlb21ldHJ5KHZhX2xpc3QgYXJncykgewotICAgIGludCB3ID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgaW50IGggPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICBpbnQgZiA9IHZhX2FyZyhhcmdzLCBpbnQpOwotICAgIGludCBlcnIgPSBzZXRCdWZmZXJzRGltZW5zaW9ucyh3LCBoKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgcmV0dXJuIHNldEJ1ZmZlcnNGb3JtYXQoZik7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hTZXRCdWZmZXJzRGltZW5zaW9ucyh2YV9saXN0IGFyZ3MpIHsKLSAgICBpbnQgdyA9IHZhX2FyZyhhcmdzLCBpbnQpOwotICAgIGludCBoID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgcmV0dXJuIHNldEJ1ZmZlcnNEaW1lbnNpb25zKHcsIGgpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OmRpc3BhdGNoU2V0QnVmZmVyc0Zvcm1hdCh2YV9saXN0IGFyZ3MpIHsKLSAgICBpbnQgZiA9IHZhX2FyZyhhcmdzLCBpbnQpOwotICAgIHJldHVybiBzZXRCdWZmZXJzRm9ybWF0KGYpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OmRpc3BhdGNoU2V0U2NhbGluZ01vZGUodmFfbGlzdCBhcmdzKSB7Ci0gICAgaW50IG0gPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICByZXR1cm4gc2V0U2NhbGluZ01vZGUobSk7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hTZXRCdWZmZXJzVHJhbnNmb3JtKHZhX2xpc3QgYXJncykgewotICAgIGludCB0cmFuc2Zvcm0gPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICByZXR1cm4gc2V0QnVmZmVyc1RyYW5zZm9ybSh0cmFuc2Zvcm0pOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OmRpc3BhdGNoU2V0QnVmZmVyc1RpbWVzdGFtcCh2YV9saXN0IGFyZ3MpIHsKLSAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IHZhX2FyZyhhcmdzLCBpbnQ2NF90KTsKLSAgICByZXR1cm4gc2V0QnVmZmVyc1RpbWVzdGFtcCh0aW1lc3RhbXApOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OmRpc3BhdGNoTG9jayh2YV9saXN0IGFyZ3MpIHsKLSAgICBBTmF0aXZlV2luZG93X0J1ZmZlciogb3V0QnVmZmVyID0gdmFfYXJnKGFyZ3MsIEFOYXRpdmVXaW5kb3dfQnVmZmVyKik7Ci0gICAgQVJlY3QqIGluT3V0RGlydHlCb3VuZHMgPSB2YV9hcmcoYXJncywgQVJlY3QqKTsKLSAgICByZXR1cm4gbG9jayhvdXRCdWZmZXIsIGluT3V0RGlydHlCb3VuZHMpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OmRpc3BhdGNoVW5sb2NrQW5kUG9zdCh2YV9saXN0IGFyZ3MpIHsKLSAgICByZXR1cm4gdW5sb2NrQW5kUG9zdCgpOwotfQotCi0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6Y29ubmVjdChpbnQgYXBpKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiU3VyZmFjZVRleHR1cmVDbGllbnQ6OmNvbm5lY3QiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIGludCBlcnIgPSBtU3VyZmFjZVRleHR1cmUtPmNvbm5lY3QoYXBpLAotICAgICAgICAgICAgJm1EZWZhdWx0V2lkdGgsICZtRGVmYXVsdEhlaWdodCwgJm1UcmFuc2Zvcm1IaW50KTsKLSAgICBpZiAoIWVyciAmJiBhcGkgPT0gTkFUSVZFX1dJTkRPV19BUElfQ1BVKSB7Ci0gICAgICAgIG1Db25uZWN0ZWRUb0NwdSA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzY29ubmVjdChpbnQgYXBpKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiU3VyZmFjZVRleHR1cmVDbGllbnQ6OmRpc2Nvbm5lY3QiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIGZyZWVBbGxCdWZmZXJzKCk7Ci0gICAgaW50IGVyciA9IG1TdXJmYWNlVGV4dHVyZS0+ZGlzY29ubmVjdChhcGkpOwotICAgIGlmICghZXJyKSB7Ci0gICAgICAgIG1SZXFGb3JtYXQgPSAwOwotICAgICAgICBtUmVxV2lkdGggPSAwOwotICAgICAgICBtUmVxSGVpZ2h0ID0gMDsKLSAgICAgICAgbVJlcVVzYWdlID0gMDsKLSAgICAgICAgaWYgKGFwaSA9PSBOQVRJVkVfV0lORE9XX0FQSV9DUFUpIHsKLSAgICAgICAgICAgIG1Db25uZWN0ZWRUb0NwdSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0VXNhZ2UodWludDMyX3QgcmVxVXNhZ2UpCi17Ci0gICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRVc2FnZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgbVJlcVVzYWdlID0gcmVxVXNhZ2U7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OnNldENyb3AoUmVjdCBjb25zdCogcmVjdCkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0Q3JvcCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBSZWN0IHJlYWxSZWN0OwotICAgIGlmIChyZWN0ID09IE5VTEwgfHwgcmVjdC0+aXNFbXB0eSgpKSB7Ci0gICAgICAgIHJlYWxSZWN0ID0gUmVjdCgwLCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZWFsUmVjdCA9ICpyZWN0OwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IG1TdXJmYWNlVGV4dHVyZS0+c2V0Q3JvcCgqcmVjdCk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiSVN1cmZhY2VUZXh0dXJlOjpzZXRDcm9wKC4uLikgcmV0dXJuZWQgJXMiLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OnNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0QnVmZmVyQ291bnQiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbVN1cmZhY2VUZXh0dXJlLT5zZXRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiSVN1cmZhY2VUZXh0dXJlOjpzZXRCdWZmZXJDb3VudCglZCkgcmV0dXJuZWQgJXMiLAotICAgICAgICAgICAgYnVmZmVyQ291bnQsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgZnJlZUFsbEJ1ZmZlcnMoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OnNldEJ1ZmZlcnNEaW1lbnNpb25zKGludCB3LCBpbnQgaCkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0QnVmZmVyc0RpbWVuc2lvbnMiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKHc8MCB8fCBoPDApCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBpZiAoKHcgJiYgIWgpIHx8ICghdyAmJiBoKSkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIG1SZXFXaWR0aCA9IHc7Ci0gICAgbVJlcUhlaWdodCA9IGg7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU3VyZmFjZVRleHR1cmUtPnNldENyb3AoUmVjdCgwLCAwKSk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiSVN1cmZhY2VUZXh0dXJlOjpzZXRDcm9wKC4uLikgcmV0dXJuZWQgJXMiLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OnNldEJ1ZmZlcnNGb3JtYXQoaW50IGZvcm1hdCkKLXsKLSAgICBBTE9HVigiU3VyZmFjZVRleHR1cmVDbGllbnQ6OnNldEJ1ZmZlcnNGb3JtYXQiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKGZvcm1hdDwwKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgbVJlcUZvcm1hdCA9IGZvcm1hdDsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRTY2FsaW5nTW9kZShpbnQgbW9kZSkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0U2NhbGluZ01vZGUoJWQpIiwgbW9kZSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICAvLyBtb2RlIGlzIHZhbGlkYXRlZCBvbiB0aGUgc2VydmVyCi0gICAgc3RhdHVzX3QgZXJyID0gbVN1cmZhY2VUZXh0dXJlLT5zZXRTY2FsaW5nTW9kZShtb2RlKTsKLSAgICBBTE9HRV9JRihlcnIsICJJU3VyZmFjZVRleHR1cmU6OnNldFNjYWxpbmdNb2RlKCVkKSByZXR1cm5lZCAlcyIsCi0gICAgICAgICAgICBtb2RlLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OnNldEJ1ZmZlcnNUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0QnVmZmVyc1RyYW5zZm9ybSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVN1cmZhY2VUZXh0dXJlLT5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OnNldEJ1ZmZlcnNUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXApCi17Ci0gICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRCdWZmZXJzVGltZXN0YW1wIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBtVGltZXN0YW1wID0gdGltZXN0YW1wOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZnJlZUFsbEJ1ZmZlcnMoKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyBpKyspIHsKLSAgICAgICAgbVNsb3RzW2ldID0gMDsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHRoZSBsb2NrL3VubG9jayBBUElzIG11c3QgYmUgdXNlZCBmcm9tIHRoZSBzYW1lIHRocmVhZAotCi1zdGF0aWMgc3RhdHVzX3QgY29weUJsdCgKLSAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGRzdCwKLSAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIHNyYywKLSAgICAgICAgY29uc3QgUmVnaW9uJiByZWcpCi17Ci0gICAgLy8gc3JjIGFuZCBkc3Qgd2l0aCwgaGVpZ2h0IGFuZCBmb3JtYXQgbXVzdCBiZSBpZGVudGljYWwuIG5vIHZlcmlmaWNhdGlvbgotICAgIC8vIGlzIGRvbmUgaGVyZS4KLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgdWludDhfdCBjb25zdCAqIHNyY19iaXRzID0gTlVMTDsKLSAgICBlcnIgPSBzcmMtPmxvY2soR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOLCByZWcuYm91bmRzKCksICh2b2lkKiopJnNyY19iaXRzKTsKLSAgICBBTE9HRV9JRihlcnIsICJlcnJvciBsb2NraW5nIHNyYyBidWZmZXIgJXMiLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICB1aW50OF90KiBkc3RfYml0cyA9IE5VTEw7Ci0gICAgZXJyID0gZHN0LT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sIHJlZy5ib3VuZHMoKSwgKHZvaWQqKikmZHN0X2JpdHMpOwotICAgIEFMT0dFX0lGKGVyciwgImVycm9yIGxvY2tpbmcgZHN0IGJ1ZmZlciAlcyIsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgaGVhZChyZWcuYmVnaW4oKSk7Ci0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciB0YWlsKHJlZy5lbmQoKSk7Ci0gICAgaWYgKGhlYWQgIT0gdGFpbCAmJiBzcmNfYml0cyAmJiBkc3RfYml0cykgewotICAgICAgICBjb25zdCBzaXplX3QgYnBwID0gYnl0ZXNQZXJQaXhlbChzcmMtPmZvcm1hdCk7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBkYnByID0gZHN0LT5zdHJpZGUgKiBicHA7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBzYnByID0gc3JjLT5zdHJpZGUgKiBicHA7Ci0KLSAgICAgICAgd2hpbGUgKGhlYWQgIT0gdGFpbCkgewotICAgICAgICAgICAgY29uc3QgUmVjdCYgcigqaGVhZCsrKTsKLSAgICAgICAgICAgIHNzaXplX3QgaCA9IHIuaGVpZ2h0KCk7Ci0gICAgICAgICAgICBpZiAoaCA8PSAwKSBjb250aW51ZTsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gci53aWR0aCgpICogYnBwOwotICAgICAgICAgICAgdWludDhfdCBjb25zdCAqIHMgPSBzcmNfYml0cyArIChyLmxlZnQgKyBzcmMtPnN0cmlkZSAqIHIudG9wKSAqIGJwcDsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgKiBkID0gZHN0X2JpdHMgKyAoci5sZWZ0ICsgZHN0LT5zdHJpZGUgKiByLnRvcCkgKiBicHA7Ci0gICAgICAgICAgICBpZiAoZGJwcj09c2JwciAmJiBzaXplPT1zYnByKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSAqPSBoOwotICAgICAgICAgICAgICAgIGggPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG1lbWNweShkLCBzLCBzaXplKTsKLSAgICAgICAgICAgICAgICBkICs9IGRicHI7Ci0gICAgICAgICAgICAgICAgcyArPSBzYnByOwotICAgICAgICAgICAgfSB3aGlsZSAoLS1oID4gMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3JjX2JpdHMpCi0gICAgICAgIHNyYy0+dW5sb2NrKCk7Ci0KLSAgICBpZiAoZHN0X2JpdHMpCi0gICAgICAgIGRzdC0+dW5sb2NrKCk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojpsb2NrKAotICAgICAgICBBTmF0aXZlV2luZG93X0J1ZmZlciogb3V0QnVmZmVyLCBBUmVjdCogaW5PdXREaXJ0eUJvdW5kcykKLXsKLSAgICBpZiAobUxvY2tlZEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJTdXJmYWNlOjpsb2NrIGZhaWxlZCwgYWxyZWFkeSBsb2NrZWQiKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGlmICghbUNvbm5lY3RlZFRvQ3B1KSB7Ci0gICAgICAgIGludCBlcnIgPSBTdXJmYWNlVGV4dHVyZUNsaWVudDo6Y29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8vIHdlJ3JlIGludGVuZGluZyB0byBkbyBzb2Z0d2FyZSByZW5kZXJpbmcgZnJvbSB0aGlzIHBvaW50Ci0gICAgICAgIHNldFVzYWdlKEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotICAgIH0KLQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIG91dDsKLSAgICBzdGF0dXNfdCBlcnIgPSBkZXF1ZXVlQnVmZmVyKCZvdXQpOwotICAgIEFMT0dFX0lGKGVyciwgImRlcXVldWVCdWZmZXIgZmFpbGVkICglcykiLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBiYWNrQnVmZmVyKEdyYXBoaWNCdWZmZXI6OmdldFNlbGYob3V0KSk7Ci0gICAgICAgIGVyciA9IGxvY2tCdWZmZXIoYmFja0J1ZmZlci5nZXQoKSk7Ci0gICAgICAgIEFMT0dFX0lGKGVyciwgImxvY2tCdWZmZXIgKGhhbmRsZT0lcCkgZmFpbGVkICglcykiLAotICAgICAgICAgICAgICAgIGJhY2tCdWZmZXItPmhhbmRsZSwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBjb25zdCBSZWN0IGJvdW5kcyhiYWNrQnVmZmVyLT53aWR0aCwgYmFja0J1ZmZlci0+aGVpZ2h0KTsKLQotICAgICAgICAgICAgUmVnaW9uIG5ld0RpcnR5UmVnaW9uOwotICAgICAgICAgICAgaWYgKGluT3V0RGlydHlCb3VuZHMpIHsKLSAgICAgICAgICAgICAgICBuZXdEaXJ0eVJlZ2lvbi5zZXQoc3RhdGljX2Nhc3Q8UmVjdCBjb25zdCY+KCppbk91dERpcnR5Qm91bmRzKSk7Ci0gICAgICAgICAgICAgICAgbmV3RGlydHlSZWdpb24uYW5kU2VsZihib3VuZHMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXdEaXJ0eVJlZ2lvbi5zZXQoYm91bmRzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZmlndXJlIG91dCBpZiB3ZSBjYW4gY29weSB0aGUgZnJvbnRidWZmZXIgYmFjawotICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGZyb250QnVmZmVyKG1Qb3N0ZWRCdWZmZXIpOwotICAgICAgICAgICAgY29uc3QgYm9vbCBjYW5Db3B5QmFjayA9IChmcm9udEJ1ZmZlciAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgIGJhY2tCdWZmZXItPndpZHRoICA9PSBmcm9udEJ1ZmZlci0+d2lkdGggJiYKLSAgICAgICAgICAgICAgICAgICAgYmFja0J1ZmZlci0+aGVpZ2h0ID09IGZyb250QnVmZmVyLT5oZWlnaHQgJiYKLSAgICAgICAgICAgICAgICAgICAgYmFja0J1ZmZlci0+Zm9ybWF0ID09IGZyb250QnVmZmVyLT5mb3JtYXQpOwotCi0gICAgICAgICAgICBpZiAoY2FuQ29weUJhY2spIHsKLSAgICAgICAgICAgICAgICAvLyBjb3B5IHRoZSBhcmVhIHRoYXQgaXMgaW52YWxpZCBhbmQgbm90IHJlcGFpbnRlZCB0aGlzIHJvdW5kCi0gICAgICAgICAgICAgICAgY29uc3QgUmVnaW9uIGNvcHliYWNrKG1PbGREaXJ0eVJlZ2lvbi5zdWJ0cmFjdChuZXdEaXJ0eVJlZ2lvbikpOwotICAgICAgICAgICAgICAgIGlmICghY29weWJhY2suaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICBjb3B5Qmx0KGJhY2tCdWZmZXIsIGZyb250QnVmZmVyLCBjb3B5YmFjayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNhbid0IGNvcHktYmFjayBhbnl0aGluZywgbW9kaWZ5IHRoZSB1c2VyJ3MgZGlydHkKLSAgICAgICAgICAgICAgICAvLyByZWdpb24gdG8gbWFrZSBzdXJlIHRoZXkgcmVkcmF3IHRoZSB3aG9sZSBidWZmZXIKLSAgICAgICAgICAgICAgICBuZXdEaXJ0eVJlZ2lvbi5zZXQoYm91bmRzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgYXJlIG9mIHRoZSBidWZmZXIgdGhhdCBpcyAiY2xlYW4iCi0gICAgICAgICAgICAvLyAoaWU6IHRoYXQgd2lsbCBiZSByZWRyYXduKQotICAgICAgICAgICAgbU9sZERpcnR5UmVnaW9uID0gbmV3RGlydHlSZWdpb247Ci0KLSAgICAgICAgICAgIGlmIChpbk91dERpcnR5Qm91bmRzKSB7Ci0gICAgICAgICAgICAgICAgKmluT3V0RGlydHlCb3VuZHMgPSBuZXdEaXJ0eVJlZ2lvbi5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9pZCogdmFkZHI7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBiYWNrQnVmZmVyLT5sb2NrKAotICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAotICAgICAgICAgICAgICAgICAgICBuZXdEaXJ0eVJlZ2lvbi5ib3VuZHMoKSwgJnZhZGRyKTsKLQotICAgICAgICAgICAgQUxPR1dfSUYocmVzLCAiZmFpbGVkIGxvY2tpbmcgYnVmZmVyIChoYW5kbGUgPSAlcCkiLAotICAgICAgICAgICAgICAgICAgICBiYWNrQnVmZmVyLT5oYW5kbGUpOwotCi0gICAgICAgICAgICBtTG9ja2VkQnVmZmVyID0gYmFja0J1ZmZlcjsKLSAgICAgICAgICAgIG91dEJ1ZmZlci0+d2lkdGggID0gYmFja0J1ZmZlci0+d2lkdGg7Ci0gICAgICAgICAgICBvdXRCdWZmZXItPmhlaWdodCA9IGJhY2tCdWZmZXItPmhlaWdodDsKLSAgICAgICAgICAgIG91dEJ1ZmZlci0+c3RyaWRlID0gYmFja0J1ZmZlci0+c3RyaWRlOwotICAgICAgICAgICAgb3V0QnVmZmVyLT5mb3JtYXQgPSBiYWNrQnVmZmVyLT5mb3JtYXQ7Ci0gICAgICAgICAgICBvdXRCdWZmZXItPmJpdHMgICA9IHZhZGRyOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojp1bmxvY2tBbmRQb3N0KCkKLXsKLSAgICBpZiAobUxvY2tlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJTdXJmYWNlOjp1bmxvY2tBbmRQb3N0IGZhaWxlZCwgbm8gbG9ja2VkIGJ1ZmZlciIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gbUxvY2tlZEJ1ZmZlci0+dW5sb2NrKCk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiZmFpbGVkIHVubG9ja2luZyBidWZmZXIgKCVwKSIsIG1Mb2NrZWRCdWZmZXItPmhhbmRsZSk7Ci0KLSAgICBlcnIgPSBxdWV1ZUJ1ZmZlcihtTG9ja2VkQnVmZmVyLmdldCgpKTsKLSAgICBBTE9HRV9JRihlcnIsICJxdWV1ZUJ1ZmZlciAoaGFuZGxlPSVwKSBmYWlsZWQgKCVzKSIsCi0gICAgICAgICAgICBtTG9ja2VkQnVmZmVyLT5oYW5kbGUsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgIG1Qb3N0ZWRCdWZmZXIgPSBtTG9ja2VkQnVmZmVyOwotICAgIG1Mb2NrZWRCdWZmZXIgPSAwOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS90ZXN0cy9BbmRyb2lkLm1rIGIvbGlicy9ndWkvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhYzEzMy4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cywKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBTdXJmYWNlVGV4dHVyZV90ZXN0Ci0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgU3VyZmFjZV90ZXN0LmNwcCBcCi0gICAgU3VyZmFjZVRleHR1cmVDbGllbnRfdGVzdC5jcHAgXAotICAgIFN1cmZhY2VUZXh0dXJlX3Rlc3QuY3BwIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliRUdMIFwKLQlsaWJHTEVTdjIgXAotCWxpYmFuZHJvaWQgXAotCWxpYmJpbmRlciBcCi0JbGliY3V0aWxzIFwKLQlsaWJndWkgXAotCWxpYnN0bHBvcnQgXAotCWxpYnVpIFwKLQlsaWJ1dGlscyBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGJpb25pYyBcCi0gICAgYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAotCi0jIEJ1aWxkIHRoZSBiaW5hcnkgdG8gJChUQVJHRVRfT1VUX0RBVEFfTkFUSVZFX1RFU1RTKS8kKExPQ0FMX01PRFVMRSkKLSMgdG8gaW50ZWdyYXRlIHdpdGggYXV0by10ZXN0IGZyYW1ld29yay4KLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotIyBJbmNsdWRlIHN1YmRpcmVjdG9yeSBtYWtlZmlsZXMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgSWYgd2UncmUgYnVpbGRpbmcgd2l0aCBPTkVfU0hPVF9NQUtFRklMRSAobW0sIG1tbSksIHRoZW4gd2hhdCB0aGUgZnJhbWV3b3JrCi0jIHRlYW0gcmVhbGx5IHdhbnRzIGlzIHRvIGJ1aWxkIHRoZSBzdHVmZiBkZWZpbmVkIGJ5IHRoaXMgbWFrZWZpbGUuCi1pZmVxICgsJChPTkVfU0hPVF9NQUtFRklMRSkpCi1pbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKLWVuZGlmCmRpZmYgLS1naXQgYS9saWJzL2d1aS90ZXN0cy9TdXJmYWNlVGV4dHVyZUNsaWVudF90ZXN0LmNwcCBiL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlQ2xpZW50X3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWEzYzk4Li4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlQ2xpZW50X3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCgpOgotICAgICAgICAgICAgbUVnbERpc3BsYXkoRUdMX05PX0RJU1BMQVkpLAotICAgICAgICAgICAgbUVnbFN1cmZhY2UoRUdMX05PX1NVUkZBQ0UpLAotICAgICAgICAgICAgbUVnbENvbnRleHQoRUdMX05PX0NPTlRFWFQpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIG1TVCA9IG5ldyBTdXJmYWNlVGV4dHVyZSgxMjMpOwotICAgICAgICBtU1RDID0gbmV3IFN1cmZhY2VUZXh0dXJlQ2xpZW50KG1TVCk7Ci0gICAgICAgIG1BTlcgPSBtU1RDOwotCi0gICAgICAgIC8vIFdlIG5lZWQgYSB2YWxpZCBHTCBjb250ZXh0IHNvIHdlIGNhbiB0ZXN0IHVwZGF0ZVRleEltYWdlKCkKLSAgICAgICAgLy8gVGhpcyBpbml0aWFsaXplcyBFR0wgYW5kIGNyZWF0ZSBhIGR1bW15IEdMIGNvbnRleHQgd2l0aCBhCi0gICAgICAgIC8vIHBidWZmZXIgcmVuZGVyIHRhcmdldC4KLSAgICAgICAgbUVnbERpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX0RJU1BMQVksIG1FZ2xEaXNwbGF5KTsKLQotICAgICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb247Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbEluaXRpYWxpemUobUVnbERpc3BsYXksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLQotICAgICAgICBFR0xDb25maWcgbXlDb25maWc7Ci0gICAgICAgIEVHTGludCBudW1Db25maWdzID0gMDsKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsQ2hvb3NlQ29uZmlnKG1FZ2xEaXNwbGF5LCBnZXRDb25maWdBdHRyaWJzKCksCi0gICAgICAgICAgICAgICAgJm15Q29uZmlnLCAxLCAmbnVtQ29uZmlncykpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgICAgIEVHTGludCBwYnVmZmVyQXR0cmlic1tdID0gewotICAgICAgICAgICAgRUdMX1dJRFRILCAxNiwKLSAgICAgICAgICAgIEVHTF9IRUlHSFQsIDE2LAotICAgICAgICAgICAgRUdMX05PTkUgfTsKLSAgICAgICAgbUVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShtRWdsRGlzcGxheSwgbXlDb25maWcsIHBidWZmZXJBdHRyaWJzKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgQVNTRVJUX05FKEVHTF9OT19TVVJGQUNFLCBtRWdsU3VyZmFjZSk7Ci0KLSAgICAgICAgbUVnbENvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KG1FZ2xEaXNwbGF5LCBteUNvbmZpZywgRUdMX05PX0NPTlRFWFQsIDApOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX0NPTlRFWFQsIG1FZ2xDb250ZXh0KTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLCBtRWdsQ29udGV4dCkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgbVNULmNsZWFyKCk7Ci0gICAgICAgIG1TVEMuY2xlYXIoKTsKLSAgICAgICAgbUFOVy5jbGVhcigpOwotCi0gICAgICAgIGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKLSAgICAgICAgZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1FZ2xDb250ZXh0KTsKLSAgICAgICAgZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICAgICAgZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEVHTGludCBjb25zdCogZ2V0Q29uZmlnQXR0cmlicygpIHsKLSAgICAgICAgc3RhdGljIEVHTGludCBzRGVmYXVsdENvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9QQlVGRkVSX0JJVCwKLSAgICAgICAgICAgIEVHTF9OT05FCi0gICAgICAgIH07Ci0KLSAgICAgICAgcmV0dXJuIHNEZWZhdWx0Q29uZmlnQXR0cmliczsKLSAgICB9Ci0KLSAgICBzcDxTdXJmYWNlVGV4dHVyZT4gbVNUOwotICAgIHNwPFN1cmZhY2VUZXh0dXJlQ2xpZW50PiBtU1RDOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1BTlc7Ci0KLSAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7Ci0gICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKLX07Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEdldElTdXJmYWNlVGV4dHVyZUlzTm90TnVsbCkgewotICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gaXN0KG1TVEMtPmdldElTdXJmYWNlVGV4dHVyZSgpKTsKLSAgICBBU1NFUlRfVFJVRShpc3QgIT0gTlVMTCk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIFF1ZXVlc1RvV2luZG93Q29tcG9zaXRvcklzRmFsc2UpIHsKLSAgICBpbnQgcmVzdWx0ID0gLTEyMzsKLSAgICBpbnQgZXJyID0gbUFOVy0+cXVlcnkobUFOVy5nZXQoKSwgTkFUSVZFX1dJTkRPV19RVUVVRVNfVE9fV0lORE9XX0NPTVBPU0VSLAotICAgICAgICAgICAgJnJlc3VsdCk7Ci0gICAgRVhQRUNUX0VRKE5PX0VSUk9SLCBlcnIpOwotICAgIEVYUEVDVF9FUSgwLCByZXN1bHQpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBDb25jcmV0ZVR5cGVJc1N1cmZhY2VUZXh0dXJlQ2xpZW50KSB7Ci0gICAgaW50IHJlc3VsdCA9IC0xMjM7Ci0gICAgaW50IGVyciA9IG1BTlctPnF1ZXJ5KG1BTlcuZ2V0KCksIE5BVElWRV9XSU5ET1dfQ09OQ1JFVEVfVFlQRSwgJnJlc3VsdCk7Ci0gICAgRVhQRUNUX0VRKE5PX0VSUk9SLCBlcnIpOwotICAgIEVYUEVDVF9FUShOQVRJVkVfV0lORE9XX1NVUkZBQ0VfVEVYVFVSRV9DTElFTlQsIHJlc3VsdCk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEVnbENyZWF0ZVdpbmRvd1N1cmZhY2VTdWNjZWVkcykgewotICAgIEVHTERpc3BsYXkgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIEFTU0VSVF9ORShFR0xfTk9fRElTUExBWSwgZHB5KTsKLQotICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKLSAgICBFWFBFQ1RfVFJVRShlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbikpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07Ci0gICAgRUdMaW50IG51bUNvbmZpZ3MgPSAwOwotICAgIEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAotICAgICAgICBFR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCi0gICAgICAgIEVHTF9SRURfU0laRSwgOCwKLSAgICAgICAgRUdMX0dSRUVOX1NJWkUsIDgsCi0gICAgICAgIEVHTF9CTFVFX1NJWkUsIDgsCi0gICAgICAgIEVHTF9BTFBIQV9TSVpFLCA4LAotICAgICAgICBFR0xfREVQVEhfU0laRSwgMTYsCi0gICAgICAgIEVHTF9TVEVOQ0lMX1NJWkUsIDgsCi0gICAgICAgIEVHTF9OT05FIH07Ci0gICAgRVhQRUNUX1RSVUUoZWdsQ2hvb3NlQ29uZmlnKGRweSwgY29uZmlnQXR0cmlicywgJm15Q29uZmlnLCAxLAotICAgICAgICAgICAgJm51bUNvbmZpZ3MpKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgRUdMU3VyZmFjZSBlZ2xTdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIG15Q29uZmlnLCBtQU5XLmdldCgpLAotICAgICAgICAgICAgTlVMTCk7Ci0gICAgRVhQRUNUX05FKEVHTF9OT19TVVJGQUNFLCBlZ2xTdXJmYWNlKTsKLSAgICBFWFBFQ1RfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgZWdsVGVybWluYXRlKGRweSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEJ1ZmZlckdlb21ldHJ5SW52YWxpZFNpemVzRmFpbCkgewotICAgIEVYUEVDVF9HVChPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAtMSwgIDAsICAwKSk7Ci0gICAgRVhQRUNUX0dUKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksICAwLCAtMSwgIDApKTsKLSAgICBFWFBFQ1RfR1QoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgIDAsICAwLCAtMSkpOwotICAgIEVYUEVDVF9HVChPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAtMSwgLTEsICAwKSk7Ci0gICAgRVhQRUNUX0dUKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksICAwLCAgOCwgIDApKTsKLSAgICBFWFBFQ1RfR1QoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgIDgsICAwLCAgMCkpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBEZWZhdWx0R2VvbWV0cnlWYWx1ZXMpIHsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWY7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWYpKTsKLSAgICBFWFBFQ1RfRVEoMSwgYnVmLT53aWR0aCk7Ci0gICAgRVhQRUNUX0VRKDEsIGJ1Zi0+aGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoUElYRUxfRk9STUFUX1JHQkFfODg4OCwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZikpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBCdWZmZXJHZW9tZXRyeUNhbkJlU2V0KSB7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAxNiwgOCwgUElYRUxfRk9STUFUX1JHQl81NjUpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZikpOwotICAgIEVYUEVDVF9FUSgxNiwgYnVmLT53aWR0aCk7Ci0gICAgRVhQRUNUX0VRKDgsIGJ1Zi0+aGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoUElYRUxfRk9STUFUX1JHQl81NjUsIGJ1Zi0+Zm9ybWF0KTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWYpKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgQnVmZmVyR2VvbWV0cnlEZWZhdWx0U2l6ZVNldEZvcm1hdCkgewotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZjsKLSAgICBFWFBFQ1RfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgMCwgMCwgUElYRUxfRk9STUFUX1JHQl81NjUpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZikpOwotICAgIEVYUEVDVF9FUSgxLCBidWYtPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoMSwgYnVmLT5oZWlnaHQpOwotICAgIEVYUEVDVF9FUShQSVhFTF9GT1JNQVRfUkdCXzU2NSwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZikpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBCdWZmZXJHZW9tZXRyeVNldFNpemVEZWZhdWx0Rm9ybWF0KSB7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAxNiwgOCwgMCkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmKSk7Ci0gICAgRVhQRUNUX0VRKDE2LCBidWYtPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoOCwgYnVmLT5oZWlnaHQpOwotICAgIEVYUEVDVF9FUShQSVhFTF9GT1JNQVRfUkdCQV84ODg4LCBidWYtPmZvcm1hdCk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmKSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEJ1ZmZlckdlb21ldHJ5U2l6ZUNhbkJlVW5zZXQpIHsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWY7Ci0gICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIDE2LCA4LCAwKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWYpKTsKLSAgICBFWFBFQ1RfRVEoMTYsIGJ1Zi0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSg4LCBidWYtPmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIGJ1Zi0+Zm9ybWF0KTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWYpKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgMCwgMCwgMCkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmKSk7Ci0gICAgRVhQRUNUX0VRKDEsIGJ1Zi0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSgxLCBidWYtPmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIGJ1Zi0+Zm9ybWF0KTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWYpKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgQnVmZmVyR2VvbWV0cnlTaXplQ2FuQmVDaGFuZ2VkV2l0aG91dEZvcm1hdCkgewotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZjsKLSAgICBFWFBFQ1RfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgMCwgMCwgUElYRUxfRk9STUFUX1JHQl81NjUpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZikpOwotICAgIEVYUEVDVF9FUSgxLCBidWYtPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoMSwgYnVmLT5oZWlnaHQpOwotICAgIEVYUEVDVF9FUShQSVhFTF9GT1JNQVRfUkdCXzU2NSwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZikpOwotICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAxNiwgOCwgMCkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmKSk7Ci0gICAgRVhQRUNUX0VRKDE2LCBidWYtPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoOCwgYnVmLT5oZWlnaHQpOwotICAgIEVYUEVDVF9FUShQSVhFTF9GT1JNQVRfUkdCXzU2NSwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZikpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBTdXJmYWNlVGV4dHVyZVNldERlZmF1bHRTaXplKSB7Ci0gICAgc3A8U3VyZmFjZVRleHR1cmU+IHN0KG1TVCk7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIEVYUEVDVF9FUShPSywgc3QtPnNldERlZmF1bHRCdWZmZXJTaXplKDE2LCA4KSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWYpKTsKLSAgICBFWFBFQ1RfRVEoMTYsIGJ1Zi0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSg4LCBidWYtPmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIGJ1Zi0+Zm9ybWF0KTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWYpKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgU3VyZmFjZVRleHR1cmVTZXREZWZhdWx0U2l6ZUFmdGVyRGVxdWV1ZSkgewotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZlsyXTsKLSAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtQU5XLmdldCgpLCA0KSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOwotICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzFdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnNldERlZmF1bHRCdWZmZXJTaXplKDE2LCA4KSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOwotICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7Ci0gICAgRVhQRUNUX0VRKDE2LCBidWZbMF0tPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoMTYsIGJ1ZlsxXS0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSg4LCBidWZbMF0tPmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKDgsIGJ1ZlsxXS0+aGVpZ2h0KTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgU3VyZmFjZVRleHR1cmVTZXREZWZhdWx0U2l6ZVZzR2VvbWV0cnkpIHsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZbMl07Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgNCkpOwotICAgIEVYUEVDVF9FUShPSywgbVNULT5zZXREZWZhdWx0QnVmZmVyU2l6ZSgxNiwgOCkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKLSAgICBFWFBFQ1RfTkUoYnVmWzBdLCBidWZbMV0pOwotICAgIEVYUEVDVF9FUSgxNiwgYnVmWzBdLT53aWR0aCk7Ci0gICAgRVhQRUNUX0VRKDE2LCBidWZbMV0tPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoOCwgYnVmWzBdLT5oZWlnaHQpOwotICAgIEVYUEVDVF9FUSg4LCBidWZbMV0tPmhlaWdodCk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzFdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIDEyLCAyNCwgMCkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKLSAgICBFWFBFQ1RfTkUoYnVmWzBdLCBidWZbMV0pOwotICAgIEVYUEVDVF9FUSgxMiwgYnVmWzBdLT53aWR0aCk7Ci0gICAgRVhQRUNUX0VRKDEyLCBidWZbMV0tPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoMjQsIGJ1ZlswXS0+aGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoMjQsIGJ1ZlsxXS0+aGVpZ2h0KTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgU3VyZmFjZVRleHR1cmVUb29NYW55VXBkYXRlVGV4SW1hZ2UpIHsKLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUoZmFsc2UpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtQU5XLmdldCgpLCA0KSk7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLQotICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDMpKTsKLQotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzFdKSk7Ci0KLSAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgU3VyZmFjZVRleHR1cmVTeW5jTW9kZVNsb3dSZXRpcmUpIHsKLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDQpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzFdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMl0pKTsKLSAgICBFWFBFQ1RfTkUoYnVmWzBdLCBidWZbMV0pOwotICAgIEVYUEVDVF9ORShidWZbMV0sIGJ1ZlsyXSk7Ci0gICAgRVhQRUNUX05FKGJ1ZlsyXSwgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzFdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMl0pKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgRVhQRUNUX0VRKG1TVC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMF0pOwotICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlsxXSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgYnVmWzJdKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgU3VyZmFjZVRleHR1cmVTeW5jTW9kZUZhc3RSZXRpcmUpIHsKLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDQpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzFdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMl0pKTsKLSAgICBFWFBFQ1RfTkUoYnVmWzBdLCBidWZbMV0pOwotICAgIEVYUEVDVF9ORShidWZbMV0sIGJ1ZlsyXSk7Ci0gICAgRVhQRUNUX05FKGJ1ZlsyXSwgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOwotICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlswXSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgRVhQRUNUX0VRKG1TVC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzJdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgYnVmWzJdKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgU3VyZmFjZVRleHR1cmVTeW5jTW9kZURRUVIpIHsKLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDMpKTsKLQotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgRVhQRUNUX0VRKG1TVC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMF0pOwotCi0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKLSAgICBFWFBFQ1RfTkUoYnVmWzBdLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzFdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgYnVmWzFdKTsKLQotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzJdKSk7Ci0gICAgRVhQRUNUX05FKGJ1ZlsxXSwgYnVmWzJdKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsyXSkpOwotICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlsyXSk7Ci19Ci0KLS8vIFhYWDogV2UgY3VycmVudGx5IGhhdmUgbm8gaGFyZHdhcmUgdGhhdCBwcm9wZXJseSBoYW5kbGVzIGRlcXVldWluZyB0aGUKLS8vIGJ1ZmZlciB0aGF0IGlzIGN1cnJlbnRseSBib3VuZCB0byB0aGUgdGV4dHVyZS4KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIERJU0FCTEVEX1N1cmZhY2VUZXh0dXJlU3luY01vZGVEZXF1ZXVlQ3VycmVudCkgewotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZbM107Ci0gICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGZpcnN0QnVmOwotICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDMpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmZpcnN0QnVmKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBmaXJzdEJ1ZikpOwotICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGZpcnN0QnVmKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsxXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzJdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMl0pKTsKLSAgICBFWFBFQ1RfTkUoYnVmWzBdLCBidWZbMV0pOwotICAgIEVYUEVDVF9ORShidWZbMV0sIGJ1ZlsyXSk7Ci0gICAgRVhQRUNUX05FKGJ1ZlsyXSwgYnVmWzBdKTsKLSAgICBFWFBFQ1RfRVEoZmlyc3RCdWYsIGJ1ZlsyXSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIFN1cmZhY2VUZXh0dXJlU3luY01vZGVNaW5VbmRlcXVldWVkKSB7Ci0gICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGJ1ZlszXTsKLSAgICBBU1NFUlRfRVEoT0ssIG1TVC0+c2V0U3luY2hyb25vdXNNb2RlKHRydWUpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtQU5XLmdldCgpLCAzKSk7Ci0KLSAgICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBkZXF1ZXVlIGFsbCB0aGUgYnVmZmVycyBiZWZvcmUgd2UndmUgcXVldWVkIG1BTld5LgotICAgIEVYUEVDVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsyXSkpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzJdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKLQotICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlsxXSk7Ci0KLSAgICBFWFBFQ1RfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsyXSkpOwotCi0gICAgLy8gT25jZSB3ZSd2ZSBxdWV1ZWQgYSBidWZmZXIsIGhvd2V2ZXIgd2Ugc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGRlcXVldWUgbW9yZQotICAgIC8vIHRoYW4gKGJ1ZmZlci1jb3VudCAtIE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMpLCB3aGljaCBpcyAyIGluIHRoaXMgY2FzZS4KLSAgICBFWFBFQ1RfRVEoLUVCVVNZLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKLQotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsyXSkpOwotfQotCi0vLyBYWFg6IFRoaXMgaXMgbm90IGV4cGVjdGVkIHRvIHBhc3MgdW50aWwgdGhlIHN5bmNocm9uaXphdGlvbiBoYWNrcyBhcmUgcmVtb3ZlZAotLy8gZnJvbSB0aGUgU3VyZmFjZVRleHR1cmUgY2xhc3MuCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBESVNBQkxFRF9TdXJmYWNlVGV4dHVyZVN5bmNNb2RlV2FpdFJldGlyZSkgewotICAgIGNsYXNzIE15VGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBtU1Q7Ci0gICAgICAgIEVHTENvbnRleHQgY3R4OwotICAgICAgICBFR0xTdXJmYWNlIHN1cjsKLSAgICAgICAgRUdMRGlzcGxheSBkcHk7Ci0gICAgICAgIGJvb2wgbUJ1ZmZlclJldGlyZWQ7Ci0gICAgICAgIE11dGV4IG1Mb2NrOwotICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKLSAgICAgICAgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyLCBzdXIsIGN0eCk7Ci0gICAgICAgICAgICB1c2xlZXAoMjAwMDApOwotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXJSZXRpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICBwdWJsaWM6Ci0gICAgICAgIE15VGhyZWFkKGNvbnN0IHNwPFN1cmZhY2VUZXh0dXJlPiYgbVNUKQotICAgICAgICAgICAgOiBtU1QobVNUKSwgbUJ1ZmZlclJldGlyZWQoZmFsc2UpIHsKLSAgICAgICAgICAgIGN0eCA9IGVnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci0gICAgICAgICAgICBzdXIgPSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfRFJBVyk7Ci0gICAgICAgICAgICBkcHkgPSBlZ2xHZXRDdXJyZW50RGlzcGxheSgpOwotICAgICAgICAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKLSAgICAgICAgfQotICAgICAgICB+TXlUaHJlYWQoKSB7Ci0gICAgICAgICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1ciwgc3VyLCBjdHgpOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgYnVmZmVyRGVxdWV1ZWQoKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICAgICAgRVhQRUNUX0VRKHRydWUsIG1CdWZmZXJSZXRpcmVkKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDMpKTsKLSAgICAvLyBkZXF1ZXVlL3F1ZXVlL3VwZGF0ZSBzbyB3ZSBoYXZlIGEgY3VycmVudCBidWZmZXIKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotCi0gICAgTXlUaHJlYWQqIHRocmVhZCA9IG5ldyBNeVRocmVhZChtU1QpOwotICAgIHNwPFRocmVhZD4gdGhyZWFkQmFzZSh0aHJlYWQpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOwotICAgIHRocmVhZC0+cnVuKCk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsxXSkpOwotICAgIC8vQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMl0pKTsKLSAgICAvL0FTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzJdKSk7Ci0gICAgdGhyZWFkLT5idWZmZXJEZXF1ZXVlZCgpOwotICAgIHRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEdldFRyYW5zZm9ybU1hdHJpeFJldHVybnNWZXJ0aWNhbEZsaXApIHsKLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIGZsb2F0IG10eFsxNl0gPSB7fTsKLSAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtQU5XLmdldCgpLCA0KSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICBtU1QtPmdldFRyYW5zZm9ybU1hdHJpeChtdHgpOwotCi0gICAgRVhQRUNUX0VRKDEuZiwgbXR4WzBdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMV0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFsyXSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzNdKTsKLQotICAgIEVYUEVDVF9FUSgwLmYsIG10eFs0XSk7Ci0gICAgRVhQRUNUX0VRKC0xLmYsIG10eFs1XSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzZdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbN10pOwotCi0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzhdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbOV0pOwotICAgIEVYUEVDVF9FUSgxLmYsIG10eFsxMF0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFsxMV0pOwotCi0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzEyXSk7Ci0gICAgRVhQRUNUX0VRKDEuZiwgbXR4WzEzXSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzE0XSk7Ci0gICAgRVhQRUNUX0VRKDEuZiwgbXR4WzE1XSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEdldFRyYW5zZm9ybU1hdHJpeFN1Y2NlZWRzQWZ0ZXJGcmVlaW5nQnVmZmVycykgewotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZbM107Ci0gICAgZmxvYXQgbXR4WzE2XSA9IHt9OwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDQpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDYpKTsgLy8gZnJlZXMgYnVmZmVycwotICAgIG1TVC0+Z2V0VHJhbnNmb3JtTWF0cml4KG10eCk7Ci0KLSAgICBFWFBFQ1RfRVEoMS5mLCBtdHhbMF0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFsxXSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzJdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbM10pOwotCi0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzRdKTsKLSAgICBFWFBFQ1RfRVEoLTEuZiwgbXR4WzVdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbNl0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFs3XSk7Ci0KLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbOF0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFs5XSk7Ci0gICAgRVhQRUNUX0VRKDEuZiwgbXR4WzEwXSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzExXSk7Ci0KLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMTJdKTsKLSAgICBFWFBFQ1RfRVEoMS5mLCBtdHhbMTNdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMTRdKTsKLSAgICBFWFBFQ1RfRVEoMS5mLCBtdHhbMTVdKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgR2V0VHJhbnNmb3JtTWF0cml4U3VjY2VlZHNBZnRlckZyZWVpbmdCdWZmZXJzV2l0aENyb3ApIHsKLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIGZsb2F0IG10eFsxNl0gPSB7fTsKLSAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgY3JvcDsKLSAgICBjcm9wLmxlZnQgPSAwOwotICAgIGNyb3AudG9wID0gMDsKLSAgICBjcm9wLnJpZ2h0ID0gNTsKLSAgICBjcm9wLmJvdHRvbSA9IDU7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtQU5XLmdldCgpLCA0KSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIDgsIDgsIDApKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfY3JvcChtQU5XLmdldCgpLCAmY3JvcCkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDYpKTsgLy8gZnJlZXMgYnVmZmVycwotICAgIG1TVC0+Z2V0VHJhbnNmb3JtTWF0cml4KG10eCk7Ci0KLSAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgMSB0ZXhlbCBzaHJpbmsgZm9yIGVhY2ggZWRnZSB0aGF0J3MgaW5jbHVkZWQgaW4gdGhlCi0gICAgLy8gdHJhbnNmb3JtIG1hdHJpeCB0byBhdm9pZCB0ZXh0dXJpbmcgb3V0c2lkZSB0aGUgY3JvcCByZWdpb24uCi0gICAgRVhQRUNUX0VRKC41ZiwgbXR4WzBdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMV0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFsyXSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzNdKTsKLQotICAgIEVYUEVDVF9FUSgwLmYsIG10eFs0XSk7Ci0gICAgRVhQRUNUX0VRKC0uNWYsIG10eFs1XSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzZdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbN10pOwotCi0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzhdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbOV0pOwotICAgIEVYUEVDVF9FUSgxLmYsIG10eFsxMF0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFsxMV0pOwotCi0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzEyXSk7Ci0gICAgRVhQRUNUX0VRKC41ZiwgbXR4WzEzXSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzE0XSk7Ci0gICAgRVhQRUNUX0VRKDEuZiwgbXR4WzE1XSk7Ci19Ci0KLS8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSBidWZmZXIgZm9ybWF0IGNhbiBiZSBxdWVyaWVkIGltbWVkaWF0ZWx5IGFmdGVyCi0vLyBpdCBpcyBzZXQuCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBRdWVyeUZvcm1hdEFmdGVyU2V0dGluZ1dvcmtzKSB7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53KG1TVEMpOwotICAgIGludCBmbXRzW10gPSB7Ci0gICAgICAgIC8vIFJHQkFfODg4OCBzaG91bGQgbm90IGNvbWUgZmlyc3QsIGFzIGl0J3MgdGhlIGRlZmF1bHQKLSAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODgsCi0gICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LAotICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQl84ODgsCi0gICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwKLSAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgsCi0gICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxLAotICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfNDQ0NCwKLSAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAotICAgIH07Ci0KLSAgICBjb25zdCBpbnQgbnVtRm10cyA9IChzaXplb2YoZm10cykgLyBzaXplb2YoZm10c1swXSkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRm10czsgaSsrKSB7Ci0gICAgICBpbnQgZm10ID0gLTE7Ci0gICAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoYW53LmdldCgpLCAwLCAwLCBmbXRzW2ldKSk7Ci0gICAgICBBU1NFUlRfRVEoT0ssIGFudy0+cXVlcnkoYW53LmdldCgpLCBOQVRJVkVfV0lORE9XX0ZPUk1BVCwgJmZtdCkpOwotICAgICAgRVhQRUNUX0VRKGZtdHNbaV0sIGZtdCk7Ci0gICAgfQotfQotCi1jbGFzcyBNdWx0aVN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotCi1wdWJsaWM6Ci0gICAgTXVsdGlTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QoKSA6Ci0gICAgICAgICAgICBtRWdsRGlzcGxheShFR0xfTk9fRElTUExBWSksCi0gICAgICAgICAgICBtRWdsQ29udGV4dChFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVVJGQUNFX1RFWFRVUkVTOyBpKyspIHsKLSAgICAgICAgICAgIG1FZ2xTdXJmYWNlc1tpXSA9IEVHTF9OT19DT05URVhUOwotICAgICAgICB9Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0KLSAgICBlbnVtIHsgTlVNX1NVUkZBQ0VfVEVYVFVSRVMgPSAzMiB9OwotCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBtRWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9ORShFR0xfTk9fRElTUExBWSwgbUVnbERpc3BsYXkpOwotCi0gICAgICAgIEVHTGludCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbjsKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsSW5pdGlhbGl6ZShtRWdsRGlzcGxheSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbikpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgICAgIEVHTENvbmZpZyBteUNvbmZpZzsKLSAgICAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAwOwotICAgICAgICBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0gewotICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1dJTkRPV19CSVQsCi0gICAgICAgICAgICBFR0xfTk9ORQotICAgICAgICB9OwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xDaG9vc2VDb25maWcobUVnbERpc3BsYXksIGNvbmZpZ0F0dHJpYnMsICZteUNvbmZpZywgMSwKLSAgICAgICAgICAgICAgICAmbnVtQ29uZmlncykpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgICAgIG1FZ2xDb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChtRWdsRGlzcGxheSwgbXlDb25maWcsIEVHTF9OT19DT05URVhULAotICAgICAgICAgICAgICAgIDApOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX0NPTlRFWFQsIG1FZ2xDb250ZXh0KTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVVJGQUNFX1RFWFRVUkVTOyBpKyspIHsKLSAgICAgICAgICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBzdChuZXcgU3VyZmFjZVRleHR1cmUoaSkpOwotICAgICAgICAgICAgc3A8U3VyZmFjZVRleHR1cmVDbGllbnQ+IHN0YyhuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQoc3QpKTsKLSAgICAgICAgICAgIG1FZ2xTdXJmYWNlc1tpXSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG15Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4oc3RjLmdldCgpKSwgTlVMTCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICAgICAgQVNTRVJUX05FKEVHTF9OT19TVVJGQUNFLCBtRWdsU3VyZmFjZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLAotICAgICAgICAgICAgICAgIEVHTF9OT19DT05URVhUKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVVJGQUNFX1RFWFRVUkVTOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtRWdsU3VyZmFjZXNbaV0gIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgICAgICAgICBlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2VzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRWdsQ29udGV4dCAhPSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICAgICAgZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1FZ2xDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRWdsRGlzcGxheSAhPSBFR0xfTk9fRElTUExBWSkgewotICAgICAgICAgICAgZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7Ci0gICAgRUdMU3VyZmFjZSBtRWdsU3VyZmFjZXNbTlVNX1NVUkZBQ0VfVEVYVFVSRVNdOwotICAgIEVHTENvbnRleHQgbUVnbENvbnRleHQ7Ci19OwotCi0vLyBYWFg6IFRoaXMgdGVzdCBpcyBkaXNhYmxlZCBiZWNhdXNlIGl0IGNhdXNlcyBhIGhhbmcgb24gc29tZSBkZXZpY2VzLiAgU2VlIGJ1ZwotLy8gNTAxNTY3Mi4KLVRFU1RfRihNdWx0aVN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgRElTQUJMRURfTWFrZUN1cnJlbnRCZXR3ZWVuU3VyZmFjZXNXb3JrcykgewotICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgODsgaXRlcisrKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NVUkZBQ0VfVEVYVFVSRVM7IGkrKykgewotICAgICAgICAgICAgZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlc1tpXSwgbUVnbFN1cmZhY2VzW2ldLAotICAgICAgICAgICAgICAgICAgICBtRWdsQ29udGV4dCk7Ci0gICAgICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlX3Rlc3QuY3BwIGIvbGlicy9ndWkvdGVzdHMvU3VyZmFjZVRleHR1cmVfdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNmRlZmUuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvdGVzdHMvU3VyZmFjZVRleHR1cmVfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN1cmZhY2VUZXh0dXJlX3Rlc3QiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZS5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEdMVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotCi0gICAgR0xUZXN0KCk6Ci0gICAgICAgICAgICBtRWdsRGlzcGxheShFR0xfTk9fRElTUExBWSksCi0gICAgICAgICAgICBtRWdsU3VyZmFjZShFR0xfTk9fU1VSRkFDRSksCi0gICAgICAgICAgICBtRWdsQ29udGV4dChFR0xfTk9fQ09OVEVYVCkgewotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgbUVnbERpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX0RJU1BMQVksIG1FZ2xEaXNwbGF5KTsKLQotICAgICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xJbml0aWFsaXplKG1FZ2xEaXNwbGF5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIFJlY29yZFByb3BlcnR5KCJFZ2xWZXJzaW9uTWFqb3IiLCBtYWpvclZlcnNpb24pOwotICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiRWdsVmVyc2lvbk1ham9yIiwgbWlub3JWZXJzaW9uKTsKLQotICAgICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwgZ2V0Q29uZmlnQXR0cmlicygpLCAmbUdsQ29uZmlnLAotICAgICAgICAgICAgICAgIDEsICZudW1Db25maWdzKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgY2hhciogZGlzcGxheVNlY3NFbnYgPSBnZXRlbnYoIkdMVEVTVF9ESVNQTEFZX1NFQ1MiKTsKLSAgICAgICAgaWYgKGRpc3BsYXlTZWNzRW52ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5U2VjcyA9IGF0b2koZGlzcGxheVNlY3NFbnYpOwotICAgICAgICAgICAgaWYgKG1EaXNwbGF5U2VjcyA8IDApIHsKLSAgICAgICAgICAgICAgICBtRGlzcGxheVNlY3MgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbURpc3BsYXlTZWNzID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGlzcGxheVNlY3MgPiAwKSB7Ci0gICAgICAgICAgICBtQ29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwotICAgICAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpKTsKLQotICAgICAgICAgICAgbVN1cmZhY2VDb250cm9sID0gbUNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJUZXN0IFN1cmZhY2UiKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3VyZmFjZVdpZHRoKCksIGdldFN1cmZhY2VIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgUElYRUxfRk9STUFUX1JHQl84ODgsIDApOwotCi0gICAgICAgICAgICBBU1NFUlRfVFJVRShtU3VyZmFjZUNvbnRyb2wgIT0gTlVMTCk7Ci0gICAgICAgICAgICBBU1NFUlRfVFJVRShtU3VyZmFjZUNvbnRyb2wtPmlzVmFsaWQoKSk7Ci0KLSAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoMHg3RkZGRkZGRikpOwotICAgICAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3VyZmFjZUNvbnRyb2wtPnNob3coKSk7Ci0gICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKLQotICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93ID0gbVN1cmZhY2VDb250cm9sLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgICAgICBtRWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG1HbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldCgpLCBOVUxMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEVHTGludCBwYnVmZmVyQXR0cmlic1tdID0gewotICAgICAgICAgICAgICAgIEVHTF9XSURUSCwgZ2V0U3VyZmFjZVdpZHRoKCksCi0gICAgICAgICAgICAgICAgRUdMX0hFSUdIVCwgZ2V0U3VyZmFjZUhlaWdodCgpLAotICAgICAgICAgICAgICAgIEVHTF9OT05FIH07Ci0KLSAgICAgICAgICAgIG1FZ2xTdXJmYWNlID0gZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UobUVnbERpc3BsYXksIG1HbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgcGJ1ZmZlckF0dHJpYnMpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9ORShFR0xfTk9fU1VSRkFDRSwgbUVnbFN1cmZhY2UpOwotCi0gICAgICAgIG1FZ2xDb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChtRWdsRGlzcGxheSwgbUdsQ29uZmlnLCBFR0xfTk9fQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBnZXRDb250ZXh0QXR0cmlicygpKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgQVNTRVJUX05FKEVHTF9OT19DT05URVhULCBtRWdsQ29udGV4dCk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwKLSAgICAgICAgICAgICAgICBtRWdsQ29udGV4dCkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgICAgIEVHTGludCB3LCBoOwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xRdWVyeVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBFR0xfV0lEVEgsICZ3KSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbFF1ZXJ5U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIFJlY29yZFByb3BlcnR5KCJFZ2xTdXJmYWNlV2lkdGgiLCB3KTsKLSAgICAgICAgUmVjb3JkUHJvcGVydHkoIkVnbFN1cmZhY2VIZWlnaHQiLCBoKTsKLQotICAgICAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIC8vIERpc3BsYXkgdGhlIHJlc3VsdCAKLSAgICAgICAgaWYgKG1EaXNwbGF5U2VjcyA+IDAgJiYgbUVnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgICAgIGVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgICAgICAgICBzbGVlcChtRGlzcGxheVNlY3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Db21wb3NlckNsaWVudCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQ29tcG9zZXJDbGllbnQtPmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUVnbENvbnRleHQgIT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgICAgIGVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1FZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgICAgICBlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRWdsRGlzcGxheSAhPSBFR0xfTk9fRElTUExBWSkgewotICAgICAgICAgICAgZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fU1VSRkFDRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMX05PX0NPTlRFWFQpOwotICAgICAgICAgICAgZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgRUdMaW50IGNvbnN0KiBnZXRDb25maWdBdHRyaWJzKCkgewotICAgICAgICBzdGF0aWMgRUdMaW50IHNEZWZhdWx0Q29uZmlnQXR0cmlic1tdID0gewotICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1BCVUZGRVJfQklULAotICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICAgICAgRUdMX1JFRF9TSVpFLCA4LAotICAgICAgICAgICAgRUdMX0dSRUVOX1NJWkUsIDgsCi0gICAgICAgICAgICBFR0xfQkxVRV9TSVpFLCA4LAotICAgICAgICAgICAgRUdMX0FMUEhBX1NJWkUsIDgsCi0gICAgICAgICAgICBFR0xfREVQVEhfU0laRSwgMTYsCi0gICAgICAgICAgICBFR0xfU1RFTkNJTF9TSVpFLCA4LAotICAgICAgICAgICAgRUdMX05PTkUgfTsKLQotICAgICAgICByZXR1cm4gc0RlZmF1bHRDb25maWdBdHRyaWJzOwotICAgIH0KLQotICAgIHZpcnR1YWwgRUdMaW50IGNvbnN0KiBnZXRDb250ZXh0QXR0cmlicygpIHsKLSAgICAgICAgc3RhdGljIEVHTGludCBzRGVmYXVsdENvbnRleHRBdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwKLSAgICAgICAgICAgIEVHTF9OT05FIH07Ci0KLSAgICAgICAgcmV0dXJuIHNEZWZhdWx0Q29udGV4dEF0dHJpYnM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBFR0xpbnQgZ2V0U3VyZmFjZVdpZHRoKCkgewotICAgICAgICByZXR1cm4gNTEyOwotICAgIH0KLQotICAgIHZpcnR1YWwgRUdMaW50IGdldFN1cmZhY2VIZWlnaHQoKSB7Ci0gICAgICAgIHJldHVybiA1MTI7Ci0gICAgfQotCi0gICAgdm9pZCBsb2FkU2hhZGVyKEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyKiBwU291cmNlLCBHTHVpbnQqIG91dFNoYWRlcikgewotICAgICAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICBpZiAoc2hhZGVyKSB7Ci0gICAgICAgICAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZwU291cmNlLCBOVUxMKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICAgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgICAgIEdMaW50IGNvbXBpbGVkID0gMDsKLSAgICAgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICAgICAgaWYgKCFjb21waWxlZCkgewotICAgICAgICAgICAgICAgIEdMaW50IGluZm9MZW4gPSAwOwotICAgICAgICAgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5mb0xlbikgewotICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiU2hhZGVyIGNvbXBpbGUgbG9nOlxuJXNcbiIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGQUlMKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYygweDEwMDApOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCAweDEwMDAsIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlNoYWRlciBjb21waWxlIGxvZzpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgRkFJTCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgICAgICAgICAgc2hhZGVyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBBU1NFUlRfVFJVRShzaGFkZXIgIT0gMCk7Ci0gICAgICAgICpvdXRTaGFkZXIgPSBzaGFkZXI7Ci0gICAgfQotCi0gICAgdm9pZCBjcmVhdGVQcm9ncmFtKGNvbnN0IGNoYXIqIHBWZXJ0ZXhTb3VyY2UsIGNvbnN0IGNoYXIqIHBGcmFnbWVudFNvdXJjZSwKLSAgICAgICAgICAgIEdMdWludCogb3V0UGdtKSB7Ci0gICAgICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyOwotICAgICAgICB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoImNvbXBpbGluZyB2ZXJ0ZXggc2hhZGVyIik7Ci0gICAgICAgICAgICBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHBWZXJ0ZXhTb3VyY2UsICZ2ZXJ0ZXhTaGFkZXIpOwotICAgICAgICAgICAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSgiY29tcGlsaW5nIGZyYWdtZW50IHNoYWRlciIpOwotICAgICAgICAgICAgbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIHBGcmFnbWVudFNvdXJjZSwgJmZyYWdtZW50U2hhZGVyKTsKLSAgICAgICAgICAgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEdMdWludCBwcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICBpZiAocHJvZ3JhbSkgewotICAgICAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOwotICAgICAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICAgICAgR0xpbnQgbGlua1N0YXR1cyA9IEdMX0ZBTFNFOwotICAgICAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZsaW5rU3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChsaW5rU3RhdHVzICE9IEdMX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBHTGludCBidWZMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwgJmJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1Zkxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhidWZMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGJ1Zkxlbmd0aCwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiUHJvZ3JhbSBsaW5rIGxvZzpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgRkFJTCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgICAgICBwcm9ncmFtID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOwotICAgICAgICBnbERlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHByb2dyYW0gIT0gMCk7Ci0gICAgICAgICpvdXRQZ20gPSBwcm9ncmFtOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgYWJzKGludCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdmFsdWUgPiAwID8gdmFsdWUgOiAtdmFsdWU7Ci0gICAgfQotCi0gICAgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgY2hlY2tQaXhlbChpbnQgeCwgaW50IHksIGludCByLAotICAgICAgICAgICAgaW50IGcsIGludCBiLCBpbnQgYSwgaW50IHRvbGVyYW5jZT0yKSB7Ci0gICAgICAgIEdMdWJ5dGUgcGl4ZWxbNF07Ci0gICAgICAgIFN0cmluZzggbXNnOwotICAgICAgICBnbFJlYWRQaXhlbHMoeCwgeSwgMSwgMSwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgcGl4ZWwpOwotICAgICAgICBHTGVudW0gZXJyID0gZ2xHZXRFcnJvcigpOwotICAgICAgICBpZiAoZXJyICE9IEdMX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtc2cgKz0gU3RyaW5nODo6Zm9ybWF0KCJlcnJvciByZWFkaW5nIHBpeGVsOiAlI3giLCBlcnIpOwotICAgICAgICAgICAgd2hpbGUgKChlcnIgPSBnbEdldEVycm9yKCkpICE9IEdMX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbXNnICs9IFN0cmluZzg6OmZvcm1hdCgiLCAlI3giLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwaXhlbCBjaGVjayBmYWlsdXJlOiAlc1xuIiwgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoCi0gICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6TWVzc2FnZShtc2cuc3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAociA+PSAwICYmIGFicyhyIC0gaW50KHBpeGVsWzBdKSkgPiB0b2xlcmFuY2UpIHsKLSAgICAgICAgICAgIG1zZyArPSBTdHJpbmc4Ojpmb3JtYXQoInIoJWQgaXNuJ3QgJWQpIiwgcGl4ZWxbMF0sIHIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnID49IDAgJiYgYWJzKGcgLSBpbnQocGl4ZWxbMV0pKSA+IHRvbGVyYW5jZSkgewotICAgICAgICAgICAgaWYgKCFtc2cuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbXNnICs9ICIgIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZyArPSBTdHJpbmc4Ojpmb3JtYXQoImcoJWQgaXNuJ3QgJWQpIiwgcGl4ZWxbMV0sIGcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiID49IDAgJiYgYWJzKGIgLSBpbnQocGl4ZWxbMl0pKSA+IHRvbGVyYW5jZSkgewotICAgICAgICAgICAgaWYgKCFtc2cuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbXNnICs9ICIgIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZyArPSBTdHJpbmc4Ojpmb3JtYXQoImIoJWQgaXNuJ3QgJWQpIiwgcGl4ZWxbMl0sIGIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhID49IDAgJiYgYWJzKGEgLSBpbnQocGl4ZWxbM10pKSA+IHRvbGVyYW5jZSkgewotICAgICAgICAgICAgaWYgKCFtc2cuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbXNnICs9ICIgIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZyArPSBTdHJpbmc4Ojpmb3JtYXQoImEoJWQgaXNuJ3QgJWQpIiwgcGl4ZWxbM10sIGEpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbXNnLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwaXhlbCBjaGVjayBmYWlsdXJlOiAlc1xuIiwgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoCi0gICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6TWVzc2FnZShtc2cuc3RyaW5nKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBtRGlzcGxheVNlY3M7Ci0gICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBtQ29tcG9zZXJDbGllbnQ7Ci0gICAgc3A8U3VyZmFjZUNvbnRyb2w+IG1TdXJmYWNlQ29udHJvbDsKLQotICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7Ci0gICAgRUdMU3VyZmFjZSBtRWdsU3VyZmFjZTsKLSAgICBFR0xDb250ZXh0IG1FZ2xDb250ZXh0OwotICAgIEVHTENvbmZpZyAgbUdsQ29uZmlnOwotfTsKLQotLy8gWFhYOiBDb2RlIGFib3ZlIHRoaXMgcG9pbnQgc2hvdWxkIGxpdmUgZWxzZXdoZXJlCi0KLWNsYXNzIFN1cmZhY2VUZXh0dXJlR0xUZXN0IDogcHVibGljIEdMVGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgZW51bSB7IFRFWF9JRCA9IDEyMyB9OwotCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBHTFRlc3Q6OlNldFVwKCk7Ci0gICAgICAgIG1TVCA9IG5ldyBTdXJmYWNlVGV4dHVyZShURVhfSUQpOwotICAgICAgICBtU1RDID0gbmV3IFN1cmZhY2VUZXh0dXJlQ2xpZW50KG1TVCk7Ci0gICAgICAgIG1BTlcgPSBtU1RDOwotCi0gICAgICAgIGNvbnN0IGNoYXIgdnNyY1tdID0KLSAgICAgICAgICAgICJhdHRyaWJ1dGUgdmVjNCB2UG9zaXRpb247XG4iCi0gICAgICAgICAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkcztcbiIKLSAgICAgICAgICAgICJ1bmlmb3JtIG1hdDQgdGV4TWF0cml4O1xuIgotICAgICAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAgICAgICAgICIgIHZlYzIgdlRleENvb3JkcyA9IDAuNSAqICh2UG9zaXRpb24ueHkgKyB2ZWMyKDEuMCwgMS4wKSk7XG4iCi0gICAgICAgICAgICAiICB0ZXhDb29yZHMgPSAodGV4TWF0cml4ICogdmVjNCh2VGV4Q29vcmRzLCAwLjAsIDEuMCkpLnh5O1xuIgotICAgICAgICAgICAgIiAgZ2xfUG9zaXRpb24gPSB2UG9zaXRpb247XG4iCi0gICAgICAgICAgICAifVxuIjsKLQotICAgICAgICBjb25zdCBjaGFyIGZzcmNbXSA9Ci0gICAgICAgICAgICAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIgotICAgICAgICAgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICAgICAgICAgInVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHRleFNhbXBsZXI7XG4iCi0gICAgICAgICAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkcztcbiIKLSAgICAgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgICAgICAgICAiICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4U2FtcGxlciwgdGV4Q29vcmRzKTtcbiIKLSAgICAgICAgICAgICJ9XG4iOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSgiY3JlYXRpbmcgc2hhZGVyIHByb2dyYW0iKTsKLSAgICAgICAgICAgIGNyZWF0ZVByb2dyYW0odnNyYywgZnNyYywgJm1QZ20pOwotICAgICAgICAgICAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbVBvc2l0aW9uSGFuZGxlID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihtUGdtLCAidlBvc2l0aW9uIik7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoLTEsIG1Qb3NpdGlvbkhhbmRsZSk7Ci0gICAgICAgIG1UZXhTYW1wbGVySGFuZGxlID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obVBnbSwgInRleFNhbXBsZXIiKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9ORSgtMSwgbVRleFNhbXBsZXJIYW5kbGUpOwotICAgICAgICBtVGV4TWF0cml4SGFuZGxlID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obVBnbSwgInRleE1hdHJpeCIpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgQVNTRVJUX05FKC0xLCBtVGV4TWF0cml4SGFuZGxlKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIG1BTlcuY2xlYXIoKTsKLSAgICAgICAgbVNUQy5jbGVhcigpOwotICAgICAgICBtU1QuY2xlYXIoKTsKLSAgICAgICAgR0xUZXN0OjpUZWFyRG93bigpOwotICAgIH0KLQotICAgIC8vIGRyYXdUZXh0dXJlIGRyYXdzIHRoZSBTdXJmYWNlVGV4dHVyZSBvdmVyIHRoZSBlbnRpcmUgR0wgdmlld3BvcnQuCi0gICAgdm9pZCBkcmF3VGV4dHVyZSgpIHsKLSAgICAgICAgY29uc3QgR0xmbG9hdCB0cmlhbmdsZVZlcnRpY2VzW10gPSB7Ci0gICAgICAgICAgICAtMS4wZiwgMS4wZiwKLSAgICAgICAgICAgIC0xLjBmLCAtMS4wZiwKLSAgICAgICAgICAgIDEuMGYsIC0xLjBmLAotICAgICAgICAgICAgMS4wZiwgMS4wZiwKLSAgICAgICAgfTsKLQotICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobVBvc2l0aW9uSGFuZGxlLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsCi0gICAgICAgICAgICAgICAgdHJpYW5nbGVWZXJ0aWNlcyk7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1Qb3NpdGlvbkhhbmRsZSk7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotCi0gICAgICAgIGdsVXNlUHJvZ3JhbShtUGdtKTsKLSAgICAgICAgZ2xVbmlmb3JtMWkobVRleFNhbXBsZXJIYW5kbGUsIDApOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgVEVYX0lEKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgLy8gWFhYOiBUaGVzZSBjYWxscyBhcmUgbm90IG5lZWRlZCBmb3IgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMgYXMKLSAgICAgICAgLy8gdGhleSdyZSBzZXR0aW5nIHRoZSBkZWZhdXRscyBmb3IgdGhhdCB0YXJnZXQsIGJ1dCB3aGVuIGhhY2tpbmcgdGhpbmdzCi0gICAgICAgIC8vIHRvIHVzZSBHTF9URVhUVVJFXzJEIHRoZXkgYXJlIG5lZWRlZCB0byBhY2hpZXZlIHRoZSBzYW1lIGJlaGF2aW9yLgotICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwKLSAgICAgICAgICAgICAgICBHTF9MSU5FQVIpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX01BR19GSUxURVIsCi0gICAgICAgICAgICAgICAgR0xfTElORUFSKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9XUkFQX1MsCi0gICAgICAgICAgICAgICAgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfV1JBUF9ULAotICAgICAgICAgICAgICAgIEdMX0NMQU1QX1RPX0VER0UpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLQotICAgICAgICBHTGZsb2F0IHRleE1hdHJpeFsxNl07Ci0gICAgICAgIG1TVC0+Z2V0VHJhbnNmb3JtTWF0cml4KHRleE1hdHJpeCk7Ci0gICAgICAgIGdsVW5pZm9ybU1hdHJpeDRmdihtVGV4TWF0cml4SGFuZGxlLCAxLCBHTF9GQUxTRSwgdGV4TWF0cml4KTsKLQotICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgfQotCi0gICAgY2xhc3MgRnJhbWVXYWl0ZXIgOiBwdWJsaWMgU3VyZmFjZVRleHR1cmU6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgRnJhbWVXYWl0ZXIoKToKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0ZyYW1lcygwKSB7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdhaXRGb3JGcmFtZSgpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgICAgICAgICB3aGlsZSAobVBlbmRpbmdGcmFtZXMgPT0gMCkgewotICAgICAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTXV0ZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBlbmRpbmdGcmFtZXMtLTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICAgICAgICAgIG1QZW5kaW5nRnJhbWVzKys7Ci0gICAgICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1QZW5kaW5nRnJhbWVzOwotICAgICAgICBNdXRleCBtTXV0ZXg7Ci0gICAgICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOwotICAgIH07Ci0KLSAgICBzcDxTdXJmYWNlVGV4dHVyZT4gbVNUOwotICAgIHNwPFN1cmZhY2VUZXh0dXJlQ2xpZW50PiBtU1RDOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1BTlc7Ci0KLSAgICBHTHVpbnQgbVBnbTsKLSAgICBHTGludCBtUG9zaXRpb25IYW5kbGU7Ci0gICAgR0xpbnQgbVRleFNhbXBsZXJIYW5kbGU7Ci0gICAgR0xpbnQgbVRleE1hdHJpeEhhbmRsZTsKLX07Ci0KLS8vIEZpbGwgYSBZVjEyIGJ1ZmZlciB3aXRoIGEgbXVsdGktY29sb3JlZCBjaGVja2VyYm9hcmQgcGF0dGVybgotdm9pZCBmaWxsWVYxMkJ1ZmZlcih1aW50OF90KiBidWYsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgewotICAgIGNvbnN0IGludCBibG9ja1dpZHRoID0gdyA+IDE2ID8gdyAvIDE2IDogMTsKLSAgICBjb25zdCBpbnQgYmxvY2tIZWlnaHQgPSBoID4gMTYgPyBoIC8gMTYgOiAxOwotICAgIGNvbnN0IGludCB5dXZUZXhPZmZzZXRZID0gMDsKLSAgICBpbnQgeXV2VGV4U3RyaWRlWSA9IHN0cmlkZTsKLSAgICBpbnQgeXV2VGV4T2Zmc2V0ViA9IHl1dlRleFN0cmlkZVkgKiBoOwotICAgIGludCB5dXZUZXhTdHJpZGVWID0gKHl1dlRleFN0cmlkZVkvMiArIDB4ZikgJiB+MHhmOwotICAgIGludCB5dXZUZXhPZmZzZXRVID0geXV2VGV4T2Zmc2V0ViArIHl1dlRleFN0cmlkZVYgKiBoLzI7Ci0gICAgaW50IHl1dlRleFN0cmlkZVUgPSB5dXZUZXhTdHJpZGVWOwotICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgICAgICBpbnQgcGFyaXR5WCA9ICh4IC8gYmxvY2tXaWR0aCkgJiAxOwotICAgICAgICAgICAgaW50IHBhcml0eVkgPSAoeSAvIGJsb2NrSGVpZ2h0KSAmIDE7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGludGVuc2l0eSA9IChwYXJpdHlYIF4gcGFyaXR5WSkgPyA2MyA6IDE5MTsKLSAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRZICsgKHkgKiB5dXZUZXhTdHJpZGVZKSArIHhdID0gaW50ZW5zaXR5OwotICAgICAgICAgICAgaWYgKHggPCB3IC8gMiAmJiB5IDwgaCAvIDIpIHsKLSAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0VSArICh5ICogeXV2VGV4U3RyaWRlVSkgKyB4XSA9IGludGVuc2l0eTsKLSAgICAgICAgICAgICAgICBpZiAoeCAqIDIgPCB3IC8gMiAmJiB5ICogMiA8IGggLyAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkqMiAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMF0gPQotICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICh5KjIgKiB5dXZUZXhTdHJpZGVWKSArIHgqMiArIDFdID0KLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoKHkqMisxKSAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMF0gPQotICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICgoeSoyKzEpICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnNpdHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBGaWxsIGEgWVYxMiBidWZmZXIgd2l0aCByZWQgb3V0c2lkZSBhIGdpdmVuIHJlY3RhbmdsZSBhbmQgZ3JlZW4gaW5zaWRlIGl0Lgotdm9pZCBmaWxsWVYxMkJ1ZmZlclJlY3QodWludDhfdCogYnVmLCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUsCi0gICAgICAgIGNvbnN0IGFuZHJvaWRfbmF0aXZlX3JlY3RfdCYgcmVjdCkgewotICAgIGNvbnN0IGludCB5dXZUZXhPZmZzZXRZID0gMDsKLSAgICBpbnQgeXV2VGV4U3RyaWRlWSA9IHN0cmlkZTsKLSAgICBpbnQgeXV2VGV4T2Zmc2V0ViA9IHl1dlRleFN0cmlkZVkgKiBoOwotICAgIGludCB5dXZUZXhTdHJpZGVWID0gKHl1dlRleFN0cmlkZVkvMiArIDB4ZikgJiB+MHhmOwotICAgIGludCB5dXZUZXhPZmZzZXRVID0geXV2VGV4T2Zmc2V0ViArIHl1dlRleFN0cmlkZVYgKiBoLzI7Ci0gICAgaW50IHl1dlRleFN0cmlkZVUgPSB5dXZUZXhTdHJpZGVWOwotICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgICAgICBib29sIGluc2lkZSA9IHJlY3QubGVmdCA8PSB4ICYmIHggPCByZWN0LnJpZ2h0ICYmCi0gICAgICAgICAgICAgICAgICAgIHJlY3QudG9wIDw9IHkgJiYgeSA8IHJlY3QuYm90dG9tOwotICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFkgKyAoeSAqIHl1dlRleFN0cmlkZVkpICsgeF0gPSBpbnNpZGUgPyAyNDAgOiA2NDsKLSAgICAgICAgICAgIGlmICh4IDwgdyAvIDIgJiYgeSA8IGggLyAyKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpbnNpZGUgPSByZWN0LmxlZnQgPD0gMip4ICYmIDIqeCA8IHJlY3QucmlnaHQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wIDw9IDIqeSAmJiAyKnkgPCByZWN0LmJvdHRvbTsKLSAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0VSArICh5ICogeXV2VGV4U3RyaWRlVSkgKyB4XSA9IDE2OwotICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkgKiB5dXZUZXhTdHJpZGVWKSArIHhdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZSA/IDE2IDogMjU1OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIGZpbGxSR0JBOEJ1ZmZlcih1aW50OF90KiBidWYsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgewotICAgIGNvbnN0IHNpemVfdCBQSVhFTF9TSVpFID0gNDsKLSAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgewotICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgewotICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0ID0gKHkgKiBzdHJpZGUgKyB4KSAqIFBJWEVMX1NJWkU7Ci0gICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IDQ7IGMrKykgewotICAgICAgICAgICAgICAgIGludCBwYXJpdHlYID0gKHggLyAoMSA8PCAoYysyKSkpICYgMTsKLSAgICAgICAgICAgICAgICBpbnQgcGFyaXR5WSA9ICh5IC8gKDEgPDwgKGMrMikpKSAmIDE7Ci0gICAgICAgICAgICAgICAgYnVmW29mZnNldCArIGNdID0gKHBhcml0eVggXiBwYXJpdHlZKSA/IDIzMSA6IDM1OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIGZpbGxSR0JBOEJ1ZmZlclNvbGlkKHVpbnQ4X3QqIGJ1ZiwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlLCB1aW50OF90IHIsCi0gICAgICAgIHVpbnQ4X3QgZywgdWludDhfdCBiLCB1aW50OF90IGEpIHsKLSAgICBjb25zdCBzaXplX3QgUElYRUxfU0laRSA9IDQ7Ci0gICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBoOyB4KyspIHsKLSAgICAgICAgICAgIG9mZl90IG9mZnNldCA9ICh5ICogc3RyaWRlICsgeCkgKiBQSVhFTF9TSVpFOwotICAgICAgICAgICAgYnVmW29mZnNldCArIDBdID0gcjsKLSAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyAxXSA9IGc7Ci0gICAgICAgICAgICBidWZbb2Zmc2V0ICsgMl0gPSBiOwotICAgICAgICAgICAgYnVmW29mZnNldCArIDNdID0gYTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUZXN0LCBUZXh0dXJpbmdGcm9tQ3B1RmlsbGVkWVYxMkJ1ZmZlck5wb3QpIHsKLSAgICBjb25zdCBpbnQgdGV4V2lkdGggPSA2NDsKLSAgICBjb25zdCBpbnQgdGV4SGVpZ2h0ID0gNjY7Ci0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIHRleFdpZHRoLCB0ZXhIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pKTsKLQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmFuYikpOwotICAgIEFTU0VSVF9UUlVFKGFuYiAhPSBOVUxMKTsKLQotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5sb2NrQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhIGNoZWNrZXJib2FyZCBwYXR0ZXJuCi0gICAgdWludDhfdCogaW1nID0gTlVMTDsKLSAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgIGZpbGxZVjEyQnVmZmVyKGltZywgdGV4V2lkdGgsIHRleEhlaWdodCwgYnVmLT5nZXRTdHJpZGUoKSk7Ci0gICAgYnVmLT51bmxvY2soKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLQotICAgIGdsQ2xlYXJDb2xvcigwLjIsIDAuMiwgMC4yLCAwLjIpOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICBnbFZpZXdwb3J0KDAsIDAsIHRleFdpZHRoLCB0ZXhIZWlnaHQpOwotICAgIGRyYXdUZXh0dXJlKCk7Ci0KLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAwLCAgMCwgMjU1LCAxMjcsIDI1NSwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgIDAsICAgMCwgMTMzLCAgIDAsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNjMsIDY1LCAgIDAsIDEzMywgICAwLCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAwLCA2NSwgMjU1LCAxMjcsIDI1NSwgMjU1KSk7Ci0KLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDIyLCA0NCwgMjU1LCAxMjcsIDI1NSwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0NSwgNTIsIDI1NSwgMTI3LCAyNTUsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNTIsIDUxLCAgOTgsIDI1NSwgIDczLCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCA3LCAzMSwgMTU1LCAgIDAsIDExOCwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzMSwgIDksIDEwNywgIDI0LCAgODcsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjksIDM1LCAyNTUsIDEyNywgMjU1LCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDM2LCAyMiwgMTU1LCAgMjksICAgMCwgMjU1KSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVGVzdCwgVGV4dHVyaW5nRnJvbUNwdUZpbGxlZFlWMTJCdWZmZXJQb3cyKSB7Ci0gICAgY29uc3QgaW50IHRleFdpZHRoID0gNjQ7Ci0gICAgY29uc3QgaW50IHRleEhlaWdodCA9IDY0OwotCi0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksCi0gICAgICAgICAgICB0ZXhXaWR0aCwgdGV4SGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIpKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKG1BTlcuZ2V0KCksCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKSk7Ci0KLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICBBU1NFUlRfVFJVRShhbmIgIT0gTlVMTCk7Ci0KLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYobmV3IEdyYXBoaWNCdWZmZXIoYW5iLCBmYWxzZSkpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+bG9ja0J1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7Ci0KLSAgICAvLyBGaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgYSBjaGVja2VyYm9hcmQgcGF0dGVybgotICAgIHVpbnQ4X3QqIGltZyA9IE5VTEw7Ci0gICAgYnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICh2b2lkKiopKCZpbWcpKTsKLSAgICBmaWxsWVYxMkJ1ZmZlcihpbWcsIHRleFdpZHRoLCB0ZXhIZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCkpOwotICAgIGJ1Zi0+dW5sb2NrKCk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7Ci0KLSAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0KLSAgICBnbENsZWFyQ29sb3IoMC4yLCAwLjIsIDAuMiwgMC4yKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgZ2xWaWV3cG9ydCgwLCAwLCB0ZXhXaWR0aCwgdGV4SGVpZ2h0KTsKLSAgICBkcmF3VGV4dHVyZSgpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgIDAsICAgMCwgMTMzLCAgIDAsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNjMsICAwLCAyNTUsIDEyNywgMjU1LCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCA2MywgICAwLCAxMzMsICAgMCwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgNjMsIDI1NSwgMTI3LCAyNTUsIDI1NSkpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgyMiwgMTksIDEwMCwgMjU1LCAgNzQsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDUsIDExLCAxMDAsIDI1NSwgIDc0LCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDUyLCAxMiwgMTU1LCAgIDAsIDE4MSwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggNywgMzIsIDE1MCwgMjM3LCAxNzAsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzEsIDU0LCAgIDAsICA3MSwgMTE3LCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDI5LCAyOCwgICAwLCAxMzMsICAgMCwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzNiwgNDEsIDEwMCwgMjMyLCAyNTUsIDI1NSkpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVHTFRlc3QsIFRleHR1cmluZ0Zyb21DcHVGaWxsZWRZVjEyQnVmZmVyV2l0aENyb3ApIHsKLSAgICBjb25zdCBpbnQgdGV4V2lkdGggPSA2NDsKLSAgICBjb25zdCBpbnQgdGV4SGVpZ2h0ID0gNjY7Ci0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIHRleFdpZHRoLCB0ZXhIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pKTsKLQotICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBjcm9wc1tdID0gewotICAgICAgICB7NCwgNiwgMjIsIDM2fSwKLSAgICAgICAgezAsIDYsIDIyLCAzNn0sCi0gICAgICAgIHs0LCAwLCAyMiwgMzZ9LAotICAgICAgICB7NCwgNiwgdGV4V2lkdGgsIDM2fSwKLSAgICAgICAgezQsIDYsIDIyLCB0ZXhIZWlnaHR9LAotICAgIH07Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICBjb25zdCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QmIGNyb3AoY3JvcHNbaV0pOwotICAgICAgICBTQ09QRURfVFJBQ0UoU3RyaW5nODo6Zm9ybWF0KCJyZWN0eyBsOiAlZCB0OiAlZCByOiAlZCBiOiAlZCB9IiwKLSAgICAgICAgICAgICAgICBjcm9wLmxlZnQsIGNyb3AudG9wLCBjcm9wLnJpZ2h0LCBjcm9wLmJvdHRvbSkuc3RyaW5nKCkpOwotCi0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfY3JvcChtQU5XLmdldCgpLCAmY3JvcCkpOwotCi0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICAgICAgQVNTRVJUX1RSVUUoYW5iICE9IE5VTEwpOwotCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+bG9ja0J1ZmZlcihtQU5XLmdldCgpLAotICAgICAgICAgICAgICAgIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgICAgICB1aW50OF90KiBpbWcgPSBOVUxMOwotICAgICAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgICAgICBmaWxsWVYxMkJ1ZmZlclJlY3QoaW1nLCB0ZXhXaWR0aCwgdGV4SGVpZ2h0LCBidWYtPmdldFN0cmlkZSgpLCBjcm9wKTsKLSAgICAgICAgYnVmLT51bmxvY2soKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLAotICAgICAgICAgICAgICAgIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgICAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0KLSAgICAgICAgZ2xDbGVhckNvbG9yKDAuMiwgMC4yLCAwLjIsIDAuMik7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICAgICAgZ2xWaWV3cG9ydCgwLCAwLCA2NCwgNjQpOwotICAgICAgICBkcmF3VGV4dHVyZSgpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsICAwLCAgODIsIDI1NSwgIDM1LCAyNTUpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgIDAsICA4MiwgMjU1LCAgMzUsIDI1NSkpOwotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCA2MywgIDgyLCAyNTUsICAzNSwgMjU1KSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsIDYzLCAgODIsIDI1NSwgIDM1LCAyNTUpKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDI1LCAxNCwgIDgyLCAyNTUsICAzNSwgMjU1KSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzUsIDMxLCAgODIsIDI1NSwgIDM1LCAyNTUpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg1NywgIDYsICA4MiwgMjU1LCAgMzUsIDI1NSkpOwotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCA1LCA0MiwgIDgyLCAyNTUsICAzNSwgMjU1KSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzIsIDMzLCAgODIsIDI1NSwgIDM1LCAyNTUpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxNiwgMjYsICA4MiwgMjU1LCAgMzUsIDI1NSkpOwotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQ2LCA1MSwgIDgyLCAyNTUsICAzNSwgMjU1KSk7Ci0gICAgfQotfQotCi0vLyBUaGlzIHRlc3QgaXMgaW50ZW5kZWQgdG8gY2F0Y2ggc3luY2hyb25pemF0aW9uIGJ1Z3MgYmV0d2VlbiB0aGUgQ1BVLXdyaXR0ZW4KLS8vIGFuZCBHUFUtcmVhZCBidWZmZXJzLgotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUZXN0LCBUZXh0dXJpbmdGcm9tQ3B1RmlsbGVkWVYxMkJ1ZmZlcnNSZXBlYXRlZGx5KSB7Ci0gICAgZW51bSB7IHRleFdpZHRoID0gMTYgfTsKLSAgICBlbnVtIHsgdGV4SGVpZ2h0ID0gMTYgfTsKLSAgICBlbnVtIHsgbnVtRnJhbWVzID0gMTAyNCB9OwotCi0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU1QtPnNldEJ1ZmZlckNvdW50U2VydmVyKDIpKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIHRleFdpZHRoLCB0ZXhIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pKTsKLQotICAgIHN0cnVjdCBUZXN0UGl4ZWwgewotICAgICAgICBpbnQgeDsKLSAgICAgICAgaW50IHk7Ci0gICAgfTsKLSAgICBjb25zdCBUZXN0UGl4ZWwgdGVzdFBpeGVsc1tdID0gewotICAgICAgICB7ICA0LCAxMSB9LAotICAgICAgICB7IDEyLCAxNCB9LAotICAgICAgICB7ICA3LCAgMiB9LAotICAgIH07Ci0gICAgZW51bSB7bnVtVGVzdFBpeGVscyA9IHNpemVvZih0ZXN0UGl4ZWxzKSAvIHNpemVvZih0ZXN0UGl4ZWxzWzBdKX07Ci0KLSAgICBjbGFzcyBQcm9kdWNlclRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIHB1YmxpYzoKLSAgICAgICAgUHJvZHVjZXJUaHJlYWQoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIGFudywKLSAgICAgICAgICAgICAgICBjb25zdCBUZXN0UGl4ZWwqIHRlc3RQaXhlbHMpOgotICAgICAgICAgICAgICAgIG1BTlcoYW53KSwKLSAgICAgICAgICAgICAgICBtVGVzdFBpeGVscyh0ZXN0UGl4ZWxzKSB7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIH5Qcm9kdWNlclRocmVhZCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKLSAgICAgICAgICAgICAgICBpZiAobUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYW5iKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhbmIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmKG5ldyBHcmFwaGljQnVmZmVyKGFuYiwgZmFsc2UpKTsKLSAgICAgICAgICAgICAgICBpZiAobUFOVy0+bG9ja0J1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnN0IGludCB5dXZUZXhPZmZzZXRZID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgc3RyaWRlID0gYnVmLT5nZXRTdHJpZGUoKTsKLSAgICAgICAgICAgICAgICBpbnQgeXV2VGV4U3RyaWRlWSA9IHN0cmlkZTsKLSAgICAgICAgICAgICAgICBpbnQgeXV2VGV4T2Zmc2V0ViA9IHl1dlRleFN0cmlkZVkgKiB0ZXhIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaW50IHl1dlRleFN0cmlkZVYgPSAoeXV2VGV4U3RyaWRlWS8yICsgMHhmKSAmIH4weGY7Ci0gICAgICAgICAgICAgICAgaW50IHl1dlRleE9mZnNldFUgPSB5dXZUZXhPZmZzZXRWICsgeXV2VGV4U3RyaWRlViAqIHRleEhlaWdodC8yOwotICAgICAgICAgICAgICAgIGludCB5dXZUZXhTdHJpZGVVID0geXV2VGV4U3RyaWRlVjsKLQotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGltZyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICh2b2lkKiopKCZpbWcpKTsKLQotICAgICAgICAgICAgICAgIC8vIEdyYXkgb3V0IGFsbCB0aGUgdGVzdCBwaXhlbHMgZmlyc3QsIHNvIHdlJ3JlIG1vcmUgbGlrZWx5IHRvCi0gICAgICAgICAgICAgICAgLy8gc2VlIGEgZmFpbHVyZSBpZiBHTCBpcyBzdGlsbCB0ZXh0dXJpbmcgZnJvbSB0aGUgYnVmZmVyIHdlCi0gICAgICAgICAgICAgICAgLy8ganVzdCBkZXF1ZXVlZC4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bVRlc3RQaXhlbHM7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IG1UZXN0UGl4ZWxzW2pdLng7Ci0gICAgICAgICAgICAgICAgICAgIGludCB5ID0gbVRlc3RQaXhlbHNbal0ueTsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2YWx1ZSA9IDEyODsKLSAgICAgICAgICAgICAgICAgICAgaW1nW3kqc3RyaWRlICsgeF0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBGaWxsIHRoZSBidWZmZXIgd2l0aCBncmF5LgotICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgdGV4SGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB0ZXhXaWR0aDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbWdbeXV2VGV4T2Zmc2V0WSArIHkqeXV2VGV4U3RyaWRlWSArIHhdID0gMTI4OwotICAgICAgICAgICAgICAgICAgICAgICAgaW1nW3l1dlRleE9mZnNldFUgKyAoeS8yKSp5dXZUZXhTdHJpZGVVICsgeC8yXSA9IDEyODsKLSAgICAgICAgICAgICAgICAgICAgICAgIGltZ1t5dXZUZXhPZmZzZXRWICsgKHkvMikqeXV2VGV4U3RyaWRlViArIHgvMl0gPSAxMjg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHRlc3QgcGl4ZWxzIHRvIGVpdGhlciB3aGl0ZSBvciBibGFjay4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bVRlc3RQaXhlbHM7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IG1UZXN0UGl4ZWxzW2pdLng7Ci0gICAgICAgICAgICAgICAgICAgIGludCB5ID0gbVRlc3RQaXhlbHNbal0ueTsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2YWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqID09IChpICUgbnVtVGVzdFBpeGVscykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMjU1OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGltZ1t5KnN0cmlkZSArIHhdID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnVmLT51bmxvY2soKTsKLSAgICAgICAgICAgICAgICBpZiAobUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBtQU5XOwotICAgICAgICBjb25zdCBUZXN0UGl4ZWwqIG1UZXN0UGl4ZWxzOwotICAgIH07Ci0KLSAgICBzcDxGcmFtZVdhaXRlcj4gZncobmV3IEZyYW1lV2FpdGVyKTsKLSAgICBtU1QtPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIoZncpOwotCi0gICAgc3A8VGhyZWFkPiBwdChuZXcgUHJvZHVjZXJUaHJlYWQobUFOVywgdGVzdFBpeGVscykpOwotICAgIHB0LT5ydW4oKTsKLQotICAgIGdsVmlld3BvcnQoMCwgMCwgdGV4V2lkdGgsIHRleEhlaWdodCk7Ci0KLSAgICBnbENsZWFyQ29sb3IoMC4yLCAwLjIsIDAuMiwgMC4yKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgLy8gV2Ugd2FpdCBmb3IgdGhlIGZpcnN0IHR3byBmcmFtZXMgdXAgZnJvbnQgc28gdGhhdCB0aGUgcHJvZHVjZXIgd2lsbCBiZQotICAgIC8vIGxpa2VseSB0byBkZXF1ZXVlIHRoZSBidWZmZXIgdGhhdCdzIGN1cnJlbnRseSBiZWluZyB0ZXh0dXJlZCBmcm9tLgotICAgIGZ3LT53YWl0Rm9yRnJhbWUoKTsKLSAgICBmdy0+d2FpdEZvckZyYW1lKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShTdHJpbmc4Ojpmb3JtYXQoImZyYW1lICVkIiwgaSkuc3RyaW5nKCkpOwotCi0gICAgICAgIC8vIFdlIG11c3Qgd2FpdCBmb3IgZWFjaCBmcmFtZSB0byBjb21lIGluIGJlY2F1c2UgaWYgd2UgZXZlciBkbyBhbgotICAgICAgICAvLyB1cGRhdGVUZXhJbWFnZSBjYWxsIHRoYXQgZG9lc24ndCBjb25zdW1lIGEgbmV3bHkgYXZhaWxhYmxlIGJ1ZmZlcgotICAgICAgICAvLyB0aGVuIHRoZSBwcm9kdWNlciBhbmQgY29uc3VtZXIgd2lsbCBnZXQgb3V0IG9mIHN5bmMsIHdoaWNoIHdpbGwgY2F1c2UKLSAgICAgICAgLy8gYSBkZWFkbG9jay4KLSAgICAgICAgaWYgKGkgPiAxKSB7Ci0gICAgICAgICAgICBmdy0+d2FpdEZvckZyYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotICAgICAgICBkcmF3VGV4dHVyZSgpOwotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtVGVzdFBpeGVsczsgaisrKSB7Ci0gICAgICAgICAgICBpbnQgeCA9IHRlc3RQaXhlbHNbal0ueDsKLSAgICAgICAgICAgIGludCB5ID0gdGVzdFBpeGVsc1tqXS55OwotICAgICAgICAgICAgdWludDhfdCB2YWx1ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoaiA9PSAoaSAlIG51bVRlc3RQaXhlbHMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbXVzdCB5LWludmVydCB0aGUgdGV4dHVyZSBjb29yZHMKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKHgsIHRleEhlaWdodC15LTEsIDI1NSwgMjU1LCAyNTUsIDI1NSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHktaW52ZXJ0IHRoZSB0ZXh0dXJlIGNvb3JkcwotICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoeCwgdGV4SGVpZ2h0LXktMSwgMCwgMCwgMCwgMjU1KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVGVzdCwgVGV4dHVyaW5nRnJvbUNwdUZpbGxlZFJHQkFCdWZmZXJOcG90KSB7Ci0gICAgY29uc3QgaW50IHRleFdpZHRoID0gNjQ7Ci0gICAgY29uc3QgaW50IHRleEhlaWdodCA9IDY2OwotCi0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksCi0gICAgICAgICAgICB0ZXhXaWR0aCwgdGV4SGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCkpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pKTsKLQotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBhbmI7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICBBU1NFUlRfVFJVRShhbmIgIT0gTlVMTCk7Ci0KLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYobmV3IEdyYXBoaWNCdWZmZXIoYW5iLCBmYWxzZSkpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+bG9ja0J1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7Ci0KLSAgICAvLyBGaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgYSBjaGVja2VyYm9hcmQgcGF0dGVybgotICAgIHVpbnQ4X3QqIGltZyA9IE5VTEw7Ci0gICAgYnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICh2b2lkKiopKCZpbWcpKTsKLSAgICBmaWxsUkdCQThCdWZmZXIoaW1nLCB0ZXhXaWR0aCwgdGV4SGVpZ2h0LCBidWYtPmdldFN0cmlkZSgpKTsKLSAgICBidWYtPnVubG9jaygpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSkpOwotCi0gICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotCi0gICAgZ2xDbGVhckNvbG9yKDAuMiwgMC4yLCAwLjIsIDAuMik7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsVmlld3BvcnQoMCwgMCwgdGV4V2lkdGgsIHRleEhlaWdodCk7Ci0gICAgZHJhd1RleHR1cmUoKTsKLQotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsICAwLCAgMzUsICAzNSwgIDM1LCAgMzUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCAgMCwgMjMxLCAyMzEsIDIzMSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgNjUsIDIzMSwgMjMxLCAyMzEsIDIzMSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsIDY1LCAgMzUsICAzNSwgIDM1LCAgMzUpKTsKLQotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTUsIDEwLCAgMzUsIDIzMSwgMjMxLCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDIzLCA2NSwgMjMxLCAgMzUsIDIzMSwgIDM1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxOSwgNDAsICAzNSwgMjMxLCAgMzUsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzgsIDMwLCAyMzEsICAzNSwgIDM1LCAgMzUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQyLCA1NCwgIDM1LCAgMzUsICAzNSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzNywgMzQsICAzNSwgMjMxLCAyMzEsIDIzMSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzEsICA4LCAyMzEsICAzNSwgIDM1LCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDM3LCA0NywgMjMxLCAgMzUsIDIzMSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgyNSwgMzgsICAzNSwgIDM1LCAgMzUsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDksICA2LCAgMzUsIDIzMSwgIDM1LCAgMzUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDU0LCA1MCwgIDM1LCAyMzEsIDIzMSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgyNywgMjYsIDIzMSwgMjMxLCAyMzEsIDIzMSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTAsICA2LCAgMzUsICAzNSwgMjMxLCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDI5LCAgNCwgIDM1LCAgMzUsICAzNSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg1NSwgMjgsICAzNSwgIDM1LCAyMzEsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNTgsIDU1LCAgMzUsICAzNSwgMjMxLCAyMzEpKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUZXN0LCBUZXh0dXJpbmdGcm9tQ3B1RmlsbGVkUkdCQUJ1ZmZlclBvdzIpIHsKLSAgICBjb25zdCBpbnQgdGV4V2lkdGggPSA2NDsKLSAgICBjb25zdCBpbnQgdGV4SGVpZ2h0ID0gNjQ7Ci0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIHRleFdpZHRoLCB0ZXhIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4KSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQU5XLmdldCgpLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTikpOwotCi0gICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGFuYjsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmFuYikpOwotICAgIEFTU0VSVF9UUlVFKGFuYiAhPSBOVUxMKTsKLQotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5sb2NrQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhIGNoZWNrZXJib2FyZCBwYXR0ZXJuCi0gICAgdWludDhfdCogaW1nID0gTlVMTDsKLSAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgIGZpbGxSR0JBOEJ1ZmZlcihpbWcsIHRleFdpZHRoLCB0ZXhIZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCkpOwotICAgIGJ1Zi0+dW5sb2NrKCk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7Ci0KLSAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0KLSAgICBnbENsZWFyQ29sb3IoMC4yLCAwLjIsIDAuMiwgMC4yKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgZ2xWaWV3cG9ydCgwLCAwLCB0ZXhXaWR0aCwgdGV4SGVpZ2h0KTsKLSAgICBkcmF3VGV4dHVyZSgpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgIDAsIDIzMSwgMjMxLCAyMzEsIDIzMSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNjMsICAwLCAgMzUsICAzNSwgIDM1LCAgMzUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCA2MywgMjMxLCAyMzEsIDIzMSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgNjMsICAzNSwgIDM1LCAgMzUsICAzNSkpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxMiwgNDYsIDIzMSwgMjMxLCAyMzEsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTYsICAxLCAyMzEsIDIzMSwgIDM1LCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDIxLCAxMiwgMjMxLCAgMzUsICAzNSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgyNiwgNTEsIDIzMSwgIDM1LCAyMzEsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDUsIDMyLCAgMzUsIDIzMSwgMjMxLCAgMzUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDEzLCAgOCwgIDM1LCAyMzEsIDIzMSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0NiwgIDMsICAzNSwgIDM1LCAyMzEsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzAsIDMzLCAgMzUsICAzNSwgIDM1LCAgMzUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCA2LCA1MiwgMjMxLCAyMzEsICAzNSwgIDM1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg1NSwgMzMsICAzNSwgMjMxLCAgMzUsIDIzMSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTYsIDI5LCAgMzUsICAzNSwgMjMxLCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAxLCAzMCwgIDM1LCAgMzUsICAzNSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0MSwgMzcsICAzNSwgIDM1LCAyMzEsIDIzMSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDYsIDI5LCAyMzEsIDIzMSwgIDM1LCAgMzUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDE1LCAyNSwgIDM1LCAyMzEsICAzNSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMywgNTIsICAzNSwgMjMxLCAgMzUsICAzNSkpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVHTFRlc3QsIEFiYW5kb25VbmJsb2Nrc0RlcXVldWVCdWZmZXIpIHsKLSAgICBjbGFzcyBQcm9kdWNlclRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIHB1YmxpYzoKLSAgICAgICAgUHJvZHVjZXJUaHJlYWQoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIGFudyk6Ci0gICAgICAgICAgICAgICAgbUFOVyhhbncpLAotICAgICAgICAgICAgICAgIG1EZXF1ZXVlRXJyb3IoTk9fRVJST1IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgflByb2R1Y2VyVGhyZWFkKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwotCi0gICAgICAgICAgICAvLyBGcmFtZSAxCi0gICAgICAgICAgICBpZiAobUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYW5iKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhbmIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBhbmIpCi0gICAgICAgICAgICAgICAgICAgICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGcmFtZSAyCi0gICAgICAgICAgICBpZiAobUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYW5iKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhbmIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBhbmIpCi0gICAgICAgICAgICAgICAgICAgICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGcmFtZSAzIC0gZXJyb3IgZXhwZWN0ZWQKLSAgICAgICAgICAgIG1EZXF1ZXVlRXJyb3IgPSBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3QgZ2V0RGVxdWV1ZUVycm9yKCkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICAgICAgICAgIHJldHVybiBtRGVxdWV1ZUVycm9yOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBtQU5XOwotICAgICAgICBzdGF0dXNfdCBtRGVxdWV1ZUVycm9yOwotICAgICAgICBNdXRleCBtTXV0ZXg7Ci0gICAgfTsKLQotICAgIHNwPEZyYW1lV2FpdGVyPiBmdyhuZXcgRnJhbWVXYWl0ZXIpOwotICAgIG1TVC0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihmdyk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldEJ1ZmZlckNvdW50U2VydmVyKDIpKTsKLQotICAgIHNwPFRocmVhZD4gcHQobmV3IFByb2R1Y2VyVGhyZWFkKG1BTlcpKTsKLSAgICBwdC0+cnVuKCk7Ci0KLSAgICBmdy0+d2FpdEZvckZyYW1lKCk7Ci0gICAgZnctPndhaXRGb3JGcmFtZSgpOwotCi0gICAgLy8gU2xlZXAgZm9yIDEwMG1zIHRvIGFsbG93IHRoZSBwcm9kdWNlciB0aHJlYWQncyBkZXF1ZXVlQnVmZmVyIGNhbGwgdG8KLSAgICAvLyBibG9jayB3YWl0aW5nIGZvciBhIGJ1ZmZlciB0byBiZWNvbWUgYXZhaWxhYmxlLgotICAgIHVzbGVlcCgxMDAwMDApOwotCi0gICAgbVNULT5hYmFuZG9uKCk7Ci0KLSAgICBwdC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci0gICAgQVNTRVJUX0VRKE5PX0lOSVQsCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PFByb2R1Y2VyVGhyZWFkKj4ocHQuZ2V0KCkpLT5nZXREZXF1ZXVlRXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVGVzdCwgSW52YWxpZFdpZHRoT3JIZWlnaHRGYWlscykgewotICAgIGludCB0ZXhIZWlnaHQgPSAxNjsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7Ci0KLSAgICBHTGludCBtYXhUZXh0dXJlU2l6ZTsKLSAgICBnbEdldEludGVnZXJ2KEdMX01BWF9URVhUVVJFX1NJWkUsICZtYXhUZXh0dXJlU2l6ZSk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgaXQgd29ya3Mgd2l0aCBzbWFsbCB0ZXh0dXJlcwotICAgIG1TVC0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoMTYsIHRleEhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKE5PX0VSUk9SLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICBFWFBFQ1RfRVEoMTYsIGFuYi0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSh0ZXhIZWlnaHQsIGFuYi0+aGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGFuYikpOwotICAgIEVYUEVDVF9FUShOT19FUlJPUiwgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLQotICAgIC8vIG1ha2Ugc3VyZSBpdCB3b3JrcyB3aXRoIEdMX01BWF9URVhUVVJFX1NJWkUKLSAgICBtU1QtPnNldERlZmF1bHRCdWZmZXJTaXplKG1heFRleHR1cmVTaXplLCB0ZXhIZWlnaHQpOwotICAgIEVYUEVDVF9FUShOT19FUlJPUiwgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYW5iKSk7Ci0gICAgRVhQRUNUX0VRKG1heFRleHR1cmVTaXplLCBhbmItPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEodGV4SGVpZ2h0LCBhbmItPmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBhbmIpKTsKLSAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgaXQgZmFpbHMgd2l0aCBHTF9NQVhfVEVYVFVSRV9TSVpFKzEKLSAgICBtU1QtPnNldERlZmF1bHRCdWZmZXJTaXplKG1heFRleHR1cmVTaXplKzEsIHRleEhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKE5PX0VSUk9SLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICBFWFBFQ1RfRVEobWF4VGV4dHVyZVNpemUrMSwgYW5iLT53aWR0aCk7Ci0gICAgRVhQRUNUX0VRKHRleEhlaWdodCwgYW5iLT5oZWlnaHQpOwotICAgIEVYUEVDVF9FUShOT19FUlJPUiwgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYW5iKSk7Ci0gICAgQVNTRVJUX05FKE5PX0VSUk9SLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotfQotCi0vKgotICogVGhpcyB0ZXN0IGZpeHR1cmUgaXMgZm9yIHRlc3RpbmcgR0wgLT4gR0wgdGV4dHVyZSBzdHJlYW1pbmcuICBJdCBjcmVhdGVzIGFuCi0gKiBFR0xTdXJmYWNlIGFuZCBhbiBFR0xDb250ZXh0IGZvciB0aGUgaW1hZ2UgcHJvZHVjZXIgdG8gdXNlLgotICovCi1jbGFzcyBTdXJmYWNlVGV4dHVyZUdMVG9HTFRlc3QgOiBwdWJsaWMgU3VyZmFjZVRleHR1cmVHTFRlc3QgewotcHJvdGVjdGVkOgotICAgIFN1cmZhY2VUZXh0dXJlR0xUb0dMVGVzdCgpOgotICAgICAgICAgICAgbVByb2R1Y2VyRWdsU3VyZmFjZShFR0xfTk9fU1VSRkFDRSksCi0gICAgICAgICAgICBtUHJvZHVjZXJFZ2xDb250ZXh0KEVHTF9OT19DT05URVhUKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBTdXJmYWNlVGV4dHVyZUdMVGVzdDo6U2V0VXAoKTsKLQotICAgICAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07Ci0gICAgICAgIEVHTGludCBudW1Db25maWdzID0gMDsKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsQ2hvb3NlQ29uZmlnKG1FZ2xEaXNwbGF5LCBnZXRDb25maWdBdHRyaWJzKCksICZteUNvbmZpZywKLSAgICAgICAgICAgICAgICAxLCAmbnVtQ29uZmlncykpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgICAgIG1Qcm9kdWNlckVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LCBteUNvbmZpZywKLSAgICAgICAgICAgICAgICBtQU5XLmdldCgpLCBOVUxMKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgQVNTRVJUX05FKEVHTF9OT19TVVJGQUNFLCBtUHJvZHVjZXJFZ2xTdXJmYWNlKTsKLQotICAgICAgICBtUHJvZHVjZXJFZ2xDb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChtRWdsRGlzcGxheSwgbXlDb25maWcsCi0gICAgICAgICAgICAgICAgRUdMX05PX0NPTlRFWFQsIGdldENvbnRleHRBdHRyaWJzKCkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX0NPTlRFWFQsIG1Qcm9kdWNlckVnbENvbnRleHQpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgaWYgKG1Qcm9kdWNlckVnbENvbnRleHQgIT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgICAgIGVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtUHJvZHVjZXJFZ2xDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb2R1Y2VyRWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICAgICAgZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1Qcm9kdWNlckVnbFN1cmZhY2UpOwotICAgICAgICB9Ci0gICAgICAgIFN1cmZhY2VUZXh0dXJlR0xUZXN0OjpUZWFyRG93bigpOwotICAgIH0KLQotICAgIEVHTFN1cmZhY2UgbVByb2R1Y2VyRWdsU3VyZmFjZTsKLSAgICBFR0xDb250ZXh0IG1Qcm9kdWNlckVnbENvbnRleHQ7Ci19OwotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVHTFRvR0xUZXN0LCBUZXh0dXJpbmdGcm9tR0xGaWxsZWRSR0JBQnVmZmVyUG93MikgewotICAgIGNvbnN0IGludCB0ZXhXaWR0aCA9IDY0OwotICAgIGNvbnN0IGludCB0ZXhIZWlnaHQgPSA2NDsKLQotICAgIG1TVC0+c2V0RGVmYXVsdEJ1ZmZlclNpemUodGV4V2lkdGgsIHRleEhlaWdodCk7Ci0KLSAgICAvLyBEbyB0aGUgcHJvZHVjZXIgc2lkZSBvZiB0aGluZ3MKLSAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSwKLSAgICAgICAgICAgIG1Qcm9kdWNlckVnbFN1cmZhY2UsIG1Qcm9kdWNlckVnbENvbnRleHQpKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gZW5zdXJlIHdlIHBpY2sgdXAgYSBidWZmZXIgb2YgdGhlIGNvcnJlY3Qgc2l6ZS4KLSAgICBlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSk7Ci0KLSAgICBnbENsZWFyQ29sb3IoMC42LCAwLjYsIDAuNiwgMC42KTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBnbFNjaXNzb3IoNCwgNCwgNCwgNCk7Ci0gICAgZ2xDbGVhckNvbG9yKDEuMCwgMC4wLCAwLjAsIDEuMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsU2Npc3NvcigyNCwgNDgsIDQsIDQpOwotICAgIGdsQ2xlYXJDb2xvcigwLjAsIDEuMCwgMC4wLCAxLjApOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICBnbFNjaXNzb3IoMzcsIDE3LCA0LCA0KTsKLSAgICBnbENsZWFyQ29sb3IoMC4wLCAwLjAsIDEuMCwgMS4wKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1Qcm9kdWNlckVnbFN1cmZhY2UpOwotCi0gICAgLy8gRG8gdGhlIGNvbnN1bWVyIHNpZGUgb2YgdGhpbmdzCi0gICAgRVhQRUNUX1RSVUUoZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwKLSAgICAgICAgICAgIG1FZ2xDb250ZXh0KSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLQotICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotCi0gICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOyAvLyBTa2lwIHRoZSBmaXJzdCBmcmFtZSwgd2hpY2ggd2FzIGVtcHR5Ci0gICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotCi0gICAgZ2xDbGVhckNvbG9yKDAuMiwgMC4yLCAwLjIsIDAuMik7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsVmlld3BvcnQoMCwgMCwgdGV4V2lkdGgsIHRleEhlaWdodCk7Ci0gICAgZHJhd1RleHR1cmUoKTsKLQotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsICAwLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCAgMCwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgNjMsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsIDYzLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLQotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDQsICA3LCAyNTUsICAgMCwgICAwLCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDI1LCA1MSwgICAwLCAyNTUsICAgMCwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0MCwgMTksICAgMCwgICAwLCAyNTUsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjksIDUxLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCA1LCAzMiwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxMywgIDgsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDYsICAzLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDMwLCAzMywgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggNiwgNTIsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNTUsIDMzLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDE2LCAyOSwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMSwgMzAsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDEsIDM3LCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQ2LCAyOSwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxNSwgMjUsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDMsIDUyLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUb0dMVGVzdCwgRWdsRGVzdHJveVN1cmZhY2VVbnJlZnNCdWZmZXJzKSB7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyc1szXTsKLQotICAgIC8vIFRoaXMgdGVzdCByZXF1aXJlcyBhc3luYyBtb2RlIHRvIHJ1biBvbiBhIHNpbmdsZSB0aHJlYWQuCi0gICAgRVhQRUNUX1RSVUUoZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1Qcm9kdWNlckVnbFN1cmZhY2UsCi0gICAgICAgICAgICBtUHJvZHVjZXJFZ2xTdXJmYWNlLCBtUHJvZHVjZXJFZ2xDb250ZXh0KSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICBFWFBFQ1RfVFJVRShlZ2xTd2FwSW50ZXJ2YWwobUVnbERpc3BsYXksIDApKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgLy8gUHJvZHVjZSBhIGZyYW1lCi0gICAgICAgIEVYUEVDVF9UUlVFKGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtUHJvZHVjZXJFZ2xTdXJmYWNlLAotICAgICAgICAgICAgICAgIG1Qcm9kdWNlckVnbFN1cmZhY2UsIG1Qcm9kdWNlckVnbENvbnRleHQpKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1Qcm9kdWNlckVnbFN1cmZhY2UpOwotCi0gICAgICAgIC8vIENvbnN1bWUgYSBmcmFtZQotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLAotICAgICAgICAgICAgICAgIG1FZ2xDb250ZXh0KSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLSAgICAgICAgYnVmZmVyc1tpXSA9IG1TVC0+Z2V0Q3VycmVudEJ1ZmZlcigpOwotICAgIH0KLQotICAgIC8vIERlc3Ryb3kgdGhlIEdMIHRleHR1cmUgb2JqZWN0IHRvIHJlbGVhc2UgaXRzIHJlZiBvbiBidWZmZXJzWzJdLgotICAgIEdMdWludCB0ZXhJRCA9IFRFWF9JRDsKLSAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXhJRCk7Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBFR0xTdXJmYWNlCi0gICAgRVhQRUNUX1RSVUUoZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1Qcm9kdWNlckVnbFN1cmZhY2UpKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgLy8gUmVsZWFzZSB0aGUgcmVmIHRoYXQgdGhlIFN1cmZhY2VUZXh0dXJlIGhhcyBvbiBidWZmZXJzWzJdLgotICAgIG1TVC0+YWJhbmRvbigpOwotCi0gICAgRVhQRUNUX0VRKDEsIGJ1ZmZlcnNbMF0tPmdldFN0cm9uZ0NvdW50KCkpOwotICAgIEVYUEVDVF9FUSgxLCBidWZmZXJzWzFdLT5nZXRTdHJvbmdDb3VudCgpKTsKLQotICAgIC8vIERlcGVuZGluZyBvbiBob3cgbGF6aWx5IHRoZSBHTCBkcml2ZXIgZGVxdWV1ZXMgYnVmZmVycywgd2UgbWF5IGVuZCB1cAotICAgIC8vIHdpdGggZWl0aGVyIHR3byBvciB0aHJlZSB0b3RhbCBidWZmZXJzLiAgSWYgdGhlcmUgYXJlIHRocmVlLCBtYWtlIHN1cmUKLSAgICAvLyB0aGUgbGFzdCBvbmUgd2FzIHByb3Blcmx5IGRvd24tcmVmJ2QuCi0gICAgaWYgKGJ1ZmZlcnNbMl0gIT0gYnVmZmVyc1swXSkgewotICAgICAgICBFWFBFQ1RfRVEoMSwgYnVmZmVyc1syXS0+Z2V0U3Ryb25nQ291bnQoKSk7Ci0gICAgfQotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVHTFRvR0xUZXN0LCBFZ2xEZXN0cm95U3VyZmFjZUFmdGVyQWJhbmRvblVucmVmc0J1ZmZlcnMpIHsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXJzWzNdOwotCi0gICAgLy8gVGhpcyB0ZXN0IHJlcXVpcmVzIGFzeW5jIG1vZGUgdG8gcnVuIG9uIGEgc2luZ2xlIHRocmVhZC4KLSAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSwKLSAgICAgICAgICAgIG1Qcm9kdWNlckVnbFN1cmZhY2UsIG1Qcm9kdWNlckVnbENvbnRleHQpKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIEVYUEVDVF9UUlVFKGVnbFN3YXBJbnRlcnZhbChtRWdsRGlzcGxheSwgMCkpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAvLyBQcm9kdWNlIGEgZnJhbWUKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1Qcm9kdWNlckVnbFN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbVByb2R1Y2VyRWdsU3VyZmFjZSwgbVByb2R1Y2VyRWdsQ29udGV4dCkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgICAgIC8vIENvbnN1bWUgYSBmcmFtZQotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLAotICAgICAgICAgICAgICAgIG1FZ2xDb250ZXh0KSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICAgICAgYnVmZmVyc1tpXSA9IG1TVC0+Z2V0Q3VycmVudEJ1ZmZlcigpOwotICAgIH0KLQotICAgIC8vIEFiYW5kb24gdGhlIFN1cmZhY2VUZXh0dXJlLCByZWxlYXNpbmcgdGhlIHJlZiB0aGF0IHRoZSBTdXJmYWNlVGV4dHVyZSBoYXMKLSAgICAvLyBvbiBidWZmZXJzWzJdLgotICAgIG1TVC0+YWJhbmRvbigpOwotCi0gICAgLy8gRGVzdHJveSB0aGUgR0wgdGV4dHVyZSBvYmplY3QgdG8gcmVsZWFzZSBpdHMgcmVmIG9uIGJ1ZmZlcnNbMl0uCi0gICAgR0x1aW50IHRleElEID0gVEVYX0lEOwotICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleElEKTsKLQotICAgIC8vIERlc3Ryb3kgdGhlIEVHTFN1cmZhY2UuCi0gICAgRVhQRUNUX1RSVUUoZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1Qcm9kdWNlckVnbFN1cmZhY2UpKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgRVhQRUNUX0VRKDEsIGJ1ZmZlcnNbMF0tPmdldFN0cm9uZ0NvdW50KCkpOwotICAgIEVYUEVDVF9FUSgxLCBidWZmZXJzWzFdLT5nZXRTdHJvbmdDb3VudCgpKTsKLQotICAgIC8vIERlcGVuZGluZyBvbiBob3cgbGF6aWx5IHRoZSBHTCBkcml2ZXIgZGVxdWV1ZXMgYnVmZmVycywgd2UgbWF5IGVuZCB1cAotICAgIC8vIHdpdGggZWl0aGVyIHR3byBvciB0aHJlZSB0b3RhbCBidWZmZXJzLiAgSWYgdGhlcmUgYXJlIHRocmVlLCBtYWtlIHN1cmUKLSAgICAvLyB0aGUgbGFzdCBvbmUgd2FzIHByb3Blcmx5IGRvd24tcmVmJ2QuCi0gICAgaWYgKGJ1ZmZlcnNbMl0gIT0gYnVmZmVyc1swXSkgewotICAgICAgICBFWFBFQ1RfRVEoMSwgYnVmZmVyc1syXS0+Z2V0U3Ryb25nQ291bnQoKSk7Ci0gICAgfQotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVHTFRvR0xUZXN0LCBFZ2xTdXJmYWNlRGVmYXVsdHNUb1N5bmNocm9ub3VzTW9kZSkgewotICAgIC8vIFRoaXMgdGVzdCByZXF1aXJlcyAzIGJ1ZmZlcnMgdG8gcnVuIG9uIGEgc2luZ2xlIHRocmVhZC4KLSAgICBtU1QtPnNldEJ1ZmZlckNvdW50U2VydmVyKDMpOwotCi0gICAgQVNTRVJUX1RSVUUobVNULT5pc1N5bmNocm9ub3VzTW9kZSgpKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAvLyBQcm9kdWNlIGEgZnJhbWUKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1Qcm9kdWNlckVnbFN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbVByb2R1Y2VyRWdsU3VyZmFjZSwgbVByb2R1Y2VyRWdsQ29udGV4dCkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgICAgIC8vIENvbnN1bWUgYSBmcmFtZQotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLAotICAgICAgICAgICAgICAgIG1FZ2xDb250ZXh0KSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICB9Ci0KLSAgICBBU1NFUlRfVFJVRShtU1QtPmlzU3luY2hyb25vdXNNb2RlKCkpOwotfQotCi0vKgotICogVGhpcyB0ZXN0IGZpeHR1cmUgaXMgZm9yIHRlc3RpbmcgR0wgLT4gR0wgdGV4dHVyZSBzdHJlYW1pbmcgZnJvbSBvbmUgdGhyZWFkCi0gKiB0byBhbm90aGVyLiAgSXQgY29udGFpbnMgZnVuY3Rpb25hbGl0eSB0byBjcmVhdGUgYSBwcm9kdWNlciB0aHJlYWQgdGhhdCB3aWxsCi0gKiBwZXJmb3JtIEdMIHJlbmRlcmluZyB0byBhbiBBTmF0aXZlV2luZG93IHRoYXQgZmVlZHMgZnJhbWVzIHRvIGEKLSAqIFN1cmZhY2VUZXh0dXJlLiAgQWRkaXRpb25hbGx5IGl0IHN1cHBvcnRzIGludGVybG9ja2luZyB0aGUgcHJvZHVjZXIgYW5kCi0gKiBjb25zdW1lciB0aHJlYWRzIHNvIHRoYXQgYSBzcGVjaWZpYyBzZXF1ZW5jZSBvZiBjYWxscyBjYW4gYmUKLSAqIGRldGVybWluaXN0aWNhbGx5IGNyZWF0ZWQgYnkgdGhlIHRlc3QuCi0gKgotICogVGhlIGludGVuZGVkIHVzYWdlIGlzIGFzIGZvbGxvd3M6Ci0gKgotICogVEVTVF9GKC4uLikgewotICogICAgIGNsYXNzIFBUIDogcHVibGljIFByb2R1Y2VyVGhyZWFkIHsKLSAqICAgICAgICAgdmlydHVhbCB2b2lkIHJlbmRlcigpIHsKLSAqICAgICAgICAgICAgIC4uLgotICogICAgICAgICAgICAgc3dhcEJ1ZmZlcnMoKTsKLSAqICAgICAgICAgfQotICogICAgIH07Ci0gKgotICogICAgIHJ1blByb2R1Y2VyVGhyZWFkKG5ldyBQVCgpKTsKLSAqCi0gKiAgICAgLy8gVGhlIG9yZGVyIG9mIHRoZXNlIGNhbGxzIHdpbGwgdmFyeSBmcm9tIHRlc3QgdG8gdGVzdCBhbmQgbWF5IGluY2x1ZGUKLSAqICAgICAvLyBtdWx0aXBsZSBmcmFtZXMgYW5kIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyAoZS5nLiBHTCByZW5kZXJpbmcgZnJvbSB0aGUKLSAqICAgICAvLyB0ZXh0dXJlKS4KLSAqICAgICBmYy0+d2FpdEZvckZyYW1lKCk7Ci0gKiAgICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotICogICAgIGZjLT5maW5pc2hGcmFtZSgpOwotICogfQotICoKLSAqLwotY2xhc3MgU3VyZmFjZVRleHR1cmVHTFRocmVhZFRvR0xUZXN0IDogcHVibGljIFN1cmZhY2VUZXh0dXJlR0xUb0dMVGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICAvLyBQcm9kdWNlclRocmVhZCBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRvIHNpbXBsaWZ5IHRoZSBjcmVhdGlvbiBvZgotICAgIC8vIE9wZW5HTCBFUyBmcmFtZSBwcm9kdWNlciB0aHJlYWRzLgotICAgIGNsYXNzIFByb2R1Y2VyVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgcHVibGljOgotICAgICAgICB2aXJ0dWFsIH5Qcm9kdWNlclRocmVhZCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0RWdsT2JqZWN0cyhFR0xEaXNwbGF5IHByb2R1Y2VyRWdsRGlzcGxheSwKLSAgICAgICAgICAgICAgICBFR0xTdXJmYWNlIHByb2R1Y2VyRWdsU3VyZmFjZSwKLSAgICAgICAgICAgICAgICBFR0xDb250ZXh0IHByb2R1Y2VyRWdsQ29udGV4dCkgewotICAgICAgICAgICAgbVByb2R1Y2VyRWdsRGlzcGxheSA9IHByb2R1Y2VyRWdsRGlzcGxheTsKLSAgICAgICAgICAgIG1Qcm9kdWNlckVnbFN1cmZhY2UgPSBwcm9kdWNlckVnbFN1cmZhY2U7Ci0gICAgICAgICAgICBtUHJvZHVjZXJFZ2xDb250ZXh0ID0gcHJvZHVjZXJFZ2xDb250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7Ci0gICAgICAgICAgICBlZ2xNYWtlQ3VycmVudChtUHJvZHVjZXJFZ2xEaXNwbGF5LCBtUHJvZHVjZXJFZ2xTdXJmYWNlLAotICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXJFZ2xTdXJmYWNlLCBtUHJvZHVjZXJFZ2xDb250ZXh0KTsKLSAgICAgICAgICAgIHJlbmRlcigpOwotICAgICAgICAgICAgZWdsTWFrZUN1cnJlbnQobVByb2R1Y2VyRWdsRGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLAotICAgICAgICAgICAgICAgICAgICBFR0xfTk9fQ09OVEVYVCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbmRlcigpID0gMDsKLQotICAgICAgICB2b2lkIHN3YXBCdWZmZXJzKCkgewotICAgICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMobVByb2R1Y2VyRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBFR0xEaXNwbGF5IG1Qcm9kdWNlckVnbERpc3BsYXk7Ci0gICAgICAgIEVHTFN1cmZhY2UgbVByb2R1Y2VyRWdsU3VyZmFjZTsKLSAgICAgICAgRUdMQ29udGV4dCBtUHJvZHVjZXJFZ2xDb250ZXh0OwotICAgIH07Ci0KLSAgICAvLyBGcmFtZUNvbmRpdGlvbiBpcyBhIHV0aWxpdHkgY2xhc3MgZm9yIGludGVybG9ja2luZyBiZXR3ZWVuIHRoZSBwcm9kdWNlcgotICAgIC8vIGFuZCBjb25zdW1lciB0aHJlYWRzLiAgVGhlIEZyYW1lQ29uZGl0aW9uIG9iamVjdCBzaG91bGQgYmUgY3JlYXRlZCBhbmQKLSAgICAvLyBkZXN0cm95ZWQgaW4gdGhlIGNvbnN1bWVyIHRocmVhZCBvbmx5LiAgVGhlIGNvbnN1bWVyIHRocmVhZCBzaG91bGQgc2V0Ci0gICAgLy8gdGhlIEZyYW1lQ29uZGl0aW9uIGFzIHRoZSBGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIG9mIHRoZSBTdXJmYWNlVGV4dHVyZSwKLSAgICAvLyBhbmQgc2hvdWxkIGNhbGwgYm90aCB3YWl0Rm9yRnJhbWUgYW5kIGZpbmlzaEZyYW1lIG9uY2UgZm9yIGVhY2ggZXhwZWN0ZWQKLSAgICAvLyBmcmFtZS4KLSAgICAvLwotICAgIC8vIFRoaXMgaW50ZXJsb2NraW5nIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IG9uRnJhbWVBdmFpbGFibGUgZ2V0cyBjYWxsZWQKLSAgICAvLyBzeW5jaHJvbm91c2x5IGZyb20gU3VyZmFjZVRleHR1cmU6OnF1ZXVlQnVmZmVyLgotICAgIGNsYXNzIEZyYW1lQ29uZGl0aW9uIDogcHVibGljIFN1cmZhY2VUZXh0dXJlOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEZyYW1lQ29uZGl0aW9uKCk6Ci0gICAgICAgICAgICAgICAgbUZyYW1lQXZhaWxhYmxlKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBtRnJhbWVGaW5pc2hlZChmYWxzZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2FpdEZvckZyYW1lIHdhaXRzIGZvciB0aGUgbmV4dCBmcmFtZSB0byBhcnJpdmUuICBUaGlzIHNob3VsZCBiZQotICAgICAgICAvLyBjYWxsZWQgZnJvbSB0aGUgY29uc3VtZXIgdGhyZWFkIG9uY2UgZm9yIGV2ZXJ5IGZyYW1lIGV4cGVjdGVkIGJ5IHRoZQotICAgICAgICAvLyB0ZXN0LgotICAgICAgICB2b2lkIHdhaXRGb3JGcmFtZSgpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgICAgICAgICBBTE9HVigiK3dhaXRGb3JGcmFtZSIpOwotICAgICAgICAgICAgd2hpbGUgKCFtRnJhbWVBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24ud2FpdChtTXV0ZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZyYW1lQXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICBBTE9HVigiLXdhaXRGb3JGcmFtZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWxsb3cgdGhlIHByb2R1Y2VyIHRvIHJldHVybiBmcm9tIGl0cyBzd2FwQnVmZmVycyBjYWxsIGFuZCBjb250aW51ZQotICAgICAgICAvLyBvbiB0byBwcm9kdWNlIHRoZSBuZXh0IGZyYW1lLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBjb25zdW1lcgotICAgICAgICAvLyB0aHJlYWQgb25jZSBmb3IgZXZlcnkgZnJhbWUgZXhwZWN0ZWQgYnkgdGhlIHRlc3QuCi0gICAgICAgIHZvaWQgZmluaXNoRnJhbWUoKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgICAgICAgICAgQUxPR1YoIitmaW5pc2hGcmFtZSIpOwotICAgICAgICAgICAgbUZyYW1lRmluaXNoZWQgPSB0cnVlOwotICAgICAgICAgICAgbUZyYW1lRmluaXNoQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgICAgICAgICAgQUxPR1YoIi1maW5pc2hGcmFtZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IFN1cmZhY2VUZXh0dXJlIG9uIHRoZSBwcm9kdWNlciB0aHJlYWQuCi0gICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICAgICAgICAgIEFMT0dWKCIrb25GcmFtZUF2YWlsYWJsZSIpOwotICAgICAgICAgICAgbUZyYW1lQXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICAgICAgICAgIHdoaWxlICghbUZyYW1lRmluaXNoZWQpIHsKLSAgICAgICAgICAgICAgICBtRnJhbWVGaW5pc2hDb25kaXRpb24ud2FpdChtTXV0ZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZyYW1lRmluaXNoZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIEFMT0dWKCItb25GcmFtZUF2YWlsYWJsZSIpOwotICAgICAgICB9Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGJvb2wgbUZyYW1lQXZhaWxhYmxlOwotICAgICAgICBib29sIG1GcmFtZUZpbmlzaGVkOwotCi0gICAgICAgIE11dGV4IG1NdXRleDsKLSAgICAgICAgQ29uZGl0aW9uIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbjsKLSAgICAgICAgQ29uZGl0aW9uIG1GcmFtZUZpbmlzaENvbmRpdGlvbjsKLSAgICB9OwotCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBTdXJmYWNlVGV4dHVyZUdMVG9HTFRlc3Q6OlNldFVwKCk7Ci0gICAgICAgIG1GQyA9IG5ldyBGcmFtZUNvbmRpdGlvbigpOwotICAgICAgICBtU1QtPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIobUZDKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIGlmIChtUHJvZHVjZXJUaHJlYWQgIT0gTlVMTCkgewotICAgICAgICAgICAgbVByb2R1Y2VyVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLSAgICAgICAgfQotICAgICAgICBtUHJvZHVjZXJUaHJlYWQuY2xlYXIoKTsKLSAgICAgICAgbUZDLmNsZWFyKCk7Ci0gICAgICAgIFN1cmZhY2VUZXh0dXJlR0xUb0dMVGVzdDo6VGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJ1blByb2R1Y2VyVGhyZWFkKGNvbnN0IHNwPFByb2R1Y2VyVGhyZWFkPiBwcm9kdWNlclRocmVhZCkgewotICAgICAgICBBU1NFUlRfVFJVRShtUHJvZHVjZXJUaHJlYWQgPT0gTlVMTCk7Ci0gICAgICAgIG1Qcm9kdWNlclRocmVhZCA9IHByb2R1Y2VyVGhyZWFkOwotICAgICAgICBwcm9kdWNlclRocmVhZC0+c2V0RWdsT2JqZWN0cyhtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSwKLSAgICAgICAgICAgICAgICBtUHJvZHVjZXJFZ2xDb250ZXh0KTsKLSAgICAgICAgcHJvZHVjZXJUaHJlYWQtPnJ1bigpOwotICAgIH0KLQotICAgIHNwPFByb2R1Y2VyVGhyZWFkPiBtUHJvZHVjZXJUaHJlYWQ7Ci0gICAgc3A8RnJhbWVDb25kaXRpb24+IG1GQzsKLX07Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVGhyZWFkVG9HTFRlc3QsCi0gICAgICAgIFVwZGF0ZVRleEltYWdlQmVmb3JlRnJhbWVGaW5pc2hlZENvbXBsZXRlcykgewotICAgIGNsYXNzIFBUIDogcHVibGljIFByb2R1Y2VyVGhyZWFkIHsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbmRlcigpIHsKLSAgICAgICAgICAgIGdsQ2xlYXJDb2xvcigwLjBmLCAxLjBmLCAwLjBmLCAxLjBmKTsKLSAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgICAgICBzd2FwQnVmZmVycygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHJ1blByb2R1Y2VyVGhyZWFkKG5ldyBQVCgpKTsKLQotICAgIG1GQy0+d2FpdEZvckZyYW1lKCk7Ci0gICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotICAgIG1GQy0+ZmluaXNoRnJhbWUoKTsKLQotICAgIC8vIFRPRE86IEFkZCBmcmFtZSB2ZXJpZmljYXRpb24gb25jZSBSR0IgVEVYX0VYVEVSTkFMX09FUyBpcyBzdXBwb3J0ZWQhCi19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVGhyZWFkVG9HTFRlc3QsCi0gICAgICAgIFVwZGF0ZVRleEltYWdlQWZ0ZXJGcmFtZUZpbmlzaGVkQ29tcGxldGVzKSB7Ci0gICAgY2xhc3MgUFQgOiBwdWJsaWMgUHJvZHVjZXJUaHJlYWQgewotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKCkgewotICAgICAgICAgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYpOwotICAgICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgICAgIHN3YXBCdWZmZXJzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcnVuUHJvZHVjZXJUaHJlYWQobmV3IFBUKCkpOwotCi0gICAgbUZDLT53YWl0Rm9yRnJhbWUoKTsKLSAgICBtRkMtPmZpbmlzaEZyYW1lKCk7Ci0gICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotCi0gICAgLy8gVE9ETzogQWRkIGZyYW1lIHZlcmlmaWNhdGlvbiBvbmNlIFJHQiBURVhfRVhURVJOQUxfT0VTIGlzIHN1cHBvcnRlZCEKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUaHJlYWRUb0dMVGVzdCwKLSAgICAgICAgUmVwZWF0ZWRVcGRhdGVUZXhJbWFnZUJlZm9yZUZyYW1lRmluaXNoZWRDb21wbGV0ZXMpIHsKLSAgICBlbnVtIHsgTlVNX0lURVJBVElPTlMgPSAxMDI0IH07Ci0KLSAgICBjbGFzcyBQVCA6IHB1YmxpYyBQcm9kdWNlclRocmVhZCB7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZW5kZXIoKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9JVEVSQVRJT05TOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnbENsZWFyQ29sb3IoMC4wZiwgMS4wZiwgMC4wZiwgMS4wZik7Ci0gICAgICAgICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiK3N3YXBCdWZmZXJzIik7Ci0gICAgICAgICAgICAgICAgc3dhcEJ1ZmZlcnMoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiLXN3YXBCdWZmZXJzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcnVuUHJvZHVjZXJUaHJlYWQobmV3IFBUKCkpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fSVRFUkFUSU9OUzsgaSsrKSB7Ci0gICAgICAgIG1GQy0+d2FpdEZvckZyYW1lKCk7Ci0gICAgICAgIEFMT0dWKCIrdXBkYXRlVGV4SW1hZ2UiKTsKLSAgICAgICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotICAgICAgICBBTE9HVigiLXVwZGF0ZVRleEltYWdlIik7Ci0gICAgICAgIG1GQy0+ZmluaXNoRnJhbWUoKTsKLQotICAgICAgICAvLyBUT0RPOiBBZGQgZnJhbWUgdmVyaWZpY2F0aW9uIG9uY2UgUkdCIFRFWF9FWFRFUk5BTF9PRVMgaXMgc3VwcG9ydGVkIQotICAgIH0KLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUaHJlYWRUb0dMVGVzdCwKLSAgICAgICAgUmVwZWF0ZWRVcGRhdGVUZXhJbWFnZUFmdGVyRnJhbWVGaW5pc2hlZENvbXBsZXRlcykgewotICAgIGVudW0geyBOVU1fSVRFUkFUSU9OUyA9IDEwMjQgfTsKLQotICAgIGNsYXNzIFBUIDogcHVibGljIFByb2R1Y2VyVGhyZWFkIHsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbmRlcigpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0lURVJBVElPTlM7IGkrKykgewotICAgICAgICAgICAgICAgIGdsQ2xlYXJDb2xvcigwLjBmLCAxLjBmLCAwLjBmLCAxLjBmKTsKLSAgICAgICAgICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgICAgICAgIEFMT0dWKCIrc3dhcEJ1ZmZlcnMiKTsKLSAgICAgICAgICAgICAgICBzd2FwQnVmZmVycygpOwotICAgICAgICAgICAgICAgIEFMT0dWKCItc3dhcEJ1ZmZlcnMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBydW5Qcm9kdWNlclRocmVhZChuZXcgUFQoKSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9JVEVSQVRJT05TOyBpKyspIHsKLSAgICAgICAgbUZDLT53YWl0Rm9yRnJhbWUoKTsKLSAgICAgICAgbUZDLT5maW5pc2hGcmFtZSgpOwotICAgICAgICBBTE9HVigiK3VwZGF0ZVRleEltYWdlIik7Ci0gICAgICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLSAgICAgICAgQUxPR1YoIi11cGRhdGVUZXhJbWFnZSIpOwotCi0gICAgICAgIC8vIFRPRE86IEFkZCBmcmFtZSB2ZXJpZmljYXRpb24gb25jZSBSR0IgVEVYX0VYVEVSTkFMX09FUyBpcyBzdXBwb3J0ZWQhCi0gICAgfQotfQotCi0vLyBYWFg6IFRoaXMgdGVzdCBpcyBkaXNhYmxlZCBiZWNhdXNlIGl0IGlzIGN1cnJlbnRseSBoYW5naW5nIG9uIHNvbWUgZGV2aWNlcy4KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVGhyZWFkVG9HTFRlc3QsCi0gICAgICAgIERJU0FCTEVEX1JlcGVhdGVkU3dhcEJ1ZmZlcnNXaGlsZURlcXVldWVTdGFsbGVkQ29tcGxldGVzKSB7Ci0gICAgZW51bSB7IE5VTV9JVEVSQVRJT05TID0gNjQgfTsKLQotICAgIGNsYXNzIFBUIDogcHVibGljIFByb2R1Y2VyVGhyZWFkIHsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbmRlcigpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0lURVJBVElPTlM7IGkrKykgewotICAgICAgICAgICAgICAgIGdsQ2xlYXJDb2xvcigwLjBmLCAxLjBmLCAwLjBmLCAxLjBmKTsKLSAgICAgICAgICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgICAgICAgIEFMT0dWKCIrc3dhcEJ1ZmZlcnMiKTsKLSAgICAgICAgICAgICAgICBzd2FwQnVmZmVycygpOwotICAgICAgICAgICAgICAgIEFMT0dWKCItc3dhcEJ1ZmZlcnMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBBU1NFUlRfRVEoT0ssIG1TVC0+c2V0U3luY2hyb25vdXNNb2RlKHRydWUpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1TVC0+c2V0QnVmZmVyQ291bnRTZXJ2ZXIoMikpOwotCi0gICAgcnVuUHJvZHVjZXJUaHJlYWQobmV3IFBUKCkpOwotCi0gICAgLy8gQWxsb3cgdGhyZWUgZnJhbWVzIHRvIGJlIHJlbmRlcmVkIGFuZCBxdWV1ZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZQotICAgIC8vIHJlbmRlcmluZyBpbiB0aGlzIHRocmVhZC4gIEZvciB0aGUgbGF0dGVyIHR3byBmcmFtZXMgd2UgZG9uJ3QgY2FsbAotICAgIC8vIHVwZGF0ZVRleEltYWdlIHNvIHRoZSBuZXh0IGRlcXVldWUgZnJvbSB0aGUgcHJvZHVjZXIgdGhyZWFkIHdpbGwgYmxvY2sKLSAgICAvLyB3YWl0aW5nIGZvciBhIGZyYW1lIHRvIGJlY29tZSBhdmFpbGFibGUuCi0gICAgbUZDLT53YWl0Rm9yRnJhbWUoKTsKLSAgICBtRkMtPmZpbmlzaEZyYW1lKCk7Ci0KLSAgICAvLyBXZSBtdXN0IGNhbGwgdXBkYXRlVGV4SW1hZ2UgdG8gY29uc3VtZSB0aGUgZmlyc3QgZnJhbWUgc28gdGhhdCB0aGUKLSAgICAvLyBTdXJmYWNlVGV4dHVyZSBpcyBhYmxlIHRvIHJlZHVjZSB0aGUgYnVmZmVyIGNvdW50IHRvIDIuICBUaGlzIGlzIGJlY2F1c2UKLSAgICAvLyB0aGUgR0wgZHJpdmVyIG1heSBkZXF1ZXVlIGEgYnVmZmVyIHdoZW4gdGhlIEVHTFN1cmZhY2UgaXMgY3JlYXRlZCwgYW5kCi0gICAgLy8gdGhhdCBoYXBwZW5zIGJlZm9yZSB3ZSBjYWxsIHNldEJ1ZmZlckNvdW50U2VydmVyLiAgSXQncyBwb3NzaWJsZSB0aGF0IHRoZQotICAgIC8vIGRyaXZlciBkb2VzIG5vdCBkZXF1ZXVlIGEgYnVmZmVyIGF0IEVHTFN1cmZhY2UgY3JlYXRpb24gdGltZSwgc28gd2UKLSAgICAvLyBjYW5ub3QgcmVseSBvbiB0aGlzIHRvIGNhdXNlIHRoZSBzZWNvbmQgZGVxdWV1ZUJ1ZmZlciBjYWxsIHRvIGJsb2NrLgotICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLQotICAgIG1GQy0+d2FpdEZvckZyYW1lKCk7Ci0gICAgbUZDLT5maW5pc2hGcmFtZSgpOwotICAgIG1GQy0+d2FpdEZvckZyYW1lKCk7Ci0gICAgbUZDLT5maW5pc2hGcmFtZSgpOwotCi0gICAgLy8gU2xlZXAgZm9yIDEwMG1zIHRvIGFsbG93IHRoZSBwcm9kdWNlciB0aHJlYWQncyBkZXF1ZXVlQnVmZmVyIGNhbGwgdG8KLSAgICAvLyBibG9jayB3YWl0aW5nIGZvciBhIGJ1ZmZlciB0byBiZWNvbWUgYXZhaWxhYmxlLgotICAgIHVzbGVlcCgxMDAwMDApOwotCi0gICAgLy8gUmVuZGVyIGFuZCBwcmVzZW50IGEgbnVtYmVyIG9mIGltYWdlcy4gIFRoaXMgdGhyZWFkIHNob3VsZCBub3QgYmUgYmxvY2tlZAotICAgIC8vIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHByb2R1Y2VyIHRocmVhZCBpcyBibG9ja2luZyBpbiBkZXF1ZXVlLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0lURVJBVElPTlM7IGkrKykgewotICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICBlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgIH0KLQotICAgIC8vIENvbnN1bWUgdGhlIHR3byBwZW5kaW5nIGJ1ZmZlcnMgdG8gdW5ibG9jayB0aGUgcHJvZHVjZXIgdGhyZWFkLgotICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLSAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0KLSAgICAvLyBDb25zdW1lIHRoZSByZW1haW5pbmcgYnVmZmVycyBmcm9tIHRoZSBwcm9kdWNlciB0aHJlYWQuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fSVRFUkFUSU9OUy0zOyBpKyspIHsKLSAgICAgICAgbUZDLT53YWl0Rm9yRnJhbWUoKTsKLSAgICAgICAgbUZDLT5maW5pc2hGcmFtZSgpOwotICAgICAgICBBTE9HVigiK3VwZGF0ZVRleEltYWdlIik7Ci0gICAgICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLSAgICAgICAgQUxPR1YoIi11cGRhdGVUZXhJbWFnZSIpOwotICAgIH0KLX0KLQotY2xhc3MgU3VyZmFjZVRleHR1cmVGQk9UZXN0IDogcHVibGljIFN1cmZhY2VUZXh0dXJlR0xUZXN0IHsKLXByb3RlY3RlZDoKLQotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgU3VyZmFjZVRleHR1cmVHTFRlc3Q6OlNldFVwKCk7Ci0KLSAgICAgICAgZ2xHZW5GcmFtZWJ1ZmZlcnMoMSwgJm1GYm8pOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLQotICAgICAgICBnbEdlblRleHR1cmVzKDEsICZtRmJvVGV4KTsKLSAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtRmJvVGV4KTsKLSAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGdldFN1cmZhY2VXaWR0aCgpLAotICAgICAgICAgICAgICAgIGdldFN1cmZhY2VIZWlnaHQoKSwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgTlVMTCk7Ci0gICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotCi0gICAgICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBtRmJvKTsKLSAgICAgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsCi0gICAgICAgICAgICAgICAgR0xfVEVYVFVSRV8yRCwgbUZib1RleCwgMCk7Ci0gICAgICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCAwKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBTdXJmYWNlVGV4dHVyZUdMVGVzdDo6VGVhckRvd24oKTsKLQotICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtRmJvVGV4KTsKLSAgICAgICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoMSwgJm1GYm8pOwotICAgIH0KLQotICAgIEdMdWludCBtRmJvOwotICAgIEdMdWludCBtRmJvVGV4OwotfTsKLQotLy8gVGhpcyB0ZXN0IGlzIGludGVuZGVkIHRvIHZlcmlmeSB0aGF0IHByb3BlciBzeW5jaHJvbml6YXRpb24gaXMgZG9uZSB3aGVuCi0vLyByZW5kZXJpbmcgaW50byBhbiBGQk8uCi1URVNUX0YoU3VyZmFjZVRleHR1cmVGQk9UZXN0LCBCbGl0RnJvbUNwdUZpbGxlZEJ1ZmZlclRvRmJvKSB7Ci0gICAgY29uc3QgaW50IHRleFdpZHRoID0gNjQ7Ci0gICAgY29uc3QgaW50IHRleEhlaWdodCA9IDY0OwotCi0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksCi0gICAgICAgICAgICB0ZXhXaWR0aCwgdGV4SGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCkpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pKTsKLQotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBhbmI7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICBBU1NFUlRfVFJVRShhbmIgIT0gTlVMTCk7Ci0KLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYobmV3IEdyYXBoaWNCdWZmZXIoYW5iLCBmYWxzZSkpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+bG9ja0J1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7Ci0KLSAgICAvLyBGaWxsIHRoZSBidWZmZXIgd2l0aCBncmVlbgotICAgIHVpbnQ4X3QqIGltZyA9IE5VTEw7Ci0gICAgYnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICh2b2lkKiopKCZpbWcpKTsKLSAgICBmaWxsUkdCQThCdWZmZXJTb2xpZChpbWcsIHRleFdpZHRoLCB0ZXhIZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCksIDAsIDI1NSwKLSAgICAgICAgICAgIDAsIDI1NSk7Ci0gICAgYnVmLT51bmxvY2soKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLQotICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBtRmJvKTsKLSAgICBkcmF3VGV4dHVyZSgpOwotICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCAwKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShTdHJpbmc4Ojpmb3JtYXQoImZyYW1lICVkIiwgaSkuc3RyaW5nKCkpOwotCi0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYW5iKSk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKGFuYiAhPSBOVUxMKTsKLQotICAgICAgICBidWYgPSBuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5sb2NrQnVmZmVyKG1BTlcuZ2V0KCksCi0gICAgICAgICAgICAgICAgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSkpOwotCi0gICAgICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHJlZAotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAotICAgICAgICAgICAgICAgICh2b2lkKiopKCZpbWcpKSk7Ci0gICAgICAgIGZpbGxSR0JBOEJ1ZmZlclNvbGlkKGltZywgdGV4V2lkdGgsIHRleEhlaWdodCwgYnVmLT5nZXRTdHJpZGUoKSwgMjU1LCAwLAotICAgICAgICAgICAgICAgIDAsIDI1NSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgYnVmLT51bmxvY2soKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwKLSAgICAgICAgICAgICAgICBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotCi0gICAgICAgIGRyYXdUZXh0dXJlKCk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMjQsIDM5LCAyNTUsIDAsIDAsIDI1NSkpOwotICAgIH0KLQotICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBtRmJvKTsKLQotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDI0LCAzOSwgMCwgMjU1LCAwLCAyNTUpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvdGVzdHMvU3VyZmFjZV90ZXN0LmNwcCBiL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VfdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ODVkNjguLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvdGVzdHMvU3VyZmFjZV90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9ndWkvQ29tcG9zZXJTZXJ2aWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3VyZmFjZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIG1Db21wb3NlckNsaWVudCA9IG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSk7Ci0KLSAgICAgICAgbVN1cmZhY2VDb250cm9sID0gbUNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgICAgIFN0cmluZzgoIlRlc3QgU3VyZmFjZSIpLCAwLCAzMiwgMzIsIFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIDApOwotCi0gICAgICAgIEFTU0VSVF9UUlVFKG1TdXJmYWNlQ29udHJvbCAhPSBOVUxMKTsKLSAgICAgICAgQVNTRVJUX1RSVUUobVN1cmZhY2VDb250cm9sLT5pc1ZhbGlkKCkpOwotCi0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbVN1cmZhY2VDb250cm9sLT5zZXRMYXllcigweDdmZmZmZmZmKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbVN1cmZhY2VDb250cm9sLT5zaG93KCkpOwotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKLQotICAgICAgICBtU3VyZmFjZSA9IG1TdXJmYWNlQ29udHJvbC0+Z2V0U3VyZmFjZSgpOwotICAgICAgICBBU1NFUlRfVFJVRShtU3VyZmFjZSAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIG1Db21wb3NlckNsaWVudC0+ZGlzcG9zZSgpOwotICAgIH0KLQotICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwotICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gbUNvbXBvc2VyQ2xpZW50OwotICAgIHNwPFN1cmZhY2VDb250cm9sPiBtU3VyZmFjZUNvbnRyb2w7Ci19OwotCi1URVNUX0YoU3VyZmFjZVRlc3QsIFF1ZXVlc1RvV2luZG93Q29tcG9zZXJJc1RydWVXaGVuVmlzaWJsZSkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU3VyZmFjZSk7Ci0gICAgaW50IHJlc3VsdCA9IC0xMjM7Ci0gICAgaW50IGVyciA9IGFudy0+cXVlcnkoYW53LmdldCgpLCBOQVRJVkVfV0lORE9XX1FVRVVFU19UT19XSU5ET1dfQ09NUE9TRVIsCi0gICAgICAgICAgICAmcmVzdWx0KTsKLSAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIGVycik7Ci0gICAgRVhQRUNUX0VRKDEsIHJlc3VsdCk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGVzdCwgUXVldWVzVG9XaW5kb3dDb21wb3NlcklzVHJ1ZVdoZW5QdXJnYXRvcml6ZWQpIHsKLSAgICBtU3VyZmFjZUNvbnRyb2wuY2xlYXIoKTsKLQotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU3VyZmFjZSk7Ci0gICAgaW50IHJlc3VsdCA9IC0xMjM7Ci0gICAgaW50IGVyciA9IGFudy0+cXVlcnkoYW53LmdldCgpLCBOQVRJVkVfV0lORE9XX1FVRVVFU19UT19XSU5ET1dfQ09NUE9TRVIsCi0gICAgICAgICAgICAmcmVzdWx0KTsKLSAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIGVycik7Ci0gICAgRVhQRUNUX0VRKDEsIHJlc3VsdCk7Ci19Ci0KLS8vIFRoaXMgdGVzdCBwcm9iYWJseSBkb2Vzbid0IGJlbG9uZyBoZXJlLgotVEVTVF9GKFN1cmZhY2VUZXN0LCBTY3JlZW5zaG90c09mUHJvdGVjdGVkQnVmZmVyc1N1Y2NlZWQpIHsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbncobVN1cmZhY2UpOwotCi0gICAgLy8gVmVyaWZ5IHRoZSBzY3JlZW5zaG90IHdvcmtzIHdpdGggbm8gcHJvdGVjdGVkIGJ1ZmZlcnMuCi0gICAgc3A8SU1lbW9yeUhlYXA+IGhlYXA7Ci0gICAgdWludDMyX3Qgdz0wLCBoPTA7Ci0gICAgUGl4ZWxGb3JtYXQgZm10PTA7Ci0gICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gc2YoQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBzZi0+Y2FwdHVyZVNjcmVlbigwLCAmaGVhcCwgJncsICZoLCAmZm10LCA2NCwgNjQsIDAsCi0gICAgICAgICAgICAweDdmZmZmZmZmKSk7Ci0gICAgQVNTRVJUX1RSVUUoaGVhcCAhPSBOVUxMKTsKLQotICAgIC8vIFNldCB0aGUgUFJPVEVDVEVEIHVzYWdlIGJpdCBhbmQgdmVyaWZ5IHRoYXQgdGhlIHNjcmVlbnNob3QgZmFpbHMuICBOb3RlCi0gICAgLy8gdGhhdCB3ZSBuZWVkIHRvIGRlcXVldWUgYSBidWZmZXIgaW4gb3JkZXIgZm9yIGl0IHRvIGFjdHVhbGx5IGdldAotICAgIC8vIGFsbG9jYXRlZCBpbiBTdXJmYWNlRmxpbmdlci4KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKGFudy5nZXQoKSwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYW53LmdldCgpLCAzKSk7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmID0gMDsKLQotICAgIHN0YXR1c190IGVyciA9IGFudy0+ZGVxdWV1ZUJ1ZmZlcihhbncuZ2V0KCksICZidWYpOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgLy8gd2UgY291bGQgZmFpbCBpZiBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAgICAvLyB0aGF0J3Mgb2theSBhcyBsb25nIGFzIHRoaXMgaXMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUuCi0gICAgICAgIC8vIHRyeSBhZ2FpbiB3aXRob3V0IHRoZSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCBiaXQuCi0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoYW53LmdldCgpLCAwKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgYW53LT5kZXF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgJmJ1ZikpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgYW53LT5jYW5jZWxCdWZmZXIoYW53LmdldCgpLCBidWYpKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgIC8vIExvb3AgdG8gbWFrZSBzdXJlIFN1cmZhY2VGbGluZ2VyIGhhcyByZXRpcmVkIGEgcHJvdGVjdGVkIGJ1ZmZlci4KLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgYW53LT5sb2NrQnVmZmVyKGFudy5nZXQoKSwgYnVmKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgYW53LT5xdWV1ZUJ1ZmZlcihhbncuZ2V0KCksIGJ1ZikpOwotICAgIH0KLSAgICBoZWFwID0gMDsKLSAgICB3ID0gaCA9IGZtdCA9IDA7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBzZi0+Y2FwdHVyZVNjcmVlbigwLCAmaGVhcCwgJncsICZoLCAmZm10LAotICAgICAgICAgICAgNjQsIDY0LCAwLCAweDdmZmZmZmZmKSk7Ci0gICAgQVNTRVJUX1RSVUUoaGVhcCAhPSBOVUxMKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXN0LCBDb25jcmV0ZVR5cGVJc1N1cmZhY2UpIHsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbncobVN1cmZhY2UpOwotICAgIGludCByZXN1bHQgPSAtMTIzOwotICAgIGludCBlcnIgPSBhbnctPnF1ZXJ5KGFudy5nZXQoKSwgTkFUSVZFX1dJTkRPV19DT05DUkVURV9UWVBFLCAmcmVzdWx0KTsKLSAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIGVycik7Ci0gICAgRVhQRUNUX0VRKE5BVElWRV9XSU5ET1dfU1VSRkFDRSwgcmVzdWx0KTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvbGlicy91aS9BbmRyb2lkLm1rIGIvbGlicy91aS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWZmN2E0Li4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5jcHAgXAotCUdyYXBoaWNCdWZmZXIuY3BwIFwKLQlHcmFwaGljQnVmZmVyQWxsb2NhdG9yLmNwcCBcCi0JR3JhcGhpY0J1ZmZlck1hcHBlci5jcHAgXAotCVBpeGVsRm9ybWF0LmNwcCBcCi0JUmVjdC5jcHAgXAotCVJlZ2lvbi5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLQlsaWJ1dGlscyBcCi0JbGliaGFyZHdhcmUKLQotaWZuZXEgKCQoQk9BUkRfRlJBTUVCVUZGRVJfRk9SQ0VfRk9STUFUKSwpCi1MT0NBTF9DRkxBR1MgKz0gLURGUkFNRUJVRkZFUl9GT1JDRV9GT1JNQVQ9JChCT0FSRF9GUkFNRUJVRkZFUl9GT1JDRV9GT1JNQVQpCi1lbmRpZgotCi1MT0NBTF9NT0RVTEU6PSBsaWJ1aQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLQotIyBJbmNsdWRlIHN1YmRpcmVjdG9yeSBtYWtlZmlsZXMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgSWYgd2UncmUgYnVpbGRpbmcgd2l0aCBPTkVfU0hPVF9NQUtFRklMRSAobW0sIG1tbSksIHRoZW4gd2hhdCB0aGUgZnJhbWV3b3JrCi0jIHRlYW0gcmVhbGx5IHdhbnRzIGlzIHRvIGJ1aWxkIHRoZSBzdHVmZiBkZWZpbmVkIGJ5IHRoaXMgbWFrZWZpbGUuCi1pZmVxICgsJChPTkVfU0hPVF9NQUtFRklMRSkpCi1pbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKLWVuZGlmCmRpZmYgLS1naXQgYS9saWJzL3VpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93LmNwcCBiL2xpYnMvdWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWM5OWI2Li4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qIAotKioKLSoqIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRnJhbWVidWZmZXJOYXRpdmVXaW5kb3ciCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlIDx1aS9BTmF0aXZlT2JqZWN0QmFzZS5oPgotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0jaW5jbHVkZSA8dWkvUmVjdC5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTmF0aXZlQnVmZmVyIAotICAgIDogcHVibGljIEFOYXRpdmVPYmplY3RCYXNlPAotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyLCAKLSAgICAgICAgTmF0aXZlQnVmZmVyLCAKLSAgICAgICAgTGlnaHRSZWZCYXNlPE5hdGl2ZUJ1ZmZlcj4gPgotewotcHVibGljOgotICAgIE5hdGl2ZUJ1ZmZlcihpbnQgdywgaW50IGgsIGludCBmLCBpbnQgdSkgOiBCQVNFKCkgewotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyOjp3aWR0aCAgPSB3OwotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyOjpoZWlnaHQgPSBoOwotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyOjpmb3JtYXQgPSBmOwotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyOjp1c2FnZSAgPSB1OwotICAgIH0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIExpZ2h0UmVmQmFzZTxOYXRpdmVCdWZmZXI+OyAgICAKLSAgICB+TmF0aXZlQnVmZmVyKCkgeyB9OyAvLyB0aGlzIGNsYXNzIGNhbm5vdCBiZSBvdmVybG9hZGVkCi19OwotCi0KLS8qCi0gKiBUaGlzIGltcGxlbWVudHMgdGhlIChtYWluKSBmcmFtZWJ1ZmZlciBtYW5hZ2VtZW50LiBUaGlzIGNsYXNzIGlzIHVzZWQKLSAqIG1vc3RseSBieSBTdXJmYWNlRmxpbmdlciwgYnV0IGFsc28gYnkgY29tbWFuZCBsaW5lIEdMIGFwcGxpY2F0aW9uLgotICogCi0gKiBJbiBmYWN0IHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQU5hdGl2ZVdpbmRvdyBvbiB0b3Agb2YKLSAqIHRoZSBmcmFtZWJ1ZmZlci4KLSAqIAotICogQ3VycmVudGx5IGl0IGlzIHByZXR0eSBzaW1wbGUsIGl0IG1hbmFnZXMgb25seSB0d28gYnVmZmVycyAodGhlIGZyb250IGFuZCAKLSAqIGJhY2sgYnVmZmVyKS4KLSAqIAotICovCi0KLUZyYW1lYnVmZmVyTmF0aXZlV2luZG93OjpGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdygpIAotICAgIDogQkFTRSgpLCBmYkRldigwKSwgZ3JEZXYoMCksIG1VcGRhdGVPbkRlbWFuZChmYWxzZSkKLXsKLSAgICBod19tb2R1bGVfdCBjb25zdCogbW9kdWxlOwotICAgIGlmIChod19nZXRfbW9kdWxlKEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKSA9PSAwKSB7Ci0gICAgICAgIGludCBzdHJpZGU7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIGludCBpOwotICAgICAgICBlcnIgPSBmcmFtZWJ1ZmZlcl9vcGVuKG1vZHVsZSwgJmZiRGV2KTsKLSAgICAgICAgQUxPR0VfSUYoZXJyLCAiY291bGRuJ3Qgb3BlbiBmcmFtZWJ1ZmZlciBIQUwgKCVzKSIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICAgICAgCi0gICAgICAgIGVyciA9IGdyYWxsb2Nfb3Blbihtb2R1bGUsICZnckRldik7Ci0gICAgICAgIEFMT0dFX0lGKGVyciwgImNvdWxkbid0IG9wZW4gZ3JhbGxvYyBIQUwgKCVzKSIsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgICAgICAvLyBiYWlsIG91dCBpZiB3ZSBjYW4ndCBpbml0aWFsaXplIHRoZSBtb2R1bGVzCi0gICAgICAgIGlmICghZmJEZXYgfHwgIWdyRGV2KQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgbVVwZGF0ZU9uRGVtYW5kID0gKGZiRGV2LT5zZXRVcGRhdGVSZWN0ICE9IDApOwotICAgICAgICAKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgYnVmZmVyIEZJRk8KLSAgICAgICAgbU51bUJ1ZmZlcnMgPSBOVU1fRlJBTUVfQlVGRkVSUzsKLSAgICAgICAgbU51bUZyZWVCdWZmZXJzID0gTlVNX0ZSQU1FX0JVRkZFUlM7Ci0gICAgICAgIG1CdWZmZXJIZWFkID0gbU51bUJ1ZmZlcnMtMTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGNoYW5nZSB0aGUgZnJhbWVidWZmZXIgZm9ybWF0LiBJdCBtZXJlbHkKLSAgICAgICAgICogZmFrZXMgdGhpcyBmb3JtYXQgdG8gc3VyZmFjZWZsaW5nZXIgc28gdGhhdCB3aGVuIGl0IGNyZWF0ZXMKLSAgICAgICAgICogZnJhbWVidWZmZXIgc3VyZmFjZXMgaXQgd2lsbCB1c2UgdGhpcyBmb3JtYXQuIEl0J3MgcmVhbGx5IGEgZ2lhbnQKLSAgICAgICAgICogSEFDSyB0byBhbGxvdyBpbnRlcndvcmtpbmcgd2l0aCBidWdneSBncmFsbG9jK0dQVSBkcml2ZXIKLSAgICAgICAgICogaW1wbGVtZW50YXRpb25zLiBZb3Ugc2hvdWxkICpORVZFUiogbmVlZCB0byBzZXQgdGhpcyBmb3Igc2hpcHBpbmcKLSAgICAgICAgICogZGV2aWNlcy4KLSAgICAgICAgICovCi0jaWZkZWYgRlJBTUVCVUZGRVJfRk9SQ0VfRk9STUFUCi0gICAgICAgICooKHVpbnQzMl90ICopJmZiRGV2LT5mb3JtYXQpID0gRlJBTUVCVUZGRVJfRk9SQ0VfRk9STUFUOwotI2VuZGlmCi0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1OdW1CdWZmZXJzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWZmZXJzW2ldID0gbmV3IE5hdGl2ZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGZiRGV2LT53aWR0aCwgZmJEZXYtPmhlaWdodCwgZmJEZXYtPmZvcm1hdCwgR1JBTExPQ19VU0FHRV9IV19GQik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bUJ1ZmZlcnM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IGdyRGV2LT5hbGxvYyhnckRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZiRGV2LT53aWR0aCwgZmJEZXYtPmhlaWdodCwgZmJEZXYtPmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfRkIsICZidWZmZXJzW2ldLT5oYW5kbGUsICZidWZmZXJzW2ldLT5zdHJpZGUpOwotCi0gICAgICAgICAgICAgICAgQUxPR0VfSUYoZXJyLCAiZmIgYnVmZmVyICVkIGFsbG9jYXRpb24gZmFpbGVkIHc9JWQsIGg9JWQsIGVycj0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpLCBmYkRldi0+d2lkdGgsIGZiRGV2LT5oZWlnaHQsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbU51bUJ1ZmZlcnMgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU51bUZyZWVCdWZmZXJzID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJIZWFkID0gbU51bUJ1ZmZlcnMtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0X2Nhc3Q8dWludDMyX3QmPihBTmF0aXZlV2luZG93OjpmbGFncykgPSBmYkRldi0+ZmxhZ3M7IAotICAgICAgICBjb25zdF9jYXN0PGZsb2F0Jj4oQU5hdGl2ZVdpbmRvdzo6eGRwaSkgPSBmYkRldi0+eGRwaTsKLSAgICAgICAgY29uc3RfY2FzdDxmbG9hdCY+KEFOYXRpdmVXaW5kb3c6OnlkcGkpID0gZmJEZXYtPnlkcGk7Ci0gICAgICAgIGNvbnN0X2Nhc3Q8aW50Jj4oQU5hdGl2ZVdpbmRvdzo6bWluU3dhcEludGVydmFsKSA9IAotICAgICAgICAgICAgZmJEZXYtPm1pblN3YXBJbnRlcnZhbDsKLSAgICAgICAgY29uc3RfY2FzdDxpbnQmPihBTmF0aXZlV2luZG93OjptYXhTd2FwSW50ZXJ2YWwpID0gCi0gICAgICAgICAgICBmYkRldi0+bWF4U3dhcEludGVydmFsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZG4ndCBnZXQgZ3JhbGxvYyBtb2R1bGUiKTsKLSAgICB9Ci0KLSAgICBBTmF0aXZlV2luZG93OjpzZXRTd2FwSW50ZXJ2YWwgPSBzZXRTd2FwSW50ZXJ2YWw7Ci0gICAgQU5hdGl2ZVdpbmRvdzo6ZGVxdWV1ZUJ1ZmZlciA9IGRlcXVldWVCdWZmZXI7Ci0gICAgQU5hdGl2ZVdpbmRvdzo6bG9ja0J1ZmZlciA9IGxvY2tCdWZmZXI7Ci0gICAgQU5hdGl2ZVdpbmRvdzo6cXVldWVCdWZmZXIgPSBxdWV1ZUJ1ZmZlcjsKLSAgICBBTmF0aXZlV2luZG93OjpxdWVyeSA9IHF1ZXJ5OwotICAgIEFOYXRpdmVXaW5kb3c6OnBlcmZvcm0gPSBwZXJmb3JtOwotfQotCi1GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdzo6fkZyYW1lYnVmZmVyTmF0aXZlV2luZG93KCkgCi17Ci0gICAgaWYgKGdyRGV2KSB7Ci0gICAgICAgIGlmIChidWZmZXJzWzBdICE9IE5VTEwpCi0gICAgICAgICAgICBnckRldi0+ZnJlZShnckRldiwgYnVmZmVyc1swXS0+aGFuZGxlKTsKLSAgICAgICAgaWYgKGJ1ZmZlcnNbMV0gIT0gTlVMTCkKLSAgICAgICAgICAgIGdyRGV2LT5mcmVlKGdyRGV2LCBidWZmZXJzWzFdLT5oYW5kbGUpOwotICAgICAgICBncmFsbG9jX2Nsb3NlKGdyRGV2KTsKLSAgICB9Ci0KLSAgICBpZiAoZmJEZXYpIHsKLSAgICAgICAgZnJhbWVidWZmZXJfY2xvc2UoZmJEZXYpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c6OnNldFVwZGF0ZVJlY3RhbmdsZShjb25zdCBSZWN0JiByKSAKLXsKLSAgICBpZiAoIW1VcGRhdGVPbkRlbWFuZCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBmYkRldi0+c2V0VXBkYXRlUmVjdChmYkRldiwgci5sZWZ0LCByLnRvcCwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKLX0KLQotc3RhdHVzX3QgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c6OmNvbXBvc2l0aW9uQ29tcGxldGUoKQotewotICAgIGlmIChmYkRldi0+Y29tcG9zaXRpb25Db21wbGV0ZSkgewotICAgICAgICByZXR1cm4gZmJEZXYtPmNvbXBvc2l0aW9uQ29tcGxldGUoZmJEZXYpOwotICAgIH0KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLWludCBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdzo6c2V0U3dhcEludGVydmFsKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIGludCBpbnRlcnZhbCkgCi17Ci0gICAgZnJhbWVidWZmZXJfZGV2aWNlX3QqIGZiID0gZ2V0U2VsZih3aW5kb3cpLT5mYkRldjsKLSAgICByZXR1cm4gZmItPnNldFN3YXBJbnRlcnZhbChmYiwgaW50ZXJ2YWwpOwotfQotCi12b2lkIEZyYW1lYnVmZmVyTmF0aXZlV2luZG93OjpkdW1wKFN0cmluZzgmIHJlc3VsdCkgewotICAgIGlmIChmYkRldi0+Y29tbW9uLnZlcnNpb24gPj0gMSAmJiBmYkRldi0+ZHVtcCkgewotICAgICAgICBjb25zdCBzaXplX3QgU0laRSA9IDQwOTY7Ci0gICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgICAgIGZiRGV2LT5kdW1wKGZiRGV2LCBidWZmZXIsIFNJWkUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotfQotCi0vLyBvbmx5IGZvciBkZWJ1Z2dpbmcgLyBsb2dnaW5nCi1pbnQgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c6OmdldEN1cnJlbnRCdWZmZXJJbmRleCgpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG11dGV4KTsKLSAgICBjb25zdCBpbnQgaW5kZXggPSBtQ3VycmVudEJ1ZmZlckluZGV4OwotICAgIHJldHVybiBpbmRleDsKLX0KLQotaW50IEZyYW1lYnVmZmVyTmF0aXZlV2luZG93OjpkZXF1ZXVlQnVmZmVyKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgCi0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqKiBidWZmZXIpCi17Ci0gICAgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cqIHNlbGYgPSBnZXRTZWxmKHdpbmRvdyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNlbGYtPm11dGV4KTsKLSAgICBmcmFtZWJ1ZmZlcl9kZXZpY2VfdCogZmIgPSBzZWxmLT5mYkRldjsKLQotICAgIGludCBpbmRleCA9IHNlbGYtPm1CdWZmZXJIZWFkKys7Ci0gICAgaWYgKHNlbGYtPm1CdWZmZXJIZWFkID49IHNlbGYtPm1OdW1CdWZmZXJzKQotICAgICAgICBzZWxmLT5tQnVmZmVySGVhZCA9IDA7Ci0KLSAgICAvLyB3YWl0IGZvciBhIGZyZWUgYnVmZmVyCi0gICAgd2hpbGUgKCFzZWxmLT5tTnVtRnJlZUJ1ZmZlcnMpIHsKLSAgICAgICAgc2VsZi0+bUNvbmRpdGlvbi53YWl0KHNlbGYtPm11dGV4KTsKLSAgICB9Ci0gICAgLy8gZ2V0IHRoaXMgYnVmZmVyCi0gICAgc2VsZi0+bU51bUZyZWVCdWZmZXJzLS07Ci0gICAgc2VsZi0+bUN1cnJlbnRCdWZmZXJJbmRleCA9IGluZGV4OwotCi0gICAgKmJ1ZmZlciA9IHNlbGYtPmJ1ZmZlcnNbaW5kZXhdLmdldCgpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdzo6bG9ja0J1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csIAotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpCi17Ci0gICAgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cqIHNlbGYgPSBnZXRTZWxmKHdpbmRvdyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNlbGYtPm11dGV4KTsKLQotICAgIGNvbnN0IGludCBpbmRleCA9IHNlbGYtPm1DdXJyZW50QnVmZmVySW5kZXg7Ci0KLSAgICAvLyB3YWl0IHRoYXQgdGhlIGJ1ZmZlciB3ZSdyZSBsb2NraW5nIGlzIG5vdCBmcm9udCBhbnltb3JlCi0gICAgd2hpbGUgKHNlbGYtPmZyb250ID09IGJ1ZmZlcikgewotICAgICAgICBzZWxmLT5tQ29uZGl0aW9uLndhaXQoc2VsZi0+bXV0ZXgpOwotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotaW50IEZyYW1lYnVmZmVyTmF0aXZlV2luZG93OjpxdWV1ZUJ1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csIAotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpCi17Ci0gICAgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cqIHNlbGYgPSBnZXRTZWxmKHdpbmRvdyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNlbGYtPm11dGV4KTsKLSAgICBmcmFtZWJ1ZmZlcl9kZXZpY2VfdCogZmIgPSBzZWxmLT5mYkRldjsKLSAgICBidWZmZXJfaGFuZGxlX3QgaGFuZGxlID0gc3RhdGljX2Nhc3Q8TmF0aXZlQnVmZmVyKj4oYnVmZmVyKS0+aGFuZGxlOwotCi0gICAgY29uc3QgaW50IGluZGV4ID0gc2VsZi0+bUN1cnJlbnRCdWZmZXJJbmRleDsKLSAgICBpbnQgcmVzID0gZmItPnBvc3QoZmIsIGhhbmRsZSk7Ci0gICAgc2VsZi0+ZnJvbnQgPSBzdGF0aWNfY2FzdDxOYXRpdmVCdWZmZXIqPihidWZmZXIpOwotICAgIHNlbGYtPm1OdW1GcmVlQnVmZmVycysrOwotICAgIHNlbGYtPm1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotaW50IEZyYW1lYnVmZmVyTmF0aXZlV2luZG93OjpxdWVyeShjb25zdCBBTmF0aXZlV2luZG93KiB3aW5kb3csCi0gICAgICAgIGludCB3aGF0LCBpbnQqIHZhbHVlKSAKLXsKLSAgICBjb25zdCBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdyogc2VsZiA9IGdldFNlbGYod2luZG93KTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woc2VsZi0+bXV0ZXgpOwotICAgIGZyYW1lYnVmZmVyX2RldmljZV90KiBmYiA9IHNlbGYtPmZiRGV2OwotICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfV0lEVEg6Ci0gICAgICAgICAgICAqdmFsdWUgPSBmYi0+d2lkdGg7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19IRUlHSFQ6Ci0gICAgICAgICAgICAqdmFsdWUgPSBmYi0+aGVpZ2h0OwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfRk9STUFUOgotICAgICAgICAgICAgKnZhbHVlID0gZmItPmZvcm1hdDsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0NPTkNSRVRFX1RZUEU6Ci0gICAgICAgICAgICAqdmFsdWUgPSBOQVRJVkVfV0lORE9XX0ZSQU1FQlVGRkVSOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfUVVFVUVTX1RPX1dJTkRPV19DT01QT1NFUjoKLSAgICAgICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19ERUZBVUxUX1dJRFRIOgotICAgICAgICAgICAgKnZhbHVlID0gZmItPndpZHRoOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfREVGQVVMVF9IRUlHSFQ6Ci0gICAgICAgICAgICAqdmFsdWUgPSBmYi0+aGVpZ2h0OwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0hJTlQ6Ci0gICAgICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICAqdmFsdWUgPSAwOwotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLWludCBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdzo6cGVyZm9ybShBTmF0aXZlV2luZG93KiB3aW5kb3csCi0gICAgICAgIGludCBvcGVyYXRpb24sIC4uLikKLXsKLSAgICBzd2l0Y2ggKG9wZXJhdGlvbikgewotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQ09OTkVDVDoKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0RJU0NPTk5FQ1Q6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfVVNBR0U6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19HRU9NRVRSWToKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0RJTUVOU0lPTlM6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19GT1JNQVQ6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19UUkFOU0ZPUk06Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfQ09OTkVDVDoKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9ESVNDT05ORUNUOgotICAgICAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGltcGxlbWVudCB0aGVzZQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotCi0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19MT0NLOgotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfVU5MT0NLX0FORF9QT1NUOgotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX0NST1A6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSX0NPVU5UOgotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfVElNRVNUQU1QOgotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX1NDQUxJTkdfTU9ERToKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotRUdMTmF0aXZlV2luZG93VHlwZSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKHZvaWQpCi17Ci0gICAgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cqIHc7Ci0gICAgdyA9IG5ldyBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdygpOwotICAgIGlmICh3LT5nZXREZXZpY2UoKSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIGdldCBhIHJlZiBzbyBpdCBjYW4gYmUgZGVzdHJveWVkIHdoZW4gd2UgZXhpdCB0aGlzIGJsb2NrCi0gICAgICAgIHNwPEZyYW1lYnVmZmVyTmF0aXZlV2luZG93PiByZWYodyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKEVHTE5hdGl2ZVdpbmRvd1R5cGUpdzsKLX0KZGlmZiAtLWdpdCBhL2xpYnMvdWkvR3JhcGhpY0J1ZmZlci5jcHAgYi9saWJzL3VpL0dyYXBoaWNCdWZmZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA2M2U1Li4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvR3JhcGhpY0J1ZmZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiR3JhcGhpY0J1ZmZlciIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlckFsbG9jYXRvci5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KLSNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gQnVmZmVyIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBBTmF0aXZlV2luZG93QnVmZmVyCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotR3JhcGhpY0J1ZmZlcjo6R3JhcGhpY0J1ZmZlcigpCi0gICAgOiBCQVNFKCksIG1Pd25lcihvd25EYXRhKSwgbUJ1ZmZlck1hcHBlcihHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKSksCi0gICAgICBtSW5pdENoZWNrKE5PX0VSUk9SKSwgbUluZGV4KC0xKQotewotICAgIHdpZHRoICA9IAotICAgIGhlaWdodCA9IAotICAgIHN0cmlkZSA9IAotICAgIGZvcm1hdCA9IAotICAgIHVzYWdlICA9IDA7Ci0gICAgaGFuZGxlID0gTlVMTDsKLX0KLQotR3JhcGhpY0J1ZmZlcjo6R3JhcGhpY0J1ZmZlcih1aW50MzJfdCB3LCB1aW50MzJfdCBoLCAKLSAgICAgICAgUGl4ZWxGb3JtYXQgcmVxRm9ybWF0LCB1aW50MzJfdCByZXFVc2FnZSkKLSAgICA6IEJBU0UoKSwgbU93bmVyKG93bkRhdGEpLCBtQnVmZmVyTWFwcGVyKEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpKSwKLSAgICAgIG1Jbml0Q2hlY2soTk9fRVJST1IpLCBtSW5kZXgoLTEpCi17Ci0gICAgd2lkdGggID0gCi0gICAgaGVpZ2h0ID0gCi0gICAgc3RyaWRlID0gCi0gICAgZm9ybWF0ID0gCi0gICAgdXNhZ2UgID0gMDsKLSAgICBoYW5kbGUgPSBOVUxMOwotICAgIG1Jbml0Q2hlY2sgPSBpbml0U2l6ZSh3LCBoLCByZXFGb3JtYXQsIHJlcVVzYWdlKTsKLX0KLQotR3JhcGhpY0J1ZmZlcjo6R3JhcGhpY0J1ZmZlcih1aW50MzJfdCB3LCB1aW50MzJfdCBoLAotICAgICAgICBQaXhlbEZvcm1hdCBpbkZvcm1hdCwgdWludDMyX3QgaW5Vc2FnZSwKLSAgICAgICAgdWludDMyX3QgaW5TdHJpZGUsIG5hdGl2ZV9oYW5kbGVfdCogaW5IYW5kbGUsIGJvb2wga2VlcE93bmVyc2hpcCkKLSAgICA6IEJBU0UoKSwgbU93bmVyKGtlZXBPd25lcnNoaXAgPyBvd25IYW5kbGUgOiBvd25Ob25lKSwKLSAgICAgIG1CdWZmZXJNYXBwZXIoR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkpLAotICAgICAgbUluaXRDaGVjayhOT19FUlJPUiksIG1JbmRleCgtMSkKLXsKLSAgICB3aWR0aCAgPSB3OwotICAgIGhlaWdodCA9IGg7Ci0gICAgc3RyaWRlID0gaW5TdHJpZGU7Ci0gICAgZm9ybWF0ID0gaW5Gb3JtYXQ7Ci0gICAgdXNhZ2UgID0gaW5Vc2FnZTsKLSAgICBoYW5kbGUgPSBpbkhhbmRsZTsKLX0KLQotR3JhcGhpY0J1ZmZlcjo6R3JhcGhpY0J1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGJvb2wga2VlcE93bmVyc2hpcCkKLSAgICA6IEJBU0UoKSwgbU93bmVyKGtlZXBPd25lcnNoaXAgPyBvd25IYW5kbGUgOiBvd25Ob25lKSwKLSAgICAgIG1CdWZmZXJNYXBwZXIoR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkpLAotICAgICAgbUluaXRDaGVjayhOT19FUlJPUiksIG1JbmRleCgtMSksIG1XcmFwcGVkQnVmZmVyKGJ1ZmZlcikKLXsKLSAgICB3aWR0aCAgPSBidWZmZXItPndpZHRoOwotICAgIGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OwotICAgIHN0cmlkZSA9IGJ1ZmZlci0+c3RyaWRlOwotICAgIGZvcm1hdCA9IGJ1ZmZlci0+Zm9ybWF0OwotICAgIHVzYWdlICA9IGJ1ZmZlci0+dXNhZ2U7Ci0gICAgaGFuZGxlID0gYnVmZmVyLT5oYW5kbGU7Ci19Ci0KLUdyYXBoaWNCdWZmZXI6On5HcmFwaGljQnVmZmVyKCkKLXsKLSAgICBpZiAoaGFuZGxlKSB7Ci0gICAgICAgIGZyZWVfaGFuZGxlKCk7Ci0gICAgfQotfQotCi12b2lkIEdyYXBoaWNCdWZmZXI6OmZyZWVfaGFuZGxlKCkKLXsKLSAgICBpZiAobU93bmVyID09IG93bkhhbmRsZSkgewotICAgICAgICBtQnVmZmVyTWFwcGVyLnVucmVnaXN0ZXJCdWZmZXIoaGFuZGxlKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGUqPihoYW5kbGUpKTsKLSAgICB9IGVsc2UgaWYgKG1Pd25lciA9PSBvd25EYXRhKSB7Ci0gICAgICAgIEdyYXBoaWNCdWZmZXJBbGxvY2F0b3ImIGFsbG9jYXRvcihHcmFwaGljQnVmZmVyQWxsb2NhdG9yOjpnZXQoKSk7Ci0gICAgICAgIGFsbG9jYXRvci5mcmVlKGhhbmRsZSk7Ci0gICAgfQotICAgIG1XcmFwcGVkQnVmZmVyID0gMDsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlcjo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtSW5pdENoZWNrOwotfQotCi12b2lkIEdyYXBoaWNCdWZmZXI6OmR1bXBBbGxvY2F0aW9uc1RvU3lzdGVtTG9nKCkKLXsKLSAgICBHcmFwaGljQnVmZmVyQWxsb2NhdG9yOjpkdW1wVG9TeXN0ZW1Mb2coKTsKLX0KLQotQU5hdGl2ZVdpbmRvd0J1ZmZlciogR3JhcGhpY0J1ZmZlcjo6Z2V0TmF0aXZlQnVmZmVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvd0J1ZmZlcio+KAotICAgICAgICAgICAgY29uc3RfY2FzdDxHcmFwaGljQnVmZmVyKj4odGhpcykpOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyOjpyZWFsbG9jYXRlKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGYsCi0gICAgICAgIHVpbnQzMl90IHJlcVVzYWdlKQotewotICAgIGlmIChtT3duZXIgIT0gb3duRGF0YSkKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotCi0gICAgaWYgKGhhbmRsZSAmJiB3PT13aWR0aCAmJiBoPT1oZWlnaHQgJiYgZj09Zm9ybWF0ICYmIHJlcVVzYWdlPT11c2FnZSkKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotCi0gICAgaWYgKGhhbmRsZSkgewotICAgICAgICBHcmFwaGljQnVmZmVyQWxsb2NhdG9yJiBhbGxvY2F0b3IoR3JhcGhpY0J1ZmZlckFsbG9jYXRvcjo6Z2V0KCkpOwotICAgICAgICBhbGxvY2F0b3IuZnJlZShoYW5kbGUpOwotICAgICAgICBoYW5kbGUgPSAwOwotICAgIH0KLSAgICByZXR1cm4gaW5pdFNpemUodywgaCwgZiwgcmVxVXNhZ2UpOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyOjppbml0U2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBQaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICAgIHVpbnQzMl90IHJlcVVzYWdlKQotewotICAgIEdyYXBoaWNCdWZmZXJBbGxvY2F0b3ImIGFsbG9jYXRvciA9IEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OmdldCgpOwotICAgIHN0YXR1c190IGVyciA9IGFsbG9jYXRvci5hbGxvYyh3LCBoLCBmb3JtYXQsIHJlcVVzYWdlLCAmaGFuZGxlLCAmc3RyaWRlKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHRoaXMtPndpZHRoICA9IHc7Ci0gICAgICAgIHRoaXMtPmhlaWdodCA9IGg7Ci0gICAgICAgIHRoaXMtPmZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgdGhpcy0+dXNhZ2UgID0gcmVxVXNhZ2U7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXI6OmxvY2sodWludDMyX3QgdXNhZ2UsIHZvaWQqKiB2YWRkcikKLXsKLSAgICBjb25zdCBSZWN0IGxvY2tCb3VuZHMod2lkdGgsIGhlaWdodCk7Ci0gICAgc3RhdHVzX3QgcmVzID0gbG9jayh1c2FnZSwgbG9ja0JvdW5kcywgdmFkZHIpOwotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXI6OmxvY2sodWludDMyX3QgdXNhZ2UsIGNvbnN0IFJlY3QmIHJlY3QsIHZvaWQqKiB2YWRkcikKLXsKLSAgICBpZiAocmVjdC5sZWZ0IDwgMCB8fCByZWN0LnJpZ2h0ICA+IHRoaXMtPndpZHRoIHx8IAotICAgICAgICByZWN0LnRvcCAgPCAwIHx8IHJlY3QuYm90dG9tID4gdGhpcy0+aGVpZ2h0KSB7Ci0gICAgICAgIEFMT0dFKCJsb2NraW5nIHBpeGVscyAoJWQsJWQsJWQsJWQpIG91dHNpZGUgb2YgYnVmZmVyICh3PSVkLCBoPSVkKSIsCi0gICAgICAgICAgICAgICAgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIAotICAgICAgICAgICAgICAgIHRoaXMtPndpZHRoLCB0aGlzLT5oZWlnaHQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXMgPSBnZXRCdWZmZXJNYXBwZXIoKS5sb2NrKGhhbmRsZSwgdXNhZ2UsIHJlY3QsIHZhZGRyKTsKLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyOjp1bmxvY2soKQotewotICAgIHN0YXR1c190IHJlcyA9IGdldEJ1ZmZlck1hcHBlcigpLnVubG9jayhoYW5kbGUpOwotICAgIHJldHVybiByZXM7Ci19Ci0KLXNpemVfdCBHcmFwaGljQnVmZmVyOjpnZXRGbGF0dGVuZWRTaXplKCkgY29uc3QgewotICAgIHJldHVybiAoOCArIChoYW5kbGUgPyBoYW5kbGUtPm51bUludHMgOiAwKSkqc2l6ZW9mKGludCk7Ci19Ci0KLXNpemVfdCBHcmFwaGljQnVmZmVyOjpnZXRGZENvdW50KCkgY29uc3QgewotICAgIHJldHVybiBoYW5kbGUgPyBoYW5kbGUtPm51bUZkcyA6IDA7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXI6OmZsYXR0ZW4odm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgaW50IGZkc1tdLCBzaXplX3QgY291bnQpIGNvbnN0Ci17Ci0gICAgc2l6ZV90IHNpemVOZWVkZWQgPSBHcmFwaGljQnVmZmVyOjpnZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgaWYgKHNpemUgPCBzaXplTmVlZGVkKSByZXR1cm4gTk9fTUVNT1JZOwotCi0gICAgc2l6ZV90IGZkQ291bnROZWVkZWQgPSBHcmFwaGljQnVmZmVyOjpnZXRGZENvdW50KCk7Ci0gICAgaWYgKGNvdW50IDwgZmRDb3VudE5lZWRlZCkgcmV0dXJuIE5PX01FTU9SWTsKLQotICAgIGludCogYnVmID0gc3RhdGljX2Nhc3Q8aW50Kj4oYnVmZmVyKTsKLSAgICBidWZbMF0gPSAnR0JGUic7Ci0gICAgYnVmWzFdID0gd2lkdGg7Ci0gICAgYnVmWzJdID0gaGVpZ2h0OwotICAgIGJ1ZlszXSA9IHN0cmlkZTsKLSAgICBidWZbNF0gPSBmb3JtYXQ7Ci0gICAgYnVmWzVdID0gdXNhZ2U7Ci0gICAgYnVmWzZdID0gMDsKLSAgICBidWZbN10gPSAwOwotCi0gICAgaWYgKGhhbmRsZSkgewotICAgICAgICBidWZbNl0gPSBoYW5kbGUtPm51bUZkczsKLSAgICAgICAgYnVmWzddID0gaGFuZGxlLT5udW1JbnRzOwotICAgICAgICBuYXRpdmVfaGFuZGxlX3QgY29uc3QqIGNvbnN0IGggPSBoYW5kbGU7Ci0gICAgICAgIG1lbWNweShmZHMsICAgICBoLT5kYXRhLCAgICAgICAgICAgICBoLT5udW1GZHMqc2l6ZW9mKGludCkpOwotICAgICAgICBtZW1jcHkoJmJ1Zls4XSwgaC0+ZGF0YSArIGgtPm51bUZkcywgaC0+bnVtSW50cypzaXplb2YoaW50KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyOjp1bmZsYXR0ZW4odm9pZCBjb25zdCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgaW50IGZkc1tdLCBzaXplX3QgY291bnQpCi17Ci0gICAgaWYgKHNpemUgPCA4KnNpemVvZihpbnQpKSByZXR1cm4gTk9fTUVNT1JZOwotCi0gICAgaW50IGNvbnN0KiBidWYgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihidWZmZXIpOwotICAgIGlmIChidWZbMF0gIT0gJ0dCRlInKSByZXR1cm4gQkFEX1RZUEU7Ci0KLSAgICBjb25zdCBzaXplX3QgbnVtRmRzICA9IGJ1Zls2XTsKLSAgICBjb25zdCBzaXplX3QgbnVtSW50cyA9IGJ1Zls3XTsKLQotICAgIGNvbnN0IHNpemVfdCBzaXplTmVlZGVkID0gKDggKyBudW1JbnRzKSAqIHNpemVvZihpbnQpOwotICAgIGlmIChzaXplIDwgc2l6ZU5lZWRlZCkgcmV0dXJuIE5PX01FTU9SWTsKLQotICAgIHNpemVfdCBmZENvdW50TmVlZGVkID0gMDsKLSAgICBpZiAoY291bnQgPCBmZENvdW50TmVlZGVkKSByZXR1cm4gTk9fTUVNT1JZOwotCi0gICAgaWYgKGhhbmRsZSkgewotICAgICAgICAvLyBmcmVlIHByZXZpb3VzIGhhbmRsZSBpZiBhbnkKLSAgICAgICAgZnJlZV9oYW5kbGUoKTsKLSAgICB9Ci0KLSAgICBpZiAobnVtRmRzIHx8IG51bUludHMpIHsKLSAgICAgICAgd2lkdGggID0gYnVmWzFdOwotICAgICAgICBoZWlnaHQgPSBidWZbMl07Ci0gICAgICAgIHN0cmlkZSA9IGJ1ZlszXTsKLSAgICAgICAgZm9ybWF0ID0gYnVmWzRdOwotICAgICAgICB1c2FnZSAgPSBidWZbNV07Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGUqIGggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShudW1GZHMsIG51bUludHMpOwotICAgICAgICBtZW1jcHkoaC0+ZGF0YSwgICAgICAgICAgZmRzLCAgICAgbnVtRmRzKnNpemVvZihpbnQpKTsKLSAgICAgICAgbWVtY3B5KGgtPmRhdGEgKyBudW1GZHMsICZidWZbOF0sIG51bUludHMqc2l6ZW9mKGludCkpOwotICAgICAgICBoYW5kbGUgPSBoOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdpZHRoID0gaGVpZ2h0ID0gc3RyaWRlID0gZm9ybWF0ID0gdXNhZ2UgPSAwOwotICAgICAgICBoYW5kbGUgPSBOVUxMOwotICAgIH0KLQotICAgIG1Pd25lciA9IG93bkhhbmRsZTsKLQotICAgIGlmIChoYW5kbGUgIT0gMCkgewotICAgICAgICBtQnVmZmVyTWFwcGVyLnJlZ2lzdGVyQnVmZmVyKGhhbmRsZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXZvaWQgR3JhcGhpY0J1ZmZlcjo6c2V0SW5kZXgoaW50IGluZGV4KSB7Ci0gICAgbUluZGV4ID0gaW5kZXg7Ci19Ci0KLWludCBHcmFwaGljQnVmZmVyOjpnZXRJbmRleCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUluZGV4OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdWkvR3JhcGhpY0J1ZmZlckFsbG9jYXRvci5jcHAgYi9saWJzL3VpL0dyYXBoaWNCdWZmZXJBbGxvY2F0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjU1MGQ5Li4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvR3JhcGhpY0J1ZmZlckFsbG9jYXRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyogCi0qKgotKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJHcmFwaGljQnVmZmVyQWxsb2NhdG9yIgotI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlckFsbG9jYXRvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKCBHcmFwaGljQnVmZmVyQWxsb2NhdG9yICkKLQotTXV0ZXggR3JhcGhpY0J1ZmZlckFsbG9jYXRvcjo6c0xvY2s7Ci1LZXllZFZlY3RvcjxidWZmZXJfaGFuZGxlX3QsCi0gICAgR3JhcGhpY0J1ZmZlckFsbG9jYXRvcjo6YWxsb2NfcmVjX3Q+IEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OnNBbGxvY0xpc3Q7Ci0KLUdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OkdyYXBoaWNCdWZmZXJBbGxvY2F0b3IoKQotICAgIDogbUFsbG9jRGV2KDApCi17Ci0gICAgaHdfbW9kdWxlX3QgY29uc3QqIG1vZHVsZTsKLSAgICBpbnQgZXJyID0gaHdfZ2V0X21vZHVsZShHUkFMTE9DX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1vZHVsZSk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiRkFUQUw6IGNhbid0IGZpbmQgdGhlICVzIG1vZHVsZSIsIEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lEKTsKLSAgICBpZiAoZXJyID09IDApIHsKLSAgICAgICAgZ3JhbGxvY19vcGVuKG1vZHVsZSwgJm1BbGxvY0Rldik7Ci0gICAgfQotfQotCi1HcmFwaGljQnVmZmVyQWxsb2NhdG9yOjp+R3JhcGhpY0J1ZmZlckFsbG9jYXRvcigpCi17Ci0gICAgZ3JhbGxvY19jbG9zZShtQWxsb2NEZXYpOwotfQotCi12b2lkIEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OmR1bXAoU3RyaW5nOCYgcmVzdWx0KSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChzTG9jayk7Ci0gICAgS2V5ZWRWZWN0b3I8YnVmZmVyX2hhbmRsZV90LCBhbGxvY19yZWNfdD4mIGxpc3Qoc0FsbG9jTGlzdCk7Ci0gICAgc2l6ZV90IHRvdGFsID0gMDsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDQwOTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQWxsb2NhdGVkIGJ1ZmZlcnM6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgY29uc3Qgc2l6ZV90IGMgPSBsaXN0LnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGMgOyBpKyspIHsKLSAgICAgICAgY29uc3QgYWxsb2NfcmVjX3QmIHJlYyhsaXN0LnZhbHVlQXQoaSkpOwotICAgICAgICBpZiAocmVjLnNpemUpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUxMHA6ICU3LjJmIEtpQiB8ICU0dSAoJTR1KSB4ICU0dSB8ICU4WCB8IDB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5rZXlBdChpKSwgcmVjLnNpemUvMTAyNC4wZiwKLSAgICAgICAgICAgICAgICAgICAgcmVjLncsIHJlYy5zLCByZWMuaCwgcmVjLmZvcm1hdCwgcmVjLnVzYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUxMHA6IHVua25vd24gICAgIHwgJTR1ICglNHUpIHggJTR1IHwgJThYIHwgMHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgICBsaXN0LmtleUF0KGkpLAotICAgICAgICAgICAgICAgICAgICByZWMudywgcmVjLnMsIHJlYy5oLCByZWMuZm9ybWF0LCByZWMudXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgdG90YWwgKz0gcmVjLnNpemU7Ci0gICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlRvdGFsIGFsbG9jYXRlZCAoZXN0aW1hdGUpOiAlLjJmIEtCXG4iLCB0b3RhbC8xMDI0LjBmKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgaWYgKG1BbGxvY0Rldi0+Y29tbW9uLnZlcnNpb24gPj0gMSAmJiBtQWxsb2NEZXYtPmR1bXApIHsKLSAgICAgICAgbUFsbG9jRGV2LT5kdW1wKG1BbGxvY0RldiwgYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLX0KLQotdm9pZCBHcmFwaGljQnVmZmVyQWxsb2NhdG9yOjpkdW1wVG9TeXN0ZW1Mb2coKQotewotICAgIFN0cmluZzggczsKLSAgICBHcmFwaGljQnVmZmVyQWxsb2NhdG9yOjpnZXRJbnN0YW5jZSgpLmR1bXAocyk7Ci0gICAgQUxPR0QoIiVzIiwgcy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OmFsbG9jKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgaW50IHVzYWdlLCBidWZmZXJfaGFuZGxlX3QqIGhhbmRsZSwgaW50MzJfdCogc3RyaWRlKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgLy8gbWFrZSBzdXJlIHRvIG5vdCBhbGxvY2F0ZSBhIE4geCAwIG9yIDAgeCBOIGJ1ZmZlciwgc2luY2UgdGhpcyBpcwotICAgIC8vIGFsbG93ZWQgZnJvbSBhbiBBUEkgc3RhbmQtcG9pbnQgYWxsb2NhdGUgYSAxeDEgYnVmZmVyIGluc3RlYWQuCi0gICAgaWYgKCF3IHx8ICFoKQotICAgICAgICB3ID0gaCA9IDE7Ci0KLSAgICAvLyB3ZSBoYXZlIGEgaC93IGFsbG9jYXRvciBhbmQgaC93IGJ1ZmZlciBpcyByZXF1ZXN0ZWQKLSAgICBzdGF0dXNfdCBlcnI7IAotICAgIAotICAgIGVyciA9IG1BbGxvY0Rldi0+YWxsb2MobUFsbG9jRGV2LCB3LCBoLCBmb3JtYXQsIHVzYWdlLCBoYW5kbGUsIHN0cmlkZSk7Ci0KLSAgICBBTE9HV19JRihlcnIsICJhbGxvYygldSwgJXUsICVkLCAlMDh4LCAuLi4pIGZhaWxlZCAlZCAoJXMpIiwKLSAgICAgICAgICAgIHcsIGgsIGZvcm1hdCwgdXNhZ2UsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgIAotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNMb2NrKTsKLSAgICAgICAgS2V5ZWRWZWN0b3I8YnVmZmVyX2hhbmRsZV90LCBhbGxvY19yZWNfdD4mIGxpc3Qoc0FsbG9jTGlzdCk7Ci0gICAgICAgIGludCBicHAgPSBieXRlc1BlclBpeGVsKGZvcm1hdCk7Ci0gICAgICAgIGlmIChicHAgPCAwKSB7Ci0gICAgICAgICAgICAvLyBwcm9iYWJseSBhIEhBTCBjdXN0b20gZm9ybWF0LiBpbiBhbnkgY2FzZSwgd2UgZG9uJ3Qga25vdwotICAgICAgICAgICAgLy8gd2hhdCBpdHMgcGl4ZWwgc2l6ZSBpcy4KLSAgICAgICAgICAgIGJwcCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgYWxsb2NfcmVjX3QgcmVjOwotICAgICAgICByZWMudyA9IHc7Ci0gICAgICAgIHJlYy5oID0gaDsKLSAgICAgICAgcmVjLnMgPSAqc3RyaWRlOwotICAgICAgICByZWMuZm9ybWF0ID0gZm9ybWF0OwotICAgICAgICByZWMudXNhZ2UgPSB1c2FnZTsKLSAgICAgICAgcmVjLnNpemUgPSBoICogc3RyaWRlWzBdICogYnBwOwotICAgICAgICBsaXN0LmFkZCgqaGFuZGxlLCByZWMpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OmZyZWUoYnVmZmVyX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIHN0YXR1c190IGVycjsKLQotICAgIGVyciA9IG1BbGxvY0Rldi0+ZnJlZShtQWxsb2NEZXYsIGhhbmRsZSk7Ci0KLSAgICBBTE9HV19JRihlcnIsICJmcmVlKC4uLikgZmFpbGVkICVkICglcykiLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChzTG9jayk7Ci0gICAgICAgIEtleWVkVmVjdG9yPGJ1ZmZlcl9oYW5kbGVfdCwgYWxsb2NfcmVjX3Q+JiBsaXN0KHNBbGxvY0xpc3QpOwotICAgICAgICBsaXN0LnJlbW92ZUl0ZW0oaGFuZGxlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3VpL0dyYXBoaWNCdWZmZXJNYXBwZXIuY3BwIGIvbGlicy91aS9HcmFwaGljQnVmZmVyTWFwcGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3ZGE5OC4uMDAwMDAwMAotLS0gYS9saWJzL3VpL0dyYXBoaWNCdWZmZXJNYXBwZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiR3JhcGhpY0J1ZmZlck1hcHBlciIKLSNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KLSNpbmNsdWRlIDx1aS9SZWN0Lmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUFORFJPSURfU0lOR0xFVE9OX1NUQVRJQ19JTlNUQU5DRSggR3JhcGhpY0J1ZmZlck1hcHBlciApCi0KLUdyYXBoaWNCdWZmZXJNYXBwZXI6OkdyYXBoaWNCdWZmZXJNYXBwZXIoKQotICAgIDogbUFsbG9jTW9kKDApCi17Ci0gICAgaHdfbW9kdWxlX3QgY29uc3QqIG1vZHVsZTsKLSAgICBpbnQgZXJyID0gaHdfZ2V0X21vZHVsZShHUkFMTE9DX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1vZHVsZSk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiRkFUQUw6IGNhbid0IGZpbmQgdGhlICVzIG1vZHVsZSIsIEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lEKTsKLSAgICBpZiAoZXJyID09IDApIHsKLSAgICAgICAgbUFsbG9jTW9kID0gKGdyYWxsb2NfbW9kdWxlX3QgY29uc3QgKiltb2R1bGU7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyTWFwcGVyOjpyZWdpc3RlckJ1ZmZlcihidWZmZXJfaGFuZGxlX3QgaGFuZGxlKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgZXJyID0gbUFsbG9jTW9kLT5yZWdpc3RlckJ1ZmZlcihtQWxsb2NNb2QsIGhhbmRsZSk7Ci0KLSAgICBBTE9HV19JRihlcnIsICJyZWdpc3RlckJ1ZmZlciglcCkgZmFpbGVkICVkICglcykiLAotICAgICAgICAgICAgaGFuZGxlLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyTWFwcGVyOjp1bnJlZ2lzdGVyQnVmZmVyKGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICBlcnIgPSBtQWxsb2NNb2QtPnVucmVnaXN0ZXJCdWZmZXIobUFsbG9jTW9kLCBoYW5kbGUpOwotCi0gICAgQUxPR1dfSUYoZXJyLCAidW5yZWdpc3RlckJ1ZmZlciglcCkgZmFpbGVkICVkICglcykiLAotICAgICAgICAgICAgaGFuZGxlLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyTWFwcGVyOjpsb2NrKGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUsIAotICAgICAgICBpbnQgdXNhZ2UsIGNvbnN0IFJlY3QmIGJvdW5kcywgdm9pZCoqIHZhZGRyKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgZXJyID0gbUFsbG9jTW9kLT5sb2NrKG1BbGxvY01vZCwgaGFuZGxlLCB1c2FnZSwKLSAgICAgICAgICAgIGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMud2lkdGgoKSwgYm91bmRzLmhlaWdodCgpLAotICAgICAgICAgICAgdmFkZHIpOwotCi0gICAgQUxPR1dfSUYoZXJyLCAibG9jayguLi4pIGZhaWxlZCAlZCAoJXMpIiwgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlck1hcHBlcjo6dW5sb2NrKGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICBlcnIgPSBtQWxsb2NNb2QtPnVubG9jayhtQWxsb2NNb2QsIGhhbmRsZSk7Ci0KLSAgICBBTE9HV19JRihlcnIsICJ1bmxvY2soLi4uKSBmYWlsZWQgJWQgKCVzKSIsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnMvdWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJzL3VpL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlicy91aS9OT1RJQ0UgYi9saWJzL3VpL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJzL3VpL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlicy91aS9QaXhlbEZvcm1hdC5jcHAgYi9saWJzL3VpL1BpeGVsRm9ybWF0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxZDNjMi4uMDAwMDAwMAotLS0gYS9saWJzL3VpL1BpeGVsRm9ybWF0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgY29uc3QgaW50IENPTVBPTkVOVF9ZVVYgPSAweEZGOwotCi1zdHJ1Y3QgSW5mbyB7Ci0gICAgc2l6ZV90ICAgICAgc2l6ZTsKLSAgICBzaXplX3QgICAgICBiaXRzUGVyUGl4ZWw7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgdWludDhfdCAgICAgYWg7Ci0gICAgICAgIHVpbnQ4X3QgICAgIGFsOwotICAgICAgICB1aW50OF90ICAgICByaDsKLSAgICAgICAgdWludDhfdCAgICAgcmw7Ci0gICAgICAgIHVpbnQ4X3QgICAgIGdoOwotICAgICAgICB1aW50OF90ICAgICBnbDsKLSAgICAgICAgdWludDhfdCAgICAgYmg7Ci0gICAgICAgIHVpbnQ4X3QgICAgIGJsOwotICAgIH07Ci0gICAgdWludDhfdCAgICAgY29tcG9uZW50czsKLX07Ci0KLXN0YXRpYyBJbmZvIGNvbnN0IHNQaXhlbEZvcm1hdEluZm9zW10gPSB7Ci0gICAgICAgIHsgMCwgIDAsIHsgMCwgMCwgICAwLCAwLCAgIDAsIDAsICAgMCwgMCB9LCAwIH0sCi0gICAgICAgIHsgNCwgMzIsIHszMiwyNCwgICA4LCAwLCAgMTYsIDgsICAyNCwxNiB9LCBQaXhlbEZvcm1hdEluZm86OlJHQkEgfSwKLSAgICAgICAgeyA0LCAyNCwgeyAwLCAwLCAgIDgsIDAsICAxNiwgOCwgIDI0LDE2IH0sIFBpeGVsRm9ybWF0SW5mbzo6UkdCICB9LAotICAgICAgICB7IDMsIDI0LCB7IDAsIDAsICAgOCwgMCwgIDE2LCA4LCAgMjQsMTYgfSwgUGl4ZWxGb3JtYXRJbmZvOjpSR0IgIH0sCi0gICAgICAgIHsgMiwgMTYsIHsgMCwgMCwgIDE2LDExLCAgMTEsIDUsICAgNSwgMCB9LCBQaXhlbEZvcm1hdEluZm86OlJHQiAgfSwKLSAgICAgICAgeyA0LCAzMiwgezMyLDI0LCAgMjQsMTYsICAxNiwgOCwgICA4LCAwIH0sIFBpeGVsRm9ybWF0SW5mbzo6UkdCQSB9LAotICAgICAgICB7IDIsIDE2LCB7IDEsIDAsICAxNiwxMSwgIDExLCA2LCAgIDYsIDEgfSwgUGl4ZWxGb3JtYXRJbmZvOjpSR0JBIH0sCi0gICAgICAgIHsgMiwgMTYsIHsgNCwgMCwgIDE2LDEyLCAgMTIsIDgsICAgOCwgNCB9LCBQaXhlbEZvcm1hdEluZm86OlJHQkEgfSwKLSAgICAgICAgeyAxLCAgOCwgeyA4LCAwLCAgIDAsIDAsICAgMCwgMCwgICAwLCAwIH0sIFBpeGVsRm9ybWF0SW5mbzo6QUxQSEF9LAotICAgICAgICB7IDEsICA4LCB7IDAsIDAsICAgOCwgMCwgICA4LCAwLCAgIDgsIDAgfSwgUGl4ZWxGb3JtYXRJbmZvOjpMICAgIH0sCi0gICAgICAgIHsgMiwgMTYsIHsxNiwgOCwgICA4LCAwLCAgIDgsIDAsICAgOCwgMCB9LCBQaXhlbEZvcm1hdEluZm86OkxBICAgfSwKLSAgICAgICAgeyAxLCAgOCwgeyAwLCAwLCAgIDgsIDUsICAgNSwgMiwgICAyLCAwIH0sIFBpeGVsRm9ybWF0SW5mbzo6UkdCICB9LAotfTsKLQotc3RhdGljIGNvbnN0IEluZm8qIGdHZXRQaXhlbEZvcm1hdFRhYmxlKHNpemVfdCogbnVtRW50cmllcykgewotICAgIGlmIChudW1FbnRyaWVzKSB7Ci0gICAgICAgICpudW1FbnRyaWVzID0gc2l6ZW9mKHNQaXhlbEZvcm1hdEluZm9zKS9zaXplb2YoSW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBzUGl4ZWxGb3JtYXRJbmZvczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zaXplX3QgUGl4ZWxGb3JtYXRJbmZvOjpnZXRTY2FubGluZVNpemUodW5zaWduZWQgaW50IHdpZHRoKSBjb25zdAotewotICAgIHNpemVfdCBzaXplOwotICAgIGlmIChjb21wb25lbnRzID09IENPTVBPTkVOVF9ZVVYpIHsKLSAgICAgICAgLy8gWUNiQ3IgZm9ybWF0cyBhcmUgZGlmZmVyZW50LgotICAgICAgICBzaXplID0gKHdpZHRoICogYml0c1BlclBpeGVsKT4+MzsKLSAgICB9IGVsc2UgewotICAgICAgICBzaXplID0gd2lkdGggKiBieXRlc1BlclBpeGVsOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotc3NpemVfdCBieXRlc1BlclBpeGVsKFBpeGVsRm9ybWF0IGZvcm1hdCkKLXsKLSAgICBQaXhlbEZvcm1hdEluZm8gaW5mbzsKLSAgICBzdGF0dXNfdCBlcnIgPSBnZXRQaXhlbEZvcm1hdEluZm8oZm9ybWF0LCAmaW5mbyk7Ci0gICAgcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IGluZm8uYnl0ZXNQZXJQaXhlbDsKLX0KLQotc3NpemVfdCBiaXRzUGVyUGl4ZWwoUGl4ZWxGb3JtYXQgZm9ybWF0KQotewotICAgIFBpeGVsRm9ybWF0SW5mbyBpbmZvOwotICAgIHN0YXR1c190IGVyciA9IGdldFBpeGVsRm9ybWF0SW5mbyhmb3JtYXQsICZpbmZvKTsKLSAgICByZXR1cm4gKGVyciA8IDApID8gZXJyIDogaW5mby5iaXRzUGVyUGl4ZWw7Ci19Ci0KLXN0YXR1c190IGdldFBpeGVsRm9ybWF0SW5mbyhQaXhlbEZvcm1hdCBmb3JtYXQsIFBpeGVsRm9ybWF0SW5mbyogaW5mbykKLXsKLSAgICBpZiAoZm9ybWF0IDwgMCkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIGlmIChpbmZvLT52ZXJzaW9uICE9IHNpemVvZihQaXhlbEZvcm1hdEluZm8pKQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0KLSAgICAvLyBZVVYgZm9ybWF0IGZyb20gdGhlIEhBTCBhcmUgaGFuZGxlZCBoZXJlCi0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSToKLSAgICAgICAgaW5mby0+Yml0c1BlclBpeGVsID0gMTY7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOgotICAgICAgICBpbmZvLT5iaXRzUGVyUGl4ZWwgPSAxMjsKLSAgICAgZG9uZToKLSAgICAgICAgaW5mby0+Zm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBpbmZvLT5jb21wb25lbnRzID0gQ09NUE9ORU5UX1lVVjsKLSAgICAgICAgaW5mby0+Ynl0ZXNQZXJQaXhlbCA9IDE7Ci0gICAgICAgIGluZm8tPmhfYWxwaGEgPSAwOwotICAgICAgICBpbmZvLT5sX2FscGhhID0gMDsKLSAgICAgICAgaW5mby0+aF9yZWQgPSBpbmZvLT5oX2dyZWVuID0gaW5mby0+aF9ibHVlID0gODsKLSAgICAgICAgaW5mby0+bF9yZWQgPSBpbmZvLT5sX2dyZWVuID0gaW5mby0+bF9ibHVlID0gMDsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIHNpemVfdCBudW1FbnRyaWVzOwotICAgIGNvbnN0IEluZm8gKmkgPSBnR2V0UGl4ZWxGb3JtYXRUYWJsZSgmbnVtRW50cmllcykgKyBmb3JtYXQ7Ci0gICAgYm9vbCB2YWxpZCA9IHVpbnQzMl90KGZvcm1hdCkgPCBudW1FbnRyaWVzOwotICAgIGlmICghdmFsaWQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKLSAgICB9Ci0KLSAgICBpbmZvLT5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgaW5mby0+Ynl0ZXNQZXJQaXhlbCA9IGktPnNpemU7Ci0gICAgaW5mby0+Yml0c1BlclBpeGVsICA9IGktPmJpdHNQZXJQaXhlbDsKLSAgICBpbmZvLT5oX2FscGhhICAgICAgID0gaS0+YWg7Ci0gICAgaW5mby0+bF9hbHBoYSAgICAgICA9IGktPmFsOwotICAgIGluZm8tPmhfcmVkICAgICAgICAgPSBpLT5yaDsKLSAgICBpbmZvLT5sX3JlZCAgICAgICAgID0gaS0+cmw7Ci0gICAgaW5mby0+aF9ncmVlbiAgICAgICA9IGktPmdoOwotICAgIGluZm8tPmxfZ3JlZW4gICAgICAgPSBpLT5nbDsKLSAgICBpbmZvLT5oX2JsdWUgICAgICAgID0gaS0+Ymg7Ci0gICAgaW5mby0+bF9ibHVlICAgICAgICA9IGktPmJsOwotICAgIGluZm8tPmNvbXBvbmVudHMgICAgPSBpLT5jb21wb25lbnRzOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCmRpZmYgLS1naXQgYS9saWJzL3VpL1JlY3QuY3BwIGIvbGlicy91aS9SZWN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5NGUwMC4uMDAwMDAwMAotLS0gYS9saWJzL3VpL1JlY3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1aS9SZWN0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGlubGluZSBpbnQzMl90IG1pbihpbnQzMl90IGEsIGludDMyX3QgYikgewotICAgIHJldHVybiAoYTxiKSA/IGEgOiBiOwotfQotCi1zdGF0aWMgaW5saW5lIGludDMyX3QgbWF4KGludDMyX3QgYSwgaW50MzJfdCBiKSB7Ci0gICAgcmV0dXJuIChhPmIpID8gYSA6IGI7Ci19Ci0KLXZvaWQgUmVjdDo6bWFrZUludmFsaWQoKSB7Ci0gICAgbGVmdCA9IDA7Ci0gICAgdG9wID0gMDsKLSAgICByaWdodCA9IC0xOwotICAgIGJvdHRvbSA9IC0xOwotfQotCi1ib29sIFJlY3Q6Om9wZXJhdG9yIDwgKGNvbnN0IFJlY3QmIHJocykgY29uc3QKLXsKLSAgICBpZiAodG9wPHJocy50b3ApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmICh0b3AgPT0gcmhzLnRvcCkgewotICAgICAgICBpZiAobGVmdCA8IHJocy5sZWZ0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChsZWZ0ID09IHJocy5sZWZ0KSB7Ci0gICAgICAgICAgICBpZiAoYm90dG9tPHJocy5ib3R0b20pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYm90dG9tID09IHJocy5ib3R0b20pIHsKLSAgICAgICAgICAgICAgICBpZiAocmlnaHQ8cmhzLnJpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVJlY3QmIFJlY3Q6Om9mZnNldFRvKGludDMyX3QgeCwgaW50MzJfdCB5KQotewotICAgIHJpZ2h0IC09IGxlZnQgLSB4OwotICAgIGJvdHRvbSAtPSB0b3AgLSB5OwotICAgIGxlZnQgPSB4OwotICAgIHRvcCA9IHk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1SZWN0JiBSZWN0OjpvZmZzZXRCeShpbnQzMl90IHgsIGludDMyX3QgeSkKLXsKLSAgICBsZWZ0ICs9IHg7Ci0gICAgdG9wICArPSB5OwotICAgIHJpZ2h0Kz0geDsKLSAgICBib3R0b20rPXk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1jb25zdCBSZWN0IFJlY3Q6Om9wZXJhdG9yICsgKGNvbnN0IFBvaW50JiByaHMpIGNvbnN0Ci17Ci0gICAgY29uc3QgUmVjdCByZXN1bHQobGVmdCtyaHMueCwgdG9wK3Jocy55LCByaWdodCtyaHMueCwgYm90dG9tK3Jocy55KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1jb25zdCBSZWN0IFJlY3Q6Om9wZXJhdG9yIC0gKGNvbnN0IFBvaW50JiByaHMpIGNvbnN0Ci17Ci0gICAgY29uc3QgUmVjdCByZXN1bHQobGVmdC1yaHMueCwgdG9wLXJocy55LCByaWdodC1yaHMueCwgYm90dG9tLXJocy55KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sIFJlY3Q6OmludGVyc2VjdChjb25zdCBSZWN0JiB3aXRoLCBSZWN0KiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgcmVzdWx0LT5sZWZ0ICAgID0gbWF4KGxlZnQsIHdpdGgubGVmdCk7Ci0gICAgcmVzdWx0LT50b3AgICAgID0gbWF4KHRvcCwgd2l0aC50b3ApOwotICAgIHJlc3VsdC0+cmlnaHQgICA9IG1pbihyaWdodCwgd2l0aC5yaWdodCk7Ci0gICAgcmVzdWx0LT5ib3R0b20gID0gbWluKGJvdHRvbSwgd2l0aC5ib3R0b20pOwotICAgIHJldHVybiAhKHJlc3VsdC0+aXNFbXB0eSgpKTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdWkvUmVnaW9uLmNwcCBiL2xpYnMvdWkvUmVnaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyZTczMS4uMDAwMDAwMAotLS0gYS9saWJzL3VpL1JlZ2lvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmVnaW9uIgotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDx1aS9SZWN0Lmg+Ci0jaW5jbHVkZSA8dWkvUmVnaW9uLmg+Ci0jaW5jbHVkZSA8dWkvUG9pbnQuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvdWkvUmVnaW9uSGVscGVyLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNkZWZpbmUgVkFMSURBVEVfUkVHSU9OUyAgICAgICAgKGZhbHNlKQotI2RlZmluZSBWQUxJREFURV9XSVRIX0NPUkVDRyAgICAoZmFsc2UpCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBWQUxJREFURV9XSVRIX0NPUkVDRwotI2luY2x1ZGUgPGNvcmUvU2tSZWdpb24uaD4KLSNlbmRpZgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWVudW0gewotICAgIG9wX25hbmQgPSByZWdpb25fb3BlcmF0b3I8UmVjdD46Om9wX25hbmQsCi0gICAgb3BfYW5kICA9IHJlZ2lvbl9vcGVyYXRvcjxSZWN0Pjo6b3BfYW5kLAotICAgIG9wX29yICAgPSByZWdpb25fb3BlcmF0b3I8UmVjdD46Om9wX29yLAotICAgIG9wX3hvciAgPSByZWdpb25fb3BlcmF0b3I8UmVjdD46Om9wX3hvcgotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpb246OlJlZ2lvbigpCi0gICAgOiBtQm91bmRzKDAsMCkKLXsKLX0KLQotUmVnaW9uOjpSZWdpb24oY29uc3QgUmVnaW9uJiByaHMpCi0gICAgOiBtQm91bmRzKHJocy5tQm91bmRzKSwgbVN0b3JhZ2UocmhzLm1TdG9yYWdlKQotewotI2lmIFZBTElEQVRFX1JFR0lPTlMKLSAgICB2YWxpZGF0ZShyaHMsICJyaHMgY29weS1jdG9yIik7Ci0jZW5kaWYKLX0KLQotUmVnaW9uOjpSZWdpb24oY29uc3QgUmVjdCYgcmhzKQotICAgIDogbUJvdW5kcyhyaHMpCi17Ci19Ci0KLVJlZ2lvbjo6UmVnaW9uKGNvbnN0IHZvaWQqIGJ1ZmZlcikKLXsKLSAgICBzdGF0dXNfdCBlcnIgPSByZWFkKGJ1ZmZlcik7Ci0gICAgQUxPR0VfSUYoZXJyPDAsICJlcnJvciAlcyByZWFkaW5nIFJlZ2lvbiBmcm9tIGJ1ZmZlciIsIHN0cmVycm9yKGVycikpOwotfQotCi1SZWdpb246On5SZWdpb24oKQotewotfQotCi1SZWdpb24mIFJlZ2lvbjo6b3BlcmF0b3IgPSAoY29uc3QgUmVnaW9uJiByaHMpCi17Ci0jaWYgVkFMSURBVEVfUkVHSU9OUwotICAgIHZhbGlkYXRlKCp0aGlzLCAidGhpcy0+b3BlcmF0b3I9Iik7Ci0gICAgdmFsaWRhdGUocmhzLCAicmhzLm9wZXJhdG9yPSIpOwotI2VuZGlmCi0gICAgbUJvdW5kcyA9IHJocy5tQm91bmRzOwotICAgIG1TdG9yYWdlID0gcmhzLm1TdG9yYWdlOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotUmVnaW9uJiBSZWdpb246Om1ha2VCb3VuZHNTZWxmKCkKLXsKLSAgICBtU3RvcmFnZS5jbGVhcigpOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdm9pZCBSZWdpb246OmNsZWFyKCkKLXsKLSAgICBtQm91bmRzLmNsZWFyKCk7Ci0gICAgbVN0b3JhZ2UuY2xlYXIoKTsKLX0KLQotdm9pZCBSZWdpb246OnNldChjb25zdCBSZWN0JiByKQotewotICAgIG1Cb3VuZHMgPSByOwotICAgIG1TdG9yYWdlLmNsZWFyKCk7Ci19Ci0KLXZvaWQgUmVnaW9uOjpzZXQodWludDMyX3QgdywgdWludDMyX3QgaCkKLXsKLSAgICBtQm91bmRzID0gUmVjdChpbnQodyksIGludChoKSk7Ci0gICAgbVN0b3JhZ2UuY2xlYXIoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFJlZ2lvbjo6YWRkUmVjdFVuY2hlY2tlZChpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikKLXsKLSAgICBtU3RvcmFnZS5hZGQoUmVjdChsLHQscixiKSk7Ci0jaWYgVkFMSURBVEVfUkVHSU9OUwotICAgIHZhbGlkYXRlKCp0aGlzLCAiYWRkUmVjdFVuY2hlY2tlZCIpOwotI2VuZGlmCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaW9uJiBSZWdpb246Om9yU2VsZihjb25zdCBSZWN0JiByKSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblNlbGYociwgb3Bfb3IpOwotfQotUmVnaW9uJiBSZWdpb246OnhvclNlbGYoY29uc3QgUmVjdCYgcikgewotICAgIHJldHVybiBvcGVyYXRpb25TZWxmKHIsIG9wX3hvcik7Ci19Ci1SZWdpb24mIFJlZ2lvbjo6YW5kU2VsZihjb25zdCBSZWN0JiByKSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblNlbGYociwgb3BfYW5kKTsKLX0KLVJlZ2lvbiYgUmVnaW9uOjpzdWJ0cmFjdFNlbGYoY29uc3QgUmVjdCYgcikgewotICAgIHJldHVybiBvcGVyYXRpb25TZWxmKHIsIG9wX25hbmQpOwotfQotUmVnaW9uJiBSZWdpb246Om9wZXJhdGlvblNlbGYoY29uc3QgUmVjdCYgciwgaW50IG9wKSB7Ci0gICAgUmVnaW9uIGxocygqdGhpcyk7Ci0gICAgYm9vbGVhbl9vcGVyYXRpb24ob3AsICp0aGlzLCBsaHMsIHIpOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpb24mIFJlZ2lvbjo6b3JTZWxmKGNvbnN0IFJlZ2lvbiYgcmhzKSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblNlbGYocmhzLCBvcF9vcik7Ci19Ci1SZWdpb24mIFJlZ2lvbjo6eG9yU2VsZihjb25zdCBSZWdpb24mIHJocykgewotICAgIHJldHVybiBvcGVyYXRpb25TZWxmKHJocywgb3BfeG9yKTsKLX0KLVJlZ2lvbiYgUmVnaW9uOjphbmRTZWxmKGNvbnN0IFJlZ2lvbiYgcmhzKSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblNlbGYocmhzLCBvcF9hbmQpOwotfQotUmVnaW9uJiBSZWdpb246OnN1YnRyYWN0U2VsZihjb25zdCBSZWdpb24mIHJocykgewotICAgIHJldHVybiBvcGVyYXRpb25TZWxmKHJocywgb3BfbmFuZCk7Ci19Ci1SZWdpb24mIFJlZ2lvbjo6b3BlcmF0aW9uU2VsZihjb25zdCBSZWdpb24mIHJocywgaW50IG9wKSB7Ci0gICAgUmVnaW9uIGxocygqdGhpcyk7Ci0gICAgYm9vbGVhbl9vcGVyYXRpb24ob3AsICp0aGlzLCBsaHMsIHJocyk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1SZWdpb24mIFJlZ2lvbjo6dHJhbnNsYXRlU2VsZihpbnQgeCwgaW50IHkpIHsKLSAgICBpZiAoeHx5KSB0cmFuc2xhdGUoKnRoaXMsIHgsIHkpOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCBSZWdpb24gUmVnaW9uOjptZXJnZShjb25zdCBSZWN0JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0aW9uKHJocywgb3Bfb3IpOwotfQotY29uc3QgUmVnaW9uIFJlZ2lvbjo6bWVyZ2VFeGNsdXNpdmUoY29uc3QgUmVjdCYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbihyaHMsIG9wX3hvcik7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjppbnRlcnNlY3QoY29uc3QgUmVjdCYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbihyaHMsIG9wX2FuZCk7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjpzdWJ0cmFjdChjb25zdCBSZWN0JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0aW9uKHJocywgb3BfbmFuZCk7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjpvcGVyYXRpb24oY29uc3QgUmVjdCYgcmhzLCBpbnQgb3ApIGNvbnN0IHsKLSAgICBSZWdpb24gcmVzdWx0OwotICAgIGJvb2xlYW5fb3BlcmF0aW9uKG9wLCByZXN1bHQsICp0aGlzLCByaHMpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgUmVnaW9uIFJlZ2lvbjo6bWVyZ2UoY29uc3QgUmVnaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0aW9uKHJocywgb3Bfb3IpOwotfQotY29uc3QgUmVnaW9uIFJlZ2lvbjo6bWVyZ2VFeGNsdXNpdmUoY29uc3QgUmVnaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0aW9uKHJocywgb3BfeG9yKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246OmludGVyc2VjdChjb25zdCBSZWdpb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBvcGVyYXRpb24ocmhzLCBvcF9hbmQpOwotfQotY29uc3QgUmVnaW9uIFJlZ2lvbjo6c3VidHJhY3QoY29uc3QgUmVnaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0aW9uKHJocywgb3BfbmFuZCk7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjpvcGVyYXRpb24oY29uc3QgUmVnaW9uJiByaHMsIGludCBvcCkgY29uc3QgewotICAgIFJlZ2lvbiByZXN1bHQ7Ci0gICAgYm9vbGVhbl9vcGVyYXRpb24ob3AsIHJlc3VsdCwgKnRoaXMsIHJocyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY29uc3QgUmVnaW9uIFJlZ2lvbjo6dHJhbnNsYXRlKGludCB4LCBpbnQgeSkgY29uc3QgewotICAgIFJlZ2lvbiByZXN1bHQ7Ci0gICAgdHJhbnNsYXRlKHJlc3VsdCwgKnRoaXMsIHgsIHkpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaW9uJiBSZWdpb246Om9yU2VsZihjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uU2VsZihyaHMsIGR4LCBkeSwgb3Bfb3IpOwotfQotUmVnaW9uJiBSZWdpb246OnhvclNlbGYoY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblNlbGYocmhzLCBkeCwgZHksIG9wX3hvcik7Ci19Ci1SZWdpb24mIFJlZ2lvbjo6YW5kU2VsZihjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uU2VsZihyaHMsIGR4LCBkeSwgb3BfYW5kKTsKLX0KLVJlZ2lvbiYgUmVnaW9uOjpzdWJ0cmFjdFNlbGYoY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblNlbGYocmhzLCBkeCwgZHksIG9wX25hbmQpOwotfQotUmVnaW9uJiBSZWdpb246Om9wZXJhdGlvblNlbGYoY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5LCBpbnQgb3ApIHsKLSAgICBSZWdpb24gbGhzKCp0aGlzKTsKLSAgICBib29sZWFuX29wZXJhdGlvbihvcCwgKnRoaXMsIGxocywgcmhzLCBkeCwgZHkpOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCBSZWdpb24gUmVnaW9uOjptZXJnZShjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0aW9uKHJocywgZHgsIGR5LCBvcF9vcik7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjptZXJnZUV4Y2x1c2l2ZShjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0aW9uKHJocywgZHgsIGR5LCBvcF94b3IpOwotfQotY29uc3QgUmVnaW9uIFJlZ2lvbjo6aW50ZXJzZWN0KGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgZHgsIGludCBkeSkgY29uc3QgewotICAgIHJldHVybiBvcGVyYXRpb24ocmhzLCBkeCwgZHksIG9wX2FuZCk7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjpzdWJ0cmFjdChjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0aW9uKHJocywgZHgsIGR5LCBvcF9uYW5kKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246Om9wZXJhdGlvbihjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHksIGludCBvcCkgY29uc3QgewotICAgIFJlZ2lvbiByZXN1bHQ7Ci0gICAgYm9vbGVhbl9vcGVyYXRpb24ob3AsIHJlc3VsdCwgKnRoaXMsIHJocywgZHgsIGR5KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRoaXMgaXMgb3VyIHJlZ2lvbiByYXN0ZXJpemVyLCB3aGljaCBtZXJnZXMgcmVjdHMgYW5kIHNwYW5zIHRvZ2V0aGVyCi0vLyB0byBvYnRhaW4gYW4gb3B0aW1hbCByZWdpb24uCi1jbGFzcyBSZWdpb246OnJhc3Rlcml6ZXIgOiBwdWJsaWMgcmVnaW9uX29wZXJhdG9yPFJlY3Q+OjpyZWdpb25fcmFzdGVyaXplciAKLXsKLSAgICBSZWN0JiBib3VuZHM7Ci0gICAgVmVjdG9yPFJlY3Q+JiBzdG9yYWdlOwotICAgIFJlY3QqIGhlYWQ7Ci0gICAgUmVjdCogdGFpbDsKLSAgICBWZWN0b3I8UmVjdD4gc3BhbjsKLSAgICBSZWN0KiBjdXI7Ci1wdWJsaWM6Ci0gICAgcmFzdGVyaXplcihSZWdpb24mIHJlZykgCi0gICAgICAgIDogYm91bmRzKHJlZy5tQm91bmRzKSwgc3RvcmFnZShyZWcubVN0b3JhZ2UpLCBoZWFkKCksIHRhaWwoKSwgY3VyKCkgewotICAgICAgICBib3VuZHMudG9wID0gYm91bmRzLmJvdHRvbSA9IDA7Ci0gICAgICAgIGJvdW5kcy5sZWZ0ICAgPSBJTlRfTUFYOwotICAgICAgICBib3VuZHMucmlnaHQgID0gSU5UX01JTjsKLSAgICAgICAgc3RvcmFnZS5jbGVhcigpOwotICAgIH0KLQotICAgIH5yYXN0ZXJpemVyKCkgewotICAgICAgICBpZiAoc3Bhbi5zaXplKCkpIHsKLSAgICAgICAgICAgIGZsdXNoU3BhbigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdG9yYWdlLnNpemUoKSkgewotICAgICAgICAgICAgYm91bmRzLnRvcCA9IHN0b3JhZ2UuaXRlbUF0KDApLnRvcDsKLSAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBzdG9yYWdlLnRvcCgpLmJvdHRvbTsKLSAgICAgICAgICAgIGlmIChzdG9yYWdlLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc3RvcmFnZS5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm91bmRzLmxlZnQgID0gMDsKLSAgICAgICAgICAgIGJvdW5kcy5yaWdodCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoY29uc3QgUmVjdCYgcmVjdCkgewotICAgICAgICAvL0FMT0dEKCI+Pj4gJTNkLCAlM2QsICUzZCwgJTNkIiwKLSAgICAgICAgLy8gICAgICAgIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKLSAgICAgICAgaWYgKHNwYW4uc2l6ZSgpKSB7Ci0gICAgICAgICAgICBpZiAoY3VyLT50b3AgIT0gcmVjdC50b3ApIHsKLSAgICAgICAgICAgICAgICBmbHVzaFNwYW4oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyLT5yaWdodCA9PSByZWN0LmxlZnQpIHsKLSAgICAgICAgICAgICAgICBjdXItPnJpZ2h0ID0gcmVjdC5yaWdodDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3Bhbi5hZGQocmVjdCk7Ci0gICAgICAgIGN1ciA9IHNwYW4uZWRpdEFycmF5KCkgKyAoc3Bhbi5zaXplKCkgLSAxKTsKLSAgICB9Ci1wcml2YXRlOgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IAotICAgIHN0YXRpYyBpbmxpbmUgVCBtaW4oVCByaHMsIFQgbGhzKSB7IHJldHVybiByaHMgPCBsaHMgPyByaHMgOiBsaHM7IH0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAKLSAgICBzdGF0aWMgaW5saW5lIFQgbWF4KFQgcmhzLCBUIGxocykgeyByZXR1cm4gcmhzID4gbGhzID8gcmhzIDogbGhzOyB9Ci0gICAgdm9pZCBmbHVzaFNwYW4oKSB7Ci0gICAgICAgIGJvb2wgbWVyZ2UgPSBmYWxzZTsKLSAgICAgICAgaWYgKHRhaWwtaGVhZCA9PSBzc2l6ZV90KHNwYW4uc2l6ZSgpKSkgewotICAgICAgICAgICAgUmVjdCBjb25zdCogcCA9IHNwYW4uZWRpdEFycmF5KCk7Ci0gICAgICAgICAgICBSZWN0IGNvbnN0KiBxID0gaGVhZDsKLSAgICAgICAgICAgIGlmIChwLT50b3AgPT0gcS0+Ym90dG9tKSB7Ci0gICAgICAgICAgICAgICAgbWVyZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIHdoaWxlIChxICE9IHRhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwLT5sZWZ0ICE9IHEtPmxlZnQpIHx8IChwLT5yaWdodCAhPSBxLT5yaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwKyssIHErKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1lcmdlKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgYm90dG9tID0gc3BhblswXS5ib3R0b207Ci0gICAgICAgICAgICBSZWN0KiByID0gaGVhZDsKLSAgICAgICAgICAgIHdoaWxlIChyICE9IHRhaWwpIHsKLSAgICAgICAgICAgICAgICByLT5ib3R0b20gPSBib3R0b207Ci0gICAgICAgICAgICAgICAgcisrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm91bmRzLmxlZnQgPSBtaW4oc3Bhbi5pdGVtQXQoMCkubGVmdCwgYm91bmRzLmxlZnQpOwotICAgICAgICAgICAgYm91bmRzLnJpZ2h0ID0gbWF4KHNwYW4udG9wKCkucmlnaHQsIGJvdW5kcy5yaWdodCk7Ci0gICAgICAgICAgICBzdG9yYWdlLmFwcGVuZFZlY3RvcihzcGFuKTsKLSAgICAgICAgICAgIHRhaWwgPSBzdG9yYWdlLmVkaXRBcnJheSgpICsgc3RvcmFnZS5zaXplKCk7Ci0gICAgICAgICAgICBoZWFkID0gdGFpbCAtIHNwYW4uc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHNwYW4uY2xlYXIoKTsKLSAgICB9Ci19OwotCi1ib29sIFJlZ2lvbjo6dmFsaWRhdGUoY29uc3QgUmVnaW9uJiByZWcsIGNvbnN0IGNoYXIqIG5hbWUpCi17Ci0gICAgYm9vbCByZXN1bHQgPSB0cnVlOwotICAgIGNvbnN0X2l0ZXJhdG9yIGN1ciA9IHJlZy5iZWdpbigpOwotICAgIGNvbnN0X2l0ZXJhdG9yIGNvbnN0IHRhaWwgPSByZWcuZW5kKCk7Ci0gICAgY29uc3RfaXRlcmF0b3IgcHJldiA9IGN1cisrOwotICAgIFJlY3QgYigqcHJldik7Ci0gICAgd2hpbGUgKGN1ciAhPSB0YWlsKSB7Ci0gICAgICAgIGIubGVmdCAgID0gYi5sZWZ0ICAgPCBjdXItPmxlZnQgICA/IGIubGVmdCAgIDogY3VyLT5sZWZ0OwotICAgICAgICBiLnRvcCAgICA9IGIudG9wICAgIDwgY3VyLT50b3AgICAgPyBiLnRvcCAgICA6IGN1ci0+dG9wOwotICAgICAgICBiLnJpZ2h0ICA9IGIucmlnaHQgID4gY3VyLT5yaWdodCAgPyBiLnJpZ2h0ICA6IGN1ci0+cmlnaHQ7Ci0gICAgICAgIGIuYm90dG9tID0gYi5ib3R0b20gPiBjdXItPmJvdHRvbSA/IGIuYm90dG9tIDogY3VyLT5ib3R0b207Ci0gICAgICAgIGlmIChjdXItPnRvcCA9PSBwcmV2LT50b3ApIHsKLSAgICAgICAgICAgIGlmIChjdXItPmJvdHRvbSAhPSBwcmV2LT5ib3R0b20pIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgc3BhbiAlcCIsIG5hbWUsIGN1cik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1ci0+bGVmdCA8IHByZXYtPnJpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBzcGFucyBvdmVybGFwIGhvcml6b250YWxseSBwcmV2PSVwLCBjdXI9JXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgcHJldiwgY3VyKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjdXItPnRvcCA8IHByZXYtPmJvdHRvbSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBzcGFucyBvdmVybGFwIHZlcnRpY2FsbHkgcHJldj0lcCwgY3VyPSVwIiwKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwgcHJldiwgY3VyKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHByZXYgPSBjdXI7Ci0gICAgICAgIGN1cisrOwotICAgIH0KLSAgICBpZiAoYiAhPSByZWcuZ2V0Qm91bmRzKCkpIHsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBib3VuZHMgWyVkLCVkLCVkLCVkXSB2cy4gWyVkLCVkLCVkLCVkXSIsIG5hbWUsCi0gICAgICAgICAgICAgICAgYi5sZWZ0LCBiLnRvcCwgYi5yaWdodCwgYi5ib3R0b20sCi0gICAgICAgICAgICAgICAgcmVnLmdldEJvdW5kcygpLmxlZnQsIHJlZy5nZXRCb3VuZHMoKS50b3AsIAotICAgICAgICAgICAgICAgIHJlZy5nZXRCb3VuZHMoKS5yaWdodCwgcmVnLmdldEJvdW5kcygpLmJvdHRvbSk7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgPT0gZmFsc2UpIHsKLSAgICAgICAgcmVnLmR1bXAobmFtZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgUmVnaW9uOjpib29sZWFuX29wZXJhdGlvbihpbnQgb3AsIFJlZ2lvbiYgZHN0LAotICAgICAgICBjb25zdCBSZWdpb24mIGxocywKLSAgICAgICAgY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KQotewotI2lmIFZBTElEQVRFX1JFR0lPTlMKLSAgICB2YWxpZGF0ZShsaHMsICJib29sZWFuX29wZXJhdGlvbiAoYmVmb3JlKTogbGhzIik7Ci0gICAgdmFsaWRhdGUocmhzLCAiYm9vbGVhbl9vcGVyYXRpb24gKGJlZm9yZSk6IHJocyIpOwotICAgIHZhbGlkYXRlKGRzdCwgImJvb2xlYW5fb3BlcmF0aW9uIChiZWZvcmUpOiBkc3QiKTsKLSNlbmRpZgotCi0gICAgc2l6ZV90IGxoc19jb3VudDsKLSAgICBSZWN0IGNvbnN0ICogY29uc3QgbGhzX3JlY3RzID0gbGhzLmdldEFycmF5KCZsaHNfY291bnQpOwotCi0gICAgc2l6ZV90IHJoc19jb3VudDsKLSAgICBSZWN0IGNvbnN0ICogY29uc3QgcmhzX3JlY3RzID0gcmhzLmdldEFycmF5KCZyaHNfY291bnQpOwotCi0gICAgcmVnaW9uX29wZXJhdG9yPFJlY3Q+OjpyZWdpb24gbGhzX3JlZ2lvbihsaHNfcmVjdHMsIGxoc19jb3VudCk7Ci0gICAgcmVnaW9uX29wZXJhdG9yPFJlY3Q+OjpyZWdpb24gcmhzX3JlZ2lvbihyaHNfcmVjdHMsIHJoc19jb3VudCwgZHgsIGR5KTsKLSAgICByZWdpb25fb3BlcmF0b3I8UmVjdD4gb3BlcmF0aW9uKG9wLCBsaHNfcmVnaW9uLCByaHNfcmVnaW9uKTsKLSAgICB7IC8vIHNjb3BlIGZvciByYXN0ZXJpemVyIChkdG9yIGhhcyBzaWRlIGVmZmVjdHMpCi0gICAgICAgIHJhc3Rlcml6ZXIgcihkc3QpOwotICAgICAgICBvcGVyYXRpb24ocik7Ci0gICAgfQotCi0jaWYgVkFMSURBVEVfUkVHSU9OUwotICAgIHZhbGlkYXRlKGxocywgImJvb2xlYW5fb3BlcmF0aW9uOiBsaHMiKTsKLSAgICB2YWxpZGF0ZShyaHMsICJib29sZWFuX29wZXJhdGlvbjogcmhzIik7Ci0gICAgdmFsaWRhdGUoZHN0LCAiYm9vbGVhbl9vcGVyYXRpb246IGRzdCIpOwotI2VuZGlmCi0KLSNpZiBWQUxJREFURV9XSVRIX0NPUkVDRwotICAgIFNrUmVnaW9uIHNrX2xoczsKLSAgICBTa1JlZ2lvbiBza19yaHM7Ci0gICAgU2tSZWdpb24gc2tfZHN0OwotICAgIAotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8bGhzX2NvdW50IDsgaSsrKQotICAgICAgICBza19saHMub3AoCi0gICAgICAgICAgICAgICAgbGhzX3JlY3RzW2ldLmxlZnQgICArIGR4LAotICAgICAgICAgICAgICAgIGxoc19yZWN0c1tpXS50b3AgICAgKyBkeSwKLSAgICAgICAgICAgICAgICBsaHNfcmVjdHNbaV0ucmlnaHQgICsgZHgsCi0gICAgICAgICAgICAgICAgbGhzX3JlY3RzW2ldLmJvdHRvbSArIGR5LAotICAgICAgICAgICAgICAgIFNrUmVnaW9uOjprVW5pb25fT3ApOwotICAgIAotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8cmhzX2NvdW50IDsgaSsrKQotICAgICAgICBza19yaHMub3AoCi0gICAgICAgICAgICAgICAgcmhzX3JlY3RzW2ldLmxlZnQgICArIGR4LAotICAgICAgICAgICAgICAgIHJoc19yZWN0c1tpXS50b3AgICAgKyBkeSwKLSAgICAgICAgICAgICAgICByaHNfcmVjdHNbaV0ucmlnaHQgICsgZHgsCi0gICAgICAgICAgICAgICAgcmhzX3JlY3RzW2ldLmJvdHRvbSArIGR5LAotICAgICAgICAgICAgICAgIFNrUmVnaW9uOjprVW5pb25fT3ApOwotIAotICAgIGNvbnN0IGNoYXIqIG5hbWUgPSAiLS0tIjsKLSAgICBTa1JlZ2lvbjo6T3Agc2tfb3A7Ci0gICAgc3dpdGNoIChvcCkgewotICAgICAgICBjYXNlIG9wX29yOiBza19vcCA9IFNrUmVnaW9uOjprVW5pb25fT3A7IG5hbWU9Ik9SIjsgYnJlYWs7Ci0gICAgICAgIGNhc2Ugb3BfeG9yOiBza19vcCA9IFNrUmVnaW9uOjprVW5pb25fWE9SOyBuYW1lPSJYT1IiOyBicmVhazsKLSAgICAgICAgY2FzZSBvcF9hbmQ6IHNrX29wID0gU2tSZWdpb246OmtJbnRlcnNlY3RfT3A7IG5hbWU9IkFORCI7IGJyZWFrOwotICAgICAgICBjYXNlIG9wX25hbmQ6IHNrX29wID0gU2tSZWdpb246OmtEaWZmZXJlbmNlX09wOyBuYW1lPSJOQU5EIjsgYnJlYWs7Ci0gICAgfQotICAgIHNrX2RzdC5vcChza19saHMsIHNrX3Jocywgc2tfb3ApOwotCi0gICAgaWYgKHNrX2RzdC5pc0VtcHR5KCkgJiYgZHN0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGJvb2wgc2FtZSA9IHRydWU7Ci0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBoZWFkID0gZHN0LmJlZ2luKCk7Ci0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBjb25zdCB0YWlsID0gZHN0LmVuZCgpOwotICAgIFNrUmVnaW9uOjpJdGVyYXRvciBpdChza19kc3QpOwotICAgIHdoaWxlICghaXQuZG9uZSgpKSB7Ci0gICAgICAgIGlmIChoZWFkICE9IHRhaWwpIHsKLSAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgaGVhZC0+bGVmdCAhPSBpdC5yZWN0KCkuZkxlZnQgfHwgICAgIAotICAgICAgICAgICAgICAgICAgICBoZWFkLT50b3AgIT0gaXQucmVjdCgpLmZUb3AgfHwgICAgIAotICAgICAgICAgICAgICAgICAgICBoZWFkLT5yaWdodCAhPSBpdC5yZWN0KCkuZlJpZ2h0IHx8ICAgICAKLSAgICAgICAgICAgICAgICAgICAgaGVhZC0+Ym90dG9tICE9IGl0LnJlY3QoKS5mQm90dG9tCi0gICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICBzYW1lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYW1lID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBoZWFkKys7Ci0gICAgICAgIGl0Lm5leHQoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGhlYWQgIT0gdGFpbCkgewotICAgICAgICBzYW1lID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmKCFzYW1lKSB7Ci0gICAgICAgIEFMT0dEKCItLS1cbnJlZ2lvbiBib29sZWFuICVzIGZhaWxlZCIsIG5hbWUpOwotICAgICAgICBsaHMuZHVtcCgibGhzIik7Ci0gICAgICAgIHJocy5kdW1wKCJyaHMiKTsKLSAgICAgICAgZHN0LmR1bXAoImRzdCIpOwotICAgICAgICBBTE9HRCgic2hvdWxkIGJlIik7Ci0gICAgICAgIFNrUmVnaW9uOjpJdGVyYXRvciBpdChza19kc3QpOwotICAgICAgICB3aGlsZSAoIWl0LmRvbmUoKSkgewotICAgICAgICAgICAgQUxPR0QoIiAgICBbJTNkLCAlM2QsICUzZCwgJTNkXSIsCi0gICAgICAgICAgICAgICAgaXQucmVjdCgpLmZMZWZ0LAotICAgICAgICAgICAgICAgIGl0LnJlY3QoKS5mVG9wLAotICAgICAgICAgICAgICAgIGl0LnJlY3QoKS5mUmlnaHQsCi0gICAgICAgICAgICAgICAgaXQucmVjdCgpLmZCb3R0b20pOwotICAgICAgICAgICAgaXQubmV4dCgpOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi19Ci0KLXZvaWQgUmVnaW9uOjpib29sZWFuX29wZXJhdGlvbihpbnQgb3AsIFJlZ2lvbiYgZHN0LAotICAgICAgICBjb25zdCBSZWdpb24mIGxocywKLSAgICAgICAgY29uc3QgUmVjdCYgcmhzLCBpbnQgZHgsIGludCBkeSkKLXsKLSAgICBpZiAoIXJocy5pc1ZhbGlkKCkpIHsKLSAgICAgICAgQUxPR0UoIlJlZ2lvbjo6Ym9vbGVhbl9vcGVyYXRpb24ob3A9JWQpIGludmFsaWQgUmVjdD17JWQsJWQsJWQsJWR9IiwKLSAgICAgICAgICAgICAgICBvcCwgcmhzLmxlZnQsIHJocy50b3AsIHJocy5yaWdodCwgcmhzLmJvdHRvbSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZiBWQUxJREFURV9XSVRIX0NPUkVDRyB8fCBWQUxJREFURV9SRUdJT05TCi0gICAgYm9vbGVhbl9vcGVyYXRpb24ob3AsIGRzdCwgbGhzLCBSZWdpb24ocmhzKSwgZHgsIGR5KTsKLSNlbHNlCi0gICAgc2l6ZV90IGxoc19jb3VudDsKLSAgICBSZWN0IGNvbnN0ICogY29uc3QgbGhzX3JlY3RzID0gbGhzLmdldEFycmF5KCZsaHNfY291bnQpOwotCi0gICAgcmVnaW9uX29wZXJhdG9yPFJlY3Q+OjpyZWdpb24gbGhzX3JlZ2lvbihsaHNfcmVjdHMsIGxoc19jb3VudCk7Ci0gICAgcmVnaW9uX29wZXJhdG9yPFJlY3Q+OjpyZWdpb24gcmhzX3JlZ2lvbigmcmhzLCAxLCBkeCwgZHkpOwotICAgIHJlZ2lvbl9vcGVyYXRvcjxSZWN0PiBvcGVyYXRpb24ob3AsIGxoc19yZWdpb24sIHJoc19yZWdpb24pOwotICAgIHsgLy8gc2NvcGUgZm9yIHJhc3Rlcml6ZXIgKGR0b3IgaGFzIHNpZGUgZWZmZWN0cykKLSAgICAgICAgcmFzdGVyaXplciByKGRzdCk7Ci0gICAgICAgIG9wZXJhdGlvbihyKTsKLSAgICB9Ci0KLSNlbmRpZgotfQotCi12b2lkIFJlZ2lvbjo6Ym9vbGVhbl9vcGVyYXRpb24oaW50IG9wLCBSZWdpb24mIGRzdCwKLSAgICAgICAgY29uc3QgUmVnaW9uJiBsaHMsIGNvbnN0IFJlZ2lvbiYgcmhzKQotewotICAgIGJvb2xlYW5fb3BlcmF0aW9uKG9wLCBkc3QsIGxocywgcmhzLCAwLCAwKTsKLX0KLQotdm9pZCBSZWdpb246OmJvb2xlYW5fb3BlcmF0aW9uKGludCBvcCwgUmVnaW9uJiBkc3QsCi0gICAgICAgIGNvbnN0IFJlZ2lvbiYgbGhzLCBjb25zdCBSZWN0JiByaHMpCi17Ci0gICAgYm9vbGVhbl9vcGVyYXRpb24ob3AsIGRzdCwgbGhzLCByaHMsIDAsIDApOwotfQotCi12b2lkIFJlZ2lvbjo6dHJhbnNsYXRlKFJlZ2lvbiYgcmVnLCBpbnQgZHgsIGludCBkeSkKLXsKLSAgICBpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLSNpZiBWQUxJREFURV9SRUdJT05TCi0gICAgICAgIHZhbGlkYXRlKHJlZywgInRyYW5zbGF0ZSAoYmVmb3JlKSIpOwotI2VuZGlmCi0gICAgICAgIHJlZy5tQm91bmRzLnRyYW5zbGF0ZShkeCwgZHkpOwotICAgICAgICBzaXplX3QgY291bnQgPSByZWcubVN0b3JhZ2Uuc2l6ZSgpOwotICAgICAgICBSZWN0KiByZWN0cyA9IHJlZy5tU3RvcmFnZS5lZGl0QXJyYXkoKTsKLSAgICAgICAgd2hpbGUgKGNvdW50KSB7Ci0gICAgICAgICAgICByZWN0cy0+dHJhbnNsYXRlKGR4LCBkeSk7Ci0gICAgICAgICAgICByZWN0cysrOwotICAgICAgICAgICAgY291bnQtLTsKLSAgICAgICAgfQotI2lmIFZBTElEQVRFX1JFR0lPTlMKLSAgICAgICAgdmFsaWRhdGUocmVnLCAidHJhbnNsYXRlIChhZnRlcikiKTsKLSNlbmRpZgotICAgIH0KLX0KLQotdm9pZCBSZWdpb246OnRyYW5zbGF0ZShSZWdpb24mIGRzdCwgY29uc3QgUmVnaW9uJiByZWcsIGludCBkeCwgaW50IGR5KQotewotICAgIGRzdCA9IHJlZzsKLSAgICB0cmFuc2xhdGUoZHN0LCBkeCwgZHkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXNzaXplX3QgUmVnaW9uOjp3cml0ZSh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSBjb25zdAotewotI2lmIFZBTElEQVRFX1JFR0lPTlMKLSAgICB2YWxpZGF0ZSgqdGhpcywgIndyaXRlKGJ1ZmZlcikiKTsKLSNlbmRpZgotICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IG1TdG9yYWdlLnNpemUoKTsKLSAgICBjb25zdCBzaXplX3Qgc2l6ZU5lZWRlZCA9IHNpemVvZihpbnQzMl90KSArICgxK2NvdW50KSpzaXplb2YoUmVjdCk7Ci0gICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzaXplTmVlZGVkID4gc2l6ZSkgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgaW50MzJfdCogY29uc3QgcCA9IHN0YXRpY19jYXN0PGludDMyX3QqPihidWZmZXIpOwotICAgICAgICAqcCA9IGNvdW50OwotICAgICAgICBtZW1jcHkocCsxLCAmbUJvdW5kcywgc2l6ZW9mKFJlY3QpKTsKLSAgICAgICAgaWYgKGNvdW50KSB7Ci0gICAgICAgICAgICBtZW1jcHkocCs1LCBtU3RvcmFnZS5hcnJheSgpLCBjb3VudCpzaXplb2YoUmVjdCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzc2l6ZV90KHNpemVOZWVkZWQpOwotfQotCi1zc2l6ZV90IFJlZ2lvbjo6cmVhZChjb25zdCB2b2lkKiBidWZmZXIpCi17Ci0gICAgaW50MzJfdCBjb25zdCogY29uc3QgcCA9IHN0YXRpY19jYXN0PGludDMyX3QgY29uc3QqPihidWZmZXIpOyAKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSAqcDsKLSAgICBtZW1jcHkoJm1Cb3VuZHMsIHArMSwgc2l6ZW9mKFJlY3QpKTsKLSAgICBtU3RvcmFnZS5jbGVhcigpOwotICAgIGlmIChjb3VudCkgewotICAgICAgICBtU3RvcmFnZS5pbnNlcnRBdCgwLCBjb3VudCk7Ci0gICAgICAgIG1lbWNweShtU3RvcmFnZS5lZGl0QXJyYXkoKSwgcCs1LCBjb3VudCpzaXplb2YoUmVjdCkpOwotICAgIH0KLSNpZiBWQUxJREFURV9SRUdJT05TCi0gICAgdmFsaWRhdGUoKnRoaXMsICJyZWFkKGJ1ZmZlcikiKTsKLSNlbmRpZgotICAgIHJldHVybiBzc2l6ZV90KHNpemVvZihpbnQzMl90KSArICgxK2NvdW50KSpzaXplb2YoUmVjdCkpOwotfQotCi1zc2l6ZV90IFJlZ2lvbjo6d3JpdGVFbXB0eSh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQotewotICAgIGNvbnN0IHNpemVfdCBzaXplTmVlZGVkID0gc2l6ZW9mKGludDMyX3QpICsgc2l6ZW9mKFJlY3QpOwotICAgIGlmIChzaXplTmVlZGVkID4gc2l6ZSkgcmV0dXJuIE5PX01FTU9SWTsKLSAgICBpbnQzMl90KiBjb25zdCBwID0gc3RhdGljX2Nhc3Q8aW50MzJfdCo+KGJ1ZmZlcik7IAotICAgIG1lbXNldChwLCAwLCBzaXplTmVlZGVkKTsKLSAgICByZXR1cm4gc3NpemVfdChzaXplTmVlZGVkKTsKLX0KLQotYm9vbCBSZWdpb246OmlzRW1wdHkodm9pZCogYnVmZmVyKQotewotICAgIGludDMyX3QgY29uc3QqIGNvbnN0IHAgPSBzdGF0aWNfY2FzdDxpbnQzMl90IGNvbnN0Kj4oYnVmZmVyKTsgCi0gICAgUmVjdCBjb25zdCogY29uc3QgYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVjdCBjb25zdCAqPihwKzEpOwotICAgIHJldHVybiBiLT5pc0VtcHR5KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaW9uOjpjb25zdF9pdGVyYXRvciBSZWdpb246OmJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBpc1JlY3QoKSA/ICZtQm91bmRzIDogbVN0b3JhZ2UuYXJyYXkoKTsKLX0KLQotUmVnaW9uOjpjb25zdF9pdGVyYXRvciBSZWdpb246OmVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gaXNSZWN0KCkgPyAoKCZtQm91bmRzKSArIDEpIDogKG1TdG9yYWdlLmFycmF5KCkgKyBtU3RvcmFnZS5zaXplKCkpOwotfQotCi1SZWN0IGNvbnN0KiBSZWdpb246OmdldEFycmF5KHNpemVfdCogY291bnQpIGNvbnN0IHsKLSAgICBjb25zdF9pdGVyYXRvciBjb25zdCBiKGJlZ2luKCkpOwotICAgIGNvbnN0X2l0ZXJhdG9yIGNvbnN0IGUoZW5kKCkpOwotICAgIGlmIChjb3VudCkgKmNvdW50ID0gZS1iOwotICAgIHJldHVybiBiOwotfQotCi1zaXplX3QgUmVnaW9uOjpnZXRSZWN0cyhWZWN0b3I8UmVjdD4mIHJlY3RMaXN0KSBjb25zdAotewotICAgIHJlY3RMaXN0ID0gbVN0b3JhZ2U7Ci0gICAgaWYgKHJlY3RMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICByZWN0TGlzdC5jbGVhcigpOwotICAgICAgICByZWN0TGlzdC5hZGQobUJvdW5kcyk7Ci0gICAgfQotICAgIHJldHVybiByZWN0TGlzdC5zaXplKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBSZWdpb246OmR1bXAoU3RyaW5nOCYgb3V0LCBjb25zdCBjaGFyKiB3aGF0LCB1aW50MzJfdCBmbGFncykgY29uc3QKLXsKLSAgICAodm9pZClmbGFnczsKLSAgICBjb25zdF9pdGVyYXRvciBoZWFkID0gYmVnaW4oKTsKLSAgICBjb25zdF9pdGVyYXRvciBjb25zdCB0YWlsID0gZW5kKCk7Ci0KLSAgICBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgUmVnaW9uICVzICh0aGlzPSVwLCBjb3VudD0lZClcbiIsCi0gICAgICAgICAgICB3aGF0LCB0aGlzLCB0YWlsLWhlYWQpOwotICAgIG91dC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3aGlsZSAoaGVhZCAhPSB0YWlsKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBbJTNkLCAlM2QsICUzZCwgJTNkXVxuIiwKLSAgICAgICAgICAgICAgICBoZWFkLT5sZWZ0LCBoZWFkLT50b3AsIGhlYWQtPnJpZ2h0LCBoZWFkLT5ib3R0b20pOwotICAgICAgICBvdXQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIGhlYWQrKzsKLSAgICB9Ci19Ci0KLXZvaWQgUmVnaW9uOjpkdW1wKGNvbnN0IGNoYXIqIHdoYXQsIHVpbnQzMl90IGZsYWdzKSBjb25zdAotewotICAgICh2b2lkKWZsYWdzOwotICAgIGNvbnN0X2l0ZXJhdG9yIGhlYWQgPSBiZWdpbigpOwotICAgIGNvbnN0X2l0ZXJhdG9yIGNvbnN0IHRhaWwgPSBlbmQoKTsKLSAgICBBTE9HRCgiICBSZWdpb24gJXMgKHRoaXM9JXAsIGNvdW50PSVkKVxuIiwgd2hhdCwgdGhpcywgdGFpbC1oZWFkKTsKLSAgICB3aGlsZSAoaGVhZCAhPSB0YWlsKSB7Ci0gICAgICAgIEFMT0dEKCIgICAgWyUzZCwgJTNkLCAlM2QsICUzZF1cbiIsCi0gICAgICAgICAgICAgICAgaGVhZC0+bGVmdCwgaGVhZC0+dG9wLCBoZWFkLT5yaWdodCwgaGVhZC0+Ym90dG9tKTsKLSAgICAgICAgaGVhZCsrOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91aS90ZXN0cy9BbmRyb2lkLm1rIGIvbGlicy91aS90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGNhZDM2Li4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgQnVpbGQgdGhlIG1hbnVhbCB0ZXN0IHByb2dyYW1zLgotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwgJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2xpYnMvdWkvdGVzdHMvcmVnaW9uL0FuZHJvaWQubWsgYi9saWJzL3VpL3Rlc3RzL3JlZ2lvbi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M0YTVhLi4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvdGVzdHMvcmVnaW9uL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JcmVnaW9uLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYnV0aWxzIFwKLSAgICBsaWJ1aQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LXJlZ2lvbgotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2xpYnMvdWkvdGVzdHMvcmVnaW9uL3JlZ2lvbi5jcHAgYi9saWJzL3VpL3Rlc3RzL3JlZ2lvbi9yZWdpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQ3Mjk0Li4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvdGVzdHMvcmVnaW9uL3JlZ2lvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJSZWdpb24iCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+Ci0jaW5jbHVkZSA8dWkvUmVjdC5oPgotI2luY2x1ZGUgPHVpL1JlZ2lvbi5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotaW50IG1haW4oKQotewotICAgIFJlZ2lvbiBlbXB0eTsKLSAgICBSZWdpb24gcmVnMCggUmVjdCggIDAsIDAsICAxMDAsIDEwMCApICk7Ci0gICAgUmVnaW9uIHJlZzEgPSByZWcwOwotICAgIFJlZ2lvbiByZWcyLCByZWczOwotCi0gICAgUmVnaW9uIHJlZzQgPSBlbXB0eSB8IHJlZzE7Ci0gICAgUmVnaW9uIHJlZzUgPSByZWcxIHwgZW1wdHk7Ci0KLSAgICByZWc0LmR1bXAoInJlZzQiKTsKLSAgICByZWc1LmR1bXAoInJlZzUiKTsKLSAgICAKLSAgICByZWcwLmR1bXAoInJlZzAiKTsKLSAgICByZWcxLmR1bXAoInJlZzEiKTsKLQotICAgIHJlZzAgPSByZWcwIHwgcmVnMC50cmFuc2xhdGUoMTUwLCAwKTsKLSAgICByZWcwLmR1bXAoInJlZzAiKTsKLSAgICByZWcxLmR1bXAoInJlZzEiKTsKLQotICAgIHJlZzAgPSByZWcwIHwgcmVnMC50cmFuc2xhdGUoMzAwLCAwKTsKLSAgICByZWcwLmR1bXAoInJlZzAiKTsKLSAgICByZWcxLmR1bXAoInJlZzEiKTsKLQotICAgIC8vcmVnMiA9IHJlZzAgfCByZWcwLnRyYW5zbGF0ZSgwLCAxMDApOwotICAgIC8vcmVnMC5kdW1wKCJyZWcwIik7Ci0gICAgLy9yZWcxLmR1bXAoInJlZzEiKTsKLSAgICAvL3JlZzIuZHVtcCgicmVnMiIpOwotCi0gICAgLy9yZWczID0gcmVnMCB8IHJlZzAudHJhbnNsYXRlKDAsIDE1MCk7Ci0gICAgLy9yZWcwLmR1bXAoInJlZzAiKTsKLSAgICAvL3JlZzEuZHVtcCgicmVnMSIpOwotICAgIC8vcmVnMi5kdW1wKCJyZWcyIik7Ci0gICAgLy9yZWczLmR1bXAoInJlZzMiKTsKLQotICAgIEFMT0dEKCItLS0iKTsKLSAgICByZWcyID0gcmVnMCB8IHJlZzAudHJhbnNsYXRlKDEwMCwgMCk7Ci0gICAgcmVnMC5kdW1wKCJyZWcwIik7Ci0gICAgcmVnMS5kdW1wKCJyZWcxIik7Ci0gICAgcmVnMi5kdW1wKCJyZWcyIik7Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvQW5kcm9pZC5tayBiL2xpYnMvdXRpbHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjMDQ4YS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgbGlidXRpbHMgaXMgYSBsaXR0bGUgdW5pcXVlOiBJdCdzIGJ1aWx0IHR3aWNlLCBvbmNlIGZvciB0aGUgaG9zdAotIyBhbmQgb25jZSBmb3IgdGhlIGRldmljZS4KLQotY29tbW9uU291cmNlczo9IFwKLQlCYXNpY0hhc2h0YWJsZS5jcHAgXAotCUJsb2JDYWNoZS5jcHAgXAotCUJ1ZmZlcmVkVGV4dE91dHB1dC5jcHAgXAotCUNhbGxTdGFjay5jcHAgXAotCURlYnVnLmNwcCBcCi0JRmlsZU1hcC5jcHAgXAotCUZsYXR0ZW5hYmxlLmNwcCBcCi0JTGluZWFyVHJhbnNmb3JtLmNwcCBcCi0JUHJvcGVydHlNYXAuY3BwIFwKLQlSZWZCYXNlLmNwcCBcCi0JU2hhcmVkQnVmZmVyLmNwcCBcCi0JU3RhdGljLmNwcCBcCi0JU3RvcFdhdGNoLmNwcCBcCi0JU3RyaW5nOC5jcHAgXAotCVN0cmluZzE2LmNwcCBcCi0JU3RyaW5nQXJyYXkuY3BwIFwKLQlTeXN0ZW1DbG9jay5jcHAgXAotCVRleHRPdXRwdXQuY3BwIFwKLQlUaHJlYWRzLmNwcCBcCi0JVGltZXJzLmNwcCBcCi0JVG9rZW5pemVyLmNwcCBcCi0JVW5pY29kZS5jcHAgXAotCVZlY3RvckltcGwuY3BwIFwKLQltaXNjLmNwcAotCi0KLSMgRm9yIHRoZSBob3N0Ci0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAkKGNvbW1vblNvdXJjZXMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnV0aWxzCi0KLUxPQ0FMX0NGTEFHUyArPSAtRExJQlVUSUxTX05BVElWRT0xICQoVE9PTF9DRkxBR1MpCi0KLWlmZXEgKCQoSE9TVF9PUyksd2luZG93cykKLWlmZXEgKCQoc3RyaXAgJChVU0VfQ1lHV0lOKSwpLCkKLSMgVW5kZXIgTWluR1csIGN0eXBlLmggZG9lc24ndCBuZWVkIG11bHRpLWJ5dGUgc3VwcG9ydAotTE9DQUxfQ0ZMQUdTICs9IC1ETUJfQ1VSX01BWD0xCi1lbmRpZgotZW5kaWYKLQotaWZlcSAoJChUQVJHRVRfT1MpLGxpbnV4KQotTE9DQUxfTERMSUJTICs9IC1scnQgLWxkbAotZW5kaWYKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCi0KLQotIyBGb3IgdGhlIGRldmljZQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLQotIyB3ZSBoYXZlIHRoZSBjb21tb24gc291cmNlcywgcGx1cyBzb21lIGRldmljZS1zcGVjaWZpYyBzdHVmZgotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCSQoY29tbW9uU291cmNlcykgXAotCUxvb3Blci5jcHAgXAotCVRyYWNlLmNwcAotCi1pZmVxICgkKFRBUkdFVF9PUyksbGludXgpCi1MT0NBTF9MRExJQlMgKz0gLWxydCAtbGRsCi1lbmRpZgotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLQkJYmlvbmljL2xpYmMvcHJpdmF0ZQotCi1MT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmxvZyBcCi0JbGliY3V0aWxzIFwKLQlsaWJkbCBcCi0JbGliY29ya3NjcmV3Ci0KLUxPQ0FMX01PRFVMRTo9IGxpYnV0aWxzCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLSMgSW5jbHVkZSBzdWJkaXJlY3RvcnkgbWFrZWZpbGVzCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIElmIHdlJ3JlIGJ1aWxkaW5nIHdpdGggT05FX1NIT1RfTUFLRUZJTEUgKG1tLCBtbW0pLCB0aGVuIHdoYXQgdGhlIGZyYW1ld29yawotIyB0ZWFtIHJlYWxseSB3YW50cyBpcyB0byBidWlsZCB0aGUgc3R1ZmYgZGVmaW5lZCBieSB0aGlzIG1ha2VmaWxlLgotaWZlcSAoLCQoT05FX1NIT1RfTUFLRUZJTEUpKQotaW5jbHVkZSAkKGNhbGwgZmlyc3QtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCi1lbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9CYXNpY0hhc2h0YWJsZS5jcHAgYi9saWJzL3V0aWxzL0Jhc2ljSGFzaHRhYmxlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4ZWM5Zi4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL0Jhc2ljSGFzaHRhYmxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJCYXNpY0hhc2h0YWJsZSIKLQotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL0Jhc2ljSGFzaHRhYmxlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUJhc2ljSGFzaHRhYmxlSW1wbDo6QmFzaWNIYXNodGFibGVJbXBsKHNpemVfdCBlbnRyeVNpemUsIGJvb2wgaGFzVHJpdmlhbERlc3RydWN0b3IsCi0gICAgICAgIHNpemVfdCBtaW5pbXVtSW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSA6Ci0gICAgICAgIG1CdWNrZXRTaXplKGVudHJ5U2l6ZSArIHNpemVvZihCdWNrZXQpKSwgbUhhc1RyaXZpYWxEZXN0cnVjdG9yKGhhc1RyaXZpYWxEZXN0cnVjdG9yKSwKLSAgICAgICAgbUxvYWRGYWN0b3IobG9hZEZhY3RvciksIG1TaXplKDApLAotICAgICAgICBtRmlsbGVkQnVja2V0cygwKSwgbUJ1Y2tldHMoTlVMTCkgewotICAgIGRldGVybWluZUNhcGFjaXR5KG1pbmltdW1Jbml0aWFsQ2FwYWNpdHksIG1Mb2FkRmFjdG9yLCAmbUJ1Y2tldENvdW50LCAmbUNhcGFjaXR5KTsKLX0KLQotQmFzaWNIYXNodGFibGVJbXBsOjpCYXNpY0hhc2h0YWJsZUltcGwoY29uc3QgQmFzaWNIYXNodGFibGVJbXBsJiBvdGhlcikgOgotICAgICAgICBtQnVja2V0U2l6ZShvdGhlci5tQnVja2V0U2l6ZSksIG1IYXNUcml2aWFsRGVzdHJ1Y3RvcihvdGhlci5tSGFzVHJpdmlhbERlc3RydWN0b3IpLAotICAgICAgICBtQ2FwYWNpdHkob3RoZXIubUNhcGFjaXR5KSwgbUxvYWRGYWN0b3Iob3RoZXIubUxvYWRGYWN0b3IpLAotICAgICAgICBtU2l6ZShvdGhlci5tU2l6ZSksIG1GaWxsZWRCdWNrZXRzKG90aGVyLm1GaWxsZWRCdWNrZXRzKSwKLSAgICAgICAgbUJ1Y2tldENvdW50KG90aGVyLm1CdWNrZXRDb3VudCksIG1CdWNrZXRzKG90aGVyLm1CdWNrZXRzKSB7Ci0gICAgaWYgKG1CdWNrZXRzKSB7Ci0gICAgICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobUJ1Y2tldHMpLT5hY3F1aXJlKCk7Ci0gICAgfQotfQotCi12b2lkIEJhc2ljSGFzaHRhYmxlSW1wbDo6ZGlzcG9zZSgpIHsKLSAgICBpZiAobUJ1Y2tldHMpIHsKLSAgICAgICAgcmVsZWFzZUJ1Y2tldHMobUJ1Y2tldHMsIG1CdWNrZXRDb3VudCk7Ci0gICAgfQotfQotCi12b2lkIEJhc2ljSGFzaHRhYmxlSW1wbDo6Y2xvbmUoKSB7Ci0gICAgaWYgKG1CdWNrZXRzKSB7Ci0gICAgICAgIHZvaWQqIG5ld0J1Y2tldHMgPSBhbGxvY2F0ZUJ1Y2tldHMobUJ1Y2tldENvdW50KTsKLSAgICAgICAgY29weUJ1Y2tldHMobUJ1Y2tldHMsIG5ld0J1Y2tldHMsIG1CdWNrZXRDb3VudCk7Ci0gICAgICAgIHJlbGVhc2VCdWNrZXRzKG1CdWNrZXRzLCBtQnVja2V0Q291bnQpOwotICAgICAgICBtQnVja2V0cyA9IG5ld0J1Y2tldHM7Ci0gICAgfQotfQotCi12b2lkIEJhc2ljSGFzaHRhYmxlSW1wbDo6c2V0VG8oY29uc3QgQmFzaWNIYXNodGFibGVJbXBsJiBvdGhlcikgewotICAgIGlmIChtQnVja2V0cykgewotICAgICAgICByZWxlYXNlQnVja2V0cyhtQnVja2V0cywgbUJ1Y2tldENvdW50KTsKLSAgICB9Ci0KLSAgICBtQ2FwYWNpdHkgPSBvdGhlci5tQ2FwYWNpdHk7Ci0gICAgbUxvYWRGYWN0b3IgPSBvdGhlci5tTG9hZEZhY3RvcjsKLSAgICBtU2l6ZSA9IG90aGVyLm1TaXplOwotICAgIG1GaWxsZWRCdWNrZXRzID0gb3RoZXIubUZpbGxlZEJ1Y2tldHM7Ci0gICAgbUJ1Y2tldENvdW50ID0gb3RoZXIubUJ1Y2tldENvdW50OwotICAgIG1CdWNrZXRzID0gb3RoZXIubUJ1Y2tldHM7Ci0KLSAgICBpZiAobUJ1Y2tldHMpIHsKLSAgICAgICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtQnVja2V0cyktPmFjcXVpcmUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQmFzaWNIYXNodGFibGVJbXBsOjpjbGVhcigpIHsKLSAgICBpZiAobUJ1Y2tldHMpIHsKLSAgICAgICAgaWYgKG1GaWxsZWRCdWNrZXRzKSB7Ci0gICAgICAgICAgICBTaGFyZWRCdWZmZXIqIHNiID0gU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtQnVja2V0cyk7Ci0gICAgICAgICAgICBpZiAoc2ItPm9ubHlPd25lcigpKSB7Ci0gICAgICAgICAgICAgICAgZGVzdHJveUJ1Y2tldHMobUJ1Y2tldHMsIG1CdWNrZXRDb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJ1Y2tldCYgYnVja2V0ID0gYnVja2V0QXQobUJ1Y2tldHMsIGkpOwotICAgICAgICAgICAgICAgICAgICBidWNrZXQuY29va2llID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlbGVhc2VCdWNrZXRzKG1CdWNrZXRzLCBtQnVja2V0Q291bnQpOwotICAgICAgICAgICAgICAgIG1CdWNrZXRzID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1GaWxsZWRCdWNrZXRzID0gMDsKLSAgICAgICAgfQotICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgfQotfQotCi1zc2l6ZV90IEJhc2ljSGFzaHRhYmxlSW1wbDo6bmV4dChzc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKG1TaXplKSB7Ci0gICAgICAgIHdoaWxlIChzaXplX3QoKytpbmRleCkgPCBtQnVja2V0Q291bnQpIHsKLSAgICAgICAgICAgIGNvbnN0IEJ1Y2tldCYgYnVja2V0ID0gYnVja2V0QXQobUJ1Y2tldHMsIGluZGV4KTsKLSAgICAgICAgICAgIGlmIChidWNrZXQuY29va2llICYgQnVja2V0OjpQUkVTRU5UKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotc3NpemVfdCBCYXNpY0hhc2h0YWJsZUltcGw6OmZpbmQoc3NpemVfdCBpbmRleCwgaGFzaF90IGhhc2gsCi0gICAgICAgIGNvbnN0IHZvaWQqIF9fcmVzdHJpY3RfXyBrZXkpIGNvbnN0IHsKLSAgICBpZiAoIW1TaXplKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBoYXNoID0gdHJpbUhhc2goaGFzaCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBpbmRleCA9IGNoYWluU3RhcnQoaGFzaCwgbUJ1Y2tldENvdW50KTsKLQotICAgICAgICBjb25zdCBCdWNrZXQmIGJ1Y2tldCA9IGJ1Y2tldEF0KG1CdWNrZXRzLCBzaXplX3QoaW5kZXgpKTsKLSAgICAgICAgaWYgKGJ1Y2tldC5jb29raWUgJiBCdWNrZXQ6OlBSRVNFTlQpIHsKLSAgICAgICAgICAgIGlmIChjb21wYXJlQnVja2V0S2V5KGJ1Y2tldCwga2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghKGJ1Y2tldC5jb29raWUgJiBCdWNrZXQ6OkNPTExJU0lPTikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzaXplX3QgaW5jID0gY2hhaW5JbmNyZW1lbnQoaGFzaCwgbUJ1Y2tldENvdW50KTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGluZGV4ID0gY2hhaW5TZWVrKGluZGV4LCBpbmMsIG1CdWNrZXRDb3VudCk7Ci0KLSAgICAgICAgY29uc3QgQnVja2V0JiBidWNrZXQgPSBidWNrZXRBdChtQnVja2V0cywgc2l6ZV90KGluZGV4KSk7Ci0gICAgICAgIGlmIChidWNrZXQuY29va2llICYgQnVja2V0OjpQUkVTRU5UKSB7Ci0gICAgICAgICAgICBpZiAoKGJ1Y2tldC5jb29raWUgJiBCdWNrZXQ6OkhBU0hfTUFTSykgPT0gaGFzaAotICAgICAgICAgICAgICAgICAgICAmJiBjb21wYXJlQnVja2V0S2V5KGJ1Y2tldCwga2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIShidWNrZXQuY29va2llICYgQnVja2V0OjpDT0xMSVNJT04pKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXNpemVfdCBCYXNpY0hhc2h0YWJsZUltcGw6OmFkZChoYXNoX3QgaGFzaCwgY29uc3Qgdm9pZCogZW50cnkpIHsKLSAgICBpZiAoIW1CdWNrZXRzKSB7Ci0gICAgICAgIG1CdWNrZXRzID0gYWxsb2NhdGVCdWNrZXRzKG1CdWNrZXRDb3VudCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZWRpdCgpOwotICAgIH0KLQotICAgIGhhc2ggPSB0cmltSGFzaChoYXNoKTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHNpemVfdCBpbmRleCA9IGNoYWluU3RhcnQoaGFzaCwgbUJ1Y2tldENvdW50KTsKLSAgICAgICAgQnVja2V0KiBidWNrZXQgPSAmYnVja2V0QXQobUJ1Y2tldHMsIHNpemVfdChpbmRleCkpOwotICAgICAgICBpZiAoYnVja2V0LT5jb29raWUgJiBCdWNrZXQ6OlBSRVNFTlQpIHsKLSAgICAgICAgICAgIHNpemVfdCBpbmMgPSBjaGFpbkluY3JlbWVudChoYXNoLCBtQnVja2V0Q291bnQpOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGJ1Y2tldC0+Y29va2llIHw9IEJ1Y2tldDo6Q09MTElTSU9OOwotICAgICAgICAgICAgICAgIGluZGV4ID0gY2hhaW5TZWVrKGluZGV4LCBpbmMsIG1CdWNrZXRDb3VudCk7Ci0gICAgICAgICAgICAgICAgYnVja2V0ID0gJmJ1Y2tldEF0KG1CdWNrZXRzLCBzaXplX3QoaW5kZXgpKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKGJ1Y2tldC0+Y29va2llICYgQnVja2V0OjpQUkVTRU5UKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IGNvbGxpc2lvbiA9IGJ1Y2tldC0+Y29va2llICYgQnVja2V0OjpDT0xMSVNJT047Ci0gICAgICAgIGlmICghY29sbGlzaW9uKSB7Ci0gICAgICAgICAgICBpZiAobUZpbGxlZEJ1Y2tldHMgPj0gbUNhcGFjaXR5KSB7Ci0gICAgICAgICAgICAgICAgcmVoYXNoKG1DYXBhY2l0eSAqIDIsIG1Mb2FkRmFjdG9yKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1GaWxsZWRCdWNrZXRzICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBidWNrZXQtPmNvb2tpZSA9IGNvbGxpc2lvbiB8IEJ1Y2tldDo6UFJFU0VOVCB8IGhhc2g7Ci0gICAgICAgIG1TaXplICs9IDE7Ci0gICAgICAgIGluaXRpYWxpemVCdWNrZXRFbnRyeSgqYnVja2V0LCBlbnRyeSk7Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci19Ci0KLXZvaWQgQmFzaWNIYXNodGFibGVJbXBsOjpyZW1vdmVBdChzaXplX3QgaW5kZXgpIHsKLSAgICBlZGl0KCk7Ci0KLSAgICBCdWNrZXQmIGJ1Y2tldCA9IGJ1Y2tldEF0KG1CdWNrZXRzLCBpbmRleCk7Ci0gICAgYnVja2V0LmNvb2tpZSAmPSB+QnVja2V0OjpQUkVTRU5UOwotICAgIGlmICghKGJ1Y2tldC5jb29raWUgJiBCdWNrZXQ6OkNPTExJU0lPTikpIHsKLSAgICAgICAgbUZpbGxlZEJ1Y2tldHMgLT0gMTsKLSAgICB9Ci0gICAgbVNpemUgLT0gMTsKLSAgICBpZiAoIW1IYXNUcml2aWFsRGVzdHJ1Y3RvcikgewotICAgICAgICBkZXN0cm95QnVja2V0RW50cnkoYnVja2V0KTsKLSAgICB9Ci19Ci0KLXZvaWQgQmFzaWNIYXNodGFibGVJbXBsOjpyZWhhc2goc2l6ZV90IG1pbmltdW1DYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewotICAgIGlmIChtaW5pbXVtQ2FwYWNpdHkgPCBtU2l6ZSkgewotICAgICAgICBtaW5pbXVtQ2FwYWNpdHkgPSBtU2l6ZTsKLSAgICB9Ci0gICAgc2l6ZV90IG5ld0J1Y2tldENvdW50LCBuZXdDYXBhY2l0eTsKLSAgICBkZXRlcm1pbmVDYXBhY2l0eShtaW5pbXVtQ2FwYWNpdHksIGxvYWRGYWN0b3IsICZuZXdCdWNrZXRDb3VudCwgJm5ld0NhcGFjaXR5KTsKLQotICAgIGlmIChuZXdCdWNrZXRDb3VudCAhPSBtQnVja2V0Q291bnQgfHwgbmV3Q2FwYWNpdHkgIT0gbUNhcGFjaXR5KSB7Ci0gICAgICAgIGlmIChtQnVja2V0cykgewotICAgICAgICAgICAgdm9pZCogbmV3QnVja2V0czsKLSAgICAgICAgICAgIGlmIChtU2l6ZSkgewotICAgICAgICAgICAgICAgIG5ld0J1Y2tldHMgPSBhbGxvY2F0ZUJ1Y2tldHMobmV3QnVja2V0Q291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1Y2tldENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVja2V0JiBmcm9tQnVja2V0ID0gYnVja2V0QXQobUJ1Y2tldHMsIGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbUJ1Y2tldC5jb29raWUgJiBCdWNrZXQ6OlBSRVNFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfdCBoYXNoID0gZnJvbUJ1Y2tldC5jb29raWUgJiBCdWNrZXQ6OkhBU0hfTUFTSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbmRleCA9IGNoYWluU3RhcnQoaGFzaCwgbmV3QnVja2V0Q291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V0KiB0b0J1Y2tldCA9ICZidWNrZXRBdChuZXdCdWNrZXRzLCBzaXplX3QoaW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0J1Y2tldC0+Y29va2llICYgQnVja2V0OjpQUkVTRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluYyA9IGNoYWluSW5jcmVtZW50KGhhc2gsIG5ld0J1Y2tldENvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQnVja2V0LT5jb29raWUgfD0gQnVja2V0OjpDT0xMSVNJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gY2hhaW5TZWVrKGluZGV4LCBpbmMsIG5ld0J1Y2tldENvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9CdWNrZXQgPSAmYnVja2V0QXQobmV3QnVja2V0cywgc2l6ZV90KGluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodG9CdWNrZXQtPmNvb2tpZSAmIEJ1Y2tldDo6UFJFU0VOVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b0J1Y2tldC0+Y29va2llID0gQnVja2V0OjpQUkVTRU5UIHwgaGFzaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVCdWNrZXRFbnRyeSgqdG9CdWNrZXQsIGZyb21CdWNrZXQuZW50cnkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXdCdWNrZXRzID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbGVhc2VCdWNrZXRzKG1CdWNrZXRzLCBtQnVja2V0Q291bnQpOwotICAgICAgICAgICAgbUJ1Y2tldHMgPSBuZXdCdWNrZXRzOwotICAgICAgICAgICAgbUZpbGxlZEJ1Y2tldHMgPSBtU2l6ZTsKLSAgICAgICAgfQotICAgICAgICBtQnVja2V0Q291bnQgPSBuZXdCdWNrZXRDb3VudDsKLSAgICAgICAgbUNhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7Ci0gICAgfQotICAgIG1Mb2FkRmFjdG9yID0gbG9hZEZhY3RvcjsKLX0KLQotdm9pZCogQmFzaWNIYXNodGFibGVJbXBsOjphbGxvY2F0ZUJ1Y2tldHMoc2l6ZV90IGNvdW50KSBjb25zdCB7Ci0gICAgc2l6ZV90IGJ5dGVzID0gY291bnQgKiBtQnVja2V0U2l6ZTsKLSAgICBTaGFyZWRCdWZmZXIqIHNiID0gU2hhcmVkQnVmZmVyOjphbGxvYyhieXRlcyk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRighc2IsICJDb3VsZCBub3QgYWxsb2NhdGUgJXUgYnl0ZXMgZm9yIGhhc2h0YWJsZSB3aXRoICV1IGJ1Y2tldHMuIiwKLSAgICAgICAgICAgIHVpbnQzMl90KGJ5dGVzKSwgdWludDMyX3QoY291bnQpKTsKLSAgICB2b2lkKiBidWNrZXRzID0gc2ItPmRhdGEoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgQnVja2V0JiBidWNrZXQgPSBidWNrZXRBdChidWNrZXRzLCBpKTsKLSAgICAgICAgYnVja2V0LmNvb2tpZSA9IDA7Ci0gICAgfQotICAgIHJldHVybiBidWNrZXRzOwotfQotCi12b2lkIEJhc2ljSGFzaHRhYmxlSW1wbDo6cmVsZWFzZUJ1Y2tldHModm9pZCogX19yZXN0cmljdF9fIGJ1Y2tldHMsIHNpemVfdCBjb3VudCkgY29uc3QgewotICAgIFNoYXJlZEJ1ZmZlciogc2IgPSBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKGJ1Y2tldHMpOwotICAgIGlmIChzYi0+cmVsZWFzZShTaGFyZWRCdWZmZXI6OmVLZWVwU3RvcmFnZSkgPT0gMSkgewotICAgICAgICBkZXN0cm95QnVja2V0cyhidWNrZXRzLCBjb3VudCk7Ci0gICAgICAgIFNoYXJlZEJ1ZmZlcjo6ZGVhbGxvYyhzYik7Ci0gICAgfQotfQotCi12b2lkIEJhc2ljSGFzaHRhYmxlSW1wbDo6ZGVzdHJveUJ1Y2tldHModm9pZCogX19yZXN0cmljdF9fIGJ1Y2tldHMsIHNpemVfdCBjb3VudCkgY29uc3QgewotICAgIGlmICghbUhhc1RyaXZpYWxEZXN0cnVjdG9yKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgQnVja2V0JiBidWNrZXQgPSBidWNrZXRBdChidWNrZXRzLCBpKTsKLSAgICAgICAgICAgIGlmIChidWNrZXQuY29va2llICYgQnVja2V0OjpQUkVTRU5UKSB7Ci0gICAgICAgICAgICAgICAgZGVzdHJveUJ1Y2tldEVudHJ5KGJ1Y2tldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQmFzaWNIYXNodGFibGVJbXBsOjpjb3B5QnVja2V0cyhjb25zdCB2b2lkKiBfX3Jlc3RyaWN0X18gZnJvbUJ1Y2tldHMsCi0gICAgICAgIHZvaWQqIF9fcmVzdHJpY3RfXyB0b0J1Y2tldHMsIHNpemVfdCBjb3VudCkgY29uc3QgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBjb25zdCBCdWNrZXQmIGZyb21CdWNrZXQgPSBidWNrZXRBdChmcm9tQnVja2V0cywgaSk7Ci0gICAgICAgIEJ1Y2tldCYgdG9CdWNrZXQgPSBidWNrZXRBdCh0b0J1Y2tldHMsIGkpOwotICAgICAgICB0b0J1Y2tldC5jb29raWUgPSBmcm9tQnVja2V0LmNvb2tpZTsKLSAgICAgICAgaWYgKGZyb21CdWNrZXQuY29va2llICYgQnVja2V0OjpQUkVTRU5UKSB7Ci0gICAgICAgICAgICBpbml0aWFsaXplQnVja2V0RW50cnkodG9CdWNrZXQsIGZyb21CdWNrZXQuZW50cnkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBUYWJsZSBvZiAzMS1iaXQgcHJpbWVzIHdoZXJlIGVhY2ggcHJpbWUgaXMgbm8gbGVzcyB0aGFuIHR3aWNlIGFzIGxhcmdlCi0vLyBhcyB0aGUgcHJldmlvdXMgb25lLiAgR2VuZXJhdGVkIGJ5ICJwcmltZXMucHkiLgotc3RhdGljIHNpemVfdCBQUklNRVNbXSA9IHsKLSAgICA1LAotICAgIDExLAotICAgIDIzLAotICAgIDQ3LAotICAgIDk3LAotICAgIDE5NywKLSAgICAzOTcsCi0gICAgNzk3LAotICAgIDE1OTcsCi0gICAgMzIwMywKLSAgICA2NDIxLAotICAgIDEyODUzLAotICAgIDI1NzE3LAotICAgIDUxNDM3LAotICAgIDEwMjg3NywKLSAgICAyMDU3NTksCi0gICAgNDExNTI3LAotICAgIDgyMzExNywKLSAgICAxNjQ2MjM3LAotICAgIDMyOTI0ODksCi0gICAgNjU4NDk4MywKLSAgICAxMzE2OTk3NywKLSAgICAyNjMzOTk2OSwKLSAgICA1MjY3OTk2OSwKLSAgICAxMDUzNTk5MzksCi0gICAgMjEwNzE5ODgxLAotICAgIDQyMTQzOTc4MywKLSAgICA4NDI4Nzk1NzksCi0gICAgMTY4NTc1OTE2NywKLSAgICAwLAotfTsKLQotdm9pZCBCYXNpY0hhc2h0YWJsZUltcGw6OmRldGVybWluZUNhcGFjaXR5KHNpemVfdCBtaW5pbXVtQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IsCi0gICAgICAgIHNpemVfdCogX19yZXN0cmljdF9fIG91dEJ1Y2tldENvdW50LCBzaXplX3QqIF9fcmVzdHJpY3RfXyBvdXRDYXBhY2l0eSkgewotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobG9hZEZhY3RvciA8PSAwLjBmIHx8IGxvYWRGYWN0b3IgPiAxLjBmLAotICAgICAgICAgICAgIkludmFsaWQgbG9hZCBmYWN0b3IgJTAuM2YuICBNdXN0IGJlIGluIHRoZSByYW5nZSAoMCwgMV0uIiwgbG9hZEZhY3Rvcik7Ci0KLSAgICBzaXplX3QgY291bnQgPSBjZWlsZihtaW5pbXVtQ2FwYWNpdHkgLyBsb2FkRmFjdG9yKSArIDE7Ci0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChjb3VudCA+IFBSSU1FU1tpXSAmJiBpIDwgTkVMRU0oUFJJTUVTKSkgewotICAgICAgICBpKys7Ci0gICAgfQotICAgIGNvdW50ID0gUFJJTUVTW2ldOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWNvdW50LCAiQ291bGQgbm90IGRldGVybWluZSByZXF1aXJlZCBudW1iZXIgb2YgYnVja2V0cyBmb3IgIgotICAgICAgICAgICAgImhhc2h0YWJsZSB3aXRoIG1pbmltdW0gY2FwYWNpdHkgJXUgYW5kIGxvYWQgZmFjdG9yICUwLjNmLiIsCi0gICAgICAgICAgICB1aW50MzJfdChtaW5pbXVtQ2FwYWNpdHkpLCBsb2FkRmFjdG9yKTsKLSAgICAqb3V0QnVja2V0Q291bnQgPSBjb3VudDsKLSAgICAqb3V0Q2FwYWNpdHkgPSBjZWlsZigoY291bnQgLSAxKSAqIGxvYWRGYWN0b3IpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9CbG9iQ2FjaGUuY3BwIGIvbGlicy91dGlscy9CbG9iQ2FjaGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTM5OGVlLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvQmxvYkNhY2hlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJCbG9iQ2FjaGUiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Jsb2JDYWNoZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEJsb2JDYWNoZTo6SGVhZGVyOjptTWFnaWNOdW1iZXIgdmFsdWUKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBibG9iQ2FjaGVNYWdpYyA9ICdfQmIkJzsKLQotLy8gQmxvYkNhY2hlOjpIZWFkZXI6Om1CbG9iQ2FjaGVWZXJzaW9uIHZhbHVlCi1zdGF0aWMgY29uc3QgdWludDMyX3QgYmxvYkNhY2hlVmVyc2lvbiA9IDE7Ci0KLS8vIEJsb2JDYWNoZTo6SGVhZGVyOjptRGV2aWNlVmVyc2lvbiB2YWx1ZQotc3RhdGljIGNvbnN0IHVpbnQzMl90IGJsb2JDYWNoZURldmljZVZlcnNpb24gPSAxOwotCi1CbG9iQ2FjaGU6OkJsb2JDYWNoZShzaXplX3QgbWF4S2V5U2l6ZSwgc2l6ZV90IG1heFZhbHVlU2l6ZSwgc2l6ZV90IG1heFRvdGFsU2l6ZSk6Ci0gICAgICAgIG1NYXhLZXlTaXplKG1heEtleVNpemUpLAotICAgICAgICBtTWF4VmFsdWVTaXplKG1heFZhbHVlU2l6ZSksCi0gICAgICAgIG1NYXhUb3RhbFNpemUobWF4VG90YWxTaXplKSwKLSAgICAgICAgbVRvdGFsU2l6ZSgwKSB7Ci0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0jaWZkZWYgX1dJTjMyCi0gICAgc3JhbmQobm93KTsKLSNlbHNlCi0gICAgbVJhbmRTdGF0ZVswXSA9IChub3cgPj4gMCkgJiAweEZGRkY7Ci0gICAgbVJhbmRTdGF0ZVsxXSA9IChub3cgPj4gMTYpICYgMHhGRkZGOwotICAgIG1SYW5kU3RhdGVbMl0gPSAobm93ID4+IDMyKSAmIDB4RkZGRjsKLSNlbmRpZgotICAgIEFMT0dWKCJpbml0aWFsaXppbmcgcmFuZG9tIHNlZWQgdXNpbmcgJWxsZCIsIG5vdyk7Ci19Ci0KLXZvaWQgQmxvYkNhY2hlOjpzZXQoY29uc3Qgdm9pZCoga2V5LCBzaXplX3Qga2V5U2l6ZSwgY29uc3Qgdm9pZCogdmFsdWUsCi0gICAgICAgIHNpemVfdCB2YWx1ZVNpemUpIHsKLSAgICBpZiAobU1heEtleVNpemUgPCBrZXlTaXplKSB7Ci0gICAgICAgIEFMT0dWKCJzZXQ6IG5vdCBjYWNoaW5nIGJlY2F1c2UgdGhlIGtleSBpcyB0b28gbGFyZ2U6ICVkIChsaW1pdDogJWQpIiwKLSAgICAgICAgICAgICAgICBrZXlTaXplLCBtTWF4S2V5U2l6ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1NYXhWYWx1ZVNpemUgPCB2YWx1ZVNpemUpIHsKLSAgICAgICAgQUxPR1YoInNldDogbm90IGNhY2hpbmcgYmVjYXVzZSB0aGUgdmFsdWUgaXMgdG9vIGxhcmdlOiAlZCAobGltaXQ6ICVkKSIsCi0gICAgICAgICAgICAgICAgdmFsdWVTaXplLCBtTWF4VmFsdWVTaXplKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobU1heFRvdGFsU2l6ZSA8IGtleVNpemUgKyB2YWx1ZVNpemUpIHsKLSAgICAgICAgQUxPR1YoInNldDogbm90IGNhY2hpbmcgYmVjYXVzZSB0aGUgY29tYmluZWQga2V5L3ZhbHVlIHNpemUgaXMgdG9vICIKLSAgICAgICAgICAgICAgICAibGFyZ2U6ICVkIChsaW1pdDogJWQpIiwga2V5U2l6ZSArIHZhbHVlU2l6ZSwgbU1heFRvdGFsU2l6ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGtleVNpemUgPT0gMCkgewotICAgICAgICBBTE9HVygic2V0OiBub3QgY2FjaGluZyBiZWNhdXNlIGtleVNpemUgaXMgMCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh2YWx1ZVNpemUgPD0gMCkgewotICAgICAgICBBTE9HVygic2V0OiBub3QgY2FjaGluZyBiZWNhdXNlIHZhbHVlU2l6ZSBpcyAwIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxCbG9iPiBkdW1teUtleShuZXcgQmxvYihrZXksIGtleVNpemUsIGZhbHNlKSk7Ci0gICAgQ2FjaGVFbnRyeSBkdW1teUVudHJ5KGR1bW15S2V5LCBOVUxMKTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGVFbnRyaWVzLmluZGV4T2YoZHVtbXlFbnRyeSk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBjYWNoZSBlbnRyeS4KLSAgICAgICAgICAgIHNwPEJsb2I+IGtleUJsb2IobmV3IEJsb2Ioa2V5LCBrZXlTaXplLCB0cnVlKSk7Ci0gICAgICAgICAgICBzcDxCbG9iPiB2YWx1ZUJsb2IobmV3IEJsb2IodmFsdWUsIHZhbHVlU2l6ZSwgdHJ1ZSkpOwotICAgICAgICAgICAgc2l6ZV90IG5ld1RvdGFsU2l6ZSA9IG1Ub3RhbFNpemUgKyBrZXlTaXplICsgdmFsdWVTaXplOwotICAgICAgICAgICAgaWYgKG1NYXhUb3RhbFNpemUgPCBuZXdUb3RhbFNpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNDbGVhbmFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbiB0aGUgY2FjaGUgYW5kIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICAgICAgY2xlYW4oKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldDogbm90IGNhY2hpbmcgbmV3IGtleS92YWx1ZSBwYWlyIGJlY2F1c2UgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgY2FjaGUgc2l6ZSBsaW1pdCB3b3VsZCBiZSBleGNlZWRlZDogJWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIobGltaXQ6ICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5U2l6ZSArIHZhbHVlU2l6ZSwgbU1heFRvdGFsU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWNoZUVudHJpZXMuYWRkKENhY2hlRW50cnkoa2V5QmxvYiwgdmFsdWVCbG9iKSk7Ci0gICAgICAgICAgICBtVG90YWxTaXplID0gbmV3VG90YWxTaXplOwotICAgICAgICAgICAgQUxPR1YoInNldDogY3JlYXRlZCBuZXcgY2FjaGUgZW50cnkgd2l0aCAlZCBieXRlIGtleSBhbmQgJWQgYnl0ZSB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgIGtleVNpemUsIHZhbHVlU2l6ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGNhY2hlIGVudHJ5LgotICAgICAgICAgICAgc3A8QmxvYj4gdmFsdWVCbG9iKG5ldyBCbG9iKHZhbHVlLCB2YWx1ZVNpemUsIHRydWUpKTsKLSAgICAgICAgICAgIHNwPEJsb2I+IG9sZFZhbHVlQmxvYihtQ2FjaGVFbnRyaWVzW2luZGV4XS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHNpemVfdCBuZXdUb3RhbFNpemUgPSBtVG90YWxTaXplICsgdmFsdWVTaXplIC0gb2xkVmFsdWVCbG9iLT5nZXRTaXplKCk7Ci0gICAgICAgICAgICBpZiAobU1heFRvdGFsU2l6ZSA8IG5ld1RvdGFsU2l6ZSkgewotICAgICAgICAgICAgICAgIGlmIChpc0NsZWFuYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIHRoZSBjYWNoZSBhbmQgdHJ5IGFnYWluLgotICAgICAgICAgICAgICAgICAgICBjbGVhbigpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0OiBub3QgY2FjaGluZyBuZXcgdmFsdWUgYmVjYXVzZSB0aGUgdG90YWwgY2FjaGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIGxpbWl0IHdvdWxkIGJlIGV4Y2VlZGVkOiAlZCAobGltaXQ6ICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5U2l6ZSArIHZhbHVlU2l6ZSwgbU1heFRvdGFsU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWNoZUVudHJpZXMuZWRpdEl0ZW1BdChpbmRleCkuc2V0VmFsdWUodmFsdWVCbG9iKTsKLSAgICAgICAgICAgIG1Ub3RhbFNpemUgPSBuZXdUb3RhbFNpemU7Ci0gICAgICAgICAgICBBTE9HVigic2V0OiB1cGRhdGVkIGV4aXN0aW5nIGNhY2hlIGVudHJ5IHdpdGggJWQgYnl0ZSBrZXkgYW5kICVkIGJ5dGUgIgotICAgICAgICAgICAgICAgICAgICAidmFsdWUiLCBrZXlTaXplLCB2YWx1ZVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc2l6ZV90IEJsb2JDYWNoZTo6Z2V0KGNvbnN0IHZvaWQqIGtleSwgc2l6ZV90IGtleVNpemUsIHZvaWQqIHZhbHVlLAotICAgICAgICBzaXplX3QgdmFsdWVTaXplKSB7Ci0gICAgaWYgKG1NYXhLZXlTaXplIDwga2V5U2l6ZSkgewotICAgICAgICBBTE9HVigiZ2V0OiBub3Qgc2VhcmNoaW5nIGJlY2F1c2UgdGhlIGtleSBpcyB0b28gbGFyZ2U6ICVkIChsaW1pdCAlZCkiLAotICAgICAgICAgICAgICAgIGtleVNpemUsIG1NYXhLZXlTaXplKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHNwPEJsb2I+IGR1bW15S2V5KG5ldyBCbG9iKGtleSwga2V5U2l6ZSwgZmFsc2UpKTsKLSAgICBDYWNoZUVudHJ5IGR1bW15RW50cnkoZHVtbXlLZXksIE5VTEwpOwotICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGVFbnRyaWVzLmluZGV4T2YoZHVtbXlFbnRyeSk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVigiZ2V0OiBubyBjYWNoZSBlbnRyeSBmb3VuZCBmb3Iga2V5IG9mIHNpemUgJWQiLCBrZXlTaXplKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gVGhlIGtleSB3YXMgZm91bmQuIFJldHVybiB0aGUgdmFsdWUgaWYgdGhlIGNhbGxlcidzIGJ1ZmZlciBpcyBsYXJnZQotICAgIC8vIGVub3VnaC4KLSAgICBzcDxCbG9iPiB2YWx1ZUJsb2IobUNhY2hlRW50cmllc1tpbmRleF0uZ2V0VmFsdWUoKSk7Ci0gICAgc2l6ZV90IHZhbHVlQmxvYlNpemUgPSB2YWx1ZUJsb2ItPmdldFNpemUoKTsKLSAgICBpZiAodmFsdWVCbG9iU2l6ZSA8PSB2YWx1ZVNpemUpIHsKLSAgICAgICAgQUxPR1YoImdldDogY29weWluZyAlZCBieXRlcyB0byBjYWxsZXIncyBidWZmZXIiLCB2YWx1ZUJsb2JTaXplKTsKLSAgICAgICAgbWVtY3B5KHZhbHVlLCB2YWx1ZUJsb2ItPmdldERhdGEoKSwgdmFsdWVCbG9iU2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoImdldDogY2FsbGVyJ3MgYnVmZmVyIGlzIHRvbyBzbWFsbCBmb3IgdmFsdWU6ICVkIChuZWVkcyAlZCkiLAotICAgICAgICAgICAgICAgIHZhbHVlU2l6ZSwgdmFsdWVCbG9iU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZUJsb2JTaXplOwotfQotCi1zdGF0aWMgaW5saW5lIHNpemVfdCBhbGlnbjQoc2l6ZV90IHNpemUpIHsKLSAgICByZXR1cm4gKHNpemUgKyAzKSAmIH4zOwotfQotCi1zaXplX3QgQmxvYkNhY2hlOjpnZXRGbGF0dGVuZWRTaXplKCkgY29uc3QgewotICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKEhlYWRlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2FjaGVFbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IENhY2hlRW50cnkmIGUobUNhY2hlRW50cmllc1tpXSk7Ci0gICAgICAgIHNwPEJsb2I+IGtleUJsb2IgPSBlLmdldEtleSgpOwotICAgICAgICBzcDxCbG9iPiB2YWx1ZUJsb2IgPSBlLmdldFZhbHVlKCk7Ci0gICAgICAgIHNpemUgPSBhbGlnbjQoc2l6ZSk7Ci0gICAgICAgIHNpemUgKz0gc2l6ZW9mKEVudHJ5SGVhZGVyKSArIGtleUJsb2ItPmdldFNpemUoKSArCi0gICAgICAgICAgICAgICAgdmFsdWVCbG9iLT5nZXRTaXplKCk7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotfQotCi1zaXplX3QgQmxvYkNhY2hlOjpnZXRGZENvdW50KCkgY29uc3QgewotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBCbG9iQ2FjaGU6OmZsYXR0ZW4odm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgaW50IGZkc1tdLCBzaXplX3QgY291bnQpCi0gICAgICAgIGNvbnN0IHsKLSAgICBpZiAoY291bnQgIT0gMCkgewotICAgICAgICBBTE9HRSgiZmxhdHRlbjogbm9uemVybyBmZCBjb3VudDogJXp1IiwgY291bnQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRoZSBjYWNoZSBoZWFkZXIKLSAgICBpZiAoc2l6ZSA8IHNpemVvZihIZWFkZXIpKSB7Ci0gICAgICAgIEFMT0dFKCJmbGF0dGVuOiBub3QgZW5vdWdoIHJvb20gZm9yIGNhY2hlIGhlYWRlciIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBIZWFkZXIqIGhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8SGVhZGVyKj4oYnVmZmVyKTsKLSAgICBoZWFkZXItPm1NYWdpY051bWJlciA9IGJsb2JDYWNoZU1hZ2ljOwotICAgIGhlYWRlci0+bUJsb2JDYWNoZVZlcnNpb24gPSBibG9iQ2FjaGVWZXJzaW9uOwotICAgIGhlYWRlci0+bURldmljZVZlcnNpb24gPSBibG9iQ2FjaGVEZXZpY2VWZXJzaW9uOwotICAgIGhlYWRlci0+bU51bUVudHJpZXMgPSBtQ2FjaGVFbnRyaWVzLnNpemUoKTsKLQotICAgIC8vIFdyaXRlIGNhY2hlIGVudHJpZXMKLSAgICB1aW50OF90KiBieXRlQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmZmVyKTsKLSAgICBvZmZfdCBieXRlT2Zmc2V0ID0gYWxpZ240KHNpemVvZihIZWFkZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DYWNoZUVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3QgQ2FjaGVFbnRyeSYgZShtQ2FjaGVFbnRyaWVzW2ldKTsKLSAgICAgICAgc3A8QmxvYj4ga2V5QmxvYiA9IGUuZ2V0S2V5KCk7Ci0gICAgICAgIHNwPEJsb2I+IHZhbHVlQmxvYiA9IGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgc2l6ZV90IGtleVNpemUgPSBrZXlCbG9iLT5nZXRTaXplKCk7Ci0gICAgICAgIHNpemVfdCB2YWx1ZVNpemUgPSB2YWx1ZUJsb2ItPmdldFNpemUoKTsKLQotICAgICAgICBzaXplX3QgZW50cnlTaXplID0gc2l6ZW9mKEVudHJ5SGVhZGVyKSArIGtleVNpemUgKyB2YWx1ZVNpemU7Ci0gICAgICAgIGlmIChieXRlT2Zmc2V0ICsgZW50cnlTaXplID4gc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImZsYXR0ZW46IG5vdCBlbm91Z2ggcm9vbSBmb3IgY2FjaGUgZW50cmllcyIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIEVudHJ5SGVhZGVyKiBlaGVhZGVyID0gcmVpbnRlcnByZXRfY2FzdDxFbnRyeUhlYWRlcio+KAotICAgICAgICAgICAgJmJ5dGVCdWZmZXJbYnl0ZU9mZnNldF0pOwotICAgICAgICBlaGVhZGVyLT5tS2V5U2l6ZSA9IGtleVNpemU7Ci0gICAgICAgIGVoZWFkZXItPm1WYWx1ZVNpemUgPSB2YWx1ZVNpemU7Ci0KLSAgICAgICAgbWVtY3B5KGVoZWFkZXItPm1EYXRhLCBrZXlCbG9iLT5nZXREYXRhKCksIGtleVNpemUpOwotICAgICAgICBtZW1jcHkoZWhlYWRlci0+bURhdGEgKyBrZXlTaXplLCB2YWx1ZUJsb2ItPmdldERhdGEoKSwgdmFsdWVTaXplKTsKLQotICAgICAgICBieXRlT2Zmc2V0ICs9IGFsaWduNChlbnRyeVNpemUpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQmxvYkNhY2hlOjp1bmZsYXR0ZW4odm9pZCBjb25zdCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgaW50IGZkc1tdLAotICAgICAgICBzaXplX3QgY291bnQpIHsKLSAgICAvLyBBbGwgZXJyb3JzIHNob3VsZCByZXN1bHQgaW4gdGhlIEJsb2JDYWNoZSBiZWluZyBpbiBhbiBlbXB0eSBzdGF0ZS4KLSAgICBtQ2FjaGVFbnRyaWVzLmNsZWFyKCk7Ci0KLSAgICBpZiAoY291bnQgIT0gMCkgewotICAgICAgICBBTE9HRSgidW5mbGF0dGVuOiBub256ZXJvIGZkIGNvdW50OiAlenUiLCBjb3VudCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gUmVhZCB0aGUgY2FjaGUgaGVhZGVyCi0gICAgaWYgKHNpemUgPCBzaXplb2YoSGVhZGVyKSkgewotICAgICAgICBBTE9HRSgidW5mbGF0dGVuOiBub3QgZW5vdWdoIHJvb20gZm9yIGNhY2hlIGhlYWRlciIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBjb25zdCBIZWFkZXIqIGhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgSGVhZGVyKj4oYnVmZmVyKTsKLSAgICBpZiAoaGVhZGVyLT5tTWFnaWNOdW1iZXIgIT0gYmxvYkNhY2hlTWFnaWMpIHsKLSAgICAgICAgQUxPR0UoInVuZmxhdHRlbjogYmFkIG1hZ2ljIG51bWJlcjogJWQiLCBoZWFkZXItPm1NYWdpY051bWJlcik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChoZWFkZXItPm1CbG9iQ2FjaGVWZXJzaW9uICE9IGJsb2JDYWNoZVZlcnNpb24gfHwKLSAgICAgICAgICAgIGhlYWRlci0+bURldmljZVZlcnNpb24gIT0gYmxvYkNhY2hlRGV2aWNlVmVyc2lvbikgewotICAgICAgICAvLyBXZSB0cmVhdCB2ZXJzaW9uIG1pc21hdGNoZXMgYXMgYW4gZW1wdHkgY2FjaGUuCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBSZWFkIGNhY2hlIGVudHJpZXMKLSAgICBjb25zdCB1aW50OF90KiBieXRlQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKTsKLSAgICBvZmZfdCBieXRlT2Zmc2V0ID0gYWxpZ240KHNpemVvZihIZWFkZXIpKTsKLSAgICBzaXplX3QgbnVtRW50cmllcyA9IGhlYWRlci0+bU51bUVudHJpZXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKLSAgICAgICAgaWYgKGJ5dGVPZmZzZXQgKyBzaXplb2YoRW50cnlIZWFkZXIpID4gc2l6ZSkgewotICAgICAgICAgICAgbUNhY2hlRW50cmllcy5jbGVhcigpOwotICAgICAgICAgICAgQUxPR0UoInVuZmxhdHRlbjogbm90IGVub3VnaCByb29tIGZvciBjYWNoZSBlbnRyeSBoZWFkZXJzIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgRW50cnlIZWFkZXIqIGVoZWFkZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEVudHJ5SGVhZGVyKj4oCi0gICAgICAgICAgICAgICAgJmJ5dGVCdWZmZXJbYnl0ZU9mZnNldF0pOwotICAgICAgICBzaXplX3Qga2V5U2l6ZSA9IGVoZWFkZXItPm1LZXlTaXplOwotICAgICAgICBzaXplX3QgdmFsdWVTaXplID0gZWhlYWRlci0+bVZhbHVlU2l6ZTsKLSAgICAgICAgc2l6ZV90IGVudHJ5U2l6ZSA9IHNpemVvZihFbnRyeUhlYWRlcikgKyBrZXlTaXplICsgdmFsdWVTaXplOwotCi0gICAgICAgIGlmIChieXRlT2Zmc2V0ICsgZW50cnlTaXplID4gc2l6ZSkgewotICAgICAgICAgICAgbUNhY2hlRW50cmllcy5jbGVhcigpOwotICAgICAgICAgICAgQUxPR0UoInVuZmxhdHRlbjogbm90IGVub3VnaCByb29tIGZvciBjYWNoZSBlbnRyeSBoZWFkZXJzIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSA9IGVoZWFkZXItPm1EYXRhOwotICAgICAgICBzZXQoZGF0YSwga2V5U2l6ZSwgZGF0YSArIGtleVNpemUsIHZhbHVlU2l6ZSk7Ci0KLSAgICAgICAgYnl0ZU9mZnNldCArPSBhbGlnbjQoZW50cnlTaXplKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWxvbmcgaW50IEJsb2JDYWNoZTo6YmxvYl9yYW5kb20oKSB7Ci0jaWZkZWYgX1dJTjMyCi0gICAgcmV0dXJuIHJhbmQoKTsKLSNlbHNlCi0gICAgcmV0dXJuIG5yYW5kNDgobVJhbmRTdGF0ZSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBCbG9iQ2FjaGU6OmNsZWFuKCkgewotICAgIC8vIFJlbW92ZSBhIHJhbmRvbSBjYWNoZSBlbnRyeSB1bnRpbCB0aGUgdG90YWwgY2FjaGUgc2l6ZSBnZXRzIGJlbG93IGhhbGYKLSAgICAvLyB0aGUgbWF4aW11bSB0b3RhbCBjYWNoZSBzaXplLgotICAgIHdoaWxlIChtVG90YWxTaXplID4gbU1heFRvdGFsU2l6ZSAvIDIpIHsKLSAgICAgICAgc2l6ZV90IGkgPSBzaXplX3QoYmxvYl9yYW5kb20oKSAlIChtQ2FjaGVFbnRyaWVzLnNpemUoKSkpOwotICAgICAgICBjb25zdCBDYWNoZUVudHJ5JiBlbnRyeShtQ2FjaGVFbnRyaWVzW2ldKTsKLSAgICAgICAgbVRvdGFsU2l6ZSAtPSBlbnRyeS5nZXRLZXkoKS0+Z2V0U2l6ZSgpICsgZW50cnkuZ2V0VmFsdWUoKS0+Z2V0U2l6ZSgpOwotICAgICAgICBtQ2FjaGVFbnRyaWVzLnJlbW92ZUF0KGkpOwotICAgIH0KLX0KLQotYm9vbCBCbG9iQ2FjaGU6OmlzQ2xlYW5hYmxlKCkgY29uc3QgewotICAgIHJldHVybiBtVG90YWxTaXplID4gbU1heFRvdGFsU2l6ZSAvIDI7Ci19Ci0KLUJsb2JDYWNoZTo6QmxvYjo6QmxvYihjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBjb3B5RGF0YSk6Ci0gICAgICAgIG1EYXRhKGNvcHlEYXRhID8gbWFsbG9jKHNpemUpIDogZGF0YSksCi0gICAgICAgIG1TaXplKHNpemUpLAotICAgICAgICBtT3duc0RhdGEoY29weURhdGEpIHsKLSAgICBpZiAoZGF0YSAhPSBOVUxMICYmIGNvcHlEYXRhKSB7Ci0gICAgICAgIG1lbWNweShjb25zdF9jYXN0PHZvaWQqPihtRGF0YSksIGRhdGEsIHNpemUpOwotICAgIH0KLX0KLQotQmxvYkNhY2hlOjpCbG9iOjp+QmxvYigpIHsKLSAgICBpZiAobU93bnNEYXRhKSB7Ci0gICAgICAgIGZyZWUoY29uc3RfY2FzdDx2b2lkKj4obURhdGEpKTsKLSAgICB9Ci19Ci0KLWJvb2wgQmxvYkNhY2hlOjpCbG9iOjpvcGVyYXRvcjwoY29uc3QgQmxvYiYgcmhzKSBjb25zdCB7Ci0gICAgaWYgKG1TaXplID09IHJocy5tU2l6ZSkgewotICAgICAgICByZXR1cm4gbWVtY21wKG1EYXRhLCByaHMubURhdGEsIG1TaXplKSA8IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1TaXplIDwgcmhzLm1TaXplOwotICAgIH0KLX0KLQotY29uc3Qgdm9pZCogQmxvYkNhY2hlOjpCbG9iOjpnZXREYXRhKCkgY29uc3QgewotICAgIHJldHVybiBtRGF0YTsKLX0KLQotc2l6ZV90IEJsb2JDYWNoZTo6QmxvYjo6Z2V0U2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNpemU7Ci19Ci0KLUJsb2JDYWNoZTo6Q2FjaGVFbnRyeTo6Q2FjaGVFbnRyeSgpIHsKLX0KLQotQmxvYkNhY2hlOjpDYWNoZUVudHJ5OjpDYWNoZUVudHJ5KGNvbnN0IHNwPEJsb2I+JiBrZXksIGNvbnN0IHNwPEJsb2I+JiB2YWx1ZSk6Ci0gICAgICAgIG1LZXkoa2V5KSwKLSAgICAgICAgbVZhbHVlKHZhbHVlKSB7Ci19Ci0KLUJsb2JDYWNoZTo6Q2FjaGVFbnRyeTo6Q2FjaGVFbnRyeShjb25zdCBDYWNoZUVudHJ5JiBjZSk6Ci0gICAgICAgIG1LZXkoY2UubUtleSksCi0gICAgICAgIG1WYWx1ZShjZS5tVmFsdWUpIHsKLX0KLQotYm9vbCBCbG9iQ2FjaGU6OkNhY2hlRW50cnk6Om9wZXJhdG9yPChjb25zdCBDYWNoZUVudHJ5JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gKm1LZXkgPCAqcmhzLm1LZXk7Ci19Ci0KLWNvbnN0IEJsb2JDYWNoZTo6Q2FjaGVFbnRyeSYgQmxvYkNhY2hlOjpDYWNoZUVudHJ5OjpvcGVyYXRvcj0oY29uc3QgQ2FjaGVFbnRyeSYgcmhzKSB7Ci0gICAgbUtleSA9IHJocy5tS2V5OwotICAgIG1WYWx1ZSA9IHJocy5tVmFsdWU7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1zcDxCbG9iQ2FjaGU6OkJsb2I+IEJsb2JDYWNoZTo6Q2FjaGVFbnRyeTo6Z2V0S2V5KCkgY29uc3QgewotICAgIHJldHVybiBtS2V5OwotfQotCi1zcDxCbG9iQ2FjaGU6OkJsb2I+IEJsb2JDYWNoZTo6Q2FjaGVFbnRyeTo6Z2V0VmFsdWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1WYWx1ZTsKLX0KLQotdm9pZCBCbG9iQ2FjaGU6OkNhY2hlRW50cnk6OnNldFZhbHVlKGNvbnN0IHNwPEJsb2I+JiB2YWx1ZSkgewotICAgIG1WYWx1ZSA9IHZhbHVlOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0J1ZmZlcmVkVGV4dE91dHB1dC5jcHAgYi9saWJzL3V0aWxzL0J1ZmZlcmVkVGV4dE91dHB1dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTY2MmUuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9CdWZmZXJlZFRleHRPdXRwdXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvQnVmZmVyZWRUZXh0T3V0cHV0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDxjdXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS91dGlscy9TdGF0aWMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBCdWZmZXJlZFRleHRPdXRwdXQ6OkJ1ZmZlclN0YXRlIDogcHVibGljIFJlZkJhc2UKLXsKLSAgICBCdWZmZXJTdGF0ZShpbnQzMl90IF9zZXEpCi0gICAgICAgIDogc2VxKF9zZXEpCi0gICAgICAgICwgYnVmZmVyKE5VTEwpCi0gICAgICAgICwgYnVmZmVyUG9zKDApCi0gICAgICAgICwgYnVmZmVyU2l6ZSgwKQotICAgICAgICAsIGF0RnJvbnQodHJ1ZSkKLSAgICAgICAgLCBpbmRlbnQoMCkKLSAgICAgICAgLCBidW5kbGUoMCkgewotICAgIH0KLSAgICB+QnVmZmVyU3RhdGUoKSB7Ci0gICAgICAgIGZyZWUoYnVmZmVyKTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdHVzX3QgYXBwZW5kKGNvbnN0IGNoYXIqIHR4dCwgc2l6ZV90IGxlbikgewotICAgICAgICBpZiAoKGxlbitidWZmZXJQb3MpID4gYnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgdm9pZCogYiA9IHJlYWxsb2MoYnVmZmVyLCAoKGxlbitidWZmZXJQb3MpKjMpLzIpOwotICAgICAgICAgICAgaWYgKCFiKSByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgYnVmZmVyID0gKGNoYXIqKWI7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KGJ1ZmZlcitidWZmZXJQb3MsIHR4dCwgbGVuKTsKLSAgICAgICAgYnVmZmVyUG9zICs9IGxlbjsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHJlc3RhcnQoKSB7Ci0gICAgICAgIGJ1ZmZlclBvcyA9IDA7Ci0gICAgICAgIGF0RnJvbnQgPSB0cnVlOwotICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IDI1NikgewotICAgICAgICAgICAgdm9pZCogYiA9IHJlYWxsb2MoYnVmZmVyLCAyNTYpOwotICAgICAgICAgICAgaWYgKGIpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSAoY2hhciopYjsKLSAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gMjU2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGNvbnN0IGludDMyX3Qgc2VxOwotICAgIGNoYXIqIGJ1ZmZlcjsKLSAgICBzaXplX3QgYnVmZmVyUG9zOwotICAgIHNpemVfdCBidWZmZXJTaXplOwotICAgIGJvb2wgYXRGcm9udDsKLSAgICBpbnQzMl90IGluZGVudDsKLSAgICBpbnQzMl90IGJ1bmRsZTsKLX07Ci0KLXN0cnVjdCBCdWZmZXJlZFRleHRPdXRwdXQ6OlRocmVhZFN0YXRlCi17Ci0gICAgVmVjdG9yPHNwPEJ1ZmZlcmVkVGV4dE91dHB1dDo6QnVmZmVyU3RhdGU+ID4gc3RhdGVzOwotfTsKLQotc3RhdGljIG11dGV4X3QgICAgICAgICAgZ011dGV4OwotCi1zdGF0aWMgdGhyZWFkX3N0b3JlX3QgICB0bHM7Ci0KLUJ1ZmZlcmVkVGV4dE91dHB1dDo6VGhyZWFkU3RhdGUqIEJ1ZmZlcmVkVGV4dE91dHB1dDo6Z2V0VGhyZWFkU3RhdGUoKQotewotICAgIFRocmVhZFN0YXRlKiAgdHMgPSAoVGhyZWFkU3RhdGUqKSB0aHJlYWRfc3RvcmVfZ2V0KCAmdGxzICk7Ci0gICAgaWYgKHRzKSByZXR1cm4gdHM7Ci0gICAgdHMgPSBuZXcgVGhyZWFkU3RhdGU7Ci0gICAgdGhyZWFkX3N0b3JlX3NldCggJnRscywgdHMsIHRocmVhZERlc3RydWN0b3IgKTsKLSAgICByZXR1cm4gdHM7Ci19Ci0KLXZvaWQgQnVmZmVyZWRUZXh0T3V0cHV0Ojp0aHJlYWREZXN0cnVjdG9yKHZvaWQgKnN0KQotewotICAgIGRlbGV0ZSAoKFRocmVhZFN0YXRlKilzdCk7Ci19Ci0KLXN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IGdTZXF1ZW5jZSA9IDA7Ci0KLXN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IGdGcmVlQnVmZmVySW5kZXggPSAtMTsKLQotc3RhdGljIGludDMyX3QgYWxsb2NCdWZmZXJJbmRleCgpCi17Ci0gICAgaW50MzJfdCByZXMgPSAtMTsKLSAgICAKLSAgICBtdXRleF9sb2NrKCZnTXV0ZXgpOwotICAgIAotICAgIGlmIChnRnJlZUJ1ZmZlckluZGV4ID49IDApIHsKLSAgICAgICAgcmVzID0gZ0ZyZWVCdWZmZXJJbmRleDsKLSAgICAgICAgZ0ZyZWVCdWZmZXJJbmRleCA9IGdUZXh0QnVmZmVyc1tyZXNdOwotICAgICAgICBnVGV4dEJ1ZmZlcnMuZWRpdEl0ZW1BdChyZXMpID0gLTE7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBnVGV4dEJ1ZmZlcnMuc2l6ZSgpOwotICAgICAgICBnVGV4dEJ1ZmZlcnMuYWRkKC0xKTsKLSAgICB9Ci0KLSAgICBtdXRleF91bmxvY2soJmdNdXRleCk7Ci0gICAgCi0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHZvaWQgZnJlZUJ1ZmZlckluZGV4KGludDMyX3QgaWR4KQotewotICAgIG11dGV4X2xvY2soJmdNdXRleCk7Ci0gICAgZ1RleHRCdWZmZXJzLmVkaXRJdGVtQXQoaWR4KSA9IGdGcmVlQnVmZmVySW5kZXg7Ci0gICAgZ0ZyZWVCdWZmZXJJbmRleCA9IGlkeDsKLSAgICBtdXRleF91bmxvY2soJmdNdXRleCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CdWZmZXJlZFRleHRPdXRwdXQ6OkJ1ZmZlcmVkVGV4dE91dHB1dCh1aW50MzJfdCBmbGFncykKLSAgICA6IG1GbGFncyhmbGFncykKLSAgICAsIG1TZXEoYW5kcm9pZF9hdG9taWNfaW5jKCZnU2VxdWVuY2UpKQotICAgICwgbUluZGV4KGFsbG9jQnVmZmVySW5kZXgoKSkKLXsKLSAgICBtR2xvYmFsU3RhdGUgPSBuZXcgQnVmZmVyU3RhdGUobVNlcSk7Ci0gICAgaWYgKG1HbG9iYWxTdGF0ZSkgbUdsb2JhbFN0YXRlLT5pbmNTdHJvbmcodGhpcyk7Ci19Ci0gICAgCi1CdWZmZXJlZFRleHRPdXRwdXQ6On5CdWZmZXJlZFRleHRPdXRwdXQoKQotewotICAgIGlmIChtR2xvYmFsU3RhdGUpIG1HbG9iYWxTdGF0ZS0+ZGVjU3Ryb25nKHRoaXMpOwotICAgIGZyZWVCdWZmZXJJbmRleChtSW5kZXgpOwotfQotCi1zdGF0dXNfdCBCdWZmZXJlZFRleHRPdXRwdXQ6OnByaW50KGNvbnN0IGNoYXIqIHR4dCwgc2l6ZV90IGxlbikKLXsKLSAgICAvL3ByaW50ZigiQnVmZmVyZWRUZXh0T3V0cHV0OiBwcmludGluZyAlZFxuIiwgbGVuKTsKLSAgICAKLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIEJ1ZmZlclN0YXRlKiBiID0gZ2V0QnVmZmVyKCk7Ci0gICAgCi0gICAgY29uc3QgY2hhciogY29uc3QgZW5kID0gdHh0K2xlbjsKLSAgICAKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICB3aGlsZSAodHh0IDwgZW5kKSB7Ci0gICAgICAgIC8vIEZpbmQgdGhlIG5leHQgbGluZS4KLSAgICAgICAgY29uc3QgY2hhciogZmlyc3QgPSB0eHQ7Ci0gICAgICAgIHdoaWxlICh0eHQgPCBlbmQgJiYgKnR4dCAhPSAnXG4nKSB0eHQrKzsKLSAgICAgICAgCi0gICAgICAgIC8vIEluY2x1ZGUgdGhpcyBhbmQgYWxsIGZvbGxvd2luZyBlbXB0eSBsaW5lcy4KLSAgICAgICAgd2hpbGUgKHR4dCA8IGVuZCAmJiAqdHh0ID09ICdcbicpIHR4dCsrOwotICAgICAgICAKLSAgICAgICAgLy8gU3BlY2lhbCBjYXNlcyBmb3IgZmlyc3QgZGF0YSBvbiBhIGxpbmUuCi0gICAgICAgIGlmIChiLT5hdEZyb250KSB7Ci0gICAgICAgICAgICBpZiAoYi0+aW5kZW50ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbGluZSwgYWRkIHRoZSBpbmRlbnQuCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4ID0gc3RyaW5nRm9ySW5kZW50KGItPmluZGVudCk7Ci0gICAgICAgICAgICAgICAgZXJyID0gYi0+YXBwZW5kKHByZWZpeCwgc3RybGVuKHByZWZpeCkpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCoodHh0LTEpID09ICdcbicgJiYgIWItPmJ1bmRsZSkgewotICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogaWYgd2UgYXJlIG5vdCBpbmRlbnRpbmcgb3IgYnVuZGxpbmcsIGFuZAotICAgICAgICAgICAgICAgIC8vIGhhdmUgYmVlbiBnaXZlbiBvbmUgb3IgbW9yZSBjb21wbGV0ZSBsaW5lcywganVzdCB3cml0ZQotICAgICAgICAgICAgICAgIC8vIHRoZW0gb3V0IHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgYnVmZmVyLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFNsdXJwIHVwIGFsbCBvZiB0aGUgbGluZXMuCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGFzdExpbmUgPSB0eHQrMTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHh0IDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqdHh0KysgPT0gJ1xuJykgbGFzdExpbmUgPSB0eHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0cnVjdCBpb3ZlYyB2ZWM7Ci0gICAgICAgICAgICAgICAgdmVjLmlvdl9iYXNlID0gKHZvaWQqKWZpcnN0OwotICAgICAgICAgICAgICAgIHZlYy5pb3ZfbGVuID0gbGFzdExpbmUtZmlyc3Q7Ci0gICAgICAgICAgICAgICAgLy9wcmludGYoIldyaXRpbmcgJWQgYnl0ZXMgb2YgZGF0YSFcbiIsIHZlYy5pb3ZfbGVuKTsKLSAgICAgICAgICAgICAgICB3cml0ZUxpbmVzKHZlYywgMSk7Ci0gICAgICAgICAgICAgICAgdHh0ID0gbGFzdExpbmU7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEFwcGVuZCB0aGUgbmV3IHRleHQgdG8gdGhlIGJ1ZmZlci4KLSAgICAgICAgZXJyID0gYi0+YXBwZW5kKGZpcnN0LCB0eHQtZmlyc3QpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSByZXR1cm4gZXJyOwotICAgICAgICBiLT5hdEZyb250ID0gKih0eHQtMSkgPT0gJ1xuJzsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHdlIGhhdmUgZmluaXNoZWQgYSBsaW5lIGFuZCBhcmUgbm90IGJ1bmRsaW5nLCB3cml0ZQotICAgICAgICAvLyBpdCBvdXQuCi0gICAgICAgIC8vcHJpbnRmKCJCdWZmZXIgaXMgbm93ICVkIGJ5dGVzXG4iLCBiLT5idWZmZXJQb3MpOwotICAgICAgICBpZiAoYi0+YXRGcm9udCAmJiAhYi0+YnVuZGxlKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgaW92ZWMgdmVjOwotICAgICAgICAgICAgdmVjLmlvdl9iYXNlID0gYi0+YnVmZmVyOwotICAgICAgICAgICAgdmVjLmlvdl9sZW4gPSBiLT5idWZmZXJQb3M7Ci0gICAgICAgICAgICAvL3ByaW50ZigiV3JpdGluZyAlZCBieXRlcyBvZiBkYXRhIVxuIiwgdmVjLmlvdl9sZW4pOwotICAgICAgICAgICAgd3JpdGVMaW5lcyh2ZWMsIDEpOwotICAgICAgICAgICAgYi0+cmVzdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBCdWZmZXJlZFRleHRPdXRwdXQ6Om1vdmVJbmRlbnQoaW50IGRlbHRhKQotewotICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgQnVmZmVyU3RhdGUqIGIgPSBnZXRCdWZmZXIoKTsKLSAgICBiLT5pbmRlbnQgKz0gZGVsdGE7Ci0gICAgaWYgKGItPmluZGVudCA8IDApIGItPmluZGVudCA9IDA7Ci19Ci0KLXZvaWQgQnVmZmVyZWRUZXh0T3V0cHV0OjpwdXNoQnVuZGxlKCkKLXsKLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIEJ1ZmZlclN0YXRlKiBiID0gZ2V0QnVmZmVyKCk7Ci0gICAgYi0+YnVuZGxlKys7Ci19Ci0KLXZvaWQgQnVmZmVyZWRUZXh0T3V0cHV0Ojpwb3BCdW5kbGUoKQotewotICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgQnVmZmVyU3RhdGUqIGIgPSBnZXRCdWZmZXIoKTsKLSAgICBiLT5idW5kbGUtLTsKLSAgICBMT0dfRkFUQUxfSUYoYi0+YnVuZGxlIDwgMCwKLSAgICAgICAgIlRleHRPdXRwdXQ6OnBvcEJ1bmRsZSgpIGNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gcHVzaEJ1bmRsZSgpIik7Ci0gICAgaWYgKGItPmJ1bmRsZSA8IDApIGItPmJ1bmRsZSA9IDA7Ci0gICAgCi0gICAgaWYgKGItPmJ1bmRsZSA9PSAwKSB7Ci0gICAgICAgIC8vIExhc3QgYnVuZGxlLCB3cml0ZSBvdXQgZGF0YSBpZiBpdCBpcyBjb21wbGV0ZS4gIElmIGl0IGlzIG5vdAotICAgICAgICAvLyBjb21wbGV0ZSwgZG9uJ3Qgd3JpdGUgdW50aWwgdGhlIGxhc3QgbGluZSBpcyBkb25lLi4uIHRoaXMgbWF5Ci0gICAgICAgIC8vIG9yIG1heSBub3QgYmUgdGhlIHdyaXRlIHRoaW5nIHRvIGRvLCBidXQgaXQncyB0aGUgZWFzaWVzdC4KLSAgICAgICAgaWYgKGItPmJ1ZmZlclBvcyA+IDAgJiYgYi0+YXRGcm9udCkgewotICAgICAgICAgICAgc3RydWN0IGlvdmVjIHZlYzsKLSAgICAgICAgICAgIHZlYy5pb3ZfYmFzZSA9IGItPmJ1ZmZlcjsKLSAgICAgICAgICAgIHZlYy5pb3ZfbGVuID0gYi0+YnVmZmVyUG9zOwotICAgICAgICAgICAgd3JpdGVMaW5lcyh2ZWMsIDEpOwotICAgICAgICAgICAgYi0+cmVzdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1CdWZmZXJlZFRleHRPdXRwdXQ6OkJ1ZmZlclN0YXRlKiBCdWZmZXJlZFRleHRPdXRwdXQ6OmdldEJ1ZmZlcigpIGNvbnN0Ci17Ci0gICAgaWYgKChtRmxhZ3MmTVVMVElUSFJFQURFRCkgIT0gMCkgewotICAgICAgICBUaHJlYWRTdGF0ZSogdHMgPSBnZXRUaHJlYWRTdGF0ZSgpOwotICAgICAgICBpZiAodHMpIHsKLSAgICAgICAgICAgIHdoaWxlICh0cy0+c3RhdGVzLnNpemUoKSA8PSAoc2l6ZV90KW1JbmRleCkgdHMtPnN0YXRlcy5hZGQoTlVMTCk7Ci0gICAgICAgICAgICBCdWZmZXJTdGF0ZSogYnMgPSB0cy0+c3RhdGVzW21JbmRleF0uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoYnMgIT0gTlVMTCAmJiBicy0+c2VxID09IG1TZXEpIHJldHVybiBiczsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHMtPnN0YXRlcy5lZGl0SXRlbUF0KG1JbmRleCkgPSBuZXcgQnVmZmVyU3RhdGUobUluZGV4KTsKLSAgICAgICAgICAgIGJzID0gdHMtPnN0YXRlc1ttSW5kZXhdLmdldCgpOwotICAgICAgICAgICAgaWYgKGJzICE9IE5VTEwpIHJldHVybiBiczsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbUdsb2JhbFN0YXRlOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9DYWxsU3RhY2suY3BwIGIvbGlicy91dGlscy9DYWxsU3RhY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGZkODRmLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvQ2FsbFN0YWNrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJDYWxsU3RhY2siCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPgotI2luY2x1ZGUgPGNvcmtzY3Jldy9iYWNrdHJhY2UuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1DYWxsU3RhY2s6OkNhbGxTdGFjaygpIDoKLSAgICAgICAgbUNvdW50KDApIHsKLX0KLQotQ2FsbFN0YWNrOjpDYWxsU3RhY2soY29uc3QgQ2FsbFN0YWNrJiByaHMpIDoKLSAgICAgICAgbUNvdW50KHJocy5tQ291bnQpIHsKLSAgICBpZiAobUNvdW50KSB7Ci0gICAgICAgIG1lbWNweShtU3RhY2ssIHJocy5tU3RhY2ssIG1Db3VudCAqIHNpemVvZihiYWNrdHJhY2VfZnJhbWVfdCkpOwotICAgIH0KLX0KLQotQ2FsbFN0YWNrOjp+Q2FsbFN0YWNrKCkgewotfQotCi1DYWxsU3RhY2smIENhbGxTdGFjazo6b3BlcmF0b3IgPSAoY29uc3QgQ2FsbFN0YWNrJiByaHMpIHsKLSAgICBtQ291bnQgPSByaHMubUNvdW50OwotICAgIGlmIChtQ291bnQpIHsKLSAgICAgICAgbWVtY3B5KG1TdGFjaywgcmhzLm1TdGFjaywgbUNvdW50ICogc2l6ZW9mKGJhY2t0cmFjZV9mcmFtZV90KSk7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLX0KLQotYm9vbCBDYWxsU3RhY2s6Om9wZXJhdG9yID09IChjb25zdCBDYWxsU3RhY2smIHJocykgY29uc3QgewotICAgIGlmIChtQ291bnQgIT0gcmhzLm1Db3VudCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiAhbUNvdW50IHx8IG1lbWNtcChtU3RhY2ssIHJocy5tU3RhY2ssIG1Db3VudCAqIHNpemVvZihiYWNrdHJhY2VfZnJhbWVfdCkpID09IDA7Ci19Ci0KLWJvb2wgQ2FsbFN0YWNrOjpvcGVyYXRvciAhPSAoY29uc3QgQ2FsbFN0YWNrJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gIW9wZXJhdG9yID09IChyaHMpOwotfQotCi1ib29sIENhbGxTdGFjazo6b3BlcmF0b3IgPCAoY29uc3QgQ2FsbFN0YWNrJiByaHMpIGNvbnN0IHsKLSAgICBpZiAobUNvdW50ICE9IHJocy5tQ291bnQpCi0gICAgICAgIHJldHVybiBtQ291bnQgPCByaHMubUNvdW50OwotICAgIHJldHVybiBtZW1jbXAobVN0YWNrLCByaHMubVN0YWNrLCBtQ291bnQgKiBzaXplb2YoYmFja3RyYWNlX2ZyYW1lX3QpKSA8IDA7Ci19Ci0KLWJvb2wgQ2FsbFN0YWNrOjpvcGVyYXRvciA+PSAoY29uc3QgQ2FsbFN0YWNrJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gIW9wZXJhdG9yIDwgKHJocyk7Ci19Ci0KLWJvb2wgQ2FsbFN0YWNrOjpvcGVyYXRvciA+IChjb25zdCBDYWxsU3RhY2smIHJocykgY29uc3QgewotICAgIGlmIChtQ291bnQgIT0gcmhzLm1Db3VudCkKLSAgICAgICAgcmV0dXJuIG1Db3VudCA+IHJocy5tQ291bnQ7Ci0gICAgcmV0dXJuIG1lbWNtcChtU3RhY2ssIHJocy5tU3RhY2ssIG1Db3VudCAqIHNpemVvZihiYWNrdHJhY2VfZnJhbWVfdCkpID4gMDsKLX0KLQotYm9vbCBDYWxsU3RhY2s6Om9wZXJhdG9yIDw9IChjb25zdCBDYWxsU3RhY2smIHJocykgY29uc3QgewotICAgIHJldHVybiAhb3BlcmF0b3IgPiAocmhzKTsKLX0KLQotY29uc3Qgdm9pZCogQ2FsbFN0YWNrOjpvcGVyYXRvciBbXSAoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKGluZGV4ID49IGludChtQ291bnQpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4obVN0YWNrW2luZGV4XS5hYnNvbHV0ZV9wYyk7Ci19Ci0KLXZvaWQgQ2FsbFN0YWNrOjpjbGVhcigpIHsKLSAgICBtQ291bnQgPSAwOwotfQotCi12b2lkIENhbGxTdGFjazo6dXBkYXRlKGludDMyX3QgaWdub3JlRGVwdGgsIGludDMyX3QgbWF4RGVwdGgpIHsKLSAgICBpZiAobWF4RGVwdGggPiBNQVhfREVQVEgpIHsKLSAgICAgICAgbWF4RGVwdGggPSBNQVhfREVQVEg7Ci0gICAgfQotICAgIHNzaXplX3QgY291bnQgPSB1bndpbmRfYmFja3RyYWNlKG1TdGFjaywgaWdub3JlRGVwdGggKyAxLCBtYXhEZXB0aCk7Ci0gICAgbUNvdW50ID0gY291bnQgPiAwID8gY291bnQgOiAwOwotfQotCi12b2lkIENhbGxTdGFjazo6ZHVtcChjb25zdCBjaGFyKiBwcmVmaXgpIGNvbnN0IHsKLSAgICBiYWNrdHJhY2Vfc3ltYm9sX3Qgc3ltYm9sc1ttQ291bnRdOwotCi0gICAgZ2V0X2JhY2t0cmFjZV9zeW1ib2xzKG1TdGFjaywgbUNvdW50LCBzeW1ib2xzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db3VudDsgaSsrKSB7Ci0gICAgICAgIGNoYXIgbGluZVtNQVhfQkFDS1RSQUNFX0xJTkVfTEVOR1RIXTsKLSAgICAgICAgZm9ybWF0X2JhY2t0cmFjZV9saW5lKGksICZtU3RhY2tbaV0sICZzeW1ib2xzW2ldLAotICAgICAgICAgICAgICAgIGxpbmUsIE1BWF9CQUNLVFJBQ0VfTElORV9MRU5HVEgpOwotICAgICAgICBBTE9HRCgiJXMlcyIsIHByZWZpeCwgbGluZSk7Ci0gICAgfQotICAgIGZyZWVfYmFja3RyYWNlX3N5bWJvbHMoc3ltYm9scywgbUNvdW50KTsKLX0KLQotU3RyaW5nOCBDYWxsU3RhY2s6OnRvU3RyaW5nKGNvbnN0IGNoYXIqIHByZWZpeCkgY29uc3QgewotICAgIFN0cmluZzggc3RyOwotICAgIGJhY2t0cmFjZV9zeW1ib2xfdCBzeW1ib2xzW21Db3VudF07Ci0KLSAgICBnZXRfYmFja3RyYWNlX3N5bWJvbHMobVN0YWNrLCBtQ291bnQsIHN5bWJvbHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvdW50OyBpKyspIHsKLSAgICAgICAgY2hhciBsaW5lW01BWF9CQUNLVFJBQ0VfTElORV9MRU5HVEhdOwotICAgICAgICBmb3JtYXRfYmFja3RyYWNlX2xpbmUoaSwgJm1TdGFja1tpXSwgJnN5bWJvbHNbaV0sCi0gICAgICAgICAgICAgICAgbGluZSwgTUFYX0JBQ0tUUkFDRV9MSU5FX0xFTkdUSCk7Ci0gICAgICAgIHN0ci5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgc3RyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgc3RyLmFwcGVuZCgiXG4iKTsKLSAgICB9Ci0gICAgZnJlZV9iYWNrdHJhY2Vfc3ltYm9scyhzeW1ib2xzLCBtQ291bnQpOwotICAgIHJldHVybiBzdHI7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0RlYnVnLmNwcCBiL2xpYnMvdXRpbHMvRGVidWcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFjOTgzLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvRGVidWcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KLQotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGNvbnN0IGNoYXIgaW5kZW50U3RyW10gPQotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Ci0KLWNvbnN0IGNoYXIqIHN0cmluZ0ZvckluZGVudChpbnQzMl90IGluZGVudExldmVsKQotewotICAgIHNzaXplX3Qgb2ZmID0gc2l6ZW9mKGluZGVudFN0ciktMS0oaW5kZW50TGV2ZWwqMik7Ci0gICAgcmV0dXJuIGluZGVudFN0ciArIChvZmYgPCAwID8gMCA6IG9mZik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBkZWZhdWx0UHJpbnRGdW5jKHZvaWQqIGNvb2tpZSwgY29uc3QgY2hhciogdHh0KQotewotICAgIHByaW50ZigiJXMiLCB0eHQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGlubGluZSBpbnQgaXNpZGVudChpbnQgYykKLXsKLSAgICByZXR1cm4gaXNhbG51bShjKSB8fCBjID09ICdfJzsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzYXNjaWl0eXBlKGNoYXIgYykKLXsKLSAgICBpZiggYyA+PSAnICcgJiYgYyA8IDEyNyAmJiBjICE9ICdcJycgJiYgYyAhPSAnXFwnICkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW5saW5lIGNoYXIgbWFrZWhleGRpZ2l0KHVpbnQzMl90IHZhbCkKLXsKLSAgICByZXR1cm4gIjAxMjM0NTY3ODlhYmNkZWYiW3ZhbCYweEZdOwotfQotCi1zdGF0aWMgY2hhciogYXBwZW5kaGV4bnVtKHVpbnQzMl90IHZhbCwgY2hhciogb3V0KQotewotICAgIGZvciggaW50MzJfdCBpPTI4OyBpPj0wOyBpLT00ICkgewotICAgICAgICAqb3V0KysgPSBtYWtlaGV4ZGlnaXQoIHZhbD4+aSApOwotICAgIH0KLSAgICAqb3V0ID0gMDsKLSAgICByZXR1cm4gb3V0OwotfQotCi1zdGF0aWMgaW5saW5lIGNoYXIgbWFrZXVwcGVyaGV4ZGlnaXQodWludDMyX3QgdmFsKQotewotICAgIHJldHVybiAiMDEyMzQ1Njc4OUFCQ0RFRiJbdmFsJjB4Rl07Ci19Ci0KLXN0YXRpYyBjaGFyKiBhcHBlbmR1cHBlcmhleG51bSh1aW50MzJfdCB2YWwsIGNoYXIqIG91dCkKLXsKLSAgICBmb3IoIGludDMyX3QgaT0yODsgaT49MDsgaS09NCApIHsKLSAgICAgICAgKm91dCsrID0gbWFrZXVwcGVyaGV4ZGlnaXQoIHZhbD4+aSApOwotICAgIH0KLSAgICAqb3V0ID0gMDsKLSAgICByZXR1cm4gb3V0OwotfQotCi1zdGF0aWMgY2hhciogYXBwZW5kY2hhcm9ybnVtKGNoYXIgYywgY2hhciogb3V0LCBib29sIHNraXB6ZXJvID0gdHJ1ZSkKLXsKLSAgICBpZiAoc2tpcHplcm8gJiYgYyA9PSAwKSByZXR1cm4gb3V0OwotCi0gICAgaWYgKGlzYXNjaWl0eXBlKGMpKSB7Ci0gICAgICAgICpvdXQrKyA9IGM7Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgKm91dCsrID0gJ1xcJzsKLSAgICAqb3V0KysgPSAneCc7Ci0gICAgKm91dCsrID0gbWFrZWhleGRpZ2l0KGM+PjQpOwotICAgICpvdXQrKyA9IG1ha2VoZXhkaWdpdChjKTsKLSAgICByZXR1cm4gb3V0OwotfQotCi1zdGF0aWMgY2hhciogdHlwZXRvc3RyaW5nKHVpbnQzMl90IHR5cGUsIGNoYXIqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmdWxsQ29udGV4dCA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0ID0gZmFsc2UpCi17Ci0gICAgY2hhciogcG9zID0gb3V0OwotICAgIGNoYXIgY1s0XTsKLSAgICBjWzBdID0gKGNoYXIpKCh0eXBlPj4yNCkmMHhGRik7Ci0gICAgY1sxXSA9IChjaGFyKSgodHlwZT4+MTYpJjB4RkYpOwotICAgIGNbMl0gPSAoY2hhcikoKHR5cGU+PjgpJjB4RkYpOwotICAgIGNbM10gPSAoY2hhcikodHlwZSYweEZGKTsKLSAgICBib29sIHZhbGlkOwotICAgIGlmKCAhc3RyaWN0ICkgewotICAgICAgICAvLyBub3cgZXZlbiBsZXNzIHN0cmljdCEKLSAgICAgICAgLy8gdmFsaWQgPSBpc2FzY2lpdHlwZShjWzNdKTsKLSAgICAgICAgdmFsaWQgPSB0cnVlOwotICAgICAgICBpbnQzMl90IGkgPSAwOwotICAgICAgICBib29sIHplcm8gPSB0cnVlOwotICAgICAgICB3aGlsZSAodmFsaWQgJiYgaTwzKSB7Ci0gICAgICAgICAgICBpZiAoY1tpXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF6ZXJvKSB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB6ZXJvID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgLy9pZiAoIWlzYXNjaWl0eXBlKGNbaV0pKSB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIGFsbCB6ZXJvcywgbm90IGEgdmFsaWQgdHlwZSBjb2RlLgotICAgICAgICBpZiAoemVybykgdmFsaWQgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWxpZCA9IGlzaWRlbnQoY1szXSkgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgIGludDMyX3QgaSA9IDA7Ci0gICAgICAgIGJvb2wgemVybyA9IHRydWU7Ci0gICAgICAgIHdoaWxlICh2YWxpZCAmJiBpPDMpIHsKLSAgICAgICAgICAgIGlmIChjW2ldID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoIXplcm8pIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHplcm8gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzaWRlbnQoY1tpXSkpIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoIHZhbGlkICYmICghZnVsbENvbnRleHQgfHwgY1swXSAhPSAnMCcgfHwgY1sxXSAhPSAneCcpICkgewotICAgICAgICBpZiggZnVsbENvbnRleHQgKSAqcG9zKysgPSAnXCcnOwotICAgICAgICBwb3MgPSBhcHBlbmRjaGFyb3JudW0oY1swXSwgcG9zKTsKLSAgICAgICAgcG9zID0gYXBwZW5kY2hhcm9ybnVtKGNbMV0sIHBvcyk7Ci0gICAgICAgIHBvcyA9IGFwcGVuZGNoYXJvcm51bShjWzJdLCBwb3MpOwotICAgICAgICBwb3MgPSBhcHBlbmRjaGFyb3JudW0oY1szXSwgcG9zKTsKLSAgICAgICAgaWYoIGZ1bGxDb250ZXh0ICkgKnBvcysrID0gJ1wnJzsKLSAgICAgICAgKnBvcyA9IDA7Ci0gICAgICAgIHJldHVybiBwb3M7Ci0gICAgfQotICAgIAotICAgIGlmKCBmdWxsQ29udGV4dCApIHsKLSAgICAgICAgKnBvcysrID0gJzAnOwotICAgICAgICAqcG9zKysgPSAneCc7Ci0gICAgfQotICAgIHJldHVybiBhcHBlbmRoZXhudW0odHlwZSwgcG9zKTsKLX0KLQotdm9pZCBwcmludFR5cGVDb2RlKHVpbnQzMl90IHR5cGVDb2RlLCBkZWJ1Z1ByaW50RnVuYyBmdW5jLCB2b2lkKiBjb29raWUpCi17Ci0gICAgY2hhciBidWZmZXJbMzJdOwotICAgIGNoYXIqIGVuZCA9IHR5cGV0b3N0cmluZyh0eXBlQ29kZSwgYnVmZmVyKTsKLSAgICAqZW5kID0gMDsKLSAgICBmdW5jID8gKCpmdW5jKShjb29raWUsIGJ1ZmZlcikgOiBkZWZhdWx0UHJpbnRGdW5jKGNvb2tpZSwgYnVmZmVyKTsKLX0KLQotdm9pZCBwcmludEhleERhdGEoaW50MzJfdCBpbmRlbnQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbmd0aCwKLSAgICBzaXplX3QgYnl0ZXNQZXJMaW5lLCBpbnQzMl90IHNpbmdsZUxpbmVCeXRlc0N1dG9mZiwKLSAgICBzaXplX3QgYWxpZ25tZW50LCBib29sIGNTdHlsZSwKLSAgICBkZWJ1Z1ByaW50RnVuYyBmdW5jLCB2b2lkKiBjb29raWUpCi17Ci0gICAgaWYgKGFsaWdubWVudCA9PSAwKSB7Ci0gICAgICAgIGlmIChieXRlc1BlckxpbmUgPj0gMTYpIGFsaWdubWVudCA9IDQ7Ci0gICAgICAgIGVsc2UgaWYgKGJ5dGVzUGVyTGluZSA+PSA4KSBhbGlnbm1lbnQgPSAyOwotICAgICAgICBlbHNlIGFsaWdubWVudCA9IDE7Ci0gICAgfQotICAgIGlmIChmdW5jID09IE5VTEwpIGZ1bmMgPSBkZWZhdWx0UHJpbnRGdW5jOwotCi0gICAgc2l6ZV90IG9mZnNldDsKLSAgICAKLSAgICB1bnNpZ25lZCBjaGFyICpwb3MgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKLSAgICAKLSAgICBpZiAocG9zID09IE5VTEwpIHsKLSAgICAgICAgaWYgKHNpbmdsZUxpbmVCeXRlc0N1dG9mZiA8IDApIGZ1bmMoY29va2llLCAiXG4iKTsKLSAgICAgICAgZnVuYyhjb29raWUsICIoTlVMTCkiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAobGVuZ3RoID09IDApIHsKLSAgICAgICAgaWYgKHNpbmdsZUxpbmVCeXRlc0N1dG9mZiA8IDApIGZ1bmMoY29va2llLCAiXG4iKTsKLSAgICAgICAgZnVuYyhjb29raWUsICIoZW1wdHkpIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKChpbnQzMl90KWxlbmd0aCA8IDApIHsKLSAgICAgICAgaWYgKHNpbmdsZUxpbmVCeXRlc0N1dG9mZiA8IDApIGZ1bmMoY29va2llLCAiXG4iKTsKLSAgICAgICAgY2hhciBidWZbNjRdOwotICAgICAgICBzcHJpbnRmKGJ1ZiwgIihiYWQgbGVuZ3RoOiAlenUpIiwgbGVuZ3RoKTsKLSAgICAgICAgZnVuYyhjb29raWUsIGJ1Zik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1heEJ5dGVzUGVyTGluZSA9IChzaXplb2YoYnVmZmVyKS0xLTExLTQpLygzKzEpOwotICAgIAotICAgIGlmIChieXRlc1BlckxpbmUgPiBtYXhCeXRlc1BlckxpbmUpIGJ5dGVzUGVyTGluZSA9IG1heEJ5dGVzUGVyTGluZTsKLSAgICAKLSAgICBjb25zdCBib29sIG9uZUxpbmUgPSAoaW50MzJfdClsZW5ndGggPD0gc2luZ2xlTGluZUJ5dGVzQ3V0b2ZmOwotICAgIGJvb2wgbmV3TGluZSA9IGZhbHNlOwotICAgIGlmIChjU3R5bGUpIHsKLSAgICAgICAgaW5kZW50Kys7Ci0gICAgICAgIGZ1bmMoY29va2llLCAie1xuIik7Ci0gICAgICAgIG5ld0xpbmUgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoIW9uZUxpbmUpIHsKLSAgICAgICAgZnVuYyhjb29raWUsICJcbiIpOwotICAgICAgICBuZXdMaW5lID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChvZmZzZXQgPSAwOyA7IG9mZnNldCArPSBieXRlc1BlckxpbmUsIHBvcyArPSBieXRlc1BlckxpbmUpIHsKLSAgICAgICAgbG9uZyByZW1haW4gPSBsZW5ndGg7Ci0KLSAgICAgICAgY2hhciogYyA9IGJ1ZmZlcjsKLSAgICAgICAgaWYgKCFvbmVMaW5lICYmICFjU3R5bGUpIHsKLSAgICAgICAgICAgIHNwcmludGYoYywgIjB4JTA4eDogIiwgKGludClvZmZzZXQpOwotICAgICAgICAgICAgYyArPSAxMjsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBpbmRleDsKLSAgICAgICAgc2l6ZV90IHdvcmQ7Ci0gICAgICAgIAotICAgICAgICBmb3IgKHdvcmQgPSAwOyB3b3JkIDwgYnl0ZXNQZXJMaW5lOyApIHsKLQotI2lmZGVmIEhBVkVfTElUVExFX0VORElBTgotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHN0YXJ0SW5kZXggPSB3b3JkKyhhbGlnbm1lbnQtKGFsaWdubWVudD8xOjApKTsKLSAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgZGlyID0gLTE7Ci0jZWxzZQotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHN0YXJ0SW5kZXggPSB3b3JkOwotICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBkaXIgPSAxOwotI2VuZGlmCi0KLSAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGFsaWdubWVudCB8fCAoYWxpZ25tZW50ID09IDAgJiYgaW5kZXggPCBieXRlc1BlckxpbmUpOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIWNTdHlsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCAmJiB3b3JkID4gMCAmJiBhbGlnbm1lbnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqYysrID0gJyAnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW4tLSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsID0gKihwb3Mrc3RhcnRJbmRleCsoaW5kZXgqZGlyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqYysrID0gbWFrZWhleGRpZ2l0KHZhbD4+NCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqYysrID0gbWFrZWhleGRpZ2l0KHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9uZUxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpjKysgPSAnICc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqYysrID0gJyAnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwICYmIHdvcmQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmMrKyA9ICcsJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYysrID0gJyAnOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYysrID0gJzAnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjKysgPSAneCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCA9ICoocG9zK3N0YXJ0SW5kZXgrKGluZGV4KmRpcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmMrKyA9IG1ha2VoZXhkaWdpdCh2YWw+PjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmMrKyA9IG1ha2VoZXhkaWdpdCh2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluLS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdvcmQgKz0gaW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWNTdHlsZSkgewotICAgICAgICAgICAgcmVtYWluID0gbGVuZ3RoOwotICAgICAgICAgICAgKmMrKyA9ICcgJzsKLSAgICAgICAgICAgICpjKysgPSAnXCcnOwotICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYnl0ZXNQZXJMaW5lOyBpbmRleCsrKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVtYWluLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsID0gcG9zW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgKmMrKyA9ICh2YWwgPj0gJyAnICYmIHZhbCA8IDEyNykgPyB2YWwgOiAnLic7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb25lTGluZSkgewotICAgICAgICAgICAgICAgICAgICAqYysrID0gJyAnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgKmMrKyA9ICdcJyc7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gYnl0ZXNQZXJMaW5lKSAqYysrID0gJ1xuJzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChyZW1haW4gPiAwKSAqYysrID0gJywnOwotICAgICAgICAgICAgKmMrKyA9ICdcbic7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV3TGluZSAmJiBpbmRlbnQpIGZ1bmMoY29va2llLCBzdHJpbmdGb3JJbmRlbnQoaW5kZW50KSk7Ci0gICAgICAgICpjID0gMDsKLSAgICAgICAgZnVuYyhjb29raWUsIGJ1ZmZlcik7Ci0gICAgICAgIG5ld0xpbmUgPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgaWYgKGxlbmd0aCA8PSBieXRlc1BlckxpbmUpIGJyZWFrOwotICAgICAgICBsZW5ndGggLT0gYnl0ZXNQZXJMaW5lOwotICAgIH0KLQotICAgIGlmIChjU3R5bGUpIHsKLSAgICAgICAgaWYgKGluZGVudCA+IDApIGZ1bmMoY29va2llLCBzdHJpbmdGb3JJbmRlbnQoaW5kZW50LTEpKTsKLSAgICAgICAgZnVuYyhjb29raWUsICJ9OyIpOwotICAgIH0KLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9GaWxlTWFwLmNwcCBiL2xpYnMvdXRpbHMvRmlsZU1hcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTM3MGUuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9GaWxlTWFwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFNoYXJlZCBmaWxlIG1hcHBpbmcgY2xhc3MuCi0vLwotCi0jZGVmaW5lIExPR19UQUcgImZpbGVtYXAiCi0KLSNpbmNsdWRlIDx1dGlscy9GaWxlTWFwLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWZkZWYgSEFWRV9QT1NJWF9GSUxFTUFQCi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLS8qc3RhdGljKi8gbG9uZyBGaWxlTWFwOjptUGFnZVNpemUgPSAtMTsKLQotCi0vKgotICogQ29uc3RydWN0b3IuICBDcmVhdGUgYW4gZW1wdHkgb2JqZWN0LgotICovCi1GaWxlTWFwOjpGaWxlTWFwKHZvaWQpCi0gICAgOiBtUmVmQ291bnQoMSksIG1GaWxlTmFtZShOVUxMKSwgbUJhc2VQdHIoTlVMTCksIG1CYXNlTGVuZ3RoKDApLAotICAgICAgbURhdGFQdHIoTlVMTCksIG1EYXRhTGVuZ3RoKDApCi17Ci19Ci0KLS8qCi0gKiBEZXN0cnVjdG9yLgotICovCi1GaWxlTWFwOjp+RmlsZU1hcCh2b2lkKQotewotICAgIGFzc2VydChtUmVmQ291bnQgPT0gMCk7Ci0KLSAgICAvL3ByaW50ZigiKysrIHJlbW92aW5nIEZpbGVNYXAgJXAgJXVcbiIsIG1EYXRhUHRyLCBtRGF0YUxlbmd0aCk7Ci0KLSAgICBtUmVmQ291bnQgPSAtMTAwOyAgICAgICAvLyBoZWxwIGNhdGNoIGRvdWJsZS1mcmVlCi0gICAgaWYgKG1GaWxlTmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUZpbGVOYW1lKTsKLSAgICB9Ci0jaWZkZWYgSEFWRV9QT1NJWF9GSUxFTUFQICAgIAotICAgIGlmIChtQmFzZVB0ciAmJiBtdW5tYXAobUJhc2VQdHIsIG1CYXNlTGVuZ3RoKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dEKCJtdW5tYXAoJXAsICVkKSBmYWlsZWRcbiIsIG1CYXNlUHRyLCAoaW50KSBtQmFzZUxlbmd0aCk7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgSEFWRV9XSU4zMl9GSUxFTUFQCi0gICAgaWYgKG1CYXNlUHRyICYmIFVubWFwVmlld09mRmlsZShtQmFzZVB0cikgPT0gMCkgewotICAgICAgICBBTE9HRCgiVW5tYXBWaWV3T2ZGaWxlKCVwKSBmYWlsZWQsIGVycm9yID0gJWxkXG4iLCBtQmFzZVB0ciwKLSAgICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkgKTsKLSAgICB9Ci0gICAgaWYgKG1GaWxlTWFwcGluZyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICBDbG9zZUhhbmRsZShtRmlsZU1hcHBpbmcpOwotICAgIH0KLSAgICBDbG9zZUhhbmRsZShtRmlsZUhhbmRsZSk7Ci0jZW5kaWYKLX0KLQotCi0vKgotICogQ3JlYXRlIGEgbmV3IG1hcHBpbmcgb24gYW4gb3BlbiBmaWxlLgotICoKLSAqIENsb3NpbmcgdGhlIGZpbGUgZGVzY3JpcHRvciBkb2VzIG5vdCB1bm1hcCB0aGUgcGFnZXMsIHNvIHdlIGRvbid0Ci0gKiBjbGFpbSBvd25lcnNoaXAgb2YgdGhlIGZkLgotICoKLSAqIFJldHVybnMgImZhbHNlIiBvbiBmYWlsdXJlLgotICovCi1ib29sIEZpbGVNYXA6OmNyZWF0ZShjb25zdCBjaGFyKiBvcmlnRmlsZU5hbWUsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgsCi0gICAgICAgIGJvb2wgcmVhZE9ubHkpCi17Ci0jaWZkZWYgSEFWRV9XSU4zMl9GSUxFTUFQCi0gICAgaW50ICAgICBhZGp1c3Q7Ci0gICAgb2ZmNjRfdCBhZGpPZmZzZXQ7Ci0gICAgc2l6ZV90ICBhZGpMZW5ndGg7Ci0KLSAgICBpZiAobVBhZ2VTaXplID09IC0xKSB7Ci0gICAgICAgIFNZU1RFTV9JTkZPICBzaTsKLSAgICAgICAgCi0gICAgICAgIEdldFN5c3RlbUluZm8oICZzaSApOwotICAgICAgICBtUGFnZVNpemUgPSBzaS5kd0FsbG9jYXRpb25HcmFudWxhcml0eTsKLSAgICB9Ci0KLSAgICBEV09SRCAgcHJvdGVjdCA9IHJlYWRPbmx5ID8gUEFHRV9SRUFET05MWSA6IFBBR0VfUkVBRFdSSVRFOwotICAgIAotICAgIG1GaWxlSGFuZGxlICA9IChIQU5ETEUpIF9nZXRfb3NmaGFuZGxlKGZkKTsKLSAgICBtRmlsZU1hcHBpbmcgPSBDcmVhdGVGaWxlTWFwcGluZyggbUZpbGVIYW5kbGUsIE5VTEwsIHByb3RlY3QsIDAsIDAsIE5VTEwpOwotICAgIGlmIChtRmlsZU1hcHBpbmcgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ3JlYXRlRmlsZU1hcHBpbmcoJXAsICVseCkgZmFpbGVkIHdpdGggZXJyb3IgJWxkXG4iLAotICAgICAgICAgICAgICBtRmlsZUhhbmRsZSwgcHJvdGVjdCwgR2V0TGFzdEVycm9yKCkgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBhZGp1c3QgICAgPSBvZmZzZXQgJSBtUGFnZVNpemU7Ci0gICAgYWRqT2Zmc2V0ID0gb2Zmc2V0IC0gYWRqdXN0OwotICAgIGFkakxlbmd0aCA9IGxlbmd0aCArIGFkanVzdDsKLSAgICAKLSAgICBtQmFzZVB0ciA9IE1hcFZpZXdPZkZpbGUoIG1GaWxlTWFwcGluZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkT25seSA/IEZJTEVfTUFQX1JFQUQgOiBGSUxFX01BUF9BTExfQUNDRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRCkoYWRqT2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkakxlbmd0aCApOwotICAgIGlmIChtQmFzZVB0ciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJNYXBWaWV3T2ZGaWxlKCVsZCwgJWxkKSBmYWlsZWQgd2l0aCBlcnJvciAlbGRcbiIsCi0gICAgICAgICAgICAgIGFkak9mZnNldCwgYWRqTGVuZ3RoLCBHZXRMYXN0RXJyb3IoKSApOwotICAgICAgICBDbG9zZUhhbmRsZShtRmlsZU1hcHBpbmcpOwotICAgICAgICBtRmlsZU1hcHBpbmcgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIEhBVkVfUE9TSVhfRklMRU1BUAotICAgIGludCAgICAgcHJvdCwgZmxhZ3MsIGFkanVzdDsKLSAgICBvZmY2NF90IGFkak9mZnNldDsKLSAgICBzaXplX3QgIGFkakxlbmd0aDsKLQotICAgIHZvaWQqIHB0cjsKLQotICAgIGFzc2VydChtUmVmQ291bnQgPT0gMSk7Ci0gICAgYXNzZXJ0KGZkID49IDApOwotICAgIGFzc2VydChvZmZzZXQgPj0gMCk7Ci0gICAgYXNzZXJ0KGxlbmd0aCA+IDApOwotCi0gICAgLyogaW5pdCBvbiBmaXJzdCB1c2UgKi8KLSAgICBpZiAobVBhZ2VTaXplID09IC0xKSB7Ci0jaWYgTk9UX1VTSU5HX0tMSUJDCi0gICAgICAgIG1QYWdlU2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKLSAgICAgICAgaWYgKG1QYWdlU2l6ZSA9PSAtMSkgewotICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBnZXQgX1NDX1BBR0VTSVpFXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgLyogdGhpcyBob2xkcyBmb3IgTGludXgsIERhcndpbiwgQ3lnd2luLCBhbmQgZG9lc24ndCBwYWluIHRoZSBBUk0gKi8KLSAgICAgICAgbVBhZ2VTaXplID0gNDA5NjsKLSNlbmRpZgotICAgIH0KLQotICAgIGFkanVzdCAgID0gb2Zmc2V0ICUgbVBhZ2VTaXplOwotdHJ5X2FnYWluOgotICAgIGFkak9mZnNldCA9IG9mZnNldCAtIGFkanVzdDsKLSAgICBhZGpMZW5ndGggPSBsZW5ndGggKyBhZGp1c3Q7Ci0KLSAgICBmbGFncyA9IE1BUF9TSEFSRUQ7Ci0gICAgcHJvdCA9IFBST1RfUkVBRDsKLSAgICBpZiAoIXJlYWRPbmx5KQotICAgICAgICBwcm90IHw9IFBST1RfV1JJVEU7Ci0KLSAgICBwdHIgPSBtbWFwKE5VTEwsIGFkakxlbmd0aCwgcHJvdCwgZmxhZ3MsIGZkLCBhZGpPZmZzZXQpOwotICAgIGlmIChwdHIgPT0gTUFQX0ZBSUxFRCkgewotICAgIAkvLyBDeWd3aW4gZG9lcyBub3Qgc2VlbSB0byBsaWtlIGZpbGUgbWFwcGluZyBmaWxlcyBmcm9tIGFuIG9mZnNldC4KLSAgICAJLy8gU28gaWYgd2UgZmFpbCwgdHJ5IGFnYWluIHdpdGggb2Zmc2V0IHplcm8KLSAgICAJaWYgKGFkak9mZnNldCA+IDApIHsKLSAgICAJCWFkanVzdCA9IG9mZnNldDsKLSAgICAJCWdvdG8gdHJ5X2FnYWluOwotICAgIAl9Ci0gICAgCi0gICAgICAgIEFMT0dFKCJtbWFwKCVsZCwlbGQpIGZhaWxlZDogJXNcbiIsCi0gICAgICAgICAgICAobG9uZykgYWRqT2Zmc2V0LCAobG9uZykgYWRqTGVuZ3RoLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1CYXNlUHRyID0gcHRyOwotI2VuZGlmIC8qIEhBVkVfUE9TSVhfRklMRU1BUCAqLwotCi0gICAgbUZpbGVOYW1lID0gb3JpZ0ZpbGVOYW1lICE9IE5VTEwgPyBzdHJkdXAob3JpZ0ZpbGVOYW1lKSA6IE5VTEw7Ci0gICAgbUJhc2VMZW5ndGggPSBhZGpMZW5ndGg7Ci0gICAgbURhdGFPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgbURhdGFQdHIgPSAoY2hhciopIG1CYXNlUHRyICsgYWRqdXN0OwotICAgIG1EYXRhTGVuZ3RoID0gbGVuZ3RoOwotCi0gICAgYXNzZXJ0KG1CYXNlUHRyICE9IE5VTEwpOwotCi0gICAgQUxPR1YoIk1BUDogYmFzZSAlcC8lZCBkYXRhICVwLyVkXG4iLAotICAgICAgICBtQmFzZVB0ciwgKGludCkgbUJhc2VMZW5ndGgsIG1EYXRhUHRyLCAoaW50KSBtRGF0YUxlbmd0aCk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLSAqIFByb3ZpZGUgZ3VpZGFuY2UgdG8gdGhlIHN5c3RlbS4KLSAqLwotaW50IEZpbGVNYXA6OmFkdmlzZShNYXBBZHZpY2UgYWR2aWNlKQotewotI2lmIEhBVkVfTUFEVklTRQotICAgIGludCBjYywgc3lzQWR2aWNlOwotCi0gICAgc3dpdGNoIChhZHZpY2UpIHsKLSAgICAgICAgY2FzZSBOT1JNQUw6ICAgICAgICBzeXNBZHZpY2UgPSBNQURWX05PUk1BTDsgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBTkRPTTogICAgICAgIHN5c0FkdmljZSA9IE1BRFZfUkFORE9NOyAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VRVUVOVElBTDogICAgc3lzQWR2aWNlID0gTUFEVl9TRVFVRU5USUFMOyAgICBicmVhazsKLSAgICAgICAgY2FzZSBXSUxMTkVFRDogICAgICBzeXNBZHZpY2UgPSBNQURWX1dJTExORUVEOyAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERPTlRORUVEOiAgICAgIHN5c0FkdmljZSA9IE1BRFZfRE9OVE5FRUQ7ICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgY2MgPSBtYWR2aXNlKG1CYXNlUHRyLCBtQmFzZUxlbmd0aCwgc3lzQWR2aWNlKTsKLSAgICBpZiAoY2MgIT0gMCkKLSAgICAgICAgQUxPR1coIm1hZHZpc2UoJWQpIGZhaWxlZDogJXNcbiIsIHN5c0FkdmljZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gY2M7Ci0jZWxzZQotCXJldHVybiAtMTsKLSNlbmRpZiAvLyBIQVZFX01BRFZJU0UKLX0KZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvRmxhdHRlbmFibGUuY3BwIGIvbGlicy91dGlscy9GbGF0dGVuYWJsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMmZmYWEuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9GbGF0dGVuYWJsZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHV0aWxzL0ZsYXR0ZW5hYmxlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRmxhdHRlbmFibGU6On5GbGF0dGVuYWJsZSgpIHsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvTGluZWFyVHJhbnNmb3JtLmNwcCBiL2xpYnMvdXRpbHMvTGluZWFyVHJhbnNmb3JtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1MjQxNS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL0xpbmVhclRyYW5zZm9ybS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9MaW5lYXJUcmFuc2Zvcm0uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgaW5saW5lIFQgQUJTKFQgeCkgeyByZXR1cm4gKHggPCAwKSA/IC14IDogeDsgfQotCi0vLyBTdGF0aWMgbWF0aCBtZXRob2RzIGludm9sdmluZyBsaW5lYXIgdHJhbnNmb3JtYXRpb25zCi1zdGF0aWMgYm9vbCBzY2FsZV91NjRfdG9fdTY0KAotICAgICAgICB1aW50NjRfdCB2YWwsCi0gICAgICAgIHVpbnQzMl90IE4sCi0gICAgICAgIHVpbnQzMl90IEQsCi0gICAgICAgIHVpbnQ2NF90KiByZXMsCi0gICAgICAgIGJvb2wgcm91bmRfdXBfbm90X2Rvd24pIHsKLSAgICB1aW50NjRfdCB0bXAxLCB0bXAyOwotICAgIHVpbnQzMl90IHI7Ci0KLSAgICBhc3NlcnQocmVzKTsKLSAgICBhc3NlcnQoRCk7Ci0KLSAgICAvLyBMZXQgVTMyKFgpIGRlbm90ZSBhIHVpbnQzMl90IGNvbnRhaW5pbmcgdGhlIHVwcGVyIDMyIGJpdHMgb2YgYSA2NCBiaXQKLSAgICAvLyBpbnRlZ2VyIFguCi0gICAgLy8gTGV0IEwzMihYKSBkZW5vdGUgYSB1aW50MzJfdCBjb250YWluaW5nIHRoZSBsb3dlciAzMiBiaXRzIG9mIGEgNjQgYml0Ci0gICAgLy8gaW50ZWdlciBYLgotICAgIC8vIExldCBYW0EsIEJdIHdpdGggQSA8PSBCIGRlbm90ZSBiaXRzIEEgdGhyb3VnaCBCIG9mIHRoZSBpbnRlZ2VyIFguCi0gICAgLy8gTGV0IChBIHwgQikgZGVub3RlIHRoZSBjb25jYXRpbmF0aW9uIG9mIHR3byAzMiBiaXQgaW50cywgQSBhbmQgQi4KLSAgICAvLyBJT1cgWCA9IChBIHwgQikgPT4gVTMyKFgpID09IEEgJiYgTDMyKFgpID09IEIKLSAgICAvLwotICAgIC8vIGNvbXB1dGUgTSA9IHZhbCAqIE4gKGEgOTYgYml0IGludCkKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyB0bXAyID0gVTMyKHZhbCkgKiBOIChhIDY0IGJpdCBpbnQpCi0gICAgLy8gdG1wMSA9IEwzMih2YWwpICogTiAoYSA2NCBiaXQgaW50KQotICAgIC8vIHdoaWNoIG1lYW5zCi0gICAgLy8gTSA9IHZhbCAqIE4gPSAodG1wMiA8PCAzMikgKyB0bXAxCi0gICAgdG1wMiA9ICh2YWwgPj4gMzIpICogTjsKLSAgICB0bXAxID0gKHZhbCAmIFVJTlQzMl9NQVgpICogTjsKLQotICAgIC8vIGNvbXB1dGUgTVszMiwgOTVdCi0gICAgLy8gdG1wMiA9IHRtcDIgKyBVMzIodG1wMSkKLSAgICAvLyAgICAgID0gKFUzMih2YWwpICogTikgKyBVMzIoTDMyKHZhbCkgKiBOKQotICAgIC8vICAgICAgPSBNWzMyLCA5NV0KLSAgICB0bXAyICs9IHRtcDEgPj4gMzI7Ci0KLSAgICAvLyBpZiBNWzY0LCA5NV0gPj0gRCwgdGhlbiBNL0QgaGFzIGJpdHMgPiA2MyBzZXQgYW5kIHdlIGhhdmUKLSAgICAvLyBhbiBvdmVyZmxvdy4KLSAgICBpZiAoKHRtcDIgPj4gMzIpID49IEQpIHsKLSAgICAgICAgKnJlcyA9IFVJTlQ2NF9NQVg7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBEaXZpZGUuICBHb2luZyBpbiB3ZSBrbm93Ci0gICAgLy8gdG1wMiA9IE1bMzIsIDk1XQotICAgIC8vIFUzMih0bXAyKSA8IEQKLSAgICByID0gdG1wMiAlIEQ7Ci0gICAgdG1wMiAvPSBEOwotCi0gICAgLy8gQXQgdGhpcyBwb2ludAotICAgIC8vIHRtcDEgICAgICA9IEwzMih2YWwpICogTgotICAgIC8vIHRtcDIgICAgICA9IE1bMzIsIDk1XSAvIEQKLSAgICAvLyAgICAgICAgICAgPSAoTSAvIEQpWzMyLCA5NV0KLSAgICAvLyByICAgICAgICAgPSBNWzMyLCA5NV0gJSBECi0gICAgLy8gVTMyKHRtcDIpID0gMAotICAgIC8vCi0gICAgLy8gY29tcHV0ZSB0bXAxID0gKHIgfCBNWzAsIDMxXSkKLSAgICB0bXAxID0gKHRtcDEgJiBVSU5UMzJfTUFYKSB8ICgodWludDY0X3QpciA8PCAzMik7Ci0KLSAgICAvLyBEaXZpZGUgYWdhaW4uICBLZWVwIHRoZSByZW1haW5kZXIgYXJvdW5kIGluIG9yZGVyIHRvIHJvdW5kIHByb3Blcmx5LgotICAgIHIgPSB0bXAxICUgRDsKLSAgICB0bXAxIC89IEQ7Ci0KLSAgICAvLyBBdCB0aGlzIHBvaW50Ci0gICAgLy8gdG1wMiAgICAgID0gKE0gLyBEKVszMiwgOTVdCi0gICAgLy8gdG1wMSAgICAgID0gKE0gLyBEKVsgMCwgMzFdCi0gICAgLy8gciAgICAgICAgID0gIE0gJSBECi0gICAgLy8gVTMyKHRtcDEpID0gMAotICAgIC8vIFUzMih0bXAyKSA9IDAKLQotICAgIC8vIFBhY2sgdGhlIHJlc3VsdCBhbmQgZGVhbCB3aXRoIHRoZSByb3VuZC11cCBjYXNlIChBcyB3ZWxsIGFzIHRoZQotICAgIC8vIHJlbW90ZSBwb3NzaWJsaWxpdHkgb3ZlciBvdmVyZmxvdyBpbiBzdWNoIGEgY2FzZSkuCi0gICAgKnJlcyA9ICh0bXAyIDw8IDMyKSB8IHRtcDE7Ci0gICAgaWYgKHIgJiYgcm91bmRfdXBfbm90X2Rvd24pIHsKLSAgICAgICAgKysoKnJlcyk7Ci0gICAgICAgIGlmICghKCpyZXMpKSB7Ci0gICAgICAgICAgICAqcmVzID0gVUlOVDY0X01BWDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBsaW5lYXJfdHJhbnNmb3JtX3M2NF90b19zNjQoCi0gICAgICAgIGludDY0X3QgIHZhbCwKLSAgICAgICAgaW50NjRfdCAgYmFzaXMxLAotICAgICAgICBpbnQzMl90ICBOLAotICAgICAgICB1aW50MzJfdCBELAotICAgICAgICBpbnQ2NF90ICBiYXNpczIsCi0gICAgICAgIGludDY0X3QqIG91dCkgewotICAgIHVpbnQ2NF90IHNjYWxlZCwgcmVzOwotICAgIHVpbnQ2NF90IGFic192YWw7Ci0gICAgYm9vbCBpc19uZWc7Ci0KLSAgICBpZiAoIW91dCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gQ29tcHV0ZSBhYnModmFsIC0gYmFzaXNfNjQpLiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHRoaXMgZGVsdGEKLSAgICAvLyB3aWxsIGJlIG5lZ2F0aXZlIGFmdGVyIHRoZSBzY2FsZSBvcGVydGFpb24uCi0gICAgaWYgKHZhbCA8IGJhc2lzMSkgewotICAgICAgICBpc19uZWcgPSB0cnVlOwotICAgICAgICBhYnNfdmFsID0gYmFzaXMxIC0gdmFsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlzX25lZyA9IGZhbHNlOwotICAgICAgICBhYnNfdmFsID0gdmFsIC0gYmFzaXMxOwotICAgIH0KLQotICAgIGlmIChOIDwgMCkKLSAgICAgICAgaXNfbmVnID0gIWlzX25lZzsKLQotICAgIGlmICghc2NhbGVfdTY0X3RvX3U2NChhYnNfdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoTiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25lZykpCi0gICAgICAgIHJldHVybiBmYWxzZTsgLy8gb3ZlcmZsb3cvdW5kZWZsb3cKLQotICAgIC8vIGlmIHNjYWxlZCBpcyA+PSAweDgwMDA8ZXRjPiwgdGhlbiB3ZSBhcmUgZ29pbmcgdG8gb3ZlcmZsb3cgb3IKLSAgICAvLyB1bmRlcmZsb3cgdW5sZXNzIEFCUyhiYXNpczIpIGlzIGxhcmdlIGVub3VnaCB0byBwdWxsIHVzIGJhY2sgaW50byB0aGUKLSAgICAvLyBub24tb3ZlcmZsb3cvdW5kZXJmbG93IHJlZ2lvbi4KLSAgICBpZiAoc2NhbGVkICYgSU5UNjRfTUlOKSB7Ci0gICAgICAgIGlmIChpc19uZWcgJiYgKGJhc2lzMiA8IDApKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBjZXJ0YWluIHVuZGVyZmxvdwotCi0gICAgICAgIGlmICghaXNfbmVnICYmIChiYXNpczIgPj0gMCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGNlcnRhaW4gb3ZlcmZsb3cKLQotICAgICAgICBpZiAoQUJTKGJhc2lzMikgPD0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oc2NhbGVkICYgSU5UNjRfTUFYKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90IGVub3VnaAotCi0gICAgICAgIC8vIExvb2tzIGxpa2Ugd2UgYXJlIE9LCi0gICAgICAgICpvdXQgPSAoaXNfbmVnID8gKC1zY2FsZWQpIDogc2NhbGVkKSArIGJhc2lzMjsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBTY2FsZWQgZml0cyB3aXRoaW4gc2lnbmVkIGJvdW5kcywgc28gd2UganVzdCBuZWVkIHRvIGNoZWNrIGZvcgotICAgICAgICAvLyBvdmVyL3VuZGVyZmxvdyBmb3IgdHdvIHNpZ25lZCBpbnRlZ2Vycy4gIEJhc2ljYWxseSwgaWYgYm90aCBzY2FsZWQKLSAgICAgICAgLy8gYW5kIGJhc2lzMiBoYXZlIHRoZSBzYW1lIHNpZ24gYml0LCBhbmQgdGhlIHJlc3VsdCBoYXMgYSBkaWZmZXJlbnQKLSAgICAgICAgLy8gc2lnbiBiaXQsIHRoZW4gd2UgaGF2ZSB1bmRlci9vdmVyZmxvdy4gIEFuIGVhc3kgd2F5IHRvIGNvbXB1dGUgdGhpcwotICAgICAgICAvLyBpcwotICAgICAgICAvLyAoc2NhbGVkX3NpZ25iaXQgWE5PUiBiYXNpc19zaWduYml0KSAmJgotICAgICAgICAvLyAoc2NhbGVkX3NpZ25iaXQgWE9SIHJlc19zaWduYml0KQotICAgICAgICAvLyA9PQotICAgICAgICAvLyAoc2NhbGVkX3NpZ25iaXQgWE9SIGJhc2lzX3NpZ25iaXQgWE9SIDEpICYmCi0gICAgICAgIC8vIChzY2FsZWRfc2lnbmJpdCBYT1IgcmVzX3NpZ25iaXQpCi0KLSAgICAgICAgaWYgKGlzX25lZykKLSAgICAgICAgICAgIHNjYWxlZCA9IC1zY2FsZWQ7Ci0gICAgICAgIHJlcyA9IHNjYWxlZCArIGJhc2lzMjsKLQotICAgICAgICBpZiAoKHNjYWxlZCBeIGJhc2lzMiBeIElOVDY0X01JTikgJiAoc2NhbGVkIF4gcmVzKSAmIElOVDY0X01JTikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAqb3V0ID0gcmVzOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIExpbmVhclRyYW5zZm9ybTo6ZG9Gb3J3YXJkVHJhbnNmb3JtKGludDY0X3QgYV9pbiwgaW50NjRfdCogYl9vdXQpIGNvbnN0IHsKLSAgICBpZiAoMCA9PSBhX3RvX2JfZGVub20pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiBsaW5lYXJfdHJhbnNmb3JtX3M2NF90b19zNjQoYV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfemVybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfdG9fYl9udW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfdG9fYl9kZW5vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfemVybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfb3V0KTsKLX0KLQotYm9vbCBMaW5lYXJUcmFuc2Zvcm06OmRvUmV2ZXJzZVRyYW5zZm9ybShpbnQ2NF90IGJfaW4sIGludDY0X3QqIGFfb3V0KSBjb25zdCB7Ci0gICAgaWYgKDAgPT0gYV90b19iX251bWVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gbGluZWFyX3RyYW5zZm9ybV9zNjRfdG9fczY0KGJfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX3plcm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhX3RvX2JfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhX3RvX2JfbnVtZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhX3plcm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhX291dCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIExpbmVhclRyYW5zZm9ybTo6cmVkdWNlKFQqIE4sIFQqIEQpIHsKLSAgICBUIGEsIGI7Ci0gICAgaWYgKCFOIHx8ICFEIHx8ICEoKkQpKSB7Ci0gICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhID0gKk47Ci0gICAgYiA9ICpEOwotCi0gICAgaWYgKGEgPT0gMCkgewotICAgICAgICAqRCA9IDE7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGltcGxlbWVudHMgRXVjbGlkJ3MgbWV0aG9kIHRvIGZpbmQgR0NELgotICAgIGlmIChhIDwgYikgewotICAgICAgICBUIHRtcCA9IGE7Ci0gICAgICAgIGEgPSBiOwotICAgICAgICBiID0gdG1wOwotICAgIH0KLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIC8vIGEgaXMgbm93IHRoZSBncmVhdGVyIG9mIHRoZSB0d28uCi0gICAgICAgIGNvbnN0IFQgcmVtYWluZGVyID0gYSAlIGI7Ci0gICAgICAgIGlmIChyZW1haW5kZXIgPT0gMCkgewotICAgICAgICAgICAgKk4gLz0gYjsKLSAgICAgICAgICAgICpEIC89IGI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYnkgc3dhcHBpbmcgcmVtYWluZGVyIGFuZCBiLCB3ZSBhcmUgZ3VhcmFudGVlaW5nIHRoYXQgYSBpcwotICAgICAgICAvLyBzdGlsbCB0aGUgZ3JlYXRlciBvZiB0aGUgdHdvIHVwb24gZW50cmFuY2UgdG8gdGhlIGxvb3AuCi0gICAgICAgIGEgPSBiOwotICAgICAgICBiID0gcmVtYWluZGVyOwotICAgIH0KLX07Ci0KLXRlbXBsYXRlIHZvaWQgTGluZWFyVHJhbnNmb3JtOjpyZWR1Y2U8dWludDY0X3Q+KHVpbnQ2NF90KiBOLCB1aW50NjRfdCogRCk7Ci10ZW1wbGF0ZSB2b2lkIExpbmVhclRyYW5zZm9ybTo6cmVkdWNlPHVpbnQzMl90Pih1aW50MzJfdCogTiwgdWludDMyX3QqIEQpOwotCi12b2lkIExpbmVhclRyYW5zZm9ybTo6cmVkdWNlKGludDMyX3QqIE4sIHVpbnQzMl90KiBEKSB7Ci0gICAgaWYgKE4gJiYgRCAmJiAqRCkgewotICAgICAgICBpZiAoKk4gPCAwKSB7Ci0gICAgICAgICAgICAqTiA9IC0oKk4pOwotICAgICAgICAgICAgcmVkdWNlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihOKSwgRCk7Ci0gICAgICAgICAgICAqTiA9IC0oKk4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVkdWNlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihOKSwgRCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0xvb3Blci5jcHAgYi9saWJzL3V0aWxzL0xvb3Blci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYWE2NjQuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9Mb29wZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzQ0ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gQSBsb29wZXIgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gZXBvbGwoKS4KLS8vCi0jZGVmaW5lIExPR19UQUcgIkxvb3BlciIKLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0vLyBEZWJ1Z3MgcG9sbCBhbmQgd2FrZSBpbnRlcmFjdGlvbnMuCi0jZGVmaW5lIERFQlVHX1BPTExfQU5EX1dBS0UgMAotCi0vLyBEZWJ1Z3MgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGFuZCBpbnZvY2F0aW9uLgotI2RlZmluZSBERUJVR19DQUxMQkFDS1MgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvb3Blci5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLSBXZWFrTWVzc2FnZUhhbmRsZXIgLS0tCi0KLVdlYWtNZXNzYWdlSGFuZGxlcjo6V2Vha01lc3NhZ2VIYW5kbGVyKGNvbnN0IHdwPE1lc3NhZ2VIYW5kbGVyPiYgaGFuZGxlcikgOgotICAgICAgICBtSGFuZGxlcihoYW5kbGVyKSB7Ci19Ci0KLXZvaWQgV2Vha01lc3NhZ2VIYW5kbGVyOjpoYW5kbGVNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgICBzcDxNZXNzYWdlSGFuZGxlcj4gaGFuZGxlciA9IG1IYW5kbGVyLnByb21vdGUoKTsKLSAgICBpZiAoaGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGhhbmRsZXItPmhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotfQotCi0KLS8vIC0tLSBMb29wZXIgLS0tCi0KLSNpZmRlZiBMT09QRVJfVVNFU19FUE9MTAotLy8gSGludCBmb3IgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcG9sbCBpbnN0YW5jZS4KLXN0YXRpYyBjb25zdCBpbnQgRVBPTExfU0laRV9ISU5UID0gODsKLQotLy8gTWF4aW11bSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBmb3Igd2hpY2ggdG8gcmV0cmlldmUgcG9sbCBldmVudHMgZWFjaCBpdGVyYXRpb24uCi1zdGF0aWMgY29uc3QgaW50IEVQT0xMX01BWF9FVkVOVFMgPSAxNjsKLSNlbmRpZgotCi1zdGF0aWMgcHRocmVhZF9vbmNlX3QgZ1RMU09uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKLXN0YXRpYyBwdGhyZWFkX2tleV90IGdUTFNLZXkgPSAwOwotCi1Mb29wZXI6Okxvb3Blcihib29sIGFsbG93Tm9uQ2FsbGJhY2tzKSA6Ci0gICAgICAgIG1BbGxvd05vbkNhbGxiYWNrcyhhbGxvd05vbkNhbGxiYWNrcyksIG1TZW5kaW5nTWVzc2FnZShmYWxzZSksCi0gICAgICAgIG1SZXNwb25zZUluZGV4KDApLCBtTmV4dE1lc3NhZ2VVcHRpbWUoTExPTkdfTUFYKSB7Ci0gICAgaW50IHdha2VGZHNbMl07Ci0gICAgaW50IHJlc3VsdCA9IHBpcGUod2FrZUZkcyk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gMCwgIkNvdWxkIG5vdCBjcmVhdGUgd2FrZSBwaXBlLiAgZXJybm89JWQiLCBlcnJubyk7Ci0KLSAgICBtV2FrZVJlYWRQaXBlRmQgPSB3YWtlRmRzWzBdOwotICAgIG1XYWtlV3JpdGVQaXBlRmQgPSB3YWtlRmRzWzFdOwotCi0gICAgcmVzdWx0ID0gZmNudGwobVdha2VSZWFkUGlwZUZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSAwLCAiQ291bGQgbm90IG1ha2Ugd2FrZSByZWFkIHBpcGUgbm9uLWJsb2NraW5nLiAgZXJybm89JWQiLAotICAgICAgICAgICAgZXJybm8pOwotCi0gICAgcmVzdWx0ID0gZmNudGwobVdha2VXcml0ZVBpcGVGZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gMCwgIkNvdWxkIG5vdCBtYWtlIHdha2Ugd3JpdGUgcGlwZSBub24tYmxvY2tpbmcuICBlcnJubz0lZCIsCi0gICAgICAgICAgICBlcnJubyk7Ci0KLSNpZmRlZiBMT09QRVJfVVNFU19FUE9MTAotICAgIC8vIEFsbG9jYXRlIHRoZSBlcG9sbCBpbnN0YW5jZSBhbmQgcmVnaXN0ZXIgdGhlIHdha2UgcGlwZS4KLSAgICBtRXBvbGxGZCA9IGVwb2xsX2NyZWF0ZShFUE9MTF9TSVpFX0hJTlQpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUVwb2xsRmQgPCAwLCAiQ291bGQgbm90IGNyZWF0ZSBlcG9sbCBpbnN0YW5jZS4gIGVycm5vPSVkIiwgZXJybm8pOwotCi0gICAgc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50SXRlbTsKLSAgICBtZW1zZXQoJiBldmVudEl0ZW0sIDAsIHNpemVvZihlcG9sbF9ldmVudCkpOyAvLyB6ZXJvIG91dCB1bnVzZWQgbWVtYmVycyBvZiBkYXRhIGZpZWxkIHVuaW9uCi0gICAgZXZlbnRJdGVtLmV2ZW50cyA9IEVQT0xMSU47Ci0gICAgZXZlbnRJdGVtLmRhdGEuZmQgPSBtV2FrZVJlYWRQaXBlRmQ7Ci0gICAgcmVzdWx0ID0gZXBvbGxfY3RsKG1FcG9sbEZkLCBFUE9MTF9DVExfQURELCBtV2FrZVJlYWRQaXBlRmQsICYgZXZlbnRJdGVtKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSAwLCAiQ291bGQgbm90IGFkZCB3YWtlIHJlYWQgcGlwZSB0byBlcG9sbCBpbnN0YW5jZS4gIGVycm5vPSVkIiwKLSAgICAgICAgICAgIGVycm5vKTsKLSNlbHNlCi0gICAgLy8gQWRkIHRoZSB3YWtlIHBpcGUgdG8gdGhlIGhlYWQgb2YgdGhlIHJlcXVlc3QgbGlzdCB3aXRoIGEgbnVsbCBjYWxsYmFjay4KLSAgICBzdHJ1Y3QgcG9sbGZkIHJlcXVlc3RlZEZkOwotICAgIHJlcXVlc3RlZEZkLmZkID0gbVdha2VSZWFkUGlwZUZkOwotICAgIHJlcXVlc3RlZEZkLmV2ZW50cyA9IFBPTExJTjsKLSAgICBtUmVxdWVzdGVkRmRzLnB1c2gocmVxdWVzdGVkRmQpOwotCi0gICAgUmVxdWVzdCByZXF1ZXN0OwotICAgIHJlcXVlc3QuZmQgPSBtV2FrZVJlYWRQaXBlRmQ7Ci0gICAgcmVxdWVzdC5jYWxsYmFjayA9IE5VTEw7Ci0gICAgcmVxdWVzdC5pZGVudCA9IDA7Ci0gICAgcmVxdWVzdC5kYXRhID0gTlVMTDsKLSAgICBtUmVxdWVzdHMucHVzaChyZXF1ZXN0KTsKLQotICAgIG1Qb2xsaW5nID0gZmFsc2U7Ci0gICAgbVdhaXRlcnMgPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBMT09QRVJfU1RBVElTVElDUwotICAgIG1QZW5kaW5nV2FrZVRpbWUgPSAtMTsKLSAgICBtUGVuZGluZ1dha2VDb3VudCA9IDA7Ci0gICAgbVNhbXBsZWRXYWtlQ3ljbGVzID0gMDsKLSAgICBtU2FtcGxlZFdha2VDb3VudFN1bSA9IDA7Ci0gICAgbVNhbXBsZWRXYWtlTGF0ZW5jeVN1bSA9IDA7Ci0KLSAgICBtU2FtcGxlZFBvbGxzID0gMDsKLSAgICBtU2FtcGxlZFplcm9Qb2xsQ291bnQgPSAwOwotICAgIG1TYW1wbGVkWmVyb1BvbGxMYXRlbmN5U3VtID0gMDsKLSAgICBtU2FtcGxlZFRpbWVvdXRQb2xsQ291bnQgPSAwOwotICAgIG1TYW1wbGVkVGltZW91dFBvbGxMYXRlbmN5U3VtID0gMDsKLSNlbmRpZgotfQotCi1Mb29wZXI6On5Mb29wZXIoKSB7Ci0gICAgY2xvc2UobVdha2VSZWFkUGlwZUZkKTsKLSAgICBjbG9zZShtV2FrZVdyaXRlUGlwZUZkKTsKLSNpZmRlZiBMT09QRVJfVVNFU19FUE9MTAotICAgIGNsb3NlKG1FcG9sbEZkKTsKLSNlbmRpZgotfQotCi12b2lkIExvb3Blcjo6aW5pdFRMU0tleSgpIHsKLSAgICBpbnQgcmVzdWx0ID0gcHRocmVhZF9rZXlfY3JlYXRlKCYgZ1RMU0tleSwgdGhyZWFkRGVzdHJ1Y3Rvcik7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gMCwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBUTFMga2V5LiIpOwotfQotCi12b2lkIExvb3Blcjo6dGhyZWFkRGVzdHJ1Y3Rvcih2b2lkICpzdCkgewotICAgIExvb3BlciogY29uc3Qgc2VsZiA9IHN0YXRpY19jYXN0PExvb3Blcio+KHN0KTsKLSAgICBpZiAoc2VsZiAhPSBOVUxMKSB7Ci0gICAgICAgIHNlbGYtPmRlY1N0cm9uZygodm9pZCopdGhyZWFkRGVzdHJ1Y3Rvcik7Ci0gICAgfQotfQotCi12b2lkIExvb3Blcjo6c2V0Rm9yVGhyZWFkKGNvbnN0IHNwPExvb3Blcj4mIGxvb3BlcikgewotICAgIHNwPExvb3Blcj4gb2xkID0gZ2V0Rm9yVGhyZWFkKCk7IC8vIGFsc28gaGFzIHNpZGUtZWZmZWN0IG9mIGluaXRpYWxpemluZyBUTFMKLQotICAgIGlmIChsb29wZXIgIT0gTlVMTCkgewotICAgICAgICBsb29wZXItPmluY1N0cm9uZygodm9pZCopdGhyZWFkRGVzdHJ1Y3Rvcik7Ci0gICAgfQotCi0gICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnVExTS2V5LCBsb29wZXIuZ2V0KCkpOwotCi0gICAgaWYgKG9sZCAhPSBOVUxMKSB7Ci0gICAgICAgIG9sZC0+ZGVjU3Ryb25nKCh2b2lkKil0aHJlYWREZXN0cnVjdG9yKTsKLSAgICB9Ci19Ci0KLXNwPExvb3Blcj4gTG9vcGVyOjpnZXRGb3JUaHJlYWQoKSB7Ci0gICAgaW50IHJlc3VsdCA9IHB0aHJlYWRfb25jZSgmIGdUTFNPbmNlLCBpbml0VExTS2V5KTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSAwLCAicHRocmVhZF9vbmNlIGZhaWxlZCIpOwotCi0gICAgcmV0dXJuIChMb29wZXIqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoZ1RMU0tleSk7Ci19Ci0KLXNwPExvb3Blcj4gTG9vcGVyOjpwcmVwYXJlKGludCBvcHRzKSB7Ci0gICAgYm9vbCBhbGxvd05vbkNhbGxiYWNrcyA9IG9wdHMgJiBBTE9PUEVSX1BSRVBBUkVfQUxMT1dfTk9OX0NBTExCQUNLUzsKLSAgICBzcDxMb29wZXI+IGxvb3BlciA9IExvb3Blcjo6Z2V0Rm9yVGhyZWFkKCk7Ci0gICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIGxvb3BlciA9IG5ldyBMb29wZXIoYWxsb3dOb25DYWxsYmFja3MpOwotICAgICAgICBMb29wZXI6OnNldEZvclRocmVhZChsb29wZXIpOwotICAgIH0KLSAgICBpZiAobG9vcGVyLT5nZXRBbGxvd05vbkNhbGxiYWNrcygpICE9IGFsbG93Tm9uQ2FsbGJhY2tzKSB7Ci0gICAgICAgIEFMT0dXKCJMb29wZXIgYWxyZWFkeSBwcmVwYXJlZCBmb3IgdGhpcyB0aHJlYWQgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgdGhlICIKLSAgICAgICAgICAgICAgICAiQUxPT1BFUl9QUkVQQVJFX0FMTE9XX05PTl9DQUxMQkFDS1Mgb3B0aW9uLiIpOwotICAgIH0KLSAgICByZXR1cm4gbG9vcGVyOwotfQotCi1ib29sIExvb3Blcjo6Z2V0QWxsb3dOb25DYWxsYmFja3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1BbGxvd05vbkNhbGxiYWNrczsKLX0KLQotaW50IExvb3Blcjo6cG9sbE9uY2UoaW50IHRpbWVvdXRNaWxsaXMsIGludCogb3V0RmQsIGludCogb3V0RXZlbnRzLCB2b2lkKiogb3V0RGF0YSkgewotICAgIGludCByZXN1bHQgPSAwOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgd2hpbGUgKG1SZXNwb25zZUluZGV4IDwgbVJlc3BvbnNlcy5zaXplKCkpIHsKLSAgICAgICAgICAgIGNvbnN0IFJlc3BvbnNlJiByZXNwb25zZSA9IG1SZXNwb25zZXMuaXRlbUF0KG1SZXNwb25zZUluZGV4KyspOwotICAgICAgICAgICAgQUxvb3Blcl9jYWxsYmFja0Z1bmMgY2FsbGJhY2sgPSByZXNwb25zZS5yZXF1ZXN0LmNhbGxiYWNrOwotICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykgewotICAgICAgICAgICAgICAgIGludCBpZGVudCA9IHJlc3BvbnNlLnJlcXVlc3QuaWRlbnQ7Ci0gICAgICAgICAgICAgICAgaW50IGZkID0gcmVzcG9uc2UucmVxdWVzdC5mZDsKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnRzID0gcmVzcG9uc2UuZXZlbnRzOwotICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEgPSByZXNwb25zZS5yZXF1ZXN0LmRhdGE7Ci0jaWYgREVCVUdfUE9MTF9BTkRfV0FLRQotICAgICAgICAgICAgICAgIEFMT0dEKCIlcCB+IHBvbGxPbmNlIC0gcmV0dXJuaW5nIHNpZ25hbGxlZCBpZGVudGlmaWVyICVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZmQ9JWQsIGV2ZW50cz0weCV4LCBkYXRhPSVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGlkZW50LCBmZCwgZXZlbnRzLCBkYXRhKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGlmIChvdXRGZCAhPSBOVUxMKSAqb3V0RmQgPSBmZDsKLSAgICAgICAgICAgICAgICBpZiAob3V0RXZlbnRzICE9IE5VTEwpICpvdXRFdmVudHMgPSBldmVudHM7Ci0gICAgICAgICAgICAgICAgaWYgKG91dERhdGEgIT0gTlVMTCkgKm91dERhdGEgPSBkYXRhOwotICAgICAgICAgICAgICAgIHJldHVybiBpZGVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXN1bHQgIT0gMCkgewotI2lmIERFQlVHX1BPTExfQU5EX1dBS0UKLSAgICAgICAgICAgIEFMT0dEKCIlcCB+IHBvbGxPbmNlIC0gcmV0dXJuaW5nIHJlc3VsdCAlZCIsIHRoaXMsIHJlc3VsdCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChvdXRGZCAhPSBOVUxMKSAqb3V0RmQgPSAwOwotICAgICAgICAgICAgaWYgKG91dEV2ZW50cyAhPSBOVUxMKSAqb3V0RXZlbnRzID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChvdXREYXRhICE9IE5VTEwpICpvdXREYXRhID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSBwb2xsSW5uZXIodGltZW91dE1pbGxpcyk7Ci0gICAgfQotfQotCi1pbnQgTG9vcGVyOjpwb2xsSW5uZXIoaW50IHRpbWVvdXRNaWxsaXMpIHsKLSNpZiBERUJVR19QT0xMX0FORF9XQUtFCi0gICAgQUxPR0QoIiVwIH4gcG9sbE9uY2UgLSB3YWl0aW5nOiB0aW1lb3V0TWlsbGlzPSVkIiwgdGhpcywgdGltZW91dE1pbGxpcyk7Ci0jZW5kaWYKLQotICAgIC8vIEFkanVzdCB0aGUgdGltZW91dCBiYXNlZCBvbiB3aGVuIHRoZSBuZXh0IG1lc3NhZ2UgaXMgZHVlLgotICAgIGlmICh0aW1lb3V0TWlsbGlzICE9IDAgJiYgbU5leHRNZXNzYWdlVXB0aW1lICE9IExMT05HX01BWCkgewotICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICAgICAgaW50IG1lc3NhZ2VUaW1lb3V0TWlsbGlzID0gdG9NaWxsaXNlY29uZFRpbWVvdXREZWxheShub3csIG1OZXh0TWVzc2FnZVVwdGltZSk7Ci0gICAgICAgIGlmIChtZXNzYWdlVGltZW91dE1pbGxpcyA+PSAwCi0gICAgICAgICAgICAgICAgJiYgKHRpbWVvdXRNaWxsaXMgPCAwIHx8IG1lc3NhZ2VUaW1lb3V0TWlsbGlzIDwgdGltZW91dE1pbGxpcykpIHsKLSAgICAgICAgICAgIHRpbWVvdXRNaWxsaXMgPSBtZXNzYWdlVGltZW91dE1pbGxpczsKLSAgICAgICAgfQotI2lmIERFQlVHX1BPTExfQU5EX1dBS0UKLSAgICAgICAgQUxPR0QoIiVwIH4gcG9sbE9uY2UgLSBuZXh0IG1lc3NhZ2UgaW4gJWxsZG5zLCBhZGp1c3RlZCB0aW1lb3V0OiB0aW1lb3V0TWlsbGlzPSVkIiwKLSAgICAgICAgICAgICAgICB0aGlzLCBtTmV4dE1lc3NhZ2VVcHRpbWUgLSBub3csIHRpbWVvdXRNaWxsaXMpOwotI2VuZGlmCi0gICAgfQotCi0gICAgLy8gUG9sbC4KLSAgICBpbnQgcmVzdWx0ID0gQUxPT1BFUl9QT0xMX1dBS0U7Ci0gICAgbVJlc3BvbnNlcy5jbGVhcigpOwotICAgIG1SZXNwb25zZUluZGV4ID0gMDsKLQotI2lmZGVmIExPT1BFUl9TVEFUSVNUSUNTCi0gICAgbnNlY3NfdCBwb2xsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotI2VuZGlmCi0KLSNpZmRlZiBMT09QRVJfVVNFU19FUE9MTAotICAgIHN0cnVjdCBlcG9sbF9ldmVudCBldmVudEl0ZW1zW0VQT0xMX01BWF9FVkVOVFNdOwotICAgIGludCBldmVudENvdW50ID0gZXBvbGxfd2FpdChtRXBvbGxGZCwgZXZlbnRJdGVtcywgRVBPTExfTUFYX0VWRU5UUywgdGltZW91dE1pbGxpcyk7Ci0jZWxzZQotICAgIC8vIFdhaXQgZm9yIHdha2VBbmRMb2NrKCkgd2FpdGVycyB0byBydW4gdGhlbiBzZXQgbVBvbGxpbmcgdG8gdHJ1ZS4KLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgd2hpbGUgKG1XYWl0ZXJzICE9IDApIHsKLSAgICAgICAgbVJlc3VtZS53YWl0KG1Mb2NrKTsKLSAgICB9Ci0gICAgbVBvbGxpbmcgPSB0cnVlOwotICAgIG1Mb2NrLnVubG9jaygpOwotCi0gICAgc2l6ZV90IHJlcXVlc3RlZENvdW50ID0gbVJlcXVlc3RlZEZkcy5zaXplKCk7Ci0gICAgaW50IGV2ZW50Q291bnQgPSBwb2xsKG1SZXF1ZXN0ZWRGZHMuZWRpdEFycmF5KCksIHJlcXVlc3RlZENvdW50LCB0aW1lb3V0TWlsbGlzKTsKLSNlbmRpZgotCi0gICAgLy8gQWNxdWlyZSBsb2NrLgotICAgIG1Mb2NrLmxvY2soKTsKLQotICAgIC8vIENoZWNrIGZvciBwb2xsIGVycm9yLgotICAgIGlmIChldmVudENvdW50IDwgMCkgewotICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKLSAgICAgICAgICAgIGdvdG8gRG9uZTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVygiUG9sbCBmYWlsZWQgd2l0aCBhbiB1bmV4cGVjdGVkIGVycm9yLCBlcnJubz0lZCIsIGVycm5vKTsKLSAgICAgICAgcmVzdWx0ID0gQUxPT1BFUl9QT0xMX0VSUk9SOwotICAgICAgICBnb3RvIERvbmU7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgZm9yIHBvbGwgdGltZW91dC4KLSAgICBpZiAoZXZlbnRDb3VudCA9PSAwKSB7Ci0jaWYgREVCVUdfUE9MTF9BTkRfV0FLRQotICAgICAgICBBTE9HRCgiJXAgfiBwb2xsT25jZSAtIHRpbWVvdXQiLCB0aGlzKTsKLSNlbmRpZgotICAgICAgICByZXN1bHQgPSBBTE9PUEVSX1BPTExfVElNRU9VVDsKLSAgICAgICAgZ290byBEb25lOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBhbGwgZXZlbnRzLgotI2lmIERFQlVHX1BPTExfQU5EX1dBS0UKLSAgICBBTE9HRCgiJXAgfiBwb2xsT25jZSAtIGhhbmRsaW5nIGV2ZW50cyBmcm9tICVkIGZkcyIsIHRoaXMsIGV2ZW50Q291bnQpOwotI2VuZGlmCi0KLSNpZmRlZiBMT09QRVJfVVNFU19FUE9MTAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRDb3VudDsgaSsrKSB7Ci0gICAgICAgIGludCBmZCA9IGV2ZW50SXRlbXNbaV0uZGF0YS5mZDsKLSAgICAgICAgdWludDMyX3QgZXBvbGxFdmVudHMgPSBldmVudEl0ZW1zW2ldLmV2ZW50czsKLSAgICAgICAgaWYgKGZkID09IG1XYWtlUmVhZFBpcGVGZCkgewotICAgICAgICAgICAgaWYgKGVwb2xsRXZlbnRzICYgRVBPTExJTikgewotICAgICAgICAgICAgICAgIGF3b2tlbigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiSWdub3JpbmcgdW5leHBlY3RlZCBlcG9sbCBldmVudHMgMHgleCBvbiB3YWtlIHJlYWQgcGlwZS4iLCBlcG9sbEV2ZW50cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzc2l6ZV90IHJlcXVlc3RJbmRleCA9IG1SZXF1ZXN0cy5pbmRleE9mS2V5KGZkKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0SW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIGludCBldmVudHMgPSAwOwotICAgICAgICAgICAgICAgIGlmIChlcG9sbEV2ZW50cyAmIEVQT0xMSU4pIGV2ZW50cyB8PSBBTE9PUEVSX0VWRU5UX0lOUFVUOwotICAgICAgICAgICAgICAgIGlmIChlcG9sbEV2ZW50cyAmIEVQT0xMT1VUKSBldmVudHMgfD0gQUxPT1BFUl9FVkVOVF9PVVRQVVQ7Ci0gICAgICAgICAgICAgICAgaWYgKGVwb2xsRXZlbnRzICYgRVBPTExFUlIpIGV2ZW50cyB8PSBBTE9PUEVSX0VWRU5UX0VSUk9SOwotICAgICAgICAgICAgICAgIGlmIChlcG9sbEV2ZW50cyAmIEVQT0xMSFVQKSBldmVudHMgfD0gQUxPT1BFUl9FVkVOVF9IQU5HVVA7Ci0gICAgICAgICAgICAgICAgcHVzaFJlc3BvbnNlKGV2ZW50cywgbVJlcXVlc3RzLnZhbHVlQXQocmVxdWVzdEluZGV4KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyB1bmV4cGVjdGVkIGVwb2xsIGV2ZW50cyAweCV4IG9uIGZkICVkIHRoYXQgaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGxvbmdlciByZWdpc3RlcmVkLiIsIGVwb2xsRXZlbnRzLCBmZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci1Eb25lOiA7Ci0jZWxzZQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdGVkQ291bnQ7IGkrKykgewotICAgICAgICBjb25zdCBzdHJ1Y3QgcG9sbGZkJiByZXF1ZXN0ZWRGZCA9IG1SZXF1ZXN0ZWRGZHMuaXRlbUF0KGkpOwotCi0gICAgICAgIHNob3J0IHBvbGxFdmVudHMgPSByZXF1ZXN0ZWRGZC5yZXZlbnRzOwotICAgICAgICBpZiAocG9sbEV2ZW50cykgewotICAgICAgICAgICAgaWYgKHJlcXVlc3RlZEZkLmZkID09IG1XYWtlUmVhZFBpcGVGZCkgewotICAgICAgICAgICAgICAgIGlmIChwb2xsRXZlbnRzICYgUE9MTElOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF3b2tlbigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyB1bmV4cGVjdGVkIHBvbGwgZXZlbnRzIDB4JXggb24gd2FrZSByZWFkIHBpcGUuIiwgcG9sbEV2ZW50cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnRzID0gMDsKLSAgICAgICAgICAgICAgICBpZiAocG9sbEV2ZW50cyAmIFBPTExJTikgZXZlbnRzIHw9IEFMT09QRVJfRVZFTlRfSU5QVVQ7Ci0gICAgICAgICAgICAgICAgaWYgKHBvbGxFdmVudHMgJiBQT0xMT1VUKSBldmVudHMgfD0gQUxPT1BFUl9FVkVOVF9PVVRQVVQ7Ci0gICAgICAgICAgICAgICAgaWYgKHBvbGxFdmVudHMgJiBQT0xMRVJSKSBldmVudHMgfD0gQUxPT1BFUl9FVkVOVF9FUlJPUjsKLSAgICAgICAgICAgICAgICBpZiAocG9sbEV2ZW50cyAmIFBPTExIVVApIGV2ZW50cyB8PSBBTE9PUEVSX0VWRU5UX0hBTkdVUDsKLSAgICAgICAgICAgICAgICBpZiAocG9sbEV2ZW50cyAmIFBPTExOVkFMKSBldmVudHMgfD0gQUxPT1BFUl9FVkVOVF9JTlZBTElEOwotICAgICAgICAgICAgICAgIHB1c2hSZXNwb25zZShldmVudHMsIG1SZXF1ZXN0cy5pdGVtQXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKC0tZXZlbnRDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci1Eb25lOgotICAgIC8vIFNldCBtUG9sbGluZyB0byBmYWxzZSBhbmQgd2FrZSB1cCB0aGUgd2FrZUFuZExvY2soKSB3YWl0ZXJzLgotICAgIG1Qb2xsaW5nID0gZmFsc2U7Ci0gICAgaWYgKG1XYWl0ZXJzICE9IDApIHsKLSAgICAgICAgbUF3YWtlLmJyb2FkY2FzdCgpOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgTE9PUEVSX1NUQVRJU1RJQ1MKLSAgICBuc2Vjc190IHBvbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG1TYW1wbGVkUG9sbHMgKz0gMTsKLSAgICBpZiAodGltZW91dE1pbGxpcyA9PSAwKSB7Ci0gICAgICAgIG1TYW1wbGVkWmVyb1BvbGxDb3VudCArPSAxOwotICAgICAgICBtU2FtcGxlZFplcm9Qb2xsTGF0ZW5jeVN1bSArPSBwb2xsRW5kVGltZSAtIHBvbGxTdGFydFRpbWU7Ci0gICAgfSBlbHNlIGlmICh0aW1lb3V0TWlsbGlzID4gMCAmJiByZXN1bHQgPT0gQUxPT1BFUl9QT0xMX1RJTUVPVVQpIHsKLSAgICAgICAgbVNhbXBsZWRUaW1lb3V0UG9sbENvdW50ICs9IDE7Ci0gICAgICAgIG1TYW1wbGVkVGltZW91dFBvbGxMYXRlbmN5U3VtICs9IHBvbGxFbmRUaW1lIC0gcG9sbFN0YXJ0VGltZQotICAgICAgICAgICAgICAgIC0gbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHRpbWVvdXRNaWxsaXMpOwotICAgIH0KLSAgICBpZiAobVNhbXBsZWRQb2xscyA9PSBTQU1QTEVEX1BPTExTX1RPX0FHR1JFR0FURSkgewotICAgICAgICBBTE9HRCgiJXAgfiBwb2xsIGxhdGVuY3kgc3RhdGlzdGljczogJTAuM2ZtcyB6ZXJvIHRpbWVvdXQsICUwLjNmbXMgbm9uLXplcm8gdGltZW91dCIsIHRoaXMsCi0gICAgICAgICAgICAgICAgMC4wMDAwMDFmICogZmxvYXQobVNhbXBsZWRaZXJvUG9sbExhdGVuY3lTdW0pIC8gbVNhbXBsZWRaZXJvUG9sbENvdW50LAotICAgICAgICAgICAgICAgIDAuMDAwMDAxZiAqIGZsb2F0KG1TYW1wbGVkVGltZW91dFBvbGxMYXRlbmN5U3VtKSAvIG1TYW1wbGVkVGltZW91dFBvbGxDb3VudCk7Ci0gICAgICAgIG1TYW1wbGVkUG9sbHMgPSAwOwotICAgICAgICBtU2FtcGxlZFplcm9Qb2xsQ291bnQgPSAwOwotICAgICAgICBtU2FtcGxlZFplcm9Qb2xsTGF0ZW5jeVN1bSA9IDA7Ci0gICAgICAgIG1TYW1wbGVkVGltZW91dFBvbGxDb3VudCA9IDA7Ci0gICAgICAgIG1TYW1wbGVkVGltZW91dFBvbGxMYXRlbmN5U3VtID0gMDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIEludm9rZSBwZW5kaW5nIG1lc3NhZ2UgY2FsbGJhY2tzLgotICAgIG1OZXh0TWVzc2FnZVVwdGltZSA9IExMT05HX01BWDsKLSAgICB3aGlsZSAobU1lc3NhZ2VFbnZlbG9wZXMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgICAgIGNvbnN0IE1lc3NhZ2VFbnZlbG9wZSYgbWVzc2FnZUVudmVsb3BlID0gbU1lc3NhZ2VFbnZlbG9wZXMuaXRlbUF0KDApOwotICAgICAgICBpZiAobWVzc2FnZUVudmVsb3BlLnVwdGltZSA8PSBub3cpIHsKLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZW52ZWxvcGUgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgICAgIC8vIFdlIGtlZXAgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSBoYW5kbGVyIHVudGlsIHRoZSBjYWxsIHRvIGhhbmRsZU1lc3NhZ2UKLSAgICAgICAgICAgIC8vIGZpbmlzaGVzLiAgVGhlbiB3ZSBkcm9wIGl0IHNvIHRoYXQgdGhlIGhhbmRsZXIgY2FuIGJlIGRlbGV0ZWQgKmJlZm9yZSoKLSAgICAgICAgICAgIC8vIHdlIHJlYWNxdWlyZSBvdXIgbG9jay4KLSAgICAgICAgICAgIHsgLy8gb2J0YWluIGhhbmRsZXIKLSAgICAgICAgICAgICAgICBzcDxNZXNzYWdlSGFuZGxlcj4gaGFuZGxlciA9IG1lc3NhZ2VFbnZlbG9wZS5oYW5kbGVyOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VFbnZlbG9wZS5tZXNzYWdlOwotICAgICAgICAgICAgICAgIG1NZXNzYWdlRW52ZWxvcGVzLnJlbW92ZUF0KDApOwotICAgICAgICAgICAgICAgIG1TZW5kaW5nTWVzc2FnZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0KLSNpZiBERUJVR19QT0xMX0FORF9XQUtFIHx8IERFQlVHX0NBTExCQUNLUwotICAgICAgICAgICAgICAgIEFMT0dEKCIlcCB+IHBvbGxPbmNlIC0gc2VuZGluZyBtZXNzYWdlOiBoYW5kbGVyPSVwLCB3aGF0PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGhhbmRsZXIuZ2V0KCksIG1lc3NhZ2Uud2hhdCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBoYW5kbGVyLT5oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgfSAvLyByZWxlYXNlIGhhbmRsZXIKLQotICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgbVNlbmRpbmdNZXNzYWdlID0gZmFsc2U7Ci0gICAgICAgICAgICByZXN1bHQgPSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGUgbGFzdCBtZXNzYWdlIGxlZnQgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGRldGVybWluZXMgdGhlIG5leHQgd2FrZXVwIHRpbWUuCi0gICAgICAgICAgICBtTmV4dE1lc3NhZ2VVcHRpbWUgPSBtZXNzYWdlRW52ZWxvcGUudXB0aW1lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZWxlYXNlIGxvY2suCi0gICAgbUxvY2sudW5sb2NrKCk7Ci0KLSAgICAvLyBJbnZva2UgYWxsIHJlc3BvbnNlIGNhbGxiYWNrcy4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZXNwb25zZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3QgUmVzcG9uc2UmIHJlc3BvbnNlID0gbVJlc3BvbnNlcy5pdGVtQXQoaSk7Ci0gICAgICAgIEFMb29wZXJfY2FsbGJhY2tGdW5jIGNhbGxiYWNrID0gcmVzcG9uc2UucmVxdWVzdC5jYWxsYmFjazsKLSAgICAgICAgaWYgKGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpbnQgZmQgPSByZXNwb25zZS5yZXF1ZXN0LmZkOwotICAgICAgICAgICAgaW50IGV2ZW50cyA9IHJlc3BvbnNlLmV2ZW50czsKLSAgICAgICAgICAgIHZvaWQqIGRhdGEgPSByZXNwb25zZS5yZXF1ZXN0LmRhdGE7Ci0jaWYgREVCVUdfUE9MTF9BTkRfV0FLRSB8fCBERUJVR19DQUxMQkFDS1MKLSAgICAgICAgICAgIEFMT0dEKCIlcCB+IHBvbGxPbmNlIC0gaW52b2tpbmcgZmQgZXZlbnQgY2FsbGJhY2sgJXA6IGZkPSVkLCBldmVudHM9MHgleCwgZGF0YT0lcCIsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIGNhbGxiYWNrLCBmZCwgZXZlbnRzLCBkYXRhKTsKLSNlbmRpZgotICAgICAgICAgICAgaW50IGNhbGxiYWNrUmVzdWx0ID0gY2FsbGJhY2soZmQsIGV2ZW50cywgZGF0YSk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gMCkgewotICAgICAgICAgICAgICAgIHJlbW92ZUZkKGZkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IEFMT09QRVJfUE9MTF9DQUxMQkFDSzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgTG9vcGVyOjpwb2xsQWxsKGludCB0aW1lb3V0TWlsbGlzLCBpbnQqIG91dEZkLCBpbnQqIG91dEV2ZW50cywgdm9pZCoqIG91dERhdGEpIHsKLSAgICBpZiAodGltZW91dE1pbGxpcyA8PSAwKSB7Ci0gICAgICAgIGludCByZXN1bHQ7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHBvbGxPbmNlKHRpbWVvdXRNaWxsaXMsIG91dEZkLCBvdXRFdmVudHMsIG91dERhdGEpOwotICAgICAgICB9IHdoaWxlIChyZXN1bHQgPT0gQUxPT1BFUl9QT0xMX0NBTExCQUNLKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9IGVsc2UgewotICAgICAgICBuc2Vjc190IGVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykKLSAgICAgICAgICAgICAgICArIG1pbGxpc2Vjb25kc190b19uYW5vc2Vjb25kcyh0aW1lb3V0TWlsbGlzKTsKLQotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gcG9sbE9uY2UodGltZW91dE1pbGxpcywgb3V0RmQsIG91dEV2ZW50cywgb3V0RGF0YSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFMT09QRVJfUE9MTF9DQUxMQkFDSykgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgICAgICAgICAgdGltZW91dE1pbGxpcyA9IHRvTWlsbGlzZWNvbmRUaW1lb3V0RGVsYXkobm93LCBlbmRUaW1lKTsKLSAgICAgICAgICAgIGlmICh0aW1lb3V0TWlsbGlzID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQUxPT1BFUl9QT0xMX1RJTUVPVVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgTG9vcGVyOjp3YWtlKCkgewotI2lmIERFQlVHX1BPTExfQU5EX1dBS0UKLSAgICBBTE9HRCgiJXAgfiB3YWtlIiwgdGhpcyk7Ci0jZW5kaWYKLQotI2lmZGVmIExPT1BFUl9TVEFUSVNUSUNTCi0gICAgLy8gRklYTUU6IFBvc3NpYmxlIHJhY2Ugd2l0aCBhd29rZW4oKSBidXQgdGhpcyBjb2RlIGlzIGZvciB0ZXN0aW5nIG9ubHkgYW5kIGlzIHJhcmVseSBlbmFibGVkLgotICAgIGlmIChtUGVuZGluZ1dha2VDb3VudCsrID09IDApIHsKLSAgICAgICAgbVBlbmRpbmdXYWtlVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHNzaXplX3QgbldyaXRlOwotICAgIGRvIHsKLSAgICAgICAgbldyaXRlID0gd3JpdGUobVdha2VXcml0ZVBpcGVGZCwgIlciLCAxKTsKLSAgICB9IHdoaWxlIChuV3JpdGUgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKG5Xcml0ZSAhPSAxKSB7Ci0gICAgICAgIGlmIChlcnJubyAhPSBFQUdBSU4pIHsKLSAgICAgICAgICAgIEFMT0dXKCJDb3VsZCBub3Qgd3JpdGUgd2FrZSBzaWduYWwsIGVycm5vPSVkIiwgZXJybm8pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIExvb3Blcjo6YXdva2VuKCkgewotI2lmIERFQlVHX1BPTExfQU5EX1dBS0UKLSAgICBBTE9HRCgiJXAgfiBhd29rZW4iLCB0aGlzKTsKLSNlbmRpZgotCi0jaWZkZWYgTE9PUEVSX1NUQVRJU1RJQ1MKLSAgICBpZiAobVBlbmRpbmdXYWtlQ291bnQgPT0gMCkgewotICAgICAgICBBTE9HRCgiJXAgfiBhd29rZW46IHNwdXJpb3VzISIsIHRoaXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TYW1wbGVkV2FrZUN5Y2xlcyArPSAxOwotICAgICAgICBtU2FtcGxlZFdha2VDb3VudFN1bSArPSBtUGVuZGluZ1dha2VDb3VudDsKLSAgICAgICAgbVNhbXBsZWRXYWtlTGF0ZW5jeVN1bSArPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgLSBtUGVuZGluZ1dha2VUaW1lOwotICAgICAgICBtUGVuZGluZ1dha2VDb3VudCA9IDA7Ci0gICAgICAgIG1QZW5kaW5nV2FrZVRpbWUgPSAtMTsKLSAgICAgICAgaWYgKG1TYW1wbGVkV2FrZUN5Y2xlcyA9PSBTQU1QTEVEX1dBS0VfQ1lDTEVTX1RPX0FHR1JFR0FURSkgewotICAgICAgICAgICAgQUxPR0QoIiVwIH4gd2FrZSBzdGF0aXN0aWNzOiAlMC4zZm1zIHdha2UgbGF0ZW5jeSwgJTAuM2Ygd2FrZXMgcGVyIGN5Y2xlIiwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDFmICogZmxvYXQobVNhbXBsZWRXYWtlTGF0ZW5jeVN1bSkgLyBtU2FtcGxlZFdha2VDeWNsZXMsCi0gICAgICAgICAgICAgICAgICAgIGZsb2F0KG1TYW1wbGVkV2FrZUNvdW50U3VtKSAvIG1TYW1wbGVkV2FrZUN5Y2xlcyk7Ci0gICAgICAgICAgICBtU2FtcGxlZFdha2VDeWNsZXMgPSAwOwotICAgICAgICAgICAgbVNhbXBsZWRXYWtlQ291bnRTdW0gPSAwOwotICAgICAgICAgICAgbVNhbXBsZWRXYWtlTGF0ZW5jeVN1bSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIGNoYXIgYnVmZmVyWzE2XTsKLSAgICBzc2l6ZV90IG5SZWFkOwotICAgIGRvIHsKLSAgICAgICAgblJlYWQgPSByZWFkKG1XYWtlUmVhZFBpcGVGZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgfSB3aGlsZSAoKG5SZWFkID09IC0xICYmIGVycm5vID09IEVJTlRSKSB8fCBuUmVhZCA9PSBzaXplb2YoYnVmZmVyKSk7Ci19Ci0KLXZvaWQgTG9vcGVyOjpwdXNoUmVzcG9uc2UoaW50IGV2ZW50cywgY29uc3QgUmVxdWVzdCYgcmVxdWVzdCkgewotICAgIFJlc3BvbnNlIHJlc3BvbnNlOwotICAgIHJlc3BvbnNlLmV2ZW50cyA9IGV2ZW50czsKLSAgICByZXNwb25zZS5yZXF1ZXN0ID0gcmVxdWVzdDsKLSAgICBtUmVzcG9uc2VzLnB1c2gocmVzcG9uc2UpOwotfQotCi1pbnQgTG9vcGVyOjphZGRGZChpbnQgZmQsIGludCBpZGVudCwgaW50IGV2ZW50cywgQUxvb3Blcl9jYWxsYmFja0Z1bmMgY2FsbGJhY2ssIHZvaWQqIGRhdGEpIHsKLSNpZiBERUJVR19DQUxMQkFDS1MKLSAgICBBTE9HRCgiJXAgfiBhZGRGZCAtIGZkPSVkLCBpZGVudD0lZCwgZXZlbnRzPTB4JXgsIGNhbGxiYWNrPSVwLCBkYXRhPSVwIiwgdGhpcywgZmQsIGlkZW50LAotICAgICAgICAgICAgZXZlbnRzLCBjYWxsYmFjaywgZGF0YSk7Ci0jZW5kaWYKLQotICAgIGlmICghIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmICghIG1BbGxvd05vbkNhbGxiYWNrcykgewotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgYXR0ZW1wdCB0byBzZXQgTlVMTCBjYWxsYmFjayBidXQgbm90IGFsbG93ZWQgZm9yIHRoaXMgbG9vcGVyLiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlkZW50IDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgYXR0ZW1wdCB0byBzZXQgTlVMTCBjYWxsYmFjayB3aXRoIGlkZW50IDw9IDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBMT09QRVJfVVNFU19FUE9MTAotICAgIGludCBlcG9sbEV2ZW50cyA9IDA7Ci0gICAgaWYgKGV2ZW50cyAmIEFMT09QRVJfRVZFTlRfSU5QVVQpIGVwb2xsRXZlbnRzIHw9IEVQT0xMSU47Ci0gICAgaWYgKGV2ZW50cyAmIEFMT09QRVJfRVZFTlRfT1VUUFVUKSBlcG9sbEV2ZW50cyB8PSBFUE9MTE9VVDsKLQotICAgIHsgLy8gYWNxdWlyZSBsb2NrCi0gICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0KLSAgICAgICAgUmVxdWVzdCByZXF1ZXN0OwotICAgICAgICByZXF1ZXN0LmZkID0gZmQ7Ci0gICAgICAgIHJlcXVlc3QuaWRlbnQgPSBpZGVudDsKLSAgICAgICAgcmVxdWVzdC5jYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICByZXF1ZXN0LmRhdGEgPSBkYXRhOwotCi0gICAgICAgIHN0cnVjdCBlcG9sbF9ldmVudCBldmVudEl0ZW07Ci0gICAgICAgIG1lbXNldCgmIGV2ZW50SXRlbSwgMCwgc2l6ZW9mKGVwb2xsX2V2ZW50KSk7IC8vIHplcm8gb3V0IHVudXNlZCBtZW1iZXJzIG9mIGRhdGEgZmllbGQgdW5pb24KLSAgICAgICAgZXZlbnRJdGVtLmV2ZW50cyA9IGVwb2xsRXZlbnRzOwotICAgICAgICBldmVudEl0ZW0uZGF0YS5mZCA9IGZkOwotCi0gICAgICAgIHNzaXplX3QgcmVxdWVzdEluZGV4ID0gbVJlcXVlc3RzLmluZGV4T2ZLZXkoZmQpOwotICAgICAgICBpZiAocmVxdWVzdEluZGV4IDwgMCkgewotICAgICAgICAgICAgaW50IGVwb2xsUmVzdWx0ID0gZXBvbGxfY3RsKG1FcG9sbEZkLCBFUE9MTF9DVExfQURELCBmZCwgJiBldmVudEl0ZW0pOwotICAgICAgICAgICAgaWYgKGVwb2xsUmVzdWx0IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciBhZGRpbmcgZXBvbGwgZXZlbnRzIGZvciBmZCAlZCwgZXJybm89JWQiLCBmZCwgZXJybm8pOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXF1ZXN0cy5hZGQoZmQsIHJlcXVlc3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGVwb2xsUmVzdWx0ID0gZXBvbGxfY3RsKG1FcG9sbEZkLCBFUE9MTF9DVExfTU9ELCBmZCwgJiBldmVudEl0ZW0pOwotICAgICAgICAgICAgaWYgKGVwb2xsUmVzdWx0IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciBtb2RpZnlpbmcgZXBvbGwgZXZlbnRzIGZvciBmZCAlZCwgZXJybm89JWQiLCBmZCwgZXJybm8pOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXF1ZXN0cy5yZXBsYWNlVmFsdWVBdChyZXF1ZXN0SW5kZXgsIHJlcXVlc3QpOwotICAgICAgICB9Ci0gICAgfSAvLyByZWxlYXNlIGxvY2sKLSNlbHNlCi0gICAgaW50IHBvbGxFdmVudHMgPSAwOwotICAgIGlmIChldmVudHMgJiBBTE9PUEVSX0VWRU5UX0lOUFVUKSBwb2xsRXZlbnRzIHw9IFBPTExJTjsKLSAgICBpZiAoZXZlbnRzICYgQUxPT1BFUl9FVkVOVF9PVVRQVVQpIHBvbGxFdmVudHMgfD0gUE9MTE9VVDsKLQotICAgIHdha2VBbmRMb2NrKCk7IC8vIGFjcXVpcmUgbG9jawotCi0gICAgc3RydWN0IHBvbGxmZCByZXF1ZXN0ZWRGZDsKLSAgICByZXF1ZXN0ZWRGZC5mZCA9IGZkOwotICAgIHJlcXVlc3RlZEZkLmV2ZW50cyA9IHBvbGxFdmVudHM7Ci0KLSAgICBSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgcmVxdWVzdC5mZCA9IGZkOwotICAgIHJlcXVlc3QuaWRlbnQgPSBpZGVudDsKLSAgICByZXF1ZXN0LmNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgcmVxdWVzdC5kYXRhID0gZGF0YTsKLSAgICBzc2l6ZV90IGluZGV4ID0gZ2V0UmVxdWVzdEluZGV4TG9ja2VkKGZkKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIG1SZXF1ZXN0ZWRGZHMucHVzaChyZXF1ZXN0ZWRGZCk7Ci0gICAgICAgIG1SZXF1ZXN0cy5wdXNoKHJlcXVlc3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1SZXF1ZXN0ZWRGZHMucmVwbGFjZUF0KHJlcXVlc3RlZEZkLCBzaXplX3QoaW5kZXgpKTsKLSAgICAgICAgbVJlcXVlc3RzLnJlcGxhY2VBdChyZXF1ZXN0LCBzaXplX3QoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICBtTG9jay51bmxvY2soKTsgLy8gcmVsZWFzZSBsb2NrCi0jZW5kaWYKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IExvb3Blcjo6cmVtb3ZlRmQoaW50IGZkKSB7Ci0jaWYgREVCVUdfQ0FMTEJBQ0tTCi0gICAgQUxPR0QoIiVwIH4gcmVtb3ZlRmQgLSBmZD0lZCIsIHRoaXMsIGZkKTsKLSNlbmRpZgotCi0jaWZkZWYgTE9PUEVSX1VTRVNfRVBPTEwKLSAgICB7IC8vIGFjcXVpcmUgbG9jawotICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgICAgICBzc2l6ZV90IHJlcXVlc3RJbmRleCA9IG1SZXF1ZXN0cy5pbmRleE9mS2V5KGZkKTsKLSAgICAgICAgaWYgKHJlcXVlc3RJbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGVwb2xsUmVzdWx0ID0gZXBvbGxfY3RsKG1FcG9sbEZkLCBFUE9MTF9DVExfREVMLCBmZCwgTlVMTCk7Ci0gICAgICAgIGlmIChlcG9sbFJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZW1vdmluZyBlcG9sbCBldmVudHMgZm9yIGZkICVkLCBlcnJubz0lZCIsIGZkLCBlcnJubyk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBtUmVxdWVzdHMucmVtb3ZlSXRlbXNBdChyZXF1ZXN0SW5kZXgpOwotICAgIH0gLy8gcmVsZWFzZSBsb2NrCi0gICAgcmV0dXJuIDE7Ci0jZWxzZQotICAgIHdha2VBbmRMb2NrKCk7IC8vIGFjcXVpcmUgbG9jawotCi0gICAgc3NpemVfdCBpbmRleCA9IGdldFJlcXVlc3RJbmRleExvY2tlZChmZCk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgbVJlcXVlc3RlZEZkcy5yZW1vdmVBdChzaXplX3QoaW5kZXgpKTsKLSAgICAgICAgbVJlcXVlc3RzLnJlbW92ZUF0KHNpemVfdChpbmRleCkpOwotICAgIH0KLQotICAgIG1Mb2NrLnVubG9jaygpOyAvLyByZWxlYXNlIGxvY2sKLSAgICByZXR1cm4gaW5kZXggPj0gMDsKLSNlbmRpZgotfQotCi0jaWZuZGVmIExPT1BFUl9VU0VTX0VQT0xMCi1zc2l6ZV90IExvb3Blcjo6Z2V0UmVxdWVzdEluZGV4TG9ja2VkKGludCBmZCkgewotICAgIHNpemVfdCByZXF1ZXN0Q291bnQgPSBtUmVxdWVzdGVkRmRzLnNpemUoKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdENvdW50OyBpKyspIHsKLSAgICAgICAgaWYgKG1SZXF1ZXN0ZWRGZHMuaXRlbUF0KGkpLmZkID09IGZkKSB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAtMTsKLX0KLQotdm9pZCBMb29wZXI6Ondha2VBbmRMb2NrKCkgewotICAgIG1Mb2NrLmxvY2soKTsKLQotICAgIG1XYWl0ZXJzICs9IDE7Ci0gICAgd2hpbGUgKG1Qb2xsaW5nKSB7Ci0gICAgICAgIHdha2UoKTsKLSAgICAgICAgbUF3YWtlLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIG1XYWl0ZXJzIC09IDE7Ci0gICAgaWYgKG1XYWl0ZXJzID09IDApIHsKLSAgICAgICAgbVJlc3VtZS5zaWduYWwoKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotdm9pZCBMb29wZXI6OnNlbmRNZXNzYWdlKGNvbnN0IHNwPE1lc3NhZ2VIYW5kbGVyPiYgaGFuZGxlciwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgewotICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIHNlbmRNZXNzYWdlQXRUaW1lKG5vdywgaGFuZGxlciwgbWVzc2FnZSk7Ci19Ci0KLXZvaWQgTG9vcGVyOjpzZW5kTWVzc2FnZURlbGF5ZWQobnNlY3NfdCB1cHRpbWVEZWxheSwgY29uc3Qgc3A8TWVzc2FnZUhhbmRsZXI+JiBoYW5kbGVyLAotICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7Ci0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgc2VuZE1lc3NhZ2VBdFRpbWUobm93ICsgdXB0aW1lRGVsYXksIGhhbmRsZXIsIG1lc3NhZ2UpOwotfQotCi12b2lkIExvb3Blcjo6c2VuZE1lc3NhZ2VBdFRpbWUobnNlY3NfdCB1cHRpbWUsIGNvbnN0IHNwPE1lc3NhZ2VIYW5kbGVyPiYgaGFuZGxlciwKLSAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgewotI2lmIERFQlVHX0NBTExCQUNLUwotICAgIEFMT0dEKCIlcCB+IHNlbmRNZXNzYWdlQXRUaW1lIC0gdXB0aW1lPSVsbGQsIGhhbmRsZXI9JXAsIHdoYXQ9JWQiLAotICAgICAgICAgICAgdGhpcywgdXB0aW1lLCBoYW5kbGVyLmdldCgpLCBtZXNzYWdlLndoYXQpOwotI2VuZGlmCi0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgeyAvLyBhY3F1aXJlIGxvY2sKLSAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLQotICAgICAgICBzaXplX3QgbWVzc2FnZUNvdW50ID0gbU1lc3NhZ2VFbnZlbG9wZXMuc2l6ZSgpOwotICAgICAgICB3aGlsZSAoaSA8IG1lc3NhZ2VDb3VudCAmJiB1cHRpbWUgPj0gbU1lc3NhZ2VFbnZlbG9wZXMuaXRlbUF0KGkpLnVwdGltZSkgewotICAgICAgICAgICAgaSArPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVzc2FnZUVudmVsb3BlIG1lc3NhZ2VFbnZlbG9wZSh1cHRpbWUsIGhhbmRsZXIsIG1lc3NhZ2UpOwotICAgICAgICBtTWVzc2FnZUVudmVsb3Blcy5pbnNlcnRBdChtZXNzYWdlRW52ZWxvcGUsIGksIDEpOwotCi0gICAgICAgIC8vIE9wdGltaXphdGlvbjogSWYgdGhlIExvb3BlciBpcyBjdXJyZW50bHkgc2VuZGluZyBhIG1lc3NhZ2UsIHRoZW4gd2UgY2FuIHNraXAKLSAgICAgICAgLy8gdGhlIGNhbGwgdG8gd2FrZSgpIGJlY2F1c2UgdGhlIG5leHQgdGhpbmcgdGhlIExvb3BlciB3aWxsIGRvIGFmdGVyIHByb2Nlc3NpbmcKLSAgICAgICAgLy8gbWVzc2FnZXMgaXMgdG8gZGVjaWRlIHdoZW4gdGhlIG5leHQgd2FrZXVwIHRpbWUgc2hvdWxkIGJlLiAgSW4gZmFjdCwgaXQgZG9lcwotICAgICAgICAvLyBub3QgZXZlbiBtYXR0ZXIgd2hldGhlciB0aGlzIGNvZGUgaXMgcnVubmluZyBvbiB0aGUgTG9vcGVyIHRocmVhZC4KLSAgICAgICAgaWYgKG1TZW5kaW5nTWVzc2FnZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfSAvLyByZWxlYXNlIGxvY2sKLQotICAgIC8vIFdha2UgdGhlIHBvbGwgbG9vcCBvbmx5IHdoZW4gd2UgZW5xdWV1ZSBhIG5ldyBtZXNzYWdlIGF0IHRoZSBoZWFkLgotICAgIGlmIChpID09IDApIHsKLSAgICAgICAgd2FrZSgpOwotICAgIH0KLX0KLQotdm9pZCBMb29wZXI6OnJlbW92ZU1lc3NhZ2VzKGNvbnN0IHNwPE1lc3NhZ2VIYW5kbGVyPiYgaGFuZGxlcikgewotI2lmIERFQlVHX0NBTExCQUNLUwotICAgIEFMT0dEKCIlcCB+IHJlbW92ZU1lc3NhZ2VzIC0gaGFuZGxlcj0lcCIsIHRoaXMsIGhhbmRsZXIuZ2V0KCkpOwotI2VuZGlmCi0KLSAgICB7IC8vIGFjcXVpcmUgbG9jawotICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBtTWVzc2FnZUVudmVsb3Blcy5zaXplKCk7IGkgIT0gMDsgKSB7Ci0gICAgICAgICAgICBjb25zdCBNZXNzYWdlRW52ZWxvcGUmIG1lc3NhZ2VFbnZlbG9wZSA9IG1NZXNzYWdlRW52ZWxvcGVzLml0ZW1BdCgtLWkpOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2VFbnZlbG9wZS5oYW5kbGVyID09IGhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICBtTWVzc2FnZUVudmVsb3Blcy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLy8gcmVsZWFzZSBsb2NrCi19Ci0KLXZvaWQgTG9vcGVyOjpyZW1vdmVNZXNzYWdlcyhjb25zdCBzcDxNZXNzYWdlSGFuZGxlcj4mIGhhbmRsZXIsIGludCB3aGF0KSB7Ci0jaWYgREVCVUdfQ0FMTEJBQ0tTCi0gICAgQUxPR0QoIiVwIH4gcmVtb3ZlTWVzc2FnZXMgLSBoYW5kbGVyPSVwLCB3aGF0PSVkIiwgdGhpcywgaGFuZGxlci5nZXQoKSwgd2hhdCk7Ci0jZW5kaWYKLQotICAgIHsgLy8gYWNxdWlyZSBsb2NrCi0gICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1NZXNzYWdlRW52ZWxvcGVzLnNpemUoKTsgaSAhPSAwOyApIHsKLSAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VFbnZlbG9wZSYgbWVzc2FnZUVudmVsb3BlID0gbU1lc3NhZ2VFbnZlbG9wZXMuaXRlbUF0KC0taSk7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZUVudmVsb3BlLmhhbmRsZXIgPT0gaGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAmJiBtZXNzYWdlRW52ZWxvcGUubWVzc2FnZS53aGF0ID09IHdoYXQpIHsKLSAgICAgICAgICAgICAgICBtTWVzc2FnZUVudmVsb3Blcy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLy8gcmVsZWFzZSBsb2NrCi19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnMvdXRpbHMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9OT1RJQ0UgYi9saWJzL3V0aWxzL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9Qcm9wZXJ0eU1hcC5jcHAgYi9saWJzL3V0aWxzL1Byb3BlcnR5TWFwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyMDcwMi4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1Byb3BlcnR5TWFwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJQcm9wZXJ0eU1hcCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvUHJvcGVydHlNYXAuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotLy8gRW5hYmxlcyBkZWJ1ZyBvdXRwdXQgZm9yIHRoZSBwYXJzZXIuCi0jZGVmaW5lIERFQlVHX1BBUlNFUiAwCi0KLS8vIEVuYWJsZXMgZGVidWcgb3V0cHV0IGZvciBwYXJzZXIgcGVyZm9ybWFuY2UuCi0jZGVmaW5lIERFQlVHX1BBUlNFUl9QRVJGT1JNQU5DRSAwCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciogV0hJVEVTUEFDRSA9ICIgXHRcciI7Ci1zdGF0aWMgY29uc3QgY2hhciogV0hJVEVTUEFDRV9PUl9QUk9QRVJUWV9ERUxJTUlURVIgPSAiIFx0XHI9IjsKLQotCi0vLyAtLS0gUHJvcGVydHlNYXAgLS0tCi0KLVByb3BlcnR5TWFwOjpQcm9wZXJ0eU1hcCgpIHsKLX0KLQotUHJvcGVydHlNYXA6On5Qcm9wZXJ0eU1hcCgpIHsKLX0KLQotdm9pZCBQcm9wZXJ0eU1hcDo6Y2xlYXIoKSB7Ci0gICAgbVByb3BlcnRpZXMuY2xlYXIoKTsKLX0KLQotdm9pZCBQcm9wZXJ0eU1hcDo6YWRkUHJvcGVydHkoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBTdHJpbmc4JiB2YWx1ZSkgewotICAgIG1Qcm9wZXJ0aWVzLmFkZChrZXksIHZhbHVlKTsKLX0KLQotYm9vbCBQcm9wZXJ0eU1hcDo6aGFzUHJvcGVydHkoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Qcm9wZXJ0aWVzLmluZGV4T2ZLZXkoa2V5KSA+PSAwOwotfQotCi1ib29sIFByb3BlcnR5TWFwOjp0cnlHZXRQcm9wZXJ0eShjb25zdCBTdHJpbmc4JiBrZXksIFN0cmluZzgmIG91dFZhbHVlKSBjb25zdCB7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1Qcm9wZXJ0aWVzLmluZGV4T2ZLZXkoa2V5KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBvdXRWYWx1ZSA9IG1Qcm9wZXJ0aWVzLnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFByb3BlcnR5TWFwOjp0cnlHZXRQcm9wZXJ0eShjb25zdCBTdHJpbmc4JiBrZXksIGJvb2wmIG91dFZhbHVlKSBjb25zdCB7Ci0gICAgaW50MzJfdCBpbnRWYWx1ZTsKLSAgICBpZiAoIXRyeUdldFByb3BlcnR5KGtleSwgaW50VmFsdWUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBvdXRWYWx1ZSA9IGludFZhbHVlOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFByb3BlcnR5TWFwOjp0cnlHZXRQcm9wZXJ0eShjb25zdCBTdHJpbmc4JiBrZXksIGludDMyX3QmIG91dFZhbHVlKSBjb25zdCB7Ci0gICAgU3RyaW5nOCBzdHJpbmdWYWx1ZTsKLSAgICBpZiAoISB0cnlHZXRQcm9wZXJ0eShrZXksIHN0cmluZ1ZhbHVlKSB8fCBzdHJpbmdWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyKiBlbmQ7Ci0gICAgaW50IHZhbHVlID0gc3RydG9sKHN0cmluZ1ZhbHVlLnN0cmluZygpLCAmIGVuZCwgMTApOwotICAgIGlmICgqZW5kICE9ICdcMCcpIHsKLSAgICAgICAgQUxPR1coIlByb3BlcnR5IGtleSAnJXMnIGhhcyBpbnZhbGlkIHZhbHVlICclcycuICBFeHBlY3RlZCBhbiBpbnRlZ2VyLiIsCi0gICAgICAgICAgICAgICAga2V5LnN0cmluZygpLCBzdHJpbmdWYWx1ZS5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgb3V0VmFsdWUgPSB2YWx1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQcm9wZXJ0eU1hcDo6dHJ5R2V0UHJvcGVydHkoY29uc3QgU3RyaW5nOCYga2V5LCBmbG9hdCYgb3V0VmFsdWUpIGNvbnN0IHsKLSAgICBTdHJpbmc4IHN0cmluZ1ZhbHVlOwotICAgIGlmICghIHRyeUdldFByb3BlcnR5KGtleSwgc3RyaW5nVmFsdWUpIHx8IHN0cmluZ1ZhbHVlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIqIGVuZDsKLSAgICBmbG9hdCB2YWx1ZSA9IHN0cnRvZihzdHJpbmdWYWx1ZS5zdHJpbmcoKSwgJiBlbmQpOwotICAgIGlmICgqZW5kICE9ICdcMCcpIHsKLSAgICAgICAgQUxPR1coIlByb3BlcnR5IGtleSAnJXMnIGhhcyBpbnZhbGlkIHZhbHVlICclcycuICBFeHBlY3RlZCBhIGZsb2F0LiIsCi0gICAgICAgICAgICAgICAga2V5LnN0cmluZygpLCBzdHJpbmdWYWx1ZS5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgb3V0VmFsdWUgPSB2YWx1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQcm9wZXJ0eU1hcDo6YWRkQWxsKGNvbnN0IFByb3BlcnR5TWFwKiBtYXApIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hcC0+bVByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVByb3BlcnRpZXMuYWRkKG1hcC0+bVByb3BlcnRpZXMua2V5QXQoaSksIG1hcC0+bVByb3BlcnRpZXMudmFsdWVBdChpKSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcm9wZXJ0eU1hcDo6bG9hZChjb25zdCBTdHJpbmc4JiBmaWxlbmFtZSwgUHJvcGVydHlNYXAqKiBvdXRNYXApIHsKLSAgICAqb3V0TWFwID0gTlVMTDsKLQotICAgIFRva2VuaXplciogdG9rZW5pemVyOwotICAgIHN0YXR1c190IHN0YXR1cyA9IFRva2VuaXplcjo6b3BlbihmaWxlbmFtZSwgJnRva2VuaXplcik7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb3BlbmluZyBwcm9wZXJ0eSBmaWxlICVzLiIsIHN0YXR1cywgZmlsZW5hbWUuc3RyaW5nKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFByb3BlcnR5TWFwKiBtYXAgPSBuZXcgUHJvcGVydHlNYXAoKTsKLSAgICAgICAgaWYgKCFtYXApIHsKLSAgICAgICAgICAgIEFMT0dFKCJFcnJvciBhbGxvY2F0aW5nIHByb3BlcnR5IG1hcC4iKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKLSAgICAgICAgfSBlbHNlIHsKLSNpZiBERUJVR19QQVJTRVJfUEVSRk9STUFOQ0UKLSAgICAgICAgICAgIG5zZWNzX3Qgc3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotI2VuZGlmCi0gICAgICAgICAgICBQYXJzZXIgcGFyc2VyKG1hcCwgdG9rZW5pemVyKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IHBhcnNlci5wYXJzZSgpOwotI2lmIERFQlVHX1BBUlNFUl9QRVJGT1JNQU5DRQotICAgICAgICAgICAgbnNlY3NfdCBlbGFwc2VkVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSAtIHN0YXJ0VGltZTsKLSAgICAgICAgICAgIEFMT0dEKCJQYXJzZWQgcHJvcGVydHkgZmlsZSAnJXMnICVkIGxpbmVzIGluICUwLjNmbXMuIiwKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5pemVyLT5nZXRGaWxlbmFtZSgpLnN0cmluZygpLCB0b2tlbml6ZXItPmdldExpbmVOdW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWUgLyAxMDAwMDAwLjApOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1hcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKm91dE1hcCA9IG1hcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZWxldGUgdG9rZW5pemVyOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0KLS8vIC0tLSBQcm9wZXJ0eU1hcDo6UGFyc2VyIC0tLQotCi1Qcm9wZXJ0eU1hcDo6UGFyc2VyOjpQYXJzZXIoUHJvcGVydHlNYXAqIG1hcCwgVG9rZW5pemVyKiB0b2tlbml6ZXIpIDoKLSAgICAgICAgbU1hcChtYXApLCBtVG9rZW5pemVyKHRva2VuaXplcikgewotfQotCi1Qcm9wZXJ0eU1hcDo6UGFyc2VyOjp+UGFyc2VyKCkgewotfQotCi1zdGF0dXNfdCBQcm9wZXJ0eU1hcDo6UGFyc2VyOjpwYXJzZSgpIHsKLSAgICB3aGlsZSAoIW1Ub2tlbml6ZXItPmlzRW9mKCkpIHsKLSNpZiBERUJVR19QQVJTRVIKLSAgICAgICAgQUxPR0QoIlBhcnNpbmcgJXM6ICclcycuIiwgbVRva2VuaXplci0+Z2V0TG9jYXRpb24oKS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBtVG9rZW5pemVyLT5wZWVrUmVtYWluZGVyT2ZMaW5lKCkuc3RyaW5nKCkpOwotI2VuZGlmCi0KLSAgICAgICAgbVRva2VuaXplci0+c2tpcERlbGltaXRlcnMoV0hJVEVTUEFDRSk7Ci0KLSAgICAgICAgaWYgKCFtVG9rZW5pemVyLT5pc0VvbCgpICYmIG1Ub2tlbml6ZXItPnBlZWtDaGFyKCkgIT0gJyMnKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGtleVRva2VuID0gbVRva2VuaXplci0+bmV4dFRva2VuKFdISVRFU1BBQ0VfT1JfUFJPUEVSVFlfREVMSU1JVEVSKTsKLSAgICAgICAgICAgIGlmIChrZXlUb2tlbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEV4cGVjdGVkIG5vbi1lbXB0eSBwcm9wZXJ0eSBrZXkuIiwgbVRva2VuaXplci0+Z2V0TG9jYXRpb24oKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVRva2VuaXplci0+c2tpcERlbGltaXRlcnMoV0hJVEVTUEFDRSk7Ci0KLSAgICAgICAgICAgIGlmIChtVG9rZW5pemVyLT5uZXh0Q2hhcigpICE9ICc9JykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXhwZWN0ZWQgJz0nIGJldHdlZW4gcHJvcGVydHkga2V5IGFuZCB2YWx1ZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRva2VuaXplci0+Z2V0TG9jYXRpb24oKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVRva2VuaXplci0+c2tpcERlbGltaXRlcnMoV0hJVEVTUEFDRSk7Ci0KLSAgICAgICAgICAgIFN0cmluZzggdmFsdWVUb2tlbiA9IG1Ub2tlbml6ZXItPm5leHRUb2tlbihXSElURVNQQUNFKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZVRva2VuLmZpbmQoIlxcIiwgMCkgPj0gMCB8fCB2YWx1ZVRva2VuLmZpbmQoIlwiIiwgMCkgPj0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRm91bmQgcmVzZXJ2ZWQgY2hhcmFjdGVyICdcXCcgb3IgJ1wiJyBpbiBwcm9wZXJ0eSB2YWx1ZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRva2VuaXplci0+Z2V0TG9jYXRpb24oKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVRva2VuaXplci0+c2tpcERlbGltaXRlcnMoV0hJVEVTUEFDRSk7Ci0gICAgICAgICAgICBpZiAoIW1Ub2tlbml6ZXItPmlzRW9sKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEV4cGVjdGVkIGVuZCBvZiBsaW5lLCBnb3QgJyVzJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRva2VuaXplci0+Z2V0TG9jYXRpb24oKS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ub2tlbml6ZXItPnBlZWtSZW1haW5kZXJPZkxpbmUoKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1NYXAtPmhhc1Byb3BlcnR5KGtleVRva2VuKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRHVwbGljYXRlIHByb3BlcnR5IHZhbHVlIGZvciBrZXkgJyVzJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRva2VuaXplci0+Z2V0TG9jYXRpb24oKS5zdHJpbmcoKSwga2V5VG9rZW4uc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1NYXAtPmFkZFByb3BlcnR5KGtleVRva2VuLCB2YWx1ZVRva2VuKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Ub2tlbml6ZXItPm5leHRMaW5lKCk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9SRUFETUUgYi9saWJzL3V0aWxzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3NDFlMC4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi1BbmRyb2lkIFV0aWxpdHkgRnVuY3Rpb24gTGlicmFyeQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi1JZiB5b3UgbmVlZCBhIGZlYXR1cmUgdGhhdCBpcyBuYXRpdmUgdG8gTGludXggYnV0IG5vdCBwcmVzZW50IG9uIG90aGVyCi1wbGF0Zm9ybXMsIGNvbnN0cnVjdCBhIHBsYXRmb3JtLWRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiB0aGF0IHNoYXJlcwotdGhlIExpbnV4IGludGVyZmFjZS4gIFRoYXQgd2F5IHRoZSBhY3R1YWwgZGV2aWNlIHJ1bnMgYXMgImxpZ2h0IiBhcwotcG9zc2libGUuCi0KLUlmIHRoYXQgaXNuJ3QgZmVhc2libGUsIGNyZWF0ZSBhIHN5c3RlbS1pbmRlcGVuZGVudCBpbnRlcmZhY2UgYW5kIGhpZGUKLXRoZSBkZXRhaWxzLgotCi1UaGUgdWx0aW1hdGUgZ29hbCBpcyAqbm90KiB0byBjcmVhdGUgYSBzdXBlci1kdXBlciBwbGF0Zm9ybSBhYnN0cmFjdGlvbgotbGF5ZXIuICBUaGUgZ29hbCBpcyB0byBwcm92aWRlIGFuIG9wdGltaXplZCBzb2x1dGlvbiBmb3IgTGludXggd2l0aAotcmVhc29uYWJsZSBpbXBsZW1lbnRhdGlvbnMgZm9yIG90aGVyIHBsYXRmb3Jtcy4KLQotCi0KLVJlc291cmNlIG92ZXJsYXkKLT09PT09PT09PT09PT09PT0KLQotCi1JbnRyb2R1Y3Rpb24KLS0tLS0tLS0tLS0tLQotCi1PdmVybGF5IHBhY2thZ2VzIGFyZSBzcGVjaWFsIC5hcGsgZmlsZXMgd2hpY2ggcHJvdmlkZSBubyBjb2RlIGJ1dAotYWRkaXRpb25hbCByZXNvdXJjZSB2YWx1ZXMgKGFuZCBwb3NzaWJseSBuZXcgY29uZmlndXJhdGlvbnMpIGZvcgotcmVzb3VyY2VzIGluIG90aGVyIHBhY2thZ2VzLiBXaGVuIGFuIGFwcGxpY2F0aW9uIHJlcXVlc3RzIHJlc291cmNlcywKLXRoZSBzeXN0ZW0gd2lsbCByZXR1cm4gdmFsdWVzIGZyb20gZWl0aGVyIHRoZSBhcHBsaWNhdGlvbidzIG9yaWdpbmFsCi1wYWNrYWdlIG9yIGFueSBhc3NvY2lhdGVkIG92ZXJsYXkgcGFja2FnZS4gQW55IHJlZGlyZWN0aW9uIGlzIGNvbXBsZXRlbHkKLXRyYW5zcGFyZW50IHRvIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLgotCi1SZXNvdXJjZSB2YWx1ZXMgaGF2ZSB0aGUgZm9sbG93aW5nIHByZWNlZGVuY2UgdGFibGUsIGxpc3RlZCBpbgotZGVzY2VuZGluZyBwcmVjZWRlbmNlLgotCi0gKiBvdmVybGF5IHBhY2thZ2UsIG1hdGNoaW5nIGNvbmZpZyAoZWcgcmVzL3ZhbHVlcy1lbi1sYW5kKQotCi0gKiBvcmlnaW5hbCBwYWNrYWdlLCBtYXRjaGluZyBjb25maWcKLQotICogb3ZlcmxheSBwYWNrYWdlLCBubyBjb25maWcgKGVnIHJlcy92YWx1ZXMpCi0KLSAqIG9yaWdpbmFsIHBhY2thZ2UsIG5vIGNvbmZpZwotCi1EdXJpbmcgY29tcGlsYXRpb24sIG92ZXJsYXkgcGFja2FnZXMgYXJlIGRpZmZlcmVudGlhdGVkIGZyb20gcmVndWxhcgotcGFja2FnZXMgYnkgcGFzc2luZyB0aGUgLW8gZmxhZyB0byBhYXB0LgotCi0KLUJhY2tncm91bmQKLS0tLS0tLS0tLS0KLQotVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGdlbmVyaWMgYmFja2dyb3VuZCBtYXRlcmlhbCBvbiByZXNvdXJjZXMgaW4KLUFuZHJvaWQuCi0KLQotSG93IHJlc291cmNlcyBhcmUgYnVuZGxlZCBpbiAuYXBrIGZpbGVzCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLUFuZHJvaWQgLmFwayBmaWxlcyBhcmUgLnppcCBmaWxlcywgdXN1YWxseSBob3VzaW5nIC5kZXggY29kZSwKLWNlcnRpZmljYXRlcyBhbmQgcmVzb3VyY2VzLCB0aG91Z2ggcGFja2FnZXMgY29udGFpbmluZyByZXNvdXJjZXMgYnV0Ci1ubyBjb2RlIGFyZSBwb3NzaWJsZS4gUmVzb3VyY2VzIGNhbiBiZSBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZwotY2F0ZWdvcmllczsgYSBgY29uZmlndXJhdGlvbicgaW5kaWNhdGVzIGEgc2V0IG9mIHBob25lIGxhbmd1YWdlLCBkaXNwbGF5Ci1kZW5zaXR5LCBuZXR3b3JrIG9wZXJhdG9yLCBldGMuCi0KLSAqIGFzc2V0czogdW5jb21wcmVzc2VkLCByYXcgZmlsZXMgcGFja2FnZWQgYXMgcGFydCBvZiBhbiAuYXBrIGFuZAotICAgICAgICAgICBleHBsaWNpdGx5IHJlZmVyZW5jZWQgYnkgZmlsZW5hbWUuIFRoZXNlIGZpbGVzIGFyZQotICAgICAgICAgICBpbmRlcGVuZGVudCBvZiBjb25maWd1cmF0aW9uLgotCi0gKiByZXMvZHJhd2FibGU6IGJpdG1hcCBvciB4bWwgZ3JhcGhpY3MuIEVhY2ggZmlsZSBtYXkgaGF2ZSBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgdmFsdWVzIGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uLgotCi0gKiByZXMvdmFsdWVzOiBpbnRlZ2Vycywgc3RyaW5ncywgZXRjLiBFYWNoIHJlc291cmNlIG1heSBoYXZlIGRpZmZlcmVudAotICAgICAgICAgICAgICAgdmFsdWVzIGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uLgotCi1SZXNvdXJjZSBtZXRhIGluZm9ybWF0aW9uIGFuZCBpbmZvcm1hdGlvbiBwcm9wZXIgaXMgc3RvcmVkIGluIGEgYmluYXJ5Ci1mb3JtYXQgaW4gYSBuYW1lZCBmaWxlIHJlc291cmNlcy5hcnNjLCBidW5kbGVkIGFzIHBhcnQgb2YgdGhlIC5hcGsuCi0KLVJlc291cmNlIElEcyBhbmQgbG9va3VwCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotRHVyaW5nIGNvbXBpbGF0aW9uLCB0aGUgYWFwdCB0b29sIGdhdGhlcnMgYXBwbGljYXRpb24gcmVzb3VyY2VzIGFuZAotZ2VuZXJhdGVzIGEgcmVzb3VyY2VzLmFyc2MgZmlsZS4gRWFjaCByZXNvdXJjZSBuYW1lIGlzIGFzc2lnbmVkIGFuCi1pbnRlZ2VyIElEIDB4cHB0dGlpaSAodHJhbnNsYXRlZCB0byBhIHN5bWJvbGljIG5hbWUgdmlhIFIuamF2YSksIHdoZXJlCi0KLSAqIHBwOiBjb3JyZXNwb25kcyB0byB0aGUgcGFja2FnZSBuYW1lc3BhY2UgKGRldGFpbHMgYmVsb3cpLgotCi0gKiB0dDogY29ycmVzcG9uZHMgdG8gdGhlIHJlc291cmNlIHR5cGUgKHN0cmluZywgaW50LCBldGMpLiBFdmVyeQotICAgICAgIHJlc291cmNlIG9mIHRoZSBzYW1lIHR5cGUgd2l0aGluIHRoZSBzYW1lIHBhY2thZ2UgaGFzIHRoZSBzYW1lCi0gICAgICAgdHQgdmFsdWUsIGJ1dCBkZXBlbmRpbmcgb24gYXZhaWxhYmxlIHR5cGVzLCB0aGUgYWN0dWFsIG51bWVyaWNhbAotICAgICAgIHZhbHVlIG1heSBiZSBkaWZmZXJlbnQgYmV0d2VlbiBwYWNrYWdlcy4KLQotICogaWlpaTogc2VxdWVudGlhbCBudW1iZXIsIGFzc2lnbmVkIGluIHRoZSBvcmRlciByZXNvdXJjZXMgYXJlIGZvdW5kLgotCi1SZXNvdXJjZSB2YWx1ZXMgYXJlIHNwZWNpZmllZCBwYWlyZWQgd2l0aCBhIHNldCBvZiBjb25maWd1cmF0aW9uCi1jb25zdHJhaW50cyAodGhlIGRlZmF1bHQgYmVpbmcgdGhlIGVtcHR5IHNldCksIGVnIHJlcy92YWx1ZXMtc3YtcG9ydAotd2hpY2ggaW1wb3NlcyByZXN0cmljdGlvbnMgb24gbGFuZ3VhZ2UgKFN3ZWRpc2gpIGFuZCBkaXNwbGF5IG9yaWVudGF0aW9uCi0ocG9ydHJhaXQpLiBEdXJpbmcgbG9va3VwLCBldmVyeSBjb25zdHJhaW50IHNldCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlCi1jdXJyZW50IGNvbmZpZ3VyYXRpb24sIGFuZCB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgYmVzdCBtYXRjaGluZwotY29uc3RyYWludCBzZXQgaXMgcmV0dXJuZWQgKFJlc291cmNlVHlwZXMue2gsY3BwfSkuCi0KLVBhcnNpbmcgb2YgcmVzb3VyY2VzLmFyc2MgaXMgaGFuZGxlZCBieSBSZXNvdXJjZVR5cGVzLmNwcDsgdGhpcyB1dGlsaXR5Ci1pcyBnb3Zlcm5lZCBieSBBc3NldE1hbmFnZXIuY3BwLCB3aGljaCB0cmFja3MgbG9hZGVkIHJlc291cmNlcyBwZXIKLXByb2Nlc3MuCi0KLUFzc2V0cyBhcmUgbG9va2VkIHVwIGJ5IHBhdGggYW5kIGZpbGVuYW1lIGluIEFzc2V0TWFuYWdlci5jcHAuIFRoZSBwYXRoCi10byByZXNvdXJjZXMgaW4gcmVzL2RyYXdhYmxlIGFyZSBsb2NhdGVkIGJ5IFJlc291cmNlVHlwZXMuY3BwIGFuZCB0aGVuCi1oYW5kbGVkIGxpa2UgYXNzZXRzIGJ5IEFzc2V0TWFuYWdlci5jcHAuIE90aGVyIHJlc291cmNlcyBhcmUgaGFuZGxlZAotc29sZWx5IGJ5IFJlc291cmNlVHlwZXMuY3BwLgotCi1QYWNrYWdlIElEIGFzIG5hbWVzcGFjZQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLVRoZSBwcCBwYXJ0IG9mIGEgcmVzb3VyY2UgSUQgZGVmaW5lcyBhIG5hbWVzcGFjZS4gQW5kcm9pZCBjdXJyZW50bHkKLWRlZmluZXMgdHdvIG5hbWVzcGFjZXM6Ci0KLSAqIDB4MDE6IHN5c3RlbSByZXNvdXJjZXMgKHByZS1pbnN0YWxsZWQgaW4gZnJhbWV3b3JrLXJlcy5hcGspCi0KLSAqIDB4N2Y6IGFwcGxpY2F0aW9uIHJlc291cmNlcyAoYnVuZGxlZCBpbiB0aGUgYXBwbGljYXRpb24gLmFwaykKLQotUmVzb3VyY2VUeXBlcy5jcHAgc3VwcG9ydHMgcGFja2FnZSBJRHMgYmV0d2VlbiAweDAxIGFuZCAweDdmCi0oaW5jbHVzaXZlKTsgdmFsdWVzIG91dHNpZGUgdGhpcyByYW5nZSBhcmUgaW52YWxpZC4KLQotRWFjaCBydW5uaW5nIChEYWx2aWspIHByb2Nlc3MgaXMgYXNzaWduZWQgYSB1bmlxdWUgaW5zdGFuY2Ugb2YKLUFzc2V0TWFuYWdlciwgd2hpY2ggaW4gdHVybiBrZWVwcyBhIGZvcmVzdCBzdHJ1Y3R1cmUgb2YgbG9hZGVkCi1yZXNvdXJjZS5hcnNjIGZpbGVzLiBOb3JtYWxseSwgdGhpcyBmb3Jlc3QgaXMgc3RydWN0dXJlZCBhcyBmb2xsb3dzLAotd2hlcmUgbVBhY2thZ2VNYXAgaXMgdGhlIGludGVybmFsIHZlY3RvciBlbXBsb3llZCBpbiBSZXNvdXJjZVR5cGVzLmNwcC4KLQotbVBhY2thZ2VNYXBbMHgwMF0gLT4gc3lzdGVtIHBhY2thZ2UKLW1QYWNrYWdlTWFwWzB4MDFdIC0+IE5VTEwKLW1QYWNrYWdlTWFwWzB4MDJdIC0+IE5VTEwKLS4uLgotbVBhY2thZ2VNYXBbMHg3ZiAtIDJdIC0+IE5VTEwKLW1QYWNrYWdlTWFwWzB4N2YgLSAxXSAtPiBhcHBsaWNhdGlvbiBwYWNrYWdlCi0KLQotCi1UaGUgcmVzb3VyY2Ugb3ZlcmxheSBleHRlbnNpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgcmVzb3VyY2Ugb3ZlcmxheSBtZWNoYW5pc20gYWltcyB0byAocGFydGx5KSBzaGFkb3cgYW5kIGV4dGVuZAotZXhpc3RpbmcgcmVzb3VyY2VzIHdpdGggbmV3IHZhbHVlcyBmb3IgZGVmaW5lZCBhbmQgbmV3IGNvbmZpZ3VyYXRpb25zLgotVGVjaG5pY2FsbHksIHRoaXMgaXMgYWNoaWV2ZWQgYnkgYWRkaW5nIHJlc291cmNlLW9ubHkgcGFja2FnZXMgKGNhbGxlZAotb3ZlcmxheSBwYWNrYWdlcykgdG8gZXhpc3RpbmcgcmVzb3VyY2UgbmFtZXNwYWNlcywgbGlrZSBzbzoKLQotbVBhY2thZ2VNYXBbMHgwMF0gLT4gc3lzdGVtIHBhY2thZ2UgLT4gc3lzdGVtIG92ZXJsYXkgcGFja2FnZQotbVBhY2thZ2VNYXBbMHgwMV0gLT4gTlVMTAotbVBhY2thZ2VNYXBbMHgwMl0gLT4gTlVMTAotLi4uCi1tUGFja2FnZU1hcFsweDdmIC0gMl0gLT4gTlVMTAotbVBhY2thZ2VNYXBbMHg3ZiAtIDFdIC0+IGFwcGxpY2F0aW9uIHBhY2thZ2UgLT4gb3ZlcmxheSAxIC0+IG92ZXJsYXkgMgotCi1UaGUgdXNlIG9mIG92ZXJsYXkgcmVzb3VyY2VzIGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8KLWFwcGxpY2F0aW9uczsgbm8gYWRkaXRpb25hbCByZXNvdXJjZSBpZGVudGlmaWVycyBhcmUgaW50cm9kdWNlZCwgb25seQotY29uZmlndXJhdGlvbi92YWx1ZSBwYWlycy4gQW55IG51bWJlciBvZiBvdmVybGF5IHBhY2thZ2VzIG1heSBiZSBsb2FkZWQKLWF0IGEgdGltZTsgb3ZlcmxheSBwYWNrYWdlcyBhcmUgYWdub3N0aWMgdG8gd2hhdCB0aGV5IHRhcmdldCAtLSBib3RoCi1zeXN0ZW0gYW5kIGFwcGxpY2F0aW9uIHJlc291cmNlcyBhcmUgZmFpciBnYW1lLgotCi1UaGUgcGFja2FnZSB0YXJnZXRlZCBieSBhbiBvdmVybGF5IHBhY2thZ2UgaXMgY2FsbGVkIHRoZSB0YXJnZXQgb3IKLW9yaWdpbmFsIHBhY2thZ2UuCi0KLVJlc291cmNlIG92ZXJsYXkgb3BlcmF0ZXMgb24gc3ltYm9saWMgcmVzb3VyY2VzIG5hbWVzLiBIZW5jZSwgdG8KLW92ZXJyaWRlIHRoZSBzdHJpbmcvc3RyMSByZXNvdXJjZXMgaW4gYSBwYWNrYWdlLCB0aGUgb3ZlcmxheSBwYWNrYWdlCi13b3VsZCBpbmNsdWRlIGEgcmVzb3VyY2UgYWxzbyBuYW1lZCBzdHJpbmcvc3RyMS4gVGhlIGVuZCB1c2VyIGRvZXMgbm90Ci1oYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBudW1lcmljIHJlc291cmNlcyBJRHMgYXNzaWduZWQgYnkgYWFwdCwgYXMgdGhpcwotaXMgcmVzb2x2ZWQgYXV0b21hdGljYWxseSBieSB0aGUgc3lzdGVtLgotCi1BcyBvZiB0aGlzIHdyaXRpbmcsIHRoZSB1c2Ugb2YgcmVzb3VyY2Ugb3ZlcmxheSBoYXMgbm90IGJlZW4gZnVsbHkKLWV4cGxvcmVkLiBVbnRpbCBpdCBoYXMsIG9ubHkgT0VNcyBhcmUgdHJ1c3RlZCB0byB1c2UgcmVzb3VyY2Ugb3ZlcmxheS4KLUZvciB0aGlzIHJlYXNvbiwgb3ZlcmxheSBwYWNrYWdlcyBtdXN0IHJlc2lkZSBpbiAvc3lzdGVtL292ZXJsYXkuCi0KLQotUmVzb3VyY2UgSUQgbWFwcGluZwotfn5+fn5+fn5+fn5+fn5+fn5+fgotUmVzb3VyY2UgaWRlbnRpZmllcnMgbXVzdCBiZSBjb2hlcmVudCB3aXRoaW4gdGhlIHNhbWUgbmFtZXNwYWNlIChpZQotUGFja2FnZUdyb3VwIGluIFJlc291cmNlVHlwZXMuY3BwKS4gQ2FsbGluZyBhcHBsaWNhdGlvbnMgd2lsbCByZWZlciB0bwotcmVzb3VyY2VzIHVzaW5nIHRoZSBJRHMgZGVmaW5lZCBpbiB0aGUgb3JpZ2luYWwgcGFja2FnZSwgYnV0IHRoZXJlIGlzIG5vCi1ndWFyYW50ZWUgYWFwdCBoYXMgYXNzaWduZWQgdGhlIHNhbWUgSUQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgaW4KLWFuIG92ZXJsYXkgcGFja2FnZS4gVG8gdHJhbnNsYXRlIGJldHdlZW4gdGhlIHR3bywgYSByZXNvdXJjZSBJRCBtYXBwaW5nCi17b3JpZ2luYWwgSUQgLT4gb3ZlcmxheSBJRH0gaXMgY3JlYXRlZCBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KLShQYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YSkgYW5kIHVzZWQgZHVyaW5nIHJlc291cmNlIGxvb2t1cC4gVGhlCi1tYXBwaW5nIGlzIHN0b3JlZCBpbiAvZGF0YS9yZXNvdXJjZS1jYWNoZSwgd2l0aCBhIEBpZG1hcCBmaWxlIG5hbWUKLXN1ZmZpeC4KLQotVGhlIGlkbWFwIGZpbGUgZm9ybWF0IGlzIGRvY3VtZW50ZWQgaW4gYSBzZXBhcmF0ZSBzZWN0aW9uLCBiZWxvdy4KLQotCi1QYWNrYWdlIG1hbmFnZW1lbnQKLX5+fn5+fn5+fn5+fn5+fn5+fgotUGFja2FnZXMgYXJlIG1hbmFnZWQgYnkgdGhlIFBhY2thZ2VNYW5hZ2VyU2VydmljZS4gQWRkaXRpb24gYW5kIHJlbW92YWwKLW9mIHBhY2thZ2VzIGFyZSBtb25pdG9yZWQgdmlhIHRoZSBpbm90aWZ5IGZyYW1ld29yaywgZXhwb3NlZCB2aWEKLWFuZHJvaWQub3MuRmlsZU9ic2VydmVyLgotCi1EdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgYSBEYWx2aWsgcHJvY2VzcywgQWN0aXZpdHlUaHJlYWQuamF2YSByZXF1ZXN0cwotdGhlIHByb2Nlc3MnIEFzc2V0TWFuYWdlciAoYnkgcHJveHksIHZpYSBBc3NldE1hbmFnZXIuamF2YSBhbmQgSk5JKQotdG8gbG9hZCBhIGxpc3Qgb2YgcGFja2FnZXMuIFRoaXMgbGlzdCBpbmNsdWRlcyBvdmVybGF5IHBhY2thZ2VzLCBpZgotcHJlc2VudC4KLQotV2hlbiBhIHRhcmdldCBwYWNrYWdlIG9yIGEgY29ycmVzcG9uZGluZyBvdmVybGF5IHBhY2thZ2UgaXMgaW5zdGFsbGVkLAotdGhlIHRhcmdldCBwYWNrYWdlJ3MgcHJvY2VzcyBpcyBzdG9wcGVkIGFuZCBhIG5ldyBpZG1hcCBpcyBnZW5lcmF0ZWQuCi1UaGlzIGlzIHNpbWlsYXIgdG8gaG93IGFwcGxpY2F0aW9ucyBhcmUgc3RvcHBlZCB3aGVuIHRoZWlyIHBhY2thZ2VzIGFyZQotdXBncmFkZWQuCi0KLQotQ3JlYXRpbmcgb3ZlcmxheSBwYWNrYWdlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1PdmVybGF5IHBhY2thZ2VzIHNob3VsZCBjb250YWluIG5vIGNvZGUsIGRlZmluZSAoc29tZSkgcmVzb3VyY2VzIHdpdGgKLXRoZSBzYW1lIHR5cGUgYW5kIG5hbWUgYXMgaW4gdGhlIG9yaWdpbmFsIHBhY2thZ2UsIGFuZCBiZSBjb21waWxlZCB3aXRoCi10aGUgLW8gZmxhZyBwYXNzZWQgdG8gYWFwdC4KLQotVGhlIGFhcHQgLW8gZmxhZyBpbnN0cnVjdHMgYWFwdCB0byBjcmVhdGUgYW4gb3ZlcmxheSBwYWNrYWdlLgotVGVjaG5pY2FsbHksIHRoaXMgbWVhbnMgdGhlIHBhY2thZ2Ugd2lsbCBiZSBhc3NpZ25lZCBwYWNrYWdlIGlkIDB4MDAuCi0KLVRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gb3ZlcmxheSBwYWNrYWdlcyBuYW1lcywgdGhvdWdoIHRoZSBuYW1pbmcKLWNvbnZlbnRpb24gPG9yaWdpbmFsLnBhY2thZ2UubmFtZT4ub3ZlcmxheS48bmFtZT4gaXMgcmVjb21tZW5kZWQuCi0KLQotRXhhbXBsZSBvdmVybGF5IHBhY2thZ2UKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLVRvIG92ZXJsYXkgdGhlIHJlc291cmNlIGJvb2wvYiBpbiBwYWNrYWdlIGNvbS5mb28uYmFyLCB0byBiZSBhcHBsaWVkCi13aGVuIHRoZSBkaXNwbGF5IGlzIGluIGxhbmRzY2FwZSBtb2RlLCBjcmVhdGUgYSBuZXcgcGFja2FnZSB3aXRoCi1ubyBzb3VyY2UgY29kZSBhbmQgYSBzaW5nbGUgLnhtbCBmaWxlIHVuZGVyIHJlcy92YWx1ZXMtbGFuZCwgd2l0aAotYW4gZW50cnkgZm9yIGJvb2wvYi4gQ29tcGlsZSB3aXRoIGFhcHQgLW8gYW5kIHBsYWNlIHRoZSByZXN1bHRzIGluCi0vc3lzdGVtL292ZXJsYXkgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgdG8gQW5kcm9pZC5tazoKLQotTE9DQUxfQUFQVF9GTEFHUyA6PSAtbyBjb20uZm9vLmJhcgotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUKS9vdmVybGF5Ci0KLQotVGhlIElEIG1hcCAoaWRtYXApIGZpbGUgZm9ybWF0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGlkbWFwIGZvcm1hdCBpcyBkZXNpZ25lZCBmb3IgbG9va3VwIHBlcmZvcm1hbmNlLiBIb3dldmVyLCBsZWFkaW5nCi1hbmQgdHJhaWxpbmcgdW5kZWZpbmVkIG92ZXJsYXkgdmFsdWVzIGFyZSBkaXNjYXJkZWQgdG8gcmVkdWNlIHRoZSBtZW1vcnkKLWZvb3RwcmludC4KLQotCi1pZG1hcCBncmFtbWFyCi1+fn5+fn5+fn5+fn5+Ci1BbGwgYXRvbXMgKG5hbWVzIGluIHNxdWFyZSBicmFja2V0cykgYXJlIHVpbnQzMl90IGludGVnZXJzLiBUaGUKLWlkbWFwLW1hZ2ljIGNvbnN0YW50IHNwZWxscyAiaWRtcCIgaW4gQVNDSUkuIE9mZnNldHMgYXJlIGdpdmVuIHJlbGF0aXZlCi10byB0aGUgZGF0YV9oZWFkZXIsIG5vdCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgotCi1tYXAgICAgICAgICAgOj0gaGVhZGVyIGRhdGEKLWhlYWRlciAgICAgICA6PSBpZG1hcC1tYWdpYyA8Y3JjMzItb3JpZ2luYWwtcGtnPiA8Y3JjMzItb3ZlcmxheS1wa2c+Ci1pZG1hcC1tYWdpYyAgOj0gPDB4NzA2ZDY0Njk+Ci1kYXRhICAgICAgICAgOj0gZGF0YV9oZWFkZXIgdHlwZV9ibG9jaysKLWRhdGFfaGVhZGVyICA6PSA8bT4gaGVhZGVyX2Jsb2Nre219Ci1oZWFkZXJfYmxvY2sgOj0gPDA+IHwgPHR5cGVfYmxvY2tfb2Zmc2V0PgotdHlwZV9ibG9jayAgIDo9IDxuPiA8aWRfb2Zmc2V0PiBlbnRyeXtufQotZW50cnkgICAgICAgIDo9IDxyZXNvdXJjZV9pZF9pbl90YXJnZXRfcGFja2FnZT4KLQotCi1pZG1hcCBleGFtcGxlCi1+fn5+fn5+fn5+fn5+Ci1HaXZlbiBhIHBhaXIgb2YgdGFyZ2V0IGFuZCBvdmVybGF5IHBhY2thZ2VzIHdpdGggQ1JDIHN1bXMgMHgyMTZhOGZlMgotYW5kIDB4NmI5YmVhZWMsIGVhY2ggZGVmaW5pbmcgdGhlIGZvbGxvd2luZyByZXNvdXJjZXMKLQotTmFtZSAgICAgICAgICBUYXJnZXQgcGFja2FnZSAgT3ZlcmxheSBwYWNrYWdlCi1zdHJpbmcvc3RyMCAgIDB4N2YwMTAwMDAgICAgICAtCi1zdHJpbmcvc3RyMSAgIDB4N2YwMTAwMDEgICAgICAweDdmMDEwMDAwCi1zdHJpbmcvc3RyMiAgIDB4N2YwMTAwMDIgICAgICAtCi1zdHJpbmcvc3RyMyAgIDB4N2YwMTAwMDMgICAgICAweDdmMDEwMDAxCi1zdHJpbmcvc3RyNCAgIDB4N2YwMTAwMDQgICAgICAtCi1ib29sL2Jvb2wwICAgIDB4N2YwMjAwMDAgICAgICAtCi1pbnRlZ2VyL2ludDAgIDB4N2YwMzAwMDAgICAgICAweDdmMDIwMDAwCi1pbnRlZ2VyL2ludDEgIDB4N2YwMzAwMDEgICAgICAtCi0KLXRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIG1hcCBpcwotCi0weDcwNmQ2NDY5IDB4MjE2YThmZTIgMHg2YjliZWFlYyAweDAwMDAwMDAzIFwKLTB4MDAwMDAwMDQgMHgwMDAwMDAwMCAweDAwMDAwMDA5IDB4MDAwMDAwMDMgXAotMHgwMDAwMDAwMSAweDdmMDEwMDAwIDB4MDAwMDAwMDAgMHg3ZjAxMDAwMSBcCi0weDAwMDAwMDAxIDB4MDAwMDAwMDAgMHg3ZjAyMDAwMAotCi1vciwgZm9ybWF0dGVkIGRpZmZlcmVudGx5Ci0KLTB4NzA2ZDY0NjkgICMgbWFnaWM6IGFsbCBpZG1hcCBmaWxlcyBiZWdpbiB3aXRoIHRoaXMgY29uc3RhbnQKLTB4MjE2YThmZTIgICMgQ1JDMzIgb2YgdGhlIHJlc291cmNlcy5hcnNjIGZpbGUgaW4gdGhlIG9yaWdpbmFsIHBhY2thZ2UKLTB4NmI5YmVhZWMgICMgQ1JDMzIgb2YgdGhlIHJlc291cmNlcy5hcnNjIGZpbGUgaW4gdGhlIG92ZXJsYXkgcGFja2FnZQotMHgwMDAwMDAwMyAgIyBoZWFkZXI7IHRocmVlIHR5cGVzIChzdHJpbmcsIGJvb2wsIGludGVnZXIpIGluIHRoZSB0YXJnZXQgcGFja2FnZQotMHgwMDAwMDAwNCAgIyAgIGhlYWRlcl9ibG9jayBmb3IgdHlwZSAwIChzdHJpbmcpIGlzIGxvY2F0ZWQgYXQgb2Zmc2V0IDQKLTB4MDAwMDAwMDAgICMgICBubyBib29sIHR5cGUgZXhpc3RzIGluIG92ZXJsYXkgcGFja2FnZSAtPiBubyBoZWFkZXJfYmxvY2sKLTB4MDAwMDAwMDkgICMgICBoZWFkZXJfYmxvY2sgZm9yIHR5cGUgMiAoaW50ZWdlcikgaXMgbG9jYXRlZCBhdCBvZmZzZXQgOQotMHgwMDAwMDAwMyAgIyBoZWFkZXJfYmxvY2sgZm9yIHN0cmluZzsgb3ZlcmxheSBJRHMgc3BhbiAzIGVsZW1lbnRzCi0weDAwMDAwMDAxICAjICAgdGhlIGZpcnN0IHN0cmluZyBpbiB0YXJnZXQgcGFja2FnZSBpcyBlbnRyeSAxID09IG9mZnNldAotMHg3ZjAxMDAwMCAgIyAgIHRhcmdldCAweDdmMDEwMDEgLT4gb3ZlcmxheSAweDdmMDEwMDAwCi0weDAwMDAwMDAwICAjICAgc3RyMiBub3QgZGVmaW5lZCBpbiBvdmVybGF5IHBhY2thZ2UKLTB4N2YwMTAwMDEgICMgICB0YXJnZXQgMHg3ZjAxMDAwMyAtPiBvdmVybGF5IDB4N2YwMTAwMDEKLTB4MDAwMDAwMDEgICMgaGVhZGVyX2Jsb2NrIGZvciBpbnRlZ2VyOyBvdmVybGF5IElEcyBzcGFuIDEgZWxlbWVudAotMHgwMDAwMDAwMCAgIyAgIG9mZnNldCA9PSAwCi0weDdmMDIwMDAwICAjICAgdGFyZ2V0IDB4N2YwMzAwMDAgLT4gb3ZlcmxheSAweDdmMDIwMDAwCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1JlZkJhc2UuY3BwIGIvbGlicy91dGlscy9SZWZCYXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwYTc5NS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1JlZkJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlJlZkJhc2UiCi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KLSNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGV4dE91dHB1dC5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0eXBlaW5mbz4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLS8vIGNvbXBpbGUgd2l0aCByZWZjb3VudGluZyBkZWJ1Z2dpbmcgZW5hYmxlZAotI2RlZmluZSBERUJVR19SRUZTICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgREVCVUdfUkVGU19GQVRBTF9TQU5JVFlfQ0hFQ0tTICAwCi0jZGVmaW5lIERFQlVHX1JFRlNfRU5BQkxFRF9CWV9ERUZBVUxUICAgMQotI2RlZmluZSBERUJVR19SRUZTX0NBTExTVEFDS19FTkFCTEVEICAgIDEKLQotLy8gbG9nIGFsbCByZWZlcmVuY2UgY291bnRpbmcgb3BlcmF0aW9ucwotI2RlZmluZSBQUklOVF9SRUZTICAgICAgICAgICAgICAgICAgICAgIDAKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2RlZmluZSBJTklUSUFMX1NUUk9OR19WQUxVRSAoMTw8MjgpCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZWZCYXNlOjp3ZWFrcmVmX2ltcGwgOiBwdWJsaWMgUmVmQmFzZTo6d2Vha3JlZl90eXBlCi17Ci1wdWJsaWM6Ci0gICAgdm9sYXRpbGUgaW50MzJfdCAgICBtU3Ryb25nOwotICAgIHZvbGF0aWxlIGludDMyX3QgICAgbVdlYWs7Ci0gICAgUmVmQmFzZSogY29uc3QgICAgICBtQmFzZTsKLSAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1GbGFnczsKLQotI2lmICFERUJVR19SRUZTCi0KLSAgICB3ZWFrcmVmX2ltcGwoUmVmQmFzZSogYmFzZSkKLSAgICAgICAgOiBtU3Ryb25nKElOSVRJQUxfU1RST05HX1ZBTFVFKQotICAgICAgICAsIG1XZWFrKDApCi0gICAgICAgICwgbUJhc2UoYmFzZSkKLSAgICAgICAgLCBtRmxhZ3MoMCkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRTdHJvbmdSZWYoY29uc3Qgdm9pZCogLyppZCovKSB7IH0KLSAgICB2b2lkIHJlbW92ZVN0cm9uZ1JlZihjb25zdCB2b2lkKiAvKmlkKi8pIHsgfQotICAgIHZvaWQgcmVuYW1lU3Ryb25nUmVmSWQoY29uc3Qgdm9pZCogLypvbGRfaWQqLywgY29uc3Qgdm9pZCogLypuZXdfaWQqLykgeyB9Ci0gICAgdm9pZCBhZGRXZWFrUmVmKGNvbnN0IHZvaWQqIC8qaWQqLykgeyB9Ci0gICAgdm9pZCByZW1vdmVXZWFrUmVmKGNvbnN0IHZvaWQqIC8qaWQqLykgeyB9Ci0gICAgdm9pZCByZW5hbWVXZWFrUmVmSWQoY29uc3Qgdm9pZCogLypvbGRfaWQqLywgY29uc3Qgdm9pZCogLypuZXdfaWQqLykgeyB9Ci0gICAgdm9pZCBwcmludFJlZnMoKSBjb25zdCB7IH0KLSAgICB2b2lkIHRyYWNrTWUoYm9vbCwgYm9vbCkgeyB9Ci0KLSNlbHNlCi0KLSAgICB3ZWFrcmVmX2ltcGwoUmVmQmFzZSogYmFzZSkKLSAgICAgICAgOiBtU3Ryb25nKElOSVRJQUxfU1RST05HX1ZBTFVFKQotICAgICAgICAsIG1XZWFrKDApCi0gICAgICAgICwgbUJhc2UoYmFzZSkKLSAgICAgICAgLCBtRmxhZ3MoMCkKLSAgICAgICAgLCBtU3Ryb25nUmVmcyhOVUxMKQotICAgICAgICAsIG1XZWFrUmVmcyhOVUxMKQotICAgICAgICAsIG1UcmFja0VuYWJsZWQoISFERUJVR19SRUZTX0VOQUJMRURfQllfREVGQVVMVCkKLSAgICAgICAgLCBtUmV0YWluKGZhbHNlKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgfndlYWtyZWZfaW1wbCgpCi0gICAgewotICAgICAgICBib29sIGR1bXBTdGFjayA9IGZhbHNlOwotICAgICAgICBpZiAoIW1SZXRhaW4gJiYgbVN0cm9uZ1JlZnMgIT0gTlVMTCkgewotICAgICAgICAgICAgZHVtcFN0YWNrID0gdHJ1ZTsKLSNpZiBERUJVR19SRUZTX0ZBVEFMX1NBTklUWV9DSEVDS1MKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlN0cm9uZyByZWZlcmVuY2VzIHJlbWFpbiEiKTsKLSNlbHNlCi0gICAgICAgICAgICBBTE9HRSgiU3Ryb25nIHJlZmVyZW5jZXMgcmVtYWluOiIpOwotI2VuZGlmCi0gICAgICAgICAgICByZWZfZW50cnkqIHJlZnMgPSBtU3Ryb25nUmVmczsKLSAgICAgICAgICAgIHdoaWxlIChyZWZzKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBpbmMgPSByZWZzLT5yZWYgPj0gMCA/ICcrJyA6ICctJzsKLSAgICAgICAgICAgICAgICBBTE9HRCgiXHQlYyBJRCAlcCAocmVmICVkKToiLCBpbmMsIHJlZnMtPmlkLCByZWZzLT5yZWYpOwotI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQKLSAgICAgICAgICAgICAgICByZWZzLT5zdGFjay5kdW1wKCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICByZWZzID0gcmVmcy0+bmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbVJldGFpbiAmJiBtV2Vha1JlZnMgIT0gTlVMTCkgewotICAgICAgICAgICAgZHVtcFN0YWNrID0gdHJ1ZTsKLSNpZiBERUJVR19SRUZTX0ZBVEFMX1NBTklUWV9DSEVDS1MKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIldlYWsgcmVmZXJlbmNlcyByZW1haW46Iik7Ci0jZWxzZQotICAgICAgICAgICAgQUxPR0UoIldlYWsgcmVmZXJlbmNlcyByZW1haW4hIik7Ci0jZW5kaWYKLSAgICAgICAgICAgIHJlZl9lbnRyeSogcmVmcyA9IG1XZWFrUmVmczsKLSAgICAgICAgICAgIHdoaWxlIChyZWZzKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBpbmMgPSByZWZzLT5yZWYgPj0gMCA/ICcrJyA6ICctJzsKLSAgICAgICAgICAgICAgICBBTE9HRCgiXHQlYyBJRCAlcCAocmVmICVkKToiLCBpbmMsIHJlZnMtPmlkLCByZWZzLT5yZWYpOwotI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQKLSAgICAgICAgICAgICAgICByZWZzLT5zdGFjay5kdW1wKCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICByZWZzID0gcmVmcy0+bmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZHVtcFN0YWNrKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWJvdmUgZXJyb3JzIGF0OiIpOwotICAgICAgICAgICAgQ2FsbFN0YWNrIHN0YWNrOwotICAgICAgICAgICAgc3RhY2sudXBkYXRlKCk7Ci0gICAgICAgICAgICBzdGFjay5kdW1wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGFkZFN0cm9uZ1JlZihjb25zdCB2b2lkKiBpZCkgewotICAgICAgICAvL0FMT0dEX0lGKG1UcmFja0VuYWJsZWQsCi0gICAgICAgIC8vICAgICAgICAiYWRkU3Ryb25nUmVmOiBSZWZCYXNlPSVwLCBpZD0lcCIsIG1CYXNlLCBpZCk7Ci0gICAgICAgIGFkZFJlZigmbVN0cm9uZ1JlZnMsIGlkLCBtU3Ryb25nKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlbW92ZVN0cm9uZ1JlZihjb25zdCB2b2lkKiBpZCkgewotICAgICAgICAvL0FMT0dEX0lGKG1UcmFja0VuYWJsZWQsCi0gICAgICAgIC8vICAgICAgICAicmVtb3ZlU3Ryb25nUmVmOiBSZWZCYXNlPSVwLCBpZD0lcCIsIG1CYXNlLCBpZCk7Ci0gICAgICAgIGlmICghbVJldGFpbikgewotICAgICAgICAgICAgcmVtb3ZlUmVmKCZtU3Ryb25nUmVmcywgaWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkUmVmKCZtU3Ryb25nUmVmcywgaWQsIC1tU3Ryb25nKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcmVuYW1lU3Ryb25nUmVmSWQoY29uc3Qgdm9pZCogb2xkX2lkLCBjb25zdCB2b2lkKiBuZXdfaWQpIHsKLSAgICAgICAgLy9BTE9HRF9JRihtVHJhY2tFbmFibGVkLAotICAgICAgICAvLyAgICAgICAgInJlbmFtZVN0cm9uZ1JlZklkOiBSZWZCYXNlPSVwLCBvaWQ9JXAsIG5pZD0lcCIsCi0gICAgICAgIC8vICAgICAgICBtQmFzZSwgb2xkX2lkLCBuZXdfaWQpOwotICAgICAgICByZW5hbWVSZWZzSWQobVN0cm9uZ1JlZnMsIG9sZF9pZCwgbmV3X2lkKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFdlYWtSZWYoY29uc3Qgdm9pZCogaWQpIHsKLSAgICAgICAgYWRkUmVmKCZtV2Vha1JlZnMsIGlkLCBtV2Vhayk7Ci0gICAgfQotCi0gICAgdm9pZCByZW1vdmVXZWFrUmVmKGNvbnN0IHZvaWQqIGlkKSB7Ci0gICAgICAgIGlmICghbVJldGFpbikgewotICAgICAgICAgICAgcmVtb3ZlUmVmKCZtV2Vha1JlZnMsIGlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZFJlZigmbVdlYWtSZWZzLCBpZCwgLW1XZWFrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcmVuYW1lV2Vha1JlZklkKGNvbnN0IHZvaWQqIG9sZF9pZCwgY29uc3Qgdm9pZCogbmV3X2lkKSB7Ci0gICAgICAgIHJlbmFtZVJlZnNJZChtV2Vha1JlZnMsIG9sZF9pZCwgbmV3X2lkKTsKLSAgICB9Ci0KLSAgICB2b2lkIHRyYWNrTWUoYm9vbCB0cmFjaywgYm9vbCByZXRhaW4pCi0gICAgeyAKLSAgICAgICAgbVRyYWNrRW5hYmxlZCA9IHRyYWNrOwotICAgICAgICBtUmV0YWluID0gcmV0YWluOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRSZWZzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFN0cmluZzggdGV4dDsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICAgICAgICAgIGNoYXIgYnVmWzEyOF07Ci0gICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIlN0cm9uZyByZWZlcmVuY2VzIG9uIFJlZkJhc2UgJXAgKHdlYWtyZWZfdHlwZSAlcCk6XG4iLCBtQmFzZSwgdGhpcyk7Ci0gICAgICAgICAgICB0ZXh0LmFwcGVuZChidWYpOwotICAgICAgICAgICAgcHJpbnRSZWZzTG9ja2VkKCZ0ZXh0LCBtU3Ryb25nUmVmcyk7Ci0gICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIldlYWsgcmVmZXJlbmNlcyBvbiBSZWZCYXNlICVwICh3ZWFrcmVmX3R5cGUgJXApOlxuIiwgbUJhc2UsIHRoaXMpOwotICAgICAgICAgICAgdGV4dC5hcHBlbmQoYnVmKTsKLSAgICAgICAgICAgIHByaW50UmVmc0xvY2tlZCgmdGV4dCwgbVdlYWtSZWZzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgbmFtZVsxMDBdOwotICAgICAgICAgICAgc25wcmludGYobmFtZSwgMTAwLCAiL2RhdGEvJXAuc3RhY2siLCB0aGlzKTsKLSAgICAgICAgICAgIGludCByYyA9IG9wZW4obmFtZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fQVBQRU5EKTsKLSAgICAgICAgICAgIGlmIChyYyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGUocmMsIHRleHQuc3RyaW5nKCksIHRleHQubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGNsb3NlKHJjKTsKLSAgICAgICAgICAgICAgICBBTE9HRCgiU1RBQ0sgVFJBQ0UgZm9yICVwIHNhdmVkIGluICVzIiwgdGhpcywgbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIEFMT0dFKCJGQUlMRUQgVE8gUFJJTlQgU1RBQ0sgVFJBQ0UgZm9yICVwIGluICVzOiAlcyIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgfQotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgcmVmX2VudHJ5Ci0gICAgewotICAgICAgICByZWZfZW50cnkqIG5leHQ7Ci0gICAgICAgIGNvbnN0IHZvaWQqIGlkOwotI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQKLSAgICAgICAgQ2FsbFN0YWNrIHN0YWNrOwotI2VuZGlmCi0gICAgICAgIGludDMyX3QgcmVmOwotICAgIH07Ci0KLSAgICB2b2lkIGFkZFJlZihyZWZfZW50cnkqKiByZWZzLCBjb25zdCB2b2lkKiBpZCwgaW50MzJfdCBtUmVmKQotICAgIHsKLSAgICAgICAgaWYgKG1UcmFja0VuYWJsZWQpIHsKLSAgICAgICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotCi0gICAgICAgICAgICByZWZfZW50cnkqIHJlZiA9IG5ldyByZWZfZW50cnk7Ci0gICAgICAgICAgICAvLyBSZWZlcmVuY2UgY291bnQgYXQgdGhlIHRpbWUgb2YgdGhlIHNuYXBzaG90LCBidXQgYmVmb3JlIHRoZQotICAgICAgICAgICAgLy8gdXBkYXRlLiAgUG9zaXRpdmUgdmFsdWUgbWVhbnMgd2UgaW5jcmVtZW50LCBuZWdhdGl2ZS0td2UKLSAgICAgICAgICAgIC8vIGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50LgotICAgICAgICAgICAgcmVmLT5yZWYgPSBtUmVmOwotICAgICAgICAgICAgcmVmLT5pZCA9IGlkOwotI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQKLSAgICAgICAgICAgIHJlZi0+c3RhY2sudXBkYXRlKDIpOwotI2VuZGlmCi0gICAgICAgICAgICByZWYtPm5leHQgPSAqcmVmczsKLSAgICAgICAgICAgICpyZWZzID0gcmVmOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCByZW1vdmVSZWYocmVmX2VudHJ5KiogcmVmcywgY29uc3Qgdm9pZCogaWQpCi0gICAgewotICAgICAgICBpZiAobVRyYWNrRW5hYmxlZCkgewotICAgICAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJlZl9lbnRyeSogY29uc3QgaGVhZCA9ICpyZWZzOwotICAgICAgICAgICAgcmVmX2VudHJ5KiByZWYgPSBoZWFkOwotICAgICAgICAgICAgd2hpbGUgKHJlZiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZi0+aWQgPT0gaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgKnJlZnMgPSByZWYtPm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZWY7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVmcyA9ICZyZWYtPm5leHQ7Ci0gICAgICAgICAgICAgICAgcmVmID0gKnJlZnM7Ci0gICAgICAgICAgICB9Ci0KLSNpZiBERUJVR19SRUZTX0ZBVEFMX1NBTklUWV9DSEVDS1MKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlJlZkJhc2U6IHJlbW92aW5nIGlkICVwIG9uIFJlZkJhc2UgJXAiCi0gICAgICAgICAgICAgICAgICAgICIod2Vha3JlZl90eXBlICVwKSB0aGF0IGRvZXNuJ3QgZXhpc3QhIiwKLSAgICAgICAgICAgICAgICAgICAgaWQsIG1CYXNlLCB0aGlzKTsKLSNlbmRpZgotCi0gICAgICAgICAgICBBTE9HRSgiUmVmQmFzZTogcmVtb3ZpbmcgaWQgJXAgb24gUmVmQmFzZSAlcCIKLSAgICAgICAgICAgICAgICAgICAgIih3ZWFrcmVmX3R5cGUgJXApIHRoYXQgZG9lc24ndCBleGlzdCEiLAotICAgICAgICAgICAgICAgICAgICBpZCwgbUJhc2UsIHRoaXMpOwotCi0gICAgICAgICAgICByZWYgPSBoZWFkOwotICAgICAgICAgICAgd2hpbGUgKHJlZikgewotICAgICAgICAgICAgICAgIGNoYXIgaW5jID0gcmVmLT5yZWYgPj0gMCA/ICcrJyA6ICctJzsKLSAgICAgICAgICAgICAgICBBTE9HRCgiXHQlYyBJRCAlcCAocmVmICVkKToiLCBpbmMsIHJlZi0+aWQsIHJlZi0+cmVmKTsKLSAgICAgICAgICAgICAgICByZWYgPSByZWYtPm5leHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENhbGxTdGFjayBzdGFjazsKLSAgICAgICAgICAgIHN0YWNrLnVwZGF0ZSgpOwotICAgICAgICAgICAgc3RhY2suZHVtcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCByZW5hbWVSZWZzSWQocmVmX2VudHJ5KiByLCBjb25zdCB2b2lkKiBvbGRfaWQsIGNvbnN0IHZvaWQqIG5ld19pZCkKLSAgICB7Ci0gICAgICAgIGlmIChtVHJhY2tFbmFibGVkKSB7Ci0gICAgICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICAgICAgICAgIHJlZl9lbnRyeSogcmVmID0gcjsKLSAgICAgICAgICAgIHdoaWxlIChyZWYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChyZWYtPmlkID09IG9sZF9pZCkgewotICAgICAgICAgICAgICAgICAgICByZWYtPmlkID0gbmV3X2lkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWYgPSByZWYtPm5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50UmVmc0xvY2tlZChTdHJpbmc4KiBvdXQsIGNvbnN0IHJlZl9lbnRyeSogcmVmcykgY29uc3QKLSAgICB7Ci0gICAgICAgIGNoYXIgYnVmWzEyOF07Ci0gICAgICAgIHdoaWxlIChyZWZzKSB7Ci0gICAgICAgICAgICBjaGFyIGluYyA9IHJlZnMtPnJlZiA+PSAwID8gJysnIDogJy0nOwotICAgICAgICAgICAgc3ByaW50ZihidWYsICJcdCVjIElEICVwIChyZWYgJWQpOlxuIiwgCi0gICAgICAgICAgICAgICAgICAgIGluYywgcmVmcy0+aWQsIHJlZnMtPnJlZik7Ci0gICAgICAgICAgICBvdXQtPmFwcGVuZChidWYpOwotI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQKLSAgICAgICAgICAgIG91dC0+YXBwZW5kKHJlZnMtPnN0YWNrLnRvU3RyaW5nKCJcdFx0IikpOwotI2Vsc2UKLSAgICAgICAgICAgIG91dC0+YXBwZW5kKCJcdFx0KGNhbGwgc3RhY2tzIGRpc2FibGVkKSIpOwotI2VuZGlmCi0gICAgICAgICAgICByZWZzID0gcmVmcy0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG11dGFibGUgTXV0ZXggbU11dGV4OwotICAgIHJlZl9lbnRyeSogbVN0cm9uZ1JlZnM7Ci0gICAgcmVmX2VudHJ5KiBtV2Vha1JlZnM7Ci0KLSAgICBib29sIG1UcmFja0VuYWJsZWQ7Ci0gICAgLy8gQ29sbGVjdCBzdGFjayB0cmFjZXMgb24gYWRkcmVmIGFuZCByZW1vdmVyZWYsIGluc3RlYWQgb2YgZGVsZXRpbmcgdGhlIHN0YWNrIHJlZmVyZW5jZXMKLSAgICAvLyBvbiByZW1vdmVyZWYgdGhhdCBtYXRjaCB0aGUgYWRkcmVzcyBvbmVzLgotICAgIGJvb2wgbVJldGFpbjsKLQotI2VuZGlmCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBSZWZCYXNlOjppbmNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0Ci17Ci0gICAgd2Vha3JlZl9pbXBsKiBjb25zdCByZWZzID0gbVJlZnM7Ci0gICAgcmVmcy0+aW5jV2VhayhpZCk7Ci0gICAgCi0gICAgcmVmcy0+YWRkU3Ryb25nUmVmKGlkKTsKLSAgICBjb25zdCBpbnQzMl90IGMgPSBhbmRyb2lkX2F0b21pY19pbmMoJnJlZnMtPm1TdHJvbmcpOwotICAgIEFMT0dfQVNTRVJUKGMgPiAwLCAiaW5jU3Ryb25nKCkgY2FsbGVkIG9uICVwIGFmdGVyIGxhc3Qgc3Ryb25nIHJlZiIsIHJlZnMpOwotI2lmIFBSSU5UX1JFRlMKLSAgICBBTE9HRCgiaW5jU3Ryb25nIG9mICVwIGZyb20gJXA6IGNudD0lZFxuIiwgdGhpcywgaWQsIGMpOwotI2VuZGlmCi0gICAgaWYgKGMgIT0gSU5JVElBTF9TVFJPTkdfVkFMVUUpICB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhbmRyb2lkX2F0b21pY19hZGQoLUlOSVRJQUxfU1RST05HX1ZBTFVFLCAmcmVmcy0+bVN0cm9uZyk7Ci0gICAgcmVmcy0+bUJhc2UtPm9uRmlyc3RSZWYoKTsKLX0KLQotdm9pZCBSZWZCYXNlOjpkZWNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0Ci17Ci0gICAgd2Vha3JlZl9pbXBsKiBjb25zdCByZWZzID0gbVJlZnM7Ci0gICAgcmVmcy0+cmVtb3ZlU3Ryb25nUmVmKGlkKTsKLSAgICBjb25zdCBpbnQzMl90IGMgPSBhbmRyb2lkX2F0b21pY19kZWMoJnJlZnMtPm1TdHJvbmcpOwotI2lmIFBSSU5UX1JFRlMKLSAgICBBTE9HRCgiZGVjU3Ryb25nIG9mICVwIGZyb20gJXA6IGNudD0lZFxuIiwgdGhpcywgaWQsIGMpOwotI2VuZGlmCi0gICAgQUxPR19BU1NFUlQoYyA+PSAxLCAiZGVjU3Ryb25nKCkgY2FsbGVkIG9uICVwIHRvbyBtYW55IHRpbWVzIiwgcmVmcyk7Ci0gICAgaWYgKGMgPT0gMSkgewotICAgICAgICByZWZzLT5tQmFzZS0+b25MYXN0U3Ryb25nUmVmKGlkKTsKLSAgICAgICAgaWYgKChyZWZzLT5tRmxhZ3MmT0JKRUNUX0xJRkVUSU1FX01BU0spID09IE9CSkVDVF9MSUZFVElNRV9TVFJPTkcpIHsKLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJlZnMtPmRlY1dlYWsoaWQpOwotfQotCi12b2lkIFJlZkJhc2U6OmZvcmNlSW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdAotewotICAgIHdlYWtyZWZfaW1wbCogY29uc3QgcmVmcyA9IG1SZWZzOwotICAgIHJlZnMtPmluY1dlYWsoaWQpOwotICAgIAotICAgIHJlZnMtPmFkZFN0cm9uZ1JlZihpZCk7Ci0gICAgY29uc3QgaW50MzJfdCBjID0gYW5kcm9pZF9hdG9taWNfaW5jKCZyZWZzLT5tU3Ryb25nKTsKLSAgICBBTE9HX0FTU0VSVChjID49IDAsICJmb3JjZUluY1N0cm9uZyBjYWxsZWQgb24gJXAgYWZ0ZXIgcmVmIGNvdW50IHVuZGVyZmxvdyIsCi0gICAgICAgICAgICAgICByZWZzKTsKLSNpZiBQUklOVF9SRUZTCi0gICAgQUxPR0QoImZvcmNlSW5jU3Ryb25nIG9mICVwIGZyb20gJXA6IGNudD0lZFxuIiwgdGhpcywgaWQsIGMpOwotI2VuZGlmCi0KLSAgICBzd2l0Y2ggKGMpIHsKLSAgICBjYXNlIElOSVRJQUxfU1RST05HX1ZBTFVFOgotICAgICAgICBhbmRyb2lkX2F0b21pY19hZGQoLUlOSVRJQUxfU1RST05HX1ZBTFVFLCAmcmVmcy0+bVN0cm9uZyk7Ci0gICAgICAgIC8vIGZhbGwgdGhyb3VnaC4uLgotICAgIGNhc2UgMDoKLSAgICAgICAgcmVmcy0+bUJhc2UtPm9uRmlyc3RSZWYoKTsKLSAgICB9Ci19Ci0KLWludDMyX3QgUmVmQmFzZTo6Z2V0U3Ryb25nQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiBtUmVmcy0+bVN0cm9uZzsKLX0KLQotUmVmQmFzZSogUmVmQmFzZTo6d2Vha3JlZl90eXBlOjpyZWZCYXNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3Qgd2Vha3JlZl9pbXBsKj4odGhpcyktPm1CYXNlOwotfQotCi12b2lkIFJlZkJhc2U6OndlYWtyZWZfdHlwZTo6aW5jV2Vhayhjb25zdCB2b2lkKiBpZCkKLXsKLSAgICB3ZWFrcmVmX2ltcGwqIGNvbnN0IGltcGwgPSBzdGF0aWNfY2FzdDx3ZWFrcmVmX2ltcGwqPih0aGlzKTsKLSAgICBpbXBsLT5hZGRXZWFrUmVmKGlkKTsKLSAgICBjb25zdCBpbnQzMl90IGMgPSBhbmRyb2lkX2F0b21pY19pbmMoJmltcGwtPm1XZWFrKTsKLSAgICBBTE9HX0FTU0VSVChjID49IDAsICJpbmNXZWFrIGNhbGxlZCBvbiAlcCBhZnRlciBsYXN0IHdlYWsgcmVmIiwgdGhpcyk7Ci19Ci0KLQotdm9pZCBSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OmRlY1dlYWsoY29uc3Qgdm9pZCogaWQpCi17Ci0gICAgd2Vha3JlZl9pbXBsKiBjb25zdCBpbXBsID0gc3RhdGljX2Nhc3Q8d2Vha3JlZl9pbXBsKj4odGhpcyk7Ci0gICAgaW1wbC0+cmVtb3ZlV2Vha1JlZihpZCk7Ci0gICAgY29uc3QgaW50MzJfdCBjID0gYW5kcm9pZF9hdG9taWNfZGVjKCZpbXBsLT5tV2Vhayk7Ci0gICAgQUxPR19BU1NFUlQoYyA+PSAxLCAiZGVjV2VhayBjYWxsZWQgb24gJXAgdG9vIG1hbnkgdGltZXMiLCB0aGlzKTsKLSAgICBpZiAoYyAhPSAxKSByZXR1cm47Ci0KLSAgICBpZiAoKGltcGwtPm1GbGFncyZPQkpFQ1RfTElGRVRJTUVfV0VBSykgPT0gT0JKRUNUX0xJRkVUSU1FX1NUUk9ORykgewotICAgICAgICAvLyBUaGlzIGlzIHRoZSByZWd1bGFyIGxpZmV0aW1lIGNhc2UuIFRoZSBvYmplY3QgaXMgZGVzdHJveWVkCi0gICAgICAgIC8vIHdoZW4gdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBnb2VzIGF3YXkuIFNpbmNlIHdlYWtyZWZfaW1wbAotICAgICAgICAvLyBvdXRsaXZlIHRoZSBvYmplY3QsIGl0IGlzIG5vdCBkZXN0cm95ZWQgaW4gdGhlIGR0b3IsIGFuZAotICAgICAgICAvLyB3ZSdsbCBoYXZlIHRvIGRvIGl0IGhlcmUuCi0gICAgICAgIGlmIChpbXBsLT5tU3Ryb25nID09IElOSVRJQUxfU1RST05HX1ZBTFVFKSB7Ci0gICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IHdlIG5ldmVyIGhhZCBhIHN0cm9uZyByZWZlcmVuY2UsIHNvIHdlIG5lZWQgdG8KLSAgICAgICAgICAgIC8vIGRlc3Ryb3kgdGhlIG9iamVjdCBub3cuCi0gICAgICAgICAgICBkZWxldGUgaW1wbC0+bUJhc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBBTE9HVigiRnJlZWluZyByZWZzICVwIG9mIG9sZCBSZWZCYXNlICVwXG4iLCB0aGlzLCBpbXBsLT5tQmFzZSk7Ci0gICAgICAgICAgICBkZWxldGUgaW1wbDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGxlc3MgY29tbW9uIGNhc2U6IGxpZmV0aW1lIGlzIE9CSkVDVF9MSUZFVElNRV97V0VBS3xGT1JFVkVSfQotICAgICAgICBpbXBsLT5tQmFzZS0+b25MYXN0V2Vha1JlZihpZCk7Ci0gICAgICAgIGlmICgoaW1wbC0+bUZsYWdzJk9CSkVDVF9MSUZFVElNRV9NQVNLKSA9PSBPQkpFQ1RfTElGRVRJTUVfV0VBSykgewotICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgT0JKRUNUX0xJRkVUSU1FX1dFQUsgY2FzZS4gVGhlIGxhc3Qgd2Vhay1yZWZlcmVuY2UKLSAgICAgICAgICAgIC8vIGlzIGdvbmUsIHdlIGNhbiBkZXN0cm95IHRoZSBvYmplY3QuCi0gICAgICAgICAgICBkZWxldGUgaW1wbC0+bUJhc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWJvb2wgUmVmQmFzZTo6d2Vha3JlZl90eXBlOjphdHRlbXB0SW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKQotewotICAgIGluY1dlYWsoaWQpOwotICAgIAotICAgIHdlYWtyZWZfaW1wbCogY29uc3QgaW1wbCA9IHN0YXRpY19jYXN0PHdlYWtyZWZfaW1wbCo+KHRoaXMpOwotICAgIAotICAgIGludDMyX3QgY3VyQ291bnQgPSBpbXBsLT5tU3Ryb25nOwotICAgIEFMT0dfQVNTRVJUKGN1ckNvdW50ID49IDAsICJhdHRlbXB0SW5jU3Ryb25nIGNhbGxlZCBvbiAlcCBhZnRlciB1bmRlcmZsb3ciLAotICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgd2hpbGUgKGN1ckNvdW50ID4gMCAmJiBjdXJDb3VudCAhPSBJTklUSUFMX1NUUk9OR19WQUxVRSkgewotICAgICAgICBpZiAoYW5kcm9pZF9hdG9taWNfY21weGNoZyhjdXJDb3VudCwgY3VyQ291bnQrMSwgJmltcGwtPm1TdHJvbmcpID09IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGN1ckNvdW50ID0gaW1wbC0+bVN0cm9uZzsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGN1ckNvdW50IDw9IDAgfHwgY3VyQ291bnQgPT0gSU5JVElBTF9TVFJPTkdfVkFMVUUpIHsKLSAgICAgICAgYm9vbCBhbGxvdzsKLSAgICAgICAgaWYgKGN1ckNvdW50ID09IElOSVRJQUxfU1RST05HX1ZBTFVFKSB7Ci0gICAgICAgICAgICAvLyBBdHRlbXB0aW5nIHRvIGFjcXVpcmUgZmlyc3Qgc3Ryb25nIHJlZmVyZW5jZS4uLiAgdGhpcyBpcyBhbGxvd2VkCi0gICAgICAgICAgICAvLyBpZiB0aGUgb2JqZWN0IGRvZXMgTk9UIGhhdmUgYSBsb25nZXIgbGlmZXRpbWUgKG1lYW5pbmcgdGhlCi0gICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IG5lZWQgdG8gc2VlIHRoaXMpLCBvciBpZiB0aGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIC8vIGFsbG93cyBpdCB0byBoYXBwZW4uCi0gICAgICAgICAgICBhbGxvdyA9IChpbXBsLT5tRmxhZ3MmT0JKRUNUX0xJRkVUSU1FX1dFQUspICE9IE9CSkVDVF9MSUZFVElNRV9XRUFLCi0gICAgICAgICAgICAgICAgICB8fCBpbXBsLT5tQmFzZS0+b25JbmNTdHJvbmdBdHRlbXB0ZWQoRklSU1RfSU5DX1NUUk9ORywgaWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQXR0ZW1wdGluZyB0byByZXZpdmUgdGhlIG9iamVjdC4uLiAgdGhpcyBpcyBhbGxvd2VkCi0gICAgICAgICAgICAvLyBpZiB0aGUgb2JqZWN0IERPRVMgaGF2ZSBhIGxvbmdlciBsaWZldGltZSAoc28gd2UgY2FuIHNhZmVseQotICAgICAgICAgICAgLy8gY2FsbCB0aGUgb2JqZWN0IHdpdGggb25seSBhIHdlYWsgcmVmKSBhbmQgdGhlIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAvLyBhbGxvd3MgaXQgdG8gaGFwcGVuLgotICAgICAgICAgICAgYWxsb3cgPSAoaW1wbC0+bUZsYWdzJk9CSkVDVF9MSUZFVElNRV9XRUFLKSA9PSBPQkpFQ1RfTElGRVRJTUVfV0VBSwotICAgICAgICAgICAgICAgICAgJiYgaW1wbC0+bUJhc2UtPm9uSW5jU3Ryb25nQXR0ZW1wdGVkKEZJUlNUX0lOQ19TVFJPTkcsIGlkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWFsbG93KSB7Ci0gICAgICAgICAgICBkZWNXZWFrKGlkKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjdXJDb3VudCA9IGFuZHJvaWRfYXRvbWljX2luYygmaW1wbC0+bVN0cm9uZyk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHN0cm9uZyByZWZlcmVuY2UgY291bnQgaGFzIGFscmVhZHkgYmVlbiBpbmNyZW1lbnRlZCBieQotICAgICAgICAvLyBzb21lb25lIGVsc2UsIHRoZSBpbXBsZW1lbnRvciBvZiBvbkluY1N0cm9uZ0F0dGVtcHRlZCgpIGlzIGhvbGRpbmcKLSAgICAgICAgLy8gYW4gdW5uZWVkZWQgcmVmZXJlbmNlLiAgU28gY2FsbCBvbkxhc3RTdHJvbmdSZWYoKSBoZXJlIHRvIHJlbW92ZSBpdC4KLSAgICAgICAgLy8gKE5vLCB0aGlzIGlzIG5vdCBwcmV0dHkuKSAgTm90ZSB0aGF0IHdlIE1VU1QgTk9UIGRvIHRoaXMgaWYgd2UKLSAgICAgICAgLy8gYXJlIGluIGZhY3QgYWNxdWlyaW5nIHRoZSBmaXJzdCByZWZlcmVuY2UuCi0gICAgICAgIGlmIChjdXJDb3VudCA+IDAgJiYgY3VyQ291bnQgPCBJTklUSUFMX1NUUk9OR19WQUxVRSkgewotICAgICAgICAgICAgaW1wbC0+bUJhc2UtPm9uTGFzdFN0cm9uZ1JlZihpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaW1wbC0+YWRkU3Ryb25nUmVmKGlkKTsKLQotI2lmIFBSSU5UX1JFRlMKLSAgICBBTE9HRCgiYXR0ZW1wdEluY1N0cm9uZyBvZiAlcCBmcm9tICVwOiBjbnQ9JWRcbiIsIHRoaXMsIGlkLCBjdXJDb3VudCk7Ci0jZW5kaWYKLQotICAgIGlmIChjdXJDb3VudCA9PSBJTklUSUFMX1NUUk9OR19WQUxVRSkgewotICAgICAgICBhbmRyb2lkX2F0b21pY19hZGQoLUlOSVRJQUxfU1RST05HX1ZBTFVFLCAmaW1wbC0+bVN0cm9uZyk7Ci0gICAgICAgIGltcGwtPm1CYXNlLT5vbkZpcnN0UmVmKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFJlZkJhc2U6OndlYWtyZWZfdHlwZTo6YXR0ZW1wdEluY1dlYWsoY29uc3Qgdm9pZCogaWQpCi17Ci0gICAgd2Vha3JlZl9pbXBsKiBjb25zdCBpbXBsID0gc3RhdGljX2Nhc3Q8d2Vha3JlZl9pbXBsKj4odGhpcyk7Ci0KLSAgICBpbnQzMl90IGN1ckNvdW50ID0gaW1wbC0+bVdlYWs7Ci0gICAgQUxPR19BU1NFUlQoY3VyQ291bnQgPj0gMCwgImF0dGVtcHRJbmNXZWFrIGNhbGxlZCBvbiAlcCBhZnRlciB1bmRlcmZsb3ciLAotICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgd2hpbGUgKGN1ckNvdW50ID4gMCkgewotICAgICAgICBpZiAoYW5kcm9pZF9hdG9taWNfY21weGNoZyhjdXJDb3VudCwgY3VyQ291bnQrMSwgJmltcGwtPm1XZWFrKSA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXJDb3VudCA9IGltcGwtPm1XZWFrOwotICAgIH0KLQotICAgIGlmIChjdXJDb3VudCA+IDApIHsKLSAgICAgICAgaW1wbC0+YWRkV2Vha1JlZihpZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGN1ckNvdW50ID4gMDsKLX0KLQotaW50MzJfdCBSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OmdldFdlYWtDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IHdlYWtyZWZfaW1wbCo+KHRoaXMpLT5tV2VhazsKLX0KLQotdm9pZCBSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OnByaW50UmVmcygpIGNvbnN0Ci17Ci0gICAgc3RhdGljX2Nhc3Q8Y29uc3Qgd2Vha3JlZl9pbXBsKj4odGhpcyktPnByaW50UmVmcygpOwotfQotCi12b2lkIFJlZkJhc2U6OndlYWtyZWZfdHlwZTo6dHJhY2tNZShib29sIGVuYWJsZSwgYm9vbCByZXRhaW4pCi17Ci0gICAgc3RhdGljX2Nhc3Q8d2Vha3JlZl9pbXBsKj4odGhpcyktPnRyYWNrTWUoZW5hYmxlLCByZXRhaW4pOwotfQotCi1SZWZCYXNlOjp3ZWFrcmVmX3R5cGUqIFJlZkJhc2U6OmNyZWF0ZVdlYWsoY29uc3Qgdm9pZCogaWQpIGNvbnN0Ci17Ci0gICAgbVJlZnMtPmluY1dlYWsoaWQpOwotICAgIHJldHVybiBtUmVmczsKLX0KLQotUmVmQmFzZTo6d2Vha3JlZl90eXBlKiBSZWZCYXNlOjpnZXRXZWFrUmVmcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1SZWZzOwotfQotCi1SZWZCYXNlOjpSZWZCYXNlKCkKLSAgICA6IG1SZWZzKG5ldyB3ZWFrcmVmX2ltcGwodGhpcykpCi17Ci19Ci0KLVJlZkJhc2U6On5SZWZCYXNlKCkKLXsKLSAgICBpZiAobVJlZnMtPm1TdHJvbmcgPT0gSU5JVElBTF9TVFJPTkdfVkFMVUUpIHsKLSAgICAgICAgLy8gd2UgbmV2ZXIgYWNxdWlyZWQgYSBzdHJvbmcgKGFuZC9vciB3ZWFrKSByZWZlcmVuY2Ugb24gdGhpcyBvYmplY3QuCi0gICAgICAgIGRlbGV0ZSBtUmVmczsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBsaWZlLXRpbWUgb2YgdGhpcyBvYmplY3QgaXMgZXh0ZW5kZWQgdG8gV0VBSyBvciBGT1JFVkVSLCBpbgotICAgICAgICAvLyB3aGljaCBjYXNlIHdlYWtyZWZfaW1wbCBkb2Vzbid0IG91dC1saXZlIHRoZSBvYmplY3QgYW5kIHdlCi0gICAgICAgIC8vIGNhbiBmcmVlIGl0IG5vdy4KLSAgICAgICAgaWYgKChtUmVmcy0+bUZsYWdzICYgT0JKRUNUX0xJRkVUSU1FX01BU0spICE9IE9CSkVDVF9MSUZFVElNRV9TVFJPTkcpIHsKLSAgICAgICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgd2VhayBjb3VudCBpcyBub3QgMCBpZiB0aGUgb2JqZWN0Ci0gICAgICAgICAgICAvLyByZS1hY3F1aXJlZCBhIHdlYWsgcmVmZXJlbmNlIGluIGl0cyBkZXN0cnVjdG9yCi0gICAgICAgICAgICBpZiAobVJlZnMtPm1XZWFrID09IDApIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgbVJlZnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcywgY2xlYXIgdGhpcy4KLSAgICBjb25zdF9jYXN0PHdlYWtyZWZfaW1wbComPihtUmVmcykgPSBOVUxMOwotfQotCi12b2lkIFJlZkJhc2U6OmV4dGVuZE9iamVjdExpZmV0aW1lKGludDMyX3QgbW9kZSkKLXsKLSAgICBhbmRyb2lkX2F0b21pY19vcihtb2RlLCAmbVJlZnMtPm1GbGFncyk7Ci19Ci0KLXZvaWQgUmVmQmFzZTo6b25GaXJzdFJlZigpCi17Ci19Ci0KLXZvaWQgUmVmQmFzZTo6b25MYXN0U3Ryb25nUmVmKGNvbnN0IHZvaWQqIC8qaWQqLykKLXsKLX0KLQotYm9vbCBSZWZCYXNlOjpvbkluY1N0cm9uZ0F0dGVtcHRlZCh1aW50MzJfdCBmbGFncywgY29uc3Qgdm9pZCogaWQpCi17Ci0gICAgcmV0dXJuIChmbGFncyZGSVJTVF9JTkNfU1RST05HKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotdm9pZCBSZWZCYXNlOjpvbkxhc3RXZWFrUmVmKGNvbnN0IHZvaWQqIC8qaWQqLykKLXsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgUmVmQmFzZTo6bW92ZVJlZmVyZW5jZXModm9pZCogZHN0LCB2b2lkIGNvbnN0KiBzcmMsIHNpemVfdCBuLAotICAgICAgICBjb25zdCBSZWZlcmVuY2VDb252ZXJ0ZXJCYXNlJiBjYXN0ZXIpCi17Ci0jaWYgREVCVUdfUkVGUwotICAgIGNvbnN0IHNpemVfdCBpdGVtU2l6ZSA9IGNhc3Rlci5nZXRSZWZlcmVuY2VUeXBlU2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8biA7IGkrKykgewotICAgICAgICB2b2lkKiAgICAgICBkID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkICAgICAgKj4oaW50cHRyX3QoZHN0KSArIGkqaXRlbVNpemUpOwotICAgICAgICB2b2lkIGNvbnN0KiBzID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkIGNvbnN0Kj4oaW50cHRyX3Qoc3JjKSArIGkqaXRlbVNpemUpOwotICAgICAgICBSZWZCYXNlKiByZWYocmVpbnRlcnByZXRfY2FzdDxSZWZCYXNlKj4oY2FzdGVyLmdldFJlZmVyZW5jZUJhc2UoZCkpKTsKLSAgICAgICAgcmVmLT5tUmVmcy0+cmVuYW1lU3Ryb25nUmVmSWQocywgZCk7Ci0gICAgICAgIHJlZi0+bVJlZnMtPnJlbmFtZVdlYWtSZWZJZChzLCBkKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRleHRPdXRwdXQmIHByaW50U3Ryb25nUG9pbnRlcihUZXh0T3V0cHV0JiB0bywgY29uc3Qgdm9pZCogdmFsKQotewotICAgIHRvIDw8ICJzcDw+KCIgPDwgdmFsIDw8ICIpIjsKLSAgICByZXR1cm4gdG87Ci19Ci0KLVRleHRPdXRwdXQmIHByaW50V2Vha1BvaW50ZXIoVGV4dE91dHB1dCYgdG8sIGNvbnN0IHZvaWQqIHZhbCkKLXsKLSAgICB0byA8PCAid3A8PigiIDw8IHZhbCA8PCAiKSI7Ci0gICAgcmV0dXJuIHRvOwotfQotCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1NoYXJlZEJ1ZmZlci5jcHAgYi9saWJzL3V0aWxzL1NoYXJlZEJ1ZmZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NTVmYjcuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9TaGFyZWRCdWZmZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TaGFyZWRCdWZmZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU2hhcmVkQnVmZmVyKiBTaGFyZWRCdWZmZXI6OmFsbG9jKHNpemVfdCBzaXplKQotewotICAgIFNoYXJlZEJ1ZmZlciogc2IgPSBzdGF0aWNfY2FzdDxTaGFyZWRCdWZmZXIgKj4obWFsbG9jKHNpemVvZihTaGFyZWRCdWZmZXIpICsgc2l6ZSkpOwotICAgIGlmIChzYikgewotICAgICAgICBzYi0+bVJlZnMgPSAxOwotICAgICAgICBzYi0+bVNpemUgPSBzaXplOwotICAgIH0KLSAgICByZXR1cm4gc2I7Ci19Ci0KLQotc3NpemVfdCBTaGFyZWRCdWZmZXI6OmRlYWxsb2MoY29uc3QgU2hhcmVkQnVmZmVyKiByZWxlYXNlZCkKLXsKLSAgICBpZiAocmVsZWFzZWQtPm1SZWZzICE9IDApIHJldHVybiAtMTsgLy8gWFhYOiBpbnZhbGlkIG9wZXJhdGlvbgotICAgIGZyZWUoY29uc3RfY2FzdDxTaGFyZWRCdWZmZXIqPihyZWxlYXNlZCkpOwotICAgIHJldHVybiAwOwotfQotCi1TaGFyZWRCdWZmZXIqIFNoYXJlZEJ1ZmZlcjo6ZWRpdCgpIGNvbnN0Ci17Ci0gICAgaWYgKG9ubHlPd25lcigpKSB7Ci0gICAgICAgIHJldHVybiBjb25zdF9jYXN0PFNoYXJlZEJ1ZmZlcio+KHRoaXMpOwotICAgIH0KLSAgICBTaGFyZWRCdWZmZXIqIHNiID0gYWxsb2MobVNpemUpOwotICAgIGlmIChzYikgewotICAgICAgICBtZW1jcHkoc2ItPmRhdGEoKSwgZGF0YSgpLCBzaXplKCkpOwotICAgICAgICByZWxlYXNlKCk7Ci0gICAgfQotICAgIHJldHVybiBzYjsgICAgCi19Ci0KLVNoYXJlZEJ1ZmZlciogU2hhcmVkQnVmZmVyOjplZGl0UmVzaXplKHNpemVfdCBuZXdTaXplKSBjb25zdAotewotICAgIGlmIChvbmx5T3duZXIoKSkgewotICAgICAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IGNvbnN0X2Nhc3Q8U2hhcmVkQnVmZmVyKj4odGhpcyk7Ci0gICAgICAgIGlmIChidWYtPm1TaXplID09IG5ld1NpemUpIHJldHVybiBidWY7Ci0gICAgICAgIGJ1ZiA9IChTaGFyZWRCdWZmZXIqKXJlYWxsb2MoYnVmLCBzaXplb2YoU2hhcmVkQnVmZmVyKSArIG5ld1NpemUpOwotICAgICAgICBpZiAoYnVmICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGJ1Zi0+bVNpemUgPSBuZXdTaXplOwotICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKLSAgICAgICAgfQotICAgIH0KLSAgICBTaGFyZWRCdWZmZXIqIHNiID0gYWxsb2MobmV3U2l6ZSk7Ci0gICAgaWYgKHNiKSB7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBteVNpemUgPSBtU2l6ZTsKLSAgICAgICAgbWVtY3B5KHNiLT5kYXRhKCksIGRhdGEoKSwgbmV3U2l6ZSA8IG15U2l6ZSA/IG5ld1NpemUgOiBteVNpemUpOwotICAgICAgICByZWxlYXNlKCk7Ci0gICAgfQotICAgIHJldHVybiBzYjsgICAgCi19Ci0KLVNoYXJlZEJ1ZmZlciogU2hhcmVkQnVmZmVyOjphdHRlbXB0RWRpdCgpIGNvbnN0Ci17Ci0gICAgaWYgKG9ubHlPd25lcigpKSB7Ci0gICAgICAgIHJldHVybiBjb25zdF9jYXN0PFNoYXJlZEJ1ZmZlcio+KHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotU2hhcmVkQnVmZmVyKiBTaGFyZWRCdWZmZXI6OnJlc2V0KHNpemVfdCBuZXdfc2l6ZSkgY29uc3QKLXsKLSAgICAvLyBjaGVhcC1vLXJlc2V0LgotICAgIFNoYXJlZEJ1ZmZlciogc2IgPSBhbGxvYyhuZXdfc2l6ZSk7Ci0gICAgaWYgKHNiKSB7Ci0gICAgICAgIHJlbGVhc2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNiOwotfQotCi12b2lkIFNoYXJlZEJ1ZmZlcjo6YWNxdWlyZSgpIGNvbnN0IHsKLSAgICBhbmRyb2lkX2F0b21pY19pbmMoJm1SZWZzKTsKLX0KLQotaW50MzJfdCBTaGFyZWRCdWZmZXI6OnJlbGVhc2UodWludDMyX3QgZmxhZ3MpIGNvbnN0Ci17Ci0gICAgaW50MzJfdCBwcmV2ID0gMTsKLSAgICBpZiAob25seU93bmVyKCkgfHwgKChwcmV2ID0gYW5kcm9pZF9hdG9taWNfZGVjKCZtUmVmcykpID09IDEpKSB7Ci0gICAgICAgIG1SZWZzID0gMDsKLSAgICAgICAgaWYgKChmbGFncyAmIGVLZWVwU3RvcmFnZSkgPT0gMCkgewotICAgICAgICAgICAgZnJlZShjb25zdF9jYXN0PFNoYXJlZEJ1ZmZlcio+KHRoaXMpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJldjsKLX0KLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9TdGF0aWMuY3BwIGIvbGlicy91dGlscy9TdGF0aWMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjRlOTE3Li4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvU3RhdGljLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBbGwgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlLCB0byBjb250cm9sIGluaXRpYWxpemF0aW9uIGFuZAotLy8gZGVzdHJ1Y3Rpb24gb3JkZXIgaW4gdGhlIGxpYnJhcnkuCi0KLSNpbmNsdWRlIDxwcml2YXRlL3V0aWxzL1N0YXRpYy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvQnVmZmVyZWRUZXh0T3V0cHV0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTGliVXRpbHNGaXJzdFN0YXRpY3MKLXsKLXB1YmxpYzoKLSAgICBMaWJVdGlsc0ZpcnN0U3RhdGljcygpCi0gICAgewotICAgICAgICBpbml0aWFsaXplX3N0cmluZzgoKTsKLSAgICAgICAgaW5pdGlhbGl6ZV9zdHJpbmcxNigpOwotICAgIH0KLSAgICAKLSAgICB+TGliVXRpbHNGaXJzdFN0YXRpY3MoKQotICAgIHsKLSAgICAgICAgdGVybWluYXRlX3N0cmluZzE2KCk7Ci0gICAgICAgIHRlcm1pbmF0ZV9zdHJpbmc4KCk7Ci0gICAgfQotfTsKLQotc3RhdGljIExpYlV0aWxzRmlyc3RTdGF0aWNzIGdGaXJzdFN0YXRpY3M7Ci1pbnQgZ0RhcndpbkNhbnRMb2FkQWxsT2JqZWN0cyA9IDE7Ci0KLS8vIC0tLS0tLS0tLS0tLSBUZXh0IG91dHB1dCBzdHJlYW1zCi0KLVZlY3RvcjxpbnQzMl90PiBnVGV4dEJ1ZmZlcnM7Ci0KLWNsYXNzIExvZ1RleHRPdXRwdXQgOiBwdWJsaWMgQnVmZmVyZWRUZXh0T3V0cHV0Ci17Ci1wdWJsaWM6Ci0gICAgTG9nVGV4dE91dHB1dCgpIDogQnVmZmVyZWRUZXh0T3V0cHV0KE1VTFRJVEhSRUFERUQpIHsgfQotICAgIHZpcnR1YWwgfkxvZ1RleHRPdXRwdXQoKSB7IH07Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlTGluZXMoY29uc3Qgc3RydWN0IGlvdmVjJiB2ZWMsIHNpemVfdCBOKQotICAgIHsKLSAgICAgICAgLy9hbmRyb2lkX3dyaXRldkxvZygmdmVjLCBOKTsgICAgICAgPC0tIHRoaXMgaXMgbm93IGEgbm8tb3AKLSAgICAgICAgaWYgKE4gIT0gMSkgQUxPR0koIldBUk5JTkc6IHdyaXRlTGluZXMgTj0lenVcbiIsIE4pOwotICAgICAgICBBTE9HSSgiJS4qcyIsIChpbnQpdmVjLmlvdl9sZW4sIChjb25zdCBjaGFyKikgdmVjLmlvdl9iYXNlKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLX07Ci0KLWNsYXNzIEZkVGV4dE91dHB1dCA6IHB1YmxpYyBCdWZmZXJlZFRleHRPdXRwdXQKLXsKLXB1YmxpYzoKLSAgICBGZFRleHRPdXRwdXQoaW50IGZkKSA6IEJ1ZmZlcmVkVGV4dE91dHB1dChNVUxUSVRIUkVBREVEKSwgbUZEKGZkKSB7IH0KLSAgICB2aXJ0dWFsIH5GZFRleHRPdXRwdXQoKSB7IH07Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlTGluZXMoY29uc3Qgc3RydWN0IGlvdmVjJiB2ZWMsIHNpemVfdCBOKQotICAgIHsKLSAgICAgICAgd3JpdGV2KG1GRCwgJnZlYywgTik7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgaW50IG1GRDsKLX07Ci0KLXN0YXRpYyBMb2dUZXh0T3V0cHV0IGdMb2dUZXh0T3V0cHV0Owotc3RhdGljIEZkVGV4dE91dHB1dCBnU3Rkb3V0VGV4dE91dHB1dChTVERPVVRfRklMRU5PKTsKLXN0YXRpYyBGZFRleHRPdXRwdXQgZ1N0ZGVyclRleHRPdXRwdXQoU1RERVJSX0ZJTEVOTyk7Ci0KLVRleHRPdXRwdXQmIGFsb2coZ0xvZ1RleHRPdXRwdXQpOwotVGV4dE91dHB1dCYgYW91dChnU3Rkb3V0VGV4dE91dHB1dCk7Ci1UZXh0T3V0cHV0JiBhZXJyKGdTdGRlcnJUZXh0T3V0cHV0KTsKLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1N0b3BXYXRjaC5jcHAgYi9saWJzL3V0aWxzL1N0b3BXYXRjaC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNzA4ZDYyLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvU3RvcFdhdGNoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0b3BXYXRjaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIGZvciBQUklkNjQgKi8KLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MgMQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9TdG9wV2F0Y2guaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotU3RvcFdhdGNoOjpTdG9wV2F0Y2goY29uc3QgY2hhciAqbmFtZSwgaW50IGNsb2NrLCB1aW50MzJfdCBmbGFncykKLSAgICA6ICAgbU5hbWUobmFtZSksIG1DbG9jayhjbG9jayksIG1GbGFncyhmbGFncykKLXsKLSAgICByZXNldCgpOwotfQotCi1TdG9wV2F0Y2g6On5TdG9wV2F0Y2goKQotewotICAgIG5zZWNzX3QgZWxhcHNlZCA9IGVsYXBzZWRUaW1lKCk7Ci0gICAgY29uc3QgaW50IG4gPSBtTnVtTGFwczsKLSAgICBBTE9HRCgiU3RvcFdhdGNoICVzICh1cyk6ICUiIFBSSWQ2NCAiICIsIG1OYW1lLCBuczJ1cyhlbGFwc2VkKSk7Ci0gICAgZm9yIChpbnQgaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IG5zZWNzX3Qgc29GYXIgPSBtTGFwc1tpXS5zb0ZhcjsKLSAgICAgICAgY29uc3QgbnNlY3NfdCB0aGlzTGFwID0gbUxhcHNbaV0udGhpc0xhcDsKLSAgICAgICAgQUxPR0QoIiBbJWQ6ICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQsIGksIG5zMnVzKHNvRmFyKSwgbnMydXModGhpc0xhcCkpOwotICAgIH0KLX0KLQotY29uc3QgY2hhciogU3RvcFdhdGNoOjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbU5hbWU7Ci19Ci0KLW5zZWNzX3QgU3RvcFdhdGNoOjpsYXAoKQotewotICAgIG5zZWNzX3QgZWxhcHNlZCA9IGVsYXBzZWRUaW1lKCk7Ci0gICAgaWYgKG1OdW1MYXBzID49IDgpIHsKLSAgICAgICAgZWxhcHNlZCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgaW50IG4gPSBtTnVtTGFwczsKLSAgICAgICAgbUxhcHNbbl0uc29GYXIgICA9IGVsYXBzZWQ7Ci0gICAgICAgIG1MYXBzW25dLnRoaXNMYXAgPSBuID8gKGVsYXBzZWQgLSBtTGFwc1tuLTFdLnNvRmFyKSA6IGVsYXBzZWQ7Ci0gICAgICAgIG1OdW1MYXBzID0gbisxOwotICAgIH0KLSAgICByZXR1cm4gZWxhcHNlZDsKLX0KLQotbnNlY3NfdCBTdG9wV2F0Y2g6OmVsYXBzZWRUaW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3lzdGVtVGltZShtQ2xvY2spIC0gbVN0YXJ0VGltZTsKLX0KLQotdm9pZCBTdG9wV2F0Y2g6OnJlc2V0KCkKLXsKLSAgICBtTnVtTGFwcyA9IDA7Ci0gICAgbVN0YXJ0VGltZSA9IHN5c3RlbVRpbWUobUNsb2NrKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvU3RyaW5nMTYuY3BwIGIvbGlicy91dGlscy9TdHJpbmcxNi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTA3MmYuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9TdHJpbmcxNi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9Vbmljb2RlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1RleHRPdXRwdXQuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL3V0aWxzL1N0YXRpYy5oPgotCi0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIFNoYXJlZEJ1ZmZlciogZ0VtcHR5U3RyaW5nQnVmID0gTlVMTDsKLXN0YXRpYyBjaGFyMTZfdCogZ0VtcHR5U3RyaW5nID0gTlVMTDsKLQotc3RhdGljIGlubGluZSBjaGFyMTZfdCogZ2V0RW1wdHlTdHJpbmcoKQotewotICAgIGdFbXB0eVN0cmluZ0J1Zi0+YWNxdWlyZSgpOwotICAgcmV0dXJuIGdFbXB0eVN0cmluZzsKLX0KLQotdm9pZCBpbml0aWFsaXplX3N0cmluZzE2KCkKLXsKLSAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2Moc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgY2hhcjE2X3QqIHN0ciA9IChjaGFyMTZfdCopYnVmLT5kYXRhKCk7Ci0gICAgKnN0ciA9IDA7Ci0gICAgZ0VtcHR5U3RyaW5nQnVmID0gYnVmOwotICAgIGdFbXB0eVN0cmluZyA9IHN0cjsKLX0KLQotdm9pZCB0ZXJtaW5hdGVfc3RyaW5nMTYoKQotewotICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEoZ0VtcHR5U3RyaW5nKS0+cmVsZWFzZSgpOwotICAgIGdFbXB0eVN0cmluZ0J1ZiA9IE5VTEw7Ci0gICAgZ0VtcHR5U3RyaW5nID0gTlVMTDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBjaGFyMTZfdCogYWxsb2NGcm9tVVRGOChjb25zdCBjaGFyKiB1OHN0ciwgc2l6ZV90IHU4bGVuKQotewotICAgIGlmICh1OGxlbiA9PSAwKSByZXR1cm4gZ2V0RW1wdHlTdHJpbmcoKTsKLQotICAgIGNvbnN0IHVpbnQ4X3QqIHU4Y3VyID0gKGNvbnN0IHVpbnQ4X3QqKSB1OHN0cjsKLQotICAgIGNvbnN0IHNzaXplX3QgdTE2bGVuID0gdXRmOF90b191dGYxNl9sZW5ndGgodThjdXIsIHU4bGVuKTsKLSAgICBpZiAodTE2bGVuIDwgMCkgewotICAgICAgICByZXR1cm4gZ2V0RW1wdHlTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90KiBjb25zdCB1OGVuZCA9IHU4Y3VyICsgdThsZW47Ci0KLSAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2Moc2l6ZW9mKGNoYXIxNl90KSoodTE2bGVuKzEpKTsKLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgIHU4Y3VyID0gKGNvbnN0IHVpbnQ4X3QqKSB1OHN0cjsKLSAgICAgICAgY2hhcjE2X3QqIHUxNnN0ciA9IChjaGFyMTZfdCopYnVmLT5kYXRhKCk7Ci0KLSAgICAgICAgdXRmOF90b191dGYxNih1OGN1ciwgdThsZW4sIHUxNnN0cik7Ci0KLSAgICAgICAgLy9wcmludGYoIkNyZWF0ZWQgVVRGLTE2IHN0cmluZyBmcm9tIFVURi04IFwiJXNcIjoiLCBpbik7Ci0gICAgICAgIC8vcHJpbnRIZXhEYXRhKDEsIHN0ciwgYnVmLT5zaXplKCksIDE2LCAxKTsKLSAgICAgICAgLy9wcmludGYoIlxuIik7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdTE2c3RyOwotICAgIH0KLQotICAgIHJldHVybiBnZXRFbXB0eVN0cmluZygpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU3RyaW5nMTY6OlN0cmluZzE2KCkKLSAgICA6IG1TdHJpbmcoZ2V0RW1wdHlTdHJpbmcoKSkKLXsKLX0KLQotU3RyaW5nMTY6OlN0cmluZzE2KGNvbnN0IFN0cmluZzE2JiBvKQotICAgIDogbVN0cmluZyhvLm1TdHJpbmcpCi17Ci0gICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKS0+YWNxdWlyZSgpOwotfQotCi1TdHJpbmcxNjo6U3RyaW5nMTYoY29uc3QgU3RyaW5nMTYmIG8sIHNpemVfdCBsZW4sIHNpemVfdCBiZWdpbikKLSAgICA6IG1TdHJpbmcoZ2V0RW1wdHlTdHJpbmcoKSkKLXsKLSAgICBzZXRUbyhvLCBsZW4sIGJlZ2luKTsKLX0KLQotU3RyaW5nMTY6OlN0cmluZzE2KGNvbnN0IGNoYXIxNl90KiBvKQotewotICAgIHNpemVfdCBsZW4gPSBzdHJsZW4xNihvKTsKLSAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2MoKGxlbisxKSpzaXplb2YoY2hhcjE2X3QpKTsKLSAgICBBTE9HX0FTU0VSVChidWYsICJVbmFibGUgdG8gYWxsb2NhdGUgc2hhcmVkIGJ1ZmZlciIpOwotICAgIGlmIChidWYpIHsKLSAgICAgICAgY2hhcjE2X3QqIHN0ciA9IChjaGFyMTZfdCopYnVmLT5kYXRhKCk7Ci0gICAgICAgIHN0cmNweTE2KHN0ciwgbyk7Ci0gICAgICAgIG1TdHJpbmcgPSBzdHI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgbVN0cmluZyA9IGdldEVtcHR5U3RyaW5nKCk7Ci19Ci0KLVN0cmluZzE2OjpTdHJpbmcxNihjb25zdCBjaGFyMTZfdCogbywgc2l6ZV90IGxlbikKLXsKLSAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2MoKGxlbisxKSpzaXplb2YoY2hhcjE2X3QpKTsKLSAgICBBTE9HX0FTU0VSVChidWYsICJVbmFibGUgdG8gYWxsb2NhdGUgc2hhcmVkIGJ1ZmZlciIpOwotICAgIGlmIChidWYpIHsKLSAgICAgICAgY2hhcjE2X3QqIHN0ciA9IChjaGFyMTZfdCopYnVmLT5kYXRhKCk7Ci0gICAgICAgIG1lbWNweShzdHIsIG8sIGxlbipzaXplb2YoY2hhcjE2X3QpKTsKLSAgICAgICAgc3RyW2xlbl0gPSAwOwotICAgICAgICBtU3RyaW5nID0gc3RyOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIG1TdHJpbmcgPSBnZXRFbXB0eVN0cmluZygpOwotfQotCi1TdHJpbmcxNjo6U3RyaW5nMTYoY29uc3QgU3RyaW5nOCYgbykKLSAgICA6IG1TdHJpbmcoYWxsb2NGcm9tVVRGOChvLnN0cmluZygpLCBvLnNpemUoKSkpCi17Ci19Ci0KLVN0cmluZzE2OjpTdHJpbmcxNihjb25zdCBjaGFyKiBvKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEY4KG8sIHN0cmxlbihvKSkpCi17Ci19Ci0KLVN0cmluZzE2OjpTdHJpbmcxNihjb25zdCBjaGFyKiBvLCBzaXplX3QgbGVuKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEY4KG8sIGxlbikpCi17Ci19Ci0KLVN0cmluZzE2Ojp+U3RyaW5nMTYoKQotewotICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZyktPnJlbGVhc2UoKTsKLX0KLQotdm9pZCBTdHJpbmcxNjo6c2V0VG8oY29uc3QgU3RyaW5nMTYmIG90aGVyKQotewotICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEob3RoZXIubVN0cmluZyktPmFjcXVpcmUoKTsKLSAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpLT5yZWxlYXNlKCk7Ci0gICAgbVN0cmluZyA9IG90aGVyLm1TdHJpbmc7Ci19Ci0KLXN0YXR1c190IFN0cmluZzE2OjpzZXRUbyhjb25zdCBTdHJpbmcxNiYgb3RoZXIsIHNpemVfdCBsZW4sIHNpemVfdCBiZWdpbikKLXsKLSAgICBjb25zdCBzaXplX3QgTiA9IG90aGVyLnNpemUoKTsKLSAgICBpZiAoYmVnaW4gPj0gTikgewotICAgICAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1TdHJpbmcgPSBnZXRFbXB0eVN0cmluZygpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIGlmICgoYmVnaW4rbGVuKSA+IE4pIGxlbiA9IE4tYmVnaW47Ci0gICAgaWYgKGJlZ2luID09IDAgJiYgbGVuID09IE4pIHsKLSAgICAgICAgc2V0VG8ob3RoZXIpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKCZvdGhlciA9PSB0aGlzKSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIk5vdCBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHJldHVybiBzZXRUbyhvdGhlci5zdHJpbmcoKStiZWdpbiwgbGVuKTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nMTY6OnNldFRvKGNvbnN0IGNoYXIxNl90KiBvdGhlcikKLXsKLSAgICByZXR1cm4gc2V0VG8ob3RoZXIsIHN0cmxlbjE2KG90aGVyKSk7Ci19Ci0KLXN0YXR1c190IFN0cmluZzE2OjpzZXRUbyhjb25zdCBjaGFyMTZfdCogb3RoZXIsIHNpemVfdCBsZW4pCi17Ci0gICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpCi0gICAgICAgIC0+ZWRpdFJlc2l6ZSgobGVuKzEpKnNpemVvZihjaGFyMTZfdCkpOwotICAgIGlmIChidWYpIHsKLSAgICAgICAgY2hhcjE2X3QqIHN0ciA9IChjaGFyMTZfdCopYnVmLT5kYXRhKCk7Ci0gICAgICAgIG1lbW1vdmUoc3RyLCBvdGhlciwgbGVuKnNpemVvZihjaGFyMTZfdCkpOwotICAgICAgICBzdHJbbGVuXSA9IDA7Ci0gICAgICAgIG1TdHJpbmcgPSBzdHI7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX01FTU9SWTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nMTY6OmFwcGVuZChjb25zdCBTdHJpbmcxNiYgb3RoZXIpCi17Ci0gICAgY29uc3Qgc2l6ZV90IG15TGVuID0gc2l6ZSgpOwotICAgIGNvbnN0IHNpemVfdCBvdGhlckxlbiA9IG90aGVyLnNpemUoKTsKLSAgICBpZiAobXlMZW4gPT0gMCkgewotICAgICAgICBzZXRUbyhvdGhlcik7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgaWYgKG90aGVyTGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICAKLSAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZykKLSAgICAgICAgLT5lZGl0UmVzaXplKChteUxlbitvdGhlckxlbisxKSpzaXplb2YoY2hhcjE2X3QpKTsKLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgIGNoYXIxNl90KiBzdHIgPSAoY2hhcjE2X3QqKWJ1Zi0+ZGF0YSgpOwotICAgICAgICBtZW1jcHkoc3RyK215TGVuLCBvdGhlciwgKG90aGVyTGVuKzEpKnNpemVvZihjaGFyMTZfdCkpOwotICAgICAgICBtU3RyaW5nID0gc3RyOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOT19NRU1PUlk7Ci19Ci0KLXN0YXR1c190IFN0cmluZzE2OjphcHBlbmQoY29uc3QgY2hhcjE2X3QqIGNocnMsIHNpemVfdCBvdGhlckxlbikKLXsKLSAgICBjb25zdCBzaXplX3QgbXlMZW4gPSBzaXplKCk7Ci0gICAgaWYgKG15TGVuID09IDApIHsKLSAgICAgICAgc2V0VG8oY2hycywgb3RoZXJMZW4pOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIGlmIChvdGhlckxlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgCi0gICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpCi0gICAgICAgIC0+ZWRpdFJlc2l6ZSgobXlMZW4rb3RoZXJMZW4rMSkqc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgaWYgKGJ1ZikgewotICAgICAgICBjaGFyMTZfdCogc3RyID0gKGNoYXIxNl90KilidWYtPmRhdGEoKTsKLSAgICAgICAgbWVtY3B5KHN0citteUxlbiwgY2hycywgb3RoZXJMZW4qc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgICAgIHN0cltteUxlbitvdGhlckxlbl0gPSAwOwotICAgICAgICBtU3RyaW5nID0gc3RyOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOT19NRU1PUlk7Ci19Ci0KLXN0YXR1c190IFN0cmluZzE2OjppbnNlcnQoc2l6ZV90IHBvcywgY29uc3QgY2hhcjE2X3QqIGNocnMpCi17Ci0gICAgcmV0dXJuIGluc2VydChwb3MsIGNocnMsIHN0cmxlbjE2KGNocnMpKTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nMTY6Omluc2VydChzaXplX3QgcG9zLCBjb25zdCBjaGFyMTZfdCogY2hycywgc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBzaXplX3QgbXlMZW4gPSBzaXplKCk7Ci0gICAgaWYgKG15TGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIHNldFRvKGNocnMsIGxlbik7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAocG9zID4gbXlMZW4pIHBvcyA9IG15TGVuOwotCi0gICAgI2lmIDAKLSAgICBwcmludGYoIkluc2VydCBpbiB0byAlczogcG9zPSVkLCBsZW49JWQsIG15TGVuPSVkLCBjaHJzPSVzXG4iLAotICAgICAgICAgICBTdHJpbmc4KCp0aGlzKS5zdHJpbmcoKSwgcG9zLAotICAgICAgICAgICBsZW4sIG15TGVuLCBTdHJpbmc4KGNocnMsIGxlbikuc3RyaW5nKCkpOwotICAgICNlbmRpZgotCi0gICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpCi0gICAgICAgIC0+ZWRpdFJlc2l6ZSgobXlMZW4rbGVuKzEpKnNpemVvZihjaGFyMTZfdCkpOwotICAgIGlmIChidWYpIHsKLSAgICAgICAgY2hhcjE2X3QqIHN0ciA9IChjaGFyMTZfdCopYnVmLT5kYXRhKCk7Ci0gICAgICAgIGlmIChwb3MgPCBteUxlbikgewotICAgICAgICAgICAgbWVtbW92ZShzdHIrcG9zK2xlbiwgc3RyK3BvcywgKG15TGVuLXBvcykqc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KHN0citwb3MsIGNocnMsIGxlbipzaXplb2YoY2hhcjE2X3QpKTsKLSAgICAgICAgc3RyW215TGVuK2xlbl0gPSAwOwotICAgICAgICBtU3RyaW5nID0gc3RyOwotICAgICAgICAjaWYgMAotICAgICAgICBwcmludGYoIlJlc3VsdCAoJWQgY2hycyk6ICVzXG4iLCBzaXplKCksIFN0cmluZzgoKnRoaXMpLnN0cmluZygpKTsKLSAgICAgICAgI2VuZGlmCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX01FTU9SWTsKLX0KLQotc3NpemVfdCBTdHJpbmcxNjo6ZmluZEZpcnN0KGNoYXIxNl90IGMpIGNvbnN0Ci17Ci0gICAgY29uc3QgY2hhcjE2X3QqIHN0ciA9IHN0cmluZygpOwotICAgIGNvbnN0IGNoYXIxNl90KiBwID0gc3RyOwotICAgIGNvbnN0IGNoYXIxNl90KiBlID0gcCArIHNpemUoKTsKLSAgICB3aGlsZSAocCA8IGUpIHsKLSAgICAgICAgaWYgKCpwID09IGMpIHsKLSAgICAgICAgICAgIHJldHVybiBwLXN0cjsKLSAgICAgICAgfQotICAgICAgICBwKys7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotc3NpemVfdCBTdHJpbmcxNjo6ZmluZExhc3QoY2hhcjE2X3QgYykgY29uc3QKLXsKLSAgICBjb25zdCBjaGFyMTZfdCogc3RyID0gc3RyaW5nKCk7Ci0gICAgY29uc3QgY2hhcjE2X3QqIHAgPSBzdHI7Ci0gICAgY29uc3QgY2hhcjE2X3QqIGUgPSBwICsgc2l6ZSgpOwotICAgIHdoaWxlIChwIDwgZSkgewotICAgICAgICBlLS07Ci0gICAgICAgIGlmICgqZSA9PSBjKSB7Ci0gICAgICAgICAgICByZXR1cm4gZS1zdHI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi1ib29sIFN0cmluZzE2OjpzdGFydHNXaXRoKGNvbnN0IFN0cmluZzE2JiBwcmVmaXgpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IHBzID0gcHJlZml4LnNpemUoKTsKLSAgICBpZiAocHMgPiBzaXplKCkpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gc3RyemNtcDE2KG1TdHJpbmcsIHBzLCBwcmVmaXguc3RyaW5nKCksIHBzKSA9PSAwOwotfQotCi1ib29sIFN0cmluZzE2OjpzdGFydHNXaXRoKGNvbnN0IGNoYXIxNl90KiBwcmVmaXgpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IHBzID0gc3RybGVuMTYocHJlZml4KTsKLSAgICBpZiAocHMgPiBzaXplKCkpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gc3RybmNtcDE2KG1TdHJpbmcsIHByZWZpeCwgcHMpID09IDA7Ci19Ci0KLXN0YXR1c190IFN0cmluZzE2OjptYWtlTG93ZXIoKQotewotICAgIGNvbnN0IHNpemVfdCBOID0gc2l6ZSgpOwotICAgIGNvbnN0IGNoYXIxNl90KiBzdHIgPSBzdHJpbmcoKTsKLSAgICBjaGFyMTZfdCogZWRpdCA9IE5VTEw7Ci0gICAgZm9yIChzaXplX3QgaT0wOyBpPE47IGkrKykgewotICAgICAgICBjb25zdCBjaGFyMTZfdCB2ID0gc3RyW2ldOwotICAgICAgICBpZiAodiA+PSAnQScgJiYgdiA8PSAnWicpIHsKLSAgICAgICAgICAgIGlmICghZWRpdCkgewotICAgICAgICAgICAgICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKS0+ZWRpdCgpOwotICAgICAgICAgICAgICAgIGlmICghYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVkaXQgPSAoY2hhcjE2X3QqKWJ1Zi0+ZGF0YSgpOwotICAgICAgICAgICAgICAgIG1TdHJpbmcgPSBzdHIgPSBlZGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWRpdFtpXSA9IHRvbG93ZXIoKGNoYXIpdik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBTdHJpbmcxNjo6cmVwbGFjZUFsbChjaGFyMTZfdCByZXBsYWNlVGhpcywgY2hhcjE2X3Qgd2l0aFRoaXMpCi17Ci0gICAgY29uc3Qgc2l6ZV90IE4gPSBzaXplKCk7Ci0gICAgY29uc3QgY2hhcjE2X3QqIHN0ciA9IHN0cmluZygpOwotICAgIGNoYXIxNl90KiBlZGl0ID0gTlVMTDsKLSAgICBmb3IgKHNpemVfdCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgIGlmIChzdHJbaV0gPT0gcmVwbGFjZVRoaXMpIHsKLSAgICAgICAgICAgIGlmICghZWRpdCkgewotICAgICAgICAgICAgICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKS0+ZWRpdCgpOwotICAgICAgICAgICAgICAgIGlmICghYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVkaXQgPSAoY2hhcjE2X3QqKWJ1Zi0+ZGF0YSgpOwotICAgICAgICAgICAgICAgIG1TdHJpbmcgPSBzdHIgPSBlZGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWRpdFtpXSA9IHdpdGhUaGlzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgU3RyaW5nMTY6OnJlbW92ZShzaXplX3QgbGVuLCBzaXplX3QgYmVnaW4pCi17Ci0gICAgY29uc3Qgc2l6ZV90IE4gPSBzaXplKCk7Ci0gICAgaWYgKGJlZ2luID49IE4pIHsKLSAgICAgICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKS0+cmVsZWFzZSgpOwotICAgICAgICBtU3RyaW5nID0gZ2V0RW1wdHlTdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBpZiAoKGJlZ2luK2xlbikgPiBOKSBsZW4gPSBOLWJlZ2luOwotICAgIGlmIChiZWdpbiA9PSAwICYmIGxlbiA9PSBOKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoYmVnaW4gPiAwKSB7Ci0gICAgICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKQotICAgICAgICAgICAgLT5lZGl0UmVzaXplKChOKzEpKnNpemVvZihjaGFyMTZfdCkpOwotICAgICAgICBpZiAoIWJ1ZikgewotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgICAgICBjaGFyMTZfdCogc3RyID0gKGNoYXIxNl90KilidWYtPmRhdGEoKTsKLSAgICAgICAgbWVtbW92ZShzdHIsIHN0citiZWdpbiwgKE4tYmVnaW4rMSkqc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgICAgIG1TdHJpbmcgPSBzdHI7Ci0gICAgfQotICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKQotICAgICAgICAtPmVkaXRSZXNpemUoKGxlbisxKSpzaXplb2YoY2hhcjE2X3QpKTsKLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgIGNoYXIxNl90KiBzdHIgPSAoY2hhcjE2X3QqKWJ1Zi0+ZGF0YSgpOwotICAgICAgICBzdHJbbGVuXSA9IDA7Ci0gICAgICAgIG1TdHJpbmcgPSBzdHI7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX01FTU9SWTsKLX0KLQotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3QgU3RyaW5nMTYmIHZhbCkKLXsKLSAgICB0byA8PCBTdHJpbmc4KHZhbCkuc3RyaW5nKCk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9TdHJpbmc4LmNwcCBiL2xpYnMvdXRpbHMvU3RyaW5nOC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MmYwMjYuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9TdHJpbmc4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1VuaWNvZGUuaD4KLSNpbmNsdWRlIDx1dGlscy9TaGFyZWRCdWZmZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1RleHRPdXRwdXQuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL3V0aWxzL1N0YXRpYy5oPgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyoKLSAqIEZ1bmN0aW9ucyBvdXRzaWRlIGFuZHJvaWQgaXMgYmVsb3cgdGhlIG5hbWVzcGFjZSBhbmRyb2lkLCBzaW5jZSB0aGV5IHVzZQotICogZnVuY3Rpb25zIGFuZCBjb25zdGFudHMgaW4gYW5kcm9pZCBuYW1lc3BhY2UuCi0gKi8KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gU2VwYXJhdG9yIHVzZWQgYnkgcmVzb3VyY2UgcGF0aHMuIFRoaXMgaXMgbm90IHBsYXRmb3JtIGRlcGVuZGVudCBjb250cmFyeQotLy8gdG8gT1NfUEFUSF9TRVBBUkFUT1IuCi0jZGVmaW5lIFJFU19QQVRIX1NFUEFSQVRPUiAnLycKLQotc3RhdGljIFNoYXJlZEJ1ZmZlciogZ0VtcHR5U3RyaW5nQnVmID0gTlVMTDsKLXN0YXRpYyBjaGFyKiBnRW1wdHlTdHJpbmcgPSBOVUxMOwotCi1leHRlcm4gaW50IGdEYXJ3aW5DYW50TG9hZEFsbE9iamVjdHM7Ci1pbnQgZ0RhcndpbklzUmVhbGx5QW5ub3lpbmc7Ci0KLXN0YXRpYyBpbmxpbmUgY2hhciogZ2V0RW1wdHlTdHJpbmcoKQotewotICAgIGdFbXB0eVN0cmluZ0J1Zi0+YWNxdWlyZSgpOwotICAgIHJldHVybiBnRW1wdHlTdHJpbmc7Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZV9zdHJpbmc4KCkKLXsKLSAgICAvLyBIQUNLOiBUaGlzIGR1bW15IGRlcGVuZGVuY3kgZm9yY2VzIGxpbmtpbmcgbGlidXRpbHMgU3RhdGljLmNwcCwKLSAgICAvLyB3aGljaCBpcyBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBTdHJpbmc4L1N0cmluZzE2IGNsYXNzZXMuCi0gICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSBuYW1lZCBmb3IgRGFyd2luLCBidXQgYXJlIG5lZWRlZCBlbHNld2hlcmUgdG9vLAotICAgIC8vIGluY2x1ZGluZyBzdGF0aWMgbGlua2luZyBvbiBhbnkgcGxhdGZvcm0uCi0gICAgZ0RhcndpbklzUmVhbGx5QW5ub3lpbmcgPSBnRGFyd2luQ2FudExvYWRBbGxPYmplY3RzOwotCi0gICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmFsbG9jKDEpOwotICAgIGNoYXIqIHN0ciA9IChjaGFyKilidWYtPmRhdGEoKTsKLSAgICAqc3RyID0gMDsKLSAgICBnRW1wdHlTdHJpbmdCdWYgPSBidWY7Ci0gICAgZ0VtcHR5U3RyaW5nID0gc3RyOwotfQotCi12b2lkIHRlcm1pbmF0ZV9zdHJpbmc4KCkKLXsKLSAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKGdFbXB0eVN0cmluZyktPnJlbGVhc2UoKTsKLSAgICBnRW1wdHlTdHJpbmdCdWYgPSBOVUxMOwotICAgIGdFbXB0eVN0cmluZyA9IE5VTEw7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgY2hhciogYWxsb2NGcm9tVVRGOChjb25zdCBjaGFyKiBpbiwgc2l6ZV90IGxlbikKLXsKLSAgICBpZiAobGVuID4gMCkgewotICAgICAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2MobGVuKzEpOwotICAgICAgICBBTE9HX0FTU0VSVChidWYsICJVbmFibGUgdG8gYWxsb2NhdGUgc2hhcmVkIGJ1ZmZlciIpOwotICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICBjaGFyKiBzdHIgPSAoY2hhciopYnVmLT5kYXRhKCk7Ci0gICAgICAgICAgICBtZW1jcHkoc3RyLCBpbiwgbGVuKTsKLSAgICAgICAgICAgIHN0cltsZW5dID0gMDsKLSAgICAgICAgICAgIHJldHVybiBzdHI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdldEVtcHR5U3RyaW5nKCk7Ci19Ci0KLXN0YXRpYyBjaGFyKiBhbGxvY0Zyb21VVEYxNihjb25zdCBjaGFyMTZfdCogaW4sIHNpemVfdCBsZW4pCi17Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gZ2V0RW1wdHlTdHJpbmcoKTsKLQotICAgIGNvbnN0IHNzaXplX3QgYnl0ZXMgPSB1dGYxNl90b191dGY4X2xlbmd0aChpbiwgbGVuKTsKLSAgICBpZiAoYnl0ZXMgPCAwKSB7Ci0gICAgICAgIHJldHVybiBnZXRFbXB0eVN0cmluZygpOwotICAgIH0KLQotICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjphbGxvYyhieXRlcysxKTsKLSAgICBBTE9HX0FTU0VSVChidWYsICJVbmFibGUgdG8gYWxsb2NhdGUgc2hhcmVkIGJ1ZmZlciIpOwotICAgIGlmICghYnVmKSB7Ci0gICAgICAgIHJldHVybiBnZXRFbXB0eVN0cmluZygpOwotICAgIH0KLQotICAgIGNoYXIqIHN0ciA9IChjaGFyKilidWYtPmRhdGEoKTsKLSAgICB1dGYxNl90b191dGY4KGluLCBsZW4sIHN0cik7Ci0gICAgcmV0dXJuIHN0cjsKLX0KLQotc3RhdGljIGNoYXIqIGFsbG9jRnJvbVVURjMyKGNvbnN0IGNoYXIzMl90KiBpbiwgc2l6ZV90IGxlbikKLXsKLSAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIGdldEVtcHR5U3RyaW5nKCk7Ci0gICAgfQotCi0gICAgY29uc3Qgc3NpemVfdCBieXRlcyA9IHV0ZjMyX3RvX3V0ZjhfbGVuZ3RoKGluLCBsZW4pOwotICAgIGlmIChieXRlcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIGdldEVtcHR5U3RyaW5nKCk7Ci0gICAgfQotCi0gICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmFsbG9jKGJ5dGVzKzEpOwotICAgIEFMT0dfQVNTRVJUKGJ1ZiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBzaGFyZWQgYnVmZmVyIik7Ci0gICAgaWYgKCFidWYpIHsKLSAgICAgICAgcmV0dXJuIGdldEVtcHR5U3RyaW5nKCk7Ci0gICAgfQotCi0gICAgY2hhciogc3RyID0gKGNoYXIqKSBidWYtPmRhdGEoKTsKLSAgICB1dGYzMl90b191dGY4KGluLCBsZW4sIHN0cik7Ci0KLSAgICByZXR1cm4gc3RyOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU3RyaW5nODo6U3RyaW5nOCgpCi0gICAgOiBtU3RyaW5nKGdldEVtcHR5U3RyaW5nKCkpCi17Ci19Ci0KLVN0cmluZzg6OlN0cmluZzgoY29uc3QgU3RyaW5nOCYgbykKLSAgICA6IG1TdHJpbmcoby5tU3RyaW5nKQotewotICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZyktPmFjcXVpcmUoKTsKLX0KLQotU3RyaW5nODo6U3RyaW5nOChjb25zdCBjaGFyKiBvKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEY4KG8sIHN0cmxlbihvKSkpCi17Ci0gICAgaWYgKG1TdHJpbmcgPT0gTlVMTCkgewotICAgICAgICBtU3RyaW5nID0gZ2V0RW1wdHlTdHJpbmcoKTsKLSAgICB9Ci19Ci0KLVN0cmluZzg6OlN0cmluZzgoY29uc3QgY2hhciogbywgc2l6ZV90IGxlbikKLSAgICA6IG1TdHJpbmcoYWxsb2NGcm9tVVRGOChvLCBsZW4pKQotewotICAgIGlmIChtU3RyaW5nID09IE5VTEwpIHsKLSAgICAgICAgbVN0cmluZyA9IGdldEVtcHR5U3RyaW5nKCk7Ci0gICAgfQotfQotCi1TdHJpbmc4OjpTdHJpbmc4KGNvbnN0IFN0cmluZzE2JiBvKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEYxNihvLnN0cmluZygpLCBvLnNpemUoKSkpCi17Ci19Ci0KLVN0cmluZzg6OlN0cmluZzgoY29uc3QgY2hhcjE2X3QqIG8pCi0gICAgOiBtU3RyaW5nKGFsbG9jRnJvbVVURjE2KG8sIHN0cmxlbjE2KG8pKSkKLXsKLX0KLQotU3RyaW5nODo6U3RyaW5nOChjb25zdCBjaGFyMTZfdCogbywgc2l6ZV90IGxlbikKLSAgICA6IG1TdHJpbmcoYWxsb2NGcm9tVVRGMTYobywgbGVuKSkKLXsKLX0KLQotU3RyaW5nODo6U3RyaW5nOChjb25zdCBjaGFyMzJfdCogbykKLSAgICA6IG1TdHJpbmcoYWxsb2NGcm9tVVRGMzIobywgc3RybGVuMzIobykpKQotewotfQotCi1TdHJpbmc4OjpTdHJpbmc4KGNvbnN0IGNoYXIzMl90KiBvLCBzaXplX3QgbGVuKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEYzMihvLCBsZW4pKQotewotfQotCi1TdHJpbmc4Ojp+U3RyaW5nOCgpCi17Ci0gICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKS0+cmVsZWFzZSgpOwotfQotCi1TdHJpbmc4IFN0cmluZzg6OmZvcm1hdChjb25zdCBjaGFyKiBmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3M7Ci0gICAgdmFfc3RhcnQoYXJncywgZm10KTsKLQotICAgIFN0cmluZzggcmVzdWx0KGZvcm1hdFYoZm10LCBhcmdzKSk7Ci0KLSAgICB2YV9lbmQoYXJncyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotU3RyaW5nOCBTdHJpbmc4Ojpmb3JtYXRWKGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcmdzKQotewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXRWKGZtdCwgYXJncyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBTdHJpbmc4OjpjbGVhcigpIHsKLSAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpLT5yZWxlYXNlKCk7Ci0gICAgbVN0cmluZyA9IGdldEVtcHR5U3RyaW5nKCk7Ci19Ci0KLXZvaWQgU3RyaW5nODo6c2V0VG8oY29uc3QgU3RyaW5nOCYgb3RoZXIpCi17Ci0gICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShvdGhlci5tU3RyaW5nKS0+YWNxdWlyZSgpOwotICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZyktPnJlbGVhc2UoKTsKLSAgICBtU3RyaW5nID0gb3RoZXIubVN0cmluZzsKLX0KLQotc3RhdHVzX3QgU3RyaW5nODo6c2V0VG8oY29uc3QgY2hhciogb3RoZXIpCi17Ci0gICAgY29uc3QgY2hhciAqbmV3U3RyaW5nID0gYWxsb2NGcm9tVVRGOChvdGhlciwgc3RybGVuKG90aGVyKSk7Ci0gICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKS0+cmVsZWFzZSgpOwotICAgIG1TdHJpbmcgPSBuZXdTdHJpbmc7Ci0gICAgaWYgKG1TdHJpbmcpIHJldHVybiBOT19FUlJPUjsKLQotICAgIG1TdHJpbmcgPSBnZXRFbXB0eVN0cmluZygpOwotICAgIHJldHVybiBOT19NRU1PUlk7Ci19Ci0KLXN0YXR1c190IFN0cmluZzg6OnNldFRvKGNvbnN0IGNoYXIqIG90aGVyLCBzaXplX3QgbGVuKQotewotICAgIGNvbnN0IGNoYXIgKm5ld1N0cmluZyA9IGFsbG9jRnJvbVVURjgob3RoZXIsIGxlbik7Ci0gICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKS0+cmVsZWFzZSgpOwotICAgIG1TdHJpbmcgPSBuZXdTdHJpbmc7Ci0gICAgaWYgKG1TdHJpbmcpIHJldHVybiBOT19FUlJPUjsKLQotICAgIG1TdHJpbmcgPSBnZXRFbXB0eVN0cmluZygpOwotICAgIHJldHVybiBOT19NRU1PUlk7Ci19Ci0KLXN0YXR1c190IFN0cmluZzg6OnNldFRvKGNvbnN0IGNoYXIxNl90KiBvdGhlciwgc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBjaGFyICpuZXdTdHJpbmcgPSBhbGxvY0Zyb21VVEYxNihvdGhlciwgbGVuKTsKLSAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpLT5yZWxlYXNlKCk7Ci0gICAgbVN0cmluZyA9IG5ld1N0cmluZzsKLSAgICBpZiAobVN0cmluZykgcmV0dXJuIE5PX0VSUk9SOwotCi0gICAgbVN0cmluZyA9IGdldEVtcHR5U3RyaW5nKCk7Ci0gICAgcmV0dXJuIE5PX01FTU9SWTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nODo6c2V0VG8oY29uc3QgY2hhcjMyX3QqIG90aGVyLCBzaXplX3QgbGVuKQotewotICAgIGNvbnN0IGNoYXIgKm5ld1N0cmluZyA9IGFsbG9jRnJvbVVURjMyKG90aGVyLCBsZW4pOwotICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZyktPnJlbGVhc2UoKTsKLSAgICBtU3RyaW5nID0gbmV3U3RyaW5nOwotICAgIGlmIChtU3RyaW5nKSByZXR1cm4gTk9fRVJST1I7Ci0KLSAgICBtU3RyaW5nID0gZ2V0RW1wdHlTdHJpbmcoKTsKLSAgICByZXR1cm4gTk9fTUVNT1JZOwotfQotCi1zdGF0dXNfdCBTdHJpbmc4OjphcHBlbmQoY29uc3QgU3RyaW5nOCYgb3RoZXIpCi17Ci0gICAgY29uc3Qgc2l6ZV90IG90aGVyTGVuID0gb3RoZXIuYnl0ZXMoKTsKLSAgICBpZiAoYnl0ZXMoKSA9PSAwKSB7Ci0gICAgICAgIHNldFRvKG90aGVyKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gZWxzZSBpZiAob3RoZXJMZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlYWxfYXBwZW5kKG90aGVyLnN0cmluZygpLCBvdGhlckxlbik7Ci19Ci0KLXN0YXR1c190IFN0cmluZzg6OmFwcGVuZChjb25zdCBjaGFyKiBvdGhlcikKLXsKLSAgICByZXR1cm4gYXBwZW5kKG90aGVyLCBzdHJsZW4ob3RoZXIpKTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nODo6YXBwZW5kKGNvbnN0IGNoYXIqIG90aGVyLCBzaXplX3Qgb3RoZXJMZW4pCi17Ci0gICAgaWYgKGJ5dGVzKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gc2V0VG8ob3RoZXIsIG90aGVyTGVuKTsKLSAgICB9IGVsc2UgaWYgKG90aGVyTGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiByZWFsX2FwcGVuZChvdGhlciwgb3RoZXJMZW4pOwotfQotCi1zdGF0dXNfdCBTdHJpbmc4OjphcHBlbmRGb3JtYXQoY29uc3QgY2hhciogZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBhcHBlbmRGb3JtYXRWKGZtdCwgYXJncyk7Ci0KLSAgICB2YV9lbmQoYXJncyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgU3RyaW5nODo6YXBwZW5kRm9ybWF0Vihjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXJncykKLXsKLSAgICBpbnQgcmVzdWx0ID0gTk9fRVJST1I7Ci0gICAgaW50IG4gPSB2c25wcmludGYoTlVMTCwgMCwgZm10LCBhcmdzKTsKLSAgICBpZiAobiAhPSAwKSB7Ci0gICAgICAgIHNpemVfdCBvbGRMZW5ndGggPSBsZW5ndGgoKTsKLSAgICAgICAgY2hhciogYnVmID0gbG9ja0J1ZmZlcihvbGRMZW5ndGggKyBuKTsKLSAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgdnNucHJpbnRmKGJ1ZiArIG9sZExlbmd0aCwgbiArIDEsIGZtdCwgYXJncyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgU3RyaW5nODo6cmVhbF9hcHBlbmQoY29uc3QgY2hhciogb3RoZXIsIHNpemVfdCBvdGhlckxlbikKLXsKLSAgICBjb25zdCBzaXplX3QgbXlMZW4gPSBieXRlcygpOwotICAgIAotICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKQotICAgICAgICAtPmVkaXRSZXNpemUobXlMZW4rb3RoZXJMZW4rMSk7Ci0gICAgaWYgKGJ1ZikgewotICAgICAgICBjaGFyKiBzdHIgPSAoY2hhciopYnVmLT5kYXRhKCk7Ci0gICAgICAgIG1TdHJpbmcgPSBzdHI7Ci0gICAgICAgIHN0ciArPSBteUxlbjsKLSAgICAgICAgbWVtY3B5KHN0ciwgb3RoZXIsIG90aGVyTGVuKTsKLSAgICAgICAgc3RyW290aGVyTGVuXSA9ICdcMCc7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX01FTU9SWTsKLX0KLQotY2hhciogU3RyaW5nODo6bG9ja0J1ZmZlcihzaXplX3Qgc2l6ZSkKLXsKLSAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZykKLSAgICAgICAgLT5lZGl0UmVzaXplKHNpemUrMSk7Ci0gICAgaWYgKGJ1ZikgewotICAgICAgICBjaGFyKiBzdHIgPSAoY2hhciopYnVmLT5kYXRhKCk7Ci0gICAgICAgIG1TdHJpbmcgPSBzdHI7Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFN0cmluZzg6OnVubG9ja0J1ZmZlcigpCi17Ci0gICAgdW5sb2NrQnVmZmVyKHN0cmxlbihtU3RyaW5nKSk7Ci19Ci0KLXN0YXR1c190IFN0cmluZzg6OnVubG9ja0J1ZmZlcihzaXplX3Qgc2l6ZSkKLXsKLSAgICBpZiAoc2l6ZSAhPSB0aGlzLT5zaXplKCkpIHsKLSAgICAgICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpCi0gICAgICAgICAgICAtPmVkaXRSZXNpemUoc2l6ZSsxKTsKLSAgICAgICAgaWYgKCEgYnVmKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhciogc3RyID0gKGNoYXIqKWJ1Zi0+ZGF0YSgpOwotICAgICAgICBzdHJbc2l6ZV0gPSAwOwotICAgICAgICBtU3RyaW5nID0gc3RyOwotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3NpemVfdCBTdHJpbmc4OjpmaW5kKGNvbnN0IGNoYXIqIG90aGVyLCBzaXplX3Qgc3RhcnQpIGNvbnN0Ci17Ci0gICAgc2l6ZV90IGxlbiA9IHNpemUoKTsKLSAgICBpZiAoc3RhcnQgPj0gbGVuKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgY29uc3QgY2hhciogcyA9IG1TdHJpbmcrc3RhcnQ7Ci0gICAgY29uc3QgY2hhciogcCA9IHN0cnN0cihzLCBvdGhlcik7Ci0gICAgcmV0dXJuIHAgPyBwLW1TdHJpbmcgOiAtMTsKLX0KLQotdm9pZCBTdHJpbmc4Ojp0b0xvd2VyKCkKLXsKLSAgICB0b0xvd2VyKDAsIHNpemUoKSk7Ci19Ci0KLXZvaWQgU3RyaW5nODo6dG9Mb3dlcihzaXplX3Qgc3RhcnQsIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgY29uc3Qgc2l6ZV90IGxlbiA9IHNpemUoKTsKLSAgICBpZiAoc3RhcnQgPj0gbGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHN0YXJ0K2xlbmd0aCA+IGxlbikgewotICAgICAgICBsZW5ndGggPSBsZW4tc3RhcnQ7Ci0gICAgfQotICAgIGNoYXIqIGJ1ZiA9IGxvY2tCdWZmZXIobGVuKTsKLSAgICBidWYgKz0gc3RhcnQ7Ci0gICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKLSAgICAgICAgKmJ1ZiA9IHRvbG93ZXIoKmJ1Zik7Ci0gICAgICAgIGJ1ZisrOwotICAgICAgICBsZW5ndGgtLTsKLSAgICB9Ci0gICAgdW5sb2NrQnVmZmVyKGxlbik7Ci19Ci0KLXZvaWQgU3RyaW5nODo6dG9VcHBlcigpCi17Ci0gICAgdG9VcHBlcigwLCBzaXplKCkpOwotfQotCi12b2lkIFN0cmluZzg6OnRvVXBwZXIoc2l6ZV90IHN0YXJ0LCBzaXplX3QgbGVuZ3RoKQotewotICAgIGNvbnN0IHNpemVfdCBsZW4gPSBzaXplKCk7Ci0gICAgaWYgKHN0YXJ0ID49IGxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChzdGFydCtsZW5ndGggPiBsZW4pIHsKLSAgICAgICAgbGVuZ3RoID0gbGVuLXN0YXJ0OwotICAgIH0KLSAgICBjaGFyKiBidWYgPSBsb2NrQnVmZmVyKGxlbik7Ci0gICAgYnVmICs9IHN0YXJ0OwotICAgIHdoaWxlIChsZW5ndGggPiAwKSB7Ci0gICAgICAgICpidWYgPSB0b3VwcGVyKCpidWYpOwotICAgICAgICBidWYrKzsKLSAgICAgICAgbGVuZ3RoLS07Ci0gICAgfQotICAgIHVubG9ja0J1ZmZlcihsZW4pOwotfQotCi1zaXplX3QgU3RyaW5nODo6Z2V0VXRmMzJMZW5ndGgoKSBjb25zdAotewotICAgIHJldHVybiB1dGY4X3RvX3V0ZjMyX2xlbmd0aChtU3RyaW5nLCBsZW5ndGgoKSk7Ci19Ci0KLWludDMyX3QgU3RyaW5nODo6Z2V0VXRmMzJBdChzaXplX3QgaW5kZXgsIHNpemVfdCAqbmV4dF9pbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gdXRmMzJfZnJvbV91dGY4X2F0KG1TdHJpbmcsIGxlbmd0aCgpLCBpbmRleCwgbmV4dF9pbmRleCk7Ci19Ci0KLXZvaWQgU3RyaW5nODo6Z2V0VXRmMzIoY2hhcjMyX3QqIGRzdCkgY29uc3QKLXsKLSAgICB1dGY4X3RvX3V0ZjMyKG1TdHJpbmcsIGxlbmd0aCgpLCBkc3QpOwotfQotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCBTdHJpbmc4JiB2YWwpCi17Ci0gICAgdG8gPDwgdmFsLnN0cmluZygpOwotICAgIHJldHVybiB0bzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQYXRoIGZ1bmN0aW9ucwotCi12b2lkIFN0cmluZzg6OnNldFBhdGhOYW1lKGNvbnN0IGNoYXIqIG5hbWUpCi17Ci0gICAgc2V0UGF0aE5hbWUobmFtZSwgc3RybGVuKG5hbWUpKTsKLX0KLQotdm9pZCBTdHJpbmc4OjpzZXRQYXRoTmFtZShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgbGVuKQotewotICAgIGNoYXIqIGJ1ZiA9IGxvY2tCdWZmZXIobGVuKTsKLQotICAgIG1lbWNweShidWYsIG5hbWUsIGxlbik7Ci0KLSAgICAvLyByZW1vdmUgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IsIGlmIHByZXNlbnQKLSAgICBpZiAobGVuID4gMCAmJiBidWZbbGVuLTFdID09IE9TX1BBVEhfU0VQQVJBVE9SKQotICAgICAgICBsZW4tLTsKLQotICAgIGJ1ZltsZW5dID0gJ1wwJzsKLQotICAgIHVubG9ja0J1ZmZlcihsZW4pOwotfQotCi1TdHJpbmc4IFN0cmluZzg6OmdldFBhdGhMZWFmKHZvaWQpIGNvbnN0Ci17Ci0gICAgY29uc3QgY2hhciogY3A7Ci0gICAgY29uc3QgY2hhcipjb25zdCBidWYgPSBtU3RyaW5nOwotCi0gICAgY3AgPSBzdHJyY2hyKGJ1ZiwgT1NfUEFUSF9TRVBBUkFUT1IpOwotICAgIGlmIChjcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gU3RyaW5nOCgqdGhpcyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gU3RyaW5nOChjcCsxKTsKLX0KLQotU3RyaW5nOCBTdHJpbmc4OjpnZXRQYXRoRGlyKHZvaWQpIGNvbnN0Ci17Ci0gICAgY29uc3QgY2hhciogY3A7Ci0gICAgY29uc3QgY2hhcipjb25zdCBzdHIgPSBtU3RyaW5nOwotCi0gICAgY3AgPSBzdHJyY2hyKHN0ciwgT1NfUEFUSF9TRVBBUkFUT1IpOwotICAgIGlmIChjcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gU3RyaW5nOCgiIik7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gU3RyaW5nOChzdHIsIGNwIC0gc3RyKTsKLX0KLQotU3RyaW5nOCBTdHJpbmc4Ojp3YWxrUGF0aChTdHJpbmc4KiBvdXRSZW1haW5zKSBjb25zdAotewotICAgIGNvbnN0IGNoYXIqIGNwOwotICAgIGNvbnN0IGNoYXIqY29uc3Qgc3RyID0gbVN0cmluZzsKLSAgICBjb25zdCBjaGFyKiBidWYgPSBzdHI7Ci0KLSAgICBjcCA9IHN0cmNocihidWYsIE9TX1BBVEhfU0VQQVJBVE9SKTsKLSAgICBpZiAoY3AgPT0gYnVmKSB7Ci0gICAgICAgIC8vIGRvbid0IGluY2x1ZGUgYSBsZWFkaW5nICcvJy4KLSAgICAgICAgYnVmID0gYnVmKzE7Ci0gICAgICAgIGNwID0gc3RyY2hyKGJ1ZiwgT1NfUEFUSF9TRVBBUkFUT1IpOwotICAgIH0KLQotICAgIGlmIChjcCA9PSBOVUxMKSB7Ci0gICAgICAgIFN0cmluZzggcmVzID0gYnVmICE9IHN0ciA/IFN0cmluZzgoYnVmKSA6ICp0aGlzOwotICAgICAgICBpZiAob3V0UmVtYWlucykgKm91dFJlbWFpbnMgPSBTdHJpbmc4KCIiKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IHJlcyhidWYsIGNwLWJ1Zik7Ci0gICAgaWYgKG91dFJlbWFpbnMpICpvdXRSZW1haW5zID0gU3RyaW5nOChjcCsxKTsKLSAgICByZXR1cm4gcmVzOwotfQotCi0vKgotICogSGVscGVyIGZ1bmN0aW9uIGZvciBmaW5kaW5nIHRoZSBzdGFydCBvZiBhbiBleHRlbnNpb24gaW4gYSBwYXRobmFtZS4KLSAqCi0gKiBSZXR1cm5zIGEgcG9pbnRlciBpbnNpZGUgbVN0cmluZywgb3IgTlVMTCBpZiBubyBleHRlbnNpb24gd2FzIGZvdW5kLgotICovCi1jaGFyKiBTdHJpbmc4OjpmaW5kX2V4dGVuc2lvbih2b2lkKSBjb25zdAotewotICAgIGNvbnN0IGNoYXIqIGxhc3RTbGFzaDsKLSAgICBjb25zdCBjaGFyKiBsYXN0RG90OwotICAgIGludCBleHRMZW47Ci0gICAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gbVN0cmluZzsKLQotICAgIC8vIG9ubHkgbG9vayBhdCB0aGUgZmlsZW5hbWUKLSAgICBsYXN0U2xhc2ggPSBzdHJyY2hyKHN0ciwgT1NfUEFUSF9TRVBBUkFUT1IpOwotICAgIGlmIChsYXN0U2xhc2ggPT0gTlVMTCkKLSAgICAgICAgbGFzdFNsYXNoID0gc3RyOwotICAgIGVsc2UKLSAgICAgICAgbGFzdFNsYXNoKys7Ci0KLSAgICAvLyBmaW5kIHRoZSBsYXN0IGRvdAotICAgIGxhc3REb3QgPSBzdHJyY2hyKGxhc3RTbGFzaCwgJy4nKTsKLSAgICBpZiAobGFzdERvdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8vIGxvb2tzIGdvb2QsIHNoaXAgaXQKLSAgICByZXR1cm4gY29uc3RfY2FzdDxjaGFyKj4obGFzdERvdCk7Ci19Ci0KLVN0cmluZzggU3RyaW5nODo6Z2V0UGF0aEV4dGVuc2lvbih2b2lkKSBjb25zdAotewotICAgIGNoYXIqIGV4dDsKLQotICAgIGV4dCA9IGZpbmRfZXh0ZW5zaW9uKCk7Ci0gICAgaWYgKGV4dCAhPSBOVUxMKQotICAgICAgICByZXR1cm4gU3RyaW5nOChleHQpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoIiIpOwotfQotCi1TdHJpbmc4IFN0cmluZzg6OmdldEJhc2VQYXRoKHZvaWQpIGNvbnN0Ci17Ci0gICAgY2hhciogZXh0OwotICAgIGNvbnN0IGNoYXIqIGNvbnN0IHN0ciA9IG1TdHJpbmc7Ci0KLSAgICBleHQgPSBmaW5kX2V4dGVuc2lvbigpOwotICAgIGlmIChleHQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoKnRoaXMpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoc3RyLCBleHQgLSBzdHIpOwotfQotCi1TdHJpbmc4JiBTdHJpbmc4OjphcHBlbmRQYXRoKGNvbnN0IGNoYXIqIG5hbWUpCi17Ci0gICAgLy8gVE9ETzogVGhlIHRlc3QgYmVsb3cgd2lsbCBmYWlsIGZvciBXaW4zMiBwYXRocy4gRml4IGxhdGVyIG9yIGlnbm9yZS4KLSAgICBpZiAobmFtZVswXSAhPSBPU19QQVRIX1NFUEFSQVRPUikgewotICAgICAgICBpZiAoKm5hbWUgPT0gJ1wwJykgewotICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGxlbiA9IGxlbmd0aCgpOwotICAgICAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgICAgIC8vIG5vIGV4aXN0aW5nIGZpbGVuYW1lLCBqdXN0IHVzZSB0aGUgbmV3IG9uZQotICAgICAgICAgICAgc2V0UGF0aE5hbWUobmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIHJvb20gZm9yIG9sZFBhdGggKyAnLycgKyBuZXdQYXRoCi0gICAgICAgIGludCBuZXdsZW4gPSBzdHJsZW4obmFtZSk7Ci0KLSAgICAgICAgY2hhciogYnVmID0gbG9ja0J1ZmZlcihsZW4rMStuZXdsZW4pOwotCi0gICAgICAgIC8vIGluc2VydCBhICcvJyBpZiBuZWVkZWQKLSAgICAgICAgaWYgKGJ1ZltsZW4tMV0gIT0gT1NfUEFUSF9TRVBBUkFUT1IpCi0gICAgICAgICAgICBidWZbbGVuKytdID0gT1NfUEFUSF9TRVBBUkFUT1I7Ci0KLSAgICAgICAgbWVtY3B5KGJ1ZitsZW4sIG5hbWUsIG5ld2xlbisxKTsKLSAgICAgICAgbGVuICs9IG5ld2xlbjsKLQotICAgICAgICB1bmxvY2tCdWZmZXIobGVuKTsKLQotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0UGF0aE5hbWUobmFtZSk7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci19Ci0KLVN0cmluZzgmIFN0cmluZzg6OmNvbnZlcnRUb1Jlc1BhdGgoKQotewotI2lmIE9TX1BBVEhfU0VQQVJBVE9SICE9IFJFU19QQVRIX1NFUEFSQVRPUgotICAgIHNpemVfdCBsZW4gPSBsZW5ndGgoKTsKLSAgICBpZiAobGVuID4gMCkgewotICAgICAgICBjaGFyICogYnVmID0gbG9ja0J1ZmZlcihsZW4pOwotICAgICAgICBmb3IgKGNoYXIgKiBlbmQgPSBidWYgKyBsZW47IGJ1ZiA8IGVuZDsgKytidWYpIHsKLSAgICAgICAgICAgIGlmICgqYnVmID09IE9TX1BBVEhfU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgICpidWYgPSBSRVNfUEFUSF9TRVBBUkFUT1I7Ci0gICAgICAgIH0KLSAgICAgICAgdW5sb2NrQnVmZmVyKGxlbik7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuICp0aGlzOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9TdHJpbmdBcnJheS5jcHAgYi9saWJzL3V0aWxzL1N0cmluZ0FycmF5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0MmQ2OC4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1N0cmluZ0FycmF5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFNvcnRhYmxlIGFycmF5IG9mIHN0cmluZ3MuICBTVEwtaXNoLCBidXQgU1RMLWZyZWUuCi0vLyAgCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZ0FycmF5Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8KLS8vIEFuIGV4cGFuZGluZyBhcnJheSBvZiBzdHJpbmdzLiAgQWRkLCBnZXQsIHNvcnQsIGRlbGV0ZS4KLS8vCi1TdHJpbmdBcnJheTo6U3RyaW5nQXJyYXkoKQotICAgIDogbU1heCgwKSwgbUN1cnJlbnQoMCksIG1BcnJheShOVUxMKQotewotfQotCi1TdHJpbmdBcnJheTo6IH5TdHJpbmdBcnJheSgpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DdXJyZW50OyBpKyspCi0gICAgICAgIGRlbGV0ZVtdIG1BcnJheVtpXTsKLSAgICBkZWxldGVbXSBtQXJyYXk7Ci19Ci0KLS8vCi0vLyBBZGQgYSBzdHJpbmcuICBBIGNvcHkgb2YgdGhlIHN0cmluZyBpcyBtYWRlLgotLy8KLWJvb2wgU3RyaW5nQXJyYXk6OnB1c2hfYmFjayhjb25zdCBjaGFyKiBzdHIpIHsKLSAgICBpZiAobUN1cnJlbnQgPj0gbU1heCkgewotICAgICAgICBjaGFyKiogdG1wOwotCi0gICAgICAgIGlmIChtTWF4ID09IDApCi0gICAgICAgICAgICBtTWF4ID0gMTY7ICAgICAgLy8gaW5pdGlhbCBzdG9yYWdlCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1NYXggKj0gMjsKLQotICAgICAgICB0bXAgPSBuZXcgY2hhcipbbU1heF07Ci0gICAgICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBtZW1jcHkodG1wLCBtQXJyYXksIG1DdXJyZW50ICogc2l6ZW9mKGNoYXIqKSk7Ci0gICAgICAgIGRlbGV0ZVtdIG1BcnJheTsKLSAgICAgICAgbUFycmF5ID0gdG1wOwotICAgIH0KLQotICAgIGludCBsZW4gPSBzdHJsZW4oc3RyKTsKLSAgICBtQXJyYXlbbUN1cnJlbnRdID0gbmV3IGNoYXJbbGVuKzFdOwotICAgIG1lbWNweShtQXJyYXlbbUN1cnJlbnRdLCBzdHIsIGxlbisxKTsKLSAgICBtQ3VycmVudCsrOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vCi0vLyBEZWxldGUgYW4gZW50cnkuCi0vLwotdm9pZCBTdHJpbmdBcnJheTo6ZXJhc2UoaW50IGlkeCkgewotICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBtQ3VycmVudCkKLSAgICAgICAgcmV0dXJuOwotICAgIGRlbGV0ZVtdIG1BcnJheVtpZHhdOwotICAgIGlmIChpZHggPCBtQ3VycmVudC0xKSB7Ci0gICAgICAgIG1lbW1vdmUoJm1BcnJheVtpZHhdLCAmbUFycmF5W2lkeCsxXSwKLSAgICAgICAgICAgICAgICAobUN1cnJlbnQtMSAtIGlkeCkgKiBzaXplb2YoY2hhciopKTsKLSAgICB9Ci0gICAgbUN1cnJlbnQtLTsKLX0KLQotLy8KLS8vIFNvcnQgdGhlIGFycmF5LgotLy8KLXZvaWQgU3RyaW5nQXJyYXk6OnNvcnQoaW50ICgqY29tcGFyZSkoY29uc3Qgdm9pZCosIGNvbnN0IHZvaWQqKSkgewotICAgIHFzb3J0KG1BcnJheSwgbUN1cnJlbnQsIHNpemVvZihjaGFyKiksIGNvbXBhcmUpOwotfQotCi0vLwotLy8gUGFzcyB0aGlzIHRvIHRoZSBzb3J0IHJvdXRpbmUgdG8gZG8gYW4gYXNjZW5kaW5nIGFscGhhYmV0aWNhbCBzb3J0LgotLy8KLWludCBTdHJpbmdBcnJheTo6Y21wQXNjZW5kaW5nQWxwaGEoY29uc3Qgdm9pZCogcHN0cjEsIGNvbnN0IHZvaWQqIHBzdHIyKSB7Ci0gICAgcmV0dXJuIHN0cmNtcCgqKGNvbnN0IGNoYXIqKilwc3RyMSwgKihjb25zdCBjaGFyKiopcHN0cjIpOwotfQotCi0vLwotLy8gU2V0IGVudHJ5IE4gdG8gc3BlY2lmaWVkIHN0cmluZy4KLS8vIFtzaG91bGQgdXNlIG9wZXJhdG9yW10gaGVyZV0KLS8vCi12b2lkIFN0cmluZ0FycmF5OjpzZXRFbnRyeShpbnQgaWR4LCBjb25zdCBjaGFyKiBzdHIpIHsKLSAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gbUN1cnJlbnQpCi0gICAgICAgIHJldHVybjsKLSAgICBkZWxldGVbXSBtQXJyYXlbaWR4XTsKLSAgICBpbnQgbGVuID0gc3RybGVuKHN0cik7Ci0gICAgbUFycmF5W2lkeF0gPSBuZXcgY2hhcltsZW4rMV07Ci0gICAgbWVtY3B5KG1BcnJheVtpZHhdLCBzdHIsIGxlbisxKTsKLX0KLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9TeXN0ZW1DbG9jay5jcHAgYi9saWJzL3V0aWxzL1N5c3RlbUNsb2NrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4YWMxMC4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1N5c3RlbUNsb2NrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKgotICogU3lzdGVtIGNsb2NrIGZ1bmN0aW9ucy4KLSAqLwotCi0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9ydGMuaD4KLSNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9hbmRyb2lkX2FsYXJtLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3lzdGVtQ2xvY2suaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2RlZmluZSBMT0dfVEFHICJTeXN0ZW1DbG9jayIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKgotICogU2V0IHRoZSBjdXJyZW50IHRpbWUuICBUaGlzIG9ubHkgd29ya3Mgd2hlbiBydW5uaW5nIGFzIHJvb3QuCi0gKi8KLWludCBzZXRDdXJyZW50VGltZU1pbGxpcyhpbnQ2NF90IG1pbGxpcykKLXsKLSNpZiBXSU4zMgotICAgIC8vIG5vdCBpbXBsZW1lbnRlZAotICAgIHJldHVybiAtMTsKLSNlbHNlCi0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi0gICAgc3RydWN0IHRpbWVzcGVjIHRzOwotICAgIGludCBmZDsKLSAgICBpbnQgcmVzOwotI2VuZGlmCi0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBpZiAobWlsbGlzIDw9IDAgfHwgbWlsbGlzIC8gMTAwMExMID49IElOVF9NQVgpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHR2LnR2X3NlYyA9ICh0aW1lX3QpIChtaWxsaXMgLyAxMDAwTEwpOwotICAgIHR2LnR2X3VzZWMgPSAoc3VzZWNvbmRzX3QpICgobWlsbGlzICUgMTAwMExMKSAqIDEwMDBMTCk7Ci0KLSAgICBBTE9HRCgiU2V0dGluZyB0aW1lIG9mIGRheSB0byBzZWM9JWRcbiIsIChpbnQpIHR2LnR2X3NlYyk7Ci0KLSNpZmRlZiBIQVZFX0FORFJPSURfT1MKLSAgICBmZCA9IG9wZW4oIi9kZXYvYWxhcm0iLCBPX1JEV1IpOwotICAgIGlmKGZkIDwgMCkgewotICAgICAgICBBTE9HVygiVW5hYmxlIHRvIG9wZW4gYWxhcm0gZHJpdmVyOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICB0cy50dl9zZWMgPSB0di50dl9zZWM7Ci0gICAgdHMudHZfbnNlYyA9IHR2LnR2X3VzZWMgKiAxMDAwOwotICAgIHJlcyA9IGlvY3RsKGZkLCBBTkRST0lEX0FMQVJNX1NFVF9SVEMsICZ0cyk7Ci0gICAgaWYocmVzIDwgMCkgewotICAgICAgICBBTE9HVygiVW5hYmxlIHRvIHNldCBydGMgdG8gJWxkOiAlc1xuIiwgdHYudHZfc2VjLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXQgPSAtMTsKLSAgICB9Ci0gICAgY2xvc2UoZmQpOwotI2Vsc2UKLSAgICBpZiAoc2V0dGltZW9mZGF5KCZ0diwgTlVMTCkgIT0gMCkgewotICAgICAgICBBTE9HVygiVW5hYmxlIHRvIHNldCBjbG9jayB0byAlZC4lZDogJXNcbiIsCi0gICAgICAgICAgICAoaW50KSB0di50dl9zZWMsIChpbnQpIHR2LnR2X3VzZWMsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldCA9IC0xOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIHJldDsKLSNlbmRpZiAvLyBXSU4zMgotfQotCi0vKgotICogbmF0aXZlIHB1YmxpYyBzdGF0aWMgbG9uZyB1cHRpbWVNaWxsaXMoKTsKLSAqLwotaW50NjRfdCB1cHRpbWVNaWxsaXMoKQotewotICAgIGludDY0X3Qgd2hlbiA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICByZXR1cm4gKGludDY0X3QpIG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyh3aGVuKTsKLX0KLQotLyoKLSAqIG5hdGl2ZSBwdWJsaWMgc3RhdGljIGxvbmcgZWxhcHNlZFJlYWx0aW1lKCk7Ci0gKi8KLWludDY0X3QgZWxhcHNlZFJlYWx0aW1lKCkKLXsKLSNpZmRlZiBIQVZFX0FORFJPSURfT1MKLSAgICBzdGF0aWMgaW50IHNfZmQgPSAtMTsKLQotICAgIGlmIChzX2ZkID09IC0xKSB7Ci0gICAgICAgIGludCBmZCA9IG9wZW4oIi9kZXYvYWxhcm0iLCBPX1JET05MWSk7Ci0gICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19jbXB4Y2hnKC0xLCBmZCwgJnNfZmQpKSB7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0gICAgaW50IHJlc3VsdCA9IGlvY3RsKHNfZmQsCi0gICAgICAgICAgICBBTkRST0lEX0FMQVJNX0dFVF9USU1FKEFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRSksICZ0cyk7Ci0KLSAgICBpZiAocmVzdWx0ID09IDApIHsKLSAgICAgICAgaW50NjRfdCB3aGVuID0gc2Vjb25kc190b19uYW5vc2Vjb25kcyh0cy50dl9zZWMpICsgdHMudHZfbnNlYzsKLSAgICAgICAgcmV0dXJuIChpbnQ2NF90KSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMod2hlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gWFhYOiB0aGVyZSB3YXMgYW4gZXJyb3IsIHByb2JhYmx5IGJlY2F1c2UgdGhlIGRyaXZlciBkaWRuJ3QKLSAgICAgICAgLy8gZXhpc3QgLi4uIHRoaXMgc2hvdWxkIHJldHVybgotICAgICAgICAvLyBhIHJlYWwgZXJyb3IsIGxpa2UgYW4gZXhjZXB0aW9uIQotICAgICAgICBpbnQ2NF90IHdoZW4gPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgICAgIHJldHVybiAoaW50NjRfdCkgbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHdoZW4pOwotICAgIH0KLSNlbHNlCi0gICAgaW50NjRfdCB3aGVuID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIHJldHVybiAoaW50NjRfdCkgbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHdoZW4pOwotI2VuZGlmCi19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1RleHRPdXRwdXQuY3BwIGIvbGlicy91dGlscy9UZXh0T3V0cHV0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0ODIzZC4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1RleHRPdXRwdXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvVGV4dE91dHB1dC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRleHRPdXRwdXQ6OlRleHRPdXRwdXQoKSB7IAotfQotCi1UZXh0T3V0cHV0Ojp+VGV4dE91dHB1dCgpIHsgCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBib29sIHZhbCkKLXsKLSAgICBpZiAodmFsKSB0by5wcmludCgidHJ1ZSIsIDQpOwotICAgIGVsc2UgdG8ucHJpbnQoImZhbHNlIiwgNSk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBpbnQgdmFsKQotewotICAgIGNoYXIgYnVmWzE2XTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgdmFsKTsKLSAgICB0by5wcmludChidWYsIHN0cmxlbihidWYpKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGxvbmcgdmFsKQotewotICAgIGNoYXIgYnVmWzE2XTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVsZCIsIHZhbCk7Ci0gICAgdG8ucHJpbnQoYnVmLCBzdHJsZW4oYnVmKSk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCB1bnNpZ25lZCBpbnQgdmFsKQotewotICAgIGNoYXIgYnVmWzE2XTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiV1IiwgdmFsKTsKLSAgICB0by5wcmludChidWYsIHN0cmxlbihidWYpKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIHVuc2lnbmVkIGxvbmcgdmFsKQotewotICAgIGNoYXIgYnVmWzE2XTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVsdSIsIHZhbCk7Ci0gICAgdG8ucHJpbnQoYnVmLCBzdHJsZW4oYnVmKSk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBsb25nIGxvbmcgdmFsKQotewotICAgIGNoYXIgYnVmWzMyXTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVMZCIsIHZhbCk7Ci0gICAgdG8ucHJpbnQoYnVmLCBzdHJsZW4oYnVmKSk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsKQotewotICAgIGNoYXIgYnVmWzMyXTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVMdSIsIHZhbCk7Ci0gICAgdG8ucHJpbnQoYnVmLCBzdHJsZW4oYnVmKSk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi1zdGF0aWMgVGV4dE91dHB1dCYgcHJpbnRfZmxvYXQoVGV4dE91dHB1dCYgdG8sIGRvdWJsZSB2YWx1ZSkKLXsKLSAgICBjaGFyIGJ1Zls2NF07Ci0gICAgc3ByaW50ZihidWYsICIlZyIsIHZhbHVlKTsKLSAgICBpZiggIXN0cmNocihidWYsICcuJykgJiYgIXN0cmNocihidWYsICdlJykgJiYKLSAgICAgICAgIXN0cmNocihidWYsICdFJykgKSB7Ci0gICAgICAgIHN0cm5jYXQoYnVmLCAiLjAiLCBzaXplb2YoYnVmKS0xKTsKLSAgICB9Ci0gICAgdG8ucHJpbnQoYnVmLCBzdHJsZW4oYnVmKSk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBmbG9hdCB2YWwpCi17Ci0gICAgcmV0dXJuIHByaW50X2Zsb2F0KHRvLHZhbCk7Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGRvdWJsZSB2YWwpCi17Ci0gICAgcmV0dXJuIHByaW50X2Zsb2F0KHRvLHZhbCk7Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGNvbnN0IHZvaWQqIHZhbCkKLXsKLSAgICBjaGFyIGJ1ZlsxNl07Ci0gICAgc3ByaW50ZihidWYsICIlcCIsIHZhbCk7Ci0gICAgdG8ucHJpbnQoYnVmLCBzdHJsZW4oYnVmKSk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi1zdGF0aWMgdm9pZCB0ZXh0T3V0cHV0UHJpbnRlcih2b2lkKiBjb29raWUsIGNvbnN0IGNoYXIqIHR4dCkKLXsKLSAgICAoKFRleHRPdXRwdXQqKWNvb2tpZSktPnByaW50KHR4dCwgc3RybGVuKHR4dCkpOwotfQotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCBUeXBlQ29kZSYgdmFsKQotewotICAgIHByaW50VHlwZUNvZGUodmFsLnR5cGVDb2RlKCksIHRleHRPdXRwdXRQcmludGVyLCAodm9pZCopJnRvKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLUhleER1bXA6OkhleER1bXAoY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGJ5dGVzUGVyTGluZSkKLSAgICA6IG1CdWZmZXIoYnVmKQotICAgICwgbVNpemUoc2l6ZSkKLSAgICAsIG1CeXRlc1BlckxpbmUoYnl0ZXNQZXJMaW5lKQotICAgICwgbVNpbmdsZUxpbmVDdXRvZmYoMTYpCi0gICAgLCBtQWxpZ25tZW50KDQpCi0gICAgLCBtQ0FycmF5U3R5bGUoZmFsc2UpCi17Ci0gICAgaWYgKGJ5dGVzUGVyTGluZSA+PSAxNikgbUFsaWdubWVudCA9IDQ7Ci0gICAgZWxzZSBpZiAoYnl0ZXNQZXJMaW5lID49IDgpIG1BbGlnbm1lbnQgPSAyOwotICAgIGVsc2UgbUFsaWdubWVudCA9IDE7Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGNvbnN0IEhleER1bXAmIHZhbCkKLXsKLSAgICBwcmludEhleERhdGEoMCwgdmFsLmJ1ZmZlcigpLCB2YWwuc2l6ZSgpLCB2YWwuYnl0ZXNQZXJMaW5lKCksCi0gICAgICAgIHZhbC5zaW5nbGVMaW5lQ3V0b2ZmKCksIHZhbC5hbGlnbm1lbnQoKSwgdmFsLmNhcnJheVN0eWxlKCksCi0gICAgICAgIHRleHRPdXRwdXRQcmludGVyLCAodm9pZCopJnRvKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1RocmVhZHMuY3BwIGIvbGlicy91dGlscy9UaHJlYWRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyMDdmNS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1RocmVhZHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJsaWJ1dGlscy50aHJlYWRzIgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL3NjaGVkX3BvbGljeS5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPG1lbW9yeS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0jIGluY2x1ZGUgPHB0aHJlYWQuaD4KLSMgaW5jbHVkZSA8c2NoZWQuaD4KLSMgaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi0jIGluY2x1ZGUgPGJpb25pY19wdGhyZWFkLmg+Ci0jZW5kaWYKLSNlbGlmIGRlZmluZWQoSEFWRV9XSU4zMl9USFJFQURTKQotIyBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jIGluY2x1ZGUgPHN0ZGludC5oPgotIyBpbmNsdWRlIDxwcm9jZXNzLmg+Ci0jIGRlZmluZSBIQVZFX0NSRUFURVRIUkVBRCAgLy8gQ3lnd2luLCB2cy4gSEFWRV9fQkVHSU5USFJFQURFWCBmb3IgTWluR1cKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIQVZFX1BSQ1RMKQotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2VuZGlmCi0KLS8qCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqICAgICAgVGhyZWFkIHdyYXBwZXJzCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoKLSAqIENyZWF0ZSBhbmQgcnVuIGEgbmV3IHRocmVhZC4KLSAqCi0gKiBXZSBjcmVhdGUgaXQgImRldGFjaGVkIiwgc28gaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZi4KLSAqLwotCi10eXBlZGVmIHZvaWQqICgqYW5kcm9pZF9wdGhyZWFkX2VudHJ5KSh2b2lkKik7Ci0KLXN0YXRpYyBwdGhyZWFkX29uY2VfdCBnRG9TY2hlZHVsaW5nR3JvdXBPbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7Ci1zdGF0aWMgYm9vbCBnRG9TY2hlZHVsaW5nR3JvdXAgPSB0cnVlOwotCi1zdGF0aWMgdm9pZCBjaGVja0RvU2NoZWR1bGluZ0dyb3VwKHZvaWQpIHsKLSAgICBjaGFyIGJ1ZltQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGludCBsZW4gPSBwcm9wZXJ0eV9nZXQoImRlYnVnLnN5cy5ub3NjaGVkZ3JvdXBzIiwgYnVmLCAiIik7Ci0gICAgaWYgKGxlbiA+IDApIHsKLSAgICAgICAgaW50IHRlbXA7Ci0gICAgICAgIGlmIChzc2NhbmYoYnVmLCAiJWQiLCAmdGVtcCkgPT0gMSkgewotICAgICAgICAgICAgZ0RvU2NoZWR1bGluZ0dyb3VwID0gdGVtcCA9PSAwOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdHJ1Y3QgdGhyZWFkX2RhdGFfdCB7Ci0gICAgdGhyZWFkX2Z1bmNfdCAgIGVudHJ5RnVuY3Rpb247Ci0gICAgdm9pZCogICAgICAgICAgIHVzZXJEYXRhOwotICAgIGludCAgICAgICAgICAgICBwcmlvcml0eTsKLSAgICBjaGFyICogICAgICAgICAgdGhyZWFkTmFtZTsKLQotICAgIC8vIHdlIHVzZSB0aGlzIHRyYW1wb2xpbmUgd2hlbiB3ZSBuZWVkIHRvIHNldCB0aGUgcHJpb3JpdHkgd2l0aAotICAgIC8vIG5pY2Uvc2V0cHJpb3JpdHksIGFuZCBuYW1lIHdpdGggcHJjdGwuCi0gICAgc3RhdGljIGludCB0cmFtcG9saW5lKGNvbnN0IHRocmVhZF9kYXRhX3QqIHQpIHsKLSAgICAgICAgdGhyZWFkX2Z1bmNfdCBmID0gdC0+ZW50cnlGdW5jdGlvbjsKLSAgICAgICAgdm9pZCogdSA9IHQtPnVzZXJEYXRhOwotICAgICAgICBpbnQgcHJpbyA9IHQtPnByaW9yaXR5OwotICAgICAgICBjaGFyICogbmFtZSA9IHQtPnRocmVhZE5hbWU7Ci0gICAgICAgIGRlbGV0ZSB0OwotICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIHByaW8pOwotICAgICAgICBwdGhyZWFkX29uY2UoJmdEb1NjaGVkdWxpbmdHcm91cE9uY2UsIGNoZWNrRG9TY2hlZHVsaW5nR3JvdXApOwotICAgICAgICBpZiAoZ0RvU2NoZWR1bGluZ0dyb3VwKSB7Ci0gICAgICAgICAgICBpZiAocHJpbyA+PSBBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICBzZXRfc2NoZWRfcG9saWN5KGFuZHJvaWRHZXRUaWQoKSwgU1BfQkFDS0dST1VORCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldF9zY2hlZF9wb2xpY3koYW5kcm9pZEdldFRpZCgpLCBTUF9GT1JFR1JPVU5EKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG5hbWUpIHsKLSNpZiBkZWZpbmVkKEhBVkVfUFJDVEwpCi0gICAgICAgICAgICAvLyBNYWMgT1MgZG9lc24ndCBoYXZlIHRoaXMsIGFuZCB3ZSBidWlsZCBsaWJ1dGlsIGZvciB0aGUgaG9zdCB0b28KLSAgICAgICAgICAgIGludCBoYXNBdCA9IDA7Ci0gICAgICAgICAgICBpbnQgaGFzRG90ID0gMDsKLSAgICAgICAgICAgIGNoYXIgKnMgPSBuYW1lOwotICAgICAgICAgICAgd2hpbGUgKCpzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCpzID09ICcuJykgaGFzRG90ID0gMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgqcyA9PSAnQCcpIGhhc0F0ID0gMTsKLSAgICAgICAgICAgICAgICBzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbGVuID0gcyAtIG5hbWU7Ci0gICAgICAgICAgICBpZiAobGVuIDwgMTUgfHwgaGFzQXQgfHwgIWhhc0RvdCkgewotICAgICAgICAgICAgICAgIHMgPSBuYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzID0gbmFtZSArIGxlbiAtIDE1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSBzLCAwLCAwLCAwKTsKLSNlbmRpZgotICAgICAgICAgICAgZnJlZShuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZih1KTsKLSAgICB9Ci19OwotCi1pbnQgYW5kcm9pZENyZWF0ZVJhd1RocmVhZEV0YyhhbmRyb2lkX3RocmVhZF9mdW5jX3QgZW50cnlGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0aHJlYWROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGhyZWFkUHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRocmVhZFN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3RocmVhZF9pZF90ICp0aHJlYWRJZCkKLXsKLSAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOyAKLSAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7Ci0gICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7Ci0KLSNpZmRlZiBIQVZFX0FORFJPSURfT1MgIC8qIHZhbGdyaW5kIGlzIHJlamVjdGluZyBSVC1wcmlvcml0eSBjcmVhdGUgcmVxcyAqLwotICAgIGlmICh0aHJlYWRQcmlvcml0eSAhPSBQUklPUklUWV9ERUZBVUxUIHx8IHRocmVhZE5hbWUgIT0gTlVMTCkgewotICAgICAgICAvLyBOb3cgdGhhdCB0aGUgcHRocmVhZF90IGhhcyBhIG1ldGhvZCB0byBmaW5kIHRoZSBhc3NvY2lhdGVkCi0gICAgICAgIC8vIGFuZHJvaWRfdGhyZWFkX2lkX3QgKHBpZCkgZnJvbSBwdGhyZWFkX3QsIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGF2b2lkCi0gICAgICAgIC8vIHRoaXMgdHJhbXBvbGluZSBpbiBzb21lIGNhc2VzIGFzIHRoZSBwYXJlbnQgY291bGQgc2V0IHRoZSBwcm9wZXJ0aWVzCi0gICAgICAgIC8vIGZvciB0aGUgY2hpbGQuICBIb3dldmVyLCB0aGVyZSB3b3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uIGJlY2F1c2UgdGhlCi0gICAgICAgIC8vIGNoaWxkIGJlY29tZXMgcmVhZHkgaW1tZWRpYXRlbHksIGFuZCBpdCBkb2Vzbid0IHdvcmsgZm9yIHRoZSBuYW1lLgotICAgICAgICAvLyBwcmN0bChQUl9TRVRfTkFNRSkgb25seSB3b3JrcyBmb3Igc2VsZjsgcHJjdGwoUFJfU0VUX1RIUkVBRF9OQU1FKSB3YXMKLSAgICAgICAgLy8gcHJvcG9zZWQgYnV0IG5vdCB5ZXQgYWNjZXB0ZWQuCi0gICAgICAgIHRocmVhZF9kYXRhX3QqIHQgPSBuZXcgdGhyZWFkX2RhdGFfdDsKLSAgICAgICAgdC0+cHJpb3JpdHkgPSB0aHJlYWRQcmlvcml0eTsKLSAgICAgICAgdC0+dGhyZWFkTmFtZSA9IHRocmVhZE5hbWUgPyBzdHJkdXAodGhyZWFkTmFtZSkgOiBOVUxMOwotICAgICAgICB0LT5lbnRyeUZ1bmN0aW9uID0gZW50cnlGdW5jdGlvbjsKLSAgICAgICAgdC0+dXNlckRhdGEgPSB1c2VyRGF0YTsKLSAgICAgICAgZW50cnlGdW5jdGlvbiA9IChhbmRyb2lkX3RocmVhZF9mdW5jX3QpJnRocmVhZF9kYXRhX3Q6OnRyYW1wb2xpbmU7Ci0gICAgICAgIHVzZXJEYXRhID0gdDsgICAgICAgICAgICAKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICh0aHJlYWRTdGFja1NpemUpIHsKLSAgICAgICAgcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0ciwgdGhyZWFkU3RhY2tTaXplKTsKLSAgICB9Ci0gICAgCi0gICAgZXJybm8gPSAwOwotICAgIHB0aHJlYWRfdCB0aHJlYWQ7Ci0gICAgaW50IHJlc3VsdCA9IHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsICZhdHRyLAotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZF9wdGhyZWFkX2VudHJ5KWVudHJ5RnVuY3Rpb24sIHVzZXJEYXRhKTsKLSAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7Ci0gICAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJhbmRyb2lkQ3JlYXRlUmF3VGhyZWFkRXRjIGZhaWxlZCAoZW50cnk9JXAsIHJlcz0lZCwgZXJybm89JWQpXG4iCi0gICAgICAgICAgICAgIihhbmRyb2lkIHRocmVhZFByaW9yaXR5PSVkKSIsCi0gICAgICAgICAgICBlbnRyeUZ1bmN0aW9uLCByZXN1bHQsIGVycm5vLCB0aHJlYWRQcmlvcml0eSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIE5vdGUgdGhhdCAqdGhyZWFkSUQgaXMgZGlyZWN0bHkgYXZhaWxhYmxlIHRvIHRoZSBwYXJlbnQgb25seSwgYXMgaXQgaXMKLSAgICAvLyBhc3NpZ25lZCBhZnRlciB0aGUgY2hpbGQgc3RhcnRzLiAgVXNlIG1lbW9yeSBiYXJyaWVyIC8gbG9jayBpZiB0aGUgY2hpbGQKLSAgICAvLyBvciBvdGhlciB0aHJlYWRzIGFsc28gbmVlZCBhY2Nlc3MuCi0gICAgaWYgKHRocmVhZElkICE9IE5VTEwpIHsKLSAgICAgICAgKnRocmVhZElkID0gKGFuZHJvaWRfdGhyZWFkX2lkX3QpdGhyZWFkOyAvLyBYWFg6IHRoaXMgaXMgbm90IHBvcnRhYmxlCi0gICAgfQotICAgIHJldHVybiAxOwotfQotCi0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi1zdGF0aWMgcHRocmVhZF90IGFuZHJvaWRfdGhyZWFkX2lkX3RfdG9fcHRocmVhZChhbmRyb2lkX3RocmVhZF9pZF90IHRocmVhZCkKLXsKLSAgICByZXR1cm4gKHB0aHJlYWRfdCkgdGhyZWFkOwotfQotI2VuZGlmCi0KLWFuZHJvaWRfdGhyZWFkX2lkX3QgYW5kcm9pZEdldFRocmVhZElkKCkKLXsKLSAgICByZXR1cm4gKGFuZHJvaWRfdGhyZWFkX2lkX3QpcHRocmVhZF9zZWxmKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNlbGlmIGRlZmluZWQoSEFWRV9XSU4zMl9USFJFQURTKQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKgotICogVHJhbXBvbGluZSB0byBtYWtlIHVzIF9fc3RkY2FsbC1jb21wbGlhbnQuCi0gKgotICogV2UncmUgZXhwZWN0ZWQgdG8gZGVsZXRlICJ2RGV0YWlscyIgd2hlbiB3ZSdyZSBkb25lLgotICovCi1zdHJ1Y3QgdGhyZWFkRGV0YWlscyB7Ci0gICAgaW50ICgqZnVuYykodm9pZCopOwotICAgIHZvaWQqIGFyZzsKLX07Ci1zdGF0aWMgX19zdGRjYWxsIHVuc2lnbmVkIGludCB0aHJlYWRJbnRlcm1lZGlhcnkodm9pZCogdkRldGFpbHMpCi17Ci0gICAgc3RydWN0IHRocmVhZERldGFpbHMqIHBEZXRhaWxzID0gKHN0cnVjdCB0aHJlYWREZXRhaWxzKikgdkRldGFpbHM7Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIHJlc3VsdCA9ICgqKHBEZXRhaWxzLT5mdW5jKSkocERldGFpbHMtPmFyZyk7Ci0KLSAgICBkZWxldGUgcERldGFpbHM7Ci0KLSAgICBBTE9HKExPR19WRVJCT1NFLCAidGhyZWFkIiwgInRocmVhZCBleGl0aW5nXG4iKTsKLSAgICByZXR1cm4gKHVuc2lnbmVkIGludCkgcmVzdWx0OwotfQotCi0vKgotICogQ3JlYXRlIGFuZCBydW4gYSBuZXcgdGhyZWFkLgotICovCi1zdGF0aWMgYm9vbCBkb0NyZWF0ZVRocmVhZChhbmRyb2lkX3RocmVhZF9mdW5jX3QgZm4sIHZvaWQqIGFyZywgYW5kcm9pZF90aHJlYWRfaWRfdCAqaWQpCi17Ci0gICAgSEFORExFIGhUaHJlYWQ7Ci0gICAgc3RydWN0IHRocmVhZERldGFpbHMqIHBEZXRhaWxzID0gbmV3IHRocmVhZERldGFpbHM7IC8vIG11c3QgYmUgb24gaGVhcAotICAgIHVuc2lnbmVkIGludCB0aHJkYWRkcjsKLQotICAgIHBEZXRhaWxzLT5mdW5jID0gZm47Ci0gICAgcERldGFpbHMtPmFyZyA9IGFyZzsKLQotI2lmIGRlZmluZWQoSEFWRV9fQkVHSU5USFJFQURFWCkKLSAgICBoVGhyZWFkID0gKEhBTkRMRSkgX2JlZ2ludGhyZWFkZXgoTlVMTCwgMCwgdGhyZWFkSW50ZXJtZWRpYXJ5LCBwRGV0YWlscywgMCwKLSAgICAgICAgICAgICAgICAgICAgJnRocmRhZGRyKTsKLSAgICBpZiAoaFRocmVhZCA9PSAwKQotI2VsaWYgZGVmaW5lZChIQVZFX0NSRUFURVRIUkVBRCkKLSAgICBoVGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgIChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKSB0aHJlYWRJbnRlcm1lZGlhcnksCi0gICAgICAgICAgICAgICAgICAgICh2b2lkKikgcERldGFpbHMsIDAsIChEV09SRCopICZ0aHJkYWRkcik7Ci0gICAgaWYgKGhUaHJlYWQgPT0gTlVMTCkKLSNlbmRpZgotICAgIHsKLSAgICAgICAgQUxPRyhMT0dfV0FSTiwgInRocmVhZCIsICJXQVJOSU5HOiB0aHJlYWQgY3JlYXRlIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEhBVkVfQ1JFQVRFVEhSRUFEKQotICAgIC8qIGNsb3NlIHRoZSBtYW5hZ2VtZW50IGhhbmRsZSAqLwotICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOwotI2VuZGlmCi0KLSAgICBpZiAoaWQgIT0gTlVMTCkgewotICAgICAgCSppZCA9IChhbmRyb2lkX3RocmVhZF9pZF90KXRocmRhZGRyOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgYW5kcm9pZENyZWF0ZVJhd1RocmVhZEV0YyhhbmRyb2lkX3RocmVhZF9mdW5jX3QgZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGhyZWFkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRocmVhZFByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0aHJlYWRTdGFja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF90aHJlYWRfaWRfdCAqdGhyZWFkSWQpCi17Ci0gICAgcmV0dXJuIGRvQ3JlYXRlVGhyZWFkKCAgZm4sIHVzZXJEYXRhLCB0aHJlYWRJZCk7Ci19Ci0KLWFuZHJvaWRfdGhyZWFkX2lkX3QgYW5kcm9pZEdldFRocmVhZElkKCkKLXsKLSAgICByZXR1cm4gKGFuZHJvaWRfdGhyZWFkX2lkX3QpR2V0Q3VycmVudFRocmVhZElkKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNlbHNlCi0jZXJyb3IgIlRocmVhZHMgbm90IHN1cHBvcnRlZCIKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBhbmRyb2lkQ3JlYXRlVGhyZWFkKGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCBmbiwgdm9pZCogYXJnKQotewotICAgIHJldHVybiBjcmVhdGVUaHJlYWRFdGMoZm4sIGFyZyk7Ci19Ci0KLWludCBhbmRyb2lkQ3JlYXRlVGhyZWFkR2V0SUQoYW5kcm9pZF90aHJlYWRfZnVuY190IGZuLCB2b2lkICphcmcsIGFuZHJvaWRfdGhyZWFkX2lkX3QgKmlkKQotewotICAgIHJldHVybiBjcmVhdGVUaHJlYWRFdGMoZm4sIGFyZywgImFuZHJvaWQ6dW5uYW1lZF90aHJlYWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCwgMCwgaWQpOwotfQotCi1zdGF0aWMgYW5kcm9pZF9jcmVhdGVfdGhyZWFkX2ZuIGdDcmVhdGVUaHJlYWRGbiA9IGFuZHJvaWRDcmVhdGVSYXdUaHJlYWRFdGM7Ci0KLWludCBhbmRyb2lkQ3JlYXRlVGhyZWFkRXRjKGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCBlbnRyeUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRocmVhZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aHJlYWRQcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdGhyZWFkU3RhY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfdGhyZWFkX2lkX3QgKnRocmVhZElkKQotewotICAgIHJldHVybiBnQ3JlYXRlVGhyZWFkRm4oZW50cnlGdW5jdGlvbiwgdXNlckRhdGEsIHRocmVhZE5hbWUsCi0gICAgICAgIHRocmVhZFByaW9yaXR5LCB0aHJlYWRTdGFja1NpemUsIHRocmVhZElkKTsKLX0KLQotdm9pZCBhbmRyb2lkU2V0Q3JlYXRlVGhyZWFkRnVuYyhhbmRyb2lkX2NyZWF0ZV90aHJlYWRfZm4gZnVuYykKLXsKLSAgICBnQ3JlYXRlVGhyZWFkRm4gPSBmdW5jOwotfQotCi1waWRfdCBhbmRyb2lkR2V0VGlkKCkKLXsKLSNpZmRlZiBIQVZFX0dFVFRJRAotICAgIHJldHVybiBnZXR0aWQoKTsKLSNlbHNlCi0gICAgcmV0dXJuIGdldHBpZCgpOwotI2VuZGlmCi19Ci0KLWludCBhbmRyb2lkU2V0VGhyZWFkU2NoZWR1bGluZ0dyb3VwKHBpZF90IHRpZCwgaW50IGdycCkKLXsKLSAgICBpZiAoZ3JwID4gQU5EUk9JRF9UR1JPVVBfTUFYIHx8IGdycCA8IDApIHsgCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChIQVZFX1BUSFJFQURTKQotICAgIHB0aHJlYWRfb25jZSgmZ0RvU2NoZWR1bGluZ0dyb3VwT25jZSwgY2hlY2tEb1NjaGVkdWxpbmdHcm91cCk7Ci0gICAgaWYgKGdEb1NjaGVkdWxpbmdHcm91cCkgewotICAgICAgICAvLyBzZXRfc2NoZWRfcG9saWN5IGRvZXMgbm90IHN1cHBvcnQgdGlkID09IDAKLSAgICAgICAgaWYgKHRpZCA9PSAwKSB7Ci0gICAgICAgICAgICB0aWQgPSBhbmRyb2lkR2V0VGlkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNldF9zY2hlZF9wb2xpY3kodGlkLCAoZ3JwID09IEFORFJPSURfVEdST1VQX0JHX05PTklOVEVSQUNUKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUF9CQUNLR1JPVU5EIDogU1BfRk9SRUdST1VORCkpIHsKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotICAgIAotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotaW50IGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eShwaWRfdCB0aWQsIGludCBwcmkpCi17Ci0gICAgaW50IHJjID0gMDsKLSAgICAKLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0gICAgaW50IGxhc3RlcnIgPSAwOwotCi0gICAgcHRocmVhZF9vbmNlKCZnRG9TY2hlZHVsaW5nR3JvdXBPbmNlLCBjaGVja0RvU2NoZWR1bGluZ0dyb3VwKTsKLSAgICBpZiAoZ0RvU2NoZWR1bGluZ0dyb3VwKSB7Ci0gICAgICAgIC8vIHNldF9zY2hlZF9wb2xpY3kgZG9lcyBub3Qgc3VwcG9ydCB0aWQgPT0gMAotICAgICAgICBpbnQgcG9saWN5X3RpZDsKLSAgICAgICAgaWYgKHRpZCA9PSAwKSB7Ci0gICAgICAgICAgICBwb2xpY3lfdGlkID0gYW5kcm9pZEdldFRpZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcG9saWN5X3RpZCA9IHRpZDsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJpID49IEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCkgewotICAgICAgICAgICAgcmMgPSBzZXRfc2NoZWRfcG9saWN5KHBvbGljeV90aWQsIFNQX0JBQ0tHUk9VTkQpOwotICAgICAgICB9IGVsc2UgaWYgKGdldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgdGlkKSA+PSBBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgIHJjID0gc2V0X3NjaGVkX3BvbGljeShwb2xpY3lfdGlkLCBTUF9GT1JFR1JPVU5EKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyYykgewotICAgICAgICBsYXN0ZXJyID0gZXJybm87Ci0gICAgfQotCi0gICAgaWYgKHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgdGlkLCBwcmkpIDwgMCkgewotICAgICAgICByYyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVycm5vID0gbGFzdGVycjsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICByZXR1cm4gcmM7Ci19Ci0KLWludCBhbmRyb2lkR2V0VGhyZWFkUHJpb3JpdHkocGlkX3QgdGlkKSB7Ci0jaWYgZGVmaW5lZChIQVZFX1BUSFJFQURTKQotICAgIHJldHVybiBnZXRwcmlvcml0eShQUklPX1BST0NFU1MsIHRpZCk7Ci0jZWxzZQotICAgIHJldHVybiBBTkRST0lEX1BSSU9SSVRZX05PUk1BTDsKLSNlbmRpZgotfQotCi1pbnQgYW5kcm9pZEdldFRocmVhZFNjaGVkdWxpbmdHcm91cChwaWRfdCB0aWQpCi17Ci0gICAgaW50IHJldCA9IEFORFJPSURfVEdST1VQX0RFRkFVTFQ7Ci0KLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0gICAgLy8gY29udmVudGlvbiBpcyB0byBub3QgY2FsbCBnZXQvc2V0X3NjaGVkX3BvbGljeSBtZXRob2RzIGlmIGRpc2FibGVkIGJ5IHByb3BlcnR5Ci0gICAgcHRocmVhZF9vbmNlKCZnRG9TY2hlZHVsaW5nR3JvdXBPbmNlLCBjaGVja0RvU2NoZWR1bGluZ0dyb3VwKTsKLSAgICBpZiAoZ0RvU2NoZWR1bGluZ0dyb3VwKSB7Ci0gICAgICAgIFNjaGVkUG9saWN5IHBvbGljeTsKLSAgICAgICAgLy8gZ2V0X3NjaGVkX3BvbGljeSBkb2VzIG5vdCBzdXBwb3J0IHRpZCA9PSAwCi0gICAgICAgIGlmICh0aWQgPT0gMCkgewotICAgICAgICAgICAgdGlkID0gYW5kcm9pZEdldFRpZCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRfc2NoZWRfcG9saWN5KHRpZCwgJnBvbGljeSkgPCAwKSB7Ci0gICAgICAgICAgICByZXQgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN3aXRjaCAocG9saWN5KSB7Ci0gICAgICAgICAgICBjYXNlIFNQX0JBQ0tHUk9VTkQ6Ci0gICAgICAgICAgICAgICAgcmV0ID0gQU5EUk9JRF9UR1JPVVBfQkdfTk9OSU5URVJBQ1Q7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNQX0ZPUkVHUk9VTkQ6Ci0gICAgICAgICAgICAgICAgcmV0ID0gQU5EUk9JRF9UR1JPVVBfRkdfQk9PU1Q7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuLCBhcyBlbnVtIFNjaGVkUG9saWN5IGRvZXMgbm90IGhhdmUgYW55IG90aGVyIHZhbHVlcwotICAgICAgICAgICAgICAgIHJldCA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gcmV0OwotfQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqICAgICAgTXV0ZXggY2xhc3MKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0KLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0vLyBpbXBsZW1lbnRlZCBhcyBpbmxpbmVzIGluIHRocmVhZHMuaAotI2VsaWYgZGVmaW5lZChIQVZFX1dJTjMyX1RIUkVBRFMpCi0KLU11dGV4OjpNdXRleCgpCi17Ci0gICAgSEFORExFIGhNdXRleDsKLQotICAgIGFzc2VydChzaXplb2YoaE11dGV4KSA9PSBzaXplb2YobVN0YXRlKSk7Ci0KLSAgICBoTXV0ZXggPSBDcmVhdGVNdXRleChOVUxMLCBGQUxTRSwgTlVMTCk7Ci0gICAgbVN0YXRlID0gKHZvaWQqKSBoTXV0ZXg7Ci19Ci0KLU11dGV4OjpNdXRleChjb25zdCBjaGFyKiBuYW1lKQotewotICAgIC8vIFhYWDogbmFtZSBub3QgdXNlZCBmb3Igbm93Ci0gICAgSEFORExFIGhNdXRleDsKLQotICAgIGFzc2VydChzaXplb2YoaE11dGV4KSA9PSBzaXplb2YobVN0YXRlKSk7Ci0KLSAgICBoTXV0ZXggPSBDcmVhdGVNdXRleChOVUxMLCBGQUxTRSwgTlVMTCk7Ci0gICAgbVN0YXRlID0gKHZvaWQqKSBoTXV0ZXg7Ci19Ci0KLU11dGV4OjpNdXRleChpbnQgdHlwZSwgY29uc3QgY2hhciogbmFtZSkKLXsKLSAgICAvLyBYWFg6IHR5cGUgYW5kIG5hbWUgbm90IHVzZWQgZm9yIG5vdwotICAgIEhBTkRMRSBoTXV0ZXg7Ci0KLSAgICBhc3NlcnQoc2l6ZW9mKGhNdXRleCkgPT0gc2l6ZW9mKG1TdGF0ZSkpOwotCi0gICAgaE11dGV4ID0gQ3JlYXRlTXV0ZXgoTlVMTCwgRkFMU0UsIE5VTEwpOwotICAgIG1TdGF0ZSA9ICh2b2lkKikgaE11dGV4OwotfQotCi1NdXRleDo6fk11dGV4KCkKLXsKLSAgICBDbG9zZUhhbmRsZSgoSEFORExFKSBtU3RhdGUpOwotfQotCi1zdGF0dXNfdCBNdXRleDo6bG9jaygpCi17Ci0gICAgRFdPUkQgZHdXYWl0UmVzdWx0OwotICAgIGR3V2FpdFJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QoKEhBTkRMRSkgbVN0YXRlLCBJTkZJTklURSk7Ci0gICAgcmV0dXJuIGR3V2FpdFJlc3VsdCAhPSBXQUlUX09CSkVDVF8wID8gLTEgOiBOT19FUlJPUjsKLX0KLQotdm9pZCBNdXRleDo6dW5sb2NrKCkKLXsKLSAgICBpZiAoIVJlbGVhc2VNdXRleCgoSEFORExFKSBtU3RhdGUpKQotICAgICAgICBBTE9HKExPR19XQVJOLCAidGhyZWFkIiwgIldBUk5JTkc6IGJhZCByZXN1bHQgZnJvbSB1bmxvY2tpbmcgbXV0ZXhcbiIpOwotfQotCi1zdGF0dXNfdCBNdXRleDo6dHJ5TG9jaygpCi17Ci0gICAgRFdPUkQgZHdXYWl0UmVzdWx0OwotCi0gICAgZHdXYWl0UmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdCgoSEFORExFKSBtU3RhdGUsIDApOwotICAgIGlmIChkd1dhaXRSZXN1bHQgIT0gV0FJVF9PQkpFQ1RfMCAmJiBkd1dhaXRSZXN1bHQgIT0gV0FJVF9USU1FT1VUKQotICAgICAgICBBTE9HKExPR19XQVJOLCAidGhyZWFkIiwgIldBUk5JTkc6IGJhZCByZXN1bHQgZnJvbSB0cnktbG9ja2luZyBtdXRleFxuIik7Ci0gICAgcmV0dXJuIChkd1dhaXRSZXN1bHQgPT0gV0FJVF9PQkpFQ1RfMCkgPyAwIDogLTE7Ci19Ci0KLSNlbHNlCi0jZXJyb3IgIlNvbWVib2R5IGZvcmdvdCB0byBpbXBsZW1lbnQgdGhyZWFkcyBmb3IgdGhpcyBwbGF0Zm9ybS4iCi0jZW5kaWYKLQotCi0vKgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiAgICAgIENvbmRpdGlvbiBjbGFzcwotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLS8vIGltcGxlbWVudGVkIGFzIGlubGluZXMgaW4gdGhyZWFkcy5oCi0jZWxpZiBkZWZpbmVkKEhBVkVfV0lOMzJfVEhSRUFEUykKLQotLyoKLSAqIFdpbmRvd3MgZG9lc24ndCBoYXZlIGEgY29uZGl0aW9uIHZhcmlhYmxlIHNvbHV0aW9uLiAgSXQncyBwb3NzaWJsZQotICogdG8gY3JlYXRlIG9uZSwgYnV0IGl0J3MgZWFzeSB0byBnZXQgaXQgd3JvbmcuICBGb3IgYSBkaXNjdXNzaW9uLCBhbmQKLSAqIHRoZSBvcmlnaW4gb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiwgc2VlOgotICoKLSAqICBodHRwOi8vd3d3LmNzLnd1c3RsLmVkdS9+c2NobWlkdC93aW4zMi1jdi0xLmh0bWwKLSAqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvd24gb24gdGhlIHBhZ2UgZG9lcyBOT1QgZm9sbG93IFBPU0lYIHNlbWFudGljcy4KLSAqIEFzIGFuIG9wdGltaXphdGlvbiB0aGV5IHJlcXVpcmUgYWNxdWlyaW5nIHRoZSBleHRlcm5hbCBtdXRleCBiZWZvcmUKLSAqIGNhbGxpbmcgc2lnbmFsKCkgYW5kIGJyb2FkY2FzdCgpLCB3aGVyZWFzIFBPU0lYIG9ubHkgcmVxdWlyZXMgZ3JhYmJpbmcKLSAqIGl0IGJlZm9yZSBjYWxsaW5nIHdhaXQoKS4gIFRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlIGhhcyBiZWVuIHVuLW9wdGltaXplZAotICogdG8gaGF2ZSB0aGUgY29ycmVjdCBiZWhhdmlvci4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgV2luQ29uZGl0aW9uIHsKLSAgICAvLyBOdW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzLgotICAgIGludCAgICAgICAgICAgICAgICAgd2FpdGVyc0NvdW50OwotCi0gICAgLy8gU2VyaWFsaXplIGFjY2VzcyB0byB3YWl0ZXJzQ291bnQuCi0gICAgQ1JJVElDQUxfU0VDVElPTiAgICB3YWl0ZXJzQ291bnRMb2NrOwotCi0gICAgLy8gU2VtYXBob3JlIHVzZWQgdG8gcXVldWUgdXAgdGhyZWFkcyB3YWl0aW5nIGZvciB0aGUgY29uZGl0aW9uIHRvCi0gICAgLy8gYmVjb21lIHNpZ25hbGVkLgotICAgIEhBTkRMRSAgICAgICAgICAgICAgc2VtYTsKLQotICAgIC8vIEFuIGF1dG8tcmVzZXQgZXZlbnQgdXNlZCBieSB0aGUgYnJvYWRjYXN0L3NpZ25hbCB0aHJlYWQgdG8gd2FpdAotICAgIC8vIGZvciBhbGwgdGhlIHdhaXRpbmcgdGhyZWFkKHMpIHRvIHdha2UgdXAgYW5kIGJlIHJlbGVhc2VkIGZyb20KLSAgICAvLyB0aGUgc2VtYXBob3JlLgotICAgIEhBTkRMRSAgICAgICAgICAgICAgd2FpdGVyc0RvbmU7Ci0KLSAgICAvLyBUaGlzIG11dGV4IHdvdWxkbid0IGJlIG5lY2Vzc2FyeSBpZiB3ZSByZXF1aXJlZCB0aGF0IHRoZSBjYWxsZXIKLSAgICAvLyBsb2NrIHRoZSBleHRlcm5hbCBtdXRleCBiZWZvcmUgY2FsbGluZyBzaWduYWwoKSBhbmQgYnJvYWRjYXN0KCkuCi0gICAgLy8gSSdtIHRyeWluZyB0byBtaW1pYyBwdGhyZWFkIHNlbWFudGljcyB0aG91Z2guCi0gICAgSEFORExFICAgICAgICAgICAgICBpbnRlcm5hbE11dGV4OwotCi0gICAgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB3ZSB3ZXJlIGJyb2FkY2FzdGluZyBvciBzaWduYWxpbmcuICBUaGlzCi0gICAgLy8gYWxsb3dzIHVzIHRvIG9wdGltaXplIHRoZSBjb2RlIGlmIHdlJ3JlIGp1c3Qgc2lnbmFsaW5nLgotICAgIGJvb2wgICAgICAgICAgICAgICAgd2FzQnJvYWRjYXN0OwotCi0gICAgc3RhdHVzX3Qgd2FpdChXaW5Db25kaXRpb24qIGNvbmRTdGF0ZSwgSEFORExFIGhNdXRleCwgbnNlY3NfdCogYWJzdGltZSkKLSAgICB7Ci0gICAgICAgIC8vIEluY3JlbWVudCB0aGUgd2FpdCBjb3VudCwgYXZvaWRpbmcgcmFjZSBjb25kaXRpb25zLgotICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmY29uZFN0YXRlLT53YWl0ZXJzQ291bnRMb2NrKTsKLSAgICAgICAgY29uZFN0YXRlLT53YWl0ZXJzQ291bnQrKzsKLSAgICAgICAgLy9wcmludGYoIisrKyB3YWl0OiBpbmNyIHdhaXRlcnNDb3VudCB0byAlZCAodGlkPSVsZClcbiIsCi0gICAgICAgIC8vICAgIGNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50LCBnZXRUaHJlYWRJZCgpKTsKLSAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50TG9jayk7Ci0gICAgCi0gICAgICAgIERXT1JEIHRpbWVvdXQgPSBJTkZJTklURTsKLSAgICAgICAgaWYgKGFic3RpbWUpIHsKLSAgICAgICAgICAgIG5zZWNzX3QgcmVsdGltZSA9ICphYnN0aW1lIC0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgaWYgKHJlbHRpbWUgPCAwKQotICAgICAgICAgICAgICAgIHJlbHRpbWUgPSAwOwotICAgICAgICAgICAgdGltZW91dCA9IHJlbHRpbWUvMTAwMDAwMDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQXRvbWljYWxseSByZWxlYXNlIHRoZSBleHRlcm5hbCBtdXRleCBhbmQgd2FpdCBvbiB0aGUgc2VtYXBob3JlLgotICAgICAgICBEV09SRCByZXMgPQotICAgICAgICAgICAgU2lnbmFsT2JqZWN0QW5kV2FpdChoTXV0ZXgsIGNvbmRTdGF0ZS0+c2VtYSwgdGltZW91dCwgRkFMU0UpOwotICAgIAotICAgICAgICAvL3ByaW50ZigiKysrIHdhaXQ6IGF3YWtlICh0aWQ9JWxkKVxuIiwgZ2V0VGhyZWFkSWQoKSk7Ci0gICAgCi0gICAgICAgIC8vIFJlYWNxdWlyZSBsb2NrIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucy4KLSAgICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50TG9jayk7Ci0gICAgCi0gICAgICAgIC8vIE5vIGxvbmdlciB3YWl0aW5nLgotICAgICAgICBjb25kU3RhdGUtPndhaXRlcnNDb3VudC0tOwotICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UncmUgdGhlIGxhc3Qgd2FpdGVyIGFmdGVyIGEgYnJvYWRjYXN0LgotICAgICAgICBib29sIGxhc3RXYWl0ZXIgPSAoY29uZFN0YXRlLT53YXNCcm9hZGNhc3QgJiYgY29uZFN0YXRlLT53YWl0ZXJzQ291bnQgPT0gMCk7Ci0gICAgCi0gICAgICAgIC8vcHJpbnRmKCIrKysgd2FpdDogbGFzdFdhaXRlcj0lZCAod2FzQmM9JWQgd2M9JWQpXG4iLAotICAgICAgICAvLyAgICBsYXN0V2FpdGVyLCBjb25kU3RhdGUtPndhc0Jyb2FkY2FzdCwgY29uZFN0YXRlLT53YWl0ZXJzQ291bnQpOwotICAgIAotICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmY29uZFN0YXRlLT53YWl0ZXJzQ291bnRMb2NrKTsKLSAgICAKLSAgICAgICAgLy8gSWYgd2UncmUgdGhlIGxhc3Qgd2FpdGVyIHRocmVhZCBkdXJpbmcgdGhpcyBwYXJ0aWN1bGFyIGJyb2FkY2FzdAotICAgICAgICAvLyB0aGVuIHNpZ25hbCBicm9hZGNhc3QoKSB0aGF0IHdlJ3JlIGFsbCBhd2FrZS4gIEl0J2xsIGRyb3AgdGhlCi0gICAgICAgIC8vIGludGVybmFsIG11dGV4LgotICAgICAgICBpZiAobGFzdFdhaXRlcikgewotICAgICAgICAgICAgLy8gQXRvbWljYWxseSBzaWduYWwgdGhlICJ3YWl0ZXJzRG9uZSIgZXZlbnQgYW5kIHdhaXQgdW50aWwgd2UKLSAgICAgICAgICAgIC8vIGNhbiBhY3F1aXJlIHRoZSBpbnRlcm5hbCBtdXRleC4gIFdlIHdhbnQgdG8gZG8gdGhpcyBpbiBvbmUgc3RlcAotICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCBlbnN1cmVzIHRoYXQgZXZlcnlib2R5IGlzIGluIHRoZSBtdXRleCBGSUZPIGJlZm9yZQotICAgICAgICAgICAgLy8gYW55IHRocmVhZCBoYXMgYSBjaGFuY2UgdG8gcnVuLiAgV2l0aG91dCBpdCwgYW5vdGhlciB0aHJlYWQKLSAgICAgICAgICAgIC8vIGNvdWxkIHdha2UgdXAsIGRvIHdvcmssIGFuZCBob3AgYmFjayBpbiBhaGVhZCBvZiB1cy4KLSAgICAgICAgICAgIFNpZ25hbE9iamVjdEFuZFdhaXQoY29uZFN0YXRlLT53YWl0ZXJzRG9uZSwgY29uZFN0YXRlLT5pbnRlcm5hbE11dGV4LAotICAgICAgICAgICAgICAgIElORklOSVRFLCBGQUxTRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBHcmFiIHRoZSBpbnRlcm5hbCBtdXRleC4KLSAgICAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoY29uZFN0YXRlLT5pbnRlcm5hbE11dGV4LCBJTkZJTklURSk7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgLy8gUmVsZWFzZSB0aGUgaW50ZXJuYWwgYW5kIGdyYWIgdGhlIGV4dGVybmFsLgotICAgICAgICBSZWxlYXNlTXV0ZXgoY29uZFN0YXRlLT5pbnRlcm5hbE11dGV4KTsKLSAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChoTXV0ZXgsIElORklOSVRFKTsKLSAgICAKLSAgICAgICAgcmV0dXJuIHJlcyA9PSBXQUlUX09CSkVDVF8wID8gTk9fRVJST1IgOiAtMTsKLSAgICB9Ci19IFdpbkNvbmRpdGlvbjsKLQotLyoKLSAqIENvbnN0cnVjdG9yLiAgU2V0IHVwIHRoZSBXaW5Db25kaXRpb24gc3R1ZmYuCi0gKi8KLUNvbmRpdGlvbjo6Q29uZGl0aW9uKCkKLXsKLSAgICBXaW5Db25kaXRpb24qIGNvbmRTdGF0ZSA9IG5ldyBXaW5Db25kaXRpb247Ci0KLSAgICBjb25kU3RhdGUtPndhaXRlcnNDb3VudCA9IDA7Ci0gICAgY29uZFN0YXRlLT53YXNCcm9hZGNhc3QgPSBmYWxzZTsKLSAgICAvLyBzZW1hcGhvcmU6IG5vIHNlY3VyaXR5LCBpbml0aWFsIHZhbHVlIG9mIDAKLSAgICBjb25kU3RhdGUtPnNlbWEgPSBDcmVhdGVTZW1hcGhvcmUoTlVMTCwgMCwgMHg3ZmZmZmZmZiwgTlVMTCk7Ci0gICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmY29uZFN0YXRlLT53YWl0ZXJzQ291bnRMb2NrKTsKLSAgICAvLyBhdXRvLXJlc2V0IGV2ZW50LCBub3Qgc2lnbmFsZWQgaW5pdGlhbGx5Ci0gICAgY29uZFN0YXRlLT53YWl0ZXJzRG9uZSA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7Ci0gICAgLy8gdXNlZCBzbyB3ZSBkb24ndCBoYXZlIHRvIGxvY2sgZXh0ZXJuYWwgbXV0ZXggb24gc2lnbmFsL2Jyb2FkY2FzdAotICAgIGNvbmRTdGF0ZS0+aW50ZXJuYWxNdXRleCA9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNFLCBOVUxMKTsKLQotICAgIG1TdGF0ZSA9IGNvbmRTdGF0ZTsKLX0KLQotLyoKLSAqIERlc3RydWN0b3IuICBGcmVlIFdpbmRvd3MgcmVzb3VyY2VzIGFzIHdlbGwgYXMgb3VyIGFsbG9jYXRlZCBzdG9yYWdlLgotICovCi1Db25kaXRpb246On5Db25kaXRpb24oKQotewotICAgIFdpbkNvbmRpdGlvbiogY29uZFN0YXRlID0gKFdpbkNvbmRpdGlvbiopIG1TdGF0ZTsKLSAgICBpZiAoY29uZFN0YXRlICE9IE5VTEwpIHsKLSAgICAgICAgQ2xvc2VIYW5kbGUoY29uZFN0YXRlLT5zZW1hKTsKLSAgICAgICAgQ2xvc2VIYW5kbGUoY29uZFN0YXRlLT53YWl0ZXJzRG9uZSk7Ci0gICAgICAgIGRlbGV0ZSBjb25kU3RhdGU7Ci0gICAgfQotfQotCi0KLXN0YXR1c190IENvbmRpdGlvbjo6d2FpdChNdXRleCYgbXV0ZXgpCi17Ci0gICAgV2luQ29uZGl0aW9uKiBjb25kU3RhdGUgPSAoV2luQ29uZGl0aW9uKikgbVN0YXRlOwotICAgIEhBTkRMRSBoTXV0ZXggPSAoSEFORExFKSBtdXRleC5tU3RhdGU7Ci0gICAgCi0gICAgcmV0dXJuICgoV2luQ29uZGl0aW9uKiltU3RhdGUpLT53YWl0KGNvbmRTdGF0ZSwgaE11dGV4LCBOVUxMKTsKLX0KLQotc3RhdHVzX3QgQ29uZGl0aW9uOjp3YWl0UmVsYXRpdmUoTXV0ZXgmIG11dGV4LCBuc2Vjc190IHJlbHRpbWUpCi17Ci0gICAgV2luQ29uZGl0aW9uKiBjb25kU3RhdGUgPSAoV2luQ29uZGl0aW9uKikgbVN0YXRlOwotICAgIEhBTkRMRSBoTXV0ZXggPSAoSEFORExFKSBtdXRleC5tU3RhdGU7Ci0gICAgbnNlY3NfdCBhYnNUaW1lID0gc3lzdGVtVGltZSgpK3JlbHRpbWU7Ci0KLSAgICByZXR1cm4gKChXaW5Db25kaXRpb24qKW1TdGF0ZSktPndhaXQoY29uZFN0YXRlLCBoTXV0ZXgsICZhYnNUaW1lKTsKLX0KLQotLyoKLSAqIFNpZ25hbCB0aGUgY29uZGl0aW9uIHZhcmlhYmxlLCBhbGxvd2luZyBvbmUgdGhyZWFkIHRvIGNvbnRpbnVlLgotICovCi12b2lkIENvbmRpdGlvbjo6c2lnbmFsKCkKLXsKLSAgICBXaW5Db25kaXRpb24qIGNvbmRTdGF0ZSA9IChXaW5Db25kaXRpb24qKSBtU3RhdGU7Ci0KLSAgICAvLyBMb2NrIHRoZSBpbnRlcm5hbCBtdXRleC4gIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGRvbid0IGNsYXNoIHdpdGgKLSAgICAvLyBicm9hZGNhc3QoKS4KLSAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmRTdGF0ZS0+aW50ZXJuYWxNdXRleCwgSU5GSU5JVEUpOwotCi0gICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50TG9jayk7Ci0gICAgYm9vbCBoYXZlV2FpdGVycyA9IChjb25kU3RhdGUtPndhaXRlcnNDb3VudCA+IDApOwotICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZjb25kU3RhdGUtPndhaXRlcnNDb3VudExvY2spOwotCi0gICAgLy8gSWYgbm8gd2FpdGVycywgdGhlbiB0aGlzIGlzIGEgbm8tb3AuICBPdGhlcndpc2UsIGtub2NrIHRoZSBzZW1hcGhvcmUKLSAgICAvLyBkb3duIGEgbm90Y2guCi0gICAgaWYgKGhhdmVXYWl0ZXJzKQotICAgICAgICBSZWxlYXNlU2VtYXBob3JlKGNvbmRTdGF0ZS0+c2VtYSwgMSwgMCk7Ci0KLSAgICAvLyBSZWxlYXNlIGludGVybmFsIG11dGV4LgotICAgIFJlbGVhc2VNdXRleChjb25kU3RhdGUtPmludGVybmFsTXV0ZXgpOwotfQotCi0vKgotICogU2lnbmFsIHRoZSBjb25kaXRpb24gdmFyaWFibGUsIGFsbG93aW5nIGFsbCB0aHJlYWRzIHRvIGNvbnRpbnVlLgotICoKLSAqIEZpcnN0IHdlIGhhdmUgdG8gd2FrZSB1cCBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSBzZW1hcGhvcmUsIHRoZW4KLSAqIHdlIHdhaXQgdW50aWwgYWxsIG9mIHRoZSB0aHJlYWRzIGhhdmUgYWN0dWFsbHkgYmVlbiB3b2tlbiBiZWZvcmUKLSAqIHJlbGVhc2luZyB0aGUgaW50ZXJuYWwgbXV0ZXguICBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgdGhyZWFkcyBhcmUgd29rZW4uCi0gKi8KLXZvaWQgQ29uZGl0aW9uOjpicm9hZGNhc3QoKQotewotICAgIFdpbkNvbmRpdGlvbiogY29uZFN0YXRlID0gKFdpbkNvbmRpdGlvbiopIG1TdGF0ZTsKLQotICAgIC8vIExvY2sgdGhlIGludGVybmFsIG11dGV4LiAgVGhpcyBrZWVwcyB0aGUgZ3V5cyB3ZSdyZSB3YWtpbmcgdXAKLSAgICAvLyBmcm9tIGdldHRpbmcgdG9vIGZhci4KLSAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmRTdGF0ZS0+aW50ZXJuYWxNdXRleCwgSU5GSU5JVEUpOwotCi0gICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50TG9jayk7Ci0gICAgYm9vbCBoYXZlV2FpdGVycyA9IGZhbHNlOwotCi0gICAgaWYgKGNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50ID4gMCkgewotICAgICAgICBoYXZlV2FpdGVycyA9IHRydWU7Ci0gICAgICAgIGNvbmRTdGF0ZS0+d2FzQnJvYWRjYXN0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoaGF2ZVdhaXRlcnMpIHsKLSAgICAgICAgLy8gV2FrZSB1cCBhbGwgdGhlIHdhaXRlcnMuCi0gICAgICAgIFJlbGVhc2VTZW1hcGhvcmUoY29uZFN0YXRlLT5zZW1hLCBjb25kU3RhdGUtPndhaXRlcnNDb3VudCwgMCk7Ci0KLSAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50TG9jayk7Ci0KLSAgICAgICAgLy8gV2FpdCBmb3IgYWxsIGF3YWtlbmVkIHRocmVhZHMgdG8gYWNxdWlyZSB0aGUgY291bnRpbmcgc2VtYXBob3JlLgotICAgICAgICAvLyBUaGUgbGFzdCBndXkgd2hvIHdhcyB3YWl0aW5nIHNldHMgdGhpcy4KLSAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChjb25kU3RhdGUtPndhaXRlcnNEb25lLCBJTkZJTklURSk7Ci0KLSAgICAgICAgLy8gUmVzZXQgd2FzQnJvYWRjYXN0LiAgKE5vIGNyaXQgc2VjdGlvbiBuZWVkZWQgYmVjYXVzZSBub2JvZHkKLSAgICAgICAgLy8gZWxzZSBjYW4gd2FrZSB1cCB0byBwb2tlIGF0IGl0LikKLSAgICAgICAgY29uZFN0YXRlLT53YXNCcm9hZGNhc3QgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50TG9jayk7Ci0gICAgfQotCi0gICAgLy8gUmVsZWFzZSBpbnRlcm5hbCBtdXRleC4KLSAgICBSZWxlYXNlTXV0ZXgoY29uZFN0YXRlLT5pbnRlcm5hbE11dGV4KTsKLX0KLQotI2Vsc2UKLSNlcnJvciAiY29uZGl0aW9uIHZhcmlhYmxlcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iCi0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKgotICogVGhpcyBpcyBvdXIgdGhyZWFkIG9iamVjdCEKLSAqLwotCi1UaHJlYWQ6OlRocmVhZChib29sIGNhbkNhbGxKYXZhKQotICAgIDogICBtQ2FuQ2FsbEphdmEoY2FuQ2FsbEphdmEpLAotICAgICAgICBtVGhyZWFkKHRocmVhZF9pZF90KC0xKSksCi0gICAgICAgIG1Mb2NrKCJUaHJlYWQ6Om1Mb2NrIiksCi0gICAgICAgIG1TdGF0dXMoTk9fRVJST1IpLAotICAgICAgICBtRXhpdFBlbmRpbmcoZmFsc2UpLCBtUnVubmluZyhmYWxzZSkKLSNpZmRlZiBIQVZFX0FORFJPSURfT1MKLSAgICAgICAgLCBtVGlkKC0xKQotI2VuZGlmCi17Ci19Ci0KLVRocmVhZDo6flRocmVhZCgpCi17Ci19Ci0KLXN0YXR1c190IFRocmVhZDo6cmVhZHlUb1J1bigpCi17Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBUaHJlYWQ6OnJ1bihjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IHByaW9yaXR5LCBzaXplX3Qgc3RhY2spCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIGlmIChtUnVubmluZykgewotICAgICAgICAvLyB0aHJlYWQgYWxyZWFkeSBzdGFydGVkCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICAvLyByZXNldCBzdGF0dXMgYW5kIGV4aXRQZW5kaW5nIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUsIHNvIHdlIGNhbgotICAgIC8vIHRyeSBhZ2FpbiBhZnRlciBhbiBlcnJvciBoYXBwZW5lZCAoZWl0aGVyIGJlbG93LCBvciBpbiByZWFkeVRvUnVuKCkpCi0gICAgbVN0YXR1cyA9IE5PX0VSUk9SOwotICAgIG1FeGl0UGVuZGluZyA9IGZhbHNlOwotICAgIG1UaHJlYWQgPSB0aHJlYWRfaWRfdCgtMSk7Ci0gICAgCi0gICAgLy8gaG9sZCBhIHN0cm9uZyByZWZlcmVuY2Ugb24gb3Vyc2VsZgotICAgIG1Ib2xkU2VsZiA9IHRoaXM7Ci0KLSAgICBtUnVubmluZyA9IHRydWU7Ci0KLSAgICBib29sIHJlczsKLSAgICBpZiAobUNhbkNhbGxKYXZhKSB7Ci0gICAgICAgIHJlcyA9IGNyZWF0ZVRocmVhZEV0YyhfdGhyZWFkTG9vcCwKLSAgICAgICAgICAgICAgICB0aGlzLCBuYW1lLCBwcmlvcml0eSwgc3RhY2ssICZtVGhyZWFkKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBhbmRyb2lkQ3JlYXRlUmF3VGhyZWFkRXRjKF90aHJlYWRMb29wLAotICAgICAgICAgICAgICAgIHRoaXMsIG5hbWUsIHByaW9yaXR5LCBzdGFjaywgJm1UaHJlYWQpOwotICAgIH0KLSAgICAKLSAgICBpZiAocmVzID09IGZhbHNlKSB7Ci0gICAgICAgIG1TdGF0dXMgPSBVTktOT1dOX0VSUk9SOyAgIC8vIHNvbWV0aGluZyBoYXBwZW5lZCEKLSAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKLSAgICAgICAgbVRocmVhZCA9IHRocmVhZF9pZF90KC0xKTsKLSAgICAgICAgbUhvbGRTZWxmLmNsZWFyKCk7ICAvLyAidGhpcyIgbWF5IGhhdmUgZ29uZSBhd2F5IGFmdGVyIHRoaXMuCi0KLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotICAgIAotICAgIC8vIERvIG5vdCByZWZlciB0byBtU3RhdHVzIGhlcmU6IFRoZSB0aHJlYWQgaXMgYWxyZWFkeSBydW5uaW5nIChtYXksIGluIGZhY3QKLSAgICAvLyBhbHJlYWR5IGhhdmUgZXhpdGVkIHdpdGggYSB2YWxpZCBtU3RhdHVzIHJlc3VsdCkuIFRoZSBOT19FUlJPUiBpbmRpY2F0aW9uCi0gICAgLy8gaGVyZSBtZXJlbHkgaW5kaWNhdGVzIHN1Y2Nlc3NmdWxseSBzdGFydGluZyB0aGUgdGhyZWFkIGFuZCBkb2VzIG5vdAotICAgIC8vIGltcGx5IHN1Y2Nlc3NmdWwgdGVybWluYXRpb24vZXhlY3V0aW9uLgotICAgIHJldHVybiBOT19FUlJPUjsKLQotICAgIC8vIEV4aXRpbmcgc2NvcGUgb2YgbUxvY2sgaXMgYSBtZW1vcnkgYmFycmllciBhbmQgYWxsb3dzIG5ldyB0aHJlYWQgdG8gcnVuCi19Ci0KLWludCBUaHJlYWQ6Ol90aHJlYWRMb29wKHZvaWQqIHVzZXIpCi17Ci0gICAgVGhyZWFkKiBjb25zdCBzZWxmID0gc3RhdGljX2Nhc3Q8VGhyZWFkKj4odXNlcik7Ci0KLSAgICBzcDxUaHJlYWQ+IHN0cm9uZyhzZWxmLT5tSG9sZFNlbGYpOwotICAgIHdwPFRocmVhZD4gd2VhayhzdHJvbmcpOwotICAgIHNlbGYtPm1Ib2xkU2VsZi5jbGVhcigpOwotCi0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi0gICAgLy8gdGhpcyBpcyB2ZXJ5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHdpdGggZ2RiCi0gICAgc2VsZi0+bVRpZCA9IGdldHRpZCgpOwotI2VuZGlmCi0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAgIGRvIHsKLSAgICAgICAgYm9vbCByZXN1bHQ7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIHNlbGYtPm1TdGF0dXMgPSBzZWxmLT5yZWFkeVRvUnVuKCk7Ci0gICAgICAgICAgICByZXN1bHQgPSAoc2VsZi0+bVN0YXR1cyA9PSBOT19FUlJPUik7Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgIXNlbGYtPmV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBCaW5kZXIgdGhyZWFkcyAoYW5kIG1heWJlIG90aGVycykgcmVseSBvbiB0aHJlYWRMb29wCi0gICAgICAgICAgICAgICAgLy8gcnVubmluZyBhdCBsZWFzdCBvbmNlIGFmdGVyIGEgc3VjY2Vzc2Z1bCA6OnJlYWR5VG9SdW4oKQotICAgICAgICAgICAgICAgIC8vICh1bmxlc3MsIG9mIGNvdXJzZSwgdGhlIHRocmVhZCBoYXMgYWxyZWFkeSBiZWVuIGFza2VkIHRvIGV4aXQKLSAgICAgICAgICAgICAgICAvLyBhdCB0aGF0IHBvaW50KS4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhyZWFkcyBhcmUgZXNzZW50aWFsbHkgdXNlZCBsaWtlIHRoaXM6Ci0gICAgICAgICAgICAgICAgLy8gICAobmV3IFRocmVhZFN1YmNsYXNzKCkpLT5ydW4oKTsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY2FsbGVyIHRoZXJlZm9yZSBkb2VzIG5vdCByZXRhaW4gYSBzdHJvbmcgcmVmZXJlbmNlIHRvCi0gICAgICAgICAgICAgICAgLy8gdGhlIHRocmVhZCBhbmQgdGhlIHRocmVhZCB3b3VsZCBzaW1wbHkgZGlzYXBwZWFyIGFmdGVyIHRoZQotICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWwgOjpyZWFkeVRvUnVuKCkgY2FsbCBpbnN0ZWFkIG9mIGVudGVyaW5nIHRoZQotICAgICAgICAgICAgICAgIC8vIHRocmVhZExvb3AgYXQgbGVhc3Qgb25jZS4KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLT50aHJlYWRMb29wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBzZWxmLT50aHJlYWRMb29wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBlc3RhYmxpc2ggYSBzY29wZSBmb3IgbUxvY2sKLSAgICAgICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woc2VsZi0+bUxvY2spOwotICAgICAgICBpZiAocmVzdWx0ID09IGZhbHNlIHx8IHNlbGYtPm1FeGl0UGVuZGluZykgewotICAgICAgICAgICAgc2VsZi0+bUV4aXRQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIHNlbGYtPm1SdW5uaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAvLyBjbGVhciB0aHJlYWQgSUQgc28gdGhhdCByZXF1ZXN0RXhpdEFuZFdhaXQoKSBkb2VzIG5vdCBleGl0IGlmCi0gICAgICAgICAgICAvLyBjYWxsZWQgYnkgYSBuZXcgdGhyZWFkIHVzaW5nIHRoZSBzYW1lIHRocmVhZCBJRCBhcyB0aGlzIG9uZS4KLSAgICAgICAgICAgIHNlbGYtPm1UaHJlYWQgPSB0aHJlYWRfaWRfdCgtMSk7Ci0gICAgICAgICAgICAvLyBub3RlIHRoYXQgaW50ZXJlc3RlZCBvYnNlcnZlcnMgYmxvY2tlZCBpbiByZXF1ZXN0RXhpdEFuZFdhaXQgYXJlCi0gICAgICAgICAgICAvLyBhd29rZW4gYnkgYnJvYWRjYXN0LCBidXQgYmxvY2tlZCBvbiBtTG9jayB1bnRpbCBicmVhayBleGl0cyBzY29wZQotICAgICAgICAgICAgc2VsZi0+bVRocmVhZEV4aXRlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFJlbGVhc2Ugb3VyIHN0cm9uZyByZWZlcmVuY2UsIHRvIGxldCBhIGNoYW5jZSB0byB0aGUgdGhyZWFkCi0gICAgICAgIC8vIHRvIGRpZSBhIHBlYWNlZnVsIGRlYXRoLgotICAgICAgICBzdHJvbmcuY2xlYXIoKTsKLSAgICAgICAgLy8gQW5kIGltbWVkaWF0ZWx5LCByZS1hY3F1aXJlIGEgc3Ryb25nIHJlZmVyZW5jZSBmb3IgdGhlIG5leHQgbG9vcAotICAgICAgICBzdHJvbmcgPSB3ZWFrLnByb21vdGUoKTsKLSAgICB9IHdoaWxlKHN0cm9uZyAhPSAwKTsKLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBUaHJlYWQ6OnJlcXVlc3RFeGl0KCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1FeGl0UGVuZGluZyA9IHRydWU7Ci19Ci0KLXN0YXR1c190IFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtVGhyZWFkID09IGdldFRocmVhZElkKCkpIHsKLSAgICAgICAgQUxPR1coCi0gICAgICAgICJUaHJlYWQgKHRoaXM9JXApOiBkb24ndCBjYWxsIHdhaXRGb3JFeGl0KCkgZnJvbSB0aGlzICIKLSAgICAgICAgIlRocmVhZCBvYmplY3QncyB0aHJlYWQuIEl0J3MgYSBndWFyYW50ZWVkIGRlYWRsb2NrISIsCi0gICAgICAgIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKLSAgICB9Ci0gICAgCi0gICAgbUV4aXRQZW5kaW5nID0gdHJ1ZTsKLQotICAgIHdoaWxlIChtUnVubmluZyA9PSB0cnVlKSB7Ci0gICAgICAgIG1UaHJlYWRFeGl0ZWRDb25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotICAgIC8vIFRoaXMgbmV4dCBsaW5lIGlzIHByb2JhYmx5IG5vdCBuZWVkZWQgYW55IG1vcmUsIGJ1dCBpcyBiZWluZyBsZWZ0IGZvcgotICAgIC8vIGhpc3RvcmljYWwgcmVmZXJlbmNlLiBOb3RlIHRoYXQgZWFjaCBpbnRlcmVzdGVkIHBhcnR5IHdpbGwgY2xlYXIgZmxhZy4KLSAgICBtRXhpdFBlbmRpbmcgPSBmYWxzZTsKLQotICAgIHJldHVybiBtU3RhdHVzOwotfQotCi1zdGF0dXNfdCBUaHJlYWQ6OmpvaW4oKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1UaHJlYWQgPT0gZ2V0VGhyZWFkSWQoKSkgewotICAgICAgICBBTE9HVygKLSAgICAgICAgIlRocmVhZCAodGhpcz0lcCk6IGRvbid0IGNhbGwgam9pbigpIGZyb20gdGhpcyAiCi0gICAgICAgICJUaHJlYWQgb2JqZWN0J3MgdGhyZWFkLiBJdCdzIGEgZ3VhcmFudGVlZCBkZWFkbG9jayEiLAotICAgICAgICB0aGlzKTsKLQotICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7Ci0gICAgfQotCi0gICAgd2hpbGUgKG1SdW5uaW5nID09IHRydWUpIHsKLSAgICAgICAgbVRocmVhZEV4aXRlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVN0YXR1czsKLX0KLQotI2lmZGVmIEhBVkVfQU5EUk9JRF9PUwotcGlkX3QgVGhyZWFkOjpnZXRUaWQoKSBjb25zdAotewotICAgIC8vIG1UaWQgaXMgbm90IGRlZmluZWQgdW50aWwgdGhlIGNoaWxkIGluaXRpYWxpemVzIGl0LCBhbmQgdGhlIGNhbGxlciBtYXkgbmVlZCBpdCBlYXJsaWVyCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBwaWRfdCB0aWQ7Ci0gICAgaWYgKG1SdW5uaW5nKSB7Ci0gICAgICAgIHB0aHJlYWRfdCBwdGhyZWFkID0gYW5kcm9pZF90aHJlYWRfaWRfdF90b19wdGhyZWFkKG1UaHJlYWQpOwotICAgICAgICB0aWQgPSBfX3B0aHJlYWRfZ2V0dGlkKHB0aHJlYWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJUaHJlYWQgKHRoaXM9JXApOiBnZXRUaWQoKSBpcyB1bmRlZmluZWQgYmVmb3JlIHJ1bigpIiwgdGhpcyk7Ci0gICAgICAgIHRpZCA9IC0xOwotICAgIH0KLSAgICByZXR1cm4gdGlkOwotfQotI2VuZGlmCi0KLWJvb2wgVGhyZWFkOjpleGl0UGVuZGluZygpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUV4aXRQZW5kaW5nOwotfQotCi0KLQotfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1RpbWVycy5jcHAgYi9saWJzL3V0aWxzL1RpbWVycy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YjQ3MDEuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9UaW1lcnMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGltZXIgZnVuY3Rpb25zLgotLy8KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2lmZGVmIEhBVkVfV0lOMzJfVEhSRUFEUwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi1uc2Vjc190IHN5c3RlbVRpbWUoaW50IGNsb2NrKQotewotI2lmIGRlZmluZWQoSEFWRV9QT1NJWF9DTE9DS1MpCi0gICAgc3RhdGljIGNvbnN0IGNsb2NraWRfdCBjbG9ja3NbXSA9IHsKLSAgICAgICAgICAgIENMT0NLX1JFQUxUSU1FLAotICAgICAgICAgICAgQ0xPQ0tfTU9OT1RPTklDLAotICAgICAgICAgICAgQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELAotICAgICAgICAgICAgQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQKLSAgICB9OwotICAgIHN0cnVjdCB0aW1lc3BlYyB0OwotICAgIHQudHZfc2VjID0gdC50dl9uc2VjID0gMDsKLSAgICBjbG9ja19nZXR0aW1lKGNsb2Nrc1tjbG9ja10sICZ0KTsKLSAgICByZXR1cm4gbnNlY3NfdCh0LnR2X3NlYykqMTAwMDAwMDAwMExMICsgdC50dl9uc2VjOwotI2Vsc2UKLSAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IHRoZSBjbG9ja3MgaGVyZS4KLSAgICBzdHJ1Y3QgdGltZXZhbCB0OwotICAgIHQudHZfc2VjID0gdC50dl91c2VjID0gMDsKLSAgICBnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOwotICAgIHJldHVybiBuc2Vjc190KHQudHZfc2VjKSoxMDAwMDAwMDAwTEwgKyBuc2Vjc190KHQudHZfdXNlYykqMTAwMExMOwotI2VuZGlmCi19Ci0KLWludCB0b01pbGxpc2Vjb25kVGltZW91dERlbGF5KG5zZWNzX3QgcmVmZXJlbmNlVGltZSwgbnNlY3NfdCB0aW1lb3V0VGltZSkKLXsKLSAgICBpbnQgdGltZW91dERlbGF5TWlsbGlzOwotICAgIGlmICh0aW1lb3V0VGltZSA+IHJlZmVyZW5jZVRpbWUpIHsKLSAgICAgICAgdWludDY0X3QgdGltZW91dERlbGF5ID0gdWludDY0X3QodGltZW91dFRpbWUgLSByZWZlcmVuY2VUaW1lKTsKLSAgICAgICAgaWYgKHRpbWVvdXREZWxheSA+IHVpbnQ2NF90KChJTlRfTUFYIC0gMSkgKiAxMDAwMDAwTEwpKSB7Ci0gICAgICAgICAgICB0aW1lb3V0RGVsYXlNaWxsaXMgPSAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRpbWVvdXREZWxheU1pbGxpcyA9ICh0aW1lb3V0RGVsYXkgKyA5OTk5OTlMTCkgLyAxMDAwMDAwTEw7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB0aW1lb3V0RGVsYXlNaWxsaXMgPSAwOwotICAgIH0KLSAgICByZXR1cm4gdGltZW91dERlbGF5TWlsbGlzOwotfQotCi0KLS8qCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqICAgICAgRHVyYXRpb25UaW1lcgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLS8vIFN0YXJ0IHRoZSB0aW1lci4KLXZvaWQgRHVyYXRpb25UaW1lcjo6c3RhcnQodm9pZCkKLXsKLSAgICBnZXR0aW1lb2ZkYXkoJm1TdGFydFdoZW4sIE5VTEwpOwotfQotCi0vLyBTdG9wIHRoZSB0aW1lci4KLXZvaWQgRHVyYXRpb25UaW1lcjo6c3RvcCh2b2lkKQotewotICAgIGdldHRpbWVvZmRheSgmbVN0b3BXaGVuLCBOVUxMKTsKLX0KLQotLy8gR2V0IHRoZSBkdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMuCi1sb25nIGxvbmcgRHVyYXRpb25UaW1lcjo6ZHVyYXRpb25Vc2Vjcyh2b2lkKSBjb25zdAotewotICAgIHJldHVybiAobG9uZykgc3VidHJhY3RUaW1ldmFscygmbVN0b3BXaGVuLCAmbVN0YXJ0V2hlbik7Ci19Ci0KLS8vIFN1YnRyYWN0IHR3byB0aW1ldmFscy4gIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgKHB0djEtcHR2MikgaW4KLS8vIG1pY3Jvc2Vjb25kcy4KLS8qc3RhdGljKi8gbG9uZyBsb25nIER1cmF0aW9uVGltZXI6OnN1YnRyYWN0VGltZXZhbHMoY29uc3Qgc3RydWN0IHRpbWV2YWwqIHB0djEsCi0gICAgY29uc3Qgc3RydWN0IHRpbWV2YWwqIHB0djIpCi17Ci0gICAgbG9uZyBsb25nIHN0b3AgID0gKChsb25nIGxvbmcpIHB0djEtPnR2X3NlYykgKiAxMDAwMDAwTEwgKwotICAgICAgICAgICAgICAgICAgICAgICgobG9uZyBsb25nKSBwdHYxLT50dl91c2VjKTsKLSAgICBsb25nIGxvbmcgc3RhcnQgPSAoKGxvbmcgbG9uZykgcHR2Mi0+dHZfc2VjKSAqIDEwMDAwMDBMTCArCi0gICAgICAgICAgICAgICAgICAgICAgKChsb25nIGxvbmcpIHB0djItPnR2X3VzZWMpOwotICAgIHJldHVybiBzdG9wIC0gc3RhcnQ7Ci19Ci0KLS8vIEFkZCB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIHRvIHRoZSB0aW1ldmFsLgotLypzdGF0aWMqLyB2b2lkIER1cmF0aW9uVGltZXI6OmFkZFRvVGltZXZhbChzdHJ1Y3QgdGltZXZhbCogcHR2LCBsb25nIHVzZWMpCi17Ci0gICAgaWYgKHVzZWMgPCAwKSB7Ci0gICAgICAgIEFMT0coTE9HX1dBUk4sICIiLCAiTmVnYXRpdmUgdmFsdWVzIG5vdCBzdXBwb3J0ZWQgaW4gYWRkVG9UaW1ldmFsXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIG5vcm1hbGl6ZSB0dl91c2VjIGlmIG5lY2Vzc2FyeQotICAgIGlmIChwdHYtPnR2X3VzZWMgPj0gMTAwMDAwMCkgewotICAgICAgICBwdHYtPnR2X3NlYyArPSBwdHYtPnR2X3VzZWMgLyAxMDAwMDAwOwotICAgICAgICBwdHYtPnR2X3VzZWMgJT0gMTAwMDAwMDsKLSAgICB9Ci0KLSAgICBwdHYtPnR2X3VzZWMgKz0gdXNlYyAlIDEwMDAwMDA7Ci0gICAgaWYgKHB0di0+dHZfdXNlYyA+PSAxMDAwMDAwKSB7Ci0gICAgICAgIHB0di0+dHZfdXNlYyAtPSAxMDAwMDAwOwotICAgICAgICBwdHYtPnR2X3NlYysrOwotICAgIH0KLSAgICBwdHYtPnR2X3NlYyArPSB1c2VjIC8gMTAwMDAwMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9Ub2tlbml6ZXIuY3BwIGIvbGlicy91dGlscy9Ub2tlbml6ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmRhMmJmLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvVG9rZW5pemVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJUb2tlbml6ZXIiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9Ub2tlbml6ZXIuaD4KLQotLy8gRW5hYmxlcyBkZWJ1ZyBvdXRwdXQgZm9yIHRoZSB0b2tlbml6ZXIuCi0jZGVmaW5lIERFQlVHX1RPS0VOSVpFUiAwCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNEZWxpbWl0ZXIoY2hhciBjaCwgY29uc3QgY2hhciogZGVsaW1pdGVycykgewotICAgIHJldHVybiBzdHJjaHIoZGVsaW1pdGVycywgY2gpICE9IE5VTEw7Ci19Ci0KLVRva2VuaXplcjo6VG9rZW5pemVyKGNvbnN0IFN0cmluZzgmIGZpbGVuYW1lLCBGaWxlTWFwKiBmaWxlTWFwLCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIDoKLSAgICAgICAgbUZpbGVuYW1lKGZpbGVuYW1lKSwgbUZpbGVNYXAoZmlsZU1hcCksCi0gICAgICAgIG1CdWZmZXIoYnVmZmVyKSwgbUxlbmd0aChsZW5ndGgpLCBtQ3VycmVudChidWZmZXIpLCBtTGluZU51bWJlcigxKSB7Ci19Ci0KLVRva2VuaXplcjo6flRva2VuaXplcigpIHsKLSAgICBpZiAobUZpbGVNYXApIHsKLSAgICAgICAgbUZpbGVNYXAtPnJlbGVhc2UoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBkZWxldGVbXSBtQnVmZmVyOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVG9rZW5pemVyOjpvcGVuKGNvbnN0IFN0cmluZzgmIGZpbGVuYW1lLCBUb2tlbml6ZXIqKiBvdXRUb2tlbml6ZXIpIHsKLSAgICAqb3V0VG9rZW5pemVyID0gTlVMTDsKLQotICAgIGludCByZXN1bHQgPSBOT19FUlJPUjsKLSAgICBpbnQgZmQgPSA6Om9wZW4oZmlsZW5hbWUuc3RyaW5nKCksIE9fUkRPTkxZKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IC1lcnJubzsKLSAgICAgICAgQUxPR0UoIkVycm9yIG9wZW5pbmcgZmlsZSAnJXMnLCAlcy4iLCBmaWxlbmFtZS5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0OwotICAgICAgICBpZiAoZnN0YXQoZmQsICZzdGF0KSkgewotICAgICAgICAgICAgcmVzdWx0ID0gLWVycm5vOwotICAgICAgICAgICAgQUxPR0UoIkVycm9yIGdldHRpbmcgc2l6ZSBvZiBmaWxlICclcycsICVzLiIsIGZpbGVuYW1lLnN0cmluZygpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IHNpemVfdChzdGF0LnN0X3NpemUpOwotCi0gICAgICAgICAgICBGaWxlTWFwKiBmaWxlTWFwID0gbmV3IEZpbGVNYXAoKTsKLSAgICAgICAgICAgIGNoYXIqIGJ1ZmZlcjsKLSAgICAgICAgICAgIGlmIChmaWxlTWFwLT5jcmVhdGUoTlVMTCwgZmQsIDAsIGxlbmd0aCwgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICBmaWxlTWFwLT5hZHZpc2UoRmlsZU1hcDo6U0VRVUVOVElBTCk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGZpbGVNYXAtPmdldERhdGFQdHIoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbGVNYXAtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBmaWxlTWFwID0gTlVMTDsKLQotICAgICAgICAgICAgICAgIC8vIEZhbGwgYmFjayB0byByZWFkaW5nIGludG8gYSBidWZmZXIgc2luY2Ugd2UgY2FuJ3QgbW1hcCBmaWxlcyBpbiBzeXNmcy4KLSAgICAgICAgICAgICAgICAvLyBUaGUgbGVuZ3RoIHdlIG9idGFpbmVkIGZyb20gc3RhdCBpcyB3cm9uZyB0b28gKGl0IHdpbGwgYWx3YXlzIGJlIDQwOTYpCi0gICAgICAgICAgICAgICAgLy8gc28gd2UgbXVzdCB0cnVzdCB0aGF0IHJlYWQgd2lsbCByZWFkIHRoZSBlbnRpcmUgZmlsZS4KLSAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgY2hhcltsZW5ndGhdOwotICAgICAgICAgICAgICAgIHNzaXplX3QgbnJkID0gcmVhZChmZCwgYnVmZmVyLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChucmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1lcnJubzsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlYWRpbmcgZmlsZSAnJXMnLCAlcy4iLCBmaWxlbmFtZS5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwotICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHNpemVfdChucmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAqb3V0VG9rZW5pemVyID0gbmV3IFRva2VuaXplcihmaWxlbmFtZSwgZmlsZU1hcCwgYnVmZmVyLCBsZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNsb3NlKGZkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotU3RyaW5nOCBUb2tlbml6ZXI6OmdldExvY2F0aW9uKCkgY29uc3QgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVzOiVkIiwgbUZpbGVuYW1lLnN0cmluZygpLCBtTGluZU51bWJlcik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotU3RyaW5nOCBUb2tlbml6ZXI6OnBlZWtSZW1haW5kZXJPZkxpbmUoKSBjb25zdCB7Ci0gICAgY29uc3QgY2hhciogZW5kID0gZ2V0RW5kKCk7Ci0gICAgY29uc3QgY2hhciogZW9sID0gbUN1cnJlbnQ7Ci0gICAgd2hpbGUgKGVvbCAhPSBlbmQpIHsKLSAgICAgICAgY2hhciBjaCA9ICplb2w7Ci0gICAgICAgIGlmIChjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlb2wgKz0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0cmluZzgobUN1cnJlbnQsIGVvbCAtIG1DdXJyZW50KTsKLX0KLQotU3RyaW5nOCBUb2tlbml6ZXI6Om5leHRUb2tlbihjb25zdCBjaGFyKiBkZWxpbWl0ZXJzKSB7Ci0jaWYgREVCVUdfVE9LRU5JWkVSCi0gICAgQUxPR0QoIm5leHRUb2tlbiIpOwotI2VuZGlmCi0gICAgY29uc3QgY2hhciogZW5kID0gZ2V0RW5kKCk7Ci0gICAgY29uc3QgY2hhciogdG9rZW5TdGFydCA9IG1DdXJyZW50OwotICAgIHdoaWxlIChtQ3VycmVudCAhPSBlbmQpIHsKLSAgICAgICAgY2hhciBjaCA9ICptQ3VycmVudDsKLSAgICAgICAgaWYgKGNoID09ICdcbicgfHwgaXNEZWxpbWl0ZXIoY2gsIGRlbGltaXRlcnMpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudCArPSAxOwotICAgIH0KLSAgICByZXR1cm4gU3RyaW5nOCh0b2tlblN0YXJ0LCBtQ3VycmVudCAtIHRva2VuU3RhcnQpOwotfQotCi12b2lkIFRva2VuaXplcjo6bmV4dExpbmUoKSB7Ci0jaWYgREVCVUdfVE9LRU5JWkVSCi0gICAgQUxPR0QoIm5leHRMaW5lIik7Ci0jZW5kaWYKLSAgICBjb25zdCBjaGFyKiBlbmQgPSBnZXRFbmQoKTsKLSAgICB3aGlsZSAobUN1cnJlbnQgIT0gZW5kKSB7Ci0gICAgICAgIGNoYXIgY2ggPSAqKG1DdXJyZW50KyspOwotICAgICAgICBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgbUxpbmVOdW1iZXIgKz0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFRva2VuaXplcjo6c2tpcERlbGltaXRlcnMoY29uc3QgY2hhciogZGVsaW1pdGVycykgewotI2lmIERFQlVHX1RPS0VOSVpFUgotICAgIEFMT0dEKCJza2lwRGVsaW1pdGVycyIpOwotI2VuZGlmCi0gICAgY29uc3QgY2hhciogZW5kID0gZ2V0RW5kKCk7Ci0gICAgd2hpbGUgKG1DdXJyZW50ICE9IGVuZCkgewotICAgICAgICBjaGFyIGNoID0gKm1DdXJyZW50OwotICAgICAgICBpZiAoY2ggPT0gJ1xuJyB8fCAhaXNEZWxpbWl0ZXIoY2gsIGRlbGltaXRlcnMpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudCArPSAxOwotICAgIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9UcmFjZS5jcHAgYi9saWJzL3V0aWxzL1RyYWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ5Mjc4YS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1RyYWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXZvbGF0aWxlIGludDMyX3QgVHJhY2VyOjpzSXNSZWFkeSA9IDA7Ci1pbnQgVHJhY2VyOjpzVHJhY2VGRCA9IC0xOwotdWludDY0X3QgVHJhY2VyOjpzRW5hYmxlZFRhZ3MgPSAwOwotTXV0ZXggVHJhY2VyOjpzTXV0ZXg7Ci0KLXZvaWQgVHJhY2VyOjppbml0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNNdXRleCk7Ci0KLSAgICBpZiAoIXNJc1JlYWR5KSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IHRyYWNlRmlsZU5hbWUgPQotICAgICAgICAgICAgICAgICIvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlX21hcmtlciI7Ci0gICAgICAgIHNUcmFjZUZEID0gb3Blbih0cmFjZUZpbGVOYW1lLCBPX1dST05MWSk7Ci0gICAgICAgIGlmIChzVHJhY2VGRCA9PSAtMSkgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIG9wZW5pbmcgdHJhY2UgZmlsZTogJXMgKCVkKSIsIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICAgICAgcHJvcGVydHlfZ2V0KCJhdHJhY2UudGFncy5lbmFibGVmbGFncyIsIHZhbHVlLCAiMCIpOwotICAgICAgICAgICAgc0VuYWJsZWRUYWdzID0gc3RydG9sbCh2YWx1ZSwgTlVMTCwgMCkgfCBBVFJBQ0VfVEFHX0FMV0FZUzsKLSAgICAgICAgfQotCi0gICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoMSwgJnNJc1JlYWR5KTsKLSAgICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZG9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9Vbmljb2RlLmNwcCBiL2xpYnMvdXRpbHMvVW5pY29kZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2JmMDMuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9Vbmljb2RlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHV0aWxzL1VuaWNvZGUuaD4KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaWZkZWYgSEFWRV9XSU5TT0NLCi0jIHVuZGVmICBuaHRvbAotIyB1bmRlZiAgaHRvbmwKLSMgdW5kZWYgIG5odG9zCi0jIHVuZGVmICBodG9ucwotCi0jIGlmZGVmIEhBVkVfTElUVExFX0VORElBTgotIyAgZGVmaW5lIG50b2hsKHgpICAgICggKCh4KSA8PCAyNCkgfCAoKCh4KSA+PiAyNCkgJiAyNTUpIHwgKCgoeCkgPDwgOCkgJiAweGZmMDAwMCkgfCAoKCh4KSA+PiA4KSAmIDB4ZmYwMCkgKQotIyAgZGVmaW5lIGh0b25sKHgpICAgIG50b2hsKHgpCi0jICBkZWZpbmUgbnRvaHMoeCkgICAgKCAoKCh4KSA8PCA4KSAmIDB4ZmYwMCkgfCAoKCh4KSA+PiA4KSAmIDI1NSkgKQotIyAgZGVmaW5lIGh0b25zKHgpICAgIG50b2hzKHgpCi0jIGVsc2UKLSMgIGRlZmluZSBudG9obCh4KSAgICAoeCkKLSMgIGRlZmluZSBodG9ubCh4KSAgICAoeCkKLSMgIGRlZmluZSBudG9ocyh4KSAgICAoeCkKLSMgIGRlZmluZSBodG9ucyh4KSAgICAoeCkKLSMgZW5kaWYKLSNlbHNlCi0jIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNlbmRpZgotCi1leHRlcm4gIkMiIHsKLQotc3RhdGljIGNvbnN0IGNoYXIzMl90IGtCeXRlTWFzayA9IDB4MDAwMDAwQkY7Ci1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga0J5dGVNYXJrID0gMHgwMDAwMDA4MDsKLQotLy8gU3Vycm9nYXRlcyBhcmVuJ3QgdmFsaWQgZm9yIFVURi0zMiBjaGFyYWN0ZXJzLCBzbyBkZWZpbmUgc29tZQotLy8gY29uc3RhbnRzIHRoYXQgd2lsbCBsZXQgdXMgc2NyZWVuIHRoZW0gb3V0Lgotc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlU3Vycm9nYXRlSGlnaFN0YXJ0ICA9IDB4MDAwMEQ4MDA7Ci1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVIaWdoRW5kICAgID0gMHgwMDAwREJGRjsKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZUxvd1N0YXJ0ICAgPSAweDAwMDBEQzAwOwotc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlU3Vycm9nYXRlTG93RW5kICAgICA9IDB4MDAwMERGRkY7Ci1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVTdGFydCAgICAgID0ga1VuaWNvZGVTdXJyb2dhdGVIaWdoU3RhcnQ7Ci1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVFbmQgICAgICAgID0ga1VuaWNvZGVTdXJyb2dhdGVMb3dFbmQ7Ci1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVNYXhDb2RlcG9pbnQgICAgICAgID0gMHgwMDEwRkZGRjsKLQotLy8gTWFzayB1c2VkIHRvIHNldCBhcHByb3ByaWF0ZSBiaXRzIGluIGZpcnN0IGJ5dGUgb2YgVVRGLTggc2VxdWVuY2UsCi0vLyBpbmRleGVkIGJ5IG51bWJlciBvZiBieXRlcyBpbiB0aGUgc2VxdWVuY2UuCi0vLyAweHh4eHh4eAotLy8gLT4gKDAwLTdmKSA3Yml0LiBCaXQgbWFzayBmb3IgdGhlIGZpcnN0IGJ5dGUgaXMgMHgwMDAwMDAwMAotLy8gMTEweXl5eXggMTB4eHh4eHgKLS8vIC0+IChjMC1kZikoODAtYmYpIDExYml0LiBCaXQgbWFzayBpcyAweDAwMDAwMEMwCi0vLyAxMTEweXl5eSAxMHl4eHh4eCAxMHh4eHh4eAotLy8gLT4gKGUwLWVmKSg4MC1iZikoODAtYmYpIDE2Yml0LiBCaXQgbWFzayBpcyAweDAwMDAwMEUwCi0vLyAxMTExMHl5eSAxMHl5eHh4eCAxMHh4eHh4eCAxMHh4eHh4eAotLy8gLT4gKGYwLWY3KSg4MC1iZikoODAtYmYpKDgwLWJmKSAyMWJpdC4gQml0IG1hc2sgaXMgMHgwMDAwMDBGMAotc3RhdGljIGNvbnN0IGNoYXIzMl90IGtGaXJzdEJ5dGVNYXJrW10gPSB7Ci0gICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDBDMCwgMHgwMDAwMDBFMCwgMHgwMDAwMDBGMAotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFVURi0zMgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoqCi0gKiBSZXR1cm4gbnVtYmVyIG9mIFVURi04IGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgY2hhcmFjdGVyLiBJZiB0aGUgY2hhcmFjdGVyCi0gKiBpcyBpbnZhbGlkLCByZXR1cm4gc2l6ZSBvZiAwLgotICovCi1zdGF0aWMgaW5saW5lIHNpemVfdCB1dGYzMl9jb2RlcG9pbnRfdXRmOF9sZW5ndGgoY2hhcjMyX3Qgc3JjQ2hhcikKLXsKLSAgICAvLyBGaWd1cmUgb3V0IGhvdyBtYW55IGJ5dGVzIHRoZSByZXN1bHQgd2lsbCByZXF1aXJlLgotICAgIGlmIChzcmNDaGFyIDwgMHgwMDAwMDA4MCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgaWYgKHNyY0NoYXIgPCAweDAwMDAwODAwKSB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0gZWxzZSBpZiAoc3JjQ2hhciA8IDB4MDAwMTAwMDApIHsKLSAgICAgICAgaWYgKChzcmNDaGFyIDwga1VuaWNvZGVTdXJyb2dhdGVTdGFydCkgfHwgKHNyY0NoYXIgPiBrVW5pY29kZVN1cnJvZ2F0ZUVuZCkpIHsKLSAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU3Vycm9nYXRlcyBhcmUgaW52YWxpZCBVVEYtMzIgY2hhcmFjdGVycy4KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIE1heCBjb2RlIHBvaW50IGZvciBVbmljb2RlIGlzIDB4MDAxMEZGRkYuCi0gICAgZWxzZSBpZiAoc3JjQ2hhciA8PSBrVW5pY29kZU1heENvZGVwb2ludCkgewotICAgICAgICByZXR1cm4gNDsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBJbnZhbGlkIFVURi0zMiBjaGFyYWN0ZXIuCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLy8gV3JpdGUgb3V0IHRoZSBzb3VyY2UgY2hhcmFjdGVyIHRvIDxkc3RQPi4KLQotc3RhdGljIGlubGluZSB2b2lkIHV0ZjMyX2NvZGVwb2ludF90b191dGY4KHVpbnQ4X3QqIGRzdFAsIGNoYXIzMl90IHNyY0NoYXIsIHNpemVfdCBieXRlcykKLXsKLSAgICBkc3RQICs9IGJ5dGVzOwotICAgIHN3aXRjaCAoYnl0ZXMpCi0gICAgeyAgIC8qIG5vdGU6IGV2ZXJ5dGhpbmcgZmFsbHMgdGhyb3VnaC4gKi8KLSAgICAgICAgY2FzZSA0OiAqLS1kc3RQID0gKHVpbnQ4X3QpKChzcmNDaGFyIHwga0J5dGVNYXJrKSAmIGtCeXRlTWFzayk7IHNyY0NoYXIgPj49IDY7Ci0gICAgICAgIGNhc2UgMzogKi0tZHN0UCA9ICh1aW50OF90KSgoc3JjQ2hhciB8IGtCeXRlTWFyaykgJiBrQnl0ZU1hc2spOyBzcmNDaGFyID4+PSA2OwotICAgICAgICBjYXNlIDI6ICotLWRzdFAgPSAodWludDhfdCkoKHNyY0NoYXIgfCBrQnl0ZU1hcmspICYga0J5dGVNYXNrKTsgc3JjQ2hhciA+Pj0gNjsKLSAgICAgICAgY2FzZSAxOiAqLS1kc3RQID0gKHVpbnQ4X3QpKHNyY0NoYXIgfCBrRmlyc3RCeXRlTWFya1tieXRlc10pOwotICAgIH0KLX0KLQotc2l6ZV90IHN0cmxlbjMyKGNvbnN0IGNoYXIzMl90ICpzKQotewotICBjb25zdCBjaGFyMzJfdCAqc3MgPSBzOwotICB3aGlsZSAoICpzcyApCi0gICAgc3MrKzsKLSAgcmV0dXJuIHNzLXM7Ci19Ci0KLXNpemVfdCBzdHJubGVuMzIoY29uc3QgY2hhcjMyX3QgKnMsIHNpemVfdCBtYXhsZW4pCi17Ci0gIGNvbnN0IGNoYXIzMl90ICpzcyA9IHM7Ci0gIHdoaWxlICgobWF4bGVuID4gMCkgJiYgKnNzKSB7Ci0gICAgc3MrKzsKLSAgICBtYXhsZW4tLTsKLSAgfQotICByZXR1cm4gc3MtczsKLX0KLQotc3RhdGljIGlubGluZSBpbnQzMl90IHV0ZjMyX2F0X2ludGVybmFsKGNvbnN0IGNoYXIqIGN1ciwgc2l6ZV90ICpudW1fcmVhZCkKLXsKLSAgICBjb25zdCBjaGFyIGZpcnN0X2NoYXIgPSAqY3VyOwotICAgIGlmICgoZmlyc3RfY2hhciAmIDB4ODApID09IDApIHsgLy8gQVNDSUkKLSAgICAgICAgKm51bV9yZWFkID0gMTsKLSAgICAgICAgcmV0dXJuICpjdXI7Ci0gICAgfQotICAgIGN1cisrOwotICAgIGNoYXIzMl90IG1hc2ssIHRvX2lnbm9yZV9tYXNrOwotICAgIHNpemVfdCBudW1fdG9fcmVhZCA9IDA7Ci0gICAgY2hhcjMyX3QgdXRmMzIgPSBmaXJzdF9jaGFyOwotICAgIGZvciAobnVtX3RvX3JlYWQgPSAxLCBtYXNrID0gMHg0MCwgdG9faWdub3JlX21hc2sgPSAweEZGRkZGRjgwOwotICAgICAgICAgKGZpcnN0X2NoYXIgJiBtYXNrKTsKLSAgICAgICAgIG51bV90b19yZWFkKyssIHRvX2lnbm9yZV9tYXNrIHw9IG1hc2ssIG1hc2sgPj49IDEpIHsKLSAgICAgICAgLy8gMHgzRiA9PSAwMDExMTExMQotICAgICAgICB1dGYzMiA9ICh1dGYzMiA8PCA2KSArICgqY3VyKysgJiAweDNGKTsKLSAgICB9Ci0gICAgdG9faWdub3JlX21hc2sgfD0gbWFzazsKLSAgICB1dGYzMiAmPSB+KHRvX2lnbm9yZV9tYXNrIDw8ICg2ICogKG51bV90b19yZWFkIC0gMSkpKTsKLQotICAgICpudW1fcmVhZCA9IG51bV90b19yZWFkOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90Pih1dGYzMik7Ci19Ci0KLWludDMyX3QgdXRmMzJfZnJvbV91dGY4X2F0KGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNyY19sZW4sIHNpemVfdCBpbmRleCwgc2l6ZV90ICpuZXh0X2luZGV4KQotewotICAgIGlmIChpbmRleCA+PSBzcmNfbGVuKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgc2l6ZV90IGR1bW15X2luZGV4OwotICAgIGlmIChuZXh0X2luZGV4ID09IE5VTEwpIHsKLSAgICAgICAgbmV4dF9pbmRleCA9ICZkdW1teV9pbmRleDsKLSAgICB9Ci0gICAgc2l6ZV90IG51bV9yZWFkOwotICAgIGludDMyX3QgcmV0ID0gdXRmMzJfYXRfaW50ZXJuYWwoc3JjICsgaW5kZXgsICZudW1fcmVhZCk7Ci0gICAgaWYgKHJldCA+PSAwKSB7Ci0gICAgICAgICpuZXh0X2luZGV4ID0gaW5kZXggKyBudW1fcmVhZDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90IHV0ZjMyX3RvX3V0ZjhfbGVuZ3RoKGNvbnN0IGNoYXIzMl90ICpzcmMsIHNpemVfdCBzcmNfbGVuKQotewotICAgIGlmIChzcmMgPT0gTlVMTCB8fCBzcmNfbGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHNpemVfdCByZXQgPSAwOwotICAgIGNvbnN0IGNoYXIzMl90ICplbmQgPSBzcmMgKyBzcmNfbGVuOwotICAgIHdoaWxlIChzcmMgPCBlbmQpIHsKLSAgICAgICAgcmV0ICs9IHV0ZjMyX2NvZGVwb2ludF91dGY4X2xlbmd0aCgqc3JjKyspOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIHV0ZjMyX3RvX3V0ZjgoY29uc3QgY2hhcjMyX3QqIHNyYywgc2l6ZV90IHNyY19sZW4sIGNoYXIqIGRzdCkKLXsKLSAgICBpZiAoc3JjID09IE5VTEwgfHwgc3JjX2xlbiA9PSAwIHx8IGRzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyMzJfdCAqY3VyX3V0ZjMyID0gc3JjOwotICAgIGNvbnN0IGNoYXIzMl90ICplbmRfdXRmMzIgPSBzcmMgKyBzcmNfbGVuOwotICAgIGNoYXIgKmN1ciA9IGRzdDsKLSAgICB3aGlsZSAoY3VyX3V0ZjMyIDwgZW5kX3V0ZjMyKSB7Ci0gICAgICAgIHNpemVfdCBsZW4gPSB1dGYzMl9jb2RlcG9pbnRfdXRmOF9sZW5ndGgoKmN1cl91dGYzMik7Ci0gICAgICAgIHV0ZjMyX2NvZGVwb2ludF90b191dGY4KCh1aW50OF90ICopY3VyLCAqY3VyX3V0ZjMyKyssIGxlbik7Ci0gICAgICAgIGN1ciArPSBsZW47Ci0gICAgfQotICAgICpjdXIgPSAnXDAnOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVVRGLTE2Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgc3RyY21wMTYoY29uc3QgY2hhcjE2X3QgKnMxLCBjb25zdCBjaGFyMTZfdCAqczIpCi17Ci0gIGNoYXIxNl90IGNoOwotICBpbnQgZCA9IDA7Ci0KLSAgd2hpbGUgKCAxICkgewotICAgIGQgPSAoaW50KShjaCA9ICpzMSsrKSAtIChpbnQpKnMyKys7Ci0gICAgaWYgKCBkIHx8ICFjaCApCi0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBkOwotfQotCi1pbnQgc3RybmNtcDE2KGNvbnN0IGNoYXIxNl90ICpzMSwgY29uc3QgY2hhcjE2X3QgKnMyLCBzaXplX3QgbikKLXsKLSAgY2hhcjE2X3QgY2g7Ci0gIGludCBkID0gMDsKLQotICB3aGlsZSAoIG4tLSApIHsKLSAgICBkID0gKGludCkoY2ggPSAqczErKykgLSAoaW50KSpzMisrOwotICAgIGlmICggZCB8fCAhY2ggKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gZDsKLX0KLQotY2hhcjE2X3QgKnN0cmNweTE2KGNoYXIxNl90ICpkc3QsIGNvbnN0IGNoYXIxNl90ICpzcmMpCi17Ci0gIGNoYXIxNl90ICpxID0gZHN0OwotICBjb25zdCBjaGFyMTZfdCAqcCA9IHNyYzsKLSAgY2hhcjE2X3QgY2g7Ci0KLSAgZG8gewotICAgICpxKysgPSBjaCA9ICpwKys7Ci0gIH0gd2hpbGUgKCBjaCApOwotCi0gIHJldHVybiBkc3Q7Ci19Ci0KLXNpemVfdCBzdHJsZW4xNihjb25zdCBjaGFyMTZfdCAqcykKLXsKLSAgY29uc3QgY2hhcjE2X3QgKnNzID0gczsKLSAgd2hpbGUgKCAqc3MgKQotICAgIHNzKys7Ci0gIHJldHVybiBzcy1zOwotfQotCi0KLWNoYXIxNl90ICpzdHJuY3B5MTYoY2hhcjE2X3QgKmRzdCwgY29uc3QgY2hhcjE2X3QgKnNyYywgc2l6ZV90IG4pCi17Ci0gIGNoYXIxNl90ICpxID0gZHN0OwotICBjb25zdCBjaGFyMTZfdCAqcCA9IHNyYzsKLSAgY2hhciBjaDsKLQotICB3aGlsZSAobikgewotICAgIG4tLTsKLSAgICAqcSsrID0gY2ggPSAqcCsrOwotICAgIGlmICggIWNoICkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgKnEgPSAwOwotCi0gIHJldHVybiBkc3Q7Ci19Ci0KLXNpemVfdCBzdHJubGVuMTYoY29uc3QgY2hhcjE2X3QgKnMsIHNpemVfdCBtYXhsZW4pCi17Ci0gIGNvbnN0IGNoYXIxNl90ICpzcyA9IHM7Ci0KLSAgLyogSW1wb3J0YW50OiB0aGUgbWF4bGVuIHRlc3QgbXVzdCBwcmVjZWRlIHRoZSByZWZlcmVuY2UgdGhyb3VnaCBzczsKLSAgICAgc2luY2UgdGhlIGJ5dGUgYmV5b25kIHRoZSBtYXhpbXVtIG1heSBzZWdmYXVsdCAqLwotICB3aGlsZSAoKG1heGxlbiA+IDApICYmICpzcykgewotICAgIHNzKys7Ci0gICAgbWF4bGVuLS07Ci0gIH0KLSAgcmV0dXJuIHNzLXM7Ci19Ci0KLWludCBzdHJ6Y21wMTYoY29uc3QgY2hhcjE2X3QgKnMxLCBzaXplX3QgbjEsIGNvbnN0IGNoYXIxNl90ICpzMiwgc2l6ZV90IG4yKQotewotICAgIGNvbnN0IGNoYXIxNl90KiBlMSA9IHMxK24xOwotICAgIGNvbnN0IGNoYXIxNl90KiBlMiA9IHMyK24yOwotCi0gICAgd2hpbGUgKHMxIDwgZTEgJiYgczIgPCBlMikgewotICAgICAgICBjb25zdCBpbnQgZCA9IChpbnQpKnMxKysgLSAoaW50KSpzMisrOwotICAgICAgICBpZiAoZCkgewotICAgICAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbjEgPCBuMgotICAgICAgICA/ICgwIC0gKGludCkqczIpCi0gICAgICAgIDogKG4xID4gbjIKLSAgICAgICAgICAgPyAoKGludCkqczEgLSAwKQotICAgICAgICAgICA6IDApOwotfQotCi1pbnQgc3RyemNtcDE2X2hfbihjb25zdCBjaGFyMTZfdCAqczFILCBzaXplX3QgbjEsIGNvbnN0IGNoYXIxNl90ICpzMk4sIHNpemVfdCBuMikKLXsKLSAgICBjb25zdCBjaGFyMTZfdCogZTEgPSBzMUgrbjE7Ci0gICAgY29uc3QgY2hhcjE2X3QqIGUyID0gczJOK24yOwotCi0gICAgd2hpbGUgKHMxSCA8IGUxICYmIHMyTiA8IGUyKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIxNl90IGMyID0gbnRvaHMoKnMyTik7Ci0gICAgICAgIGNvbnN0IGludCBkID0gKGludCkqczFIKysgLSAoaW50KWMyOwotICAgICAgICBzMk4rKzsKLSAgICAgICAgaWYgKGQpIHsKLSAgICAgICAgICAgIHJldHVybiBkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG4xIDwgbjIKLSAgICAgICAgPyAoMCAtIChpbnQpbnRvaHMoKnMyTikpCi0gICAgICAgIDogKG4xID4gbjIKLSAgICAgICAgICAgPyAoKGludCkqczFIIC0gMCkKLSAgICAgICAgICAgOiAwKTsKLX0KLQotdm9pZCB1dGYxNl90b191dGY4KGNvbnN0IGNoYXIxNl90KiBzcmMsIHNpemVfdCBzcmNfbGVuLCBjaGFyKiBkc3QpCi17Ci0gICAgaWYgKHNyYyA9PSBOVUxMIHx8IHNyY19sZW4gPT0gMCB8fCBkc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgY2hhcjE2X3QqIGN1cl91dGYxNiA9IHNyYzsKLSAgICBjb25zdCBjaGFyMTZfdCogY29uc3QgZW5kX3V0ZjE2ID0gc3JjICsgc3JjX2xlbjsKLSAgICBjaGFyICpjdXIgPSBkc3Q7Ci0gICAgd2hpbGUgKGN1cl91dGYxNiA8IGVuZF91dGYxNikgewotICAgICAgICBjaGFyMzJfdCB1dGYzMjsKLSAgICAgICAgLy8gc3Vycm9nYXRlIHBhaXJzCi0gICAgICAgIGlmICgoKmN1cl91dGYxNiAmIDB4RkMwMCkgPT0gMHhEODAwKSB7Ci0gICAgICAgICAgICB1dGYzMiA9ICgqY3VyX3V0ZjE2KysgLSAweEQ4MDApIDw8IDEwOwotICAgICAgICAgICAgdXRmMzIgfD0gKmN1cl91dGYxNisrIC0gMHhEQzAwOwotICAgICAgICAgICAgdXRmMzIgKz0gMHgxMDAwMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHV0ZjMyID0gKGNoYXIzMl90KSAqY3VyX3V0ZjE2Kys7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc2l6ZV90IGxlbiA9IHV0ZjMyX2NvZGVwb2ludF91dGY4X2xlbmd0aCh1dGYzMik7Ci0gICAgICAgIHV0ZjMyX2NvZGVwb2ludF90b191dGY4KCh1aW50OF90KiljdXIsIHV0ZjMyLCBsZW4pOwotICAgICAgICBjdXIgKz0gbGVuOwotICAgIH0KLSAgICAqY3VyID0gJ1wwJzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFVURi04Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zc2l6ZV90IHV0ZjhfbGVuZ3RoKGNvbnN0IGNoYXIgKnNyYykKLXsKLSAgICBjb25zdCBjaGFyICpjdXIgPSBzcmM7Ci0gICAgc2l6ZV90IHJldCA9IDA7Ci0gICAgd2hpbGUgKCpjdXIgIT0gJ1wwJykgewotICAgICAgICBjb25zdCBjaGFyIGZpcnN0X2NoYXIgPSAqY3VyKys7Ci0gICAgICAgIGlmICgoZmlyc3RfY2hhciAmIDB4ODApID09IDApIHsgLy8gQVNDSUkKLSAgICAgICAgICAgIHJldCArPSAxOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gKFVURi04J3MgY2hhcmFjdGVyIG11c3Qgbm90IGJlIGxpa2UgMTB4eHh4eHgsCi0gICAgICAgIC8vICBidXQgMTEweHh4eHgsIDExMTB4eHh4LCAuLi4gb3IgMTExMTExMHgpCi0gICAgICAgIGlmICgoZmlyc3RfY2hhciAmIDB4NDApID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGludDMyX3QgbWFzaywgdG9faWdub3JlX21hc2s7Ci0gICAgICAgIHNpemVfdCBudW1fdG9fcmVhZCA9IDA7Ci0gICAgICAgIGNoYXIzMl90IHV0ZjMyID0gMDsKLSAgICAgICAgZm9yIChudW1fdG9fcmVhZCA9IDEsIG1hc2sgPSAweDQwLCB0b19pZ25vcmVfbWFzayA9IDB4ODA7Ci0gICAgICAgICAgICAgbnVtX3RvX3JlYWQgPCA1ICYmIChmaXJzdF9jaGFyICYgbWFzayk7Ci0gICAgICAgICAgICAgbnVtX3RvX3JlYWQrKywgdG9faWdub3JlX21hc2sgfD0gbWFzaywgbWFzayA+Pj0gMSkgewotICAgICAgICAgICAgaWYgKCgqY3VyICYgMHhDMCkgIT0gMHg4MCkgeyAvLyBtdXN0IGJlIDEweHh4eHh4Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gMHgzRiA9PSAwMDExMTExMQotICAgICAgICAgICAgdXRmMzIgPSAodXRmMzIgPDwgNikgKyAoKmN1cisrICYgMHgzRik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gImZpcnN0X2NoYXIiIG11c3QgYmUgKDExMHh4eHh4IC0gMTExMTB4eHgpCi0gICAgICAgIGlmIChudW1fdG9fcmVhZCA9PSA1KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgdG9faWdub3JlX21hc2sgfD0gbWFzazsKLSAgICAgICAgdXRmMzIgfD0gKCh+dG9faWdub3JlX21hc2spICYgZmlyc3RfY2hhcikgPDwgKDYgKiAobnVtX3RvX3JlYWQgLSAxKSk7Ci0gICAgICAgIGlmICh1dGYzMiA+IGtVbmljb2RlTWF4Q29kZXBvaW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXQgKz0gbnVtX3RvX3JlYWQ7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXNzaXplX3QgdXRmMTZfdG9fdXRmOF9sZW5ndGgoY29uc3QgY2hhcjE2X3QgKnNyYywgc2l6ZV90IHNyY19sZW4pCi17Ci0gICAgaWYgKHNyYyA9PSBOVUxMIHx8IHNyY19sZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc2l6ZV90IHJldCA9IDA7Ci0gICAgY29uc3QgY2hhcjE2X3QqIGNvbnN0IGVuZCA9IHNyYyArIHNyY19sZW47Ci0gICAgd2hpbGUgKHNyYyA8IGVuZCkgewotICAgICAgICBpZiAoKCpzcmMgJiAweEZDMDApID09IDB4RDgwMCAmJiAoc3JjICsgMSkgPCBlbmQKLSAgICAgICAgICAgICAgICAmJiAoKisrc3JjICYgMHhGQzAwKSA9PSAweERDMDApIHsKLSAgICAgICAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlycyBhcmUgYWx3YXlzIDQgYnl0ZXMuCi0gICAgICAgICAgICByZXQgKz0gNDsKLSAgICAgICAgICAgIHNyYysrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ICs9IHV0ZjMyX2NvZGVwb2ludF91dGY4X2xlbmd0aCgoY2hhcjMyX3QpICpzcmMrKyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIDEtNCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgYml0cy4KLSAqCi0gKiAxMTExIC0+IDQKLSAqIDExMTAgLT4gMwotICogMTEweCAtPiAyCi0gKiAxMHh4IC0+IDEKLSAqIDB4eHggLT4gMQotICovCi1zdGF0aWMgaW5saW5lIHNpemVfdCB1dGY4X2NvZGVwb2ludF9sZW4odWludDhfdCBjaCkKLXsKLSAgICByZXR1cm4gKCgweGU1MDAwMDAwID4+ICgoY2ggPj4gMykgJiAweDFlKSkgJiAzKSArIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1dGY4X3NoaWZ0X2FuZF9tYXNrKHVpbnQzMl90KiBjb2RlUG9pbnQsIGNvbnN0IHVpbnQ4X3QgYnl0ZSkKLXsKLSAgICAqY29kZVBvaW50IDw8PSA2OwotICAgICpjb2RlUG9pbnQgfD0gMHgzRiAmIGJ5dGU7Ci19Ci0KLXNpemVfdCB1dGY4X3RvX3V0ZjMyX2xlbmd0aChjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNfbGVuKQotewotICAgIGlmIChzcmMgPT0gTlVMTCB8fCBzcmNfbGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHNpemVfdCByZXQgPSAwOwotICAgIGNvbnN0IGNoYXIqIGN1cjsKLSAgICBjb25zdCBjaGFyKiBlbmQ7Ci0gICAgc2l6ZV90IG51bV90b19za2lwOwotICAgIGZvciAoY3VyID0gc3JjLCBlbmQgPSBzcmMgKyBzcmNfbGVuLCBudW1fdG9fc2tpcCA9IDE7Ci0gICAgICAgICBjdXIgPCBlbmQ7Ci0gICAgICAgICBjdXIgKz0gbnVtX3RvX3NraXAsIHJldCsrKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgZmlyc3RfY2hhciA9ICpjdXI7Ci0gICAgICAgIG51bV90b19za2lwID0gMTsKLSAgICAgICAgaWYgKChmaXJzdF9jaGFyICYgMHg4MCkgPT0gMCkgeyAgLy8gQVNDSUkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgbWFzazsKLQotICAgICAgICBmb3IgKG1hc2sgPSAweDQwOyAoZmlyc3RfY2hhciAmIG1hc2spOyBudW1fdG9fc2tpcCsrLCBtYXNrID4+PSAxKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCB1dGY4X3RvX3V0ZjMyKGNvbnN0IGNoYXIqIHNyYywgc2l6ZV90IHNyY19sZW4sIGNoYXIzMl90KiBkc3QpCi17Ci0gICAgaWYgKHNyYyA9PSBOVUxMIHx8IHNyY19sZW4gPT0gMCB8fCBkc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciogY3VyID0gc3JjOwotICAgIGNvbnN0IGNoYXIqIGNvbnN0IGVuZCA9IHNyYyArIHNyY19sZW47Ci0gICAgY2hhcjMyX3QqIGN1cl91dGYzMiA9IGRzdDsKLSAgICB3aGlsZSAoY3VyIDwgZW5kKSB7Ci0gICAgICAgIHNpemVfdCBudW1fcmVhZDsKLSAgICAgICAgKmN1cl91dGYzMisrID0gc3RhdGljX2Nhc3Q8Y2hhcjMyX3Q+KHV0ZjMyX2F0X2ludGVybmFsKGN1ciwgJm51bV9yZWFkKSk7Ci0gICAgICAgIGN1ciArPSBudW1fcmVhZDsKLSAgICB9Ci0gICAgKmN1cl91dGYzMiA9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgdXRmOF90b191dGYzMl9jb2RlcG9pbnQoY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3QgbGVuZ3RoKQotewotICAgIHVpbnQzMl90IHVuaWNvZGU7Ci0KLSAgICBzd2l0Y2ggKGxlbmd0aCkKLSAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJldHVybiBzcmNbMF07Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHVuaWNvZGUgPSBzcmNbMF0gJiAweDFmOwotICAgICAgICAgICAgdXRmOF9zaGlmdF9hbmRfbWFzaygmdW5pY29kZSwgc3JjWzFdKTsKLSAgICAgICAgICAgIHJldHVybiB1bmljb2RlOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICB1bmljb2RlID0gc3JjWzBdICYgMHgwZjsKLSAgICAgICAgICAgIHV0Zjhfc2hpZnRfYW5kX21hc2soJnVuaWNvZGUsIHNyY1sxXSk7Ci0gICAgICAgICAgICB1dGY4X3NoaWZ0X2FuZF9tYXNrKCZ1bmljb2RlLCBzcmNbMl0pOwotICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGU7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHVuaWNvZGUgPSBzcmNbMF0gJiAweDA3OwotICAgICAgICAgICAgdXRmOF9zaGlmdF9hbmRfbWFzaygmdW5pY29kZSwgc3JjWzFdKTsKLSAgICAgICAgICAgIHV0Zjhfc2hpZnRfYW5kX21hc2soJnVuaWNvZGUsIHNyY1syXSk7Ci0gICAgICAgICAgICB1dGY4X3NoaWZ0X2FuZF9tYXNrKCZ1bmljb2RlLCBzcmNbM10pOwotICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gMHhmZmZmOwotICAgIH0KLQotICAgIC8vcHJpbnRmKCJDaGFyIGF0ICVwOiBsZW49JWQsIHV0Zi0xNj0lcFxuIiwgc3JjLCBsZW5ndGgsICh2b2lkKilyZXN1bHQpOwotfQotCi1zc2l6ZV90IHV0ZjhfdG9fdXRmMTZfbGVuZ3RoKGNvbnN0IHVpbnQ4X3QqIHU4c3RyLCBzaXplX3QgdThsZW4pCi17Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgdThlbmQgPSB1OHN0ciArIHU4bGVuOwotICAgIGNvbnN0IHVpbnQ4X3QqIHU4Y3VyID0gdThzdHI7Ci0KLSAgICAvKiBWYWxpZGF0ZSB0aGF0IHRoZSBVVEYtOCBpcyB0aGUgY29ycmVjdCBsZW4gKi8KLSAgICBzaXplX3QgdTE2bWVhc3VyZWRMZW4gPSAwOwotICAgIHdoaWxlICh1OGN1ciA8IHU4ZW5kKSB7Ci0gICAgICAgIHUxNm1lYXN1cmVkTGVuKys7Ci0gICAgICAgIGludCB1OGNoYXJMZW4gPSB1dGY4X2NvZGVwb2ludF9sZW4oKnU4Y3VyKTsKLSAgICAgICAgdWludDMyX3QgY29kZXBvaW50ID0gdXRmOF90b191dGYzMl9jb2RlcG9pbnQodThjdXIsIHU4Y2hhckxlbik7Ci0gICAgICAgIGlmIChjb2RlcG9pbnQgPiAweEZGRkYpIHUxNm1lYXN1cmVkTGVuKys7IC8vIHRoaXMgd2lsbCBiZSBhIHN1cnJvZ2F0ZSBwYWlyIGluIHV0ZjE2Ci0gICAgICAgIHU4Y3VyICs9IHU4Y2hhckxlbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIHN1cmUgdGhhdCB3ZSBlbmRlZCB3aGVyZSB3ZSB0aG91Z2h0IHdlIHdvdWxkIGFuZCB0aGUgb3V0cHV0IFVURi0xNgotICAgICAqIHdpbGwgYmUgZXhhY3RseSBob3cgbG9uZyB3ZSB3ZXJlIHRvbGQgaXQgd291bGQgYmUuCi0gICAgICovCi0gICAgaWYgKHU4Y3VyICE9IHU4ZW5kKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdTE2bWVhc3VyZWRMZW47Ci19Ci0KLWNoYXIxNl90KiB1dGY4X3RvX3V0ZjE2X25vX251bGxfdGVybWluYXRvcihjb25zdCB1aW50OF90KiB1OHN0ciwgc2l6ZV90IHU4bGVuLCBjaGFyMTZfdCogdTE2c3RyKQotewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHU4ZW5kID0gdThzdHIgKyB1OGxlbjsKLSAgICBjb25zdCB1aW50OF90KiB1OGN1ciA9IHU4c3RyOwotICAgIGNoYXIxNl90KiB1MTZjdXIgPSB1MTZzdHI7Ci0KLSAgICB3aGlsZSAodThjdXIgPCB1OGVuZCkgewotICAgICAgICBzaXplX3QgdThsZW4gPSB1dGY4X2NvZGVwb2ludF9sZW4oKnU4Y3VyKTsKLSAgICAgICAgdWludDMyX3QgY29kZXBvaW50ID0gdXRmOF90b191dGYzMl9jb2RlcG9pbnQodThjdXIsIHU4bGVuKTsKLQotICAgICAgICAvLyBDb252ZXJ0IHRoZSBVVEYzMiBjb2RlcG9pbnQgdG8gb25lIG9yIG1vcmUgVVRGMTYgY29kZXBvaW50cwotICAgICAgICBpZiAoY29kZXBvaW50IDw9IDB4RkZGRikgewotICAgICAgICAgICAgLy8gU2luZ2xlIFVURjE2IGNoYXJhY3RlcgotICAgICAgICAgICAgKnUxNmN1cisrID0gKGNoYXIxNl90KSBjb2RlcG9pbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBNdWx0aXBsZSBVVEYxNiBjaGFyYWN0ZXJzIHdpdGggc3Vycm9nYXRlcwotICAgICAgICAgICAgY29kZXBvaW50ID0gY29kZXBvaW50IC0gMHgxMDAwMDsKLSAgICAgICAgICAgICp1MTZjdXIrKyA9IChjaGFyMTZfdCkgKChjb2RlcG9pbnQgPj4gMTApICsgMHhEODAwKTsKLSAgICAgICAgICAgICp1MTZjdXIrKyA9IChjaGFyMTZfdCkgKChjb2RlcG9pbnQgJiAweDNGRikgKyAweERDMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgdThjdXIgKz0gdThsZW47Ci0gICAgfQotICAgIHJldHVybiB1MTZjdXI7Ci19Ci0KLXZvaWQgdXRmOF90b191dGYxNihjb25zdCB1aW50OF90KiB1OHN0ciwgc2l6ZV90IHU4bGVuLCBjaGFyMTZfdCogdTE2c3RyKSB7Ci0gICAgY2hhcjE2X3QqIGVuZCA9IHV0ZjhfdG9fdXRmMTZfbm9fbnVsbF90ZXJtaW5hdG9yKHU4c3RyLCB1OGxlbiwgdTE2c3RyKTsKLSAgICAqZW5kID0gMDsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9WZWN0b3JJbXBsLmNwcCBiL2xpYnMvdXRpbHMvVmVjdG9ySW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMGFlM2UuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9WZWN0b3JJbXBsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJWZWN0b3IiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU2hhcmVkQnVmZmVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9ySW1wbC5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IHNpemVfdCBrTWluVmVjdG9yQ2FwYWNpdHkgPSA0OwotCi1zdGF0aWMgaW5saW5lIHNpemVfdCBtYXgoc2l6ZV90IGEsIHNpemVfdCBiKSB7Ci0gICAgcmV0dXJuIGE+YiA/IGEgOiBiOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVZlY3RvckltcGw6OlZlY3RvckltcGwoc2l6ZV90IGl0ZW1TaXplLCB1aW50MzJfdCBmbGFncykKLSAgICA6IG1TdG9yYWdlKDApLCBtQ291bnQoMCksIG1GbGFncyhmbGFncyksIG1JdGVtU2l6ZShpdGVtU2l6ZSkKLXsKLX0KLQotVmVjdG9ySW1wbDo6VmVjdG9ySW1wbChjb25zdCBWZWN0b3JJbXBsJiByaHMpCi0gICAgOiAgIG1TdG9yYWdlKHJocy5tU3RvcmFnZSksIG1Db3VudChyaHMubUNvdW50KSwKLSAgICAgICAgbUZsYWdzKHJocy5tRmxhZ3MpLCBtSXRlbVNpemUocmhzLm1JdGVtU2l6ZSkKLXsKLSAgICBpZiAobVN0b3JhZ2UpIHsKLSAgICAgICAgU2hhcmVkQnVmZmVyOjpzaGFyZWRCdWZmZXIobVN0b3JhZ2UpLT5hY3F1aXJlKCk7Ci0gICAgfQotfQotCi1WZWN0b3JJbXBsOjp+VmVjdG9ySW1wbCgpCi17Ci0gICAgQUxPR19BU1NFUlQoIW1Db3VudCwKLSAgICAgICAgIlslcF0gIgotICAgICAgICAic3ViY2xhc3NlcyBvZiBWZWN0b3JJbXBsIG11c3QgY2FsbCBmaW5pc2hfdmVjdG9yKCkiCi0gICAgICAgICIgaW4gdGhlaXIgZGVzdHJ1Y3Rvci4gTGVha2luZyAlZCBieXRlcy4iLAotICAgICAgICB0aGlzLCAoaW50KShtQ291bnQqbUl0ZW1TaXplKSk7Ci0gICAgLy8gV2UgY2FuJ3QgY2FsbCBfZG9fZGVzdHJveSgpIGhlcmUgYmVjYXVzZSB0aGUgdnRhYmxlIGlzIGFscmVhZHkgZ29uZS4gCi19Ci0KLVZlY3RvckltcGwmIFZlY3RvckltcGw6Om9wZXJhdG9yID0gKGNvbnN0IFZlY3RvckltcGwmIHJocykKLXsKLSAgICBBTE9HX0FTU0VSVChtSXRlbVNpemUgPT0gcmhzLm1JdGVtU2l6ZSwKLSAgICAgICAgIlZlY3Rvcjw+IGhhdmUgZGlmZmVyZW50IHR5cGVzICh0aGlzPSVwLCByaHM9JXApIiwgdGhpcywgJnJocyk7Ci0gICAgaWYgKHRoaXMgIT0gJnJocykgewotICAgICAgICByZWxlYXNlX3N0b3JhZ2UoKTsKLSAgICAgICAgaWYgKHJocy5tQ291bnQpIHsKLSAgICAgICAgICAgIG1TdG9yYWdlID0gcmhzLm1TdG9yYWdlOwotICAgICAgICAgICAgbUNvdW50ID0gcmhzLm1Db3VudDsKLSAgICAgICAgICAgIFNoYXJlZEJ1ZmZlcjo6c2hhcmVkQnVmZmVyKG1TdG9yYWdlKS0+YWNxdWlyZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0b3JhZ2UgPSAwOwotICAgICAgICAgICAgbUNvdW50ID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXZvaWQqIFZlY3RvckltcGw6OmVkaXRBcnJheUltcGwoKQotewotICAgIGlmIChtU3RvcmFnZSkgewotICAgICAgICBTaGFyZWRCdWZmZXIqIHNiID0gU2hhcmVkQnVmZmVyOjpzaGFyZWRCdWZmZXIobVN0b3JhZ2UpLT5hdHRlbXB0RWRpdCgpOwotICAgICAgICBpZiAoc2IgPT0gMCkgewotICAgICAgICAgICAgc2IgPSBTaGFyZWRCdWZmZXI6OmFsbG9jKGNhcGFjaXR5KCkgKiBtSXRlbVNpemUpOwotICAgICAgICAgICAgaWYgKHNiKSB7Ci0gICAgICAgICAgICAgICAgX2RvX2NvcHkoc2ItPmRhdGEoKSwgbVN0b3JhZ2UsIG1Db3VudCk7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZV9zdG9yYWdlKCk7Ci0gICAgICAgICAgICAgICAgbVN0b3JhZ2UgPSBzYi0+ZGF0YSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtU3RvcmFnZTsKLX0KLQotc2l6ZV90IFZlY3RvckltcGw6OmNhcGFjaXR5KCkgY29uc3QKLXsKLSAgICBpZiAobVN0b3JhZ2UpIHsKLSAgICAgICAgcmV0dXJuIFNoYXJlZEJ1ZmZlcjo6c2hhcmVkQnVmZmVyKG1TdG9yYWdlKS0+c2l6ZSgpIC8gbUl0ZW1TaXplOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3NpemVfdCBWZWN0b3JJbXBsOjppbnNlcnRWZWN0b3JBdChjb25zdCBWZWN0b3JJbXBsJiB2ZWN0b3IsIHNpemVfdCBpbmRleCkKLXsKLSAgICByZXR1cm4gaW5zZXJ0QXJyYXlBdCh2ZWN0b3IuYXJyYXlJbXBsKCksIGluZGV4LCB2ZWN0b3Iuc2l6ZSgpKTsKLX0KLQotc3NpemVfdCBWZWN0b3JJbXBsOjphcHBlbmRWZWN0b3IoY29uc3QgVmVjdG9ySW1wbCYgdmVjdG9yKQotewotICAgIHJldHVybiBpbnNlcnRWZWN0b3JBdCh2ZWN0b3IsIHNpemUoKSk7Ci19Ci0KLXNzaXplX3QgVmVjdG9ySW1wbDo6aW5zZXJ0QXJyYXlBdChjb25zdCB2b2lkKiBhcnJheSwgc2l6ZV90IGluZGV4LCBzaXplX3QgbGVuZ3RoKQotewotICAgIGlmIChpbmRleCA+IHNpemUoKSkKLSAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKLSAgICB2b2lkKiB3aGVyZSA9IF9ncm93KGluZGV4LCBsZW5ndGgpOwotICAgIGlmICh3aGVyZSkgewotICAgICAgICBfZG9fY29weSh3aGVyZSwgYXJyYXksIGxlbmd0aCk7Ci0gICAgfQotICAgIHJldHVybiB3aGVyZSA/IGluZGV4IDogKHNzaXplX3QpTk9fTUVNT1JZOwotfQotCi1zc2l6ZV90IFZlY3RvckltcGw6OmFwcGVuZEFycmF5KGNvbnN0IHZvaWQqIGFycmF5LCBzaXplX3QgbGVuZ3RoKQotewotICAgIHJldHVybiBpbnNlcnRBcnJheUF0KGFycmF5LCBzaXplKCksIGxlbmd0aCk7Ci19Ci0KLXNzaXplX3QgVmVjdG9ySW1wbDo6aW5zZXJ0QXQoc2l6ZV90IGluZGV4LCBzaXplX3QgbnVtSXRlbXMpCi17Ci0gICAgcmV0dXJuIGluc2VydEF0KDAsIGluZGV4LCBudW1JdGVtcyk7Ci19Ci0KLXNzaXplX3QgVmVjdG9ySW1wbDo6aW5zZXJ0QXQoY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90IGluZGV4LCBzaXplX3QgbnVtSXRlbXMpCi17Ci0gICAgaWYgKGluZGV4ID4gc2l6ZSgpKQotICAgICAgICByZXR1cm4gQkFEX0lOREVYOwotICAgIHZvaWQqIHdoZXJlID0gX2dyb3coaW5kZXgsIG51bUl0ZW1zKTsKLSAgICBpZiAod2hlcmUpIHsKLSAgICAgICAgaWYgKGl0ZW0pIHsKLSAgICAgICAgICAgIF9kb19zcGxhdCh3aGVyZSwgaXRlbSwgbnVtSXRlbXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX2RvX2NvbnN0cnVjdCh3aGVyZSwgbnVtSXRlbXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB3aGVyZSA/IGluZGV4IDogKHNzaXplX3QpTk9fTUVNT1JZOwotfQotCi1zdGF0aWMgaW50IHNvcnRQcm94eShjb25zdCB2b2lkKiBsaHMsIGNvbnN0IHZvaWQqIHJocywgdm9pZCogZnVuYykKLXsKLSAgICByZXR1cm4gKCooVmVjdG9ySW1wbDo6Y29tcGFyX3QpZnVuYykobGhzLCByaHMpOwotfQotCi1zdGF0dXNfdCBWZWN0b3JJbXBsOjpzb3J0KFZlY3RvckltcGw6OmNvbXBhcl90IGNtcCkKLXsKLSAgICByZXR1cm4gc29ydChzb3J0UHJveHksICh2b2lkKiljbXApOwotfQotCi1zdGF0dXNfdCBWZWN0b3JJbXBsOjpzb3J0KFZlY3RvckltcGw6OmNvbXBhcl9yX3QgY21wLCB2b2lkKiBzdGF0ZSkKLXsKLSAgICAvLyB0aGUgc29ydCBtdXN0IGJlIHN0YWJsZS4gd2UncmUgdXNpbmcgaW5zZXJ0aW9uIHNvcnQgd2hpY2gKLSAgICAvLyBpcyB3ZWxsIHN1aXRlZCBmb3Igc21hbGwgYW5kIGFscmVhZHkgc29ydGVkIGFycmF5cwotICAgIC8vIGZvciBiaWcgYXJyYXlzLCBpdCBjb3VsZCBiZSBiZXR0ZXIgdG8gdXNlIG1lcmdlc29ydAotICAgIGNvbnN0IHNzaXplX3QgY291bnQgPSBzaXplKCk7Ci0gICAgaWYgKGNvdW50ID4gMSkgewotICAgICAgICB2b2lkKiBhcnJheSA9IGNvbnN0X2Nhc3Q8dm9pZCo+KGFycmF5SW1wbCgpKTsKLSAgICAgICAgdm9pZCogdGVtcCA9IDA7Ci0gICAgICAgIHNzaXplX3QgaSA9IDE7Ci0gICAgICAgIHdoaWxlIChpIDwgY291bnQpIHsKLSAgICAgICAgICAgIHZvaWQqIGl0ZW0gPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcnJheSkgKyBtSXRlbVNpemUqKGkpOwotICAgICAgICAgICAgdm9pZCogY3VyciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFycmF5KSArIG1JdGVtU2l6ZSooaS0xKTsKLSAgICAgICAgICAgIGlmIChjbXAoY3VyciwgaXRlbSwgc3RhdGUpID4gMCkgewotCi0gICAgICAgICAgICAgICAgaWYgKCF0ZW1wKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gbW9kaWZ5IHRoZSBhcnJheS4uLgotICAgICAgICAgICAgICAgICAgICBhcnJheSA9IGVkaXRBcnJheUltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJheSkgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IG1hbGxvYyhtSXRlbVNpemUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXRlbXApIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcnJheSkgKyBtSXRlbVNpemUqKGkpOwotICAgICAgICAgICAgICAgICAgICBjdXJyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXJyYXkpICsgbUl0ZW1TaXplKihpLTEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIF9kb19kZXN0cm95KHRlbXAsIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIF9kb19jb3B5KHRlbXAsIGl0ZW0sIDEpOwotCi0gICAgICAgICAgICAgICAgc3NpemVfdCBqID0gaS0xOwotICAgICAgICAgICAgICAgIHZvaWQqIG5leHQgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcnJheSkgKyBtSXRlbVNpemUqKGkpOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBfZG9fZGVzdHJveShuZXh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgX2RvX2NvcHkobmV4dCwgY3VyciwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIG5leHQgPSBjdXJyOwotICAgICAgICAgICAgICAgICAgICAtLWo7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcnJheSkgKyBtSXRlbVNpemUqKGopOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSB3aGlsZSAoaj49MCAmJiAoY21wKGN1cnIsIHRlbXAsIHN0YXRlKSA+IDApKTsKLQotICAgICAgICAgICAgICAgIF9kb19kZXN0cm95KG5leHQsIDEpOwotICAgICAgICAgICAgICAgIF9kb19jb3B5KG5leHQsIHRlbXAsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAodGVtcCkgewotICAgICAgICAgICAgX2RvX2Rlc3Ryb3kodGVtcCwgMSk7Ci0gICAgICAgICAgICBmcmVlKHRlbXApOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBWZWN0b3JJbXBsOjpwb3AoKQotewotICAgIGlmIChzaXplKCkpCi0gICAgICAgIHJlbW92ZUl0ZW1zQXQoc2l6ZSgpLTEsIDEpOwotfQotCi12b2lkIFZlY3RvckltcGw6OnB1c2goKQotewotICAgIHB1c2goMCk7Ci19Ci0KLXZvaWQgVmVjdG9ySW1wbDo6cHVzaChjb25zdCB2b2lkKiBpdGVtKQotewotICAgIGluc2VydEF0KGl0ZW0sIHNpemUoKSk7Ci19Ci0KLXNzaXplX3QgVmVjdG9ySW1wbDo6YWRkKCkKLXsKLSAgICByZXR1cm4gYWRkKDApOwotfQotCi1zc2l6ZV90IFZlY3RvckltcGw6OmFkZChjb25zdCB2b2lkKiBpdGVtKQotewotICAgIHJldHVybiBpbnNlcnRBdChpdGVtLCBzaXplKCkpOwotfQotCi1zc2l6ZV90IFZlY3RvckltcGw6OnJlcGxhY2VBdChzaXplX3QgaW5kZXgpCi17Ci0gICAgcmV0dXJuIHJlcGxhY2VBdCgwLCBpbmRleCk7Ci19Ci0KLXNzaXplX3QgVmVjdG9ySW1wbDo6cmVwbGFjZUF0KGNvbnN0IHZvaWQqIHByb3RvdHlwZSwgc2l6ZV90IGluZGV4KQotewotICAgIEFMT0dfQVNTRVJUKGluZGV4PHNpemUoKSwKLSAgICAgICAgIlslcF0gcmVwbGFjZTogaW5kZXg9JWQsIHNpemU9JWQiLCB0aGlzLCAoaW50KWluZGV4LCAoaW50KXNpemUoKSk7Ci0KLSAgICB2b2lkKiBpdGVtID0gZWRpdEl0ZW1Mb2NhdGlvbihpbmRleCk7Ci0gICAgaWYgKGl0ZW0gIT0gcHJvdG90eXBlKSB7Ci0gICAgICAgIGlmIChpdGVtID09IDApCi0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICBfZG9fZGVzdHJveShpdGVtLCAxKTsKLSAgICAgICAgaWYgKHByb3RvdHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICBfZG9fY29uc3RydWN0KGl0ZW0sIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX2RvX2NvcHkoaXRlbSwgcHJvdG90eXBlLCAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3NpemVfdChpbmRleCk7Ci19Ci0KLXNzaXplX3QgVmVjdG9ySW1wbDo6cmVtb3ZlSXRlbXNBdChzaXplX3QgaW5kZXgsIHNpemVfdCBjb3VudCkKLXsKLSAgICBBTE9HX0FTU0VSVCgoaW5kZXgrY291bnQpPD1zaXplKCksCi0gICAgICAgICJbJXBdIHJlbW92ZTogaW5kZXg9JWQsIGNvdW50PSVkLCBzaXplPSVkIiwKLSAgICAgICAgICAgICAgIHRoaXMsIChpbnQpaW5kZXgsIChpbnQpY291bnQsIChpbnQpc2l6ZSgpKTsKLQotICAgIGlmICgoaW5kZXgrY291bnQpID4gc2l6ZSgpKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgX3NocmluayhpbmRleCwgY291bnQpOwotICAgcmV0dXJuIGluZGV4OwotfQotCi12b2lkIFZlY3RvckltcGw6OmZpbmlzaF92ZWN0b3IoKQotewotICAgIHJlbGVhc2Vfc3RvcmFnZSgpOwotICAgIG1TdG9yYWdlID0gMDsKLSAgICBtQ291bnQgPSAwOwotfQotCi12b2lkIFZlY3RvckltcGw6OmNsZWFyKCkKLXsKLSAgICBfc2hyaW5rKDAsIG1Db3VudCk7Ci19Ci0KLXZvaWQqIFZlY3RvckltcGw6OmVkaXRJdGVtTG9jYXRpb24oc2l6ZV90IGluZGV4KQotewotICAgIEFMT0dfQVNTRVJUKGluZGV4PGNhcGFjaXR5KCksCi0gICAgICAgICJbJXBdIGVkaXRJdGVtTG9jYXRpb246IGluZGV4PSVkLCBjYXBhY2l0eT0lZCwgY291bnQ9JWQiLAotICAgICAgICB0aGlzLCAoaW50KWluZGV4LCAoaW50KWNhcGFjaXR5KCksIChpbnQpbUNvdW50KTsKLSAgICAgICAgICAgIAotICAgIHZvaWQqIGJ1ZmZlciA9IGVkaXRBcnJheUltcGwoKTsKLSAgICBpZiAoYnVmZmVyKQotICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyKSArIGluZGV4Km1JdGVtU2l6ZTsKLSAgICByZXR1cm4gMDsKLX0KLQotY29uc3Qgdm9pZCogVmVjdG9ySW1wbDo6aXRlbUxvY2F0aW9uKHNpemVfdCBpbmRleCkgY29uc3QKLXsKLSAgICBBTE9HX0FTU0VSVChpbmRleDxjYXBhY2l0eSgpLAotICAgICAgICAiWyVwXSBpdGVtTG9jYXRpb246IGluZGV4PSVkLCBjYXBhY2l0eT0lZCwgY291bnQ9JWQiLAotICAgICAgICB0aGlzLCAoaW50KWluZGV4LCAoaW50KWNhcGFjaXR5KCksIChpbnQpbUNvdW50KTsKLQotICAgIGNvbnN0ICB2b2lkKiBidWZmZXIgPSBhcnJheUltcGwoKTsKLSAgICBpZiAoYnVmZmVyKQotICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyKSArIGluZGV4Km1JdGVtU2l6ZTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3NpemVfdCBWZWN0b3JJbXBsOjpzZXRDYXBhY2l0eShzaXplX3QgbmV3X2NhcGFjaXR5KQotewotICAgIHNpemVfdCBjdXJyZW50X2NhcGFjaXR5ID0gY2FwYWNpdHkoKTsKLSAgICBzc2l6ZV90IGFtb3VudCA9IG5ld19jYXBhY2l0eSAtIHNpemUoKTsKLSAgICBpZiAoYW1vdW50IDw9IDApIHsKLSAgICAgICAgLy8gd2UgY2FuJ3QgcmVkdWNlIHRoZSBjYXBhY2l0eQotICAgICAgICByZXR1cm4gY3VycmVudF9jYXBhY2l0eTsKLSAgICB9IAotICAgIFNoYXJlZEJ1ZmZlciogc2IgPSBTaGFyZWRCdWZmZXI6OmFsbG9jKG5ld19jYXBhY2l0eSAqIG1JdGVtU2l6ZSk7Ci0gICAgaWYgKHNiKSB7Ci0gICAgICAgIHZvaWQqIGFycmF5ID0gc2ItPmRhdGEoKTsKLSAgICAgICAgX2RvX2NvcHkoYXJyYXksIG1TdG9yYWdlLCBzaXplKCkpOwotICAgICAgICByZWxlYXNlX3N0b3JhZ2UoKTsKLSAgICAgICAgbVN0b3JhZ2UgPSBjb25zdF9jYXN0PHZvaWQqPihhcnJheSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld19jYXBhY2l0eTsKLX0KLQotdm9pZCBWZWN0b3JJbXBsOjpyZWxlYXNlX3N0b3JhZ2UoKQotewotICAgIGlmIChtU3RvcmFnZSkgewotICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXIqIHNiID0gU2hhcmVkQnVmZmVyOjpzaGFyZWRCdWZmZXIobVN0b3JhZ2UpOwotICAgICAgICBpZiAoc2ItPnJlbGVhc2UoU2hhcmVkQnVmZmVyOjplS2VlcFN0b3JhZ2UpID09IDEpIHsKLSAgICAgICAgICAgIF9kb19kZXN0cm95KG1TdG9yYWdlLCBtQ291bnQpOwotICAgICAgICAgICAgU2hhcmVkQnVmZmVyOjpkZWFsbG9jKHNiKTsKLSAgICAgICAgfSAKLSAgICB9Ci19Ci0KLXZvaWQqIFZlY3RvckltcGw6Ol9ncm93KHNpemVfdCB3aGVyZSwgc2l6ZV90IGFtb3VudCkKLXsKLS8vICAgIEFMT0dWKCJfZ3Jvdyh0aGlzPSVwLCB3aGVyZT0lZCwgYW1vdW50PSVkKSBjb3VudD0lZCwgY2FwYWNpdHk9JWQiLAotLy8gICAgICAgIHRoaXMsIChpbnQpd2hlcmUsIChpbnQpYW1vdW50LCAoaW50KW1Db3VudCwgKGludCljYXBhY2l0eSgpKTsKLQotICAgIEFMT0dfQVNTRVJUKHdoZXJlIDw9IG1Db3VudCwKLSAgICAgICAgICAgICJbJXBdIF9ncm93OiB3aGVyZT0lZCwgYW1vdW50PSVkLCBjb3VudD0lZCIsCi0gICAgICAgICAgICB0aGlzLCAoaW50KXdoZXJlLCAoaW50KWFtb3VudCwgKGludCltQ291bnQpOyAvLyBjYWxsZXIgYWxyZWFkeSBjaGVja2VkCi0KLSAgICBjb25zdCBzaXplX3QgbmV3X3NpemUgPSBtQ291bnQgKyBhbW91bnQ7Ci0gICAgaWYgKGNhcGFjaXR5KCkgPCBuZXdfc2l6ZSkgewotICAgICAgICBjb25zdCBzaXplX3QgbmV3X2NhcGFjaXR5ID0gbWF4KGtNaW5WZWN0b3JDYXBhY2l0eSwgKChuZXdfc2l6ZSozKSsxKS8yKTsKLS8vICAgICAgICBBTE9HVigiZ3JvdyB2ZWN0b3IgJXAsIG5ld19jYXBhY2l0eT0lZCIsIHRoaXMsIChpbnQpbmV3X2NhcGFjaXR5KTsKLSAgICAgICAgaWYgKChtU3RvcmFnZSkgJiYKLSAgICAgICAgICAgIChtQ291bnQ9PXdoZXJlKSAmJgotICAgICAgICAgICAgKG1GbGFncyAmIEhBU19UUklWSUFMX0NPUFkpICYmCi0gICAgICAgICAgICAobUZsYWdzICYgSEFTX1RSSVZJQUxfRFRPUikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciogY3VyX3NiID0gU2hhcmVkQnVmZmVyOjpzaGFyZWRCdWZmZXIobVN0b3JhZ2UpOwotICAgICAgICAgICAgU2hhcmVkQnVmZmVyKiBzYiA9IGN1cl9zYi0+ZWRpdFJlc2l6ZShuZXdfY2FwYWNpdHkgKiBtSXRlbVNpemUpOwotICAgICAgICAgICAgbVN0b3JhZ2UgPSBzYi0+ZGF0YSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU2hhcmVkQnVmZmVyKiBzYiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2MobmV3X2NhcGFjaXR5ICogbUl0ZW1TaXplKTsKLSAgICAgICAgICAgIGlmIChzYikgewotICAgICAgICAgICAgICAgIHZvaWQqIGFycmF5ID0gc2ItPmRhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAod2hlcmUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBfZG9fY29weShhcnJheSwgbVN0b3JhZ2UsIHdoZXJlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHdoZXJlICE9IG1Db3VudCkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBmcm9tID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KG1TdG9yYWdlKSArIHdoZXJlKm1JdGVtU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPihhcnJheSkgKyAod2hlcmUrYW1vdW50KSptSXRlbVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIF9kb19jb3B5KGRlc3QsIGZyb20sIG1Db3VudC13aGVyZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbGVhc2Vfc3RvcmFnZSgpOwotICAgICAgICAgICAgICAgIG1TdG9yYWdlID0gY29uc3RfY2FzdDx2b2lkKj4oYXJyYXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHdoZXJlICE9IG1Db3VudCkgewotICAgICAgICAgICAgdm9pZCogYXJyYXkgPSBlZGl0QXJyYXlJbXBsKCk7Ci0gICAgICAgICAgICBjb25zdCB2b2lkKiBmcm9tID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KGFycmF5KSArIHdoZXJlKm1JdGVtU2l6ZTsKLSAgICAgICAgICAgIHZvaWQqIHRvID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KGFycmF5KSArICh3aGVyZSthbW91bnQpKm1JdGVtU2l6ZTsKLSAgICAgICAgICAgIF9kb19tb3ZlX2ZvcndhcmQodG8sIGZyb20sIG1Db3VudCAtIHdoZXJlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtQ291bnQgPSBuZXdfc2l6ZTsKLSAgICB2b2lkKiBmcmVlX3NwYWNlID0gY29uc3RfY2FzdDx2b2lkKj4oaXRlbUxvY2F0aW9uKHdoZXJlKSk7Ci0gICAgcmV0dXJuIGZyZWVfc3BhY2U7Ci19Ci0KLXZvaWQgVmVjdG9ySW1wbDo6X3NocmluayhzaXplX3Qgd2hlcmUsIHNpemVfdCBhbW91bnQpCi17Ci0gICAgaWYgKCFtU3RvcmFnZSkKLSAgICAgICAgcmV0dXJuOwotCi0vLyAgICBBTE9HVigiX3Nocmluayh0aGlzPSVwLCB3aGVyZT0lZCwgYW1vdW50PSVkKSBjb3VudD0lZCwgY2FwYWNpdHk9JWQiLAotLy8gICAgICAgIHRoaXMsIChpbnQpd2hlcmUsIChpbnQpYW1vdW50LCAoaW50KW1Db3VudCwgKGludCljYXBhY2l0eSgpKTsKLQotICAgIEFMT0dfQVNTRVJUKHdoZXJlICsgYW1vdW50IDw9IG1Db3VudCwKLSAgICAgICAgICAgICJbJXBdIF9zaHJpbms6IHdoZXJlPSVkLCBhbW91bnQ9JWQsIGNvdW50PSVkIiwKLSAgICAgICAgICAgIHRoaXMsIChpbnQpd2hlcmUsIChpbnQpYW1vdW50LCAoaW50KW1Db3VudCk7IC8vIGNhbGxlciBhbHJlYWR5IGNoZWNrZWQKLQotICAgIGNvbnN0IHNpemVfdCBuZXdfc2l6ZSA9IG1Db3VudCAtIGFtb3VudDsKLSAgICBpZiAobmV3X3NpemUqMyA8IGNhcGFjaXR5KCkpIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90IG5ld19jYXBhY2l0eSA9IG1heChrTWluVmVjdG9yQ2FwYWNpdHksIG5ld19zaXplKjIpOwotLy8gICAgICAgIEFMT0dWKCJzaHJpbmsgdmVjdG9yICVwLCBuZXdfY2FwYWNpdHk9JWQiLCB0aGlzLCAoaW50KW5ld19jYXBhY2l0eSk7Ci0gICAgICAgIGlmICgod2hlcmUgPT0gbmV3X3NpemUpICYmCi0gICAgICAgICAgICAobUZsYWdzICYgSEFTX1RSSVZJQUxfQ09QWSkgJiYKLSAgICAgICAgICAgIChtRmxhZ3MgJiBIQVNfVFJJVklBTF9EVE9SKSkKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyKiBjdXJfc2IgPSBTaGFyZWRCdWZmZXI6OnNoYXJlZEJ1ZmZlcihtU3RvcmFnZSk7Ci0gICAgICAgICAgICBTaGFyZWRCdWZmZXIqIHNiID0gY3VyX3NiLT5lZGl0UmVzaXplKG5ld19jYXBhY2l0eSAqIG1JdGVtU2l6ZSk7Ci0gICAgICAgICAgICBtU3RvcmFnZSA9IHNiLT5kYXRhKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTaGFyZWRCdWZmZXIqIHNiID0gU2hhcmVkQnVmZmVyOjphbGxvYyhuZXdfY2FwYWNpdHkgKiBtSXRlbVNpemUpOwotICAgICAgICAgICAgaWYgKHNiKSB7Ci0gICAgICAgICAgICAgICAgdm9pZCogYXJyYXkgPSBzYi0+ZGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICh3aGVyZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9kb19jb3B5KGFycmF5LCBtU3RvcmFnZSwgd2hlcmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAod2hlcmUgIT0gbmV3X3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZnJvbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihtU3RvcmFnZSkgKyAod2hlcmUrYW1vdW50KSptSXRlbVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQqIGRlc3QgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oYXJyYXkpICsgd2hlcmUqbUl0ZW1TaXplOwotICAgICAgICAgICAgICAgICAgICBfZG9fY29weShkZXN0LCBmcm9tLCBuZXdfc2l6ZSAtIHdoZXJlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVsZWFzZV9zdG9yYWdlKCk7Ci0gICAgICAgICAgICAgICAgbVN0b3JhZ2UgPSBjb25zdF9jYXN0PHZvaWQqPihhcnJheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB2b2lkKiBhcnJheSA9IGVkaXRBcnJheUltcGwoKTsKLSAgICAgICAgdm9pZCogdG8gPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oYXJyYXkpICsgd2hlcmUqbUl0ZW1TaXplOwotICAgICAgICBfZG9fZGVzdHJveSh0bywgYW1vdW50KTsKLSAgICAgICAgaWYgKHdoZXJlICE9IG5ld19zaXplKSB7Ci0gICAgICAgICAgICBjb25zdCB2b2lkKiBmcm9tID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KGFycmF5KSArICh3aGVyZSthbW91bnQpKm1JdGVtU2l6ZTsKLSAgICAgICAgICAgIF9kb19tb3ZlX2JhY2t3YXJkKHRvLCBmcm9tLCBuZXdfc2l6ZSAtIHdoZXJlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtQ291bnQgPSBuZXdfc2l6ZTsKLX0KLQotc2l6ZV90IFZlY3RvckltcGw6Oml0ZW1TaXplKCkgY29uc3QgewotICAgIHJldHVybiBtSXRlbVNpemU7Ci19Ci0KLXZvaWQgVmVjdG9ySW1wbDo6X2RvX2NvbnN0cnVjdCh2b2lkKiBzdG9yYWdlLCBzaXplX3QgbnVtKSBjb25zdAotewotICAgIGlmICghKG1GbGFncyAmIEhBU19UUklWSUFMX0NUT1IpKSB7Ci0gICAgICAgIGRvX2NvbnN0cnVjdChzdG9yYWdlLCBudW0pOwotICAgIH0KLX0KLQotdm9pZCBWZWN0b3JJbXBsOjpfZG9fZGVzdHJveSh2b2lkKiBzdG9yYWdlLCBzaXplX3QgbnVtKSBjb25zdAotewotICAgIGlmICghKG1GbGFncyAmIEhBU19UUklWSUFMX0RUT1IpKSB7Ci0gICAgICAgIGRvX2Rlc3Ryb3koc3RvcmFnZSwgbnVtKTsKLSAgICB9Ci19Ci0KLXZvaWQgVmVjdG9ySW1wbDo6X2RvX2NvcHkodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3QKLXsKLSAgICBpZiAoIShtRmxhZ3MgJiBIQVNfVFJJVklBTF9DT1BZKSkgewotICAgICAgICBkb19jb3B5KGRlc3QsIGZyb20sIG51bSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWVtY3B5KGRlc3QsIGZyb20sIG51bSppdGVtU2l6ZSgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgVmVjdG9ySW1wbDo6X2RvX3NwbGF0KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGl0ZW0sIHNpemVfdCBudW0pIGNvbnN0IHsKLSAgICBkb19zcGxhdChkZXN0LCBpdGVtLCBudW0pOwotfQotCi12b2lkIFZlY3RvckltcGw6Ol9kb19tb3ZlX2ZvcndhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIGRvX21vdmVfZm9yd2FyZChkZXN0LCBmcm9tLCBudW0pOwotfQotCi12b2lkIFZlY3RvckltcGw6Ol9kb19tb3ZlX2JhY2t3YXJkKHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGZyb20sIHNpemVfdCBudW0pIGNvbnN0IHsKLSAgICBkb19tb3ZlX2JhY2t3YXJkKGRlc3QsIGZyb20sIG51bSk7Ci19Ci0KLXZvaWQgVmVjdG9ySW1wbDo6cmVzZXJ2ZWRWZWN0b3JJbXBsMSgpIHsgfQotdm9pZCBWZWN0b3JJbXBsOjpyZXNlcnZlZFZlY3RvckltcGwyKCkgeyB9Ci12b2lkIFZlY3RvckltcGw6OnJlc2VydmVkVmVjdG9ySW1wbDMoKSB7IH0KLXZvaWQgVmVjdG9ySW1wbDo6cmVzZXJ2ZWRWZWN0b3JJbXBsNCgpIHsgfQotdm9pZCBWZWN0b3JJbXBsOjpyZXNlcnZlZFZlY3RvckltcGw1KCkgeyB9Ci12b2lkIFZlY3RvckltcGw6OnJlc2VydmVkVmVjdG9ySW1wbDYoKSB7IH0KLXZvaWQgVmVjdG9ySW1wbDo6cmVzZXJ2ZWRWZWN0b3JJbXBsNygpIHsgfQotdm9pZCBWZWN0b3JJbXBsOjpyZXNlcnZlZFZlY3RvckltcGw4KCkgeyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU29ydGVkVmVjdG9ySW1wbDo6U29ydGVkVmVjdG9ySW1wbChzaXplX3QgaXRlbVNpemUsIHVpbnQzMl90IGZsYWdzKQotICAgIDogVmVjdG9ySW1wbChpdGVtU2l6ZSwgZmxhZ3MpCi17Ci19Ci0KLVNvcnRlZFZlY3RvckltcGw6OlNvcnRlZFZlY3RvckltcGwoY29uc3QgVmVjdG9ySW1wbCYgcmhzKQotOiBWZWN0b3JJbXBsKHJocykKLXsKLX0KLQotU29ydGVkVmVjdG9ySW1wbDo6flNvcnRlZFZlY3RvckltcGwoKQotewotfQotCi1Tb3J0ZWRWZWN0b3JJbXBsJiBTb3J0ZWRWZWN0b3JJbXBsOjpvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3JJbXBsJiByaHMpCi17Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFNvcnRlZFZlY3RvckltcGwmPiggVmVjdG9ySW1wbDo6b3BlcmF0b3IgPSAoc3RhdGljX2Nhc3Q8Y29uc3QgVmVjdG9ySW1wbCY+KHJocykpICk7Ci19Ci0KLXNzaXplX3QgU29ydGVkVmVjdG9ySW1wbDo6aW5kZXhPZihjb25zdCB2b2lkKiBpdGVtKSBjb25zdAotewotICAgIHJldHVybiBfaW5kZXhPcmRlck9mKGl0ZW0pOwotfQotCi1zaXplX3QgU29ydGVkVmVjdG9ySW1wbDo6b3JkZXJPZihjb25zdCB2b2lkKiBpdGVtKSBjb25zdAotewotICAgIHNpemVfdCBvOwotICAgIF9pbmRleE9yZGVyT2YoaXRlbSwgJm8pOwotICAgIHJldHVybiBvOwotfQotCi1zc2l6ZV90IFNvcnRlZFZlY3RvckltcGw6Ol9pbmRleE9yZGVyT2YoY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90KiBvcmRlcikgY29uc3QKLXsKLSAgICAvLyBiaW5hcnkgc2VhcmNoCi0gICAgc3NpemVfdCBlcnIgPSBOQU1FX05PVF9GT1VORDsKLSAgICBzc2l6ZV90IGwgPSAwOwotICAgIHNzaXplX3QgaCA9IHNpemUoKS0xOwotICAgIHNzaXplX3QgbWlkOwotICAgIGNvbnN0IHZvaWQqIGEgPSBhcnJheUltcGwoKTsKLSAgICBjb25zdCBzaXplX3QgcyA9IGl0ZW1TaXplKCk7Ci0gICAgd2hpbGUgKGwgPD0gaCkgewotICAgICAgICBtaWQgPSBsICsgKGggLSBsKS8yOwotICAgICAgICBjb25zdCB2b2lkKiBjb25zdCBjdXJyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KGEpICsgKG1pZCpzKTsKLSAgICAgICAgY29uc3QgaW50IGMgPSBkb19jb21wYXJlKGN1cnIsIGl0ZW0pOwotICAgICAgICBpZiAoYyA9PSAwKSB7Ci0gICAgICAgICAgICBlcnIgPSBsID0gbWlkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA8IDApIHsKLSAgICAgICAgICAgIGwgPSBtaWQgKyAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaCA9IG1pZCAtIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG9yZGVyKSAqb3JkZXIgPSBsOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXNzaXplX3QgU29ydGVkVmVjdG9ySW1wbDo6YWRkKGNvbnN0IHZvaWQqIGl0ZW0pCi17Ci0gICAgc2l6ZV90IG9yZGVyOwotICAgIHNzaXplX3QgaW5kZXggPSBfaW5kZXhPcmRlck9mKGl0ZW0sICZvcmRlcik7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBpbmRleCA9IFZlY3RvckltcGw6Omluc2VydEF0KGl0ZW0sIG9yZGVyLCAxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbmRleCA9IFZlY3RvckltcGw6OnJlcGxhY2VBdChpdGVtLCBpbmRleCk7Ci0gICAgfQotICAgIHJldHVybiBpbmRleDsKLX0KLQotc3NpemVfdCBTb3J0ZWRWZWN0b3JJbXBsOjptZXJnZShjb25zdCBWZWN0b3JJbXBsJiB2ZWN0b3IpCi17Ci0gICAgLy8gbmFpdmUgbWVyZ2UuLi4KLSAgICBpZiAoIXZlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyID0gdmVjdG9yLmFycmF5SW1wbCgpOwotICAgICAgICBjb25zdCBzaXplX3QgaXMgPSBpdGVtU2l6ZSgpOwotICAgICAgICBzaXplX3QgcyA9IHZlY3Rvci5zaXplKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8cyA7IGkrKykgewotICAgICAgICAgICAgc3NpemVfdCBlcnIgPSBhZGQoIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlcikgKyBpKmlzICk7Ci0gICAgICAgICAgICBpZiAoZXJyPDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3NpemVfdCBTb3J0ZWRWZWN0b3JJbXBsOjptZXJnZShjb25zdCBTb3J0ZWRWZWN0b3JJbXBsJiB2ZWN0b3IpCi17Ci0gICAgLy8gd2UndmUgbWVyZ2luZyBhIHNvcnRlZCB2ZWN0b3IuLi4gbmljZSEKLSAgICBzc2l6ZV90IGVyciA9IE5PX0VSUk9SOwotICAgIGlmICghdmVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBmaXJzdCB0YWtlIGNhcmUgb2YgdGhlIGNhc2Ugd2hlcmUgdGhlIHZlY3RvcnMgYXJlIHNvcnRlZCB0b2dldGhlcgotICAgICAgICBpZiAoZG9fY29tcGFyZSh2ZWN0b3IuaXRlbUxvY2F0aW9uKHZlY3Rvci5zaXplKCktMSksIGFycmF5SW1wbCgpKSA8PSAwKSB7Ci0gICAgICAgICAgICBlcnIgPSBWZWN0b3JJbXBsOjppbnNlcnRWZWN0b3JBdChzdGF0aWNfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4odmVjdG9yKSwgMCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZG9fY29tcGFyZSh2ZWN0b3IuYXJyYXlJbXBsKCksIGl0ZW1Mb2NhdGlvbihzaXplKCktMSkpID49IDApIHsKLSAgICAgICAgICAgIGVyciA9IFZlY3RvckltcGw6OmFwcGVuZFZlY3RvcihzdGF0aWNfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4odmVjdG9yKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIG1hZGUgYSBsaXR0bGUgYmV0dGVyCi0gICAgICAgICAgICBlcnIgPSBtZXJnZShzdGF0aWNfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4odmVjdG9yKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3NpemVfdCBTb3J0ZWRWZWN0b3JJbXBsOjpyZW1vdmUoY29uc3Qgdm9pZCogaXRlbSkKLXsKLSAgICBzc2l6ZV90IGkgPSBpbmRleE9mKGl0ZW0pOwotICAgIGlmIChpPj0wKSB7Ci0gICAgICAgIFZlY3RvckltcGw6OnJlbW92ZUl0ZW1zQXQoaSwgMSk7Ci0gICAgfQotICAgIHJldHVybiBpOwotfQotCi12b2lkIFNvcnRlZFZlY3RvckltcGw6OnJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDEoKSB7IH07Ci12b2lkIFNvcnRlZFZlY3RvckltcGw6OnJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDIoKSB7IH07Ci12b2lkIFNvcnRlZFZlY3RvckltcGw6OnJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDMoKSB7IH07Ci12b2lkIFNvcnRlZFZlY3RvckltcGw6OnJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDQoKSB7IH07Ci12b2lkIFNvcnRlZFZlY3RvckltcGw6OnJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDUoKSB7IH07Ci12b2lkIFNvcnRlZFZlY3RvckltcGw6OnJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDYoKSB7IH07Ci12b2lkIFNvcnRlZFZlY3RvckltcGw6OnJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDcoKSB7IH07Ci12b2lkIFNvcnRlZFZlY3RvckltcGw6OnJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDgoKSB7IH07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL21pc2MuY3BwIGIvbGlicy91dGlscy9taXNjLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4OWQxNS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL21pc2MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gTWlzY2VsbGFuZW91cyB1dGlsaXR5IGZ1bmN0aW9ucy4KLS8vCi0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qCi0gKiBMaWtlIHN0cmR1cCgpLCBidXQgdXNlcyBDKysgIm5ldyIgb3BlcmF0b3IgaW5zdGVhZCBvZiBtYWxsb2MuCi0gKi8KLWNoYXIqIHN0cmR1cE5ldyhjb25zdCBjaGFyKiBzdHIpCi17Ci0gICAgY2hhciogbmV3U3RyOwotICAgIGludCBsZW47Ci0KLSAgICBpZiAoc3RyID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgbGVuID0gc3RybGVuKHN0cik7Ci0gICAgbmV3U3RyID0gbmV3IGNoYXJbbGVuKzFdOwotICAgIG1lbWNweShuZXdTdHIsIHN0ciwgbGVuKzEpOwotCi0gICAgcmV0dXJuIG5ld1N0cjsKLX0KLQotLyoKLSAqIENvbmNhdGVuYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4KLSAqLwotY2hhciogY29uY2F0QXJndihpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdKQotewotICAgIGNoYXIqIG5ld1N0ciA9IE5VTEw7Ci0gICAgaW50IGxlbiwgdG90YWxMZW4sIHBvc24sIGlkeDsKLQotICAgIC8qCi0gICAgICogRmlyc3QsIGZpZ3VyZSBvdXQgdGhlIHRvdGFsIGxlbmd0aC4KLSAgICAgKi8KLSAgICB0b3RhbExlbiA9IGlkeCA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKGlkeCA9PSBhcmdjIHx8IGFyZ3ZbaWR4XSA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChpZHgpCi0gICAgICAgICAgICB0b3RhbExlbisrOyAgLy8gbGVhdmUgYSBzcGFjZSBiZXR3ZWVuIGFyZ3MKLSAgICAgICAgdG90YWxMZW4gKz0gc3RybGVuKGFyZ3ZbaWR4XSk7Ci0gICAgICAgIGlkeCsrOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQWxsb2MgdGhlIHN0cmluZy4KLSAgICAgKi8KLSAgICBuZXdTdHIgPSBuZXcgY2hhclt0b3RhbExlbiArMV07Ci0gICAgaWYgKG5ld1N0ciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qCi0gICAgICogRmluYWxseSwgYWxsb2NhdGUgdGhlIHN0cmluZyBhbmQgY29weSBkYXRhIG92ZXIuCi0gICAgICovCi0gICAgaWR4ID0gcG9zbiA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKGlkeCA9PSBhcmdjIHx8IGFyZ3ZbaWR4XSA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChpZHgpCi0gICAgICAgICAgICBuZXdTdHJbcG9zbisrXSA9ICcgJzsKLQotICAgICAgICBsZW4gPSBzdHJsZW4oYXJndltpZHhdKTsKLSAgICAgICAgbWVtY3B5KCZuZXdTdHJbcG9zbl0sIGFyZ3ZbaWR4XSwgbGVuKTsKLSAgICAgICAgcG9zbiArPSBsZW47Ci0KLSAgICAgICAgaWR4Kys7Ci0gICAgfQotCi0gICAgYXNzZXJ0KHBvc24gPT0gdG90YWxMZW4pOwotICAgIG5ld1N0cltwb3NuXSA9ICdcMCc7Ci0KLSAgICByZXR1cm4gbmV3U3RyOwotfQotCi0vKgotICogQ291bnQgdGhlICNvZiBhcmdzIGluIGFuIGFyZ3VtZW50IHZlY3Rvci4gIERvbid0IGNvdW50IHRoZSBmaW5hbCBOVUxMLgotICovCi1pbnQgY291bnRBcmd2KGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSkKLXsKLSAgICBpbnQgY291bnQgPSAwOwotCi0gICAgd2hpbGUgKGFyZ3ZbY291bnRdICE9IE5VTEwpCi0gICAgICAgIGNvdW50Kys7Ci0KLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0vKgotICogR2V0IGEgZmlsZSdzIHR5cGUuCi0gKi8KLUZpbGVUeXBlIGdldEZpbGVUeXBlKGNvbnN0IGNoYXIqIGZpbGVOYW1lKQotewotICAgIHN0cnVjdCBzdGF0IHNiOwotCi0gICAgaWYgKHN0YXQoZmlsZU5hbWUsICZzYikgPCAwKSB7Ci0gICAgICAgIGlmIChlcnJubyA9PSBFTk9FTlQgfHwgZXJybm8gPT0gRU5PVERJUikKLSAgICAgICAgICAgIHJldHVybiBrRmlsZVR5cGVOb25leGlzdGVudDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdldEZpbGVUeXBlIGdvdCBlcnJubz0lZCBvbiAnJXMnXG4iLAotICAgICAgICAgICAgICAgIGVycm5vLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4ga0ZpbGVUeXBlVW5rbm93bjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChTX0lTUkVHKHNiLnN0X21vZGUpKQotICAgICAgICAgICAgcmV0dXJuIGtGaWxlVHlwZVJlZ3VsYXI7Ci0gICAgICAgIGVsc2UgaWYgKFNfSVNESVIoc2Iuc3RfbW9kZSkpCi0gICAgICAgICAgICByZXR1cm4ga0ZpbGVUeXBlRGlyZWN0b3J5OwotICAgICAgICBlbHNlIGlmIChTX0lTQ0hSKHNiLnN0X21vZGUpKQotICAgICAgICAgICAgcmV0dXJuIGtGaWxlVHlwZUNoYXJEZXY7Ci0gICAgICAgIGVsc2UgaWYgKFNfSVNCTEsoc2Iuc3RfbW9kZSkpCi0gICAgICAgICAgICByZXR1cm4ga0ZpbGVUeXBlQmxvY2tEZXY7Ci0gICAgICAgIGVsc2UgaWYgKFNfSVNGSUZPKHNiLnN0X21vZGUpKQotICAgICAgICAgICAgcmV0dXJuIGtGaWxlVHlwZUZpZm87Ci0jaWZkZWYgSEFWRV9TWU1MSU5LUyAgICAgICAgICAgIAotICAgICAgICBlbHNlIGlmIChTX0lTTE5LKHNiLnN0X21vZGUpKQotICAgICAgICAgICAgcmV0dXJuIGtGaWxlVHlwZVN5bWxpbms7Ci0gICAgICAgIGVsc2UgaWYgKFNfSVNTT0NLKHNiLnN0X21vZGUpKQotICAgICAgICAgICAgcmV0dXJuIGtGaWxlVHlwZVNvY2tldDsKLSNlbmRpZiAgICAgICAgICAgIAotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4ga0ZpbGVUeXBlVW5rbm93bjsKLSAgICB9Ci19Ci0KLS8qCi0gKiBHZXQgYSBmaWxlJ3MgbW9kaWZpY2F0aW9uIGRhdGUuCi0gKi8KLXRpbWVfdCBnZXRGaWxlTW9kRGF0ZShjb25zdCBjaGFyKiBmaWxlTmFtZSkKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzYjsKLQotICAgIGlmIChzdGF0KGZpbGVOYW1lLCAmc2IpIDwgMCkKLSAgICAgICAgcmV0dXJuICh0aW1lX3QpIC0xOwotCi0gICAgcmV0dXJuIHNiLnN0X210aW1lOwotfQotCi0vKgotICogUm91bmQgdXAgdG8gdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyLgotICoKLSAqIEZvdW5kIG9uIGh0dHA6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvfnNlYW5kZXIvYml0aGFja3MuaHRtbC4KLSAqLwotdW5zaWduZWQgaW50IHJvdW5kVXBQb3dlcjIodW5zaWduZWQgaW50IHZhbCkKLXsKLSAgICB2YWwtLTsKLSAgICB2YWwgfD0gdmFsID4+IDE7Ci0gICAgdmFsIHw9IHZhbCA+PiAyOwotICAgIHZhbCB8PSB2YWwgPj4gNDsKLSAgICB2YWwgfD0gdmFsID4+IDg7Ci0gICAgdmFsIHw9IHZhbCA+PiAxNjsKLSAgICB2YWwrKzsKLQotICAgIHJldHVybiB2YWw7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvcHJpbWVzLnB5IGIvbGlicy91dGlscy9wcmltZXMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxNjFkZDguLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9wcmltZXMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24yLjYKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMKLSMgR2VuZXJhdGVzIGEgdGFibGUgb2YgcHJpbWUgbnVtYmVycyBmb3IgdXNlIGluIEJhc2ljSGFzaHRhYmxlLmNwcC4KLSMKLSMgRWFjaCBwcmltZSBpcyBjaG9zZW4gc3VjaCB0aGF0IGl0IGlzIGEgbGl0dGxlIG1vcmUgdGhhbiB0d2ljZSBhcyBsYXJnZSBhcwotIyB0aGUgcHJldmlvdXMgcHJpbWUgaW4gdGhlIHRhYmxlLiAgVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gY2hvb3NlIGEgbmV3Ci0jIGhhc2h0YWJsZSBzaXplIHdoZW4gdGhlIHVuZGVybHlpbmcgYXJyYXkgaXMgZ3Jvd24gYnkgYXMgbm9taW5hbCBmYWN0b3IKLSMgb2YgdHdvIGVhY2ggdGltZS4KLSMKLQotZGVmIGlzX29kZF9wcmltZShuKToKLSAgbGltaXQgPSAobiAtIDEpIC8gMgotICBkID0gMwotICB3aGlsZSBkIDw9IGxpbWl0OgotICAgIGlmIG4gJSBkID09IDA6Ci0gICAgICByZXR1cm4gRmFsc2UKLSAgICBkICs9IDIKLSAgcmV0dXJuIFRydWUKLQotcHJpbnQgInN0YXRpYyBzaXplX3QgUFJJTUVTW10gPSB7IgotCi1uID0gNQotbWF4ID0gMioqMzEgLSAxCi13aGlsZSBuIDwgbWF4OgotICBwcmludCAiICAgICVkLCIgJSAobikKLSAgbiA9IG4gKiAyICsgMQotICB3aGlsZSBub3QgaXNfb2RkX3ByaW1lKG4pOgotICAgIG4gKz0gMgotCi1wcmludCAiICAgIDAsIgotcHJpbnQgIn07IgpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy90ZXN0cy9BbmRyb2lkLm1rIGIvbGlicy91dGlscy90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjgxMWZjLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMgQnVpbGQgdGhlIHVuaXQgdGVzdHMuCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KLXRlc3Rfc3JjX2ZpbGVzIDo9IFwKLQlCYXNpY0hhc2h0YWJsZV90ZXN0LmNwcCBcCi0JQmxvYkNhY2hlX3Rlc3QuY3BwIFwKLQlMb29wZXJfdGVzdC5jcHAgXAotCVN0cmluZzhfdGVzdC5jcHAgXAotCVVuaWNvZGVfdGVzdC5jcHAgXAotCi1zaGFyZWRfbGlicmFyaWVzIDo9IFwKLQlsaWJ6IFwKLQlsaWJsb2cgXAotCWxpYmN1dGlscyBcCi0JbGlidXRpbHMgXAotCWxpYnN0bHBvcnQKLQotc3RhdGljX2xpYnJhcmllcyA6PSBcCi0JbGliZ3Rlc3QgXAotCWxpYmd0ZXN0X21haW4KLQotY19pbmNsdWRlcyA6PSBcCi0gICAgZXh0ZXJuYWwvemxpYiBcCi0gICAgZXh0ZXJuYWwvaWN1NGMvY29tbW9uIFwKLSAgICBiaW9uaWMgXAotICAgIGJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCi0gICAgZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCi0gICAgZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0Ci0KLW1vZHVsZV90YWdzIDo9IGVuZyB0ZXN0cwotCi0kKGZvcmVhY2ggZmlsZSwkKHRlc3Rfc3JjX2ZpbGVzKSwgXAotICAgICQoZXZhbCBpbmNsdWRlICQoQ0xFQVJfVkFSUykpIFwKLSAgICAkKGV2YWwgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAkKHNoYXJlZF9saWJyYXJpZXMpKSBcCi0gICAgJChldmFsIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gJChzdGF0aWNfbGlicmFyaWVzKSkgXAotICAgICQoZXZhbCBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoY19pbmNsdWRlcykpIFwKLSAgICAkKGV2YWwgTE9DQUxfU1JDX0ZJTEVTIDo9ICQoZmlsZSkpIFwKLSAgICAkKGV2YWwgTE9DQUxfTU9EVUxFIDo9ICQobm90ZGlyICQoZmlsZTolLmNwcD0lKSkpIFwKLSAgICAkKGV2YWwgTE9DQUxfTU9EVUxFX1RBR1MgOj0gJChtb2R1bGVfdGFncykpIFwKLSAgICAkKGV2YWwgaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpKSBcCi0pCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL3Rlc3RzL0Jhc2ljSGFzaHRhYmxlX3Rlc3QuY3BwIGIvbGlicy91dGlscy90ZXN0cy9CYXNpY0hhc2h0YWJsZV90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjZjc1MC4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL3Rlc3RzL0Jhc2ljSGFzaHRhYmxlX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkJhc2ljSGFzaHRhYmxlX3Rlc3QiCi0KLSNpbmNsdWRlIDx1dGlscy9CYXNpY0hhc2h0YWJsZS5oPgotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXR5cGVkZWYgaW50IFNpbXBsZUtleTsKLXR5cGVkZWYgaW50IFNpbXBsZVZhbHVlOwotdHlwZWRlZiBrZXlfdmFsdWVfcGFpcl90PFNpbXBsZUtleSwgU2ltcGxlVmFsdWU+IFNpbXBsZUVudHJ5OwotdHlwZWRlZiBCYXNpY0hhc2h0YWJsZTxTaW1wbGVLZXksIFNpbXBsZUVudHJ5PiBTaW1wbGVIYXNodGFibGU7Ci0KLXN0cnVjdCBDb21wbGV4S2V5IHsKLSAgICBpbnQgazsKLQotICAgIGV4cGxpY2l0IENvbXBsZXhLZXkoaW50IGspIDogayhrKSB7Ci0gICAgICAgIGluc3RhbmNlQ291bnQgKz0gMTsKLSAgICB9Ci0KLSAgICBDb21wbGV4S2V5KGNvbnN0IENvbXBsZXhLZXkmIG90aGVyKSA6IGsob3RoZXIuaykgewotICAgICAgICBpbnN0YW5jZUNvdW50ICs9IDE7Ci0gICAgfQotCi0gICAgfkNvbXBsZXhLZXkoKSB7Ci0gICAgICAgIGluc3RhbmNlQ291bnQgLT0gMTsKLSAgICB9Ci0KLSAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IENvbXBsZXhLZXkmIG90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBrID09IG90aGVyLms7Ci0gICAgfQotCi0gICAgYm9vbCBvcGVyYXRvciAhPShjb25zdCBDb21wbGV4S2V5JiBvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gayAhPSBvdGhlci5rOwotICAgIH0KLQotICAgIHN0YXRpYyBzc2l6ZV90IGluc3RhbmNlQ291bnQ7Ci19OwotCi1zc2l6ZV90IENvbXBsZXhLZXk6Omluc3RhbmNlQ291bnQgPSAwOwotCi10ZW1wbGF0ZTw+IGlubGluZSBoYXNoX3QgaGFzaF90eXBlKGNvbnN0IENvbXBsZXhLZXkmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGhhc2hfdHlwZSh2YWx1ZS5rKTsKLX0KLQotc3RydWN0IENvbXBsZXhWYWx1ZSB7Ci0gICAgaW50IHY7Ci0KLSAgICBleHBsaWNpdCBDb21wbGV4VmFsdWUoaW50IHYpIDogdih2KSB7Ci0gICAgICAgIGluc3RhbmNlQ291bnQgKz0gMTsKLSAgICB9Ci0KLSAgICBDb21wbGV4VmFsdWUoY29uc3QgQ29tcGxleFZhbHVlJiBvdGhlcikgOiB2KG90aGVyLnYpIHsKLSAgICAgICAgaW5zdGFuY2VDb3VudCArPSAxOwotICAgIH0KLQotICAgIH5Db21wbGV4VmFsdWUoKSB7Ci0gICAgICAgIGluc3RhbmNlQ291bnQgLT0gMTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgc3NpemVfdCBpbnN0YW5jZUNvdW50OwotfTsKLQotc3NpemVfdCBDb21wbGV4VmFsdWU6Omluc3RhbmNlQ291bnQgPSAwOwotCi10eXBlZGVmIGtleV92YWx1ZV9wYWlyX3Q8Q29tcGxleEtleSwgQ29tcGxleFZhbHVlPiBDb21wbGV4RW50cnk7Ci10eXBlZGVmIEJhc2ljSGFzaHRhYmxlPENvbXBsZXhLZXksIENvbXBsZXhFbnRyeT4gQ29tcGxleEhhc2h0YWJsZTsKLQotY2xhc3MgQmFzaWNIYXNodGFibGVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgQ29tcGxleEtleTo6aW5zdGFuY2VDb3VudCA9IDA7Ci0gICAgICAgIENvbXBsZXhWYWx1ZTo6aW5zdGFuY2VDb3VudCA9IDA7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDAsIDApKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFzc2VydEluc3RhbmNlQ291bnQoc3NpemVfdCBrZXlzLCBzc2l6ZV90IHZhbHVlcykgewotICAgICAgICBpZiAoa2V5cyAhPSBDb21wbGV4S2V5OjppbnN0YW5jZUNvdW50IHx8IHZhbHVlcyAhPSBDb21wbGV4VmFsdWU6Omluc3RhbmNlQ291bnQpIHsKLSAgICAgICAgICAgIEZBSUwoKSA8PCAiRXhwZWN0ZWQgIiA8PCBrZXlzIDw8ICIga2V5cyBhbmQgIiA8PCB2YWx1ZXMgPDwgIiB2YWx1ZXMgIgotICAgICAgICAgICAgICAgICAgICAiYnV0IHRoZXJlIHdlcmUgYWN0dWFsbHkgIiA8PCBDb21wbGV4S2V5OjppbnN0YW5jZUNvdW50IDw8ICIga2V5cyBhbmQgIgotICAgICAgICAgICAgICAgICAgICA8PCBDb21wbGV4VmFsdWU6Omluc3RhbmNlQ291bnQgPDwgIiB2YWx1ZXMiOwotICAgICAgICB9Ci0gICAgfQotCi1wdWJsaWM6Ci0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRLZXksIHR5cGVuYW1lIFRFbnRyeT4KLSAgICBzdGF0aWMgdm9pZCBjb29raWVBdChjb25zdCBCYXNpY0hhc2h0YWJsZTxUS2V5LCBURW50cnk+JiBoLCBzaXplX3QgaW5kZXgsCi0gICAgICAgICAgICBib29sKiBjb2xsaXNpb24sIGJvb2wqIHByZXNlbnQsIGhhc2hfdCogaGFzaCkgewotICAgICAgICB1aW50MzJfdCBjb29raWUgPSBoLmNvb2tpZUF0KGluZGV4KTsKLSAgICAgICAgKmNvbGxpc2lvbiA9IGNvb2tpZSAmIEJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT46OkJ1Y2tldDo6Q09MTElTSU9OOwotICAgICAgICAqcHJlc2VudCA9IGNvb2tpZSAmIEJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT46OkJ1Y2tldDo6UFJFU0VOVDsKLSAgICAgICAgKmhhc2ggPSBjb29raWUgJiBCYXNpY0hhc2h0YWJsZTxUS2V5LCBURW50cnk+OjpCdWNrZXQ6OkhBU0hfTUFTSzsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVEtleSwgdHlwZW5hbWUgVEVudHJ5PgotICAgIHN0YXRpYyBjb25zdCB2b2lkKiBnZXRCdWNrZXRzKGNvbnN0IEJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT4mIGgpIHsKLSAgICAgICAgcmV0dXJuIGgubUJ1Y2tldHM7Ci0gICAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRLZXksIHR5cGVuYW1lIFRWYWx1ZT4KLXN0YXRpYyBzaXplX3QgYWRkKEJhc2ljSGFzaHRhYmxlPFRLZXksIGtleV92YWx1ZV9wYWlyX3Q8VEtleSwgVFZhbHVlPiA+JiBoLAotICAgICAgICBjb25zdCBUS2V5JiBrZXksIGNvbnN0IFRWYWx1ZSYgdmFsdWUpIHsKLSAgICByZXR1cm4gaC5hZGQoaGFzaF90eXBlKGtleSksIGtleV92YWx1ZV9wYWlyX3Q8VEtleSwgVFZhbHVlPihrZXksIHZhbHVlKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUS2V5LCB0eXBlbmFtZSBUVmFsdWU+Ci1zdGF0aWMgc3NpemVfdCBmaW5kKEJhc2ljSGFzaHRhYmxlPFRLZXksIGtleV92YWx1ZV9wYWlyX3Q8VEtleSwgVFZhbHVlPiA+JiBoLAotICAgICAgICBzc2l6ZV90IGluZGV4LCBjb25zdCBUS2V5JiBrZXkpIHsKLSAgICByZXR1cm4gaC5maW5kKGluZGV4LCBoYXNoX3R5cGUoa2V5KSwga2V5KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRLZXksIHR5cGVuYW1lIFRWYWx1ZT4KLXN0YXRpYyBib29sIHJlbW92ZShCYXNpY0hhc2h0YWJsZTxUS2V5LCBrZXlfdmFsdWVfcGFpcl90PFRLZXksIFRWYWx1ZT4gPiYgaCwKLSAgICAgICAgY29uc3QgVEtleSYga2V5KSB7Ci0gICAgc3NpemVfdCBpbmRleCA9IGZpbmQoaCwgLTEsIGtleSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgaC5yZW1vdmVBdChpbmRleCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBURW50cnk+Ci1zdGF0aWMgdm9pZCBnZXRLZXlWYWx1ZShjb25zdCBURW50cnkmIGVudHJ5LCBpbnQqIGtleSwgaW50KiB2YWx1ZSk7Ci0KLXRlbXBsYXRlIDw+IHZvaWQgZ2V0S2V5VmFsdWUoY29uc3QgU2ltcGxlRW50cnkmIGVudHJ5LCBpbnQqIGtleSwgaW50KiB2YWx1ZSkgewotICAgICprZXkgPSBlbnRyeS5rZXk7Ci0gICAgKnZhbHVlID0gZW50cnkudmFsdWU7Ci19Ci0KLXRlbXBsYXRlIDw+IHZvaWQgZ2V0S2V5VmFsdWUoY29uc3QgQ29tcGxleEVudHJ5JiBlbnRyeSwgaW50KiBrZXksIGludCogdmFsdWUpIHsKLSAgICAqa2V5ID0gZW50cnkua2V5Lms7Ci0gICAgKnZhbHVlID0gZW50cnkudmFsdWUudjsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRLZXksIHR5cGVuYW1lIFRWYWx1ZT4KLXN0YXRpYyB2b2lkIGR1bXAoQmFzaWNIYXNodGFibGU8VEtleSwga2V5X3ZhbHVlX3BhaXJfdDxUS2V5LCBUVmFsdWU+ID4mIGgpIHsKLSAgICBBTE9HRCgiaGFzaHRhYmxlICVwLCBzaXplPSV1LCBjYXBhY2l0eT0ldSwgYnVja2V0Q291bnQ9JXUiLAotICAgICAgICAgICAgJmgsIGguc2l6ZSgpLCBoLmNhcGFjaXR5KCksIGguYnVja2V0Q291bnQoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoLmJ1Y2tldENvdW50KCk7IGkrKykgewotICAgICAgICBib29sIGNvbGxpc2lvbiwgcHJlc2VudDsKLSAgICAgICAgaGFzaF90IGhhc2g7Ci0gICAgICAgIEJhc2ljSGFzaHRhYmxlVGVzdDo6Y29va2llQXQoaCwgaSwgJmNvbGxpc2lvbiwgJnByZXNlbnQsICZoYXNoKTsKLSAgICAgICAgaWYgKHByZXNlbnQpIHsKLSAgICAgICAgICAgIGludCBrZXksIHZhbHVlOwotICAgICAgICAgICAgZ2V0S2V5VmFsdWUoaC5lbnRyeUF0KGkpLCAma2V5LCAmdmFsdWUpOwotICAgICAgICAgICAgQUxPR0QoIiAgWyUzdV0gPSBjb2xsaXNpb249JWQsIHByZXNlbnQ9JWQsIGhhc2g9MHglMDh4LCBrZXk9JTNkLCB2YWx1ZT0lM2QsICIKLSAgICAgICAgICAgICAgICAgICAgImhhc2hfdHlwZShrZXkpPTB4JTA4eCIsCi0gICAgICAgICAgICAgICAgICAgIGksIGNvbGxpc2lvbiwgcHJlc2VudCwgaGFzaCwga2V5LCB2YWx1ZSwgaGFzaF90eXBlKGtleSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0QoIiAgWyUzdV0gPSBjb2xsaXNpb249JWQsIHByZXNlbnQ9JWQiLAotICAgICAgICAgICAgICAgICAgICBpLCBjb2xsaXNpb24sIHByZXNlbnQpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBEZWZhdWx0Q29uc3RydWN0b3JfV2l0aERlZmF1bHRQcm9wZXJ0aWVzKSB7Ci0gICAgU2ltcGxlSGFzaHRhYmxlIGg7Ci0KLSAgICBFWFBFQ1RfRVEoMFUsIGguc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoM1UsIGguY2FwYWNpdHkoKSk7Ci0gICAgRVhQRUNUX0VRKDVVLCBoLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUSgwLjc1ZiwgaC5sb2FkRmFjdG9yKCkpOwotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBDb25zdHJ1Y3Rvcl9XaXRoTm9uVW5pdHlMb2FkRmFjdG9yKSB7Ci0gICAgU2ltcGxlSGFzaHRhYmxlIGgoNTIsIDAuOGYpOwotCi0gICAgRVhQRUNUX0VRKDBVLCBoLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDc3VSwgaC5jYXBhY2l0eSgpKTsKLSAgICBFWFBFQ1RfRVEoOTdVLCBoLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUSgwLjhmLCBoLmxvYWRGYWN0b3IoKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIENvbnN0cnVjdG9yX1dpdGhVbml0eUxvYWRGYWN0b3JBbmRFeGFjdENhcGFjaXR5KSB7Ci0gICAgU2ltcGxlSGFzaHRhYmxlIGgoNDYsIDEuMGYpOwotCi0gICAgRVhQRUNUX0VRKDBVLCBoLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDQ2VSwgaC5jYXBhY2l0eSgpKTsgLy8gbXVzdCBiZSBvbmUgbGVzcyB0aGFuIGJ1Y2tldENvdW50IGJlY2F1c2UgbG9hZEZhY3RvciA9PSAxLjBmCi0gICAgRVhQRUNUX0VRKDQ3VSwgaC5idWNrZXRDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMS4wZiwgaC5sb2FkRmFjdG9yKCkpOwotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBDb25zdHJ1Y3Rvcl9XaXRoVW5pdHlMb2FkRmFjdG9yQW5kSW5leGFjdENhcGFjaXR5KSB7Ci0gICAgU2ltcGxlSGFzaHRhYmxlIGgoNDIsIDEuMGYpOwotCi0gICAgRVhQRUNUX0VRKDBVLCBoLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDQ2VSwgaC5jYXBhY2l0eSgpKTsgLy8gbXVzdCBiZSBvbmUgbGVzcyB0aGFuIGJ1Y2tldENvdW50IGJlY2F1c2UgbG9hZEZhY3RvciA9PSAxLjBmCi0gICAgRVhQRUNUX0VRKDQ3VSwgaC5idWNrZXRDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMS4wZiwgaC5sb2FkRmFjdG9yKCkpOwotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBGaW5kQWRkRmluZFJlbW92ZUZpbmRfT25lRW50cnkpIHsKLSAgICBTaW1wbGVIYXNodGFibGUgaDsKLSAgICBzc2l6ZV90IGluZGV4ID0gZmluZChoLCAtMSwgOCk7Ci0gICAgQVNTRVJUX0VRKC0xLCBpbmRleCk7Ci0KLSAgICBpbmRleCA9IGFkZChoLCA4LCAxKTsKLSAgICBBU1NFUlRfRVEoMVUsIGguc2l6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShpbmRleCwgZmluZChoLCAtMSwgOCkpOwotICAgIEFTU0VSVF9FUSg4LCBoLmVudHJ5QXQoaW5kZXgpLmtleSk7Ci0gICAgQVNTRVJUX0VRKDEsIGguZW50cnlBdChpbmRleCkudmFsdWUpOwotCi0gICAgaW5kZXggPSBmaW5kKGgsIGluZGV4LCA4KTsKLSAgICBBU1NFUlRfRVEoLTEsIGluZGV4KTsKLQotICAgIEFTU0VSVF9UUlVFKHJlbW92ZShoLCA4KSk7Ci0gICAgQVNTRVJUX0VRKDBVLCBoLnNpemUoKSk7Ci0KLSAgICBpbmRleCA9IGZpbmQoaCwgLTEsIDgpOwotICAgIEFTU0VSVF9FUSgtMSwgaW5kZXgpOwotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBGaW5kQWRkRmluZFJlbW92ZUZpbmRfTXVsdGlwbGVFbnRyeVdpdGhVbmlxdWVLZXkpIHsKLSAgICBjb25zdCBzaXplX3QgTiA9IDExOwotCi0gICAgU2ltcGxlSGFzaHRhYmxlIGg7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IGZpbmQoaCwgLTEsIGludChpKSk7Ci0gICAgICAgIEFTU0VSVF9FUSgtMSwgaW5kZXgpOwotCi0gICAgICAgIGluZGV4ID0gYWRkKGgsIGludChpKSwgaW50KGkgKiAxMCkpOwotICAgICAgICBBU1NFUlRfRVEoaSArIDEsIGguc2l6ZSgpKTsKLQotICAgICAgICBBU1NFUlRfRVEoaW5kZXgsIGZpbmQoaCwgLTEsIGludChpKSkpOwotICAgICAgICBBU1NFUlRfRVEoaW50KGkpLCBoLmVudHJ5QXQoaW5kZXgpLmtleSk7Ci0gICAgICAgIEFTU0VSVF9FUShpbnQoaSAqIDEwKSwgaC5lbnRyeUF0KGluZGV4KS52YWx1ZSk7Ci0KLSAgICAgICAgaW5kZXggPSBmaW5kKGgsIGluZGV4LCBpbnQoaSkpOwotICAgICAgICBBU1NFUlRfRVEoLTEsIGluZGV4KTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gTjsgLS1pID4gMDsgKSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHJlbW92ZShoLCBpbnQoaSkpKSA8PCAiaSA9ICIgPDwgaTsKLSAgICAgICAgQVNTRVJUX0VRKGksIGguc2l6ZSgpKTsKLQotICAgICAgICBzc2l6ZV90IGluZGV4ID0gZmluZChoLCAtMSwgaW50KGkpKTsKLSAgICAgICAgQVNTRVJUX0VRKC0xLCBpbmRleCk7Ci0gICAgfQotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBGaW5kQWRkRmluZFJlbW92ZUZpbmRfTXVsdGlwbGVFbnRyeVdpdGhEdXBsaWNhdGVLZXkpIHsKLSAgICBjb25zdCBzaXplX3QgTiA9IDExOwotICAgIGNvbnN0IGludCBLID0gMTsKLQotICAgIFNpbXBsZUhhc2h0YWJsZSBoOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTjsgaSsrKSB7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBmaW5kKGgsIC0xLCBLKTsKLSAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgQVNTRVJUX0VRKC0xLCBpbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBU1NFUlRfTkUoLTEsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZChoLCBLLCBpbnQoaSkpOwotICAgICAgICBBU1NFUlRfRVEoaSArIDEsIGguc2l6ZSgpKTsKLQotICAgICAgICBpbmRleCA9IC0xOwotICAgICAgICBpbnQgdmFsdWVzID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPD0gaTsgaisrKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGZpbmQoaCwgaW5kZXgsIEspOwotICAgICAgICAgICAgQVNTRVJUX0dFKGluZGV4LCAwKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShLLCBoLmVudHJ5QXQoaW5kZXgpLmtleSk7Ci0gICAgICAgICAgICB2YWx1ZXMgfD0gMSA8PCBoLmVudHJ5QXQoaW5kZXgpLnZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9FUSh2YWx1ZXMsICgxIDw8IChpICsgMSkpIC0gMSk7Ci0KLSAgICAgICAgaW5kZXggPSBmaW5kKGgsIGluZGV4LCBLKTsKLSAgICAgICAgQVNTRVJUX0VRKC0xLCBpbmRleCk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IE47IC0taSA+IDA7ICkgewotICAgICAgICBBU1NFUlRfVFJVRShyZW1vdmUoaCwgSykpIDw8ICJpID0gIiA8PCBpOwotICAgICAgICBBU1NFUlRfRVEoaSwgaC5zaXplKCkpOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSAtMTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpOyBqKyspIHsKLSAgICAgICAgICAgIGluZGV4ID0gZmluZChoLCBpbmRleCwgSyk7Ci0gICAgICAgICAgICBBU1NFUlRfR0UoaW5kZXgsIDApOwotICAgICAgICAgICAgQVNTRVJUX0VRKEssIGguZW50cnlBdChpbmRleCkua2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGluZGV4ID0gZmluZChoLCBpbmRleCwgSyk7Ci0gICAgICAgIEFTU0VSVF9FUSgtMSwgaW5kZXgpOwotICAgIH0KLX0KLQotVEVTVF9GKEJhc2ljSGFzaHRhYmxlVGVzdCwgQ2xlYXJfV2hlbkFscmVhZHlFbXB0eV9Eb2VzTm90aGluZykgewotICAgIFNpbXBsZUhhc2h0YWJsZSBoOwotICAgIGguY2xlYXIoKTsKLQotICAgIEVYUEVDVF9FUSgwVSwgaC5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgzVSwgaC5jYXBhY2l0eSgpKTsKLSAgICBFWFBFQ1RfRVEoNVUsIGguYnVja2V0Q291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDAuNzVmLCBoLmxvYWRGYWN0b3IoKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIENsZWFyX0FmdGVyRWxlbWVudHNBZGRlZF9SZW1vdmVzVGhlbSkgewotICAgIFNpbXBsZUhhc2h0YWJsZSBoOwotICAgIGFkZChoLCAwLCAwKTsKLSAgICBhZGQoaCwgMSwgMCk7Ci0gICAgaC5jbGVhcigpOwotCi0gICAgRVhQRUNUX0VRKDBVLCBoLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDNVLCBoLmNhcGFjaXR5KCkpOwotICAgIEVYUEVDVF9FUSg1VSwgaC5idWNrZXRDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMC43NWYsIGgubG9hZEZhY3RvcigpKTsKLX0KLQotVEVTVF9GKEJhc2ljSGFzaHRhYmxlVGVzdCwgQ2xlYXJfQWZ0ZXJFbGVtZW50c0FkZGVkX0Rlc3Ryb3lzVGhlbSkgewotICAgIENvbXBsZXhIYXNodGFibGUgaDsKLSAgICBhZGQoaCwgQ29tcGxleEtleSgwKSwgQ29tcGxleFZhbHVlKDApKTsKLSAgICBhZGQoaCwgQ29tcGxleEtleSgxKSwgQ29tcGxleFZhbHVlKDApKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDIsIDIpKTsKLQotICAgIGguY2xlYXIoKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDAsIDApKTsKLQotICAgIEVYUEVDVF9FUSgwVSwgaC5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgzVSwgaC5jYXBhY2l0eSgpKTsKLSAgICBFWFBFQ1RfRVEoNVUsIGguYnVja2V0Q291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDAuNzVmLCBoLmxvYWRGYWN0b3IoKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIFJlbW92ZV9BZnRlckVsZW1lbnRzQWRkZWRfRGVzdHJveXNUaGVtKSB7Ci0gICAgQ29tcGxleEhhc2h0YWJsZSBoOwotICAgIGFkZChoLCBDb21wbGV4S2V5KDApLCBDb21wbGV4VmFsdWUoMCkpOwotICAgIGFkZChoLCBDb21wbGV4S2V5KDEpLCBDb21wbGV4VmFsdWUoMCkpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMiwgMikpOwotCi0gICAgQVNTRVJUX1RSVUUocmVtb3ZlKGgsIENvbXBsZXhLZXkoMCkpKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDEsIDEpKTsKLQotICAgIEFTU0VSVF9UUlVFKHJlbW92ZShoLCBDb21wbGV4S2V5KDEpKSk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgwLCAwKSk7Ci0KLSAgICBFWFBFQ1RfRVEoMFUsIGguc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoM1UsIGguY2FwYWNpdHkoKSk7Ci0gICAgRVhQRUNUX0VRKDVVLCBoLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUSgwLjc1ZiwgaC5sb2FkRmFjdG9yKCkpOwotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBEZXN0cnVjdG9yX0FmdGVyRWxlbWVudHNBZGRlZF9EZXN0cm95c1RoZW0pIHsKLSAgICB7Ci0gICAgICAgIENvbXBsZXhIYXNodGFibGUgaDsKLSAgICAgICAgYWRkKGgsIENvbXBsZXhLZXkoMCksIENvbXBsZXhWYWx1ZSgwKSk7Ci0gICAgICAgIGFkZChoLCBDb21wbGV4S2V5KDEpLCBDb21wbGV4VmFsdWUoMCkpOwotICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDIsIDIpKTsKLSAgICB9IC8vIGggaXMgZGVzdHJveWVkIGhlcmUKLQotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMCwgMCkpOwotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBOZXh0X1doZW5FbXB0eV9SZXR1cm5zTWludXNPbmUpIHsKLSAgICBTaW1wbGVIYXNodGFibGUgaDsKLQotICAgIEFTU0VSVF9FUSgtMSwgaC5uZXh0KC0xKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIE5leHRfV2hlbk5vbkVtcHR5X0l0ZXJhdGVzT3ZlckFsbEVudHJpZXMpIHsKLSAgICBjb25zdCBpbnQgTiA9IDg4OwotCi0gICAgU2ltcGxlSGFzaHRhYmxlIGg7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgYWRkKGgsIGksIGkgKiAxMCk7Ci0gICAgfQotCi0gICAgYm9vbCBzZXRbTl07Ci0gICAgbWVtc2V0KHNldCwgMCwgc2l6ZW9mKGJvb2wpICogTik7Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBmb3IgKHNzaXplX3QgaW5kZXggPSAtMTsgKGluZGV4ID0gaC5uZXh0KGluZGV4KSkgIT0gLTE7ICkgewotICAgICAgICBBU1NFUlRfR0UoaW5kZXgsIDApOwotICAgICAgICBBU1NFUlRfTFQoc2l6ZV90KGluZGV4KSwgaC5idWNrZXRDb3VudCgpKTsKLQotICAgICAgICBjb25zdCBTaW1wbGVFbnRyeSYgZW50cnkgPSBoLmVudHJ5QXQoaW5kZXgpOwotICAgICAgICBBU1NFUlRfR0UoZW50cnkua2V5LCAwKTsKLSAgICAgICAgQVNTRVJUX0xUKGVudHJ5LmtleSwgTik7Ci0gICAgICAgIEFTU0VSVF9FUShmYWxzZSwgc2V0W2VudHJ5LmtleV0pOwotICAgICAgICBBU1NFUlRfRVEoZW50cnkua2V5ICogMTAsIGVudHJ5LnZhbHVlKTsKLQotICAgICAgICBzZXRbZW50cnkua2V5XSA9IHRydWU7Ci0gICAgICAgIGNvdW50ICs9IDE7Ci0gICAgfQotICAgIEFTU0VSVF9FUShOLCBjb3VudCk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIEFkZF9SZWhhc2hlc09uRGVtYW5kKSB7Ci0gICAgU2ltcGxlSGFzaHRhYmxlIGg7Ci0gICAgc2l6ZV90IGluaXRpYWxDYXBhY2l0eSA9IGguY2FwYWNpdHkoKTsKLSAgICBzaXplX3QgaW5pdGlhbEJ1Y2tldENvdW50ID0gaC5idWNrZXRDb3VudCgpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbml0aWFsQ2FwYWNpdHk7IGkrKykgewotICAgICAgICBhZGQoaCwgaW50KGkpLCAwKTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfRVEoaW5pdGlhbENhcGFjaXR5LCBoLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKGluaXRpYWxDYXBhY2l0eSwgaC5jYXBhY2l0eSgpKTsKLSAgICBFWFBFQ1RfRVEoaW5pdGlhbEJ1Y2tldENvdW50LCBoLmJ1Y2tldENvdW50KCkpOwotCi0gICAgYWRkKGgsIC0xLCAtMSk7Ci0KLSAgICBFWFBFQ1RfRVEoaW5pdGlhbENhcGFjaXR5ICsgMSwgaC5zaXplKCkpOwotICAgIEVYUEVDVF9HVChoLmNhcGFjaXR5KCksIGluaXRpYWxDYXBhY2l0eSk7Ci0gICAgRVhQRUNUX0dUKGguYnVja2V0Q291bnQoKSwgaW5pdGlhbEJ1Y2tldENvdW50KTsKLSAgICBFWFBFQ1RfR1QoaC5idWNrZXRDb3VudCgpLCBoLmNhcGFjaXR5KCkpOwotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBSZWhhc2hfV2hlbkNhcGFjaXR5QW5kQnVja2V0Q291bnRVbmNoYW5nZWRfRG9lc05vdGhpbmcpIHsKLSAgICBDb21wbGV4SGFzaHRhYmxlIGg7Ci0gICAgYWRkKGgsIENvbXBsZXhLZXkoMCksIENvbXBsZXhWYWx1ZSgwKSk7Ci0gICAgY29uc3Qgdm9pZCogb2xkQnVja2V0cyA9IGdldEJ1Y2tldHMoaCk7Ci0gICAgQVNTRVJUX05FKCh2b2lkKilOVUxMLCBvbGRCdWNrZXRzKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDEsIDEpKTsKLQotICAgIGgucmVoYXNoKGguY2FwYWNpdHkoKSwgaC5sb2FkRmFjdG9yKCkpOwotCi0gICAgQVNTRVJUX0VRKG9sZEJ1Y2tldHMsIGdldEJ1Y2tldHMoaCkpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMSwgMSkpOwotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBSZWhhc2hfV2hlbkVtcHR5QW5kSGFzTm9CdWNrZXRzX0J1dERvZXNOb3RBbGxvY2F0ZUJ1Y2tldHMpIHsKLSAgICBDb21wbGV4SGFzaHRhYmxlIGg7Ci0gICAgQVNTRVJUX0VRKCh2b2lkKilOVUxMLCBnZXRCdWNrZXRzKGgpKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDAsIDApKTsKLQotICAgIGgucmVoYXNoKDksIDEuMGYpOwotCi0gICAgRVhQRUNUX0VRKDBVLCBoLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDEwVSwgaC5jYXBhY2l0eSgpKTsKLSAgICBFWFBFQ1RfRVEoMTFVLCBoLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUSgxLjBmLCBoLmxvYWRGYWN0b3IoKSk7Ci0gICAgRVhQRUNUX0VRKCh2b2lkKilOVUxMLCBnZXRCdWNrZXRzKGgpKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDAsIDApKTsKLX0KLQotVEVTVF9GKEJhc2ljSGFzaHRhYmxlVGVzdCwgUmVoYXNoX1doZW5FbXB0eUFuZEhhc0J1Y2tldHNfUmVsZWFzZXNCdWNrZXRzQW5kU2V0c0NhcGFjaXR5KSB7Ci0gICAgQ29tcGxleEhhc2h0YWJsZSBoKDEwKTsKLSAgICBhZGQoaCwgQ29tcGxleEtleSgwKSwgQ29tcGxleFZhbHVlKDApKTsKLSAgICBBU1NFUlRfVFJVRShyZW1vdmUoaCwgQ29tcGxleEtleSgwKSkpOwotICAgIEFTU0VSVF9ORSgodm9pZCopTlVMTCwgZ2V0QnVja2V0cyhoKSk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgwLCAwKSk7Ci0KLSAgICBoLnJlaGFzaCgwLCAwLjc1Zik7Ci0KLSAgICBFWFBFQ1RfRVEoMFUsIGguc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoM1UsIGguY2FwYWNpdHkoKSk7Ci0gICAgRVhQRUNUX0VRKDVVLCBoLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUSgwLjc1ZiwgaC5sb2FkRmFjdG9yKCkpOwotICAgIEVYUEVDVF9FUSgodm9pZCopTlVMTCwgZ2V0QnVja2V0cyhoKSk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgwLCAwKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIFJlaGFzaF9XaGVuTGVzc1RoYW5DdXJyZW50Q2FwYWNpdHlfU2hyaW5rc0J1Y2tldHMpIHsKLSAgICBDb21wbGV4SGFzaHRhYmxlIGgoMTApOwotICAgIGFkZChoLCBDb21wbGV4S2V5KDApLCBDb21wbGV4VmFsdWUoMCkpOwotICAgIGFkZChoLCBDb21wbGV4S2V5KDEpLCBDb21wbGV4VmFsdWUoMSkpOwotICAgIGNvbnN0IHZvaWQqIG9sZEJ1Y2tldHMgPSBnZXRCdWNrZXRzKGgpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMiwgMikpOwotCi0gICAgaC5yZWhhc2goMCwgMC43NWYpOwotCi0gICAgRVhQRUNUX0VRKDJVLCBoLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDNVLCBoLmNhcGFjaXR5KCkpOwotICAgIEVYUEVDVF9FUSg1VSwgaC5idWNrZXRDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMC43NWYsIGgubG9hZEZhY3RvcigpKTsKLSAgICBFWFBFQ1RfTkUob2xkQnVja2V0cywgZ2V0QnVja2V0cyhoKSk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgyLCAyKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIENvcHlPbldyaXRlKSB7Ci0gICAgQ29tcGxleEhhc2h0YWJsZSBoMTsKLSAgICBhZGQoaDEsIENvbXBsZXhLZXkoMCksIENvbXBsZXhWYWx1ZSgwKSk7Ci0gICAgYWRkKGgxLCBDb21wbGV4S2V5KDEpLCBDb21wbGV4VmFsdWUoMSkpOwotICAgIGNvbnN0IHZvaWQqIG9yaWdpbmFsQnVja2V0cyA9IGdldEJ1Y2tldHMoaDEpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMiwgMikpOwotICAgIHNzaXplX3QgaW5kZXgwID0gZmluZChoMSwgLTEsIENvbXBsZXhLZXkoMCkpOwotICAgIEVYUEVDVF9HRShpbmRleDAsIDApOwotCi0gICAgLy8gY29weSBjb25zdHJ1Y3RvciBhY3F1aXJlcyBzaGFyZWQgcmVmZXJlbmNlCi0gICAgQ29tcGxleEhhc2h0YWJsZSBoMihoMSk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgyLCAyKSk7Ci0gICAgQVNTRVJUX0VRKG9yaWdpbmFsQnVja2V0cywgZ2V0QnVja2V0cyhoMikpOwotICAgIEVYUEVDVF9FUShoMS5zaXplKCksIGgyLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKGgxLmNhcGFjaXR5KCksIGgyLmNhcGFjaXR5KCkpOwotICAgIEVYUEVDVF9FUShoMS5idWNrZXRDb3VudCgpLCBoMi5idWNrZXRDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoaDEubG9hZEZhY3RvcigpLCBoMi5sb2FkRmFjdG9yKCkpOwotICAgIEVYUEVDVF9FUShpbmRleDAsIGZpbmQoaDIsIC0xLCBDb21wbGV4S2V5KDApKSk7Ci0KLSAgICAvLyBvcGVyYXRvcj0gYWNxdWlyZXMgc2hhcmVkIHJlZmVyZW5jZQotICAgIENvbXBsZXhIYXNodGFibGUgaDM7Ci0gICAgaDMgPSBoMjsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDIsIDIpKTsKLSAgICBBU1NFUlRfRVEob3JpZ2luYWxCdWNrZXRzLCBnZXRCdWNrZXRzKGgzKSk7Ci0gICAgRVhQRUNUX0VRKGgxLnNpemUoKSwgaDMuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoaDEuY2FwYWNpdHkoKSwgaDMuY2FwYWNpdHkoKSk7Ci0gICAgRVhQRUNUX0VRKGgxLmJ1Y2tldENvdW50KCksIGgzLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUShoMS5sb2FkRmFjdG9yKCksIGgzLmxvYWRGYWN0b3IoKSk7Ci0gICAgRVhQRUNUX0VRKGluZGV4MCwgZmluZChoMywgLTEsIENvbXBsZXhLZXkoMCkpKTsKLQotICAgIC8vIGVkaXRFbnRyeUF0IGNvcGllcyBzaGFyZWQgY29udGVudHMKLSAgICBoMS5lZGl0RW50cnlBdChpbmRleDApLnZhbHVlLnYgPSA0MjsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDQsIDQpKTsKLSAgICBBU1NFUlRfTkUob3JpZ2luYWxCdWNrZXRzLCBnZXRCdWNrZXRzKGgxKSk7Ci0gICAgRVhQRUNUX0VRKDQyLCBoMS5lbnRyeUF0KGluZGV4MCkudmFsdWUudik7Ci0gICAgRVhQRUNUX0VRKDAsIGgyLmVudHJ5QXQoaW5kZXgwKS52YWx1ZS52KTsKLSAgICBFWFBFQ1RfRVEoMCwgaDMuZW50cnlBdChpbmRleDApLnZhbHVlLnYpOwotCi0gICAgLy8gY2xlYXIgcmVsZWFzZXMgcmVmZXJlbmNlIHRvIHNoYXJlZCBjb250ZW50cwotICAgIGgyLmNsZWFyKCk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCg0LCA0KSk7Ci0gICAgRVhQRUNUX0VRKDBVLCBoMi5zaXplKCkpOwotICAgIEFTU0VSVF9ORShvcmlnaW5hbEJ1Y2tldHMsIGdldEJ1Y2tldHMoaDIpKTsKLQotICAgIC8vIG9wZXJhdG9yPSBhY3F1aXJlcyBzaGFyZWQgcmVmZXJlbmNlLCBkZXN0cm95cyB1bnNoYXJlZCBjb250ZW50cwotICAgIGgxID0gaDM7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgyLCAyKSk7Ci0gICAgQVNTRVJUX0VRKG9yaWdpbmFsQnVja2V0cywgZ2V0QnVja2V0cyhoMSkpOwotICAgIEVYUEVDVF9FUShoMy5zaXplKCksIGgxLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKGgzLmNhcGFjaXR5KCksIGgxLmNhcGFjaXR5KCkpOwotICAgIEVYUEVDVF9FUShoMy5idWNrZXRDb3VudCgpLCBoMS5idWNrZXRDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoaDMubG9hZEZhY3RvcigpLCBoMS5sb2FkRmFjdG9yKCkpOwotICAgIEVYUEVDVF9FUShpbmRleDAsIGZpbmQoaDEsIC0xLCBDb21wbGV4S2V5KDApKSk7Ci0KLSAgICAvLyBhZGQgY29waWVzIHNoYXJlZCBjb250ZW50cwotICAgIGFkZChoMSwgQ29tcGxleEtleSgyKSwgQ29tcGxleFZhbHVlKDIpKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDUsIDUpKTsKLSAgICBBU1NFUlRfTkUob3JpZ2luYWxCdWNrZXRzLCBnZXRCdWNrZXRzKGgxKSk7Ci0gICAgRVhQRUNUX0VRKDNVLCBoMS5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgwVSwgaDIuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoMlUsIGgzLnNpemUoKSk7Ci0KLSAgICAvLyByZW1vdmUgY29waWVzIHNoYXJlZCBjb250ZW50cwotICAgIGgxID0gaDM7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgyLCAyKSk7Ci0gICAgQVNTRVJUX0VRKG9yaWdpbmFsQnVja2V0cywgZ2V0QnVja2V0cyhoMSkpOwotICAgIGgxLnJlbW92ZUF0KGluZGV4MCk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgzLCAzKSk7Ci0gICAgQVNTRVJUX05FKG9yaWdpbmFsQnVja2V0cywgZ2V0QnVja2V0cyhoMSkpOwotICAgIEVYUEVDVF9FUSgxVSwgaDEuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoMFUsIGgyLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDJVLCBoMy5zaXplKCkpOwotCi0gICAgLy8gcmVoYXNoIGNvcGllcyBzaGFyZWQgY29udGVudHMKLSAgICBoMSA9IGgzOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMiwgMikpOwotICAgIEFTU0VSVF9FUShvcmlnaW5hbEJ1Y2tldHMsIGdldEJ1Y2tldHMoaDEpKTsKLSAgICBoMS5yZWhhc2goMTAsIDEuMGYpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoNCwgNCkpOwotICAgIEFTU0VSVF9ORShvcmlnaW5hbEJ1Y2tldHMsIGdldEJ1Y2tldHMoaDEpKTsKLSAgICBFWFBFQ1RfRVEoMlUsIGgxLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDBVLCBoMi5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgyVSwgaDMuc2l6ZSgpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy90ZXN0cy9CbG9iQ2FjaGVfdGVzdC5jcHAgYi9saWJzL3V0aWxzL3Rlc3RzL0Jsb2JDYWNoZV90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0Y2MzOS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL3Rlc3RzL0Jsb2JDYWNoZV90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9CbG9iQ2FjaGUuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBCbG9iQ2FjaGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgZW51bSB7Ci0gICAgICAgIE1BWF9LRVlfU0laRSA9IDYsCi0gICAgICAgIE1BWF9WQUxVRV9TSVpFID0gOCwKLSAgICAgICAgTUFYX1RPVEFMX1NJWkUgPSAxMywKLSAgICB9OwotCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBtQkMgPSBuZXcgQmxvYkNhY2hlKE1BWF9LRVlfU0laRSwgTUFYX1ZBTFVFX1NJWkUsIE1BWF9UT1RBTF9TSVpFKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIG1CQy5jbGVhcigpOwotICAgIH0KLQotICAgIHNwPEJsb2JDYWNoZT4gbUJDOwotfTsKLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIENhY2hlU2luZ2xlVmFsdWVTdWNjZWVkcykgewotICAgIGNoYXIgYnVmWzRdID0geyAweGVlLCAweGVlLCAweGVlLCAweGVlIH07Ci0gICAgbUJDLT5zZXQoImFiY2QiLCA0LCAiZWZnaCIsIDQpOwotICAgIEFTU0VSVF9FUShzaXplX3QoNCksIG1CQy0+Z2V0KCJhYmNkIiwgNCwgYnVmLCA0KSk7Ci0gICAgQVNTRVJUX0VRKCdlJywgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoJ2YnLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUSgnZycsIGJ1ZlsyXSk7Ci0gICAgQVNTRVJUX0VRKCdoJywgYnVmWzNdKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIENhY2hlVHdvVmFsdWVzU3VjY2VlZHMpIHsKLSAgICBjaGFyIGJ1ZlsyXSA9IHsgMHhlZSwgMHhlZSB9OwotICAgIG1CQy0+c2V0KCJhYiIsIDIsICJjZCIsIDIpOwotICAgIG1CQy0+c2V0KCJlZiIsIDIsICJnaCIsIDIpOwotICAgIEFTU0VSVF9FUShzaXplX3QoMiksIG1CQy0+Z2V0KCJhYiIsIDIsIGJ1ZiwgMikpOwotICAgIEFTU0VSVF9FUSgnYycsIGJ1ZlswXSk7Ci0gICAgQVNTRVJUX0VRKCdkJywgYnVmWzFdKTsKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDIpLCBtQkMtPmdldCgiZWYiLCAyLCBidWYsIDIpKTsKLSAgICBBU1NFUlRfRVEoJ2cnLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUSgnaCcsIGJ1ZlsxXSk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVUZXN0LCBHZXRPbmx5V3JpdGVzSW5zaWRlQm91bmRzKSB7Ci0gICAgY2hhciBidWZbNl0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0gICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoImFiY2QiLCA0LCBidWYrMSwgNCkpOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUSgnZScsIGJ1ZlsxXSk7Ci0gICAgQVNTRVJUX0VRKCdmJywgYnVmWzJdKTsKLSAgICBBU1NFUlRfRVEoJ2cnLCBidWZbM10pOwotICAgIEFTU0VSVF9FUSgnaCcsIGJ1Zls0XSk7Ci0gICAgQVNTRVJUX0VRKDB4ZWUsIGJ1Zls1XSk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVUZXN0LCBHZXRPbmx5V3JpdGVzSWZCdWZmZXJJc0xhcmdlRW5vdWdoKSB7Ci0gICAgY2hhciBidWZbM10gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0gICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoImFiY2QiLCA0LCBidWYsIDMpKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzFdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzJdKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIEdldERvZXNudEFjY2Vzc051bGxCdWZmZXIpIHsKLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0gICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoImFiY2QiLCA0LCBOVUxMLCAwKSk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVUZXN0LCBNdWx0aXBsZVNldHNDYWNoZUxhdGVzdFZhbHVlKSB7Ci0gICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0gICAgbUJDLT5zZXQoImFiY2QiLCA0LCAiaWprbCIsIDQpOwotICAgIEFTU0VSVF9FUShzaXplX3QoNCksIG1CQy0+Z2V0KCJhYmNkIiwgNCwgYnVmLCA0KSk7Ci0gICAgQVNTRVJUX0VRKCdpJywgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoJ2onLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUSgnaycsIGJ1ZlsyXSk7Ci0gICAgQVNTRVJUX0VRKCdsJywgYnVmWzNdKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIFNlY29uZFNldEtlZXBzRmlyc3RWYWx1ZUlmVG9vTGFyZ2UpIHsKLSAgICBjaGFyIGJ1ZltNQVhfVkFMVUVfU0laRSsxXSA9IHsgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSB9OwotICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsIGJ1ZiwgTUFYX1ZBTFVFX1NJWkUrMSk7Ci0gICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoImFiY2QiLCA0LCBidWYsIDQpKTsKLSAgICBBU1NFUlRfRVEoJ2UnLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUSgnZicsIGJ1ZlsxXSk7Ci0gICAgQVNTRVJUX0VRKCdnJywgYnVmWzJdKTsKLSAgICBBU1NFUlRfRVEoJ2gnLCBidWZbM10pOwotfQotCi1URVNUX0YoQmxvYkNhY2hlVGVzdCwgRG9lc250Q2FjaGVJZktleUlzVG9vQmlnKSB7Ci0gICAgY2hhciBrZXlbTUFYX0tFWV9TSVpFKzFdOwotICAgIGNoYXIgYnVmWzRdID0geyAweGVlLCAweGVlLCAweGVlLCAweGVlIH07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfS0VZX1NJWkUrMTsgaSsrKSB7Ci0gICAgICAgIGtleVtpXSA9ICdhJzsKLSAgICB9Ci0gICAgbUJDLT5zZXQoa2V5LCBNQVhfS0VZX1NJWkUrMSwgImJiYmIiLCA0KTsKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDApLCBtQkMtPmdldChrZXksIE1BWF9LRVlfU0laRSsxLCBidWYsIDQpKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzFdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzJdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzNdKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIERvZXNudENhY2hlSWZWYWx1ZUlzVG9vQmlnKSB7Ci0gICAgY2hhciBidWZbTUFYX1ZBTFVFX1NJWkUrMV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfVkFMVUVfU0laRSsxOyBpKyspIHsKLSAgICAgICAgYnVmW2ldID0gJ2InOwotICAgIH0KLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsIGJ1ZiwgTUFYX1ZBTFVFX1NJWkUrMSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfVkFMVUVfU0laRSsxOyBpKyspIHsKLSAgICAgICAgYnVmW2ldID0gMHhlZTsKLSAgICB9Ci0gICAgQVNTRVJUX0VRKHNpemVfdCgwKSwgbUJDLT5nZXQoImFiY2QiLCA0LCBidWYsIE1BWF9WQUxVRV9TSVpFKzEpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9WQUxVRV9TSVpFKzE7IGkrKykgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0gICAgICAgIEFTU0VSVF9FUSgweGVlLCBidWZbaV0pOwotICAgIH0KLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIERvZXNudENhY2hlSWZLZXlWYWx1ZVBhaXJJc1Rvb0JpZykgewotICAgIC8vIENoZWNrIGEgdGVzdGluZyBhc3N1bXB0aW9ucwotICAgIEFTU0VSVF9UUlVFKE1BWF9UT1RBTF9TSVpFIDwgTUFYX0tFWV9TSVpFICsgTUFYX1ZBTFVFX1NJWkUpOwotICAgIEFTU0VSVF9UUlVFKE1BWF9LRVlfU0laRSA8IE1BWF9UT1RBTF9TSVpFKTsKLQotICAgIGVudW0geyBidWZTaXplID0gTUFYX1RPVEFMX1NJWkUgLSBNQVhfS0VZX1NJWkUgKyAxIH07Ci0KLSAgICBjaGFyIGtleVtNQVhfS0VZX1NJWkVdOwotICAgIGNoYXIgYnVmW2J1ZlNpemVdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0tFWV9TSVpFOyBpKyspIHsKLSAgICAgICAga2V5W2ldID0gJ2EnOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1ZlNpemU7IGkrKykgewotICAgICAgICBidWZbaV0gPSAnYic7Ci0gICAgfQotCi0gICAgbUJDLT5zZXQoa2V5LCBNQVhfS0VZX1NJWkUsIGJ1ZiwgTUFYX1ZBTFVFX1NJWkUpOwotICAgIEFTU0VSVF9FUShzaXplX3QoMCksIG1CQy0+Z2V0KGtleSwgTUFYX0tFWV9TSVpFLCBOVUxMLCAwKSk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVUZXN0LCBDYWNoZU1heEtleVNpemVTdWNjZWVkcykgewotICAgIGNoYXIga2V5W01BWF9LRVlfU0laRV07Ci0gICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9LRVlfU0laRTsgaSsrKSB7Ci0gICAgICAgIGtleVtpXSA9ICdhJzsKLSAgICB9Ci0gICAgbUJDLT5zZXQoa2V5LCBNQVhfS0VZX1NJWkUsICJ3eHl6IiwgNCk7Ci0gICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoa2V5LCBNQVhfS0VZX1NJWkUsIGJ1ZiwgNCkpOwotICAgIEFTU0VSVF9FUSgndycsIGJ1ZlswXSk7Ci0gICAgQVNTRVJUX0VRKCd4JywgYnVmWzFdKTsKLSAgICBBU1NFUlRfRVEoJ3knLCBidWZbMl0pOwotICAgIEFTU0VSVF9FUSgneicsIGJ1ZlszXSk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVUZXN0LCBDYWNoZU1heFZhbHVlU2l6ZVN1Y2NlZWRzKSB7Ci0gICAgY2hhciBidWZbTUFYX1ZBTFVFX1NJWkVdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1ZBTFVFX1NJWkU7IGkrKykgewotICAgICAgICBidWZbaV0gPSAnYic7Ci0gICAgfQotICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgYnVmLCBNQVhfVkFMVUVfU0laRSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfVkFMVUVfU0laRTsgaSsrKSB7Ci0gICAgICAgIGJ1ZltpXSA9IDB4ZWU7Ci0gICAgfQotICAgIEFTU0VSVF9FUShzaXplX3QoTUFYX1ZBTFVFX1NJWkUpLCBtQkMtPmdldCgiYWJjZCIsIDQsIGJ1ZiwKLSAgICAgICAgICAgIE1BWF9WQUxVRV9TSVpFKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfVkFMVUVfU0laRTsgaSsrKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShpKTsKLSAgICAgICAgQVNTRVJUX0VRKCdiJywgYnVmW2ldKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVUZXN0LCBDYWNoZU1heEtleVZhbHVlUGFpclNpemVTdWNjZWVkcykgewotICAgIC8vIENoZWNrIGEgdGVzdGluZyBhc3N1bXB0aW9uCi0gICAgQVNTRVJUX1RSVUUoTUFYX0tFWV9TSVpFIDwgTUFYX1RPVEFMX1NJWkUpOwotCi0gICAgZW51bSB7IGJ1ZlNpemUgPSBNQVhfVE9UQUxfU0laRSAtIE1BWF9LRVlfU0laRSB9OwotCi0gICAgY2hhciBrZXlbTUFYX0tFWV9TSVpFXTsKLSAgICBjaGFyIGJ1ZltidWZTaXplXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9LRVlfU0laRTsgaSsrKSB7Ci0gICAgICAgIGtleVtpXSA9ICdhJzsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZTaXplOyBpKyspIHsKLSAgICAgICAgYnVmW2ldID0gJ2InOwotICAgIH0KLQotICAgIG1CQy0+c2V0KGtleSwgTUFYX0tFWV9TSVpFLCBidWYsIGJ1ZlNpemUpOwotICAgIEFTU0VSVF9FUShzaXplX3QoYnVmU2l6ZSksIG1CQy0+Z2V0KGtleSwgTUFYX0tFWV9TSVpFLCBOVUxMLCAwKSk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVUZXN0LCBDYWNoZU1pbktleUFuZFZhbHVlU2l6ZVN1Y2NlZWRzKSB7Ci0gICAgY2hhciBidWZbMV0gPSB7IDB4ZWUgfTsKLSAgICBtQkMtPnNldCgieCIsIDEsICJ5IiwgMSk7Ci0gICAgQVNTRVJUX0VRKHNpemVfdCgxKSwgbUJDLT5nZXQoIngiLCAxLCBidWYsIDEpKTsKLSAgICBBU1NFUlRfRVEoJ3knLCBidWZbMF0pOwotfQotCi1URVNUX0YoQmxvYkNhY2hlVGVzdCwgQ2FjaGVTaXplRG9lc250RXhjZWVkVG90YWxMaW1pdCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgICAgdWludDhfdCBrID0gaTsKLSAgICAgICAgbUJDLT5zZXQoJmssIDEsICJ4IiwgMSk7Ci0gICAgfQotICAgIGludCBudW1DYWNoZWQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgICAgdWludDhfdCBrID0gaTsKLSAgICAgICAgaWYgKG1CQy0+Z2V0KCZrLCAxLCBOVUxMLCAwKSA9PSAxKSB7Ci0gICAgICAgICAgICBudW1DYWNoZWQrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBBU1NFUlRfR0UoTUFYX1RPVEFMX1NJWkUgLyAyLCBudW1DYWNoZWQpOwotfQotCi1URVNUX0YoQmxvYkNhY2hlVGVzdCwgRXhjZWVkaW5nVG90YWxMaW1pdEhhbHZlc0NhY2hlU2l6ZSkgewotICAgIC8vIEZpbGwgdXAgdGhlIGVudGlyZSBjYWNoZSB3aXRoIDEgY2hhciBrZXkvdmFsdWUgcGFpcnMuCi0gICAgY29uc3QgaW50IG1heEVudHJpZXMgPSBNQVhfVE9UQUxfU0laRSAvIDI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhFbnRyaWVzOyBpKyspIHsKLSAgICAgICAgdWludDhfdCBrID0gaTsKLSAgICAgICAgbUJDLT5zZXQoJmssIDEsICJ4IiwgMSk7Ci0gICAgfQotICAgIC8vIEluc2VydCBvbmUgbW9yZSBlbnRyeSwgY2F1c2luZyBhIGNhY2hlIG92ZXJmbG93LgotICAgIHsKLSAgICAgICAgdWludDhfdCBrID0gbWF4RW50cmllczsKLSAgICAgICAgbUJDLT5zZXQoJmssIDEsICJ4IiwgMSk7Ci0gICAgfQotICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2FjaGUuCi0gICAgaW50IG51bUNhY2hlZCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhFbnRyaWVzKzE7IGkrKykgewotICAgICAgICB1aW50OF90IGsgPSBpOwotICAgICAgICBpZiAobUJDLT5nZXQoJmssIDEsIE5VTEwsIDApID09IDEpIHsKLSAgICAgICAgICAgIG51bUNhY2hlZCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIEFTU0VSVF9FUShtYXhFbnRyaWVzLzIgKyAxLCBudW1DYWNoZWQpOwotfQotCi1jbGFzcyBCbG9iQ2FjaGVGbGF0dGVuVGVzdCA6IHB1YmxpYyBCbG9iQ2FjaGVUZXN0IHsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIEJsb2JDYWNoZVRlc3Q6OlNldFVwKCk7Ci0gICAgICAgIG1CQzIgPSBuZXcgQmxvYkNhY2hlKE1BWF9LRVlfU0laRSwgTUFYX1ZBTFVFX1NJWkUsIE1BWF9UT1RBTF9TSVpFKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIG1CQzIuY2xlYXIoKTsKLSAgICAgICAgQmxvYkNhY2hlVGVzdDo6VGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJvdW5kVHJpcCgpIHsKLSAgICAgICAgc2l6ZV90IHNpemUgPSBtQkMtPmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICAgICAgdWludDhfdCogZmxhdCA9IG5ldyB1aW50OF90W3NpemVdOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1CQy0+ZmxhdHRlbihmbGF0LCBzaXplLCBOVUxMLCAwKSk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbUJDMi0+dW5mbGF0dGVuKGZsYXQsIHNpemUsIE5VTEwsIDApKTsKLSAgICAgICAgZGVsZXRlW10gZmxhdDsKLSAgICB9Ci0KLSAgICBzcDxCbG9iQ2FjaGU+IG1CQzI7Ci19OwotCi1URVNUX0YoQmxvYkNhY2hlRmxhdHRlblRlc3QsIEZsYXR0ZW5PbmVWYWx1ZSkgewotICAgIGNoYXIgYnVmWzRdID0geyAweGVlLCAweGVlLCAweGVlLCAweGVlIH07Ci0gICAgbUJDLT5zZXQoImFiY2QiLCA0LCAiZWZnaCIsIDQpOwotICAgIHJvdW5kVHJpcCgpOwotICAgIEFTU0VSVF9FUShzaXplX3QoNCksIG1CQzItPmdldCgiYWJjZCIsIDQsIGJ1ZiwgNCkpOwotICAgIEFTU0VSVF9FUSgnZScsIGJ1ZlswXSk7Ci0gICAgQVNTRVJUX0VRKCdmJywgYnVmWzFdKTsKLSAgICBBU1NFUlRfRVEoJ2cnLCBidWZbMl0pOwotICAgIEFTU0VSVF9FUSgnaCcsIGJ1ZlszXSk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVGbGF0dGVuVGVzdCwgRmxhdHRlbkZ1bGxDYWNoZSkgewotICAgIC8vIEZpbGwgdXAgdGhlIGVudGlyZSBjYWNoZSB3aXRoIDEgY2hhciBrZXkvdmFsdWUgcGFpcnMuCi0gICAgY29uc3QgaW50IG1heEVudHJpZXMgPSBNQVhfVE9UQUxfU0laRSAvIDI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhFbnRyaWVzOyBpKyspIHsKLSAgICAgICAgdWludDhfdCBrID0gaTsKLSAgICAgICAgbUJDLT5zZXQoJmssIDEsICZrLCAxKTsKLSAgICB9Ci0KLSAgICByb3VuZFRyaXAoKTsKLQotICAgIC8vIFZlcmlmeSB0aGUgZGVzZXJpYWxpemVkIGNhY2hlCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhFbnRyaWVzOyBpKyspIHsKLSAgICAgICAgdWludDhfdCBrID0gaTsKLSAgICAgICAgdWludDhfdCB2ID0gMHhlZTsKLSAgICAgICAgQVNTRVJUX0VRKHNpemVfdCgxKSwgbUJDMi0+Z2V0KCZrLCAxLCAmdiwgMSkpOwotICAgICAgICBBU1NFUlRfRVEoaywgdik7Ci0gICAgfQotfQotCi1URVNUX0YoQmxvYkNhY2hlRmxhdHRlblRlc3QsIEZsYXR0ZW5Eb2VzbnRDaGFuZ2VDYWNoZSkgewotICAgIC8vIEZpbGwgdXAgdGhlIGVudGlyZSBjYWNoZSB3aXRoIDEgY2hhciBrZXkvdmFsdWUgcGFpcnMuCi0gICAgY29uc3QgaW50IG1heEVudHJpZXMgPSBNQVhfVE9UQUxfU0laRSAvIDI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhFbnRyaWVzOyBpKyspIHsKLSAgICAgICAgdWludDhfdCBrID0gaTsKLSAgICAgICAgbUJDLT5zZXQoJmssIDEsICZrLCAxKTsKLSAgICB9Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IG1CQy0+Z2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgIHVpbnQ4X3QqIGZsYXQgPSBuZXcgdWludDhfdFtzaXplXTsKLSAgICBBU1NFUlRfRVEoT0ssIG1CQy0+ZmxhdHRlbihmbGF0LCBzaXplLCBOVUxMLCAwKSk7Ci0gICAgZGVsZXRlW10gZmxhdDsKLQotICAgIC8vIFZlcmlmeSB0aGUgY2FjaGUgdGhhdCB3ZSBqdXN0IHNlcmlhbGl6ZWQKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heEVudHJpZXM7IGkrKykgewotICAgICAgICB1aW50OF90IGsgPSBpOwotICAgICAgICB1aW50OF90IHYgPSAweGVlOwotICAgICAgICBBU1NFUlRfRVEoc2l6ZV90KDEpLCBtQkMtPmdldCgmaywgMSwgJnYsIDEpKTsKLSAgICAgICAgQVNTRVJUX0VRKGssIHYpOwotICAgIH0KLX0KLQotVEVTVF9GKEJsb2JDYWNoZUZsYXR0ZW5UZXN0LCBGbGF0dGVuQ2F0Y2hlc0J1ZmZlclRvb1NtYWxsKSB7Ci0gICAgLy8gRmlsbCB1cCB0aGUgZW50aXJlIGNhY2hlIHdpdGggMSBjaGFyIGtleS92YWx1ZSBwYWlycy4KLSAgICBjb25zdCBpbnQgbWF4RW50cmllcyA9IE1BWF9UT1RBTF9TSVpFIC8gMjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heEVudHJpZXM7IGkrKykgewotICAgICAgICB1aW50OF90IGsgPSBpOwotICAgICAgICBtQkMtPnNldCgmaywgMSwgJmssIDEpOwotICAgIH0KLQotICAgIHNpemVfdCBzaXplID0gbUJDLT5nZXRGbGF0dGVuZWRTaXplKCkgLSAxOwotICAgIHVpbnQ4X3QqIGZsYXQgPSBuZXcgdWludDhfdFtzaXplXTsKLSAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtQkMtPmZsYXR0ZW4oZmxhdCwgc2l6ZSwgTlVMTCwgMCkpOwotICAgIGRlbGV0ZVtdIGZsYXQ7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVGbGF0dGVuVGVzdCwgVW5mbGF0dGVuQ2F0Y2hlc0JhZE1hZ2ljKSB7Ci0gICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IG1CQy0+Z2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgIHVpbnQ4X3QqIGZsYXQgPSBuZXcgdWludDhfdFtzaXplXTsKLSAgICBBU1NFUlRfRVEoT0ssIG1CQy0+ZmxhdHRlbihmbGF0LCBzaXplLCBOVUxMLCAwKSk7Ci0gICAgZmxhdFsxXSA9IH5mbGF0WzFdOwotCi0gICAgLy8gQmFkIG1hZ2ljIHNob3VsZCBjYXVzZSBhbiBlcnJvci4KLSAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtQkMyLT51bmZsYXR0ZW4oZmxhdCwgc2l6ZSwgTlVMTCwgMCkpOwotICAgIGRlbGV0ZVtdIGZsYXQ7Ci0KLSAgICAvLyBUaGUgZXJyb3Igc2hvdWxkIGNhdXNlIHRoZSB1bmZsYXR0ZW4gdG8gcmVzdWx0IGluIGFuIGVtcHR5IGNhY2hlCi0gICAgQVNTRVJUX0VRKHNpemVfdCgwKSwgbUJDMi0+Z2V0KCJhYmNkIiwgNCwgYnVmLCA0KSk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVGbGF0dGVuVGVzdCwgVW5mbGF0dGVuQ2F0Y2hlc0JhZEJsb2JDYWNoZVZlcnNpb24pIHsKLSAgICBjaGFyIGJ1Zls0XSA9IHsgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSB9OwotICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKLQotICAgIHNpemVfdCBzaXplID0gbUJDLT5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgdWludDhfdCogZmxhdCA9IG5ldyB1aW50OF90W3NpemVdOwotICAgIEFTU0VSVF9FUShPSywgbUJDLT5mbGF0dGVuKGZsYXQsIHNpemUsIE5VTEwsIDApKTsKLSAgICBmbGF0WzVdID0gfmZsYXRbNV07Ci0KLSAgICAvLyBWZXJzaW9uIG1pc21hdGNoZXMgc2hvdWxkbid0IGNhdXNlIGVycm9ycywgYnV0IHNob3VsZCBub3QgdXNlIHRoZQotICAgIC8vIHNlcmlhbGl6ZWQgZW50cmllcwotICAgIEFTU0VSVF9FUShPSywgbUJDMi0+dW5mbGF0dGVuKGZsYXQsIHNpemUsIE5VTEwsIDApKTsKLSAgICBkZWxldGVbXSBmbGF0OwotCi0gICAgLy8gVGhlIHZlcnNpb24gbWlzbWF0Y2ggc2hvdWxkIGNhdXNlIHRoZSB1bmZsYXR0ZW4gdG8gcmVzdWx0IGluIGFuIGVtcHR5Ci0gICAgLy8gY2FjaGUKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDApLCBtQkMyLT5nZXQoImFiY2QiLCA0LCBidWYsIDQpKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZUZsYXR0ZW5UZXN0LCBVbmZsYXR0ZW5DYXRjaGVzQmFkQmxvYkNhY2hlRGV2aWNlVmVyc2lvbikgewotICAgIGNoYXIgYnVmWzRdID0geyAweGVlLCAweGVlLCAweGVlLCAweGVlIH07Ci0gICAgbUJDLT5zZXQoImFiY2QiLCA0LCAiZWZnaCIsIDQpOwotCi0gICAgc2l6ZV90IHNpemUgPSBtQkMtPmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICB1aW50OF90KiBmbGF0ID0gbmV3IHVpbnQ4X3Rbc2l6ZV07Ci0gICAgQVNTRVJUX0VRKE9LLCBtQkMtPmZsYXR0ZW4oZmxhdCwgc2l6ZSwgTlVMTCwgMCkpOwotICAgIGZsYXRbMTBdID0gfmZsYXRbMTBdOwotCi0gICAgLy8gVmVyc2lvbiBtaXNtYXRjaGVzIHNob3VsZG4ndCBjYXVzZSBlcnJvcnMsIGJ1dCBzaG91bGQgbm90IHVzZSB0aGUKLSAgICAvLyBzZXJpYWxpemVkIGVudHJpZXMKLSAgICBBU1NFUlRfRVEoT0ssIG1CQzItPnVuZmxhdHRlbihmbGF0LCBzaXplLCBOVUxMLCAwKSk7Ci0gICAgZGVsZXRlW10gZmxhdDsKLQotICAgIC8vIFRoZSB2ZXJzaW9uIG1pc21hdGNoIHNob3VsZCBjYXVzZSB0aGUgdW5mbGF0dGVuIHRvIHJlc3VsdCBpbiBhbiBlbXB0eQotICAgIC8vIGNhY2hlCi0gICAgQVNTRVJUX0VRKHNpemVfdCgwKSwgbUJDMi0+Z2V0KCJhYmNkIiwgNCwgYnVmLCA0KSk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVGbGF0dGVuVGVzdCwgVW5mbGF0dGVuQ2F0Y2hlc0J1ZmZlclRvb1NtYWxsKSB7Ci0gICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IG1CQy0+Z2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgIHVpbnQ4X3QqIGZsYXQgPSBuZXcgdWludDhfdFtzaXplXTsKLSAgICBBU1NFUlRfRVEoT0ssIG1CQy0+ZmxhdHRlbihmbGF0LCBzaXplLCBOVUxMLCAwKSk7Ci0KLSAgICAvLyBBIGJ1ZmZlciB0cnVuY2F0aW9uIHNob3VsZHQgY2F1c2UgYW4gZXJyb3IKLSAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtQkMyLT51bmZsYXR0ZW4oZmxhdCwgc2l6ZS0xLCBOVUxMLCAwKSk7Ci0gICAgZGVsZXRlW10gZmxhdDsKLQotICAgIC8vIFRoZSBlcnJvciBzaG91bGQgY2F1c2UgdGhlIHVuZmxhdHRlbiB0byByZXN1bHQgaW4gYW4gZW1wdHkgY2FjaGUKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDApLCBtQkMyLT5nZXQoImFiY2QiLCA0LCBidWYsIDQpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy90ZXN0cy9Mb29wZXJfdGVzdC5jcHAgYi9saWJzL3V0aWxzL3Rlc3RzL0xvb3Blcl90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMmJhMi4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL3Rlc3RzL0xvb3Blcl90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLQotI2luY2x1ZGUgPHV0aWxzL0xvb3Blci5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0b3BXYXRjaC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiVGVzdEhlbHBlcnMuaCIKLQotLy8gIyBvZiBtaWxsaXNlY29uZHMgdG8gZnVkZ2Ugc3RvcHdhdGNoIG1lYXN1cmVtZW50cwotI2RlZmluZSBUSU1JTkdfVE9MRVJBTkNFX01TIDI1Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgTVNHX1RFU1QxID0gMSwKLSAgICBNU0dfVEVTVDIgPSAyLAotICAgIE1TR19URVNUMyA9IDMsCi0gICAgTVNHX1RFU1Q0ID0gNCwKLX07Ci0KLWNsYXNzIERlbGF5ZWRXYWtlIDogcHVibGljIERlbGF5ZWRUYXNrIHsKLSAgICBzcDxMb29wZXI+IG1Mb29wZXI7Ci0KLXB1YmxpYzoKLSAgICBEZWxheWVkV2FrZShpbnQgZGVsYXlNaWxsaXMsIGNvbnN0IHNwPExvb3Blcj4gbG9vcGVyKSA6Ci0gICAgICAgIERlbGF5ZWRUYXNrKGRlbGF5TWlsbGlzKSwgbUxvb3Blcihsb29wZXIpIHsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgZG9UYXNrKCkgewotICAgICAgICBtTG9vcGVyLT53YWtlKCk7Ci0gICAgfQotfTsKLQotY2xhc3MgRGVsYXllZFdyaXRlU2lnbmFsIDogcHVibGljIERlbGF5ZWRUYXNrIHsKLSAgICBQaXBlKiBtUGlwZTsKLQotcHVibGljOgotICAgIERlbGF5ZWRXcml0ZVNpZ25hbChpbnQgZGVsYXlNaWxsaXMsIFBpcGUqIHBpcGUpIDoKLSAgICAgICAgRGVsYXllZFRhc2soZGVsYXlNaWxsaXMpLCBtUGlwZShwaXBlKSB7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIGRvVGFzaygpIHsKLSAgICAgICAgbVBpcGUtPndyaXRlU2lnbmFsKCk7Ci0gICAgfQotfTsKLQotY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIHsKLXB1YmxpYzoKLSAgICB2b2lkIHNldENhbGxiYWNrKGNvbnN0IHNwPExvb3Blcj4mIGxvb3BlciwgaW50IGZkLCBpbnQgZXZlbnRzKSB7Ci0gICAgICAgIGxvb3Blci0+YWRkRmQoZmQsIDAsIGV2ZW50cywgc3RhdGljSGFuZGxlciwgdGhpcyk7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+Q2FsbGJhY2tIYW5kbGVyKCkgeyB9Ci0KLSAgICB2aXJ0dWFsIGludCBoYW5kbGVyKGludCBmZCwgaW50IGV2ZW50cykgPSAwOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBpbnQgc3RhdGljSGFuZGxlcihpbnQgZmQsIGludCBldmVudHMsIHZvaWQqIGRhdGEpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENhbGxiYWNrSGFuZGxlcio+KGRhdGEpLT5oYW5kbGVyKGZkLCBldmVudHMpOwotICAgIH0KLX07Ci0KLWNsYXNzIFN0dWJDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQ2FsbGJhY2tIYW5kbGVyIHsKLXB1YmxpYzoKLSAgICBpbnQgbmV4dFJlc3VsdDsKLSAgICBpbnQgY2FsbGJhY2tDb3VudDsKLQotICAgIGludCBmZDsKLSAgICBpbnQgZXZlbnRzOwotCi0gICAgU3R1YkNhbGxiYWNrSGFuZGxlcihpbnQgbmV4dFJlc3VsdCkgOiBuZXh0UmVzdWx0KG5leHRSZXN1bHQpLAotICAgICAgICAgICAgY2FsbGJhY2tDb3VudCgwKSwgZmQoLTEpLCBldmVudHMoLTEpIHsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGludCBoYW5kbGVyKGludCBmZCwgaW50IGV2ZW50cykgewotICAgICAgICBjYWxsYmFja0NvdW50ICs9IDE7Ci0gICAgICAgIHRoaXMtPmZkID0gZmQ7Ci0gICAgICAgIHRoaXMtPmV2ZW50cyA9IGV2ZW50czsKLSAgICAgICAgcmV0dXJuIG5leHRSZXN1bHQ7Ci0gICAgfQotfTsKLQotY2xhc3MgU3R1Yk1lc3NhZ2VIYW5kbGVyIDogcHVibGljIE1lc3NhZ2VIYW5kbGVyIHsKLXB1YmxpYzoKLSAgICBWZWN0b3I8TWVzc2FnZT4gbWVzc2FnZXM7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7Ci0gICAgICAgIG1lc3NhZ2VzLnB1c2gobWVzc2FnZSk7Ci0gICAgfQotfTsKLQotY2xhc3MgTG9vcGVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLXByb3RlY3RlZDoKLSAgICBzcDxMb29wZXI+IG1Mb29wZXI7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIG1Mb29wZXIgPSBuZXcgTG9vcGVyKHRydWUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgbUxvb3Blci5jbGVhcigpOwotICAgIH0KLX07Ci0KLQotVEVTVF9GKExvb3BlclRlc3QsIFBvbGxPbmNlX1doZW5Ob25aZXJvVGltZW91dEFuZE5vdEF3b2tlbl9XYWl0c0ZvclRpbWVvdXQpIHsKLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDEwMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gZXF1YWwgdGltZW91dCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9USU1FT1VULCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfVElNRU9VVCI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBQb2xsT25jZV9XaGVuTm9uWmVyb1RpbWVvdXRBbmRBd29rZW5CZWZvcmVXYWl0aW5nX0ltbWVkaWF0ZWx5UmV0dXJucykgewotICAgIG1Mb29wZXItPndha2UoKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIHplcm8gYmVjYXVzZSB3YWtlKCkgd2FzIGNhbGxlZCBiZWZvcmUgd2FpdGluZyI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9XQUtFLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgYmVjYXVzZSBsb29wIHdhcyBhd29rZW4iOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUG9sbE9uY2VfV2hlbk5vblplcm9UaW1lb3V0QW5kQXdva2VuV2hpbGVXYWl0aW5nX1Byb21wdGx5UmV0dXJucykgewotICAgIHNwPERlbGF5ZWRXYWtlPiBkZWxheWVkV2FrZSA9IG5ldyBEZWxheWVkV2FrZSgxMDAsIG1Mb29wZXIpOwotICAgIGRlbGF5ZWRXYWtlLT5ydW4oKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDEwMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gZXF1YWwgd2FrZSBkZWxheSI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9XQUtFLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgYmVjYXVzZSBsb29wIHdhcyBhd29rZW4iOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUG9sbE9uY2VfV2hlblplcm9UaW1lb3V0QW5kTm9SZWdpc3RlcmVkRkRzX0ltbWVkaWF0ZWx5UmV0dXJucykgewotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBiZSBhcHByb3guIHplcm8iOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfVElNRU9VVCwgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX1RJTUVPVVQiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUG9sbE9uY2VfV2hlblplcm9UaW1lb3V0QW5kTm9TaWduYWxsZWRGRHNfSW1tZWRpYXRlbHlSZXR1cm5zKSB7Ci0gICAgUGlwZSBwaXBlOwotICAgIFN0dWJDYWxsYmFja0hhbmRsZXIgaGFuZGxlcih0cnVlKTsKLQotICAgIGhhbmRsZXIuc2V0Q2FsbGJhY2sobUxvb3BlciwgcGlwZS5yZWNlaXZlRmQsIEFMT09QRVJfRVZFTlRfSU5QVVQpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGJlIGFwcHJveC4gemVybyI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9USU1FT1VULCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfVElNRU9VVCI7Ci0gICAgRVhQRUNUX0VRKDAsIGhhbmRsZXIuY2FsbGJhY2tDb3VudCkKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgbm90IGhhdmUgYmVlbiBpbnZva2VkIGJlY2F1c2UgRkQgd2FzIG5vdCBzaWduYWxsZWQiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUG9sbE9uY2VfV2hlblplcm9UaW1lb3V0QW5kU2lnbmFsbGVkRkRfSW1tZWRpYXRlbHlJbnZva2VzQ2FsbGJhY2tBbmRSZXR1cm5zKSB7Ci0gICAgUGlwZSBwaXBlOwotICAgIFN0dWJDYWxsYmFja0hhbmRsZXIgaGFuZGxlcih0cnVlKTsKLQotICAgIEFTU0VSVF9FUShPSywgcGlwZS53cml0ZVNpZ25hbCgpKTsKLSAgICBoYW5kbGVyLnNldENhbGxiYWNrKG1Mb29wZXIsIHBpcGUucmVjZWl2ZUZkLCBBTE9PUEVSX0VWRU5UX0lOUFVUKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBiZSBhcHByb3guIHplcm8iOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfQ0FMTEJBQ0ssIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBiZWNhdXNlIEZEIHdhcyBzaWduYWxsZWQiOwotICAgIEVYUEVDVF9FUSgxLCBoYW5kbGVyLmNhbGxiYWNrQ291bnQpCi0gICAgICAgICAgICA8PCAiY2FsbGJhY2sgc2hvdWxkIGJlIGludm9rZWQgZXhhY3RseSBvbmNlIjsKLSAgICBFWFBFQ1RfRVEocGlwZS5yZWNlaXZlRmQsIGhhbmRsZXIuZmQpCi0gICAgICAgICAgICA8PCAiY2FsbGJhY2sgc2hvdWxkIGhhdmUgcmVjZWl2ZWQgcGlwZSBmZCBhcyBwYXJhbWV0ZXIiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX0VWRU5UX0lOUFVULCBoYW5kbGVyLmV2ZW50cykKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgaGF2ZSByZWNlaXZlZCBBTE9PUEVSX0VWRU5UX0lOUFVUIGFzIGV2ZW50cyI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBQb2xsT25jZV9XaGVuTm9uWmVyb1RpbWVvdXRBbmROb1NpZ25hbGxlZEZEc19XYWl0c0ZvclRpbWVvdXRBbmRSZXR1cm5zKSB7Ci0gICAgUGlwZSBwaXBlOwotICAgIFN0dWJDYWxsYmFja0hhbmRsZXIgaGFuZGxlcih0cnVlKTsKLQotICAgIGhhbmRsZXIuc2V0Q2FsbGJhY2sobUxvb3BlciwgcGlwZS5yZWNlaXZlRmQsIEFMT09QRVJfRVZFTlRfSU5QVVQpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBFWFBFQ1RfTkVBUigxMDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIGVxdWFsIHRpbWVvdXQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfVElNRU9VVCwgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX1RJTUVPVVQiOwotICAgIEVYUEVDVF9FUSgwLCBoYW5kbGVyLmNhbGxiYWNrQ291bnQpCi0gICAgICAgICAgICA8PCAiY2FsbGJhY2sgc2hvdWxkIG5vdCBoYXZlIGJlZW4gaW52b2tlZCBiZWNhdXNlIEZEIHdhcyBub3Qgc2lnbmFsbGVkIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFBvbGxPbmNlX1doZW5Ob25aZXJvVGltZW91dEFuZFNpZ25hbGxlZEZEQmVmb3JlV2FpdGluZ19JbW1lZGlhdGVseUludm9rZXNDYWxsYmFja0FuZFJldHVybnMpIHsKLSAgICBQaXBlIHBpcGU7Ci0gICAgU3R1YkNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKHRydWUpOwotCi0gICAgcGlwZS53cml0ZVNpZ25hbCgpOwotICAgIGhhbmRsZXIuc2V0Q2FsbGJhY2sobUxvb3BlciwgcGlwZS5yZWNlaXZlRmQsIEFMT09QRVJfRVZFTlRfSU5QVVQpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIHBpcGUucmVhZFNpZ25hbCgpKQotICAgICAgICAgICAgPDwgInNpZ25hbCBzaG91bGQgYWN0dWFsbHkgaGF2ZSBiZWVuIHdyaXR0ZW4iOwotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBiZSBhcHByb3guIHplcm8iOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfQ0FMTEJBQ0ssIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBiZWNhdXNlIEZEIHdhcyBzaWduYWxsZWQiOwotICAgIEVYUEVDVF9FUSgxLCBoYW5kbGVyLmNhbGxiYWNrQ291bnQpCi0gICAgICAgICAgICA8PCAiY2FsbGJhY2sgc2hvdWxkIGJlIGludm9rZWQgZXhhY3RseSBvbmNlIjsKLSAgICBFWFBFQ1RfRVEocGlwZS5yZWNlaXZlRmQsIGhhbmRsZXIuZmQpCi0gICAgICAgICAgICA8PCAiY2FsbGJhY2sgc2hvdWxkIGhhdmUgcmVjZWl2ZWQgcGlwZSBmZCBhcyBwYXJhbWV0ZXIiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX0VWRU5UX0lOUFVULCBoYW5kbGVyLmV2ZW50cykKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgaGF2ZSByZWNlaXZlZCBBTE9PUEVSX0VWRU5UX0lOUFVUIGFzIGV2ZW50cyI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBQb2xsT25jZV9XaGVuTm9uWmVyb1RpbWVvdXRBbmRTaWduYWxsZWRGRFdoaWxlV2FpdGluZ19Qcm9tcHRseUludm9rZXNDYWxsYmFja0FuZFJldHVybnMpIHsKLSAgICBQaXBlIHBpcGU7Ci0gICAgU3R1YkNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKHRydWUpOwotICAgIHNwPERlbGF5ZWRXcml0ZVNpZ25hbD4gZGVsYXllZFdyaXRlU2lnbmFsID0gbmV3IERlbGF5ZWRXcml0ZVNpZ25hbCgxMDAsICYgcGlwZSk7Ci0KLSAgICBoYW5kbGVyLnNldENhbGxiYWNrKG1Mb29wZXIsIHBpcGUucmVjZWl2ZUZkLCBBTE9PUEVSX0VWRU5UX0lOUFVUKTsKLSAgICBkZWxheWVkV3JpdGVTaWduYWwtPnJ1bigpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBwaXBlLnJlYWRTaWduYWwoKSkKLSAgICAgICAgICAgIDw8ICJzaWduYWwgc2hvdWxkIGFjdHVhbGx5IGhhdmUgYmVlbiB3cml0dGVuIjsKLSAgICBFWFBFQ1RfTkVBUigxMDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIGVxdWFsIHNpZ25hbCBkZWxheSI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9DQUxMQkFDSywgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGJlY2F1c2UgRkQgd2FzIHNpZ25hbGxlZCI7Ci0gICAgRVhQRUNUX0VRKDEsIGhhbmRsZXIuY2FsbGJhY2tDb3VudCkKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZCBleGFjdGx5IG9uY2UiOwotICAgIEVYUEVDVF9FUShwaXBlLnJlY2VpdmVGZCwgaGFuZGxlci5mZCkKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgaGF2ZSByZWNlaXZlZCBwaXBlIGZkIGFzIHBhcmFtZXRlciI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfRVZFTlRfSU5QVVQsIGhhbmRsZXIuZXZlbnRzKQotICAgICAgICAgICAgPDwgImNhbGxiYWNrIHNob3VsZCBoYXZlIHJlY2VpdmVkIEFMT09QRVJfRVZFTlRfSU5QVVQgYXMgZXZlbnRzIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFBvbGxPbmNlX1doZW5DYWxsYmFja0FkZGVkVGhlblJlbW92ZWRfQ2FsbGJhY2tTaG91bGROb3RCZUludm9rZWQpIHsKLSAgICBQaXBlIHBpcGU7Ci0gICAgU3R1YkNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKHRydWUpOwotCi0gICAgaGFuZGxlci5zZXRDYWxsYmFjayhtTG9vcGVyLCBwaXBlLnJlY2VpdmVGZCwgQUxPT1BFUl9FVkVOVF9JTlBVVCk7Ci0gICAgcGlwZS53cml0ZVNpZ25hbCgpOyAvLyB3b3VsZCBjYXVzZSBGRCB0byBiZSBjb25zaWRlcmVkIHNpZ25hbGxlZAotICAgIG1Mb29wZXItPnJlbW92ZUZkKHBpcGUucmVjZWl2ZUZkKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBwaXBlLnJlYWRTaWduYWwoKSkKLSAgICAgICAgICAgIDw8ICJzaWduYWwgc2hvdWxkIGFjdHVhbGx5IGhhdmUgYmVlbiB3cml0dGVuIjsKLSAgICBFWFBFQ1RfTkVBUigxMDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIGVxdWFsIHRpbWVvdXQgYmVjYXVzZSBGRCB3YXMgbm8gbG9uZ2VyIHJlZ2lzdGVyZWQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfVElNRU9VVCwgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX1RJTUVPVVQiOwotICAgIEVYUEVDVF9FUSgwLCBoYW5kbGVyLmNhbGxiYWNrQ291bnQpCi0gICAgICAgICAgICA8PCAiY2FsbGJhY2sgc2hvdWxkIG5vdCBiZSBpbnZva2VkIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFBvbGxPbmNlX1doZW5DYWxsYmFja1JldHVybnNGYWxzZV9DYWxsYmFja1Nob3VsZE5vdEJlSW52b2tlZEFnYWluTGF0ZXIpIHsKLSAgICBQaXBlIHBpcGU7Ci0gICAgU3R1YkNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKGZhbHNlKTsKLQotICAgIGhhbmRsZXIuc2V0Q2FsbGJhY2sobUxvb3BlciwgcGlwZS5yZWNlaXZlRmQsIEFMT09QRVJfRVZFTlRfSU5QVVQpOwotCi0gICAgLy8gRmlyc3QgbG9vcDogQ2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCBhbmQgRkQgaXMgc2lnbmFsbGVkLgotICAgIHBpcGUud3JpdGVTaWduYWwoKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEFTU0VSVF9FUShPSywgcGlwZS5yZWFkU2lnbmFsKCkpCi0gICAgICAgICAgICA8PCAic2lnbmFsIHNob3VsZCBhY3R1YWxseSBoYXZlIGJlZW4gd3JpdHRlbiI7Ci0gICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gZXF1YWwgemVybyBiZWNhdXNlIEZEIHdhcyBhbHJlYWR5IHNpZ25hbGxlZCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9DQUxMQkFDSywgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGJlY2F1c2UgRkQgd2FzIHNpZ25hbGxlZCI7Ci0gICAgRVhQRUNUX0VRKDEsIGhhbmRsZXIuY2FsbGJhY2tDb3VudCkKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZCI7Ci0KLSAgICAvLyBTZWNvbmQgbG9vcDogQ2FsbGJhY2sgaXMgbm8gbG9uZ2VyIHJlZ2lzdGVyZWQgYW5kIEZEIGlzIHNpZ25hbGxlZC4KLSAgICBwaXBlLndyaXRlU2lnbmFsKCk7Ci0KLSAgICBzdG9wV2F0Y2gucmVzZXQoKTsKLSAgICByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgwKTsKLSAgICBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBwaXBlLnJlYWRTaWduYWwoKSkKLSAgICAgICAgICAgIDw8ICJzaWduYWwgc2hvdWxkIGFjdHVhbGx5IGhhdmUgYmVlbiB3cml0dGVuIjsKLSAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiBlcXVhbCB6ZXJvIGJlY2F1c2UgdGltZW91dCB3YXMgemVybyI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9USU1FT1VULCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfVElNRU9VVCI7Ci0gICAgRVhQRUNUX0VRKDEsIGhhbmRsZXIuY2FsbGJhY2tDb3VudCkKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgbm90IGJlIGludm9rZWQgdGhpcyB0aW1lIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFBvbGxPbmNlX1doZW5Ob25DYWxsYmFja0ZkSXNTaWduYWxsZWRfUmV0dXJuc0lkZW50KSB7Ci0gICAgY29uc3QgaW50IGV4cGVjdGVkSWRlbnQgPSA1OwotICAgIHZvaWQqIGV4cGVjdGVkRGF0YSA9IHRoaXM7Ci0KLSAgICBQaXBlIHBpcGU7Ci0KLSAgICBwaXBlLndyaXRlU2lnbmFsKCk7Ci0gICAgbUxvb3Blci0+YWRkRmQocGlwZS5yZWNlaXZlRmQsIGV4cGVjdGVkSWRlbnQsIEFMT09QRVJfRVZFTlRfSU5QVVQsIE5VTEwsIGV4cGVjdGVkRGF0YSk7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCBmZDsKLSAgICBpbnQgZXZlbnRzOwotICAgIHZvaWQqIGRhdGE7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMCwgJmZkLCAmZXZlbnRzLCAmZGF0YSk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBwaXBlLnJlYWRTaWduYWwoKSkKLSAgICAgICAgICAgIDw8ICJzaWduYWwgc2hvdWxkIGFjdHVhbGx5IGhhdmUgYmVlbiB3cml0dGVuIjsKLSAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYmUgYXBwcm94LiB6ZXJvIjsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRJZGVudCwgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgdGhlIGlkZW50IG9mIHRoZSBGRCB0aGF0IHdhcyBzaWduYWxsZWQiOwotICAgIEVYUEVDVF9FUShwaXBlLnJlY2VpdmVGZCwgZmQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2Ugc2hvdWxkIGhhdmUgcmV0dXJuZWQgdGhlIHJlY2VpdmVkIHBpcGUgZmQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX0VWRU5UX0lOUFVULCBldmVudHMpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2Ugc2hvdWxkIGhhdmUgcmV0dXJuZWQgQUxPT1BFUl9FVkVOVF9JTlBVVCBhcyBldmVudHMiOwotICAgIEVYUEVDVF9FUShleHBlY3RlZERhdGEsIGRhdGEpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2Ugc2hvdWxkIGhhdmUgcmV0dXJuZWQgdGhlIGRhdGEiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgQWRkRmRfV2hlbkNhbGxiYWNrQWRkZWRfUmV0dXJuc09uZSkgewotICAgIFBpcGUgcGlwZTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+YWRkRmQocGlwZS5yZWNlaXZlRmQsIDAsIEFMT09QRVJfRVZFTlRfSU5QVVQsIE5VTEwsIE5VTEwpOwotCi0gICAgRVhQRUNUX0VRKDEsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJhZGRGZCBzaG91bGQgcmV0dXJuIDEgYmVjYXVzZSBGRCB3YXMgYWRkZWQiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgQWRkRmRfV2hlbklkZW50SXNOZWdhdGl2ZUFuZENhbGxiYWNrSXNOdWxsX1JldHVybnNFcnJvcikgewotICAgIFBpcGUgcGlwZTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+YWRkRmQocGlwZS5yZWNlaXZlRmQsIC0xLCBBTE9PUEVSX0VWRU5UX0lOUFVULCBOVUxMLCBOVUxMKTsKLQotICAgIEVYUEVDVF9FUSgtMSwgcmVzdWx0KQotICAgICAgICAgICAgPDwgImFkZEZkIHNob3VsZCByZXR1cm4gLTEgYmVjYXVzZSBhcmd1bWVudHMgd2VyZSBpbnZhbGlkIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIEFkZEZkX1doZW5Ob0NhbGxiYWNrQW5kQWxsb3dOb25DYWxsYmFja3NJc0ZhbHNlX1JldHVybnNFcnJvcikgewotICAgIFBpcGUgcGlwZTsKLSAgICBzcDxMb29wZXI+IGxvb3BlciA9IG5ldyBMb29wZXIoZmFsc2UgLyphbGxvd05vbkNhbGxiYWNrcyovKTsKLSAgICBpbnQgcmVzdWx0ID0gbG9vcGVyLT5hZGRGZChwaXBlLnJlY2VpdmVGZCwgMCwgMCwgTlVMTCwgTlVMTCk7Ci0KLSAgICBFWFBFQ1RfRVEoLTEsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJhZGRGZCBzaG91bGQgcmV0dXJuIC0xIGJlY2F1c2UgYXJndW1lbnRzIHdlcmUgaW52YWxpZCI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBSZW1vdmVGZF9XaGVuQ2FsbGJhY2tOb3RBZGRlZF9SZXR1cm5zWmVybykgewotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5yZW1vdmVGZCgxKTsKLQotICAgIEVYUEVDVF9FUSgwLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicmVtb3ZlRmQgc2hvdWxkIHJldHVybiAwIGJlY2F1c2UgRkQgbm90IHJlZ2lzdGVyZWQiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUmVtb3ZlRmRfV2hlbkNhbGxiYWNrQWRkZWRUaGVuUmVtb3ZlZFR3aWNlX1JldHVybnNPbmNlRmlyc3RUaW1lQW5kUmV0dXJuc1plcm9TZWNvbmRUaW1lKSB7Ci0gICAgUGlwZSBwaXBlOwotICAgIFN0dWJDYWxsYmFja0hhbmRsZXIgaGFuZGxlcihmYWxzZSk7Ci0gICAgaGFuZGxlci5zZXRDYWxsYmFjayhtTG9vcGVyLCBwaXBlLnJlY2VpdmVGZCwgQUxPT1BFUl9FVkVOVF9JTlBVVCk7Ci0KLSAgICAvLyBGaXJzdCB0aW1lLgotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5yZW1vdmVGZChwaXBlLnJlY2VpdmVGZCk7Ci0KLSAgICBFWFBFQ1RfRVEoMSwgcmVzdWx0KQotICAgICAgICAgICAgPDwgInJlbW92ZUZkIHNob3VsZCByZXR1cm4gMSBmaXJzdCB0aW1lIGJlY2F1c2UgRkQgd2FzIHJlZ2lzdGVyZWQiOwotCi0gICAgLy8gU2Vjb25kIHRpbWUuCi0gICAgcmVzdWx0ID0gbUxvb3Blci0+cmVtb3ZlRmQocGlwZS5yZWNlaXZlRmQpOwotCi0gICAgRVhQRUNUX0VRKDAsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJyZW1vdmVGZCBzaG91bGQgcmV0dXJuIDAgc2Vjb25kIHRpbWUgYmVjYXVzZSBGRCB3YXMgbm8gbG9uZ2VyIHJlZ2lzdGVyZWQiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUG9sbE9uY2VfV2hlbkNhbGxiYWNrQWRkZWRUd2ljZV9Pbmx5U2Vjb25kQ2FsbGJhY2tTaG91bGRCZUludm9rZWQpIHsKLSAgICBQaXBlIHBpcGU7Ci0gICAgU3R1YkNhbGxiYWNrSGFuZGxlciBoYW5kbGVyMSh0cnVlKTsKLSAgICBTdHViQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIyKHRydWUpOwotCi0gICAgaGFuZGxlcjEuc2V0Q2FsbGJhY2sobUxvb3BlciwgcGlwZS5yZWNlaXZlRmQsIEFMT09QRVJfRVZFTlRfSU5QVVQpOwotICAgIGhhbmRsZXIyLnNldENhbGxiYWNrKG1Mb29wZXIsIHBpcGUucmVjZWl2ZUZkLCBBTE9PUEVSX0VWRU5UX0lOUFVUKTsgLy8gcmVwbGFjZSBpdAotICAgIHBpcGUud3JpdGVTaWduYWwoKTsgLy8gd291bGQgY2F1c2UgRkQgdG8gYmUgY29uc2lkZXJlZCBzaWduYWxsZWQKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBwaXBlLnJlYWRTaWduYWwoKSkKLSAgICAgICAgICAgIDw8ICJzaWduYWwgc2hvdWxkIGFjdHVhbGx5IGhhdmUgYmVlbiB3cml0dGVuIjsKLSAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiB6ZXJvIGJlY2F1c2UgRkQgd2FzIGFscmVhZHkgc2lnbmFsbGVkIjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX0NBTExCQUNLLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgYmVjYXVzZSBGRCB3YXMgc2lnbmFsbGVkIjsKLSAgICBFWFBFQ1RfRVEoMCwgaGFuZGxlcjEuY2FsbGJhY2tDb3VudCkKLSAgICAgICAgICAgIDw8ICJvcmlnaW5hbCBoYW5kbGVyIGNhbGxiYWNrIHNob3VsZCBub3QgYmUgaW52b2tlZCBiZWNhdXNlIGl0IHdhcyByZXBsYWNlZCI7Ci0gICAgRVhQRUNUX0VRKDEsIGhhbmRsZXIyLmNhbGxiYWNrQ291bnQpCi0gICAgICAgICAgICA8PCAicmVwbGFjZW1lbnQgaGFuZGxlciBjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZCI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBTZW5kTWVzc2FnZV9XaGVuT25lTWVzc2FnZUlzRW5xdWV1ZV9TaG91bGRJbnZva2VIYW5kbGVyRHVyaW5nTmV4dFBvbGwpIHsKLSAgICBzcDxTdHViTWVzc2FnZUhhbmRsZXI+IGhhbmRsZXIgPSBuZXcgU3R1Yk1lc3NhZ2VIYW5kbGVyKCk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2UoaGFuZGxlciwgTWVzc2FnZShNU0dfVEVTVDEpKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gemVybyBiZWNhdXNlIG1lc3NhZ2Ugd2FzIGFscmVhZHkgc2VudCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9DQUxMQkFDSywgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGJlY2F1c2UgbWVzc2FnZSB3YXMgc2VudCI7Ci0gICAgRVhQRUNUX0VRKHNpemVfdCgxKSwgaGFuZGxlci0+bWVzc2FnZXMuc2l6ZSgpKQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci0gICAgRVhQRUNUX0VRKE1TR19URVNUMSwgaGFuZGxlci0+bWVzc2FnZXNbMF0ud2hhdCkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgU2VuZE1lc3NhZ2VfV2hlbk11bHRpcGxlTWVzc2FnZXNBcmVFbnF1ZXVlZF9TaG91bGRJbnZva2VIYW5kbGVyc0luT3JkZXJEdXJpbmdOZXh0UG9sbCkgewotICAgIHNwPFN0dWJNZXNzYWdlSGFuZGxlcj4gaGFuZGxlcjEgPSBuZXcgU3R1Yk1lc3NhZ2VIYW5kbGVyKCk7Ci0gICAgc3A8U3R1Yk1lc3NhZ2VIYW5kbGVyPiBoYW5kbGVyMiA9IG5ldyBTdHViTWVzc2FnZUhhbmRsZXIoKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShoYW5kbGVyMSwgTWVzc2FnZShNU0dfVEVTVDEpKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShoYW5kbGVyMiwgTWVzc2FnZShNU0dfVEVTVDIpKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShoYW5kbGVyMSwgTWVzc2FnZShNU0dfVEVTVDMpKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShoYW5kbGVyMSwgTWVzc2FnZShNU0dfVEVTVDQpKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIHplcm8gYmVjYXVzZSBtZXNzYWdlIHdhcyBhbHJlYWR5IHNlbnQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfQ0FMTEJBQ0ssIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBiZWNhdXNlIG1lc3NhZ2Ugd2FzIHNlbnQiOwotICAgIEVYUEVDVF9FUShzaXplX3QoMyksIGhhbmRsZXIxLT5tZXNzYWdlcy5zaXplKCkpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLSAgICBFWFBFQ1RfRVEoTVNHX1RFU1QxLCBoYW5kbGVyMS0+bWVzc2FnZXNbMF0ud2hhdCkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotICAgIEVYUEVDVF9FUShNU0dfVEVTVDMsIGhhbmRsZXIxLT5tZXNzYWdlc1sxXS53aGF0KQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci0gICAgRVhQRUNUX0VRKE1TR19URVNUNCwgaGFuZGxlcjEtPm1lc3NhZ2VzWzJdLndoYXQpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLSAgICBFWFBFQ1RfRVEoc2l6ZV90KDEpLCBoYW5kbGVyMi0+bWVzc2FnZXMuc2l6ZSgpKQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci0gICAgRVhQRUNUX0VRKE1TR19URVNUMiwgaGFuZGxlcjItPm1lc3NhZ2VzWzBdLndoYXQpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFNlbmRNZXNzYWdlRGVsYXllZF9XaGVuU2VudFRvVGhlRnV0dXJlX1Nob3VsZEludm9rZUhhbmRsZXJBZnRlckRlbGF5VGltZSkgewotICAgIHNwPFN0dWJNZXNzYWdlSGFuZGxlcj4gaGFuZGxlciA9IG5ldyBTdHViTWVzc2FnZUhhbmRsZXIoKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZURlbGF5ZWQobXMybnMoMTAwKSwgaGFuZGxlciwgTWVzc2FnZShNU0dfVEVTVDEpKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZmlyc3QgcG9sbCBzaG91bGQgZW5kIHF1aWNrbHkgYmVjYXVzZSBuZXh0IG1lc3NhZ2UgdGltZW91dCB3YXMgY29tcHV0ZWQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfV0FLRSwgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX1dBS0UgZHVlIHRvIHdha2V1cCI7Ci0gICAgRVhQRUNUX0VRKHNpemVfdCgwKSwgaGFuZGxlci0+bWVzc2FnZXMuc2l6ZSgpKQotICAgICAgICAgICAgPDwgIm5vIG1lc3NhZ2UgaGFuZGxlZCB5ZXQiOwotCi0gICAgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwMCk7Ci0gICAgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9FUShzaXplX3QoMSksIGhhbmRsZXItPm1lc3NhZ2VzLnNpemUoKSkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotICAgIEVYUEVDVF9FUShNU0dfVEVTVDEsIGhhbmRsZXItPm1lc3NhZ2VzWzBdLndoYXQpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLSAgICBFWFBFQ1RfTkVBUigxMDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAic2Vjb25kIHBvbGwgc2hvdWxkIGVuZCBhcm91bmQgdGhlIHRpbWUgb2YgdGhlIGRlbGF5ZWQgbWVzc2FnZSBkaXNwYXRjaCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9DQUxMQkFDSywgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGJlY2F1c2UgbWVzc2FnZSB3YXMgc2VudCI7Ci0KLSAgICByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDApOwotICAgIGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBFWFBFQ1RfTkVBUigxMDAgKyAxMDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAidGhpcmQgcG9sbCBzaG91bGQgdGltZW91dCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9USU1FT1VULCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfVElNRU9VVCBiZWNhdXNlIHRoZXJlIHdlcmUgbm8gbWVzc2FnZXMgbGVmdCI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBTZW5kTWVzc2FnZURlbGF5ZWRfV2hlblNlbnRUb1RoZVBhc3RfU2hvdWxkSW52b2tlSGFuZGxlckR1cmluZ05leHRQb2xsKSB7Ci0gICAgc3A8U3R1Yk1lc3NhZ2VIYW5kbGVyPiBoYW5kbGVyID0gbmV3IFN0dWJNZXNzYWdlSGFuZGxlcigpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlRGVsYXllZChtczJucygtMTAwMCksIGhhbmRsZXIsIE1lc3NhZ2UoTVNHX1RFU1QxKSk7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIHplcm8gYmVjYXVzZSBtZXNzYWdlIHdhcyBhbHJlYWR5IHNlbnQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfQ0FMTEJBQ0ssIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBiZWNhdXNlIG1lc3NhZ2Ugd2FzIHNlbnQiOwotICAgIEVYUEVDVF9FUShzaXplX3QoMSksIGhhbmRsZXItPm1lc3NhZ2VzLnNpemUoKSkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotICAgIEVYUEVDVF9FUShNU0dfVEVTVDEsIGhhbmRsZXItPm1lc3NhZ2VzWzBdLndoYXQpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFNlbmRNZXNzYWdlRGVsYXllZF9XaGVuU2VudFRvVGhlUHJlc2VudF9TaG91bGRJbnZva2VIYW5kbGVyRHVyaW5nTmV4dFBvbGwpIHsKLSAgICBzcDxTdHViTWVzc2FnZUhhbmRsZXI+IGhhbmRsZXIgPSBuZXcgU3R1Yk1lc3NhZ2VIYW5kbGVyKCk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2VEZWxheWVkKDAsIGhhbmRsZXIsIE1lc3NhZ2UoTVNHX1RFU1QxKSk7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIHplcm8gYmVjYXVzZSBtZXNzYWdlIHdhcyBhbHJlYWR5IHNlbnQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfQ0FMTEJBQ0ssIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBiZWNhdXNlIG1lc3NhZ2Ugd2FzIHNlbnQiOwotICAgIEVYUEVDVF9FUShzaXplX3QoMSksIGhhbmRsZXItPm1lc3NhZ2VzLnNpemUoKSkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotICAgIEVYUEVDVF9FUShNU0dfVEVTVDEsIGhhbmRsZXItPm1lc3NhZ2VzWzBdLndoYXQpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFNlbmRNZXNzYWdlQXRUaW1lX1doZW5TZW50VG9UaGVGdXR1cmVfU2hvdWxkSW52b2tlSGFuZGxlckFmdGVyRGVsYXlUaW1lKSB7Ci0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgc3A8U3R1Yk1lc3NhZ2VIYW5kbGVyPiBoYW5kbGVyID0gbmV3IFN0dWJNZXNzYWdlSGFuZGxlcigpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlQXRUaW1lKG5vdyArIG1zMm5zKDEwMCksIGhhbmRsZXIsIE1lc3NhZ2UoTVNHX1RFU1QxKSk7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDAwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImZpcnN0IHBvbGwgc2hvdWxkIGVuZCBxdWlja2x5IGJlY2F1c2UgbmV4dCBtZXNzYWdlIHRpbWVvdXQgd2FzIGNvbXB1dGVkIjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX1dBS0UsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9XQUtFIGR1ZSB0byB3YWtldXAiOwotICAgIEVYUEVDVF9FUShzaXplX3QoMCksIGhhbmRsZXItPm1lc3NhZ2VzLnNpemUoKSkKLSAgICAgICAgICAgIDw8ICJubyBtZXNzYWdlIGhhbmRsZWQgeWV0IjsKLQotICAgIHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMDApOwotICAgIGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBFWFBFQ1RfRVEoc2l6ZV90KDEpLCBoYW5kbGVyLT5tZXNzYWdlcy5zaXplKCkpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLSAgICBFWFBFQ1RfRVEoTVNHX1RFU1QxLCBoYW5kbGVyLT5tZXNzYWdlc1swXS53aGF0KQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci0gICAgRVhQRUNUX05FQVIoMTAwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgInNlY29uZCBwb2xsIHNob3VsZCBlbmQgYXJvdW5kIHRoZSB0aW1lIG9mIHRoZSBkZWxheWVkIG1lc3NhZ2UgZGlzcGF0Y2giOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfQ0FMTEJBQ0ssIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBiZWNhdXNlIG1lc3NhZ2Ugd2FzIHNlbnQiOwotCi0gICAgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwKTsKLSAgICBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMTAwICsgMTAwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgInRoaXJkIHBvbGwgc2hvdWxkIHRpbWVvdXQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfVElNRU9VVCwgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX1RJTUVPVVQgYmVjYXVzZSB0aGVyZSB3ZXJlIG5vIG1lc3NhZ2VzIGxlZnQiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgU2VuZE1lc3NhZ2VBdFRpbWVfV2hlblNlbnRUb1RoZVBhc3RfU2hvdWxkSW52b2tlSGFuZGxlckR1cmluZ05leHRQb2xsKSB7Ci0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgc3A8U3R1Yk1lc3NhZ2VIYW5kbGVyPiBoYW5kbGVyID0gbmV3IFN0dWJNZXNzYWdlSGFuZGxlcigpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlQXRUaW1lKG5vdyAtIG1zMm5zKDEwMDApLCBoYW5kbGVyLCBNZXNzYWdlKE1TR19URVNUMSkpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiB6ZXJvIGJlY2F1c2UgbWVzc2FnZSB3YXMgYWxyZWFkeSBzZW50IjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX0NBTExCQUNLLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgYmVjYXVzZSBtZXNzYWdlIHdhcyBzZW50IjsKLSAgICBFWFBFQ1RfRVEoc2l6ZV90KDEpLCBoYW5kbGVyLT5tZXNzYWdlcy5zaXplKCkpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLSAgICBFWFBFQ1RfRVEoTVNHX1RFU1QxLCBoYW5kbGVyLT5tZXNzYWdlc1swXS53aGF0KQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBTZW5kTWVzc2FnZUF0VGltZV9XaGVuU2VudFRvVGhlUHJlc2VudF9TaG91bGRJbnZva2VIYW5kbGVyRHVyaW5nTmV4dFBvbGwpIHsKLSAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBzcDxTdHViTWVzc2FnZUhhbmRsZXI+IGhhbmRsZXIgPSBuZXcgU3R1Yk1lc3NhZ2VIYW5kbGVyKCk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2VBdFRpbWUobm93LCBoYW5kbGVyLCBNZXNzYWdlKE1TR19URVNUMSkpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiB6ZXJvIGJlY2F1c2UgbWVzc2FnZSB3YXMgYWxyZWFkeSBzZW50IjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX0NBTExCQUNLLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgYmVjYXVzZSBtZXNzYWdlIHdhcyBzZW50IjsKLSAgICBFWFBFQ1RfRVEoc2l6ZV90KDEpLCBoYW5kbGVyLT5tZXNzYWdlcy5zaXplKCkpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLSAgICBFWFBFQ1RfRVEoTVNHX1RFU1QxLCBoYW5kbGVyLT5tZXNzYWdlc1swXS53aGF0KQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBSZW1vdmVNZXNzYWdlX1doZW5SZW1vdmluZ0FsbE1lc3NhZ2VzRm9ySGFuZGxlcl9TaG91bGRSZW1vdmVUaG9zZU1lc3NhZ2UpIHsKLSAgICBzcDxTdHViTWVzc2FnZUhhbmRsZXI+IGhhbmRsZXIgPSBuZXcgU3R1Yk1lc3NhZ2VIYW5kbGVyKCk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2UoaGFuZGxlciwgTWVzc2FnZShNU0dfVEVTVDEpKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShoYW5kbGVyLCBNZXNzYWdlKE1TR19URVNUMikpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlKGhhbmRsZXIsIE1lc3NhZ2UoTVNHX1RFU1QzKSk7Ci0gICAgbUxvb3Blci0+cmVtb3ZlTWVzc2FnZXMoaGFuZGxlcik7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiB6ZXJvIGJlY2F1c2UgbWVzc2FnZSB3YXMgc2VudCBzbyBsb29wZXIgd2FzIGF3b2tlbiI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9XQUtFLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfV0FLRSBiZWNhdXNlIGxvb3BlciB3YXMgYXdva2VuIjsKLSAgICBFWFBFQ1RfRVEoc2l6ZV90KDApLCBoYW5kbGVyLT5tZXNzYWdlcy5zaXplKCkpCi0gICAgICAgICAgICA8PCAibm8gbWVzc2FnZXMgdG8gaGFuZGxlIjsKLQotICAgIHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDApOwotCi0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9USU1FT1VULCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfVElNRU9VVCBiZWNhdXNlIHRoZXJlIHdhcyBub3RoaW5nIHRvIGRvIjsKLSAgICBFWFBFQ1RfRVEoc2l6ZV90KDApLCBoYW5kbGVyLT5tZXNzYWdlcy5zaXplKCkpCi0gICAgICAgICAgICA8PCAibm8gbWVzc2FnZXMgdG8gaGFuZGxlIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFJlbW92ZU1lc3NhZ2VfV2hlblJlbW92aW5nU29tZU1lc3NhZ2VzRm9ySGFuZGxlcl9TaG91bGRSZW1vdmVUaG9zZU1lc3NhZ2UpIHsKLSAgICBzcDxTdHViTWVzc2FnZUhhbmRsZXI+IGhhbmRsZXIgPSBuZXcgU3R1Yk1lc3NhZ2VIYW5kbGVyKCk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2UoaGFuZGxlciwgTWVzc2FnZShNU0dfVEVTVDEpKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShoYW5kbGVyLCBNZXNzYWdlKE1TR19URVNUMikpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlKGhhbmRsZXIsIE1lc3NhZ2UoTVNHX1RFU1QzKSk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2UoaGFuZGxlciwgTWVzc2FnZShNU0dfVEVTVDQpKTsKLSAgICBtTG9vcGVyLT5yZW1vdmVNZXNzYWdlcyhoYW5kbGVyLCBNU0dfVEVTVDMpOwotICAgIG1Mb29wZXItPnJlbW92ZU1lc3NhZ2VzKGhhbmRsZXIsIE1TR19URVNUMSk7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiB6ZXJvIGJlY2F1c2UgbWVzc2FnZSB3YXMgc2VudCBzbyBsb29wZXIgd2FzIGF3b2tlbiI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9DQUxMQkFDSywgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGJlY2F1c2UgdHdvIG1lc3NhZ2VzIHdlcmUgc2VudCI7Ci0gICAgRVhQRUNUX0VRKHNpemVfdCgyKSwgaGFuZGxlci0+bWVzc2FnZXMuc2l6ZSgpKQotICAgICAgICAgICAgPDwgIm5vIG1lc3NhZ2VzIHRvIGhhbmRsZSI7Ci0gICAgRVhQRUNUX0VRKE1TR19URVNUMiwgaGFuZGxlci0+bWVzc2FnZXNbMF0ud2hhdCkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotICAgIEVYUEVDVF9FUShNU0dfVEVTVDQsIGhhbmRsZXItPm1lc3NhZ2VzWzFdLndoYXQpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLQotICAgIHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDApOwotCi0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9USU1FT1VULCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfVElNRU9VVCBiZWNhdXNlIHRoZXJlIHdhcyBub3RoaW5nIHRvIGRvIjsKLSAgICBFWFBFQ1RfRVEoc2l6ZV90KDIpLCBoYW5kbGVyLT5tZXNzYWdlcy5zaXplKCkpCi0gICAgICAgICAgICA8PCAibm8gbW9yZSBtZXNzYWdlcyB0byBoYW5kbGUiOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL3Rlc3RzL1N0cmluZzhfdGVzdC5jcHAgYi9saWJzL3V0aWxzL3Rlc3RzL1N0cmluZzhfdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MmM2OGQuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy90ZXN0cy9TdHJpbmc4X3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyaW5nOF90ZXN0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyaW5nOFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICB9Ci19OwotCi1URVNUX0YoU3RyaW5nOFRlc3QsIENzdHIpIHsKLSAgICBTdHJpbmc4IHRtcCgiSGVsbG8sIHdvcmxkISIpOwotCi0gICAgRVhQRUNUX1NUUkVRKHRtcC5zdHJpbmcoKSwgIkhlbGxvLCB3b3JsZCEiKTsKLX0KLQotVEVTVF9GKFN0cmluZzhUZXN0LCBPcGVyYXRvclBsdXMpIHsKLSAgICBTdHJpbmc4IHNyYzEoIkhlbGxvLCAiKTsKLQotICAgIC8vIFRlc3QgYWRkaW5nIFN0cmluZzggKyBjb25zdCBjaGFyKgotICAgIGNvbnN0IGNoYXIqIGNjc3JjMiA9ICJ3b3JsZCEiOwotICAgIFN0cmluZzggZHN0MSA9IHNyYzEgKyBjY3NyYzI7Ci0gICAgRVhQRUNUX1NUUkVRKGRzdDEuc3RyaW5nKCksICJIZWxsbywgd29ybGQhIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNyYzEuc3RyaW5nKCksICJIZWxsbywgIik7Ci0gICAgRVhQRUNUX1NUUkVRKGNjc3JjMiwgIndvcmxkISIpOwotCi0gICAgLy8gVGVzdCBhZGRpbmcgU3RyaW5nOCArIFN0cmluZzgKLSAgICBTdHJpbmc4IHNzcmMyKCJ3b3JsZCEiKTsKLSAgICBTdHJpbmc4IGRzdDIgPSBzcmMxICsgc3NyYzI7Ci0gICAgRVhQRUNUX1NUUkVRKGRzdDIuc3RyaW5nKCksICJIZWxsbywgd29ybGQhIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNyYzEuc3RyaW5nKCksICJIZWxsbywgIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNzcmMyLnN0cmluZygpLCAid29ybGQhIik7Ci19Ci0KLVRFU1RfRihTdHJpbmc4VGVzdCwgT3BlcmF0b3JQbHVzRXF1YWxzKSB7Ci0gICAgU3RyaW5nOCBzcmMxKCJNeSB2b2ljZSIpOwotCi0gICAgLy8gVGVzdGluZyBTdHJpbmc4ICs9IFN0cmluZzgKLSAgICBTdHJpbmc4IHNyYzIoIiBpcyBteSBwYXNzcG9ydC4iKTsKLSAgICBzcmMxICs9IHNyYzI7Ci0gICAgRVhQRUNUX1NUUkVRKHNyYzEuc3RyaW5nKCksICJNeSB2b2ljZSBpcyBteSBwYXNzcG9ydC4iKTsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMi5zdHJpbmcoKSwgIiBpcyBteSBwYXNzcG9ydC4iKTsKLQotICAgIC8vIEFkZGluZyBjb25zdCBjaGFyKiB0byB0aGUgcHJldmlvdXMgc3RyaW5nLgotICAgIGNvbnN0IGNoYXIqIHNyYzMgPSAiIFZlcmlmeSBtZS4iOwotICAgIHNyYzEgKz0gc3JjMzsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMS5zdHJpbmcoKSwgIk15IHZvaWNlIGlzIG15IHBhc3Nwb3J0LiBWZXJpZnkgbWUuIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNyYzIuc3RyaW5nKCksICIgaXMgbXkgcGFzc3BvcnQuIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNyYzMsICIgVmVyaWZ5IG1lLiIpOwotfQotCi19CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL3Rlc3RzL1VuaWNvZGVfdGVzdC5jcHAgYi9saWJzL3V0aWxzL3Rlc3RzL1VuaWNvZGVfdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YzEzMGMuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy90ZXN0cy9Vbmljb2RlX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlVuaWNvZGVfdGVzdCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9Vbmljb2RlLmg+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFVuaWNvZGVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgfQotfTsKLQotVEVTVF9GKFVuaWNvZGVUZXN0LCBVVEY4dG9VVEYxNlplcm9MZW5ndGgpIHsKLSAgICBzc2l6ZV90IG1lYXN1cmVkOwotCi0gICAgY29uc3QgdWludDhfdCBzdHJbXSA9IHsgfTsKLQotICAgIG1lYXN1cmVkID0gdXRmOF90b191dGYxNl9sZW5ndGgoc3RyLCAwKTsKLSAgICBFWFBFQ1RfRVEoMCwgbWVhc3VyZWQpCi0gICAgICAgICAgICA8PCAiWmVybyBsZW5ndGggaW5wdXQgc2hvdWxkIHJldHVybiB6ZXJvIGxlbmd0aCBvdXRwdXQuIjsKLX0KLQotVEVTVF9GKFVuaWNvZGVUZXN0LCBVVEY4dG9VVEYxNkFTQ0lJTGVuZ3RoKSB7Ci0gICAgc3NpemVfdCBtZWFzdXJlZDsKLQotICAgIC8vIFUrMDAzMCBvciBBU0NJSSAnMCcKLSAgICBjb25zdCB1aW50OF90IHN0cltdID0geyAweDMwIH07Ci0KLSAgICBtZWFzdXJlZCA9IHV0ZjhfdG9fdXRmMTZfbGVuZ3RoKHN0ciwgc2l6ZW9mKHN0cikpOwotICAgIEVYUEVDVF9FUSgxLCBtZWFzdXJlZCkKLSAgICAgICAgICAgIDw8ICJBU0NJSSBnbHlwaHMgc2hvdWxkIGhhdmUgYSBsZW5ndGggb2YgMSBjaGFyMTZfdCI7Ci19Ci0KLVRFU1RfRihVbmljb2RlVGVzdCwgVVRGOHRvVVRGMTZQbGFuZTFMZW5ndGgpIHsKLSAgICBzc2l6ZV90IG1lYXN1cmVkOwotCi0gICAgLy8gVSsyMzIzIFNNSUxFCi0gICAgY29uc3QgdWludDhfdCBzdHJbXSA9IHsgMHhFMiwgMHg4QywgMHhBMyB9OwotCi0gICAgbWVhc3VyZWQgPSB1dGY4X3RvX3V0ZjE2X2xlbmd0aChzdHIsIHNpemVvZihzdHIpKTsKLSAgICBFWFBFQ1RfRVEoMSwgbWVhc3VyZWQpCi0gICAgICAgICAgICA8PCAiUGxhbmUgMSBnbHlwaHMgc2hvdWxkIGhhdmUgYSBsZW5ndGggb2YgMSBjaGFyMTZfdCI7Ci19Ci0KLVRFU1RfRihVbmljb2RlVGVzdCwgVVRGOHRvVVRGMTZTdXJyb2dhdGVMZW5ndGgpIHsKLSAgICBzc2l6ZV90IG1lYXN1cmVkOwotCi0gICAgLy8gVSsxMDAwMAotICAgIGNvbnN0IHVpbnQ4X3Qgc3RyW10gPSB7IDB4RjAsIDB4OTAsIDB4ODAsIDB4ODAgfTsKLQotICAgIG1lYXN1cmVkID0gdXRmOF90b191dGYxNl9sZW5ndGgoc3RyLCBzaXplb2Yoc3RyKSk7Ci0gICAgRVhQRUNUX0VRKDIsIG1lYXN1cmVkKQotICAgICAgICAgICAgPDwgIlN1cnJvZ2F0ZSBwYWlycyBzaG91bGQgaGF2ZSBhIGxlbmd0aCBvZiAyIGNoYXIxNl90IjsKLX0KLQotVEVTVF9GKFVuaWNvZGVUZXN0LCBVVEY4dG9VVEYxNlRydW5jYXRlZFVURjgpIHsKLSAgICBzc2l6ZV90IG1lYXN1cmVkOwotCi0gICAgLy8gVHJ1bmNhdGVkIFUrMjMyMyBTTUlMRQotICAgIC8vIFUrMjMyMyBTTUlMRQotICAgIGNvbnN0IHVpbnQ4X3Qgc3RyW10gPSB7IDB4RTIsIDB4OEMgfTsKLQotICAgIG1lYXN1cmVkID0gdXRmOF90b191dGYxNl9sZW5ndGgoc3RyLCBzaXplb2Yoc3RyKSk7Ci0gICAgRVhQRUNUX0VRKC0xLCBtZWFzdXJlZCkKLSAgICAgICAgICAgIDw8ICJUcnVuY2F0ZWQgVVRGLTggc2hvdWxkIHJldHVybiAtMSB0byBpbmRpY2F0ZSBpbnZhbGlkIjsKLX0KLQotVEVTVF9GKFVuaWNvZGVUZXN0LCBVVEY4dG9VVEYxNk5vcm1hbCkgewotICAgIGNvbnN0IHVpbnQ4X3Qgc3RyW10gPSB7Ci0gICAgICAgIDB4MzAsIC8vIFUrMDAzMCwgMSBVVEYtMTYgY2hhcmFjdGVyCi0gICAgICAgIDB4QzQsIDB4ODAsIC8vIFUrMDEwMCwgMSBVVEYtMTYgY2hhcmFjdGVyCi0gICAgICAgIDB4RTIsIDB4OEMsIDB4QTMsIC8vIFUrMjMyMywgMSBVVEYtMTYgY2hhcmFjdGVyCi0gICAgICAgIDB4RjAsIDB4OTAsIDB4ODAsIDB4ODAsIC8vIFUrMTAwMDAsIDIgVVRGLTE2IGNoYXJhY3RlcgotICAgIH07Ci0KLSAgICBjaGFyMTZfdCBvdXRwdXRbMSArIDEgKyAxICsgMiArIDFdOyAvLyBSb29tIGZvciBOVUxMCi0KLSAgICB1dGY4X3RvX3V0ZjE2KHN0ciwgc2l6ZW9mKHN0ciksIG91dHB1dCk7Ci0KLSAgICBFWFBFQ1RfRVEoMHgwMDMwLCBvdXRwdXRbMF0pCi0gICAgICAgICAgICA8PCAic2hvdWxkIGJlIFUrMDAzMCI7Ci0gICAgRVhQRUNUX0VRKDB4MDEwMCwgb3V0cHV0WzFdKQotICAgICAgICAgICAgPDwgInNob3VsZCBiZSBVKzAxMDAiOwotICAgIEVYUEVDVF9FUSgweDIzMjMsIG91dHB1dFsyXSkKLSAgICAgICAgICAgIDw8ICJzaG91bGQgYmUgVSsyMzIzIjsKLSAgICBFWFBFQ1RfRVEoMHhEODAwLCBvdXRwdXRbM10pCi0gICAgICAgICAgICA8PCAic2hvdWxkIGJlIGZpcnN0IGhhbGYgb2Ygc3Vycm9nYXRlIFUrMTAwMDAiOwotICAgIEVYUEVDVF9FUSgweERDMDAsIG91dHB1dFs0XSkKLSAgICAgICAgICAgIDw8ICJzaG91bGQgYmUgc2Vjb25kIGhhbGYgb2Ygc3Vycm9nYXRlIFUrMTAwMDAiOwotICAgIEVYUEVDVF9FUShOVUxMLCBvdXRwdXRbNV0pCi0gICAgICAgICAgICA8PCAic2hvdWxkIGJlIE5VTEwgdGVybWluYXRlZCI7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1NlcnZpY2UuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1NlcnZpY2UuamF2YQppbmRleCAxYzdmNTc3Li5hYTYwZDBhIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9TZXJ2aWNlLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvU2VydmljZS5qYXZhCkBAIC0yMDM1LDIwICsyMDM1LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCByZWFkU2V0dGluZ3MoKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZW50UmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUluZGV4U2V0dGluZ05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLkRFRkFVTFRfU1RSRUFNX1ZPTFVNRVttU3RyZWFtVHlwZV0pOwotCi0gICAgICAgICAgICBtSW5kZXguY2xlYXIoKTsKLSAgICAgICAgICAgIG1JbmRleC5wdXQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9ERUZBVUxULCBpbmRleCk7Ci0KLSAgICAgICAgICAgIGluZGV4ID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGVudFJlc29sdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0QXVkaWJsZVZvbHVtZUluZGV4U2V0dGluZ05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZGV4ID4gMCkgPyBpbmRleCA6IEF1ZGlvTWFuYWdlci5ERUZBVUxUX1NUUkVBTV9WT0xVTUVbbVN0cmVhbVR5cGVdKTsKLSAgICAgICAgICAgIG1MYXN0QXVkaWJsZUluZGV4LmNsZWFyKCk7Ci0gICAgICAgICAgICBtTGFzdEF1ZGlibGVJbmRleC5wdXQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9ERUZBVUxULCBpbmRleCk7CisgICAgICAgICAgICBib29sZWFuIGNoZWNrU2lsZW50Vm9sdW1lID0gKG1SaW5nZXJNb2RlID09IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9OT1JNQUwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3RyZWFtQWZmZWN0ZWRCeVJpbmdlck1vZGUobVN0cmVhbVR5cGUpOwogCiAgICAgICAgICAgICBpbnQgcmVtYWluaW5nRGV2aWNlcyA9IEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQUxMOworCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgcmVtYWluaW5nRGV2aWNlcyAhPSAwOyBpKyspIHsKICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlID0gKDEgPDwgaSk7CiAgICAgICAgICAgICAgICAgaWYgKChkZXZpY2UgJiByZW1haW5pbmdEZXZpY2VzKSA9PSAwKSB7CkBAIC0yMDU3LDE3ICsyMDQ4LDU4IEBACiAgICAgICAgICAgICAgICAgcmVtYWluaW5nRGV2aWNlcyAmPSB+ZGV2aWNlOwogCiAgICAgICAgICAgICAgICAgLy8gcmV0cmlldmUgY3VycmVudCB2b2x1bWUgZm9yIGRldmljZQotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0U2V0dGluZ05hbWVGb3JEZXZpY2UoZmFsc2UsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZW50UmVzb2x2ZXIsIG5hbWUsIC0xKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdldFNldHRpbmdOYW1lRm9yRGV2aWNlKGZhbHNlIC8qIGxhc3RBdWRpYmxlICovLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIC8vIGlmIG5vIHZvbHVtZSBzdG9yZWQgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UsIHVzZSBkZWZhdWx0IHZvbHVtZSBpZiBkZWZhdWx0CisgICAgICAgICAgICAgICAgLy8gZGV2aWNlLCBjb250aW51ZSBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdEluZGV4ID0gKGRldmljZSA9PSBBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0RFRkFVTFQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuREVGQVVMVF9TVFJFQU1fVk9MVU1FW21TdHJlYW1UeXBlXSA6IC0xOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IFNldHRpbmdzLlN5c3RlbS5nZXRJbnQobUNvbnRlbnRSZXNvbHZlciwgbmFtZSwgZGVmYXVsdEluZGV4KTsKICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1JbmRleC5wdXQoZGV2aWNlLCBnZXRWYWxpZEluZGV4KDEwICogaW5kZXgpKTsKIAogICAgICAgICAgICAgICAgIC8vIHJldHJpZXZlIGxhc3QgYXVkaWJsZSB2b2x1bWUgZm9yIGRldmljZQotICAgICAgICAgICAgICAgIG5hbWUgPSBnZXRTZXR0aW5nTmFtZUZvckRldmljZSh0cnVlLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIGluZGV4ID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGVudFJlc29sdmVyLCBuYW1lLCAtMSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RBdWRpYmxlSW5kZXgucHV0KGRldmljZSwgZ2V0VmFsaWRJbmRleCgxMCAqIGluZGV4KSk7CisgICAgICAgICAgICAgICAgbmFtZSA9IGdldFNldHRpbmdOYW1lRm9yRGV2aWNlKHRydWUgIC8qIGxhc3RBdWRpYmxlICovLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIC8vIHVzZSBzdG9yZWQgbGFzdCBhdWRpYmxlIGluZGV4IGlmIHByZXNlbnQsIG90aGVyd2lzZSB1c2UgY3VycmVudCBpbmRleCBpZiBub3QgMAorICAgICAgICAgICAgICAgIC8vIG9yIGRlZmF1bHQgaW5kZXgKKyAgICAgICAgICAgICAgICBkZWZhdWx0SW5kZXggPSAoaW5kZXggPiAwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA6IEF1ZGlvTWFuYWdlci5ERUZBVUxUX1NUUkVBTV9WT0xVTUVbbVN0cmVhbVR5cGVdOworICAgICAgICAgICAgICAgIGludCBsYXN0QXVkaWJsZUluZGV4ID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGVudFJlc29sdmVyLCBuYW1lLCBkZWZhdWx0SW5kZXgpOworCisgICAgICAgICAgICAgICAgLy8gYSBsYXN0IGF1ZGlibGUgaW5kZXggb2YgMCBpcyBuZXZlciBzdG9yZWQsIGV4Y2VwdCBvbiBub24tdm9pY2UgY2FwYWJsZSBkZXZpY2VzCisgICAgICAgICAgICAgICAgLy8gKGUuZy4gdGFibGV0cykgZm9yIHRoZSBtdXNpYyBzdHJlYW0gdHlwZSwgd2hlcmUgdGhlIG11c2ljIHN0cmVhbSB2b2x1bWUgY2FuIHJlYWNoCisgICAgICAgICAgICAgICAgLy8gMCB3aXRob3V0IHRoZSBkZXZpY2UgYmVpbmcgaW4gc2lsZW50IG1vZGUKKyAgICAgICAgICAgICAgICBpZiAoKGxhc3RBdWRpYmxlSW5kZXggPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChtVm9pY2VDYXBhYmxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKFNUUkVBTV9WT0xVTUVfQUxJQVNbbVN0cmVhbVR5cGVdICE9IEF1ZGlvU3lzdGVtLlNUUkVBTV9NVVNJQykpKSB7CisgICAgICAgICAgICAgICAgICAgIGxhc3RBdWRpYmxlSW5kZXggPSBBdWRpb01hbmFnZXIuREVGQVVMVF9TVFJFQU1fVk9MVU1FW21TdHJlYW1UeXBlXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aGUgZGF0YSBiYXNlCisgICAgICAgICAgICAgICAgICAgIHNlbmRNc2cobUF1ZGlvSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfUEVSU0lTVF9WT0xVTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VORE1TR19RVUVVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRVJTSVNUX0xBU1RfQVVESUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRVJTSVNUX0RFTEFZKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUxhc3RBdWRpYmxlSW5kZXgucHV0KGRldmljZSwgZ2V0VmFsaWRJbmRleCgxMCAqIGxhc3RBdWRpYmxlSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAvLyB0aGUgaW5pdGlhbCBpbmRleCBzaG91bGQgbmV2ZXIgYmUgMCBmb3IgYSBzdHJlYW0gYWZmZWN0ZWQgYnkgcmluZ2VyIG1vZGUgaWYgbm90CisgICAgICAgICAgICAgICAgLy8gaW4gc2lsZW50IG9yIHZpYnJhdGUgbW9kZS4KKyAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHBlcm1pdHRlZCBvbiB0YWJsZXRzIGZvciBtdXNpYyBzdHJlYW0gdHlwZS4KKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tTaWxlbnRWb2x1bWUgJiYgKGluZGV4ID09IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobVZvaWNlQ2FwYWJsZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIChTVFJFQU1fVk9MVU1FX0FMSUFTW21TdHJlYW1UeXBlXSAhPSBBdWRpb1N5c3RlbS5TVFJFQU1fTVVTSUMpKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGxhc3RBdWRpYmxlSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIC8vIENvcnJlY3QgdGhlIGRhdGEgYmFzZQorICAgICAgICAgICAgICAgICAgICBzZW5kTXNnKG1BdWRpb0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1BFUlNJU1RfVk9MVU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTkRNU0dfUVVFVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVSU0lTVF9DVVJSRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUlNJU1RfREVMQVkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtSW5kZXgucHV0KGRldmljZSwgZ2V0VmFsaWRJbmRleCgxMCAqIGluZGV4KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvU3lzdGVtLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9TeXN0ZW0uamF2YQppbmRleCBkMzU0Y2RiLi5iNWU4MzJjIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9TeXN0ZW0uamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9TeXN0ZW0uamF2YQpAQCAtMjc5LDYgKzI3OSw3IEBACiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVF9OQU1FOwogICAgICAgICBjYXNlIERFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVF9OQU1FOworICAgICAgICBjYXNlIERFVklDRV9JTl9ERUZBVUxUOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuamF2YQppbmRleCBlOTRiZGRjLi41MTExMTFjIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmphdmEKQEAgLTY3LDYgKzY3LDggQEAKIAogICAgIC8qKgogICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgNDgwcCAoNzIwIHggNDgwKSByZXNvbHV0aW9uLgorICAgICAqIE5vdGUgdGhhdCB0aGUgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGZvciA0ODBwIGNhbiBhbHNvIGJlIG90aGVyCisgICAgICogdmFsdWVzLCBzdWNoIGFzIDY0MCBvciA3MDQsIGluc3RlYWQgb2YgNzIwLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfNDgwUCA9IDQ7CiAKQEAgLTc2LDcgKzc4LDEwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV83MjBQID0gNTsKIAogICAgIC8qKgotICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgMTA4MHAgKDE5MjAgeCAxMDg4KSByZXNvbHV0aW9uLgorICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgMTA4MHAgKDE5MjAgeCAxMDgwKSByZXNvbHV0aW9uLgorICAgICAqIE5vdGUgdGhhdCB0aGUgdmVydGljYWwgcmVzb2x1dGlvbiBmb3IgMTA4MHAgY2FuIGFsc28gYmUgMTA4OCwKKyAgICAgKiBpbnN0ZWFkIG9mIDEwODAgKHVzZWQgYnkgc29tZSB2ZW5kb3JzIHRvIGF2b2lkIGNyb3BwaW5nIGR1cmluZworICAgICAqIHZpZGVvIHBsYXliYWNrKS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZXzEwODBQID0gNjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhQWN0aW9uU291bmQuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUFjdGlvblNvdW5kLmphdmEKaW5kZXggZDBlNjkxMC4uN2E1MjBmZSAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhQWN0aW9uU291bmQuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFBY3Rpb25Tb3VuZC5qYXZhCkBAIC0xODUsMTAgKzE4NSwxNCBAQAogICAgIH07CiAKICAgICAvKioKLSAgICAgKiBGcmVlIHVwIGFsbCBhdWRpbyByZXNvdXJjZXMgdXNlZCBieSB0aGlzIE1lZGlhQWN0aW9uU291bmQgaW5zdGFuY2UKKyAgICAgKiBGcmVlIHVwIGFsbCBhdWRpbyByZXNvdXJjZXMgdXNlZCBieSB0aGlzIE1lZGlhQWN0aW9uU291bmQgaW5zdGFuY2UuIERvCisgICAgICogbm90IGNhbGwgYW55IG90aGVyIG1ldGhvZHMgb24gYSBNZWRpYUFjdGlvblNvdW5kIGluc3RhbmNlIGFmdGVyIGNhbGxpbmcKKyAgICAgKiByZWxlYXNlKCkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgbVNvdW5kUG9vbC5yZWxlYXNlKCk7Ci0gICAgICAgIG1Tb3VuZFBvb2wgPSBudWxsOworICAgICAgICBpZiAobVNvdW5kUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICBtU291bmRQb29sLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Tb3VuZFBvb2wgPSBudWxsOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IGVjNGMwNDQuLmUwYjE4NmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKQEAgLTQwNSw5ICs0MDUsOSBAQAogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICB2b2lkICpwYXJhbTIpIHsKKyAgICAgICAgY29uc3Qgdm9pZCAqcGFyYW0yKSB7CiAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgIE91dHB1dERlc2NyaXB0b3IgKmRlc2M7CisgICAgY29uc3QgT3V0cHV0RGVzY3JpcHRvciAqZGVzYzsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTsKIAogICAgIGlmIChpb0hhbmRsZSA9PSAwKSByZXR1cm47CkBAIC00MTcsNyArNDE3LDcgQEAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBTVFJFQU1fQ09ORklHX0NIQU5HRUQ6CiAgICAgICAgIGlmIChwYXJhbTIgPT0gTlVMTCkgYnJlYWs7Ci0gICAgICAgIHN0cmVhbSA9ICooYXVkaW9fc3RyZWFtX3R5cGVfdCAqKXBhcmFtMjsKKyAgICAgICAgc3RyZWFtID0gKihjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICopcGFyYW0yOwogICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgU1RSRUFNX0NPTkZJR19DSEFOR0VEIHN0cmVhbSAlZCwgb3V0cHV0ICVkIiwgc3RyZWFtLCBpb0hhbmRsZSk7CiAgICAgICAgIGlmIChnU3RyZWFtT3V0cHV0TWFwLmluZGV4T2ZLZXkoc3RyZWFtKSA+PSAwKSB7CiAgICAgICAgICAgICBnU3RyZWFtT3V0cHV0TWFwLnJlcGxhY2VWYWx1ZUZvcihzdHJlYW0sIGlvSGFuZGxlKTsKQEAgLTQyOSw3ICs0MjksNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBhcmFtMiA9PSBOVUxMKSBicmVhazsKLSAgICAgICAgZGVzYyA9IChPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOworICAgICAgICBkZXNjID0gKGNvbnN0IE91dHB1dERlc2NyaXB0b3IgKilwYXJhbTI7CiAKICAgICAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9ICBuZXcgT3V0cHV0RGVzY3JpcHRvcigqZGVzYyk7CiAgICAgICAgIGdPdXRwdXRzLmFkZChpb0hhbmRsZSwgb3V0cHV0RGVzYyk7CkBAIC00NTgsNyArNDU4LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChwYXJhbTIgPT0gTlVMTCkgYnJlYWs7Ci0gICAgICAgIGRlc2MgPSAoT3V0cHV0RGVzY3JpcHRvciAqKXBhcmFtMjsKKyAgICAgICAgZGVzYyA9IChjb25zdCBPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOwogCiAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQgY2hhbm5lbHMgJWQgZnJhbWVDb3VudCAlZCBsYXRlbmN5ICVkIiwKICAgICAgICAgICAgICAgICBpb0hhbmRsZSwgZGVzYy0+c2FtcGxpbmdSYXRlLCBkZXNjLT5mb3JtYXQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCmluZGV4IGNlMjhiMzMuLjFkYjM5YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCkBAIC0zOSwxOCArMzksMTggQEAKICAgICB7CiAgICAgfQogCi0gICAgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgdm9pZCAqcGFyYW0yKQorICAgIHZvaWQgaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXJDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihldmVudCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgaW9IYW5kbGUpOwogICAgICAgICBpZiAoZXZlbnQgPT0gQXVkaW9TeXN0ZW06OlNUUkVBTV9DT05GSUdfQ0hBTkdFRCkgewotICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtID0gKih1aW50MzJfdCAqKXBhcmFtMjsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9ICooY29uc3QgdWludDMyX3QgKilwYXJhbTI7CiAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkIHN0cmVhbSAlZCIsIHN0cmVhbSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtKTsKICAgICAgICAgfSBlbHNlIGlmIChldmVudCAhPSBBdWRpb1N5c3RlbTo6T1VUUFVUX0NMT1NFRCAmJiBldmVudCAhPSBBdWRpb1N5c3RlbTo6SU5QVVRfQ0xPU0VEKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqZGVzYyA9IChBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqKXBhcmFtMjsKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yICpkZXNjID0gKGNvbnN0IEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOwogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPnNhbXBsaW5nUmF0ZSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+Zm9ybWF0KTsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXNjLT5jaGFubmVscyk7CkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlckNsaWVudCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IGV2ZW50ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdm9pZCAqcGFyYW0yID0gTlVMTDsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtMiA9IE5VTEw7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciBkZXNjOwogICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtOwogICAgICAgICAgICAgaWYgKGV2ZW50ID09IEF1ZGlvU3lzdGVtOjpTVFJFQU1fQ09ORklHX0NIQU5HRUQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCmluZGV4IDc0ZmU0NzguLmIzYzM1MGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcApAQCAtMTA0MSw3ICsxMDQxLDcgQEAKICAgICAvKiBNYXJrZXIgQml0ICovCiAgICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKICAgICB7Ci0gICAgICAgIG1wNGRlY19sb2coIkRlY29kZVNob3J0SGVhZGVyKCk6IE1hcmtldCBiaXQgd3JvbmcuXG4iKTsKKyAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlU2hvcnRIZWFkZXIoKTogTWFya2VyIGJpdCB3cm9uZy5cbiIpOwogICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwogICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKICAgICB9CmRpZmYgLS1naXQgYS9vcGVuZ2wvaW5jbHVkZS9FR0wvZWdsLmggYi9vcGVuZ2wvaW5jbHVkZS9FR0wvZWdsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWEzNDIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2luY2x1ZGUvRUdML2VnbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qIC0qLSBtb2RlOiBjOyB0YWItd2lkdGg6IDg7IC0qLSAqLwotLyogdmk6IHNldCBzdz00IHRzPTg6ICovCi0vKiBSZWZlcmVuY2UgdmVyc2lvbiBvZiBlZ2wuaCBmb3IgRUdMIDEuNC4KLSAqICRSZXZpc2lvbjogOTM1NiAkIG9uICREYXRlOiAyMDA5LTEwLTIxIDAyOjUyOjI1IC0wNzAwIChXZWQsIDIxIE9jdCAyMDA5KSAkCi0gKi8KLQotLyoKLSoqIENvcHlyaWdodCAoYykgMjAwNy0yMDA5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KLSoqCi0qKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0qKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0qKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCi0qKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotKioKLSoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0qKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCi0qKgotKiogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSoqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSoqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0qKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotKiogTUFURVJJQUxTIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KLSovCi0KLSNpZm5kZWYgX19lZ2xfaF8KLSNkZWZpbmUgX19lZ2xfaF8KLQotLyogQWxsIHBsYXRmb3JtLWRlcGVuZGVudCB0eXBlcyBhbmQgbWFjcm8gYm9pbGVycGxhdGUgKHN1Y2ggYXMgRUdMQVBJCi0gKiBhbmQgRUdMQVBJRU5UUlkpIHNob3VsZCBnbyBpbiBlZ2xwbGF0Zm9ybS5oLgotICovCi0jaW5jbHVkZSA8RUdML2VnbHBsYXRmb3JtLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogRUdMIFR5cGVzICovCi0vKiBFR0xpbnQgaXMgZGVmaW5lZCBpbiBlZ2xwbGF0Zm9ybS5oICovCi10eXBlZGVmIHVuc2lnbmVkIGludCBFR0xCb29sZWFuOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgRUdMZW51bTsKLXR5cGVkZWYgdm9pZCAqRUdMQ29uZmlnOwotdHlwZWRlZiB2b2lkICpFR0xDb250ZXh0OwotdHlwZWRlZiB2b2lkICpFR0xEaXNwbGF5OwotdHlwZWRlZiB2b2lkICpFR0xTdXJmYWNlOwotdHlwZWRlZiB2b2lkICpFR0xDbGllbnRCdWZmZXI7Ci0KLS8qIEVHTCBWZXJzaW9uaW5nICovCi0jZGVmaW5lIEVHTF9WRVJTSU9OXzFfMAkJCTEKLSNkZWZpbmUgRUdMX1ZFUlNJT05fMV8xCQkJMQotI2RlZmluZSBFR0xfVkVSU0lPTl8xXzIJCQkxCi0jZGVmaW5lIEVHTF9WRVJTSU9OXzFfMwkJCTEKLSNkZWZpbmUgRUdMX1ZFUlNJT05fMV80CQkJMQotCi0vKiBFR0wgRW51bWVyYW50cy4gQml0bWFza3MgYW5kIG90aGVyIGV4Y2VwdGlvbmFsIGNhc2VzIGFzaWRlLCBtb3N0Ci0gKiBlbnVtcyBhcmUgYXNzaWduZWQgdW5pcXVlIHZhbHVlcyBzdGFydGluZyBhdCAweDMwMDAuCi0gKi8KLQotLyogRUdMIGFsaWFzZXMgKi8KLSNkZWZpbmUgRUdMX0ZBTFNFCQkJMAotI2RlZmluZSBFR0xfVFJVRQkJCTEKLQotLyogT3V0LW9mLWJhbmQgaGFuZGxlIHZhbHVlcyAqLwotI2RlZmluZSBFR0xfREVGQVVMVF9ESVNQTEFZCQkoKEVHTE5hdGl2ZURpc3BsYXlUeXBlKTApCi0jZGVmaW5lIEVHTF9OT19DT05URVhUCQkJKChFR0xDb250ZXh0KTApCi0jZGVmaW5lIEVHTF9OT19ESVNQTEFZCQkJKChFR0xEaXNwbGF5KTApCi0jZGVmaW5lIEVHTF9OT19TVVJGQUNFCQkJKChFR0xTdXJmYWNlKTApCi0KLS8qIE91dC1vZi1iYW5kIGF0dHJpYnV0ZSB2YWx1ZSAqLwotI2RlZmluZSBFR0xfRE9OVF9DQVJFCQkJKChFR0xpbnQpLTEpCi0KLS8qIEVycm9ycyAvIEdldEVycm9yIHJldHVybiB2YWx1ZXMgKi8KLSNkZWZpbmUgRUdMX1NVQ0NFU1MJCQkweDMwMDAKLSNkZWZpbmUgRUdMX05PVF9JTklUSUFMSVpFRAkJMHgzMDAxCi0jZGVmaW5lIEVHTF9CQURfQUNDRVNTCQkJMHgzMDAyCi0jZGVmaW5lIEVHTF9CQURfQUxMT0MJCQkweDMwMDMKLSNkZWZpbmUgRUdMX0JBRF9BVFRSSUJVVEUJCTB4MzAwNAotI2RlZmluZSBFR0xfQkFEX0NPTkZJRwkJCTB4MzAwNQotI2RlZmluZSBFR0xfQkFEX0NPTlRFWFQJCQkweDMwMDYKLSNkZWZpbmUgRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0UJCTB4MzAwNwotI2RlZmluZSBFR0xfQkFEX0RJU1BMQVkJCQkweDMwMDgKLSNkZWZpbmUgRUdMX0JBRF9NQVRDSAkJCTB4MzAwOQotI2RlZmluZSBFR0xfQkFEX05BVElWRV9QSVhNQVAJCTB4MzAwQQotI2RlZmluZSBFR0xfQkFEX05BVElWRV9XSU5ET1cJCTB4MzAwQgotI2RlZmluZSBFR0xfQkFEX1BBUkFNRVRFUgkJMHgzMDBDCi0jZGVmaW5lIEVHTF9CQURfU1VSRkFDRQkJCTB4MzAwRAotI2RlZmluZSBFR0xfQ09OVEVYVF9MT1NUCQkweDMwMEUJLyogRUdMIDEuMSAtIElNR19wb3dlcl9tYW5hZ2VtZW50ICovCi0KLS8qIFJlc2VydmVkIDB4MzAwRi0weDMwMUYgZm9yIGFkZGl0aW9uYWwgZXJyb3JzICovCi0KLS8qIENvbmZpZyBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIEVHTF9CVUZGRVJfU0laRQkJCTB4MzAyMAotI2RlZmluZSBFR0xfQUxQSEFfU0laRQkJCTB4MzAyMQotI2RlZmluZSBFR0xfQkxVRV9TSVpFCQkJMHgzMDIyCi0jZGVmaW5lIEVHTF9HUkVFTl9TSVpFCQkJMHgzMDIzCi0jZGVmaW5lIEVHTF9SRURfU0laRQkJCTB4MzAyNAotI2RlZmluZSBFR0xfREVQVEhfU0laRQkJCTB4MzAyNQotI2RlZmluZSBFR0xfU1RFTkNJTF9TSVpFCQkweDMwMjYKLSNkZWZpbmUgRUdMX0NPTkZJR19DQVZFQVQJCTB4MzAyNwotI2RlZmluZSBFR0xfQ09ORklHX0lECQkJMHgzMDI4Ci0jZGVmaW5lIEVHTF9MRVZFTAkJCTB4MzAyOQotI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfSEVJR0hUCQkweDMwMkEKLSNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX1BJWEVMUwkJMHgzMDJCCi0jZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9XSURUSAkJMHgzMDJDCi0jZGVmaW5lIEVHTF9OQVRJVkVfUkVOREVSQUJMRQkJMHgzMDJECi0jZGVmaW5lIEVHTF9OQVRJVkVfVklTVUFMX0lECQkweDMwMkUKLSNkZWZpbmUgRUdMX05BVElWRV9WSVNVQUxfVFlQRQkJMHgzMDJGCi0jZGVmaW5lIEVHTF9TQU1QTEVTCQkJMHgzMDMxCi0jZGVmaW5lIEVHTF9TQU1QTEVfQlVGRkVSUwkJMHgzMDMyCi0jZGVmaW5lIEVHTF9TVVJGQUNFX1RZUEUJCTB4MzAzMwotI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfVFlQRQkJMHgzMDM0Ci0jZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFCTB4MzAzNQotI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUJMHgzMDM2Ci0jZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUJMHgzMDM3Ci0jZGVmaW5lIEVHTF9OT05FCQkJMHgzMDM4CS8qIEF0dHJpYiBsaXN0IHRlcm1pbmF0b3IgKi8KLSNkZWZpbmUgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IJCTB4MzAzOQotI2RlZmluZSBFR0xfQklORF9UT19URVhUVVJFX1JHQkEJMHgzMDNBCi0jZGVmaW5lIEVHTF9NSU5fU1dBUF9JTlRFUlZBTAkJMHgzMDNCCi0jZGVmaW5lIEVHTF9NQVhfU1dBUF9JTlRFUlZBTAkJMHgzMDNDCi0jZGVmaW5lIEVHTF9MVU1JTkFOQ0VfU0laRQkJMHgzMDNECi0jZGVmaW5lIEVHTF9BTFBIQV9NQVNLX1NJWkUJCTB4MzAzRQotI2RlZmluZSBFR0xfQ09MT1JfQlVGRkVSX1RZUEUJCTB4MzAzRgotI2RlZmluZSBFR0xfUkVOREVSQUJMRV9UWVBFCQkweDMwNDAKLSNkZWZpbmUgRUdMX01BVENIX05BVElWRV9QSVhNQVAJCTB4MzA0MQkvKiBQc2V1ZG8tYXR0cmlidXRlIChub3QgcXVlcnlhYmxlKSAqLwotI2RlZmluZSBFR0xfQ09ORk9STUFOVAkJCTB4MzA0MgotCi0vKiBSZXNlcnZlZCAweDMwNDEtMHgzMDRGIGZvciBhZGRpdGlvbmFsIGNvbmZpZyBhdHRyaWJ1dGVzICovCi0KLS8qIENvbmZpZyBhdHRyaWJ1dGUgdmFsdWVzICovCi0jZGVmaW5lIEVHTF9TTE9XX0NPTkZJRwkJCTB4MzA1MAkvKiBFR0xfQ09ORklHX0NBVkVBVCB2YWx1ZSAqLwotI2RlZmluZSBFR0xfTk9OX0NPTkZPUk1BTlRfQ09ORklHCTB4MzA1MQkvKiBFR0xfQ09ORklHX0NBVkVBVCB2YWx1ZSAqLwotI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfUkdCCQkweDMwNTIJLyogRUdMX1RSQU5TUEFSRU5UX1RZUEUgdmFsdWUgKi8KLSNkZWZpbmUgRUdMX1JHQl9CVUZGRVIJCQkweDMwOEUJLyogRUdMX0NPTE9SX0JVRkZFUl9UWVBFIHZhbHVlICovCi0jZGVmaW5lIEVHTF9MVU1JTkFOQ0VfQlVGRkVSCQkweDMwOEYJLyogRUdMX0NPTE9SX0JVRkZFUl9UWVBFIHZhbHVlICovCi0KLS8qIE1vcmUgY29uZmlnIGF0dHJpYnV0ZSB2YWx1ZXMsIGZvciBFR0xfVEVYVFVSRV9GT1JNQVQgKi8KLSNkZWZpbmUgRUdMX05PX1RFWFRVUkUJCQkweDMwNUMKLSNkZWZpbmUgRUdMX1RFWFRVUkVfUkdCCQkJMHgzMDVECi0jZGVmaW5lIEVHTF9URVhUVVJFX1JHQkEJCTB4MzA1RQotI2RlZmluZSBFR0xfVEVYVFVSRV8yRAkJCTB4MzA1RgotCi0vKiBDb25maWcgYXR0cmlidXRlIG1hc2sgYml0cyAqLwotI2RlZmluZSBFR0xfUEJVRkZFUl9CSVQJCQkweDAwMDEJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KLSNkZWZpbmUgRUdMX1BJWE1BUF9CSVQJCQkweDAwMDIJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KLSNkZWZpbmUgRUdMX1dJTkRPV19CSVQJCQkweDAwMDQJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KLSNkZWZpbmUgRUdMX1ZHX0NPTE9SU1BBQ0VfTElORUFSX0JJVAkweDAwMjAJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KLSNkZWZpbmUgRUdMX1ZHX0FMUEhBX0ZPUk1BVF9QUkVfQklUCTB4MDA0MAkvKiBFR0xfU1VSRkFDRV9UWVBFIG1hc2sgYml0cyAqLwotI2RlZmluZSBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRV9CT1hfQklUIDB4MDIwMAkvKiBFR0xfU1VSRkFDRV9UWVBFIG1hc2sgYml0cyAqLwotI2RlZmluZSBFR0xfU1dBUF9CRUhBVklPUl9QUkVTRVJWRURfQklUIDB4MDQwMAkvKiBFR0xfU1VSRkFDRV9UWVBFIG1hc2sgYml0cyAqLwotCi0jZGVmaW5lIEVHTF9PUEVOR0xfRVNfQklUCQkweDAwMDEJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KLSNkZWZpbmUgRUdMX09QRU5WR19CSVQJCQkweDAwMDIJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KLSNkZWZpbmUgRUdMX09QRU5HTF9FUzJfQklUCQkweDAwMDQJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KLSNkZWZpbmUgRUdMX09QRU5HTF9CSVQJCQkweDAwMDgJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KLQotLyogUXVlcnlTdHJpbmcgdGFyZ2V0cyAqLwotI2RlZmluZSBFR0xfVkVORE9SCQkJMHgzMDUzCi0jZGVmaW5lIEVHTF9WRVJTSU9OCQkJMHgzMDU0Ci0jZGVmaW5lIEVHTF9FWFRFTlNJT05TCQkJMHgzMDU1Ci0jZGVmaW5lIEVHTF9DTElFTlRfQVBJUwkJCTB4MzA4RAotCi0vKiBRdWVyeVN1cmZhY2UgLyBTdXJmYWNlQXR0cmliIC8gQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgdGFyZ2V0cyAqLwotI2RlZmluZSBFR0xfSEVJR0hUCQkJMHgzMDU2Ci0jZGVmaW5lIEVHTF9XSURUSAkJCTB4MzA1NwotI2RlZmluZSBFR0xfTEFSR0VTVF9QQlVGRkVSCQkweDMwNTgKLSNkZWZpbmUgRUdMX1RFWFRVUkVfRk9STUFUCQkweDMwODAKLSNkZWZpbmUgRUdMX1RFWFRVUkVfVEFSR0VUCQkweDMwODEKLSNkZWZpbmUgRUdMX01JUE1BUF9URVhUVVJFCQkweDMwODIKLSNkZWZpbmUgRUdMX01JUE1BUF9MRVZFTAkJMHgzMDgzCi0jZGVmaW5lIEVHTF9SRU5ERVJfQlVGRkVSCQkweDMwODYKLSNkZWZpbmUgRUdMX1ZHX0NPTE9SU1BBQ0UJCTB4MzA4NwotI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUCQkweDMwODgKLSNkZWZpbmUgRUdMX0hPUklaT05UQUxfUkVTT0xVVElPTgkweDMwOTAKLSNkZWZpbmUgRUdMX1ZFUlRJQ0FMX1JFU09MVVRJT04JCTB4MzA5MQotI2RlZmluZSBFR0xfUElYRUxfQVNQRUNUX1JBVElPCQkweDMwOTIKLSNkZWZpbmUgRUdMX1NXQVBfQkVIQVZJT1IJCTB4MzA5MwotI2RlZmluZSBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRQkJMHgzMDk5Ci0KLS8qIEVHTF9SRU5ERVJfQlVGRkVSIHZhbHVlcyAvIEJpbmRUZXhJbWFnZSAvIFJlbGVhc2VUZXhJbWFnZSBidWZmZXIgdGFyZ2V0cyAqLwotI2RlZmluZSBFR0xfQkFDS19CVUZGRVIJCQkweDMwODQKLSNkZWZpbmUgRUdMX1NJTkdMRV9CVUZGRVIJCTB4MzA4NQotCi0vKiBPcGVuVkcgY29sb3Igc3BhY2VzICovCi0jZGVmaW5lIEVHTF9WR19DT0xPUlNQQUNFX3NSR0IJCTB4MzA4OQkvKiBFR0xfVkdfQ09MT1JTUEFDRSB2YWx1ZSAqLwotI2RlZmluZSBFR0xfVkdfQ09MT1JTUEFDRV9MSU5FQVIJMHgzMDhBCS8qIEVHTF9WR19DT0xPUlNQQUNFIHZhbHVlICovCi0KLS8qIE9wZW5WRyBhbHBoYSBmb3JtYXRzICovCi0jZGVmaW5lIEVHTF9WR19BTFBIQV9GT1JNQVRfTk9OUFJFCTB4MzA4QgkvKiBFR0xfQUxQSEFfRk9STUFUIHZhbHVlICovCi0jZGVmaW5lIEVHTF9WR19BTFBIQV9GT1JNQVRfUFJFCQkweDMwOEMJLyogRUdMX0FMUEhBX0ZPUk1BVCB2YWx1ZSAqLwotCi0vKiBDb25zdGFudCBzY2FsZSBmYWN0b3IgYnkgd2hpY2ggZnJhY3Rpb25hbCBkaXNwbGF5IHJlc29sdXRpb25zICYKLSAqIGFzcGVjdCByYXRpbyBhcmUgc2NhbGVkIHdoZW4gcXVlcmllZCBhcyBpbnRlZ2VyIHZhbHVlcy4KLSAqLwotI2RlZmluZSBFR0xfRElTUExBWV9TQ0FMSU5HCQkxMDAwMAotCi0vKiBVbmtub3duIGRpc3BsYXkgcmVzb2x1dGlvbi9hc3BlY3QgcmF0aW8gKi8KLSNkZWZpbmUgRUdMX1VOS05PV04JCQkoKEVHTGludCktMSkKLQotLyogQmFjayBidWZmZXIgc3dhcCBiZWhhdmlvcnMgKi8KLSNkZWZpbmUgRUdMX0JVRkZFUl9QUkVTRVJWRUQJCTB4MzA5NAkvKiBFR0xfU1dBUF9CRUhBVklPUiB2YWx1ZSAqLwotI2RlZmluZSBFR0xfQlVGRkVSX0RFU1RST1lFRAkJMHgzMDk1CS8qIEVHTF9TV0FQX0JFSEFWSU9SIHZhbHVlICovCi0KLS8qIENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyIGJ1ZmZlciB0eXBlcyAqLwotI2RlZmluZSBFR0xfT1BFTlZHX0lNQUdFCQkweDMwOTYKLQotLyogUXVlcnlDb250ZXh0IHRhcmdldHMgKi8KLSNkZWZpbmUgRUdMX0NPTlRFWFRfQ0xJRU5UX1RZUEUJCTB4MzA5NwotCi0vKiBDcmVhdGVDb250ZXh0IGF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04JMHgzMDk4Ci0KLS8qIE11bHRpc2FtcGxlIHJlc29sdXRpb24gYmVoYXZpb3JzICovCi0jZGVmaW5lIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFX0RFRkFVTFQgMHgzMDlBCS8qIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFIHZhbHVlICovCi0jZGVmaW5lIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFX0JPWAkweDMwOUIJLyogRUdMX01VTFRJU0FNUExFX1JFU09MVkUgdmFsdWUgKi8KLQotLyogQmluZEFQSS9RdWVyeUFQSSB0YXJnZXRzICovCi0jZGVmaW5lIEVHTF9PUEVOR0xfRVNfQVBJCQkweDMwQTAKLSNkZWZpbmUgRUdMX09QRU5WR19BUEkJCQkweDMwQTEKLSNkZWZpbmUgRUdMX09QRU5HTF9BUEkJCQkweDMwQTIKLQotLyogR2V0Q3VycmVudFN1cmZhY2UgdGFyZ2V0cyAqLwotI2RlZmluZSBFR0xfRFJBVwkJCTB4MzA1OQotI2RlZmluZSBFR0xfUkVBRAkJCTB4MzA1QQotCi0vKiBXYWl0TmF0aXZlIGVuZ2luZXMgKi8KLSNkZWZpbmUgRUdMX0NPUkVfTkFUSVZFX0VOR0lORQkJMHgzMDVCCi0KLS8qIEVHTCAxLjIgdG9rZW5zIHJlbmFtZWQgZm9yIGNvbnNpc3RlbmN5IGluIEVHTCAxLjMgKi8KLSNkZWZpbmUgRUdMX0NPTE9SU1BBQ0UJCQlFR0xfVkdfQ09MT1JTUEFDRQotI2RlZmluZSBFR0xfQUxQSEFfRk9STUFUCQlFR0xfVkdfQUxQSEFfRk9STUFUCi0jZGVmaW5lIEVHTF9DT0xPUlNQQUNFX3NSR0IJCUVHTF9WR19DT0xPUlNQQUNFX3NSR0IKLSNkZWZpbmUgRUdMX0NPTE9SU1BBQ0VfTElORUFSCQlFR0xfVkdfQ09MT1JTUEFDRV9MSU5FQVIKLSNkZWZpbmUgRUdMX0FMUEhBX0ZPUk1BVF9OT05QUkUJCUVHTF9WR19BTFBIQV9GT1JNQVRfTk9OUFJFCi0jZGVmaW5lIEVHTF9BTFBIQV9GT1JNQVRfUFJFCQlFR0xfVkdfQUxQSEFfRk9STUFUX1BSRQotCi0vKiBFR0wgZXh0ZW5zaW9ucyBtdXN0IHJlcXVlc3QgZW51bSBibG9ja3MgZnJvbSB0aGUgS2hyb25vcwotICogQVBJIFJlZ2lzdHJhciwgd2hvIG1haW50YWlucyB0aGUgZW51bWVyYW50IHJlZ2lzdHJ5LiBTdWJtaXQKLSAqIGEgYnVnIGluIEtocm9ub3MgQnVnemlsbGEgYWdhaW5zdCB0YXNrICJSZWdpc3RyeSIuCi0gKi8KLQotCi0KLS8qIEVHTCBGdW5jdGlvbnMgKi8KLQotRUdMQVBJIEVHTGludCBFR0xBUElFTlRSWSBlZ2xHZXRFcnJvcih2b2lkKTsKLQotRUdMQVBJIEVHTERpc3BsYXkgRUdMQVBJRU5UUlkgZWdsR2V0RGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBkaXNwbGF5X2lkKTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEluaXRpYWxpemUoRUdMRGlzcGxheSBkcHksIEVHTGludCAqbWFqb3IsIEVHTGludCAqbWlub3IpOwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsVGVybWluYXRlKEVHTERpc3BsYXkgZHB5KTsKLQotRUdMQVBJIGNvbnN0IGNoYXIgKiBFR0xBUElFTlRSWSBlZ2xRdWVyeVN0cmluZyhFR0xEaXNwbGF5IGRweSwgRUdMaW50IG5hbWUpOwotCi1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xHZXRDb25maWdzKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgKmNvbmZpZ3MsCi0JCQkgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpOwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQ2hvb3NlQ29uZmlnKEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LAotCQkJICAgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsCi0JCQkgICBFR0xpbnQgKm51bV9jb25maWcpOwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsR2V0Q29uZmlnQXR0cmliKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotCQkJICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7Ci0KLUVHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0JCQkJICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbiwKLQkJCQkgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwotRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0JCQkJICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci1FR0xBUEkgRUdMU3VyZmFjZSBFR0xBUElFTlRSWSBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotCQkJCSAgRUdMTmF0aXZlUGl4bWFwVHlwZSBwaXhtYXAsCi0JCQkJICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUXVlcnlTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCi0JCQkgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKLQotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQmluZEFQSShFR0xlbnVtIGFwaSk7Ci1FR0xBUEkgRUdMZW51bSBFR0xBUElFTlRSWSBlZ2xRdWVyeUFQSSh2b2lkKTsKLQotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsV2FpdENsaWVudCh2b2lkKTsKLQotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUmVsZWFzZVRocmVhZCh2b2lkKTsKLQotRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIoCi0JICAgICAgRUdMRGlzcGxheSBkcHksIEVHTGVudW0gYnVmdHlwZSwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwKLQkgICAgICBFR0xDb25maWcgY29uZmlnLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLQotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3VyZmFjZUF0dHJpYihFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLAotCQkJICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCB2YWx1ZSk7Ci1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xCaW5kVGV4SW1hZ2UoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcik7Ci1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xSZWxlYXNlVGV4SW1hZ2UoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcik7Ci0KLQotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3dhcEludGVydmFsKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgaW50ZXJ2YWwpOwotCi0KLUVHTEFQSSBFR0xDb250ZXh0IEVHTEFQSUVOVFJZIGVnbENyZWF0ZUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0JCQkgICAgRUdMQ29udGV4dCBzaGFyZV9jb250ZXh0LAotCQkJICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4KTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbE1ha2VDdXJyZW50KEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsCi0JCQkgIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgpOwotCi1FR0xBUEkgRUdMQ29udGV4dCBFR0xBUElFTlRSWSBlZ2xHZXRDdXJyZW50Q29udGV4dCh2b2lkKTsKLUVHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTGludCByZWFkZHJhdyk7Ci1FR0xBUEkgRUdMRGlzcGxheSBFR0xBUElFTlRSWSBlZ2xHZXRDdXJyZW50RGlzcGxheSh2b2lkKTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5Q29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsCi0JCQkgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKLQotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsV2FpdEdMKHZvaWQpOwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsV2FpdE5hdGl2ZShFR0xpbnQgZW5naW5lKTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFN3YXBCdWZmZXJzKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQ29weUJ1ZmZlcnMoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwKLQkJCSAgRUdMTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpOwotCi0vKiBUaGlzIGlzIGEgZ2VuZXJpYyBmdW5jdGlvbiBwb2ludGVyIHR5cGUsIHdob3NlIG5hbWUgaW5kaWNhdGVzIGl0IG11c3QKLSAqIGJlIGNhc3QgdG8gdGhlIHByb3BlciB0eXBlICphbmQgY2FsbGluZyBjb252ZW50aW9uKiBiZWZvcmUgdXNlLgotICovCi10eXBlZGVmIHZvaWQgKCpfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSh2b2lkKTsKLQotLyogTm93LCBkZWZpbmUgZWdsR2V0UHJvY0FkZHJlc3MgdXNpbmcgdGhlIGdlbmVyaWMgZnVuY3Rpb24gcHRyLiB0eXBlICovCi1FR0xBUEkgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBFR0xBUElFTlRSWQotICAgICAgIGVnbEdldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIgKnByb2NuYW1lKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fZWdsX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvaW5jbHVkZS9FR0wvZWdsZXh0LmggYi9vcGVuZ2wvaW5jbHVkZS9FR0wvZWdsZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTE4NjMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2luY2x1ZGUvRUdML2VnbGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLSNpZm5kZWYgX19lZ2xleHRfaF8KLSNkZWZpbmUgX19lZ2xleHRfaF8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotKiogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgotKioKLSoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0qKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0qKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KLSoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0qKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0qKgotKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KLSoqCi0qKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0qKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0qKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0qKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgotKi8KLQotI2luY2x1ZGUgPEVHTC9lZ2xwbGF0Zm9ybS5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSGVhZGVyIGZpbGUgdmVyc2lvbiBudW1iZXIgKi8KLS8qIEN1cnJlbnQgdmVyc2lvbiBhdCBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2VnbC8gKi8KLS8qICRSZXZpc2lvbjogMTEyNDkgJCBvbiAkRGF0ZTogMjAxMC0wNS0wNSAwOTo1NDoyOCAtMDcwMCAoV2VkLCAwNSBNYXkgMjAxMCkgJCAqLwotI2RlZmluZSBFR0xfRUdMRVhUX1ZFUlNJT04gNQotCi0jaWZuZGVmIEVHTF9LSFJfY29uZmlnX2F0dHJpYnMKLSNkZWZpbmUgRUdMX0tIUl9jb25maWdfYXR0cmlicyAxCi0jZGVmaW5lIEVHTF9DT05GT1JNQU5UX0tIUgkJCTB4MzA0MgkvKiBFR0xDb25maWcgYXR0cmlidXRlICovCi0jZGVmaW5lIEVHTF9WR19DT0xPUlNQQUNFX0xJTkVBUl9CSVRfS0hSCTB4MDAyMAkvKiBFR0xfU1VSRkFDRV9UWVBFIGJpdGZpZWxkICovCi0jZGVmaW5lIEVHTF9WR19BTFBIQV9GT1JNQVRfUFJFX0JJVF9LSFIJCTB4MDA0MAkvKiBFR0xfU1VSRkFDRV9UWVBFIGJpdGZpZWxkICovCi0jZW5kaWYKLQotI2lmbmRlZiBFR0xfS0hSX2xvY2tfc3VyZmFjZQotI2RlZmluZSBFR0xfS0hSX2xvY2tfc3VyZmFjZSAxCi0jZGVmaW5lIEVHTF9SRUFEX1NVUkZBQ0VfQklUX0tIUgkJMHgwMDAxCS8qIEVHTF9MT0NLX1VTQUdFX0hJTlRfS0hSIGJpdGZpZWxkICovCi0jZGVmaW5lIEVHTF9XUklURV9TVVJGQUNFX0JJVF9LSFIJCTB4MDAwMgkvKiBFR0xfTE9DS19VU0FHRV9ISU5UX0tIUiBiaXRmaWVsZCAqLwotI2RlZmluZSBFR0xfTE9DS19TVVJGQUNFX0JJVF9LSFIJCTB4MDA4MAkvKiBFR0xfU1VSRkFDRV9UWVBFIGJpdGZpZWxkICovCi0jZGVmaW5lIEVHTF9PUFRJTUFMX0ZPUk1BVF9CSVRfS0hSCQkweDAxMDAJLyogRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZCAqLwotI2RlZmluZSBFR0xfTUFUQ0hfRk9STUFUX0tIUgkJCTB4MzA0MwkvKiBFR0xDb25maWcgYXR0cmlidXRlICovCi0jZGVmaW5lIEVHTF9GT1JNQVRfUkdCXzU2NV9FWEFDVF9LSFIJCTB4MzBDMAkvKiBFR0xfTUFUQ0hfRk9STUFUX0tIUiB2YWx1ZSAqLwotI2RlZmluZSBFR0xfRk9STUFUX1JHQl81NjVfS0hSCQkJMHgzMEMxCS8qIEVHTF9NQVRDSF9GT1JNQVRfS0hSIHZhbHVlICovCi0jZGVmaW5lIEVHTF9GT1JNQVRfUkdCQV84ODg4X0VYQUNUX0tIUgkJMHgzMEMyCS8qIEVHTF9NQVRDSF9GT1JNQVRfS0hSIHZhbHVlICovCi0jZGVmaW5lIEVHTF9GT1JNQVRfUkdCQV84ODg4X0tIUgkJMHgzMEMzCS8qIEVHTF9NQVRDSF9GT1JNQVRfS0hSIHZhbHVlICovCi0jZGVmaW5lIEVHTF9NQVBfUFJFU0VSVkVfUElYRUxTX0tIUgkJMHgzMEM0CS8qIGVnbExvY2tTdXJmYWNlS0hSIGF0dHJpYnV0ZSAqLwotI2RlZmluZSBFR0xfTE9DS19VU0FHRV9ISU5UX0tIUgkJCTB4MzBDNQkvKiBlZ2xMb2NrU3VyZmFjZUtIUiBhdHRyaWJ1dGUgKi8KLSNkZWZpbmUgRUdMX0JJVE1BUF9QT0lOVEVSX0tIUgkJCTB4MzBDNgkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCi0jZGVmaW5lIEVHTF9CSVRNQVBfUElUQ0hfS0hSCQkJMHgzMEM3CS8qIGVnbFF1ZXJ5U3VyZmFjZSBhdHRyaWJ1dGUgKi8KLSNkZWZpbmUgRUdMX0JJVE1BUF9PUklHSU5fS0hSCQkJMHgzMEM4CS8qIGVnbFF1ZXJ5U3VyZmFjZSBhdHRyaWJ1dGUgKi8KLSNkZWZpbmUgRUdMX0JJVE1BUF9QSVhFTF9SRURfT0ZGU0VUX0tIUgkJMHgzMEM5CS8qIGVnbFF1ZXJ5U3VyZmFjZSBhdHRyaWJ1dGUgKi8KLSNkZWZpbmUgRUdMX0JJVE1BUF9QSVhFTF9HUkVFTl9PRkZTRVRfS0hSCTB4MzBDQQkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCi0jZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfQkxVRV9PRkZTRVRfS0hSCTB4MzBDQgkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCi0jZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfQUxQSEFfT0ZGU0VUX0tIUgkweDMwQ0MJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLwotI2RlZmluZSBFR0xfQklUTUFQX1BJWEVMX0xVTUlOQU5DRV9PRkZTRVRfS0hSCTB4MzBDRAkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCi0jZGVmaW5lIEVHTF9MT1dFUl9MRUZUX0tIUgkJCTB4MzBDRQkvKiBFR0xfQklUTUFQX09SSUdJTl9LSFIgdmFsdWUgKi8KLSNkZWZpbmUgRUdMX1VQUEVSX0xFRlRfS0hSCQkJMHgzMENGCS8qIEVHTF9CSVRNQVBfT1JJR0lOX0tIUiB2YWx1ZSAqLwotI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsTG9ja1N1cmZhY2VLSFIgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFVubG9ja1N1cmZhY2VLSFIgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKLSNlbmRpZiAvKiBFR0xfRUdMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTExPQ0tTVVJGQUNFS0hSUFJPQykgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLXR5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFVOTE9DS1NVUkZBQ0VLSFJQUk9DKSAoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOwotI2VuZGlmCi0KLSNpZm5kZWYgRUdMX0tIUl9pbWFnZQotI2RlZmluZSBFR0xfS0hSX2ltYWdlIDEKLSNkZWZpbmUgRUdMX05BVElWRV9QSVhNQVBfS0hSCQkJMHgzMEIwCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLwotdHlwZWRlZiB2b2lkICpFR0xJbWFnZUtIUjsKLSNkZWZpbmUgRUdMX05PX0lNQUdFX0tIUgkJCSgoRUdMSW1hZ2VLSFIpMCkKLSNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKLUVHTEFQSSBFR0xJbWFnZUtIUiBFR0xBUElFTlRSWSBlZ2xDcmVhdGVJbWFnZUtIUiAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LCBFR0xlbnVtIHRhcmdldCwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xEZXN0cm95SW1hZ2VLSFIgKEVHTERpc3BsYXkgZHB5LCBFR0xJbWFnZUtIUiBpbWFnZSk7Ci0jZW5kaWYgLyogRUdMX0VHTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIEVHTEltYWdlS0hSIChFR0xBUElFTlRSWVAgUEZORUdMQ1JFQVRFSU1BR0VLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LCBFR0xlbnVtIHRhcmdldCwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci10eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xERVNUUk9ZSU1BR0VLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTEltYWdlS0hSIGltYWdlKTsKLSNlbmRpZgotCi0jaWZuZGVmIEVHTF9LSFJfdmdfcGFyZW50X2ltYWdlCi0jZGVmaW5lIEVHTF9LSFJfdmdfcGFyZW50X2ltYWdlIDEKLSNkZWZpbmUgRUdMX1ZHX1BBUkVOVF9JTUFHRV9LSFIJCQkweDMwQkEJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCi0jZW5kaWYKLQotI2lmbmRlZiBFR0xfS0hSX2dsX3RleHR1cmVfMkRfaW1hZ2UKLSNkZWZpbmUgRUdMX0tIUl9nbF90ZXh0dXJlXzJEX2ltYWdlIDEKLSNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfMkRfS0hSCQkJMHgzMEIxCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLwotI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9MRVZFTF9LSFIJCTB4MzBCQwkvKiBlZ2xDcmVhdGVJbWFnZUtIUiBhdHRyaWJ1dGUgKi8KLSNlbmRpZgotCi0jaWZuZGVmIEVHTF9LSFJfZ2xfdGV4dHVyZV9jdWJlbWFwX2ltYWdlCi0jZGVmaW5lIEVHTF9LSFJfZ2xfdGV4dHVyZV9jdWJlbWFwX2ltYWdlIDEKLSNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9LSFIJMHgzMEIzCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLwotI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YX0tIUgkweDMwQjQJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCi0jZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfS0hSCTB4MzBCNQkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KLSNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9LSFIJMHgzMEI2CS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLwotI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aX0tIUgkweDMwQjcJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCi0jZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfS0hSCTB4MzBCOAkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KLSNlbmRpZgotCi0jaWZuZGVmIEVHTF9LSFJfZ2xfdGV4dHVyZV8zRF9pbWFnZQotI2RlZmluZSBFR0xfS0hSX2dsX3RleHR1cmVfM0RfaW1hZ2UgMQotI2RlZmluZSBFR0xfR0xfVEVYVFVSRV8zRF9LSFIJCQkweDMwQjIJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCi0jZGVmaW5lIEVHTF9HTF9URVhUVVJFX1pPRkZTRVRfS0hSCQkweDMwQkQJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgYXR0cmlidXRlICovCi0jZW5kaWYKLQotI2lmbmRlZiBFR0xfS0hSX2dsX3JlbmRlcmJ1ZmZlcl9pbWFnZQotI2RlZmluZSBFR0xfS0hSX2dsX3JlbmRlcmJ1ZmZlcl9pbWFnZSAxCi0jZGVmaW5lIEVHTF9HTF9SRU5ERVJCVUZGRVJfS0hSCQkJMHgzMEI5CS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLwotI2VuZGlmCi0KLSNpZm5kZWYgRUdMX0tIUl9yZXVzYWJsZV9zeW5jCi0jZGVmaW5lIEVHTF9LSFJfcmV1c2FibGVfc3luYyAxCi0KLXR5cGVkZWYgdm9pZCogRUdMU3luY0tIUjsKLXR5cGVkZWYga2hyb25vc191dGltZV9uYW5vc2Vjb25kc190IEVHTFRpbWVLSFI7Ci0KLSNkZWZpbmUgRUdMX1NZTkNfU1RBVFVTX0tIUgkJCTB4MzBGMQotI2RlZmluZSBFR0xfU0lHTkFMRURfS0hSCQkJMHgzMEYyCi0jZGVmaW5lIEVHTF9VTlNJR05BTEVEX0tIUgkJCTB4MzBGMwotI2RlZmluZSBFR0xfVElNRU9VVF9FWFBJUkVEX0tIUgkJCTB4MzBGNQotI2RlZmluZSBFR0xfQ09ORElUSU9OX1NBVElTRklFRF9LSFIJCTB4MzBGNgotI2RlZmluZSBFR0xfU1lOQ19UWVBFX0tIUgkJCTB4MzBGNwotI2RlZmluZSBFR0xfU1lOQ19SRVVTQUJMRV9LSFIJCQkweDMwRkEKLSNkZWZpbmUgRUdMX1NZTkNfRkxVU0hfQ09NTUFORFNfQklUX0tIUgkJMHgwMDAxCS8qIGVnbENsaWVudFdhaXRTeW5jS0hSIDxmbGFncz4gYml0ZmllbGQgKi8KLSNkZWZpbmUgRUdMX0ZPUkVWRVJfS0hSCQkJCTB4RkZGRkZGRkZGRkZGRkZGRnVsbAotI2RlZmluZSBFR0xfTk9fU1lOQ19LSFIJCQkJKChFR0xTeW5jS0hSKTApCi0jaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCi1FR0xBUEkgRUdMU3luY0tIUiBFR0xBUElFTlRSWSBlZ2xDcmVhdGVTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIHR5cGUsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveVN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYyk7Ci1FR0xBUEkgRUdMaW50IEVHTEFQSUVOVFJZIGVnbENsaWVudFdhaXRTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBmbGFncywgRUdMVGltZUtIUiB0aW1lb3V0KTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFNpZ25hbFN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMZW51bSBtb2RlKTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEdldFN5bmNBdHRyaWJLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7Ci0jZW5kaWYgLyogRUdMX0VHTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIEVHTFN5bmNLSFIgKEVHTEFQSUVOVFJZUCBQRk5FR0xDUkVBVEVTWU5DS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIHR5cGUsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwotdHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMREVTVFJPWVNZTkNLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYyk7Ci10eXBlZGVmIEVHTGludCAoRUdMQVBJRU5UUllQIFBGTkVHTENMSUVOVFdBSVRTWU5DS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBmbGFncywgRUdMVGltZUtIUiB0aW1lb3V0KTsKLXR5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFNJR05BTFNZTkNLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMZW51bSBtb2RlKTsKLXR5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTEdFVFNZTkNBVFRSSUJLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBFR0xfS0hSX2ltYWdlX2Jhc2UKLSNkZWZpbmUgRUdMX0tIUl9pbWFnZV9iYXNlIDEKLS8qIE1vc3QgaW50ZXJmYWNlcyBkZWZpbmVkIGJ5IEVHTF9LSFJfaW1hZ2VfcGl4bWFwIGFib3ZlICovCi0jZGVmaW5lIEVHTF9JTUFHRV9QUkVTRVJWRURfS0hSCQkJMHgzMEQyCS8qIGVnbENyZWF0ZUltYWdlS0hSIGF0dHJpYnV0ZSAqLwotI2VuZGlmCi0KLSNpZm5kZWYgRUdMX0tIUl9pbWFnZV9waXhtYXAKLSNkZWZpbmUgRUdMX0tIUl9pbWFnZV9waXhtYXAgMQotLyogSW50ZXJmYWNlcyBkZWZpbmVkIGJ5IEVHTF9LSFJfaW1hZ2UgYWJvdmUgKi8KLSNlbmRpZgotCi0jaWZuZGVmIEVHTF9JTUdfY29udGV4dF9wcmlvcml0eQotI2RlZmluZSBFR0xfSU1HX2NvbnRleHRfcHJpb3JpdHkgMQotI2RlZmluZSBFR0xfQ09OVEVYVF9QUklPUklUWV9MRVZFTF9JTUcJCTB4MzEwMAotI2RlZmluZSBFR0xfQ09OVEVYVF9QUklPUklUWV9ISUdIX0lNRwkJMHgzMTAxCi0jZGVmaW5lIEVHTF9DT05URVhUX1BSSU9SSVRZX01FRElVTV9JTUcJCTB4MzEwMgotI2RlZmluZSBFR0xfQ09OVEVYVF9QUklPUklUWV9MT1dfSU1HCQkweDMxMDMKLSNlbmRpZgotCi0jaWZuZGVmIEVHTF9OVl9jb3ZlcmFnZV9zYW1wbGUKLSNkZWZpbmUgRUdMX05WX2NvdmVyYWdlX3NhbXBsZSAxCi0jZGVmaW5lIEVHTF9DT1ZFUkFHRV9CVUZGRVJTX05WIDB4MzBFMAotI2RlZmluZSBFR0xfQ09WRVJBR0VfU0FNUExFU19OViAweDMwRTEKLSNlbmRpZgotCi0jaWZuZGVmIEVHTF9OVl9kZXB0aF9ub25saW5lYXIKLSNkZWZpbmUgRUdMX05WX2RlcHRoX25vbmxpbmVhciAxCi0jZGVmaW5lIEVHTF9ERVBUSF9FTkNPRElOR19OViAweDMwRTIKLSNkZWZpbmUgRUdMX0RFUFRIX0VOQ09ESU5HX05PTkVfTlYgMAotI2RlZmluZSBFR0xfREVQVEhfRU5DT0RJTkdfTk9OTElORUFSX05WIDB4MzBFMwotI2VuZGlmCi0KLSNpZm5kZWYgRUdMX05WX3N5bmMKLSNkZWZpbmUgRUdMX05WX3N5bmMgMQotI2RlZmluZSBFR0xfU1lOQ19QUklPUl9DT01NQU5EU19DT01QTEVURV9OVgkweDMwRTYKLSNkZWZpbmUgRUdMX1NZTkNfU1RBVFVTX05WCQkJMHgzMEU3Ci0jZGVmaW5lIEVHTF9TSUdOQUxFRF9OVgkJCQkweDMwRTgKLSNkZWZpbmUgRUdMX1VOU0lHTkFMRURfTlYJCQkweDMwRTkKLSNkZWZpbmUgRUdMX1NZTkNfRkxVU0hfQ09NTUFORFNfQklUX05WCQkweDAwMDEKLSNkZWZpbmUgRUdMX0ZPUkVWRVJfTlYJCQkJMHhGRkZGRkZGRkZGRkZGRkZGdWxsCi0jZGVmaW5lIEVHTF9BTFJFQURZX1NJR05BTEVEX05WCQkJMHgzMEVBCi0jZGVmaW5lIEVHTF9USU1FT1VUX0VYUElSRURfTlYJCQkweDMwRUIKLSNkZWZpbmUgRUdMX0NPTkRJVElPTl9TQVRJU0ZJRURfTlYJCTB4MzBFQwotI2RlZmluZSBFR0xfU1lOQ19UWVBFX05WCQkJMHgzMEVECi0jZGVmaW5lIEVHTF9TWU5DX0NPTkRJVElPTl9OVgkJCTB4MzBFRQotI2RlZmluZSBFR0xfU1lOQ19GRU5DRV9OVgkJCTB4MzBFRgotI2RlZmluZSBFR0xfTk9fU1lOQ19OVgkJCQkoKEVHTFN5bmNOVikwKQotdHlwZWRlZiB2b2lkKiBFR0xTeW5jTlY7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBFR0xUaW1lTlY7Ci0jaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCi1FR0xTeW5jTlYgZWdsQ3JlYXRlRmVuY2VTeW5jTlYgKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGNvbmRpdGlvbiwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci1FR0xCb29sZWFuIGVnbERlc3Ryb3lTeW5jTlYgKEVHTFN5bmNOViBzeW5jKTsKLUVHTEJvb2xlYW4gZWdsRmVuY2VOViAoRUdMU3luY05WIHN5bmMpOwotRUdMaW50IGVnbENsaWVudFdhaXRTeW5jTlYgKEVHTFN5bmNOViBzeW5jLCBFR0xpbnQgZmxhZ3MsIEVHTFRpbWVOViB0aW1lb3V0KTsKLUVHTEJvb2xlYW4gZWdsU2lnbmFsU3luY05WIChFR0xTeW5jTlYgc3luYywgRUdMZW51bSBtb2RlKTsKLUVHTEJvb2xlYW4gZWdsR2V0U3luY0F0dHJpYk5WIChFR0xTeW5jTlYgc3luYywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7Ci0jZW5kaWYgLyogRUdMX0VHTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIEVHTFN5bmNOViAoRUdMQVBJRU5UUllQIFBGTkVHTENSRUFURUZFTkNFU1lOQ05WUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGNvbmRpdGlvbiwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci10eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xERVNUUk9ZU1lOQ05WUFJPQykgKEVHTFN5bmNOViBzeW5jKTsKLXR5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTEZFTkNFTlZQUk9DKSAoRUdMU3luY05WIHN5bmMpOwotdHlwZWRlZiBFR0xpbnQgKEVHTEFQSUVOVFJZUCBQRk5FR0xDTElFTlRXQUlUU1lOQ05WUFJPQykgKEVHTFN5bmNOViBzeW5jLCBFR0xpbnQgZmxhZ3MsIEVHTFRpbWVOViB0aW1lb3V0KTsKLXR5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFNJR05BTFNZTkNOVlBST0MpIChFR0xTeW5jTlYgc3luYywgRUdMZW51bSBtb2RlKTsKLXR5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTEdFVFNZTkNBVFRSSUJOVlBST0MpIChFR0xTeW5jTlYgc3luYywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBFR0xfS0hSX2ZlbmNlX3N5bmMKLSNkZWZpbmUgRUdMX0tIUl9mZW5jZV9zeW5jIDEKLS8qIFJldXNlcyBtb3N0IHRva2VucyBhbmQgZW50cnkgcG9pbnRzIGZyb20gRUdMX0tIUl9yZXVzYWJsZV9zeW5jICovCi0jZGVmaW5lIEVHTF9TWU5DX1BSSU9SX0NPTU1BTkRTX0NPTVBMRVRFX0tIUgkweDMwRjAKLSNkZWZpbmUgRUdMX1NZTkNfQ09ORElUSU9OX0tIUgkJCTB4MzBGOAotI2RlZmluZSBFR0xfU1lOQ19GRU5DRV9LSFIJCQkweDMwRjkKLSNlbmRpZgotCi0jaWZuZGVmIEVHTF9BTkRST0lEX2ltYWdlX25hdGl2ZV9idWZmZXIKLSNkZWZpbmUgRUdMX0FORFJPSURfaW1hZ2VfbmF0aXZlX2J1ZmZlciAxCi1zdHJ1Y3QgQU5hdGl2ZVdpbmRvd0J1ZmZlcjsKLSNkZWZpbmUgRUdMX05BVElWRV9CVUZGRVJfQU5EUk9JRCAgICAgICAgICAgICAgIDB4MzE0MCAgLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCi0jZW5kaWYKLQotI2lmbmRlZiBFR0xfQU5EUk9JRF9yZWNvcmRhYmxlCi0jZGVmaW5lIEVHTF9BTkRST0lEX3JlY29yZGFibGUgMQotI2RlZmluZSBFR0xfUkVDT1JEQUJMRV9BTkRST0lEICAgICAgICAgICAgICAgICAgMHgzMTQyICAvKiBFR0xDb25maWcgYXR0cmlidXRlICovCi0jZW5kaWYKLQotLyogRUdMX05WX3N5c3RlbV90aW1lCi0gKi8KLSNpZm5kZWYgRUdMX05WX3N5c3RlbV90aW1lCi0jZGVmaW5lIEVHTF9OVl9zeXN0ZW1fdGltZSAxCi10eXBlZGVmIGtocm9ub3NfaW50NjRfdCBFR0xpbnQ2NE5WOwotdHlwZWRlZiBraHJvbm9zX3VpbnQ2NF90IEVHTHVpbnQ2NE5WOwotI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUwotRUdMQVBJIEVHTHVpbnQ2NE5WIEVHTEFQSUVOVFJZIGVnbEdldFN5c3RlbVRpbWVGcmVxdWVuY3lOVih2b2lkKTsKLUVHTEFQSSBFR0x1aW50NjROViBFR0xBUElFTlRSWSBlZ2xHZXRTeXN0ZW1UaW1lTlYodm9pZCk7Ci0jZW5kaWYKLXR5cGVkZWYgRUdMdWludDY0TlYgKEVHTEFQSUVOVFJZUCBQRk5FR0xHRVRTWVNURU1USU1FRlJFUVVFTkNZTlZQUk9DKSh2b2lkKTsKLXR5cGVkZWYgRUdMdWludDY0TlYgKEVHTEFQSUVOVFJZUCBQRk5FR0xHRVRTWVNURU1USU1FTlZQUk9DKSh2b2lkKTsKLSNlbmRpZgotCi0KLS8qIEVHTF9BTkRST0lEX2Jsb2JfY2FjaGUKLSAqLwotI2lmbmRlZiBFR0xfQU5EUk9JRF9ibG9iX2NhY2hlCi0jZGVmaW5lIEVHTF9BTkRST0lEX2Jsb2JfY2FjaGUgMQotdHlwZWRlZiBraHJvbm9zX3NzaXplX3QgRUdMc2l6ZWlBTkRST0lEOwotdHlwZWRlZiB2b2lkICgqRUdMU2V0QmxvYkZ1bmNBTkRST0lEKSAoY29uc3Qgdm9pZCoga2V5LCBFR0xzaXplaUFORFJPSUQga2V5U2l6ZSwgY29uc3Qgdm9pZCogdmFsdWUsIEVHTHNpemVpQU5EUk9JRCB2YWx1ZVNpemUpOwotdHlwZWRlZiBFR0xzaXplaUFORFJPSUQgKCpFR0xHZXRCbG9iRnVuY0FORFJPSUQpIChjb25zdCB2b2lkKiBrZXksIEVHTHNpemVpQU5EUk9JRCBrZXlTaXplLCB2b2lkKiB2YWx1ZSwgRUdMc2l6ZWlBTkRST0lEIHZhbHVlU2l6ZSk7Ci0jaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCi1FR0xBUEkgdm9pZCBFR0xBUElFTlRSWSBlZ2xTZXRCbG9iQ2FjaGVGdW5jc0FORFJPSUQoRUdMRGlzcGxheSBkcHksIEVHTFNldEJsb2JGdW5jQU5EUk9JRCBzZXQsIEVHTEdldEJsb2JGdW5jQU5EUk9JRCBnZXQpOwotI2VuZGlmIC8qIEVHTF9FR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChFR0xBUElFTlRSWVAgUEZORUdMU0VUQkxPQkNBQ0hFRlVOQ1NBTkRST0lEUFJPQykgKEVHTERpc3BsYXkgZHB5LAotICAgICAgICBFR0xTZXRCbG9iRnVuY0FORFJPSUQgc2V0LCBFR0xHZXRCbG9iRnVuY0FORFJPSUQgZ2V0KTsKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xwbGF0Zm9ybS5oIGIvb3BlbmdsL2luY2x1ZGUvRUdML2VnbHBsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYWM3MWIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2luY2x1ZGUvRUdML2VnbHBsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotI2lmbmRlZiBfX2VnbHBsYXRmb3JtX2hfCi0jZGVmaW5lIF9fZWdscGxhdGZvcm1faF8KLQotLyoKLSoqIENvcHlyaWdodCAoYykgMjAwNy0yMDA5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KLSoqCi0qKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0qKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0qKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCi0qKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotKioKLSoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0qKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCi0qKgotKiogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSoqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSoqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0qKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotKiogTUFURVJJQUxTIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KLSovCi0KLS8qIFBsYXRmb3JtLXNwZWNpZmljIHR5cGVzIGFuZCBkZWZpbml0aW9ucyBmb3IgZWdsLmgKLSAqICRSZXZpc2lvbjogOTcyNCAkIG9uICREYXRlOiAyMDA5LTEyLTAyIDAyOjA1OjMzIC0wODAwIChXZWQsIDAyIERlYyAyMDA5KSAkCi0gKgotICogQWRvcHRlcnMgbWF5IG1vZGlmeSBraHJwbGF0Zm9ybS5oIGFuZCB0aGlzIGZpbGUgdG8gc3VpdCB0aGVpciBwbGF0Zm9ybS4KLSAqIFlvdSBhcmUgZW5jb3VyYWdlZCB0byBzdWJtaXQgYWxsIG1vZGlmaWNhdGlvbnMgdG8gdGhlIEtocm9ub3MgZ3JvdXAgc28gdGhhdAotICogdGhleSBjYW4gYmUgaW5jbHVkZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgZmlsZS4gIFBsZWFzZSBzdWJtaXQgY2hhbmdlcwotICogYnkgc2VuZGluZyB0aGVtIHRvIHRoZSBwdWJsaWMgS2hyb25vcyBCdWd6aWxsYSAoaHR0cDovL2tocm9ub3Mub3JnL2J1Z3ppbGxhKQotICogYnkgZmlsaW5nIGEgYnVnIGFnYWluc3QgcHJvZHVjdCAiRUdMIiBjb21wb25lbnQgIlJlZ2lzdHJ5Ii4KLSAqLwotCi0jaW5jbHVkZSA8S0hSL2tocnBsYXRmb3JtLmg+Ci0KLS8qIE1hY3JvcyB1c2VkIGluIEVHTCBmdW5jdGlvbiBwcm90b3R5cGUgZGVjbGFyYXRpb25zLgotICoKLSAqIEVHTCBmdW5jdGlvbnMgc2hvdWxkIGJlIHByb3RvdHlwZWQgYXM6Ci0gKgotICogRUdMQVBJIHJldHVybi10eXBlIEVHTEFQSUVOVFJZIGVnbEZ1bmN0aW9uKGFyZ3VtZW50cyk7Ci0gKiB0eXBlZGVmIHJldHVybi10eXBlIChFWFBBUElFTlRSWVAgUEZORUdMRlVOQ1RJT05QUk9DKSAoYXJndW1lbnRzKTsKLSAqCi0gKiBLSFJPTk9TX0FQSUNBTEwgYW5kIEtIUk9OT1NfQVBJRU5UUlkgYXJlIGRlZmluZWQgaW4gS0hSL2tocnBsYXRmb3JtLmgKLSAqLwotCi0jaWZuZGVmIEVHTEFQSQotI2RlZmluZSBFR0xBUEkgS0hST05PU19BUElDQUxMCi0jZW5kaWYKLQotI2lmbmRlZiBFR0xBUElFTlRSWQotI2RlZmluZSBFR0xBUElFTlRSWSAgS0hST05PU19BUElFTlRSWQotI2VuZGlmCi0jZGVmaW5lIEVHTEFQSUVOVFJZUCBFR0xBUElFTlRSWSoKLQotLyogVGhlIHR5cGVzIE5hdGl2ZURpc3BsYXlUeXBlLCBOYXRpdmVXaW5kb3dUeXBlLCBhbmQgTmF0aXZlUGl4bWFwVHlwZQotICogYXJlIGFsaWFzZXMgb2Ygd2luZG93LXN5c3RlbS1kZXBlbmRlbnQgdHlwZXMsIHN1Y2ggYXMgWCBEaXNwbGF5ICogb3IKLSAqIFdpbmRvd3MgRGV2aWNlIENvbnRleHQuIFRoZXkgbXVzdCBiZSBkZWZpbmVkIGluIHBsYXRmb3JtLXNwZWNpZmljCi0gKiBjb2RlIGJlbG93LiBUaGUgRUdMLXByZWZpeGVkIHZlcnNpb25zIG9mIE5hdGl2ZSpUeXBlIGFyZSB0aGUgc2FtZQotICogdHlwZXMsIHJlbmFtZWQgaW4gRUdMIDEuMyBzbyBhbGwgdHlwZXMgaW4gdGhlIEFQSSBzdGFydCB3aXRoICJFR0wiLgotICovCi0KLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1ZDMzJfXykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykgJiYgIWRlZmluZWQoX19TQ0lURUNIX1NOQVBfXykgLyogV2luMzIgYW5kIFdpbkNFICovCi0jaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCi0jZW5kaWYKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLXR5cGVkZWYgSERDICAgICBFR0xOYXRpdmVEaXNwbGF5VHlwZTsKLXR5cGVkZWYgSEJJVE1BUCBFR0xOYXRpdmVQaXhtYXBUeXBlOwotdHlwZWRlZiBIV05EICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGU7Ci0KLSNlbGlmIGRlZmluZWQoX19XSU5TQ1dfXykgfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSAgLyogU3ltYmlhbiAqLwotCi10eXBlZGVmIGludCAgIEVHTE5hdGl2ZURpc3BsYXlUeXBlOwotdHlwZWRlZiB2b2lkICpFR0xOYXRpdmVXaW5kb3dUeXBlOwotdHlwZWRlZiB2b2lkICpFR0xOYXRpdmVQaXhtYXBUeXBlOwotCi0jZWxpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSB8fCBkZWZpbmVkKEFORFJPSUQpCi0KLSNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KLQotc3RydWN0IGVnbF9uYXRpdmVfcGl4bWFwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IEFOYXRpdmVXaW5kb3cqICAgICAgICAgICBFR0xOYXRpdmVXaW5kb3dUeXBlOwotdHlwZWRlZiBzdHJ1Y3QgZWdsX25hdGl2ZV9waXhtYXBfdCogICAgIEVHTE5hdGl2ZVBpeG1hcFR5cGU7Ci10eXBlZGVmIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMTmF0aXZlRGlzcGxheVR5cGU7Ci0KLSNlbGlmIGRlZmluZWQoX191bml4X18pCi0KLS8qIFgxMSAodGVudGF0aXZlKSAgKi8KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotCi10eXBlZGVmIERpc3BsYXkgKkVHTE5hdGl2ZURpc3BsYXlUeXBlOwotdHlwZWRlZiBQaXhtYXAgICBFR0xOYXRpdmVQaXhtYXBUeXBlOwotdHlwZWRlZiBXaW5kb3cgICBFR0xOYXRpdmVXaW5kb3dUeXBlOwotCi0jZWxzZQotI2Vycm9yICJQbGF0Zm9ybSBub3QgcmVjb2duaXplZCIKLSNlbmRpZgotCi0vKiBFR0wgMS4yIHR5cGVzLCByZW5hbWVkIGZvciBjb25zaXN0ZW5jeSBpbiBFR0wgMS4zICovCi10eXBlZGVmIEVHTE5hdGl2ZURpc3BsYXlUeXBlIE5hdGl2ZURpc3BsYXlUeXBlOwotdHlwZWRlZiBFR0xOYXRpdmVQaXhtYXBUeXBlICBOYXRpdmVQaXhtYXBUeXBlOwotdHlwZWRlZiBFR0xOYXRpdmVXaW5kb3dUeXBlICBOYXRpdmVXaW5kb3dUeXBlOwotCi0KLS8qIERlZmluZSBFR0xpbnQuIFRoaXMgbXVzdCBiZSBhIHNpZ25lZCBpbnRlZ3JhbCB0eXBlIGxhcmdlIGVub3VnaCB0byBjb250YWluCi0gKiBhbGwgbGVnYWwgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMgcGFzc2VkIGludG8gYW5kIG91dCBvZiBFR0wsIHdoZXRoZXIKLSAqIHRoZWlyIHR5cGUgaXMgYm9vbGVhbiwgYml0bWFzaywgZW51bWVyYW50IChzeW1ib2xpYyBjb25zdGFudCksIGludGVnZXIsCi0gKiBoYW5kbGUsIG9yIG90aGVyLiAgV2hpbGUgaW4gZ2VuZXJhbCBhIDMyLWJpdCBpbnRlZ2VyIHdpbGwgc3VmZmljZSwgaWYKLSAqIGhhbmRsZXMgYXJlIDY0IGJpdCB0eXBlcywgdGhlbiBFR0xpbnQgc2hvdWxkIGJlIGRlZmluZWQgYXMgYSBzaWduZWQgNjQtYml0Ci0gKiBpbnRlZ2VyIHR5cGUuCi0gKi8KLXR5cGVkZWYga2hyb25vc19pbnQzMl90IEVHTGludDsKLQotI2VuZGlmIC8qIF9fZWdscGxhdGZvcm1faCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvRVRDMS9ldGMxLmggYi9vcGVuZ2wvaW5jbHVkZS9FVEMxL2V0YzEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzODkwNS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvaW5jbHVkZS9FVEMxL2V0YzEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIF9fZXRjMV9oX18KLSNkZWZpbmUgX19ldGMxX2hfXwotCi0jZGVmaW5lIEVUQzFfRU5DT0RFRF9CTE9DS19TSVpFIDgKLSNkZWZpbmUgRVRDMV9ERUNPREVEX0JMT0NLX1NJWkUgNDgKLQotI2lmbmRlZiBFVEMxX1JHQjhfT0VTCi0jZGVmaW5lIEVUQzFfUkdCOF9PRVMgMHg4RDY0Ci0jZW5kaWYKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGV0YzFfYnl0ZTsKLXR5cGVkZWYgaW50IGV0YzFfYm9vbDsKLXR5cGVkZWYgdW5zaWduZWQgaW50IGV0YzFfdWludDMyOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIEVuY29kZSBhIGJsb2NrIG9mIHBpeGVscy4KLS8vCi0vLyBwSW4gaXMgYSBwb2ludGVyIHRvIGEgRVRDX0RFQ09ERURfQkxPQ0tfU0laRSBhcnJheSBvZiBieXRlcyB0aGF0IHJlcHJlc2VudCBhCi0vLyA0IHggNCBzcXVhcmUgb2YgMy1ieXRlIHBpeGVscyBpbiBmb3JtIFIsIEcsIEIuIEJ5dGUgKDMgKiAoeCArIDQgKiB5KSBpcyB0aGUgUgotLy8gdmFsdWUgb2YgcGl4ZWwgKHgsIHkpLgotLy8KLS8vIHZhbGlkUGl4ZWxNYXNrIGlzIGEgMTYtYml0IG1hc2sgd2hlcmUgYml0ICgxIDw8ICh4ICsgeSAqIDQpKSBpbmRpY2F0ZXMgd2hldGhlcgotLy8gdGhlIGNvcnJlc3BvbmRpbmcgKHgseSkgcGl4ZWwgaXMgdmFsaWQuIEludmFsaWQgcGl4ZWwgY29sb3IgdmFsdWVzIGFyZSBpZ25vcmVkIHdoZW4gY29tcHJlc3NpbmcuCi0vLwotLy8gcE91dCBpcyBhbiBFVEMxIGNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgZGF0YS4KLQotdm9pZCBldGMxX2VuY29kZV9ibG9jayhjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV91aW50MzIgdmFsaWRQaXhlbE1hc2ssIGV0YzFfYnl0ZSogcE91dCk7Ci0KLS8vIERlY29kZSBhIGJsb2NrIG9mIHBpeGVscy4KLS8vCi0vLyBwSW4gaXMgYW4gRVRDMSBjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRhdGEuCi0vLwotLy8gcE91dCBpcyBhIHBvaW50ZXIgdG8gYSBFVENfREVDT0RFRF9CTE9DS19TSVpFIGFycmF5IG9mIGJ5dGVzIHRoYXQgcmVwcmVzZW50IGEKLS8vIDQgeCA0IHNxdWFyZSBvZiAzLWJ5dGUgcGl4ZWxzIGluIGZvcm0gUiwgRywgQi4gQnl0ZSAoMyAqICh4ICsgNCAqIHkpIGlzIHRoZSBSCi0vLyB2YWx1ZSBvZiBwaXhlbCAoeCwgeSkuCi0KLXZvaWQgZXRjMV9kZWNvZGVfYmxvY2soY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfYnl0ZSogcE91dCk7Ci0KLS8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZW5jb2RlZCBpbWFnZSBkYXRhIChkb2VzIG5vdCBpbmNsdWRlIHNpemUgb2YgUEtNIGhlYWRlcikuCi0KLWV0YzFfdWludDMyIGV0YzFfZ2V0X2VuY29kZWRfZGF0YV9zaXplKGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQpOwotCi0vLyBFbmNvZGUgYW4gZW50aXJlIGltYWdlLgotLy8gcEluIC0gcG9pbnRlciB0byB0aGUgaW1hZ2UgZGF0YS4gRm9ybWF0dGVkIHN1Y2ggdGhhdAotLy8gICAgICAgcGl4ZWwgKHgseSkgaXMgYXQgcEluICsgcGl4ZWxTaXplICogeCArIHN0cmlkZSAqIHk7Ci0vLyBwT3V0IC0gcG9pbnRlciB0byBlbmNvZGVkIGRhdGEuIE11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIGVudGlyZSBlbmNvZGVkIGltYWdlLgotLy8gcGl4ZWxTaXplIGNhbiBiZSAyIG9yIDMuIDIgaXMgYW4gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgaW1hZ2UsIDMgaXMgYSBHTF9CWVRFIFJHQiBpbWFnZS4KLS8vIHJldHVybnMgbm9uLXplcm8gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCi0KLWludCBldGMxX2VuY29kZV9pbWFnZShjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV91aW50MzIgd2lkdGgsIGV0YzFfdWludDMyIGhlaWdodCwKLSAgICAgICAgZXRjMV91aW50MzIgcGl4ZWxTaXplLCBldGMxX3VpbnQzMiBzdHJpZGUsIGV0YzFfYnl0ZSogcE91dCk7Ci0KLS8vIERlY29kZSBhbiBlbnRpcmUgaW1hZ2UuCi0vLyBwSW4gLSBwb2ludGVyIHRvIGVuY29kZWQgZGF0YS4KLS8vIHBPdXQgLSBwb2ludGVyIHRvIHRoZSBpbWFnZSBkYXRhLiBXaWxsIGJlIHdyaXR0ZW4gc3VjaCB0aGF0Ci0vLyAgICAgICAgcGl4ZWwgKHgseSkgaXMgYXQgcEluICsgcGl4ZWxTaXplICogeCArIHN0cmlkZSAqIHkuIE11c3QgYmUKLS8vICAgICAgICBsYXJnZSBlbm91Z2ggdG8gc3RvcmUgZW50aXJlIGltYWdlLgotLy8gcGl4ZWxTaXplIGNhbiBiZSAyIG9yIDMuIDIgaXMgYW4gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgaW1hZ2UsIDMgaXMgYSBHTF9CWVRFIFJHQiBpbWFnZS4KLS8vIHJldHVybnMgbm9uLXplcm8gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCi0KLWludCBldGMxX2RlY29kZV9pbWFnZShjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV9ieXRlKiBwT3V0LAotICAgICAgICBldGMxX3VpbnQzMiB3aWR0aCwgZXRjMV91aW50MzIgaGVpZ2h0LAotICAgICAgICBldGMxX3VpbnQzMiBwaXhlbFNpemUsIGV0YzFfdWludDMyIHN0cmlkZSk7Ci0KLS8vIFNpemUgb2YgYSBQS00gaGVhZGVyLCBpbiBieXRlcy4KLQotI2RlZmluZSBFVENfUEtNX0hFQURFUl9TSVpFIDE2Ci0KLS8vIEZvcm1hdCBhIFBLTSBoZWFkZXIKLQotdm9pZCBldGMxX3BrbV9mb3JtYXRfaGVhZGVyKGV0YzFfYnl0ZSogcEhlYWRlciwgZXRjMV91aW50MzIgd2lkdGgsIGV0YzFfdWludDMyIGhlaWdodCk7Ci0KLS8vIENoZWNrIGlmIGEgUEtNIGhlYWRlciBpcyBjb3JyZWN0bHkgZm9ybWF0dGVkLgotCi1ldGMxX2Jvb2wgZXRjMV9wa21faXNfdmFsaWQoY29uc3QgZXRjMV9ieXRlKiBwSGVhZGVyKTsKLQotLy8gUmVhZCB0aGUgaW1hZ2Ugd2lkdGggZnJvbSBhIFBLTSBoZWFkZXIKLQotZXRjMV91aW50MzIgZXRjMV9wa21fZ2V0X3dpZHRoKGNvbnN0IGV0YzFfYnl0ZSogcEhlYWRlcik7Ci0KLS8vIFJlYWQgdGhlIGltYWdlIGhlaWdodCBmcm9tIGEgUEtNIGhlYWRlcgotCi1ldGMxX3VpbnQzMiBldGMxX3BrbV9nZXRfaGVpZ2h0KGNvbnN0IGV0YzFfYnl0ZSogcEhlYWRlcik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvR0xFUy9lZ2wuaCBiL29wZW5nbC9pbmNsdWRlL0dMRVMvZWdsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NzhlMDAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2luY2x1ZGUvR0xFUy9lZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qCi0gKiBTa2VsZXRvbiBlZ2wuaCB0byBwcm92aWRlIGNvbXBhdGliaWxpdHkgZm9yIGVhcmx5IEdMRVMgMS4wCi0gKiBhcHBsaWNhdGlvbnMuIFNldmVyYWwgZWFybHkgaW1wbGVtZW50YXRpb25zIGluY2x1ZGVkIGdsLmgKLSAqIGluIGVnbC5oIGxlYWRpbmcgYXBwbGljYXRpb25zIHRvIGluY2x1ZGUgb25seSBlZ2wuaAotICoKLSAqICRSZXZpc2lvbjogNjI1MiAkIG9uICREYXRlOjogMjAwOC0wOC0wNiAxNjozNTowOCAtMDcwMCAjJAotICovCi0KLSNpZm5kZWYgX19sZWdhY3lfZWdsX2hfCi0jZGVmaW5lIF9fbGVnYWN5X2VnbF9oXwotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLQotI2VuZGlmIC8qIF9fbGVnYWN5X2VnbF9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbC5oIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjhkODVhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3MCArMCwwIEBACi0jaWZuZGVmIF9fZ2xfaF8KLSNkZWZpbmUgX19nbF9oXwotCi0vKiAkUmV2aXNpb246IDEwNjAxICQgb24gJERhdGU6OiAyMDEwLTAzLTA0IDIyOjE1OjI3IC0wODAwICMkICovCi0KLSNpbmNsdWRlIDxHTEVTL2dscGxhdGZvcm0uaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotICogVGhpcyBkb2N1bWVudCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgU0dJIEZyZWUgU29mdHdhcmUgQiBMaWNlbnNlIFZlcnNpb24KLSAqIDIuMC4gRm9yIGRldGFpbHMsIHNlZSBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIvIC4KLSAqLwotCi10eXBlZGVmIHZvaWQgICAgICAgICAgICAgR0x2b2lkOwotdHlwZWRlZiBjaGFyICAgICAgICAgICAgIEdMY2hhcjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTGVudW07Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgR0xib29sZWFuOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgIEdMYml0ZmllbGQ7Ci10eXBlZGVmIGtocm9ub3NfaW50OF90ICAgR0xieXRlOwotdHlwZWRlZiBzaG9ydCAgICAgICAgICAgIEdMc2hvcnQ7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgR0xpbnQ7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgR0xzaXplaTsKLXR5cGVkZWYga2hyb25vc191aW50OF90ICBHTHVieXRlOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgIEdMdXNob3J0OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgIEdMdWludDsKLXR5cGVkZWYga2hyb25vc19mbG9hdF90ICBHTGZsb2F0OwotdHlwZWRlZiBraHJvbm9zX2Zsb2F0X3QgIEdMY2xhbXBmOwotdHlwZWRlZiBraHJvbm9zX2ludDMyX3QgIEdMZml4ZWQ7Ci10eXBlZGVmIGtocm9ub3NfaW50MzJfdCAgR0xjbGFtcHg7Ci0KLXR5cGVkZWYga2hyb25vc19pbnRwdHJfdCBHTGludHB0cjsKLXR5cGVkZWYga2hyb25vc19zc2l6ZV90ICBHTHNpemVpcHRyOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBPcGVuR0wgRVMgY29yZSB2ZXJzaW9ucyAqLwotI2RlZmluZSBHTF9WRVJTSU9OX0VTX0NNXzFfMCAgICAgICAgICAxCi0jZGVmaW5lIEdMX1ZFUlNJT05fRVNfQ0xfMV8wICAgICAgICAgIDEKLSNkZWZpbmUgR0xfVkVSU0lPTl9FU19DTV8xXzEgICAgICAgICAgMQotI2RlZmluZSBHTF9WRVJTSU9OX0VTX0NMXzFfMSAgICAgICAgICAxCi0KLS8qIENsZWFyQnVmZmVyTWFzayAqLwotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotCi0vKiBCb29sZWFuICovCi0jZGVmaW5lIEdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0KLS8qIEJlZ2luTW9kZSAqLwotI2RlZmluZSBHTF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIEdMX0xJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgR0xfTElORV9MT09QICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBHTF9MSU5FX1NUUklQICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCi0jZGVmaW5lIEdMX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgR0xfVFJJQU5HTEVfU1RSSVAgICAgICAgICAgICAgICAgIDB4MDAwNQotI2RlZmluZSBHTF9UUklBTkdMRV9GQU4gICAgICAgICAgICAgICAgICAgMHgwMDA2Ci0KLS8qIEFscGhhRnVuY3Rpb24gKi8KLSNkZWZpbmUgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCi0jZGVmaW5lIEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDIKLSNkZWZpbmUgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMwotI2RlZmluZSBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA0Ci0jZGVmaW5lIEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAweDAyMDUKLSNkZWZpbmUgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNgotI2RlZmluZSBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA3Ci0KLS8qIEJsZW5kaW5nRmFjdG9yRGVzdCAqLwotI2RlZmluZSBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTF9PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwCi0jZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICAgICAgICAweDAzMDEKLSNkZWZpbmUgR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMgotI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgMHgwMzAzCi0jZGVmaW5lIEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDQKLSNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgICAgICAgIDB4MDMwNQotCi0vKiBCbGVuZGluZ0ZhY3RvclNyYyAqLwotLyogICAgICBHTF9aRVJPICovCi0vKiAgICAgIEdMX09ORSAqLwotI2RlZmluZSBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzA2Ci0jZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAweDAzMDcKLSNkZWZpbmUgR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAgICAgICAgICAgIDB4MDMwOAotLyogICAgICBHTF9TUkNfQUxQSEEgKi8KLS8qICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAqLwotLyogICAgICBHTF9EU1RfQUxQSEEgKi8KLS8qICAgICAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAqLwotCi0vKiBDbGlwUGxhbmVOYW1lICovCi0jZGVmaW5lIEdMX0NMSVBfUExBTkUwICAgICAgICAgICAgICAgICAgICAweDMwMDAKLSNkZWZpbmUgR0xfQ0xJUF9QTEFORTEgICAgICAgICAgICAgICAgICAgIDB4MzAwMQotI2RlZmluZSBHTF9DTElQX1BMQU5FMiAgICAgICAgICAgICAgICAgICAgMHgzMDAyCi0jZGVmaW5lIEdMX0NMSVBfUExBTkUzICAgICAgICAgICAgICAgICAgICAweDMwMDMKLSNkZWZpbmUgR0xfQ0xJUF9QTEFORTQgICAgICAgICAgICAgICAgICAgIDB4MzAwNAotI2RlZmluZSBHTF9DTElQX1BMQU5FNSAgICAgICAgICAgICAgICAgICAgMHgzMDA1Ci0KLS8qIENvbG9yTWF0ZXJpYWxGYWNlICovCi0vKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCi0KLS8qIENvbG9yTWF0ZXJpYWxQYXJhbWV0ZXIgKi8KLS8qICAgICAgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAqLwotCi0vKiBDb2xvclBvaW50ZXJUeXBlICovCi0vKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KLS8qICAgICAgR0xfRkxPQVQgKi8KLS8qICAgICAgR0xfRklYRUQgKi8KLQotLyogQ3VsbEZhY2VNb2RlICovCi0jZGVmaW5lIEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDQKLSNkZWZpbmUgR0xfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNQotI2RlZmluZSBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgMHgwNDA4Ci0KLS8qIERlcHRoRnVuY3Rpb24gKi8KLS8qICAgICAgR0xfTkVWRVIgKi8KLS8qICAgICAgR0xfTEVTUyAqLwotLyogICAgICBHTF9FUVVBTCAqLwotLyogICAgICBHTF9MRVFVQUwgKi8KLS8qICAgICAgR0xfR1JFQVRFUiAqLwotLyogICAgICBHTF9OT1RFUVVBTCAqLwotLyogICAgICBHTF9HRVFVQUwgKi8KLS8qICAgICAgR0xfQUxXQVlTICovCi0KLS8qIEVuYWJsZUNhcCAqLwotI2RlZmluZSBHTF9GT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQjYwCi0jZGVmaW5lIEdMX0xJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgICAweDBCNTAKLSNkZWZpbmUgR0xfVEVYVFVSRV8yRCAgICAgICAgICAgICAgICAgICAgIDB4MERFMQotI2RlZmluZSBHTF9DVUxMX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgMHgwQjQ0Ci0jZGVmaW5lIEdMX0FMUEhBX1RFU1QgICAgICAgICAgICAgICAgICAgICAweDBCQzAKLSNkZWZpbmUgR0xfQkxFTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJFMgotI2RlZmluZSBHTF9DT0xPUl9MT0dJQ19PUCAgICAgICAgICAgICAgICAgMHgwQkYyCi0jZGVmaW5lIEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9URVNUICAgICAgICAgICAgICAgICAgIDB4MEI5MAotI2RlZmluZSBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQjcxCi0vKiAgICAgIEdMX0xJR0hUMCAqLwotLyogICAgICBHTF9MSUdIVDEgKi8KLS8qICAgICAgR0xfTElHSFQyICovCi0vKiAgICAgIEdMX0xJR0hUMyAqLwotLyogICAgICBHTF9MSUdIVDQgKi8KLS8qICAgICAgR0xfTElHSFQ1ICovCi0vKiAgICAgIEdMX0xJR0hUNiAqLwotLyogICAgICBHTF9MSUdIVDcgKi8KLSNkZWZpbmUgR0xfUE9JTlRfU01PT1RIICAgICAgICAgICAgICAgICAgIDB4MEIxMAotI2RlZmluZSBHTF9MSU5FX1NNT09USCAgICAgICAgICAgICAgICAgICAgMHgwQjIwCi0jZGVmaW5lIEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAweDBDMTEKLSNkZWZpbmUgR0xfQ09MT1JfTUFURVJJQUwgICAgICAgICAgICAgICAgIDB4MEI1NwotI2RlZmluZSBHTF9OT1JNQUxJWkUgICAgICAgICAgICAgICAgICAgICAgMHgwQkExCi0jZGVmaW5lIEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAweDgwM0EKLSNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAgICAgICAgICAgIDB4ODAzNwotI2RlZmluZSBHTF9WRVJURVhfQVJSQVkgICAgICAgICAgICAgICAgICAgMHg4MDc0Ci0jZGVmaW5lIEdMX05PUk1BTF9BUlJBWSAgICAgICAgICAgICAgICAgICAweDgwNzUKLSNkZWZpbmUgR0xfQ09MT1JfQVJSQVkgICAgICAgICAgICAgICAgICAgIDB4ODA3NgotI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICAgICAgICAgICAgMHg4MDc4Ci0jZGVmaW5lIEdMX01VTFRJU0FNUExFICAgICAgICAgICAgICAgICAgICAweDgwOUQKLSNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgIDB4ODA5RQotI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgMHg4MDlGCi0jZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAweDgwQTAKLQotLyogRXJyb3JDb2RlICovCi0jZGVmaW5lIEdMX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdMX0lOVkFMSURfRU5VTSAgICAgICAgICAgICAgICAgICAweDA1MDAKLSNkZWZpbmUgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgIDB4MDUwMQotI2RlZmluZSBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgMHgwNTAyCi0jZGVmaW5lIEdMX1NUQUNLX09WRVJGTE9XICAgICAgICAgICAgICAgICAweDA1MDMKLSNkZWZpbmUgR0xfU1RBQ0tfVU5ERVJGTE9XICAgICAgICAgICAgICAgIDB4MDUwNAotI2RlZmluZSBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgMHgwNTA1Ci0KLS8qIEZvZ01vZGUgKi8KLS8qICAgICAgR0xfTElORUFSICovCi0jZGVmaW5lIEdMX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKLSNkZWZpbmUgR0xfRVhQMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMQotCi0vKiBGb2dQYXJhbWV0ZXIgKi8KLSNkZWZpbmUgR0xfRk9HX0RFTlNJVFkgICAgICAgICAgICAgICAgICAgIDB4MEI2MgotI2RlZmluZSBHTF9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgMHgwQjYzCi0jZGVmaW5lIEdMX0ZPR19FTkQgICAgICAgICAgICAgICAgICAgICAgICAweDBCNjQKLSNkZWZpbmUgR0xfRk9HX01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NQotI2RlZmluZSBHTF9GT0dfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwQjY2Ci0KLS8qIEZyb250RmFjZURpcmVjdGlvbiAqLwotI2RlZmluZSBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwCi0jZGVmaW5lIEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDEKLQotLyogR2V0UE5hbWUgKi8KLSNkZWZpbmUgR0xfQ1VSUkVOVF9DT0xPUiAgICAgICAgICAgICAgICAgIDB4MEIwMAotI2RlZmluZSBHTF9DVVJSRU5UX05PUk1BTCAgICAgICAgICAgICAgICAgMHgwQjAyCi0jZGVmaW5lIEdMX0NVUlJFTlRfVEVYVFVSRV9DT09SRFMgICAgICAgICAweDBCMDMKLSNkZWZpbmUgR0xfUE9JTlRfU0laRSAgICAgICAgICAgICAgICAgICAgIDB4MEIxMQotI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTiAgICAgICAgICAgICAgICAgMHg4MTI2Ci0jZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYICAgICAgICAgICAgICAgICAweDgxMjcKLSNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRSAgICAgIDB4ODEyOAotI2RlZmluZSBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAgICAgMHg4MTI5Ci0jZGVmaW5lIEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAweDBCMTIKLSNkZWZpbmUgR0xfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDB4MEIyMQotI2RlZmluZSBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSAgICAgICAgMHgwQjIyCi0jZGVmaW5lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAweDg0NkQKLSNkZWZpbmUgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFICAgICAgIDB4ODQ2RQotI2RlZmluZSBHTF9DVUxMX0ZBQ0VfTU9ERSAgICAgICAgICAgICAgICAgMHgwQjQ1Ci0jZGVmaW5lIEdMX0ZST05UX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAweDBCNDYKLSNkZWZpbmUgR0xfU0hBREVfTU9ERUwgICAgICAgICAgICAgICAgICAgIDB4MEI1NAotI2RlZmluZSBHTF9ERVBUSF9SQU5HRSAgICAgICAgICAgICAgICAgICAgMHgwQjcwCi0jZGVmaW5lIEdMX0RFUFRIX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAweDBCNzIKLSNkZWZpbmUgR0xfREVQVEhfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgIDB4MEI3MwotI2RlZmluZSBHTF9ERVBUSF9GVU5DICAgICAgICAgICAgICAgICAgICAgMHgwQjc0Ci0jZGVmaW5lIEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUgICAgICAgICAgICAweDBCOTEKLSNkZWZpbmUgR0xfU1RFTkNJTF9GVU5DICAgICAgICAgICAgICAgICAgIDB4MEI5MgotI2RlZmluZSBHTF9TVEVOQ0lMX1ZBTFVFX01BU0sgICAgICAgICAgICAgMHgwQjkzCi0jZGVmaW5lIEdMX1NURU5DSUxfRkFJTCAgICAgICAgICAgICAgICAgICAweDBCOTQKLSNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgICAgICAgIDB4MEI5NQotI2RlZmluZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgMHgwQjk2Ci0jZGVmaW5lIEdMX1NURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICAweDBCOTcKLSNkZWZpbmUgR0xfU1RFTkNJTF9XUklURU1BU0sgICAgICAgICAgICAgIDB4MEI5OAotI2RlZmluZSBHTF9NQVRSSVhfTU9ERSAgICAgICAgICAgICAgICAgICAgMHgwQkEwCi0jZGVmaW5lIEdMX1ZJRVdQT1JUICAgICAgICAgICAgICAgICAgICAgICAweDBCQTIKLSNkZWZpbmUgR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgICAgIDB4MEJBMwotI2RlZmluZSBHTF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAgICAgMHgwQkE0Ci0jZGVmaW5lIEdMX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAweDBCQTUKLSNkZWZpbmUgR0xfTU9ERUxWSUVXX01BVFJJWCAgICAgICAgICAgICAgIDB4MEJBNgotI2RlZmluZSBHTF9QUk9KRUNUSU9OX01BVFJJWCAgICAgICAgICAgICAgMHgwQkE3Ci0jZGVmaW5lIEdMX1RFWFRVUkVfTUFUUklYICAgICAgICAgICAgICAgICAweDBCQTgKLSNkZWZpbmUgR0xfQUxQSEFfVEVTVF9GVU5DICAgICAgICAgICAgICAgIDB4MEJDMQotI2RlZmluZSBHTF9BTFBIQV9URVNUX1JFRiAgICAgICAgICAgICAgICAgMHgwQkMyCi0jZGVmaW5lIEdMX0JMRU5EX0RTVCAgICAgICAgICAgICAgICAgICAgICAweDBCRTAKLSNkZWZpbmUgR0xfQkxFTkRfU1JDICAgICAgICAgICAgICAgICAgICAgIDB4MEJFMQotI2RlZmluZSBHTF9MT0dJQ19PUF9NT0RFICAgICAgICAgICAgICAgICAgMHgwQkYwCi0jZGVmaW5lIEdMX1NDSVNTT1JfQk9YICAgICAgICAgICAgICAgICAgICAweDBDMTAKLSNkZWZpbmUgR0xfU0NJU1NPUl9URVNUICAgICAgICAgICAgICAgICAgIDB4MEMxMQotI2RlZmluZSBHTF9DT0xPUl9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgMHgwQzIyCi0jZGVmaW5lIEdMX0NPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAweDBDMjMKLSNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgIDB4MENGNQotI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMHgwRDA1Ci0jZGVmaW5lIEdMX01BWF9MSUdIVFMgICAgICAgICAgICAgICAgICAgICAweDBEMzEKLSNkZWZpbmUgR0xfTUFYX0NMSVBfUExBTkVTICAgICAgICAgICAgICAgIDB4MEQzMgotI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgMHgwRDMzCi0jZGVmaW5lIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggICAgICAweDBEMzYKLSNkZWZpbmUgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgIDB4MEQzOAotI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgMHgwRDM5Ci0jZGVmaW5lIEdMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAweDBEM0EKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgIDB4ODRFMgotI2RlZmluZSBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgMHgwRDUwCi0jZGVmaW5lIEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAweDBENTIKLSNkZWZpbmUgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MwotI2RlZmluZSBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgMHgwRDU0Ci0jZGVmaW5lIEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTUKLSNkZWZpbmUgR0xfREVQVEhfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NgotI2RlZmluZSBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgMHgwRDU3Ci0jZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTICAgICAgICAgICAweDJBMDAKLSNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAgICAgICAgICAgIDB4ODAzNwotI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgICAgICAgICAgMHg4MDM4Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRCAgICAgICAgICAgICAweDgwNjkKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1NJWkUgICAgICAgICAgICAgIDB4ODA3QQotI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfVFlQRSAgICAgICAgICAgICAgMHg4MDdCCi0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgICAgICAgICAgICAweDgwN0MKLSNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1RZUEUgICAgICAgICAgICAgIDB4ODA3RQotI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICAgICAgICAgICAgMHg4MDdGCi0jZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAweDgwODEKLSNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfVFlQRSAgICAgICAgICAgICAgIDB4ODA4MgotI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TVFJJREUgICAgICAgICAgICAgMHg4MDgzCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSAgICAgICAweDgwODgKLSNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFICAgICAgIDB4ODA4OQotI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSAgICAgMHg4MDhBCi0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSICAgICAgICAgICAweDgwOEUKLSNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1BPSU5URVIgICAgICAgICAgIDB4ODA4RgotI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgMHg4MDkwCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUiAgICAweDgwOTIKLSNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgIDB4ODBBOAotI2RlZmluZSBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEE5Ci0jZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAgICAgICAgICAweDgwQUEKLSNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgIDB4ODBBQgotCi0vKiBHZXRUZXh0dXJlUGFyYW1ldGVyICovCi0vKiAgICAgIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAqLwotLyogICAgICBHTF9URVhUVVJFX01JTl9GSUxURVIgKi8KLS8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1MgKi8KLS8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1QgKi8KLQotI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKLQotLyogSGludE1vZGUgKi8KLSNkZWZpbmUgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMAotI2RlZmluZSBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAxCi0jZGVmaW5lIEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDIKLQotLyogSGludFRhcmdldCAqLwotI2RlZmluZSBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgICAgMHgwQzUwCi0jZGVmaW5lIEdMX1BPSU5UX1NNT09USF9ISU5UICAgICAgICAgICAgICAweDBDNTEKLSNkZWZpbmUgR0xfTElORV9TTU9PVEhfSElOVCAgICAgICAgICAgICAgIDB4MEM1MgotI2RlZmluZSBHTF9GT0dfSElOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwQzU0Ci0jZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UICAgICAgICAgICAweDgxOTIKLQotLyogTGlnaHRNb2RlbFBhcmFtZXRlciAqLwotI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICAgICAgICAgICAgMHgwQjUzCi0jZGVmaW5lIEdMX0xJR0hUX01PREVMX1RXT19TSURFICAgICAgICAgICAweDBCNTIKLQotLyogTGlnaHRQYXJhbWV0ZXIgKi8KLSNkZWZpbmUgR0xfQU1CSUVOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMAotI2RlZmluZSBHTF9ESUZGVVNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAxCi0jZGVmaW5lIEdMX1NQRUNVTEFSICAgICAgICAgICAgICAgICAgICAgICAweDEyMDIKLSNkZWZpbmUgR0xfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMwotI2RlZmluZSBHTF9TUE9UX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgMHgxMjA0Ci0jZGVmaW5lIEdMX1NQT1RfRVhQT05FTlQgICAgICAgICAgICAgICAgICAweDEyMDUKLSNkZWZpbmUgR0xfU1BPVF9DVVRPRkYgICAgICAgICAgICAgICAgICAgIDB4MTIwNgotI2RlZmluZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAgICAgICAgICAgMHgxMjA3Ci0jZGVmaW5lIEdMX0xJTkVBUl9BVFRFTlVBVElPTiAgICAgICAgICAgICAweDEyMDgKLSNkZWZpbmUgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OICAgICAgICAgIDB4MTIwOQotCi0vKiBEYXRhVHlwZSAqLwotI2RlZmluZSBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAwCi0jZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAweDE0MDEKLSNkZWZpbmUgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMgotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgMHgxNDAzCi0jZGVmaW5lIEdMX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDYKLSNkZWZpbmUgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwQwotCi0vKiBMb2dpY09wICovCi0jZGVmaW5lIEdMX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDAKLSNkZWZpbmUgR0xfQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMQotI2RlZmluZSBHTF9BTkRfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgMHgxNTAyCi0jZGVmaW5lIEdMX0NPUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDMKLSNkZWZpbmUgR0xfQU5EX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgIDB4MTUwNAotI2RlZmluZSBHTF9OT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA1Ci0jZGVmaW5lIEdMX1hPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDYKLSNkZWZpbmUgR0xfT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNwotI2RlZmluZSBHTF9OT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA4Ci0jZGVmaW5lIEdMX0VRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDkKLSNkZWZpbmUgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwQQotI2RlZmluZSBHTF9PUl9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgMHgxNTBCCi0jZGVmaW5lIEdMX0NPUFlfSU5WRVJURUQgICAgICAgICAgICAgICAgICAweDE1MEMKLSNkZWZpbmUgR0xfT1JfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgIDB4MTUwRAotI2RlZmluZSBHTF9OQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBFCi0jZGVmaW5lIEdMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEYKLQotLyogTWF0ZXJpYWxGYWNlICovCi0vKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCi0KLS8qIE1hdGVyaWFsUGFyYW1ldGVyICovCi0jZGVmaW5lIEdMX0VNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAweDE2MDAKLSNkZWZpbmUgR0xfU0hJTklORVNTICAgICAgICAgICAgICAgICAgICAgIDB4MTYwMQotI2RlZmluZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICAgICAgICAgICAgMHgxNjAyCi0vKiAgICAgIEdMX0FNQklFTlQgKi8KLS8qICAgICAgR0xfRElGRlVTRSAqLwotLyogICAgICBHTF9TUEVDVUxBUiAqLwotCi0vKiBNYXRyaXhNb2RlICovCi0jZGVmaW5lIEdMX01PREVMVklFVyAgICAgICAgICAgICAgICAgICAgICAweDE3MDAKLSNkZWZpbmUgR0xfUFJPSkVDVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MTcwMQotI2RlZmluZSBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgMHgxNzAyCi0KLS8qIE5vcm1hbFBvaW50ZXJUeXBlICovCi0vKiAgICAgIEdMX0JZVEUgKi8KLS8qICAgICAgR0xfU0hPUlQgKi8KLS8qICAgICAgR0xfRkxPQVQgKi8KLS8qICAgICAgR0xfRklYRUQgKi8KLQotLyogUGl4ZWxGb3JtYXQgKi8KLSNkZWZpbmUgR0xfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNgotI2RlZmluZSBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA3Ci0jZGVmaW5lIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDgKLSNkZWZpbmUgR0xfTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOQotI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgMHgxOTBBCi0KLS8qIFBpeGVsU3RvcmVQYXJhbWV0ZXIgKi8KLSNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgIDB4MENGNQotI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMHgwRDA1Ci0KLS8qIFBpeGVsVHlwZSAqLwotLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgICAgICAgICAweDgwMzMKLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAgICAgICAgIDB4ODAzNAotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgMHg4MzYzCi0KLS8qIFNoYWRpbmdNb2RlbCAqLwotI2RlZmluZSBHTF9GTEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAwCi0jZGVmaW5lIEdMX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAweDFEMDEKLQotLyogU3RlbmNpbEZ1bmN0aW9uICovCi0vKiAgICAgIEdMX05FVkVSICovCi0vKiAgICAgIEdMX0xFU1MgKi8KLS8qICAgICAgR0xfRVFVQUwgKi8KLS8qICAgICAgR0xfTEVRVUFMICovCi0vKiAgICAgIEdMX0dSRUFURVIgKi8KLS8qICAgICAgR0xfTk9URVFVQUwgKi8KLS8qICAgICAgR0xfR0VRVUFMICovCi0vKiAgICAgIEdMX0FMV0FZUyAqLwotCi0vKiBTdGVuY2lsT3AgKi8KLS8qICAgICAgR0xfWkVSTyAqLwotI2RlZmluZSBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAwCi0jZGVmaW5lIEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDEKLSNkZWZpbmUgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMgotI2RlZmluZSBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAzCi0vKiAgICAgIEdMX0lOVkVSVCAqLwotCi0vKiBTdHJpbmdOYW1lICovCi0jZGVmaW5lIEdMX1ZFTkRPUiAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAKLSNkZWZpbmUgR0xfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMQotI2RlZmluZSBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAyCi0jZGVmaW5lIEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAweDFGMDMKLQotLyogVGV4Q29vcmRQb2ludGVyVHlwZSAqLwotLyogICAgICBHTF9TSE9SVCAqLwotLyogICAgICBHTF9GTE9BVCAqLwotLyogICAgICBHTF9GSVhFRCAqLwotLyogICAgICBHTF9CWVRFICovCi0KLS8qIFRleHR1cmVFbnZNb2RlICovCi0jZGVmaW5lIEdMX01PRFVMQVRFICAgICAgICAgICAgICAgICAgICAgICAweDIxMDAKLSNkZWZpbmUgR0xfREVDQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMQotLyogICAgICBHTF9CTEVORCAqLwotI2RlZmluZSBHTF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0Ci0vKiAgICAgIEdMX1JFUExBQ0UgKi8KLQotLyogVGV4dHVyZUVudlBhcmFtZXRlciAqLwotI2RlZmluZSBHTF9URVhUVVJFX0VOVl9NT0RFICAgICAgICAgICAgICAgMHgyMjAwCi0jZGVmaW5lIEdMX1RFWFRVUkVfRU5WX0NPTE9SICAgICAgICAgICAgICAweDIyMDEKLQotLyogVGV4dHVyZUVudlRhcmdldCAqLwotI2RlZmluZSBHTF9URVhUVVJFX0VOViAgICAgICAgICAgICAgICAgICAgMHgyMzAwCi0KLS8qIFRleHR1cmVNYWdGaWx0ZXIgKi8KLSNkZWZpbmUgR0xfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMAotI2RlZmluZSBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAxCi0KLS8qIFRleHR1cmVNaW5GaWx0ZXIgKi8KLS8qICAgICAgR0xfTkVBUkVTVCAqLwotLyogICAgICBHTF9MSU5FQVIgKi8KLSNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgIDB4MjcwMAotI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgMHgyNzAxCi0jZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiAgICAgICAgICAweDI3MDIKLSNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgIDB4MjcwMwotCi0vKiBUZXh0dXJlUGFyYW1ldGVyTmFtZSAqLwotI2RlZmluZSBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgMHgyODAwCi0jZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDEKLSNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1MgICAgICAgICAgICAgICAgIDB4MjgwMgotI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgMHgyODAzCi0jZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUCAgICAgICAgICAgICAgICAweDgxOTEKLQotLyogVGV4dHVyZVRhcmdldCAqLwotLyogICAgICBHTF9URVhUVVJFXzJEICovCi0KLS8qIFRleHR1cmVVbml0ICovCi0jZGVmaW5lIEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAweDg0QzAKLSNkZWZpbmUgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMQotI2RlZmluZSBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMyCi0jZGVmaW5lIEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAweDg0QzMKLSNkZWZpbmUgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNAotI2RlZmluZSBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM1Ci0jZGVmaW5lIEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzYKLSNkZWZpbmUgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNwotI2RlZmluZSBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM4Ci0jZGVmaW5lIEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzkKLSNkZWZpbmUgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQQotI2RlZmluZSBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgMHg4NENCCi0jZGVmaW5lIEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAweDg0Q0MKLSNkZWZpbmUgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRAotI2RlZmluZSBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgMHg4NENFCi0jZGVmaW5lIEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0YKLSNkZWZpbmUgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMAotI2RlZmluZSBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgMHg4NEQxCi0jZGVmaW5lIEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAweDg0RDIKLSNkZWZpbmUgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMwotI2RlZmluZSBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ0Ci0jZGVmaW5lIEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAweDg0RDUKLSNkZWZpbmUgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDB4ODRENgotI2RlZmluZSBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ3Ci0jZGVmaW5lIEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAweDg0RDgKLSNkZWZpbmUgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOQotI2RlZmluZSBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgMHg4NERBCi0jZGVmaW5lIEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAweDg0REIKLSNkZWZpbmUgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQwotI2RlZmluZSBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgMHg4NERECi0jZGVmaW5lIEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAweDg0REUKLSNkZWZpbmUgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDB4ODRERgotI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgMHg4NEUwCi0jZGVmaW5lIEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAweDg0RTEKLQotLyogVGV4dHVyZVdyYXBNb2RlICovCi0jZGVmaW5lIEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAweDI5MDEKLSNkZWZpbmUgR0xfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgIDB4ODEyRgotCi0vKiBWZXJ0ZXhQb2ludGVyVHlwZSAqLwotLyogICAgICBHTF9TSE9SVCAqLwotLyogICAgICBHTF9GTE9BVCAqLwotLyogICAgICBHTF9GSVhFRCAqLwotLyogICAgICBHTF9CWVRFICovCi0KLS8qIExpZ2h0TmFtZSAqLwotI2RlZmluZSBHTF9MSUdIVDAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCi0jZGVmaW5lIEdMX0xJR0hUMSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDEKLSNkZWZpbmUgR0xfTElHSFQyICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMgotI2RlZmluZSBHTF9MSUdIVDMgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAzCi0jZGVmaW5lIEdMX0xJR0hUNCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDQKLSNkZWZpbmUgR0xfTElHSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNQotI2RlZmluZSBHTF9MSUdIVDYgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA2Ci0jZGVmaW5lIEdMX0xJR0hUNyAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDcKLQotLyogQnVmZmVyIE9iamVjdHMgKi8KLSNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgIDB4ODg5MgotI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgMHg4ODkzCi0KLSNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgICAweDg4OTQKLSNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAweDg4OTUKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAweDg4OTYKLSNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAweDg4OTcKLSNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAweDg4OTgKLSNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUEKLQotI2RlZmluZSBHTF9TVEFUSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgMHg4OEU0Ci0jZGVmaW5lIEdMX0RZTkFNSUNfRFJBVyAgICAgICAgICAgICAgICAgICAweDg4RTgKLQotI2RlZmluZSBHTF9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgMHg4NzY0Ci0jZGVmaW5lIEdMX0JVRkZFUl9VU0FHRSAgICAgICAgICAgICAgICAgICAweDg3NjUKLQotLyogVGV4dHVyZSBjb21iaW5lICsgZG90MyAqLwotI2RlZmluZSBHTF9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEU3Ci0jZGVmaW5lIEdMX0NPTUJJTkUgICAgICAgICAgICAgICAgICAgICAgICAweDg1NzAKLSNkZWZpbmUgR0xfQ09NQklORV9SR0IgICAgICAgICAgICAgICAgICAgIDB4ODU3MQotI2RlZmluZSBHTF9DT01CSU5FX0FMUEhBICAgICAgICAgICAgICAgICAgMHg4NTcyCi0jZGVmaW5lIEdMX1JHQl9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAweDg1NzMKLSNkZWZpbmUgR0xfQUREX1NJR05FRCAgICAgICAgICAgICAgICAgICAgIDB4ODU3NAotI2RlZmluZSBHTF9JTlRFUlBPTEFURSAgICAgICAgICAgICAgICAgICAgMHg4NTc1Ci0jZGVmaW5lIEdMX0NPTlNUQU5UICAgICAgICAgICAgICAgICAgICAgICAweDg1NzYKLSNkZWZpbmUgR0xfUFJJTUFSWV9DT0xPUiAgICAgICAgICAgICAgICAgIDB4ODU3NwotI2RlZmluZSBHTF9QUkVWSU9VUyAgICAgICAgICAgICAgICAgICAgICAgMHg4NTc4Ci0jZGVmaW5lIEdMX09QRVJBTkQwX1JHQiAgICAgICAgICAgICAgICAgICAweDg1OTAKLSNkZWZpbmUgR0xfT1BFUkFORDFfUkdCICAgICAgICAgICAgICAgICAgIDB4ODU5MQotI2RlZmluZSBHTF9PUEVSQU5EMl9SR0IgICAgICAgICAgICAgICAgICAgMHg4NTkyCi0jZGVmaW5lIEdMX09QRVJBTkQwX0FMUEhBICAgICAgICAgICAgICAgICAweDg1OTgKLSNkZWZpbmUgR0xfT1BFUkFORDFfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODU5OQotI2RlZmluZSBHTF9PUEVSQU5EMl9BTFBIQSAgICAgICAgICAgICAgICAgMHg4NTlBCi0KLSNkZWZpbmUgR0xfQUxQSEFfU0NBTEUgICAgICAgICAgICAgICAgICAgIDB4MEQxQwotCi0jZGVmaW5lIEdMX1NSQzBfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg1ODAKLSNkZWZpbmUgR0xfU1JDMV9SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4ODU4MQotI2RlZmluZSBHTF9TUkMyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgMHg4NTgyCi0jZGVmaW5lIEdMX1NSQzBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAweDg1ODgKLSNkZWZpbmUgR0xfU1JDMV9BTFBIQSAgICAgICAgICAgICAgICAgICAgIDB4ODU4OQotI2RlZmluZSBHTF9TUkMyX0FMUEhBICAgICAgICAgICAgICAgICAgICAgMHg4NThBCi0KLSNkZWZpbmUgR0xfRE9UM19SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRQotI2RlZmluZSBHTF9ET1QzX1JHQkEgICAgICAgICAgICAgICAgICAgICAgMHg4NkFGCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogcmVxdWlyZWQgT0VTIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogT0VTX3JlYWRfZm9ybWF0ICovCi0jaWZuZGVmIEdMX09FU19yZWFkX2Zvcm1hdAotI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTICAgICAgICAgICAgICAgICAgIDB4OEI5QQotI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMgICAgICAgICAgICAgICAgIDB4OEI5QgotI2VuZGlmCi0KLS8qIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZQotI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MAotI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MQotI2RlZmluZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MgotI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MwotI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NAotI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NQotI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NgotI2RlZmluZSBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NwotI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5OAotI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5OQotI2VuZGlmCi0KLS8qIE9FU19wb2ludF9zaXplX2FycmF5ICovCi0jaWZuZGVmIEdMX09FU19wb2ludF9zaXplX2FycmF5Ci0jZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjlDCi0jZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OThBCi0jZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OThCCi0jZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OThDCi0jZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgMHg4QjlGCi0jZW5kaWYKLQotLyogR0xfT0VTX3BvaW50X3Nwcml0ZSAqLwotI2lmbmRlZiBHTF9PRVNfcG9pbnRfc3ByaXRlCi0jZGVmaW5lIEdMX1BPSU5UX1NQUklURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODYxCi0jZGVmaW5lIEdMX0NPT1JEX1JFUExBQ0VfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODYyCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEF2YWlsYWJsZSBvbmx5IGluIENvbW1vbiBwcm9maWxlICovCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEFscGhhRnVuYyAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyQ29sb3IgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xlYXJEZXB0aGYgKEdMY2xhbXBmIGRlcHRoKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xpcFBsYW5lZiAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yNGYgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aFJhbmdlZiAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2dmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2dmdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcnVzdHVtZiAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldENsaXBQbGFuZWYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRGbG9hdHYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0TGlnaHRmdiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldE1hdGVyaWFsZnYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleEVudmZ2IChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0TW9kZWxmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodE1vZGVsZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRmIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0ZnYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaW5lV2lkdGggKEdMZmxvYXQgd2lkdGgpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2FkTWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFsZiAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFsZnYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRNYXRyaXhmIChjb25zdCBHTGZsb2F0ICptKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xOb3JtYWwzZiAoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE9ydGhvZiAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFNpemUgKEdMZmxvYXQgc2l6ZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvbHlnb25PZmZzZXQgKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUm90YXRlZiAoR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNjYWxlZiAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRyYW5zbGF0ZWYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotCi0vKiBBdmFpbGFibGUgaW4gYm90aCBDb21tb24gYW5kIENvbW1vbi1MaXRlIHByb2ZpbGVzICovCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQWxwaGFGdW5jeCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRCdWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmMgKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3Rvcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJ1ZmZlckRhdGEgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCdWZmZXJTdWJEYXRhIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xlYXIgKEdMYml0ZmllbGQgbWFzayk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyQ29sb3J4IChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyRGVwdGh4IChHTGNsYW1weCBkZXB0aCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyU3RlbmNpbCAoR0xpbnQgcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaWVudEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xpcFBsYW5leCAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yNHViIChHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29sb3I0eCAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yTWFzayAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29sb3JQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvcHlUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEN1bGxGYWNlIChHTGVudW0gbW9kZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlVGV4dHVyZXMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoRnVuYyAoR0xlbnVtIGZ1bmMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aE1hc2sgKEdMYm9vbGVhbiBmbGFnKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhSYW5nZXggKEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzYWJsZSAoR0xlbnVtIGNhcCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERpc2FibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0FycmF5cyAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0VsZW1lbnRzIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEVuYWJsZSAoR0xlbnVtIGNhcCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEVuYWJsZUNsaWVudFN0YXRlIChHTGVudW0gYXJyYXkpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGaW5pc2ggKHZvaWQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGbHVzaCAodm9pZCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZvZ3ggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZvZ3h2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZyb250RmFjZSAoR0xlbnVtIG1vZGUpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcnVzdHVteCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJvb2xlYW52IChHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldENsaXBQbGFuZXggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5CdWZmZXJzIChHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdlblRleHR1cmVzIChHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpOwotR0xfQVBJIEdMZW51bSBHTF9BUElFTlRSWSBnbEdldEVycm9yICh2b2lkKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0Rml4ZWR2IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEludGVnZXJ2IChHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRMaWdodHh2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0TWF0ZXJpYWx4diAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UG9pbnRlcnYgKEdMZW51bSBwbmFtZSwgR0x2b2lkICoqcGFyYW1zKTsKLUdMX0FQSSBjb25zdCBHTHVieXRlICogR0xfQVBJRU5UUlkgZ2xHZXRTdHJpbmcgKEdMZW51bSBuYW1lKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4RW52aXYgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleEVudnh2IChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJ4diAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xIaW50IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7Ci1HTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNCdWZmZXIgKEdMdWludCBidWZmZXIpOwotR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzRW5hYmxlZCAoR0xlbnVtIGNhcCk7Ci1HTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNUZXh0dXJlIChHTHVpbnQgdGV4dHVyZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0TW9kZWx4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodE1vZGVseHYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHR4IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0eHYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaW5lV2lkdGh4IChHTGZpeGVkIHdpZHRoKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZElkZW50aXR5ICh2b2lkKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZE1hdHJpeHggKGNvbnN0IEdMZml4ZWQgKm0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2dpY09wIChHTGVudW0gb3Bjb2RlKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0ZXJpYWx4IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0ZXJpYWx4diAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0cml4TW9kZSAoR0xlbnVtIG1vZGUpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0TWF0cml4eCAoY29uc3QgR0xmaXhlZCAqbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0eCAoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTm9ybWFsM3ggKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE9ydGhveCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBpeGVsU3RvcmVpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJ4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcnh2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50U2l6ZXggKEdMZml4ZWQgc2l6ZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvbHlnb25PZmZzZXR4IChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvcE1hdHJpeCAodm9pZCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFB1c2hNYXRyaXggKHZvaWQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZWFkUGl4ZWxzIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUm90YXRleCAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdlIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdleCAoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTY2FsZXggKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTY2lzc29yIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNoYWRlTW9kZWwgKEdMZW51bSBtb2RlKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbEZ1bmMgKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE1hc2sgKEdMdWludCBtYXNrKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE9wIChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4RW52aSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudnggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZ4diAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmkgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJ4IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyeHYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUcmFuc2xhdGV4IChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4UG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xWaWV3cG9ydCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIFJlcXVpcmVkIE9FUyBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX09FU19yZWFkX2Zvcm1hdCAqLwotI2lmbmRlZiBHTF9PRVNfcmVhZF9mb3JtYXQKLSNkZWZpbmUgR0xfT0VTX3JlYWRfZm9ybWF0IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlICovCi0jaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUKLSNkZWZpbmUgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZSAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3BvaW50X3NpemVfYXJyYXkgKi8KLSNpZm5kZWYgR0xfT0VTX3BvaW50X3NpemVfYXJyYXkKLSNkZWZpbmUgR0xfT0VTX3BvaW50X3NpemVfYXJyYXkgMQotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFNpemVQb2ludGVyT0VTIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci0jZW5kaWYKLQotLyogR0xfT0VTX3BvaW50X3Nwcml0ZSAqLwotI2lmbmRlZiBHTF9PRVNfcG9pbnRfc3ByaXRlCi0jZGVmaW5lIEdMX09FU19wb2ludF9zcHJpdGUgMQotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX2dsX2hfICovCi0KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2xleHQuaCBiL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2xleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhZmFhYi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvaW5jbHVkZS9HTEVTL2dsZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgzICswLDAgQEAKLSNpZm5kZWYgX19nbGV4dF9oXwotI2RlZmluZSBfX2dsZXh0X2hfCi0KLS8qICRSZXZpc2lvbjogMTY0ODEgJCBvbiAkRGF0ZTo6IDIwMTItMDEtMDQgMTA6NDM6NTYgLTA4MDAgIyQgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotICogVGhpcyBkb2N1bWVudCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgU0dJIEZyZWUgU29mdHdhcmUgQiBMaWNlbnNlIFZlcnNpb24KLSAqIDIuMC4gRm9yIGRldGFpbHMsIHNlZSBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIvIC4KLSAqLwotCi0jaWZuZGVmIEdMX0FQSUVOVFJZUAotIyAgIGRlZmluZSBHTF9BUElFTlRSWVAgR0xfQVBJRU5UUlkqCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBPRVMgZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUgKi8KLSNpZm5kZWYgR0xfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlCi0vKiBCTEVORF9FUVVBVElPTl9SR0JfT0VTIHNhbWUgYXMgQkxFTkRfRVFVQVRJT05fT0VTICovCi0jZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX1JHQl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA5Ci0jZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODNECi0jZW5kaWYKLQotLyogR0xfT0VTX2JsZW5kX2Z1bmNfc2VwYXJhdGUgKi8KLSNpZm5kZWYgR0xfT0VTX2JsZW5kX2Z1bmNfc2VwYXJhdGUKLSNkZWZpbmUgR0xfQkxFTkRfRFNUX1JHQl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwQzgKLSNkZWZpbmUgR0xfQkxFTkRfU1JDX1JHQl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwQzkKLSNkZWZpbmUgR0xfQkxFTkRfRFNUX0FMUEhBX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwQ0EKLSNkZWZpbmUgR0xfQkxFTkRfU1JDX0FMUEhBX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwQ0IKLSNlbmRpZgotCi0vKiBHTF9PRVNfYmxlbmRfc3VidHJhY3QgKi8KLSNpZm5kZWYgR0xfT0VTX2JsZW5kX3N1YnRyYWN0Ci0jZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA5Ci0jZGVmaW5lIEdMX0ZVTkNfQUREX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA2Ci0jZGVmaW5lIEdMX0ZVTkNfU1VCVFJBQ1RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDBBCi0jZGVmaW5lIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDBCCi0jZW5kaWYKLQotLyogR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUKLSNkZWZpbmUgR0xfRVRDMV9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjQKLSNlbmRpZgotCi0vKiBHTF9PRVNfZGVwdGgyNCAqLwotI2lmbmRlZiBHTF9PRVNfZGVwdGgyNAotI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQyNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODFBNgotI2VuZGlmCi0KLS8qIEdMX09FU19kZXB0aDMyICovCi0jaWZuZGVmIEdMX09FU19kZXB0aDMyCi0jZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDMyX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MUE3Ci0jZW5kaWYKLQotLyogR0xfT0VTX2RyYXdfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9PRVNfZHJhd190ZXh0dXJlCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjlECi0jZW5kaWYKLQotLyogR0xfT0VTX0VHTF9pbWFnZSAqLwotI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlCi10eXBlZGVmIHZvaWQqIEdMZWdsSW1hZ2VPRVM7Ci0jZW5kaWYKLQotLyogR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCAqLwotI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsCi0vKiBHTGVnbEltYWdlT0VTIGRlZmluZWQgaW4gR0xfT0VTX0VHTF9pbWFnZSBhbHJlYWR5LiAqLwotI2RlZmluZSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2NQotI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfRVhURVJOQUxfT0VTICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2NwotI2RlZmluZSBHTF9SRVFVSVJFRF9URVhUVVJFX0lNQUdFX1VOSVRTX09FUyAgICAgICAgICAgICAgICAgICAgIDB4OEQ2OAotI2VuZGlmCi0KLS8qIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQgKi8KLSNpZm5kZWYgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludAotI2RlZmluZSBHTF9VTlNJR05FRF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwNQotI2VuZGlmCi0KLS8qIEdMX09FU19maXhlZF9wb2ludCAqLwotI2lmbmRlZiBHTF9PRVNfZml4ZWRfcG9pbnQKLSNkZWZpbmUgR0xfRklYRURfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKLSNlbmRpZgotCi0vKiBHTF9PRVNfZnJhbWVidWZmZXJfb2JqZWN0ICovCi0jaWZuZGVmIEdMX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QKLSNkZWZpbmUgR0xfTk9ORV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDQwCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDQxCi0jZGVmaW5lIEdMX1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDU2Ci0jZGVmaW5lIEdMX1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDU3Ci0jZGVmaW5lIEdMX1JHQjU2NV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDYyCi0jZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDE2X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MUE1Ci0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9XSURUSF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDQyCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDQzCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVRfT0VTICAgICAgICAgICAgICAgICAgICAgMHg4RDQ0Ci0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9SRURfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDUwCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDUxCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDUyCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDUzCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDU0Ci0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDU1Ci0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfT0VTICAgICAgICAgICAgICAgMHg4Q0QwCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUVfT0VTICAgICAgICAgICAgICAgMHg4Q0QxCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTF9PRVMgICAgICAgICAgICAgMHg4Q0QyCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFX09FUyAgICAgMHg4Q0QzCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQwX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0UwCi0jZGVmaW5lIEdMX0RFUFRIX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDIwCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0Q1Ci0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgMHg4Q0Q2Ci0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UX09FUyAgICAgICAgMHg4Q0Q3Ci0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU19PRVMgICAgICAgICAgICAgICAgMHg4Q0Q5Ci0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19PRVMgICAgICAgICAgICAgICAgICAgMHg4Q0RBCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0RECi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E2Ci0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E3Ci0jZGVmaW5lIEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEU4Ci0jZGVmaW5lIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX09FUyAgICAgICAgICAgICAgICAgICAgMHgwNTA2Ci0jZW5kaWYKLQotLyogR0xfT0VTX21hcGJ1ZmZlciAqLwotI2lmbmRlZiBHTF9PRVNfbWFwYnVmZmVyCi0jZGVmaW5lIEdMX1dSSVRFX09OTFlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OEI5Ci0jZGVmaW5lIEdMX0JVRkZFUl9BQ0NFU1NfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OEJCCi0jZGVmaW5lIEdMX0JVRkZFUl9NQVBQRURfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OEJDCi0jZGVmaW5lIEdMX0JVRkZFUl9NQVBfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OEJECi0jZW5kaWYKLQotLyogR0xfT0VTX21hdHJpeF9nZXQgKi8KLSNpZm5kZWYgR0xfT0VTX21hdHJpeF9nZXQKLSNkZWZpbmUgR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgICAgICAgICAgICAgICAweDg5OEQKLSNkZWZpbmUgR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgICAgICAgICAgICAweDg5OEUKLSNkZWZpbmUgR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgICAgICAgICAgICAgICAweDg5OEYKLSNlbmRpZgotCi0vKiBHTF9PRVNfbWF0cml4X3BhbGV0dGUgKi8KLSNpZm5kZWYgR0xfT0VTX21hdHJpeF9wYWxldHRlCi0jZGVmaW5lIEdMX01BWF9WRVJURVhfVU5JVFNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NkE0Ci0jZGVmaW5lIEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODQyCi0jZGVmaW5lIEdMX01BVFJJWF9QQUxFVFRFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODQwCi0jZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODQ0Ci0jZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NkFECi0jZGVmaW5lIEdMX0NVUlJFTlRfUEFMRVRURV9NQVRSSVhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODQzCi0jZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODQ2Ci0jZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9UWVBFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODQ3Ci0jZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODQ4Ci0jZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgMHg4ODQ5Ci0jZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgMHg4QjlFCi0jZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NkFCCi0jZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9UWVBFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NkE5Ci0jZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NkFBCi0jZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NkFDCi0jZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4ODlFCi0jZW5kaWYKLQotLyogR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsICovCi0jaWZuZGVmIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbAotI2RlZmluZSBHTF9ERVBUSF9TVEVOQ0lMX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGOQotI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMjRfOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGQQotI2RlZmluZSBHTF9ERVBUSDI0X1NURU5DSUw4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhGMAotI2VuZGlmCi0KLS8qIEdMX09FU19yZ2I4X3JnYmE4ICovCi0jaWZuZGVmIEdMX09FU19yZ2I4X3JnYmE4Ci0jZGVmaW5lIEdMX1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDUxCi0jZGVmaW5lIEdMX1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDU4Ci0jZW5kaWYKLQotLyogR0xfT0VTX3N0ZW5jaWwxICovCi0jaWZuZGVmIEdMX09FU19zdGVuY2lsMQotI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0NgotI2VuZGlmCi0KLS8qIEdMX09FU19zdGVuY2lsNCAqLwotI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDQKLSNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENDcKLSNlbmRpZgotCi0vKiBHTF9PRVNfc3RlbmNpbDggKi8KLSNpZm5kZWYgR0xfT0VTX3N0ZW5jaWw4Ci0jZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDQ4Ci0jZW5kaWYKLQotLyogR0xfT0VTX3N0ZW5jaWxfd3JhcCAqLwotI2lmbmRlZiBHTF9PRVNfc3RlbmNpbF93cmFwCi0jZGVmaW5lIEdMX0lOQ1JfV1JBUF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTA3Ci0jZGVmaW5lIEdMX0RFQ1JfV1JBUF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTA4Ci0jZW5kaWYKLQotLyogR0xfT0VTX3RleHR1cmVfY3ViZV9tYXAgKi8KLSNpZm5kZWYgR0xfT0VTX3RleHR1cmVfY3ViZV9tYXAKLSNkZWZpbmUgR0xfTk9STUFMX01BUF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg1MTEKLSNkZWZpbmUgR0xfUkVGTEVDVElPTl9NQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg1MTIKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg1MTMKLSNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAweDg1MTQKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YX09FUyAgICAgICAgICAgICAgICAgICAgICAweDg1MTUKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YX09FUyAgICAgICAgICAgICAgICAgICAgICAweDg1MTYKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX09FUyAgICAgICAgICAgICAgICAgICAgICAweDg1MTcKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZX09FUyAgICAgICAgICAgICAgICAgICAgICAweDg1MTgKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aX09FUyAgICAgICAgICAgICAgICAgICAgICAweDg1MTkKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX09FUyAgICAgICAgICAgICAgICAgICAgICAweDg1MUEKLSNkZWZpbmUgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAweDg1MUMKLSNkZWZpbmUgR0xfVEVYVFVSRV9HRU5fTU9ERV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI1MDAKLSNkZWZpbmUgR0xfVEVYVFVSRV9HRU5fU1RSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjAKLSNlbmRpZgotCi0vKiBHTF9PRVNfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQgKi8KLSNpZm5kZWYgR0xfT0VTX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0Ci0jZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzcwCi0jZW5kaWYKLQotLyogR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QgKi8KLSNpZm5kZWYgR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg1QjUKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEFNRCBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlCi0jZGVmaW5lIEdMXzNEQ19YX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0Y5Ci0jZGVmaW5lIEdMXzNEQ19YWV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0ZBCi0jZW5kaWYKLQotLyogR0xfQU1EX2NvbXByZXNzZWRfQVRDX3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfQVRDX3RleHR1cmUKLSNkZWZpbmUgR0xfQVRDX1JHQl9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDOTIKLSNkZWZpbmUgR0xfQVRDX1JHQkFfRVhQTElDSVRfQUxQSEFfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDOTMKLSNkZWZpbmUgR0xfQVRDX1JHQkFfSU5URVJQT0xBVEVEX0FMUEhBX0FNRCAgICAgICAgICAgICAgICAgICAgICAweDg3RUUKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEFQUExFIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfQVBQTEVfdGV4dHVyZV8yRF9saW1pdGVkX25wb3QgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfQVBQTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgKi8KLSNpZm5kZWYgR0xfQVBQTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVNfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDQUIKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9BUFBMRSAgICAgICAgICAgICAweDhENTYKLSNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENTcKLSNkZWZpbmUgR0xfUkVBRF9GUkFNRUJVRkZFUl9BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDQTgKLSNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUl9BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDQTkKLSNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAweDhDQTYKLSNkZWZpbmUgR0xfUkVBRF9GUkFNRUJVRkZFUl9CSU5ESU5HX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAweDhDQUEKLSNlbmRpZgotCi0vKiBHTF9BUFBMRV90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAqLwotI2lmbmRlZiBHTF9BUFBMRV90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OAotI2RlZmluZSBHTF9CR1JBX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMQotI2VuZGlmCi0KLS8qIEdMX0FQUExFX3RleHR1cmVfbWF4X2xldmVsICovCi0jaWZuZGVmIEdMX0FQUExFX3RleHR1cmVfbWF4X2xldmVsCi0jZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0xFVkVMX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MTNECi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBBUk0gZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9BUk1fcmdiYTggKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBFWFQgZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9FWFRfYmxlbmRfbWlubWF4ICovCi0jaWZuZGVmIEdMX0VYVF9ibGVuZF9taW5tYXgKLSNkZWZpbmUgR0xfTUlOX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDcKLSNkZWZpbmUgR0xfTUFYX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDgKLSNlbmRpZgotCi0vKiBHTF9FWFRfZGlzY2FyZF9mcmFtZWJ1ZmZlciAqLwotI2lmbmRlZiBHTF9FWFRfZGlzY2FyZF9mcmFtZWJ1ZmZlcgotI2RlZmluZSBHTF9DT0xPUl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwMAotI2RlZmluZSBHTF9ERVBUSF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwMQotI2RlZmluZSBHTF9TVEVOQ0lMX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwMgotI2VuZGlmCi0KLS8qIEdMX0VYVF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfRVhUX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZQotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfU0FNUExFU19FWFQgICAgICAgICAgIDB4OEQ2QwotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU0FNUExFU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEzMwotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFX0VYVCAgICAgICAgICAgICAgIDB4OTEzNAotI2RlZmluZSBHTF9NQVhfU0FNUExFU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEzNQotI2VuZGlmCi0KLS8qIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cyAqLwotLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLwotCi0vKiBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYSAqLwotI2lmbmRlZiBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYQotI2RlZmluZSBHTF9CR1JBX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMQotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFVl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODM2NQotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFVl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODM2NgotI2VuZGlmCi0KLS8qIEdMX0VYVF9yb2J1c3RuZXNzICovCi0jaWZuZGVmIEdMX0VYVF9yb2J1c3RuZXNzCi0vKiByZXVzZSBHTF9OT19FUlJPUiAqLwotI2RlZmluZSBHTF9HVUlMVFlfQ09OVEVYVF9SRVNFVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI1MwotI2RlZmluZSBHTF9JTk5PQ0VOVF9DT05URVhUX1JFU0VUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI1NAotI2RlZmluZSBHTF9VTktOT1dOX0NPTlRFWFRfUkVTRVRfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI1NQotI2RlZmluZSBHTF9DT05URVhUX1JPQlVTVF9BQ0NFU1NfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTBGMwotI2RlZmluZSBHTF9SRVNFVF9OT1RJRklDQVRJT05fU1RSQVRFR1lfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODI1NgotI2RlZmluZSBHTF9MT1NFX0NPTlRFWFRfT05fUkVTRVRfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI1MgotI2RlZmluZSBHTF9OT19SRVNFVF9OT1RJRklDQVRJT05fRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI2MQotI2VuZGlmCi0KLS8qIEdMX0VYVF9zUkdCICovCi0jaWZuZGVmIEdMX0VYVF9zUkdCCi0jZGVmaW5lIEdMX1NSR0JfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQwCi0jZGVmaW5lIEdMX1NSR0JfQUxQSEFfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQyCi0jZGVmaW5lIEdMX1NSR0I4X0FMUEhBOF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQzCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09MT1JfRU5DT0RJTkdfRVhUICAgICAgICAgICAgMHg4MjEwCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fZHh0MSAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQxCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHg4M0YwCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHg4M0YxCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYwotI2RlZmluZSBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRQotI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRgotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODgKLSNkZWZpbmUgR0xfQkdSQV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcyAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcwotI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9MT0RfQklBU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRAotI2RlZmluZSBHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUwMAotI2RlZmluZSBHTF9URVhUVVJFX0xPRF9CSUFTX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUwMQotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX3N0b3JhZ2UgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc3RvcmFnZQotI2RlZmluZSBHTF9URVhUVVJFX0lNTVVUQUJMRV9GT1JNQVRfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEyRgotI2RlZmluZSBHTF9BTFBIQThfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAzQyAgCi0jZGVmaW5lIEdMX0xVTUlOQU5DRThfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDQwCi0jZGVmaW5lIEdMX0xVTUlOQU5DRThfQUxQSEE4X0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDQ1Ci0jZGVmaW5lIEdMX1JHQkEzMkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODE0ICAKLSNkZWZpbmUgR0xfUkdCMzJGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTUKLSNkZWZpbmUgR0xfQUxQSEEzMkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTYKLSNkZWZpbmUgR0xfTFVNSU5BTkNFMzJGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTgKLSNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBMzJGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTkKLS8qIHJldXNlIEdMX1JHQkExNkZfRVhUICovCi0jZGVmaW5lIEdMX1JHQjE2Rl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFCCi0jZGVmaW5lIEdMX0FMUEhBMTZGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFDCi0jZGVmaW5lIEdMX0xVTUlOQU5DRTE2Rl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFFCi0jZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTE2Rl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFGCi0jZGVmaW5lIEdMX1JHQjEwX0EyX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDU5ICAKLSNkZWZpbmUgR0xfUkdCMTBfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTIKLSNkZWZpbmUgR0xfQkdSQThfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkzQTEKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIElNRyBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0lNR19yZWFkX2Zvcm1hdCAqLwotI2lmbmRlZiBHTF9JTUdfcmVhZF9mb3JtYXQKLSNkZWZpbmUgR0xfQkdSQV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNF9SRVZfSU1HICAgICAgICAgICAgICAgICAgICAgICAweDgzNjUKLSNlbmRpZgotCi0vKiBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YyAqLwotI2lmbmRlZiBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YwotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HICAgICAgICAgICAgICAgICAgICAgIDB4OEMwMAotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HICAgICAgICAgICAgICAgICAgICAgIDB4OEMwMQotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRyAgICAgICAgICAgICAgICAgICAgIDB4OEMwMgotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRyAgICAgICAgICAgICAgICAgICAgIDB4OEMwMwotI2VuZGlmCi0KLS8qIEdMX0lNR190ZXh0dXJlX2Vudl9lbmhhbmNlZF9maXhlZF9mdW5jdGlvbiAqLwotI2lmbmRlZiBHTF9JTUdfdGV4dHVyZV9lbnZfZW5oYW5jZWRfZml4ZWRfZnVuY3Rpb24KLSNkZWZpbmUgR0xfTU9EVUxBVEVfQ09MT1JfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDMDQKLSNkZWZpbmUgR0xfUkVDSVBfQUREX1NJR05FRF9BTFBIQV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDMDUKLSNkZWZpbmUgR0xfVEVYVFVSRV9BTFBIQV9NT0RVTEFURV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDMDYKLSNkZWZpbmUgR0xfRkFDVE9SX0FMUEhBX01PRFVMQVRFX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDMDcKLSNkZWZpbmUgR0xfRlJBR01FTlRfQUxQSEFfTU9EVUxBVEVfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDMDgKLSNkZWZpbmUgR0xfQUREX0JMRU5EX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDMDkKLSNkZWZpbmUgR0xfRE9UM19SR0JBX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg2QUYKLSNlbmRpZgotCi0vKiBHTF9JTUdfdXNlcl9jbGlwX3BsYW5lICovCi0jaWZuZGVmIEdMX0lNR191c2VyX2NsaXBfcGxhbmUKLSNkZWZpbmUgR0xfQ0xJUF9QTEFORTBfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDAKLSNkZWZpbmUgR0xfQ0xJUF9QTEFORTFfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDEKLSNkZWZpbmUgR0xfQ0xJUF9QTEFORTJfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDIKLSNkZWZpbmUgR0xfQ0xJUF9QTEFORTNfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDMKLSNkZWZpbmUgR0xfQ0xJUF9QTEFORTRfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDQKLSNkZWZpbmUgR0xfQ0xJUF9QTEFORTVfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDUKLSNkZWZpbmUgR0xfTUFYX0NMSVBfUExBTkVTX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBEMzIKLSNlbmRpZgotCi0vKiBHTF9JTUdfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0lNR19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVNfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzMKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9JTUcgICAgICAgICAgICAgICAweDkxMzQKLSNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzUKLSNkZWZpbmUgR0xfVEVYVFVSRV9TQU1QTEVTX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzYKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIE5WIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfTlZfZmVuY2UgKi8KLSNpZm5kZWYgR0xfTlZfZmVuY2UKLSNkZWZpbmUgR0xfQUxMX0NPTVBMRVRFRF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RjIKLSNkZWZpbmUgR0xfRkVOQ0VfU1RBVFVTX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RjMKLSNkZWZpbmUgR0xfRkVOQ0VfQ09ORElUSU9OX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RjQKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIFFDT00gZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9RQ09NX2RyaXZlcl9jb250cm9sICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX1FDT01fZXh0ZW5kZWRfZ2V0ICovCi0jaWZuZGVmIEdMX1FDT01fZXh0ZW5kZWRfZ2V0Ci0jZGVmaW5lIEdMX1RFWFRVUkVfV0lEVEhfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQyCi0jZGVmaW5lIEdMX1RFWFRVUkVfSEVJR0hUX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQzCi0jZGVmaW5lIEdMX1RFWFRVUkVfREVQVEhfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ0Ci0jZGVmaW5lIEdMX1RFWFRVUkVfSU5URVJOQUxfRk9STUFUX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ1Ci0jZGVmaW5lIEdMX1RFWFRVUkVfRk9STUFUX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ2Ci0jZGVmaW5lIEdMX1RFWFRVUkVfVFlQRV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ3Ci0jZGVmaW5lIEdMX1RFWFRVUkVfSU1BR0VfVkFMSURfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ4Ci0jZGVmaW5lIEdMX1RFWFRVUkVfTlVNX0xFVkVMU19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ5Ci0jZGVmaW5lIEdMX1RFWFRVUkVfVEFSR0VUX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkRBCi0jZGVmaW5lIEdMX1RFWFRVUkVfT0JKRUNUX1ZBTElEX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkRCCi0jZGVmaW5lIEdMX1NUQVRFX1JFU1RPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkRDCi0jZW5kaWYKLQotLyogR0xfUUNPTV9leHRlbmRlZF9nZXQyICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX1FDT01fcGVyZm1vbl9nbG9iYWxfbW9kZSAqLwotI2lmbmRlZiBHTF9RQ09NX3BlcmZtb25fZ2xvYmFsX21vZGUKLSNkZWZpbmUgR0xfUEVSRk1PTl9HTE9CQUxfTU9ERV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhGQTAKLSNlbmRpZgotCi0vKiBHTF9RQ09NX3dyaXRlb25seV9yZW5kZXJpbmcgKi8KLSNpZm5kZWYgR0xfUUNPTV93cml0ZW9ubHlfcmVuZGVyaW5nCi0jZGVmaW5lIEdMX1dSSVRFT05MWV9SRU5ERVJJTkdfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODIzCi0jZW5kaWYKLQotLyogR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcgKi8KLSNpZm5kZWYgR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDBfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQxX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUMl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDNfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQ0X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUNV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDZfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQ3X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUMF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDFfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQyX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUM19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQ1X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUNl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDdfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDBfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQxX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUMl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDNfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ0X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUNV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDZfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ3X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDBfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQxX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUMl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDNfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0jZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQ0X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUNV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDZfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQ3X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogRW5kIG9mIGV4dGVuc2lvbiB0b2tlbnMsIHN0YXJ0IG9mIGNvcnJlc3BvbmRpbmcgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIE9FUyBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSAqLwotI2lmbmRlZiBHTF9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKLSNkZWZpbmUgR0xfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZU9FUyAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05TRVBBUkFURU9FU1BST0MpIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX2JsZW5kX2Z1bmNfc2VwYXJhdGUgKi8KLSNpZm5kZWYgR0xfT0VTX2JsZW5kX2Z1bmNfc2VwYXJhdGUKLSNkZWZpbmUgR0xfT0VTX2JsZW5kX2Z1bmNfc2VwYXJhdGUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRGdW5jU2VwYXJhdGVPRVMgKEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCTEVOREZVTkNTRVBBUkFURU9FU1BST0MpIChHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX2JsZW5kX3N1YnRyYWN0ICovCi0jaWZuZGVmIEdMX09FU19ibGVuZF9zdWJ0cmFjdAotI2RlZmluZSBHTF9PRVNfYmxlbmRfc3VidHJhY3QgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRFcXVhdGlvbk9FUyAoR0xlbnVtIG1vZGUpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05PRVNQUk9DKSAoR0xlbnVtIG1vZGUpOwotI2VuZGlmCi0KLS8qIEdMX09FU19ieXRlX2Nvb3JkaW5hdGVzICovCi0jaWZuZGVmIEdMX09FU19ieXRlX2Nvb3JkaW5hdGVzCi0jZGVmaW5lIEdMX09FU19ieXRlX2Nvb3JkaW5hdGVzIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZQotI2RlZmluZSBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZSAxCi0jZW5kaWYKLQotLyogR0xfT0VTX2RlcHRoMjQgKi8KLSNpZm5kZWYgR0xfT0VTX2RlcHRoMjQKLSNkZWZpbmUgR0xfT0VTX2RlcHRoMjQgMQotI2VuZGlmCi0KLS8qIEdMX09FU19kZXB0aDMyICovCi0jaWZuZGVmIEdMX09FU19kZXB0aDMyCi0jZGVmaW5lIEdMX09FU19kZXB0aDMyIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfZHJhd190ZXh0dXJlICovCi0jaWZuZGVmIEdMX09FU19kcmF3X3RleHR1cmUKLSNkZWZpbmUgR0xfT0VTX2RyYXdfdGV4dHVyZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4c09FUyAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4aU9FUyAoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXh4T0VTIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhzdk9FUyAoY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleGl2T0VTIChjb25zdCBHTGludCAqY29vcmRzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleHh2T0VTIChjb25zdCBHTGZpeGVkICpjb29yZHMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4Zk9FUyAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4ZnZPRVMgKGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV1RFWFNPRVNQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYSU9FU1BST0MpIChHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV1RFWFhPRVNQUk9DKSAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3aWR0aCwgR0xmaXhlZCBoZWlnaHQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYU1ZPRVNQUk9DKSAoY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV1RFWElWT0VTUFJPQykgKGNvbnN0IEdMaW50ICpjb29yZHMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYWFZPRVNQUk9DKSAoY29uc3QgR0xmaXhlZCAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV1RFWEZPRVNQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYRlZPRVNQUk9DKSAoY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKLSNlbmRpZgotCi0vKiBHTF9PRVNfRUdMX2ltYWdlICovCi0jaWZuZGVmIEdMX09FU19FR0xfaW1hZ2UKLSNkZWZpbmUgR0xfT0VTX0VHTF9pbWFnZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRUdMSU1BR0VUQVJHRVRURVhUVVJFMkRPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVHTElNQUdFVEFSR0VUUkVOREVSQlVGRkVSU1RPUkFHRU9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKLSNlbmRpZgotCi0vKiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsICovCi0jaWZuZGVmIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwKLSNkZWZpbmUgR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCAxCi0vKiBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIGRlZmluZWQgaW4gR0xfT0VTX0VHTF9pbWFnZSBhbHJlYWR5LiAqLwotI2VuZGlmCi0KLS8qIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQgKi8KLSNpZm5kZWYgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludAotI2RlZmluZSBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfZXh0ZW5kZWRfbWF0cml4X3BhbGV0dGUgKi8KLSNpZm5kZWYgR0xfT0VTX2V4dGVuZGVkX21hdHJpeF9wYWxldHRlCi0jZGVmaW5lIEdMX09FU19leHRlbmRlZF9tYXRyaXhfcGFsZXR0ZSAxCi0jZW5kaWYKLQotLyogR0xfT0VTX2Zib19yZW5kZXJfbWlwbWFwICovCi0jaWZuZGVmIEdMX09FU19mYm9fcmVuZGVyX21pcG1hcAotI2RlZmluZSBHTF9PRVNfZmJvX3JlbmRlcl9taXBtYXAgMQotI2VuZGlmCi0KLS8qIEdMX09FU19maXhlZF9wb2ludCAqLwotI2lmbmRlZiBHTF9PRVNfZml4ZWRfcG9pbnQKLSNkZWZpbmUgR0xfT0VTX2ZpeGVkX3BvaW50IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEFscGhhRnVuY3hPRVMgKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckNvbG9yeE9FUyAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoeE9FUyAoR0xjbGFtcHggZGVwdGgpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGlwUGxhbmV4T0VTIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29sb3I0eE9FUyAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2V4T0VTIChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZvZ3hPRVMgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZvZ3h2T0VTIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZydXN0dW14T0VTIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0Q2xpcFBsYW5leE9FUyAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZpeGVkdk9FUyAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRMaWdodHh2T0VTIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0TWF0ZXJpYWx4dk9FUyAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4RW52eHZPRVMgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVyeHZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRNb2RlbHhPRVMgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0TW9kZWx4dk9FUyAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodHhPRVMgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHR4dk9FUyAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpbmVXaWR0aHhPRVMgKEdMZml4ZWQgd2lkdGgpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2FkTWF0cml4eE9FUyAoY29uc3QgR0xmaXhlZCAqbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFseE9FUyAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFseHZPRVMgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRNYXRyaXh4T0VTIChjb25zdCBHTGZpeGVkICptKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDR4T0VTIChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xOb3JtYWwzeE9FUyAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE9ydGhveE9FUyAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyeE9FUyAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJ4dk9FUyAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFNpemV4T0VTIChHTGZpeGVkIHNpemUpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0eE9FUyAoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSb3RhdGV4T0VTIChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2V4T0VTIChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNjYWxleE9FUyAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudnhPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudnh2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcnhPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcnh2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRyYW5zbGF0ZXhPRVMgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEFMUEhBRlVOQ1hPRVNQUk9DKSAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENMRUFSQ09MT1JYT0VTUFJPQykgKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xFQVJERVBUSFhPRVNQUk9DKSAoR0xjbGFtcHggZGVwdGgpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDTElQUExBTkVYT0VTUFJPQykgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDT0xPUjRYT0VTUFJPQykgKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERVBUSFJBTkdFWE9FU1BST0MpIChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZPR1hPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRk9HWFZPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUlVTVFVNWE9FU1BST0MpIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUQ0xJUFBMQU5FWE9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgZXFuWzRdKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VURklYRURWT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUTElHSFRYVk9FU1BST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUTUFURVJJQUxYVk9FU1BST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRURVhFTlZYVk9FU1BST0MpIChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFRFWFBBUkFNRVRFUlhWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRNT0RFTFhPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRNT0RFTFhWT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRYT0VTUFJPQykgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRYVk9FU1BST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElORVdJRFRIWE9FU1BST0MpIChHTGZpeGVkIHdpZHRoKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTE9BRE1BVFJJWFhPRVNQUk9DKSAoY29uc3QgR0xmaXhlZCAqbSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1BVEVSSUFMWE9FU1BST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTUFURVJJQUxYVk9FU1BST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNVUxUTUFUUklYWE9FU1BST0MpIChjb25zdCBHTGZpeGVkICptKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRYT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE5PUk1BTDNYT0VTUFJPQykgKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xPUlRIT1hPRVNQUk9DKSAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSWE9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUlhWT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUE9JTlRTSVpFWE9FU1BST0MpIChHTGZpeGVkIHNpemUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQT0xZR09OT0ZGU0VUWE9FU1BST0MpIChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJPVEFURVhPRVNQUk9DKSAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFNBTVBMRUNPVkVSQUdFWE9FU1BST0MpIChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFNDQUxFWE9FU1BST0MpIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYRU5WWE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhFTlZYVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFBBUkFNRVRFUlhPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYUEFSQU1FVEVSWFZPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xUUkFOU0xBVEVYT0VTUFJPQykgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotI2VuZGlmCi0KLS8qIEdMX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QgKi8KLSNpZm5kZWYgR0xfT0VTX2ZyYW1lYnVmZmVyX29iamVjdAotI2RlZmluZSBHTF9PRVNfZnJhbWVidWZmZXJfb2JqZWN0IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNSZW5kZXJidWZmZXJPRVMgKEdMdWludCByZW5kZXJidWZmZXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5SZW5kZXJidWZmZXJzT0VTIChHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLUdMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc0ZyYW1lYnVmZmVyT0VTIChHTHVpbnQgZnJhbWVidWZmZXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kRnJhbWVidWZmZXJPRVMgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdlbkZyYW1lYnVmZmVyc09FUyAoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7Ci1HTF9BUEkgR0xlbnVtIEdMX0FQSUVOVFJZIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyAoR0xlbnVtIHRhcmdldCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5lcmF0ZU1pcG1hcE9FUyAoR0xlbnVtIHRhcmdldCk7Ci0jZW5kaWYKLXR5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xJU1JFTkRFUkJVRkZFUk9FU1BST0MpIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQklORFJFTkRFUkJVRkZFUk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFUkVOREVSQlVGRkVSU09FU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTlJFTkRFUkJVRkZFUlNPRVNQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRSRU5ERVJCVUZGRVJQQVJBTUVURVJJVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTRlJBTUVCVUZGRVJPRVNQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQklOREZSQU1FQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFTEVURUZSQU1FQlVGRkVSU09FU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VORlJBTUVCVUZGRVJTT0VTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwotdHlwZWRlZiBHTGVudW0gKEdMX0FQSUVOVFJZUCBQRk5HTENIRUNLRlJBTUVCVUZGRVJTVEFUVVNPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSUkVOREVSQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFMkRPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEZSQU1FQlVGRkVSQVRUQUNITUVOVFBBUkFNRVRFUklWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5FUkFURU1JUE1BUE9FU1BST0MpIChHTGVudW0gdGFyZ2V0KTsKLSNlbmRpZgotCi0vKiBHTF9PRVNfbWFwYnVmZmVyICovCi0jaWZuZGVmIEdMX09FU19tYXBidWZmZXIKLSNkZWZpbmUgR0xfT0VTX21hcGJ1ZmZlciAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQqIEdMX0FQSUVOVFJZIGdsTWFwQnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKLUdMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xVbm1hcEJ1ZmZlck9FUyAoR0xlbnVtIHRhcmdldCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqKiBwYXJhbXMpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQqIChHTF9BUElFTlRSWVAgUEZOR0xNQVBCVUZGRVJPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2Vzcyk7Ci10eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMVU5NQVBCVUZGRVJPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEJVRkZFUlBPSU5URVJWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkICoqIHBhcmFtcyk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX21hdHJpeF9nZXQgKi8KLSNpZm5kZWYgR0xfT0VTX21hdHJpeF9nZXQKLSNkZWZpbmUgR0xfT0VTX21hdHJpeF9nZXQgMQotI2VuZGlmCi0KLS8qIEdMX09FU19tYXRyaXhfcGFsZXR0ZSAqLwotI2lmbmRlZiBHTF9PRVNfbWF0cml4X3BhbGV0dGUKLSNkZWZpbmUgR0xfT0VTX21hdHJpeF9wYWxldHRlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTIChHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTICh2b2lkKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFdlaWdodFBvaW50ZXJPRVMgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDVVJSRU5UUEFMRVRURU1BVFJJWE9FU1BST0MpIChHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTE9BRFBBTEVUVEVGUk9NTU9ERUxWSUVXTUFUUklYT0VTUFJPQykgKHZvaWQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNQVRSSVhJTkRFWFBPSU5URVJPRVNQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xXRUlHSFRQT0lOVEVST0VTUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLSNlbmRpZgotCi0vKiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwgKi8KLSNpZm5kZWYgR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsCi0jZGVmaW5lIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3F1ZXJ5X21hdHJpeCAqLwotI2lmbmRlZiBHTF9PRVNfcXVlcnlfbWF0cml4Ci0jZGVmaW5lIEdMX09FU19xdWVyeV9tYXRyaXggMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSBHTGJpdGZpZWxkIEdMX0FQSUVOVFJZIGdsUXVlcnlNYXRyaXh4T0VTIChHTGZpeGVkIG1hbnRpc3NhWzE2XSwgR0xpbnQgZXhwb25lbnRbMTZdKTsKLSNlbmRpZgotdHlwZWRlZiBHTGJpdGZpZWxkIChHTF9BUElFTlRSWVAgUEZOR0xRVUVSWU1BVFJJWFhPRVNQUk9DKSAoR0xmaXhlZCBtYW50aXNzYVsxNl0sIEdMaW50IGV4cG9uZW50WzE2XSk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX3JnYjhfcmdiYTggKi8KLSNpZm5kZWYgR0xfT0VTX3JnYjhfcmdiYTgKLSNkZWZpbmUgR0xfT0VTX3JnYjhfcmdiYTggMQotI2VuZGlmCi0KLS8qIEdMX09FU19zaW5nbGVfcHJlY2lzaW9uICovCi0jaWZuZGVmIEdMX09FU19zaW5nbGVfcHJlY2lzaW9uCi0jZGVmaW5lIEdMX09FU19zaW5nbGVfcHJlY2lzaW9uIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2VmT0VTIChHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZydXN0dW1mT0VTIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsT3J0aG9mT0VTIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xpcFBsYW5lZk9FUyAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldENsaXBQbGFuZWZPRVMgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoZk9FUyAoR0xjbGFtcGYgZGVwdGgpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFUFRIUkFOR0VGT0VTUFJPQykgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJVU1RVTUZPRVNQUk9DKSAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE9SVEhPRk9FU1BST0MpIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xJUFBMQU5FRk9FU1BST0MpIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUQ0xJUFBMQU5FRk9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgZXFuWzRdKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xFQVJERVBUSEZPRVNQUk9DKSAoR0xjbGFtcGYgZGVwdGgpOwotI2VuZGlmCi0KLS8qIEdMX09FU19zdGVuY2lsMSAqLwotI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDEKLSNkZWZpbmUgR0xfT0VTX3N0ZW5jaWwxIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfc3RlbmNpbDQgKi8KLSNpZm5kZWYgR0xfT0VTX3N0ZW5jaWw0Ci0jZGVmaW5lIEdMX09FU19zdGVuY2lsNCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3N0ZW5jaWw4ICovCi0jaWZuZGVmIEdMX09FU19zdGVuY2lsOAotI2RlZmluZSBHTF9PRVNfc3RlbmNpbDggMQotI2VuZGlmCi0KLS8qIEdMX09FU19zdGVuY2lsX3dyYXAgKi8KLSNpZm5kZWYgR0xfT0VTX3N0ZW5jaWxfd3JhcAotI2RlZmluZSBHTF9PRVNfc3RlbmNpbF93cmFwIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcCAqLwotI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcAotI2RlZmluZSBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW5mT0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEdlbmZ2T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VuaU9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VuaXZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VueE9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW54dk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleEdlbmZ2T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4R2VuaXZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4R2VueHZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEdFTkZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5GVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYR0VOSU9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5JVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEdFTlhPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5YVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUVEVYR0VORlZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFRFWEdFTklWT0VTUFJPQykgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUVEVYR0VOWFZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX3RleHR1cmVfZW52X2Nyb3NzYmFyICovCi0jaWZuZGVmIEdMX09FU190ZXh0dXJlX2Vudl9jcm9zc2JhcgotI2RlZmluZSBHTF9PRVNfdGV4dHVyZV9lbnZfY3Jvc3NiYXIgMQotI2VuZGlmCi0KLS8qIEdMX09FU190ZXh0dXJlX21pcnJvcmVkX3JlcGVhdCAqLwotI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQKLSNkZWZpbmUgR0xfT0VTX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfdmVydGV4X2FycmF5X29iamVjdCAqLwotI2lmbmRlZiBHTF9PRVNfdmVydGV4X2FycmF5X29iamVjdAotI2RlZmluZSBHTF9PRVNfdmVydGV4X2FycmF5X29iamVjdCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kVmVydGV4QXJyYXlPRVMgKEdMdWludCBhcnJheSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVZlcnRleEFycmF5c09FUyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdlblZlcnRleEFycmF5c09FUyAoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cyk7Ci1HTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNWZXJ0ZXhBcnJheU9FUyAoR0x1aW50IGFycmF5KTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCSU5EVkVSVEVYQVJSQVlPRVNQUk9DKSAoR0x1aW50IGFycmF5KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFVkVSVEVYQVJSQVlTT0VTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5WRVJURVhBUlJBWVNPRVNQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cyk7Ci10eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMSVNWRVJURVhBUlJBWU9FU1BST0MpIChHTHVpbnQgYXJyYXkpOwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogQU1EIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUKLSNkZWZpbmUgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgMQotI2VuZGlmCi0KLS8qIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlCi0jZGVmaW5lIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlIDEKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEFQUExFIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfQVBQTEVfdGV4dHVyZV8yRF9saW1pdGVkX25wb3QgKi8KLSNpZm5kZWYgR0xfQVBQTEVfdGV4dHVyZV8yRF9saW1pdGVkX25wb3QKLSNkZWZpbmUgR0xfQVBQTEVfdGV4dHVyZV8yRF9saW1pdGVkX25wb3QgMQotI2VuZGlmCi0KLS8qIEdMX0FQUExFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlICovCi0jaWZuZGVmIEdMX0FQUExFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlCi0jZGVmaW5lIEdMX0FQUExFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFICh2b2lkKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VNVUxUSVNBTVBMRUFQUExFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFU09MVkVNVUxUSVNBTVBMRUZSQU1FQlVGRkVSQVBQTEVQUk9DKSAodm9pZCk7Ci0jZW5kaWYKLQotLyogR0xfQVBQTEVfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODggKi8KLSNpZm5kZWYgR0xfQVBQTEVfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODgKLSNkZWZpbmUgR0xfQVBQTEVfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODggMQotI2VuZGlmCi0KLS8qIEdMX0FQUExFX3RleHR1cmVfbWF4X2xldmVsICovCi0jaWZuZGVmIEdMX0FQUExFX3RleHR1cmVfbWF4X2xldmVsCi0jZGVmaW5lIEdMX0FQUExFX3RleHR1cmVfbWF4X2xldmVsIDEKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEFSTSBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0FSTV9yZ2JhOCAqLwotI2lmbmRlZiBHTF9BUk1fcmdiYTgKLSNkZWZpbmUgR0xfQVJNX3JnYmE4IDEKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEVYVCBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0VYVF9ibGVuZF9taW5tYXggKi8KLSNpZm5kZWYgR0xfRVhUX2JsZW5kX21pbm1heAotI2RlZmluZSBHTF9FWFRfYmxlbmRfbWlubWF4IDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfZGlzY2FyZF9mcmFtZWJ1ZmZlciAqLwotI2lmbmRlZiBHTF9FWFRfZGlzY2FyZF9mcmFtZWJ1ZmZlcgotI2RlZmluZSBHTF9FWFRfZGlzY2FyZF9mcmFtZWJ1ZmZlciAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtQXR0YWNobWVudHMsIGNvbnN0IEdMZW51bSAqYXR0YWNobWVudHMpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERJU0NBUkRGUkFNRUJVRkZFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKTsKLSNlbmRpZgotCi0vKiBHTF9FWFRfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0VYVF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUKLSNkZWZpbmUgR0xfRVhUX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcyk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRU1VTFRJU0FNUExFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTJETVVMVElTQU1QTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKTsKLSNlbmRpZgotCi0vKiBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMgKi8KLSNpZm5kZWYgR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzCi0jZGVmaW5lIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0aURyYXdBcnJheXNFWFQgKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRpRHJhd0VsZW1lbnRzRVhUIChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNVUxUSURSQVdBUlJBWVNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50ICpmaXJzdCwgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXRUxFTUVOVFNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOwotI2VuZGlmCi0KLS8qIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhICovCi0jaWZuZGVmIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhCi0jZGVmaW5lIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhIDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfcm9idXN0bmVzcyAqLwotI2lmbmRlZiBHTF9FWFRfcm9idXN0bmVzcwotI2RlZmluZSBHTF9FWFRfcm9idXN0bmVzcyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIEdMZW51bSBHTF9BUElFTlRSWSBnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQgKHZvaWQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZWFkblBpeGVsc0VYVCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIHZvaWQgKmRhdGEpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRuVW5pZm9ybWZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldG5Vbmlmb3JtaXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKTsKLSNlbmRpZgotdHlwZWRlZiBHTGVudW0gKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEdSQVBISUNTUkVTRVRTVEFUVVNFWFRQUk9DKSAodm9pZCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFQUROUElYRUxTRVhUUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCB2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUTlVOSUZPUk1GVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVE5VTklGT1JNSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIEdMaW50ICpwYXJhbXMpOwotI2VuZGlmCi0KLS8qIEdMX0VYVF9zUkdCICovCi0jaWZuZGVmIEdMX0VYVF9zUkdCCi0jZGVmaW5lIEdMX0VYVF9zUkdCIDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQxICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2R4dDEKLSNkZWZpbmUgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fZHh0MSAxCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYwotI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgMQotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODgKLSNkZWZpbmUgR0xfRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4IDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcyAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcwotI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcyAxCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfc3RvcmFnZSAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zdG9yYWdlCi0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3N0b3JhZ2UgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4U3RvcmFnZTFERVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4U3RvcmFnZTJERVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN0b3JhZ2UzREVYVCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXh0dXJlU3RvcmFnZTFERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleHR1cmVTdG9yYWdlMkRFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleHR1cmVTdG9yYWdlM0RFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYU1RPUkFHRTFERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhTVE9SQUdFMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhTVE9SQUdFM0RFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhUVVJFU1RPUkFHRTFERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNUT1JBR0UyREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhUVVJFU1RPUkFHRTNERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBJTUcgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9JTUdfcmVhZF9mb3JtYXQgKi8KLSNpZm5kZWYgR0xfSU1HX3JlYWRfZm9ybWF0Ci0jZGVmaW5lIEdMX0lNR19yZWFkX2Zvcm1hdCAxCi0jZW5kaWYKLQotLyogR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMgKi8KLSNpZm5kZWYgR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMKLSNkZWZpbmUgR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMgMQotI2VuZGlmCi0KLS8qIEdMX0lNR190ZXh0dXJlX2Vudl9lbmhhbmNlZF9maXhlZF9mdW5jdGlvbiAqLwotI2lmbmRlZiBHTF9JTUdfdGV4dHVyZV9lbnZfZW5oYW5jZWRfZml4ZWRfZnVuY3Rpb24KLSNkZWZpbmUgR0xfSU1HX3RleHR1cmVfZW52X2VuaGFuY2VkX2ZpeGVkX2Z1bmN0aW9uIDEKLSNlbmRpZgotCi0vKiBHTF9JTUdfdXNlcl9jbGlwX3BsYW5lICovCi0jaWZuZGVmIEdMX0lNR191c2VyX2NsaXBfcGxhbmUKLSNkZWZpbmUgR0xfSU1HX3VzZXJfY2xpcF9wbGFuZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGlwUGxhbmVmSU1HIChHTGVudW0gcCwgY29uc3QgR0xmbG9hdCAqZXFuKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xpcFBsYW5leElNRyAoR0xlbnVtIHAsIGNvbnN0IEdMZml4ZWQgKmVxbik7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xJUFBMQU5FRklNR1BST0MpIChHTGVudW0gcCwgY29uc3QgR0xmbG9hdCAqZXFuKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xJUFBMQU5FWElNR1BST0MpIChHTGVudW0gcCwgY29uc3QgR0xmaXhlZCAqZXFuKTsKLSNlbmRpZgotCi0vKiBHTF9JTUdfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0lNR19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUKLSNkZWZpbmUgR0xfSU1HX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcyk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRU1VTFRJU0FNUExFSU1HKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFMkRNVUxUSVNBTVBMRUlNRykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcyk7Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBOViBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIE5WX2ZlbmNlICovCi0jaWZuZGVmIEdMX05WX2ZlbmNlCi0jZGVmaW5lIEdMX05WX2ZlbmNlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUZlbmNlc05WIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuRmVuY2VzTlYgKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpOwotR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzRmVuY2VOViAoR0x1aW50IGZlbmNlKTsKLUdMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xUZXN0RmVuY2VOViAoR0x1aW50IGZlbmNlKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RmVuY2Vpdk5WIChHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZpbmlzaEZlbmNlTlYgKEdMdWludCBmZW5jZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNldEZlbmNlTlYgKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbik7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFRkVOQ0VTTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZlbmNlcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTkZFTkNFU05WUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTRkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTFRFU1RGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEZFTkNFSVZOVlBST0MpIChHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZJTklTSEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU0VURkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UsIEdMZW51bSBjb25kaXRpb24pOwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogUUNPTSBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX1FDT01fZHJpdmVyX2NvbnRyb2wgKi8KLSNpZm5kZWYgR0xfUUNPTV9kcml2ZXJfY29udHJvbAotI2RlZmluZSBHTF9RQ09NX2RyaXZlcl9jb250cm9sIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldERyaXZlckNvbnRyb2xzUUNPTSAoR0xpbnQgKm51bSwgR0xzaXplaSBzaXplLCBHTHVpbnQgKmRyaXZlckNvbnRyb2xzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00gKEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00gKEdMdWludCBkcml2ZXJDb250cm9sKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NIChHTHVpbnQgZHJpdmVyQ29udHJvbCk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VURFJJVkVSQ09OVFJPTFNRQ09NUFJPQykgKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVERSSVZFUkNPTlRST0xTVFJJTkdRQ09NUFJPQykgKEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRU5BQkxFRFJJVkVSQ09OVFJPTFFDT01QUk9DKSAoR0x1aW50IGRyaXZlckNvbnRyb2wpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xESVNBQkxFRFJJVkVSQ09OVFJPTFFDT01QUk9DKSAoR0x1aW50IGRyaXZlckNvbnRyb2wpOwotI2VuZGlmCi0KLS8qIEdMX1FDT01fZXh0ZW5kZWRfZ2V0ICovCi0jaWZuZGVmIEdMX1FDT01fZXh0ZW5kZWRfZ2V0Ci0jZGVmaW5lIEdMX1FDT01fZXh0ZW5kZWRfZ2V0IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFRleHR1cmVzUUNPTSAoR0x1aW50ICp0ZXh0dXJlcywgR0xpbnQgbWF4VGV4dHVyZXMsIEdMaW50ICpudW1UZXh0dXJlcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldEJ1ZmZlcnNRQ09NIChHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00gKEdMdWludCAqcmVuZGVyYnVmZmVycywgR0xpbnQgbWF4UmVuZGVyYnVmZmVycywgR0xpbnQgKm51bVJlbmRlcmJ1ZmZlcnMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NIChHTHVpbnQgKmZyYW1lYnVmZmVycywgR0xpbnQgbWF4RnJhbWVidWZmZXJzLCBHTGludCAqbnVtRnJhbWVidWZmZXJzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00gKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFRleFN1YkltYWdlUUNPTSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0ZXhlbHMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00gKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcyk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUVEVYVFVSRVNRQ09NUFJPQykgKEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRCVUZGRVJTUUNPTVBST0MpIChHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUUkVOREVSQlVGRkVSU1FDT01QUk9DKSAoR0x1aW50ICpyZW5kZXJidWZmZXJzLCBHTGludCBtYXhSZW5kZXJidWZmZXJzLCBHTGludCAqbnVtUmVuZGVyYnVmZmVycyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVEZSQU1FQlVGRkVSU1FDT01QUk9DKSAoR0x1aW50ICpmcmFtZWJ1ZmZlcnMsIEdMaW50IG1heEZyYW1lYnVmZmVycywgR0xpbnQgKm51bUZyYW1lYnVmZmVycyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFRFWExFVkVMUEFSQU1FVEVSSVZRQ09NUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVFRFWE9CSkVDVFNUQVRFT1ZFUlJJREVJUUNPTVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUVEVYU1VCSU1BR0VRQ09NUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGV4ZWxzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUQlVGRkVSUE9JTlRFUlZRQ09NUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcyk7Ci0jZW5kaWYKLQotLyogR0xfUUNPTV9leHRlbmRlZF9nZXQyICovCi0jaWZuZGVmIEdMX1FDT01fZXh0ZW5kZWRfZ2V0MgotI2RlZmluZSBHTF9RQ09NX2V4dGVuZGVkX2dldDIgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0U2hhZGVyc1FDT00gKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRQcm9ncmFtc1FDT00gKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpOwotR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00gKEdMdWludCBwcm9ncmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00gKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFNIQURFUlNRQ09NUFJPQykgKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRQUk9HUkFNU1FDT01QUk9DKSAoR0x1aW50ICpwcm9ncmFtcywgR0xpbnQgbWF4UHJvZ3JhbXMsIEdMaW50ICpudW1Qcm9ncmFtcyk7Ci10eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMRVhUSVNQUk9HUkFNQklOQVJZUUNPTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFBST0dSQU1CSU5BUllTT1VSQ0VRQ09NUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpOwotI2VuZGlmCi0KLS8qIEdMX1FDT01fcGVyZm1vbl9nbG9iYWxfbW9kZSAqLwotI2lmbmRlZiBHTF9RQ09NX3BlcmZtb25fZ2xvYmFsX21vZGUKLSNkZWZpbmUgR0xfUUNPTV9wZXJmbW9uX2dsb2JhbF9tb2RlIDEKLSNlbmRpZgotCi0vKiBHTF9RQ09NX3dyaXRlb25seV9yZW5kZXJpbmcgKi8KLSNpZm5kZWYgR0xfUUNPTV93cml0ZW9ubHlfcmVuZGVyaW5nCi0jZGVmaW5lIEdMX1FDT01fd3JpdGVvbmx5X3JlbmRlcmluZyAxCi0jZW5kaWYKLQotLyogR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcgKi8KLSNpZm5kZWYgR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcKLSNkZWZpbmUgR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU3RhcnRUaWxpbmdRQ09NIChHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCwgR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmRUaWxpbmdRQ09NIChHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU1RBUlRUSUxJTkdRQ09NUFJPQykgKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVORFRJTElOR1FDT01QUk9DKSAoR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spOwotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX2dsZXh0X2hfICovCi0KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2xwbGF0Zm9ybS5oIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbHBsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYjZlZTIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbHBsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jaWZuZGVmIF9fZ2xwbGF0Zm9ybV9oXwotI2RlZmluZSBfX2dscGxhdGZvcm1faF8KLQotLyogJFJldmlzaW9uOiAxMDYwMSAkIG9uICREYXRlOjogMjAxMC0wMy0wNCAyMjoxNToyNyAtMDgwMCAjJCAqLwotCi0vKgotICogVGhpcyBkb2N1bWVudCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgU0dJIEZyZWUgU29mdHdhcmUgQiBMaWNlbnNlIFZlcnNpb24KLSAqIDIuMC4gRm9yIGRldGFpbHMsIHNlZSBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIvIC4KLSAqLwotCi0vKiBQbGF0Zm9ybS1zcGVjaWZpYyB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIE9wZW5HTCBFUyAxLlggIGdsLmgKLSAqCi0gKiBBZG9wdGVycyBtYXkgbW9kaWZ5IGtocnBsYXRmb3JtLmggYW5kIHRoaXMgZmlsZSB0byBzdWl0IHRoZWlyIHBsYXRmb3JtLgotICogWW91IGFyZSBlbmNvdXJhZ2VkIHRvIHN1Ym1pdCBhbGwgbW9kaWZpY2F0aW9ucyB0byB0aGUgS2hyb25vcyBncm91cCBzbyB0aGF0Ci0gKiB0aGV5IGNhbiBiZSBpbmNsdWRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLiAgUGxlYXNlIHN1Ym1pdCBjaGFuZ2VzCi0gKiBieSBzZW5kaW5nIHRoZW0gdG8gdGhlIHB1YmxpYyBLaHJvbm9zIEJ1Z3ppbGxhIChodHRwOi8va2hyb25vcy5vcmcvYnVnemlsbGEpCi0gKiBieSBmaWxpbmcgYSBidWcgYWdhaW5zdCBwcm9kdWN0ICJPcGVuR0wtRVMiIGNvbXBvbmVudCAiUmVnaXN0cnkiLgotICovCi0KLSNpbmNsdWRlIDxLSFIva2hycGxhdGZvcm0uaD4KLQotI2lmbmRlZiBHTF9BUEkKLSNkZWZpbmUgR0xfQVBJICAgICAgS0hST05PU19BUElDQUxMCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUElFTlRSWQotI2RlZmluZSBHTF9BUElFTlRSWSBLSFJPTk9TX0FQSUVOVFJZCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fZ2xwbGF0Zm9ybV9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvR0xFUzIvZ2wyLmggYi9vcGVuZ2wvaW5jbHVkZS9HTEVTMi9nbDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkM2I4Ny4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvaW5jbHVkZS9HTEVTMi9nbDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyMSArMCwwIEBACi0jaWZuZGVmIF9fZ2wyX2hfCi0jZGVmaW5lIF9fZ2wyX2hfCi0KLS8qICRSZXZpc2lvbjogMTA2MDIgJCBvbiAkRGF0ZTo6IDIwMTAtMDMtMDQgMjI6MzU6MzQgLTA4MDAgIyQgKi8KLQotI2luY2x1ZGUgPEdMRVMyL2dsMnBsYXRmb3JtLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgZG9jdW1lbnQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNHSSBGcmVlIFNvZnR3YXJlIEIgTGljZW5zZSBWZXJzaW9uCi0gKiAyLjAuIEZvciBkZXRhaWxzLCBzZWUgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCLyAuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBEYXRhIHR5cGUgZGVmaW5pdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHZvaWQgICAgICAgICAgICAgR0x2b2lkOwotdHlwZWRlZiBjaGFyICAgICAgICAgICAgIEdMY2hhcjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTGVudW07Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgR0xib29sZWFuOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgIEdMYml0ZmllbGQ7Ci10eXBlZGVmIGtocm9ub3NfaW50OF90ICAgR0xieXRlOwotdHlwZWRlZiBzaG9ydCAgICAgICAgICAgIEdMc2hvcnQ7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgR0xpbnQ7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgR0xzaXplaTsKLXR5cGVkZWYga2hyb25vc191aW50OF90ICBHTHVieXRlOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgIEdMdXNob3J0OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgIEdMdWludDsKLXR5cGVkZWYga2hyb25vc19mbG9hdF90ICBHTGZsb2F0OwotdHlwZWRlZiBraHJvbm9zX2Zsb2F0X3QgIEdMY2xhbXBmOwotdHlwZWRlZiBraHJvbm9zX2ludDMyX3QgIEdMZml4ZWQ7Ci0KLS8qIEdMIHR5cGVzIGZvciBoYW5kbGluZyBsYXJnZSB2ZXJ0ZXggYnVmZmVyIG9iamVjdHMgKi8KLXR5cGVkZWYga2hyb25vc19pbnRwdHJfdCBHTGludHB0cjsKLXR5cGVkZWYga2hyb25vc19zc2l6ZV90ICBHTHNpemVpcHRyOwotCi0vKiBPcGVuR0wgRVMgY29yZSB2ZXJzaW9ucyAqLwotI2RlZmluZSBHTF9FU19WRVJTSU9OXzJfMCAgICAgICAgICAgICAgICAgMQotCi0vKiBDbGVhckJ1ZmZlck1hc2sgKi8KLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLQotLyogQm9vbGVhbiAqLwotI2RlZmluZSBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotCi0vKiBCZWdpbk1vZGUgKi8KLSNkZWZpbmUgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMwotI2RlZmluZSBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAweDAwMDUKLSNkZWZpbmUgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgIDB4MDAwNgotCi0vKiBBbHBoYUZ1bmN0aW9uIChub3Qgc3VwcG9ydGVkIGluIEVTMjApICovCi0vKiAgICAgIEdMX05FVkVSICovCi0vKiAgICAgIEdMX0xFU1MgKi8KLS8qICAgICAgR0xfRVFVQUwgKi8KLS8qICAgICAgR0xfTEVRVUFMICovCi0vKiAgICAgIEdMX0dSRUFURVIgKi8KLS8qICAgICAgR0xfTk9URVFVQUwgKi8KLS8qICAgICAgR0xfR0VRVUFMICovCi0vKiAgICAgIEdMX0FMV0FZUyAqLwotCi0vKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KLSNkZWZpbmUgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAotI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgMHgwMzAxCi0jZGVmaW5lIEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDIKLSNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgICAgICAgIDB4MDMwMwotI2RlZmluZSBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzA0Ci0jZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAweDAzMDUKLQotLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KLS8qICAgICAgR0xfWkVSTyAqLwotLyogICAgICBHTF9PTkUgKi8KLSNkZWZpbmUgR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNgotI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgMHgwMzA3Ci0jZGVmaW5lIEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAweDAzMDgKLS8qICAgICAgR0xfU1JDX0FMUEhBICovCi0vKiAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgKi8KLS8qICAgICAgR0xfRFNUX0FMUEhBICovCi0vKiAgICAgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgKi8KLQotLyogQmxlbmRFcXVhdGlvblNlcGFyYXRlICovCi0jZGVmaW5lIEdMX0ZVTkNfQUREICAgICAgICAgICAgICAgICAgICAgICAweDgwMDYKLSNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT04gICAgICAgICAgICAgICAgIDB4ODAwOQotI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9SR0IgICAgICAgICAgICAgMHg4MDA5ICAgIC8qIHNhbWUgYXMgQkxFTkRfRVFVQVRJT04gKi8KLSNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEEgICAgICAgICAgIDB4ODgzRAotCi0vKiBCbGVuZFN1YnRyYWN0ICovCi0jZGVmaW5lIEdMX0ZVTkNfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAweDgwMEEKLSNkZWZpbmUgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUICAgICAgICAgIDB4ODAwQgotCi0vKiBTZXBhcmF0ZSBCbGVuZCBGdW5jdGlvbnMgKi8KLSNkZWZpbmUgR0xfQkxFTkRfRFNUX1JHQiAgICAgICAgICAgICAgICAgIDB4ODBDOAotI2RlZmluZSBHTF9CTEVORF9TUkNfUkdCICAgICAgICAgICAgICAgICAgMHg4MEM5Ci0jZGVmaW5lIEdMX0JMRU5EX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAweDgwQ0EKLSNkZWZpbmUgR0xfQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgIDB4ODBDQgotI2RlZmluZSBHTF9DT05TVEFOVF9DT0xPUiAgICAgICAgICAgICAgICAgMHg4MDAxCi0jZGVmaW5lIEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiAgICAgICAweDgwMDIKLSNkZWZpbmUgR0xfQ09OU1RBTlRfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODAwMwotI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEgICAgICAgMHg4MDA0Ci0jZGVmaW5lIEdMX0JMRU5EX0NPTE9SICAgICAgICAgICAgICAgICAgICAweDgwMDUKLQotLyogQnVmZmVyIE9iamVjdHMgKi8KLSNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgIDB4ODg5MgotI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgMHg4ODkzCi0jZGVmaW5lIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAweDg4OTQKLSNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAgIDB4ODg5NQotCi0jZGVmaW5lIEdMX1NUUkVBTV9EUkFXICAgICAgICAgICAgICAgICAgICAweDg4RTAKLSNkZWZpbmUgR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFNAotI2RlZmluZSBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgMHg4OEU4Ci0KLSNkZWZpbmUgR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4ODc2NAotI2RlZmluZSBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgMHg4NzY1Ci0KLSNkZWZpbmUgR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCICAgICAgICAgIDB4ODYyNgotCi0vKiBDdWxsRmFjZU1vZGUgKi8KLSNkZWZpbmUgR0xfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNAotI2RlZmluZSBHTF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA1Ci0jZGVmaW5lIEdMX0ZST05UX0FORF9CQUNLICAgICAgICAgICAgICAgICAweDA0MDgKLQotLyogRGVwdGhGdW5jdGlvbiAqLwotLyogICAgICBHTF9ORVZFUiAqLwotLyogICAgICBHTF9MRVNTICovCi0vKiAgICAgIEdMX0VRVUFMICovCi0vKiAgICAgIEdMX0xFUVVBTCAqLwotLyogICAgICBHTF9HUkVBVEVSICovCi0vKiAgICAgIEdMX05PVEVRVUFMICovCi0vKiAgICAgIEdMX0dFUVVBTCAqLwotLyogICAgICBHTF9BTFdBWVMgKi8KLQotLyogRW5hYmxlQ2FwICovCi0jZGVmaW5lIEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAweDBERTEKLSNkZWZpbmUgR0xfQ1VMTF9GQUNFICAgICAgICAgICAgICAgICAgICAgIDB4MEI0NAotI2RlZmluZSBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkUyCi0jZGVmaW5lIEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9URVNUICAgICAgICAgICAgICAgICAgIDB4MEI5MAotI2RlZmluZSBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQjcxCi0jZGVmaW5lIEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAweDBDMTEKLSNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAgICAgICAgICAgIDB4ODAzNwotI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgMHg4MDlFCi0jZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAweDgwQTAKLQotLyogRXJyb3JDb2RlICovCi0jZGVmaW5lIEdMX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdMX0lOVkFMSURfRU5VTSAgICAgICAgICAgICAgICAgICAweDA1MDAKLSNkZWZpbmUgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgIDB4MDUwMQotI2RlZmluZSBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgMHgwNTAyCi0jZGVmaW5lIEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAweDA1MDUKLQotLyogRnJvbnRGYWNlRGlyZWN0aW9uICovCi0jZGVmaW5lIEdMX0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAKLSNkZWZpbmUgR0xfQ0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMQotCi0vKiBHZXRQTmFtZSAqLwotI2RlZmluZSBHTF9MSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMHgwQjIxCi0jZGVmaW5lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAweDg0NkQKLSNkZWZpbmUgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFICAgICAgIDB4ODQ2RQotI2RlZmluZSBHTF9DVUxMX0ZBQ0VfTU9ERSAgICAgICAgICAgICAgICAgMHgwQjQ1Ci0jZGVmaW5lIEdMX0ZST05UX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAweDBCNDYKLSNkZWZpbmUgR0xfREVQVEhfUkFOR0UgICAgICAgICAgICAgICAgICAgIDB4MEI3MAotI2RlZmluZSBHTF9ERVBUSF9XUklURU1BU0sgICAgICAgICAgICAgICAgMHgwQjcyCi0jZGVmaW5lIEdMX0RFUFRIX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAweDBCNzMKLSNkZWZpbmUgR0xfREVQVEhfRlVOQyAgICAgICAgICAgICAgICAgICAgIDB4MEI3NAotI2RlZmluZSBHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFICAgICAgICAgICAgMHgwQjkxCi0jZGVmaW5lIEdMX1NURU5DSUxfRlVOQyAgICAgICAgICAgICAgICAgICAweDBCOTIKLSNkZWZpbmUgR0xfU1RFTkNJTF9GQUlMICAgICAgICAgICAgICAgICAgIDB4MEI5NAotI2RlZmluZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCAgICAgICAgMHgwQjk1Ci0jZGVmaW5lIEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTICAgICAgICAweDBCOTYKLSNkZWZpbmUgR0xfU1RFTkNJTF9SRUYgICAgICAgICAgICAgICAgICAgIDB4MEI5NwotI2RlZmluZSBHTF9TVEVOQ0lMX1ZBTFVFX01BU0sgICAgICAgICAgICAgMHgwQjkzCi0jZGVmaW5lIEdMX1NURU5DSUxfV1JJVEVNQVNLICAgICAgICAgICAgICAweDBCOTgKLSNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX0ZVTkMgICAgICAgICAgICAgIDB4ODgwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfRkFJTCAgICAgICAgICAgICAgMHg4ODAxCi0jZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUwgICAweDg4MDIKLSNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTUyAgIDB4ODgwMwotI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUkVGICAgICAgICAgICAgICAgMHg4Q0EzCi0jZGVmaW5lIEdMX1NURU5DSUxfQkFDS19WQUxVRV9NQVNLICAgICAgICAweDhDQTQKLSNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1dSSVRFTUFTSyAgICAgICAgIDB4OENBNQotI2RlZmluZSBHTF9WSUVXUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMHgwQkEyCi0jZGVmaW5lIEdMX1NDSVNTT1JfQk9YICAgICAgICAgICAgICAgICAgICAweDBDMTAKLS8qICAgICAgR0xfU0NJU1NPUl9URVNUICovCi0jZGVmaW5lIEdMX0NPTE9SX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAweDBDMjIKLSNkZWZpbmUgR0xfQ09MT1JfV1JJVEVNQVNLICAgICAgICAgICAgICAgIDB4MEMyMwotI2RlZmluZSBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgMHgwQ0Y1Ci0jZGVmaW5lIEdMX1BBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAweDBEMDUKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgIDB4MEQzMwotI2RlZmluZSBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgMHgwRDNBCi0jZGVmaW5lIEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAweDBENTAKLSNkZWZpbmUgR0xfUkVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MgotI2RlZmluZSBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDUzCi0jZGVmaW5lIEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAweDBENTQKLSNkZWZpbmUgR0xfQUxQSEFfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NQotI2RlZmluZSBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU2Ci0jZGVmaW5lIEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAweDBENTcKLSNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgICAgICAgICAgIDB4MkEwMAotLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9GSUxMICovCi0jZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiAgICAgICAgICAweDgwMzgKLSNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzJEICAgICAgICAgICAgIDB4ODA2OQotI2RlZmluZSBHTF9TQU1QTEVfQlVGRkVSUyAgICAgICAgICAgICAgICAgMHg4MEE4Ci0jZGVmaW5lIEdMX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAweDgwQTkKLSNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFICAgICAgICAgIDB4ODBBQQotI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfSU5WRVJUICAgICAgICAgMHg4MEFCCi0KLS8qIEdldFRleHR1cmVQYXJhbWV0ZXIgKi8KLS8qICAgICAgR0xfVEVYVFVSRV9NQUdfRklMVEVSICovCi0vKiAgICAgIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAqLwotLyogICAgICBHTF9URVhUVVJFX1dSQVBfUyAqLwotLyogICAgICBHTF9URVhUVVJFX1dSQVBfVCAqLwotCi0jZGVmaW5lIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAweDg2QTIKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgICAgIDB4ODZBMwotCi0vKiBIaW50TW9kZSAqLwotI2RlZmluZSBHTF9ET05UX0NBUkUgICAgICAgICAgICAgICAgICAgICAgMHgxMTAwCi0jZGVmaW5lIEdMX0ZBU1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDExMDEKLSNkZWZpbmUgR0xfTklDRVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMgotCi0vKiBIaW50VGFyZ2V0ICovCi0jZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UICAgICAgICAgICAgMHg4MTkyCi0KLS8qIERhdGFUeXBlICovCi0jZGVmaW5lIEdMX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDAKLSNkZWZpbmUgR0xfVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgIDB4MTQwMQotI2RlZmluZSBHTF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAyCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUICAgICAgICAgICAgICAgICAweDE0MDMKLSNkZWZpbmUgR0xfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwNAotI2RlZmluZSBHTF9VTlNJR05FRF9JTlQgICAgICAgICAgICAgICAgICAgMHgxNDA1Ci0jZGVmaW5lIEdMX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDYKLSNkZWZpbmUgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwQwotCi0vKiBQaXhlbEZvcm1hdCAqLwotI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQgICAgICAgICAgICAgICAgMHgxOTAyCi0jZGVmaW5lIEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDYKLSNkZWZpbmUgR0xfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNwotI2RlZmluZSBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA4Ci0jZGVmaW5lIEdMX0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAweDE5MDkKLSNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgIDB4MTkwQQotCi0vKiBQaXhlbFR5cGUgKi8KLS8qICAgICAgR0xfVU5TSUdORURfQllURSAqLwotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgMHg4MDMzCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAweDgwMzQKLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgIDB4ODM2MwotCi0vKiBTaGFkZXJzICovCi0jZGVmaW5lIEdMX0ZSQUdNRU5UX1NIQURFUiAgICAgICAgICAgICAgICAgIDB4OEIzMAotI2RlZmluZSBHTF9WRVJURVhfU0hBREVSICAgICAgICAgICAgICAgICAgICAweDhCMzEKLSNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BVFRSSUJTICAgICAgICAgICAgICAgMHg4ODY5Ci0jZGVmaW5lIEdMX01BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTICAgICAgIDB4OERGQgotI2RlZmluZSBHTF9NQVhfVkFSWUlOR19WRUNUT1JTICAgICAgICAgICAgICAweDhERkMKLSNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgMHg4QjRECi0jZGVmaW5lIEdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyAgIDB4OEI0QwotI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyAgICAgICAgICAweDg4NzIKLSNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyAgICAgMHg4REZECi0jZGVmaW5lIEdMX1NIQURFUl9UWVBFICAgICAgICAgICAgICAgICAgICAgIDB4OEI0RgotI2RlZmluZSBHTF9ERUxFVEVfU1RBVFVTICAgICAgICAgICAgICAgICAgICAweDhCODAKLSNkZWZpbmUgR0xfTElOS19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgMHg4QjgyCi0jZGVmaW5lIEdMX1ZBTElEQVRFX1NUQVRVUyAgICAgICAgICAgICAgICAgIDB4OEI4MwotI2RlZmluZSBHTF9BVFRBQ0hFRF9TSEFERVJTICAgICAgICAgICAgICAgICAweDhCODUKLSNkZWZpbmUgR0xfQUNUSVZFX1VOSUZPUk1TICAgICAgICAgICAgICAgICAgMHg4Qjg2Ci0jZGVmaW5lIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEggICAgICAgIDB4OEI4NwotI2RlZmluZSBHTF9BQ1RJVkVfQVRUUklCVVRFUyAgICAgICAgICAgICAgICAweDhCODkKLSNkZWZpbmUgR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIICAgICAgMHg4QjhBCi0jZGVmaW5lIEdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTiAgICAgICAgIDB4OEI4QwotI2RlZmluZSBHTF9DVVJSRU5UX1BST0dSQU0gICAgICAgICAgICAgICAgICAweDhCOEQKLQotLyogU3RlbmNpbEZ1bmN0aW9uICovCi0jZGVmaW5lIEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQotI2RlZmluZSBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCi0jZGVmaW5lIEdMX0xFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKLSNkZWZpbmUgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNAotI2RlZmluZSBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA1Ci0jZGVmaW5lIEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDYKLSNkZWZpbmUgR0xfQUxXQVlTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNwotCi0vKiBTdGVuY2lsT3AgKi8KLS8qICAgICAgR0xfWkVSTyAqLwotI2RlZmluZSBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAwCi0jZGVmaW5lIEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDEKLSNkZWZpbmUgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMgotI2RlZmluZSBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAzCi0jZGVmaW5lIEdMX0lOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEEKLSNkZWZpbmUgR0xfSU5DUl9XUkFQICAgICAgICAgICAgICAgICAgICAgIDB4ODUwNwotI2RlZmluZSBHTF9ERUNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgMHg4NTA4Ci0KLS8qIFN0cmluZ05hbWUgKi8KLSNkZWZpbmUgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMAotI2RlZmluZSBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAxCi0jZGVmaW5lIEdMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAweDFGMDIKLSNkZWZpbmUgR0xfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgIDB4MUYwMwotCi0vKiBUZXh0dXJlTWFnRmlsdGVyICovCi0jZGVmaW5lIEdMX05FQVJFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDAKLSNkZWZpbmUgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMQotCi0vKiBUZXh0dXJlTWluRmlsdGVyICovCi0vKiAgICAgIEdMX05FQVJFU1QgKi8KLS8qICAgICAgR0xfTElORUFSICovCi0jZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgICAgICAgICAweDI3MDAKLSNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgIDB4MjcwMQotI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgMHgyNzAyCi0jZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICAgICAgICAgICAweDI3MDMKLQotLyogVGV4dHVyZVBhcmFtZXRlck5hbWUgKi8KLSNkZWZpbmUgR0xfVEVYVFVSRV9NQUdfRklMVEVSICAgICAgICAgICAgIDB4MjgwMAotI2RlZmluZSBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgMHgyODAxCi0jZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAweDI4MDIKLSNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1QgICAgICAgICAgICAgICAgIDB4MjgwMwotCi0vKiBUZXh0dXJlVGFyZ2V0ICovCi0vKiAgICAgIEdMX1RFWFRVUkVfMkQgKi8KLSNkZWZpbmUgR0xfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTcwMgotCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVAgICAgICAgICAgICAgICAweDg1MTMKLSNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQICAgICAgIDB4ODUxNAotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggICAgMHg4NTE1Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAgICAweDg1MTYKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZICAgIDB4ODUxNwotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1kgICAgMHg4NTE4Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiAgICAweDg1MTkKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aICAgIDB4ODUxQQotI2RlZmluZSBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICAgICAgMHg4NTFDCi0KLS8qIFRleHR1cmVVbml0ICovCi0jZGVmaW5lIEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAweDg0QzAKLSNkZWZpbmUgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMQotI2RlZmluZSBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMyCi0jZGVmaW5lIEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAweDg0QzMKLSNkZWZpbmUgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNAotI2RlZmluZSBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM1Ci0jZGVmaW5lIEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzYKLSNkZWZpbmUgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNwotI2RlZmluZSBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM4Ci0jZGVmaW5lIEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzkKLSNkZWZpbmUgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQQotI2RlZmluZSBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgMHg4NENCCi0jZGVmaW5lIEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAweDg0Q0MKLSNkZWZpbmUgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRAotI2RlZmluZSBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgMHg4NENFCi0jZGVmaW5lIEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0YKLSNkZWZpbmUgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMAotI2RlZmluZSBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgMHg4NEQxCi0jZGVmaW5lIEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAweDg0RDIKLSNkZWZpbmUgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMwotI2RlZmluZSBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ0Ci0jZGVmaW5lIEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAweDg0RDUKLSNkZWZpbmUgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDB4ODRENgotI2RlZmluZSBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ3Ci0jZGVmaW5lIEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAweDg0RDgKLSNkZWZpbmUgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOQotI2RlZmluZSBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgMHg4NERBCi0jZGVmaW5lIEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAweDg0REIKLSNkZWZpbmUgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQwotI2RlZmluZSBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgMHg4NERECi0jZGVmaW5lIEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAweDg0REUKLSNkZWZpbmUgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDB4ODRERgotI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgMHg4NEUwCi0KLS8qIFRleHR1cmVXcmFwTW9kZSAqLwotI2RlZmluZSBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOTAxCi0jZGVmaW5lIEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAweDgxMkYKLSNkZWZpbmUgR0xfTUlSUk9SRURfUkVQRUFUICAgICAgICAgICAgICAgIDB4ODM3MAotCi0vKiBVbmlmb3JtIFR5cGVzICovCi0jZGVmaW5lIEdMX0ZMT0FUX1ZFQzIgICAgICAgICAgICAgICAgICAgICAweDhCNTAKLSNkZWZpbmUgR0xfRkxPQVRfVkVDMyAgICAgICAgICAgICAgICAgICAgIDB4OEI1MQotI2RlZmluZSBHTF9GTE9BVF9WRUM0ICAgICAgICAgICAgICAgICAgICAgMHg4QjUyCi0jZGVmaW5lIEdMX0lOVF9WRUMyICAgICAgICAgICAgICAgICAgICAgICAweDhCNTMKLSNkZWZpbmUgR0xfSU5UX1ZFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NAotI2RlZmluZSBHTF9JTlRfVkVDNCAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU1Ci0jZGVmaW5lIEdMX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCNTYKLSNkZWZpbmUgR0xfQk9PTF9WRUMyICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NwotI2RlZmluZSBHTF9CT09MX1ZFQzMgICAgICAgICAgICAgICAgICAgICAgMHg4QjU4Ci0jZGVmaW5lIEdMX0JPT0xfVkVDNCAgICAgICAgICAgICAgICAgICAgICAweDhCNTkKLSNkZWZpbmUgR0xfRkxPQVRfTUFUMiAgICAgICAgICAgICAgICAgICAgIDB4OEI1QQotI2RlZmluZSBHTF9GTE9BVF9NQVQzICAgICAgICAgICAgICAgICAgICAgMHg4QjVCCi0jZGVmaW5lIEdMX0ZMT0FUX01BVDQgICAgICAgICAgICAgICAgICAgICAweDhCNUMKLSNkZWZpbmUgR0xfU0FNUExFUl8yRCAgICAgICAgICAgICAgICAgICAgIDB4OEI1RQotI2RlZmluZSBHTF9TQU1QTEVSX0NVQkUgICAgICAgICAgICAgICAgICAgMHg4QjYwCi0KLS8qIFZlcnRleCBBcnJheXMgKi8KLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEICAgICAgICAweDg2MjIKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFICAgICAgICAgICAweDg2MjMKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREUgICAgICAgICAweDg2MjQKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFICAgICAgICAgICAweDg2MjUKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEICAgICAweDg4NkEKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSICAgICAgICAweDg2NDUKLSNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUYKLQotLyogUmVhZCBGb3JtYXQgKi8KLSNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFICAgMHg4QjlBCi0jZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUIDB4OEI5QgotCi0vKiBTaGFkZXIgU291cmNlICovCi0jZGVmaW5lIEdMX0NPTVBJTEVfU1RBVFVTICAgICAgICAgICAgICAgICAweDhCODEKLSNkZWZpbmUgR0xfSU5GT19MT0dfTEVOR1RIICAgICAgICAgICAgICAgIDB4OEI4NAotI2RlZmluZSBHTF9TSEFERVJfU09VUkNFX0xFTkdUSCAgICAgICAgICAgMHg4Qjg4Ci0jZGVmaW5lIEdMX1NIQURFUl9DT01QSUxFUiAgICAgICAgICAgICAgICAweDhERkEKLQotLyogU2hhZGVyIEJpbmFyeSAqLwotI2RlZmluZSBHTF9TSEFERVJfQklOQVJZX0ZPUk1BVFMgICAgICAgICAgMHg4REY4Ci0jZGVmaW5lIEdMX05VTV9TSEFERVJfQklOQVJZX0ZPUk1BVFMgICAgICAweDhERjkKLQotLyogU2hhZGVyIFByZWNpc2lvbi1TcGVjaWZpZWQgVHlwZXMgKi8KLSNkZWZpbmUgR0xfTE9XX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgIDB4OERGMAotI2RlZmluZSBHTF9NRURJVU1fRkxPQVQgICAgICAgICAgICAgICAgICAgMHg4REYxCi0jZGVmaW5lIEdMX0hJR0hfRkxPQVQgICAgICAgICAgICAgICAgICAgICAweDhERjIKLSNkZWZpbmUgR0xfTE9XX0lOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4OERGMwotI2RlZmluZSBHTF9NRURJVU1fSU5UICAgICAgICAgICAgICAgICAgICAgMHg4REY0Ci0jZGVmaW5lIEdMX0hJR0hfSU5UICAgICAgICAgICAgICAgICAgICAgICAweDhERjUKLQotLyogRnJhbWVidWZmZXIgT2JqZWN0LiAqLwotI2RlZmluZSBHTF9GUkFNRUJVRkZFUiAgICAgICAgICAgICAgICAgICAgMHg4RDQwCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUiAgICAgICAgICAgICAgICAgICAweDhENDEKLQotI2RlZmluZSBHTF9SR0JBNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDU2Ci0jZGVmaW5lIEdMX1JHQjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTcKLSNkZWZpbmUgR0xfUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2MgotI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNiAgICAgICAgICAgICAgMHg4MUE1Ci0jZGVmaW5lIEdMX1NURU5DSUxfSU5ERVggICAgICAgICAgICAgICAgICAweDE5MDEKLSNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDggICAgICAgICAgICAgICAgIDB4OEQ0OAotCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9XSURUSCAgICAgICAgICAgICAweDhENDIKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0hFSUdIVCAgICAgICAgICAgIDB4OEQ0MwotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUICAgMHg4RDQ0Ci0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9SRURfU0laRSAgICAgICAgICAweDhENTAKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkUgICAgICAgIDB4OEQ1MQotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFICAgICAgICAgMHg4RDUyCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFICAgICAgICAweDhENTMKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkUgICAgICAgIDB4OEQ1NAotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFICAgICAgMHg4RDU1Ci0KLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRSAgICAgICAgICAgMHg4Q0QwCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUgICAgICAgICAgIDB4OENEMQotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUwgICAgICAgICAweDhDRDIKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0UgMHg4Q0QzCi0KLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDAgICAgICAgICAgICAgIDB4OENFMAotI2RlZmluZSBHTF9ERVBUSF9BVFRBQ0hNRU5UICAgICAgICAgICAgICAgMHg4RDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQVRUQUNITUVOVCAgICAgICAgICAgICAweDhEMjAKLQotI2RlZmluZSBHTF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgIDB4OENENQotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQgICAgICAgICAweDhDRDYKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQgMHg4Q0Q3Ci0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OUyAgICAgICAgIDB4OENEOQotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAweDhDREQKLQotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HICAgICAgICAgICAgMHg4Q0E2Ci0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HICAgICAgICAgICAweDhDQTcKLSNkZWZpbmUgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFICAgICAgICAgIDB4ODRFOAotCi0jZGVmaW5lIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OICAweDA1MDYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBHTCBjb3JlIGZ1bmN0aW9ucy4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQXR0YWNoU2hhZGVyIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJpbmRBdHRyaWJMb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyKiBuYW1lKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQmluZEJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJpbmRGcmFtZWJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQmluZFJlbmRlcmJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJpbmRUZXh0dXJlIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJsZW5kQ29sb3IgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQmxlbmRFcXVhdGlvbiAoIEdMZW51bSBtb2RlICk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmMgKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3Rvcik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlIChHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJ1ZmZlckRhdGEgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhLCBHTGVudW0gdXNhZ2UpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCdWZmZXJTdWJEYXRhIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKTsKLUdMX0FQSUNBTEwgR0xlbnVtICAgICAgIEdMX0FQSUVOVFJZIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyAoR0xlbnVtIHRhcmdldCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENsZWFyIChHTGJpdGZpZWxkIG1hc2spOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDbGVhckNvbG9yIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENsZWFyRGVwdGhmIChHTGNsYW1wZiBkZXB0aCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENsZWFyU3RlbmNpbCAoR0xpbnQgcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENvbG9yTWFzayAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQ29tcGlsZVNoYWRlciAoR0x1aW50IHNoYWRlcik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENvcHlUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUElDQUxMIEdMdWludCAgICAgICBHTF9BUElFTlRSWSBnbENyZWF0ZVByb2dyYW0gKHZvaWQpOwotR0xfQVBJQ0FMTCBHTHVpbnQgICAgICAgR0xfQVBJRU5UUlkgZ2xDcmVhdGVTaGFkZXIgKEdMZW51bSB0eXBlKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQ3VsbEZhY2UgKEdMZW51bSBtb2RlKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGVsZXRlQnVmZmVycyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGJ1ZmZlcnMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEZWxldGVQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGVsZXRlU2hhZGVyIChHTHVpbnQgc2hhZGVyKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGVsZXRlVGV4dHVyZXMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiB0ZXh0dXJlcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERlcHRoRnVuYyAoR0xlbnVtIGZ1bmMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEZXB0aE1hc2sgKEdMYm9vbGVhbiBmbGFnKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGVwdGhSYW5nZWYgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGV0YWNoU2hhZGVyIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERpc2FibGUgKEdMZW51bSBjYXApOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkgKEdMdWludCBpbmRleCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERyYXdBcnJheXMgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERyYXdFbGVtZW50cyAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIGluZGljZXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xFbmFibGUgKEdMZW51bSBjYXApOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSAoR0x1aW50IGluZGV4KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRmluaXNoICh2b2lkKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRmx1c2ggKHZvaWQpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEZyb250RmFjZSAoR0xlbnVtIG1vZGUpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZW5CdWZmZXJzIChHTHNpemVpIG4sIEdMdWludCogYnVmZmVycyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdlbmVyYXRlTWlwbWFwIChHTGVudW0gdGFyZ2V0KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2VuRnJhbWVidWZmZXJzIChHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2VuUmVuZGVyYnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZW5UZXh0dXJlcyAoR0xzaXplaSBuLCBHTHVpbnQqIHRleHR1cmVzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0QWN0aXZlQXR0cmliIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0QWN0aXZlVW5pZm9ybSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEF0dGFjaGVkU2hhZGVycyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpOwotR0xfQVBJQ0FMTCBpbnQgICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRBdHRyaWJMb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEJvb2xlYW52IChHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiogcGFyYW1zKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci1HTF9BUElDQUxMIEdMZW51bSAgICAgICBHTF9BUElFTlRSWSBnbEdldEVycm9yICh2b2lkKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0RmxvYXR2IChHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0SW50ZWdlcnYgKEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFByb2dyYW1pdiAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFByb2dyYW1JbmZvTG9nIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRTaGFkZXJpdiAoR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0U2hhZGVySW5mb0xvZyAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCAoR0xlbnVtIHNoYWRlcnR5cGUsIEdMZW51bSBwcmVjaXNpb250eXBlLCBHTGludCogcmFuZ2UsIEdMaW50KiBwcmVjaXNpb24pOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRTaGFkZXJTb3VyY2UgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIHNvdXJjZSk7Ci1HTF9BUElDQUxMIGNvbnN0IEdMdWJ5dGUqIEdMX0FQSUVOVFJZIGdsR2V0U3RyaW5nIChHTGVudW0gbmFtZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRVbmlmb3JtZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCogcGFyYW1zKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0VW5pZm9ybWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50KiBwYXJhbXMpOwotR0xfQVBJQ0FMTCBpbnQgICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRVbmlmb3JtTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJmdiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYml2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiogcG9pbnRlcik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEhpbnQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKTsKLUdMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNCdWZmZXIgKEdMdWludCBidWZmZXIpOwotR0xfQVBJQ0FMTCBHTGJvb2xlYW4gICAgR0xfQVBJRU5UUlkgZ2xJc0VuYWJsZWQgKEdMZW51bSBjYXApOwotR0xfQVBJQ0FMTCBHTGJvb2xlYW4gICAgR0xfQVBJRU5UUlkgZ2xJc0ZyYW1lYnVmZmVyIChHTHVpbnQgZnJhbWVidWZmZXIpOwotR0xfQVBJQ0FMTCBHTGJvb2xlYW4gICAgR0xfQVBJRU5UUlkgZ2xJc1Byb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKLUdMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNSZW5kZXJidWZmZXIgKEdMdWludCByZW5kZXJidWZmZXIpOwotR0xfQVBJQ0FMTCBHTGJvb2xlYW4gICAgR0xfQVBJRU5UUlkgZ2xJc1NoYWRlciAoR0x1aW50IHNoYWRlcik7Ci1HTF9BUElDQUxMIEdMYm9vbGVhbiAgICBHTF9BUElFTlRSWSBnbElzVGV4dHVyZSAoR0x1aW50IHRleHR1cmUpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xMaW5lV2lkdGggKEdMZmxvYXQgd2lkdGgpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xMaW5rUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xQaXhlbFN0b3JlaSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFBvbHlnb25PZmZzZXQgKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsUmVhZFBpeGVscyAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQqIHBpeGVscyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFJlbGVhc2VTaGFkZXJDb21waWxlciAodm9pZCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xTY2lzc29yIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFNoYWRlckJpbmFyeSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHNoYWRlcnMsIEdMZW51bSBiaW5hcnlmb3JtYXQsIGNvbnN0IEdMdm9pZCogYmluYXJ5LCBHTHNpemVpIGxlbmd0aCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFNoYWRlclNvdXJjZSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiogc3RyaW5nLCBjb25zdCBHTGludCogbGVuZ3RoKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsU3RlbmNpbEZ1bmMgKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSAoR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE1hc2sgKEdMdWludCBtYXNrKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE1hc2tTZXBhcmF0ZSAoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE9wIChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsT3BTZXBhcmF0ZSAoR0xlbnVtIGZhY2UsIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyZiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyZnYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyaSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50KiBwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0xZiAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0xZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTFpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0xaXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0yZiAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTJmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMmkgKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTJpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTNmIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0zZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTNpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0zaXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm00ZiAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm00ZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTRpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm00aXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgzZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXg0ZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVzZVByb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVmFsaWRhdGVQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmIChHTHVpbnQgaW5keCwgR0xmbG9hdCB4KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliMWZ2IChHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliMmYgKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmdiAoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmIChHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmdiAoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmIChHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZ2IChHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliUG9pbnRlciAoR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcHRyKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVmlld3BvcnQgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fZ2wyX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvaW5jbHVkZS9HTEVTMi9nbDJleHQuaCBiL29wZW5nbC9pbmNsdWRlL0dMRVMyL2dsMmV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjhkODBhMS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvaW5jbHVkZS9HTEVTMi9nbDJleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MjIgKzAsMCBAQAotI2lmbmRlZiBfX2dsMmV4dF9oXwotI2RlZmluZSBfX2dsMmV4dF9oXwotCi0vKiAkUmV2aXNpb246IDE2NjE5ICQgb24gJERhdGU6OiAyMDEyLTAxLTE4IDEwOjAwOjE0IC0wODAwICMkICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgZG9jdW1lbnQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNHSSBGcmVlIFNvZnR3YXJlIEIgTGljZW5zZSBWZXJzaW9uCi0gKiAyLjAuIEZvciBkZXRhaWxzLCBzZWUgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCLyAuCi0gKi8KLQotI2lmbmRlZiBHTF9BUElFTlRSWVAKLSMgICBkZWZpbmUgR0xfQVBJRU5UUllQIEdMX0FQSUVOVFJZKgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogT0VTIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUKLSNkZWZpbmUgR0xfRVRDMV9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjQKLSNlbmRpZgotCi0vKiBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlICovCi0jaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUKLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTAKLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTEKLSNkZWZpbmUgR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTIKLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTMKLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTQKLSNkZWZpbmUgR0xfUEFMRVRURThfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTUKLSNkZWZpbmUgR0xfUEFMRVRURThfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTYKLSNkZWZpbmUgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTcKLSNkZWZpbmUgR0xfUEFMRVRURThfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTgKLSNkZWZpbmUgR0xfUEFMRVRURThfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTkKLSNlbmRpZgotCi0vKiBHTF9PRVNfZGVwdGgyNCAqLwotI2lmbmRlZiBHTF9PRVNfZGVwdGgyNAotI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQyNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODFBNgotI2VuZGlmCi0KLS8qIEdMX09FU19kZXB0aDMyICovCi0jaWZuZGVmIEdMX09FU19kZXB0aDMyCi0jZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDMyX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MUE3Ci0jZW5kaWYKLQotLyogR0xfT0VTX2RlcHRoX3RleHR1cmUgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfT0VTX0VHTF9pbWFnZSAqLwotI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlCi10eXBlZGVmIHZvaWQqIEdMZWdsSW1hZ2VPRVM7Ci0jZW5kaWYKLQotLyogR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCAqLwotI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsCi0vKiBHTGVnbEltYWdlT0VTIGRlZmluZWQgaW4gR0xfT0VTX0VHTF9pbWFnZSBhbHJlYWR5LiAqLwotI2RlZmluZSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2NQotI2RlZmluZSBHTF9TQU1QTEVSX0VYVEVSTkFMX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2NgotI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfRVhURVJOQUxfT0VTICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2NwotI2RlZmluZSBHTF9SRVFVSVJFRF9URVhUVVJFX0lNQUdFX1VOSVRTX09FUyAgICAgICAgICAgICAgICAgICAgIDB4OEQ2OAotI2VuZGlmCi0KLS8qIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQgKi8KLSNpZm5kZWYgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludAotI2RlZmluZSBHTF9VTlNJR05FRF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwNQotI2VuZGlmCi0KLS8qIEdMX09FU19nZXRfcHJvZ3JhbV9iaW5hcnkgKi8KLSNpZm5kZWYgR0xfT0VTX2dldF9wcm9ncmFtX2JpbmFyeQotI2RlZmluZSBHTF9QUk9HUkFNX0JJTkFSWV9MRU5HVEhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODc0MQotI2RlZmluZSBHTF9OVU1fUFJPR1JBTV9CSU5BUllfRk9STUFUU19PRVMgICAgICAgICAgICAgICAgICAgICAgIDB4ODdGRQotI2RlZmluZSBHTF9QUk9HUkFNX0JJTkFSWV9GT1JNQVRTX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdGRgotI2VuZGlmCi0KLS8qIEdMX09FU19tYXBidWZmZXIgKi8KLSNpZm5kZWYgR0xfT0VTX21hcGJ1ZmZlcgotI2RlZmluZSBHTF9XUklURV9PTkxZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCOQotI2RlZmluZSBHTF9CVUZGRVJfQUNDRVNTX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCQgotI2RlZmluZSBHTF9CVUZGRVJfTUFQUEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCQwotI2RlZmluZSBHTF9CVUZGRVJfTUFQX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCRAotI2VuZGlmCi0KLS8qIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbCAqLwotI2lmbmRlZiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwKLSNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RjkKLSNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzI0XzhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RkEKLSNkZWZpbmUgR0xfREVQVEgyNF9TVEVOQ0lMOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4RjAKLSNlbmRpZgotCi0vKiBHTF9PRVNfcmdiOF9yZ2JhOCAqLwotI2lmbmRlZiBHTF9PRVNfcmdiOF9yZ2JhOAotI2RlZmluZSBHTF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MQotI2RlZmluZSBHTF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1OAotI2VuZGlmCi0KLS8qIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyAqLwotI2lmbmRlZiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMKLSNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVF9PRVMgICAgICAgICAgICAgICAgICAweDhCOEIKLSNlbmRpZgotCi0vKiBHTF9PRVNfc3RlbmNpbDEgKi8KLSNpZm5kZWYgR0xfT0VTX3N0ZW5jaWwxCi0jZGVmaW5lIEdMX1NURU5DSUxfSU5ERVgxX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDQ2Ci0jZW5kaWYKLQotLyogR0xfT0VTX3N0ZW5jaWw0ICovCi0jaWZuZGVmIEdMX09FU19zdGVuY2lsNAotI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0NwotI2VuZGlmCi0KLS8qIEdMX09FU190ZXh0dXJlXzNEICovCi0jaWZuZGVmIEdMX09FU190ZXh0dXJlXzNECi0jZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9SX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDcyCi0jZGVmaW5lIEdMX1RFWFRVUkVfM0RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDZGCi0jZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18zRF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDZBCi0jZGVmaW5lIEdMX01BWF8zRF9URVhUVVJFX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDczCi0jZGVmaW5lIEdMX1NBTVBMRVJfM0RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjVGCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV8zRF9aT0ZGU0VUX09FUyAgICAgICAgMHg4Q0Q0Ci0jZW5kaWYKLQotLyogR0xfT0VTX3RleHR1cmVfZmxvYXQgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXQgKi8KLSNpZm5kZWYgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdAotI2RlZmluZSBHTF9IQUxGX0ZMT0FUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2MQotI2VuZGlmCi0KLS8qIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX09FU190ZXh0dXJlX25wb3QgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QgKi8KLSNpZm5kZWYgR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg1QjUKLSNlbmRpZgotCi0vKiBHTF9PRVNfdmVydGV4X2hhbGZfZmxvYXQgKi8KLS8qIEdMX0hBTEZfRkxPQVRfT0VTIGRlZmluZWQgaW4gR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdCBhbHJlYWR5LiAqLwotCi0vKiBHTF9PRVNfdmVydGV4X3R5cGVfMTBfMTBfMTBfMiAqLwotI2lmbmRlZiBHTF9PRVNfdmVydGV4X3R5cGVfMTBfMTBfMTBfMgotI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBfMTBfMTBfMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OERGNgotI2RlZmluZSBHTF9JTlRfMTBfMTBfMTBfMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OERGNwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogQU1EIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUKLSNkZWZpbmUgR0xfM0RDX1hfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RjkKLSNkZWZpbmUgR0xfM0RDX1hZX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RkEKLSNlbmRpZgotCi0vKiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZQotI2RlZmluZSBHTF9BVENfUkdCX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM5MgotI2RlZmluZSBHTF9BVENfUkdCQV9FWFBMSUNJVF9BTFBIQV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM5MwotI2RlZmluZSBHTF9BVENfUkdCQV9JTlRFUlBPTEFURURfQUxQSEFfQU1EICAgICAgICAgICAgICAgICAgICAgIDB4ODdFRQotI2VuZGlmCi0KLS8qIEdMX0FNRF9wZXJmb3JtYW5jZV9tb25pdG9yICovCi0jaWZuZGVmIEdMX0FNRF9wZXJmb3JtYW5jZV9tb25pdG9yCi0jZGVmaW5lIEdMX0NPVU5URVJfVFlQRV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkMwCi0jZGVmaW5lIEdMX0NPVU5URVJfUkFOR0VfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkMxCi0jZGVmaW5lIEdMX1VOU0lHTkVEX0lOVDY0X0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkMyCi0jZGVmaW5lIEdMX1BFUkNFTlRBR0VfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkMzCi0jZGVmaW5lIEdMX1BFUkZNT05fUkVTVUxUX0FWQUlMQUJMRV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkM0Ci0jZGVmaW5lIEdMX1BFUkZNT05fUkVTVUxUX1NJWkVfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkM1Ci0jZGVmaW5lIEdMX1BFUkZNT05fUkVTVUxUX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkM2Ci0jZW5kaWYKLQotLyogR0xfQU1EX3Byb2dyYW1fYmluYXJ5X1o0MDAgKi8KLSNpZm5kZWYgR0xfQU1EX3Byb2dyYW1fYmluYXJ5X1o0MDAKLSNkZWZpbmUgR0xfWjQwMF9CSU5BUllfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3NDAKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEFOR0xFIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfQU5HTEVfZnJhbWVidWZmZXJfYmxpdCAqLwotI2lmbmRlZiBHTF9BTkdMRV9mcmFtZWJ1ZmZlcl9ibGl0Ci0jZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfQU5HTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E4Ci0jZGVmaW5lIEdMX0RSQVdfRlJBTUVCVUZGRVJfQU5HTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E5Ci0jZGVmaW5lIEdMX0RSQVdfRlJBTUVCVUZGRVJfQklORElOR19BTkdMRSAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E2Ci0jZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElOR19BTkdMRSAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0FBCi0jZW5kaWYKLQotLyogR0xfQU5HTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgKi8KLSNpZm5kZWYgR0xfQU5HTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVNfQU5HTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDQUIKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9BTkdMRSAgICAgICAgICAgICAweDhENTYKLSNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfQU5HTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENTcKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEFQUExFIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfQVBQTEVfcmdiXzQyMiAqLwotI2lmbmRlZiBHTF9BUFBMRV9yZ2JfNDIyCi0jZGVmaW5lIEdMX1JHQl80MjJfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QTFGCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NUJBCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NUJCCi0jZW5kaWYKLQotLyogR0xfQVBQTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgKi8KLSNpZm5kZWYgR0xfQVBQTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVNfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDQUIKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9BUFBMRSAgICAgICAgICAgICAweDhENTYKLSNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENTcKLSNkZWZpbmUgR0xfUkVBRF9GUkFNRUJVRkZFUl9BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDQTgKLSNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUl9BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDQTkKLSNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAweDhDQTYKLSNkZWZpbmUgR0xfUkVBRF9GUkFNRUJVRkZFUl9CSU5ESU5HX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAweDhDQUEKLSNlbmRpZgotCi0vKiBHTF9BUFBMRV90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAqLwotI2lmbmRlZiBHTF9BUFBMRV90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OAotI2RlZmluZSBHTF9CR1JBX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMQotI2VuZGlmCi0KLS8qIEdMX0FQUExFX3RleHR1cmVfbWF4X2xldmVsICovCi0jaWZuZGVmIEdMX0FQUExFX3RleHR1cmVfbWF4X2xldmVsCi0jZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0xFVkVMX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MTNECi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBBUk0gZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9BUk1fbWFsaV9zaGFkZXJfYmluYXJ5ICovCi0jaWZuZGVmIEdMX0FSTV9tYWxpX3NoYWRlcl9iaW5hcnkKLSNkZWZpbmUgR0xfTUFMSV9TSEFERVJfQklOQVJZX0FSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhGNjAKLSNlbmRpZgotCi0vKiBHTF9BUk1fcmdiYTggKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBFWFQgZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9FWFRfYmxlbmRfbWlubWF4ICovCi0jaWZuZGVmIEdMX0VYVF9ibGVuZF9taW5tYXgKLSNkZWZpbmUgR0xfTUlOX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDcKLSNkZWZpbmUgR0xfTUFYX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDgKLSNlbmRpZgotCi0vKiBHTF9FWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQgKi8KLSNpZm5kZWYgR0xfRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Ci0jZGVmaW5lIEdMX1JHQkExNkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFBCi0jZGVmaW5lIEdMX1JHQjE2Rl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFCCi0jZGVmaW5lIEdMX1JHMTZGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJGCi0jZGVmaW5lIEdMX1IxNkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJECi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09NUE9ORU5UX1RZUEVfRVhUICAgICAgICAgICAgMHg4MjExCi0jZGVmaW5lIEdMX1VOU0lHTkVEX05PUk1BTElaRURfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzE3Ci0jZW5kaWYKLQotLyogR0xfRVhUX2RlYnVnX2xhYmVsICovCi0jaWZuZGVmIEdMX0VYVF9kZWJ1Z19sYWJlbAotI2RlZmluZSBHTF9QUk9HUkFNX1BJUEVMSU5FX09CSkVDVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEE0RgotI2RlZmluZSBHTF9QUk9HUkFNX09CSkVDVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI0MAotI2RlZmluZSBHTF9TSEFERVJfT0JKRUNUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI0OAotI2RlZmluZSBHTF9CVUZGRVJfT0JKRUNUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTE1MQotI2RlZmluZSBHTF9RVUVSWV9PQkpFQ1RfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTE1MwotI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfT0JKRUNUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTE1NAotI2VuZGlmCi0KLS8qIEdMX0VYVF9kZWJ1Z19tYXJrZXIgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIgKi8KLSNpZm5kZWYgR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIKLSNkZWZpbmUgR0xfQ09MT1JfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MDAKLSNkZWZpbmUgR0xfREVQVEhfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MDEKLSNkZWZpbmUgR0xfU1RFTkNJTF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MDIKLSNlbmRpZgotCi0vKiBHTF9FWFRfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0VYVF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX1NBTVBMRVNfRVhUICAgICAgICAgICAweDhENkMKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVNfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzMKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9FWFQgICAgICAgICAgICAgICAweDkxMzQKLSNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzUKLSNlbmRpZgotCi0vKiBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfRVhUX29jY2x1c2lvbl9xdWVyeV9ib29sZWFuICovCi0jaWZuZGVmIEdMX0VYVF9vY2NsdXNpb25fcXVlcnlfYm9vbGVhbgotI2RlZmluZSBHTF9BTllfU0FNUExFU19QQVNTRURfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEMyRgotI2RlZmluZSBHTF9BTllfU0FNUExFU19QQVNTRURfQ09OU0VSVkFUSVZFX0VYVCAgICAgICAgICAgICAgICAgIDB4OEQ2QQotI2RlZmluZSBHTF9DVVJSRU5UX1FVRVJZX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg2NQotI2RlZmluZSBHTF9RVUVSWV9SRVNVTFRfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg2NgotI2RlZmluZSBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg2NwotI2VuZGlmCi0KLS8qIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhICovCi0jaWZuZGVmIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhCi0jZGVmaW5lIEdMX0JHUkFfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUxCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MzY1Ci0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MzY2Ci0jZW5kaWYKLQotLyogR0xfRVhUX3JvYnVzdG5lc3MgKi8KLSNpZm5kZWYgR0xfRVhUX3JvYnVzdG5lc3MKLS8qIHJldXNlIEdMX05PX0VSUk9SICovCi0jZGVmaW5lIEdMX0dVSUxUWV9DT05URVhUX1JFU0VUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjUzCi0jZGVmaW5lIEdMX0lOTk9DRU5UX0NPTlRFWFRfUkVTRVRfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjU0Ci0jZGVmaW5lIEdMX1VOS05PV05fQ09OVEVYVF9SRVNFVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjU1Ci0jZGVmaW5lIEdMX0NPTlRFWFRfUk9CVVNUX0FDQ0VTU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MEYzCi0jZGVmaW5lIEdMX1JFU0VUX05PVElGSUNBVElPTl9TVFJBVEVHWV9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MjU2Ci0jZGVmaW5lIEdMX0xPU0VfQ09OVEVYVF9PTl9SRVNFVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjUyCi0jZGVmaW5lIEdMX05PX1JFU0VUX05PVElGSUNBVElPTl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjYxCi0jZW5kaWYKLQotLyogR0xfRVhUX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzICovCi0jaWZuZGVmIEdMX0VYVF9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cwotI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0JJVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0JJVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEdMX0FMTF9TSEFERVJfQklUU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBHTF9QUk9HUkFNX1NFUEFSQUJMRV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI1OAotI2RlZmluZSBHTF9BQ1RJVkVfUFJPR1JBTV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI1OQotI2RlZmluZSBHTF9QUk9HUkFNX1BJUEVMSU5FX0JJTkRJTkdfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI1QQotI2VuZGlmCi0KLS8qIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfRVhUX3NoYWRvd19zYW1wbGVycyAqLwotI2lmbmRlZiBHTF9FWFRfc2hhZG93X3NhbXBsZXJzCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9NT0RFX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODRDCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9GVU5DX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODRECi0jZGVmaW5lIEdMX0NPTVBBUkVfUkVGX1RPX1RFWFRVUkVfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODRFCi0jZGVmaW5lIEdMX1NBTVBMRVJfMkRfU0hBRE9XX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjYyCi0jZW5kaWYKLQotLyogR0xfRVhUX3NSR0IgKi8KLSNpZm5kZWYgR0xfRVhUX3NSR0IKLSNkZWZpbmUgR0xfU1JHQl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDNDAKLSNkZWZpbmUgR0xfU1JHQl9BTFBIQV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDNDIKLSNkZWZpbmUgR0xfU1JHQjhfQUxQSEE4X0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDNDMKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT0xPUl9FTkNPRElOR19FWFQgICAgICAgICAgICAweDgyMTAKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQxICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2R4dDEKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDgzRjAKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgzRjEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljCi0jZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEZFCi0jZGVmaW5lIEdMX01BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEZGCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4ICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OAotI2RlZmluZSBHTF9CR1JBX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMQotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX3JnICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3JnCi0jZGVmaW5lIEdMX1JFRF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTAzCi0jZGVmaW5lIEdMX1JHX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjI3Ci0jZGVmaW5lIEdMX1I4X0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjI5Ci0jZGVmaW5lIEdMX1JHOF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJCCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfc3RvcmFnZSAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zdG9yYWdlCi0jZGVmaW5lIEdMX1RFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MTJGCi0jZGVmaW5lIEdMX0FMUEhBOF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDNDICAKLSNkZWZpbmUgR0xfTFVNSU5BTkNFOF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNDAKLSNkZWZpbmUgR0xfTFVNSU5BTkNFOF9BTFBIQThfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNDUKLSNkZWZpbmUgR0xfUkdCQTMyRl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTQgIAotI2RlZmluZSBHTF9SR0IzMkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxNQotI2RlZmluZSBHTF9BTFBIQTMyRl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxNgotI2RlZmluZSBHTF9MVU1JTkFOQ0UzMkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxOAotI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEzMkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxOQotLyogcmV1c2UgR0xfUkdCQTE2Rl9FWFQgKi8KLSNkZWZpbmUgR0xfUkdCMTZGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MUIKLSNkZWZpbmUgR0xfQUxQSEExNkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MUMKLSNkZWZpbmUgR0xfTFVNSU5BTkNFMTZGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MUUKLSNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBMTZGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MUYKLSNkZWZpbmUgR0xfUkdCMTBfQTJfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTkgIAotI2RlZmluZSBHTF9SR0IxMF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MgotI2RlZmluZSBHTF9CR1JBOF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTNBMQotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX3R5cGVfMl8xMF8xMF8xMF9SRVYgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfdHlwZV8yXzEwXzEwXzEwX1JFVgotI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVZfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODM2OAotI2VuZGlmCi0KLS8qIEdMX0VYVF91bnBhY2tfc3ViaW1hZ2UgKi8KLSNpZm5kZWYgR0xfRVhUX3VucGFja19zdWJpbWFnZQotI2RlZmluZSBHTF9VTlBBQ0tfUk9XX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MENGMgotI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9ST1dTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MENGMwotI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9QSVhFTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MENGNAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogRE1QIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfRE1QX3NoYWRlcl9iaW5hcnkgKi8KLSNpZm5kZWYgR0xfRE1QX3NoYWRlcl9iaW5hcnkKLSNkZWZpbmUgR0xfU0hBREVSX0JJTkFSWV9ETVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkyNTAKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIElNRyBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0lNR19wcm9ncmFtX2JpbmFyeSAqLwotI2lmbmRlZiBHTF9JTUdfcHJvZ3JhbV9iaW5hcnkKLSNkZWZpbmUgR0xfU0dYX1BST0dSQU1fQklOQVJZX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzAKLSNlbmRpZgotCi0vKiBHTF9JTUdfcmVhZF9mb3JtYXQgKi8KLSNpZm5kZWYgR0xfSU1HX3JlYWRfZm9ybWF0Ci0jZGVmaW5lIEdMX0JHUkFfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUxCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWX0lNRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MzY1Ci0jZW5kaWYKLQotLyogR0xfSU1HX3NoYWRlcl9iaW5hcnkgKi8KLSNpZm5kZWYgR0xfSU1HX3NoYWRlcl9iaW5hcnkKLSNkZWZpbmUgR0xfU0dYX0JJTkFSWV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDMEEKLSNlbmRpZgotCi0vKiBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YyAqLwotI2lmbmRlZiBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YwotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HICAgICAgICAgICAgICAgICAgICAgIDB4OEMwMAotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HICAgICAgICAgICAgICAgICAgICAgIDB4OEMwMQotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRyAgICAgICAgICAgICAgICAgICAgIDB4OEMwMgotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRyAgICAgICAgICAgICAgICAgICAgIDB4OEMwMwotI2VuZGlmCi0KLS8qIEdMX0lNR19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfSU1HX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZQotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU0FNUExFU19JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEzMwotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFX0lNRyAgICAgICAgICAgICAgIDB4OTEzNAotI2RlZmluZSBHTF9NQVhfU0FNUExFU19JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEzNQotI2RlZmluZSBHTF9URVhUVVJFX1NBTVBMRVNfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEzNgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogTlYgZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9OVl9jb3ZlcmFnZV9zYW1wbGUgKi8KLSNpZm5kZWYgR0xfTlZfY292ZXJhZ2Vfc2FtcGxlCi0jZGVmaW5lIEdMX0NPVkVSQUdFX0NPTVBPTkVOVF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RUQwCi0jZGVmaW5lIEdMX0NPVkVSQUdFX0NPTVBPTkVOVDRfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RUQxCi0jZGVmaW5lIEdMX0NPVkVSQUdFX0FUVEFDSE1FTlRfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RUQyCi0jZGVmaW5lIEdMX0NPVkVSQUdFX0JVRkZFUlNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RUQzCi0jZGVmaW5lIEdMX0NPVkVSQUdFX1NBTVBMRVNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RUQ0Ci0jZGVmaW5lIEdMX0NPVkVSQUdFX0FMTF9GUkFHTUVOVFNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RUQ1Ci0jZGVmaW5lIEdMX0NPVkVSQUdFX0VER0VfRlJBR01FTlRTX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RUQ2Ci0jZGVmaW5lIEdMX0NPVkVSQUdFX0FVVE9NQVRJQ19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RUQ3Ci0jZGVmaW5lIEdMX0NPVkVSQUdFX0JVRkZFUl9CSVRfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCi0jZW5kaWYKLQotLyogR0xfTlZfZGVwdGhfbm9ubGluZWFyICovCi0jaWZuZGVmIEdMX05WX2RlcHRoX25vbmxpbmVhcgotI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNl9OT05MSU5FQVJfTlYgICAgICAgICAgICAgICAgICAgICAgIDB4OEUyQwotI2VuZGlmCi0KLS8qIEdMX05WX2RyYXdfYnVmZmVycyAqLwotI2lmbmRlZiBHTF9OVl9kcmF3X2J1ZmZlcnMKLSNkZWZpbmUgR0xfTUFYX0RSQVdfQlVGRkVSU19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MjQKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIwX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MjUKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MjYKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIyX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MjcKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIzX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MjgKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI0X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MjkKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI1X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MkEKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI2X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MkIKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI3X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MkMKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI4X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MkQKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVI5X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MkUKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MkYKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMV9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MzAKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMl9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MzEKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxM19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MzIKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MzMKLSNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNV9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MzQKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDBfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRTAKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDFfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRTEKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDJfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRTIKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRTMKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDRfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRTQKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDVfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRTUKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDZfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRTYKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDdfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRTcKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDhfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRTgKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDlfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRTkKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEwX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRUEKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDExX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRUIKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEyX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRUMKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEzX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRUQKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDE0X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRUUKLSNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDE1X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRUYKLSNlbmRpZgotCi0vKiBHTF9OVl9mYm9fY29sb3JfYXR0YWNobWVudHMgKi8KLSNpZm5kZWYgR0xfTlZfZmJvX2NvbG9yX2F0dGFjaG1lbnRzCi0jZGVmaW5lIEdMX01BWF9DT0xPUl9BVFRBQ0hNRU5UU19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0RGCi0vKiBHTF9DT0xPUl9BVFRBQ0hNRU5UezAtMTV9X05WIGRlZmluZWQgaW4gR0xfTlZfZHJhd19idWZmZXJzIGFscmVhZHkuICovCi0jZW5kaWYKLQotLyogR0xfTlZfZmVuY2UgKi8KLSNpZm5kZWYgR0xfTlZfZmVuY2UKLSNkZWZpbmUgR0xfQUxMX0NPTVBMRVRFRF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RjIKLSNkZWZpbmUgR0xfRkVOQ0VfU1RBVFVTX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RjMKLSNkZWZpbmUgR0xfRkVOQ0VfQ09ORElUSU9OX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RjQKLSNlbmRpZgotCi0vKiBHTF9OVl9yZWFkX2J1ZmZlciAqLwotI2lmbmRlZiBHTF9OVl9yZWFkX2J1ZmZlcgotI2RlZmluZSBHTF9SRUFEX0JVRkZFUl9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMwMgotI2VuZGlmCi0KLS8qIEdMX05WX3JlYWRfYnVmZmVyX2Zyb250ICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX05WX3JlYWRfZGVwdGggKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfTlZfcmVhZF9kZXB0aF9zdGVuY2lsICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX05WX3JlYWRfc3RlbmNpbCAqLwotLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLwotCi0vKiBHTF9OVl90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGNfdXBkYXRlICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX05WX3RleHR1cmVfbnBvdF8yRF9taXBtYXAgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBRQ09NIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfUUNPTV9hbHBoYV90ZXN0ICovCi0jaWZuZGVmIEdMX1FDT01fYWxwaGFfdGVzdAotI2RlZmluZSBHTF9BTFBIQV9URVNUX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJDMAotI2RlZmluZSBHTF9BTFBIQV9URVNUX0ZVTkNfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJDMQotI2RlZmluZSBHTF9BTFBIQV9URVNUX1JFRl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJDMgotI2VuZGlmCi0KLS8qIEdMX1FDT01fZHJpdmVyX2NvbnRyb2wgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfUUNPTV9leHRlbmRlZF9nZXQgKi8KLSNpZm5kZWYgR0xfUUNPTV9leHRlbmRlZF9nZXQKLSNkZWZpbmUgR0xfVEVYVFVSRV9XSURUSF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDIKLSNkZWZpbmUgR0xfVEVYVFVSRV9IRUlHSFRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDMKLSNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDQKLSNkZWZpbmUgR0xfVEVYVFVSRV9JTlRFUk5BTF9GT1JNQVRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDUKLSNkZWZpbmUgR0xfVEVYVFVSRV9GT1JNQVRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDYKLSNkZWZpbmUgR0xfVEVYVFVSRV9UWVBFX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDcKLSNkZWZpbmUgR0xfVEVYVFVSRV9JTUFHRV9WQUxJRF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDgKLSNkZWZpbmUgR0xfVEVYVFVSRV9OVU1fTEVWRUxTX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDkKLSNkZWZpbmUgR0xfVEVYVFVSRV9UQVJHRVRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCREEKLSNkZWZpbmUgR0xfVEVYVFVSRV9PQkpFQ1RfVkFMSURfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCREIKLSNkZWZpbmUgR0xfU1RBVEVfUkVTVE9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCREMKLSNlbmRpZgotCi0vKiBHTF9RQ09NX2V4dGVuZGVkX2dldDIgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfUUNPTV9wZXJmbW9uX2dsb2JhbF9tb2RlICovCi0jaWZuZGVmIEdMX1FDT01fcGVyZm1vbl9nbG9iYWxfbW9kZQotI2RlZmluZSBHTF9QRVJGTU9OX0dMT0JBTF9NT0RFX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEZBMAotI2VuZGlmCi0KLS8qIEdMX1FDT01fd3JpdGVvbmx5X3JlbmRlcmluZyAqLwotI2lmbmRlZiBHTF9RQ09NX3dyaXRlb25seV9yZW5kZXJpbmcKLSNkZWZpbmUgR0xfV1JJVEVPTkxZX1JFTkRFUklOR19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MjMKLSNlbmRpZgotCi0vKiBHTF9RQ09NX3RpbGVkX3JlbmRlcmluZyAqLwotI2lmbmRlZiBHTF9RQ09NX3RpbGVkX3JlbmRlcmluZwotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUMF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDFfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQyX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUM19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQ1X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUNl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDdfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQwX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUMV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDJfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQzX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUNF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQ2X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUN19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUMF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDFfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQyX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUM19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ1X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUNl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDdfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUMF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDFfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQyX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUM19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQ1X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUNl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDdfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBWSVYgZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9WSVZfc2hhZGVyX2JpbmFyeSAqLwotI2lmbmRlZiBHTF9WSVZfc2hhZGVyX2JpbmFyeQotI2RlZmluZSBHTF9TSEFERVJfQklOQVJZX1ZJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEZDNAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogRW5kIG9mIGV4dGVuc2lvbiB0b2tlbnMsIHN0YXJ0IG9mIGNvcnJlc3BvbmRpbmcgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIE9FUyBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlICovCi0jaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlCi0jZGVmaW5lIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlICovCi0jaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUKLSNkZWZpbmUgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZSAxCi0jZW5kaWYKLQotLyogR0xfT0VTX2RlcHRoMjQgKi8KLSNpZm5kZWYgR0xfT0VTX2RlcHRoMjQKLSNkZWZpbmUgR0xfT0VTX2RlcHRoMjQgMQotI2VuZGlmCi0KLS8qIEdMX09FU19kZXB0aDMyICovCi0jaWZuZGVmIEdMX09FU19kZXB0aDMyCi0jZGVmaW5lIEdMX09FU19kZXB0aDMyIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfZGVwdGhfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9PRVNfZGVwdGhfdGV4dHVyZQotI2RlZmluZSBHTF9PRVNfZGVwdGhfdGV4dHVyZSAxCi0jZW5kaWYKLQotLyogR0xfT0VTX0VHTF9pbWFnZSAqLwotI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlCi0jZGVmaW5lIEdMX09FU19FR0xfaW1hZ2UgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRUdMSU1BR0VUQVJHRVRURVhUVVJFMkRPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVHTElNQUdFVEFSR0VUUkVOREVSQlVGRkVSU1RPUkFHRU9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKLSNlbmRpZgotCi0vKiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsICovCi0jaWZuZGVmIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwKLSNkZWZpbmUgR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCAxCi0vKiBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIGRlZmluZWQgaW4gR0xfT0VTX0VHTF9pbWFnZSBhbHJlYWR5LiAqLwotI2VuZGlmCi0KLS8qIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQgKi8KLSNpZm5kZWYgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludAotI2RlZmluZSBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfZmJvX3JlbmRlcl9taXBtYXAgKi8KLSNpZm5kZWYgR0xfT0VTX2Zib19yZW5kZXJfbWlwbWFwCi0jZGVmaW5lIEdMX09FU19mYm9fcmVuZGVyX21pcG1hcCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX2ZyYWdtZW50X3ByZWNpc2lvbl9oaWdoICovCi0jaWZuZGVmIEdMX09FU19mcmFnbWVudF9wcmVjaXNpb25faGlnaAotI2RlZmluZSBHTF9PRVNfZnJhZ21lbnRfcHJlY2lzaW9uX2hpZ2ggMQotI2VuZGlmCi0KLS8qIEdMX09FU19nZXRfcHJvZ3JhbV9iaW5hcnkgKi8KLSNpZm5kZWYgR0xfT0VTX2dldF9wcm9ncmFtX2JpbmFyeQotI2RlZmluZSBHTF9PRVNfZ2V0X3Byb2dyYW1fYmluYXJ5IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtQmluYXJ5T0VTIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCBHTHZvaWQgKmJpbmFyeSk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtQmluYXJ5T0VTIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIGJpbmFyeUZvcm1hdCwgY29uc3QgR0x2b2lkICpiaW5hcnksIEdMaW50IGxlbmd0aCk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUJJTkFSWU9FU1BST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCBHTHZvaWQgKmJpbmFyeSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1CSU5BUllPRVNQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBiaW5hcnlGb3JtYXQsIGNvbnN0IEdMdm9pZCAqYmluYXJ5LCBHTGludCBsZW5ndGgpOwotI2VuZGlmCi0KLS8qIEdMX09FU19tYXBidWZmZXIgKi8KLSNpZm5kZWYgR0xfT0VTX21hcGJ1ZmZlcgotI2RlZmluZSBHTF9PRVNfbWFwYnVmZmVyIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQqIEdMX0FQSUVOVFJZIGdsTWFwQnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKLUdMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsVW5tYXBCdWZmZXJPRVMgKEdMZW51bSB0YXJnZXQpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0QnVmZmVyUG9pbnRlcnZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiogcGFyYW1zKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkKiAoR0xfQVBJRU5UUllQIFBGTkdMTUFQQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTFVOTUFQQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQT0lOVEVSVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBhcmFtcyk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsICovCi0jaWZuZGVmIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbAotI2RlZmluZSBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwgMQotI2VuZGlmCi0KLS8qIEdMX09FU19yZ2I4X3JnYmE4ICovCi0jaWZuZGVmIEdMX09FU19yZ2I4X3JnYmE4Ci0jZGVmaW5lIEdMX09FU19yZ2I4X3JnYmE4IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgKi8KLSNpZm5kZWYgR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzCi0jZGVmaW5lIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3N0ZW5jaWwxICovCi0jaWZuZGVmIEdMX09FU19zdGVuY2lsMQotI2RlZmluZSBHTF9PRVNfc3RlbmNpbDEgMQotI2VuZGlmCi0KLS8qIEdMX09FU19zdGVuY2lsNCAqLwotI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDQKLSNkZWZpbmUgR0xfT0VTX3N0ZW5jaWw0IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfdGV4dHVyZV8zRCAqLwotI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV8zRAotI2RlZmluZSBHTF9PRVNfdGV4dHVyZV8zRCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4SW1hZ2UzRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN1YkltYWdlM0RPRVMgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTNET0VTIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlM0RPRVMgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVMgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUzRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYSU1BR0UzRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhTVUJJTUFHRTNET0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ09QWVRFWFNVQklNQUdFM0RPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFM0RPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTNET0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTNET0VTKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX3RleHR1cmVfZmxvYXQgKi8KLSNpZm5kZWYgR0xfT0VTX3RleHR1cmVfZmxvYXQKLSNkZWZpbmUgR0xfT0VTX3RleHR1cmVfZmxvYXQgMQotI2VuZGlmCi0KLS8qIEdMX09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciAqLwotI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIKLSNkZWZpbmUgR0xfT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfdGV4dHVyZV9oYWxmX2Zsb2F0ICovCi0jaWZuZGVmIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXQKLSNkZWZpbmUgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIgKi8KLSNpZm5kZWYgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIKLSNkZWZpbmUgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIgMQotI2VuZGlmCi0KLS8qIEdMX09FU190ZXh0dXJlX25wb3QgKi8KLSNpZm5kZWYgR0xfT0VTX3RleHR1cmVfbnBvdAotI2RlZmluZSBHTF9PRVNfdGV4dHVyZV9ucG90IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfdmVydGV4X2FycmF5X29iamVjdCAqLwotI2lmbmRlZiBHTF9PRVNfdmVydGV4X2FycmF5X29iamVjdAotI2RlZmluZSBHTF9PRVNfdmVydGV4X2FycmF5X29iamVjdCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFZlcnRleEFycmF5T0VTIChHTHVpbnQgYXJyYXkpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlVmVydGV4QXJyYXlzT0VTIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlblZlcnRleEFycmF5c09FUyAoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cyk7Ci1HTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzVmVydGV4QXJyYXlPRVMgKEdMdWludCBhcnJheSk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQklORFZFUlRFWEFSUkFZT0VTUFJPQykgKEdMdWludCBhcnJheSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFTEVURVZFUlRFWEFSUkFZU09FU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VOVkVSVEVYQVJSQVlTT0VTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTVkVSVEVYQVJSQVlPRVNQUk9DKSAoR0x1aW50IGFycmF5KTsKLSNlbmRpZgotCi0vKiBHTF9PRVNfdmVydGV4X2hhbGZfZmxvYXQgKi8KLSNpZm5kZWYgR0xfT0VTX3ZlcnRleF9oYWxmX2Zsb2F0Ci0jZGVmaW5lIEdMX09FU192ZXJ0ZXhfaGFsZl9mbG9hdCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3ZlcnRleF90eXBlXzEwXzEwXzEwXzIgKi8KLSNpZm5kZWYgR0xfT0VTX3ZlcnRleF90eXBlXzEwXzEwXzEwXzIKLSNkZWZpbmUgR0xfT0VTX3ZlcnRleF90eXBlXzEwXzEwXzEwXzIgMQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogQU1EIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUKLSNkZWZpbmUgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgMQotI2VuZGlmCi0KLS8qIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlCi0jZGVmaW5lIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlIDEKLSNlbmRpZgotCi0vKiBBTURfcGVyZm9ybWFuY2VfbW9uaXRvciAqLwotI2lmbmRlZiBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvcgotI2RlZmluZSBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvciAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQgKEdMaW50ICpudW1Hcm91cHMsIEdMc2l6ZWkgZ3JvdXBzU2l6ZSwgR0x1aW50ICpncm91cHMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRCAoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EIChHTHVpbnQgZ3JvdXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmdyb3VwU3RyaW5nKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRCAoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqY291bnRlclN0cmluZyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1EIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqZGF0YSk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5QZXJmTW9uaXRvcnNBTUQgKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVQZXJmTW9uaXRvcnNBTUQgKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EIChHTHVpbnQgbW9uaXRvciwgR0xib29sZWFuIGVuYWJsZSwgR0x1aW50IGdyb3VwLCBHTGludCBudW1Db3VudGVycywgR0x1aW50ICpjb3VudGVyc0xpc3QpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmVnaW5QZXJmTW9uaXRvckFNRCAoR0x1aW50IG1vbml0b3IpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRW5kUGVyZk1vbml0b3JBTUQgKEdMdWludCBtb25pdG9yKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQgKEdMdWludCBtb25pdG9yLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgZGF0YVNpemUsIEdMdWludCAqZGF0YSwgR0xpbnQgKmJ5dGVzV3JpdHRlbik7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUEVSRk1PTklUT1JHUk9VUFNBTURQUk9DKSAoR0xpbnQgKm51bUdyb3VwcywgR0xzaXplaSBncm91cHNTaXplLCBHTHVpbnQgKmdyb3Vwcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SQ09VTlRFUlNBTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SR1JPVVBTVFJJTkdBTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpncm91cFN0cmluZyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SQ09VTlRFUlNUUklOR0FNRFBST0MpIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpjb3VudGVyU3RyaW5nKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUEVSRk1PTklUT1JDT1VOVEVSSU5GT0FNRFBST0MpIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqZGF0YSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTlBFUkZNT05JVE9SU0FNRFBST0MpIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERUxFVEVQRVJGTU9OSVRPUlNBTURQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU0VMRUNUUEVSRk1PTklUT1JDT1VOVEVSU0FNRFBST0MpIChHTHVpbnQgbW9uaXRvciwgR0xib29sZWFuIGVuYWJsZSwgR0x1aW50IGdyb3VwLCBHTGludCBudW1Db3VudGVycywgR0x1aW50ICpjb3VudGVyc0xpc3QpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCRUdJTlBFUkZNT05JVE9SQU1EUFJPQykgKEdMdWludCBtb25pdG9yKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRU5EUEVSRk1PTklUT1JBTURQUk9DKSAoR0x1aW50IG1vbml0b3IpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRQRVJGTU9OSVRPUkNPVU5URVJEQVRBQU1EUFJPQykgKEdMdWludCBtb25pdG9yLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgZGF0YVNpemUsIEdMdWludCAqZGF0YSwgR0xpbnQgKmJ5dGVzV3JpdHRlbik7Ci0jZW5kaWYKLQotLyogR0xfQU1EX3Byb2dyYW1fYmluYXJ5X1o0MDAgKi8KLSNpZm5kZWYgR0xfQU1EX3Byb2dyYW1fYmluYXJ5X1o0MDAKLSNkZWZpbmUgR0xfQU1EX3Byb2dyYW1fYmluYXJ5X1o0MDAgMQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogQU5HTEUgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9BTkdMRV9mcmFtZWJ1ZmZlcl9ibGl0ICovCi0jaWZuZGVmIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX2JsaXQKLSNkZWZpbmUgR0xfQU5HTEVfZnJhbWVidWZmZXJfYmxpdCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmxpdEZyYW1lYnVmZmVyQU5HTEUgKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCTElURlJBTUVCVUZGRVJBTkdMRVBST0MpIChHTGludCBzcmNYMCwgR0xpbnQgc3JjWTAsIEdMaW50IHNyY1gxLCBHTGludCBzcmNZMSwgR0xpbnQgZHN0WDAsIEdMaW50IGRzdFkwLCBHTGludCBkc3RYMSwgR0xpbnQgZHN0WTEsIEdMYml0ZmllbGQgbWFzaywgR0xlbnVtIGZpbHRlcik7Ci0jZW5kaWYKLQotLyogR0xfQU5HTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgKi8KLSNpZm5kZWYgR0xfQU5HTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUKLSNkZWZpbmUgR0xfQU5HTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VNVUxUSVNBTVBMRUFOR0xFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBBUFBMRSBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0FQUExFX3JnYl80MjIgKi8KLSNpZm5kZWYgR0xfQVBQTEVfcmdiXzQyMgotI2RlZmluZSBHTF9BUFBMRV9yZ2JfNDIyIDEKLSNlbmRpZgotCi0vKiBHTF9BUFBMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZSAqLwotI2lmbmRlZiBHTF9BUFBMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZQotI2RlZmluZSBHTF9BUFBMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQVBQTEUgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFICh2b2lkKTsKLSNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VNVUxUSVNBTVBMRUFQUExFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFU09MVkVNVUxUSVNBTVBMRUZSQU1FQlVGRkVSQVBQTEVQUk9DKSAodm9pZCk7Ci0jZW5kaWYKLQotLyogR0xfQVBQTEVfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODggKi8KLSNpZm5kZWYgR0xfQVBQTEVfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODgKLSNkZWZpbmUgR0xfQVBQTEVfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODggMQotI2VuZGlmCi0KLS8qIEdMX0FQUExFX3RleHR1cmVfbWF4X2xldmVsICovCi0jaWZuZGVmIEdMX0FQUExFX3RleHR1cmVfbWF4X2xldmVsCi0jZGVmaW5lIEdMX0FQUExFX3RleHR1cmVfbWF4X2xldmVsIDEKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEFSTSBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0FSTV9tYWxpX3NoYWRlcl9iaW5hcnkgKi8KLSNpZm5kZWYgR0xfQVJNX21hbGlfc2hhZGVyX2JpbmFyeQotI2RlZmluZSBHTF9BUk1fbWFsaV9zaGFkZXJfYmluYXJ5IDEKLSNlbmRpZgotCi0vKiBHTF9BUk1fcmdiYTggKi8KLSNpZm5kZWYgR0xfQVJNX3JnYmE4Ci0jZGVmaW5lIEdMX0FSTV9yZ2JhOCAxCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBFWFQgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9FWFRfYmxlbmRfbWlubWF4ICovCi0jaWZuZGVmIEdMX0VYVF9ibGVuZF9taW5tYXgKLSNkZWZpbmUgR0xfRVhUX2JsZW5kX21pbm1heCAxCi0jZW5kaWYKLQotLyogR0xfRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0ICovCi0jaWZuZGVmIEdMX0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdAotI2RlZmluZSBHTF9FWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQgMQotI2VuZGlmCi0KLS8qIEdMX0VYVF9kZWJ1Z19sYWJlbCAqLwotI2lmbmRlZiBHTF9FWFRfZGVidWdfbGFiZWwKLSNkZWZpbmUgR0xfRVhUX2RlYnVnX2xhYmVsIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xMYWJlbE9iamVjdEVYVCAoR0xlbnVtIHR5cGUsIEdMdWludCBvYmplY3QsIEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKmxhYmVsKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldE9iamVjdExhYmVsRVhUIChHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqbGFiZWwpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTExBQkVMT0JKRUNURVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICpsYWJlbCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVE9CSkVDVExBQkVMRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpsYWJlbCk7Ci0jZW5kaWYKLQotLyogR0xfRVhUX2RlYnVnX21hcmtlciAqLwotI2lmbmRlZiBHTF9FWFRfZGVidWdfbWFya2VyCi0jZGVmaW5lIEdMX0VYVF9kZWJ1Z19tYXJrZXIgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEluc2VydEV2ZW50TWFya2VyRVhUIChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHVzaEdyb3VwTWFya2VyRVhUIChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUG9wR3JvdXBNYXJrZXJFWFQgKHZvaWQpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTElOU0VSVEVWRU5UTUFSS0VSRVhUUFJPQykgKEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKm1hcmtlcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBVU0hHUk9VUE1BUktFUkVYVFBST0MpIChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQT1BHUk9VUE1BUktFUkVYVFBST0MpICh2b2lkKTsKLSNlbmRpZgotCi0vKiBHTF9FWFRfZGlzY2FyZF9mcmFtZWJ1ZmZlciAqLwotI2lmbmRlZiBHTF9FWFRfZGlzY2FyZF9mcmFtZWJ1ZmZlcgotI2RlZmluZSBHTF9FWFRfZGlzY2FyZF9mcmFtZWJ1ZmZlciAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzY2FyZEZyYW1lYnVmZmVyRVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xESVNDQVJERlJBTUVCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywgY29uc3QgR0xlbnVtICphdHRhY2htZW50cyk7Ci0jZW5kaWYKLQotLyogR0xfRVhUX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9FWFRfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlCi0jZGVmaW5lIEdMX0VYVF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcyk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRU1VTFRJU0FNUExFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTJETVVMVElTQU1QTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKTsKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cwotI2RlZmluZSBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRpRHJhd0FycmF5c0VYVCAoR0xlbnVtIG1vZGUsIEdMaW50ICpmaXJzdCwgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRpRHJhd0VsZW1lbnRzRVhUIChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNVUxUSURSQVdBUlJBWVNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50ICpmaXJzdCwgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXRUxFTUVOVFNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOwotI2VuZGlmCi0KLS8qIEdMX0VYVF9vY2NsdXNpb25fcXVlcnlfYm9vbGVhbiAqLwotI2lmbmRlZiBHTF9FWFRfb2NjbHVzaW9uX3F1ZXJ5X2Jvb2xlYW4KLSNkZWZpbmUgR0xfRVhUX29jY2x1c2lvbl9xdWVyeV9ib29sZWFuIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5RdWVyaWVzRVhUIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVF1ZXJpZXNFWFQgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpOwotR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1F1ZXJ5RVhUIChHTHVpbnQgaWQpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmVnaW5RdWVyeUVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVuZFF1ZXJ5RVhUIChHTGVudW0gdGFyZ2V0KTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFF1ZXJ5aXZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdHVpdkVYVCAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5RVUVSSUVTRVhUUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERUxFVEVRVUVSSUVTRVhUUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTUVVFUllFWFRQUk9DKSAoR0x1aW50IGlkKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkVHSU5RVUVSWUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFTkRRVUVSWUVYVFBST0MpIChHTGVudW0gdGFyZ2V0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUVVFUllJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVFVJVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOwotI2VuZGlmCi0KLS8qIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhICovCi0jaWZuZGVmIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhCi0jZGVmaW5lIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhIDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfcm9idXN0bmVzcyAqLwotI2lmbmRlZiBHTF9FWFRfcm9idXN0bmVzcwotI2RlZmluZSBHTF9FWFRfcm9idXN0bmVzcyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCBHTGVudW0gR0xfQVBJRU5UUlkgZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhUICh2b2lkKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlYWRuUGl4ZWxzRVhUIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgdm9pZCAqZGF0YSk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRuVW5pZm9ybWZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRuVW5pZm9ybWl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcyk7Ci0jZW5kaWYKLXR5cGVkZWYgR0xlbnVtIChHTF9BUElFTlRSWVAgUEZOR0xHRVRHUkFQSElDU1JFU0VUU1RBVFVTRVhUUFJPQykgKHZvaWQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRUFETlBJWEVMU0VYVFBST0MpIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgdm9pZCAqZGF0YSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVE5VTklGT1JNRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVROVU5JRk9STUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKTsKLSNlbmRpZgotCi0vKiBHTF9FWFRfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMgKi8KLSNpZm5kZWYgR0xfRVhUX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzCi0jZGVmaW5lIEdMX0VYVF9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVXNlUHJvZ3JhbVN0YWdlc0VYVCAoR0x1aW50IHBpcGVsaW5lLCBHTGJpdGZpZWxkIHN0YWdlcywgR0x1aW50IHByb2dyYW0pOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQWN0aXZlU2hhZGVyUHJvZ3JhbUVYVCAoR0x1aW50IHBpcGVsaW5lLCBHTHVpbnQgcHJvZ3JhbSk7Ci1HTF9BUElDQUxMIEdMdWludCBHTF9BUElFTlRSWSBnbENyZWF0ZVNoYWRlclByb2dyYW12RVhUIChHTGVudW0gdHlwZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyICoqc3RyaW5ncyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kUHJvZ3JhbVBpcGVsaW5lRVhUIChHTHVpbnQgcGlwZWxpbmUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlUHJvZ3JhbVBpcGVsaW5lc0VYVCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnBpcGVsaW5lcyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5Qcm9ncmFtUGlwZWxpbmVzRVhUIChHTHNpemVpIG4sIEdMdWludCAqcGlwZWxpbmVzKTsKLUdMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNQcm9ncmFtUGlwZWxpbmVFWFQgKEdMdWludCBwaXBlbGluZSk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UHJvZ3JhbVBpcGVsaW5laXZFWFQgKEdMdWludCBwaXBlbGluZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zaUVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFmRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJmRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2ZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRmRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yaXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2l2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00ZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmVFWFQgKEdMdWludCBwaXBlbGluZSk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nRVhUIChHTHVpbnQgcGlwZWxpbmUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9Mb2cpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFVTRVBST0dSQU1TVEFHRVNFWFRQUk9DKSAoR0x1aW50IHBpcGVsaW5lLCBHTGJpdGZpZWxkIHN0YWdlcywgR0x1aW50IHByb2dyYW0pOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xBQ1RJVkVTSEFERVJQUk9HUkFNRVhUUFJPQykgKEdMdWludCBwaXBlbGluZSwgR0x1aW50IHByb2dyYW0pOwotdHlwZWRlZiBHTHVpbnQgKEdMX0FQSUVOVFJZUCBQRk5HTENSRUFURVNIQURFUlBST0dSQU1WRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIgKipzdHJpbmdzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQklORFBST0dSQU1QSVBFTElORUVYVFBST0MpIChHTHVpbnQgcGlwZWxpbmUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERUxFVEVQUk9HUkFNUElQRUxJTkVTRVhUUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwaXBlbGluZXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5QUk9HUkFNUElQRUxJTkVTRVhUUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpwaXBlbGluZXMpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTUFJPR1JBTVBJUEVMSU5FRVhUUFJPQykgKEdMdWludCBwaXBlbGluZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVJJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50IHZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVBJUEVMSU5FSVZFWFRQUk9DKSAoR0x1aW50IHBpcGVsaW5lLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMklFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMUZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJGRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNGRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNEZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMklWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMUZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNEZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgzRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYNEZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xWQUxJREFURVBST0dSQU1QSVBFTElORUVYVFBST0MpIChHTHVpbnQgcGlwZWxpbmUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNUElQRUxJTkVJTkZPTE9HRVhUUFJPQykgKEdMdWludCBwaXBlbGluZSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7Ci0jZW5kaWYKLQotLyogR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCAqLwotI2lmbmRlZiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kCi0jZGVmaW5lIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgMQotI2VuZGlmCi0KLS8qIEdMX0VYVF9zaGFkb3dfc2FtcGxlcnMgKi8KLSNpZm5kZWYgR0xfRVhUX3NoYWRvd19zYW1wbGVycwotI2RlZmluZSBHTF9FWFRfc2hhZG93X3NhbXBsZXJzIDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfc1JHQiAqLwotI2lmbmRlZiBHTF9FWFRfc1JHQgotI2RlZmluZSBHTF9FWFRfc1JHQiAxCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fZHh0MSAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQxCi0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2R4dDEgMQotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMKLSNkZWZpbmUgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODggKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4Ci0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAxCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfcmcgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfcmcKLSNkZWZpbmUgR0xfRVhUX3RleHR1cmVfcmcgMQotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX3N0b3JhZ2UgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc3RvcmFnZQotI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9zdG9yYWdlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhTdG9yYWdlMURFWFQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4U3RvcmFnZTJERVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhTdG9yYWdlM0RFWFQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleHR1cmVTdG9yYWdlMURFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleHR1cmVTdG9yYWdlMkRFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXh0dXJlU3RvcmFnZTNERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFNUT1JBR0UxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYU1RPUkFHRTJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYU1RPUkFHRTNERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNUT1JBR0UxREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFRVUkVTVE9SQUdFMkRFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNUT1JBR0UzREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOwotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX3R5cGVfMl8xMF8xMF8xMF9SRVYgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfdHlwZV8yXzEwXzEwXzEwX1JFVgotI2RlZmluZSBHTF9FWFRfdGV4dHVyZV90eXBlXzJfMTBfMTBfMTBfUkVWIDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdW5wYWNrX3N1YmltYWdlICovCi0jaWZuZGVmIEdMX0VYVF91bnBhY2tfc3ViaW1hZ2UKLSNkZWZpbmUgR0xfRVhUX3VucGFja19zdWJpbWFnZSAxCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBETVAgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9ETVBfc2hhZGVyX2JpbmFyeSAqLwotI2lmbmRlZiBHTF9ETVBfc2hhZGVyX2JpbmFyeQotI2RlZmluZSBHTF9ETVBfc2hhZGVyX2JpbmFyeSAxCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBJTUcgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9JTUdfcHJvZ3JhbV9iaW5hcnkgKi8KLSNpZm5kZWYgR0xfSU1HX3Byb2dyYW1fYmluYXJ5Ci0jZGVmaW5lIEdMX0lNR19wcm9ncmFtX2JpbmFyeSAxCi0jZW5kaWYKLQotLyogR0xfSU1HX3JlYWRfZm9ybWF0ICovCi0jaWZuZGVmIEdMX0lNR19yZWFkX2Zvcm1hdAotI2RlZmluZSBHTF9JTUdfcmVhZF9mb3JtYXQgMQotI2VuZGlmCi0KLS8qIEdMX0lNR19zaGFkZXJfYmluYXJ5ICovCi0jaWZuZGVmIEdMX0lNR19zaGFkZXJfYmluYXJ5Ci0jZGVmaW5lIEdMX0lNR19zaGFkZXJfYmluYXJ5IDEKLSNlbmRpZgotCi0vKiBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YyAqLwotI2lmbmRlZiBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YwotI2RlZmluZSBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YyAxCi0jZW5kaWYKLQotLyogR0xfSU1HX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9JTUdfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlCi0jZGVmaW5lIEdMX0lNR19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUlNRyAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcyk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRU1VTFRJU0FNUExFSU1HKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFMkRNVUxUSVNBTVBMRUlNRykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcyk7Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBOViBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX05WX2NvdmVyYWdlX3NhbXBsZSAqLwotI2lmbmRlZiBHTF9OVl9jb3ZlcmFnZV9zYW1wbGUKLSNkZWZpbmUgR0xfTlZfY292ZXJhZ2Vfc2FtcGxlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3ZlcmFnZU1hc2tOViAoR0xib29sZWFuIG1hc2spOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ292ZXJhZ2VPcGVyYXRpb25OViAoR0xlbnVtIG9wZXJhdGlvbik7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ09WRVJBR0VNQVNLTlZQUk9DKSAoR0xib29sZWFuIG1hc2spOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDT1ZFUkFHRU9QRVJBVElPTk5WUFJPQykgKEdMZW51bSBvcGVyYXRpb24pOwotI2VuZGlmCi0KLS8qIEdMX05WX2RlcHRoX25vbmxpbmVhciAqLwotI2lmbmRlZiBHTF9OVl9kZXB0aF9ub25saW5lYXIKLSNkZWZpbmUgR0xfTlZfZGVwdGhfbm9ubGluZWFyIDEKLSNlbmRpZgotCi0vKiBHTF9OVl9kcmF3X2J1ZmZlcnMgKi8KLSNpZm5kZWYgR0xfTlZfZHJhd19idWZmZXJzCi0jZGVmaW5lIEdMX05WX2RyYXdfYnVmZmVycyAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0J1ZmZlcnNOViAoR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZnMpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdCVUZGRVJTTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZnMpOwotI2VuZGlmCi0KLS8qIEdMX05WX2Zib19jb2xvcl9hdHRhY2htZW50cyAqLwotI2lmbmRlZiBHTF9OVl9mYm9fY29sb3JfYXR0YWNobWVudHMKLSNkZWZpbmUgR0xfTlZfZmJvX2NvbG9yX2F0dGFjaG1lbnRzIDEKLSNlbmRpZgotCi0vKiBHTF9OVl9mZW5jZSAqLwotI2lmbmRlZiBHTF9OVl9mZW5jZQotI2RlZmluZSBHTF9OVl9mZW5jZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlRmVuY2VzTlYgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuRmVuY2VzTlYgKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpOwotR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc0ZlbmNlTlYgKEdMdWludCBmZW5jZSk7Ci1HTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbFRlc3RGZW5jZU5WIChHTHVpbnQgZmVuY2UpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RmVuY2Vpdk5WIChHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGaW5pc2hGZW5jZU5WIChHTHVpbnQgZmVuY2UpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2V0RmVuY2VOViAoR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERUxFVEVGRU5DRVNOVlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VORkVOQ0VTTlZQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcyk7Ci10eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMSVNGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Ci10eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMVEVTVEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VURkVOQ0VJVk5WUFJPQykgKEdMdWludCBmZW5jZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRklOSVNIRkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xTRVRGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbik7Ci0jZW5kaWYKLQotLyogR0xfTlZfcmVhZF9idWZmZXIgKi8KLSNpZm5kZWYgR0xfTlZfcmVhZF9idWZmZXIKLSNkZWZpbmUgR0xfTlZfcmVhZF9idWZmZXIgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlYWRCdWZmZXJOViAoR0xlbnVtIG1vZGUpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFQURCVUZGRVJOVlBST0MpIChHTGVudW0gbW9kZSk7Ci0jZW5kaWYKLQotLyogR0xfTlZfcmVhZF9idWZmZXJfZnJvbnQgKi8KLSNpZm5kZWYgR0xfTlZfcmVhZF9idWZmZXJfZnJvbnQKLSNkZWZpbmUgR0xfTlZfcmVhZF9idWZmZXJfZnJvbnQgMQotI2VuZGlmCi0KLS8qIEdMX05WX3JlYWRfZGVwdGggKi8KLSNpZm5kZWYgR0xfTlZfcmVhZF9kZXB0aAotI2RlZmluZSBHTF9OVl9yZWFkX2RlcHRoIDEKLSNlbmRpZgotCi0vKiBHTF9OVl9yZWFkX2RlcHRoX3N0ZW5jaWwgKi8KLSNpZm5kZWYgR0xfTlZfcmVhZF9kZXB0aF9zdGVuY2lsCi0jZGVmaW5lIEdMX05WX3JlYWRfZGVwdGhfc3RlbmNpbCAxCi0jZW5kaWYKLQotLyogR0xfTlZfcmVhZF9zdGVuY2lsICovCi0jaWZuZGVmIEdMX05WX3JlYWRfc3RlbmNpbAotI2RlZmluZSBHTF9OVl9yZWFkX3N0ZW5jaWwgMQotI2VuZGlmCi0KLS8qIEdMX05WX3RleHR1cmVfY29tcHJlc3Npb25fczN0Y191cGRhdGUgKi8KLSNpZm5kZWYgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjX3VwZGF0ZQotI2RlZmluZSBHTF9OVl90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGNfdXBkYXRlIDEKLSNlbmRpZgotCi0vKiBHTF9OVl90ZXh0dXJlX25wb3RfMkRfbWlwbWFwICovCi0jaWZuZGVmIEdMX05WX3RleHR1cmVfbnBvdF8yRF9taXBtYXAKLSNkZWZpbmUgR0xfTlZfdGV4dHVyZV9ucG90XzJEX21pcG1hcCAxCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBRQ09NIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfUUNPTV9hbHBoYV90ZXN0ICovCi0jaWZuZGVmIEdMX1FDT01fYWxwaGFfdGVzdAotI2RlZmluZSBHTF9RQ09NX2FscGhhX3Rlc3QgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEFscGhhRnVuY1FDT00gKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEFMUEhBRlVOQ1FDT01QUk9DKSAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7Ci0jZW5kaWYKLQotLyogR0xfUUNPTV9kcml2ZXJfY29udHJvbCAqLwotI2lmbmRlZiBHTF9RQ09NX2RyaXZlcl9jb250cm9sCi0jZGVmaW5lIEdMX1FDT01fZHJpdmVyX2NvbnRyb2wgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldERyaXZlckNvbnRyb2xzUUNPTSAoR0xpbnQgKm51bSwgR0xzaXplaSBzaXplLCBHTHVpbnQgKmRyaXZlckNvbnRyb2xzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldERyaXZlckNvbnRyb2xTdHJpbmdRQ09NIChHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTSAoR0x1aW50IGRyaXZlckNvbnRyb2wpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NIChHTHVpbnQgZHJpdmVyQ29udHJvbCk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VURFJJVkVSQ09OVFJPTFNRQ09NUFJPQykgKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVERSSVZFUkNPTlRST0xTVFJJTkdRQ09NUFJPQykgKEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRU5BQkxFRFJJVkVSQ09OVFJPTFFDT01QUk9DKSAoR0x1aW50IGRyaXZlckNvbnRyb2wpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xESVNBQkxFRFJJVkVSQ09OVFJPTFFDT01QUk9DKSAoR0x1aW50IGRyaXZlckNvbnRyb2wpOwotI2VuZGlmCi0KLS8qIEdMX1FDT01fZXh0ZW5kZWRfZ2V0ICovCi0jaWZuZGVmIEdMX1FDT01fZXh0ZW5kZWRfZ2V0Ci0jZGVmaW5lIEdMX1FDT01fZXh0ZW5kZWRfZ2V0IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRUZXh0dXJlc1FDT00gKEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0QnVmZmVyc1FDT00gKEdMdWludCAqYnVmZmVycywgR0xpbnQgbWF4QnVmZmVycywgR0xpbnQgKm51bUJ1ZmZlcnMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00gKEdMdWludCAqcmVuZGVyYnVmZmVycywgR0xpbnQgbWF4UmVuZGVyYnVmZmVycywgR0xpbnQgKm51bVJlbmRlcmJ1ZmZlcnMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0RnJhbWVidWZmZXJzUUNPTSAoR0x1aW50ICpmcmFtZWJ1ZmZlcnMsIEdMaW50IG1heEZyYW1lYnVmZmVycywgR0xpbnQgKm51bUZyYW1lYnVmZmVycyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSBmYWNlLCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00gKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGV4ZWxzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTSAoR0xlbnVtIHRhcmdldCwgR0x2b2lkICoqcGFyYW1zKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRURVhUVVJFU1FDT01QUk9DKSAoR0x1aW50ICp0ZXh0dXJlcywgR0xpbnQgbWF4VGV4dHVyZXMsIEdMaW50ICpudW1UZXh0dXJlcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVEJVRkZFUlNRQ09NUFJPQykgKEdMdWludCAqYnVmZmVycywgR0xpbnQgbWF4QnVmZmVycywgR0xpbnQgKm51bUJ1ZmZlcnMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRSRU5ERVJCVUZGRVJTUUNPTVBST0MpIChHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VURlJBTUVCVUZGRVJTUUNPTVBST0MpIChHTHVpbnQgKmZyYW1lYnVmZmVycywgR0xpbnQgbWF4RnJhbWVidWZmZXJzLCBHTGludCAqbnVtRnJhbWVidWZmZXJzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUVEVYTEVWRUxQQVJBTUVURVJJVlFDT01QUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSBmYWNlLCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUVEVYT0JKRUNUU1RBVEVPVkVSUklERUlRQ09NUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRURVhTVUJJTUFHRVFDT01QUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0ZXhlbHMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRCVUZGRVJQT0lOVEVSVlFDT01QUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x2b2lkICoqcGFyYW1zKTsKLSNlbmRpZgotCi0vKiBHTF9RQ09NX2V4dGVuZGVkX2dldDIgKi8KLSNpZm5kZWYgR0xfUUNPTV9leHRlbmRlZF9nZXQyCi0jZGVmaW5lIEdMX1FDT01fZXh0ZW5kZWRfZ2V0MiAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0U2hhZGVyc1FDT00gKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0UHJvZ3JhbXNRQ09NIChHTHVpbnQgKnByb2dyYW1zLCBHTGludCBtYXhQcm9ncmFtcywgR0xpbnQgKm51bVByb2dyYW1zKTsKLUdMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSAoR0x1aW50IHByb2dyYW0pOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00gKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFNIQURFUlNRQ09NUFJPQykgKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRQUk9HUkFNU1FDT01QUk9DKSAoR0x1aW50ICpwcm9ncmFtcywgR0xpbnQgbWF4UHJvZ3JhbXMsIEdMaW50ICpudW1Qcm9ncmFtcyk7Ci10eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMRVhUSVNQUk9HUkFNQklOQVJZUUNPTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFBST0dSQU1CSU5BUllTT1VSQ0VRQ09NUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpOwotI2VuZGlmCi0KLS8qIEdMX1FDT01fcGVyZm1vbl9nbG9iYWxfbW9kZSAqLwotI2lmbmRlZiBHTF9RQ09NX3BlcmZtb25fZ2xvYmFsX21vZGUKLSNkZWZpbmUgR0xfUUNPTV9wZXJmbW9uX2dsb2JhbF9tb2RlIDEKLSNlbmRpZgotCi0vKiBHTF9RQ09NX3dyaXRlb25seV9yZW5kZXJpbmcgKi8KLSNpZm5kZWYgR0xfUUNPTV93cml0ZW9ubHlfcmVuZGVyaW5nCi0jZGVmaW5lIEdMX1FDT01fd3JpdGVvbmx5X3JlbmRlcmluZyAxCi0jZW5kaWYKLQotLyogR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcgKi8KLSNpZm5kZWYgR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcKLSNkZWZpbmUgR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFN0YXJ0VGlsaW5nUUNPTSAoR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQsIEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVuZFRpbGluZ1FDT00gKEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xTVEFSVFRJTElOR1FDT01QUk9DKSAoR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQsIEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRU5EVElMSU5HUUNPTVBST0MpIChHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBWSVYgZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9WSVZfc2hhZGVyX2JpbmFyeSAqLwotI2lmbmRlZiBHTF9WSVZfc2hhZGVyX2JpbmFyeQotI2RlZmluZSBHTF9WSVZfc2hhZGVyX2JpbmFyeSAxCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fZ2wyZXh0X2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvaW5jbHVkZS9HTEVTMi9nbDJwbGF0Zm9ybS5oIGIvb3BlbmdsL2luY2x1ZGUvR0xFUzIvZ2wycGxhdGZvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmYTNjNC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvaW5jbHVkZS9HTEVTMi9nbDJwbGF0Zm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI2lmbmRlZiBfX2dsMnBsYXRmb3JtX2hfCi0jZGVmaW5lIF9fZ2wycGxhdGZvcm1faF8KLQotLyogJFJldmlzaW9uOiAxMDYwMiAkIG9uICREYXRlOjogMjAxMC0wMy0wNCAyMjozNTozNCAtMDgwMCAjJCAqLwotCi0vKgotICogVGhpcyBkb2N1bWVudCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgU0dJIEZyZWUgU29mdHdhcmUgQiBMaWNlbnNlIFZlcnNpb24KLSAqIDIuMC4gRm9yIGRldGFpbHMsIHNlZSBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIvIC4KLSAqLwotCi0vKiBQbGF0Zm9ybS1zcGVjaWZpYyB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIE9wZW5HTCBFUyAyLlggIGdsMi5oCi0gKgotICogQWRvcHRlcnMgbWF5IG1vZGlmeSBraHJwbGF0Zm9ybS5oIGFuZCB0aGlzIGZpbGUgdG8gc3VpdCB0aGVpciBwbGF0Zm9ybS4KLSAqIFlvdSBhcmUgZW5jb3VyYWdlZCB0byBzdWJtaXQgYWxsIG1vZGlmaWNhdGlvbnMgdG8gdGhlIEtocm9ub3MgZ3JvdXAgc28gdGhhdAotICogdGhleSBjYW4gYmUgaW5jbHVkZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgZmlsZS4gIFBsZWFzZSBzdWJtaXQgY2hhbmdlcwotICogYnkgc2VuZGluZyB0aGVtIHRvIHRoZSBwdWJsaWMgS2hyb25vcyBCdWd6aWxsYSAoaHR0cDovL2tocm9ub3Mub3JnL2J1Z3ppbGxhKQotICogYnkgZmlsaW5nIGEgYnVnIGFnYWluc3QgcHJvZHVjdCAiT3BlbkdMLUVTIiBjb21wb25lbnQgIlJlZ2lzdHJ5Ii4KLSAqLwotCi0jaW5jbHVkZSA8S0hSL2tocnBsYXRmb3JtLmg+Ci0KLSNpZm5kZWYgR0xfQVBJQ0FMTAotI2RlZmluZSBHTF9BUElDQUxMICBLSFJPTk9TX0FQSUNBTEwKLSNlbmRpZgotCi0jaWZuZGVmIEdMX0FQSUVOVFJZCi0jZGVmaW5lIEdMX0FQSUVOVFJZIEtIUk9OT1NfQVBJRU5UUlkKLSNlbmRpZgotCi0jZW5kaWYgLyogX19nbDJwbGF0Zm9ybV9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvS0hSL2tocnBsYXRmb3JtLmggYi9vcGVuZ2wvaW5jbHVkZS9LSFIva2hycGxhdGZvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2MGJkNy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvaW5jbHVkZS9LSFIva2hycGxhdGZvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0jaWZuZGVmIF9fa2hycGxhdGZvcm1faF8KLSNkZWZpbmUgX19raHJwbGF0Zm9ybV9oXwotCi0vKgotKiogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgotKioKLSoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0qKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0qKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KLSoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0qKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0qKgotKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KLSoqCi0qKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0qKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0qKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0qKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgotKi8KLQotLyogUGxhdGZvcm0tc3BlY2lmaWMgdHlwZXMgYW5kIGRlZmluaXRpb25zLgotICogJFJldmlzaW9uOiA3MjQ0ICQgb24gJERhdGU6IDIwMDktMDEtMjAgMTc6MDY6NTkgLTA4MDAgKFR1ZSwgMjAgSmFuIDIwMDkpICQKLSAqIAotICogQWRvcHRlcnMgbWF5IG1vZGlmeSB0aGlzIGZpbGUgdG8gc3VpdCB0aGVpciBwbGF0Zm9ybS4gQWRvcHRlcnMgYXJlCi0gKiBlbmNvdXJhZ2VkIHRvIHN1Ym1pdCBwbGF0Zm9ybSBzcGVjaWZpYyBtb2RpZmljYXRpb25zIHRvIHRoZSBLaHJvbm9zCi0gKiBncm91cCBzbyB0aGF0IHRoZXkgY2FuIGJlIGluY2x1ZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUuCi0gKiBQbGVhc2Ugc3VibWl0IGNoYW5nZXMgYnkgc2VuZGluZyB0aGVtIHRvIHRoZSBwdWJsaWMgS2hyb25vcyBCdWd6aWxsYQotICogKGh0dHA6Ly9raHJvbm9zLm9yZy9idWd6aWxsYSkgYnkgZmlsaW5nIGEgYnVnIGFnYWluc3QgcHJvZHVjdAotICogIktocm9ub3MgKGdlbmVyYWwpIiBjb21wb25lbnQgIlJlZ2lzdHJ5Ii4KLSAqCi0gKiBBIHByZWRlZmluZWQgdGVtcGxhdGUgd2hpY2ggZmlsbHMgaW4gc29tZSBvZiB0aGUgYnVnIGZpZWxkcyBjYW4gYmUKLSAqIHJlYWNoZWQgdXNpbmcgaHR0cDovL3Rpbnl1cmwuY29tL2tocnBsYXRmb3JtLWgtYnVncmVwb3J0LCBidXQgeW91Ci0gKiBtdXN0IGNyZWF0ZSBhIEJ1Z3ppbGxhIGxvZ2luIGZpcnN0LgotICogCi0gKgotICogU2VlIHRoZSBJbXBsZW1lbnRlcidzIEd1aWRlbGluZXMgZm9yIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoaXMgZmlsZQotICogc2hvdWxkIGJlIGxvY2F0ZWQgb24geW91ciBzeXN0ZW0uCi0gKiAgICBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2ltcGxlbWVudGVyc19ndWlkZS5wZGYKLSAqCi0gKiAKLSAqIFRoaXMgZmlsZSBzaG91bGQgYmUgaW5jbHVkZWQgYXMKLSAqICAgICAgICAjaW5jbHVkZSA8S0hSL2tocnBsYXRmb3JtLmg+Ci0gKiBieSB0aGUgS2hyb25vcyBBUEkgaGVhZGVyIGZpbGUgdGhhdCB1c2VzIGl0cyB0eXBlcyBhbmQgZGVmaW5lcy4KLSAqCi0gKiBUaGUgdHlwZXMgaW4gdGhpcyBmaWxlIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gZGVmaW5lIEFQSS1zcGVjaWZpYyB0eXBlcy4KLSAqIFR5cGVzIGRlZmluZWQgaW4gdGhpcyBmaWxlOgotICogICAga2hyb25vc19pbnQ4X3QgICAgICAgICAgICAgIHNpZ25lZCAgIDggIGJpdAotICogICAga2hyb25vc191aW50OF90ICAgICAgICAgICAgIHVuc2lnbmVkIDggIGJpdAotICogICAga2hyb25vc19pbnQxNl90ICAgICAgICAgICAgIHNpZ25lZCAgIDE2IGJpdAotICogICAga2hyb25vc191aW50MTZfdCAgICAgICAgICAgIHVuc2lnbmVkIDE2IGJpdAotICogICAga2hyb25vc19pbnQzMl90ICAgICAgICAgICAgIHNpZ25lZCAgIDMyIGJpdAotICogICAga2hyb25vc191aW50MzJfdCAgICAgICAgICAgIHVuc2lnbmVkIDMyIGJpdAotICogICAga2hyb25vc19pbnQ2NF90ICAgICAgICAgICAgIHNpZ25lZCAgIDY0IGJpdAotICogICAga2hyb25vc191aW50NjRfdCAgICAgICAgICAgIHVuc2lnbmVkIDY0IGJpdAotICogICAga2hyb25vc19pbnRwdHJfdCAgICAgICAgICAgIHNpZ25lZCAgIHNhbWUgbnVtYmVyIG9mIGJpdHMgYXMgYSBwb2ludGVyCi0gKiAgICBraHJvbm9zX3VpbnRwdHJfdCAgICAgICAgICAgdW5zaWduZWQgc2FtZSBudW1iZXIgb2YgYml0cyBhcyBhIHBvaW50ZXIKLSAqICAgIGtocm9ub3Nfc3NpemVfdCAgICAgICAgICAgICBzaWduZWQgICBzaXplCi0gKiAgICBraHJvbm9zX3VzaXplX3QgICAgICAgICAgICAgdW5zaWduZWQgc2l6ZQotICogICAga2hyb25vc19mbG9hdF90ICAgICAgICAgICAgIHNpZ25lZCAgIDMyIGJpdCBmbG9hdGluZyBwb2ludAotICogICAga2hyb25vc190aW1lX25zX3QgICAgICAgICAgIHVuc2lnbmVkIDY0IGJpdCB0aW1lIGluIG5hbm9zZWNvbmRzCi0gKiAgICBraHJvbm9zX3V0aW1lX25hbm9zZWNvbmRzX3QgdW5zaWduZWQgdGltZSBpbnRlcnZhbCBvciBhYnNvbHV0ZSB0aW1lIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFub3NlY29uZHMKLSAqICAgIGtocm9ub3Nfc3RpbWVfbmFub3NlY29uZHNfdCBzaWduZWQgdGltZSBpbnRlcnZhbCBpbiBuYW5vc2Vjb25kcwotICoKLSAqIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCBpcyAxIGlmIDY0IGJpdCBpbnRlZ2VycyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgMC4KLSAqIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCBpcyAxIGlmIGZsb2F0cyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgMC4KLSAqIAotICoKLSAqIE1hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZToKLSAqICAgIEtIUk9OT1NfQVBJQ0FMTAotICogICAgS0hST05PU19BUElFTlRSWQotICogICAgS0hST05PU19BUElBVFRSSUJVVEVTCi0gKiBUaGVzZSBtYXkgYmUgdXNlZCBpbiBmdW5jdGlvbiBwcm90b3R5cGVzIGFzOgotICogICAgICBLSFJPTk9TX0FQSUNBTEwgdm9pZCBLSFJPTk9TX0FQSUVOVFJZIGZ1bmNuYW1lKAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZzEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnMikgS0hST05PU19BUElBVFRSSUJVVEVTOwotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRGVmaW5pdGlvbiBvZiBLSFJPTk9TX0FQSUNBTEwKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVGhpcyBwcmVjZWRlcyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUuCi0gKi8KLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19TQ0lURUNIX1NOQVBfXykKLSMgICBkZWZpbmUgS0hST05PU19BUElDQUxMIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotI2VsaWYgZGVmaW5lZCAoX19TWU1CSUFOMzJfXykKLSMgICBkZWZpbmUgS0hST05PU19BUElDQUxMIElNUE9SVF9DCi0jZWxpZiBkZWZpbmVkKEFORFJPSUQpCi0jICAgZGVmaW5lIEtIUk9OT1NfQVBJQ0FMTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQotI2Vsc2UKLSMgICBkZWZpbmUgS0hST05PU19BUElDQUxMCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBEZWZpbml0aW9uIG9mIEtIUk9OT1NfQVBJRU5UUlkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVGhpcyBmb2xsb3dzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gIGFuZCBwcmVjZWRlcyB0aGUgZnVuY3Rpb24KLSAqIG5hbWUgaW4gdGhlIGZ1bmN0aW9uIHByb3RvdHlwZS4KLSAqLwotI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAhZGVmaW5lZChfX1NDSVRFQ0hfU05BUF9fKQotICAgIC8qIFdpbjMyIGJ1dCBub3QgV2luQ0UgKi8KLSMgICBkZWZpbmUgS0hST05PU19BUElFTlRSWSBfX3N0ZGNhbGwKLSNlbHNlCi0jICAgZGVmaW5lIEtIUk9OT1NfQVBJRU5UUlkKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERlZmluaXRpb24gb2YgS0hST05PU19BUElBVFRSSUJVVEVTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFRoaXMgZm9sbG93cyB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcyBvZiB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIGFyZ3VtZW50cy4KLSAqLwotI2lmIGRlZmluZWQgKF9fQVJNQ0NfMl9fKQotI2RlZmluZSBLSFJPTk9TX0FQSUFUVFJJQlVURVMgX19zb2Z0ZnAKLSNlbHNlCi0jZGVmaW5lIEtIUk9OT1NfQVBJQVRUUklCVVRFUwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogYmFzaWMgdHlwZSBkZWZpbml0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgKGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMKSB8fCBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fU0NPX18pIHx8IGRlZmluZWQoX19VU0xDX18pCi0KLQotLyoKLSAqIFVzaW5nIDxzdGRpbnQuaD4KLSAqLwotI2luY2x1ZGUgPHN0ZGludC5oPgotdHlwZWRlZiBpbnQzMl90ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDMyX3Q7Ci10eXBlZGVmIHVpbnQzMl90ICAgICAgICAgICAgICAgIGtocm9ub3NfdWludDMyX3Q7Ci10eXBlZGVmIGludDY0X3QgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50NjRfdDsKLXR5cGVkZWYgdWludDY0X3QgICAgICAgICAgICAgICAga2hyb25vc191aW50NjRfdDsKLSNkZWZpbmUgS0hST05PU19TVVBQT1JUX0lOVDY0ICAgMQotI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfRkxPQVQgICAxCi0KLSNlbGlmIGRlZmluZWQoX19WTVMgKSB8fCBkZWZpbmVkKF9fc2dpKQotCi0vKgotICogVXNpbmcgPGludHR5cGVzLmg+Ci0gKi8KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotdHlwZWRlZiBpbnQzMl90ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDMyX3Q7Ci10eXBlZGVmIHVpbnQzMl90ICAgICAgICAgICAgICAgIGtocm9ub3NfdWludDMyX3Q7Ci10eXBlZGVmIGludDY0X3QgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50NjRfdDsKLXR5cGVkZWYgdWludDY0X3QgICAgICAgICAgICAgICAga2hyb25vc191aW50NjRfdDsKLSNkZWZpbmUgS0hST05PU19TVVBQT1JUX0lOVDY0ICAgMQotI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfRkxPQVQgICAxCi0KLSNlbGlmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX1NDSVRFQ0hfU05BUF9fKQotCi0vKgotICogV2luMzIKLSAqLwotdHlwZWRlZiBfX2ludDMyICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDMyX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgICAgICAgIGtocm9ub3NfdWludDMyX3Q7Ci10eXBlZGVmIF9faW50NjQgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgICAgICAga2hyb25vc191aW50NjRfdDsKLSNkZWZpbmUgS0hST05PU19TVVBQT1JUX0lOVDY0ICAgMQotI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfRkxPQVQgICAxCi0KLSNlbGlmIGRlZmluZWQoX19zdW5fXykgfHwgZGVmaW5lZChfX2RpZ2l0YWxfXykKLQotLyoKLSAqIFN1biBvciBEaWdpdGFsCi0gKi8KLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICBraHJvbm9zX3VpbnQzMl90OwotI2lmIGRlZmluZWQoX19hcmNoNjRfXykgfHwgZGVmaW5lZChfTFA2NCkKLXR5cGVkZWYgbG9uZyBpbnQgICAgICAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCAgICAgICBraHJvbm9zX3VpbnQ2NF90OwotI2Vsc2UKLXR5cGVkZWYgbG9uZyBsb25nIGludCAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50ICBraHJvbm9zX3VpbnQ2NF90OwotI2VuZGlmIC8qIF9fYXJjaDY0X18gKi8KLSNkZWZpbmUgS0hST05PU19TVVBQT1JUX0lOVDY0ICAgMQotI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfRkxPQVQgICAxCi0KLSNlbGlmIDAKLQotLyoKLSAqIEh5cG90aGV0aWNhbCBwbGF0Zm9ybSB3aXRoIG5vIGZsb2F0IG9yIGludDY0IHN1cHBvcnQKLSAqLwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDMyX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgICAgIGtocm9ub3NfdWludDMyX3Q7Ci0jZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDAKLSNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMAotCi0jZWxzZQotCi0vKgotICogR2VuZXJpYyBmYWxsYmFjawotICovCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci10eXBlZGVmIGludDMyX3QgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKLXR5cGVkZWYgdWludDMyX3QgICAgICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKLXR5cGVkZWYgaW50NjRfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwotdHlwZWRlZiB1aW50NjRfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQ2NF90OwotI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCi0jZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKLQotI2VuZGlmCi0KLQotLyoKLSAqIFR5cGVzIHRoYXQgYXJlIChzbyBmYXIpIHRoZSBzYW1lIG9uIGFsbCBwbGF0Zm9ybXMKLSAqLwotdHlwZWRlZiBzaWduZWQgICBjaGFyICAgICAgICAgIGtocm9ub3NfaW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgIGtocm9ub3NfdWludDhfdDsKLXR5cGVkZWYgc2lnbmVkICAgc2hvcnQgaW50ICAgICBraHJvbm9zX2ludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCAgICAga2hyb25vc191aW50MTZfdDsKLXR5cGVkZWYgc2lnbmVkICAgbG9uZyAgaW50ICAgICBraHJvbm9zX2ludHB0cl90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICBpbnQgICAgIGtocm9ub3NfdWludHB0cl90OwotdHlwZWRlZiBzaWduZWQgICBsb25nICBpbnQgICAgIGtocm9ub3Nfc3NpemVfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgaW50ICAgICBraHJvbm9zX3VzaXplX3Q7Ci0KLSNpZiBLSFJPTk9TX1NVUFBPUlRfRkxPQVQKLS8qCi0gKiBGbG9hdCB0eXBlCi0gKi8KLXR5cGVkZWYgICAgICAgICAgZmxvYXQgICAgICAgICBraHJvbm9zX2Zsb2F0X3Q7Ci0jZW5kaWYKLQotI2lmIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NAotLyogVGltZSB0eXBlcwotICoKLSAqIFRoZXNlIHR5cGVzIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHRpbWUgaW50ZXJ2YWwgaW4gbmFub3NlY29uZHMgb3IgCi0gKiBhbiBhYnNvbHV0ZSBVbmFkanVzdGVkIFN5c3RlbSBUaW1lLiAgVW5hZGp1c3RlZCBTeXN0ZW0gVGltZSBpcyB0aGUgbnVtYmVyIAotICogb2YgbmFub3NlY29uZHMgc2luY2Ugc29tZSBhcmJpdHJhcnkgc3lzdGVtIGV2ZW50IChlLmcuIHNpbmNlIHRoZSBsYXN0IAotICogdGltZSB0aGUgc3lzdGVtIGJvb3RlZCkuICBUaGUgVW5hZGp1c3RlZCBTeXN0ZW0gVGltZSBpcyBhbiB1bnNpZ25lZCAKLSAqIDY0IGJpdCB2YWx1ZSB0aGF0IHdyYXBzIGJhY2sgdG8gMCBldmVyeSA1ODQgeWVhcnMuICBUaW1lIGludGVydmFscyAKLSAqIG1heSBiZSBlaXRoZXIgc2lnbmVkIG9yIHVuc2lnbmVkLgotICovCi10eXBlZGVmIGtocm9ub3NfdWludDY0X3QgICAgICAga2hyb25vc191dGltZV9uYW5vc2Vjb25kc190OwotdHlwZWRlZiBraHJvbm9zX2ludDY0X3QgICAgICAgIGtocm9ub3Nfc3RpbWVfbmFub3NlY29uZHNfdDsKLSNlbmRpZgotCi0KLSNlbmRpZiAvKiBfX2tocnBsYXRmb3JtX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL0FuZHJvaWQubWsgYi9vcGVuZ2wvbGliYWdsL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZTU4ZjIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgQnVpbGQgdGhlIHNvZnR3YXJlIE9wZW5HTCBFUyBsaWJyYXJ5Ci0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JZWdsLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKLQlzdGF0ZS5jcHAJCSAgICAgICAgICAgIFwKLQl0ZXh0dXJlLmNwcAkJICAgICAgICAgICAgXAotICAgIFRva2VuaXplci5jcHAgICAgICAgICAgICAgICBcCi0gICAgVG9rZW5NYW5hZ2VyLmNwcCAgICAgICAgICAgIFwKLSAgICBUZXh0dXJlT2JqZWN0TWFuYWdlci5jcHAgICAgXAotICAgIEJ1ZmZlck9iamVjdE1hbmFnZXIuY3BwICAgICBcCi0JYXJyYXkuY3BwLmFybQkJICAgICAgICBcCi0JZnAuY3BwLmFybQkJICAgICAgICAgICAgXAotCWxpZ2h0LmNwcC5hcm0JCSAgICAgICAgXAotCW1hdHJpeC5jcHAuYXJtCQkgICAgICAgIFwKLQltaXBtYXAuY3BwLmFybQkJICAgICAgICBcCi0JcHJpbWl0aXZlcy5jcHAuYXJtCSAgICAgICAgXAotCXZlcnRleC5jcHAuYXJtCi0KLUxPQ0FMX0NGTEFHUyArPSAtRExPR19UQUc9XCJsaWJhZ2xcIgotTE9DQUxfQ0ZMQUdTICs9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGliaGFyZHdhcmUgbGlidXRpbHMgbGlicGl4ZWxmbGluZ2VyIGxpYkVUQzEKLUxPQ0FMX0xETElCUyA6PSAtbHB0aHJlYWQgLWxkbAotCi1pZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCi0JTE9DQUxfU1JDX0ZJTEVTICs9IGZpeGVkX2FzbS5TIGl0ZXJhdG9ycy5TCi0JTE9DQUxfQ0ZMQUdTICs9IC1mc3RyaWN0LWFsaWFzaW5nCi1lbmRpZgotCi1pZmVxICgkKEFSQ0hfQVJNX0hBVkVfVExTX1JFR0lTVEVSKSx0cnVlKQotICAgIExPQ0FMX0NGTEFHUyArPSAtREhBVkVfQVJNX1RMU19SRUdJU1RFUgotZW5kaWYKLQotIyB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgcHJpdmF0ZSBCaW9uaWMgaGVhZGVyIDxiaW9uaWNfdGxzLmg+Ci0jIG9uIEFSTSBwbGF0Zm9ybXMsIHdlIG5lZWQgdG8gbWlycm9yIHRoZSBBUkNIX0FSTV9IQVZFX1RMU19SRUdJU1RFUgotIyBiZWhhdmlvciBmcm9tIHRoZSBiaW9uaWMgQW5kcm9pZC5tayBmaWxlCi1pZmVxICgkKFRBUkdFVF9BUkNIKS0kKEFSQ0hfQVJNX0hBVkVfVExTX1JFR0lTVEVSKSxhcm0tdHJ1ZSkKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURIQVZFX0FSTV9UTFNfUkVHSVNURVIKLWVuZGlmCi1MT0NBTF9DX0lOQ0xVREVTICs9IGJpb25pYy9saWJjL3ByaXZhdGUKLQotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2VnbAotTE9DQUxfTU9EVUxFOj0gbGliR0xFU19hbmRyb2lkCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvQnVmZmVyT2JqZWN0TWFuYWdlci5jcHAgYi9vcGVuZ2wvbGliYWdsL0J1ZmZlck9iamVjdE1hbmFnZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmYyOGVlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvQnVmZmVyT2JqZWN0TWFuYWdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvQXRvbWljLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0KLSNpbmNsdWRlICJCdWZmZXJPYmplY3RNYW5hZ2VyLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBuYW1lc3BhY2UgZ2w7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMQnVmZmVyT2JqZWN0TWFuYWdlcjo6RUdMQnVmZmVyT2JqZWN0TWFuYWdlcigpIAotOiBUb2tlbk1hbmFnZXIoKSwgbUNvdW50KDApCi17Ci19Ci0KLUVHTEJ1ZmZlck9iamVjdE1hbmFnZXI6On5FR0xCdWZmZXJPYmplY3RNYW5hZ2VyKCkKLXsKLSAgICAvLyBkZXN0cm95IGFsbCB0aGUgYnVmZmVyIG9iamVjdHMgYW5kIHRoZWlyIHN0b3JhZ2UKLSAgICBHTHNpemVpIG4gPSBtQnVmZmVycy5zaXplKCk7Ci0gICAgZm9yIChHTHNpemVpIGk9MCA7IGk8biA7IGkrKykgewotICAgICAgICBidWZmZXJfdCogYm8gPSBtQnVmZmVycy52YWx1ZUF0KGkpOwotICAgICAgICBmcmVlKGJvLT5kYXRhKTsKLSAgICAgICAgZGVsZXRlIGJvOwotICAgIH0KLX0KLQotYnVmZmVyX3QgY29uc3QqIEVHTEJ1ZmZlck9iamVjdE1hbmFnZXI6OmJpbmQoR0x1aW50IGJ1ZmZlcikKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGludDMyX3QgaSA9IG1CdWZmZXJzLmluZGV4T2ZLZXkoYnVmZmVyKTsKLSAgICBpZiAoaSA+PSAwKSB7Ci0gICAgICAgIHJldHVybiBtQnVmZmVycy52YWx1ZUF0KGkpOwotICAgIH0KLSAgICBidWZmZXJfdCogYm8gPSBuZXcgYnVmZmVyX3Q7Ci0gICAgYm8tPmRhdGEgPSAwOwotICAgIGJvLT51c2FnZSA9IEdMX1NUQVRJQ19EUkFXOwotICAgIGJvLT5zaXplID0gMDsKLSAgICBiby0+bmFtZSA9IGJ1ZmZlcjsKLSAgICBtQnVmZmVycy5hZGQoYnVmZmVyLCBibyk7Ci0gICAgcmV0dXJuIGJvOwotfQotCi1pbnQgRUdMQnVmZmVyT2JqZWN0TWFuYWdlcjo6YWxsb2NhdGVTdG9yZShidWZmZXJfdCogYm8sCi0gICAgICAgIEdMc2l6ZWlwdHIgc2l6ZSwgR0xlbnVtIHVzYWdlKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKHNpemUgIT0gYm8tPnNpemUpIHsKLSAgICAgICB1aW50OF90KiBkYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhzaXplKTsKLSAgICAgICAgaWYgKGRhdGEgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgZnJlZShiby0+ZGF0YSk7Ci0gICAgICAgIGJvLT5kYXRhID0gZGF0YTsKLSAgICAgICAgYm8tPnNpemUgPSBzaXplOwotICAgIH0KLSAgICBiby0+dXNhZ2UgPSB1c2FnZTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBFR0xCdWZmZXJPYmplY3RNYW5hZ2VyOjpkZWxldGVCdWZmZXJzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBidWZmZXJzKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgd2hpbGUgKG4tLSkgewotICAgICAgICBjb25zdCBHTHVpbnQgdCA9ICpidWZmZXJzKys7Ci0gICAgICAgIGlmICh0KSB7Ci0gICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gbUJ1ZmZlcnMuaW5kZXhPZktleSh0KTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyX3QqIGJvID0gbUJ1ZmZlcnMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgZnJlZShiby0+ZGF0YSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIGJvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmggYi9vcGVuZ2wvbGliYWdsL0J1ZmZlck9iamVjdE1hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5MzQwYS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL0J1ZmZlck9iamVjdE1hbmFnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKioKLSAqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX0JVRkZFUl9PQkpFQ1RfTUFOQUdFUl9ICi0jZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfQlVGRkVSX09CSkVDVF9NQU5BR0VSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvQXRvbWljLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0KLSNpbmNsdWRlICJUb2tlbml6ZXIuaCIKLSNpbmNsdWRlICJUb2tlbk1hbmFnZXIuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGdsIHsKLQotc3RydWN0IGJ1ZmZlcl90IHsKLSAgICBHTHNpemVpcHRyICAgICAgc2l6ZTsKLSAgICBHTGVudW0gICAgICAgICAgdXNhZ2U7Ci0gICAgdWludDhfdCogICAgICAgIGRhdGE7Ci0gICAgdWludDMyX3QgICAgICAgIG5hbWU7Ci19OwotCi19OwotCi1jbGFzcyBFR0xCdWZmZXJPYmplY3RNYW5hZ2VyIDogcHVibGljIFRva2VuTWFuYWdlcgotewotcHVibGljOgotICAgIEVHTEJ1ZmZlck9iamVjdE1hbmFnZXIoKTsKLSAgICB+RUdMQnVmZmVyT2JqZWN0TWFuYWdlcigpOwotCi0gICAgLy8gcHJvdG9jb2wgZm9yIHNwPD4KLSAgICBpbmxpbmUgIHZvaWQgICAgaW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdDsKLSAgICBpbmxpbmUgIHZvaWQgICAgZGVjU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdDsKLSAgICB0eXBlZGVmIHZvaWQgICAgd2Vha3JlZl90eXBlOwotCi0gICAgZ2w6OmJ1ZmZlcl90IGNvbnN0KiBiaW5kKEdMdWludCBidWZmZXIpOwotICAgIGludCAgICAgICAgICAgICAgICAgYWxsb2NhdGVTdG9yZShnbDo6YnVmZmVyX3QqIGJvLCBHTHNpemVpcHRyIHNpemUsIEdMZW51bSB1c2FnZSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBkZWxldGVCdWZmZXJzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBidWZmZXJzKTsKLQotcHJpdmF0ZToKLSAgICBtdXRhYmxlIHZvbGF0aWxlIGludDMyX3QgICAgICAgICAgICBtQ291bnQ7Ci0gICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgS2V5ZWRWZWN0b3I8R0x1aW50LCBnbDo6YnVmZmVyX3QqPiAgbUJ1ZmZlcnM7Ci19OwotCi12b2lkIEVHTEJ1ZmZlck9iamVjdE1hbmFnZXI6OmluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3QgewotICAgIGFuZHJvaWRfYXRvbWljX2luYygmbUNvdW50KTsKLX0KLXZvaWQgRUdMQnVmZmVyT2JqZWN0TWFuYWdlcjo6ZGVjU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7Ci0gICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmbUNvdW50KSA9PSAxKSB7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfQlVGRkVSX09CSkVDVF9NQU5BR0VSX0gKLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5jcHAgYi9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkNDVjYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiY29udGV4dC5oIgotI2luY2x1ZGUgIlRleHR1cmVPYmplY3RNYW5hZ2VyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMVGV4dHVyZU9iamVjdDo6RUdMVGV4dHVyZU9iamVjdCgpCi0gICAgOiBtU2l6ZSgwKQotewotICAgIGluaXQoKTsKLX0KLQotRUdMVGV4dHVyZU9iamVjdDo6fkVHTFRleHR1cmVPYmplY3QoKQotewotICAgIGlmICghZGlyZWN0KSB7Ci0gICAgICAgIGlmIChtU2l6ZSAmJiBzdXJmYWNlLmRhdGEpCi0gICAgICAgICAgICBmcmVlKHN1cmZhY2UuZGF0YSk7Ci0gICAgICAgIGlmIChtTWlwbWFwcykKLSAgICAgICAgICAgIGZyZWVNaXBtYXBzKCk7Ci0gICAgfQotfQotCi12b2lkIEVHTFRleHR1cmVPYmplY3Q6OmluaXQoKQotewotICAgIG1lbXNldCgmc3VyZmFjZSwgMCwgc2l6ZW9mKHN1cmZhY2UpKTsKLSAgICBzdXJmYWNlLnZlcnNpb24gPSBzaXplb2Yoc3VyZmFjZSk7Ci0gICAgbU1pcG1hcHMgPSAwOwotICAgIG1OdW1FeHRyYUxvZCA9IDA7Ci0gICAgbUlzQ29tcGxldGUgPSBmYWxzZTsKLSAgICB3cmFwcyA9IEdMX1JFUEVBVDsKLSAgICB3cmFwdCA9IEdMX1JFUEVBVDsKLSAgICBtaW5fZmlsdGVyID0gR0xfTElORUFSOwotICAgIG1hZ19maWx0ZXIgPSBHTF9MSU5FQVI7Ci0gICAgaW50ZXJuYWxmb3JtYXQgPSAwOwotICAgIG1lbXNldChjcm9wX3JlY3QsIDAsIHNpemVvZihjcm9wX3JlY3QpKTsKLSAgICBnZW5lcmF0ZV9taXBtYXAgPSBHTF9GQUxTRTsKLSAgICBkaXJlY3QgPSBHTF9GQUxTRTsKLSAgICBidWZmZXIgPSAwOwotfQotCi12b2lkIEVHTFRleHR1cmVPYmplY3Q6OmNvcHlQYXJhbWV0ZXJzKGNvbnN0IHNwPEVHTFRleHR1cmVPYmplY3Q+JiBvbGQpCi17Ci0gICAgd3JhcHMgPSBvbGQtPndyYXBzOwotICAgIHdyYXB0ID0gb2xkLT53cmFwdDsKLSAgICBtaW5fZmlsdGVyID0gb2xkLT5taW5fZmlsdGVyOwotICAgIG1hZ19maWx0ZXIgPSBvbGQtPm1hZ19maWx0ZXI7Ci0gICAgbWVtY3B5KGNyb3BfcmVjdCwgb2xkLT5jcm9wX3JlY3QsIHNpemVvZihjcm9wX3JlY3QpKTsKLSAgICBnZW5lcmF0ZV9taXBtYXAgPSBvbGQtPmdlbmVyYXRlX21pcG1hcDsKLSAgICBkaXJlY3QgPSBvbGQtPmRpcmVjdDsKLX0KLQotc3RhdHVzX3QgRUdMVGV4dHVyZU9iamVjdDo6YWxsb2NhdGVNaXBtYXBzKCkKLXsKLSAgICAvLyBoZXJlLCBieSBjb25zdHJ1Y3Rpb24sIG1NaXBtYXBzPTAgJiYgbU51bUV4dHJhTG9kPTAKLQotICAgIGlmICghc3VyZmFjZS5kYXRhKQotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLQotICAgIGludCB3ID0gc3VyZmFjZS53aWR0aDsKLSAgICBpbnQgaCA9IHN1cmZhY2UuaGVpZ2h0OwotICAgIGNvbnN0IGludCBudW1Mb2RzID0gMzEgLSBnZ2xDbHoobWF4KHcsaCkpOwotICAgIGlmIChudW1Mb2RzIDw9IDApCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLQotICAgIG1NaXBtYXBzID0gKEdHTFN1cmZhY2UqKW1hbGxvYyhudW1Mb2RzICogc2l6ZW9mKEdHTFN1cmZhY2UpKTsKLSAgICBpZiAoIW1NaXBtYXBzKQotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotCi0gICAgbWVtc2V0KG1NaXBtYXBzLCAwLCBudW1Mb2RzICogc2l6ZW9mKEdHTFN1cmZhY2UpKTsKLSAgICBtTnVtRXh0cmFMb2QgPSBudW1Mb2RzOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBFR0xUZXh0dXJlT2JqZWN0OjpmcmVlTWlwbWFwcygpCi17Ci0gICAgaWYgKG1NaXBtYXBzKSB7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8bU51bUV4dHJhTG9kIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobU1pcG1hcHNbaV0uZGF0YSkgewotICAgICAgICAgICAgICAgIGZyZWUobU1pcG1hcHNbaV0uZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShtTWlwbWFwcyk7Ci0gICAgICAgIG1NaXBtYXBzID0gMDsKLSAgICAgICAgbU51bUV4dHJhTG9kID0gMDsKLSAgICB9Ci19Ci0KLWNvbnN0IEdHTFN1cmZhY2UmIEVHTFRleHR1cmVPYmplY3Q6Om1pcChpbnQgbG9kKSBjb25zdAotewotICAgIGlmIChsb2Q8PTAgfHwgIW1NaXBtYXBzKQotICAgICAgICByZXR1cm4gc3VyZmFjZTsKLSAgICBsb2QgPSBtaW4obG9kLTEsIG1OdW1FeHRyYUxvZC0xKTsKLSAgICByZXR1cm4gbU1pcG1hcHNbbG9kXTsKLX0KLQotR0dMU3VyZmFjZSYgRUdMVGV4dHVyZU9iamVjdDo6ZWRpdE1pcChpbnQgbG9kKQotewotICAgIHJldHVybiBjb25zdF9jYXN0PEdHTFN1cmZhY2UmPihtaXAobG9kKSk7Ci19Ci0KLXN0YXR1c190IEVHTFRleHR1cmVPYmplY3Q6OnNldFN1cmZhY2UoR0dMU3VyZmFjZSBjb25zdCogcykKLXsKLSAgICAvLyBYWFg6IGdsRmx1c2goKSBvbiAncycKLSAgICBpZiAobVNpemUgJiYgc3VyZmFjZS5kYXRhKSB7Ci0gICAgICAgIGZyZWUoc3VyZmFjZS5kYXRhKTsKLSAgICB9Ci0gICAgc3VyZmFjZSA9ICpzOwotICAgIGludGVybmFsZm9ybWF0ID0gMDsKLSAgICBidWZmZXIgPSAwOwotCi0gICAgLy8gd2Ugc2hvdWxkIGtlZXAgdGhlIGNyb3BfcmVjdCwgYnV0IGl0J3MgZGVsaWNhdGUgYmVjYXVzZQotICAgIC8vIHRoZSBuZXcgc2l6ZSBvZiB0aGUgc3VyZmFjZSBjb3VsZCBtYWtlIGl0IGludmFsaWQuCi0gICAgLy8gc28gZm9yIG5vdywgd2UganVzdCBsb29zZSBpdC4KLSAgICBtZW1zZXQoY3JvcF9yZWN0LCAwLCBzaXplb2YoY3JvcF9yZWN0KSk7Ci0KLSAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGtlZXAgdGhlIGdlbmVyYXRlX21pcG1hcCBmbGFnLAotICAgIC8vIHdlIHdvdWxkIGhhdmUgdG8gZ2VuZXJhdGUgdGhlbSByaWdodCBub3cgdGhvdWdoLgotICAgIGdlbmVyYXRlX21pcG1hcCA9IEdMX0ZBTFNFOwotCi0gICAgZGlyZWN0ID0gR0xfVFJVRTsKLSAgICBtU2l6ZSA9IDA7ICAvLyB3ZSBkb24ndCBvd24gdGhpcyBzdXJmYWNlCi0gICAgaWYgKG1NaXBtYXBzKQotICAgICAgICBmcmVlTWlwbWFwcygpOwotICAgIG1Jc0NvbXBsZXRlID0gdHJ1ZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEVHTFRleHR1cmVPYmplY3Q6OnNldEltYWdlKEFOYXRpdmVXaW5kb3dCdWZmZXIqIG5hdGl2ZV9idWZmZXIpCi17Ci0gICAgR0dMU3VyZmFjZSBzdXI7Ci0gICAgc3VyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7Ci0gICAgc3VyLndpZHRoID0gbmF0aXZlX2J1ZmZlci0+d2lkdGg7Ci0gICAgc3VyLmhlaWdodD0gbmF0aXZlX2J1ZmZlci0+aGVpZ2h0OwotICAgIHN1ci5zdHJpZGU9IG5hdGl2ZV9idWZmZXItPnN0cmlkZTsKLSAgICBzdXIuZm9ybWF0PSBuYXRpdmVfYnVmZmVyLT5mb3JtYXQ7Ci0gICAgc3VyLmRhdGEgID0gMDsKLSAgICBzZXRTdXJmYWNlKCZzdXIpOwotICAgIGJ1ZmZlciA9IG5hdGl2ZV9idWZmZXI7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBFR0xUZXh0dXJlT2JqZWN0OjpyZWFsbG9jYXRlKAotICAgICAgICBHTGludCBsZXZlbCwgaW50IHcsIGludCBoLCBpbnQgcywKLSAgICAgICAgaW50IGZvcm1hdCwgaW50IGNvbXByZXNzZWRGb3JtYXQsIGludCBicHIpCi17Ci0gICAgY29uc3Qgc2l6ZV90IHNpemUgPSBoICogYnByOwotICAgIGlmIChsZXZlbCA9PSAwKQotICAgIHsKLSAgICAgICAgaWYgKHNpemUhPW1TaXplIHx8ICFzdXJmYWNlLmRhdGEpIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZSAmJiBzdXJmYWNlLmRhdGEpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHN1cmZhY2UuZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdXJmYWNlLmRhdGEgPSAoR0dMdWJ5dGUqKW1hbGxvYyhzaXplKTsKLSAgICAgICAgICAgIGlmICghc3VyZmFjZS5kYXRhKSB7Ci0gICAgICAgICAgICAgICAgbVNpemUgPSAwOwotICAgICAgICAgICAgICAgIG1Jc0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TaXplID0gc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBzdXJmYWNlLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7Ci0gICAgICAgIHN1cmZhY2Uud2lkdGggID0gdzsKLSAgICAgICAgc3VyZmFjZS5oZWlnaHQgPSBoOwotICAgICAgICBzdXJmYWNlLnN0cmlkZSA9IHM7Ci0gICAgICAgIHN1cmZhY2UuZm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBzdXJmYWNlLmNvbXByZXNzZWRGb3JtYXQgPSBjb21wcmVzc2VkRm9ybWF0OwotICAgICAgICBpZiAobU1pcG1hcHMpCi0gICAgICAgICAgICBmcmVlTWlwbWFwcygpOwotICAgICAgICBtSXNDb21wbGV0ZSA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICghbU1pcG1hcHMpIHsKLSAgICAgICAgICAgIGlmIChhbGxvY2F0ZU1pcG1hcHMoKSAhPSBOT19FUlJPUikKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1dfSUYobGV2ZWwtMSA+PSBtTnVtRXh0cmFMb2QsCi0gICAgICAgICAgICAgICAgInNwZWNpZnlpbmcgbWlwbWFwIGxldmVsICVkLCBidXQgIyBvZiBsZXZlbCBpcyAlZCIsCi0gICAgICAgICAgICAgICAgbGV2ZWwsIG1OdW1FeHRyYUxvZCsxKTsKLQotICAgICAgICBHR0xTdXJmYWNlJiBtaXBtYXAgPSBlZGl0TWlwKGxldmVsKTsKLSAgICAgICAgaWYgKG1pcG1hcC5kYXRhKQotICAgICAgICAgICAgZnJlZShtaXBtYXAuZGF0YSk7Ci0KLSAgICAgICAgbWlwbWFwLmRhdGEgPSAoR0dMdWJ5dGUqKW1hbGxvYyhzaXplKTsKLSAgICAgICAgaWYgKCFtaXBtYXAuZGF0YSkgewotICAgICAgICAgICAgbWVtc2V0KCZtaXBtYXAsIDAsIHNpemVvZihHR0xTdXJmYWNlKSk7Ci0gICAgICAgICAgICBtSXNDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotCi0gICAgICAgIG1pcG1hcC52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOwotICAgICAgICBtaXBtYXAud2lkdGggID0gdzsKLSAgICAgICAgbWlwbWFwLmhlaWdodCA9IGg7Ci0gICAgICAgIG1pcG1hcC5zdHJpZGUgPSBzOwotICAgICAgICBtaXBtYXAuZm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBtaXBtYXAuY29tcHJlc3NlZEZvcm1hdCA9IGNvbXByZXNzZWRGb3JtYXQ7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRleHR1cmUgaXMgY29tcGxldGUKLSAgICAgICAgbUlzQ29tcGxldGUgPSB0cnVlOwotICAgICAgICBjb25zdCBHR0xTdXJmYWNlKiBwcmV2ID0gJnN1cmZhY2U7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8bU51bUV4dHJhTG9kIDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBHR0xTdXJmYWNlKiBjdXJyID0gbU1pcG1hcHMgKyBpOwotICAgICAgICAgICAgaWYgKGN1cnItPmZvcm1hdCAhPSBzdXJmYWNlLmZvcm1hdCkgewotICAgICAgICAgICAgICAgIG1Jc0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHcgPSAocHJldi0+d2lkdGggID4+IDEpID8gOiAxOwotICAgICAgICAgICAgdWludDMyX3QgaCA9IChwcmV2LT5oZWlnaHQgPj4gMSkgPyA6IDE7Ci0gICAgICAgICAgICBpZiAodyAhPSBjdXJyLT53aWR0aCB8fCBoICE9IGN1cnItPmhlaWdodCkgewotICAgICAgICAgICAgICAgIG1Jc0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmV2ID0gY3VycjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMU3VyZmFjZU1hbmFnZXI6OkVHTFN1cmZhY2VNYW5hZ2VyKCkKLSAgICA6IFRva2VuTWFuYWdlcigpCi17Ci19Ci0KLUVHTFN1cmZhY2VNYW5hZ2VyOjp+RUdMU3VyZmFjZU1hbmFnZXIoKQotewotICAgIC8vIGV2ZXJ5dGhpbmcgZ2V0cyBmcmVlZCBhdXRvbWF0aWNhbGx5IGhlcmUuLi4KLX0KLQotc3A8RUdMVGV4dHVyZU9iamVjdD4gRUdMU3VyZmFjZU1hbmFnZXI6OmNyZWF0ZVRleHR1cmUoR0x1aW50IG5hbWUpCi17Ci0gICAgc3A8RUdMVGV4dHVyZU9iamVjdD4gcmVzdWx0OwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVRleHR1cmVzLmluZGV4T2ZLZXkobmFtZSkgPj0gMCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsgLy8gYWxyZWFkeSBleGlzdHMhCi0KLSAgICByZXN1bHQgPSBuZXcgRUdMVGV4dHVyZU9iamVjdCgpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbVRleHR1cmVzLmFkZChuYW1lLCByZXN1bHQpOwotICAgIGlmIChlcnIgPCAwKQotICAgICAgICByZXN1bHQuY2xlYXIoKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXNwPEVHTFRleHR1cmVPYmplY3Q+IEVHTFN1cmZhY2VNYW5hZ2VyOjpyZW1vdmVUZXh0dXJlKEdMdWludCBuYW1lKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UZXh0dXJlcy5pbmRleE9mS2V5KG5hbWUpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+IHJlc3VsdChtVGV4dHVyZXMudmFsdWVBdChpbmRleCkpOwotICAgICAgICBtVGV4dHVyZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zcDxFR0xUZXh0dXJlT2JqZWN0PiBFR0xTdXJmYWNlTWFuYWdlcjo6cmVwbGFjZVRleHR1cmUoR0x1aW50IG5hbWUpCi17Ci0gICAgc3A8RUdMVGV4dHVyZU9iamVjdD4gdGV4OwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UZXh0dXJlcy5pbmRleE9mS2V5KG5hbWUpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIGNvbnN0IHNwPEVHTFRleHR1cmVPYmplY3Q+JiBvbGQgPSBtVGV4dHVyZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IHJlZnMgPSBvbGQtPmdldFN0cm9uZ0NvdW50KCk7Ci0gICAgICAgIGlmIChnZ2xfbGlrZWx5KHJlZnMgPT0gMSkpIHsKLSAgICAgICAgICAgIC8vIHdlJ3JlIHRoZSBvbmx5IG93bmVyCi0gICAgICAgICAgICB0ZXggPSBvbGQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBrZWVwIHRoZSB0ZXh0dXJlJ3MgcGFyYW1ldGVycwotICAgICAgICAgICAgdGV4ID0gbmV3IEVHTFRleHR1cmVPYmplY3QoKTsKLSAgICAgICAgICAgIHRleC0+Y29weVBhcmFtZXRlcnMob2xkKTsKLSAgICAgICAgICAgIG1UZXh0dXJlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLSAgICAgICAgICAgIG1UZXh0dXJlcy5hZGQobmFtZSwgdGV4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdGV4OwotfQotCi12b2lkIEVHTFN1cmZhY2VNYW5hZ2VyOjpkZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdG9rZW5zKQotewotICAgIC8vIGZyZWUgYWxsIHRleHR1cmVzCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBmb3IgKEdMc2l6ZWkgaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IEdMdWludCB0KCp0b2tlbnMrKyk7Ci0gICAgICAgIGlmICh0KSB7Ci0gICAgICAgICAgICBtVGV4dHVyZXMucmVtb3ZlSXRlbSh0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3A8RUdMVGV4dHVyZU9iamVjdD4gRUdMU3VyZmFjZU1hbmFnZXI6OnRleHR1cmUoR0x1aW50IG5hbWUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRleHR1cmVzLmluZGV4T2ZLZXkobmFtZSk7Ci0gICAgaWYgKGluZGV4ID49IDApCi0gICAgICAgIHJldHVybiBtVGV4dHVyZXMudmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmggYi9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOWUwM2UuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX1NVUkZBQ0VfSAotI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1NVUkZBQ0VfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL3BpeGVsZmxpbmdlci9nZ2xfY29udGV4dC5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0KLSNpbmNsdWRlICJUb2tlbml6ZXIuaCIKLSNpbmNsdWRlICJUb2tlbk1hbmFnZXIuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgRUdMVGV4dHVyZU9iamVjdCA6IHB1YmxpYyBMaWdodFJlZkJhc2U8RUdMVGV4dHVyZU9iamVjdD4KLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgRUdMVGV4dHVyZU9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgIH5FR0xUZXh0dXJlT2JqZWN0KCk7Ci0KLSAgICBzdGF0dXNfdCAgICBzZXRTdXJmYWNlKEdHTFN1cmZhY2UgY29uc3QqIHMpOwotICAgIHN0YXR1c190ICAgIHNldEltYWdlKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgdm9pZCAgICAgICAgc2V0SW1hZ2VCaXRzKHZvaWQqIHZhZGRyKSB7IHN1cmZhY2UuZGF0YSA9IChHR0x1Ynl0ZSopdmFkZHI7IH0KLQotICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhbGxvY2F0ZShHTGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsIGludCBjb21wcmVzc2VkRm9ybWF0LCBpbnQgYnByKTsKLSAgICBpbmxpbmUgIHNpemVfdCAgICAgIHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQotICAgIGNvbnN0IEdHTFN1cmZhY2UmICAgbWlwKGludCBsb2QpIGNvbnN0OwotICAgIEdHTFN1cmZhY2UmICAgICAgICAgZWRpdE1pcChpbnQgbG9kKTsKLSAgICBib29sICAgICAgICAgICAgICAgIGhhc01pcG1hcHMoKSBjb25zdCB7IHJldHVybiBtTWlwbWFwcyE9MDsgfQotICAgIGJvb2wgICAgICAgICAgICAgICAgaXNDb21wbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc0NvbXBsZXRlOyB9Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5UGFyYW1ldGVycyhjb25zdCBzcDxFR0xUZXh0dXJlT2JqZWN0PiYgb2xkKTsKLQotcHJpdmF0ZToKLSAgICAgICAgc3RhdHVzX3QgICAgICAgIGFsbG9jYXRlTWlwbWFwcygpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgZnJlZU1pcG1hcHMoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGluaXQoKTsKLSAgICBzaXplX3QgICAgICAgICAgICAgIG1TaXplOwotICAgIEdHTFN1cmZhY2UgICAgICAgICAgKm1NaXBtYXBzOwotICAgIGludCAgICAgICAgICAgICAgICAgbU51bUV4dHJhTG9kOwotICAgIGJvb2wgICAgICAgICAgICAgICAgbUlzQ29tcGxldGU7Ci0KLXB1YmxpYzoKLSAgICBHR0xTdXJmYWNlICAgICAgICAgIHN1cmZhY2U7Ci0gICAgR0xlbnVtICAgICAgICAgICAgICB3cmFwczsKLSAgICBHTGVudW0gICAgICAgICAgICAgIHdyYXB0OwotICAgIEdMZW51bSAgICAgICAgICAgICAgbWluX2ZpbHRlcjsKLSAgICBHTGVudW0gICAgICAgICAgICAgIG1hZ19maWx0ZXI7Ci0gICAgR0xlbnVtICAgICAgICAgICAgICBpbnRlcm5hbGZvcm1hdDsKLSAgICBHTGludCAgICAgICAgICAgICAgIGNyb3BfcmVjdFs0XTsKLSAgICBHTGludCAgICAgICAgICAgICAgIGdlbmVyYXRlX21pcG1hcDsKLSAgICBHTGludCAgICAgICAgICAgICAgIGRpcmVjdDsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEVHTFN1cmZhY2VNYW5hZ2VyIDoKLSAgICBwdWJsaWMgTGlnaHRSZWZCYXNlPEVHTFN1cmZhY2VNYW5hZ2VyPiwKLSAgICBwdWJsaWMgVG9rZW5NYW5hZ2VyCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgRUdMU3VyZmFjZU1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICB+RUdMU3VyZmFjZU1hbmFnZXIoKTsKLQotICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+ICAgIGNyZWF0ZVRleHR1cmUoR0x1aW50IG5hbWUpOwotICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+ICAgIHJlbW92ZVRleHR1cmUoR0x1aW50IG5hbWUpOwotICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+ICAgIHJlcGxhY2VUZXh0dXJlKEdMdWludCBuYW1lKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdG9rZW5zKTsKLSAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiAgICB0ZXh0dXJlKEdMdWludCBuYW1lKTsKLQotcHJpdmF0ZToKLSAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIEtleWVkVmVjdG9yPCBHTHVpbnQsIHNwPEVHTFRleHR1cmVPYmplY3Q+ID4gbVRleHR1cmVzOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfU1VSRkFDRV9ICi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVG9rZW5NYW5hZ2VyLmNwcCBiL29wZW5nbC9saWJhZ2wvVG9rZW5NYW5hZ2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhNjAyNS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL1Rva2VuTWFuYWdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL3N1cmZhY2UuY3BwCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiVG9rZW5NYW5hZ2VyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVG9rZW5NYW5hZ2VyOjpUb2tlbk1hbmFnZXIoKQotewotICAgIC8vIHRva2VuIDAgaXMgYWx3YXlzIHJlc2VydmVkCi0gICAgbVRva2VuaXplci5yZXNlcnZlKDApOwotfQotCi1Ub2tlbk1hbmFnZXI6On5Ub2tlbk1hbmFnZXIoKQotewotfQotCi1zdGF0dXNfdCBUb2tlbk1hbmFnZXI6OmdldFRva2VuKEdMc2l6ZWkgbiwgR0x1aW50ICp0b2tlbnMpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBmb3IgKEdMc2l6ZWkgaT0wIDsgaTxuIDsgaSsrKQotICAgICAgICAqdG9rZW5zKysgPSBtVG9rZW5pemVyLmFjcXVpcmUoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgVG9rZW5NYW5hZ2VyOjpyZWN5Y2xlVG9rZW5zKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0b2tlbnMpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBmb3IgKGludCBpPTAgOyBpPG4gOyBpKyspIHsKLSAgICAgICAgY29uc3QgR0x1aW50IHRva2VuID0gKnRva2VucysrOwotICAgICAgICBpZiAodG9rZW4pIHsKLSAgICAgICAgICAgIG1Ub2tlbml6ZXIucmVsZWFzZSh0b2tlbik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWJvb2wgVG9rZW5NYW5hZ2VyOjppc1Rva2VuVmFsaWQoR0x1aW50IHRva2VuKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1Ub2tlbml6ZXIuaXNBY3F1aXJlZCh0b2tlbik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVG9rZW5NYW5hZ2VyLmggYi9vcGVuZ2wvbGliYWdsL1Rva2VuTWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWMxNDY5Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvVG9rZW5NYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX1RPS0VOX01BTkFHRVJfSAotI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1RPS0VOX01BTkFHRVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0KLSNpbmNsdWRlICJUb2tlbml6ZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFRva2VuTWFuYWdlcgotewotcHVibGljOgotICAgICAgICAgICAgICAgIFRva2VuTWFuYWdlcigpOwotICAgICAgICAgICAgICAgIH5Ub2tlbk1hbmFnZXIoKTsKLQotICAgIHN0YXR1c190ICAgIGdldFRva2VuKEdMc2l6ZWkgbiwgR0x1aW50ICp0b2tlbnMpOwotICAgIHZvaWQgICAgICAgIHJlY3ljbGVUb2tlbnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRva2Vucyk7Ci0gICAgYm9vbCAgICAgICAgaXNUb2tlblZhbGlkKEdMdWludCB0b2tlbikgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOwotICAgIFRva2VuaXplciAgICAgICBtVG9rZW5pemVyOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfVE9LRU5fTUFOQUdFUl9ICi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVG9rZW5pemVyLmNwcCBiL29wZW5nbC9saWJhZ2wvVG9rZW5pemVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjOGQ2ZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL1Rva2VuaXplci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9Ub2tlbml6ZXIuY3BwCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJUb2tlbml6ZXIuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKFRva2VuaXplcjo6cnVuX3QpCi0KLVRva2VuaXplcjo6VG9rZW5pemVyKCkKLXsKLX0KLQotVG9rZW5pemVyOjpUb2tlbml6ZXIoY29uc3QgVG9rZW5pemVyJiBvdGhlcikKLSAgICA6IG1SYW5nZXMob3RoZXIubVJhbmdlcykKLXsKLX0KLQotVG9rZW5pemVyOjp+VG9rZW5pemVyKCkKLXsKLX0KLQotdWludDMyX3QgVG9rZW5pemVyOjphY3F1aXJlKCkKLXsKLSAgICBpZiAoIW1SYW5nZXMuc2l6ZSgpIHx8IG1SYW5nZXNbMF0uZmlyc3QpIHsKLSAgICAgICAgX2luc2VydFRva2VuQXQoMCwwKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIC8vIGp1c3QgZXh0ZW5kIHRoZSBmaXJzdCBydW4KLSAgICBjb25zdCBydW5fdCYgcnVuID0gbVJhbmdlc1swXTsKLSAgICB1aW50MzJfdCB0b2tlbiA9IHJ1bi5maXJzdCArIHJ1bi5sZW5ndGg7Ci0gICAgX2luc2VydFRva2VuQXQodG9rZW4sIDEpOwotICAgIHJldHVybiB0b2tlbjsKLX0KLQotYm9vbCBUb2tlbml6ZXI6OmlzQWNxdWlyZWQodWludDMyX3QgdG9rZW4pIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChfaW5kZXhPcmRlck9mKHRva2VuKSA+PSAwKTsKLX0KLQotc3RhdHVzX3QgVG9rZW5pemVyOjpyZXNlcnZlKHVpbnQzMl90IHRva2VuKQotewotICAgIHNpemVfdCBvOwotICAgIGNvbnN0IHNzaXplX3QgaSA9IF9pbmRleE9yZGVyT2YodG9rZW4sICZvKTsKLSAgICBpZiAoaSA+PSAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7IC8vIHRoaXMgdG9rZW4gaXMgYWxyZWFkeSB0YWtlbgotICAgIH0KLSAgICBzc2l6ZV90IGVyciA9IF9pbnNlcnRUb2tlbkF0KHRva2VuLCBvKTsKLSAgICByZXR1cm4gKGVycjwwKSA/IGVyciA6IHN0YXR1c190KE5PX0VSUk9SKTsKLX0KLQotc3RhdHVzX3QgVG9rZW5pemVyOjpyZWxlYXNlKHVpbnQzMl90IHRva2VuKQotewotICAgIGNvbnN0IHNzaXplX3QgaSA9IF9pbmRleE9yZGVyT2YodG9rZW4pOwotICAgIGlmIChpID49IDApIHsKLSAgICAgICAgY29uc3QgcnVuX3QmIHJ1biA9IG1SYW5nZXNbaV07Ci0gICAgICAgIGlmICgodG9rZW4gPj0gcnVuLmZpcnN0KSAmJiAodG9rZW4gPCBydW4uZmlyc3QrcnVuLmxlbmd0aCkpIHsKLSAgICAgICAgICAgIC8vIHRva2VuIGluIHRoaXMgcmFuZ2UsIHdlIG5lZWQgdG8gc3BsaXQKLSAgICAgICAgICAgIHJ1bl90JiBydW4gPSBtUmFuZ2VzLmVkaXRJdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAoKHRva2VuID09IHJ1bi5maXJzdCkgfHwgKHRva2VuID09IHJ1bi5maXJzdCtydW4ubGVuZ3RoLTEpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuID09IHJ1bi5maXJzdCkgewotICAgICAgICAgICAgICAgICAgICBydW4uZmlyc3QgKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcnVuLmxlbmd0aCAtPSAxOwotICAgICAgICAgICAgICAgIGlmIChydW4ubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gWFhYOiBzaG91bGQgd2Ugc3lzdGVtYXRpY2FsbHkgcmVtb3ZlIGEgcnVuIHRoYXQncyBlbXB0eT8KLSAgICAgICAgICAgICAgICAgICAgbVJhbmdlcy5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gc3BsaXQgdGhlIHJ1bgotICAgICAgICAgICAgICAgIHJ1bl90IG5ld19ydW47Ci0gICAgICAgICAgICAgICAgbmV3X3J1bi5maXJzdCA9IHRva2VuKzE7Ci0gICAgICAgICAgICAgICAgbmV3X3J1bi5sZW5ndGggPSBydW4uZmlyc3QrcnVuLmxlbmd0aCAtIG5ld19ydW4uZmlyc3Q7Ci0gICAgICAgICAgICAgICAgcnVuLmxlbmd0aCA9IHRva2VuIC0gcnVuLmZpcnN0OwotICAgICAgICAgICAgICAgIG1SYW5nZXMuaW5zZXJ0QXQobmV3X3J1biwgaSsxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci19Ci0KLXNzaXplX3QgVG9rZW5pemVyOjpfaW5kZXhPcmRlck9mKHVpbnQzMl90IHRva2VuLCBzaXplX3QqIG9yZGVyKSBjb25zdAotewotICAgIC8vIGJpbmFyeSBzZWFyY2gKLSAgICBzc2l6ZV90IGVyciA9IE5BTUVfTk9UX0ZPVU5EOwotICAgIHNzaXplX3QgbCA9IDA7Ci0gICAgc3NpemVfdCBoID0gbVJhbmdlcy5zaXplKCktMTsKLSAgICBzc2l6ZV90IG1pZDsKLSAgICBjb25zdCBydW5fdCogYSA9IG1SYW5nZXMuYXJyYXkoKTsKLSAgICB3aGlsZSAobCA8PSBoKSB7Ci0gICAgICAgIG1pZCA9IGwgKyAoaCAtIGwpLzI7Ci0gICAgICAgIGNvbnN0IHJ1bl90KiBjb25zdCBjdXJyID0gYSArIG1pZDsKLSAgICAgICAgaW50IGMgPSAwOwotICAgICAgICBpZiAodG9rZW4gPCBjdXJyLT5maXJzdCkgICAgICAgICAgICAgICAgICAgICAgICBjID0gMTsKLSAgICAgICAgZWxzZSBpZiAodG9rZW4gPj0gY3Vyci0+Zmlyc3QrY3Vyci0+bGVuZ3RoKSAgICAgYyA9IC0xOwotICAgICAgICBpZiAoYyA9PSAwKSB7Ci0gICAgICAgICAgICBlcnIgPSBsID0gbWlkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA8IDApIHsKLSAgICAgICAgICAgIGwgPSBtaWQgKyAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaCA9IG1pZCAtIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG9yZGVyKSAqb3JkZXIgPSBsOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXNzaXplX3QgVG9rZW5pemVyOjpfaW5zZXJ0VG9rZW5BdCh1aW50MzJfdCB0b2tlbiwgc2l6ZV90IGluZGV4KQotewotICAgIGNvbnN0IHNpemVfdCBjID0gbVJhbmdlcy5zaXplKCk7Ci0KLSAgICBpZiAoaW5kZXggPj0gMSkgewotICAgICAgICAvLyBkbyB3ZSBuZWVkIHRvIG1lcmdlIHdpdGggdGhlIHByZXZpb3VzIHJ1bj8KLSAgICAgICAgcnVuX3QmIHAgPSBtUmFuZ2VzLmVkaXRJdGVtQXQoaW5kZXgtMSk7Ci0gICAgICAgIGlmIChwLmZpcnN0K3AubGVuZ3RoID09IHRva2VuKSB7Ci0gICAgICAgICAgICBwLmxlbmd0aCArPSAxOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgYykgewotICAgICAgICAgICAgICAgIGNvbnN0IHJ1bl90JiBuID0gbVJhbmdlc1tpbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuKzEgPT0gbi5maXJzdCkgewotICAgICAgICAgICAgICAgICAgICBwLmxlbmd0aCArPSBuLmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgbVJhbmdlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGluZGV4IDwgYykgewotICAgICAgICAvLyBkbyB3ZSBuZWVkIHRvIG1lcmdlIHdpdGggdGhlIG5leHQgcnVuPwotICAgICAgICBydW5fdCYgbiA9IG1SYW5nZXMuZWRpdEl0ZW1BdChpbmRleCk7Ci0gICAgICAgIGlmICh0b2tlbisxID09IG4uZmlyc3QpIHsKLSAgICAgICAgICAgIG4uZmlyc3QgLT0gMTsKLSAgICAgICAgICAgIG4ubGVuZ3RoICs9IDE7Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbVJhbmdlcy5pbnNlcnRBdChydW5fdCh0b2tlbiwxKSwgaW5kZXgpOwotfQotCi12b2lkIFRva2VuaXplcjo6ZHVtcCgpIGNvbnN0Ci17Ci0gICAgY29uc3QgcnVuX3QqIHJhbmdlcyA9IG1SYW5nZXMuYXJyYXkoKTsKLSAgICBjb25zdCBzaXplX3QgYyA9IG1SYW5nZXMuc2l6ZSgpOwotICAgIEFMT0dEKCJUb2tlbml6ZXIgKCVwLCBzaXplID0gJXUpXG4iLCB0aGlzLCBjKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGMgOyBpKyspIHsKLSAgICAgICAgQUxPR0QoIiV1OiAoJXUsICV1KVxuIiwgaSwgcmFuZ2VzW2ldLmZpcnN0LCByYW5nZXNbaV0ubGVuZ3RoKTsKLSAgICB9Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVG9rZW5pemVyLmggYi9vcGVuZ2wvbGliYWdsL1Rva2VuaXplci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzU1NWNiLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvVG9rZW5pemVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL1Rva2VuaXplci5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotCi0jaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfVE9LRU5JWkVSX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19UT0tFTklaRVJfSAotCi0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBUb2tlbml6ZXIKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICBUb2tlbml6ZXIoKTsKLSAgICAgICAgICAgICAgICBUb2tlbml6ZXIoY29uc3QgVG9rZW5pemVyJiBvdGhlcik7Ci0gICAgICAgICAgICAgICAgflRva2VuaXplcigpOwotCi0gICAgdWludDMyX3QgICAgYWNxdWlyZSgpOwotICAgIHN0YXR1c190ICAgIHJlc2VydmUodWludDMyX3QgdG9rZW4pOwotICAgIHN0YXR1c190ICAgIHJlbGVhc2UodWludDMyX3QgdG9rZW4pOwotICAgIGJvb2wgICAgICAgIGlzQWNxdWlyZWQodWludDMyX3QgdG9rZW4pIGNvbnN0OwotCi0gICAgdm9pZCBkdW1wKCkgY29uc3Q7Ci0KLSAgICBzdHJ1Y3QgcnVuX3QgewotICAgICAgICBydW5fdCgpIHt9OwotICAgICAgICBydW5fdCh1aW50MzJfdCBmLCB1aW50MzJfdCBsKSA6IGZpcnN0KGYpLCBsZW5ndGgobCkge30KLSAgICAgICAgdWludDMyX3QgICAgZmlyc3Q7Ci0gICAgICAgIHVpbnQzMl90ICAgIGxlbmd0aDsKLSAgICB9OwotcHJpdmF0ZToKLSAgICBzc2l6ZV90IF9pbmRleE9yZGVyT2YodWludDMyX3QgdG9rZW4sIHNpemVfdCogb3JkZXI9MCkgY29uc3Q7Ci0gICAgc3NpemVfdCBfaW5zZXJ0VG9rZW5BdCh1aW50MzJfdCB0b2tlbiwgc2l6ZV90IGluZGV4KTsKLSAgICBWZWN0b3I8cnVuX3Q+ICAgbVJhbmdlczsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfVE9LRU5JWkVSX0gKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvYXJyYXkuY3BwIGIvb3BlbmdsL2xpYmFnbC9hcnJheS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYmU5YjUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9hcnJheS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg4ICswLDAgQEAKLS8qCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJjb250ZXh0LmgiCi0jaW5jbHVkZSAiZnAuaCIKLSNpbmNsdWRlICJzdGF0ZS5oIgotI2luY2x1ZGUgIm1hdHJpeC5oIgotI2luY2x1ZGUgInZlcnRleC5oIgotI2luY2x1ZGUgImxpZ2h0LmgiCi0jaW5jbHVkZSAicHJpbWl0aXZlcy5oIgotI2luY2x1ZGUgInRleHR1cmUuaCIKLSNpbmNsdWRlICJCdWZmZXJPYmplY3RNYW5hZ2VyLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2RlZmluZSBWQ19DQUNIRV9TVEFUSVNUSUNTICAgICAwCi0jZGVmaW5lIFZDX0NBQ0hFX1RZUEVfTk9ORSAgICAgIDAKLSNkZWZpbmUgVkNfQ0FDSEVfVFlQRV9JTkRFWEVEICAgMQotI2RlZmluZSBWQ19DQUNIRV9UWVBFX0xSVSAgICAgICAyCi0jZGVmaW5lIFZDX0NBQ0hFX1RZUEUgICAgICAgICAgIFZDX0NBQ0hFX1RZUEVfSU5ERVhFRAotCi0jaWYgVkNfQ0FDSEVfU1RBVElTVElDUwotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgdm9pZCB2YWxpZGF0ZV9hcnJheXMob2dsZXNfY29udGV4dF90KiBjLCBHTGVudW0gbW9kZSk7Ci0KLXN0YXRpYyB2b2lkIGNvbXBpbGVFbGVtZW50c19fZ2VuZXJpYyhvZ2xlc19jb250ZXh0X3QqLAotICAgICAgICB2ZXJ0ZXhfdCosIEdMaW50LCBHTHNpemVpKTsKLXN0YXRpYyB2b2lkIGNvbXBpbGVFbGVtZW50X19nZW5lcmljKG9nbGVzX2NvbnRleHRfdCosCi0gICAgICAgIHZlcnRleF90KiwgR0xpbnQpOwotCi1zdGF0aWMgdm9pZCBkcmF3UHJpbWl0aXZlc1BvaW50cyhvZ2xlc19jb250ZXh0X3QqLCBHTGludCwgR0xzaXplaSk7Ci1zdGF0aWMgdm9pZCBkcmF3UHJpbWl0aXZlc0xpbmVTdHJpcChvZ2xlc19jb250ZXh0X3QqLCBHTGludCwgR0xzaXplaSk7Ci1zdGF0aWMgdm9pZCBkcmF3UHJpbWl0aXZlc0xpbmVMb29wKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKLXN0YXRpYyB2b2lkIGRyYXdQcmltaXRpdmVzTGluZXMob2dsZXNfY29udGV4dF90KiwgR0xpbnQsIEdMc2l6ZWkpOwotc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZVN0cmlwKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKLXN0YXRpYyB2b2lkIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVGYW4ob2dsZXNfY29udGV4dF90KiwgR0xpbnQsIEdMc2l6ZWkpOwotc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZXMob2dsZXNfY29udGV4dF90KiwgR0xpbnQsIEdMc2l6ZWkpOwotCi1zdGF0aWMgdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNQb2ludHMob2dsZXNfY29udGV4dF90KiwKLSAgICAgICAgR0xzaXplaSwgY29uc3QgR0x2b2lkKik7Ci1zdGF0aWMgdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lU3RyaXAob2dsZXNfY29udGV4dF90KiwKLSAgICAgICAgR0xzaXplaSwgY29uc3QgR0x2b2lkKik7Ci1zdGF0aWMgdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lTG9vcChvZ2xlc19jb250ZXh0X3QqLAotICAgICAgICBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKLXN0YXRpYyB2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc0xpbmVzKG9nbGVzX2NvbnRleHRfdCosCi0gICAgICAgIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCopOwotc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzVHJpYW5nbGVTdHJpcChvZ2xlc19jb250ZXh0X3QqLAotICAgICAgICBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKLXN0YXRpYyB2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlRmFuKG9nbGVzX2NvbnRleHRfdCosCi0gICAgICAgIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCopOwotc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzVHJpYW5nbGVzKG9nbGVzX2NvbnRleHRfdCosCi0gICAgICAgIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCopOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXR5cGVkZWYgdm9pZCAoKmFycmF5c19wcmltc19mY3RfdCkob2dsZXNfY29udGV4dF90KiwgR0xpbnQsIEdMc2l6ZWkpOwotc3RhdGljIGNvbnN0IGFycmF5c19wcmltc19mY3RfdCBkcmF3QXJyYXlzUHJpbXNbXSA9IHsKLSAgICBkcmF3UHJpbWl0aXZlc1BvaW50cywKLSAgICBkcmF3UHJpbWl0aXZlc0xpbmVzLAotICAgIGRyYXdQcmltaXRpdmVzTGluZUxvb3AsCi0gICAgZHJhd1ByaW1pdGl2ZXNMaW5lU3RyaXAsCi0gICAgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZXMsCi0gICAgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZVN0cmlwLAotICAgIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVGYW4KLX07Ci0KLXR5cGVkZWYgdm9pZCAoKmVsZW1lbnRzX3ByaW1zX2ZjdF90KShvZ2xlc19jb250ZXh0X3QqLCBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKLXN0YXRpYyBjb25zdCBlbGVtZW50c19wcmltc19mY3RfdCBkcmF3RWxlbWVudHNQcmltc1tdID0gewotICAgIGRyYXdJbmRleGVkUHJpbWl0aXZlc1BvaW50cywKLSAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lcywKLSAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lTG9vcCwKLSAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lU3RyaXAsCi0gICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzVHJpYW5nbGVzLAotICAgIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlU3RyaXAsCi0gICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzVHJpYW5nbGVGYW4KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCi0KLXZvaWQgb2dsZXNfaW5pdF9hcnJheShvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgYy0+YXJyYXlzLnZlcnRleC5zaXplID0gNDsKLSAgICBjLT5hcnJheXMudmVydGV4LnR5cGUgPSBHTF9GTE9BVDsKLSAgICBjLT5hcnJheXMuY29sb3Iuc2l6ZSA9IDQ7Ci0gICAgYy0+YXJyYXlzLmNvbG9yLnR5cGUgPSBHTF9GTE9BVDsKLSAgICBjLT5hcnJheXMubm9ybWFsLnNpemUgPSA0OwotICAgIGMtPmFycmF5cy5ub3JtYWwudHlwZSA9IEdMX0ZMT0FUOwotICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBjLT5hcnJheXMudGV4dHVyZVtpXS5zaXplID0gNDsKLSAgICAgICAgYy0+YXJyYXlzLnRleHR1cmVbaV0udHlwZSA9IEdMX0ZMT0FUOwotICAgIH0KLSAgICBjLT52Yy5pbml0KCk7Ci0KLSAgICBpZiAoIWMtPnZjLnZCdWZmZXIpIHsKLSAgICAgICAgLy8gdGhpcyBjb3VsZCBoYXZlIGZhaWxlZAotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9PVVRfT0ZfTUVNT1JZKTsKLSAgICB9Ci19Ci0KLXZvaWQgb2dsZXNfdW5pbml0X2FycmF5KG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBjLT52Yy51bmluaXQoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgQXJyYXkgZmV0Y2hlcnMKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBjdXJyZW50Q29sb3Iob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkKiB2LCBjb25zdCBHTHZvaWQqKSB7Ci0gICAgbWVtY3B5KHYsIGMtPmN1cnJlbnQuY29sb3Iudiwgc2l6ZW9mKHZlYzRfdCkpOwotfQotc3RhdGljIHZvaWQgY3VycmVudENvbG9yX2NsYW1wKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCogdiwgY29uc3QgR0x2b2lkKikgewotICAgIG1lbWNweSh2LCBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLnYsIHNpemVvZih2ZWM0X3QpKTsKLX0KLXN0YXRpYyB2b2lkIGN1cnJlbnROb3JtYWwob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkKiB2LCBjb25zdCBHTHZvaWQqKSB7Ci0gICAgbWVtY3B5KHYsIGMtPmN1cnJlbnROb3JtYWwudiwgc2l6ZW9mKHZlYzNfdCkpOwotfQotc3RhdGljIHZvaWQgY3VycmVudFRleENvb3JkKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCogdiwgY29uc3QgR0x2b2lkKikgewotICAgIG1lbWNweSh2LCBjLT5jdXJyZW50LnRleHR1cmVbYy0+YXJyYXlzLnRtdV0udiwgc2l6ZW9mKHZlYzRfdCkpOwotfQotCi0KLXN0YXRpYyB2b2lkIGZldGNoTm9wKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqLCBjb25zdCBHTHZvaWQqKSB7Ci19Ci1zdGF0aWMgdm9pZCBmZXRjaDJiKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMYnl0ZSogcCkgewotICAgIHZbMF0gPSBnZ2xJbnRUb0ZpeGVkKHBbMF0pOwotICAgIHZbMV0gPSBnZ2xJbnRUb0ZpeGVkKHBbMV0pOwotfQotc3RhdGljIHZvaWQgZmV0Y2gycyhvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTHNob3J0KiBwKSB7Ci0gICAgdlswXSA9IGdnbEludFRvRml4ZWQocFswXSk7Ci0gICAgdlsxXSA9IGdnbEludFRvRml4ZWQocFsxXSk7Ci19Ci1zdGF0aWMgdm9pZCBmZXRjaDJ4KG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZml4ZWQqIHApIHsKLSAgICBtZW1jcHkodiwgcCwgMipzaXplb2YoR0xmaXhlZCkpOwotfQotc3RhdGljIHZvaWQgZmV0Y2gyZihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZsb2F0KiBwKSB7Ci0gICAgdlswXSA9IGdnbEZsb2F0VG9GaXhlZChwWzBdKTsKLSAgICB2WzFdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbMV0pOwotfQotc3RhdGljIHZvaWQgZmV0Y2gzYihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGJ5dGUqIHApIHsKLSAgICB2WzBdID0gZ2dsSW50VG9GaXhlZChwWzBdKTsKLSAgICB2WzFdID0gZ2dsSW50VG9GaXhlZChwWzFdKTsKLSAgICB2WzJdID0gZ2dsSW50VG9GaXhlZChwWzJdKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoM3Mob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xzaG9ydCogcCkgewotICAgIHZbMF0gPSBnZ2xJbnRUb0ZpeGVkKHBbMF0pOwotICAgIHZbMV0gPSBnZ2xJbnRUb0ZpeGVkKHBbMV0pOwotICAgIHZbMl0gPSBnZ2xJbnRUb0ZpeGVkKHBbMl0pOwotfQotc3RhdGljIHZvaWQgZmV0Y2gzeChvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZpeGVkKiBwKSB7Ci0gICAgbWVtY3B5KHYsIHAsIDMqc2l6ZW9mKEdMZml4ZWQpKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoM2Yob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmbG9hdCogcCkgewotICAgIHZbMF0gPSBnZ2xGbG9hdFRvRml4ZWQocFswXSk7Ci0gICAgdlsxXSA9IGdnbEZsb2F0VG9GaXhlZChwWzFdKTsKLSAgICB2WzJdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbMl0pOwotfQotc3RhdGljIHZvaWQgZmV0Y2g0YihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGJ5dGUqIHApIHsKLSAgICB2WzBdID0gZ2dsSW50VG9GaXhlZChwWzBdKTsKLSAgICB2WzFdID0gZ2dsSW50VG9GaXhlZChwWzFdKTsKLSAgICB2WzJdID0gZ2dsSW50VG9GaXhlZChwWzJdKTsKLSAgICB2WzNdID0gZ2dsSW50VG9GaXhlZChwWzNdKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoNHMob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xzaG9ydCogcCkgewotICAgIHZbMF0gPSBnZ2xJbnRUb0ZpeGVkKHBbMF0pOwotICAgIHZbMV0gPSBnZ2xJbnRUb0ZpeGVkKHBbMV0pOwotICAgIHZbMl0gPSBnZ2xJbnRUb0ZpeGVkKHBbMl0pOwotICAgIHZbM10gPSBnZ2xJbnRUb0ZpeGVkKHBbM10pOwotfQotc3RhdGljIHZvaWQgZmV0Y2g0eChvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZpeGVkKiBwKSB7Ci0gICAgbWVtY3B5KHYsIHAsIDQqc2l6ZW9mKEdMZml4ZWQpKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoNGYob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmbG9hdCogcCkgewotICAgIHZbMF0gPSBnZ2xGbG9hdFRvRml4ZWQocFswXSk7Ci0gICAgdlsxXSA9IGdnbEZsb2F0VG9GaXhlZChwWzFdKTsKLSAgICB2WzJdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbMl0pOwotICAgIHZbM10gPSBnZ2xGbG9hdFRvRml4ZWQocFszXSk7Ci19Ci1zdGF0aWMgdm9pZCBmZXRjaEV4cGFuZDR1YihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTHVieXRlKiBwKSB7Ci0gICAgdlswXSA9IEdHTF9VQl9UT19YKHBbMF0pOwotICAgIHZbMV0gPSBHR0xfVUJfVE9fWChwWzFdKTsKLSAgICB2WzJdID0gR0dMX1VCX1RPX1gocFsyXSk7Ci0gICAgdlszXSA9IEdHTF9VQl9UT19YKHBbM10pOwotfQotc3RhdGljIHZvaWQgZmV0Y2hDbGFtcDR4KG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZml4ZWQqIHApIHsKLSAgICB2WzBdID0gZ2dsQ2xhbXB4KHBbMF0pOwotICAgIHZbMV0gPSBnZ2xDbGFtcHgocFsxXSk7Ci0gICAgdlsyXSA9IGdnbENsYW1weChwWzJdKTsKLSAgICB2WzNdID0gZ2dsQ2xhbXB4KHBbM10pOwotfQotc3RhdGljIHZvaWQgZmV0Y2hDbGFtcDRmKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZmxvYXQqIHApIHsKLSAgICB2WzBdID0gZ2dsQ2xhbXB4KGdnbEZsb2F0VG9GaXhlZChwWzBdKSk7Ci0gICAgdlsxXSA9IGdnbENsYW1weChnZ2xGbG9hdFRvRml4ZWQocFsxXSkpOwotICAgIHZbMl0gPSBnZ2xDbGFtcHgoZ2dsRmxvYXRUb0ZpeGVkKHBbMl0pKTsKLSAgICB2WzNdID0gZ2dsQ2xhbXB4KGdnbEZsb2F0VG9GaXhlZChwWzNdKSk7Ci19Ci1zdGF0aWMgdm9pZCBmZXRjaEV4cGFuZDN1YihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTHVieXRlKiBwKSB7Ci0gICAgdlswXSA9IEdHTF9VQl9UT19YKHBbMF0pOwotICAgIHZbMV0gPSBHR0xfVUJfVE9fWChwWzFdKTsKLSAgICB2WzJdID0gR0dMX1VCX1RPX1gocFsyXSk7Ci0gICAgdlszXSA9IDB4MTAwMDA7Ci19Ci1zdGF0aWMgdm9pZCBmZXRjaENsYW1wM3gob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmaXhlZCogcCkgewotICAgIHZbMF0gPSBnZ2xDbGFtcHgocFswXSk7Ci0gICAgdlsxXSA9IGdnbENsYW1weChwWzFdKTsKLSAgICB2WzJdID0gZ2dsQ2xhbXB4KHBbMl0pOwotICAgIHZbM10gPSAweDEwMDAwOwotfQotc3RhdGljIHZvaWQgZmV0Y2hDbGFtcDNmKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZmxvYXQqIHApIHsKLSAgICB2WzBdID0gZ2dsQ2xhbXB4KGdnbEZsb2F0VG9GaXhlZChwWzBdKSk7Ci0gICAgdlsxXSA9IGdnbENsYW1weChnZ2xGbG9hdFRvRml4ZWQocFsxXSkpOwotICAgIHZbMl0gPSBnZ2xDbGFtcHgoZ2dsRmxvYXRUb0ZpeGVkKHBbMl0pKTsKLSAgICB2WzNdID0gMHgxMDAwMDsKLX0KLXN0YXRpYyB2b2lkIGZldGNoRXhwYW5kM2Iob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xieXRlKiBwKSB7Ci0gICAgdlswXSA9IEdHTF9CX1RPX1gocFswXSk7Ci0gICAgdlsxXSA9IEdHTF9CX1RPX1gocFsxXSk7Ci0gICAgdlsyXSA9IEdHTF9CX1RPX1gocFsyXSk7Ci19Ci1zdGF0aWMgdm9pZCBmZXRjaEV4cGFuZDNzKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMc2hvcnQqIHApIHsKLSAgICB2WzBdID0gR0dMX1NfVE9fWChwWzBdKTsKLSAgICB2WzFdID0gR0dMX1NfVE9fWChwWzFdKTsKLSAgICB2WzJdID0gR0dMX1NfVE9fWChwWzJdKTsKLX0KLQotdHlwZWRlZiBhcnJheV90OjpmZXRjaGVyX3QgZm5fdDsKLQotc3RhdGljIGNvbnN0IGZuX3QgY29sb3JfZmN0WzJdWzE2XSA9IHsgLy8gc2l6ZT17Myw0fSwgdHlwZT17dWIsZix4fQotICAgIHsgMCwgKGZuX3QpZmV0Y2hFeHBhbmQzdWIsIDAsIDAsIDAsIDAsCi0gICAgICAgICAoZm5fdClmZXRjaDNmLCAwLCAwLCAwLCAwLCAwLAotICAgICAgICAgKGZuX3QpZmV0Y2gzeCB9LAotICAgIHsgMCwgKGZuX3QpZmV0Y2hFeHBhbmQ0dWIsIDAsIDAsIDAsIDAsCi0gICAgICAgICAoZm5fdClmZXRjaDRmLCAwLCAwLCAwLCAwLCAwLAotICAgICAgICAgKGZuX3QpZmV0Y2g0eCB9LAotfTsKLXN0YXRpYyBjb25zdCBmbl90IGNvbG9yX2NsYW1wX2ZjdFsyXVsxNl0gPSB7IC8vIHNpemU9ezMsNH0sIHR5cGU9e3ViLGYseH0KLSAgICB7IDAsIChmbl90KWZldGNoRXhwYW5kM3ViLCAwLCAwLCAwLCAwLAotICAgICAgICAgKGZuX3QpZmV0Y2hDbGFtcDNmLCAwLCAwLCAwLCAwLCAwLAotICAgICAgICAgKGZuX3QpZmV0Y2hDbGFtcDN4IH0sCi0gICAgeyAwLCAoZm5fdClmZXRjaEV4cGFuZDR1YiwgMCwgMCwgMCwgMCwKLSAgICAgICAgIChmbl90KWZldGNoQ2xhbXA0ZiwgMCwgMCwgMCwgMCwgMCwKLSAgICAgICAgIChmbl90KWZldGNoQ2xhbXA0eCB9LAotfTsKLXN0YXRpYyBjb25zdCBmbl90IG5vcm1hbF9mY3RbMV1bMTZdID0geyAvLyBzaXplPXszfSwgdHlwZT17YixzLGYseH0KLSAgICB7IChmbl90KWZldGNoRXhwYW5kM2IsIDAsCi0gICAgICAoZm5fdClmZXRjaEV4cGFuZDNzLCAwLCAwLCAwLAotICAgICAgKGZuX3QpZmV0Y2gzZiwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIChmbl90KWZldGNoM3ggfSwKLX07Ci1zdGF0aWMgY29uc3QgZm5fdCB2ZXJ0ZXhfZmN0WzNdWzE2XSA9IHsgLy8gc2l6ZT17MiwzLDR9LCB0eXBlPXtiLHMsZix4fQotICAgIHsgKGZuX3QpZmV0Y2gyYiwgMCwKLSAgICAgIChmbl90KWZldGNoMnMsIDAsIDAsIDAsCi0gICAgICAoZm5fdClmZXRjaDJmLCAwLCAwLCAwLCAwLCAwLAotICAgICAgKGZuX3QpZmV0Y2gzeCB9LAotICAgIHsgKGZuX3QpZmV0Y2gzYiwgMCwKLSAgICAgIChmbl90KWZldGNoM3MsIDAsIDAsIDAsCi0gICAgICAoZm5fdClmZXRjaDNmLCAwLCAwLCAwLCAwLCAwLAotICAgICAgKGZuX3QpZmV0Y2gzeCB9LAotICAgIHsgKGZuX3QpZmV0Y2g0YiwgMCwKLSAgICAgIChmbl90KWZldGNoNHMsIDAsIDAsIDAsCi0gICAgICAoZm5fdClmZXRjaDRmLCAwLCAwLCAwLCAwLCAwLAotICAgICAgKGZuX3QpZmV0Y2g0eCB9Ci19Owotc3RhdGljIGNvbnN0IGZuX3QgdGV4dHVyZV9mY3RbM11bMTZdID0geyAvLyBzaXplPXsyLDMsNH0sIHR5cGU9e2IscyxmLHh9Ci0gICAgeyAoZm5fdClmZXRjaDJiLCAwLAotICAgICAgKGZuX3QpZmV0Y2gycywgMCwgMCwgMCwKLSAgICAgIChmbl90KWZldGNoMmYsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAoZm5fdClmZXRjaDJ4IH0sCi0gICAgeyAoZm5fdClmZXRjaDNiLCAwLAotICAgICAgKGZuX3QpZmV0Y2gzcywgMCwgMCwgMCwKLSAgICAgIChmbl90KWZldGNoM2YsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAoZm5fdClmZXRjaDN4IH0sCi0gICAgeyAoZm5fdClmZXRjaDRiLCAwLAotICAgICAgKGZuX3QpZmV0Y2g0cywgMCwgMCwgMCwKLSAgICAgIChmbl90KWZldGNoNGYsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAoZm5fdClmZXRjaDR4IH0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIGFycmF5X3QKLSNlbmRpZgotCi12b2lkIGFycmF5X3Q6OmluaXQoCi0gICAgICAgIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKLSAgICAgICAgY29uc3QgR0x2b2lkICpwb2ludGVyLCBjb25zdCBidWZmZXJfdCogYm8sIEdMc2l6ZWkgY291bnQpCi17Ci0gICAgaWYgKCFzdHJpZGUpIHsKLSAgICAgICAgc3RyaWRlID0gc2l6ZTsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgR0xfU0hPUlQ6Ci0gICAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgICAgICBzdHJpZGUgKj0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdMX0ZMT0FUOgotICAgICAgICBjYXNlIEdMX0ZJWEVEOgotICAgICAgICAgICAgc3RyaWRlICo9IDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICB0aGlzLT5zaXplID0gc2l6ZTsKLSAgICB0aGlzLT50eXBlID0gdHlwZTsKLSAgICB0aGlzLT5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgdGhpcy0+cG9pbnRlciA9IHBvaW50ZXI7Ci0gICAgdGhpcy0+Ym8gPSBibzsKLSAgICB0aGlzLT5ib3VuZHMgPSBjb3VudDsKLX0KLQotaW5saW5lIHZvaWQgYXJyYXlfdDo6cmVzb2x2ZSgpCi17Ci0gICAgcGh5c2ljYWxfcG9pbnRlciA9IChibykgPyAoYm8tPmRhdGEgKyB1aW50cHRyX3QocG9pbnRlcikpIDogcG9pbnRlcjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgdmVydGV4X2NhY2hlX3QKLSNlbmRpZgotCi12b2lkIHZlcnRleF9jYWNoZV90Ojppbml0KCkKLXsKLSAgICAvLyBtYWtlIHN1cmUgdGhlIHNpemUgb2YgdmVydGV4X3QgYWxsb3dzIGNhY2hlLWxpbmUgYWxpZ25tZW50Ci0gICAgQ1RBPChzaXplb2YodmVydGV4X3QpICYgMHgxRikgPT0gMD4gYXNzZXJ0QWxpZ25lZFNpemU7Ci0KLSAgICBjb25zdCBpbnQgYWxpZ24gPSAzMjsKLSAgICBjb25zdCBzaXplX3QgcyA9IFZFUlRFWF9CVUZGRVJfU0laRSArIFZFUlRFWF9DQUNIRV9TSVpFOwotICAgIGNvbnN0IHNpemVfdCBzaXplID0gcypzaXplb2YodmVydGV4X3QpICsgYWxpZ247Ci0gICAgYmFzZSA9IG1hbGxvYyhzaXplKTsKLSAgICBpZiAoYmFzZSkgewotICAgICAgICBtZW1zZXQoYmFzZSwgMCwgc2l6ZSk7Ci0gICAgICAgIHZCdWZmZXIgPSAodmVydGV4X3QqKSgoc2l6ZV90KGJhc2UpICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24tMSkpOwotICAgICAgICB2Q2FjaGUgPSB2QnVmZmVyICsgVkVSVEVYX0JVRkZFUl9TSVpFOwotICAgICAgICBzZXF1ZW5jZSA9IDA7Ci0gICAgfQotfQotCi12b2lkIHZlcnRleF9jYWNoZV90Ojp1bmluaXQoKQotewotICAgIGZyZWUoYmFzZSk7Ci0gICAgYmFzZSA9IHZCdWZmZXIgPSB2Q2FjaGUgPSAwOwotfQotCi12b2lkIHZlcnRleF9jYWNoZV90OjpjbGVhcigpCi17Ci0jaWYgVkNfQ0FDSEVfU1RBVElTVElDUwotICAgIHN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICB0b3RhbCA9IDA7Ci0gICAgbWlzc2VzID0gMDsKLSNlbmRpZgotCi0jaWYgVkNfQ0FDSEVfVFlQRSA9PSBWQ19DQUNIRV9UWVBFX0xSVQotICAgIHZlcnRleF90KiB2ID0gdkJ1ZmZlcjsKLSAgICBzaXplX3QgY291bnQgPSBWRVJURVhfQlVGRkVSX1NJWkUgKyBWRVJURVhfQ0FDSEVfU0laRTsKLSAgICBkbyB7Ci0gICAgICAgIHYtPm1ydSA9IDA7Ci0gICAgICAgIHYrKzsKLSAgICB9IHdoaWxlICgtLWNvdW50KTsKLSNlbmRpZgotCi0gICAgc2VxdWVuY2UgKz0gSU5ERVhfU0VROwotICAgIGlmIChzZXF1ZW5jZSA+PSAweDgwMDAwMDAwTFUpIHsKLSAgICAgICAgc2VxdWVuY2UgPSBJTkRFWF9TRVE7Ci0gICAgICAgIHZlcnRleF90KiB2ID0gdkJ1ZmZlcjsKLSAgICAgICAgc2l6ZV90IGNvdW50ID0gVkVSVEVYX0JVRkZFUl9TSVpFICsgVkVSVEVYX0NBQ0hFX1NJWkU7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHYtPmluZGV4ID0gMDsKLSAgICAgICAgICAgIHYrKzsKLSAgICAgICAgfSB3aGlsZSAoLS1jb3VudCk7Ci0gICAgfQotfQotCi12b2lkIHZlcnRleF9jYWNoZV90OjpkdW1wX3N0YXRzKEdMZW51bSBtb2RlKQotewotI2lmIFZDX0NBQ0hFX1NUQVRJU1RJQ1MKLSAgICBuc2Vjc190IHRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCkgLSBzdGFydFRpbWU7Ci0gICAgdWludDMyX3QgaGl0cyA9IHRvdGFsIC0gbWlzc2VzOwotICAgIHVpbnQzMl90IHByaW1fY291bnQ7Ci0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgY2FzZSBHTF9QT0lOVFM6ICAgICAgICAgICAgIHByaW1fY291bnQgPSB0b3RhbDsgICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0xJTkVfU1RSSVA6ICAgICAgICAgcHJpbV9jb3VudCA9IHRvdGFsIC0gMTsgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfTElORV9MT09QOiAgICAgICAgICBwcmltX2NvdW50ID0gdG90YWwgLSAxOyAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9MSU5FUzogICAgICAgICAgICAgIHByaW1fY291bnQgPSB0b3RhbCAvIDI7ICAgICBicmVhazsKLSAgICBjYXNlIEdMX1RSSUFOR0xFX1NUUklQOiAgICAgcHJpbV9jb3VudCA9IHRvdGFsIC0gMjsgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfVFJJQU5HTEVfRkFOOiAgICAgICBwcmltX2NvdW50ID0gdG90YWwgLSAyOyAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9UUklBTkdMRVM6ICAgICAgICAgIHByaW1fY291bnQgPSB0b3RhbCAvIDM7ICAgICBicmVhazsKLSAgICBkZWZhdWx0OiAgICByZXR1cm47Ci0gICAgfQotICAgIHByaW50ZiggInRvdGFsPSU1dSwgaGl0cz0lNXUsIG1pc3M9JTV1LCBoaXRyYXRlPSUzdSUlLCIKLSAgICAgICAgICAgICIgcHJpbXM9JTV1LCB0aW1lPSU2dSB1cywgcHJpbXMvcz0lZCwgdi90PSVmXG4iLAotICAgICAgICAgICAgdG90YWwsIGhpdHMsIG1pc3NlcywgKGhpdHMqMTAwKS90b3RhbCwKLSAgICAgICAgICAgIHByaW1fY291bnQsIGludChuczJ1cyh0aW1lKSksIGludChwcmltX2NvdW50KmZsb2F0KHNlY29uZHMoMSkpL3RpbWUpLAotICAgICAgICAgICAgZmxvYXQobWlzc2VzKSAvIHByaW1fY291bnQpOwotI2VuZGlmCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCi0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi12b2lkIGVuYWJsZURpc2FibGVDbGllbnRTdGF0ZShvZ2xlc19jb250ZXh0X3QqIGMsIEdMZW51bSBhcnJheSwgYm9vbCBlbmFibGUpCi17Ci0gICAgY29uc3QgaW50IHRtdSA9IGMtPmFycmF5cy5hY3RpdmVUZXh0dXJlOwotICAgIGFycmF5X3QqIGE7Ci0gICAgc3dpdGNoIChhcnJheSkgewotICAgIGNhc2UgR0xfQ09MT1JfQVJSQVk6ICAgICAgICAgICAgYSA9ICZjLT5hcnJheXMuY29sb3I7ICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX05PUk1BTF9BUlJBWTogICAgICAgICAgIGEgPSAmYy0+YXJyYXlzLm5vcm1hbDsgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZOiAgICBhID0gJmMtPmFycmF5cy50ZXh0dXJlW3RtdV07ICAgIGJyZWFrOwotICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZOiAgICAgICAgICAgYSA9ICZjLT5hcnJheXMudmVydGV4OyAgICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGEtPmVuYWJsZSA9IGVuYWJsZSA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgVmVydGV4IENhY2hlCi0jZW5kaWYKLQotc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKLXZlcnRleF90KiBjYWNoZV92ZXJ0ZXgob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdiwgdWludDMyX3QgaW5kZXgpCi17Ci0gICAgI2lmIFZDX0NBQ0hFX1NUQVRJU1RJQ1MKLSAgICAgICAgYy0+dmMubWlzc2VzKys7Ci0gICAgI2VuZGlmCi0gICAgaWYgKGdnbF91bmxpa2VseSh2LT5sb2NrZWQpKSB7Ci0gICAgICAgIC8vIHdlJ3JlIGp1c3QgbG9va2luZyBmb3IgYW4gZW50cnkgaW4gdGhlIGNhY2hlIHRoYXQgaXMgbm90IGxvY2tlZC4KLSAgICAgICAgLy8gYW5kIHdlIGtub3cgdGhhdCB0aGVyZSBjYW5ub3QgYmUgbW9yZSB0aGFuIDIgbG9ja2VkIGVudHJpZXMKLSAgICAgICAgLy8gYmVjYXVzZSBhIHRyaWFuZ2xlIG5lZWRzIGF0IG1vc3QgMyB2ZXJ0aWNlcy4KLSAgICAgICAgLy8gV2UgbmV2ZXIgdXNlIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGVudHJpZXMgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIGluCi0gICAgICAgIC8vIHVzZSBieSB0aGUgc3RyaXBlciBvciBmYW5lci4gQW55IG90aGVyIGVudHJ5IHdpbGwgZG8gYXMgbG9uZyBhcwotICAgICAgICAvLyBpdCdzIG5vdCBsb2NrZWQuCi0gICAgICAgIC8vIFdlIGNvbXB1dGUgZGlyZWN0bHkgdGhlIGluZGV4IG9mIGEgImZyZWUiIGVudHJ5IGZyb20gdGhlIGxvY2tlZAotICAgICAgICAvLyBzdGF0ZSBvZiB2WzJdIGFuZCB2WzNdLgotICAgICAgICB2ID0gYy0+dmMudkJ1ZmZlciArIDI7Ci0gICAgICAgIHYgKz0gdlswXS5sb2NrZWQgfCAodlsxXS5sb2NrZWQ8PDEpOwotICAgIH0KLSAgICAvLyBub3RlOiBjb21waWxlRWxlbWVudCBjbGVhcnMgdi0+ZmxhZ3MKLSAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQoYywgdiwgaW5kZXgpOwotICAgIHYtPmxvY2tlZCA9IDE7Ci0gICAgcmV0dXJuIHY7Ci19Ci0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi12ZXJ0ZXhfdCogZmV0Y2hfdmVydGV4KG9nbGVzX2NvbnRleHRfdCogYywgc2l6ZV90IGluZGV4KQotewotICAgIGluZGV4IHw9IGMtPnZjLnNlcXVlbmNlOwotCi0jaWYgVkNfQ0FDSEVfVFlQRSA9PSBWQ19DQUNIRV9UWVBFX0lOREVYRUQKLQotICAgIHZlcnRleF90KiBjb25zdCB2ID0gYy0+dmMudkNhY2hlICsKLSAgICAgICAgICAgIChpbmRleCAmICh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0NBQ0hFX1NJWkUtMSkpOwotCi0gICAgaWYgKGdnbF9saWtlbHkodi0+aW5kZXggPT0gaW5kZXgpKSB7Ci0gICAgICAgIHYtPmxvY2tlZCA9IDE7Ci0gICAgICAgIHJldHVybiB2OwotICAgIH0KLSAgICByZXR1cm4gY2FjaGVfdmVydGV4KGMsIHYsIGluZGV4KTsKLQotI2VsaWYgVkNfQ0FDSEVfVFlQRSA9PSBWQ19DQUNIRV9UWVBFX0xSVQotCi0gICAgdmVydGV4X3QqIHYgPSBjLT52Yy52Q2FjaGUgKwotICAgICAgICAgICAgKGluZGV4ICYgKCh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0NBQ0hFX1NJWkUtMSk+PjEpKSoyOwotCi0gICAgLy8gYWx3YXlzIHJlY29yZCBMUlUgaW4gdlswXQotICAgIGlmIChnZ2xfbGlrZWx5KHZbMF0uaW5kZXggPT0gaW5kZXgpKSB7Ci0gICAgICAgIHZbMF0ubG9ja2VkID0gMTsKLSAgICAgICAgdlswXS5tcnUgPSAwOwotICAgICAgICByZXR1cm4gJnZbMF07Ci0gICAgfQotCi0gICAgaWYgKGdnbF9saWtlbHkodlsxXS5pbmRleCA9PSBpbmRleCkpIHsKLSAgICAgICAgdlsxXS5sb2NrZWQgPSAxOwotICAgICAgICB2WzBdLm1ydSA9IDE7Ci0gICAgICAgIHJldHVybiAmdlsxXTsKLSAgICB9Ci0KLSAgICBjb25zdCBpbnQgbHJ1ID0gMSAtIHZbMF0ubXJ1OwotICAgIHZbMF0ubXJ1ID0gbHJ1OwotICAgIHJldHVybiBjYWNoZV92ZXJ0ZXgoYywgJnZbbHJ1XSwgaW5kZXgpOwotCi0jZWxpZiBWQ19DQUNIRV9UWVBFID09IFZDX0NBQ0hFX1RZUEVfTk9ORQotCi0gICAgLy8ganVzdCBmb3IgZGVidWdnaW5nLi4uCi0gICAgdmVydGV4X3QqIHYgPSBjLT52Yy52QnVmZmVyICsgMjsKLSAgICByZXR1cm4gY2FjaGVfdmVydGV4KGMsIHYsIGluZGV4KTsKLQotI2VuZGlmCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIFByaW1pdGl2ZSBBc3NlbWJseQotI2VuZGlmCi0KLXZvaWQgZHJhd1ByaW1pdGl2ZXNQb2ludHMob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKLXsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIHZlcnRleCBjYWNoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMQotICAgIGNvbnN0IEdMc2l6ZWkgdmNzID0KLSAgICAgICAgICAgICh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0JVRkZFUl9TSVpFICsKLSAgICAgICAgICAgICB2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0NBQ0hFX1NJWkUpOwotICAgIGRvIHsKLSAgICAgICAgdmVydGV4X3QqIHYgPSBjLT52Yy52QnVmZmVyOwotICAgICAgICBHTHNpemVpIG51bSA9IGNvdW50ID4gdmNzID8gdmNzIDogY291bnQ7Ci0gICAgICAgIGMtPmFycmF5cy5jdWxsID0gdmVydGV4X3Q6OkNMSVBfQUxMOwotICAgICAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnRzKGMsIHYsIGZpcnN0LCBudW0pOwotICAgICAgICBmaXJzdCArPSBudW07Ci0gICAgICAgIGNvdW50IC09IG51bTsKLSAgICAgICAgaWYgKCFjLT5hcnJheXMuY3VsbCkgewotICAgICAgICAgICAgLy8gcXVpY2svdHJpdmlhbCByZWplY3Qgb2YgdGhlIHdob2xlIGJhdGNoCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2MgPSB2WzBdLmZsYWdzOwotICAgICAgICAgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyUG9pbnQoYywgdik7Ci0gICAgICAgICAgICAgICAgdisrOwotICAgICAgICAgICAgICAgIG51bS0tOwotICAgICAgICAgICAgfSB3aGlsZSAobnVtKTsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGNvdW50KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIGRyYXdQcmltaXRpdmVzTGluZVN0cmlwKG9nbGVzX2NvbnRleHRfdCogYywgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpCi17Ci0gICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDIpKQotICAgICAgICByZXR1cm47Ci0KLSAgICB2ZXJ0ZXhfdCAqdiwgKnYwLCAqdjE7Ci0gICAgYy0+YXJyYXlzLmN1bGwgPSB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7Ci0gICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIGMtPnZjLnZCdWZmZXIsIGZpcnN0KTsKLSAgICBmaXJzdCArPSAxOwotICAgIGNvdW50IC09IDE7Ci0KLSAgICAvLyB2ZXJ0ZXggY2FjaGUgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIDEKLSAgICBjb25zdCBHTHNpemVpIHZjcyA9Ci0gICAgICAgICh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0JVRkZFUl9TSVpFICsKLSAgICAgICAgIHZlcnRleF9jYWNoZV90OjpWRVJURVhfQ0FDSEVfU0laRSAtIDEpOwotICAgIGRvIHsKLSAgICAgICAgdjAgPSBjLT52Yy52QnVmZmVyICsgMDsKLSAgICAgICAgdiAgPSBjLT52Yy52QnVmZmVyICsgMTsKLSAgICAgICAgR0xzaXplaSBudW0gPSBjb3VudCA+IHZjcyA/IHZjcyA6IGNvdW50OwotICAgICAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnRzKGMsIHYsIGZpcnN0LCBudW0pOwotICAgICAgICBmaXJzdCArPSBudW07Ci0gICAgICAgIGNvdW50IC09IG51bTsKLSAgICAgICAgaWYgKCFjLT5hcnJheXMuY3VsbCkgewotICAgICAgICAgICAgLy8gcXVpY2svdHJpdmlhbCByZWplY3Qgb2YgdGhlIHdob2xlIGJhdGNoCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgdjEgPSB2Kys7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2MgPSB2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3M7Ci0gICAgICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQotICAgICAgICAgICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lKGMsIHYwLCB2MSk7Ci0gICAgICAgICAgICAgICAgdjAgPSB2MTsKLSAgICAgICAgICAgICAgICBudW0tLTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG51bSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY29weSBiYWNrIHRoZSBsYXN0IHByb2Nlc3NlZCB2ZXJ0ZXgKLSAgICAgICAgYy0+dmMudkJ1ZmZlclswXSA9ICp2MDsKLSAgICAgICAgYy0+YXJyYXlzLmN1bGwgPSB2MC0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7Ci0gICAgfSB3aGlsZSAoY291bnQpOwotfQotCi12b2lkIGRyYXdQcmltaXRpdmVzTGluZUxvb3Aob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKLXsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMikpCi0gICAgICAgIHJldHVybjsKLSAgICBkcmF3UHJpbWl0aXZlc0xpbmVTdHJpcChjLCBmaXJzdCwgY291bnQpOwotICAgIGlmIChnZ2xfbGlrZWx5KGNvdW50ID49IDMpKSB7Ci0gICAgICAgIHZlcnRleF90KiB2MCA9IGMtPnZjLnZCdWZmZXI7Ci0gICAgICAgIHZlcnRleF90KiB2MSA9IGMtPnZjLnZCdWZmZXIgKyAxOwotICAgICAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQoYywgdjEsIGZpcnN0KTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgY2MgPSB2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3M7Ci0gICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUoYywgdjAsIHYxKTsKLSAgICB9Ci19Ci0KLXZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lcyhvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQotewotICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAyKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gdmVydGV4IGNhY2hlIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiAyCi0gICAgY29uc3QgR0xzaXplaSB2Y3MgPQotICAgICAgICAoKHZlcnRleF9jYWNoZV90OjpWRVJURVhfQlVGRkVSX1NJWkUgKwotICAgICAgICB2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0NBQ0hFX1NJWkUpIC8gMikgKiAyOwotICAgIGRvIHsKLSAgICAgICAgdmVydGV4X3QqIHYgPSBjLT52Yy52QnVmZmVyOwotICAgICAgICBHTHNpemVpIG51bSA9IGNvdW50ID4gdmNzID8gdmNzIDogY291bnQ7Ci0gICAgICAgIGMtPmFycmF5cy5jdWxsID0gdmVydGV4X3Q6OkNMSVBfQUxMOwotICAgICAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnRzKGMsIHYsIGZpcnN0LCBudW0pOwotICAgICAgICBmaXJzdCArPSBudW07Ci0gICAgICAgIGNvdW50IC09IG51bTsKLSAgICAgICAgaWYgKCFjLT5hcnJheXMuY3VsbCkgewotICAgICAgICAgICAgLy8gcXVpY2svdHJpdmlhbCByZWplY3Qgb2YgdGhlIHdob2xlIGJhdGNoCi0gICAgICAgICAgICBudW0gLT0gMjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHZbMF0uZmxhZ3MgJiB2WzFdLmZsYWdzOwotICAgICAgICAgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyTGluZShjLCB2LCB2KzEpOwotICAgICAgICAgICAgICAgIHYgKz0gMjsKLSAgICAgICAgICAgICAgICBudW0gLT0gMjsKLSAgICAgICAgICAgIH0gd2hpbGUgKG51bSA+PSAwKTsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGNvdW50ID49IDIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVGYW5PclN0cmlwKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIGludCB3aW5kaW5nKQotewotICAgIC8vIHdpbmRpbmcgPT0gMiA6IGZhbgotICAgIC8vIHdpbmRpbmcgPT0gMSA6IHN0cmlwCi0KLSAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMykpCi0gICAgICAgIHJldHVybjsKLQotICAgIHZlcnRleF90ICp2LCAqdjAsICp2MSwgKnYyOwotICAgIGMtPmFycmF5cy5jdWxsID0gdmVydGV4X3Q6OkNMSVBfQUxMOwotICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudHMoYywgYy0+dmMudkJ1ZmZlciwgZmlyc3QsIDIpOwotICAgIGZpcnN0ICs9IDI7Ci0gICAgY291bnQgLT0gMjsKLQotICAgIC8vIHZlcnRleCBjYWNoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMi4gVGhpcyBpcyBleHRyZW1lbHkgaW1wb3J0YW50Ci0gICAgLy8gYmVjYXVzZSBpdCBhbGxvd3MgdXMgdG8gcHJlc2VydmUgdGhlIHNhbWUgd2luZGluZyB3aGVuIHRoZSB3aG9sZQotICAgIC8vIGJhdGNoIGlzIGN1bGxlZC4gV2UgYWxzbyBuZWVkIDIgZXh0cmEgdmVydGljZXMgaW4gdGhlIGFycmF5LCBiZWNhdXNlCi0gICAgLy8gd2UgYWx3YXlzIGtlZXAgdGhlIHR3byBmaXJzdCBvbmVzLgotICAgIGNvbnN0IEdMc2l6ZWkgdmNzID0KLSAgICAgICAgKCh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0JVRkZFUl9TSVpFICsKLSAgICAgICAgICB2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0NBQ0hFX1NJWkUgLSAyKSAvIDIpICogMjsKLSAgICBkbyB7Ci0gICAgICAgIHYwID0gYy0+dmMudkJ1ZmZlciArIDA7Ci0gICAgICAgIHYxID0gYy0+dmMudkJ1ZmZlciArIDE7Ci0gICAgICAgIHYgID0gYy0+dmMudkJ1ZmZlciArIDI7Ci0gICAgICAgIEdMc2l6ZWkgbnVtID0gY291bnQgPiB2Y3MgPyB2Y3MgOiBjb3VudDsKLSAgICAgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50cyhjLCB2LCBmaXJzdCwgbnVtKTsKLSAgICAgICAgZmlyc3QgKz0gbnVtOwotICAgICAgICBjb3VudCAtPSBudW07Ci0gICAgICAgIGlmICghYy0+YXJyYXlzLmN1bGwpIHsKLSAgICAgICAgICAgIC8vIHF1aWNrL3RyaXZpYWwgcmVqZWN0IG9mIHRoZSB3aG9sZSBiYXRjaAotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHYyID0gdisrOwotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdjItPmZsYWdzOwotICAgICAgICAgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyVHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7Ci0gICAgICAgICAgICAgICAgc3dhcCgoKHdpbmRpbmdePTEpID8gdjEgOiB2MCksIHYyKTsKLSAgICAgICAgICAgICAgICBudW0tLTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG51bSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvdW50KSB7Ci0gICAgICAgICAgICB2MCA9IGMtPnZjLnZCdWZmZXIgKyAyICsgdmNzIC0gMjsKLSAgICAgICAgICAgIHYxID0gYy0+dmMudkJ1ZmZlciArIDIgKyB2Y3MgLSAxOwotICAgICAgICAgICAgaWYgKCh3aW5kaW5nJjIpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaXBzIGNvcHkgYmFjayB0aGUgdHdvIGxhc3QgY29tcGlsZWQgdmVydGljZXMKLSAgICAgICAgICAgICAgICBjLT52Yy52QnVmZmVyWzBdID0gKnYwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYy0+dmMudkJ1ZmZlclsxXSA9ICp2MTsKLSAgICAgICAgICAgIGMtPmFycmF5cy5jdWxsID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdmVydGV4X3Q6OkNMSVBfQUxMOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoY291bnQgPiAwKTsKLX0KLQotdm9pZCBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlU3RyaXAob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkgewotICAgIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVGYW5PclN0cmlwKGMsIGZpcnN0LCBjb3VudCwgMSk7Ci19Ci0KLXZvaWQgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZUZhbihvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KSB7Ci0gICAgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZUZhbk9yU3RyaXAoYywgZmlyc3QsIGNvdW50LCAyKTsKLX0KLQotdm9pZCBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlcyhvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQotewotICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAzKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gdmVydGV4IGNhY2hlIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiAzCi0gICAgY29uc3QgR0xzaXplaSB2Y3MgPQotICAgICAgICAoKHZlcnRleF9jYWNoZV90OjpWRVJURVhfQlVGRkVSX1NJWkUgKwotICAgICAgICB2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0NBQ0hFX1NJWkUpIC8gMykgKiAzOwotICAgIGRvIHsKLSAgICAgICAgdmVydGV4X3QqIHYgPSBjLT52Yy52QnVmZmVyOwotICAgICAgICBHTHNpemVpIG51bSA9IGNvdW50ID4gdmNzID8gdmNzIDogY291bnQ7Ci0gICAgICAgIGMtPmFycmF5cy5jdWxsID0gdmVydGV4X3Q6OkNMSVBfQUxMOwotICAgICAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnRzKGMsIHYsIGZpcnN0LCBudW0pOwotICAgICAgICBmaXJzdCArPSBudW07Ci0gICAgICAgIGNvdW50IC09IG51bTsKLSAgICAgICAgaWYgKCFjLT5hcnJheXMuY3VsbCkgewotICAgICAgICAgICAgLy8gcXVpY2svdHJpdmlhbCByZWplY3Qgb2YgdGhlIHdob2xlIGJhdGNoCi0gICAgICAgICAgICBudW0gLT0gMzsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHZbMF0uZmxhZ3MgJiB2WzFdLmZsYWdzICYgdlsyXS5mbGFnczsKLSAgICAgICAgICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCi0gICAgICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlKGMsIHYsIHYrMSwgdisyKTsKLSAgICAgICAgICAgICAgICB2ICs9IDM7Ci0gICAgICAgICAgICAgICAgbnVtIC09IDM7Ci0gICAgICAgICAgICB9IHdoaWxlIChudW0gPj0gMCk7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChjb3VudCA+PSAzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jZW5kaWYKLQotLy8gdGhpcyBsb29rcyBnb29meSwgYnV0IGdjYyBkb2VzIGEgZ3JlYXQgam9iIHdpdGggdGhpcy4uLgotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVhZF9pbmRleChpbnQgdHlwZSwgY29uc3QgR0x2b2lkKiYgcCkgewotICAgIHVuc2lnbmVkIGludCByOwotICAgIGlmICh0eXBlKSB7Ci0gICAgICAgIHIgPSAqKGNvbnN0IEdMdWJ5dGUqKXA7Ci0gICAgICAgIHAgPSAoY29uc3QgR0x1Ynl0ZSopcCArIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgciA9ICooY29uc3QgR0x1c2hvcnQqKXA7Ci0gICAgICAgIHAgPSAoY29uc3QgR0x1c2hvcnQqKXAgKyAxOwotICAgIH0KLSAgICByZXR1cm4gcjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1BvaW50cyhvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcykKLXsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMSkpCi0gICAgICAgIHJldHVybjsKLSAgICBjb25zdCBpbnQgdHlwZSA9IChjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfQllURSk7Ci0gICAgZG8gewotICAgICAgICB2ZXJ0ZXhfdCAqIHYgPSBmZXRjaF92ZXJ0ZXgoYywgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7Ci0gICAgICAgIGlmIChnZ2xfbGlrZWx5KCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclBvaW50KGMsIHYpOwotICAgICAgICB2LT5sb2NrZWQgPSAwOwotICAgICAgICBjb3VudC0tOwotICAgIH0gd2hpbGUoY291bnQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZVN0cmlwKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzKQotewotICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAyKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgdmVydGV4X3QgKiBjb25zdCB2ID0gYy0+dmMudkJ1ZmZlcjsKLSAgICB2ZXJ0ZXhfdCogdjAgPSB2OwotICAgIHZlcnRleF90KiB2MTsKLQotICAgIGNvbnN0IGludCB0eXBlID0gKGMtPmFycmF5cy5pbmRpY2VzVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKTsKLSAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQoYywgdjAsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOwotICAgIGNvdW50IC09IDE7Ci0gICAgZG8gewotICAgICAgICB2MSA9IGZldGNoX3ZlcnRleChjLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgY2MgPSB2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3M7Ci0gICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUoYywgdjAsIHYxKTsKLSAgICAgICAgdjAtPmxvY2tlZCA9IDA7Ci0gICAgICAgIHYwID0gdjE7Ci0gICAgICAgIGNvdW50LS07Ci0gICAgfSB3aGlsZSAoY291bnQpOwotICAgIHYxLT5sb2NrZWQgPSAwOwotfQotCi12b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc0xpbmVMb29wKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzKQotewotICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPD0gMikpIHsKLSAgICAgICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZXMoYywgY291bnQsIGluZGljZXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmVydGV4X3QgKiBjb25zdCB2ID0gYy0+dmMudkJ1ZmZlcjsKLSAgICB2ZXJ0ZXhfdCogdjAgPSB2OwotICAgIHZlcnRleF90KiB2MTsKLQotICAgIGNvbnN0IGludCB0eXBlID0gKGMtPmFycmF5cy5pbmRpY2VzVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKTsKLSAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQoYywgdjAsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOwotICAgIGNvdW50IC09IDE7Ci0gICAgZG8gewotICAgICAgICB2MSA9IGZldGNoX3ZlcnRleChjLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgY2MgPSB2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3M7Ci0gICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUoYywgdjAsIHYxKTsKLSAgICAgICAgdjAtPmxvY2tlZCA9IDA7Ci0gICAgICAgIHYwID0gdjE7Ci0gICAgICAgIGNvdW50LS07Ci0gICAgfSB3aGlsZSAoY291bnQpOwotICAgIHYxLT5sb2NrZWQgPSAwOwotCi0gICAgdjEgPSBjLT52Yy52QnVmZmVyOwotICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzOwotICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgYy0+cHJpbXMucmVuZGVyTGluZShjLCB2MCwgdjEpOwotfQotCi12b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc0xpbmVzKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzKQotewotICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAyKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY291bnQgLT0gMjsKLSAgICBjb25zdCBpbnQgdHlwZSA9IChjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfQllURSk7Ci0gICAgZG8gewotICAgICAgICB2ZXJ0ZXhfdCogY29uc3QgdjAgPSBmZXRjaF92ZXJ0ZXgoYywgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7Ci0gICAgICAgIHZlcnRleF90KiBjb25zdCB2MSA9IGZldGNoX3ZlcnRleChjLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgY2MgPSB2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3M7Ci0gICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUoYywgdjAsIHYxKTsKLSAgICAgICAgdjAtPmxvY2tlZCA9IDA7Ci0gICAgICAgIHYxLT5sb2NrZWQgPSAwOwotICAgICAgICBjb3VudCAtPSAyOwotICAgIH0gd2hpbGUgKGNvdW50ID49IDApOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlRmFuT3JTdHJpcChvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcywgaW50IHdpbmRpbmcpCi17Ci0gICAgLy8gd2luZGluZyA9PSAyIDogZmFuCi0gICAgLy8gd2luZGluZyA9PSAxIDogc3RyaXAKLQotICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAzKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgdmVydGV4X3QgKiBjb25zdCB2ID0gYy0+dmMudkJ1ZmZlcjsKLSAgICB2ZXJ0ZXhfdCogdjAgPSB2OwotICAgIHZlcnRleF90KiB2MSA9IHYrMTsKLSAgICB2ZXJ0ZXhfdCogdjI7Ci0KLSAgICBjb25zdCBpbnQgdHlwZSA9IChjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfQllURSk7Ci0gICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYwLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKLSAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQoYywgdjEsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOwotICAgIGNvdW50IC09IDI7Ci0KLSAgICAvLyBub3RlOiBHQ0MgNC4xLjEgaGVyZSBtYWtlcyBhIHByZXR5IGludGVyZXN0aW5nIG9wdGltaXphdGlvbgotICAgIC8vIHdoZXJlIGl0IGR1cGxpY2F0ZXMgdGhlIGxvb3AgYmVsb3cgYmFzZWQgb24gYy0+YXJyYXlzLmluZGljZXNUeXBlCi0KLSAgICBkbyB7Ci0gICAgICAgIHYyID0gZmV0Y2hfdmVydGV4KGMsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOwotICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFncyAmIHYyLT5mbGFnczsKLSAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQotICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyVHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7Ci0gICAgICAgIHZlcnRleF90KiAmIGNvbnN1bWVkID0gKCh3aW5kaW5nXj0xKSA/IHYxIDogdjApOwotICAgICAgICBjb25zdW1lZC0+bG9ja2VkID0gMDsKLSAgICAgICAgY29uc3VtZWQgPSB2MjsKLSAgICAgICAgY291bnQtLTsKLSAgICB9IHdoaWxlIChjb3VudCk7Ci0gICAgdjAtPmxvY2tlZCA9IHYxLT5sb2NrZWQgPSAwOwotICAgIHYyLT5sb2NrZWQgPSAwOwotfQotCi12b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlU3RyaXAob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMpIHsKLSAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZUZhbk9yU3RyaXAoYywgY291bnQsIGluZGljZXMsIDEpOwotfQotCi12b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlRmFuKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzKSB7Ci0gICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzVHJpYW5nbGVGYW5PclN0cmlwKGMsIGNvdW50LCBpbmRpY2VzLCAyKTsKLX0KLQotdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZXMob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMpCi17Ci0gICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDMpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjb3VudCAtPSAzOwotICAgIGlmIChnZ2xfbGlrZWx5KGMtPmFycmF5cy5pbmRpY2VzVHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVCkpIHsKLSAgICAgICAgLy8gVGhpcyBjYXNlIGlzIHByb2JhYmx5IG91ciBtb3N0IGNvbW1vbiBjYXNlLi4uCi0gICAgICAgIHVpbnQxNl90IGNvbnN0ICogcCA9ICh1aW50MTZfdCBjb25zdCAqKWluZGljZXM7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MCA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKLSAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MSA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKLSAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MiA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdjItPmZsYWdzOwotICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQotICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOwotICAgICAgICAgICAgdjAtPmxvY2tlZCA9IDA7Ci0gICAgICAgICAgICB2MS0+bG9ja2VkID0gMDsKLSAgICAgICAgICAgIHYyLT5sb2NrZWQgPSAwOwotICAgICAgICAgICAgY291bnQgLT0gMzsKLSAgICAgICAgfSB3aGlsZSAoY291bnQgPj0gMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdWludDhfdCBjb25zdCAqIHAgPSAodWludDhfdCBjb25zdCAqKWluZGljZXM7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MCA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKLSAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MSA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKLSAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MiA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdjItPmZsYWdzOwotICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQotICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOwotICAgICAgICAgICAgdjAtPmxvY2tlZCA9IDA7Ci0gICAgICAgICAgICB2MS0+bG9ja2VkID0gMDsKLSAgICAgICAgICAgIHYyLT5sb2NrZWQgPSAwOwotICAgICAgICAgICAgY291bnQgLT0gMzsKLSAgICAgICAgfSB3aGlsZSAoY291bnQgPj0gMCk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBBcnJheSBjb21waWxlcnMKLSNlbmRpZgotCi12b2lkIGNvbXBpbGVFbGVtZW50X19nZW5lcmljKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYsIEdMaW50IGZpcnN0KQotewotICAgIHYtPmZsYWdzID0gMDsKLSAgICB2LT5pbmRleCA9IGZpcnN0OwotICAgIGZpcnN0ICY9IHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLOwotICAgIGNvbnN0IEdMdWJ5dGUqIHZwID0gYy0+YXJyYXlzLnZlcnRleC5lbGVtZW50KGZpcnN0KTsKLSAgICB2LT5vYmoueiA9IDA7Ci0gICAgdi0+b2JqLncgPSAweDEwMDAwOwotICAgIGMtPmFycmF5cy52ZXJ0ZXguZmV0Y2goYywgdi0+b2JqLnYsIHZwKTsKLSAgICBjLT5hcnJheXMubXZwX3RyYW5zZm9ybSgmYy0+dHJhbnNmb3Jtcy5tdnAsICZ2LT5jbGlwLCAmdi0+b2JqKTsKLSAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUoYywgdik7Ci19Ci0KLXZvaWQgY29tcGlsZUVsZW1lbnRzX19nZW5lcmljKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQotewotICAgIGNvbnN0IEdMdWJ5dGUqIHZwID0gYy0+YXJyYXlzLnZlcnRleC5lbGVtZW50KAotICAgICAgICAgICAgZmlyc3QgJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7Ci0gICAgY29uc3Qgc2l6ZV90IHN0cmlkZSA9IGMtPmFycmF5cy52ZXJ0ZXguc3RyaWRlOwotICAgIHRyYW5zZm9ybV90IGNvbnN0KiBjb25zdCBtdnAgPSAmYy0+dHJhbnNmb3Jtcy5tdnA7Ci0gICAgZG8gewotICAgICAgICB2LT5mbGFncyA9IDA7Ci0gICAgICAgIHYtPmluZGV4ID0gZmlyc3QrKzsKLSAgICAgICAgdi0+b2JqLnogPSAwOwotICAgICAgICB2LT5vYmoudyA9IDB4MTAwMDA7Ci0gICAgICAgIGMtPmFycmF5cy52ZXJ0ZXguZmV0Y2goYywgdi0+b2JqLnYsIHZwKTsKLSAgICAgICAgYy0+YXJyYXlzLm12cF90cmFuc2Zvcm0obXZwLCAmdi0+Y2xpcCwgJnYtPm9iaik7Ci0gICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZShjLCB2KTsKLSAgICAgICAgdnAgKz0gc3RyaWRlOwotICAgICAgICB2Kys7Ci0gICAgfSB3aGlsZSAoLS1jb3VudCk7Ci19Ci0KLS8qCi12b2lkIGNvbXBpbGVFbGVtZW50c19fM3hfZnVsbChvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2LCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKLXsKLSAgICBjb25zdCBHTGZpeGVkKiB2cCA9IChjb25zdCBHTGZpeGVkKiljLT5hcnJheXMudmVydGV4LmVsZW1lbnQoZmlyc3QpOwotICAgIGNvbnN0IHNpemVfdCBzdHJpZGUgPSBjLT5hcnJheXMudmVydGV4LnN0cmlkZSAvIDQ7Ci0vLyAgICBjb25zdCBHTGZpeGVkKiBjb25zdCYgbSA9IGMtPnRyYW5zZm9ybXMubXZwLm1hdHJpeC5tOwotCi0gICAgR0xmaXhlZCBtWzE2XTsKLSAgICBtZW1jcHkoJm0sIGMtPnRyYW5zZm9ybXMubXZwLm1hdHJpeC5tLCBzaXplb2YobSkpOwotCi0gICAgZG8gewotICAgICAgICBjb25zdCBHTGZpeGVkIHJ4ID0gdnBbMF07Ci0gICAgICAgIGNvbnN0IEdMZml4ZWQgcnkgPSB2cFsxXTsKLSAgICAgICAgY29uc3QgR0xmaXhlZCByeiA9IHZwWzJdOwotICAgICAgICB2cCArPSBzdHJpZGU7Ci0gICAgICAgIHYtPmluZGV4ID0gZmlyc3QrKzsKLSAgICAgICAgdi0+Y2xpcC54ID0gbWxhM2EocngsIG1bIDBdLCByeSwgbVsgNF0sIHJ6LCBtWyA4XSwgbVsxMl0pOwotICAgICAgICB2LT5jbGlwLnkgPSBtbGEzYShyeCwgbVsgMV0sIHJ5LCBtWyA1XSwgcnosIG1bIDldLCBtWzEzXSk7Ci0gICAgICAgIHYtPmNsaXAueiA9IG1sYTNhKHJ4LCBtWyAyXSwgcnksIG1bIDZdLCByeiwgbVsxMF0sIG1bMTRdKTsKLSAgICAgICAgdi0+Y2xpcC53ID0gbWxhM2EocngsIG1bIDNdLCByeSwgbVsgN10sIHJ6LCBtWzExXSwgbVsxNV0pOwotCi0gICAgICAgIGNvbnN0IEdMZml4ZWQgdyA9IHYtPmNsaXAudzsKLSAgICAgICAgdWludDMyX3QgY2xpcCA9IDA7Ci0gICAgICAgIGlmICh2LT5jbGlwLnggPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX0w7Ci0gICAgICAgIGlmICh2LT5jbGlwLnggPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX1I7Ci0gICAgICAgIGlmICh2LT5jbGlwLnkgPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX0I7Ci0gICAgICAgIGlmICh2LT5jbGlwLnkgPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX1Q7Ci0gICAgICAgIGlmICh2LT5jbGlwLnogPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX047Ci0gICAgICAgIGlmICh2LT5jbGlwLnogPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX0Y7Ci0gICAgICAgIHYtPmZsYWdzID0gY2xpcDsKLSAgICAgICAgYy0+YXJyYXlzLmN1bGwgJj0gY2xpcDsKLQotICAgICAgICAvL2MtPmFycmF5cy5wZXJzcGVjdGl2ZShjLCB2KTsKLSAgICAgICAgdisrOwotICAgIH0gd2hpbGUgKC0tY291bnQpOwotfQotKi8KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgY2xpcHBlcnMKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBjbGlwVmVjNCh2ZWM0X3QmIG52LAotICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlYzRfdCYgcywgY29uc3QgdmVjNF90JiBwKQotewotICAgIGZvciAoaW50IGk9MDsgaTw0IDsgaSsrKQotICAgICAgICBudi52W2ldID0gZ2dsTXVsQWRkeCh0LCBzLnZbaV0gLSBwLnZbaV0sIHAudltpXSwgMjgpOwotfQotCi1zdGF0aWMgdm9pZCBjbGlwVmVydGV4KG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAotICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKLXsKLSAgICBjbGlwVmVjNChudi0+Y2xpcCwgdCwgcy0+Y2xpcCwgcC0+Y2xpcCk7Ci0gICAgbnYtPmZvZyA9IGdnbE11bEFkZHgodCwgcy0+Zm9nIC0gcC0+Zm9nLCBwLT5mb2csIDI4KTsKLSAgICBvZ2xlc192ZXJ0ZXhfcHJvamVjdChjLCBudik7Ci0gICAgbnYtPmZsYWdzIHw9ICB2ZXJ0ZXhfdDo6TElUIHwgdmVydGV4X3Q6OkVZRSB8IHZlcnRleF90OjpUVDsKLSAgICBudi0+ZmxhZ3MgJj0gfnZlcnRleF90OjpDTElQX0FMTDsKLX0KLQotc3RhdGljIHZvaWQgY2xpcFZlcnRleEMob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogbnYsCi0gICAgICAgIEdMZml4ZWQgdCwgY29uc3QgdmVydGV4X3QqIHMsIGNvbnN0IHZlcnRleF90KiBwKQotewotICAgIGNsaXBWZWM0KG52LT5jb2xvciwgdCwgcy0+Y29sb3IsIHAtPmNvbG9yKTsKLSAgICBjbGlwVmVydGV4KGMsIG52LCB0LCBzLCBwKTsKLX0KLQotc3RhdGljIHZvaWQgY2xpcFZlcnRleFQob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogbnYsCi0gICAgICAgIEdMZml4ZWQgdCwgY29uc3QgdmVydGV4X3QqIHMsIGNvbnN0IHZlcnRleF90KiBwKQotewotICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBpZiAoYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLmVuYWJsZSkKLSAgICAgICAgICAgIGNsaXBWZWM0KG52LT50ZXh0dXJlW2ldLCB0LCBzLT50ZXh0dXJlW2ldLCBwLT50ZXh0dXJlW2ldKTsKLSAgICB9Ci0gICAgY2xpcFZlcnRleChjLCBudiwgdCwgcywgcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsaXBWZXJ0ZXhBbGwob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogbnYsCi0gICAgICAgIEdMZml4ZWQgdCwgY29uc3QgdmVydGV4X3QqIHMsIGNvbnN0IHZlcnRleF90KiBwKQotewotICAgIGNsaXBWZWM0KG52LT5jb2xvciwgdCwgcy0+Y29sb3IsIHAtPmNvbG9yKTsKLSAgICBjbGlwVmVydGV4VChjLCBudiwgdCwgcywgcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsaXBFeWUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogbnYsCi0gICAgICAgIEdMZml4ZWQgdCwgY29uc3QgdmVydGV4X3QqIHMsIGNvbnN0IHZlcnRleF90KiBwKQotewotICAgIG52LT5jbGVhcigpOwotICAgIGMtPmFycmF5cy5jbGlwVmVydGV4KGMsIG52LCB0LCBwLCBzKTsKLSAgICBjbGlwVmVjNChudi0+ZXllLCB0LCBzLT5leWUsIHAtPmV5ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCi0KLXZvaWQgdmFsaWRhdGVfYXJyYXlzKG9nbGVzX2NvbnRleHRfdCogYywgR0xlbnVtIG1vZGUpCi17Ci0gICAgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKLQotICAgIC8vIFBlcnNwZWN0aXZlIGNvcnJlY3Rpb24gaXMgbm90IG5lZWQgaWYgT3J0aG8gdHJhbnNmb3JtLCBidXQKLSAgICAvLyB0aGUgdXNlciBjYW4gc3RpbGwgcHJvdmlkZSB0aGUgdyBjb29yZGluYXRlIG1hbnVhbGx5LCBzbyB3ZSBjYW4ndAotICAgIC8vIGF1dG9tYXRpY2FsbHkgdHVybiBpdCBvZmYgKGluIGZhY3Qgd2UgY291bGQgd2hlbiB0aGUgNHRoIGNvb3JkaW5hdGUKLSAgICAvLyBpcyBub3Qgc3BjaWZpZWQgaW4gdGhlIHZlcnRleCBhcnJheSkuCi0gICAgLy8gVyBpbnRlcnBvbGF0aW9uIGlzIG5ldmVyIG5lZWRlZCBmb3IgcG9pbnRzLgotICAgIEdMYm9vbGVhbiBwZXJzcGVjdGl2ZSA9Ci0gICAgICAgIGMtPnBlcnNwZWN0aXZlICYmIG1vZGUhPUdMX1BPSU5UUyAmJiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUyk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5lbmFibGVEaXNhYmxlKGMsIEdHTF9XX0xFUlAsIHBlcnNwZWN0aXZlKTsKLQotICAgIC8vIHNldCBhbnRpLWFsaWFzaW5nCi0gICAgR0xib29sZWFuIHNtb290aCA9IEdMX0ZBTFNFOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2UgR0xfUE9JTlRTOgotICAgICAgICBzbW9vdGggPSBjLT5wb2ludC5zbW9vdGg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfTElORVM6Ci0gICAgY2FzZSBHTF9MSU5FX0xPT1A6Ci0gICAgY2FzZSBHTF9MSU5FX1NUUklQOgotICAgICAgICBzbW9vdGggPSBjLT5saW5lLnNtb290aDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmICgoKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0FBKT8xOjApICE9IHNtb290aCkKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5lbmFibGVEaXNhYmxlKGMsIEdHTF9BQSwgc21vb3RoKTsKLQotICAgIC8vIHNldCB0aGUgc2hhZGUgbW9kZWwgZm9yIHRoaXMgcHJpbWl0aXZlCi0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5zaGFkZU1vZGVsKGMsCi0gICAgICAgICAgICAobW9kZSA9PSBHTF9QT0lOVFMpID8gR0xfRkxBVCA6IGMtPmxpZ2h0aW5nLnNoYWRlTW9kZWwpOwotCi0gICAgLy8gY29tcHV0ZSBhbGwgdGhlIG1hdHJpY2VzIHdlJ2xsIG5lZWQuLi4KLSAgICB1aW50MzJfdCB3YW50ID0KLSAgICAgICAgICAgIHRyYW5zZm9ybV9zdGF0ZV90OjpNVlAgfAotICAgICAgICAgICAgdHJhbnNmb3JtX3N0YXRlX3Q6OlZJRVdQT1JUOwotICAgIGlmIChjLT5saWdodGluZy5lbmFibGUpIHsgLy8gbmVlZHMgbm9ybWFsIHRyYW5zZm9ybXMgYW5kIGV5ZSBjb29yZHMKLSAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZVSTsKLSAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6TU9ERUxWSUVXOwotICAgIH0KLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykgeyAvLyBuZWVkcyB0ZXh0dXJlIHRyYW5zZm9ybXMKLSAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6VEVYVFVSRTsKLSAgICB9Ci0gICAgaWYgKGMtPmNsaXBQbGFuZXMuZW5hYmxlIHx8IChlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpKSB7Ci0gICAgICAgIHdhbnQgfD0gdHJhbnNmb3JtX3N0YXRlX3Q6Ok1PREVMVklFVzsgLy8gbmVlZHMgZXllIGNvb3JkcwotICAgIH0KLSAgICBvZ2xlc192YWxpZGF0ZV90cmFuc2Zvcm0oYywgd2FudCk7Ci0KLSAgICAvLyB0ZXh0dXJlcy4uLgotICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKQotICAgICAgICBvZ2xlc192YWxpZGF0ZV90ZXh0dXJlKGMpOwotCi0gICAgLy8gdmVydGV4IGNvbXBpbGVycwotICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudCA9IGNvbXBpbGVFbGVtZW50X19nZW5lcmljOwotICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudHMgPSBjb21waWxlRWxlbWVudHNfX2dlbmVyaWM7Ci0KLSAgICAvLyB2ZXJ0ZXggdHJhbnNmb3JtCi0gICAgYy0+YXJyYXlzLm12cF90cmFuc2Zvcm0gPQotICAgICAgICBjLT50cmFuc2Zvcm1zLm12cC5wb2ludHZbYy0+YXJyYXlzLnZlcnRleC5zaXplIC0gMl07Ci0KLSAgICBjLT5hcnJheXMubXZfdHJhbnNmb3JtID0KLSAgICAgICAgYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXcudHJhbnNmb3JtLnBvaW50dltjLT5hcnJheXMudmVydGV4LnNpemUgLSAyXTsKLQotICAgIC8qCi0gICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiAgcGljayBmZXRjaGVycwotICAgICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICovCi0KLSAgICBhcnJheV9tYWNoaW5lX3QmIGFtID0gYy0+YXJyYXlzOwotICAgIGFtLnZlcnRleC5mZXRjaCA9IGZldGNoTm9wOwotICAgIGFtLm5vcm1hbC5mZXRjaCA9IGN1cnJlbnROb3JtYWw7Ci0gICAgYW0uY29sb3IuZmV0Y2ggPSBjdXJyZW50Q29sb3I7Ci0KLSAgICBpZiAoYW0udmVydGV4LmVuYWJsZSkgewotICAgICAgICBhbS52ZXJ0ZXgucmVzb2x2ZSgpOwotICAgICAgICBpZiAoYW0udmVydGV4LmJvIHx8IGFtLnZlcnRleC5wb2ludGVyKSB7Ci0gICAgICAgICAgICBhbS52ZXJ0ZXguZmV0Y2ggPSB2ZXJ0ZXhfZmN0W2FtLnZlcnRleC5zaXplLTJdW2FtLnZlcnRleC50eXBlICYgMHhGXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChhbS5ub3JtYWwuZW5hYmxlKSB7Ci0gICAgICAgIGFtLm5vcm1hbC5yZXNvbHZlKCk7Ci0gICAgICAgIGlmIChhbS5ub3JtYWwuYm8gfHwgYW0ubm9ybWFsLnBvaW50ZXIpIHsKLSAgICAgICAgICAgIGFtLm5vcm1hbC5mZXRjaCA9IG5vcm1hbF9mY3RbYW0ubm9ybWFsLnNpemUtM11bYW0ubm9ybWFsLnR5cGUgJiAweEZdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGFtLmNvbG9yLmVuYWJsZSkgewotICAgICAgICBhbS5jb2xvci5yZXNvbHZlKCk7Ci0gICAgICAgIGlmIChjLT5saWdodGluZy5lbmFibGUpIHsKLSAgICAgICAgICAgIGlmIChhbS5jb2xvci5ibyB8fCBhbS5jb2xvci5wb2ludGVyKSB7Ci0gICAgICAgICAgICAgICAgYW0uY29sb3IuZmV0Y2ggPSBjb2xvcl9mY3RbYW0uY29sb3Iuc2l6ZS0zXVthbS5jb2xvci50eXBlICYgMHhGXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhbS5jb2xvci5ibyB8fCBhbS5jb2xvci5wb2ludGVyKSB7Ci0gICAgICAgICAgICAgICAgYW0uY29sb3IuZmV0Y2ggPSBjb2xvcl9jbGFtcF9mY3RbYW0uY29sb3Iuc2l6ZS0zXVthbS5jb2xvci50eXBlICYgMHhGXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBhY3RpdmVUbXVDb3VudCA9IDA7Ci0gICAgZm9yIChpbnQgaT0wIDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7Ci0gICAgICAgIGFtLnRleHR1cmVbaV0uZmV0Y2ggPSBjdXJyZW50VGV4Q29vcmQ7Ci0gICAgICAgIGlmIChjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0uZW5hYmxlKSB7Ci0KLSAgICAgICAgICAgIC8vIHRleHR1cmUgZmV0Y2hlcnMuLi4KLSAgICAgICAgICAgIGlmIChhbS50ZXh0dXJlW2ldLmVuYWJsZSkgewotICAgICAgICAgICAgICAgIGFtLnRleHR1cmVbaV0ucmVzb2x2ZSgpOwotICAgICAgICAgICAgICAgIGlmIChhbS50ZXh0dXJlW2ldLmJvIHx8IGFtLnRleHR1cmVbaV0ucG9pbnRlcikgewotICAgICAgICAgICAgICAgICAgICBhbS50ZXh0dXJlW2ldLmZldGNoID0gdGV4dHVyZV9mY3RbYW0udGV4dHVyZVtpXS5zaXplLTJdW2FtLnRleHR1cmVbaV0udHlwZSAmIDB4Rl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0ZXh0dXJlIHRyYW5zZm9ybS4uLgotICAgICAgICAgICAgY29uc3QgaW50IGluZGV4ID0gYy0+YXJyYXlzLnRleHR1cmVbaV0uc2l6ZSAtIDI7Ci0gICAgICAgICAgICBjLT5hcnJheXMudGV4X3RyYW5zZm9ybVtpXSA9Ci0gICAgICAgICAgICAgICAgYy0+dHJhbnNmb3Jtcy50ZXh0dXJlW2ldLnRyYW5zZm9ybS5wb2ludHZbaW5kZXhdOwotCi0gICAgICAgICAgICBhbS50bXUgPSBpOwotICAgICAgICAgICAgYWN0aXZlVG11Q291bnQrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHBpY2sgdGhlIHZlcnRleC1jbGlwcGVyCi0gICAgdWludDMyX3QgY2xpcHBlciA9IDA7Ci0gICAgLy8gd2UgbXVzdCByZWxvYWQgJ2VuYWJsZXMnIGhlcmUKLSAgICBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOwotICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9TTU9PVEgpCi0gICAgICAgIGNsaXBwZXIgfD0gMTsgICAvLyB3ZSBuZWVkIHRvIGludGVycG9sYXRlIGNvbG9ycwotICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKQotICAgICAgICBjbGlwcGVyIHw9IDI7ICAgLy8gd2UgbmVlZCB0byBpbnRlcnBvbGF0ZSB0ZXh0dXJlcwotICAgIHN3aXRjaCAoY2xpcHBlcikgewotICAgIGNhc2UgMDogYy0+YXJyYXlzLmNsaXBWZXJ0ZXggPSBjbGlwVmVydGV4OyAgICAgIGJyZWFrOwotICAgIGNhc2UgMTogYy0+YXJyYXlzLmNsaXBWZXJ0ZXggPSBjbGlwVmVydGV4QzsgICAgIGJyZWFrOwotICAgIGNhc2UgMjogYy0+YXJyYXlzLmNsaXBWZXJ0ZXggPSBjbGlwVmVydGV4VDsgICAgIGJyZWFrOwotICAgIGNhc2UgMzogYy0+YXJyYXlzLmNsaXBWZXJ0ZXggPSBjbGlwVmVydGV4QWxsOyAgIGJyZWFrOwotICAgIH0KLSAgICBjLT5hcnJheXMuY2xpcEV5ZSA9IGNsaXBFeWU7Ci0KLSAgICAvLyBwaWNrIHRoZSBwcmltaXRpdmUgcmFzdGVyaXplcgotICAgIG9nbGVzX3ZhbGlkYXRlX3ByaW1pdGl2ZXMoYyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBhcnJheSBBUEkKLSNlbmRpZgotCi12b2lkIGdsVmVydGV4UG9pbnRlcigKLSAgICBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChzaXplPDIgfHwgc2l6ZT40IHx8IHN0cmlkZTwwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgR0xfQllURToKLSAgICBjYXNlIEdMX1NIT1JUOgotICAgIGNhc2UgR0xfRklYRUQ6Ci0gICAgY2FzZSBHTF9GTE9BVDoKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT5hcnJheXMudmVydGV4LmluaXQoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyLCBjLT5hcnJheXMuYXJyYXlfYnVmZmVyLCAwKTsKLX0KLQotdm9pZCBnbENvbG9yUG9pbnRlcigKLSAgICBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChzaXplIT00IHx8IHN0cmlkZTwwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKLSAgICBjYXNlIEdMX0ZJWEVEOgotICAgIGNhc2UgR0xfRkxPQVQ6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+YXJyYXlzLmNvbG9yLmluaXQoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyLCBjLT5hcnJheXMuYXJyYXlfYnVmZmVyLCAwKTsKLX0KLQotdm9pZCBnbE5vcm1hbFBvaW50ZXIoCi0gICAgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoc3RyaWRlPDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBHTF9CWVRFOgotICAgIGNhc2UgR0xfU0hPUlQ6Ci0gICAgY2FzZSBHTF9GSVhFRDoKLSAgICBjYXNlIEdMX0ZMT0FUOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGMtPmFycmF5cy5ub3JtYWwuaW5pdCgzLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIsIGMtPmFycmF5cy5hcnJheV9idWZmZXIsIDApOwotfQotCi12b2lkIGdsVGV4Q29vcmRQb2ludGVyKAotICAgIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHNpemU8MiB8fCBzaXplPjQgfHwgc3RyaWRlPDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBHTF9CWVRFOgotICAgIGNhc2UgR0xfU0hPUlQ6Ci0gICAgY2FzZSBHTF9GSVhFRDoKLSAgICBjYXNlIEdMX0ZMT0FUOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNvbnN0IGludCB0bXUgPSBjLT5hcnJheXMuYWN0aXZlVGV4dHVyZTsKLSAgICBjLT5hcnJheXMudGV4dHVyZVt0bXVdLmluaXQoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyLAotICAgICAgICAgICAgYy0+YXJyYXlzLmFycmF5X2J1ZmZlciwgMCk7Ci19Ci0KLQotdm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlKEdMZW51bSBhcnJheSkgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgZW5hYmxlRGlzYWJsZUNsaWVudFN0YXRlKGMsIGFycmF5LCB0cnVlKTsKLX0KLQotdm9pZCBnbERpc2FibGVDbGllbnRTdGF0ZShHTGVudW0gYXJyYXkpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGVuYWJsZURpc2FibGVDbGllbnRTdGF0ZShjLCBhcnJheSwgZmFsc2UpOwotfQotCi12b2lkIGdsQ2xpZW50QWN0aXZlVGV4dHVyZShHTGVudW0gdGV4dHVyZSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICh0ZXh0dXJlPEdMX1RFWFRVUkUwIHx8IHRleHR1cmU+PUdMX1RFWFRVUkUwK0dHTF9URVhUVVJFX1VOSVRfQ09VTlQpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT5hcnJheXMuYWN0aXZlVGV4dHVyZSA9IHRleHR1cmUgLSBHTF9URVhUVVJFMDsKLX0KLQotdm9pZCBnbERyYXdBcnJheXMoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKGNvdW50PDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgY2FzZSBHTF9QT0lOVFM6Ci0gICAgY2FzZSBHTF9MSU5FX1NUUklQOgotICAgIGNhc2UgR0xfTElORV9MT09QOgotICAgIGNhc2UgR0xfTElORVM6Ci0gICAgY2FzZSBHTF9UUklBTkdMRV9TVFJJUDoKLSAgICBjYXNlIEdMX1RSSUFOR0xFX0ZBTjoKLSAgICBjYXNlIEdMX1RSSUFOR0xFUzoKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChjb3VudCA9PSAwIHx8ICFjLT5hcnJheXMudmVydGV4LmVuYWJsZSkKLSAgICAgICAgcmV0dXJuOwotICAgIGlmICgoYy0+Y3VsbC5lbmFibGUpICYmIChjLT5jdWxsLmN1bGxGYWNlID09IEdMX0ZST05UX0FORF9CQUNLKSkKLSAgICAgICAgcmV0dXJuOyAvLyBhbGwgdHJpYW5nbGVzIGFyZSBjdWxsZWQKLQotCi0gICAgdmFsaWRhdGVfYXJyYXlzKGMsIG1vZGUpOwotCi0gICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykKLSAgICAgICAgb2dsZXNfbG9ja190ZXh0dXJlcyhjKTsKLQotICAgIGRyYXdBcnJheXNQcmltc1ttb2RlXShjLCBmaXJzdCwgY291bnQpOwotCi0gICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX1RNVVMpCi0gICAgICAgIG9nbGVzX3VubG9ja190ZXh0dXJlcyhjKTsKLQotI2lmIFZDX0NBQ0hFX1NUQVRJU1RJQ1MKLSAgICBjLT52Yy50b3RhbCA9IGNvdW50OwotICAgIGMtPnZjLmR1bXBfc3RhdHMobW9kZSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBnbERyYXdFbGVtZW50cygKLSAgICBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChjb3VudDwwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2UgR0xfUE9JTlRTOgotICAgIGNhc2UgR0xfTElORV9TVFJJUDoKLSAgICBjYXNlIEdMX0xJTkVfTE9PUDoKLSAgICBjYXNlIEdMX0xJTkVTOgotICAgIGNhc2UgR0xfVFJJQU5HTEVfU1RSSVA6Ci0gICAgY2FzZSBHTF9UUklBTkdMRV9GQU46Ci0gICAgY2FzZSBHTF9UUklBTkdMRVM6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgotICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgIGMtPmFycmF5cy5pbmRpY2VzVHlwZSA9IHR5cGU7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGNvdW50ID09IDAgfHwgIWMtPmFycmF5cy52ZXJ0ZXguZW5hYmxlKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKChjLT5jdWxsLmVuYWJsZSkgJiYgKGMtPmN1bGwuY3VsbEZhY2UgPT0gR0xfRlJPTlRfQU5EX0JBQ0spKQotICAgICAgICByZXR1cm47IC8vIGFsbCB0cmlhbmdsZXMgYXJlIGN1bGxlZAotCi0gICAgLy8gY2xlYXIgdGhlIHZlcnRleC1jYWNoZQotICAgIGMtPnZjLmNsZWFyKCk7Ci0gICAgdmFsaWRhdGVfYXJyYXlzKGMsIG1vZGUpOwotCi0gICAgLy8gaWYgaW5kaWNlcyBhcmUgaW4gYSBidWZmZXIgb2JqZWN0LCB0aGUgcG9pbnRlciBpcyB0cmVhdGVkIGFzIGFuCi0gICAgLy8gb2Zmc2V0IGluIHRoYXQgYnVmZmVyLgotICAgIGlmIChjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXIpIHsKLSAgICAgICAgaW5kaWNlcyA9IGMtPmFycmF5cy5lbGVtZW50X2FycmF5X2J1ZmZlci0+ZGF0YSArIHVpbnRwdHJfdChpbmRpY2VzKTsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOwotICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKQotICAgICAgICBvZ2xlc19sb2NrX3RleHR1cmVzKGMpOwotCi0gICAgZHJhd0VsZW1lbnRzUHJpbXNbbW9kZV0oYywgY291bnQsIGluZGljZXMpOwotICAgIAotICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKQotICAgICAgICBvZ2xlc191bmxvY2tfdGV4dHVyZXMoYyk7Ci0KLSAgICAKLSNpZiBWQ19DQUNIRV9TVEFUSVNUSUNTCi0gICAgYy0+dmMudG90YWwgPSBjb3VudDsKLSAgICBjLT52Yy5kdW1wX3N0YXRzKG1vZGUpOwotI2VuZGlmCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGJ1ZmZlcnMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBnbEJpbmRCdWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICgodGFyZ2V0IT1HTF9BUlJBWV9CVUZGRVIpICYmICh0YXJnZXQhPUdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBvYmplY3QsIG9yIGJpbmQgYW4gZXhpc3Rpbmcgb25lCi0gICAgYnVmZmVyX3QgY29uc3QqIGJvID0gMDsKLSAgICBpZiAoYnVmZmVyKSB7Ci0gICAgICAgIGJvID0gYy0+YnVmZmVyT2JqZWN0TWFuYWdlci0+YmluZChidWZmZXIpOwotICAgICAgICBpZiAoIWJvKSB7Ci0gICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9PVVRfT0ZfTUVNT1JZKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICAoKHRhcmdldCA9PSBHTF9BUlJBWV9CVUZGRVIpID8KLSAgICAgICAgICAgIGMtPmFycmF5cy5hcnJheV9idWZmZXIgOiBjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXIpID0gYm87Ci19Ci0KLXZvaWQgZ2xCdWZmZXJEYXRhKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhLCBHTGVudW0gdXNhZ2UpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoKHRhcmdldCE9R0xfQVJSQVlfQlVGRkVSKSAmJiAodGFyZ2V0IT1HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUikpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc2l6ZTwwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgodXNhZ2UhPUdMX1NUQVRJQ19EUkFXKSAmJiAodXNhZ2UhPUdMX0RZTkFNSUNfRFJBVykpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBidWZmZXJfdCBjb25zdCogYm8gPSAoKHRhcmdldCA9PSBHTF9BUlJBWV9CVUZGRVIpID8KLSAgICAgICAgICAgIGMtPmFycmF5cy5hcnJheV9idWZmZXIgOiBjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXIpOwotCi0gICAgaWYgKGJvID09IDApIHsKLSAgICAgICAgLy8gY2FuJ3QgbW9kaWZ5IGJ1ZmZlciAwCi0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJ1ZmZlcl90KiBlZGl0X2JvID0gY29uc3RfY2FzdDxidWZmZXJfdCo+KGJvKTsKLSAgICBpZiAoYy0+YnVmZmVyT2JqZWN0TWFuYWdlci0+YWxsb2NhdGVTdG9yZShlZGl0X2JvLCBzaXplLCB1c2FnZSkgIT0gMCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9PVVRfT0ZfTUVNT1JZKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZGF0YSkgewotICAgICAgICBtZW1jcHkoYm8tPmRhdGEsIGRhdGEsIHNpemUpOwotICAgIH0KLX0KLQotdm9pZCBnbEJ1ZmZlclN1YkRhdGEoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICgodGFyZ2V0IT1HTF9BUlJBWV9CVUZGRVIpICYmICh0YXJnZXQhPUdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChvZmZzZXQ8MCB8fCBzaXplPDAgfHwgZGF0YT09MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBidWZmZXJfdCBjb25zdCogYm8gPSAoKHRhcmdldCA9PSBHTF9BUlJBWV9CVUZGRVIpID8KLSAgICAgICAgICAgIGMtPmFycmF5cy5hcnJheV9idWZmZXIgOiBjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXIpOwotCi0gICAgaWYgKGJvID09IDApIHsKLSAgICAgICAgLy8gY2FuJ3QgbW9kaWZ5IGJ1ZmZlciAwCi0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2Zmc2V0K3NpemUgPiBiby0+c2l6ZSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtZW1jcHkoYm8tPmRhdGEgKyBvZmZzZXQsIGRhdGEsIHNpemUpOwotfQotCi12b2lkIGdsRGVsZXRlQnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChuPDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpPTAgOyBpPG4gOyBpKyspIHsKLSAgICAgICAgR0x1aW50IG5hbWUgPSBidWZmZXJzW2ldOwotICAgICAgICBpZiAobmFtZSkgewotICAgICAgICAgICAgLy8gdW5iaW5kIGJvdW5kIGRlbGV0ZWQgYnVmZmVycy4uLgotICAgICAgICAgICAgaWYgKGMtPmFycmF5cy5lbGVtZW50X2FycmF5X2J1ZmZlcikgewotICAgICAgICAgICAgICAgIGlmIChjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXItPm5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXIgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjLT5hcnJheXMuYXJyYXlfYnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGMtPmFycmF5cy5hcnJheV9idWZmZXItPm5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuYXJyYXlfYnVmZmVyID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYy0+YXJyYXlzLnZlcnRleC5ibykgewotICAgICAgICAgICAgICAgIGlmIChjLT5hcnJheXMudmVydGV4LmJvLT5uYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLnZlcnRleC5ibyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGMtPmFycmF5cy5ub3JtYWwuYm8pIHsKLSAgICAgICAgICAgICAgICBpZiAoYy0+YXJyYXlzLm5vcm1hbC5iby0+bmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5ub3JtYWwuYm8gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjLT5hcnJheXMuY29sb3IuYm8pIHsKLSAgICAgICAgICAgICAgICBpZiAoYy0+YXJyYXlzLmNvbG9yLmJvLT5uYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNvbG9yLmJvID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCB0PTAgOyB0PEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyB0KyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYy0+YXJyYXlzLnRleHR1cmVbdF0uYm8pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMtPmFycmF5cy50ZXh0dXJlW3RdLmJvLT5uYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy50ZXh0dXJlW3RdLmJvID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5kZWxldGVCdWZmZXJzKG4sIGJ1ZmZlcnMpOwotICAgIGMtPmJ1ZmZlck9iamVjdE1hbmFnZXItPnJlY3ljbGVUb2tlbnMobiwgYnVmZmVycyk7Ci19Ci0KLXZvaWQgZ2xHZW5CdWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50KiBidWZmZXJzKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKG48MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5nZXRUb2tlbihuLCBidWZmZXJzKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvYXJyYXkuaCBiL29wZW5nbC9saWJhZ2wvYXJyYXkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1Njk3OC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL2FycmF5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL2FycmF5LmgKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfQVJSQVlfSAotI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX0FSUkFZX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSBnbCB7Ci1zdHJ1Y3Qgb2dsZXNfY29udGV4dF90OwotfTsKLQotdm9pZCBvZ2xlc19pbml0X2FycmF5KG9nbGVzX2NvbnRleHRfdCogYyk7Ci12b2lkIG9nbGVzX3VuaW5pdF9hcnJheShvZ2xlc19jb250ZXh0X3QqIGMpOwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19BUlJBWV9ICi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvY29udGV4dC5oIGIvb3BlbmdsL2xpYmFnbC9jb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjVhMzAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9jb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19DT05URVhUX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19DT05URVhUX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpZmRlZiBIQVZFX0FORFJPSURfT1MKLSNpbmNsdWRlIDxiaW9uaWNfdGxzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHByaXZhdGUvcGl4ZWxmbGluZ2VyL2dnbF9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0KLWNvbnN0IHVuc2lnbmVkIGludCBPR0xFU19OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgPSAxMAotI2lmZGVmIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlCi0gICAgICAgICsgMQotI2VuZGlmCi0gICAgICAgIDsKLQotY2xhc3MgRUdMVGV4dHVyZU9iamVjdDsKLWNsYXNzIEVHTFN1cmZhY2VNYW5hZ2VyOwotY2xhc3MgRUdMQnVmZmVyT2JqZWN0TWFuYWdlcjsKLQotbmFtZXNwYWNlIGdsIHsKLQotc3RydWN0IG9nbGVzX2NvbnRleHRfdDsKLXN0cnVjdCBtYXRyaXh4X3Q7Ci1zdHJ1Y3QgdHJhbnNmb3JtX3Q7Ci1zdHJ1Y3QgYnVmZmVyX3Q7Ci0KLW9nbGVzX2NvbnRleHRfdCogZ2V0R2xDb250ZXh0KCk7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW5saW5lIHZvaWQgc3dhcChUJiBhLCBUJiBiKSB7Ci0gICAgVCB0KGEpOyBhID0gYjsgYiA9IHQ7Ci19Ci10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotaW5saW5lIFQgbWF4KFQgYSwgVCBiKSB7Ci0gICAgcmV0dXJuIGE8YiA/IGIgOiBhOwotfQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWlubGluZSBUIG1heChUIGEsIFQgYiwgVCBjKSB7Ci0gICAgcmV0dXJuIG1heChhLCBtYXgoYiwgYykpOwotfQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWlubGluZSBUIG1pbihUIGEsIFQgYikgewotICAgIHJldHVybiBhPGIgPyBhIDogYjsKLX0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgVCBtaW4oVCBhLCBUIGIsIFQgYykgewotICAgIHJldHVybiBtaW4oYSwgbWluKGIsIGMpKTsKLX0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgVCBtaW4oVCBhLCBUIGIsIFQgYywgVCBkKSB7Ci0gICAgcmV0dXJuIG1pbihtaW4oYSxiKSwgbWluKGMsZCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB2ZXJ0aWNlcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgdmVjM190IHsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHN0cnVjdCB7IEdMZml4ZWQgeCwgeSwgejsgfTsKLSAgICAgICAgc3RydWN0IHsgR0xmaXhlZCByLCBnLCBiOyB9OwotICAgICAgICBzdHJ1Y3QgeyBHTGZpeGVkIFMsIFQsIFI7IH07Ci0gICAgICAgIEdMZml4ZWQgdlszXTsKLSAgICB9OwotfTsKLQotc3RydWN0IHZlYzRfdCB7Ci0gICAgdW5pb24gewotICAgICAgICBzdHJ1Y3QgeyBHTGZpeGVkIHgsIHksIHosIHc7IH07Ci0gICAgICAgIHN0cnVjdCB7IEdMZml4ZWQgciwgZywgYiwgYTsgfTsKLSAgICAgICAgc3RydWN0IHsgR0xmaXhlZCBTLCBULCBSLCBROyB9OwotICAgICAgICBHTGZpeGVkIHZbNF07Ci0gICAgfTsKLX07Ci0KLXN0cnVjdCB2ZXJ0ZXhfdCB7Ci0gICAgZW51bSB7Ci0gICAgICAgIC8vIHRoZXNlIGNvbnN0YW50IG1hdHRlciBmb3Igb3VyIGNsaXBwaW5nCi0gICAgICAgIENMSVBfTCAgICAgICAgICA9IDB4MDAwMSwgICAvLyBjbGlwcGluZyBmbGFncwotICAgICAgICBDTElQX1IgICAgICAgICAgPSAweDAwMDIsCi0gICAgICAgIENMSVBfQiAgICAgICAgICA9IDB4MDAwNCwKLSAgICAgICAgQ0xJUF9UICAgICAgICAgID0gMHgwMDA4LAotICAgICAgICBDTElQX04gICAgICAgICAgPSAweDAwMTAsCi0gICAgICAgIENMSVBfRiAgICAgICAgICA9IDB4MDAyMCwKLQotICAgICAgICBFWUUgICAgICAgICAgICAgPSAweDAwNDAsCi0gICAgICAgIFJFU0VSVkVEICAgICAgICA9IDB4MDA4MCwKLQotICAgICAgICBVU0VSX0NMSVBfMCAgICAgPSAweDAxMDAsICAgLy8gdXNlciBjbGlwcGluZyBmbGFncwotICAgICAgICBVU0VSX0NMSVBfMSAgICAgPSAweDAyMDAsCi0gICAgICAgIFVTRVJfQ0xJUF8yICAgICA9IDB4MDQwMCwKLSAgICAgICAgVVNFUl9DTElQXzMgICAgID0gMHgwODAwLAotICAgICAgICBVU0VSX0NMSVBfNCAgICAgPSAweDEwMDAsCi0gICAgICAgIFVTRVJfQ0xJUF81ICAgICA9IDB4MjAwMCwKLQotICAgICAgICBMSVQgICAgICAgICAgICAgPSAweDQwMDAsICAgLy8gbGlnaHRpbmcgaGFzIGJlZW4gYXBwbGllZAotICAgICAgICBUVCAgICAgICAgICAgICAgPSAweDgwMDAsICAgLy8gdGV4dHVyZSBjb29yZHMgdHJhbnNmb3JtZWQKLQotICAgICAgICBGUlVTVFVNX0NMSVBfQUxMPSAweDAwM0YsCi0gICAgICAgIFVTRVJfQ0xJUF9BTEwgICA9IDB4M0YwMCwKLSAgICAgICAgQ0xJUF9BTEwgICAgICAgID0gMHgzRjNGLAotICAgIH07Ci0KLSAgICAvLyB0aGUgZmllbGRzIGJlbG93IGFyZSBhcnJhbmdlZCB0byBtaW5pbWl6ZSBkLWNhY2hlIHVzYWdlCi0gICAgLy8gd2UgZ3JvdXAgdG9nZXRoZXIsIGJ5IGNhY2hlLWxpbmUsIHRoZSBmaWVsZHMgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZAotCi0gICAgdW5pb24gewotICAgIHZlYzRfdCAgICAgICAgICBvYmo7Ci0gICAgdmVjNF90ICAgICAgICAgIGV5ZTsKLSAgICB9OwotICAgIHZlYzRfdCAgICAgICAgICBjbGlwOwotCi0gICAgdWludDMyX3QgICAgICAgIGZsYWdzOwotICAgIHNpemVfdCAgICAgICAgICBpbmRleDsgIC8vIGNhY2hlIHRhZywgYW5kIHZlcnRleCBpbmRleAotICAgIEdMZml4ZWQgICAgICAgICBmb2c7Ci0gICAgdWludDhfdCAgICAgICAgIGxvY2tlZDsKLSAgICB1aW50OF90ICAgICAgICAgbXJ1OwotICAgIHVpbnQ4X3QgICAgICAgICByZXNlcnZlZFsyXTsKLSAgICB2ZWM0X3QgICAgICAgICAgd2luZG93OwotCi0gICAgdmVjNF90ICAgICAgICAgIGNvbG9yOwotICAgIHZlYzRfdCAgICAgICAgICB0ZXh0dXJlW0dHTF9URVhUVVJFX1VOSVRfQ09VTlRdOwotICAgIHVpbnQzMl90ICAgICAgICByZXNlcnZlZDFbNF07Ci0KLSAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgZmxhZ3MgPSBpbmRleCA9IGxvY2tlZCA9IG1ydSA9IDA7Ci0gICAgfQotfTsKLQotc3RydWN0IHBvaW50X3NpemVfdCB7Ci0gICAgR0dMY29vcmQgICAgc2l6ZTsKLSAgICBHTGJvb2xlYW4gICBzbW9vdGg7Ci19OwotCi1zdHJ1Y3QgbGluZV93aWR0aF90IHsKLSAgICBHR0xjb29yZCAgICB3aWR0aDsKLSAgICBHTGJvb2xlYW4gICBzbW9vdGg7Ci19OwotCi1zdHJ1Y3QgcG9seWdvbl9vZmZzZXRfdCB7Ci0gICAgR0xmaXhlZCAgICAgZmFjdG9yOwotICAgIEdMZml4ZWQgICAgIHVuaXRzOwotICAgIEdMYm9vbGVhbiAgIGVuYWJsZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGFycmF5cwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgYXJyYXlfdCB7Ci0gICAgdHlwZWRlZiB2b2lkICgqZmV0Y2hlcl90KShvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiwgY29uc3QgR0x2b2lkKik7Ci0gICAgZmV0Y2hlcl90ICAgICAgIGZldGNoOwotICAgIEdMdm9pZCBjb25zdCogICBwaHlzaWNhbF9wb2ludGVyOwotICAgIEdMaW50ICAgICAgICAgICBzaXplOwotICAgIEdMc2l6ZWkgICAgICAgICBzdHJpZGU7Ci0gICAgR0x2b2lkIGNvbnN0KiAgIHBvaW50ZXI7Ci0gICAgYnVmZmVyX3QgY29uc3QqIGJvOwotICAgIHVpbnQxNl90ICAgICAgICB0eXBlOwotICAgIEdMYm9vbGVhbiAgICAgICBlbmFibGU7Ci0gICAgR0xib29sZWFuICAgICAgIHBhZDsKLSAgICBHTHNpemVpICAgICAgICAgYm91bmRzOwotICAgIHZvaWQgaW5pdChHTGludCwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKiwgY29uc3QgYnVmZmVyX3QqLCBHTHNpemVpKTsKLSAgICBpbmxpbmUgdm9pZCByZXNvbHZlKCk7Ci0gICAgaW5saW5lIGNvbnN0IEdMdWJ5dGUqIGVsZW1lbnQoR0xpbnQgaSkgY29uc3QgewotICAgICAgICByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKXBoeXNpY2FsX3BvaW50ZXIgKyBpICogc3RyaWRlOwotICAgIH0KLX07Ci0KLXN0cnVjdCBhcnJheV9tYWNoaW5lX3QgewotICAgIGFycmF5X3QgICAgICAgICB2ZXJ0ZXg7Ci0gICAgYXJyYXlfdCAgICAgICAgIG5vcm1hbDsKLSAgICBhcnJheV90ICAgICAgICAgY29sb3I7Ci0gICAgYXJyYXlfdCAgICAgICAgIHRleHR1cmVbR0dMX1RFWFRVUkVfVU5JVF9DT1VOVF07Ci0gICAgdWludDhfdCAgICAgICAgIGFjdGl2ZVRleHR1cmU7Ci0gICAgdWludDhfdCAgICAgICAgIHRtdTsKLSAgICB1aW50MTZfdCAgICAgICAgY3VsbDsKLSAgICB1aW50MzJfdCAgICAgICAgZmxhZ3M7Ci0gICAgR0xlbnVtICAgICAgICAgIGluZGljZXNUeXBlOwotICAgIGJ1ZmZlcl90IGNvbnN0KiBhcnJheV9idWZmZXI7Ci0gICAgYnVmZmVyX3QgY29uc3QqIGVsZW1lbnRfYXJyYXlfYnVmZmVyOwotCi0gICAgdm9pZCAoKmNvbXBpbGVFbGVtZW50cykob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqLCBHTGludCwgR0xzaXplaSk7Ci0gICAgdm9pZCAoKmNvbXBpbGVFbGVtZW50KShvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCosIEdMaW50KTsKLQotICAgIHZvaWQgKCptdnBfdHJhbnNmb3JtKSh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCosIHZlYzRfdCBjb25zdCopOwotICAgIHZvaWQgKCptdl90cmFuc2Zvcm0pKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiwgdmVjNF90IGNvbnN0Kik7Ci0gICAgdm9pZCAoKnRleF90cmFuc2Zvcm1bMl0pKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiwgdmVjNF90IGNvbnN0Kik7Ci0gICAgdm9pZCAoKnBlcnNwZWN0aXZlKShvZ2xlc19jb250ZXh0X3QqYywgdmVydGV4X3QqIHYpOwotICAgIHZvaWQgKCpjbGlwVmVydGV4KShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiBudiwKLSAgICAgICAgICAgIEdHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCk7Ci0gICAgdm9pZCAoKmNsaXBFeWUpKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAotICAgICAgICAgICAgR0dMZml4ZWQgdCwgY29uc3QgdmVydGV4X3QqIHMsIGNvbnN0IHZlcnRleF90KiBwKTsKLX07Ci0KLXN0cnVjdCB2ZXJ0ZXhfY2FjaGVfdCB7Ci0gICAgZW51bSB7Ci0gICAgICAgIC8vIG11c3QgYmUgYXQgbGVhc3QgNAotICAgICAgICAvLyAzIHZlcnRpY2UgZm9yIHRyaWFuZ2xlcwotICAgICAgICAvLyBvciAyICsgMiBmb3IgaW5kZXhlZCB0cmlhbmdsZXMgdy8gY2FjaGUgY29udGVudGlvbgotICAgICAgICBWRVJURVhfQlVGRkVSX1NJWkUgID0gOCwKLSAgICAgICAgLy8gbXVzdCBiZSBhIHBvd2VyIG9mIHR3byBhbmQgYXQgbGVhc3QgMwotICAgICAgICBWRVJURVhfQ0FDSEVfU0laRSAgID0gNjQsICAgLy8gOCBLQgotCi0gICAgICAgIElOREVYX0JJVFMgICAgICA9IDE2LAotICAgICAgICBJTkRFWF9NQVNLICAgICAgPSAoKDFMVTw8SU5ERVhfQklUUyktMSksCi0gICAgICAgIElOREVYX1NFUSAgICAgICA9IDFMVTw8SU5ERVhfQklUUywKLSAgICB9OwotICAgIHZlcnRleF90KiAgICAgICB2QnVmZmVyOwotICAgIHZlcnRleF90KiAgICAgICB2Q2FjaGU7Ci0gICAgdWludDMyX3QgICAgICAgIHNlcXVlbmNlOwotICAgIHZvaWQqICAgICAgICAgICBiYXNlOwotICAgIHVpbnQzMl90ICAgICAgICB0b3RhbDsKLSAgICB1aW50MzJfdCAgICAgICAgbWlzc2VzOwotICAgIGludDY0X3QgICAgICAgICBzdGFydFRpbWU7Ci0gICAgdm9pZCBpbml0KCk7Ci0gICAgdm9pZCB1bmluaXQoKTsKLSAgICB2b2lkIGNsZWFyKCk7Ci0gICAgdm9pZCBkdW1wX3N0YXRzKEdMZW51bSBtb2RlKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGZvZwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgZm9nX3QgewotICAgIEdMZml4ZWQgICAgIGRlbnNpdHk7Ci0gICAgR0xmaXhlZCAgICAgc3RhcnQ7Ci0gICAgR0xmaXhlZCAgICAgZW5kOwotICAgIEdMZml4ZWQgICAgIGludkVuZE1pbnVzU3RhcnQ7Ci0gICAgR0xlbnVtICAgICAgbW9kZTsKLSAgICBHTGZpeGVkICAgICAoKmZvZykob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkIHopOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdXNlciBjbGlwIHBsYW5lcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCB1bnNpZ25lZCBpbnQgT0dMRVNfTUFYX0NMSVBfUExBTkVTID0gNjsKLQotc3RydWN0IGNsaXBfcGxhbmVfdCB7Ci0gICAgdmVjNF90ICAgICAgZXF1YXRpb247Ci19OwotCi1zdHJ1Y3QgdXNlcl9jbGlwX3BsYW5lc190IHsKLSAgICBjbGlwX3BsYW5lX3QgICAgcGxhbmVbT0dMRVNfTUFYX0NMSVBfUExBTkVTXTsKLSAgICB1aW50MzJfdCAgICAgICAgZW5hYmxlOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gbGlnaHRpbmcKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgdW5zaWduZWQgaW50IE9HTEVTX01BWF9MSUdIVFMgPSA4OwotCi1zdHJ1Y3QgbGlnaHRfdCB7Ci0gICAgdmVjNF90ICAgICAgYW1iaWVudDsKLSAgICB2ZWM0X3QgICAgICBkaWZmdXNlOwotICAgIHZlYzRfdCAgICAgIHNwZWN1bGFyOwotICAgIHZlYzRfdCAgICAgIGltcGxpY2l0QW1iaWVudDsKLSAgICB2ZWM0X3QgICAgICBpbXBsaWNpdERpZmZ1c2U7Ci0gICAgdmVjNF90ICAgICAgaW1wbGljaXRTcGVjdWxhcjsKLSAgICB2ZWM0X3QgICAgICBwb3NpdGlvbjsgICAgICAgLy8gcG9zaXRpb24gaW4gZXllIHNwYWNlCi0gICAgdmVjNF90ICAgICAgb2JqUG9zaXRpb247Ci0gICAgdmVjNF90ICAgICAgbm9ybWFsaXplZE9ialBvc2l0aW9uOwotICAgIHZlYzRfdCAgICAgIHNwb3REaXI7Ci0gICAgdmVjNF90ICAgICAgbm9ybWFsaXplZFNwb3REaXI7Ci0gICAgR0xmaXhlZCAgICAgc3BvdEV4cDsKLSAgICBHTGZpeGVkICAgICBzcG90Q3V0b2ZmOwotICAgIEdMZml4ZWQgICAgIHNwb3RDdXRvZmZDb3NpbmU7Ci0gICAgR0xmaXhlZCAgICAgYXR0ZW51YXRpb25bM107Ci0gICAgR0xmaXhlZCAgICAgckNvbnN0QXR0ZW51YXRpb247Ci0gICAgR0xib29sZWFuICAgZW5hYmxlOwotfTsKLQotc3RydWN0IG1hdGVyaWFsX3QgewotICAgIHZlYzRfdCAgICAgIGFtYmllbnQ7Ci0gICAgdmVjNF90ICAgICAgZGlmZnVzZTsKLSAgICB2ZWM0X3QgICAgICBzcGVjdWxhcjsKLSAgICB2ZWM0X3QgICAgICBlbWlzc2lvbjsKLSAgICBHTGZpeGVkICAgICBzaGluaW5lc3M7Ci19OwotCi1zdHJ1Y3QgbGlnaHRfbW9kZWxfdCB7Ci0gICAgdmVjNF90ICAgICAgYW1iaWVudDsKLSAgICBHTGJvb2xlYW4gICB0d29TaWRlOwotfTsKLQotc3RydWN0IGNvbG9yX21hdGVyaWFsX3QgewotICAgIEdMZW51bSAgICAgIGZhY2U7Ci0gICAgR0xlbnVtICAgICAgbW9kZTsKLSAgICBHTGJvb2xlYW4gICBlbmFibGU7Ci19OwotCi1zdHJ1Y3QgbGlnaHRpbmdfdCB7Ci0gICAgbGlnaHRfdCAgICAgICAgICAgICBsaWdodHNbT0dMRVNfTUFYX0xJR0hUU107Ci0gICAgbWF0ZXJpYWxfdCAgICAgICAgICBmcm9udDsKLSAgICBsaWdodF9tb2RlbF90ICAgICAgIGxpZ2h0TW9kZWw7Ci0gICAgY29sb3JfbWF0ZXJpYWxfdCAgICBjb2xvck1hdGVyaWFsOwotICAgIHZlYzRfdCAgICAgICAgICAgICAgaW1wbGljaXRTY2VuZUVtaXNzaW9uQW5kQW1iaWVudDsKLSAgICB2ZWM0X3QgICAgICAgICAgICAgIG9ialZpZXdlcjsKLSAgICB1aW50MzJfdCAgICAgICAgICAgIGVuYWJsZWRMaWdodHM7Ci0gICAgR0xib29sZWFuICAgICAgICAgICBlbmFibGU7Ci0gICAgR0xlbnVtICAgICAgICAgICAgICBzaGFkZU1vZGVsOwotICAgIHR5cGVkZWYgdm9pZCAoKmxpZ2h0X2ZjdF90KShvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopOwotICAgIHZvaWQgKCpsaWdodFZlcnRleCkob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7Ci0gICAgdm9pZCAoKmxpZ2h0VHJpYW5nbGUpKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpOwotfTsKLQotc3RydWN0IGN1bGxpbmdfdCB7Ci0gICAgR0xlbnVtICAgICAgY3VsbEZhY2U7Ci0gICAgR0xlbnVtICAgICAgZnJvbnRGYWNlOwotICAgIEdMYm9vbGVhbiAgIGVuYWJsZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHRleHR1cmVzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCB0ZXh0dXJlX3VuaXRfdCB7Ci0gICAgR0x1aW50ICAgICAgICAgICAgICBuYW1lOwotICAgIEVHTFRleHR1cmVPYmplY3QqICAgdGV4dHVyZTsKLSAgICB1aW50OF90ICAgICAgICAgICAgIGRpcnR5OwotfTsKLQotc3RydWN0IHRleHR1cmVfc3RhdGVfdAotewotICAgIHRleHR1cmVfdW5pdF90ICAgICAgdG11W0dHTF9URVhUVVJFX1VOSVRfQ09VTlRdOwotICAgIGludCAgICAgICAgICAgICAgICAgYWN0aXZlOyAgICAgLy8gYWN0aXZlIHRtdQotICAgIEVHTFRleHR1cmVPYmplY3QqICAgZGVmYXVsdFRleHR1cmU7Ci0gICAgR0dMQ29udGV4dCogICAgICAgICBnZ2w7Ci0gICAgdWludDhfdCAgICAgICAgICAgICBwYWNrQWxpZ25tZW50OwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgdW5wYWNrQWxpZ25tZW50OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdHJhbnNmb3JtYXRpb24gYW5kIG1hdHJpY2VzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCBtYXRyaXhmX3Q7Ci0KLXN0cnVjdCBtYXRyaXh4X3QgewotICAgIEdMZml4ZWQgbVsxNl07Ci0gICAgdm9pZCBsb2FkKGNvbnN0IG1hdHJpeGZfdCYgcmhzKTsKLX07Ci0KLXN0cnVjdCBtYXRyaXhfc3RhY2tfdDsKLQotCi1zdHJ1Y3QgbWF0cml4Zl90IHsKLSAgICB2b2lkIGxvYWRJZGVudGl0eSgpOwotICAgIHZvaWQgbG9hZChjb25zdCBtYXRyaXhmX3QmIHJocyk7Ci0KLSAgICBpbmxpbmUgR0xmbG9hdCogZWRpdEVsZW1lbnRzKCkgeyByZXR1cm4gbTsgfQotICAgIGlubGluZSBHTGZsb2F0IGNvbnN0KiBlbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIG07IH0KLQotICAgIHZvaWQgc2V0KGNvbnN0IEdMZml4ZWQqIHJocyk7Ci0gICAgdm9pZCBzZXQoY29uc3QgR0xmbG9hdCogcmhzKTsKLQotICAgIHN0YXRpYyB2b2lkIG11bHRpcGx5KG1hdHJpeGZfdCYgciwKLSAgICAgICAgICAgIGNvbnN0IG1hdHJpeGZfdCYgbGhzLCBjb25zdCBtYXRyaXhmX3QmIHJocyk7Ci0KLSAgICB2b2lkIGR1bXAoY29uc3QgY2hhciogd2hhdCk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIHN0cnVjdCBtYXRyaXhfc3RhY2tfdDsKLSAgICBHTGZsb2F0ICAgICBtWzE2XTsKLSAgICB2b2lkIGxvYWQoY29uc3QgR0xmaXhlZCogcmhzKTsKLSAgICB2b2lkIGxvYWQoY29uc3QgR0xmbG9hdCogcmhzKTsKLSAgICB2b2lkIG11bHRpcGx5KGNvbnN0IG1hdHJpeGZfdCYgcmhzKTsKLSAgICB2b2lkIHRyYW5zbGF0ZShHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLSAgICB2b2lkIHNjYWxlKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotICAgIHZvaWQgcm90YXRlKEdMZmxvYXQgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci19OwotCi1lbnVtIHsKLSAgICBPUF9JREVOVElUWSAgICAgICAgID0gMHgwMCwKLSAgICBPUF9UUkFOU0xBVEUgICAgICAgID0gMHgwMSwKLSAgICBPUF9VTklGT1JNX1NDQUxFICAgID0gMHgwMiwKLSAgICBPUF9TQ0FMRSAgICAgICAgICAgID0gMHgwNSwKLSAgICBPUF9ST1RBVEUgICAgICAgICAgID0gMHgwOCwKLSAgICBPUF9TS0VXICAgICAgICAgICAgID0gMHgxMCwKLSAgICBPUF9BTEwgICAgICAgICAgICAgID0gMHgxRgotfTsKLQotc3RydWN0IHRyYW5zZm9ybV90IHsKLSAgICBlbnVtIHsKLSAgICAgICAgRkxBR1NfMkRfUFJPSkVDVElPTiA9IDB4MQotICAgIH07Ci0gICAgbWF0cml4eF90ICAgICAgIG1hdHJpeDsKLSAgICB1aW50MzJfdCAgICAgICAgZmxhZ3M7Ci0gICAgdWludDMyX3QgICAgICAgIG9wczsKLQotICAgIHVuaW9uIHsKLSAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIHZvaWQgKCpwb2ludDIpKHRyYW5zZm9ybV90IGNvbnN0KiB0LCB2ZWM0X3QqLCB2ZWM0X3QgY29uc3QqKTsKLSAgICAgICAgICAgIHZvaWQgKCpwb2ludDMpKHRyYW5zZm9ybV90IGNvbnN0KiB0LCB2ZWM0X3QqLCB2ZWM0X3QgY29uc3QqKTsKLSAgICAgICAgICAgIHZvaWQgKCpwb2ludDQpKHRyYW5zZm9ybV90IGNvbnN0KiB0LCB2ZWM0X3QqLCB2ZWM0X3QgY29uc3QqKTsKLSAgICAgICAgfTsKLSAgICAgICAgdm9pZCAoKnBvaW50dlszXSkodHJhbnNmb3JtX3QgY29uc3QqIHQsIHZlYzRfdCosIHZlYzRfdCBjb25zdCopOwotICAgIH07Ci0KLSAgICB2b2lkIGxvYWRJZGVudGl0eSgpOwotICAgIHZvaWQgcGlja2VyKCk7Ci0gICAgdm9pZCBkdW1wKGNvbnN0IGNoYXIqIHdoYXQpOwotfTsKLQotc3RydWN0IG12dWlfdHJhbnNmb3JtX3QgOiBwdWJsaWMgdHJhbnNmb3JtX3QKLXsKLSAgICB2b2lkIHBpY2tlcigpOwotfTsKLQotc3RydWN0IG1hdHJpeF9zdGFja190IHsKLSAgICBlbnVtIHsKLSAgICAgICAgRE9fUElDS0VSICAgICAgICAgICA9IDB4MSwKLSAgICAgICAgRE9fRkxPQVRfVE9fRklYRUQgICA9IDB4MgotICAgIH07Ci0gICAgdHJhbnNmb3JtX3QgICAgIHRyYW5zZm9ybTsKLSAgICB1aW50OF90ICAgICAgICAgbWF4RGVwdGg7Ci0gICAgdWludDhfdCAgICAgICAgIGRlcHRoOwotICAgIHVpbnQ4X3QgICAgICAgICBkaXJ0eTsKLSAgICB1aW50OF90ICAgICAgICAgcmVzZXJ2ZWQ7Ci0gICAgbWF0cml4Zl90ICAgICAgICpzdGFjazsKLSAgICB1aW50OF90ICAgICAgICAgKm9wczsKLSAgICB2b2lkIGluaXQoaW50IGRlcHRoKTsKLSAgICB2b2lkIHVuaW5pdCgpOwotICAgIHZvaWQgbG9hZElkZW50aXR5KCk7Ci0gICAgdm9pZCBsb2FkKGNvbnN0IEdMZml4ZWQqIHJocyk7Ci0gICAgdm9pZCBsb2FkKGNvbnN0IEdMZmxvYXQqIHJocyk7Ci0gICAgdm9pZCBtdWx0aXBseShjb25zdCBtYXRyaXhmX3QmIHJocyk7Ci0gICAgdm9pZCB0cmFuc2xhdGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci0gICAgdm9pZCBzY2FsZShHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLSAgICB2b2lkIHJvdGF0ZShHTGZsb2F0IGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotICAgIEdMaW50IHB1c2goKTsKLSAgICBHTGludCBwb3AoKTsKLSAgICB2b2lkIHZhbGlkYXRlKCk7Ci0gICAgbWF0cml4Zl90JiB0b3AoKSB7IHJldHVybiBzdGFja1tkZXB0aF07IH0KLSAgICBjb25zdCBtYXRyaXhmX3QmIHRvcCgpIGNvbnN0IHsgcmV0dXJuIHN0YWNrW2RlcHRoXTsgfQotICAgIHVpbnQzMl90IHRvcF9vcHMoKSBjb25zdCB7IHJldHVybiBvcHNbZGVwdGhdOyB9Ci0gICAgaW5saW5lIGJvb2wgaXNSaWdpZEJvZHkoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhKG9wc1tkZXB0aF0gJiB+KE9QX1RSQU5TTEFURXxPUF9VTklGT1JNX1NDQUxFfE9QX1JPVEFURSkpOwotICAgIH0KLX07Ci0KLXN0cnVjdCB2cF90cmFuc2Zvcm1fdCB7Ci0gICAgdHJhbnNmb3JtX3QgICAgIHRyYW5zZm9ybTsKLSAgICBtYXRyaXhmX3QgICAgICAgbWF0cml4OwotICAgIEdMZmxvYXQgICAgICAgICB6TmVhcjsKLSAgICBHTGZsb2F0ICAgICAgICAgekZhcjsKLSAgICB2b2lkIGxvYWRJZGVudGl0eSgpOwotfTsKLQotc3RydWN0IHRyYW5zZm9ybV9zdGF0ZV90IHsKLSAgICBlbnVtIHsKLSAgICAgICAgTU9ERUxWSUVXICAgICAgICAgICA9IDB4MDEsCi0gICAgICAgIFBST0pFQ1RJT04gICAgICAgICAgPSAweDAyLAotICAgICAgICBWSUVXUE9SVCAgICAgICAgICAgID0gMHgwNCwKLSAgICAgICAgVEVYVFVSRSAgICAgICAgICAgICA9IDB4MDgsCi0gICAgICAgIE1WVUkgICAgICAgICAgICAgICAgPSAweDEwLAotICAgICAgICBNVklUICAgICAgICAgICAgICAgID0gMHgyMCwKLSAgICAgICAgTVZQICAgICAgICAgICAgICAgICA9IDB4NDAsCi0gICAgfTsKLSAgICBtYXRyaXhfc3RhY2tfdCAgICAgICpjdXJyZW50OwotICAgIG1hdHJpeF9zdGFja190ICAgICAgbW9kZWx2aWV3OwotICAgIG1hdHJpeF9zdGFja190ICAgICAgcHJvamVjdGlvbjsKLSAgICBtYXRyaXhfc3RhY2tfdCAgICAgIHRleHR1cmVbR0dMX1RFWFRVUkVfVU5JVF9DT1VOVF07Ci0KLSAgICAvLyBtb2RlbHZpZXcgKiBwcm9qZWN0aW9uCi0gICAgdHJhbnNmb3JtX3QgICAgICAgICBtdnAgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7Ci0gICAgLy8gdmlld3BvcnQgdHJhbnNmb3JtYXRpb24KLSAgICB2cF90cmFuc2Zvcm1fdCAgICAgIHZwdCAgICAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKLSAgICAvLyBzYW1lIGZvciA0LUQgdmVydGljZXMKLSAgICB0cmFuc2Zvcm1fdCAgICAgICAgIG12cDQ7Ci0gICAgLy8gZnVsbCBtb2RlbHZpZXcgaW52ZXJzZSB0cmFuc3Bvc2UKLSAgICB0cmFuc2Zvcm1fdCAgICAgICAgIG12aXQ0OwotICAgIC8vIHVwcGVyIDN4MyBvZiBtdi1pbnZlcnNlLXRyYW5zcG9zZSAoZm9yIG5vcm1hbHMpCi0gICAgbXZ1aV90cmFuc2Zvcm1fdCAgICBtdnVpOwotCi0gICAgR0xlbnVtICAgICAgICAgICAgICBtYXRyaXhNb2RlOwotICAgIEdMZW51bSAgICAgICAgICAgICAgcmVzY2FsZU5vcm1hbHM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICBkaXJ0eTsKLSAgICB2b2lkIGludmFsaWRhdGUoKTsKLSAgICB2b2lkIHVwZGF0ZV9tdnAoKTsKLSAgICB2b2lkIHVwZGF0ZV9tdml0KCk7Ci0gICAgdm9pZCB1cGRhdGVfbXZ1aSgpOwotfTsKLQotc3RydWN0IHZpZXdwb3J0X3QgewotICAgIEdMaW50ICAgICAgIHg7Ci0gICAgR0xpbnQgICAgICAgeTsKLSAgICBHTHNpemVpICAgICB3OwotICAgIEdMc2l6ZWkgICAgIGg7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgR0xpbnQgICAgICAgeDsKLSAgICAgICAgR0xpbnQgICAgICAgeTsKLSAgICB9IHN1cmZhY2Vwb3J0OwotICAgIHN0cnVjdCB7Ci0gICAgICAgIEdMaW50ICAgICAgIHg7Ci0gICAgICAgIEdMaW50ICAgICAgIHk7Ci0gICAgICAgIEdMc2l6ZWkgICAgIHc7Ci0gICAgICAgIEdMc2l6ZWkgICAgIGg7Ci0gICAgfSBzY2lzc29yOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTGVycGluZwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgY29tcHV0ZV9pdGVyYXRvcnNfdAotewotICAgIHZvaWQgaW5pdFRyaWFuZ2xlKAotICAgICAgICAgICAgdmVydGV4X3QgY29uc3QqIHYwLAotICAgICAgICAgICAgdmVydGV4X3QgY29uc3QqIHYxLAotICAgICAgICAgICAgdmVydGV4X3QgY29uc3QqIHYyKTsKLQotICAgIHZvaWQgaW5pdExpbmUoCi0gICAgICAgICAgICB2ZXJ0ZXhfdCBjb25zdCogdjAsCi0gICAgICAgICAgICB2ZXJ0ZXhfdCBjb25zdCogdjEpOwotCi0gICAgaW5saW5lIHZvaWQgaW5pdExlcnAodmVydGV4X3QgY29uc3QqIHYwLCB1aW50MzJfdCBlbmFibGVzKTsKLQotICAgIGludCBpdGVyYXRvcnNTY2FsZShpbnQzMl90IGl0WzNdLAotICAgICAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3Q7Ci0KLSAgICB2b2lkIGl0ZXJhdG9yczE2MTYoR0dMZml4ZWQgaXRbM10sCi0gICAgICAgICAgICBHR0xmaXhlZCBjMCwgR0dMZml4ZWQgYzEsIEdHTGZpeGVkIGMyKSBjb25zdDsKLQotICAgIHZvaWQgaXRlcmF0b3JzMDAzMihpbnQzMl90IGl0WzNdLAotICAgICAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3Q7Ci0KLSAgICB2b2lkIGl0ZXJhdG9yczAwMzIoaW50NjRfdCBpdFszXSwKLSAgICAgICAgICAgIGludDMyX3QgYzAsIGludDMyX3QgYzEsIGludDMyX3QgYzIpIGNvbnN0OwotCi0gICAgR0dMY29vcmQgYXJlYSgpIGNvbnN0IHsgcmV0dXJuIG1fYXJlYTsgfQotCi1wcml2YXRlOgotICAgIC8vIGRvbid0IGNoYW5nZSBvcmRlciBvZiBtZW1iZXJzIGhlcmUgLS0gdXNlZCBieSBpdGVyYXRvcnMuUwotICAgIEdHTGNvb3JkIG1fZHgwMSwgbV9keTEwLCBtX2R4MjAsIG1fZHkwMjsKLSAgICBHR0xjb29yZCBtX3gwLCBtX3kwOwotICAgIEdHTGNvb3JkIG1fYXJlYTsKLSAgICB1aW50OF90IG1fc2NhbGU7Ci0gICAgdWludDhfdCBtX2FyZWFfc2NhbGU7Ci0gICAgdWludDhfdCBtX3Jlc2VydmVkWzJdOwotCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBzdGF0ZQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi0gICAgLy8gV2UgaGF2ZSBhIGRlZGljYXRlZCBUTFMgc2xvdCBpbiBiaW9uaWMKLSAgICBpbmxpbmUgdm9pZCBzZXRHbFRocmVhZFNwZWNpZmljKG9nbGVzX2NvbnRleHRfdCAqdmFsdWUpIHsKLSAgICAgICAgKCh1aW50MzJfdCAqKV9fZ2V0X3RscygpKVtUTFNfU0xPVF9PUEVOR0xdID0gKHVpbnQzMl90KXZhbHVlOwotICAgIH0KLSAgICBpbmxpbmUgb2dsZXNfY29udGV4dF90KiBnZXRHbFRocmVhZFNwZWNpZmljKCkgewotICAgICAgICByZXR1cm4gKG9nbGVzX2NvbnRleHRfdCAqKSgoKHVuc2lnbmVkICopX19nZXRfdGxzKCkpW1RMU19TTE9UX09QRU5HTF0pOwotICAgIH0KLSNlbHNlCi0gICAgZXh0ZXJuIHB0aHJlYWRfa2V5X3QgZ0dMS2V5OwotICAgIGlubGluZSB2b2lkIHNldEdsVGhyZWFkU3BlY2lmaWMob2dsZXNfY29udGV4dF90ICp2YWx1ZSkgewotICAgICAgICBwdGhyZWFkX3NldHNwZWNpZmljKGdHTEtleSwgdmFsdWUpOwotICAgIH0KLSAgICBpbmxpbmUgb2dsZXNfY29udGV4dF90KiBnZXRHbFRocmVhZFNwZWNpZmljKCkgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8b2dsZXNfY29udGV4dF90Kj4ocHRocmVhZF9nZXRzcGVjaWZpYyhnR0xLZXkpKTsKLSAgICB9Ci0jZW5kaWYKLQotCi1zdHJ1Y3QgcHJpbXNfdCB7Ci0gICAgdHlwZWRlZiBvZ2xlc19jb250ZXh0X3QqIEdMOwotICAgIHZvaWQgKCpyZW5kZXJQb2ludCkoR0wsIHZlcnRleF90Kik7Ci0gICAgdm9pZCAoKnJlbmRlckxpbmUpKEdMLCB2ZXJ0ZXhfdCosIHZlcnRleF90Kik7Ci0gICAgdm9pZCAoKnJlbmRlclRyaWFuZ2xlKShHTCwgdmVydGV4X3QqLCB2ZXJ0ZXhfdCosIHZlcnRleF90Kik7Ci19OwotCi1zdHJ1Y3Qgb2dsZXNfY29udGV4dF90IHsKLSAgICBjb250ZXh0X3QgICAgICAgICAgICAgICByYXN0ZXJpemVyOwotICAgIGFycmF5X21hY2hpbmVfdCAgICAgICAgIGFycmF5cyAgICAgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7Ci0gICAgdGV4dHVyZV9zdGF0ZV90ICAgICAgICAgdGV4dHVyZXM7Ci0gICAgdHJhbnNmb3JtX3N0YXRlX3QgICAgICAgdHJhbnNmb3JtczsKLSAgICB2ZXJ0ZXhfY2FjaGVfdCAgICAgICAgICB2YzsKLSAgICBwcmltc190ICAgICAgICAgICAgICAgICBwcmltczsKLSAgICBjdWxsaW5nX3QgICAgICAgICAgICAgICBjdWxsOwotICAgIGxpZ2h0aW5nX3QgICAgICAgICAgICAgIGxpZ2h0aW5nOwotICAgIHVzZXJfY2xpcF9wbGFuZXNfdCAgICAgIGNsaXBQbGFuZXM7Ci0gICAgY29tcHV0ZV9pdGVyYXRvcnNfdCAgICAgbGVycDsgICAgICAgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7Ci0gICAgdmVydGV4X3QgICAgICAgICAgICAgICAgY3VycmVudDsKLSAgICB2ZWM0X3QgICAgICAgICAgICAgICAgICBjdXJyZW50Q29sb3JDbGFtcGVkOwotICAgIHZlYzNfdCAgICAgICAgICAgICAgICAgIGN1cnJlbnROb3JtYWw7Ci0gICAgdmlld3BvcnRfdCAgICAgICAgICAgICAgdmlld3BvcnQ7Ci0gICAgcG9pbnRfc2l6ZV90ICAgICAgICAgICAgcG9pbnQ7Ci0gICAgbGluZV93aWR0aF90ICAgICAgICAgICAgbGluZTsKLSAgICBwb2x5Z29uX29mZnNldF90ICAgICAgICBwb2x5Z29uT2Zmc2V0OwotICAgIGZvZ190ICAgICAgICAgICAgICAgICAgIGZvZzsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBwZXJzcGVjdGl2ZSA6IDE7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgdHJhbnNmb3JtVGV4dHVyZXMgOiAxOwotICAgIEVHTFN1cmZhY2VNYW5hZ2VyKiAgICAgIHN1cmZhY2VNYW5hZ2VyOwotICAgIEVHTEJ1ZmZlck9iamVjdE1hbmFnZXIqIGJ1ZmZlck9iamVjdE1hbmFnZXI7Ci0KLSAgICBHTGVudW0gICAgICAgICAgICAgICAgICBlcnJvcjsKLQotICAgIHN0YXRpYyBpbmxpbmUgb2dsZXNfY29udGV4dF90KiBnZXQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRHbFRocmVhZFNwZWNpZmljKCk7Ci0gICAgfQotCi19OwotCi19OyAvLyBuYW1lc3BhY2UgZ2wKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpnbDsKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfQ09OVEVYVF9ICi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZHh0LmNwcCBiL29wZW5nbC9saWJhZ2wvZHh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4YzgxZi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL2R4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9keHQuY3BwCi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBUSU1JTkcgMAotCi0jaWYgVElNSU5HCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4gLy8gZm9yIG9wdGltaXphdGlvbiB0aW1pbmcKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRW5kaWFuLmg+Ci0KLSNpbmNsdWRlICJjb250ZXh0LmgiCi0KLSNkZWZpbmUgVElNSU5HIDAKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgdWludDhfdCBhdmcyM3RhYls2NCo2NF07Ci1zdGF0aWMgdm9sYXRpbGUgaW50IHRhYmxlc19pbml0aWFsaXplZCA9IDA7Ci0KLS8vIERlZmluaXRpb25zIGJlbG93IGFyZSBlcXVpdmFsZW50IHRvIHRoZXNlIG92ZXIgdGhlIHZhbGlkIHJhbmdlIG9mIGFyZ3VtZW50cwotLy8gICNkZWZpbmUgZGl2NSh4KSAoKHgpLzUpCi0vLyAgI2RlZmluZSBkaXY3KHgpICgoeCkvNykKLQotLy8gVXNlIGZpeGVkLXBvaW50IHRvIGRpdmlkZSBieSA1IGFuZCA3Ci0vLyAzMjc3ID0gMl4xNC81ICsgMQotLy8gMjM0MSA9IDJeMTQvNyArIDEKLSNkZWZpbmUgZGl2NSh4KSAoKCh4KSozMjc3KSA+PiAxNCkKLSNkZWZpbmUgZGl2Nyh4KSAoKCh4KSoyMzQxKSA+PiAxNCkKLQotLy8gVGFibGUgd2l0aCBlbnRyeSBbYSA8PCA2IHwgYl0gPSAoMiphICsgYikvMyBmb3IgMCA8PSBhLGIgPCA2NAotI2RlZmluZSBhdmcyMyh4MCx4MSkgYXZnMjN0YWJbKCh4MCkgPDwgNikgfCAoeDEpXQotCi0vLyBFeHRyYWN0IDUvNi81IFJHQgotI2RlZmluZSByZWQoeCkgICAoKCh4KSA+PiAxMSkgJiAweDFmKQotI2RlZmluZSBncmVlbih4KSAoKCh4KSA+PiAgNSkgJiAweDNmKQotI2RlZmluZSBibHVlKHgpICAoICh4KSAgICAgICAgJiAweDFmKQotCi0vKgotICogQ29udmVydCA1LzYvNSBSR0IgKGFzIDMgaW50cykgdG8gOC84LzgKLSAqCi0gKiBPcGVyYXRpb24gY291bnQ6IDggPDwsIDAgJiwgNSB8Ci0gKi8KLWlubGluZSBzdGF0aWMgaW50IHJnYjU2NVNlcFRvODg4KGludCByLCBpbnQgZywgaW50IGIpCi0KLXsKLSAgICByZXR1cm4gKCgoKHIgPDwgMykgfCAociA+PiAyKSkgPDwgMTYpIHwKLSAgICAgICAgICAgICgoKGcgPDwgMikgfCAoZyA+PiA0KSkgPDwgIDgpIHwKLSAgICAgICAgICAgICAoKGIgPDwgMykgfCAoYiA+PiAyKSkpOwotfQotCi0vKgotICogQ29udmVydCA1LzYvNSBSR0IgKGFzIGEgc2luZ2xlIDE2LWJpdCB3b3JkKSB0byA4LzgvOAotICoKLSAqICAgICAgICAgICAgICAgICAgIHI0cjNyMnIxIHIwZzVnNGczIGcyZzFnMGI0IGIzYjJiMWIwICAgcmdiCi0gKiAgICAgICAgICAgIHI0cjNyMiByMXIwZzVnNCBnM2cyZzFnMCBiNGIzYjJiMSBiMCAwIDAgMCAgIHJnYiA8PCAzCi0gKiByNHIzcjJyMSByMHI0cjNyMiBnNWc0ZzNnMiBnMWcwZzVnNCBiNGIzYjJiMSBiMGI0YjNiMiAgIGRlc2lyZWQgcmVzdWx0Ci0gKgotICogQ29uc3RydWN0IHRoZSAyNC1iaXQgUkdCIHdvcmQgYXM6Ci0gKgotICogcjRyM3IycjEgcjAtLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0gIChyZ2IgPDwgOCkgJiAweGY4MDAwMAotICogICAgICAgICAgICByNHIzcjIgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0gIChyZ2IgPDwgMykgJiAweDA3MDAwMAotICogICAgICAgICAgICAgICAgICAgZzVnNGczZzIgZzFnMC0tLS0gLS0tLS0tLS0gLS0tLS0tLS0gIChyZ2IgPDwgNSkgJiAweDAwZmMwMAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGc1ZzQgLS0tLS0tLS0gLS0tLS0tLS0gIChyZ2IgPj4gMSkgJiAweDAwMDMwMAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjRiM2IyYjEgYjAtLS0tLS0gIChyZ2IgPDwgMykgJiAweDAwMDBmOAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiNGIzYjIgIChyZ2IgPj4gMikgJiAweDAwMDAwNwotICoKLSAqIE9wZXJhdGlvbiBjb3VudDogNSA8PCwgNiAmLCA1IHwgKG4uYi4gcmdiID4+IDMgaXMgdXNlZCB0d2ljZSkKLSAqLwotaW5saW5lIHN0YXRpYyBpbnQgcmdiNTY1VG84ODgoaW50IHJnYikKLQotewotICAgIGludCByZ2IzID0gcmdiID4+IDM7Ci0gICAgcmV0dXJuICgoKHJnYiA8PCA4KSAmIDB4ZjgwMDAwKSB8Ci0gICAgICAgICAgICAoIHJnYjMgICAgICAmIDB4MDcwMDAwKSB8Ci0gICAgICAgICAgICAoKHJnYiA8PCA1KSAmIDB4MDBmYzAwKSB8Ci0gICAgICAgICAgICAoKHJnYiA+PiAxKSAmIDB4MDAwMzAwKSB8Ci0gICAgICAgICAgICAoIHJnYjMgICAgICAmIDB4MDAwMGY4KSB8Ci0gICAgICAgICAgICAoKHJnYiA+PiAyKSAmIDB4MDAwMDA3KSk7Ci19Ci0KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi1zdGF0aWMgdWludDMyX3Qgc3dhcCh1aW50MzJfdCB4KSB7Ci0gICAgaW50IGIwID0gKHggPj4gMjQpICYgMHhmZjsKLSAgICBpbnQgYjEgPSAoeCA+PiAxNikgJiAweGZmOwotICAgIGludCBiMiA9ICh4ID4+ICA4KSAmIDB4ZmY7Ci0gICAgaW50IGIzID0gKHggICAgICApICYgMHhmZjsKLSAgICAKLSAgICByZXR1cm4gKHVpbnQzMl90KSgoYjMgPDwgMjQpIHwgKGIyIDw8IDE2KSB8IChiMSA8PCA4KSB8IGIwKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotaW5pdF90YWJsZXMoKQotewotICAgIGlmICh0YWJsZXNfaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjQ7IGkrKykgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDY0OyBqKyspIHsKLSAgICAgICAgICAgIGludCBhdmcgPSAoMippICsgaikvMzsKLSAgICAgICAgICAgIGF2ZzIzdGFiWyhpIDw8IDYpIHwgal0gPSBhdmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhc20gdm9sYXRpbGUgKCIiIDogOiA6ICJtZW1vcnkiKTsKLSAgICB0YWJsZXNfaW5pdGlhbGl6ZWQgPSAxOwotfQotCi0vKgotICogVXRpbGl0eSB0byBzY2FuIGEgRFhUMSBjb21wcmVzc2VkIHRleHR1cmUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQKLSAqIGNvbnRhaW5zIGEgdHJhbnNwYXJlbnQgcGl4ZWwgKGNvbG9yMCA8IGNvbG9yMSwgY29kZSA9PSAzKS4gIFRoaXMKLSAqIG1heSBiZSB1c2VmdWwgaWYgdGhlIGFwcGxpY2F0aW9uIGxhY2tzIGluZm9ybWF0aW9uIGFzIHRvIHdoZXRoZXIKLSAqIHRoZSB0cnVlIGZvcm1hdCBpcyBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUIG9yCi0gKiBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVC4KLSAqLwotYm9vbAotRFhUMUhhc0FscGhhKGNvbnN0IEdMdm9pZCAqZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7ICAgIAotI2lmIFRJTUlORwotICAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0X3QsIGVuZF90OwotICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKLSAgICAKLSAgICBnZXR0aW1lb2ZkYXkoJnN0YXJ0X3QsICZ0eik7Ci0jZW5kaWYKLQotICAgIGJvb2wgaGFzQWxwaGEgPSBmYWxzZTsKLQotICAgIGludCB4YmxvY2tzID0gKHdpZHRoICsgMykvNDsKLSAgICBpbnQgeWJsb2NrcyA9IChoZWlnaHQgKyAzKS80OwotICAgIGludCBudW1ibG9ja3MgPSB4YmxvY2tzKnlibG9ja3M7Ci0KLSAgICB1aW50MzJfdCBjb25zdCAqZDMyID0gKHVpbnQzMl90ICopZGF0YTsKLSAgICBmb3IgKGludCBiID0gMDsgYiA8IG51bWJsb2NrczsgYisrKSB7Ci0gICAgICAgIHVpbnQzMl90IGNvbG9ycyA9ICpkMzIrKzsKLSAgICAgICAgCi0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgotICAgICAgICBjb2xvcnMgPSBzd2FwKGNvbG9ycyk7Ci0jZW5kaWYKLSAgICAgICAgCi0gICAgICAgIHVpbnQxNl90IGNvbG9yMCA9IGNvbG9ycyAmIDB4ZmZmZjsKLSAgICAgICAgdWludDE2X3QgY29sb3IxID0gY29sb3JzID4+IDE2OwotICAgICAgICAKLSAgICAgICAgaWYgKGNvbG9yMCA8IGNvbG9yMSkgewotICAgICAgICAgICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIGVuZGlhbi1zd2FwIHdpdGhpbiAnYml0cycKLSAgICAgICAgICAgIC8vIHNpbmNlIHdlIGRvbid0IGNhcmUgd2hpY2ggcGl4ZWwgaXMgdGhlIHRyYW5zcGFyZW50IG9uZQotICAgICAgICAgICAgdWludDMyX3QgYml0cyA9ICpkMzIrKzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRGV0ZWN0IGlmIGFueSAob2RkLCBldmVuKSBwYWlyIG9mIGJpdHMgYXJlICcxMScKLSAgICAgICAgICAgIC8vICAgICAgYml0czogYjMxIGIzMCBiMjkgLi4uIGIzIGIyIGIxIGIwCi0gICAgICAgICAgICAvLyBiaXRzID4+IDE6IGIzMSBiMzEgYjMwIC4uLiBiNCBiMyBiMiBiMQotICAgICAgICAgICAgLy8gICAgICAgICAmOiBiMzEgKGIzMSAmIGIzMCkgKGIyOSAmIGIyOCkgLi4uIChiMiAmIGIxKSAoYjEgJiBiMCkKLSAgICAgICAgICAgIC8vICAmIDB4NTUuLjogICAwIChiMzEgJiBiMzApICAgICAgIDAgICAgIC4uLiAgICAgMCAgICAgKGIxICYgYjApCi0gICAgICAgICAgICBpZiAoKChiaXRzICYgKGJpdHMgPj4gMSkpICYgMHg1NTU1NTU1NSkgIT0gMCkgewotICAgICAgICAgICAgICAgIGhhc0FscGhhID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTa2lwIDQgYnl0ZXMKLSAgICAgICAgICAgICsrZDMyOwotICAgICAgICB9Ci0gICAgfQotICAgIAotIGRvbmU6Ci0jaWYgVElNSU5HCi0gICAgZ2V0dGltZW9mZGF5KCZlbmRfdCwgJnR6KTsKLSAgICBsb25nIHVzZWMgPSAoZW5kX3QudHZfc2VjIC0gc3RhcnRfdC50dl9zZWMpKjEwMDAwMDAgKwotICAgICAgICAoZW5kX3QudHZfdXNlYyAtIHN0YXJ0X3QudHZfdXNlYyk7Ci0gICAgCi0gICAgcHJpbnRmKCJTY2FubmVkIHc9JWQgaD0lZCBpbiAlbGQgdXNlY1xuIiwgd2lkdGgsIGhlaWdodCwgdXNlYyk7Ci0jZW5kaWYKLSAgICAKLSAgICByZXR1cm4gaGFzQWxwaGE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWNvZGVEWFQxKGNvbnN0IEdMdm9pZCAqZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICB2b2lkICpzdXJmYWNlLCBpbnQgc3RyaWRlLAotICAgICAgICAgICBib29sIGhhc0FscGhhKQotICAgIAotewotICAgIGluaXRfdGFibGVzKCk7Ci0gICAgCi0gICAgdWludDMyX3QgY29uc3QgKmQzMiA9ICh1aW50MzJfdCAqKWRhdGE7Ci0gICAgCi0gICAgLy8gQ29sb3IgdGFibGUgZm9yIHRoZSBjdXJyZW50IGJsb2NrCi0gICAgdWludDE2X3QgY1s0XTsKLSAgICBjWzBdID0gY1sxXSA9IGNbMl0gPSBjWzNdID0gMDsKLSAgICAKLSAgICAvLyBTcGVjaWZpZWQgY29sb3JzIGZyb20gdGhlIHByZXZpb3VzIGJsb2NrCi0gICAgdWludDE2X3QgcHJldl9jb2xvcjAgPSAweDAwMDA7Ci0gICAgdWludDE2X3QgcHJldl9jb2xvcjEgPSAweDAwMDA7Ci0gICAgCi0gICAgdWludDE2X3QqIHJvd1B0ciA9ICh1aW50MTZfdCopc3VyZmFjZTsKLSAgICBmb3IgKGludCBiYXNlX3kgPSAwOyBiYXNlX3kgPCBoZWlnaHQ7IGJhc2VfeSArPSA0LCByb3dQdHIgKz0gNCpzdHJpZGUpIHsKLSAgICAgICAgdWludDE2X3QgKmJsb2NrUHRyID0gcm93UHRyOwotICAgICAgICBmb3IgKGludCBiYXNlX3ggPSAwOyBiYXNlX3ggPCB3aWR0aDsgYmFzZV94ICs9IDQsIGJsb2NrUHRyICs9IDQpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGNvbG9ycyA9ICpkMzIrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IGJpdHMgPSAqZDMyKys7Ci0gICAgICAgICAgICAKLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0gICAgICAgICAgICBjb2xvcnMgPSBzd2FwKGNvbG9ycyk7Ci0gICAgICAgICAgICBiaXRzID0gc3dhcChiaXRzKTsKLSNlbmRpZgotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSYXcgY29sb3JzCi0gICAgICAgICAgICB1aW50MTZfdCBjb2xvcjAgPSBjb2xvcnMgJiAweGZmZmY7Ci0gICAgICAgICAgICB1aW50MTZfdCBjb2xvcjEgPSBjb2xvcnMgPj4gMTY7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIHRoZSBuZXcgYmxvY2sgaGFzIHRoZSBzYW1lIGJhc2UgY29sb3JzIGFzIHRoZQotICAgICAgICAgICAgLy8gcHJldmlvdXMgb25lLCB3ZSBkb24ndCBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgY29sb3IKLSAgICAgICAgICAgIC8vIHRhYmxlIGNbXQotICAgICAgICAgICAgaWYgKGNvbG9yMCAhPSBwcmV2X2NvbG9yMCB8fCBjb2xvcjEgIT0gcHJldl9jb2xvcjEpIHsKLSAgICAgICAgICAgICAgICAvLyBTdG9yZSByYXcgY29sb3JzIGZvciBjb21wYXJpc29uIHdpdGggbmV4dCBibG9jawotICAgICAgICAgICAgICAgIHByZXZfY29sb3IwID0gY29sb3IwOwotICAgICAgICAgICAgICAgIHByZXZfY29sb3IxID0gY29sb3IxOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCByMCA9ICAgcmVkKGNvbG9yMCk7Ci0gICAgICAgICAgICAgICAgaW50IGcwID0gZ3JlZW4oY29sb3IwKTsKLSAgICAgICAgICAgICAgICBpbnQgYjAgPSAgYmx1ZShjb2xvcjApOwotCi0gICAgICAgICAgICAgICAgaW50IHIxID0gICByZWQoY29sb3IxKTsKLSAgICAgICAgICAgICAgICBpbnQgZzEgPSBncmVlbihjb2xvcjEpOwotICAgICAgICAgICAgICAgIGludCBiMSA9ICBibHVlKGNvbG9yMSk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChoYXNBbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBjWzBdID0gKHIwIDw8IDExKSB8ICgoZzAgPj4gMSkgPDwgNikgfCAoYjAgPDwgMSkgfCAweDE7Ci0gICAgICAgICAgICAgICAgICAgIGNbMV0gPSAocjEgPDwgMTEpIHwgKChnMSA+PiAxKSA8PCA2KSB8IChiMSA8PCAxKSB8IDB4MTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjWzBdID0gY29sb3IwOwotICAgICAgICAgICAgICAgICAgICBjWzFdID0gY29sb3IxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpbnQgcjIsIGcyLCBiMiwgcjMsIGczLCBiMywgYTM7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaW50IGJiaXRzID0gYml0cyA+PiAxOwotICAgICAgICAgICAgICAgIGJvb2wgaGFzMiA9ICgoYmJpdHMgJiB+Yml0cykgJiAweDU1NTU1NTU1KSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2wgaGFzMyA9ICgoYmJpdHMgJiAgYml0cykgJiAweDU1NTU1NTU1KSAhPSAwOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChoYXMyIHx8IGhhczMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yMCA+IGNvbG9yMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBhdmcyMyhyMCwgcjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZzIgPSBhdmcyMyhnMCwgZzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSBhdmcyMyhiMCwgYjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByMyA9IGF2ZzIzKHIxLCByMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnMyA9IGF2ZzIzKGcxLCBnMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiMyA9IGF2ZzIzKGIxLCBiMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhMyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMiA9IChyMCArIHIxKSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgZzIgPSAoZzAgKyBnMSkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGIyID0gKGIwICsgYjEpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gZzMgPSBiMyA9IGEzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNbMl0gPSAocjIgPDwgMTEpIHwgKChnMiA+PiAxKSA8PCA2KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGIyIDw8IDEpIHwgMHgxOwotICAgICAgICAgICAgICAgICAgICAgICAgY1szXSA9IChyMyA8PCAxMSkgfCAoKGczID4+IDEpIDw8IDYpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYjMgPDwgMSkgfCBhMzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNbMl0gPSAocjIgPDwgMTEpIHwgKGcyIDw8IDUpIHwgYjI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjWzNdID0gKHIzIDw8IDExKSB8IChnMyA8PCA1KSB8IGIzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB1aW50MTZfdCogYmxvY2tSb3dQdHIgPSBibG9ja1B0cjsKLSAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgNDsgeSsrLCBibG9ja1Jvd1B0ciArPSBzdHJpZGUpIHsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBwcm9jZXNzIHJvd3MgcGFzdCB0aGUgYm90b20KLSAgICAgICAgICAgICAgICBpZiAoYmFzZV95ICsgeSA+PSBoZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCB3ID0gbWluKHdpZHRoIC0gYmFzZV94LCA0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IGJpdHMgJiAweDM7Ci0gICAgICAgICAgICAgICAgICAgIGJpdHMgPj49IDI7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBibG9ja1Jvd1B0clt4XSA9IGNbY29kZV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotICAgIAotLy8gT3V0cHV0IGRhdGEgYXMgaW50ZXJuYWxmb3JtYXQ9R0xfUkdCQSwgdHlwZT1HTF9VTlNJR05FRF9CWVRFCi1zdGF0aWMgdm9pZAotZGVjb2RlRFhUMyhjb25zdCBHTHZvaWQgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgdm9pZCAqc3VyZmFjZSwgaW50IHN0cmlkZSkKLQotewotICAgIGluaXRfdGFibGVzKCk7Ci0gICAgCi0gICAgdWludDMyX3QgY29uc3QgKmQzMiA9ICh1aW50MzJfdCAqKWRhdGE7Ci0gICAgCi0gICAgLy8gU3BlY2lmaWVkIGNvbG9ycyBmcm9tIHRoZSBwcmV2aW91cyBibG9jawotICAgIHVpbnQxNl90IHByZXZfY29sb3IwID0gMHgwMDAwOwotICAgIHVpbnQxNl90IHByZXZfY29sb3IxID0gMHgwMDAwOwotCi0gICAgLy8gQ29sb3IgdGFibGUgZm9yIHRoZSBjdXJyZW50IGJsb2NrCi0gICAgdWludDMyX3QgY1s0XTsKLSAgICBjWzBdID0gY1sxXSA9IGNbMl0gPSBjWzNdID0gMDsKLQotICAgIHVpbnQzMl90KiByb3dQdHIgPSAodWludDMyX3QqKXN1cmZhY2U7Ci0gICAgZm9yIChpbnQgYmFzZV95ID0gMDsgYmFzZV95IDwgaGVpZ2h0OyBiYXNlX3kgKz0gNCwgcm93UHRyICs9IDQqc3RyaWRlKSB7Ci0gICAgICAgIHVpbnQzMl90ICpibG9ja1B0ciA9IHJvd1B0cjsKLSAgICAgICAgZm9yIChpbnQgYmFzZV94ID0gMDsgYmFzZV94IDwgd2lkdGg7IGJhc2VfeCArPSA0LCBibG9ja1B0ciArPSA0KSB7Ci0gICAgICAgICAgICAKLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0gICAgICAgICAgICB1aW50MzJfdCBhbHBoYWhpID0gKmQzMisrOwotICAgICAgICAgICAgdWludDMyX3QgYWxwaGFsbyA9ICpkMzIrKzsKLSAgICAgICAgICAgIGFscGhhaGkgPSBzd2FwKGFscGhhaGkpOwotICAgICAgICAgICAgYWxwaGFsbyA9IHN3YXAoYWxwaGFsbyk7Ci0jZWxzZQotICAgICAgICAgICAgdWludDMyX3QgYWxwaGFsbyA9ICpkMzIrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IGFscGhhaGkgPSAqZDMyKys7Ci0jZW5kaWYKLQotICAgICAgICAgICAgdWludDMyX3QgY29sb3JzID0gKmQzMisrOwotICAgICAgICAgICAgdWludDMyX3QgYml0cyA9ICpkMzIrKzsKLSAgICAgICAgICAgIAotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KLSAgICAgICAgICAgIGNvbG9ycyA9IHN3YXAoY29sb3JzKTsKLSAgICAgICAgICAgIGJpdHMgPSBzd2FwKGJpdHMpOwotI2VuZGlmCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHVpbnQ2NF90IGFscGhhID0gKCh1aW50NjRfdClhbHBoYWhpIDw8IDMyKSB8IGFscGhhbG87Ci0KLSAgICAgICAgICAgIC8vIFJhdyBjb2xvcnMKLSAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yMCA9IGNvbG9ycyAmIDB4ZmZmZjsKLSAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yMSA9IGNvbG9ycyA+PiAxNjsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBibG9jayBoYXMgdGhlIHNhbWUgYmFzZSBjb2xvcnMgYXMgdGhlCi0gICAgICAgICAgICAvLyBwcmV2aW91cyBvbmUsIHdlIGRvbid0IG5lZWQgdG8gcmVjb21wdXRlIHRoZSBjb2xvcgotICAgICAgICAgICAgLy8gdGFibGUgY1tdCi0gICAgICAgICAgICBpZiAoY29sb3IwICE9IHByZXZfY29sb3IwIHx8IGNvbG9yMSAhPSBwcmV2X2NvbG9yMSkgewotICAgICAgICAgICAgICAgIC8vIFN0b3JlIHJhdyBjb2xvcnMgZm9yIGNvbXBhcmlzb24gd2l0aCBuZXh0IGJsb2NrCi0gICAgICAgICAgICAgICAgcHJldl9jb2xvcjAgPSBjb2xvcjA7Ci0gICAgICAgICAgICAgICAgcHJldl9jb2xvcjEgPSBjb2xvcjE7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaW50IGJiaXRzID0gYml0cyA+PiAxOwotICAgICAgICAgICAgICAgIGJvb2wgaGFzMiA9ICgoYmJpdHMgJiB+Yml0cykgJiAweDU1NTU1NTU1KSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2wgaGFzMyA9ICgoYmJpdHMgJiAgYml0cykgJiAweDU1NTU1NTU1KSAhPSAwOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChoYXMyIHx8IGhhczMpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHIwID0gICByZWQoY29sb3IwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGcwID0gZ3JlZW4oY29sb3IwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIwID0gIGJsdWUoY29sb3IwKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGludCByMSA9ICAgcmVkKGNvbG9yMSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBnMSA9IGdyZWVuKGNvbG9yMSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiMSA9ICBibHVlKGNvbG9yMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpbnQgcjIgPSBhdmcyMyhyMCwgcjEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgZzIgPSBhdmcyMyhnMCwgZzEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgYjIgPSBhdmcyMyhiMCwgYjEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IHIzID0gYXZnMjMocjEsIHIwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGczID0gYXZnMjMoZzEsIGcwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIzID0gYXZnMjMoYjEsIGIwKTsKLQotICAgICAgICAgICAgICAgICAgICBjWzBdID0gcmdiNTY1U2VwVG84ODgocjAsIGcwLCBiMCk7Ci0gICAgICAgICAgICAgICAgICAgIGNbMV0gPSByZ2I1NjVTZXBUbzg4OChyMSwgZzEsIGIxKTsKLSAgICAgICAgICAgICAgICAgICAgY1syXSA9IHJnYjU2NVNlcFRvODg4KHIyLCBnMiwgYjIpOwotICAgICAgICAgICAgICAgICAgICBjWzNdID0gcmdiNTY1U2VwVG84ODgocjMsIGczLCBiMyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byA4IGJpdHMKLSAgICAgICAgICAgICAgICAgICAgY1swXSA9IHJnYjU2NVRvODg4KGNvbG9yMCk7Ci0gICAgICAgICAgICAgICAgICAgIGNbMV0gPSByZ2I1NjVUbzg4OChjb2xvcjEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3QqIGJsb2NrUm93UHRyID0gYmxvY2tQdHI7Ci0gICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDQ7IHkrKywgYmxvY2tSb3dQdHIgKz0gc3RyaWRlKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJvY2VzcyByb3dzIHBhc3QgdGhlIGJvdG9tCi0gICAgICAgICAgICAgICAgaWYgKGJhc2VfeSArIHkgPj0gaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpbnQgdyA9IG1pbih3aWR0aCAtIGJhc2VfeCwgNCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBhbHBoYSAmIDB4ZjsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGEgPj49IDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBiaXRzICYgMHgzOwotICAgICAgICAgICAgICAgICAgICBiaXRzID4+PSAyOwotCi0gICAgICAgICAgICAgICAgICAgIGJsb2NrUm93UHRyW3hdID0gY1tjb2RlXSB8IChhIDw8IDI4KSB8IChhIDw8IDI0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIE91dHB1dCBkYXRhIGFzIGludGVybmFsZm9ybWF0PUdMX1JHQkEsIHR5cGU9R0xfVU5TSUdORURfQllURQotc3RhdGljIHZvaWQKLWRlY29kZURYVDUoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgIHZvaWQgKnN1cmZhY2UsIGludCBzdHJpZGUpCi0KLXsKLSAgICBpbml0X3RhYmxlcygpOwotICAgIAotICAgIHVpbnQzMl90IGNvbnN0ICpkMzIgPSAodWludDMyX3QgKilkYXRhOwotICAgIAotICAgIC8vIFNwZWNpZmllZCBhbHBoYXMgZnJvbSB0aGUgcHJldmlvdXMgYmxvY2sKLSAgICB1aW50OF90IHByZXZfYWxwaGEwID0gMHgwMDsKLSAgICB1aW50OF90IHByZXZfYWxwaGExID0gMHgwMDsKLQotICAgIC8vIFNwZWNpZmllZCBjb2xvcnMgZnJvbSB0aGUgcHJldmlvdXMgYmxvY2sKLSAgICB1aW50MTZfdCBwcmV2X2NvbG9yMCA9IDB4MDAwMDsKLSAgICAgdWludDE2X3QgcHJldl9jb2xvcjEgPSAweDAwMDA7Ci0KLSAgICAvLyBBbHBoYSB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKLSAgICB1aW50OF90IGFbOF07Ci0gICAgYVswXSA9IGFbMV0gPSBhWzJdID0gYVszXSA9IGFbNF0gPSBhWzVdID0gYVs2XSA9IGFbN10gPSAwOwotCi0gICAgLy8gQ29sb3IgdGFibGUgZm9yIHRoZSBjdXJyZW50IGJsb2NrCi0gICAgdWludDMyX3QgY1s0XTsKLSAgICBjWzBdID0gY1sxXSA9IGNbMl0gPSBjWzNdID0gMDsKLQotICAgIGludCBnb29kX2E1ID0gMDsKLSAgICBpbnQgYmFkX2E1ID0gMDsKLSAgICBpbnQgZ29vZF9hNiA9IDA7Ci0gICAgaW50IGJhZF9hNiA9IDA7Ci0gICAgaW50IGdvb2RfYTcgPSAwOwotICAgIGludCBiYWRfYTcgPSAwOwotCi0gICAgdWludDMyX3QqIHJvd1B0ciA9ICh1aW50MzJfdCopc3VyZmFjZTsKLSAgICBmb3IgKGludCBiYXNlX3kgPSAwOyBiYXNlX3kgPCBoZWlnaHQ7IGJhc2VfeSArPSA0LCByb3dQdHIgKz0gNCpzdHJpZGUpIHsKLSAgICAgICAgdWludDMyX3QgKmJsb2NrUHRyID0gcm93UHRyOwotICAgICAgICBmb3IgKGludCBiYXNlX3ggPSAwOyBiYXNlX3ggPCB3aWR0aDsgYmFzZV94ICs9IDQsIGJsb2NrUHRyICs9IDQpIHsKLSAgICAgICAgICAgIAotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KLSAgICAgICAgICAgIHVpbnQzMl90IGFscGhhaGkgPSAqZDMyKys7Ci0gICAgICAgICAgICB1aW50MzJfdCBhbHBoYWxvID0gKmQzMisrOwotICAgICAgICAgICAgYWxwaGFoaSA9IHN3YXAoYWxwaGFoaSk7Ci0gICAgICAgICAgICBhbHBoYWxvID0gc3dhcChhbHBoYWxvKTsKLSNlbHNlCi0gICAgICAgICAgICAgdWludDMyX3QgYWxwaGFsbyA9ICpkMzIrKzsKLSAgICAgICAgICAgICB1aW50MzJfdCBhbHBoYWhpID0gKmQzMisrOwotI2VuZGlmCi0KLSAgICAgICAgICAgIHVpbnQzMl90IGNvbG9ycyA9ICpkMzIrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IGJpdHMgPSAqZDMyKys7Ci0gICAgICAgICAgICAKLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOeAotICAgICAgICAgICAgY29sb3JzID0gc3dhcChjb2xvcnMpOwotICAgICAgICAgICAgYml0cyA9IHN3YXAoYml0cyk7Ci0jZW5kaWYKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdWludDY0X3QgYWxwaGEgPSAoKHVpbnQ2NF90KWFscGhhaGkgPDwgMzIpIHwgYWxwaGFsbzsKLSAgICAgICAgICAgIHVpbnQ2NF90IGFscGhhMCA9IGFscGhhICYgMHhmZjsKLSAgICAgICAgICAgIGFscGhhID4+PSA4OwotICAgICAgICAgICAgdWludDY0X3QgYWxwaGExID0gYWxwaGEgJiAweGZmOwotICAgICAgICAgICAgYWxwaGEgPj49IDg7Ci0KLSAgICAgICAgICAgIGlmIChhbHBoYTAgIT0gcHJldl9hbHBoYTAgfHwgYWxwaGExICE9IHByZXZfYWxwaGExKSB7Ci0gICAgICAgICAgICAgICAgcHJldl9hbHBoYTAgPSBhbHBoYTA7Ci0gICAgICAgICAgICAgICAgcHJldl9hbHBoYTEgPSBhbHBoYTE7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYVswXSA9IGFscGhhMDsKLSAgICAgICAgICAgICAgICBhWzFdID0gYWxwaGExOwotICAgICAgICAgICAgICAgIGludCBhMDEgPSBhbHBoYTAgKyBhbHBoYTEgLSAxOwotICAgICAgICAgICAgICAgIGlmIChhbHBoYTAgPiBhbHBoYTEpIHsKLSAgICAgICAgICAgICAgICAgICAgYVsyXSA9IGRpdjcoNiphbHBoYTAgKyAgIGFscGhhMSk7Ci0gICAgICAgICAgICAgICAgICAgIGFbNF0gPSBkaXY3KDQqYWxwaGEwICsgMyphbHBoYTEpOwotICAgICAgICAgICAgICAgICAgICBhWzZdID0gZGl2NygyKmFscGhhMCArIDUqYWxwaGExKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc3ltbWV0cnkgdG8gZGVyaXZlIGhhbGYgb2YgdGhlIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAvLyBBIGZldyB2YWx1ZXMgd2lsbCBiZSBvZmYgYnkgMSAofi41JSkKLSAgICAgICAgICAgICAgICAgICAgLy8gQWx0ZXJuYXRlIHdoaWNoIHZhbHVlcyBhcmUgY29tcHV0ZWQgZGlyZWN0bHkKLSAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdoaWNoIGFyZSBkZXJpdmVkIHRvIHRyeSB0byByZWR1Y2UgYmlhcwotICAgICAgICAgICAgICAgICAgICBhWzNdID0gYTAxIC0gYVs2XTsKLSAgICAgICAgICAgICAgICAgICAgYVs1XSA9IGEwMSAtIGFbNF07Ci0gICAgICAgICAgICAgICAgICAgIGFbN10gPSBhMDEgLSBhWzJdOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFbMl0gPSBkaXY1KDQqYWxwaGEwICsgICBhbHBoYTEpOwotICAgICAgICAgICAgICAgICAgICBhWzRdID0gZGl2NSgyKmFscGhhMCArIDMqYWxwaGExKTsKLSAgICAgICAgICAgICAgICAgICAgYVszXSA9IGEwMSAtIGFbNF07Ci0gICAgICAgICAgICAgICAgICAgIGFbNV0gPSBhMDEgLSBhWzJdOwotICAgICAgICAgICAgICAgICAgICBhWzZdID0gMHgwMDsKLSAgICAgICAgICAgICAgICAgICAgYVs3XSA9IDB4ZmY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSYXcgY29sb3JzCi0gICAgICAgICAgICB1aW50MTZfdCBjb2xvcjAgPSBjb2xvcnMgJiAweGZmZmY7Ci0gICAgICAgICAgICB1aW50MTZfdCBjb2xvcjEgPSBjb2xvcnMgPj4gMTY7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBuZXcgYmxvY2sgaGFzIHRoZSBzYW1lIGJhc2UgY29sb3JzIGFzIHRoZQotICAgICAgICAgICAgLy8gcHJldmlvdXMgb25lLCB3ZSBkb24ndCBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgY29sb3IKLSAgICAgICAgICAgIC8vIHRhYmxlIGNbXQotICAgICAgICAgICAgaWYgKGNvbG9yMCAhPSBwcmV2X2NvbG9yMCB8fCBjb2xvcjEgIT0gcHJldl9jb2xvcjEpIHsKLSAgICAgICAgICAgICAgICAvLyBTdG9yZSByYXcgY29sb3JzIGZvciBjb21wYXJpc29uIHdpdGggbmV4dCBibG9jawotICAgICAgICAgICAgICAgIHByZXZfY29sb3IwID0gY29sb3IwOwotICAgICAgICAgICAgICAgIHByZXZfY29sb3IxID0gY29sb3IxOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCBiYml0cyA9IGJpdHMgPj4gMTsKLSAgICAgICAgICAgICAgICBib29sIGhhczIgPSAoKGJiaXRzICYgfmJpdHMpICYgMHg1NTU1NTU1NSkgIT0gMDsKLSAgICAgICAgICAgICAgICBib29sIGhhczMgPSAoKGJiaXRzICYgIGJpdHMpICYgMHg1NTU1NTU1NSkgIT0gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoaGFzMiB8fCBoYXMzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByMCA9ICAgcmVkKGNvbG9yMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBnMCA9IGdyZWVuKGNvbG9yMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiMCA9ICBibHVlKGNvbG9yMCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpbnQgcjEgPSAgIHJlZChjb2xvcjEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgZzEgPSBncmVlbihjb2xvcjEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgYjEgPSAgYmx1ZShjb2xvcjEpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpbnQgcjIgPSBhdmcyMyhyMCwgcjEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgZzIgPSBhdmcyMyhnMCwgZzEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgYjIgPSBhdmcyMyhiMCwgYjEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IHIzID0gYXZnMjMocjEsIHIwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGczID0gYXZnMjMoZzEsIGcwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIzID0gYXZnMjMoYjEsIGIwKTsKLQotICAgICAgICAgICAgICAgICAgICBjWzBdID0gcmdiNTY1U2VwVG84ODgocjAsIGcwLCBiMCk7Ci0gICAgICAgICAgICAgICAgICAgIGNbMV0gPSByZ2I1NjVTZXBUbzg4OChyMSwgZzEsIGIxKTsKLSAgICAgICAgICAgICAgICAgICAgY1syXSA9IHJnYjU2NVNlcFRvODg4KHIyLCBnMiwgYjIpOwotICAgICAgICAgICAgICAgICAgICBjWzNdID0gcmdiNTY1U2VwVG84ODgocjMsIGczLCBiMyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byA4IGJpdHMKLSAgICAgICAgICAgICAgICAgICAgY1swXSA9IHJnYjU2NVRvODg4KGNvbG9yMCk7Ci0gICAgICAgICAgICAgICAgICAgIGNbMV0gPSByZ2I1NjVUbzg4OChjb2xvcjEpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90KiBibG9ja1Jvd1B0ciA9IGJsb2NrUHRyOwotICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCA0OyB5KyssIGJsb2NrUm93UHRyICs9IHN0cmlkZSkgewotICAgICAgICAgICAgICAgIC8vIERvbid0IHByb2Nlc3Mgcm93cyBwYXN0IHRoZSBib3RvbQotICAgICAgICAgICAgICAgIGlmIChiYXNlX3kgKyB5ID49IGhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaW50IHcgPSBtaW4od2lkdGggLSBiYXNlX3gsIDQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhY29kZSA9IGFscGhhICYgMHg3OwotICAgICAgICAgICAgICAgICAgICBhbHBoYSA+Pj0gMzsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IGJpdHMgJiAweDM7Ci0gICAgICAgICAgICAgICAgICAgIGJpdHMgPj49IDI7Ci0KLSAgICAgICAgICAgICAgICAgICAgYmxvY2tSb3dQdHJbeF0gPSBjW2NvZGVdIHwgKGFbYWNvZGVdIDw8IDI0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0gICAKLS8qCi0gKiBEZWNvZGUgYSBEWFQtY29tcHJlc3NlZCB0ZXh0dXJlIGludG8gbWVtb3J5LiAgRFhUIHRleHR1cmVzIGNvbnNpc3Qgb2YKLSAqIGEgc2VyaWVzIG9mIDR4NCBwaXhlbCBibG9ja3MgaW4gbGVmdC10by1yaWdodCwgdG9wLWRvd24gb3JkZXIuCi0gKiBUaGUgbnVtYmVyIG9mIGJsb2NrcyBpcyBnaXZlbiBieSBjZWlsKHdpZHRoLzQpKmNlaWwoaGVpZ2h0LzQpLgotICoKLSAqICdkYXRhJyBwb2ludHMgdG8gdGhlIHRleHR1cmUgZGF0YS4gJ3dpZHRoJyBhbmQgJ2hlaWdodCcgaW5kaWNhdGUgdGhlCi0gKiBkaW1lbnNpb25zIG9mIHRoZSB0ZXh0dXJlLiAgV2UgYXNzdW1lIHdpZHRoIGFuZCBoZWlnaHQgYXJlID49IDAgYnV0Ci0gKiBkbyBub3QgcmVxdWlyZSB0aGVtIHRvIGJlIHBvd2VycyBvZiAyIG9yIGRpdmlzaWJsZSBieSBhbnkgZmFjdG9yLgotICoKLSAqIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiB0byAnc3VyZmFjZScgd2l0aCBlYWNoIHNjYW5saW5lIHNlcGFyYXRlZCBieQotICogJ3N0cmlkZScgMi0gb3IgNC1ieXRlIHdvcmRzLgotICoKLSAqICdmb3JtYXQnIGluZGljYXRlcyB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiBhbmQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiAgIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6Ci0gKiAgICAgIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiBhcyA1LzYvNSBvcGFxdWUgUkdCICgxNiBiaXQgd29yZHMpLgotICogICAgICA4IGJ5dGVzIGFyZSByZWFkIGZyb20gJ2RhdGEnIGZvciBlYWNoIGJsb2NrLgotICoKLSAqICAgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQKLSAqICAgICAgVGhlIG91dHB1dCBpcyB3cml0dGVuIGFzIDUvNS81LzEgUkdCQSAoMTYgYml0IHdvcmRzKQotICogICAgICA4IGJ5dGVzIGFyZSByZWFkIGZyb20gJ2RhdGEnIGZvciBlYWNoIGJsb2NrLgotICoKLSAqICAgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQKLSAqICAgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQKLSAqICAgICAgVGhlIG91dHB1dCBpcyB3cml0dGVuIGFzIDgvOC84LzggQVJHQiAoMzIgYml0IHdvcmRzKQotICogICAgICAxNiBieXRlcyBhcmUgcmVhZCBmcm9tICdkYXRhJyBmb3IgZWFjaCBibG9jay4KLSAqLwotdm9pZAotZGVjb2RlRFhUKGNvbnN0IEdMdm9pZCAqZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgIHZvaWQgKnN1cmZhY2UsIGludCBzdHJpZGUsIGludCBmb3JtYXQpCi17Ci0jaWYgVElNSU5HCi0gICAgc3RydWN0IHRpbWV2YWwgc3RhcnRfdCwgZW5kX3Q7Ci0gICAgc3RydWN0IHRpbWV6b25lIHR6OwotICAgIAotICAgIGdldHRpbWVvZmRheSgmc3RhcnRfdCwgJnR6KTsKLSNlbmRpZgotCi0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6Ci0gICAgICAgIGRlY29kZURYVDEoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3VyZmFjZSwgc3RyaWRlLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUOgotICAgICAgICBkZWNvZGVEWFQxKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN1cmZhY2UsIHN0cmlkZSwgdHJ1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUOgotICAgICAgICBkZWNvZGVEWFQzKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN1cmZhY2UsIHN0cmlkZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBjYXNlIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUOgotICAgICAgICBkZWNvZGVEWFQ1KGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN1cmZhY2UsIHN0cmlkZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSNpZiBUSU1JTkcKLSAgICBnZXR0aW1lb2ZkYXkoJmVuZF90LCAmdHopOwotICAgIGxvbmcgdXNlYyA9IChlbmRfdC50dl9zZWMgLSBzdGFydF90LnR2X3NlYykqMTAwMDAwMCArCi0gICAgICAgIChlbmRfdC50dl91c2VjIC0gc3RhcnRfdC50dl91c2VjKTsKLSAgICAKLSAgICBwcmludGYoIkxvYWRlZCB3PSVkIGg9JWQgaW4gJWxkIHVzZWNcbiIsIHdpZHRoLCBoZWlnaHQsIHVzZWMpOwotI2VuZGlmCi19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZHh0LmggYi9vcGVuZ2wvbGliYWdsL2R4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTVhMzZjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvZHh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL2R4dC5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX1RFWFRVUkVfSAotI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1RFWFRVUkVfSAotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotICBib29sIERYVDFIYXNBbHBoYShjb25zdCBHTHZvaWQgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gIHZvaWQgZGVjb2RlRFhUKGNvbnN0IEdMdm9pZCAqZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICB2b2lkICpzdXJmYWNlLCBpbnQgc3RyaWRlLCBpbnQgZm9ybWF0KTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19URVhUVVJFX0gKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZWdsLmNwcCBiL29wZW5nbC9saWJhZ2wvZWdsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkMzJhMi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDc5ICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5EIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1aS9BTmF0aXZlT2JqZWN0QmFzZS5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8cGl4ZWxmbGluZ2VyL2Zvcm1hdC5oPgotI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9waXhlbGZsaW5nZXIuaD4KLQotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJzdGF0ZS5oIgotI2luY2x1ZGUgInRleHR1cmUuaCIKLSNpbmNsdWRlICJtYXRyaXguaCIKLQotI3VuZGVmIE5FTEVNCi0jZGVmaW5lIE5FTEVNKHgpIChzaXplb2YoeCkvc2l6ZW9mKCooeCkpKQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTEJvb2xlYW4gRUdMQVBJIGVnbFNldFN3YXBSZWN0YW5nbGVBTkRST0lEKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsCi0gICAgICAgIEVHTGludCBsZWZ0LCBFR0xpbnQgdG9wLCBFR0xpbnQgd2lkdGgsIEVHTGludCBoZWlnaHQpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgdW5zaWduZWQgaW50IE5VTV9ESVNQTEFZUyA9IDE7Ci0KLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgZ0luaXRNdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IGdFcnJvcktleU11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKLXN0YXRpYyBwdGhyZWFkX2tleV90IGdFR0xFcnJvcktleSA9IC0xOwotI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKLW5hbWVzcGFjZSBnbCB7Ci1wdGhyZWFkX2tleV90IGdHTEtleSA9IC0xOwotfTsgLy8gbmFtZXNwYWNlIGdsCi0jZW5kaWYKLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0YXRpYyBUIHNldEVycm9yKEdMaW50IGVycm9yLCBUIHJldHVyblZhbHVlKSB7Ci0gICAgaWYgKGdnbF91bmxpa2VseShnRUdMRXJyb3JLZXkgPT0gLTEpKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0Vycm9yS2V5TXV0ZXgpOwotICAgICAgICBpZiAoZ0VHTEVycm9yS2V5ID09IC0xKQotICAgICAgICAgICAgcHRocmVhZF9rZXlfY3JlYXRlKCZnRUdMRXJyb3JLZXksIE5VTEwpOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0Vycm9yS2V5TXV0ZXgpOwotICAgIH0KLSAgICBwdGhyZWFkX3NldHNwZWNpZmljKGdFR0xFcnJvcktleSwgKHZvaWQqKWVycm9yKTsKLSAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLXN0YXRpYyBHTGludCBnZXRFcnJvcigpIHsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGdFR0xFcnJvcktleSA9PSAtMSkpCi0gICAgICAgIHJldHVybiBFR0xfU1VDQ0VTUzsKLSAgICBHTGludCBlcnJvciA9IChHTGludClwdGhyZWFkX2dldHNwZWNpZmljKGdFR0xFcnJvcktleSk7Ci0gICAgaWYgKGVycm9yID09IDApIHsKLSAgICAgICAgLy8gVGhlIFRMUyBrZXkgaGFzIGJlZW4gY3JlYXRlZCBieSBhbm90aGVyIHRocmVhZCwgYnV0IHRoZSB2YWx1ZSBmb3IKLSAgICAgICAgLy8gdGhpcyB0aHJlYWQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLgotICAgICAgICByZXR1cm4gRUdMX1NVQ0NFU1M7Ci0gICAgfQotICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoZ0VHTEVycm9yS2V5LCAodm9pZCopRUdMX1NVQ0NFU1MpOwotICAgIHJldHVybiBlcnJvcjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgZWdsX2Rpc3BsYXlfdAotewotICAgIGVnbF9kaXNwbGF5X3QoKSA6IHR5cGUoMCksIGluaXRpYWxpemVkKDApIHsgfQotCi0gICAgc3RhdGljIGVnbF9kaXNwbGF5X3QmIGdldF9kaXNwbGF5KEVHTERpc3BsYXkgZHB5KTsKLQotICAgIHN0YXRpYyBFR0xCb29sZWFuIGlzX3ZhbGlkKEVHTERpc3BsYXkgZHB5KSB7Ci0gICAgICAgIHJldHVybiAoKHVpbnRwdHJfdChkcHkpLTFVKSA+PSBOVU1fRElTUExBWVMpID8gRUdMX0ZBTFNFIDogRUdMX1RSVUU7Ci0gICAgfQotCi0gICAgTmF0aXZlRGlzcGxheVR5cGUgICB0eXBlOwotICAgIHZvbGF0aWxlIGludDMyX3QgICAgaW5pdGlhbGl6ZWQ7Ci19OwotCi1zdGF0aWMgZWdsX2Rpc3BsYXlfdCBnRGlzcGxheXNbTlVNX0RJU1BMQVlTXTsKLQotZWdsX2Rpc3BsYXlfdCYgZWdsX2Rpc3BsYXlfdDo6Z2V0X2Rpc3BsYXkoRUdMRGlzcGxheSBkcHkpIHsKLSAgICByZXR1cm4gZ0Rpc3BsYXlzW3VpbnRwdHJfdChkcHkpLTFVXTsKLX0KLQotc3RydWN0IGVnbF9jb250ZXh0X3QgewotICAgIGVudW0gewotICAgICAgICBJU19DVVJSRU5UICAgICAgPSAgIDB4MDAwMTAwMDAsCi0gICAgICAgIE5FVkVSX0NVUlJFTlQgICA9ICAgMHgwMDAyMDAwMAotICAgIH07Ci0gICAgdWludDMyX3QgICAgICAgICAgICBmbGFnczsKLSAgICBFR0xEaXNwbGF5ICAgICAgICAgIGRweTsKLSAgICBFR0xDb25maWcgICAgICAgICAgIGNvbmZpZzsKLSAgICBFR0xTdXJmYWNlICAgICAgICAgIHJlYWQ7Ci0gICAgRUdMU3VyZmFjZSAgICAgICAgICBkcmF3OwotCi0gICAgc3RhdGljIGlubGluZSBlZ2xfY29udGV4dF90KiBjb250ZXh0KEVHTENvbnRleHQgY3R4KSB7Ci0gICAgICAgIG9nbGVzX2NvbnRleHRfdCogY29uc3QgZ2wgPSBzdGF0aWNfY2FzdDxvZ2xlc19jb250ZXh0X3QqPihjdHgpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZWdsX2NvbnRleHRfdCo+KGdsLT5yYXN0ZXJpemVyLmJhc2UpOwotICAgIH0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGVnbF9zdXJmYWNlX3QKLXsKLSAgICBlbnVtIHsKLSAgICAgICAgUEFHRV9GTElQID0gMHgwMDAwMDAwMSwKLSAgICAgICAgTUFHSUMgICAgID0gMHgzMTQxNTI2NQotICAgIH07Ci0KLSAgICB1aW50MzJfdCAgICAgICAgICAgIG1hZ2ljOwotICAgIEVHTERpc3BsYXkgICAgICAgICAgZHB5OwotICAgIEVHTENvbmZpZyAgICAgICAgICAgY29uZmlnOwotICAgIEVHTENvbnRleHQgICAgICAgICAgY3R4OwotCi0gICAgICAgICAgICAgICAgZWdsX3N1cmZhY2VfdChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgaW50MzJfdCBkZXB0aEZvcm1hdCk7Ci0gICAgdmlydHVhbCAgICAgfmVnbF9zdXJmYWNlX3QoKTsKLSAgICAgICAgICAgICAgICBib29sICAgIGlzVmFsaWQoKSBjb25zdDsKLSAgICB2aXJ0dWFsICAgICBib29sICAgIGluaXRDaGVjaygpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKSA9IDA7Ci0gICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgYmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpID0gMDsKLSAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBjb25uZWN0KCkgeyByZXR1cm4gRUdMX1RSVUU7IH0KLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkaXNjb25uZWN0KCkge30KLSAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRXaWR0aCgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRIZWlnaHQoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRIb3Jpem9udGFsUmVzb2x1dGlvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFZlcnRpY2FsUmVzb2x1dGlvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFJlZnJlc2hSYXRlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0U3dhcEJlaGF2aW9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgc3dhcEJ1ZmZlcnMoKTsKLSAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBzZXRTd2FwUmVjdGFuZ2xlKEVHTGludCBsLCBFR0xpbnQgdCwgRUdMaW50IHcsIEVHTGludCBoKTsKLXByb3RlY3RlZDoKLSAgICBHR0xTdXJmYWNlICAgICAgICAgICAgICBkZXB0aDsKLX07Ci0KLWVnbF9zdXJmYWNlX3Q6OmVnbF9zdXJmYWNlX3QoRUdMRGlzcGxheSBkcHksCi0gICAgICAgIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgIGludDMyX3QgZGVwdGhGb3JtYXQpCi0gICAgOiBtYWdpYyhNQUdJQyksIGRweShkcHkpLCBjb25maWcoY29uZmlnKSwgY3R4KDApCi17Ci0gICAgZGVwdGgudmVyc2lvbiA9IHNpemVvZihHR0xTdXJmYWNlKTsKLSAgICBkZXB0aC5kYXRhID0gMDsKLSAgICBkZXB0aC5mb3JtYXQgPSBkZXB0aEZvcm1hdDsKLX0KLWVnbF9zdXJmYWNlX3Q6On5lZ2xfc3VyZmFjZV90KCkKLXsKLSAgICBtYWdpYyA9IDA7Ci0gICAgZnJlZShkZXB0aC5kYXRhKTsKLX0KLWJvb2wgZWdsX3N1cmZhY2VfdDo6aXNWYWxpZCgpIGNvbnN0IHsKLSAgICBBTE9HRV9JRihtYWdpYyAhPSBNQUdJQywgImludmFsaWQgRUdMU3VyZmFjZSAoJXApIiwgdGhpcyk7Ci0gICAgcmV0dXJuIG1hZ2ljID09IE1BR0lDOyAKLX0KLQotRUdMQm9vbGVhbiBlZ2xfc3VyZmFjZV90Ojpzd2FwQnVmZmVycygpIHsKLSAgICByZXR1cm4gRUdMX0ZBTFNFOwotfQotRUdMaW50IGVnbF9zdXJmYWNlX3Q6OmdldEhvcml6b250YWxSZXNvbHV0aW9uKCkgY29uc3QgewotICAgIHJldHVybiAoMCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpICogKDEuMGYgLyAyNS40Zik7Ci19Ci1FR0xpbnQgZWdsX3N1cmZhY2VfdDo6Z2V0VmVydGljYWxSZXNvbHV0aW9uKCkgY29uc3QgewotICAgIHJldHVybiAoMCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpICogKDEuMGYgLyAyNS40Zik7Ci19Ci1FR0xpbnQgZWdsX3N1cmZhY2VfdDo6Z2V0UmVmcmVzaFJhdGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuICg2MCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpOwotfQotRUdMaW50IGVnbF9zdXJmYWNlX3Q6OmdldFN3YXBCZWhhdmlvcigpIGNvbnN0IHsKLSAgICByZXR1cm4gRUdMX0JVRkZFUl9QUkVTRVJWRUQ7Ci19Ci1FR0xCb29sZWFuIGVnbF9zdXJmYWNlX3Q6OnNldFN3YXBSZWN0YW5nbGUoCi0gICAgICAgIEVHTGludCBsLCBFR0xpbnQgdCwgRUdMaW50IHcsIEVHTGludCBoKQotewotICAgIHJldHVybiBFR0xfRkFMU0U7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGVnbF93aW5kb3dfc3VyZmFjZV92Ml90IDogcHVibGljIGVnbF9zdXJmYWNlX3QKLXsKLSAgICBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdCgKLSAgICAgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotICAgICAgICAgICAgaW50MzJfdCBkZXB0aEZvcm1hdCwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdyk7Ci0KLSAgICB+ZWdsX3dpbmRvd19zdXJmYWNlX3YyX3QoKTsKLQotICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0gLy8gVE9ETzogcmVwb3J0IGZhaWx1cmUgaWYgY3RvciBmYWlscwotICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIHN3YXBCdWZmZXJzKCk7Ci0gICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgYmluZERyYXdTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpOwotICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmRSZWFkU3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKTsKLSAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBjb25uZWN0KCk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZGlzY29ubmVjdCgpOwotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFdpZHRoKCkgY29uc3QgICAgeyByZXR1cm4gd2lkdGg7ICB9Ci0gICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0SGVpZ2h0KCkgY29uc3QgICB7IHJldHVybiBoZWlnaHQ7IH0KLSAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRIb3Jpem9udGFsUmVzb2x1dGlvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFZlcnRpY2FsUmVzb2x1dGlvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFJlZnJlc2hSYXRlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0U3dhcEJlaGF2aW9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgc2V0U3dhcFJlY3RhbmdsZShFR0xpbnQgbCwgRUdMaW50IHQsIEVHTGludCB3LCBFR0xpbnQgaCk7Ci0gICAgCi1wcml2YXRlOgotICAgIHN0YXR1c190IGxvY2soQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmLCBpbnQgdXNhZ2UsIHZvaWQqKiB2YWRkcik7Ci0gICAgc3RhdHVzX3QgdW5sb2NrKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1Zik7Ci0gICAgQU5hdGl2ZVdpbmRvdyogICBuYXRpdmVXaW5kb3c7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogICBidWZmZXI7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogICBwcmV2aW91c0J1ZmZlcjsKLSAgICBncmFsbG9jX21vZHVsZV90IGNvbnN0KiAgICBtb2R1bGU7Ci0gICAgaW50IHdpZHRoOwotICAgIGludCBoZWlnaHQ7Ci0gICAgdm9pZCogYml0czsKLSAgICBHR0xGb3JtYXQgY29uc3QqIHBpeGVsRm9ybWF0VGFibGU7Ci0gICAgCi0gICAgc3RydWN0IFJlY3QgewotICAgICAgICBpbmxpbmUgUmVjdCgpIHsgfTsKLSAgICAgICAgaW5saW5lIFJlY3QoaW50MzJfdCB3LCBpbnQzMl90IGgpCi0gICAgICAgICAgICA6IGxlZnQoMCksIHRvcCgwKSwgcmlnaHQodyksIGJvdHRvbShoKSB7IH0KLSAgICAgICAgaW5saW5lIFJlY3QoaW50MzJfdCBsLCBpbnQzMl90IHQsIGludDMyX3QgciwgaW50MzJfdCBiKQotICAgICAgICAgICAgOiBsZWZ0KGwpLCB0b3AodCksIHJpZ2h0KHIpLCBib3R0b20oYikgeyB9Ci0gICAgICAgIFJlY3QmIGFuZFNlbGYoY29uc3QgUmVjdCYgcikgewotICAgICAgICAgICAgbGVmdCAgID0gbWF4KGxlZnQsIHIubGVmdCk7Ci0gICAgICAgICAgICB0b3AgICAgPSBtYXgodG9wLCByLnRvcCk7Ci0gICAgICAgICAgICByaWdodCAgPSBtaW4ocmlnaHQsIHIucmlnaHQpOwotICAgICAgICAgICAgYm90dG9tID0gbWluKGJvdHRvbSwgci5ib3R0b20pOwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiAobGVmdD49cmlnaHQgfHwgdG9wPj1ib3R0b20pOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgZHVtcChjaGFyIGNvbnN0KiB3aGF0KSB7Ci0gICAgICAgICAgICBBTE9HRCgiJXMgeyAlNWQsICU1ZCwgdz0lNWQsIGg9JTVkIH0iLAotICAgICAgICAgICAgICAgICAgICB3aGF0LCBsZWZ0LCB0b3AsIHJpZ2h0LWxlZnQsIGJvdHRvbS10b3ApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQzMl90IGxlZnQ7Ci0gICAgICAgIGludDMyX3QgdG9wOwotICAgICAgICBpbnQzMl90IHJpZ2h0OwotICAgICAgICBpbnQzMl90IGJvdHRvbTsKLSAgICB9OwotCi0gICAgc3RydWN0IFJlZ2lvbiB7Ci0gICAgICAgIGlubGluZSBSZWdpb24oKSA6IGNvdW50KDApIHsgfQotICAgICAgICB0eXBlZGVmIFJlY3QgY29uc3QqIGNvbnN0X2l0ZXJhdG9yOwotICAgICAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHN0b3JhZ2U7IH0KLSAgICAgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gc3RvcmFnZStjb3VudDsgfQotICAgICAgICBzdGF0aWMgUmVnaW9uIHN1YnRyYWN0KGNvbnN0IFJlY3QmIGxocywgY29uc3QgUmVjdCYgcmhzKSB7Ci0gICAgICAgICAgICBSZWdpb24gcmVnOwotICAgICAgICAgICAgUmVjdCogc3RvcmFnZSA9IHJlZy5zdG9yYWdlOwotICAgICAgICAgICAgaWYgKCFsaHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxocy50b3AgPCByaHMudG9wKSB7IC8vIHRvcCByZWN0Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmxlZnQgICA9IGxocy5sZWZ0OwotICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLT50b3AgICAgPSBsaHMudG9wOwotICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLT5yaWdodCAgPSBsaHMucmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmJvdHRvbSA9IHJocy50b3A7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCB0b3AgPSBtYXgobGhzLnRvcCwgcmhzLnRvcCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBib3QgPSBtaW4obGhzLmJvdHRvbSwgcmhzLmJvdHRvbSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRvcCA8IGJvdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobGhzLmxlZnQgPCByaHMubGVmdCkgeyAvLyBsZWZ0LXNpZGUgcmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+bGVmdCAgID0gbGhzLmxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLT50b3AgICAgPSB0b3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLT5yaWdodCAgPSByaHMubGVmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmJvdHRvbSA9IGJvdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobGhzLnJpZ2h0ID4gcmhzLnJpZ2h0KSB7IC8vIHJpZ2h0LXNpZGUgcmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+bGVmdCAgID0gcmhzLnJpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+dG9wICAgID0gdG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+cmlnaHQgID0gbGhzLnJpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+Ym90dG9tID0gYm90OwotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsaHMuYm90dG9tID4gcmhzLmJvdHRvbSkgeyAvLyBib3R0b20gcmVjdAotICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLT5sZWZ0ICAgPSBsaHMubGVmdDsKLSAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+dG9wICAgID0gcmhzLmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+cmlnaHQgID0gbGhzLnJpZ2h0OwotICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLT5ib3R0b20gPSBsaHMuYm90dG9tOwotICAgICAgICAgICAgICAgICAgICBzdG9yYWdlKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlZy5jb3VudCA9IHN0b3JhZ2UgLSByZWcuc3RvcmFnZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZWc7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIGNvdW50PD0wOwotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgUmVjdCBzdG9yYWdlWzRdOwotICAgICAgICBzc2l6ZV90IGNvdW50OwotICAgIH07Ci0gICAgCi0gICAgdm9pZCBjb3B5Qmx0KAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogZHN0LCB2b2lkKiBkc3RfdmFkZHIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBzcmMsIHZvaWQgY29uc3QqIHNyY192YWRkciwKLSAgICAgICAgICAgIGNvbnN0IFJlZ2lvbiYgY2xpcCk7Ci0KLSAgICBSZWN0IGRpcnR5UmVnaW9uOwotICAgIFJlY3Qgb2xkRGlydHlSZWdpb247Ci19OwotCi1lZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6ZWdsX3dpbmRvd19zdXJmYWNlX3YyX3QoRUdMRGlzcGxheSBkcHksCi0gICAgICAgIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgIGludDMyX3QgZGVwdGhGb3JtYXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykKLSAgICA6IGVnbF9zdXJmYWNlX3QoZHB5LCBjb25maWcsIGRlcHRoRm9ybWF0KSwgCi0gICAgbmF0aXZlV2luZG93KHdpbmRvdyksIGJ1ZmZlcigwKSwgcHJldmlvdXNCdWZmZXIoMCksIG1vZHVsZSgwKSwKLSAgICBiaXRzKE5VTEwpCi17Ci0gICAgaHdfbW9kdWxlX3QgY29uc3QqIHBNb2R1bGU7Ci0gICAgaHdfZ2V0X21vZHVsZShHUkFMTE9DX0hBUkRXQVJFX01PRFVMRV9JRCwgJnBNb2R1bGUpOwotICAgIG1vZHVsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Z3JhbGxvY19tb2R1bGVfdCBjb25zdCo+KHBNb2R1bGUpOwotCi0gICAgcGl4ZWxGb3JtYXRUYWJsZSA9IGdnbEdldFBpeGVsRm9ybWF0VGFibGUoKTsKLSAgICAKLSAgICAvLyBrZWVwIGEgcmVmZXJlbmNlIG9uIHRoZSB3aW5kb3cKLSAgICBuYXRpdmVXaW5kb3ctPmNvbW1vbi5pbmNSZWYoJm5hdGl2ZVdpbmRvdy0+Y29tbW9uKTsKLSAgICBuYXRpdmVXaW5kb3ctPnF1ZXJ5KG5hdGl2ZVdpbmRvdywgTkFUSVZFX1dJTkRPV19XSURUSCwgJndpZHRoKTsKLSAgICBuYXRpdmVXaW5kb3ctPnF1ZXJ5KG5hdGl2ZVdpbmRvdywgTkFUSVZFX1dJTkRPV19IRUlHSFQsICZoZWlnaHQpOwotfQotCi1lZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6fmVnbF93aW5kb3dfc3VyZmFjZV92Ml90KCkgewotICAgIGlmIChidWZmZXIpIHsKLSAgICAgICAgYnVmZmVyLT5jb21tb24uZGVjUmVmKCZidWZmZXItPmNvbW1vbik7Ci0gICAgfQotICAgIGlmIChwcmV2aW91c0J1ZmZlcikgewotICAgICAgICBwcmV2aW91c0J1ZmZlci0+Y29tbW9uLmRlY1JlZigmcHJldmlvdXNCdWZmZXItPmNvbW1vbik7IAotICAgIH0KLSAgICBuYXRpdmVXaW5kb3ctPmNvbW1vbi5kZWNSZWYoJm5hdGl2ZVdpbmRvdy0+Y29tbW9uKTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6Y29ubmVjdCgpIAotewotICAgIC8vIHdlJ3JlIGludGVuZGluZyB0byBkbyBzb2Z0d2FyZSByZW5kZXJpbmcKLSAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZShuYXRpdmVXaW5kb3csIAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTik7Ci0KLSAgICAvLyBkZXF1ZXVlIGEgYnVmZmVyCi0gICAgaWYgKG5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihuYXRpdmVXaW5kb3csICZidWZmZXIpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOwotICAgIH0KLQotICAgIC8vIGFsbG9jYXRlIGEgY29ycmVzcG9uZGluZyBkZXB0aC1idWZmZXIKLSAgICB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7Ci0gICAgaWYgKGRlcHRoLmZvcm1hdCkgewotICAgICAgICBkZXB0aC53aWR0aCAgID0gd2lkdGg7Ci0gICAgICAgIGRlcHRoLmhlaWdodCAgPSBoZWlnaHQ7Ci0gICAgICAgIGRlcHRoLnN0cmlkZSAgPSBkZXB0aC53aWR0aDsgLy8gdXNlIHRoZSB3aWR0aCBoZXJlCi0gICAgICAgIGRlcHRoLmRhdGEgICAgPSAoR0dMdWJ5dGUqKW1hbGxvYyhkZXB0aC5zdHJpZGUqZGVwdGguaGVpZ2h0KjIpOwotICAgICAgICBpZiAoZGVwdGguZGF0YSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGtlZXAgYSByZWZlcmVuY2Ugb24gdGhlIGJ1ZmZlcgotICAgIGJ1ZmZlci0+Y29tbW9uLmluY1JlZigmYnVmZmVyLT5jb21tb24pOwotCi0gICAgLy8gTG9jayB0aGUgYnVmZmVyCi0gICAgbmF0aXZlV2luZG93LT5sb2NrQnVmZmVyKG5hdGl2ZVdpbmRvdywgYnVmZmVyKTsKLSAgICAvLyBwaW4gdGhlIGJ1ZmZlciBkb3duCi0gICAgaWYgKGxvY2soYnVmZmVyLCBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCAKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICZiaXRzKSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiY29ubmVjdCgpIGZhaWxlZCB0byBsb2NrIGJ1ZmZlciAlcCAoJXV4JXUpIiwKLSAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlci0+d2lkdGgsIGJ1ZmZlci0+aGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQUNDRVNTLCBFR0xfRkFMU0UpOwotICAgICAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIG1ha2Ugc3VyZSB3ZSdyZSBub3QgYWNjZXNzaW5nIHRoZSBidWZmZXIgYW55bW9yZQotICAgIH0KLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLXZvaWQgZWdsX3dpbmRvd19zdXJmYWNlX3YyX3Q6OmRpc2Nvbm5lY3QoKSAKLXsKLSAgICBpZiAoYnVmZmVyICYmIGJpdHMpIHsKLSAgICAgICAgYml0cyA9IE5VTEw7Ci0gICAgICAgIHVubG9jayhidWZmZXIpOwotICAgIH0KLSAgICAvLyBlbnF1ZXVlIHRoZSBsYXN0IGZyYW1lCi0gICAgbmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcihuYXRpdmVXaW5kb3csIGJ1ZmZlcik7Ci0gICAgaWYgKGJ1ZmZlcikgewotICAgICAgICBidWZmZXItPmNvbW1vbi5kZWNSZWYoJmJ1ZmZlci0+Y29tbW9uKTsKLSAgICAgICAgYnVmZmVyID0gMDsKLSAgICB9Ci0gICAgaWYgKHByZXZpb3VzQnVmZmVyKSB7Ci0gICAgICAgIHByZXZpb3VzQnVmZmVyLT5jb21tb24uZGVjUmVmKCZwcmV2aW91c0J1ZmZlci0+Y29tbW9uKTsgCi0gICAgICAgIHByZXZpb3VzQnVmZmVyID0gMDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IGVnbF93aW5kb3dfc3VyZmFjZV92Ml90Ojpsb2NrKAotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWYsIGludCB1c2FnZSwgdm9pZCoqIHZhZGRyKQotewotICAgIGludCBlcnI7Ci0KLSAgICBlcnIgPSBtb2R1bGUtPmxvY2sobW9kdWxlLCBidWYtPmhhbmRsZSwKLSAgICAgICAgICAgIHVzYWdlLCAwLCAwLCBidWYtPndpZHRoLCBidWYtPmhlaWdodCwgdmFkZHIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgZWdsX3dpbmRvd19zdXJmYWNlX3YyX3Q6OnVubG9jayhBTmF0aXZlV2luZG93QnVmZmVyKiBidWYpCi17Ci0gICAgaWYgKCFidWYpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaW50IGVyciA9IE5PX0VSUk9SOwotCi0gICAgZXJyID0gbW9kdWxlLT51bmxvY2sobW9kdWxlLCBidWYtPmhhbmRsZSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIGVnbF93aW5kb3dfc3VyZmFjZV92Ml90Ojpjb3B5Qmx0KAotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBkc3QsIHZvaWQqIGRzdF92YWRkciwKLSAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogc3JjLCB2b2lkIGNvbnN0KiBzcmNfdmFkZHIsCi0gICAgICAgIGNvbnN0IFJlZ2lvbiYgY2xpcCkKLXsKLSAgICAvLyBOT1RFOiBkc3QgYW5kIHNyYyBtdXN0IGJlIHRoZSBzYW1lIGZvcm1hdAotICAgIAotICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgY3VyID0gY2xpcC5iZWdpbigpOwotICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gY2xpcC5lbmQoKTsKLQotICAgIGNvbnN0IHNpemVfdCBicHAgPSBwaXhlbEZvcm1hdFRhYmxlW3NyYy0+Zm9ybWF0XS5zaXplOwotICAgIGNvbnN0IHNpemVfdCBkYnByID0gZHN0LT5zdHJpZGUgKiBicHA7Ci0gICAgY29uc3Qgc2l6ZV90IHNicHIgPSBzcmMtPnN0cmlkZSAqIGJwcDsKLQotICAgIHVpbnQ4X3QgY29uc3QgKiBjb25zdCBzcmNfYml0cyA9ICh1aW50OF90IGNvbnN0ICopc3JjX3ZhZGRyOwotICAgIHVpbnQ4X3QgICAgICAgKiBjb25zdCBkc3RfYml0cyA9ICh1aW50OF90ICAgICAgICopZHN0X3ZhZGRyOwotCi0gICAgd2hpbGUgKGN1ciAhPSBlbmQpIHsKLSAgICAgICAgY29uc3QgUmVjdCYgcigqY3VyKyspOwotICAgICAgICBzc2l6ZV90IHcgPSByLnJpZ2h0IC0gci5sZWZ0OwotICAgICAgICBzc2l6ZV90IGggPSByLmJvdHRvbSAtIHIudG9wOwotICAgICAgICBpZiAodyA8PSAwIHx8IGg8PTApIGNvbnRpbnVlOwotICAgICAgICBzaXplX3Qgc2l6ZSA9IHcgKiBicHA7Ci0gICAgICAgIHVpbnQ4X3QgY29uc3QgKiBzID0gc3JjX2JpdHMgKyAoci5sZWZ0ICsgc3JjLT5zdHJpZGUgKiByLnRvcCkgKiBicHA7Ci0gICAgICAgIHVpbnQ4X3QgICAgICAgKiBkID0gZHN0X2JpdHMgKyAoci5sZWZ0ICsgZHN0LT5zdHJpZGUgKiByLnRvcCkgKiBicHA7Ci0gICAgICAgIGlmIChkYnByPT1zYnByICYmIHNpemU9PXNicHIpIHsKLSAgICAgICAgICAgIHNpemUgKj0gaDsKLSAgICAgICAgICAgIGggPSAxOwotICAgICAgICB9Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG1lbWNweShkLCBzLCBzaXplKTsKLSAgICAgICAgICAgIGQgKz0gZGJwcjsKLSAgICAgICAgICAgIHMgKz0gc2JwcjsKLSAgICAgICAgfSB3aGlsZSAoLS1oID4gMCk7Ci0gICAgfQotfQotCi1FR0xCb29sZWFuIGVnbF93aW5kb3dfc3VyZmFjZV92Ml90Ojpzd2FwQnVmZmVycygpCi17Ci0gICAgaWYgKCFidWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQUNDRVNTLCBFR0xfRkFMU0UpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIEhhbmRsZSBlZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRCgpCi0gICAgICogV2UgY29weWJhY2sgZnJvbSB0aGUgZnJvbnQgYnVmZmVyIAotICAgICAqLwotICAgIGlmICghZGlydHlSZWdpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgIGRpcnR5UmVnaW9uLmFuZFNlbGYoUmVjdChidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCkpOwotICAgICAgICBpZiAocHJldmlvdXNCdWZmZXIpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2FzIGNvbnN0IFJlZ2lvbiBjb3B5QmFjaywgYnV0IHRoYXQgY2F1c2VzIGFuCi0gICAgICAgICAgICAvLyBpbnRlcm5hbCBjb21waWxlIGVycm9yIG9uIHNpbXVsYXRvciBidWlsZHMKLSAgICAgICAgICAgIC8qY29uc3QqLyBSZWdpb24gY29weUJhY2soUmVnaW9uOjpzdWJ0cmFjdChvbGREaXJ0eVJlZ2lvbiwgZGlydHlSZWdpb24pKTsKLSAgICAgICAgICAgIGlmICghY29weUJhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgdm9pZCogcHJldkJpdHM7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2socHJldmlvdXNCdWZmZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOLCAmcHJldkJpdHMpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSBwcmV2aW91c0J1ZmZlciB0byBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgY29weUJsdChidWZmZXIsIGJpdHMsIHByZXZpb3VzQnVmZmVyLCBwcmV2Qml0cywgY29weUJhY2spOwotICAgICAgICAgICAgICAgICAgICB1bmxvY2socHJldmlvdXNCdWZmZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvbGREaXJ0eVJlZ2lvbiA9IGRpcnR5UmVnaW9uOwotICAgIH0KLQotICAgIGlmIChwcmV2aW91c0J1ZmZlcikgewotICAgICAgICBwcmV2aW91c0J1ZmZlci0+Y29tbW9uLmRlY1JlZigmcHJldmlvdXNCdWZmZXItPmNvbW1vbik7IAotICAgICAgICBwcmV2aW91c0J1ZmZlciA9IDA7Ci0gICAgfQotICAgIAotICAgIHVubG9jayhidWZmZXIpOwotICAgIHByZXZpb3VzQnVmZmVyID0gYnVmZmVyOwotICAgIG5hdGl2ZVdpbmRvdy0+cXVldWVCdWZmZXIobmF0aXZlV2luZG93LCBidWZmZXIpOwotICAgIGJ1ZmZlciA9IDA7Ci0KLSAgICAvLyBkZXF1ZXVlIGEgbmV3IGJ1ZmZlcgotICAgIGlmIChuYXRpdmVXaW5kb3ctPmRlcXVldWVCdWZmZXIobmF0aXZlV2luZG93LCAmYnVmZmVyKSA9PSBOT19FUlJPUikgewotCi0gICAgICAgIC8vIFRPRE86IGxvY2tCdWZmZXIgc2hvdWxkIHJhdGhlciBiZSBleGVjdXRlZCB3aGVuIHRoZSB2ZXJ5IGZpcnN0Ci0gICAgICAgIC8vIGRpcmVjdCByZW5kZXJpbmcgb2NjdXJzLgotICAgICAgICBuYXRpdmVXaW5kb3ctPmxvY2tCdWZmZXIobmF0aXZlV2luZG93LCBidWZmZXIpOwotCi0gICAgICAgIC8vIHJlYWxsb2NhdGUgdGhlIGRlcHRoLWJ1ZmZlciBpZiBuZWVkZWQKLSAgICAgICAgaWYgKCh3aWR0aCAhPSBidWZmZXItPndpZHRoKSB8fCAoaGVpZ2h0ICE9IGJ1ZmZlci0+aGVpZ2h0KSkgewotICAgICAgICAgICAgLy8gVE9ETzogd2UgcHJvYmFibHkgc2hvdWxkIHJlc2V0IHRoZSBzd2FwIHJlY3QgaGVyZQotICAgICAgICAgICAgLy8gaWYgdGhlIHdpbmRvdyBzaXplIGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7Ci0gICAgICAgICAgICBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKLSAgICAgICAgICAgIGlmIChkZXB0aC5kYXRhKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShkZXB0aC5kYXRhKTsKLSAgICAgICAgICAgICAgICBkZXB0aC53aWR0aCAgID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgZGVwdGguaGVpZ2h0ICA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICBkZXB0aC5zdHJpZGUgID0gYnVmZmVyLT5zdHJpZGU7Ci0gICAgICAgICAgICAgICAgZGVwdGguZGF0YSAgICA9IChHR0x1Ynl0ZSopbWFsbG9jKGRlcHRoLnN0cmlkZSpkZXB0aC5oZWlnaHQqMik7Ci0gICAgICAgICAgICAgICAgaWYgKGRlcHRoLmRhdGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGtlZXAgYSByZWZlcmVuY2Ugb24gdGhlIGJ1ZmZlcgotICAgICAgICBidWZmZXItPmNvbW1vbi5pbmNSZWYoJmJ1ZmZlci0+Y29tbW9uKTsKLQotICAgICAgICAvLyBmaW5hbGx5IHBpbiB0aGUgYnVmZmVyIGRvd24KLSAgICAgICAgaWYgKGxvY2soYnVmZmVyLCBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfAotICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICZiaXRzKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoImVnbFN3YXBCdWZmZXJzKCkgZmFpbGVkIHRvIGxvY2sgYnVmZmVyICVwICgldXgldSkiLAotICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlci0+d2lkdGgsIGJ1ZmZlci0+aGVpZ2h0KTsKLSAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FDQ0VTUywgRUdMX0ZBTFNFKTsKLSAgICAgICAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgbWFrZSBzdXJlIHdlJ3JlIG5vdCBhY2Nlc3NpbmcgdGhlIGJ1ZmZlciBhbnltb3JlCi0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi1FR0xCb29sZWFuIGVnbF93aW5kb3dfc3VyZmFjZV92Ml90OjpzZXRTd2FwUmVjdGFuZ2xlKAotICAgICAgICBFR0xpbnQgbCwgRUdMaW50IHQsIEVHTGludCB3LCBFR0xpbnQgaCkKLXsKLSAgICBkaXJ0eVJlZ2lvbiA9IFJlY3QobCwgdCwgbCt3LCB0K2gpOwotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6YmluZERyYXdTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpCi17Ci0gICAgR0dMU3VyZmFjZSBidWZmZXI7Ci0gICAgYnVmZmVyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7Ci0gICAgYnVmZmVyLndpZHRoICAgPSB0aGlzLT5idWZmZXItPndpZHRoOwotICAgIGJ1ZmZlci5oZWlnaHQgID0gdGhpcy0+YnVmZmVyLT5oZWlnaHQ7Ci0gICAgYnVmZmVyLnN0cmlkZSAgPSB0aGlzLT5idWZmZXItPnN0cmlkZTsKLSAgICBidWZmZXIuZGF0YSAgICA9IChHR0x1Ynl0ZSopYml0czsKLSAgICBidWZmZXIuZm9ybWF0ICA9IHRoaXMtPmJ1ZmZlci0+Zm9ybWF0OwotICAgIGdsLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yQnVmZmVyKGdsLCAmYnVmZmVyKTsKLSAgICBpZiAoZGVwdGguZGF0YSAhPSBnbC0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmRlcHRoLmRhdGEpCi0gICAgICAgIGdsLT5yYXN0ZXJpemVyLnByb2NzLmRlcHRoQnVmZmVyKGdsLCAmZGVwdGgpOwotCi0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotRUdMQm9vbGVhbiBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6YmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpCi17Ci0gICAgR0dMU3VyZmFjZSBidWZmZXI7Ci0gICAgYnVmZmVyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7Ci0gICAgYnVmZmVyLndpZHRoICAgPSB0aGlzLT5idWZmZXItPndpZHRoOwotICAgIGJ1ZmZlci5oZWlnaHQgID0gdGhpcy0+YnVmZmVyLT5oZWlnaHQ7Ci0gICAgYnVmZmVyLnN0cmlkZSAgPSB0aGlzLT5idWZmZXItPnN0cmlkZTsKLSAgICBidWZmZXIuZGF0YSAgICA9IChHR0x1Ynl0ZSopYml0czsgLy8gRklYTUU6IGhvcGVmdWxseSBpcyBpcyBMT0NLRUQhISEKLSAgICBidWZmZXIuZm9ybWF0ICA9IHRoaXMtPmJ1ZmZlci0+Zm9ybWF0OwotICAgIGdsLT5yYXN0ZXJpemVyLnByb2NzLnJlYWRCdWZmZXIoZ2wsICZidWZmZXIpOwotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLUVHTGludCBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6Z2V0SG9yaXpvbnRhbFJlc29sdXRpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIChuYXRpdmVXaW5kb3ctPnhkcGkgKiBFR0xfRElTUExBWV9TQ0FMSU5HKSAqICgxLjBmIC8gMjUuNGYpOwotfQotRUdMaW50IGVnbF93aW5kb3dfc3VyZmFjZV92Ml90OjpnZXRWZXJ0aWNhbFJlc29sdXRpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIChuYXRpdmVXaW5kb3ctPnlkcGkgKiBFR0xfRElTUExBWV9TQ0FMSU5HKSAqICgxLjBmIC8gMjUuNGYpOwotfQotRUdMaW50IGVnbF93aW5kb3dfc3VyZmFjZV92Ml90OjpnZXRSZWZyZXNoUmF0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gKDYwICogRUdMX0RJU1BMQVlfU0NBTElORyk7IC8vIEZJWE1FCi19Ci1FR0xpbnQgZWdsX3dpbmRvd19zdXJmYWNlX3YyX3Q6OmdldFN3YXBCZWhhdmlvcigpIGNvbnN0IAotewotICAgIC8qCi0gICAgICogRUdMX0JVRkZFUl9QUkVTRVJWRUQgbWVhbnMgdGhhdCBlZ2xTd2FwQnVmZmVycygpIGNvbXBsZXRlbHkgcHJlc2VydmVzCi0gICAgICogdGhlIGNvbnRlbnQgb2YgdGhlIHN3YXBwZWQgYnVmZmVyLgotICAgICAqIAotICAgICAqIEVHTF9CVUZGRVJfREVTVFJPWUVEIG1lYW5zIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlciBpcyBsb3N0LgotICAgICAqIAotICAgICAqIEhvd2V2ZXIgd2hlbiBBTkRST0lEX3N3YXBfcmV0Y2FuZ2xlIGlzIHN1cHBvcnRlZCwgRUdMX0JVRkZFUl9ERVNUUk9ZRUQKLSAgICAgKiBvbmx5IGFwcGxpZXMgdG8gdGhlIGFyZWEgc3BlY2lmaWVkIGJ5IGVnbFNldFN3YXBSZWN0YW5nbGVBTkRST0lEKCksIHRoYXQKLSAgICAgKiBpcywgZXZlcnl0aGluZyBvdXRzaWRlIG9mIHRoaXMgYXJlYSBpcyBwcmVzZXJ2ZWQuCi0gICAgICogCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBFR0wgYXNzdW1lcyB0aGUgbGF0ZXIgY2FzZS4KLSAgICAgKiAKLSAgICAgKi8KLQotICAgIHJldHVybiBFR0xfQlVGRkVSX0RFU1RST1lFRDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgZWdsX3BpeG1hcF9zdXJmYWNlX3QgOiBwdWJsaWMgZWdsX3N1cmZhY2VfdAotewotICAgIGVnbF9waXhtYXBfc3VyZmFjZV90KAotICAgICAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgICAgICBpbnQzMl90IGRlcHRoRm9ybWF0LAotICAgICAgICAgICAgZWdsX25hdGl2ZV9waXhtYXBfdCBjb25zdCAqIHBpeG1hcCk7Ci0KLSAgICB2aXJ0dWFsIH5lZ2xfcGl4bWFwX3N1cmZhY2VfdCgpIHsgfQotCi0gICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gIWRlcHRoLmZvcm1hdCB8fCBkZXB0aC5kYXRhIT0wOyB9IAotICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKTsKLSAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kUmVhZFN1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCk7Ci0gICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0V2lkdGgoKSBjb25zdCAgICB7IHJldHVybiBuYXRpdmVQaXhtYXAud2lkdGg7ICB9Ci0gICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0SGVpZ2h0KCkgY29uc3QgICB7IHJldHVybiBuYXRpdmVQaXhtYXAuaGVpZ2h0OyB9Ci1wcml2YXRlOgotICAgIGVnbF9uYXRpdmVfcGl4bWFwX3QgICAgIG5hdGl2ZVBpeG1hcDsKLX07Ci0KLWVnbF9waXhtYXBfc3VyZmFjZV90OjplZ2xfcGl4bWFwX3N1cmZhY2VfdChFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgaW50MzJfdCBkZXB0aEZvcm1hdCwKLSAgICAgICAgZWdsX25hdGl2ZV9waXhtYXBfdCBjb25zdCAqIHBpeG1hcCkKLSAgICA6IGVnbF9zdXJmYWNlX3QoZHB5LCBjb25maWcsIGRlcHRoRm9ybWF0KSwgbmF0aXZlUGl4bWFwKCpwaXhtYXApCi17Ci0gICAgaWYgKGRlcHRoRm9ybWF0KSB7Ci0gICAgICAgIGRlcHRoLndpZHRoICAgPSBwaXhtYXAtPndpZHRoOwotICAgICAgICBkZXB0aC5oZWlnaHQgID0gcGl4bWFwLT5oZWlnaHQ7Ci0gICAgICAgIGRlcHRoLnN0cmlkZSAgPSBkZXB0aC53aWR0aDsgLy8gdXNlIHRoZSB3aWR0aCBoZXJlCi0gICAgICAgIGRlcHRoLmRhdGEgICAgPSAoR0dMdWJ5dGUqKW1hbGxvYyhkZXB0aC5zdHJpZGUqZGVwdGguaGVpZ2h0KjIpOwotICAgICAgICBpZiAoZGVwdGguZGF0YSA9PSAwKSB7Ci0gICAgICAgICAgICBzZXRFcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfTk9fU1VSRkFDRSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1FR0xCb29sZWFuIGVnbF9waXhtYXBfc3VyZmFjZV90OjpiaW5kRHJhd1N1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCkKLXsKLSAgICBHR0xTdXJmYWNlIGJ1ZmZlcjsKLSAgICBidWZmZXIudmVyc2lvbiA9IHNpemVvZihHR0xTdXJmYWNlKTsKLSAgICBidWZmZXIud2lkdGggICA9IG5hdGl2ZVBpeG1hcC53aWR0aDsKLSAgICBidWZmZXIuaGVpZ2h0ICA9IG5hdGl2ZVBpeG1hcC5oZWlnaHQ7Ci0gICAgYnVmZmVyLnN0cmlkZSAgPSBuYXRpdmVQaXhtYXAuc3RyaWRlOwotICAgIGJ1ZmZlci5kYXRhICAgID0gbmF0aXZlUGl4bWFwLmRhdGE7Ci0gICAgYnVmZmVyLmZvcm1hdCAgPSBuYXRpdmVQaXhtYXAuZm9ybWF0OwotCi0gICAgZ2wtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3JCdWZmZXIoZ2wsICZidWZmZXIpOwotICAgIGlmIChkZXB0aC5kYXRhICE9IGdsLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuZGVwdGguZGF0YSkKLSAgICAgICAgZ2wtPnJhc3Rlcml6ZXIucHJvY3MuZGVwdGhCdWZmZXIoZ2wsICZkZXB0aCk7Ci0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotRUdMQm9vbGVhbiBlZ2xfcGl4bWFwX3N1cmZhY2VfdDo6YmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpCi17Ci0gICAgR0dMU3VyZmFjZSBidWZmZXI7Ci0gICAgYnVmZmVyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7Ci0gICAgYnVmZmVyLndpZHRoICAgPSBuYXRpdmVQaXhtYXAud2lkdGg7Ci0gICAgYnVmZmVyLmhlaWdodCAgPSBuYXRpdmVQaXhtYXAuaGVpZ2h0OwotICAgIGJ1ZmZlci5zdHJpZGUgID0gbmF0aXZlUGl4bWFwLnN0cmlkZTsKLSAgICBidWZmZXIuZGF0YSAgICA9IG5hdGl2ZVBpeG1hcC5kYXRhOwotICAgIGJ1ZmZlci5mb3JtYXQgID0gbmF0aXZlUGl4bWFwLmZvcm1hdDsKLSAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5yZWFkQnVmZmVyKGdsLCAmYnVmZmVyKTsKLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGVnbF9wYnVmZmVyX3N1cmZhY2VfdCA6IHB1YmxpYyBlZ2xfc3VyZmFjZV90Ci17Ci0gICAgZWdsX3BidWZmZXJfc3VyZmFjZV90KAotICAgICAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIGludDMyX3QgZGVwdGhGb3JtYXQsCi0gICAgICAgICAgICBpbnQzMl90IHcsIGludDMyX3QgaCwgaW50MzJfdCBmKTsKLQotICAgIHZpcnR1YWwgfmVnbF9wYnVmZmVyX3N1cmZhY2VfdCgpOwotCi0gICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaW5pdENoZWNrKCkgY29uc3QgICB7IHJldHVybiBwYnVmZmVyLmRhdGEgIT0gMDsgfQotICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKTsKLSAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kUmVhZFN1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCk7Ci0gICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0V2lkdGgoKSBjb25zdCAgICB7IHJldHVybiBwYnVmZmVyLndpZHRoOyAgfQotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldEhlaWdodCgpIGNvbnN0ICAgeyByZXR1cm4gcGJ1ZmZlci5oZWlnaHQ7IH0KLXByaXZhdGU6Ci0gICAgR0dMU3VyZmFjZSAgcGJ1ZmZlcjsKLX07Ci0KLWVnbF9wYnVmZmVyX3N1cmZhY2VfdDo6ZWdsX3BidWZmZXJfc3VyZmFjZV90KEVHTERpc3BsYXkgZHB5LAotICAgICAgICBFR0xDb25maWcgY29uZmlnLCBpbnQzMl90IGRlcHRoRm9ybWF0LAotICAgICAgICBpbnQzMl90IHcsIGludDMyX3QgaCwgaW50MzJfdCBmKQotICAgIDogZWdsX3N1cmZhY2VfdChkcHksIGNvbmZpZywgZGVwdGhGb3JtYXQpCi17Ci0gICAgc2l6ZV90IHNpemUgPSB3Kmg7Ci0gICAgc3dpdGNoIChmKSB7Ci0gICAgICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9BXzg6ICAgICAgICAgIHNpemUgKj0gMTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OiAgICAgIHNpemUgKj0gMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6ICAgIHNpemUgKj0gNDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODg6ICAgIHNpemUgKj0gNDsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiaW5jb21wYXRpYmxlIHBpeGVsIGZvcm1hdCBmb3IgcGJ1ZmZlciAoZm9ybWF0PSVkKSIsIGYpOwotICAgICAgICAgICAgcGJ1ZmZlci5kYXRhID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwYnVmZmVyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7Ci0gICAgcGJ1ZmZlci53aWR0aCAgID0gdzsKLSAgICBwYnVmZmVyLmhlaWdodCAgPSBoOwotICAgIHBidWZmZXIuc3RyaWRlICA9IHc7Ci0gICAgcGJ1ZmZlci5kYXRhICAgID0gKEdHTHVieXRlKiltYWxsb2Moc2l6ZSk7Ci0gICAgcGJ1ZmZlci5mb3JtYXQgID0gZjsKLQotICAgIGlmIChkZXB0aEZvcm1hdCkgewotICAgICAgICBkZXB0aC53aWR0aCAgID0gcGJ1ZmZlci53aWR0aDsKLSAgICAgICAgZGVwdGguaGVpZ2h0ICA9IHBidWZmZXIuaGVpZ2h0OwotICAgICAgICBkZXB0aC5zdHJpZGUgID0gZGVwdGgud2lkdGg7IC8vIHVzZSB0aGUgd2lkdGggaGVyZQotICAgICAgICBkZXB0aC5kYXRhICAgID0gKEdHTHVieXRlKiltYWxsb2MoZGVwdGguc3RyaWRlKmRlcHRoLmhlaWdodCoyKTsKLSAgICAgICAgaWYgKGRlcHRoLmRhdGEgPT0gMCkgewotICAgICAgICAgICAgc2V0RXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX05PX1NVUkZBQ0UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotZWdsX3BidWZmZXJfc3VyZmFjZV90Ojp+ZWdsX3BidWZmZXJfc3VyZmFjZV90KCkgewotICAgIGZyZWUocGJ1ZmZlci5kYXRhKTsKLX0KLUVHTEJvb2xlYW4gZWdsX3BidWZmZXJfc3VyZmFjZV90OjpiaW5kRHJhd1N1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCkKLXsKLSAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5jb2xvckJ1ZmZlcihnbCwgJnBidWZmZXIpOwotICAgIGlmIChkZXB0aC5kYXRhICE9IGdsLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuZGVwdGguZGF0YSkKLSAgICAgICAgZ2wtPnJhc3Rlcml6ZXIucHJvY3MuZGVwdGhCdWZmZXIoZ2wsICZkZXB0aCk7Ci0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotRUdMQm9vbGVhbiBlZ2xfcGJ1ZmZlcl9zdXJmYWNlX3Q6OmJpbmRSZWFkU3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKQotewotICAgIGdsLT5yYXN0ZXJpemVyLnByb2NzLnJlYWRCdWZmZXIoZ2wsICZwYnVmZmVyKTsKLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGNvbmZpZ19wYWlyX3QgewotICAgIEdMaW50IGtleTsKLSAgICBHTGludCB2YWx1ZTsKLX07Ci0KLXN0cnVjdCBjb25maWdzX3QgewotICAgIGNvbnN0IGNvbmZpZ19wYWlyX3QqIGFycmF5OwotICAgIGludCAgICAgICAgICAgICAgICAgIHNpemU7Ci19OwotCi1zdHJ1Y3QgY29uZmlnX21hbmFnZW1lbnRfdCB7Ci0gICAgR0xpbnQga2V5OwotICAgIGJvb2wgKCptYXRjaCkoR0xpbnQgcmVxVmFsdWUsIEdMaW50IGNvbmZWYWx1ZSk7Ci0gICAgc3RhdGljIGJvb2wgYXRMZWFzdChHTGludCByZXFWYWx1ZSwgR0xpbnQgY29uZlZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAocmVxVmFsdWUgPT0gRUdMX0RPTlRfQ0FSRSkgfHwgKGNvbmZWYWx1ZSA+PSByZXFWYWx1ZSk7Ci0gICAgfQotICAgIHN0YXRpYyBib29sIGV4YWN0KEdMaW50IHJlcVZhbHVlLCBHTGludCBjb25mVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIChyZXFWYWx1ZSA9PSBFR0xfRE9OVF9DQVJFKSB8fCAoY29uZlZhbHVlID09IHJlcVZhbHVlKTsKLSAgICB9Ci0gICAgc3RhdGljIGJvb2wgbWFzayhHTGludCByZXFWYWx1ZSwgR0xpbnQgY29uZlZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAoY29uZlZhbHVlICYgcmVxVmFsdWUpID09IHJlcVZhbHVlOwotICAgIH0KLSAgICBzdGF0aWMgYm9vbCBpZ25vcmUoR0xpbnQgcmVxVmFsdWUsIEdMaW50IGNvbmZWYWx1ZSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgVkVSU0lPTl9NQUpPUiAxCi0jZGVmaW5lIFZFUlNJT05fTUlOT1IgMgotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVuZG9yU3RyaW5nICAgICA9ICJHb29nbGUgSW5jLiI7Ci1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdWZXJzaW9uU3RyaW5nICAgID0gIjEuMiBBbmRyb2lkIERyaXZlciAxLjIuMCI7Ci1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdDbGllbnRBcGlTdHJpbmcgID0gIk9wZW5HTCBFUyI7Ci1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdFeHRlbnNpb25zU3RyaW5nID0KLSAgICAgICAgIkVHTF9LSFJfaW1hZ2VfYmFzZSAiCi0gICAgICAgIC8vICJLSFJfaW1hZ2VfcGl4bWFwICIKLSAgICAgICAgIkVHTF9BTkRST0lEX2ltYWdlX25hdGl2ZV9idWZmZXIgIgotICAgICAgICAiRUdMX0FORFJPSURfc3dhcF9yZWN0YW5nbGUgIgotICAgICAgICA7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGV4dGVudGlvbl9tYXBfdCB7Ci0gICAgY29uc3QgY2hhciAqIGNvbnN0IG5hbWU7Ci0gICAgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBhZGRyZXNzOwotfTsKLQotc3RhdGljIGNvbnN0IGV4dGVudGlvbl9tYXBfdCBnRXh0ZW50aW9uTWFwW10gPSB7Ci0gICAgeyAiZ2xEcmF3VGV4c09FUyIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xEcmF3VGV4c09FUyB9LAotICAgIHsgImdsRHJhd1RleGlPRVMiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmdsRHJhd1RleGlPRVMgfSwKLSAgICB7ICJnbERyYXdUZXhmT0VTIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbERyYXdUZXhmT0VTIH0sCi0gICAgeyAiZ2xEcmF3VGV4eE9FUyIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xEcmF3VGV4eE9FUyB9LAotICAgIHsgImdsRHJhd1RleHN2T0VTIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbERyYXdUZXhzdk9FUyB9LAotICAgIHsgImdsRHJhd1RleGl2T0VTIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbERyYXdUZXhpdk9FUyB9LAotICAgIHsgImdsRHJhd1RleGZ2T0VTIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbERyYXdUZXhmdk9FUyB9LAotICAgIHsgImdsRHJhd1RleHh2T0VTIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbERyYXdUZXh4dk9FUyB9LAotICAgIHsgImdsUXVlcnlNYXRyaXh4T0VTIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbFF1ZXJ5TWF0cml4eE9FUyB9LAotICAgIHsgImdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMgfSwKLSAgICB7ICJnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgfSwKLSAgICB7ICJnbENsaXBQbGFuZWYiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmdsQ2xpcFBsYW5lZiB9LAotICAgIHsgImdsQ2xpcFBsYW5leCIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xDbGlwUGxhbmV4IH0sCi0gICAgeyAiZ2xCaW5kQnVmZmVyIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbEJpbmRCdWZmZXIgfSwKLSAgICB7ICJnbEJ1ZmZlckRhdGEiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmdsQnVmZmVyRGF0YSB9LAotICAgIHsgImdsQnVmZmVyU3ViRGF0YSIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xCdWZmZXJTdWJEYXRhIH0sCi0gICAgeyAiZ2xEZWxldGVCdWZmZXJzIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbERlbGV0ZUJ1ZmZlcnMgfSwKLSAgICB7ICJnbEdlbkJ1ZmZlcnMiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmdsR2VuQnVmZmVycyB9LAotICAgIHsgImVnbENyZWF0ZUltYWdlS0hSIiwgIAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmVnbENyZWF0ZUltYWdlS0hSIH0sIAotICAgIHsgImVnbERlc3Ryb3lJbWFnZUtIUiIsIAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmVnbERlc3Ryb3lJbWFnZUtIUiB9LCAKLSAgICB7ICJlZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRCIsIAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmVnbFNldFN3YXBSZWN0YW5nbGVBTkRST0lEIH0sIAotfTsKLQotLyoKLSAqIEluIHRoZSBsaXN0cyBiZWxvdywgYXR0cmlidXRlcyBuYW1lcyBNVVNUIGJlIHNvcnRlZC4KLSAqIEFkZGl0aW9uYWxseSwgYWxsIGNvbmZpZ3MgbXVzdCBiZSBzb3J0ZWQgYWNjb3JkaW5nIHRvCi0gKiB0aGUgRUdMIHNwZWNpZmljYXRpb24uCi0gKi8KLQotc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnX2Jhc2VfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfU1RFTkNJTF9TSVpFLCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9DT05GSUdfQ0FWRUFULCAgICAgICAgICAgICAgRUdMX1NMT1dfQ09ORklHICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX0xFVkVMLCAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfSEVJR0hULCAgICAgICAgIEdHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMsCi0gICAgICAgICAgICAgICAgR0dMX01BWF9WSUVXUE9SVF9ESU1TKkdHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfV0lEVEgsICAgICAgICAgIEdHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9OQVRJVkVfUkVOREVSQUJMRSwgICAgICAgICAgRUdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfSUQsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFLCAgICAgICAgIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9TQU1QTEVTLCAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX1NBTVBMRV9CVUZGRVJTLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfVFlQRSwgICAgICAgICAgIEVHTF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFLCAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFLCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFLCAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSwgICAgICAgRUdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IsICAgICAgICBFR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfTUlOX1NXQVBfSU5URVJWQUwsICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9NQVhfU1dBUF9JTlRFUlZBTCwgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX0xVTUlOQU5DRV9TSVpFLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfTUFTS19TSVpFLCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9DT0xPUl9CVUZGRVJfVFlQRSwgICAgICAgICAgRUdMX1JHQl9CVUZGRVIgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX1JFTkRFUkFCTEVfVFlQRSwgICAgICAgICAgICBFR0xfT1BFTkdMX0VTX0JJVCAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfQ09ORk9STUFOVCwgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci19OwotCi0vLyBUaGVzZSBjb25maWdzIGNhbiBvdmVycmlkZSB0aGUgYmFzZSBhdHRyaWJ1dGUgbGlzdAotLy8gTk9URTogd2hlbiBhZGRpbmcgYSBjb25maWcgaGVyZSwgZG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSBlZ2xDcmVhdGUqU3VyZmFjZSgpCi0KLS8vIDU2NSBjb25maWdzCi1zdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfMF9hdHRyaWJ1dGVfbGlzdFtdID0gewotICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgIDE2IH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgNSB9LAotICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICA2IH0sCi0gICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDUgfSwKLSAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfSUQsIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKLX07Ci0KLXN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ18xX2F0dHJpYnV0ZV9saXN0W10gPSB7Ci0gICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMTYgfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA1IH0sCi0gICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDYgfSwKLSAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgNSB9LAotICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgIDE2IH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDEgfSwKLSAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1IH0sCi0gICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAotfTsKLQotLy8gUkdCIDg4OCBjb25maWdzCi1zdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfMl9hdHRyaWJ1dGVfbGlzdFtdID0gewotICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgIDMyIH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICA2IH0sCi0gICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfSUQsIEdHTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4IH0sCi0gICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAotfTsKLQotc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzNfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAzMiB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgMTYgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgNyB9LAotICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX0lELCBHR0xfUElYRUxfRk9STUFUX1JHQlhfODg4OCB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKLX07Ci0KLS8vIDg4ODggY29uZmlncwotc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzRfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAzMiB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgMiB9LAotICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX0lELCBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4OCB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKLX07Ci0KLXN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ181X2F0dHJpYnV0ZV9saXN0W10gPSB7Ci0gICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMzIgfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgIDE2IH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDMgfSwKLSAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODggfSwKLSAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCi19OwotCi0vLyBBOCBjb25maWdzCi1zdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfNl9hdHRyaWJ1dGVfbGlzdFtdID0gewotICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICA0IH0sCi0gICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfSUQsIEdHTF9QSVhFTF9GT1JNQVRfQV84IH0sCi0gICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAotfTsKLQotc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzdfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgOCB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgMTYgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgNSB9LAotICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX0lELCBHR0xfUElYRUxfRk9STUFUX0FfOCB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKLX07Ci0KLXN0YXRpYyBjb25maWdzX3QgY29uc3QgZ0NvbmZpZ3NbXSA9IHsKLSAgICAgICAgeyBjb25maWdfMF9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzBfYXR0cmlidXRlX2xpc3QpIH0sCi0gICAgICAgIHsgY29uZmlnXzFfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ18xX2F0dHJpYnV0ZV9saXN0KSB9LAotICAgICAgICB7IGNvbmZpZ18yX2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfMl9hdHRyaWJ1dGVfbGlzdCkgfSwKLSAgICAgICAgeyBjb25maWdfM19hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzNfYXR0cmlidXRlX2xpc3QpIH0sCi0gICAgICAgIHsgY29uZmlnXzRfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ180X2F0dHJpYnV0ZV9saXN0KSB9LAotICAgICAgICB7IGNvbmZpZ181X2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfNV9hdHRyaWJ1dGVfbGlzdCkgfSwKLSAgICAgICAgeyBjb25maWdfNl9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzZfYXR0cmlidXRlX2xpc3QpIH0sCi0gICAgICAgIHsgY29uZmlnXzdfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ183X2F0dHJpYnV0ZV9saXN0KSB9LAotfTsKLQotc3RhdGljIGNvbmZpZ19tYW5hZ2VtZW50X3QgY29uc3QgZ0NvbmZpZ01hbmFnZW1lbnRbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKLSAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKLSAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKLSAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKLSAgICAgICAgeyBFR0xfU1RFTkNJTF9TSVpFLCAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0NBVkVBVCwgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKLSAgICAgICAgeyBFR0xfTEVWRUwsICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKLSAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfSEVJR0hULCAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6Omlnbm9yZSAgIH0sCi0gICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX1BJWEVMUywgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjppZ25vcmUgICB9LAotICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9XSURUSCwgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6aWdub3JlICAgfSwKLSAgICAgICAgeyBFR0xfTkFUSVZFX1JFTkRFUkFCTEUsICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKLSAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6Omlnbm9yZSAgIH0sCi0gICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfVFlQRSwgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX1NBTVBMRVMsICAgICAgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX1NBTVBMRV9CVUZGRVJTLCAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjptYXNrICAgIH0sCi0gICAgICAgIHsgRUdMX1RSQU5TUEFSRU5UX1RZUEUsICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUsICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFLCAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSwgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBLCAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IsICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX01JTl9TV0FQX0lOVEVSVkFMLCAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX01BWF9TV0FQX0lOVEVSVkFMLCAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX0xVTUlOQU5DRV9TSVpFLCAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjphdExlYXN0IH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX01BU0tfU0laRSwgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjphdExlYXN0IH0sCi0gICAgICAgIHsgRUdMX0NPTE9SX0JVRkZFUl9UWVBFLCAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX1JFTkRFUkFCTEVfVFlQRSwgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjptYXNrICAgIH0sCi0gICAgICAgIHsgRUdMX0NPTkZPUk1BTlQsICAgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjptYXNrICAgIH0KLX07Ci0KLQotc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnX2RlZmF1bHRzW10gPSB7Ci0gICAgLy8gYXR0cmlidXRlcyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkIGFyZSBzaW1wbHkgaWdub3JlZCwgaWYgYSBwYXJ0aWN1bGFyCi0gICAgLy8gb25lIG5lZWRzIG5vdCBiZSBpZ25vcmVkLCBpdCBtdXN0IGJlIHNwZWNpZmllZCBoZXJlLCBlZzoKLSAgICAvLyB7IEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklUIH0sCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBzdGF0dXNfdCBnZXRDb25maWdGb3JtYXRJbmZvKEVHTGludCBjb25maWdJRCwKLSAgICAgICAgaW50MzJfdCYgcGl4ZWxGb3JtYXQsIGludDMyX3QmIGRlcHRoRm9ybWF0KQotewotICAgIHN3aXRjaChjb25maWdJRCkgewotICAgIGNhc2UgMDoKLSAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjU7Ci0gICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsKLSAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQlhfODg4ODsKLSAgICAgICAgZGVwdGhGb3JtYXQgPSAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODg7Ci0gICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7Ci0gICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OwotICAgICAgICBkZXB0aEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfWl8xNjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OwotICAgICAgICBkZXB0aEZvcm1hdCA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNzoKLSAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsKLSAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW50IGJpbmFyeVNlYXJjaChUIGNvbnN0IHNvcnRlZEFycmF5W10sIGludCBmaXJzdCwgaW50IGxhc3QsIEVHTGludCBrZXkpCi17Ci0gICB3aGlsZSAoZmlyc3QgPD0gbGFzdCkgewotICAgICAgIGludCBtaWQgPSAoZmlyc3QgKyBsYXN0KSAvIDI7Ci0gICAgICAgaWYgKGtleSA+IHNvcnRlZEFycmF5W21pZF0ua2V5KSB7Ci0gICAgICAgICAgIGZpcnN0ID0gbWlkICsgMTsKLSAgICAgICB9IGVsc2UgaWYgKGtleSA8IHNvcnRlZEFycmF5W21pZF0ua2V5KSB7Ci0gICAgICAgICAgIGxhc3QgPSBtaWQgLSAxOwotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIHJldHVybiBtaWQ7Ci0gICAgICAgfQotICAgfQotICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGlzQXR0cmlidXRlTWF0Y2hpbmcoaW50IGksIEVHTGludCBhdHRyLCBFR0xpbnQgdmFsKQotewotICAgIC8vIGxvb2sgZm9yIHRoZSBhdHRyaWJ1dGUgaW4gYWxsIG9mIG91ciBjb25maWdzCi0gICAgY29uZmlnX3BhaXJfdCBjb25zdCogY29uZmlnRm91bmQgPSBnQ29uZmlnc1tpXS5hcnJheTsKLSAgICBpbnQgaW5kZXggPSBiaW5hcnlTZWFyY2g8Y29uZmlnX3BhaXJfdD4oCi0gICAgICAgICAgICBnQ29uZmlnc1tpXS5hcnJheSwKLSAgICAgICAgICAgIDAsIGdDb25maWdzW2ldLnNpemUtMSwKLSAgICAgICAgICAgIGF0dHIpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgY29uZmlnRm91bmQgPSBjb25maWdfYmFzZV9hdHRyaWJ1dGVfbGlzdDsKLSAgICAgICAgaW5kZXggPSBiaW5hcnlTZWFyY2g8Y29uZmlnX3BhaXJfdD4oCi0gICAgICAgICAgICAgICAgY29uZmlnX2Jhc2VfYXR0cmlidXRlX2xpc3QsCi0gICAgICAgICAgICAgICAgMCwgTkVMRU0oY29uZmlnX2Jhc2VfYXR0cmlidXRlX2xpc3QpLTEsCi0gICAgICAgICAgICAgICAgYXR0cik7Ci0gICAgfQotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIC8vIGF0dHJpYnV0ZSBmb3VuZCwgY2hlY2sgaWYgdGhpcyBjb25maWcgY291bGQgbWF0Y2gKLSAgICAgICAgaW50IGNmZ01ndEluZGV4ID0gYmluYXJ5U2VhcmNoPGNvbmZpZ19tYW5hZ2VtZW50X3Q+KAotICAgICAgICAgICAgICAgIGdDb25maWdNYW5hZ2VtZW50LAotICAgICAgICAgICAgICAgIDAsIE5FTEVNKGdDb25maWdNYW5hZ2VtZW50KS0xLAotICAgICAgICAgICAgICAgIGF0dHIpOwotICAgICAgICBpZiAoY2ZnTWd0SW5kZXggPj0gMCkgewotICAgICAgICAgICAgYm9vbCBtYXRjaCA9IGdDb25maWdNYW5hZ2VtZW50W2NmZ01ndEluZGV4XS5tYXRjaCgKLSAgICAgICAgICAgICAgICAgICAgdmFsLCBjb25maWdGb3VuZFtpbmRleF0udmFsdWUpOwotICAgICAgICAgICAgaWYgKG1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBjb25maWcgbWF0Y2hlcwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYXR0cmlidXRlIG5vdCBmb3VuZC4gdGhpcyBzaG91bGQgTkVWRVIgaGFwcGVuLgotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZXJyb3IsIHRoaXMgYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3QKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWFrZUN1cnJlbnQob2dsZXNfY29udGV4dF90KiBnbCkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGN1cnJlbnQgPSAob2dsZXNfY29udGV4dF90KilnZXRHbFRocmVhZFNwZWNpZmljKCk7Ci0gICAgaWYgKGdsKSB7Ci0gICAgICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGdsKTsKLSAgICAgICAgaWYgKGMtPmZsYWdzICYgZWdsX2NvbnRleHRfdDo6SVNfQ1VSUkVOVCkgewotICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT0gZ2wpIHsKLSAgICAgICAgICAgICAgICAvLyBpdCBpcyBhbiBlcnJvciB0byBzZXQgYSBjb250ZXh0IGN1cnJlbnQsIGlmIGl0J3MgYWxyZWFkeQotICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgdG8gYW5vdGhlciB0aHJlYWQKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudCkgewotICAgICAgICAgICAgICAgIC8vIG1hcmsgdGhlIGN1cnJlbnQgY29udGV4dCBhcyBub3QgY3VycmVudCwgYW5kIGZsdXNoCi0gICAgICAgICAgICAgICAgZ2xGbHVzaCgpOwotICAgICAgICAgICAgICAgIGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoY3VycmVudCktPmZsYWdzICY9IH5lZ2xfY29udGV4dF90OjpJU19DVVJSRU5UOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghKGMtPmZsYWdzICYgZWdsX2NvbnRleHRfdDo6SVNfQ1VSUkVOVCkpIHsKLSAgICAgICAgICAgIC8vIFRoZSBjb250ZXh0IGlzIG5vdCBjdXJyZW50LCBtYWtlIGl0IGN1cnJlbnQhCi0gICAgICAgICAgICBzZXRHbFRocmVhZFNwZWNpZmljKGdsKTsKLSAgICAgICAgICAgIGMtPmZsYWdzIHw9IGVnbF9jb250ZXh0X3Q6OklTX0NVUlJFTlQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoY3VycmVudCkgewotICAgICAgICAgICAgLy8gbWFyayB0aGUgY3VycmVudCBjb250ZXh0IGFzIG5vdCBjdXJyZW50LCBhbmQgZmx1c2gKLSAgICAgICAgICAgIGdsRmx1c2goKTsKLSAgICAgICAgICAgIGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoY3VycmVudCktPmZsYWdzICY9IH5lZ2xfY29udGV4dF90OjpJU19DVVJSRU5UOwotICAgICAgICB9Ci0gICAgICAgIC8vIHRoaXMgdGhyZWFkIGhhcyBubyBjb250ZXh0IGF0dGFjaGVkIHRvIGl0Ci0gICAgICAgIHNldEdsVGhyZWFkU3BlY2lmaWMoMCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgRUdMQm9vbGVhbiBnZXRDb25maWdBdHRyaWIoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCi17Ci0gICAgc2l6ZV90IG51bUNvbmZpZ3MgPSAgTkVMRU0oZ0NvbmZpZ3MpOwotICAgIGludCBpbmRleCA9IChpbnQpY29uZmlnOwotICAgIGlmICh1aW50MzJfdChpbmRleCkgPj0gbnVtQ29uZmlncykKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09ORklHLCBFR0xfRkFMU0UpOwotCi0gICAgaW50IGF0dHJJbmRleDsKLSAgICBhdHRySW5kZXggPSBiaW5hcnlTZWFyY2g8Y29uZmlnX3BhaXJfdD4oCi0gICAgICAgICAgICBnQ29uZmlnc1tpbmRleF0uYXJyYXksCi0gICAgICAgICAgICAwLCBnQ29uZmlnc1tpbmRleF0uc2l6ZS0xLAotICAgICAgICAgICAgYXR0cmlidXRlKTsKLSAgICBpZiAoYXR0ckluZGV4Pj0wKSB7Ci0gICAgICAgICp2YWx1ZSA9IGdDb25maWdzW2luZGV4XS5hcnJheVthdHRySW5kZXhdLnZhbHVlOwotICAgICAgICByZXR1cm4gRUdMX1RSVUU7Ci0gICAgfQotCi0gICAgYXR0ckluZGV4ID0gYmluYXJ5U2VhcmNoPGNvbmZpZ19wYWlyX3Q+KAotICAgICAgICAgICAgY29uZmlnX2Jhc2VfYXR0cmlidXRlX2xpc3QsCi0gICAgICAgICAgICAwLCBORUxFTShjb25maWdfYmFzZV9hdHRyaWJ1dGVfbGlzdCktMSwKLSAgICAgICAgICAgIGF0dHJpYnV0ZSk7Ci0gICAgaWYgKGF0dHJJbmRleD49MCkgewotICAgICAgICAqdmFsdWUgPSBjb25maWdfYmFzZV9hdHRyaWJ1dGVfbGlzdFthdHRySW5kZXhdLnZhbHVlOwotICAgICAgICByZXR1cm4gRUdMX1RSVUU7Ci0gICAgfQotICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FUVFJJQlVURSwgRUdMX0ZBTFNFKTsKLX0KLQotc3RhdGljIEVHTFN1cmZhY2UgY3JlYXRlV2luZG93U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgTmF0aXZlV2luZG93VHlwZSB3aW5kb3csIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfTk9fU1VSRkFDRSk7Ci0gICAgaWYgKHdpbmRvdyA9PSAwKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwotCi0gICAgRUdMaW50IHN1cmZhY2VUeXBlOwotICAgIGlmIChnZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIEVHTF9TVVJGQUNFX1RZUEUsICZzdXJmYWNlVHlwZSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgaWYgKCEoc3VyZmFjZVR5cGUgJiBFR0xfV0lORE9XX0JJVCkpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7Ci0KLSAgICBpZiAoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KHdpbmRvdyktPmNvbW1vbi5tYWdpYyAhPQotICAgICAgICAgICAgQU5EUk9JRF9OQVRJVkVfV0lORE9XX01BR0lDKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX05BVElWRV9XSU5ET1csIEVHTF9OT19TVVJGQUNFKTsKLSAgICB9Ci0gICAgICAgIAotICAgIEVHTGludCBjb25maWdJRDsKLSAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmY29uZmlnSUQpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIGludDMyX3QgZGVwdGhGb3JtYXQ7Ci0gICAgaW50MzJfdCBwaXhlbEZvcm1hdDsKLSAgICBpZiAoZ2V0Q29uZmlnRm9ybWF0SW5mbyhjb25maWdJRCwgcGl4ZWxGb3JtYXQsIGRlcHRoRm9ybWF0KSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgcGl4ZWxGb3JtYXQgaGVyZSBqdXN0IHlldC4KLSAgICAvLyAoaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzdXJmYWNlIGlzIG5vdCBmdWxseSBpbml0aWFsaXplZCkKLSAgICAvLyBtYXliZSB0aGlzIHNob3VsZCBiZSBkb25lIGFmdGVyIHRoZSBwYWdlLWZsaXAKLSAgICAvL2lmIChFR0xpbnQoaW5mby5mb3JtYXQpICE9IHBpeGVsRm9ybWF0KQotICAgIC8vICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7Ci0KLSAgICBlZ2xfc3VyZmFjZV90KiBzdXJmYWNlOwotICAgIHN1cmZhY2UgPSBuZXcgZWdsX3dpbmRvd19zdXJmYWNlX3YyX3QoZHB5LCBjb25maWcsIGRlcHRoRm9ybWF0LAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KHdpbmRvdykpOwotCi0gICAgaWYgKCFzdXJmYWNlLT5pbml0Q2hlY2soKSkgewotICAgICAgICAvLyB0aGVyZSB3YXMgYSBwcm9ibGVtIGluIHRoZSBjdG9yLCB0aGUgZXJyb3IKLSAgICAgICAgLy8gZmxhZyBoYXMgYmVlbiBzZXQuCi0gICAgICAgIGRlbGV0ZSBzdXJmYWNlOwotICAgICAgICBzdXJmYWNlID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cmZhY2U7Ci19Ci0KLXN0YXRpYyBFR0xTdXJmYWNlIGNyZWF0ZVBpeG1hcFN1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgIE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX05PX1NVUkZBQ0UpOwotICAgIGlmIChwaXhtYXAgPT0gMCkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKLQotICAgIEVHTGludCBzdXJmYWNlVHlwZTsKLSAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfU1VSRkFDRV9UWVBFLCAmc3VyZmFjZVR5cGUpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIGlmICghKHN1cmZhY2VUeXBlICYgRUdMX1BJWE1BUF9CSVQpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwotCi0gICAgaWYgKHN0YXRpY19jYXN0PGVnbF9uYXRpdmVfcGl4bWFwX3QqPihwaXhtYXApLT52ZXJzaW9uICE9IAotICAgICAgICAgICAgc2l6ZW9mKGVnbF9uYXRpdmVfcGl4bWFwX3QpKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX05BVElWRV9QSVhNQVAsIEVHTF9OT19TVVJGQUNFKTsKLSAgICB9Ci0gICAgCi0gICAgRUdMaW50IGNvbmZpZ0lEOwotICAgIGlmIChnZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIEVHTF9DT05GSUdfSUQsICZjb25maWdJRCkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgaW50MzJfdCBkZXB0aEZvcm1hdDsKLSAgICBpbnQzMl90IHBpeGVsRm9ybWF0OwotICAgIGlmIChnZXRDb25maWdGb3JtYXRJbmZvKGNvbmZpZ0lELCBwaXhlbEZvcm1hdCwgZGVwdGhGb3JtYXQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7Ci0gICAgfQotCi0gICAgaWYgKHBpeG1hcC0+Zm9ybWF0ICE9IHBpeGVsRm9ybWF0KQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwotCi0gICAgZWdsX3N1cmZhY2VfdCogc3VyZmFjZSA9Ci0gICAgICAgIG5ldyBlZ2xfcGl4bWFwX3N1cmZhY2VfdChkcHksIGNvbmZpZywgZGVwdGhGb3JtYXQsCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZWdsX25hdGl2ZV9waXhtYXBfdCo+KHBpeG1hcCkpOwotCi0gICAgaWYgKCFzdXJmYWNlLT5pbml0Q2hlY2soKSkgewotICAgICAgICAvLyB0aGVyZSB3YXMgYSBwcm9ibGVtIGluIHRoZSBjdG9yLCB0aGUgZXJyb3IKLSAgICAgICAgLy8gZmxhZyBoYXMgYmVlbiBzZXQuCi0gICAgICAgIGRlbGV0ZSBzdXJmYWNlOwotICAgICAgICBzdXJmYWNlID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cmZhY2U7Ci19Ci0KLXN0YXRpYyBFR0xTdXJmYWNlIGNyZWF0ZVBidWZmZXJTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotICAgICAgICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX05PX1NVUkZBQ0UpOwotCi0gICAgRUdMaW50IHN1cmZhY2VUeXBlOwotICAgIGlmIChnZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIEVHTF9TVVJGQUNFX1RZUEUsICZzdXJmYWNlVHlwZSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgaWYgKCEoc3VyZmFjZVR5cGUgJiBFR0xfUEJVRkZFUl9CSVQpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwotCi0gICAgRUdMaW50IGNvbmZpZ0lEOwotICAgIGlmIChnZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIEVHTF9DT05GSUdfSUQsICZjb25maWdJRCkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgaW50MzJfdCBkZXB0aEZvcm1hdDsKLSAgICBpbnQzMl90IHBpeGVsRm9ybWF0OwotICAgIGlmIChnZXRDb25maWdGb3JtYXRJbmZvKGNvbmZpZ0lELCBwaXhlbEZvcm1hdCwgZGVwdGhGb3JtYXQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7Ci0gICAgfQotCi0gICAgaW50MzJfdCB3ID0gMDsKLSAgICBpbnQzMl90IGggPSAwOwotICAgIHdoaWxlIChhdHRyaWJfbGlzdFswXSkgewotICAgICAgICBpZiAoYXR0cmliX2xpc3RbMF0gPT0gRUdMX1dJRFRIKSAgdyA9IGF0dHJpYl9saXN0WzFdOwotICAgICAgICBpZiAoYXR0cmliX2xpc3RbMF0gPT0gRUdMX0hFSUdIVCkgaCA9IGF0dHJpYl9saXN0WzFdOwotICAgICAgICBhdHRyaWJfbGlzdCs9MjsKLSAgICB9Ci0KLSAgICBlZ2xfc3VyZmFjZV90KiBzdXJmYWNlID0KLSAgICAgICAgbmV3IGVnbF9wYnVmZmVyX3N1cmZhY2VfdChkcHksIGNvbmZpZywgZGVwdGhGb3JtYXQsIHcsIGgsIHBpeGVsRm9ybWF0KTsKLQotICAgIGlmICghc3VyZmFjZS0+aW5pdENoZWNrKCkpIHsKLSAgICAgICAgLy8gdGhlcmUgd2FzIGEgcHJvYmxlbSBpbiB0aGUgY3RvciwgdGhlIGVycm9yCi0gICAgICAgIC8vIGZsYWcgaGFzIGJlZW4gc2V0LgotICAgICAgICBkZWxldGUgc3VyZmFjZTsKLSAgICAgICAgc3VyZmFjZSA9IDA7Ci0gICAgfQotICAgIHJldHVybiBzdXJmYWNlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW5pdGlhbGl6YXRpb24KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMRGlzcGxheSBlZ2xHZXREaXNwbGF5KE5hdGl2ZURpc3BsYXlUeXBlIGRpc3BsYXkpCi17Ci0jaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwotICAgIC8vIHRoaXMganVzdCBuZWVkcyB0byBiZSBkb25lIG9uY2UKLSAgICBpZiAoZ0dMS2V5ID09IC0xKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0luaXRNdXRleCk7Ci0gICAgICAgIGlmIChnR0xLZXkgPT0gLTEpCi0gICAgICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmdHTEtleSwgTlVMTCk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnSW5pdE11dGV4KTsKLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAoZGlzcGxheSA9PSBFR0xfREVGQVVMVF9ESVNQTEFZKSB7Ci0gICAgICAgIEVHTERpc3BsYXkgZHB5ID0gKEVHTERpc3BsYXkpMTsKLSAgICAgICAgZWdsX2Rpc3BsYXlfdCYgZCA9IGVnbF9kaXNwbGF5X3Q6OmdldF9kaXNwbGF5KGRweSk7Ci0gICAgICAgIGQudHlwZSA9IGRpc3BsYXk7Ci0gICAgICAgIHJldHVybiBkcHk7Ci0gICAgfQotICAgIHJldHVybiBFR0xfTk9fRElTUExBWTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xJbml0aWFsaXplKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLQotICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX1RSVUU7Ci0gICAgZWdsX2Rpc3BsYXlfdCYgZCA9IGVnbF9kaXNwbGF5X3Q6OmdldF9kaXNwbGF5KGRweSk7Ci0KLSAgICBpZiAoYW5kcm9pZF9hdG9taWNfaW5jKCZkLmluaXRpYWxpemVkKSA9PSAwKSB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgc3R1ZmYgaGVyZSBpZiBuZWVkZWQKLSAgICAgICAgLy9wdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOwotICAgICAgICAvL3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnSW5pdE11dGV4KTsKLSAgICB9Ci0KLSAgICBpZiAocmVzID09IEVHTF9UUlVFKSB7Ci0gICAgICAgIGlmIChtYWpvciAhPSBOVUxMKSAqbWFqb3IgPSBWRVJTSU9OX01BSk9SOwotICAgICAgICBpZiAobWlub3IgIT0gTlVMTCkgKm1pbm9yID0gVkVSU0lPTl9NSU5PUjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotRUdMQm9vbGVhbiBlZ2xUZXJtaW5hdGUoRUdMRGlzcGxheSBkcHkpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotCi0gICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfVFJVRTsKLSAgICBlZ2xfZGlzcGxheV90JiBkID0gZWdsX2Rpc3BsYXlfdDo6Z2V0X2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoYW5kcm9pZF9hdG9taWNfZGVjKCZkLmluaXRpYWxpemVkKSA9PSAxKSB7Ci0gICAgICAgIC8vIFRPRE86IGRlc3Ryb3kgYWxsIHJlc291cmNlcyAoc3VyZmFjZXMsIGNvbnRleHRzLCBldGMuLi4pCi0gICAgICAgIC8vcHRocmVhZF9tdXRleF9sb2NrKCZnSW5pdE11dGV4KTsKLSAgICAgICAgLy9wdGhyZWFkX211dGV4X3VubG9jaygmZ0luaXRNdXRleCk7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbmZpZ3VyYXRpb24KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMQm9vbGVhbiBlZ2xHZXRDb25maWdzKCAgIEVHTERpc3BsYXkgZHB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyAqY29uZmlncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgY29uZmlnX3NpemUsIEVHTGludCAqbnVtX2NvbmZpZykKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0KLSAgICBHTGludCBudW1Db25maWdzID0gTkVMRU0oZ0NvbmZpZ3MpOwotICAgIGlmICghY29uZmlncykgewotICAgICAgICAqbnVtX2NvbmZpZyA9IG51bUNvbmZpZ3M7Ci0gICAgICAgIHJldHVybiBFR0xfVFJVRTsKLSAgICB9Ci0gICAgR0xpbnQgaTsKLSAgICBmb3IgKGk9MCA7IGk8bnVtQ29uZmlncyAmJiBpPGNvbmZpZ19zaXplIDsgaSsrKSB7Ci0gICAgICAgICpjb25maWdzKysgPSAoRUdMQ29uZmlnKWk7Ci0gICAgfQotICAgICpudW1fY29uZmlnID0gaTsKLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsQ2hvb3NlQ29uZmlnKCBFR0xEaXNwbGF5IGRweSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgKm51bV9jb25maWcpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgIAotICAgIGlmIChnZ2xfdW5saWtlbHkobnVtX2NvbmZpZz09MCkpIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOwotICAgIH0KLQotICAgIGlmIChnZ2xfdW5saWtlbHkoYXR0cmliX2xpc3Q9PTApKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEEgTlVMTCBhdHRyaWJfbGlzdCBzaG91bGQgYmUgdHJlYXRlZCBhcyB0aG91Z2ggaXQgd2FzIGFuIGVtcHR5Ci0gICAgICAgICAqIG9uZSAodGVybWluYXRlZCB3aXRoIEVHTF9OT05FKSBhcyBkZWZpbmVkIGluCi0gICAgICAgICAqIHNlY3Rpb24gMy40LjEgIlF1ZXJ5aW5nIENvbmZpZ3VyYXRpb25zIiBpbiB0aGUgRUdMIHNwZWNpZmljYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgY29uc3QgRUdMaW50IGR1bW15ID0gRUdMX05PTkU7Ci0gICAgICAgIGF0dHJpYl9saXN0ID0gJmR1bW15OwotICAgIH0KLQotICAgIGludCBudW1BdHRyaWJ1dGVzID0gMDsKLSAgICBpbnQgbnVtQ29uZmlncyA9ICBORUxFTShnQ29uZmlncyk7Ci0gICAgdWludDMyX3QgcG9zc2libGVNYXRjaCA9ICgxPDxudW1Db25maWdzKS0xOwotICAgIHdoaWxlKHBvc3NpYmxlTWF0Y2ggJiYgKmF0dHJpYl9saXN0ICE9IEVHTF9OT05FKSB7Ci0gICAgICAgIG51bUF0dHJpYnV0ZXMrKzsKLSAgICAgICAgRUdMaW50IGF0dHIgPSAqYXR0cmliX2xpc3QrKzsKLSAgICAgICAgRUdMaW50IHZhbCAgPSAqYXR0cmliX2xpc3QrKzsKLSAgICAgICAgZm9yIChpbnQgaT0wIDsgcG9zc2libGVNYXRjaCAmJiBpPG51bUNvbmZpZ3MgOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghKHBvc3NpYmxlTWF0Y2ggJiAoMTw8aSkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGlzQXR0cmlidXRlTWF0Y2hpbmcoaSwgYXR0ciwgdmFsKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcG9zc2libGVNYXRjaCAmPSB+KDE8PGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gbm93LCBoYW5kbGUgdGhlIGF0dHJpYnV0ZXMgd2hpY2ggaGF2ZSBhIHVzZWZ1bCBkZWZhdWx0IHZhbHVlCi0gICAgZm9yIChzaXplX3Qgaj0wIDsgcG9zc2libGVNYXRjaCAmJiBqPE5FTEVNKGNvbmZpZ19kZWZhdWx0cykgOyBqKyspIHsKLSAgICAgICAgLy8gc2VlIGlmIHRoaXMgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQsIGlmIG5vdCwgYXBwbHkgaXRzCi0gICAgICAgIC8vIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgaWYgKGJpbmFyeVNlYXJjaDxjb25maWdfcGFpcl90PigKLSAgICAgICAgICAgICAgICAoY29uZmlnX3BhaXJfdCBjb25zdCopYXR0cmliX2xpc3QsCi0gICAgICAgICAgICAgICAgMCwgbnVtQXR0cmlidXRlcy0xLAotICAgICAgICAgICAgICAgIGNvbmZpZ19kZWZhdWx0c1tqXS5rZXkpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaT0wIDsgcG9zc2libGVNYXRjaCAmJiBpPG51bUNvbmZpZ3MgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIShwb3NzaWJsZU1hdGNoICYgKDE8PGkpKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQXR0cmlidXRlTWF0Y2hpbmcoaSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19kZWZhdWx0c1tqXS5rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfZGVmYXVsdHNbal0udmFsdWUpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZU1hdGNoICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gcmV0dXJuIHRoZSBjb25maWd1cmF0aW9ucyBmb3VuZAotICAgIGludCBuPTA7Ci0gICAgaWYgKHBvc3NpYmxlTWF0Y2gpIHsKLSAgICAgICAgaWYgKGNvbmZpZ3MpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MCA7IGNvbmZpZ19zaXplICYmIGk8bnVtQ29uZmlncyA7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwb3NzaWJsZU1hdGNoICYgKDE8PGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICpjb25maWdzKysgPSAoRUdMQ29uZmlnKWk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ19zaXplLS07Ci0gICAgICAgICAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTAgOyBpPG51bUNvbmZpZ3MgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zc2libGVNYXRjaCAmICgxPDxpKSkgewotICAgICAgICAgICAgICAgICAgICBuKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICpudW1fY29uZmlnID0gbjsKLSAgICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi1FR0xCb29sZWFuIGVnbEdldENvbmZpZ0F0dHJpYihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0KLSAgICByZXR1cm4gZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBhdHRyaWJ1dGUsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gc3VyZmFjZXMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMU3VyZmFjZSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKCAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgcmV0dXJuIGNyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsIHdpbmRvdywgYXR0cmliX2xpc3QpOwotfQotCi1FR0xTdXJmYWNlIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UoICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKLXsKLSAgICByZXR1cm4gY3JlYXRlUGl4bWFwU3VyZmFjZShkcHksIGNvbmZpZywgcGl4bWFwLCBhdHRyaWJfbGlzdCk7Ci19Ci0KLUVHTFN1cmZhY2UgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKLXsKLSAgICByZXR1cm4gY3JlYXRlUGJ1ZmZlclN1cmZhY2UoZHB5LCBjb25maWcsIGF0dHJpYl9saXN0KTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xEZXN0cm95U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBlZ2xTdXJmYWNlKQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLSAgICBpZiAoZWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICBlZ2xfc3VyZmFjZV90KiBzdXJmYWNlKCBzdGF0aWNfY2FzdDxlZ2xfc3VyZmFjZV90Kj4oZWdsU3VyZmFjZSkgKTsKLSAgICAgICAgaWYgKCFzdXJmYWNlLT5pc1ZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotICAgICAgICBpZiAoc3VyZmFjZS0+ZHB5ICE9IGRweSkKLSAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0gICAgICAgIGlmIChzdXJmYWNlLT5jdHgpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIHN1cmZhY2UgaXMgY3VycmVudCBjaGVjayB3aGF0IHRoZSBzcGVjIHNheXMKLSAgICAgICAgICAgIHN1cmZhY2UtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIHN1cmZhY2UtPmN0eCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIHN1cmZhY2U7Ci0gICAgfQotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xRdWVyeVN1cmZhY2UoIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGVnbFN1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0gICAgZWdsX3N1cmZhY2VfdCogc3VyZmFjZSA9IHN0YXRpY19jYXN0PGVnbF9zdXJmYWNlX3QqPihlZ2xTdXJmYWNlKTsKLSAgICBpZiAoIXN1cmZhY2UtPmlzVmFsaWQoKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLSAgICBpZiAoc3VyZmFjZS0+ZHB5ICE9IGRweSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLQotICAgIEVHTEJvb2xlYW4gcmV0ID0gRUdMX1RSVUU7Ci0gICAgc3dpdGNoIChhdHRyaWJ1dGUpIHsKLSAgICAgICAgY2FzZSBFR0xfQ09ORklHX0lEOgotICAgICAgICAgICAgcmV0ID0gZ2V0Q29uZmlnQXR0cmliKGRweSwgc3VyZmFjZS0+Y29uZmlnLCBFR0xfQ09ORklHX0lELCB2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFR0xfV0lEVEg6Ci0gICAgICAgICAgICAqdmFsdWUgPSBzdXJmYWNlLT5nZXRXaWR0aCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUdMX0hFSUdIVDoKLSAgICAgICAgICAgICp2YWx1ZSA9IHN1cmZhY2UtPmdldEhlaWdodCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUdMX0xBUkdFU1RfUEJVRkZFUjoKLSAgICAgICAgICAgIC8vIG5vdCBtb2RpZmllZCBmb3IgYSB3aW5kb3cgb3IgcGl4bWFwIHN1cmZhY2UKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVHTF9URVhUVVJFX0ZPUk1BVDoKLSAgICAgICAgICAgICp2YWx1ZSA9IEVHTF9OT19URVhUVVJFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUdMX1RFWFRVUkVfVEFSR0VUOgotICAgICAgICAgICAgKnZhbHVlID0gRUdMX05PX1RFWFRVUkU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFR0xfTUlQTUFQX1RFWFRVUkU6Ci0gICAgICAgICAgICAqdmFsdWUgPSBFR0xfRkFMU0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFR0xfTUlQTUFQX0xFVkVMOgotICAgICAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVHTF9SRU5ERVJfQlVGRkVSOgotICAgICAgICAgICAgLy8gVE9ETzogcmV0dXJuIHRoZSByZWFsIFJFTkRFUl9CVUZGRVIgaGVyZQotICAgICAgICAgICAgKnZhbHVlID0gRUdMX0JBQ0tfQlVGRkVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUdMX0hPUklaT05UQUxfUkVTT0xVVElPTjoKLSAgICAgICAgICAgIC8vIHBpeGVsL21tICogRUdMX0RJU1BMQVlfU0NBTElORwotICAgICAgICAgICAgKnZhbHVlID0gc3VyZmFjZS0+Z2V0SG9yaXpvbnRhbFJlc29sdXRpb24oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVHTF9WRVJUSUNBTF9SRVNPTFVUSU9OOgotICAgICAgICAgICAgLy8gcGl4ZWwvbW0gKiBFR0xfRElTUExBWV9TQ0FMSU5HCi0gICAgICAgICAgICAqdmFsdWUgPSBzdXJmYWNlLT5nZXRWZXJ0aWNhbFJlc29sdXRpb24oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVHTF9QSVhFTF9BU1BFQ1RfUkFUSU86IHsKLSAgICAgICAgICAgIC8vIHcvaCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcKLSAgICAgICAgICAgIGludCB3ciA9IHN1cmZhY2UtPmdldEhvcml6b250YWxSZXNvbHV0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgaHIgPSBzdXJmYWNlLT5nZXRWZXJ0aWNhbFJlc29sdXRpb24oKTsKLSAgICAgICAgICAgICp2YWx1ZSA9ICh3ciAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpIC8gaHI7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgRUdMX1NXQVBfQkVIQVZJT1I6Ci0gICAgICAgICAgICAqdmFsdWUgPSBzdXJmYWNlLT5nZXRTd2FwQmVoYXZpb3IoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0ID0gc2V0RXJyb3IoRUdMX0JBRF9BVFRSSUJVVEUsIEVHTF9GQUxTRSk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLUVHTENvbnRleHQgZWdsQ3JlYXRlQ29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb250ZXh0IHNoYXJlX2xpc3QsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfTk9fU1VSRkFDRSk7Ci0KLSAgICBvZ2xlc19jb250ZXh0X3QqIGdsID0gb2dsZXNfaW5pdChzaXplb2YoZWdsX2NvbnRleHRfdCkpOwotICAgIGlmICghZ2wpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfTk9fQ09OVEVYVCk7Ci0KLSAgICBlZ2xfY29udGV4dF90KiBjID0gc3RhdGljX2Nhc3Q8ZWdsX2NvbnRleHRfdCo+KGdsLT5yYXN0ZXJpemVyLmJhc2UpOwotICAgIGMtPmZsYWdzID0gZWdsX2NvbnRleHRfdDo6TkVWRVJfQ1VSUkVOVDsKLSAgICBjLT5kcHkgPSBkcHk7Ci0gICAgYy0+Y29uZmlnID0gY29uZmlnOwotICAgIGMtPnJlYWQgPSAwOwotICAgIGMtPmRyYXcgPSAwOwotICAgIHJldHVybiAoRUdMQ29udGV4dClnbDsKLX0KLQotRUdMQm9vbGVhbiBlZ2xEZXN0cm95Q29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN0eCk7Ci0gICAgaWYgKGMtPmZsYWdzICYgZWdsX2NvbnRleHRfdDo6SVNfQ1VSUkVOVCkKLSAgICAgICAgc2V0R2xUaHJlYWRTcGVjaWZpYygwKTsKLSAgICBvZ2xlc191bmluaXQoKG9nbGVzX2NvbnRleHRfdCopY3R4KTsKLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsTWFrZUN1cnJlbnQoICBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgIGlmIChkcmF3KSB7Ci0gICAgICAgIGVnbF9zdXJmYWNlX3QqIHMgPSAoZWdsX3N1cmZhY2VfdCopZHJhdzsKLSAgICAgICAgaWYgKCFzLT5pc1ZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotICAgICAgICBpZiAocy0+ZHB5ICE9IGRweSkKLSAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0gICAgICAgIC8vIFRPRE86IGNoZWNrIHRoYXQgZHJhdyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGNvbnRleHQKLSAgICB9Ci0gICAgaWYgKHJlYWQgJiYgcmVhZCE9ZHJhdykgewotICAgICAgICBlZ2xfc3VyZmFjZV90KiBzID0gKGVnbF9zdXJmYWNlX3QqKXJlYWQ7Ci0gICAgICAgIGlmICghcy0+aXNWYWxpZCgpKQotICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLSAgICAgICAgaWYgKHMtPmRweSAhPSBkcHkpCi0gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IHJlYWQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBjb250ZXh0Ci0gICAgfQotCi0gICAgRUdMQ29udGV4dCBjdXJyZW50X2N0eCA9IEVHTF9OT19DT05URVhUOwotCi0gICAgaWYgKChyZWFkID09IEVHTF9OT19TVVJGQUNFICYmIGRyYXcgPT0gRUdMX05PX1NVUkZBQ0UpICYmIChjdHggIT0gRUdMX05PX0NPTlRFWFQpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX0ZBTFNFKTsKLQotICAgIGlmICgocmVhZCAhPSBFR0xfTk9fU1VSRkFDRSB8fCBkcmF3ICE9IEVHTF9OT19TVVJGQUNFKSAmJiAoY3R4ID09IEVHTF9OT19DT05URVhUKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9GQUxTRSk7Ci0KLSAgICBpZiAoY3R4ID09IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIC8vIGlmIHdlJ3JlIGRldGFjaGluZywgd2UgbmVlZCB0aGUgY3VycmVudCBjb250ZXh0Ci0gICAgICAgIGN1cnJlbnRfY3R4ID0gKEVHTENvbnRleHQpZ2V0R2xUaHJlYWRTcGVjaWZpYygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN0eCk7Ci0gICAgICAgIGVnbF9zdXJmYWNlX3QqIGQgPSAoZWdsX3N1cmZhY2VfdCopZHJhdzsKLSAgICAgICAgZWdsX3N1cmZhY2VfdCogciA9IChlZ2xfc3VyZmFjZV90KilyZWFkOwotICAgICAgICBpZiAoKGQgJiYgZC0+Y3R4ICYmIGQtPmN0eCAhPSBjdHgpIHx8Ci0gICAgICAgICAgICAociAmJiByLT5jdHggJiYgci0+Y3R4ICE9IGN0eCkpIHsKLSAgICAgICAgICAgIC8vIG9uZSBvZiB0aGUgc3VyZmFjZSBpcyBib3VuZCB0byBhIGNvbnRleHQgaW4gYW5vdGhlciB0aHJlYWQKLSAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FDQ0VTUywgRUdMX0ZBTFNFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG9nbGVzX2NvbnRleHRfdCogZ2wgPSAob2dsZXNfY29udGV4dF90KiljdHg7Ci0gICAgaWYgKG1ha2VDdXJyZW50KGdsKSA9PSAwKSB7Ci0gICAgICAgIGlmIChjdHgpIHsKLSAgICAgICAgICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN0eCk7Ci0gICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiBkID0gKGVnbF9zdXJmYWNlX3QqKWRyYXc7Ci0gICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiByID0gKGVnbF9zdXJmYWNlX3QqKXJlYWQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjLT5kcmF3KSB7Ci0gICAgICAgICAgICAgICAgZWdsX3N1cmZhY2VfdCogcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZWdsX3N1cmZhY2VfdCo+KGMtPmRyYXcpOwotICAgICAgICAgICAgICAgIHMtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjLT5yZWFkKSB7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IHVubG9jay9kaXNjb25uZWN0IHRoZSByZWFkIHN1cmZhY2UgdG9vIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBjLT5kcmF3ID0gZHJhdzsKLSAgICAgICAgICAgIGMtPnJlYWQgPSByZWFkOwotCi0gICAgICAgICAgICBpZiAoYy0+ZmxhZ3MgJiBlZ2xfY29udGV4dF90OjpORVZFUl9DVVJSRU5UKSB7Ci0gICAgICAgICAgICAgICAgYy0+ZmxhZ3MgJj0gfmVnbF9jb250ZXh0X3Q6Ok5FVkVSX0NVUlJFTlQ7Ci0gICAgICAgICAgICAgICAgR0xpbnQgdyA9IDA7Ci0gICAgICAgICAgICAgICAgR0xpbnQgaCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGRyYXcpIHsKLSAgICAgICAgICAgICAgICAgICAgdyA9IGQtPmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGggPSBkLT5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2dsZXNfc3VyZmFjZXBvcnQoZ2wsIDAsIDApOwotICAgICAgICAgICAgICAgIG9nbGVzX3ZpZXdwb3J0KGdsLCAwLCAwLCB3LCBoKTsKLSAgICAgICAgICAgICAgICBvZ2xlc19zY2lzc29yKGdsLCAwLCAwLCB3LCBoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGQtPmNvbm5lY3QoKSA9PSBFR0xfRkFMU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZC0+Y3R4ID0gY3R4OwotICAgICAgICAgICAgICAgIGQtPmJpbmREcmF3U3VyZmFjZShnbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocikgewotICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBsb2NrL2Nvbm5lY3QgdGhlIHJlYWQgc3VyZmFjZSB0b28gCi0gICAgICAgICAgICAgICAgci0+Y3R4ID0gY3R4OwotICAgICAgICAgICAgICAgIHItPmJpbmRSZWFkU3VyZmFjZShnbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpZiBzdXJmYWNlcyB3ZXJlIGJvdW5kIHRvIHRoZSBjb250ZXh0IGJvdW5kIHRvIHRoaXMgdGhyZWFkCi0gICAgICAgICAgICAvLyBtYXJrIHRoZW4gYXMgdW5ib3VuZC4KLSAgICAgICAgICAgIGlmIChjdXJyZW50X2N0eCkgewotICAgICAgICAgICAgICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN1cnJlbnRfY3R4KTsKLSAgICAgICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiBkID0gKGVnbF9zdXJmYWNlX3QqKWMtPmRyYXc7Ci0gICAgICAgICAgICAgICAgZWdsX3N1cmZhY2VfdCogciA9IChlZ2xfc3VyZmFjZV90KiljLT5yZWFkOwotICAgICAgICAgICAgICAgIGlmIChkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMtPmRyYXcgPSAwOwotICAgICAgICAgICAgICAgICAgICBkLT5jdHggPSBFR0xfTk9fQ09OVEVYVDsKLSAgICAgICAgICAgICAgICAgICAgZC0+ZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocikgewotICAgICAgICAgICAgICAgICAgICBjLT5yZWFkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgci0+Y3R4ID0gRUdMX05PX0NPTlRFWFQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB1bmxvY2svZGlzY29ubmVjdCB0aGUgcmVhZCBzdXJmYWNlIHRvbyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEVHTF9UUlVFOwotICAgIH0KLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9BQ0NFU1MsIEVHTF9GQUxTRSk7Ci19Ci0KLUVHTENvbnRleHQgZWdsR2V0Q3VycmVudENvbnRleHQodm9pZCkKLXsKLSAgICAvLyBlZ2xHZXRDdXJyZW50Q29udGV4dCByZXR1cm5zIHRoZSBjdXJyZW50IEVHTCByZW5kZXJpbmcgY29udGV4dCwKLSAgICAvLyBhcyBzcGVjaWZpZWQgYnkgZWdsTWFrZUN1cnJlbnQuIElmIG5vIGNvbnRleHQgaXMgY3VycmVudCwKLSAgICAvLyBFR0xfTk9fQ09OVEVYVCBpcyByZXR1cm5lZC4KLSAgICByZXR1cm4gKEVHTENvbnRleHQpZ2V0R2xUaHJlYWRTcGVjaWZpYygpOwotfQotCi1FR0xTdXJmYWNlIGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTGludCByZWFkZHJhdykKLXsKLSAgICAvLyBlZ2xHZXRDdXJyZW50U3VyZmFjZSByZXR1cm5zIHRoZSByZWFkIG9yIGRyYXcgc3VyZmFjZSBhdHRhY2hlZAotICAgIC8vIHRvIHRoZSBjdXJyZW50IEVHTCByZW5kZXJpbmcgY29udGV4dCwgYXMgc3BlY2lmaWVkIGJ5IGVnbE1ha2VDdXJyZW50LgotICAgIC8vIElmIG5vIGNvbnRleHQgaXMgY3VycmVudCwgRUdMX05PX1NVUkZBQ0UgaXMgcmV0dXJuZWQuCi0gICAgRUdMQ29udGV4dCBjdHggPSAoRUdMQ29udGV4dClnZXRHbFRocmVhZFNwZWNpZmljKCk7Ci0gICAgaWYgKGN0eCA9PSBFR0xfTk9fQ09OVEVYVCkgcmV0dXJuIEVHTF9OT19TVVJGQUNFOwotICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN0eCk7Ci0gICAgaWYgKHJlYWRkcmF3ID09IEVHTF9SRUFEKSB7Ci0gICAgICAgIHJldHVybiBjLT5yZWFkOwotICAgIH0gZWxzZSBpZiAocmVhZGRyYXcgPT0gRUdMX0RSQVcpIHsKLSAgICAgICAgcmV0dXJuIGMtPmRyYXc7Ci0gICAgfQotICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FUVFJJQlVURSwgRUdMX05PX1NVUkZBQ0UpOwotfQotCi1FR0xEaXNwbGF5IGVnbEdldEN1cnJlbnREaXNwbGF5KHZvaWQpCi17Ci0gICAgLy8gZWdsR2V0Q3VycmVudERpc3BsYXkgcmV0dXJucyB0aGUgY3VycmVudCBFR0wgZGlzcGxheSBjb25uZWN0aW9uCi0gICAgLy8gZm9yIHRoZSBjdXJyZW50IEVHTCByZW5kZXJpbmcgY29udGV4dCwgYXMgc3BlY2lmaWVkIGJ5IGVnbE1ha2VDdXJyZW50LgotICAgIC8vIElmIG5vIGNvbnRleHQgaXMgY3VycmVudCwgRUdMX05PX0RJU1BMQVkgaXMgcmV0dXJuZWQuCi0gICAgRUdMQ29udGV4dCBjdHggPSAoRUdMQ29udGV4dClnZXRHbFRocmVhZFNwZWNpZmljKCk7Ci0gICAgaWYgKGN0eCA9PSBFR0xfTk9fQ09OVEVYVCkgcmV0dXJuIEVHTF9OT19ESVNQTEFZOwotICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN0eCk7Ci0gICAgcmV0dXJuIGMtPmRweTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xRdWVyeUNvbnRleHQoIEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLSAgICBlZ2xfY29udGV4dF90KiBjID0gZWdsX2NvbnRleHRfdDo6Y29udGV4dChjdHgpOwotICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7Ci0gICAgICAgIGNhc2UgRUdMX0NPTkZJR19JRDoKLSAgICAgICAgICAgIC8vIFJldHVybnMgdGhlIElEIG9mIHRoZSBFR0wgZnJhbWUgYnVmZmVyIGNvbmZpZ3VyYXRpb24gd2l0aAotICAgICAgICAgICAgLy8gcmVzcGVjdCB0byB3aGljaCB0aGUgY29udGV4dCB3YXMgY3JlYXRlZAotICAgICAgICAgICAgcmV0dXJuIGdldENvbmZpZ0F0dHJpYihkcHksIGMtPmNvbmZpZywgRUdMX0NPTkZJR19JRCwgdmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9BVFRSSUJVVEUsIEVHTF9GQUxTRSk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsV2FpdEdMKHZvaWQpCi17Ci0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi1FR0xCb29sZWFuIGVnbFdhaXROYXRpdmUoRUdMaW50IGVuZ2luZSkKLXsKLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsU3dhcEJ1ZmZlcnMoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZHJhdykKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0KLSAgICBlZ2xfc3VyZmFjZV90KiBkID0gc3RhdGljX2Nhc3Q8ZWdsX3N1cmZhY2VfdCo+KGRyYXcpOwotICAgIGlmICghZC0+aXNWYWxpZCgpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotICAgIGlmIChkLT5kcHkgIT0gZHB5KQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotCi0gICAgLy8gcG9zdCB0aGUgc3VyZmFjZQotICAgIGQtPnN3YXBCdWZmZXJzKCk7Ci0KLSAgICAvLyBpZiBpdCdzIGJvdW5kIHRvIGEgY29udGV4dCwgdXBkYXRlIHRoZSBidWZmZXIKLSAgICBpZiAoZC0+Y3R4ICE9IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIGQtPmJpbmREcmF3U3VyZmFjZSgob2dsZXNfY29udGV4dF90KilkLT5jdHgpOwotICAgICAgICAvLyBpZiB0aGlzIHN1cmZhY2UgaXMgYWxzbyB0aGUgcmVhZCBzdXJmYWNlIG9mIHRoZSBjb250ZXh0Ci0gICAgICAgIC8vIGl0IGlzIGJvdW5kIHRvLCBtYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSByZWFkIGJ1ZmZlciBhcyB3ZWxsLgotICAgICAgICAvLyBUaGUgRUdMIHNwZWMgaXMgYSBsaXR0bGUgdW5jbGVhciBhYm91dCB0aGlzLgotICAgICAgICBlZ2xfY29udGV4dF90KiBjID0gZWdsX2NvbnRleHRfdDo6Y29udGV4dChkLT5jdHgpOwotICAgICAgICBpZiAoYy0+cmVhZCA9PSBkcmF3KSB7Ci0gICAgICAgICAgICBkLT5iaW5kUmVhZFN1cmZhY2UoKG9nbGVzX2NvbnRleHRfdCopZC0+Y3R4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xDb3B5QnVmZmVycyggIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgIC8vIFRPRE86IGVnbENvcHlCdWZmZXJzKCkKLSAgICByZXR1cm4gRUdMX0ZBTFNFOwotfQotCi1FR0xpbnQgZWdsR2V0RXJyb3Iodm9pZCkKLXsKLSAgICByZXR1cm4gZ2V0RXJyb3IoKTsKLX0KLQotY29uc3QgY2hhciogZWdsUXVlcnlTdHJpbmcoRUdMRGlzcGxheSBkcHksIEVHTGludCBuYW1lKQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgKGNvbnN0IGNoYXIqKTApOwotCi0gICAgc3dpdGNoIChuYW1lKSB7Ci0gICAgICAgIGNhc2UgRUdMX1ZFTkRPUjoKLSAgICAgICAgICAgIHJldHVybiBnVmVuZG9yU3RyaW5nOwotICAgICAgICBjYXNlIEVHTF9WRVJTSU9OOgotICAgICAgICAgICAgcmV0dXJuIGdWZXJzaW9uU3RyaW5nOwotICAgICAgICBjYXNlIEVHTF9FWFRFTlNJT05TOgotICAgICAgICAgICAgcmV0dXJuIGdFeHRlbnNpb25zU3RyaW5nOwotICAgICAgICBjYXNlIEVHTF9DTElFTlRfQVBJUzoKLSAgICAgICAgICAgIHJldHVybiBnQ2xpZW50QXBpU3RyaW5nOwotICAgIH0KLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIChjb25zdCBjaGFyICopMCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVHTCAxLjEKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMQm9vbGVhbiBlZ2xTdXJmYWNlQXR0cmliKAotICAgICAgICBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgdmFsdWUpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgIC8vIFRPRE86IGVnbFN1cmZhY2VBdHRyaWIoKQotICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xCaW5kVGV4SW1hZ2UoCi0gICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgIC8vIFRPRE86IGVnbEJpbmRUZXhJbWFnZSgpCi0gICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOwotfQotCi1FR0xCb29sZWFuIGVnbFJlbGVhc2VUZXhJbWFnZSgKLSAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcikKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0gICAgLy8gVE9ETzogZWdsUmVsZWFzZVRleEltYWdlKCkKLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsU3dhcEludGVydmFsKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgaW50ZXJ2YWwpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgIC8vIFRPRE86IGVnbFN3YXBJbnRlcnZhbCgpCi0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFR0wgMS4yCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTEJvb2xlYW4gZWdsQmluZEFQSShFR0xlbnVtIGFwaSkKLXsKLSAgICBpZiAoYXBpICE9IEVHTF9PUEVOR0xfRVNfQVBJKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Ci0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi1FR0xlbnVtIGVnbFF1ZXJ5QVBJKHZvaWQpCi17Ci0gICAgcmV0dXJuIEVHTF9PUEVOR0xfRVNfQVBJOwotfQotCi1FR0xCb29sZWFuIGVnbFdhaXRDbGllbnQodm9pZCkKLXsKLSAgICBnbEZpbmlzaCgpOwotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xSZWxlYXNlVGhyZWFkKHZvaWQpCi17Ci0gICAgLy8gVE9ETzogZWdsUmVsZWFzZVRocmVhZCgpCi0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi1FR0xTdXJmYWNlIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyKAotICAgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGJ1ZnR5cGUsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsCi0gICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9OT19TVVJGQUNFKTsKLSAgICAvLyBUT0RPOiBlZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlcigpCi0gICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfTk9fU1VSRkFDRSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVHTF9FR0xFWFRfVkVSU0lPTiAzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgKCplZ2xHZXRQcm9jQWRkcmVzcyAoY29uc3QgY2hhciAqcHJvY25hbWUpKSgpCi17Ci0gICAgZXh0ZW50aW9uX21hcF90IGNvbnN0ICogY29uc3QgbWFwID0gZ0V4dGVudGlvbk1hcDsKLSAgICBmb3IgKHVpbnQzMl90IGk9MCA7IGk8TkVMRU0oZ0V4dGVudGlvbk1hcCkgOyBpKyspIHsKLSAgICAgICAgaWYgKCFzdHJjbXAocHJvY25hbWUsIG1hcFtpXS5uYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIG1hcFtpXS5hZGRyZXNzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1FR0xCb29sZWFuIGVnbExvY2tTdXJmYWNlS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCi0gICAgICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgRUdMQm9vbGVhbiByZXN1bHQgPSBFR0xfRkFMU0U7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRUdMQm9vbGVhbiBlZ2xVbmxvY2tTdXJmYWNlS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpCi17Ci0gICAgRUdMQm9vbGVhbiByZXN1bHQgPSBFR0xfRkFMU0U7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRUdMSW1hZ2VLSFIgZWdsQ3JlYXRlSW1hZ2VLSFIoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LCBFR0xlbnVtIHRhcmdldCwKLSAgICAgICAgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX05PX0lNQUdFX0tIUik7Ci0gICAgfQotICAgIGlmIChjdHggIT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX05PX0lNQUdFX0tIUik7Ci0gICAgfQotICAgIGlmICh0YXJnZXQgIT0gRUdMX05BVElWRV9CVUZGRVJfQU5EUk9JRCkgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9OT19JTUFHRV9LSFIpOwotICAgIH0KLQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIG5hdGl2ZV9idWZmZXIgPSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciopYnVmZmVyOwotCi0gICAgaWYgKG5hdGl2ZV9idWZmZXItPmNvbW1vbi5tYWdpYyAhPSBBTkRST0lEX05BVElWRV9CVUZGRVJfTUFHSUMpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX05PX0lNQUdFX0tIUik7Ci0KLSAgICBpZiAobmF0aXZlX2J1ZmZlci0+Y29tbW9uLnZlcnNpb24gIT0gc2l6ZW9mKEFOYXRpdmVXaW5kb3dCdWZmZXIpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9OT19JTUFHRV9LSFIpOwotCi0gICAgc3dpdGNoIChuYXRpdmVfYnVmZmVyLT5mb3JtYXQpIHsKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4ODoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl84ODg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9OT19JTUFHRV9LSFIpOwotICAgIH0KLQotICAgIG5hdGl2ZV9idWZmZXItPmNvbW1vbi5pbmNSZWYoJm5hdGl2ZV9idWZmZXItPmNvbW1vbik7Ci0gICAgcmV0dXJuIChFR0xJbWFnZUtIUiluYXRpdmVfYnVmZmVyOwotfQotCi1FR0xCb29sZWFuIGVnbERlc3Ryb3lJbWFnZUtIUihFR0xEaXNwbGF5IGRweSwgRUdMSW1hZ2VLSFIgaW1nKQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgIH0KLQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIG5hdGl2ZV9idWZmZXIgPSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciopaW1nOwotCi0gICAgaWYgKG5hdGl2ZV9idWZmZXItPmNvbW1vbi5tYWdpYyAhPSBBTkRST0lEX05BVElWRV9CVUZGRVJfTUFHSUMpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKLQotICAgIGlmIChuYXRpdmVfYnVmZmVyLT5jb21tb24udmVyc2lvbiAhPSBzaXplb2YoQU5hdGl2ZVdpbmRvd0J1ZmZlcikpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKLQotICAgIG5hdGl2ZV9idWZmZXItPmNvbW1vbi5kZWNSZWYoJm5hdGl2ZV9idWZmZXItPmNvbW1vbik7Ci0KLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEFORFJPSUQgZXh0ZW5zaW9ucwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FR0xCb29sZWFuIGVnbFNldFN3YXBSZWN0YW5nbGVBTkRST0lEKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsCi0gICAgICAgIEVHTGludCBsZWZ0LCBFR0xpbnQgdG9wLCBFR0xpbnQgd2lkdGgsIEVHTGludCBoZWlnaHQpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotCi0gICAgZWdsX3N1cmZhY2VfdCogZCA9IHN0YXRpY19jYXN0PGVnbF9zdXJmYWNlX3QqPihkcmF3KTsKLSAgICBpZiAoIWQtPmlzVmFsaWQoKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLSAgICBpZiAoZC0+ZHB5ICE9IGRweSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLQotICAgIC8vIHBvc3QgdGhlIHN1cmZhY2UKLSAgICBkLT5zZXRTd2FwUmVjdGFuZ2xlKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2ZpeGVkX2FzbS5TIGIvb3BlbmdsL2xpYmFnbC9maXhlZF9hc20uUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUwNDRmMi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL2ZpeGVkX2FzbS5TCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9maXhlZF9hc20uUwotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLQotICAgIC50ZXh0Ci0gICAgLmFsaWduCi0gICAgCi0gICAgLmdsb2JhbCBnZ2xGbG9hdFRvRml4ZWQKLSAgICAudHlwZSBnZ2xGbG9hdFRvRml4ZWQsICVmdW5jdGlvbgotICAgIC5nbG9iYWwgZ2dsRmxvYXRUb0ZpeGVkRmFzdAotICAgIC50eXBlIGdnbEZsb2F0VG9GaXhlZEZhc3QsICVmdW5jdGlvbgotCi0KLS8qCi0gKiBDb252ZXJ0cyBhIGZsb2F0IHRvIGEgczE1LjE2IGZpeGVkLXBvaW50IG51bWJlci4KLSAqIHRoaXMgZG9lc24ndCBoYW5kbGUgZmxvYXRzIG91dCBvZiB0aGUgWy0zMjc2OCwgKzMyNzY4WyByYW5nZQotICogYW5kIGRvZXNuJ3QgcGVyZm9ybXMgcm91bmQtdG8tbmVhcmVzdC4KLSAqIGhvd2V2ZXIsIGl0J3MgdmVyeSBmYXN0IDotKQotICovCi0KLWdnbEZsb2F0VG9GaXhlZEZhc3Q6Ci0gICAgICAgIG1vdnMgICAgcjEsIHIwLCBsc2wgIzEgICAgICAgICAgLyogcmVtb3ZlIGJpdCBzaWduICovCi0gICAgICAgIG1vdiAgICAgcjIsICMweDhFICAgICAgICAgICAgICAgLyogMTI3ICsgMTUgKi8KLSAgICAgICAgc3ViICAgICByMSwgcjIsIHIxLCBsc3IgIzI0ICAgICAvKiBjb21wdXRlIHNoaWZ0ICovCi0gICAgICAgIG1vdiAgICAgcjIsIHIwLCBsc2wgIzggICAgICAgICAgLyogbWFudGlzc2E8PDggKi8KLSAgICAgICAgb3JyICAgICByMiwgcjIsICMweDgwMDAwMDAwICAgICAvKiBhZGQgdGhlIG1pc3NpbmcgMSAqLwotICAgICAgICBtb3YgICAgIHIwLCByMiwgbHNyIHIxICAgICAgICAgIC8qIHNjYWxlIHRvIDE2LjE2ICovCi0gICAgICAgIHJzYmNzICAgcjAsIHIwLCAjMCAgICAgICAgICAgICAgLyogbmVnYXRlIGlmIG5lZWRlZCAqLwotICAgICAgICBieCAgICAgIGxyCi0KLS8qCi0gKiB0aGlzIHZlcnNpb24gcm91bmRzLXRvLW5lYXJlc3QgYW5kIHNhdHVyYXRlcyBudW1iZXJzCi0gKiBvdXRzaWRlIHRoZSByYW5nZSAoYnV0IG5vdCBOYU5zKS4KLSAqLwotCi1nZ2xGbG9hdFRvRml4ZWQ6Ci0gICAgICAgIG1vdiAgICAgcjEsIHIwLCBsc2wgIzEgICAgICAgICAgLyogcmVtb3ZlIGJpdCBzaWduICovCi0gICAgICAgIG1vdiAgICAgcjIsICMweDhFICAgICAgICAgICAgICAgLyogMTI3ICsgMTUgKi8KLSAgICAgICAgc3VicyAgICByMSwgcjIsIHIxLCBsc3IgIzI0ICAgICAvKiBjb21wdXRlIHNoaWZ0ICovCi0gICAgICAgIGJscyAgICAgMGYgICAgICAgICAgICAgICAgICAgICAgLyogdG9vIGJpZyAqLwotICAgICAgICBtb3YgICAgIHIyLCByMCwgbHNsICM4ICAgICAgICAgIC8qIG1hbnRpc3NhPDw4ICovCi0gICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHg4MDAwMDAwMCAgICAgLyogYWRkIHRoZSBtaXNzaW5nIDEgKi8KLSAgICAgICAgbW92ICAgICByMywgcjAKLSAgICAgICAgbW92cyAgICByMCwgcjIsIGxzciByMSAgICAgICAgICAvKiBzY2FsZSB0byAxNi4xNiAqLwotICAgICAgICBhZGRjcyAgIHIwLCByMCwgIzEgICAgICAgICAgICAgIC8qIHJvdW5kLXRvLW5lYXJlc3QgKi8KLSAgICAgICAgdHN0ICAgICByMywgIzB4ODAwMDAwMDAgICAgICAgICAvKiBuZWdhdGl2ZT8gKi8KLSAgICAgICAgcnNibmUgICByMCwgcjAsICMwICAgICAgICAgICAgICAvKiBuZWdhdGUgaWYgbmVlZGVkICovCi0gICAgICAgIGJ4ICAgICAgbHIgCi0gCi0wOiAgICAgIGFuZHMgICAgcjAsIHIwLCAjMHg4MDAwMDAwMCAgICAgLyoga2VlcCBvbmx5IHRoZSBzaWduIGJpdCAqLwotICAgICAgICBtb3ZlcSAgIHIwLCAjMHg3ZmZmZmZmZiAgICAgICAgIC8qIHBvc2l0aXZlLCBtYXhpbXVtIHZhbHVlICovCi0gICAgICAgIGJ4ICAgICAgbHIKLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9mcC5jcHAgYi9vcGVuZ2wvbGliYWdsL2ZwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1ZjFmZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL2ZwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvZnAuY3BwCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgImZwLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmICFkZWZpbmVkKF9fYXJtX18pCi1HR0xmaXhlZCBnZ2xGbG9hdFRvRml4ZWQoZmxvYXQgdikgeyAgIAotICAgIHJldHVybiBHR0xmaXhlZChmbG9vcmYodiAqIDY1NTM2LjBmICsgMC41ZikpOwotfQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgZ2wgewotCi1HTGZsb2F0IGZpeGVkVG9GbG9hdChHTGZpeGVkIHgpCi17Ci0jaWYgREVCVUdfVVNFX0ZMT0FUUwotICAgIHJldHVybiB4IC8gNjU1MzYuMGY7Ci0jZWxzZQotICAgIGlmICgheCkgcmV0dXJuIDA7Ci0gICAgY29uc3QgdWludDMyX3QgcyA9IHggJiAweDgwMDAwMDAwOwotICAgIHVuaW9uIHsKLSAgICAgICAgdWludDMyX3QgaTsKLSAgICAgICAgZmxvYXQgZjsKLSAgICB9OwotICAgIGkgPSBzID8gLXggOiB4OwotICAgIGNvbnN0IGludCBjID0gZ2dsQ2x6KGkpIC0gODsKLSAgICBpID0gKGM+PTApID8gKGk8PGMpIDogKGk+Pi1jKTsKLSAgICBjb25zdCB1aW50MzJfdCBlID0gMTM0IC0gYzsKLSAgICBpICY9IH4weDgwMDAwMDsKLSAgICBpIHw9IGU8PDIzOwotICAgIGkgfD0gczsKLSAgICByZXR1cm4gZjsKLSNlbmRpZgotfQotCi1mbG9hdCBzaW5lZihmbG9hdCB4KQotewotICAgIGNvbnN0IGZsb2F0IEEgPSAgIDEuMGYgLyAoMi4wZipNX1BJKTsKLSAgICBjb25zdCBmbG9hdCBCID0gLTE2LjBmOwotICAgIGNvbnN0IGZsb2F0IEMgPSAgIDguMGY7Ci0KLSAgICAvLyBzY2FsZSBhbmdsZSBmb3IgZWFzeSBhcmd1bWVudCByZWR1Y3Rpb24KLSAgICB4ICo9IEE7Ci0gICAgCi0gICAgaWYgKGZhYnNmKHgpID49IDAuNWYpIHsKLSAgICAgICAgLy8gQXJndW1lbnQgcmVkdWN0aW9uCi0gICAgICAgIHggPSB4IC0gY2VpbGYoeCArIDAuNWYpICsgMS4wZjsgCi0gICAgfQotCi0gICAgY29uc3QgZmxvYXQgeSA9IEIqeCpmYWJzZih4KSArIEMqeDsKLSAgICByZXR1cm4gMC4yMjE1ZiAqICh5KmZhYnNmKHkpIC0geSkgKyB5OwotfQotCi1mbG9hdCBjb3NpbmVmKGZsb2F0IHgpCi17Ci0gICAgcmV0dXJuIHNpbmVmKHggKyBmbG9hdChNX1BJLzIpKTsKLX0KLQotdm9pZCBzaW5jb3NmKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQqIHMsIEdMZmxvYXQqIGMpIHsKLSAgICAqcyA9IHNpbmVmKGFuZ2xlKTsKLSAgICAqYyA9IGNvc2luZWYoYW5nbGUpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgZnBfdXRpbHMKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZnAuaCBiL29wZW5nbC9saWJhZ2wvZnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwYzE4My4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL2ZwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9mcC5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX0ZQX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19GUF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL3BpeGVsZmxpbmdlci9nZ2xfY29udGV4dC5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi0jZGVmaW5lIERFQlVHX1VTRV9GTE9BVFMgICAgICAwCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZXh0ZXJuICJDIiBHTGZpeGVkIGdnbEZsb2F0VG9GaXhlZChmbG9hdCBmKSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSBnbCB7Ci0KLSAgICAgICAgR0xmbG9hdCBmaXhlZFRvRmxvYXQoR0xmaXhlZCkgQ09OU1Q7Ci0KLSAgICAgICAgdm9pZCAgICBzaW5jb3NmKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQqIHMsIEdMZmxvYXQqIGMpOwotICAgICAgICBmbG9hdCAgIHNpbmVmKEdMZmxvYXQgeCkgQ09OU1Q7Ci0gICAgICAgIGZsb2F0ICAgY29zaW5lZihHTGZsb2F0IHgpIENPTlNUOwotCi1pbmxpbmUgYm9vbCAgICAgY21wZihHTGZsb2F0IGEsIEdMZmxvYXQgYikgQ09OU1Q7Ci1pbmxpbmUgYm9vbCAgICAgaXNaZXJvZihHTGZsb2F0KSBDT05TVDsKLWlubGluZSBib29sICAgICBpc09uZWYoR0xmbG9hdCkgQ09OU1Q7Ci0KLWlubGluZSBpbnQgICAgICBpc1plcm9Pck5lZ2F0aXZlZihHTGZsb2F0KSBDT05TVDsKLQotaW5saW5lIGludCAgICAgIGV4cG9uZW50KEdMZmxvYXQpIENPTlNUOwotaW5saW5lIGludDMyX3QgIG1hbnRpc3NhKEdMZmxvYXQpIENPTlNUOwotaW5saW5lIEdMZmxvYXQgIGNsYW1wVG9aZXJvZihHTGZsb2F0KSBDT05TVDsKLWlubGluZSBHTGZsb2F0ICByZWNpcHJvY2FsZihHTGZsb2F0KSBDT05TVDsKLWlubGluZSBHTGZsb2F0ICByc3FydGYoR0xmbG9hdCkgQ09OU1Q7Ci1pbmxpbmUgR0xmbG9hdCAgc3FyZihHTGZsb2F0KSBDT05TVDsKLWlubGluZSBHTGZsb2F0ICBhZGRFeHBmKEdMZmxvYXQgdiwgaW50IGUpIENPTlNUOwotaW5saW5lIEdMZmxvYXQgIG11bDJmKEdMZmxvYXQgdikgQ09OU1Q7Ci1pbmxpbmUgR0xmbG9hdCAgZGl2MmYoR0xmbG9hdCB2KSBDT05TVDsKLWlubGluZSBHTGZsb2F0ICBhYnNmKEdMZmxvYXQgdikgQ09OU1Q7Ci0KLQotLyogCi0gKiBmbG9hdCBmYXN0ZXhwZihmbG9hdCkgOiBhIGZhc3QgYXBwcm94aW1hdGlvbiBvZiBleHBmKHgpCi0gKgkJZ2l2ZSBzb21ld2hhdCBhY2N1cmF0ZSByZXN1bHRzIGZvciAtODggPD0geCA8PSA4OAotICoKLSAqIGV4cCh4KSA9IDJeKHgvbG4oMikpCi0gKiB3ZSB1c2UgdGhlIHByb3BlcnRpZXMgb2YgZmxvYXQgZW5jb2RpbmcKLSAqIHRvIGdldCBhIGZhc3QgMl4gYW5kIGxpbmVhciBpbnRlcnBvbGF0aW9uCi0gKgotICovCi0KLWlubGluZSBmbG9hdCBmYXN0ZXhwZihmbG9hdCB5KSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotCi1pbmxpbmUgZmxvYXQgZmFzdGV4cGYoZmxvYXQgeSkKLXsKLQl1bmlvbiB7Ci0JCWZsb2F0CXI7Ci0JCWludDMyX3QJaTsKLQl9IHU7CQotCi0JLy8gMTI3KmxuKDIpID0gODgKLQlpZiAoeSA8IC04OC4wZikgewotCQl1LnIgPSAwLjBmOwotCX0gZWxzZSBpZiAoeSA+IDg4LjBmKSB7Ci0JCXUuciA9IElORklOSVRZOwotCX0gZWxzZSB7Ci0JCWNvbnN0IGZsb2F0IGtPbmVPdmVyTG9nVHdvID0gKDFMPDwyMykgLyBNX0xOMjsKLQkJY29uc3QgaW50MzJfdCBrRXhwb25lbnRCaWFzID0gMTI3TDw8MjM7Ci0JCWNvbnN0IGludDMyX3QgZSA9IGludDMyX3QoeSprT25lT3ZlckxvZ1R3byk7Ci0JCXUuaSA9IGUgKyBrRXhwb25lbnRCaWFzOwotCX0KLQkKLQlyZXR1cm4gdS5yOwotfQotCi0KLWJvb2wgY21wZihHTGZsb2F0IGEsIEdMZmxvYXQgYikgewotI2lmIERFQlVHX1VTRV9GTE9BVFMKLSAgICByZXR1cm4gYSA9PSBiOwotI2Vsc2UKLSAgICB1bmlvbiB7Ci0gICAgICAgIGZsb2F0ICAgICAgIGY7Ci0gICAgICAgIHVpbnQzMl90ICAgIGk7Ci0gICAgfSB1YSwgdWI7Ci0gICAgdWEuZiA9IGE7Ci0gICAgdWIuZiA9IGI7Ci0gICAgcmV0dXJuIHVhLmkgPT0gdWIuaTsKLSNlbmRpZgotfSAKLQotYm9vbCBpc1plcm9mKEdMZmxvYXQgdikgewotI2lmIERFQlVHX1VTRV9GTE9BVFMKLSAgICByZXR1cm4gdiA9PSAwOwotI2Vsc2UKLSAgICB1bmlvbiB7Ci0gICAgICAgIGZsb2F0ICAgICAgIGY7Ci0gICAgICAgIGludDMyX3QgICAgIGk7Ci0gICAgfTsKLSAgICBmID0gdjsKLSAgICByZXR1cm4gKGk8PDEpID09IDA7Ci0jZW5kaWYKLX0KLQotYm9vbCBpc09uZWYoR0xmbG9hdCB2KSB7Ci0gICAgcmV0dXJuIGNtcGYodiwgMS4wZik7Ci19Ci0KLWludCBpc1plcm9Pck5lZ2F0aXZlZihHTGZsb2F0IHYpIHsKLSNpZiBERUJVR19VU0VfRkxPQVRTCi0gICAgcmV0dXJuIHYgPD0gMDsKLSNlbHNlCi0gICAgdW5pb24gewotICAgICAgICBmbG9hdCAgICAgICBmOwotICAgICAgICBpbnQzMl90ICAgICBpOwotICAgIH07Ci0gICAgZiA9IHY7Ci0gICAgcmV0dXJuIGlzWmVyb2YodikgfCAoaT4+MzEpOwotI2VuZGlmCi19Ci0KLWludCBleHBvbmVudChHTGZsb2F0IHYpIHsKLSAgICB1bmlvbiB7Ci0gICAgICAgIGZsb2F0ICAgIGY7Ci0gICAgICAgIHVpbnQzMl90IGk7Ci0gICAgfTsKLSAgICBmID0gdjsKLSAgICByZXR1cm4gKChpIDw8IDEpID4+IDI0KSAtIDEyNzsKLX0KLQotaW50MzJfdCBtYW50aXNzYShHTGZsb2F0IHYpIHsKLSAgICB1bmlvbiB7Ci0gICAgICAgIGZsb2F0ICAgIGY7Ci0gICAgICAgIHVpbnQzMl90IGk7Ci0gICAgfTsKLSAgICBmID0gdjsKLSAgICBpZiAoIShpJjB4N0Y4MDAwMDApKSByZXR1cm4gMDsKLSAgICBjb25zdCBpbnQgcyA9IGkgPj4gMzE7Ci0gICAgaSB8PSAoMUw8PDIzKTsKLSAgICBpICY9IH4weEZGMDAwMDAwOwotICAgIHJldHVybiBzID8gLWkgOiBpOwotfQotCi1HTGZsb2F0IGNsYW1wVG9aZXJvZihHTGZsb2F0IHYpIHsKLSNpZiBERUJVR19VU0VfRkxPQVRTCi0gICAgcmV0dXJuIHY8MCA/IDAgOiAodj4xID8gMSA6IHYpOwotI2Vsc2UKLSAgICB1bmlvbiB7Ci0gICAgICAgIGZsb2F0ICAgICAgIGY7Ci0gICAgICAgIGludDMyX3QgICAgIGk7Ci0gICAgfTsKLSAgICBmID0gdjsKLSAgICBpICY9IH4oaT4+MzEpOwotICAgIHJldHVybiBmOwotI2VuZGlmCi19Ci0KLUdMZmxvYXQgcmVjaXByb2NhbGYoR0xmbG9hdCB2KSB7Ci0gICAgLy8gWFhYOiBkbyBiZXR0ZXIKLSAgICByZXR1cm4gMS4wZiAvIHY7Ci19Ci0KLUdMZmxvYXQgcnNxcnRmKEdMZmxvYXQgdikgewotICAgIC8vIFhYWDogZG8gYmV0dGVyCi0gICAgcmV0dXJuIDEuMGYgLyBzcXJ0Zih2KTsKLX0KLQotR0xmbG9hdCBzcXJmKEdMZmxvYXQgdikgewotICAgIC8vIFhYWDogZG8gYmV0dGVyCi0gICAgcmV0dXJuIHYqdjsKLX0KLQotR0xmbG9hdCBhZGRFeHBmKEdMZmxvYXQgdiwgaW50IGUpIHsKLSAgICB1bmlvbiB7Ci0gICAgICAgIGZsb2F0ICAgICAgIGY7Ci0gICAgICAgIGludDMyX3QgICAgIGk7Ci0gICAgfTsKLSAgICBmID0gdjsKLSAgICBpZiAoaTw8MSkgeyAvLyBYWFg6IGRlYWwgd2l0aCBvdmVyL3VuZGVyZmxvdwkKLSAgICAgICAgaSArPSBpbnQzMl90KGUpPDwyMzsKLSAgICB9Ci0gICAgcmV0dXJuIGY7Ci19Ci0KLUdMZmxvYXQgbXVsMmYoR0xmbG9hdCB2KSB7Ci0jaWYgREVCVUdfVVNFX0ZMT0FUUwotICAgIHJldHVybiB2KjI7Ci0jZWxzZQotICAgIHJldHVybiBhZGRFeHBmKHYsIDEpOwotI2VuZGlmCi19Ci0KLUdMZmxvYXQgZGl2MmYoR0xmbG9hdCB2KSB7Ci0jaWYgREVCVUdfVVNFX0ZMT0FUUwotICAgIHJldHVybiB2KjAuNWY7Ci0jZWxzZQotICAgIHJldHVybiBhZGRFeHBmKHYsIC0xKTsKLSNlbmRpZgotfQotCi1HTGZsb2F0ICBhYnNmKEdMZmxvYXQgdikgewotI2lmIERFQlVHX1VTRV9GTE9BVFMKLSAgICByZXR1cm4gdjwwID8gLXYgOiB2OwotI2Vsc2UKLSAgICB1bmlvbiB7Ci0gICAgICAgIGZsb2F0ICAgICAgIGY7Ci0gICAgICAgIGludDMyX3QgICAgIGk7Ci0gICAgfTsKLSAgICBmID0gdjsKLSAgICBpICY9IH4weDgwMDAwMDAwOwotICAgIHJldHVybiBmOwotI2VuZGlmCi19Ci0KLX07ICAvLyBuYW1lc3BhY2UgZ2wKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfRlBfSAotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2l0ZXJhdG9ycy5TIGIvb3BlbmdsL2xpYmFnbC9pdGVyYXRvcnMuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4NjQ4Mi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL2l0ZXJhdG9ycy5TCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9pdGVyYXRvcnMuUwotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLQotICAgIC50ZXh0Ci0gICAgLmFsaWduCi0gICAgLmFybQotICAgIAotICAgIC5nbG9iYWwgaXRlcmF0b3JzMDAzMgotICAgIC50eXBlIGl0ZXJhdG9yczAwMzIsICVmdW5jdGlvbgotCi0vKgotICogaXRlcmF0b3JzMDAzMgotICoKLSAqIE1VU1QgQkUgQ0FMTEVEIEZST00gQVJNIENPREUKLSAqCi0gKiByMDogY29uc3QgY29tcHV0ZV9pdGVyYXRvcnNfdCogKHRoaXMpCi0gKiAgICAgIHIwICsgMDogbV9keDAxIAotICogICAgICByMCArIDQ6IG1fZHkxMAotICogICAgICByMCArIDg6IG1fZHgyMAotICogICAgICByMCArMTI6IG1fZHkwMgotICogICAgICByMCArMTY6IG1feDAKLSAqICAgICAgcjAgKzIwOiBtX3kwCi0gKiAgICAgIHIwICsyNDogbV9hcmVhCi0gKgkJcjAgKzI4OiBtX3NjYWxlCi0gKgkJcjAgKzI5OiBtX2FyZWFfc2NhbGU7Ci0gKiByMTogaW50MzJfdCogKG91dCkKLSAqICAgICAgcjEgKyAwOiBjCi0gKiAgICAgIHIxICsgNDogZGNkeAotICogICAgICByMSArIDg6IGRjZHkKLSAqICAgcjI6IGMwCi0gKiAgIHIzOiBjMQotICogW3NwXTogYzIKLSAqLwotIAotaXRlcmF0b3JzMDAzMjoKLSAgICAgICAgc3RtZmQJc3AhLCB7cjQsIHI1LCByNiwgcjcsIHI4LCBscn0KLSAgICAgICAgbGRyICAgICByNCwgW3NwLCAjNCo2XQotCi0gICAgICAgIGxkcmIgICAgcjEyLCBbcjAsICMyOV0KLSAgICAgICAgc3ViICAgICByMywgcjMsIHIyCi0gICAgICAgIHN1YiAgICAgcjQsIHI0LCByMgotICAgICAgICBzdWIgICAgIHIxMiwgcjEyLCAjMTYKLSAgICAgICAgbW92ICAgICByMywgcjMsIGFzciByMTIKLSAgICAgICAgbW92ICAgICByNCwgcjQsIGFzciByMTIKLSAgICAgICAgCi0gICAgICAgIGxkciAgICAgcjUsIFtyMCwgIzBdCi0gICAgICAgIGxkciAgICAgcjEyLCBbcjAsICM0XQotICAgICAgICBzbXVsbCAgIHI4LCBsciwgcjQsIHI1Ci0gICAgICAgIGxkciAgICAgcjUsIFtyMCwgIzhdCi0gICAgICAgIHNtdWxsICAgcjYsIHI3LCByNCwgcjEyCi0gICAgICAgIGxkciAgICAgcjEyLCBbcjAsICMxMl0KLSAgICAgICAgc21sYWwgICByOCwgbHIsIHIzLCByNQotICAgICAgICBzbWxhbCAgIHI2LCByNywgcjMsIHIxMgotCi0gICAgICAgIGxkciAgICAgcjMsIFtyMCwgIzE2XSAgICAgICAgLy8gbV94MAotICAgICAgICBsZHIgICAgIHI0LCBbcjAsICMyMF0gICAgICAgIC8vIG1feDEKLSAgICAgICAgCi0gICAgICAgIHN0ciAgICAgcjYsIFtyMSwgIzRdCi0gICAgICAgIHN0ciAgICAgcjgsIFtyMSwgIzhdCi0KLSAgICAgICAgdW11bGwgICByNiwgcjUsIHIzLCByNgotICAgICAgICB1bXVsbCAgIHI4LCByMCwgcjQsIHI4Ci0gICAgICAgIG1sYSAgICAgcjcsIHIzLCByNywgcjUKLSAgICAgICAgbWxhICAgICBsciwgcjQsIGxyLCByMAotICAgICAgICBhZGRzICAgIHI2LCByNiwgcjgKLSAgICAgICAgYWRjICAgICByNywgcjcsIGxyCi0KLSAgICAgICAgbW92cyAgICByNiwgcjYsIGxzciAjNAotICAgICAgICBhZGMgICAgIHI2LCByNiwgcjcsIGxzbCAjMjgKLSAgICAgICAgcnNiICAgICByNiwgcjYsIHIyLCBsc2wgIzE2Ci0gICAgICAgIHN0ciAgICAgcjYsIFtyMSwgIzBdCi0KLSAgICAgICAgbGRtZmQJc3AhLCB7cjQsIHI1LCByNiwgcjcsIHI4LCBwY30KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9saWdodC5jcHAgYi9vcGVuZ2wvbGliYWdsL2xpZ2h0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3MTVkYi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL2xpZ2h0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg3NiArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL2xpZ2h0LmNwcAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJmcC5oIgotI2luY2x1ZGUgImxpZ2h0LmgiCi0jaW5jbHVkZSAic3RhdGUuaCIKLSNpbmNsdWRlICJtYXRyaXguaCIKLQotCi0jaWYgZGVmaW5lZChfX2FybV9fKSAmJiBkZWZpbmVkKF9fdGh1bWJfXykKLSN3YXJuaW5nICJsaWdodC5jcHAgc2hvdWxkIG5vdCBiZSBjb21waWxlZCBpbiB0aHVtYiBvbiBBUk0uIgotI2VuZGlmCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2xpZ2h0aW5nKG9nbGVzX2NvbnRleHRfdCogYyk7Ci1zdGF0aWMgdm9pZCBsaWdodFZlcnRleFZhbGlkYXRlKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpOwotc3RhdGljIHZvaWQgbGlnaHRWZXJ0ZXhOb3Aob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7Ci1zdGF0aWMgdm9pZCBsaWdodFZlcnRleChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KTsKLXN0YXRpYyB2b2lkIGxpZ2h0VmVydGV4TWF0ZXJpYWwob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2c2NhbGUzKEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIG0sIEdMZml4ZWQgcyk7Ci0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi12b2lkIHZub3JtMyhHTGZpeGVkKiBkLCBjb25zdCBHTGZpeGVkKiBhKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHZzYTMoR0xmaXhlZCogZCwKLSAgICBjb25zdCBHTGZpeGVkKiBtLCBHTGZpeGVkIHMsIGNvbnN0IEdMZml4ZWQqIGEpOwotc3RhdGljIGlubGluZSB2b2lkIHZzczMoR0xmaXhlZCogZCwKLSAgICBjb25zdCBHTGZpeGVkKiBtLCBHTGZpeGVkIHMsIGNvbnN0IEdMZml4ZWQqIGEpOwotc3RhdGljIGlubGluZSB2b2lkIHZtbGEzKEdMZml4ZWQqIGQsCi0gICAgY29uc3QgR0xmaXhlZCogbTAsIGNvbnN0IEdMZml4ZWQqIG0xLCBjb25zdCBHTGZpeGVkKiBhKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCB2bXVsMyhHTGZpeGVkKiBkLAotICAgIGNvbnN0IEdMZml4ZWQqIG0wLCBjb25zdCBHTGZpeGVkKiBtMSk7Ci0KLXN0YXRpYyBHTGZpeGVkIGZvZ19saW5lYXIob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkIHopOwotc3RhdGljIEdMZml4ZWQgZm9nX2V4cChvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQgeik7Ci1zdGF0aWMgR0xmaXhlZCBmb2dfZXhwMihvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQgeik7Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBpbml0X3doaXRlKHZlYzRfdCYgYykgewotICAgIGMuciA9IGMuZyA9IGMuYiA9IGMuYSA9IDB4MTAwMDA7Ci19Ci0KLXZvaWQgb2dsZXNfaW5pdF9saWdodChvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wIDsgaTxPR0xFU19NQVhfTElHSFRTIDsgaSsrKSB7Ci0gICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXS5hbWJpZW50LmEgPSAweDEwMDAwOwotICAgICAgICBjLT5saWdodGluZy5saWdodHNbaV0ucG9zaXRpb24ueiA9IDB4MTAwMDA7Ci0gICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXS5zcG90RGlyLnogPSAtMHgxMDAwMDsKLSAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRzW2ldLnNwb3RDdXRvZmYgPSBnZ2xJbnRUb0ZpeGVkKDE4MCk7Ci0gICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXS5hdHRlbnVhdGlvblswXSA9IDB4MTAwMDA7Ci0gICAgfQotICAgIGluaXRfd2hpdGUoYy0+bGlnaHRpbmcubGlnaHRzWzBdLmRpZmZ1c2UpOwotICAgIGluaXRfd2hpdGUoYy0+bGlnaHRpbmcubGlnaHRzWzBdLnNwZWN1bGFyKTsKLQotICAgIGMtPmxpZ2h0aW5nLmZyb250LmFtYmllbnQuciA9Ci0gICAgYy0+bGlnaHRpbmcuZnJvbnQuYW1iaWVudC5nID0KLSAgICBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LmIgPSBnZ2xGbG9hdFRvRml4ZWQoMC4yZik7Ci0gICAgYy0+bGlnaHRpbmcuZnJvbnQuYW1iaWVudC5hID0gMHgxMDAwMDsKLSAgICBjLT5saWdodGluZy5mcm9udC5kaWZmdXNlLnIgPQotICAgIGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UuZyA9Ci0gICAgYy0+bGlnaHRpbmcuZnJvbnQuZGlmZnVzZS5iID0gZ2dsRmxvYXRUb0ZpeGVkKDAuOGYpOwotICAgIGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UuYSA9IDB4MTAwMDA7Ci0gICAgYy0+bGlnaHRpbmcuZnJvbnQuc3BlY3VsYXIuYSA9IDB4MTAwMDA7Ci0gICAgYy0+bGlnaHRpbmcuZnJvbnQuZW1pc3Npb24uYSA9IDB4MTAwMDA7Ci0KLSAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuciA9Ci0gICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmcgPQotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5iID0gZ2dsRmxvYXRUb0ZpeGVkKDAuMmYpOwotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5hID0gMHgxMDAwMDsKLQotICAgIGMtPmxpZ2h0aW5nLmNvbG9yTWF0ZXJpYWwuZmFjZSA9IEdMX0ZST05UX0FORF9CQUNLOwotICAgIGMtPmxpZ2h0aW5nLmNvbG9yTWF0ZXJpYWwubW9kZSA9IEdMX0FNQklFTlRfQU5EX0RJRkZVU0U7Ci0KLSAgICBjLT5mb2cubW9kZSA9IEdMX0VYUDsKLSAgICBjLT5mb2cuZm9nID0gZm9nX2V4cDsKLSAgICBjLT5mb2cuZGVuc2l0eSA9IDB4MTAwMDA7Ci0gICAgYy0+Zm9nLmVuZCA9IDB4MTAwMDA7Ci0gICAgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQgPSAweDEwMDAwOwotCi0gICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKLSAgICAgICAKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnNoYWRlTW9kZWwoYywgR0xfU01PT1RIKTsKLSAgICBjLT5saWdodGluZy5zaGFkZU1vZGVsID0gR0xfU01PT1RIOwotfQotCi12b2lkIG9nbGVzX3VuaW5pdF9saWdodChvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50MzJfdCBjbGFtcEYoR0xmaXhlZCBmKSBDT05TVDsKLWludDMyX3QgY2xhbXBGKEdMZml4ZWQgZikgewotICAgIGYgPSAoZiAmIH4oZj4+MzEpKTsKLSAgICBpZiAoZiA+PSAweDEwMDAwKQotICAgICAgICBmID0gMHgxMDAwMDsKLSAgICByZXR1cm4gZjsKLX0KLQotc3RhdGljIEdMZml4ZWQgZm9nX2xpbmVhcihvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQgeikgewotICAgIHJldHVybiBjbGFtcEYoZ2dsTXVseCgoYy0+Zm9nLmVuZCAtICgoejwwKT8tejp6KSksIGMtPmZvZy5pbnZFbmRNaW51c1N0YXJ0KSk7Ci19Ci0KLXN0YXRpYyBHTGZpeGVkIGZvZ19leHAob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkIHopIHsKLSAgICBjb25zdCBmbG9hdCBlID0gZml4ZWRUb0Zsb2F0KGdnbE11bHgoYy0+Zm9nLmRlbnNpdHksICgoejwwKT8tejp6KSkpOwotICAgIHJldHVybiBjbGFtcEYoZ2dsRmxvYXRUb0ZpeGVkKGZhc3RleHBmKC1lKSkpOwotfQotCi1zdGF0aWMgR0xmaXhlZCBmb2dfZXhwMihvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQgeikgewotICAgIGNvbnN0IGZsb2F0IGUgPSBmaXhlZFRvRmxvYXQoZ2dsTXVseChjLT5mb2cuZGVuc2l0eSwgeikpOwotICAgIHJldHVybiBjbGFtcEYoZ2dsRmxvYXRUb0ZpeGVkKGZhc3RleHBmKC1lKmUpKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIG1hdGggaGVscGVycwotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUKLXZvaWQgdnNjYWxlMyhHTGZpeGVkKiBkLCBjb25zdCBHTGZpeGVkKiBtLCBHTGZpeGVkIHMpIHsKLSAgICBkWzBdID0gZ2dsTXVseChtWzBdLCBzKTsKLSAgICBkWzFdID0gZ2dsTXVseChtWzFdLCBzKTsKLSAgICBkWzJdID0gZ2dsTXVseChtWzJdLCBzKTsKLX0KLQotc3RhdGljIGlubGluZQotdm9pZCB2c2EzKEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIG0sIEdMZml4ZWQgcywgY29uc3QgR0xmaXhlZCogYSkgewotICAgIGRbMF0gPSBnZ2xNdWxBZGR4KG1bMF0sIHMsIGFbMF0pOwotICAgIGRbMV0gPSBnZ2xNdWxBZGR4KG1bMV0sIHMsIGFbMV0pOwotICAgIGRbMl0gPSBnZ2xNdWxBZGR4KG1bMl0sIHMsIGFbMl0pOwotfQotCi1zdGF0aWMgaW5saW5lCi12b2lkIHZzczMoR0xmaXhlZCogZCwgY29uc3QgR0xmaXhlZCogbSwgR0xmaXhlZCBzLCBjb25zdCBHTGZpeGVkKiBhKSB7Ci0gICAgZFswXSA9IGdnbE11bFN1YngobVswXSwgcywgYVswXSk7Ci0gICAgZFsxXSA9IGdnbE11bFN1YngobVsxXSwgcywgYVsxXSk7Ci0gICAgZFsyXSA9IGdnbE11bFN1YngobVsyXSwgcywgYVsyXSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXZvaWQgdm1sYTMoR0xmaXhlZCogZCwKLSAgICAgICAgY29uc3QgR0xmaXhlZCogbTAsIGNvbnN0IEdMZml4ZWQqIG0xLCBjb25zdCBHTGZpeGVkKiBhKQotewotICAgIGRbMF0gPSBnZ2xNdWxBZGR4KG0wWzBdLCBtMVswXSwgYVswXSk7Ci0gICAgZFsxXSA9IGdnbE11bEFkZHgobTBbMV0sIG0xWzFdLCBhWzFdKTsKLSAgICBkWzJdID0gZ2dsTXVsQWRkeChtMFsyXSwgbTFbMl0sIGFbMl0pOwotfQotCi1zdGF0aWMgaW5saW5lCi12b2lkIHZtdWwzKEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIG0wLCBjb25zdCBHTGZpeGVkKiBtMSkgewotICAgIGRbMF0gPSBnZ2xNdWx4KG0wWzBdLCBtMVswXSk7Ci0gICAgZFsxXSA9IGdnbE11bHgobTBbMV0sIG0xWzFdKTsKLSAgICBkWzJdID0gZ2dsTXVseChtMFsyXSwgbTFbMl0pOwotfQotCi12b2lkIHZub3JtMyhHTGZpeGVkKiBkLCBjb25zdCBHTGZpeGVkKiBhKQotewotICAgIC8vIHdlIG11c3QgdGFrZSBjYXJlIG9mIG92ZXJmbG93cyB3aGVuIG5vcm1hbGl6aW5nIGEgdmVjdG9yCi0gICAgR0xmaXhlZCBuOwotICAgIGludDMyX3QgeCA9IGFbMF07ICAgeCA9IHg+PTAgPyB4IDogLXg7Ci0gICAgaW50MzJfdCB5ID0gYVsxXTsgICB5ID0geT49MCA/IHkgOiAteTsKLSAgICBpbnQzMl90IHogPSBhWzJdOyAgIHogPSB6Pj0wID8geiA6IC16OwotICAgIGlmIChnZ2xfbGlrZWx5KHg8PTB4NjgwMCAmJiB5PD0weDY4MDAgJiYgejw9IDB4NjgwMCkpIHsKLSAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHRoaXMgd2lsbCBhbGwgZml0IG9uIDMyIGJpdHMKLSAgICAgICAgbiA9IHgqeCArIHkqeSArIHoqejsKLSAgICAgICAgbiA9IGdnbFNxcnRSZWNpcHgobik7Ci0gICAgICAgIG4gPDw9IDg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gaGVyZSBub3JtXjIgaXMgYXQgbGVhc3QgMHg3RUMwMDAwMCAoPj4zMiA9PSAwLjQ5NTExNykKLSAgICAgICAgbiA9IHZzcXVhcmUzKHgsIHksIHopOwotICAgICAgICBuID0gZ2dsU3FydFJlY2lweChuKTsKLSAgICB9Ci0gICAgdnNjYWxlMyhkLCBhLCBuKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgbGlnaHRpbmcgZXF1YXRpb25zCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSB2b2lkIGxpZ2h0X3BpY2tlcihvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgaWYgKGdnbF9saWtlbHkoIWMtPmxpZ2h0aW5nLmVuYWJsZSkpIHsKLSAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXggPSBsaWdodFZlcnRleE5vcDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoYy0+bGlnaHRpbmcuY29sb3JNYXRlcmlhbC5lbmFibGUpIHsKLSAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXggPSBsaWdodFZlcnRleE1hdGVyaWFsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4ID0gbGlnaHRWZXJ0ZXg7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdmFsaWRhdGVfbGlnaHRfbXZpKG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICB1aW50MzJfdCBlbiA9IGMtPmxpZ2h0aW5nLmVuYWJsZWRMaWdodHM7Ci0gICAgLy8gVmVjdG9yIGZyb20gb2JqZWN0IHRvIHZpZXdlciwgaW4gZXllIGNvb3JkaW5hdGVzCi0gICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBnZ2xDbHooZW4pOwotICAgICAgICBlbiAmPSB+KDE8PGkpOwotICAgICAgICBsaWdodF90JiBsID0gYy0+bGlnaHRpbmcubGlnaHRzW2ldOwotI2lmIE9CSkVDVF9TUEFDRV9MSUdIVElORwotICAgICAgICBjLT50cmFuc2Zvcm1zLm12dWkucG9pbnQ0KCZjLT50cmFuc2Zvcm1zLm12dWksCi0gICAgICAgICAgICAgICAgJmwub2JqUG9zaXRpb24sICZsLnBvc2l0aW9uKTsKLSNlbHNlCi0gICAgICAgIGwub2JqUG9zaXRpb24gPSBsLnBvc2l0aW9uOwotI2VuZGlmCi0gICAgICAgIHZub3JtMyhsLm5vcm1hbGl6ZWRPYmpQb3NpdGlvbi52LCBsLm9ialBvc2l0aW9uLnYpOwotICAgIH0KLSAgICBjb25zdCB2ZWM0X3QgZXllVmlld2VyID0geyAwLCAwLCAweDEwMDAwLCAwIH07Ci0jaWYgT0JKRUNUX1NQQUNFX0xJR0hUSU5HCi0gICAgYy0+dHJhbnNmb3Jtcy5tdnVpLnBvaW50MygmYy0+dHJhbnNmb3Jtcy5tdnVpLAotICAgICAgICAgICAgJmMtPmxpZ2h0aW5nLm9ialZpZXdlciwgJmV5ZVZpZXdlcik7Ci0gICAgdm5vcm0zKGMtPmxpZ2h0aW5nLm9ialZpZXdlci52LCBjLT5saWdodGluZy5vYmpWaWV3ZXIudik7Ci0jZWxzZQotICAgIGMtPmxpZ2h0aW5nLm9ialZpZXdlciA9IGV5ZVZpZXdlcjsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdmFsaWRhdGVfbGlnaHQob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIC8vIGlmIGNvbG9yTWF0ZXJpYWwgaXMgZW5hYmxlZCwgd2UgZ2V0IHRoZSBjb2xvciBmcm9tIHRoZSB2ZXJ0ZXgKLSAgICBpZiAoIWMtPmxpZ2h0aW5nLmNvbG9yTWF0ZXJpYWwuZW5hYmxlKSB7Ci0gICAgICAgIG1hdGVyaWFsX3QmIG1hdGVyaWFsID0gYy0+bGlnaHRpbmcuZnJvbnQ7Ci0gICAgICAgIHVpbnQzMl90IGVuID0gYy0+bGlnaHRpbmcuZW5hYmxlZExpZ2h0czsKLSAgICAgICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gZ2dsQ2x6KGVuKTsKLSAgICAgICAgICAgIGVuICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICBsaWdodF90JiBsID0gYy0+bGlnaHRpbmcubGlnaHRzW2ldOwotICAgICAgICAgICAgdm11bDMobC5pbXBsaWNpdEFtYmllbnQudiwgIG1hdGVyaWFsLmFtYmllbnQudiwgIGwuYW1iaWVudC52KTsKLSAgICAgICAgICAgIHZtdWwzKGwuaW1wbGljaXREaWZmdXNlLnYsICBtYXRlcmlhbC5kaWZmdXNlLnYsICBsLmRpZmZ1c2Uudik7Ci0gICAgICAgICAgICB2bXVsMyhsLmltcGxpY2l0U3BlY3VsYXIudiwgbWF0ZXJpYWwuc3BlY3VsYXIudiwgbC5zcGVjdWxhci52KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdGhpcyBpcyBqdXN0IGEgZmxhZyB0byB0ZWxsIGlmIHdlIGhhdmUgYSBzcGVjdWxhciBjb21wb25lbnQKLSAgICAgICAgICAgIGwuaW1wbGljaXRTcGVjdWxhci52WzNdID0KLSAgICAgICAgICAgICAgICAgICAgbC5pbXBsaWNpdFNwZWN1bGFyLnIgfAotICAgICAgICAgICAgICAgICAgICBsLmltcGxpY2l0U3BlY3VsYXIuZyB8Ci0gICAgICAgICAgICAgICAgICAgIGwuaW1wbGljaXRTcGVjdWxhci5iOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBsLnJDb25zdEF0dGVudWF0aW9uID0gKGwuYXR0ZW51YXRpb25bMV0gfCBsLmF0dGVudWF0aW9uWzJdKT09MDsKLSAgICAgICAgICAgIGlmIChsLnJDb25zdEF0dGVudWF0aW9uKQotICAgICAgICAgICAgICAgIGwuckNvbnN0QXR0ZW51YXRpb24gPSBnZ2xSZWNpcEZhc3QobC5hdHRlbnVhdGlvblswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZW1pc3Npb24gYW5kIGFtYmllbnQgZm9yIHRoZSB3aG9sZSBzY2VuZQotICAgICAgICB2bWxhMyggIGMtPmxpZ2h0aW5nLmltcGxpY2l0U2NlbmVFbWlzc2lvbkFuZEFtYmllbnQudiwKLSAgICAgICAgICAgICAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQudiwKLSAgICAgICAgICAgICAgICBtYXRlcmlhbC5hbWJpZW50LnYsIAotICAgICAgICAgICAgICAgIG1hdGVyaWFsLmVtaXNzaW9uLnYpOwotICAgICAgICBjLT5saWdodGluZy5pbXBsaWNpdFNjZW5lRW1pc3Npb25BbmRBbWJpZW50LmEgPSBtYXRlcmlhbC5kaWZmdXNlLmE7Ci0gICAgfQotICAgIHZhbGlkYXRlX2xpZ2h0X212aShjKTsKLX0KLQotdm9pZCBpbnZhbGlkYXRlX2xpZ2h0aW5nKG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICAvLyBUT0RPOiBwaWNrIGxpZ2h0VmVydGV4VmFsaWRhdGUgb3IgbGlnaHRWZXJ0ZXhWYWxpZGF0ZU1WSQotICAgIC8vIGluc3RlYWQgb2Ygc3lzdGVtYXRpY2FsbHkgdGhlIGhlYXZpZXIgbGlnaHRWZXJ0ZXhWYWxpZGF0ZSgpCi0gICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXggPSBsaWdodFZlcnRleFZhbGlkYXRlOwotfQotCi12b2lkIG9nbGVzX2ludmFsaWRhdGVfbGlnaHRpbmdfbXZ1aShvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKLX0KLQotdm9pZCBsaWdodFZlcnRleE5vcChvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCogdikKLXsKLSAgICAvLyB3ZSBzaG91bGQgbmV2ZXIgZW5kLXVwIGhlcmUKLX0KLQotdm9pZCBsaWdodFZlcnRleFZhbGlkYXRlTVZJKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCi17Ci0gICAgdmFsaWRhdGVfbGlnaHRfbXZpKGMpOwotICAgIGxpZ2h0X3BpY2tlcihjKTsKLSAgICBjLT5saWdodGluZy5saWdodFZlcnRleChjLCB2KTsKLX0KLQotdm9pZCBsaWdodFZlcnRleFZhbGlkYXRlKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCi17Ci0gICAgdmFsaWRhdGVfbGlnaHQoYyk7Ci0gICAgbGlnaHRfcGlja2VyKGMpOwotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYpOwotfQotCi12b2lkIGxpZ2h0VmVydGV4TWF0ZXJpYWwob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKLXsKLSAgICAvLyBmZXRjaCB0aGUgbWF0ZXJpYWwgY29sb3IKLSAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCi0gICAgICAgICAgICB2LT5pbmRleCAmIHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLKTsKLSAgICBjLT5hcnJheXMuY29sb3IuZmV0Y2goYywgdi0+Y29sb3IudiwgY3ApOwotCi0gICAgLy8gYWNxdWlyZSB0aGUgY29sb3ItbWF0ZXJpYWwgZnJvbSB0aGUgdmVydGV4Ci0gICAgbWF0ZXJpYWxfdCYgbWF0ZXJpYWwgPSBjLT5saWdodGluZy5mcm9udDsKLSAgICBtYXRlcmlhbC5hbWJpZW50ID0KLSAgICBtYXRlcmlhbC5kaWZmdXNlID0gdi0+Y29sb3I7Ci0gICAgLy8gaW1wbGljaXQgYXJndW1lbnRzIG5lZWQgdG8gYmUgY29tcHV0ZWQgcGVyL3ZlcnRleAotICAgIHVpbnQzMl90IGVuID0gYy0+bGlnaHRpbmcuZW5hYmxlZExpZ2h0czsKLSAgICB3aGlsZSAoZW4pIHsKLSAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIGdnbENseihlbik7Ci0gICAgICAgIGVuICY9IH4oMTw8aSk7Ci0gICAgICAgIGxpZ2h0X3QmIGwgPSBjLT5saWdodGluZy5saWdodHNbaV07Ci0gICAgICAgIHZtdWwzKGwuaW1wbGljaXRBbWJpZW50LnYsICBtYXRlcmlhbC5hbWJpZW50LnYsICBsLmFtYmllbnQudik7Ci0gICAgICAgIHZtdWwzKGwuaW1wbGljaXREaWZmdXNlLnYsICBtYXRlcmlhbC5kaWZmdXNlLnYsICBsLmRpZmZ1c2Uudik7Ci0gICAgICAgIHZtdWwzKGwuaW1wbGljaXRTcGVjdWxhci52LCBtYXRlcmlhbC5zcGVjdWxhci52LCBsLnNwZWN1bGFyLnYpOwotICAgICAgICAvLyB0aGlzIGlzIGp1c3QgYSBmbGFnIHRvIHRlbGwgaWYgd2UgaGF2ZSBhIHNwZWN1bGFyIGNvbXBvbmVudAotICAgICAgICBsLmltcGxpY2l0U3BlY3VsYXIudlszXSA9Ci0gICAgICAgICAgICAgICAgbC5pbXBsaWNpdFNwZWN1bGFyLnIgfAotICAgICAgICAgICAgICAgIGwuaW1wbGljaXRTcGVjdWxhci5nIHwKLSAgICAgICAgICAgICAgICBsLmltcGxpY2l0U3BlY3VsYXIuYjsKLSAgICB9Ci0gICAgLy8gZW1pc3Npb24gYW5kIGFtYmllbnQgZm9yIHRoZSB3aG9sZSBzY2VuZQotICAgIHZtbGEzKCAgYy0+bGlnaHRpbmcuaW1wbGljaXRTY2VuZUVtaXNzaW9uQW5kQW1iaWVudC52LAotICAgICAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LnYsCi0gICAgICAgICAgICBtYXRlcmlhbC5hbWJpZW50LnYsIAotICAgICAgICAgICAgbWF0ZXJpYWwuZW1pc3Npb24udik7Ci0gICAgYy0+bGlnaHRpbmcuaW1wbGljaXRTY2VuZUVtaXNzaW9uQW5kQW1iaWVudC5hID0gbWF0ZXJpYWwuZGlmZnVzZS5hOwotCi0gICAgLy8gbm93IHdlIGNhbiBsaWdodCBvdXIgdmVydGV4IGFzIHVzdWFsCi0gICAgbGlnaHRWZXJ0ZXgoYywgdik7Ci19Ci0KLXZvaWQgbGlnaHRWZXJ0ZXgob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKLXsKLSAgICAvLyBlbWlzc2lvbiBhbmQgYW1iaWVudCBmb3IgdGhlIHdob2xlIHNjZW5lCi0gICAgdmVjNF90IHIgPSBjLT5saWdodGluZy5pbXBsaWNpdFNjZW5lRW1pc3Npb25BbmRBbWJpZW50OwotICAgIGNvbnN0IHZlYzRfdCBvYmpWaWV3ZXIgPSBjLT5saWdodGluZy5vYmpWaWV3ZXI7Ci0KLSAgICB1aW50MzJfdCBlbiA9IGMtPmxpZ2h0aW5nLmVuYWJsZWRMaWdodHM7Ci0gICAgaWYgKGdnbF9saWtlbHkoZW4pKSB7Ci0gICAgICAgIC8vIHNpbmNlIHdlIGRvIHRoZSBsaWdodGluZyBpbiBvYmplY3Qtc3BhY2UsIHdlIGRvbid0IG5lZWQgdG8KLSAgICAgICAgLy8gdHJhbnNmb3JtIGVhY2ggbm9ybWFsLiBIb3dldmVyLCB3ZSBtaWdodCBzdGlsbCBoYXZlIHRvIG5vcm1hbGl6ZQotICAgICAgICAvLyBpdCBpZiBHTF9OT1JNQUxJWkUgaXMgZW5hYmxlZC4KLSAgICAgICAgdmVjNF90IG47Ci0gICAgICAgIGMtPmFycmF5cy5ub3JtYWwuZmV0Y2goYywgbi52LAotICAgICAgICAgICAgYy0+YXJyYXlzLm5vcm1hbC5lbGVtZW50KHYtPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spKTsKLQotI2lmICFPQkpFQ1RfU1BBQ0VfTElHSFRJTkcKLSAgICAgICAgYy0+dHJhbnNmb3Jtcy5tdnVpLnBvaW50MygmYy0+dHJhbnNmb3Jtcy5tdnVpLCAmbiwgJm4pOwotI2VuZGlmCi0KLSAgICAgICAgLy8gVE9ETzogcmlnaHQgbm93IHdlIGhhbmRsZSBHTF9SRVNDQUxFX05PUk1BTFMgYXMgaWYgaXQgd2VyZQotICAgICAgICAvLyBHTF9OT1JNQUxJWkUuIFdlIGNvdWxkIG9wdGltaXplIHRoaXMgYnkgIHNjYWxpbmcgbXZ1aSAKLSAgICAgICAgLy8gYXBwcm9wcmlhdGVseSBpbnN0ZWFkLgotICAgICAgICBpZiAoYy0+dHJhbnNmb3Jtcy5yZXNjYWxlTm9ybWFscykKLSAgICAgICAgICAgIHZub3JtMyhuLnYsIG4udik7Ci0KLSAgICAgICAgY29uc3QgbWF0ZXJpYWxfdCYgbWF0ZXJpYWwgPSBjLT5saWdodGluZy5mcm9udDsKLSAgICAgICAgY29uc3QgaW50IHR3b1NpZGUgPSBjLT5saWdodGluZy5saWdodE1vZGVsLnR3b1NpZGU7Ci0KLSAgICAgICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gZ2dsQ2x6KGVuKTsKLSAgICAgICAgICAgIGVuICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICBjb25zdCBsaWdodF90JiBsID0gYy0+bGlnaHRpbmcubGlnaHRzW2ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB2ZWM0X3QgZCwgdDsKLSAgICAgICAgICAgIEdMZml4ZWQgczsKLSAgICAgICAgICAgIEdMZml4ZWQgc3FEaXN0ID0gMHgxMDAwMDsKLQotICAgICAgICAgICAgLy8gY29tcHV0ZSB2ZXJ0ZXgtdG8tbGlnaHQgdmVjdG9yCi0gICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGwucG9zaXRpb24udykpIHsKLSAgICAgICAgICAgICAgICAvLyBsaWdodFBvcy8xLjAgLSB2ZXJ0ZXgvdmVydGV4LncgPT0gbGlnaHRQb3MqdmVydGV4LncgLSB2ZXJ0ZXgKLSAgICAgICAgICAgICAgICB2c3MzKGQudiwgbC5vYmpQb3NpdGlvbi52LCB2LT5vYmoudywgdi0+b2JqLnYpOwotICAgICAgICAgICAgICAgIHNxRGlzdCA9IGRvdDMoZC52LCBkLnYpOwotICAgICAgICAgICAgICAgIHZzY2FsZTMoZC52LCBkLnYsIGdnbFNxcnRSZWNpcHgoc3FEaXN0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IGF2b2lkIGNvcHkgaGVyZQotICAgICAgICAgICAgICAgIGQgPSBsLm5vcm1hbGl6ZWRPYmpQb3NpdGlvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYW1iaWVudCAmIGRpZmZ1c2UKLSAgICAgICAgICAgIHMgPSBkb3QzKG4udiwgZC52KTsKLSAgICAgICAgICAgIHMgPSAoczwwKSA/ICh0d29TaWRlPygtcyk6MCkgOiBzOwotICAgICAgICAgICAgdnNhMyh0LnYsIGwuaW1wbGljaXREaWZmdXNlLnYsIHMsIGwuaW1wbGljaXRBbWJpZW50LnYpOwotCi0gICAgICAgICAgICAvLyBzcGVjdWxhcgotICAgICAgICAgICAgaWYgKGdnbF91bmxpa2VseShzICYmIGwuaW1wbGljaXRTcGVjdWxhci52WzNdKSkgewotICAgICAgICAgICAgICAgIHZlYzRfdCBoOwotICAgICAgICAgICAgICAgIGgueCA9IGQueCArIG9ialZpZXdlci54OwotICAgICAgICAgICAgICAgIGgueSA9IGQueSArIG9ialZpZXdlci55OwotICAgICAgICAgICAgICAgIGgueiA9IGQueiArIG9ialZpZXdlci56OwotICAgICAgICAgICAgICAgIHZub3JtMyhoLnYsIGgudik7Ci0gICAgICAgICAgICAgICAgcyA9IGRvdDMobi52LCBoLnYpOwotICAgICAgICAgICAgICAgIHMgPSAoczwwKSA/ICh0d29TaWRlPygtcyk6MCkgOiBzOwotICAgICAgICAgICAgICAgIGlmIChzID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzID0gZ2dsUG93eChzLCBtYXRlcmlhbC5zaGluaW5lc3MpOwotICAgICAgICAgICAgICAgICAgICB2c2EzKHQudiwgbC5pbXBsaWNpdFNwZWN1bGFyLnYsIHMsIHQudik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzcG90Ci0gICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGwuc3BvdEN1dG9mZiAhPSBnZ2xJbnRUb0ZpeGVkKDE4MCkpKSB7Ci0gICAgICAgICAgICAgICAgR0xmaXhlZCBzcG90QXR0ID0gLWRvdDMobC5ub3JtYWxpemVkU3BvdERpci52LCBkLnYpOwotICAgICAgICAgICAgICAgIGlmIChzcG90QXR0ID49IGwuc3BvdEN1dG9mZkNvc2luZSkgewotICAgICAgICAgICAgICAgICAgICB2c2NhbGUzKHQudiwgdC52LCBnZ2xQb3d4KHNwb3RBdHQsIGwuc3BvdEV4cCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXR0ZW51YXRpb24KLSAgICAgICAgICAgIGlmIChnZ2xfdW5saWtlbHkobC5wb3NpdGlvbi53KSkgewotICAgICAgICAgICAgICAgIGlmIChsLnJDb25zdEF0dGVudWF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMgPSBsLnJDb25zdEF0dGVudWF0aW9uOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHMgPSBnZ2xNdWxBZGR4KHNxRGlzdCwgbC5hdHRlbnVhdGlvblsyXSwgbC5hdHRlbnVhdGlvblswXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsLmF0dGVudWF0aW9uWzFdKQotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGdnbE11bEFkZHgoZ2dsU3FydHgoc3FEaXN0KSwgbC5hdHRlbnVhdGlvblsxXSwgcyk7Ci0gICAgICAgICAgICAgICAgICAgIHMgPSBnZ2xSZWNpcEZhc3Qocyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZzY2FsZTModC52LCB0LnYsIHMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByLnIgKz0gdC5yOwotICAgICAgICAgICAgci5nICs9IHQuZzsKLSAgICAgICAgICAgIHIuYiArPSB0LmI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdi0+Y29sb3IuciA9IGdnbENsYW1weChyLnIpOwotICAgIHYtPmNvbG9yLmcgPSBnZ2xDbGFtcHgoci5nKTsKLSAgICB2LT5jb2xvci5iID0gZ2dsQ2xhbXB4KHIuYik7Ci0gICAgdi0+Y29sb3IuYSA9IGdnbENsYW1weChyLmEpOwotICAgIHYtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGxpZ2h0TW9kZWx4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSwgb2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGlmIChnZ2xfdW5saWtlbHkocG5hbWUgIT0gR0xfTElHSFRfTU9ERUxfVFdPX1NJREUpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC50d29TaWRlID0gcGFyYW0gPyBHTF9UUlVFIDogR0xfRkFMU0U7Ci0gICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKLX0KLQotc3RhdGljIHZvaWQgbGlnaHR4KEdMZW51bSBpLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0sIG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KHVpbnQzMl90KGktR0xfTElHSFQwKSA+PSBPR0xFU19NQVhfTElHSFRTKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbGlnaHRfdCYgbGlnaHQgPSBjLT5saWdodGluZy5saWdodHNbaS1HTF9MSUdIVDBdOwotICAgIGNvbnN0IEdMZml4ZWQga0RlZ1RvUmFkID0gR0xmaXhlZCgoTV9QSSAqIGdnbEludFRvRml4ZWQoMSkpIC8gMTgwLjBmKTsKLSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBHTF9TUE9UX0VYUE9ORU5UOgotICAgICAgICBpZiAoR0dMZml4ZWQocGFyYW0pID49IGdnbEludFRvRml4ZWQoMTI4KSkgewotICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbGlnaHQuc3BvdEV4cCA9IHBhcmFtOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1NQT1RfQ1VUT0ZGOgotICAgICAgICBpZiAocGFyYW0hPWdnbEludFRvRml4ZWQoMTgwKSAmJiBHR0xmaXhlZChwYXJhbSk+PWdnbEludFRvRml4ZWQoOTApKSB7Ci0gICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsaWdodC5zcG90Q3V0b2ZmID0gcGFyYW07Ci0gICAgICAgIGxpZ2h0LnNwb3RDdXRvZmZDb3NpbmUgPSAKLSAgICAgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoY29zaW5lZigoTV9QSS8oMTgwLjBmKjY1NTM2LjBmKSkqcGFyYW0pKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTjoKLSAgICAgICAgaWYgKHBhcmFtIDwgMCkgewotICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbGlnaHQuYXR0ZW51YXRpb25bMF0gPSBwYXJhbTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9MSU5FQVJfQVRURU5VQVRJT046Ci0gICAgICAgIGlmIChwYXJhbSA8IDApIHsKLSAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxpZ2h0LmF0dGVudWF0aW9uWzFdID0gcGFyYW07Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OOgotICAgICAgICBpZiAocGFyYW0gPCAwKSB7Ci0gICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsaWdodC5hdHRlbnVhdGlvblsyXSA9IHBhcmFtOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxpZ2h0eHYoR0xlbnVtIGksIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zLCBvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgaWYgKGdnbF91bmxpa2VseSh1aW50MzJfdChpLUdMX0xJR0hUMCkgPj0gT0dMRVNfTUFYX0xJR0hUUykpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEdMZml4ZWQqIHdoYXQ7Ci0gICAgbGlnaHRfdCYgbGlnaHQgPSBjLT5saWdodGluZy5saWdodHNbaS1HTF9MSUdIVDBdOwotICAgIHN3aXRjaCAocG5hbWUpIHsKLSAgICBjYXNlIEdMX0FNQklFTlQ6Ci0gICAgICAgIHdoYXQgPSBsaWdodC5hbWJpZW50LnY7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfRElGRlVTRToKLSAgICAgICAgd2hhdCA9IGxpZ2h0LmRpZmZ1c2UudjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9TUEVDVUxBUjoKLSAgICAgICAgd2hhdCA9IGxpZ2h0LnNwZWN1bGFyLnY7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfUE9TSVRJT046IHsKLSAgICAgICAgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtKGMsIHRyYW5zZm9ybV9zdGF0ZV90OjpNT0RFTFZJRVcpOwotICAgICAgICB0cmFuc2Zvcm1fdCYgbXYgPSBjLT50cmFuc2Zvcm1zLm1vZGVsdmlldy50cmFuc2Zvcm07Ci0gICAgICAgIG12LnBvaW50NCgmbXYsICZsaWdodC5wb3NpdGlvbiwgcmVpbnRlcnByZXRfY2FzdDx2ZWM0X3QgY29uc3QqPihwYXJhbXMpKTsKLSAgICAgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIEdMX1NQT1RfRElSRUNUSU9OOiB7Ci0jaWYgT0JKRUNUX1NQQUNFX0xJR0hUSU5HCi0gICAgICAgIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybShjLCB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZVSSk7Ci0gICAgICAgIHRyYW5zZm9ybV90JiBtdnVpID0gYy0+dHJhbnNmb3Jtcy5tdnVpOwotICAgICAgICBtdnVpLnBvaW50MygmbXZ1aSwgJmxpZ2h0LnNwb3REaXIsIHJlaW50ZXJwcmV0X2Nhc3Q8dmVjNF90IGNvbnN0Kj4ocGFyYW1zKSk7Ci0jZWxzZQotICAgICAgICBsaWdodC5zcG90RGlyID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dmVjNF90IGNvbnN0Kj4ocGFyYW1zKTsKLSNlbmRpZgotICAgICAgICB2bm9ybTMobGlnaHQubm9ybWFsaXplZFNwb3REaXIudiwgbGlnaHQuc3BvdERpci52KTsKLSAgICAgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgICBsaWdodHgoaSwgcG5hbWUsIHBhcmFtc1swXSwgYyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgd2hhdFswXSA9IHBhcmFtc1swXTsKLSAgICB3aGF0WzFdID0gcGFyYW1zWzFdOwotICAgIHdoYXRbMl0gPSBwYXJhbXNbMl07Ci0gICAgd2hhdFszXSA9IHBhcmFtc1szXTsKLSAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOwotfQotCi1zdGF0aWMgdm9pZCBtYXRlcmlhbHgoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSwgb2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGlmIChnZ2xfdW5saWtlbHkoZmFjZSAhPSBHTF9GUk9OVF9BTkRfQkFDSykpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZ2dsX3VubGlrZWx5KHBuYW1lICE9IEdMX1NISU5JTkVTUykpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT5saWdodGluZy5mcm9udC5zaGluaW5lc3MgPSBwYXJhbTsKLSAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOwotfQotCi1zdGF0aWMgdm9pZCBmb2d4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSwgb2dsZXNfY29udGV4dF90KiBjKQotewotICAgIHN3aXRjaCAocG5hbWUpIHsKLSAgICBjYXNlIEdMX0ZPR19ERU5TSVRZOgotICAgICAgICBpZiAocGFyYW0gPj0gMCkgewotICAgICAgICAgICAgYy0+Zm9nLmRlbnNpdHkgPSBwYXJhbTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0ZPR19TVEFSVDoKLSAgICAgICAgYy0+Zm9nLnN0YXJ0ID0gcGFyYW07Ci0gICAgICAgIGMtPmZvZy5pbnZFbmRNaW51c1N0YXJ0ID0gZ2dsUmVjaXAoYy0+Zm9nLmVuZCAtIGMtPmZvZy5zdGFydCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfRk9HX0VORDoKLSAgICAgICAgYy0+Zm9nLmVuZCA9IHBhcmFtOwotICAgICAgICBjLT5mb2cuaW52RW5kTWludXNTdGFydCA9IGdnbFJlY2lwKGMtPmZvZy5lbmQgLSBjLT5mb2cuc3RhcnQpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0ZPR19NT0RFOgotICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7Ci0gICAgICAgIGNhc2UgR0xfTElORUFSOgotICAgICAgICAgICAgYy0+Zm9nLm1vZGUgPSBwYXJhbTsKLSAgICAgICAgICAgIGMtPmZvZy5mb2cgPSBmb2dfbGluZWFyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0xfRVhQOgotICAgICAgICAgICAgYy0+Zm9nLm1vZGUgPSBwYXJhbTsKLSAgICAgICAgICAgIGMtPmZvZy5mb2cgPSBmb2dfZXhwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0xfRVhQMjoKLSAgICAgICAgICAgIGMtPmZvZy5tb2RlID0gcGFyYW07Ci0gICAgICAgICAgICBjLT5mb2cuZm9nID0gZm9nX2V4cDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBsaWdodGluZyBBUElzCi0jZW5kaWYKLQotdm9pZCBnbFNoYWRlTW9kZWwoR0xlbnVtIG1vZGUpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KG1vZGUgIT0gR0xfU01PT1RIICYmIG1vZGUgIT0gR0xfRkxBVCkpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT5saWdodGluZy5zaGFkZU1vZGVsID0gbW9kZTsKLX0KLQotdm9pZCBnbExpZ2h0TW9kZWxmKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGxpZ2h0TW9kZWx4KHBuYW1lLCBnZ2xGbG9hdFRvRml4ZWQocGFyYW0pLCBjKTsKLX0KLQotdm9pZCBnbExpZ2h0TW9kZWx4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGxpZ2h0TW9kZWx4KHBuYW1lLCBwYXJhbSwgYyk7Ci19Ci0KLXZvaWQgZ2xMaWdodE1vZGVsZnYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAocG5hbWUgPT0gR0xfTElHSFRfTU9ERUxfVFdPX1NJREUpIHsKLSAgICAgICAgbGlnaHRNb2RlbHgocG5hbWUsIGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pLCBjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChnZ2xfdW5saWtlbHkocG5hbWUgIT0gR0xfTElHSFRfTU9ERUxfQU1CSUVOVCkpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5yID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1swXSk7Ci0gICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmcgPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzFdKTsKLSAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuYiA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMl0pOwotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5hID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1szXSk7Ci0gICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKLX0KLQotdm9pZCBnbExpZ2h0TW9kZWx4dihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChwbmFtZSA9PSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSkgewotICAgICAgICBsaWdodE1vZGVseChwbmFtZSwgcGFyYW1zWzBdLCBjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChnZ2xfdW5saWtlbHkocG5hbWUgIT0gR0xfTElHSFRfTU9ERUxfQU1CSUVOVCkpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5yID0gcGFyYW1zWzBdOwotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5nID0gcGFyYW1zWzFdOwotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5iID0gcGFyYW1zWzJdOwotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5hID0gcGFyYW1zWzNdOwotICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCi0KLXZvaWQgZ2xMaWdodGYoR0xlbnVtIGksIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGxpZ2h0eChpLCBwbmFtZSwgZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtKSwgYyk7Ci19Ci0KLXZvaWQgZ2xMaWdodHgoR0xlbnVtIGksIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGxpZ2h0eChpLCBwbmFtZSwgcGFyYW0sIGMpOwotfQotCi12b2lkIGdsTGlnaHRmdihHTGVudW0gaSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBHTF9TUE9UX0VYUE9ORU5UOgotICAgIGNhc2UgR0xfU1BPVF9DVVRPRkY6Ci0gICAgY2FzZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTjoKLSAgICBjYXNlIEdMX0xJTkVBUl9BVFRFTlVBVElPTjoKLSAgICBjYXNlIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTjoKLSAgICAgICAgbGlnaHR4KGksIHBuYW1lLCBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKSwgYyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBHTGZpeGVkIHBhcmFtc3hbNF07Ci0gICAgcGFyYW1zeFswXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pOwotICAgIHBhcmFtc3hbMV0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzFdKTsKLSAgICBwYXJhbXN4WzJdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1syXSk7Ci0gICAgaWYgKHBuYW1lICE9IEdMX1NQT1RfRElSRUNUSU9OKQotICAgICAgICBwYXJhbXN4WzNdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1szXSk7Ci0KLSAgICBsaWdodHh2KGksIHBuYW1lLCBwYXJhbXN4LCBjKTsKLX0KLQotdm9pZCBnbExpZ2h0eHYoR0xlbnVtIGksIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgbGlnaHR4dihpLCBwbmFtZSwgcGFyYW1zLCBjKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jZW5kaWYKLQotdm9pZCBnbE1hdGVyaWFsZihHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgbWF0ZXJpYWx4KGZhY2UsIHBuYW1lLCBnZ2xGbG9hdFRvRml4ZWQocGFyYW0pLCBjKTsKLX0KLQotdm9pZCBnbE1hdGVyaWFseChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgbWF0ZXJpYWx4KGZhY2UsIHBuYW1lLCBwYXJhbSwgYyk7Ci19Ci0KLXZvaWQgZ2xNYXRlcmlhbGZ2KAotICAgIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChnZ2xfdW5saWtlbHkoZmFjZSAhPSBHTF9GUk9OVF9BTkRfQkFDSykpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBHTGZpeGVkKiB3aGF0PTA7Ci0gICAgR0xmaXhlZCogb3RoZXI9MDsKLSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBHTF9BTUJJRU5UOiAgICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuYW1iaWVudC52OyBicmVhazsKLSAgICBjYXNlIEdMX0RJRkZVU0U6ICAgIHdoYXQgPSBjLT5saWdodGluZy5mcm9udC5kaWZmdXNlLnY7IGJyZWFrOwotICAgIGNhc2UgR0xfU1BFQ1VMQVI6ICAgd2hhdCA9IGMtPmxpZ2h0aW5nLmZyb250LnNwZWN1bGFyLnY7IGJyZWFrOwotICAgIGNhc2UgR0xfRU1JU1NJT046ICAgd2hhdCA9IGMtPmxpZ2h0aW5nLmZyb250LmVtaXNzaW9uLnY7IGJyZWFrOwotICAgIGNhc2UgR0xfQU1CSUVOVF9BTkRfRElGRlVTRToKLSAgICAgICAgd2hhdCAgPSBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LnY7Ci0gICAgICAgIG90aGVyID0gYy0+bGlnaHRpbmcuZnJvbnQuZGlmZnVzZS52OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1NISU5JTkVTUzoKLSAgICAgICAgYy0+bGlnaHRpbmcuZnJvbnQuc2hpbmluZXNzID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1swXSk7Ci0gICAgICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Ci0gICAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHdoYXRbMF0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKTsKLSAgICB3aGF0WzFdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1sxXSk7Ci0gICAgd2hhdFsyXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMl0pOwotICAgIHdoYXRbM10gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzNdKTsKLSAgICBpZiAob3RoZXIpIHsKLSAgICAgICAgb3RoZXJbMF0gPSB3aGF0WzBdOwotICAgICAgICBvdGhlclsxXSA9IHdoYXRbMV07Ci0gICAgICAgIG90aGVyWzJdID0gd2hhdFsyXTsKLSAgICAgICAgb3RoZXJbM10gPSB3aGF0WzNdOwotICAgIH0KLSAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOwotfQotCi12b2lkIGdsTWF0ZXJpYWx4digKLSAgICBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGZhY2UgIT0gR0xfRlJPTlRfQU5EX0JBQ0spKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgR0xmaXhlZCogd2hhdD0wOwotICAgIEdMZml4ZWQqIG90aGVyPTA7Ci0gICAgc3dpdGNoIChwbmFtZSkgewotICAgIGNhc2UgR0xfQU1CSUVOVDogICAgd2hhdCA9IGMtPmxpZ2h0aW5nLmZyb250LmFtYmllbnQudjsgYnJlYWs7Ci0gICAgY2FzZSBHTF9ESUZGVVNFOiAgICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuZGlmZnVzZS52OyBicmVhazsKLSAgICBjYXNlIEdMX1NQRUNVTEFSOiAgIHdoYXQgPSBjLT5saWdodGluZy5mcm9udC5zcGVjdWxhci52OyBicmVhazsKLSAgICBjYXNlIEdMX0VNSVNTSU9OOiAgIHdoYXQgPSBjLT5saWdodGluZy5mcm9udC5lbWlzc2lvbi52OyBicmVhazsKLSAgICBjYXNlIEdMX0FNQklFTlRfQU5EX0RJRkZVU0U6Ci0gICAgICAgIHdoYXQgID0gYy0+bGlnaHRpbmcuZnJvbnQuYW1iaWVudC52OwotICAgICAgICBvdGhlciA9IGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UudjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9TSElOSU5FU1M6Ci0gICAgICAgIGMtPmxpZ2h0aW5nLmZyb250LnNoaW5pbmVzcyA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pOwotICAgICAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOwotICAgICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB3aGF0WzBdID0gcGFyYW1zWzBdOwotICAgIHdoYXRbMV0gPSBwYXJhbXNbMV07Ci0gICAgd2hhdFsyXSA9IHBhcmFtc1syXTsKLSAgICB3aGF0WzNdID0gcGFyYW1zWzNdOwotICAgIGlmIChvdGhlcikgewotICAgICAgICBvdGhlclswXSA9IHdoYXRbMF07Ci0gICAgICAgIG90aGVyWzFdID0gd2hhdFsxXTsKLSAgICAgICAgb3RoZXJbMl0gPSB3aGF0WzJdOwotICAgICAgICBvdGhlclszXSA9IHdoYXRbM107Ci0gICAgfQotICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIGZvZwotI2VuZGlmCi0KLXZvaWQgZ2xGb2dmKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgR0xmaXhlZCBwYXJhbXggPSAoR0xmaXhlZClwYXJhbTsKLSAgICBpZiAocG5hbWUgIT0gR0xfRk9HX01PREUpCi0gICAgICAgIHBhcmFteCA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbSk7Ci0gICAgZm9neChwbmFtZSwgcGFyYW14LCBjKTsKLX0KLQotdm9pZCBnbEZvZ3goR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBmb2d4KHBuYW1lLCBwYXJhbSwgYyk7Ci19Ci0KLXZvaWQgZ2xGb2dmdihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChwbmFtZSAhPSBHTF9GT0dfQ09MT1IpIHsKLSAgICAgICAgR0xmaXhlZCBwYXJhbXggPSAoR0xmaXhlZClwYXJhbXNbMF07Ci0gICAgICAgIGlmIChwbmFtZSAhPSBHTF9GT0dfTU9ERSkKLSAgICAgICAgICAgIHBhcmFteCA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pOwotICAgICAgICBmb2d4KHBuYW1lLCBwYXJhbXgsIGMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEdMZml4ZWQgcGFyYW1zeFs0XTsKLSAgICBwYXJhbXN4WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1swXSk7Ci0gICAgcGFyYW1zeFsxXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMV0pOwotICAgIHBhcmFtc3hbMl0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzJdKTsKLSAgICBwYXJhbXN4WzNdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1szXSk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5mb2dDb2xvcjN4dihjLCBwYXJhbXN4KTsKLX0KLQotdm9pZCBnbEZvZ3h2KEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHBuYW1lICE9IEdMX0ZPR19DT0xPUikgewotICAgICAgICBmb2d4KHBuYW1lLCBwYXJhbXNbMF0sIGMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZm9nQ29sb3IzeHYoYywgcGFyYW1zKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvbGlnaHQuaCBiL29wZW5nbC9saWJhZ2wvbGlnaHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllMzMwOS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL2xpZ2h0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL2xpZ2h0LmgKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfTElHSFRfSAotI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX0xJR0hUX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0KLS8vIFNldCB0byAxIGZvciBvYmplY3Qtc3BhY2UgbGlnaHRpbmcgZXZhbHVhdGlvbi4KLS8vIFRoZXJlIGFyZSBzdGlsbCBzb21lIGJ1Z3Mgd2l0aCBvYmplY3Qtc3BhY2UgbGlnaHRpbmcsCi0vLyBlc3BlY2lhbGx5IHZpc2libGUgaW4gdGhlIFNhbiBBbmdlbGVzIGRlbW8uCi0jZGVmaW5lIE9CSkVDVF9TUEFDRV9MSUdIVElORyAgIDAKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSBnbCB7Ci1zdHJ1Y3Qgb2dsZXNfY29udGV4dF90OwotfTsKLQotdm9pZCBvZ2xlc19pbml0X2xpZ2h0KG9nbGVzX2NvbnRleHRfdCogYyk7Ci12b2lkIG9nbGVzX3VuaW5pdF9saWdodChvZ2xlc19jb250ZXh0X3QqIGMpOwotdm9pZCBvZ2xlc19pbnZhbGlkYXRlX2xpZ2h0aW5nX212dWkob2dsZXNfY29udGV4dF90KiBjKTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfTElHSFRfSAotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL21hdHJpeC5jcHAgYi9vcGVuZ2wvbGliYWdsL21hdHJpeC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZWNjYjMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9tYXRyaXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzNCArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL21hdHJpeC5jcHAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJmcC5oIgotI2luY2x1ZGUgInN0YXRlLmgiCi0jaW5jbHVkZSAibWF0cml4LmgiCi0jaW5jbHVkZSAidmVydGV4LmgiCi0jaW5jbHVkZSAibGlnaHQuaCIKLQotI2lmIGRlZmluZWQoX19hcm1fXykgJiYgZGVmaW5lZChfX3RodW1iX18pCi0jd2FybmluZyAibWF0cml4LmNwcCBzaG91bGQgbm90IGJlIGNvbXBpbGVkIGluIHRodW1iIG9uIEFSTS4iCi0jZW5kaWYKLQotI2RlZmluZSBJKF9pLCBfaikgKChfaikrIDQqKF9pKSkKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBjb25zdCBHTGZsb2F0IGdJZGVudGl0eWZbMTZdID0geyAxLDAsMCwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMSwwLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDEsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsMCwxIH07Ci0KLXN0YXRpYyBjb25zdCBtYXRyaXh4X3QgZ0lkZW50aXR5eCA9IHsgCi0gICAgICAgICAgICB7ICAgMHgxMDAwMCwwLDAsMCwKLSAgICAgICAgICAgICAgICAwLDB4MTAwMDAsMCwwLAotICAgICAgICAgICAgICAgIDAsMCwweDEwMDAwLDAsCi0gICAgICAgICAgICAgICAgMCwwLDAsMHgxMDAwMAotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi1zdGF0aWMgdm9pZCBwb2ludDJfX25vcCh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogYywgdmVjNF90IGNvbnN0KiBvKTsKLXN0YXRpYyB2b2lkIHBvaW50M19fbm9wKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOwotc3RhdGljIHZvaWQgcG9pbnQ0X19ub3AodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGMsIHZlYzRfdCBjb25zdCogbyk7Ci1zdGF0aWMgdm9pZCBub3JtYWxfX25vcCh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogYywgdmVjNF90IGNvbnN0KiBvKTsKLXN0YXRpYyB2b2lkIHBvaW50Ml9fZ2VuZXJpYyh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogYywgdmVjNF90IGNvbnN0KiBvKTsKLXN0YXRpYyB2b2lkIHBvaW50M19fZ2VuZXJpYyh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogYywgdmVjNF90IGNvbnN0KiBvKTsKLXN0YXRpYyB2b2lkIHBvaW50NF9fZ2VuZXJpYyh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogYywgdmVjNF90IGNvbnN0KiBvKTsKLXN0YXRpYyB2b2lkIHBvaW50M19fbXZ1aSh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogYywgdmVjNF90IGNvbnN0KiBvKTsKLXN0YXRpYyB2b2lkIHBvaW50NF9fbXZ1aSh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogYywgdmVjNF90IGNvbnN0KiBvKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jZW5kaWYKLQotdm9pZCBvZ2xlc19pbml0X21hdHJpeChvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXcuaW5pdChPR0xFU19NT0RFTFZJRVdfU1RBQ0tfREVQVEgpOwotICAgIGMtPnRyYW5zZm9ybXMucHJvamVjdGlvbi5pbml0KE9HTEVTX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgpOwotICAgIGZvciAoaW50IGk9MDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKQotICAgICAgICBjLT50cmFuc2Zvcm1zLnRleHR1cmVbaV0uaW5pdChPR0xFU19URVhUVVJFX1NUQUNLX0RFUFRIKTsKLQotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudCA9ICZjLT50cmFuc2Zvcm1zLm1vZGVsdmlldzsKLSAgICBjLT50cmFuc2Zvcm1zLm1hdHJpeE1vZGUgPSBHTF9NT0RFTFZJRVc7Ci0gICAgYy0+dHJhbnNmb3Jtcy5kaXJ0eSA9ICAgdHJhbnNmb3JtX3N0YXRlX3Q6OlZJRVdQT1JUIHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3N0YXRlX3Q6Ok1WVUkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV9zdGF0ZV90OjpNVklUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZQOwotICAgIGMtPnRyYW5zZm9ybXMubXZwLmxvYWRJZGVudGl0eSgpOwotICAgIGMtPnRyYW5zZm9ybXMubXZwNC5sb2FkSWRlbnRpdHkoKTsKLSAgICBjLT50cmFuc2Zvcm1zLm12aXQ0LmxvYWRJZGVudGl0eSgpOwotICAgIGMtPnRyYW5zZm9ybXMubXZ1aS5sb2FkSWRlbnRpdHkoKTsKLSAgICBjLT50cmFuc2Zvcm1zLnZwdC5sb2FkSWRlbnRpdHkoKTsKLSAgICBjLT50cmFuc2Zvcm1zLnZwdC56TmVhciA9IDAuMGY7Ci0gICAgYy0+dHJhbnNmb3Jtcy52cHQuekZhciAgPSAxLjBmOwotfQotCi12b2lkIG9nbGVzX3VuaW5pdF9tYXRyaXgob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGMtPnRyYW5zZm9ybXMubW9kZWx2aWV3LnVuaW5pdCgpOwotICAgIGMtPnRyYW5zZm9ybXMucHJvamVjdGlvbi51bmluaXQoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykKLSAgICAgICAgYy0+dHJhbnNmb3Jtcy50ZXh0dXJlW2ldLnVuaW5pdCgpOwotfQotCi1zdGF0aWMgdm9pZCB2YWxpZGF0ZV9wZXJzcGVjdGl2ZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQotewotICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7Ci0gICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlID0gKGMtPmNsaXBQbGFuZXMuZW5hYmxlKSA/Ci0gICAgICAgIG9nbGVzX3ZlcnRleF9jbGlwQWxsUGVyc3BlY3RpdmUzRCA6IG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEOwotICAgIGlmIChlbmFibGVzICYgKEdHTF9FTkFCTEVfREVQVEhfVEVTVHxHR0xfRU5BQkxFX0ZPRykpIHsKLSAgICAgICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlID0gb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlM0RaOwotICAgICAgICBpZiAoYy0+Y2xpcFBsYW5lcy5lbmFibGUgfHwgKGVuYWJsZXMmR0dMX0VOQUJMRV9GT0cpKQotICAgICAgICAgICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlID0gb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEWjsKLSAgICB9Ci0gICAgaWYgKChjLT5hcnJheXMudmVydGV4LnNpemUgIT0gNCkgJiYKLSAgICAgICAgKGMtPnRyYW5zZm9ybXMubXZwNC5mbGFncyAmIHRyYW5zZm9ybV90OjpGTEFHU18yRF9QUk9KRUNUSU9OKSkgewotICAgICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUyRDsKLSAgICB9Ci0gICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlKGMsIHYpOwotfQotCi12b2lkIG9nbGVzX2ludmFsaWRhdGVfcGVyc3BlY3RpdmUob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IHZhbGlkYXRlX3BlcnNwZWN0aXZlOwotfQotCi12b2lkIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybV9pbXBsKG9nbGVzX2NvbnRleHRfdCogYywgdWludDMyX3Qgd2FudCkKLXsKLSAgICBpbnQgZGlydHkgPSBjLT50cmFuc2Zvcm1zLmRpcnR5ICYgd2FudDsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBtb2RlbHZpZXcKLSAgICBpZiAoZGlydHkgJiB0cmFuc2Zvcm1fc3RhdGVfdDo6TU9ERUxWSUVXKSB7Ci0gICAgICAgIGMtPnRyYW5zZm9ybXMubW9kZWx2aWV3LnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgLy8gVmFsaWRhdGUgdGhlIHByb2plY3Rpb24gc3RhY2sgKGluIGZhY3QsIGl0J3MgbmV2ZXIgbmVlZGVkKQotICAgIGlmIChkaXJ0eSAmIHRyYW5zZm9ybV9zdGF0ZV90OjpQUk9KRUNUSU9OKSB7Ci0gICAgICAgIGMtPnRyYW5zZm9ybXMucHJvamVjdGlvbi52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8vIFZhbGlkYXRlIHRoZSB2aWV3cG9ydCB0cmFuc2Zvcm1hdGlvbgotICAgIGlmIChkaXJ0eSAmIHRyYW5zZm9ybV9zdGF0ZV90OjpWSUVXUE9SVCkgewotICAgICAgICB2cF90cmFuc2Zvcm1fdCYgdnB0ID0gYy0+dHJhbnNmb3Jtcy52cHQ7Ci0gICAgICAgIHZwdC50cmFuc2Zvcm0ubWF0cml4LmxvYWQodnB0Lm1hdHJpeCk7Ci0gICAgICAgIHZwdC50cmFuc2Zvcm0ucGlja2VyKCk7Ci0gICAgfQotCi0gICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIG12cCAodXNlZCB0byB0cmFuc2Zvcm0gZWFjaCB2ZXJ0ZXgpCi0gICAgaWYgKGRpcnR5ICYgdHJhbnNmb3JtX3N0YXRlX3Q6Ok1WUCkgewotICAgICAgICBjLT50cmFuc2Zvcm1zLnVwZGF0ZV9tdnAoKTsKLSAgICAgICAgLy8gaW52YWxpZGF0ZSBwZXJzcGVjdGl2ZSAoZGl2aWRlIGJ5IFcpIGFuZCB2aWV3IHZvbHVtZSBjbGlwcGluZwotICAgICAgICBvZ2xlc19pbnZhbGlkYXRlX3BlcnNwZWN0aXZlKGMpOwotICAgIH0KLQotICAgIC8vIFZhbGlkYXRlIHRoZSBtdnVpIChmb3Igbm9ybWFsIHRyYW5zZm9ybWF0aW9uKQotICAgIGlmIChkaXJ0eSAmIHRyYW5zZm9ybV9zdGF0ZV90OjpNVlVJKSB7Ci0gICAgICAgIGMtPnRyYW5zZm9ybXMudXBkYXRlX212dWkoKTsKLSAgICAgICAgb2dsZXNfaW52YWxpZGF0ZV9saWdodGluZ19tdnVpKGMpOwotICAgIH0KLQotICAgIC8vIFZhbGlkYXRlIHRoZSB0ZXh0dXJlIHN0YWNrCi0gICAgaWYgKGRpcnR5ICYgdHJhbnNmb3JtX3N0YXRlX3Q6OlRFWFRVUkUpIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspCi0gICAgICAgICAgICBjLT50cmFuc2Zvcm1zLnRleHR1cmVbaV0udmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgbXZpdDQgKHVzZXItY2xpcCBwbGFuZXMpCi0gICAgaWYgKGRpcnR5ICYgdHJhbnNmb3JtX3N0YXRlX3Q6Ok1WSVQpIHsKLSAgICAgICAgYy0+dHJhbnNmb3Jtcy51cGRhdGVfbXZpdCgpOwotICAgIH0KLQotICAgIGMtPnRyYW5zZm9ybXMuZGlydHkgJj0gfndhbnQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIHRyYW5zZm9ybV90Ci0jZW5kaWYKLQotdm9pZCB0cmFuc2Zvcm1fdDo6bG9hZElkZW50aXR5KCkgewotICAgIG1hdHJpeCA9IGdJZGVudGl0eXg7Ci0gICAgZmxhZ3MgPSAwOwotICAgIG9wcyA9IE9QX0lERU5USVRZOwotICAgIHBvaW50MiA9IHBvaW50Ml9fbm9wOwotICAgIHBvaW50MyA9IHBvaW50M19fbm9wOwotICAgIHBvaW50NCA9IHBvaW50NF9fbm9wOwotfQotCi0KLXN0YXRpYyBpbmxpbmUKLWludCBub3RaZXJvKEdMZml4ZWQgdikgewotICAgIHJldHVybiBhYnModikgJiB+MHgzOwotfQotCi1zdGF0aWMgaW5saW5lCi1pbnQgbm90T25lKEdMZml4ZWQgdikgewotICAgIHJldHVybiBub3RaZXJvKHYgLSAweDEwMDAwKTsKLX0KLQotdm9pZCB0cmFuc2Zvcm1fdDo6cGlja2VyKCkKLXsKLSAgICBjb25zdCBHTGZpeGVkKiBjb25zdCBtID0gbWF0cml4Lm07Ci0KLSAgICAvLyBYWFg6IHBpY2tlciBuZWVkcyB0byBiZSBzbWFydGVyCi0gICAgZmxhZ3MgPSAwOwotICAgIG9wcyA9IE9QX0FMTDsKLSAgICBwb2ludDIgPSBwb2ludDJfX2dlbmVyaWM7Ci0gICAgcG9pbnQzID0gcG9pbnQzX19nZW5lcmljOwotICAgIHBvaW50NCA9IHBvaW50NF9fZ2VuZXJpYzsKLSAgICAKLSAgICAvLyBmaW5kIG91dCBpZiB0aGlzIGlzIGEgMkQgcHJvamVjdGlvbgotICAgIGlmICghKG5vdFplcm8obVszXSkgfCBub3RaZXJvKG1bN10pIHwgbm90WmVybyhtWzExXSkgfCBub3RPbmUobVsxNV0pKSkgewotICAgICAgICBmbGFncyB8PSBGTEFHU18yRF9QUk9KRUNUSU9OOwotICAgIH0KLX0KLQotdm9pZCBtdnVpX3RyYW5zZm9ybV90OjpwaWNrZXIoKQotewotICAgIGZsYWdzID0gMDsKLSAgICBvcHMgPSBPUF9BTEw7Ci0gICAgcG9pbnQzID0gcG9pbnQzX19tdnVpOwotICAgIHBvaW50NCA9IHBvaW50NF9fbXZ1aTsKLX0KLQotdm9pZCB0cmFuc2Zvcm1fdDo6ZHVtcChjb25zdCBjaGFyKiB3aGF0KQotewotICAgIEdMZml4ZWQgY29uc3QgKiBjb25zdCBtID0gbWF0cml4Lm07Ci0gICAgQUxPR0QoIiVzOiIsIHdoYXQpOwotICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykKLSAgICAgICAgQUxPR0QoIlslMDh4ICUwOHggJTA4eCAlMDh4XSBbJWYgJWYgJWYgJWZdXG4iLAotICAgICAgICAgICAgbVtJKDAsaSldLCBtW0koMSxpKV0sIG1bSSgyLGkpXSwgbVtJKDMsaSldLAotICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KG1bSSgwLGkpXSksCi0gICAgICAgICAgICBmaXhlZFRvRmxvYXQobVtJKDEsaSldKSwgCi0gICAgICAgICAgICBmaXhlZFRvRmxvYXQobVtJKDIsaSldKSwKLSAgICAgICAgICAgIGZpeGVkVG9GbG9hdChtW0koMyxpKV0pKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgbWF0cml4eF90Ci0jZW5kaWYKLQotdm9pZCBtYXRyaXh4X3Q6OmxvYWQoY29uc3QgbWF0cml4Zl90JiByaHMpIHsKLSAgICBHTGZpeGVkKiB4cCA9IG07Ci0gICAgR0xmbG9hdCBjb25zdCogZnAgPSByaHMuZWxlbWVudHMoKTsKLSAgICB1bnNpZ25lZCBpbnQgaSA9IDE2OwotICAgIGRvIHsKLSAgICAgICAgY29uc3QgR0xmbG9hdCBmID0gKmZwKys7Ci0gICAgICAgICp4cCsrID0gaXNaZXJvZihmKSA/IDAgOiBnZ2xGbG9hdFRvRml4ZWQoZik7Ci0gICAgfSB3aGlsZSAoLS1pKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgbWF0cml4Zl90Ci0jZW5kaWYKLQotdm9pZCBtYXRyaXhmX3Q6Om11bHRpcGx5KG1hdHJpeGZfdCYgciwgY29uc3QgbWF0cml4Zl90JiBsaHMsIGNvbnN0IG1hdHJpeGZfdCYgcmhzKQotewotICAgIEdMZmxvYXQgY29uc3QqIGNvbnN0IG0gPSBsaHMubTsKLSAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspIHsKLSAgICAgICAgcmVnaXN0ZXIgY29uc3QgZmxvYXQgcmhzX2kwID0gcmhzLm1bIEkoaSwwKSBdOwotICAgICAgICByZWdpc3RlciBmbG9hdCByaTAgPSBtWyBJKDAsMCkgXSAqIHJoc19pMDsKLSAgICAgICAgcmVnaXN0ZXIgZmxvYXQgcmkxID0gbVsgSSgwLDEpIF0gKiByaHNfaTA7Ci0gICAgICAgIHJlZ2lzdGVyIGZsb2F0IHJpMiA9IG1bIEkoMCwyKSBdICogcmhzX2kwOwotICAgICAgICByZWdpc3RlciBmbG9hdCByaTMgPSBtWyBJKDAsMykgXSAqIHJoc19pMDsKLSAgICAgICAgZm9yIChpbnQgaj0xIDsgajw0IDsgaisrKSB7Ci0gICAgICAgICAgICByZWdpc3RlciBjb25zdCBmbG9hdCByaHNfaWogPSByaHMubVsgSShpLGopIF07Ci0gICAgICAgICAgICByaTAgKz0gbVsgSShqLDApIF0gKiByaHNfaWo7Ci0gICAgICAgICAgICByaTEgKz0gbVsgSShqLDEpIF0gKiByaHNfaWo7Ci0gICAgICAgICAgICByaTIgKz0gbVsgSShqLDIpIF0gKiByaHNfaWo7Ci0gICAgICAgICAgICByaTMgKz0gbVsgSShqLDMpIF0gKiByaHNfaWo7Ci0gICAgICAgIH0KLSAgICAgICAgci5tWyBJKGksMCkgXSA9IHJpMDsKLSAgICAgICAgci5tWyBJKGksMSkgXSA9IHJpMTsKLSAgICAgICAgci5tWyBJKGksMikgXSA9IHJpMjsKLSAgICAgICAgci5tWyBJKGksMykgXSA9IHJpMzsKLSAgICB9Ci19Ci0KLXZvaWQgbWF0cml4Zl90OjpkdW1wKGNvbnN0IGNoYXIqIHdoYXQpIHsKLSAgICBBTE9HRCgiJXMiLCB3aGF0KTsKLSAgICBBTE9HRCgiWyAlOWYgJTlmICU5ZiAlOWYgXSIsIG1bSSgwLDApXSwgbVtJKDEsMCldLCBtW0koMiwwKV0sIG1bSSgzLDApXSk7Ci0gICAgQUxPR0QoIlsgJTlmICU5ZiAlOWYgJTlmIF0iLCBtW0koMCwxKV0sIG1bSSgxLDEpXSwgbVtJKDIsMSldLCBtW0koMywxKV0pOwotICAgIEFMT0dEKCJbICU5ZiAlOWYgJTlmICU5ZiBdIiwgbVtJKDAsMildLCBtW0koMSwyKV0sIG1bSSgyLDIpXSwgbVtJKDMsMildKTsKLSAgICBBTE9HRCgiWyAlOWYgJTlmICU5ZiAlOWYgXSIsIG1bSSgwLDMpXSwgbVtJKDEsMyldLCBtW0koMiwzKV0sIG1bSSgzLDMpXSk7Ci19Ci0KLXZvaWQgbWF0cml4Zl90Ojpsb2FkSWRlbnRpdHkoKSB7Ci0gICAgbWVtY3B5KG0sIGdJZGVudGl0eWYsIHNpemVvZihtKSk7Ci19Ci0KLXZvaWQgbWF0cml4Zl90OjpzZXQoY29uc3QgR0xmaXhlZCogcmhzKSB7Ci0gICAgbG9hZChyaHMpOwotfQotCi12b2lkIG1hdHJpeGZfdDo6c2V0KGNvbnN0IEdMZmxvYXQqIHJocykgewotICAgIGxvYWQocmhzKTsKLX0KLQotdm9pZCBtYXRyaXhmX3Q6OmxvYWQoY29uc3QgR0xmaXhlZCogcmhzKSB7Ci0gICAgR0xmbG9hdCogZnAgPSBtOwotICAgIHVuc2lnbmVkIGludCBpID0gMTY7Ci0gICAgZG8gewotICAgICAgICAqZnArKyA9IGZpeGVkVG9GbG9hdCgqcmhzKyspOwotICAgIH0gd2hpbGUgKC0taSk7Ci19Ci0KLXZvaWQgbWF0cml4Zl90Ojpsb2FkKGNvbnN0IEdMZmxvYXQqIHJocykgewotICAgIG1lbWNweShtLCByaHMsIHNpemVvZihtKSk7Ci19Ci0KLXZvaWQgbWF0cml4Zl90Ojpsb2FkKGNvbnN0IG1hdHJpeGZfdCYgcmhzKSB7Ci0gICAgb3BlcmF0b3IgPSAocmhzKTsKLX0KLQotdm9pZCBtYXRyaXhmX3Q6Om11bHRpcGx5KGNvbnN0IG1hdHJpeGZfdCYgcmhzKSB7Ci0gICAgbWF0cml4Zl90IHI7Ci0gICAgbXVsdGlwbHkociwgKnRoaXMsIHJocyk7Ci0gICAgb3BlcmF0b3IgPSAocik7Ci19Ci0KLXZvaWQgbWF0cml4Zl90Ojp0cmFuc2xhdGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgewotICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgewotICAgICAgICBtWzEyK2ldICs9IG1baV0qeCArIG1bNCtpXSp5ICsgbVs4K2ldKno7Ci0gICAgfQotfQotCi12b2lkIG1hdHJpeGZfdDo6c2NhbGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgewotICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgewotICAgICAgICBtWyAgaV0gKj0geDsKLSAgICAgICAgbVs0K2ldICo9IHk7Ci0gICAgICAgIG1bOCtpXSAqPSB6OwotICAgIH0KLX0KLQotdm9pZCBtYXRyaXhmX3Q6OnJvdGF0ZShHTGZsb2F0IGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCi17Ci0gICAgbWF0cml4Zl90IHJvdGF0aW9uOwotICAgIEdMZmxvYXQqIHIgPSByb3RhdGlvbi5tOwotICAgIEdMZmxvYXQgYywgczsKLSAgICByWzNdID0gMDsgICByWzddID0gMDsgICByWzExXT0gMDsKLSAgICByWzEyXT0gMDsgICByWzEzXT0gMDsgICByWzE0XT0gMDsgICByWzE1XT0gMTsKLSAgICBhICo9IEdMZmxvYXQoTV9QSSAvIDE4MC4wZik7Ci0gICAgc2luY29zZihhLCAmcywgJmMpOwotICAgIGlmIChpc09uZWYoeCkgJiYgaXNaZXJvZih5KSAmJiBpc1plcm9mKHopKSB7Ci0gICAgICAgIHJbNV0gPSBjOyAgIHJbMTBdPSBjOwotICAgICAgICByWzZdID0gczsgICByWzldID0gLXM7Ci0gICAgICAgIHJbMV0gPSAwOyAgIHJbMl0gPSAwOwotICAgICAgICByWzRdID0gMDsgICByWzhdID0gMDsKLSAgICAgICAgclswXSA9IDE7Ci0gICAgfSBlbHNlIGlmIChpc1plcm9mKHgpICYmIGlzT25lZih5KSAmJiBpc1plcm9mKHopKSB7Ci0gICAgICAgIHJbMF0gPSBjOyAgIHJbMTBdPSBjOwotICAgICAgICByWzhdID0gczsgICByWzJdID0gLXM7Ci0gICAgICAgIHJbMV0gPSAwOyAgIHJbNF0gPSAwOwotICAgICAgICByWzZdID0gMDsgICByWzldID0gMDsKLSAgICAgICAgcls1XSA9IDE7Ci0gICAgfSBlbHNlIGlmIChpc1plcm9mKHgpICYmIGlzWmVyb2YoeSkgJiYgaXNPbmVmKHopKSB7Ci0gICAgICAgIHJbMF0gPSBjOyAgIHJbNV0gPSBjOwotICAgICAgICByWzFdID0gczsgICByWzRdID0gLXM7Ci0gICAgICAgIHJbMl0gPSAwOyAgIHJbNl0gPSAwOwotICAgICAgICByWzhdID0gMDsgICByWzldID0gMDsKLSAgICAgICAgclsxMF09IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgR0xmbG9hdCBsZW4gPSBzcXJ0Zih4KnggKyB5KnkgKyB6KnopOwotICAgICAgICBpZiAoIWlzT25lZihsZW4pKSB7Ci0gICAgICAgICAgICBjb25zdCBHTGZsb2F0IHJlY2lwTGVuID0gcmVjaXByb2NhbGYobGVuKTsKLSAgICAgICAgICAgIHggKj0gcmVjaXBMZW47Ci0gICAgICAgICAgICB5ICo9IHJlY2lwTGVuOwotICAgICAgICAgICAgeiAqPSByZWNpcExlbjsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBHTGZsb2F0IG5jID0gMS4wZiAtIGM7Ci0gICAgICAgIGNvbnN0IEdMZmxvYXQgeHkgPSB4ICogeTsKLSAgICAgICAgY29uc3QgR0xmbG9hdCB5eiA9IHkgKiB6OwotICAgICAgICBjb25zdCBHTGZsb2F0IHp4ID0geiAqIHg7Ci0gICAgICAgIGNvbnN0IEdMZmxvYXQgeHMgPSB4ICogczsKLSAgICAgICAgY29uc3QgR0xmbG9hdCB5cyA9IHkgKiBzOwotICAgICAgICBjb25zdCBHTGZsb2F0IHpzID0geiAqIHM7CQkKLSAgICAgICAgclsgMF0gPSB4KngqbmMgKyAgYzsgICAgclsgNF0gPSAgeHkqbmMgLSB6czsgICAgclsgOF0gPSAgengqbmMgKyB5czsKLSAgICAgICAgclsgMV0gPSAgeHkqbmMgKyB6czsgICAgclsgNV0gPSB5KnkqbmMgKyAgYzsgICAgclsgOV0gPSAgeXoqbmMgLSB4czsKLSAgICAgICAgclsgMl0gPSAgengqbmMgLSB5czsgICAgclsgNl0gPSAgeXoqbmMgKyB4czsgICAgclsxMF0gPSB6KnoqbmMgKyAgYzsKLSAgICB9Ci0gICAgbXVsdGlwbHkocm90YXRpb24pOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBtYXRyaXhfc3RhY2tfdAotI2VuZGlmCi0KLXZvaWQgbWF0cml4X3N0YWNrX3Q6OmluaXQoaW50IGRlcHRoKSB7Ci0gICAgc3RhY2sgPSBuZXcgbWF0cml4Zl90W2RlcHRoXTsKLSAgICBvcHMgPSBuZXcgdWludDhfdFtkZXB0aF07Ci0gICAgbWF4RGVwdGggPSBkZXB0aDsKLSAgICBkZXB0aCA9IDA7Ci0gICAgZGlydHkgPSAwOwotICAgIGxvYWRJZGVudGl0eSgpOwotfQotCi12b2lkIG1hdHJpeF9zdGFja190Ojp1bmluaXQoKSB7Ci0gICAgZGVsZXRlIFtdIHN0YWNrOwotICAgIGRlbGV0ZSBbXSBvcHM7Ci19Ci0KLXZvaWQgbWF0cml4X3N0YWNrX3Q6OmxvYWRJZGVudGl0eSgpIHsKLSAgICB0cmFuc2Zvcm0ubG9hZElkZW50aXR5KCk7Ci0gICAgc3RhY2tbZGVwdGhdLmxvYWRJZGVudGl0eSgpOwotICAgIG9wc1tkZXB0aF0gPSBPUF9JREVOVElUWTsKLX0KLQotdm9pZCBtYXRyaXhfc3RhY2tfdDo6bG9hZChjb25zdCBHTGZpeGVkKiByaHMpCi17ICAgCi0gICAgbWVtY3B5KHRyYW5zZm9ybS5tYXRyaXgubSwgcmhzLCBzaXplb2YodHJhbnNmb3JtLm1hdHJpeC5tKSk7Ci0gICAgc3RhY2tbZGVwdGhdLmxvYWQocmhzKTsKLSAgICBvcHNbZGVwdGhdID0gT1BfQUxMOyAgICAvLyBUT0RPOiB3ZSBzaG91bGQgbG9vayBhdCB0aGUgbWF0cml4Ci19Ci0KLXZvaWQgbWF0cml4X3N0YWNrX3Q6OmxvYWQoY29uc3QgR0xmbG9hdCogcmhzKQotewotICAgIHN0YWNrW2RlcHRoXS5sb2FkKHJocyk7Ci0gICAgb3BzW2RlcHRoXSA9IE9QX0FMTDsgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGxvb2sgYXQgdGhlIG1hdHJpeAotfQotCi12b2lkIG1hdHJpeF9zdGFja190OjptdWx0aXBseShjb25zdCBtYXRyaXhmX3QmIHJocykKLXsgICAgCi0gICAgc3RhY2tbZGVwdGhdLm11bHRpcGx5KHJocyk7Ci0gICAgb3BzW2RlcHRoXSA9IE9QX0FMTDsgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGxvb2sgYXQgdGhlIG1hdHJpeAotfQotCi12b2lkIG1hdHJpeF9zdGFja190Ojp0cmFuc2xhdGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKLXsKLSAgICBzdGFja1tkZXB0aF0udHJhbnNsYXRlKHgseSx6KTsKLSAgICBvcHNbZGVwdGhdIHw9IE9QX1RSQU5TTEFURTsKLX0KLQotdm9pZCBtYXRyaXhfc3RhY2tfdDo6c2NhbGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKLXsKLSAgICBzdGFja1tkZXB0aF0uc2NhbGUoeCx5LHopOwotICAgIGlmICh4PT15ICYmIHk9PXopIHsKLSAgICAgICAgb3BzW2RlcHRoXSB8PSBPUF9VTklGT1JNX1NDQUxFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9wc1tkZXB0aF0gfD0gT1BfU0NBTEU7Ci0gICAgfQotfQotCi12b2lkIG1hdHJpeF9zdGFja190Ojpyb3RhdGUoR0xmbG9hdCBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQotewotICAgIHN0YWNrW2RlcHRoXS5yb3RhdGUoYSx4LHkseik7Ci0gICAgb3BzW2RlcHRoXSB8PSBPUF9ST1RBVEU7Ci19Ci0KLXZvaWQgbWF0cml4X3N0YWNrX3Q6OnZhbGlkYXRlKCkKLXsKLSAgICBpZiAoZGlydHkgJiBET19GTE9BVF9UT19GSVhFRCkgewotICAgICAgICB0cmFuc2Zvcm0ubWF0cml4LmxvYWQodG9wKCkpOwotICAgIH0KLSAgICBpZiAoZGlydHkgJiBET19QSUNLRVIpIHsKLSAgICAgICAgdHJhbnNmb3JtLnBpY2tlcigpOwotICAgIH0KLSAgICBkaXJ0eSA9IDA7Ci19Ci0KLUdMaW50IG1hdHJpeF9zdGFja190OjpwdXNoKCkKLXsKLSAgICBpZiAoZGVwdGggPj0gKG1heERlcHRoLTEpKSB7Ci0gICAgICAgIHJldHVybiBHTF9TVEFDS19PVkVSRkxPVzsKLSAgICB9Ci0gICAgc3RhY2tbZGVwdGgrMV0gPSBzdGFja1tkZXB0aF07Ci0gICAgb3BzW2RlcHRoKzFdID0gb3BzW2RlcHRoXTsKLSAgICBkZXB0aCsrOwotICAgIHJldHVybiAwOwotfQotCi1HTGludCBtYXRyaXhfc3RhY2tfdDo6cG9wKCkKLXsKLSAgICBpZiAoZGVwdGggPT0gMCkgewotICAgICAgICByZXR1cm4gR0xfU1RBQ0tfVU5ERVJGTE9XOwotICAgIH0KLSAgICBkZXB0aC0tOwotICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayB2cF90cmFuc2Zvcm1fdAotI2VuZGlmCi0KLXZvaWQgdnBfdHJhbnNmb3JtX3Q6OmxvYWRJZGVudGl0eSgpIHsKLSAgICB0cmFuc2Zvcm0ubG9hZElkZW50aXR5KCk7Ci0gICAgbWF0cml4LmxvYWRJZGVudGl0eSgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayB0cmFuc2Zvcm1fc3RhdGVfdAotI2VuZGlmCi0KLXZvaWQgdHJhbnNmb3JtX3N0YXRlX3Q6OmludmFsaWRhdGUoKQotewotICAgIHN3aXRjaCAobWF0cml4TW9kZSkgewotICAgIGNhc2UgR0xfTU9ERUxWSUVXOiAgZGlydHkgfD0gTU9ERUxWSUVXICB8IE1WUCB8IE1WVUkgfCBNVklUOyAgICBicmVhazsKLSAgICBjYXNlIEdMX1BST0pFQ1RJT046IGRpcnR5IHw9IFBST0pFQ1RJT04gfCBNVlA7ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9URVhUVVJFOiAgICBkaXJ0eSB8PSBURVhUVVJFICAgIHwgTVZQOyAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjdXJyZW50LT5kaXJ0eSA9ICAgIG1hdHJpeF9zdGFja190OjpET19QSUNLRVIgfAotICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4X3N0YWNrX3Q6OkRPX0ZMT0FUX1RPX0ZJWEVEOwotfQotCi12b2lkIHRyYW5zZm9ybV9zdGF0ZV90Ojp1cGRhdGVfbXZwKCkKLXsKLSAgICBtYXRyaXhmX3QgdGVtcF9tdnA7Ci0gICAgbWF0cml4Zl90OjptdWx0aXBseSh0ZW1wX212cCwgcHJvamVjdGlvbi50b3AoKSwgbW9kZWx2aWV3LnRvcCgpKTsKLSAgICBtdnA0Lm1hdHJpeC5sb2FkKHRlbXBfbXZwKTsKLSAgICBtdnA0LnBpY2tlcigpOwotCi0gICAgaWYgKG12cDQuZmxhZ3MgJiB0cmFuc2Zvcm1fdDo6RkxBR1NfMkRfUFJPSkVDVElPTikgewotICAgICAgICAvLyB0aGUgbXZwIG1hdHJpeCBkb2Vzbid0IHRyYW5zZm9ybSBXLCBpbiB0aGlzIGNhc2Ugd2UgY2FuCi0gICAgICAgIC8vIHByZW11bHRpcGx5IGl0IHdpdGggdGhlIHZpZXdwb3J0IHRyYW5zZm9ybWF0aW9uLiBJbiBhZGRpdGlvbiB0bwotICAgICAgICAvLyBiZWluZyBtb3JlIGVmZmljaWVudCwgdGhpcyBpcyBhbHNvIG11Y2ggbW9yZSBhY2N1cmF0ZSBhbmQgaW4gZmFjdAotICAgICAgICAvLyBpcyBuZWVkZWQgZm9yIDJEIGRyYXdpbmcgd2l0aCBhIHJlc3VsdGluZyAxOjEgbWFwcGluZy4KLSAgICAgICAgbWF0cml4Zl90IG12cHY7Ci0gICAgICAgIG1hdHJpeGZfdDo6bXVsdGlwbHkobXZwdiwgdnB0Lm1hdHJpeCwgdGVtcF9tdnApOwotICAgICAgICBtdnAubWF0cml4LmxvYWQobXZwdik7Ci0gICAgICAgIG12cC5waWNrZXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtdnAgPSBtdnA0OwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSAKLUdMZmxvYXQgZGV0MjIoR0xmbG9hdCBhLCBHTGZsb2F0IGIsIEdMZmxvYXQgYywgR0xmbG9hdCBkKSB7Ci0gICAgcmV0dXJuIGEqZCAtIGIqYzsKLX0KLQotc3RhdGljIGlubGluZQotR0xmbG9hdCBuZGV0MjIoR0xmbG9hdCBhLCBHTGZsb2F0IGIsIEdMZmxvYXQgYywgR0xmbG9hdCBkKSB7Ci0gICAgcmV0dXJuIGIqYyAtIGEqZDsKLX0KLQotc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKLXZvaWQgaW52ZXJ0KEdMZmxvYXQqIGludmVyc2UsIGNvbnN0IEdMZmxvYXQqIHNyYykKLXsKLSAgICBkb3VibGUgdDsKLSAgICBpbnQgaSwgaiwgaywgc3dhcDsKLSAgICBHTGZsb2F0IHRtcFs0XVs0XTsKLSAgICAKLSAgICBtZW1jcHkoaW52ZXJzZSwgZ0lkZW50aXR5Ziwgc2l6ZW9mKGdJZGVudGl0eWYpKTsKLSAgICBtZW1jcHkodG1wLCBzcmMsIHNpemVvZihHTGZsb2F0KSoxNik7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAvLyBsb29rIGZvciBsYXJnZXN0IGVsZW1lbnQgaW4gY29sdW1uCi0gICAgICAgIHN3YXAgPSBpOwotICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IDQ7IGorKykgewotICAgICAgICAgICAgaWYgKGZhYnModG1wW2pdW2ldKSA+IGZhYnModG1wW2ldW2ldKSkgewotICAgICAgICAgICAgICAgIHN3YXAgPSBqOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoc3dhcCAhPSBpKSB7Ci0gICAgICAgICAgICAvKiBzd2FwIHJvd3MuICovCi0gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgdCA9IHRtcFtpXVtrXTsKLSAgICAgICAgICAgICAgICB0bXBbaV1ba10gPSB0bXBbc3dhcF1ba107Ci0gICAgICAgICAgICAgICAgdG1wW3N3YXBdW2tdID0gdDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0ID0gaW52ZXJzZVtpKjQra107Ci0gICAgICAgICAgICAgICAgaW52ZXJzZVtpKjQra10gPSBpbnZlcnNlW3N3YXAqNCtrXTsKLSAgICAgICAgICAgICAgICBpbnZlcnNlW3N3YXAqNCtrXSA9IHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHQgPSAxLjBmIC8gdG1wW2ldW2ldOwotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7Ci0gICAgICAgICAgICB0bXBbaV1ba10gKj0gdDsKLSAgICAgICAgICAgIGludmVyc2VbaSo0K2tdICo9IHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewotICAgICAgICAgICAgaWYgKGogIT0gaSkgewotICAgICAgICAgICAgICAgIHQgPSB0bXBbal1baV07Ci0gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICB0bXBbal1ba10gLT0gdG1wW2ldW2tdKnQ7Ci0gICAgICAgICAgICAgICAgICAgIGludmVyc2Vbaio0K2tdIC09IGludmVyc2VbaSo0K2tdKnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIHRyYW5zZm9ybV9zdGF0ZV90Ojp1cGRhdGVfbXZpdCgpCi17Ci0gICAgR0xmbG9hdCByWzE2XTsKLSAgICBjb25zdCBHTGZsb2F0KiBjb25zdCBtdiA9IG1vZGVsdmlldy50b3AoKS5lbGVtZW50cygpOwotICAgIGludmVydChyLCBtdik7Ci0gICAgLy8gY29udmVydCB0byBmaXhlZC1wb2ludCBhbmQgdHJhbnNwb3NlCi0gICAgR0xmaXhlZCogY29uc3QgeCA9IG12aXQ0Lm1hdHJpeC5tOwotICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykKLSAgICAgICAgZm9yIChpbnQgaj0wIDsgajw0IDsgaisrKQotICAgICAgICAgICAgeFtJKGksaildID0gZ2dsRmxvYXRUb0ZpeGVkKHJbSShqLGkpXSk7Ci0gICAgbXZpdDQucGlja2VyKCk7Ci19Ci0KLXZvaWQgdHJhbnNmb3JtX3N0YXRlX3Q6OnVwZGF0ZV9tdnVpKCkKLXsKLSAgICBHTGZsb2F0IHJbMTZdOwotICAgIGNvbnN0IEdMZmxvYXQqIGNvbnN0IG12ID0gbW9kZWx2aWV3LnRvcCgpLmVsZW1lbnRzKCk7Ci0gICAgCi0gICAgLyoKLSAgICBXaGVuIGV2YWx1YXRpbmcgdGhlIGxpZ2h0aW5nIGVxdWF0aW9uIGluIGV5ZS1zcGFjZSwgbm9ybWFscwotICAgIGFyZSB0cmFuc2Zvcm1lZCBieSB0aGUgdXBwZXIgM3gzIG1vZGVsdmlldyBpbnZlcnNlLXRyYW5zcG9zZS4KLSAgICBodHRwOi8vd3d3Lm9wZW5nbC5vcmcvZG9jdW1lbnRhdGlvbi9zcGVjcy92ZXJzaW9uMS4xL2dsc3BlYzEuMS9ub2RlMjYuaHRtbAotCi0gICAgKG5vdGUgdGhhdCBpbnZlcnNlLXRyYW5zcG9zZSBpcyBkaXN0cmlidXRpdmUpLgotICAgIEFsc28gbm90ZSB0aGF0OgotICAgICAgICBsKG9iaikgPSBpbnYobW9kZWx2aWV3KS5sKGV5ZSkgZm9yIGxvY2FsIGxpZ2h0Ci0gICAgICAgIGwob2JqKSA9ICB0cihtb2RlbHZpZXcpLmwoZXllKSBmb3IgaW5maW5pdGUgbGlnaHQKLSAgICAqLwotCi0gICAgaW52ZXJ0KHIsIG12KTsKLQotICAgIEdMZml4ZWQqIGNvbnN0IHggPSBtdnVpLm1hdHJpeC5tOwotCi0jaWYgT0JKRUNUX1NQQUNFX0xJR0hUSU5HCi0gICAgZm9yIChpbnQgaT0wIDsgaTw0IDsgaSsrKQotICAgICAgICBmb3IgKGludCBqPTAgOyBqPDQgOyBqKyspCi0gICAgICAgICAgICB4W0koaSxqKV0gPSBnZ2xGbG9hdFRvRml4ZWQocltJKGksaildKTsKLSNlbHNlCi0gICAgZm9yIChpbnQgaT0wIDsgaTw0IDsgaSsrKQotICAgICAgICBmb3IgKGludCBqPTAgOyBqPDQgOyBqKyspCi0gICAgICAgICAgICB4W0koaSxqKV0gPSBnZ2xGbG9hdFRvRml4ZWQocltJKGosaSldKTsKLSNlbmRpZgotCi0gICAgbXZ1aS5waWNrZXIoKTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB0cmFuc2Zvcm1hdGlvbiBhbmQgbWF0cmljZXMgQVBJCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayB0cmFuc2Zvcm1hdGlvbiBhbmQgbWF0cmljZXMgQVBJCi0jZW5kaWYKLQotaW50IG9nbGVzX3N1cmZhY2Vwb3J0KG9nbGVzX2NvbnRleHRfdCogYywgR0xpbnQgeCwgR0xpbnQgeSkKLXsKLSAgICBjLT52aWV3cG9ydC5zdXJmYWNlcG9ydC54ID0geDsKLSAgICBjLT52aWV3cG9ydC5zdXJmYWNlcG9ydC55ID0geTsKLQotICAgIG9nbGVzX3ZpZXdwb3J0KGMsIAotICAgICAgICAgICAgYy0+dmlld3BvcnQueCwKLSAgICAgICAgICAgIGMtPnZpZXdwb3J0LnksCi0gICAgICAgICAgICBjLT52aWV3cG9ydC53LAotICAgICAgICAgICAgYy0+dmlld3BvcnQuaCk7Ci0KLSAgICBvZ2xlc19zY2lzc29yKGMsCi0gICAgICAgICAgICBjLT52aWV3cG9ydC5zY2lzc29yLngsCi0gICAgICAgICAgICBjLT52aWV3cG9ydC5zY2lzc29yLnksCi0gICAgICAgICAgICBjLT52aWV3cG9ydC5zY2lzc29yLncsCi0gICAgICAgICAgICBjLT52aWV3cG9ydC5zY2lzc29yLmgpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgb2dsZXNfc2Npc3NvcihvZ2xlc19jb250ZXh0X3QqIGMsIAotICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCkKLXsKLSAgICBpZiAoKHd8aCkgPCAwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IueCA9IHg7Ci0gICAgYy0+dmlld3BvcnQuc2Npc3Nvci55ID0geTsKLSAgICBjLT52aWV3cG9ydC5zY2lzc29yLncgPSB3OwotICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IuaCA9IGg7Ci0gICAgCi0gICAgeCArPSBjLT52aWV3cG9ydC5zdXJmYWNlcG9ydC54OwotICAgIHkgKz0gYy0+dmlld3BvcnQuc3VyZmFjZXBvcnQueTsKLQotICAgIHkgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuaGVpZ2h0IC0gKHkgKyBoKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnNjaXNzb3IoYywgeCwgeSwgdywgaCk7Ci19Ci0KLXZvaWQgb2dsZXNfdmlld3BvcnQob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCkKLXsKLSAgICBpZiAoKHd8aCk8MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGMtPnZpZXdwb3J0LnggPSB4OwotICAgIGMtPnZpZXdwb3J0LnkgPSB5OwotICAgIGMtPnZpZXdwb3J0LncgPSB3OwotICAgIGMtPnZpZXdwb3J0LmggPSBoOwotCi0gICAgeCArPSBjLT52aWV3cG9ydC5zdXJmYWNlcG9ydC54OwotICAgIHkgKz0gYy0+dmlld3BvcnQuc3VyZmFjZXBvcnQueTsKLQotICAgIEdMaW50IEggPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuaGVpZ2h0OwotICAgIEdMZmxvYXQgc3ggPSBkaXYyZih3KTsKLSAgICBHTGZsb2F0IG94ID0gc3ggKyB4OwotICAgIEdMZmxvYXQgc3kgPSBkaXYyZihoKTsKLSAgICBHTGZsb2F0IG95ID0gc3kgLSB5ICsgKEggLSBoKTsKLQotICAgIEdMZmxvYXQgbmVhciA9IGMtPnRyYW5zZm9ybXMudnB0LnpOZWFyOwotICAgIEdMZmxvYXQgZmFyICA9IGMtPnRyYW5zZm9ybXMudnB0LnpGYXI7Ci0gICAgR0xmbG9hdCBBID0gZGl2MmYoZmFyIC0gbmVhcik7Ci0gICAgR0xmbG9hdCBCID0gZGl2MmYoZmFyICsgbmVhcik7Ci0KLSAgICAvLyBjb21wdXRlIHZpZXdwb3J0IG1hdHJpeAotICAgIEdMZmxvYXQqIGNvbnN0IGYgPSBjLT50cmFuc2Zvcm1zLnZwdC5tYXRyaXguZWRpdEVsZW1lbnRzKCk7Ci0gICAgZlswXSA9IHN4OyAgZls0XSA9IDA7ICAgZlsgOF0gPSAwOyAgZlsxMl0gPSBveDsKLSAgICBmWzFdID0gMDsgICBmWzVdID0tc3k7ICBmWyA5XSA9IDA7ICBmWzEzXSA9IG95OwotICAgIGZbMl0gPSAwOyAgIGZbNl0gPSAwOyAgIGZbMTBdID0gQTsgIGZbMTRdID0gQjsKLSAgICBmWzNdID0gMDsgICBmWzddID0gMDsgICBmWzExXSA9IDA7ICBmWzE1XSA9IDE7Ci0gICAgYy0+dHJhbnNmb3Jtcy5kaXJ0eSB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6VklFV1BPUlQ7Ci0gICAgaWYgKGMtPnRyYW5zZm9ybXMubXZwNC5mbGFncyAmIHRyYW5zZm9ybV90OjpGTEFHU18yRF9QUk9KRUNUSU9OKQotICAgICAgICBjLT50cmFuc2Zvcm1zLmRpcnR5IHw9IHRyYW5zZm9ybV9zdGF0ZV90OjpNVlA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIG1hdHJpeCAqIHZlcnRleAotI2VuZGlmCi0KLXZvaWQgcG9pbnQyX19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiBteCwgdmVjNF90KiBsaHMsIHZlYzRfdCBjb25zdCogcmhzKSB7Ci0gICAgY29uc3QgR0xmaXhlZCogY29uc3QgbSA9IG14LT5tYXRyaXgubTsKLSAgICBjb25zdCBHTGZpeGVkIHJ4ID0gcmhzLT54OwotICAgIGNvbnN0IEdMZml4ZWQgcnkgPSByaHMtPnk7Ci0gICAgbGhzLT54ID0gbWxhMmEocngsIG1bIDBdLCByeSwgbVsgNF0sIG1bMTJdKTsgCi0gICAgbGhzLT55ID0gbWxhMmEocngsIG1bIDFdLCByeSwgbVsgNV0sIG1bMTNdKTsKLSAgICBsaHMtPnogPSBtbGEyYShyeCwgbVsgMl0sIHJ5LCBtWyA2XSwgbVsxNF0pOwotICAgIGxocy0+dyA9IG1sYTJhKHJ4LCBtWyAzXSwgcnksIG1bIDddLCBtWzE1XSk7Ci19Ci0KLXZvaWQgcG9pbnQzX19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiBteCwgdmVjNF90KiBsaHMsIHZlYzRfdCBjb25zdCogcmhzKSB7Ci0gICAgY29uc3QgR0xmaXhlZCogY29uc3QgbSA9IG14LT5tYXRyaXgubTsKLSAgICBjb25zdCBHTGZpeGVkIHJ4ID0gcmhzLT54OwotICAgIGNvbnN0IEdMZml4ZWQgcnkgPSByaHMtPnk7Ci0gICAgY29uc3QgR0xmaXhlZCByeiA9IHJocy0+ejsKLSAgICBsaHMtPnggPSBtbGEzYShyeCwgbVsgMF0sIHJ5LCBtWyA0XSwgcnosIG1bIDhdLCBtWzEyXSk7IAotICAgIGxocy0+eSA9IG1sYTNhKHJ4LCBtWyAxXSwgcnksIG1bIDVdLCByeiwgbVsgOV0sIG1bMTNdKTsKLSAgICBsaHMtPnogPSBtbGEzYShyeCwgbVsgMl0sIHJ5LCBtWyA2XSwgcnosIG1bMTBdLCBtWzE0XSk7Ci0gICAgbGhzLT53ID0gbWxhM2EocngsIG1bIDNdLCByeSwgbVsgN10sIHJ6LCBtWzExXSwgbVsxNV0pOwotfQotCi12b2lkIHBvaW50NF9fZ2VuZXJpYyh0cmFuc2Zvcm1fdCBjb25zdCogbXgsIHZlYzRfdCogbGhzLCB2ZWM0X3QgY29uc3QqIHJocykgewotICAgIGNvbnN0IEdMZml4ZWQqIGNvbnN0IG0gPSBteC0+bWF0cml4Lm07Ci0gICAgY29uc3QgR0xmaXhlZCByeCA9IHJocy0+eDsKLSAgICBjb25zdCBHTGZpeGVkIHJ5ID0gcmhzLT55OwotICAgIGNvbnN0IEdMZml4ZWQgcnogPSByaHMtPno7Ci0gICAgY29uc3QgR0xmaXhlZCBydyA9IHJocy0+dzsKLSAgICBsaHMtPnggPSBtbGE0KHJ4LCBtWyAwXSwgcnksIG1bIDRdLCByeiwgbVsgOF0sIHJ3LCBtWzEyXSk7IAotICAgIGxocy0+eSA9IG1sYTQocngsIG1bIDFdLCByeSwgbVsgNV0sIHJ6LCBtWyA5XSwgcncsIG1bMTNdKTsKLSAgICBsaHMtPnogPSBtbGE0KHJ4LCBtWyAyXSwgcnksIG1bIDZdLCByeiwgbVsxMF0sIHJ3LCBtWzE0XSk7Ci0gICAgbGhzLT53ID0gbWxhNChyeCwgbVsgM10sIHJ5LCBtWyA3XSwgcnosIG1bMTFdLCBydywgbVsxNV0pOwotfQotCi12b2lkIHBvaW50M19fbXZ1aSh0cmFuc2Zvcm1fdCBjb25zdCogbXgsIHZlYzRfdCogbGhzLCB2ZWM0X3QgY29uc3QqIHJocykgewotICAgIC8vIHRoaXMgaXMgdXNlZCBmb3IgdHJhbnNmb3JtaW5nIGxpZ2h0IHBvc2l0aW9ucyBiYWNrIHRvIG9iamVjdCBzcGFjZS4KLSAgICAvLyB3IGlzIHVzZWQgYXMgYSBzd2l0Y2ggZm9yIGRpcmVjdGlvbmFsIGxpZ2h0cywgc28gd2UgbmVlZAotICAgIC8vIHRvIHByZXNlcnZlIGl0LgotICAgIGNvbnN0IEdMZml4ZWQqIGNvbnN0IG0gPSBteC0+bWF0cml4Lm07Ci0gICAgY29uc3QgR0xmaXhlZCByeCA9IHJocy0+eDsKLSAgICBjb25zdCBHTGZpeGVkIHJ5ID0gcmhzLT55OwotICAgIGNvbnN0IEdMZml4ZWQgcnogPSByaHMtPno7Ci0gICAgbGhzLT54ID0gbWxhMyhyeCwgbVsgMF0sIHJ5LCBtWyA0XSwgcnosIG1bIDhdKTsKLSAgICBsaHMtPnkgPSBtbGEzKHJ4LCBtWyAxXSwgcnksIG1bIDVdLCByeiwgbVsgOV0pOwotICAgIGxocy0+eiA9IG1sYTMocngsIG1bIDJdLCByeSwgbVsgNl0sIHJ6LCBtWzEwXSk7Ci0gICAgbGhzLT53ID0gMDsKLX0KLQotdm9pZCBwb2ludDRfX212dWkodHJhbnNmb3JtX3QgY29uc3QqIG14LCB2ZWM0X3QqIGxocywgdmVjNF90IGNvbnN0KiByaHMpIHsKLSAgICAvLyB0aGlzIGlzIHVzZWQgZm9yIHRyYW5zZm9ybWluZyBsaWdodCBwb3NpdGlvbnMgYmFjayB0byBvYmplY3Qgc3BhY2UuCi0gICAgLy8gdyBpcyB1c2VkIGFzIGEgc3dpdGNoIGZvciBkaXJlY3Rpb25hbCBsaWdodHMsIHNvIHdlIG5lZWQKLSAgICAvLyB0byBwcmVzZXJ2ZSBpdC4KLSAgICBjb25zdCBHTGZpeGVkKiBjb25zdCBtID0gbXgtPm1hdHJpeC5tOwotICAgIGNvbnN0IEdMZml4ZWQgcnggPSByaHMtPng7Ci0gICAgY29uc3QgR0xmaXhlZCByeSA9IHJocy0+eTsKLSAgICBjb25zdCBHTGZpeGVkIHJ6ID0gcmhzLT56OwotICAgIGNvbnN0IEdMZml4ZWQgcncgPSByaHMtPnc7Ci0gICAgbGhzLT54ID0gbWxhNChyeCwgbVsgMF0sIHJ5LCBtWyA0XSwgcnosIG1bIDhdLCBydywgbVsxMl0pOwotICAgIGxocy0+eSA9IG1sYTQocngsIG1bIDFdLCByeSwgbVsgNV0sIHJ6LCBtWyA5XSwgcncsIG1bMTNdKTsKLSAgICBsaHMtPnogPSBtbGE0KHJ4LCBtWyAyXSwgcnksIG1bIDZdLCByeiwgbVsxMF0sIHJ3LCBtWzE0XSk7Ci0gICAgbGhzLT53ID0gcnc7Ci19Ci0KLXZvaWQgcG9pbnQyX19ub3AodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGxocywgdmVjNF90IGNvbnN0KiByaHMpIHsKLSAgICBsaHMtPnogPSAwOwotICAgIGxocy0+dyA9IDB4MTAwMDA7Ci0gICAgaWYgKGxocyAhPSByaHMpIHsKLSAgICAgICAgbGhzLT54ID0gcmhzLT54OwotICAgICAgICBsaHMtPnkgPSByaHMtPnk7Ci0gICAgfQotfQotCi12b2lkIHBvaW50M19fbm9wKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBsaHMsIHZlYzRfdCBjb25zdCogcmhzKSB7Ci0gICAgbGhzLT53ID0gMHgxMDAwMDsKLSAgICBpZiAobGhzICE9IHJocykgewotICAgICAgICBsaHMtPnggPSByaHMtPng7Ci0gICAgICAgIGxocy0+eSA9IHJocy0+eTsKLSAgICAgICAgbGhzLT56ID0gcmhzLT56OwotICAgIH0KLX0KLQotdm9pZCBwb2ludDRfX25vcCh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogbGhzLCB2ZWM0X3QgY29uc3QqIHJocykgewotICAgIGlmIChsaHMgIT0gcmhzKQotICAgICAgICAqbGhzID0gKnJoczsKLX0KLQotCi1zdGF0aWMgdm9pZCBmcnVzdHVtZigKLSAgICAgICAgICAgIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgCi0gICAgICAgICAgICBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsCi0gICAgICAgICAgICBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIsCi0gICAgICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGMpCi0gICAgewotICAgIGlmIChjbXBmKGxlZnQscmlnaHQpIHx8Ci0gICAgICAgIGNtcGYodG9wLCBib3R0b20pIHx8Ci0gICAgICAgIGNtcGYoek5lYXIsIHpGYXIpIHx8Ci0gICAgICAgIGlzWmVyb09yTmVnYXRpdmVmKHpOZWFyKSB8fAotICAgICAgICBpc1plcm9Pck5lZ2F0aXZlZih6RmFyKSkKLSAgICB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNvbnN0IEdMZmxvYXQgcl93aWR0aCAgPSByZWNpcHJvY2FsZihyaWdodCAtIGxlZnQpOwotICAgIGNvbnN0IEdMZmxvYXQgcl9oZWlnaHQgPSByZWNpcHJvY2FsZih0b3AgLSBib3R0b20pOwotICAgIGNvbnN0IEdMZmxvYXQgcl9kZXB0aCAgPSByZWNpcHJvY2FsZih6TmVhciAtIHpGYXIpOwotICAgIGNvbnN0IEdMZmxvYXQgeCA9IG11bDJmKHpOZWFyICogcl93aWR0aCk7Ci0gICAgY29uc3QgR0xmbG9hdCB5ID0gbXVsMmYoek5lYXIgKiByX2hlaWdodCk7Ci0gICAgY29uc3QgR0xmbG9hdCBBID0gbXVsMmYoKHJpZ2h0ICsgbGVmdCkgKiByX3dpZHRoKTsKLSAgICBjb25zdCBHTGZsb2F0IEIgPSAodG9wICsgYm90dG9tKSAqIHJfaGVpZ2h0OwotICAgIGNvbnN0IEdMZmxvYXQgQyA9ICh6RmFyICsgek5lYXIpICogcl9kZXB0aDsKLSAgICBjb25zdCBHTGZsb2F0IEQgPSBtdWwyZih6RmFyICogek5lYXIgKiByX2RlcHRoKTsKLSAgICBHTGZsb2F0IGZbMTZdOwotICAgIGZbIDBdID0geDsKLSAgICBmWyA1XSA9IHk7Ci0gICAgZlsgOF0gPSBBOwotICAgIGZbIDldID0gQjsKLSAgICBmWzEwXSA9IEM7Ci0gICAgZlsxNF0gPSBEOwotICAgIGZbMTFdID0gLTEuMGY7Ci0gICAgZlsgMV0gPSBmWyAyXSA9IGZbIDNdID0KLSAgICBmWyA0XSA9IGZbIDZdID0gZlsgN10gPQotICAgIGZbMTJdID0gZlsxM10gPSBmWzE1XSA9IDAuMGY7Ci0KLSAgICBtYXRyaXhmX3QgcmhzOwotICAgIHJocy5zZXQoZik7Ci0gICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5tdWx0aXBseShyaHMpOwotICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOwotfQotCi1zdGF0aWMgdm9pZCBvcnRob2YoIAotICAgICAgICBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIAotICAgICAgICBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsCi0gICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciwKLSAgICAgICAgb2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGlmIChjbXBmKGxlZnQscmlnaHQpIHx8Ci0gICAgICAgIGNtcGYodG9wLCBib3R0b20pIHx8Ci0gICAgICAgIGNtcGYoek5lYXIsIHpGYXIpKQotICAgIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY29uc3QgR0xmbG9hdCByX3dpZHRoICA9IHJlY2lwcm9jYWxmKHJpZ2h0IC0gbGVmdCk7Ci0gICAgY29uc3QgR0xmbG9hdCByX2hlaWdodCA9IHJlY2lwcm9jYWxmKHRvcCAtIGJvdHRvbSk7Ci0gICAgY29uc3QgR0xmbG9hdCByX2RlcHRoICA9IHJlY2lwcm9jYWxmKHpGYXIgLSB6TmVhcik7Ci0gICAgY29uc3QgR0xmbG9hdCB4ID0gIG11bDJmKHJfd2lkdGgpOwotICAgIGNvbnN0IEdMZmxvYXQgeSA9ICBtdWwyZihyX2hlaWdodCk7Ci0gICAgY29uc3QgR0xmbG9hdCB6ID0gLW11bDJmKHJfZGVwdGgpOwotICAgIGNvbnN0IEdMZmxvYXQgdHggPSAtKHJpZ2h0ICsgbGVmdCkgKiByX3dpZHRoOwotICAgIGNvbnN0IEdMZmxvYXQgdHkgPSAtKHRvcCArIGJvdHRvbSkgKiByX2hlaWdodDsKLSAgICBjb25zdCBHTGZsb2F0IHR6ID0gLSh6RmFyICsgek5lYXIpICogcl9kZXB0aDsKLSAgICBHTGZsb2F0IGZbMTZdOwotICAgIGZbIDBdID0geDsKLSAgICBmWyA1XSA9IHk7Ci0gICAgZlsxMF0gPSB6OwotICAgIGZbMTJdID0gdHg7Ci0gICAgZlsxM10gPSB0eTsKLSAgICBmWzE0XSA9IHR6OwotICAgIGZbMTVdID0gMS4wZjsKLSAgICBmWyAxXSA9IGZbIDJdID0gZlsgM10gPQotICAgIGZbIDRdID0gZlsgNl0gPSBmWyA3XSA9Ci0gICAgZlsgOF0gPSBmWyA5XSA9IGZbMTFdID0gMC4wZjsKLSAgICBtYXRyaXhmX3QgcmhzOwotICAgIHJocy5zZXQoZik7Ci0gICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5tdWx0aXBseShyaHMpOwotICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOwotfQotCi1zdGF0aWMgdm9pZCBkZXB0aFJhbmdlZihHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhciwgb2dsZXNfY29udGV4dF90KiBjKQotewotICAgIHpOZWFyID0gY2xhbXBUb1plcm9mKHpOZWFyID4gMSA/IDEgOiB6TmVhcik7Ci0gICAgekZhciAgPSBjbGFtcFRvWmVyb2YoekZhciAgPiAxID8gMSA6IHpGYXIpOwotICAgIEdMZmxvYXQqIGNvbnN0IGYgPSBjLT50cmFuc2Zvcm1zLnZwdC5tYXRyaXguZWRpdEVsZW1lbnRzKCk7Ci0gICAgZlsxMF0gPSBkaXYyZih6RmFyIC0gek5lYXIpOwotICAgIGZbMTRdID0gZGl2MmYoekZhciArIHpOZWFyKTsKLSAgICBjLT50cmFuc2Zvcm1zLmRpcnR5IHw9IHRyYW5zZm9ybV9zdGF0ZV90OjpWSUVXUE9SVDsKLSAgICBjLT50cmFuc2Zvcm1zLnZwdC56TmVhciA9IHpOZWFyOwotICAgIGMtPnRyYW5zZm9ybXMudnB0LnpGYXIgID0gekZhcjsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotdm9pZCBnbE1hdHJpeE1vZGUoR0xlbnVtIG1vZGUpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBtYXRyaXhfc3RhY2tfdCogc3RhY2sgPSAwOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2UgR0xfTU9ERUxWSUVXOgotICAgICAgICBzdGFjayA9ICZjLT50cmFuc2Zvcm1zLm1vZGVsdmlldzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9QUk9KRUNUSU9OOgotICAgICAgICBzdGFjayA9ICZjLT50cmFuc2Zvcm1zLnByb2plY3Rpb247Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfVEVYVFVSRToKLSAgICAgICAgc3RhY2sgPSAmYy0+dHJhbnNmb3Jtcy50ZXh0dXJlW2MtPnRleHR1cmVzLmFjdGl2ZV07Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+dHJhbnNmb3Jtcy5tYXRyaXhNb2RlID0gbW9kZTsKLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQgPSBzdGFjazsKLX0KLQotdm9pZCBnbExvYWRJZGVudGl0eSgpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPmxvYWRJZGVudGl0eSgpOyAvLyBhbHNvIGxvYWRzIHRoZSBHTGZpeGVkIHRyYW5zZm9ybQotICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOwotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+ZGlydHkgPSAwOwotfQotCi12b2lkIGdsTG9hZE1hdHJpeGYoY29uc3QgR0xmbG9hdCogbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+bG9hZChtKTsKLSAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKLX0KLQotdm9pZCBnbExvYWRNYXRyaXh4KGNvbnN0IEdMZml4ZWQqIG0pCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPmxvYWQobSk7IC8vIGFsc28gbG9hZHMgdGhlIEdMZml4ZWQgdHJhbnNmb3JtCi0gICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5kaXJ0eSAmPSB+bWF0cml4X3N0YWNrX3Q6OkRPX0ZMT0FUX1RPX0ZJWEVEOwotfQotCi12b2lkIGdsTXVsdE1hdHJpeGYoY29uc3QgR0xmbG9hdCogbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIG1hdHJpeGZfdCByaHM7Ci0gICAgcmhzLnNldChtKTsKLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPm11bHRpcGx5KHJocyk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgZ2xNdWx0TWF0cml4eChjb25zdCBHTGZpeGVkKiBtKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgbWF0cml4Zl90IHJoczsKLSAgICByaHMuc2V0KG0pOwotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+bXVsdGlwbHkocmhzKTsKLSAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKLX0KLQotdm9pZCBnbFBvcE1hdHJpeCgpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBHTGludCBlcnIgPSBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnBvcCgpOwotICAgIGlmIChnZ2xfdW5saWtlbHkoZXJyKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOwotfQotCi12b2lkIGdsUHVzaE1hdHJpeCgpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBHTGludCBlcnIgPSBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnB1c2goKTsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGVycikpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKLX0KLQotdm9pZCBnbEZydXN0dW1mKAotICAgICAgICBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIAotICAgICAgICBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsCi0gICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGZydXN0dW1mKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIsIGMpOwotfQotCi12b2lkIGdsRnJ1c3R1bXgoIAotICAgICAgICBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsCi0gICAgICAgIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwKLSAgICAgICAgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgZnJ1c3R1bWYoIGZpeGVkVG9GbG9hdChsZWZ0KSwgZml4ZWRUb0Zsb2F0KHJpZ2h0KSwKLSAgICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KGJvdHRvbSksIGZpeGVkVG9GbG9hdCh0b3ApLAotICAgICAgICAgICAgICBmaXhlZFRvRmxvYXQoek5lYXIpLCBmaXhlZFRvRmxvYXQoekZhciksCi0gICAgICAgICAgICAgIGMpOwotfQotCi12b2lkIGdsT3J0aG9mKCAKLSAgICAgICAgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCAKLSAgICAgICAgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLAotICAgICAgICBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBvcnRob2YobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciwgYyk7Ci19Ci0KLXZvaWQgZ2xPcnRob3goCi0gICAgICAgIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwKLSAgICAgICAgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLAotICAgICAgICBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBvcnRob2YoIGZpeGVkVG9GbG9hdChsZWZ0KSwgZml4ZWRUb0Zsb2F0KHJpZ2h0KSwKLSAgICAgICAgICAgIGZpeGVkVG9GbG9hdChib3R0b20pLCBmaXhlZFRvRmxvYXQodG9wKSwKLSAgICAgICAgICAgIGZpeGVkVG9GbG9hdCh6TmVhciksIGZpeGVkVG9GbG9hdCh6RmFyKSwKLSAgICAgICAgICAgIGMpOwotfQotCi12b2lkIGdsUm90YXRlZihHTGZsb2F0IGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnJvdGF0ZShhLCB4LCB5LCB6KTsKLSAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKLX0KLQotdm9pZCBnbFJvdGF0ZXgoR0xmaXhlZCBhLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5yb3RhdGUoIAotICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KGEpLCBmaXhlZFRvRmxvYXQoeCksCi0gICAgICAgICAgICBmaXhlZFRvRmxvYXQoeSksIGZpeGVkVG9GbG9hdCh6KSk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgZ2xTY2FsZWYoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+c2NhbGUoeCwgeSwgeik7Ci0gICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgZ2xTY2FsZXgoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+c2NhbGUoCi0gICAgICAgICAgICBmaXhlZFRvRmxvYXQoeCksIGZpeGVkVG9GbG9hdCh5KSwgZml4ZWRUb0Zsb2F0KHopKTsKLSAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKLX0KLQotdm9pZCBnbFRyYW5zbGF0ZWYoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+dHJhbnNsYXRlKHgsIHksIHopOwotICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOwotfQotCi12b2lkIGdsVHJhbnNsYXRleChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT50cmFuc2xhdGUoCi0gICAgICAgICAgICBmaXhlZFRvRmxvYXQoeCksIGZpeGVkVG9GbG9hdCh5KSwgZml4ZWRUb0Zsb2F0KHopKTsKLSAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKLX0KLQotdm9pZCBnbFNjaXNzb3IoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3LCBHTHNpemVpIGgpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBvZ2xlc19zY2lzc29yKGMsIHgsIHksIHcsIGgpOwotfQotCi12b2lkIGdsVmlld3BvcnQoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3LCBHTHNpemVpIGgpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBvZ2xlc192aWV3cG9ydChjLCB4LCB5LCB3LCBoKTsKLX0KLQotdm9pZCBnbERlcHRoUmFuZ2VmKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgZGVwdGhSYW5nZWYoek5lYXIsIHpGYXIsIGMpOwotfQotCi12b2lkIGdsRGVwdGhSYW5nZXgoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBkZXB0aFJhbmdlZihmaXhlZFRvRmxvYXQoek5lYXIpLCBmaXhlZFRvRmxvYXQoekZhciksIGMpOwotfQotCi12b2lkIGdsUG9seWdvbk9mZnNldHgoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5wb2x5Z29uT2Zmc2V0LmZhY3RvciA9IGZhY3RvcjsKLSAgICBjLT5wb2x5Z29uT2Zmc2V0LnVuaXRzID0gdW5pdHM7Ci19Ci0KLXZvaWQgZ2xQb2x5Z29uT2Zmc2V0KEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cG9seWdvbk9mZnNldC5mYWN0b3IgPSBnZ2xGbG9hdFRvRml4ZWQoZmFjdG9yKTsKLSAgICBjLT5wb2x5Z29uT2Zmc2V0LnVuaXRzID0gZ2dsRmxvYXRUb0ZpeGVkKHVuaXRzKTsKLX0KLQotR0xiaXRmaWVsZCBnbFF1ZXJ5TWF0cml4eE9FUyhHTGZpeGVkKiBtLCBHTGludCogZSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIEdMYml0ZmllbGQgc3RhdHVzID0gMDsKLSAgICBHTGZsb2F0IGNvbnN0KiBmID0gYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT50b3AoKS5lbGVtZW50cygpOwotICAgIGZvciAgKGludCBpPTAgOyBpPDE2IDsgaSsrKSB7Ci0gICAgICAgIGlmIChpc25hbihmW2ldKSB8fCBpc2luZihmW2ldKSkgewotICAgICAgICAgICAgc3RhdHVzIHw9IDE8PGk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBlW2ldID0gZXhwb25lbnQoZltpXSkgLSA3OwotICAgICAgICBtW2ldID0gbWFudGlzc2EoZltpXSk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL21hdHJpeC5oIGIvb3BlbmdsL2xpYmFnbC9tYXRyaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhMzhhOS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL21hdHJpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvbWF0cml4LmgKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfTUFUUklYX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19NQVRSSVhfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL3BpeGVsZmxpbmdlci9nZ2xfY29udGV4dC5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNvbnN0IGludCBPR0xFU19NT0RFTFZJRVdfU1RBQ0tfREVQVEggICA9IDE2OwotY29uc3QgaW50IE9HTEVTX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggID0gIDI7Ci1jb25zdCBpbnQgT0dMRVNfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgPSAgMjsKLQotdm9pZCBvZ2xlc19pbml0X21hdHJpeChvZ2xlc19jb250ZXh0X3QqKTsKLXZvaWQgb2dsZXNfdW5pbml0X21hdHJpeChvZ2xlc19jb250ZXh0X3QqKTsKLXZvaWQgb2dsZXNfaW52YWxpZGF0ZV9wZXJzcGVjdGl2ZShvZ2xlc19jb250ZXh0X3QqIGMpOwotdm9pZCBvZ2xlc192YWxpZGF0ZV90cmFuc2Zvcm1faW1wbChvZ2xlc19jb250ZXh0X3QqIGMsIHVpbnQzMl90IHdhbnQpOwotCi1pbnQgb2dsZXNfc3VyZmFjZXBvcnQob2dsZXNfY29udGV4dF90KiBjLCBHTGludCB4LCBHTGludCB5KTsKLQotdm9pZCBvZ2xlc19zY2lzc29yKG9nbGVzX2NvbnRleHRfdCogYywgCi0gICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKTsKLQotdm9pZCBvZ2xlc192aWV3cG9ydChvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKTsKLQotaW5saW5lIHZvaWQgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtKAotICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGMsIHVpbnQzMl90IHdhbnQpCi17Ci0gICAgaWYgKGMtPnRyYW5zZm9ybXMuZGlydHkgJiB3YW50KQotICAgICAgICBvZ2xlc192YWxpZGF0ZV90cmFuc2Zvcm1faW1wbChjLCB3YW50KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbmxpbmUKLUdMZml4ZWQgdnNxdWFyZTMoR0xmaXhlZCBhLCBHTGZpeGVkIGIsIEdMZml4ZWQgYykgCi17Ci0jaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCi0KLSAgICBHTGZpeGVkIHI7Ci0gICAgaW50MzJfdCB0OwotICAgIGFzbSgKLSAgICAgICAgInNtdWxsICUwLCAlMSwgJTIsICUyICAgICAgIFxuIgotICAgICAgICAic21sYWwgJTAsICUxLCAlMywgJTMgICAgICAgXG4iCi0gICAgICAgICJzbWxhbCAlMCwgJTEsICU0LCAlNCAgICAgICBcbiIKLSAgICAgICAgIm1vdnMgICUwLCAlMCwgbHNyICMxNiAgICAgIFxuIgotICAgICAgICAiYWRjICAgJTAsICUwLCAlMSwgbHNsICMxNiAgXG4iCi0gICAgICAgIDogICAiPSZyIihyKSwgIj0mciIodCkgCi0gICAgICAgIDogICAiJXIiKGEpLCAiciIoYiksICJyIihjKQotICAgICAgICA6ICAgImNjIgotICAgICAgICApOyAKLSAgICByZXR1cm4gcjsKLQotI2Vsc2UKLQotICAgIHJldHVybiAoKCAgIGludDY0X3QoYSkqYSArCi0gICAgICAgICAgICAgICAgaW50NjRfdChiKSpiICsKLSAgICAgICAgICAgICAgICBpbnQ2NF90KGMpKmMgKyAweDgwMDApPj4xNik7Ci0KLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIEdMZml4ZWQgbWxhMmEoIEdMZml4ZWQgYTAsIEdMZml4ZWQgYjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwgR0xmaXhlZCBiMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGMpCi17Ci0jaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgR0xmaXhlZCByOwotICAgIGludDMyX3QgdDsKLSAgICBhc20oCi0gICAgICAgICJzbXVsbCAlMCwgJTEsICUyLCAlMyAgICAgICBcbiIKLSAgICAgICAgInNtbGFsICUwLCAlMSwgJTQsICU1ICAgICAgIFxuIgotICAgICAgICAiYWRkICAgJTAsICU2LCAlMCwgbHNyICMxNiAgXG4iCi0gICAgICAgICJhZGQgICAlMCwgJTAsICUxLCBsc2wgIzE2ICBcbiIKLSAgICAgICAgOiAgICI9JnIiKHIpLCAiPSZyIih0KSAKLSAgICAgICAgOiAgICIlciIoYTApLCAiciIoYjApLCAKLSAgICAgICAgICAgICIlciIoYTEpLCAiciIoYjEpLAotICAgICAgICAgICAgInIiKGMpCi0gICAgICAgIDoKLSAgICAgICAgKTsgCi0gICAgcmV0dXJuIHI7Ci0gICAgCi0jZWxzZQotCi0gICAgcmV0dXJuICgoICAgaW50NjRfdChhMCkqYjAgKwotICAgICAgICAgICAgICAgIGludDY0X3QoYTEpKmIxKT4+MTYpICsgYzsKLQotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgR0xmaXhlZCBtbGEzYSggR0xmaXhlZCBhMCwgR0xmaXhlZCBiMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwgR0xmaXhlZCBiMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMiwgR0xmaXhlZCBiMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBjKQotewotI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEdMZml4ZWQgcjsKLSAgICBpbnQzMl90IHQ7Ci0gICAgYXNtKAotICAgICAgICAic211bGwgJTAsICUxLCAlMiwgJTMgICAgICAgXG4iCi0gICAgICAgICJzbWxhbCAlMCwgJTEsICU0LCAlNSAgICAgICBcbiIKLSAgICAgICAgInNtbGFsICUwLCAlMSwgJTYsICU3ICAgICAgIFxuIgotICAgICAgICAiYWRkICAgJTAsICU4LCAlMCwgbHNyICMxNiAgXG4iCi0gICAgICAgICJhZGQgICAlMCwgJTAsICUxLCBsc2wgIzE2ICBcbiIKLSAgICAgICAgOiAgICI9JnIiKHIpLCAiPSZyIih0KSAKLSAgICAgICAgOiAgICIlciIoYTApLCAiciIoYjApLAotICAgICAgICAgICAgIiVyIihhMSksICJyIihiMSksCi0gICAgICAgICAgICAiJXIiKGEyKSwgInIiKGIyKSwKLSAgICAgICAgICAgICJyIihjKQotICAgICAgICA6Ci0gICAgICAgICk7IAotICAgIHJldHVybiByOwotICAgIAotI2Vsc2UKLQotICAgIHJldHVybiAoKCAgIGludDY0X3QoYTApKmIwICsKLSAgICAgICAgICAgICAgICBpbnQ2NF90KGExKSpiMSArCi0gICAgICAgICAgICAgICAgaW50NjRfdChhMikqYjIpPj4xNikgKyBjOwotCi0jZW5kaWYKLX0KLQotLy8gYjAsIGIxLCBiMiBhcmUgc2lnbmVkIDE2LWJpdCBxdWFuaXRpZXMKLS8vIHRoYXQgaGF2ZSBiZWVuIHNoaWZ0ZWQgcmlnaHQgYnkgJ3NoaWZ0JyBiaXRzIHJlbGF0aXZlIHRvIG5vcm1hbAotLy8gUzE2LjE2IGZpeGVkIHBvaW50Ci1zdGF0aWMgaW5saW5lIEdMZml4ZWQgbWxhM2ExNiggR0xmaXhlZCBhMCwgaW50MzJfdCBiMWIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMiwgaW50MzJfdCBiMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBzaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGMpCi17Ci0jaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgR0xmaXhlZCByOwotICAgIGFzbSgKLSAgICAgICAgInNtdWx3YiAlMCwgJTEsICUyICAgICAgICAgIFxuIgotICAgICAgICAic21sYXd0ICUwLCAlMywgJTIsICUwICAgICAgXG4iIAotICAgICAgICAic21sYXdiICUwLCAlNCwgJTUsICUwICAgICAgXG4iCi0gICAgICAgICJhZGQgICAgJTAsICU3LCAlMCwgbHNsICU2ICBcbiIKLSAgICAgICAgOiAgICI9JnIiKHIpCi0gICAgICAgIDogICAiciIoYTApLCAiciIoYjFiMCksCi0gICAgICAgICAgICAiciIoYTEpLAotICAgICAgICAgICAgInIiKGEyKSwgInIiKGIyKSwKLSAgICAgICAgICAgICJyIihzaGlmdCksCi0gICAgICAgICAgICAiciIoYykKLSAgICAgICAgOgotICAgICAgICApOyAKLSAgICByZXR1cm4gcjsKLSAgICAKLSNlbHNlCi0KLSAgICBpbnQzMl90IGFjY3VtOwotICAgIGludDE2X3QgYjAgPSBiMWIwICYgMHhmZmZmOwotICAgIGludDE2X3QgYjEgPSAoYjFiMCA+PiAxNikgJiAweGZmZmY7Ci0gICAgYWNjdW0gID0gaW50NjRfdChhMCkqaW50MTZfdChiMCkgPj4gMTY7Ci0gICAgYWNjdW0gKz0gaW50NjRfdChhMSkqaW50MTZfdChiMSkgPj4gMTY7Ci0gICAgYWNjdW0gKz0gaW50NjRfdChhMikqaW50MTZfdChiMikgPj4gMTY7Ci0gICAgYWNjdW0gPSAoYWNjdW0gPDwgc2hpZnQpICsgYzsKLSAgICByZXR1cm4gYWNjdW07Ci0KLSNlbmRpZgotfQotCi0KLXN0YXRpYyBpbmxpbmUgR0xmaXhlZCBtbGEzYTE2X2J0YiggR0xmaXhlZCBhMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiMWIwLCBpbnQzMl90IHh4YjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGMpCi17Ci0jaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgR0xmaXhlZCByOwotICAgIGFzbSgKLSAgICAgICAgInNtdWx3YiAlMCwgJTEsICU0ICAgICAgICAgIFxuIgotICAgICAgICAic21sYXd0ICUwLCAlMiwgJTQsICUwICAgICAgXG4iIAotICAgICAgICAic21sYXdiICUwLCAlMywgJTUsICUwICAgICAgXG4iCi0gICAgICAgICJhZGQgICAgJTAsICU3LCAlMCwgbHNsICU2ICBcbiIKLSAgICAgICAgOiAgICI9JnIiKHIpCi0gICAgICAgIDogICAiciIoYTApLAotICAgICAgICAgICAgInIiKGExKSwKLSAgICAgICAgICAgICJyIihhMiksCi0gICAgICAgICAgICAiciIoYjFiMCksICJyIih4eGIyKSwKLSAgICAgICAgICAgICJyIihzaGlmdCksCi0gICAgICAgICAgICAiciIoYykKLSAgICAgICAgOgotICAgICAgICApOyAKLSAgICByZXR1cm4gcjsKLSAgICAKLSNlbHNlCi0KLSAgICBpbnQzMl90IGFjY3VtOwotICAgIGludDE2X3QgYjAgPSAgYjFiMCAgICAgICAgJiAweGZmZmY7Ci0gICAgaW50MTZfdCBiMSA9IChiMWIwID4+IDE2KSAmIDB4ZmZmZjsKLSAgICBpbnQxNl90IGIyID0gIHh4YjIgICAgICAgICYgMHhmZmZmOwotICAgIGFjY3VtICA9IGludDY0X3QoYTApKmludDE2X3QoYjApID4+IDE2OwotICAgIGFjY3VtICs9IGludDY0X3QoYTEpKmludDE2X3QoYjEpID4+IDE2OwotICAgIGFjY3VtICs9IGludDY0X3QoYTIpKmludDE2X3QoYjIpID4+IDE2OwotICAgIGFjY3VtID0gKGFjY3VtIDw8IHNoaWZ0KSArIGM7Ci0gICAgcmV0dXJuIGFjY3VtOwotCi0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTNhMTZfYnR0KCBHTGZpeGVkIGEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGIxYjAsIGludDMyX3QgYjJ4eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgc2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYykKLXsKLSNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBHTGZpeGVkIHI7Ci0gICAgYXNtKAotICAgICAgICAic211bHdiICUwLCAlMSwgJTQgICAgICAgICAgXG4iCi0gICAgICAgICJzbWxhd3QgJTAsICUyLCAlNCwgJTAgICAgICBcbiIgCi0gICAgICAgICJzbWxhd3QgJTAsICUzLCAlNSwgJTAgICAgICBcbiIKLSAgICAgICAgImFkZCAgICAlMCwgJTcsICUwLCBsc2wgJTYgIFxuIgotICAgICAgICA6ICAgIj0mciIocikKLSAgICAgICAgOiAgICJyIihhMCksCi0gICAgICAgICAgICAiciIoYTEpLAotICAgICAgICAgICAgInIiKGEyKSwKLSAgICAgICAgICAgICJyIihiMWIwKSwgInIiKGIyeHgpLAotICAgICAgICAgICAgInIiKHNoaWZ0KSwKLSAgICAgICAgICAgICJyIihjKQotICAgICAgICA6Ci0gICAgICAgICk7IAotICAgIHJldHVybiByOwotICAgIAotI2Vsc2UKLQotICAgIGludDMyX3QgYWNjdW07Ci0gICAgaW50MTZfdCBiMCA9ICBiMWIwICAgICAgICAmIDB4ZmZmZjsKLSAgICBpbnQxNl90IGIxID0gKGIxYjAgPj4gMTYpICYgMHhmZmZmOwotICAgIGludDE2X3QgYjIgPSAoYjJ4eCA+PiAxNikgJiAweGZmZmY7Ci0gICAgYWNjdW0gID0gaW50NjRfdChhMCkqaW50MTZfdChiMCkgPj4gMTY7Ci0gICAgYWNjdW0gKz0gaW50NjRfdChhMSkqaW50MTZfdChiMSkgPj4gMTY7Ci0gICAgYWNjdW0gKz0gaW50NjRfdChhMikqaW50MTZfdChiMikgPj4gMTY7Ci0gICAgYWNjdW0gPSAoYWNjdW0gPDwgc2hpZnQpICsgYzsKLSAgICByZXR1cm4gYWNjdW07Ci0KLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIEdMZml4ZWQgbWxhMyggR0xmaXhlZCBhMCwgR0xmaXhlZCBiMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGExLCBHTGZpeGVkIGIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTIsIEdMZml4ZWQgYjIpCi17Ci0jaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgR0xmaXhlZCByOwotICAgIGludDMyX3QgdDsKLSAgICBhc20oCi0gICAgICAgICJzbXVsbCAlMCwgJTEsICUyLCAlMyAgICAgICBcbiIKLSAgICAgICAgInNtbGFsICUwLCAlMSwgJTQsICU1ICAgICAgIFxuIgotICAgICAgICAic21sYWwgJTAsICUxLCAlNiwgJTcgICAgICAgXG4iCi0gICAgICAgICJtb3ZzICAlMCwgJTAsIGxzciAjMTYgICAgICBcbiIKLSAgICAgICAgImFkYyAgICUwLCAlMCwgJTEsIGxzbCAjMTYgIFxuIgotICAgICAgICA6ICAgIj0mciIociksICI9JnIiKHQpIAotICAgICAgICA6ICAgIiVyIihhMCksICJyIihiMCksCi0gICAgICAgICAgICAiJXIiKGExKSwgInIiKGIxKSwKLSAgICAgICAgICAgICIlciIoYTIpLCAiciIoYjIpCi0gICAgICAgIDogICAiY2MiCi0gICAgICAgICk7IAotICAgIHJldHVybiByOwotICAgIAotI2Vsc2UKLQotICAgIHJldHVybiAoKCAgIGludDY0X3QoYTApKmIwICsKLSAgICAgICAgICAgICAgICBpbnQ2NF90KGExKSpiMSArCi0gICAgICAgICAgICAgICAgaW50NjRfdChhMikqYjIgKyAweDgwMDApPj4xNik7Ci0KLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIEdMZml4ZWQgbWxhNCggR0xmaXhlZCBhMCwgR0xmaXhlZCBiMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGExLCBHTGZpeGVkIGIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTIsIEdMZml4ZWQgYjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMywgR0xmaXhlZCBiMykKLXsKLSNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBHTGZpeGVkIHI7Ci0gICAgaW50MzJfdCB0OwotICAgIGFzbSgKLSAgICAgICAgInNtdWxsICUwLCAlMSwgJTIsICUzICAgICAgIFxuIgotICAgICAgICAic21sYWwgJTAsICUxLCAlNCwgJTUgICAgICAgXG4iCi0gICAgICAgICJzbWxhbCAlMCwgJTEsICU2LCAlNyAgICAgICBcbiIKLSAgICAgICAgInNtbGFsICUwLCAlMSwgJTgsICU5ICAgICAgIFxuIgotICAgICAgICAibW92cyAgJTAsICUwLCBsc3IgIzE2ICAgICAgXG4iCi0gICAgICAgICJhZGMgICAlMCwgJTAsICUxLCBsc2wgIzE2ICBcbiIKLSAgICAgICAgOiAgICI9JnIiKHIpLCAiPSZyIih0KSAKLSAgICAgICAgOiAgICIlciIoYTApLCAiciIoYjApLAotICAgICAgICAgICAgIiVyIihhMSksICJyIihiMSksCi0gICAgICAgICAgICAiJXIiKGEyKSwgInIiKGIyKSwKLSAgICAgICAgICAgICIlciIoYTMpLCAiciIoYjMpCi0gICAgICAgIDogICAiY2MiCi0gICAgICAgICk7IAotICAgIHJldHVybiByOwotICAgIAotI2Vsc2UKLQotICAgIHJldHVybiAoKCAgIGludDY0X3QoYTApKmIwICsKLSAgICAgICAgICAgICAgICBpbnQ2NF90KGExKSpiMSArCi0gICAgICAgICAgICAgICAgaW50NjRfdChhMikqYjIgKwotICAgICAgICAgICAgICAgIGludDY0X3QoYTMpKmIzICsgMHg4MDAwKT4+MTYpOwotCi0jZW5kaWYKLX0KLQotaW5saW5lCi1HTGZpeGVkIGRvdDQoY29uc3QgR0xmaXhlZCogYSwgY29uc3QgR0xmaXhlZCogYikgCi17Ci0gICAgcmV0dXJuIG1sYTQoYVswXSwgYlswXSwgYVsxXSwgYlsxXSwgYVsyXSwgYlsyXSwgYVszXSwgYlszXSk7Ci19Ci0KLQotaW5saW5lCi1HTGZpeGVkIGRvdDMoY29uc3QgR0xmaXhlZCogYSwgY29uc3QgR0xmaXhlZCogYikgCi17Ci0gICAgcmV0dXJuIG1sYTMoYVswXSwgYlswXSwgYVsxXSwgYlsxXSwgYVsyXSwgYlsyXSk7Ci19Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfTUFUUklYX0gKLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9taXBtYXAuY3BwIGIvb3BlbmdsL2xpYmFnbC9taXBtYXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTQyYTU4Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvbWlwbWFwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL21pcG1hcC5jcHAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJzdGF0ZS5oIgotI2luY2x1ZGUgInRleHR1cmUuaCIKLSNpbmNsdWRlICJUZXh0dXJlT2JqZWN0TWFuYWdlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgYnVpbGRBUHlyYW1pZChvZ2xlc19jb250ZXh0X3QqIGMsIEVHTFRleHR1cmVPYmplY3QqIHRleCkKLXsKLSAgICBpbnQgbGV2ZWwgPSAwOwotICAgIGNvbnN0IEdHTFN1cmZhY2UqIGJhc2UgPSAmdGV4LT5zdXJmYWNlOyAgICAKLSAgICBjb25zdCBHR0xGb3JtYXQmIHBpeGVsRm9ybWF0KGMtPnJhc3Rlcml6ZXIuZm9ybWF0c1tiYXNlLT5mb3JtYXRdKTsKLQotICAgIGludCB3ID0gYmFzZS0+d2lkdGg7Ci0gICAgaW50IGggPSBiYXNlLT5oZWlnaHQ7Ci0gICAgaWYgKCh3JmgpID09IDEpCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLQotICAgIHcgPSAodz4+MSkgPyA6IDE7Ci0gICAgaCA9IChoPj4xKSA/IDogMTsKLQotICAgIHdoaWxlKHRydWUpIHsKLSAgICAgICAgKytsZXZlbDsKLSAgICAgICAgY29uc3QgaW50IGJwciA9IHcgKiBwaXhlbEZvcm1hdC5zaXplOwotICAgICAgICBpZiAodGV4LT5yZWFsbG9jYXRlKGxldmVsLCB3LCBoLCB3LAotICAgICAgICAgICAgICAgIGJhc2UtPmZvcm1hdCwgYmFzZS0+Y29tcHJlc3NlZEZvcm1hdCwgYnByKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBpbnQgc3RyaWRlID0gdzsKLSAgICAgICAgaW50IGJzID0gYmFzZS0+c3RyaWRlOwotICAgICAgICBHR0xTdXJmYWNlJiBjdXIgPSB0ZXgtPmVkaXRNaXAobGV2ZWwpOwotCi0gICAgICAgIGlmIChiYXNlLT5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1KQotICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MTZfdCBjb25zdCAqIHNyYyA9ICh1aW50MTZfdCBjb25zdCAqKWJhc2UtPmRhdGE7Ci0gICAgICAgICAgICB1aW50MTZfdCogZHN0ID0gKHVpbnQxNl90KiljdXIuZGF0YTsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSAweDA3RTBGODFGOwotICAgICAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoIDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9ICh5KjIpICogYnM7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3IDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tvZmZzZXRdOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbb2Zmc2V0KzFdOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbb2Zmc2V0K2JzXTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW29mZnNldCticysxXTsKLSAgICAgICAgICAgICAgICAgICAgcDAwID0gKHAwMCB8IChwMDAgPDwgMTYpKSAmIG1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHAwMSA9IChwMDEgfCAocDAxIDw8IDE2KSkgJiBtYXNrOwotICAgICAgICAgICAgICAgICAgICBwMTAgPSAocDEwIHwgKHAxMCA8PCAxNikpICYgbWFzazsKLSAgICAgICAgICAgICAgICAgICAgcDExID0gKHAxMSB8IChwMTEgPDwgMTYpKSAmIG1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdyYiA9ICgocDAwICsgcDEwICsgcDAxICsgcDExKSA+PiAyKSAmIG1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJnYiA9IChncmIgJiAweEZGRkYpIHwgKGdyYiA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdID0gcmdiOwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MTZfdCBjb25zdCAqIHNyYyA9ICh1aW50MTZfdCBjb25zdCAqKWJhc2UtPmRhdGE7Ci0gICAgICAgICAgICB1aW50MTZfdCogZHN0ID0gKHVpbnQxNl90KiljdXIuZGF0YTsKLSAgICAgICAgICAgIGZvciAoaW50IHk9MCA7IHk8aCA7IHkrKykgewotICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAoeSoyKSAqIGJzOwotICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8dyA7IHgrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDAgPSBzcmNbb2Zmc2V0XTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDEwID0gc3JjW29mZnNldCsxXTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDAxID0gc3JjW29mZnNldCtic107Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAxMSA9IHNyY1tvZmZzZXQrYnMrMV07Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHIgPSAoKHAwMD4+MTEpKyhwMTA+PjExKSsocDAxPj4xMSkrKHAxMT4+MTEpKzIpPj4yOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnID0gKCgocDAwPj42KSsocDEwPj42KSsocDAxPj42KSsocDExPj42KSsyKT4+MikmMHgzRjsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYiA9ICgocDAwJjB4M0UpKyhwMTAmMHgzRSkrKHAwMSYweDNFKSsocDExJjB4M0UpKzQpPj4zOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhID0gKChwMDAmMSkrKHAxMCYxKSsocDAxJjEpKyhwMTEmMSkrMik+PjI7Ci0gICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdID0gKHI8PDExKXwoZzw8Nil8KGI8PDEpfGE7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChiYXNlLT5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGNvbnN0ICogc3JjID0gKHVpbnQzMl90IGNvbnN0ICopYmFzZS0+ZGF0YTsKLSAgICAgICAgICAgIHVpbnQzMl90KiBkc3QgPSAodWludDMyX3QqKWN1ci5kYXRhOwotICAgICAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoIDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9ICh5KjIpICogYnM7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3IDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tvZmZzZXRdOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbb2Zmc2V0KzFdOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbb2Zmc2V0K2JzXTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW29mZnNldCticysxXTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmIwMCA9IHAwMCAmIDB4MDBGRjAwRkY7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJiMDEgPSBwMDEgJiAweDAwRkYwMEZGOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYjEwID0gcDEwICYgMHgwMEZGMDBGRjsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmIxMSA9IHAxMSAmIDB4MDBGRjAwRkY7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdhMDAgPSAocDAwID4+IDgpICYgMHgwMEZGMDBGRjsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2EwMSA9IChwMDEgPj4gOCkgJiAweDAwRkYwMEZGOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnYTEwID0gKHAxMCA+PiA4KSAmIDB4MDBGRjAwRkY7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdhMTEgPSAocDExID4+IDgpICYgMHgwMEZGMDBGRjsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmIgPSAocmIwMCArIHJiMDEgKyByYjEwICsgcmIxMSk+PjI7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdhID0gKGdhMDAgKyBnYTAxICsgZ2ExMCArIGdhMTEpPj4yOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZ2JhID0gKHJiICYgMHgwMEZGMDBGRikgfCAoKGdhICYgMHgwMEZGMDBGRik8PDgpOwotICAgICAgICAgICAgICAgICAgICBkc3RbeCArIHkqc3RyaWRlXSA9IHJnYmE7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCkgfHwKLSAgICAgICAgICAgICAgICAgKGJhc2UtPmZvcm1hdCA9PSBHR0xfUElYRUxfRk9STUFUX0xBXzg4KSB8fAotICAgICAgICAgICAgICAgICAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfQV84KSB8fAotICAgICAgICAgICAgICAgICAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfTF84KSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHNraXA7Ci0gICAgICAgICAgICBzd2l0Y2ggKGJhc2UtPmZvcm1hdCkgewotICAgICAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQl84ODg6ICBza2lwID0gMzsgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9MQV84ODogICAgc2tpcCA9IDI7ICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxOyAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDhfdCBjb25zdCAqIHNyYyA9ICh1aW50OF90IGNvbnN0ICopYmFzZS0+ZGF0YTsKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCA9ICh1aW50OF90KiljdXIuZGF0YTsgICAgICAgICAgICAKLSAgICAgICAgICAgIGJzICo9IHNraXA7Ci0gICAgICAgICAgICBzdHJpZGUgKj0gc2tpcDsKLSAgICAgICAgICAgIGZvciAoaW50IHk9MCA7IHk8aCA7IHkrKykgewotICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAoeSoyKSAqIGJzOwotICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8dyA7IHgrKykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjPTAgOyBjPHNraXAgOyBjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tjK29mZnNldF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbYytvZmZzZXQrc2tpcF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbYytvZmZzZXQrYnNdOwotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW2Mrb2Zmc2V0K2JzK3NraXBdOwotICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyB5KnN0cmlkZSArIGNdID0gKHAwMCArIHAxMCArIHAwMSArIHAxMSkgPj4gMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMipza2lwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChiYXNlLT5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQxNl90IGNvbnN0ICogc3JjID0gKHVpbnQxNl90IGNvbnN0ICopYmFzZS0+ZGF0YTsKLSAgICAgICAgICAgIHVpbnQxNl90KiBkc3QgPSAodWludDE2X3QqKWN1ci5kYXRhOwotICAgICAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoIDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9ICh5KjIpICogYnM7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3IDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tvZmZzZXRdOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbb2Zmc2V0KzFdOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbb2Zmc2V0K2JzXTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW29mZnNldCticysxXTsKLSAgICAgICAgICAgICAgICAgICAgcDAwID0gKChwMDAgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDAwICYgMHgwRjBGKTsKLSAgICAgICAgICAgICAgICAgICAgcDEwID0gKChwMTAgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDEwICYgMHgwRjBGKTsKLSAgICAgICAgICAgICAgICAgICAgcDAxID0gKChwMDEgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDAxICYgMHgwRjBGKTsKLSAgICAgICAgICAgICAgICAgICAgcDExID0gKChwMTEgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDExICYgMHgwRjBGKTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmJnYSA9IChwMDAgKyBwMTAgKyBwMDEgKyBwMTEpID4+IDI7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJnYmEgPSAocmJnYSAmIDB4MEYwRikgfCAoKHJiZ2E+PjEyKSAmIDB4RjBGMCk7Ci0gICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdID0gcmdiYTsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGZvcm1hdCAoJWQpIiwgYmFzZS0+Zm9ybWF0KTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVFlQRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGV4aXQgY29uZGl0aW9uOiB3ZSBqdXN0IHByb2Nlc3NlZCB0aGUgMXgxIExPRHMKLSAgICAgICAgaWYgKCh3JmgpID09IDEpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBiYXNlID0gJmN1cjsKLSAgICAgICAgdyA9ICh3Pj4xKSA/IDogMTsKLSAgICAgICAgaCA9IChoPj4xKSA/IDogMTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmNwcCBiL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OWVjNDAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMTEgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9wcmltaXRpdmVzLmNwcAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJwcmltaXRpdmVzLmgiCi0jaW5jbHVkZSAibGlnaHQuaCIKLSNpbmNsdWRlICJtYXRyaXguaCIKLSNpbmNsdWRlICJ2ZXJ0ZXguaCIKLSNpbmNsdWRlICJmcC5oIgotI2luY2x1ZGUgIlRleHR1cmVPYmplY3RNYW5hZ2VyLmgiCi0KLWV4dGVybiAiQyIgdm9pZCBpdGVyYXRvcnMwMDMyKGNvbnN0IHZvaWQqIHRoYXQsCi0gICAgICAgIGludDMyX3QqIGl0LCBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIHByaW1pdGl2ZV9wb2ludChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KTsKLXN0YXRpYyB2b2lkIHByaW1pdGl2ZV9saW5lKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEpOwotc3RhdGljIHZvaWQgcHJpbWl0aXZlX2NsaXBfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKTsKLQotc3RhdGljIHZvaWQgcHJpbWl0aXZlX25vcF9wb2ludChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KTsKLXN0YXRpYyB2b2lkIHByaW1pdGl2ZV9ub3BfbGluZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxKTsKLXN0YXRpYyB2b2lkIHByaW1pdGl2ZV9ub3BfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKTsKLQotc3RhdGljIGlubGluZSBib29sIGN1bGxfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKTsKLQotc3RhdGljIHZvaWQgbGVycF90cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpOwotCi1zdGF0aWMgdm9pZCBsZXJwX3RleGNvb3JkcyhvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpOwotCi1zdGF0aWMgdm9pZCBsZXJwX3RleGNvb3Jkc193KG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7Ci0KLXN0YXRpYyB2b2lkIHRyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7Ci0KLXN0YXRpYyB2b2lkIGNsaXBfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBjbGlwX2xpbmUob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogcywgdmVydGV4X3QqIHApOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBsaWdodFRyaWFuZ2xlRGFya1Ntb290aChvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgaWYgKCEodjAtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKLSAgICAgICAgdjAtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Ci0gICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKLSAgICAgICAgICAgICAgICB2MC0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7Ci0gICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2MC0+Y29sb3IudiwgY3ApOwotICAgIH0KLSAgICBpZiAoISh2MS0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgewotICAgICAgICB2MS0+ZmxhZ3MgfD0gdmVydGV4X3Q6OkxJVDsKLSAgICAgICAgY29uc3QgR0x2b2lkKiBjcCA9IGMtPmFycmF5cy5jb2xvci5lbGVtZW50KAotICAgICAgICAgICAgICAgIHYxLT5pbmRleCAmIHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLKTsKLSAgICAgICAgYy0+YXJyYXlzLmNvbG9yLmZldGNoKGMsIHYxLT5jb2xvci52LCBjcCk7Ci0gICAgfQotICAgIGlmKCEodjItPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKLSAgICAgICAgdjItPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Ci0gICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKLSAgICAgICAgICAgICAgICB2Mi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7Ci0gICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2Mi0+Y29sb3IudiwgY3ApOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZURhcmtGbGF0KG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICBpZiAoISh2Mi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgewotICAgICAgICB2Mi0+ZmxhZ3MgfD0gdmVydGV4X3Q6OkxJVDsKLSAgICAgICAgY29uc3QgR0x2b2lkKiBjcCA9IGMtPmFycmF5cy5jb2xvci5lbGVtZW50KAotICAgICAgICAgICAgICAgIHYyLT5pbmRleCAmIHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLKTsKLSAgICAgICAgYy0+YXJyYXlzLmNvbG9yLmZldGNoKGMsIHYyLT5jb2xvci52LCBjcCk7Ci0gICAgfQotICAgIC8vIGNvbmZpZ3VyZSB0aGUgcmFzdGVyaXplciBoZXJlLCBiZWZvcmUgd2UgY2xpcAotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3I0eHYoYywgdjItPmNvbG9yLnYpOwotfQotCi1zdGF0aWMgdm9pZCBsaWdodFRyaWFuZ2xlU21vb3RoKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICBpZiAoISh2MC0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkKLSAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdjApOwotICAgIGlmICghKHYxLT5mbGFncyAmIHZlcnRleF90OjpMSVQpKQotICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleChjLCB2MSk7Ci0gICAgaWYoISh2Mi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkKLSAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdjIpOwotfQotCi1zdGF0aWMgdm9pZCBsaWdodFRyaWFuZ2xlRmxhdChvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgaWYgKCEodjItPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpCi0gICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYyKTsKLSAgICAvLyBjb25maWd1cmUgdGhlIHJhc3Rlcml6ZXIgaGVyZSwgYmVmb3JlIHdlIGNsaXAKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yNHh2KGMsIHYyLT5jb2xvci52KTsKLX0KLQotLy8gVGhlIGZvZyB2ZXJzaW9ucy4uLgotCi1zdGF0aWMgaW5saW5lCi12b2lkIGxpZ2h0VmVydGV4RGFya1Ntb290aEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQotewotICAgIGlmICghKHYtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKLSAgICAgICAgdi0+ZmxhZ3MgfD0gdmVydGV4X3Q6OkxJVDsKLSAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT5leWUueik7Ci0gICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKLSAgICAgICAgICAgICAgICB2LT5pbmRleCAmIHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLKTsKLSAgICAgICAgYy0+YXJyYXlzLmNvbG9yLmZldGNoKGMsIHYtPmNvbG9yLnYsIGNwKTsKLSAgICB9Ci19Ci1zdGF0aWMgaW5saW5lCi12b2lkIGxpZ2h0VmVydGV4RGFya0ZsYXRGb2cob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKLXsKLSAgICBpZiAoISh2LT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7Ci0gICAgICAgIHYtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Ci0gICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+ZXllLnopOwotICAgIH0KLX0KLXN0YXRpYyBpbmxpbmUKLXZvaWQgbGlnaHRWZXJ0ZXhTbW9vdGhGb2cob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKLXsKLSAgICBpZiAoISh2LT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7Ci0gICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+ZXllLnopOwotICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleChjLCB2KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGxpZ2h0VHJpYW5nbGVEYXJrU21vb3RoRm9nKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICBsaWdodFZlcnRleERhcmtTbW9vdGhGb2coYywgdjApOwotICAgIGxpZ2h0VmVydGV4RGFya1Ntb290aEZvZyhjLCB2MSk7Ci0gICAgbGlnaHRWZXJ0ZXhEYXJrU21vb3RoRm9nKGMsIHYyKTsKLX0KLQotc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZURhcmtGbGF0Rm9nKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICBsaWdodFZlcnRleERhcmtGbGF0Rm9nKGMsIHYwKTsKLSAgICBsaWdodFZlcnRleERhcmtGbGF0Rm9nKGMsIHYxKTsKLSAgICBsaWdodFZlcnRleERhcmtTbW9vdGhGb2coYywgdjIpOwotICAgIC8vIGNvbmZpZ3VyZSB0aGUgcmFzdGVyaXplciBoZXJlLCBiZWZvcmUgd2UgY2xpcAotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3I0eHYoYywgdjItPmNvbG9yLnYpOwotfQotCi1zdGF0aWMgdm9pZCBsaWdodFRyaWFuZ2xlU21vb3RoRm9nKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICBsaWdodFZlcnRleFNtb290aEZvZyhjLCB2MCk7Ci0gICAgbGlnaHRWZXJ0ZXhTbW9vdGhGb2coYywgdjEpOwotICAgIGxpZ2h0VmVydGV4U21vb3RoRm9nKGMsIHYyKTsKLX0KLQotc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZUZsYXRGb2cob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQotewotICAgIGxpZ2h0VmVydGV4RGFya0ZsYXRGb2coYywgdjApOwotICAgIGxpZ2h0VmVydGV4RGFya0ZsYXRGb2coYywgdjEpOwotICAgIGxpZ2h0VmVydGV4U21vb3RoRm9nKGMsIHYyKTsKLSAgICAvLyBjb25maWd1cmUgdGhlIHJhc3Rlcml6ZXIgaGVyZSwgYmVmb3JlIHdlIGNsaXAKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yNHh2KGMsIHYyLT5jb2xvci52KTsKLX0KLQotCi0KLXR5cGVkZWYgdm9pZCAoKmxpZ2h0X3ByaW1pdGl2ZV90KShvZ2xlc19jb250ZXh0X3QqLAotICAgICAgICB2ZXJ0ZXhfdCosIHZlcnRleF90KiwgdmVydGV4X3QqKTsKLQotLy8gZm9nIDB4NCwgbGlnaHQgMHgyLCBzbW9vdGggMHgxCi1zdGF0aWMgY29uc3QgbGlnaHRfcHJpbWl0aXZlX3QgbGlnaHRQcmltaXRpdmVbOF0gPSB7Ci0gICAgbGlnaHRUcmlhbmdsZURhcmtGbGF0LCAgICAgICAgICAvLyBubyBmb2cgfCBkYXJrICB8IGZsYXQKLSAgICBsaWdodFRyaWFuZ2xlRGFya1Ntb290aCwgICAgICAgIC8vIG5vIGZvZyB8IGRhcmsgIHwgc21vb3RoCi0gICAgbGlnaHRUcmlhbmdsZUZsYXQsICAgICAgICAgICAgICAvLyBubyBmb2cgfCBsaWdodCB8IGZsYXQKLSAgICBsaWdodFRyaWFuZ2xlU21vb3RoLCAgICAgICAgICAgIC8vIG5vIGZvZyB8IGxpZ2h0IHwgc21vb3RoCi0gICAgbGlnaHRUcmlhbmdsZURhcmtGbGF0Rm9nLCAgICAgICAvLyBmb2cgICAgfCBkYXJrICB8IGZsYXQKLSAgICBsaWdodFRyaWFuZ2xlRGFya1Ntb290aEZvZywgICAgIC8vIGZvZyAgICB8IGRhcmsgIHwgc21vb3RoCi0gICAgbGlnaHRUcmlhbmdsZUZsYXRGb2csICAgICAgICAgICAvLyBmb2cgICAgfCBsaWdodCB8IGZsYXQKLSAgICBsaWdodFRyaWFuZ2xlU21vb3RoRm9nICAgICAgICAgIC8vIGZvZyAgICB8IGxpZ2h0IHwgc21vb3RoCi19OwotCi12b2lkIG9nbGVzX3ZhbGlkYXRlX3ByaW1pdGl2ZXMob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7Ci0KLSAgICAvLyBzZXQgdXAgdGhlIGxpZ2h0aW5nL3NoYWRpbmcvc21vb3RoaW5nL2ZvZ2dpbmcgZnVuY3Rpb24KLSAgICBpbnQgaW5kZXggPSBlbmFibGVzICYgR0dMX0VOQUJMRV9TTU9PVEggPyAweDEgOiAwOwotICAgIGluZGV4IHw9IGMtPmxpZ2h0aW5nLmVuYWJsZSA/IDB4MiA6IDA7Ci0gICAgaW5kZXggfD0gZW5hYmxlcyAmIEdHTF9FTkFCTEVfRk9HID8gMHg0IDogMDsKLSAgICBjLT5saWdodGluZy5saWdodFRyaWFuZ2xlID0gbGlnaHRQcmltaXRpdmVbaW5kZXhdOwotICAgIAotICAgIC8vIHNldCB1cCB0aGUgcHJpbWl0aXZlIHJlbmRlcmVycwotICAgIGlmIChnZ2xfbGlrZWx5KGMtPmFycmF5cy52ZXJ0ZXguZW5hYmxlKSkgewotICAgICAgICBjLT5wcmltcy5yZW5kZXJQb2ludCAgICA9IHByaW1pdGl2ZV9wb2ludDsKLSAgICAgICAgYy0+cHJpbXMucmVuZGVyTGluZSAgICAgPSBwcmltaXRpdmVfbGluZTsKLSAgICAgICAgYy0+cHJpbXMucmVuZGVyVHJpYW5nbGUgPSBwcmltaXRpdmVfY2xpcF90cmlhbmdsZTsKLSAgICB9IGVsc2UgewotICAgICAgICBjLT5wcmltcy5yZW5kZXJQb2ludCAgICA9IHByaW1pdGl2ZV9ub3BfcG9pbnQ7Ci0gICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUgICAgID0gcHJpbWl0aXZlX25vcF9saW5lOwotICAgICAgICBjLT5wcmltcy5yZW5kZXJUcmlhbmdsZSA9IHByaW1pdGl2ZV9ub3BfdHJpYW5nbGU7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aW5pdFRyaWFuZ2xlKAotICAgICAgICB2ZXJ0ZXhfdCBjb25zdCogdjAsIHZlcnRleF90IGNvbnN0KiB2MSwgdmVydGV4X3QgY29uc3QqIHYyKQotewotICAgIG1fZHgwMSA9IHYxLT53aW5kb3cueCAtIHYwLT53aW5kb3cueDsKLSAgICBtX2R5MTAgPSB2MC0+d2luZG93LnkgLSB2MS0+d2luZG93Lnk7Ci0gICAgbV9keDIwID0gdjAtPndpbmRvdy54IC0gdjItPndpbmRvdy54OwotICAgIG1fZHkwMiA9IHYyLT53aW5kb3cueSAtIHYwLT53aW5kb3cueTsKLSAgICBtX2FyZWEgPSBtX2R4MDEqbV9keTAyICsgKC1tX2R5MTApKm1fZHgyMDsKLX0KLQotdm9pZCBjb21wdXRlX2l0ZXJhdG9yc190Ojppbml0TGluZSgKLSAgICAgICAgdmVydGV4X3QgY29uc3QqIHYwLCB2ZXJ0ZXhfdCBjb25zdCogdjEpCi17Ci0gICAgbV9keDAxID0gbV9keTAyID0gdjEtPndpbmRvdy54IC0gdjAtPndpbmRvdy54OwotICAgIG1fZHkxMCA9IG1fZHgyMCA9IHYwLT53aW5kb3cueSAtIHYxLT53aW5kb3cueTsKLSAgICBtX2FyZWEgPSBtX2R4MDEqbV9keTAyICsgKC1tX2R5MTApKm1fZHgyMDsKLX0KLQotdm9pZCBjb21wdXRlX2l0ZXJhdG9yc190Ojppbml0TGVycCh2ZXJ0ZXhfdCBjb25zdCogdjAsIHVpbnQzMl90IGVuYWJsZXMpCi17Ci0gICAgbV94MCA9IHYwLT53aW5kb3cueDsKLSAgICBtX3kwID0gdjAtPndpbmRvdy55OwotICAgIGNvbnN0IEdHTGNvb3JkIGFyZWEgPSAobV9hcmVhICsgVFJJX0hBTEYpID4+IFRSSV9GUkFDVElPTl9CSVRTOwotICAgIGNvbnN0IEdHTGNvb3JkIG1pbkFyZWEgPSAyOyAvLyBjYW5ub3QgYmUgaW52ZXJ0ZWQKLSAgICAvLyB0cmlhbmdsZXMgd2l0aCBhbiBhcmVhIHNtYWxsZXIgdGhhbiAxLjAgYXJlIG5vdCBzbW9vdGgtc2hhZGVkCi0KLSAgICBpbnQgcT0wLCBzPTAsIGQ9MDsKLSAgICBpZiAoYWJzKGFyZWEpID49IG1pbkFyZWEpIHsKLSAgICAgICAgLy8gSGVyZSB3ZSBkbyBzb21lIHZvb2RvbyBtYWdpYywgdG8gY29tcHV0ZSBhIHN1aXRhYmxlIHNjYWxlCi0gICAgICAgIC8vIGZhY3RvciBmb3IgZGVsdGFzL2FyZWE6Ci0KLSAgICAgICAgLy8gRmlyc3QgY29tcHV0ZSB0aGUgMS9hcmVhIHdpdGggZnVsbCAzMi1iaXRzIHByZWNpc2lvbiwKLSAgICAgICAgLy8gZ2dsUmVjaXBRTm9ybWFsaXplZCByZXR1cm5zIGEgbnVtYmVyIFstMC41LCAwLjVbIGFuZCBhbiBleHBvbmVudC4KLSAgICAgICAgZCA9IGdnbFJlY2lwUU5vcm1hbGl6ZWQoYXJlYSwgJnEpOwotCi0gICAgICAgIC8vIFRoZW4gY29tcHV0ZSB0aGUgbWluaW11bSBsZWZ0LXNoaWZ0IHRvIG5vdCBvdmVyZmxvdyB0aGUgbXVscwotICAgICAgICAvLyBiZWxvdy4gCi0gICAgICAgIHMgPSAzMiAtIGdnbENseihhYnMobV9keTAyKXxhYnMobV9keTEwKXxhYnMobV9keDAxKXxhYnMobV9keDIwKSk7Ci0KLSAgICAgICAgLy8gV2UnbGwga2VlcCAxNi1iaXRzIG9mIHByZWNpc2lvbiBmb3IgZGVsdGFzL2FyZWEuIFNvIHdlIG5lZWQKLSAgICAgICAgLy8gdG8gc2hpZnQgZXZlcnl0aGluZyBsZWZ0IGFuIGV4dHJhIDE1IGJpdHMuCi0gICAgICAgIHMgKz0gMTU7Ci0gICAgICAgIAotICAgICAgICAvLyBtYWtlIHN1cmUgYWxsIGZpbmFsIHNoaWZ0cyBhcmUgbm90ID4gMzIsIGJlY2F1c2UgZ2dsTXVseAotICAgICAgICAvLyBjYW4ndCBoYW5kbGUgaXQuCi0gICAgICAgIGlmIChzIDwgcSkgcyA9IHE7Ci0gICAgICAgIGlmIChzID4gMzIpIHsKLSAgICAgICAgICAgIGQgPj49IDMyLXM7Ci0gICAgICAgICAgICBzID0gMzI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX2R4MDEgPSBnZ2xNdWx4KG1fZHgwMSwgZCwgcyk7Ci0gICAgbV9keTEwID0gZ2dsTXVseChtX2R5MTAsIGQsIHMpOwotICAgIG1fZHgyMCA9IGdnbE11bHgobV9keDIwLCBkLCBzKTsKLSAgICBtX2R5MDIgPSBnZ2xNdWx4KG1fZHkwMiwgZCwgcyk7Ci0gICAgbV9hcmVhX3NjYWxlID0gMzIgKyBxIC0gczsKLSAgICBtX3NjYWxlID0gMDsKLQotICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKSB7Ci0gICAgICAgIGNvbnN0IGludCBBID0gZ2dsQ2x6KGFicyhtX2R5MDIpfGFicyhtX2R5MTApfGFicyhtX2R4MDEpfGFicyhtX2R4MjApKTsKLSAgICAgICAgY29uc3QgaW50IEIgPSBnZ2xDbHooYWJzKG1feDApfGFicyhtX3kwKSk7Ci0gICAgICAgIG1fc2NhbGUgPSBtYXgoMCwgMzIgLSAoQSArIDE2KSkgKwotICAgICAgICAgICAgICAgICAgbWF4KDAsIDMyIC0gKEIgKyBUUklfRlJBQ1RJT05fQklUUykpICsgMTsKLSAgICB9Ci19Ci0KLWludCBjb21wdXRlX2l0ZXJhdG9yc190OjppdGVyYXRvcnNTY2FsZShHR0xmaXhlZCogaXQsCi0gICAgICAgIGludDMyX3QgYzAsIGludDMyX3QgYzEsIGludDMyX3QgYzIpIGNvbnN0Ci17Ci0gICAgaW50MzJfdCBkYzAxID0gYzEgLSBjMDsKLSAgICBpbnQzMl90IGRjMDIgPSBjMiAtIGMwOwotICAgIGNvbnN0IGludCBBID0gZ2dsQ2x6KGFicyhjMCkpOwotICAgIGNvbnN0IGludCBCID0gZ2dsQ2x6KGFicyhkYzAxKXxhYnMoZGMwMikpOwotICAgIGNvbnN0IGludCBzY2FsZSA9IG1pbihBLCBCIC0gbV9zY2FsZSkgLSAyOwotICAgIGlmIChzY2FsZSA+PSAwKSB7Ci0gICAgICAgIGMwICAgPDw9IHNjYWxlOwotICAgICAgICBkYzAxIDw8PSBzY2FsZTsKLSAgICAgICAgZGMwMiA8PD0gc2NhbGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYzAgICA+Pj0gLXNjYWxlOwotICAgICAgICBkYzAxID4+PSAtc2NhbGU7Ci0gICAgICAgIGRjMDIgPj49IC1zY2FsZTsKLSAgICB9Ci0gICAgY29uc3QgaW50IHMgPSBtX2FyZWFfc2NhbGU7Ci0gICAgaW50MzJfdCBkY2R4ID0gZ2dsTXVsQWRkeChkYzAxLCBtX2R5MDIsIGdnbE11bHgoZGMwMiwgbV9keTEwLCBzKSwgcyk7Ci0gICAgaW50MzJfdCBkY2R5ID0gZ2dsTXVsQWRkeChkYzAyLCBtX2R4MDEsIGdnbE11bHgoZGMwMSwgbV9keDIwLCBzKSwgcyk7Ci0gICAgaW50MzJfdCBjID0gYzAgLSAoZ2dsTXVsQWRkeChkY2R4LCBtX3gwLCAKLSAgICAgICAgICAgIGdnbE11bHgoZGNkeSwgbV95MCwgVFJJX0ZSQUNUSU9OX0JJVFMpLCBUUklfRlJBQ1RJT05fQklUUykpOwotICAgIGl0WzBdID0gYzsKLSAgICBpdFsxXSA9IGRjZHg7Ci0gICAgaXRbMl0gPSBkY2R5OwotICAgIHJldHVybiBzY2FsZTsKLX0KLQotdm9pZCBjb21wdXRlX2l0ZXJhdG9yc190OjppdGVyYXRvcnMxNjE2KEdHTGZpeGVkKiBpdCwKLSAgICAgICAgR0dMZml4ZWQgYzAsIEdHTGZpeGVkIGMxLCBHR0xmaXhlZCBjMikgY29uc3QKLXsKLSAgICBjb25zdCBHR0xmaXhlZCBkYzAxID0gYzEgLSBjMDsKLSAgICBjb25zdCBHR0xmaXhlZCBkYzAyID0gYzIgLSBjMDsKLSAgICAvLyAxNi4xNiB4IDE2LjE2ID09IDMyLjMyIC0tPiAxNi4xNgotICAgIGNvbnN0IGludCBzID0gbV9hcmVhX3NjYWxlOwotICAgIGludDMyX3QgZGNkeCA9IGdnbE11bEFkZHgoZGMwMSwgbV9keTAyLCBnZ2xNdWx4KGRjMDIsIG1fZHkxMCwgcyksIHMpOwotICAgIGludDMyX3QgZGNkeSA9IGdnbE11bEFkZHgoZGMwMiwgbV9keDAxLCBnZ2xNdWx4KGRjMDEsIG1fZHgyMCwgcyksIHMpOwotICAgIGludDMyX3QgYyA9IGMwIC0gKGdnbE11bEFkZHgoZGNkeCwgbV94MCwKLSAgICAgICAgICAgIGdnbE11bHgoZGNkeSwgbV95MCwgVFJJX0ZSQUNUSU9OX0JJVFMpLCBUUklfRlJBQ1RJT05fQklUUykpOwotICAgIGl0WzBdID0gYzsKLSAgICBpdFsxXSA9IGRjZHg7Ci0gICAgaXRbMl0gPSBkY2R5OwotfQotCi12b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6Oml0ZXJhdG9yczAwMzIoaW50NjRfdCogaXQsCi0gICAgICAgIGludDMyX3QgYzAsIGludDMyX3QgYzEsIGludDMyX3QgYzIpIGNvbnN0Ci17Ci0gICAgY29uc3QgaW50IHMgPSBtX2FyZWFfc2NhbGUgLSAxNjsKLSAgICBpbnQzMl90IGRjMDEgPSAoYzEgLSBjMCk+PnM7Ci0gICAgaW50MzJfdCBkYzAyID0gKGMyIC0gYzApPj5zOwotICAgIC8vIDE2LjE2IHggMTYuMTYgPT0gMzIuMzIKLSAgICBpbnQ2NF90IGRjZHggPSBnZ2xNdWxpaShkYzAxLCBtX2R5MDIpICsgZ2dsTXVsaWkoZGMwMiwgbV9keTEwKTsKLSAgICBpbnQ2NF90IGRjZHkgPSBnZ2xNdWxpaShkYzAyLCBtX2R4MDEpICsgZ2dsTXVsaWkoZGMwMSwgbV9keDIwKTsKLSAgICBpdFsgMF0gPSAoYzA8PDE2KSAtICgoZGNkeCptX3gwICsgZGNkeSptX3kwKT4+NCk7Ci0gICAgaXRbIDFdID0gZGNkeDsKLSAgICBpdFsgMl0gPSBkY2R5OwotfQotCi0jaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCi1pbmxpbmUgdm9pZCBjb21wdXRlX2l0ZXJhdG9yc190OjppdGVyYXRvcnMwMDMyKGludDMyX3QqIGl0LAotICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdAotewotICAgIDo6aXRlcmF0b3JzMDAzMih0aGlzLCBpdCwgYzAsIGMxLCBjMik7Ci19Ci0jZWxzZQotdm9pZCBjb21wdXRlX2l0ZXJhdG9yc190OjppdGVyYXRvcnMwMDMyKGludDMyX3QqIGl0LAotICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdAotewotICAgIGludDY0X3QgaXQ2NFszXTsKLSAgICBpdGVyYXRvcnMwMDMyKGl0NjQsIGMwLCBjMSwgYzIpOwotICAgIGl0WzBdID0gaXQ2NFswXTsKLSAgICBpdFsxXSA9IGl0NjRbMV07Ci0gICAgaXRbMl0gPSBpdDY0WzJdOwotfQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGlubGluZSBpbnQzMl90IGNsYW1wWihHTGZpeGVkIHopIENPTlNUOwotaW50MzJfdCBjbGFtcFooR0xmaXhlZCB6KSB7Ci0gICAgeiA9ICh6ICYgfih6Pj4zMSkpOwotICAgIGlmICh6ID49IDB4MTAwMDApCi0gICAgICAgIHogPSAweEZGRkY7Ci0gICAgcmV0dXJuIHo7Ci19Ci0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi12b2lkIGZldGNoX3RleGNvb3JkX2ltcGwob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQotewotICAgIHZlcnRleF90KiBjb25zdCB2dHhbM10gPSB7IHYwLCB2MSwgdjIgfTsKLSAgICBhcnJheV90IGNvbnN0ICogY29uc3QgdGV4Y29vcmRBcnJheSA9IGMtPmFycmF5cy50ZXh0dXJlOwotICAgIAotICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBpZiAoIShjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0uZW5hYmxlKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaj0wIDsgajwzIDsgaisrKSB7Ci0gICAgICAgICAgICB2ZXJ0ZXhfdCogY29uc3QgdiA9IHZ0eFtqXTsKLSAgICAgICAgICAgIGlmICh2LT5mbGFncyAmIHZlcnRleF90OjpUVCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgLy8gTk9URTogaGVyZSB3ZSBjb3VsZCBjb21wdXRlIGF1dG9tYXRpYyB0ZXhnZW4KLSAgICAgICAgICAgIC8vIHN1Y2ggYXMgc3BoZXJlL2N1YmUgbWFwcywgaW5zdGVhZCBvZiBmZXRjaGluZyB0aGVtCi0gICAgICAgICAgICAvLyBmcm9tIHRoZSB0ZXh0Y29vcmQgYXJyYXkuCi0KLSAgICAgICAgICAgIHZlYzRfdCYgY29vcmRzID0gdi0+dGV4dHVyZVtpXTsKLSAgICAgICAgICAgIGNvbnN0IEdMdWJ5dGUqIHRwID0gdGV4Y29vcmRBcnJheVtpXS5lbGVtZW50KAotICAgICAgICAgICAgICAgICAgICB2LT5pbmRleCAmIHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLKTsKLSAgICAgICAgICAgIHRleGNvb3JkQXJyYXlbaV0uZmV0Y2goYywgY29vcmRzLnYsIHRwKTsKLQotICAgICAgICAgICAgLy8gdHJhbnNmb3JtIHRleHR1cmUgY29vcmRpbmF0ZXMuLi4KLSAgICAgICAgICAgIGNvb3Jkcy5RID0gMHgxMDAwMDsKLSAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybV90JiB0ciA9IGMtPnRyYW5zZm9ybXMudGV4dHVyZVtpXS50cmFuc2Zvcm07IAotICAgICAgICAgICAgaWYgKGdnbF91bmxpa2VseSh0ci5vcHMpKSB7Ci0gICAgICAgICAgICAgICAgYy0+YXJyYXlzLnRleF90cmFuc2Zvcm1baV0oJnRyLCAmY29vcmRzLCAmY29vcmRzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZGl2aWRlIGJ5IFEKLSAgICAgICAgICAgIGNvbnN0IEdHTGZpeGVkIHEgPSBjb29yZHMuUTsKLSAgICAgICAgICAgIGlmIChnZ2xfdW5saWtlbHkocSAhPSAweDEwMDAwKSkgewotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgcWludiA9IGdnbFJlY2lwMjgocSk7Ci0gICAgICAgICAgICAgICAgY29vcmRzLlMgPSBnZ2xNdWx4KGNvb3Jkcy5TLCBxaW52LCAyOCk7Ci0gICAgICAgICAgICAgICAgY29vcmRzLlQgPSBnZ2xNdWx4KGNvb3Jkcy5ULCBxaW52LCAyOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdjAtPmZsYWdzIHw9IHZlcnRleF90OjpUVDsKLSAgICB2MS0+ZmxhZ3MgfD0gdmVydGV4X3Q6OlRUOwotICAgIHYyLT5mbGFncyB8PSB2ZXJ0ZXhfdDo6VFQ7Ci19Ci0KLWlubGluZSB2b2lkIGZldGNoX3RleGNvb3JkKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOwotICAgIGlmICghKGVuYWJsZXMgJiBHR0xfRU5BQkxFX1RNVVMpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBGZXRjaCAmIHRyYW5zZm9ybSB0ZXh0dXJlIGNvb3JkaW5hdGVzLi4uCi0gICAgaWYgKGdnbF9saWtlbHkodjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdjItPmZsYWdzICYgdmVydGV4X3Q6OlRUKSkgewotICAgICAgICAvLyBhbHJlYWR5IGRvbmUgZm9yIGFsbCB0aHJlZSB2ZXJ0aWNlcywgYmFpbC4uLgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZldGNoX3RleGNvb3JkX2ltcGwoYywgdjAsIHYxLCB2Mik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIFBvaW50Ci0jZW5kaWYKLQotdm9pZCBwcmltaXRpdmVfbm9wX3BvaW50KG9nbGVzX2NvbnRleHRfdCosIHZlcnRleF90KikgewotfQotCi12b2lkIHByaW1pdGl2ZV9wb2ludChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQotewotICAgIC8vIGxpZ2h0aW5nICYgY2xhbXBpbmcuLi4KLSAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOwotCi0gICAgaWYgKGdnbF91bmxpa2VseSghKHYtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpKSB7Ci0gICAgICAgIGlmIChjLT5saWdodGluZy5lbmFibGUpIHsKLSAgICAgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdi0+ZmxhZ3MgfD0gdmVydGV4X3Q6OkxJVDsKLSAgICAgICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgdi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7Ci0gICAgICAgICAgICBjLT5hcnJheXMuY29sb3IuZmV0Y2goYywgdi0+Y29sb3IudiwgY3ApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpIHsKLSAgICAgICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+ZXllLnopOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gWFhYOiB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoYXQgZWFjaC10aW1lCi0gICAgLy8gaWYgY29sb3IgYXJyYXkgYW5kIGxpZ2h0aW5nIG5vdCBlbmFibGVkIAotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3I0eHYoYywgdi0+Y29sb3Iudik7Ci0KLSAgICAvLyBYWFg6IGxvb2sgaW50byBFUyBwb2ludC1zcHJpdGUgZXh0ZW5zaW9uCi0gICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX1RNVVMpIHsKLSAgICAgICAgZmV0Y2hfdGV4Y29vcmQoYywgdix2LHYpOwotICAgICAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLmVuYWJsZSkgCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpbnQzMl90IGl0dFs4XTsKLSAgICAgICAgICAgIGl0dFsxXSA9IGl0dFsyXSA9IGl0dFs0XSA9IGl0dFs1XSA9IDA7Ci0gICAgICAgICAgICBpdHRbNl0gPSBpdHRbN10gPSAxNjsgLy8gWFhYOiBjaGVjayB0aGF0Ci0gICAgICAgICAgICBpZiAoYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLnNfd3JhcCA9PSBHR0xfQ0xBTVApIHsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZS0+c3VyZmFjZS53aWR0aDsKLSAgICAgICAgICAgICAgICBpdHRbMF0gPSB2LT50ZXh0dXJlW2ldLlMgKiB3aWR0aDsKLSAgICAgICAgICAgICAgICBpdHRbNl0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXS50X3dyYXAgPT0gR0dMX0NMQU1QKSB7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5zdXJmYWNlLmhlaWdodDsKLSAgICAgICAgICAgICAgICBpdHRbM10gPSB2LT50ZXh0dXJlW2ldLlQgKiBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaXR0WzddID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4Q29vcmRHcmFkU2NhbGU4eHYoYywgaSwgaXR0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfREVQVEhfVEVTVCkgewotICAgICAgICBpbnQzMl90IGl0elszXTsKLSAgICAgICAgaXR6WzBdID0gY2xhbXBaKHYtPndpbmRvdy56KSAqIDB4MDAwMTAwMDE7Ci0gICAgICAgIGl0elsxXSA9IGl0elsyXSA9IDA7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuekdyYWQzeHYoYywgaXR6KTsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfRk9HKSB7Ci0gICAgICAgIEdMZml4ZWQgaXRmWzNdOwotICAgICAgICBpdGZbMF0gPSB2LT5mb2c7Ci0gICAgICAgIGl0ZlsxXSA9IGl0ZlsyXSA9IDA7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZm9nR3JhZDN4dihjLCBpdGYpOwotICAgIH0KLQotICAgIC8vIFJlbmRlciBvdXIgcG9pbnQuLi4KLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnBvaW50eChjLCB2LT53aW5kb3cudiwgYy0+cG9pbnQuc2l6ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIExpbmUKLSNlbmRpZgotCi12b2lkIHByaW1pdGl2ZV9ub3BfbGluZShvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCosIHZlcnRleF90KikgewotfQotCi12b2lkIHByaW1pdGl2ZV9saW5lKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEpCi17Ci0gICAgLy8gZ2V0IHRleHR1cmUgY29vcmRpbmF0ZXMKLSAgICBmZXRjaF90ZXhjb29yZChjLCB2MCwgdjEsIHYxKTsKLQotICAgIC8vIGxpZ2h0L3NoYWRlIHRoZSB2ZXJ0aWNlcyBmaXJzdCAodGhleSdyZSBjb3BpZWQgYmVsb3cpCi0gICAgYy0+bGlnaHRpbmcubGlnaHRUcmlhbmdsZShjLCB2MCwgdjEsIHYxKTsKLQotICAgIC8vIGNsaXAgdGhlIGxpbmUgaWYgbmVlZGVkCi0gICAgaWYgKGdnbF91bmxpa2VseSgodjAtPmZsYWdzIHwgdjEtPmZsYWdzKSAmIHZlcnRleF90OjpDTElQX0FMTCkpIHsKLSAgICAgICAgdW5zaWduZWQgaW50IGNvdW50ID0gY2xpcF9saW5lKGMsIHYwLCB2MSk7Ci0gICAgICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPT0gMCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gY29tcHV0ZSBpdGVyYXRvcnMuLi4KLSAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOwotICAgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSAgIEdHTF9FTkFCTEVfVE1VUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9TTU9PVEggfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9FTkFCTEVfVyB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9FTkFCTEVfRk9HIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX0RFUFRIX1RFU1Q7Ci0KLSAgICBpZiAoZ2dsX3VubGlrZWx5KGVuYWJsZXMgJiBtYXNrKSkgewotICAgICAgICBjLT5sZXJwLmluaXRMaW5lKHYwLCB2MSk7Ci0gICAgICAgIGxlcnBfdHJpYW5nbGUoYywgdjAsIHYxLCB2MCk7Ci0gICAgfQotCi0gICAgLy8gcmVuZGVyIG91ciBsaW5lCi0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5saW5leChjLCB2MC0+d2luZG93LnYsIHYxLT53aW5kb3cudiwgYy0+bGluZS53aWR0aCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIFRyaWFuZ2xlCi0jZW5kaWYKLQotdm9pZCBwcmltaXRpdmVfbm9wX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikgewotfQotCi12b2lkIHByaW1pdGl2ZV9jbGlwX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICB1aW50MzJfdCBjYyA9ICh2MC0+ZmxhZ3MgfCB2MS0+ZmxhZ3MgfCB2Mi0+ZmxhZ3MpICYgdmVydGV4X3Q6OkNMSVBfQUxMOwotICAgIGlmIChnZ2xfbGlrZWx5KCFjYykpIHsKLSAgICAgICAgLy8gY29kZSBiZWxvdyBtdXN0IGJlIGFzIG9wdGltaXplZCBhcyBwb3NzaWJsZSwgdGhpcyBpcyB0aGUKLSAgICAgICAgLy8gY29tbW9uIGNvZGUgcGF0aC4KLQotICAgICAgICAvLyBUaGlzIHRyaWFuZ2xlIGlzIG5vdCBjbGlwcGVkLCB0ZXN0IGlmIGl0J3MgY3VsbGVkCi0gICAgICAgIC8vIHVuY2xpcHBlZCB0cmlhbmdsZS4uLgotICAgICAgICBjLT5sZXJwLmluaXRUcmlhbmdsZSh2MCwgdjEsIHYyKTsKLSAgICAgICAgaWYgKGN1bGxfdHJpYW5nbGUoYywgdjAsIHYxLCB2MikpCi0gICAgICAgICAgICByZXR1cm47IC8vIGN1bGxlZCEKLQotICAgICAgICAvLyBGZXRjaCBhbGwgdGV4dHVyZSBjb29yZGluYXRlcyBpZiBuZWVkZWQKLSAgICAgICAgZmV0Y2hfdGV4Y29vcmQoYywgdjAsIHYxLCB2Mik7Ci0KLSAgICAgICAgLy8gbGlnaHQgKG9yIHNoYWRlKSBvdXIgdHJpYW5nbGUhCi0gICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7Ci0KLSAgICAgICAgdHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgd2UncmUgbm90IGdvaW5nIHRvIGNsaXAgdmVyeSBvZnRlbiwKLSAgICAvLyBhbmQgZXZlbiBtb3JlIHJhcmVseSB3aWxsIHdlIGNsaXAgYSB0cmlhbmdsZSB0aGF0IGVuZHMgdXAKLSAgICAvLyBiZWluZyBjdWxsZWQgb3V0LiBTbyBpdCdzIG9rYXkgdG8gbGlnaHQgdGhlIHZlcnRpY2VzIGhlcmUsIGV2ZW4gdGhvdWdoCi0gICAgLy8gaW4gYSBmZXcgY2FzZXMgd2Ugd29uJ3QgcmVuZGVyIHRoZSB0cmlhbmdsZSAoaWYgY3VsbGVkKS4KLQotICAgIC8vIEZldGNoIHRleHR1cmUgY29vcmRpbmF0ZXMuLi4KLSAgICBmZXRjaF90ZXhjb29yZChjLCB2MCwgdjEsIHYyKTsKLQotICAgIC8vIGxpZ2h0IChvciBzaGFkZSkgb3VyIHRyaWFuZ2xlIQotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7Ci0KLSAgICBjbGlwX3RyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIHRyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICAvLyBjb21wdXRlIGl0ZXJhdG9ycy4uLgotICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7Ci0gICAgY29uc3QgdWludDMyX3QgbWFzayA9ICAgR0dMX0VOQUJMRV9UTVVTIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX1NNT09USCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9XIHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9GT0cgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9FTkFCTEVfREVQVEhfVEVTVDsKLQotICAgIGlmIChnZ2xfbGlrZWx5KGVuYWJsZXMgJiBtYXNrKSkKLSAgICAgICAgbGVycF90cmlhbmdsZShjLCB2MCwgdjEsIHYyKTsKLQotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudHJpYW5nbGV4KGMsIHYwLT53aW5kb3cudiwgdjEtPndpbmRvdy52LCB2Mi0+d2luZG93LnYpOwotfQotCi12b2lkIGxlcnBfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQotewotICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7Ci0gICAgYy0+bGVycC5pbml0TGVycCh2MCwgZW5hYmxlcyk7Ci0KLSAgICAvLyBzZXQgdXAgdGV4dHVyZSBpdGVyYXRvcnMKLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykgewotICAgICAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVykgewotICAgICAgICAgICAgbGVycF90ZXhjb29yZHNfdyhjLCB2MCwgdjEsIHYyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxlcnBfdGV4Y29vcmRzKGMsIHYwLCB2MSwgdjIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gc2V0IHVwIHRoZSBjb2xvciBpdGVyYXRvcnMKLSAgICBjb25zdCBjb21wdXRlX2l0ZXJhdG9yc190JiBsZXJwID0gYy0+bGVycDsKLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfU01PT1RIKSB7Ci0gICAgICAgIEdMZml4ZWQgaXRjWzEyXTsKLSAgICAgICAgZm9yIChpbnQgaT0wIDsgaTw0IDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBHR0xjb2xvciBjMCA9IHYwLT5jb2xvci52W2ldICogMjU1OwotICAgICAgICAgICAgY29uc3QgR0dMY29sb3IgYzEgPSB2MS0+Y29sb3IudltpXSAqIDI1NTsKLSAgICAgICAgICAgIGNvbnN0IEdHTGNvbG9yIGMyID0gdjItPmNvbG9yLnZbaV0gKiAyNTU7Ci0gICAgICAgICAgICBsZXJwLml0ZXJhdG9yczE2MTYoJml0Y1tpKjNdLCBjMCwgYzEsIGMyKTsKLSAgICAgICAgfQotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yR3JhZDEyeHYoYywgaXRjKTsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfREVQVEhfVEVTVCkgewotICAgICAgICBpbnQzMl90IGl0elszXTsKLSAgICAgICAgY29uc3QgaW50MzJfdCB2MHogPSBjbGFtcFoodjAtPndpbmRvdy56KTsKLSAgICAgICAgY29uc3QgaW50MzJfdCB2MXogPSBjbGFtcFoodjEtPndpbmRvdy56KTsKLSAgICAgICAgY29uc3QgaW50MzJfdCB2MnogPSBjbGFtcFoodjItPndpbmRvdy56KTsKLSAgICAgICAgaWYgKGdnbF91bmxpa2VseShjLT5wb2x5Z29uT2Zmc2V0LmVuYWJsZSkpIHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdW5pdHMgPSAoYy0+cG9seWdvbk9mZnNldC51bml0cyA8PCAxNik7Ci0gICAgICAgICAgICBjb25zdCBHTGZpeGVkIGZhY3RvciA9IGMtPnBvbHlnb25PZmZzZXQuZmFjdG9yOwotICAgICAgICAgICAgaWYgKGZhY3RvcikgewotICAgICAgICAgICAgICAgIGludDY0X3QgaXR6NjRbM107Ci0gICAgICAgICAgICAgICAgbGVycC5pdGVyYXRvcnMwMDMyKGl0ejY0LCB2MHosIHYxeiwgdjJ6KTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IG1heERlcHRoU2xvcGUgPSBtYXgoaXR6NjRbMV0sIGl0ejY0WzJdKTsKLSAgICAgICAgICAgICAgICBpdHpbMF0gPSB1aW50MzJfdChpdHo2NFswXSkgCi0gICAgICAgICAgICAgICAgICAgICAgICArIHVpbnQzMl90KChtYXhEZXB0aFNsb3BlKmZhY3Rvcik+PjE2KSArIHVuaXRzOwotICAgICAgICAgICAgICAgIGl0elsxXSA9IHVpbnQzMl90KGl0ejY0WzFdKTsKLSAgICAgICAgICAgICAgICBpdHpbMl0gPSB1aW50MzJfdChpdHo2NFsyXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxlcnAuaXRlcmF0b3JzMDAzMihpdHosIHYweiwgdjF6LCB2MnopOwotICAgICAgICAgICAgICAgIGl0elswXSArPSB1bml0czsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZXJwLml0ZXJhdG9yczAwMzIoaXR6LCB2MHosIHYxeiwgdjJ6KTsKLSAgICAgICAgfQotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnpHcmFkM3h2KGMsIGl0eik7Ci0gICAgfSAgICAKLQotICAgIGlmIChnZ2xfdW5saWtlbHkoZW5hYmxlcyAmIEdHTF9FTkFCTEVfRk9HKSkgewotICAgICAgICBHTGZpeGVkIGl0ZlszXTsKLSAgICAgICAgbGVycC5pdGVyYXRvcnMxNjE2KGl0ZiwgdjAtPmZvZywgdjEtPmZvZywgdjItPmZvZyk7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZm9nR3JhZDN4dihjLCBpdGYpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgaW5saW5lCi1pbnQgY29tcHV0ZV9sb2Qob2dsZXNfY29udGV4dF90KiBjLCBpbnQgaSwKLSAgICAgICAgaW50MzJfdCBzMCwgaW50MzJfdCB0MCwgaW50MzJfdCBzMSwgaW50MzJfdCB0MSwgaW50MzJfdCBzMiwgaW50MzJfdCB0MikKLXsKLSAgICAvLyBDb21wdXRlIG1pcG1hcCBsZXZlbCAvIHByaW1pdGl2ZQotICAgIC8vIHJobyA9IHNxcnQoIHRleGVsQXJlYSAvIGFyZWEgKQotICAgIC8vIGxvZCA9IGxvZzIoIHJobyApCi0gICAgLy8gbG9kID0gbG9nMiggdGV4ZWxBcmVhIC8gYXJlYSApIC8gMgotICAgIC8vIGxvZCA9IChsb2cyKCB0ZXhlbEFyZWEgKSAtIGxvZzIoIGFyZWEgKSkgLyAyCi0gICAgY29uc3QgY29tcHV0ZV9pdGVyYXRvcnNfdCYgbGVycCA9IGMtPmxlcnA7Ci0gICAgY29uc3QgR0dMY29vcmQgYXJlYSA9IGFicyhsZXJwLmFyZWEoKSk7Ci0gICAgY29uc3QgaW50IHcgPSBjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZS0+c3VyZmFjZS53aWR0aDsKLSAgICBjb25zdCBpbnQgaCA9IGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5zdXJmYWNlLmhlaWdodDsKLSAgICBjb25zdCBpbnQgc2hpZnQgPSAxNiArICgxNiAtIFRSSV9GUkFDVElPTl9CSVRTKTsKLSAgICBpbnQzMl90IHRleGVsQXJlYSA9IGFicyggZ2dsTXVseChzMS1zMCwgdDItdDAsIHNoaWZ0KSAtCi0gICAgICAgICAgICBnZ2xNdWx4KHMyLXMwLCB0MS10MCwgc2hpZnQpICkqdypoOwotICAgIGludCBsb2cyVEFyZWEgPSAoMzItVFJJX0ZSQUNUSU9OX0JJVFMgIC0xKSAtIGdnbENseih0ZXhlbEFyZWEpOwotICAgIGludCBsb2cyQXJlYSAgPSAoMzItVFJJX0ZSQUNUSU9OX0JJVFMqMi0xKSAtIGdnbENseihhcmVhKTsKLSAgICBpbnQgbG9kID0gKGxvZzJUQXJlYSAtIGxvZzJBcmVhICsgMSkgPj4gMTsKLSAgICByZXR1cm4gbG9kOwotfQotCi12b2lkIGxlcnBfdGV4Y29vcmRzKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICBjb25zdCBjb21wdXRlX2l0ZXJhdG9yc190JiBsZXJwID0gYy0+bGVycDsKLSAgICBpbnQzMl90IGl0dFs4XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOwotICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBjb25zdCB0ZXh0dXJlX3QmIHRtdSA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXTsKLSAgICAgICAgaWYgKCF0bXUuZW5hYmxlKSAKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIGNvbXB1dGUgdGhlIGphY29iaWFucyB1c2luZyBibG9jayBmbG9hdGluZy1wb2ludAotICAgICAgICBpbnQzMl90IHMwID0gdjAtPnRleHR1cmVbaV0uUzsKLSAgICAgICAgaW50MzJfdCB0MCA9IHYwLT50ZXh0dXJlW2ldLlQ7Ci0gICAgICAgIGludDMyX3QgczEgPSB2MS0+dGV4dHVyZVtpXS5TOwotICAgICAgICBpbnQzMl90IHQxID0gdjEtPnRleHR1cmVbaV0uVDsKLSAgICAgICAgaW50MzJfdCBzMiA9IHYyLT50ZXh0dXJlW2ldLlM7Ci0gICAgICAgIGludDMyX3QgdDIgPSB2Mi0+dGV4dHVyZVtpXS5UOwotCi0gICAgICAgIGNvbnN0IEdMZW51bSBtaW5fZmlsdGVyID0gYy0+dGV4dHVyZXMudG11W2ldLnRleHR1cmUtPm1pbl9maWx0ZXI7Ci0gICAgICAgIGlmIChnZ2xfdW5saWtlbHkobWluX2ZpbHRlciA+PSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUKSkgewotICAgICAgICAgICAgaW50IGxvZCA9IGNvbXB1dGVfbG9kKGMsIGksIHMwLCB0MCwgczEsIHQxLCBzMiwgdDIpOwotICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5iaW5kVGV4dHVyZUxvZChjLCBpLAotICAgICAgICAgICAgICAgICAgICAmYy0+dGV4dHVyZXMudG11W2ldLnRleHR1cmUtPm1pcChsb2QpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByZW11bHRpcGx5IChzLHQpIHdoZW4gY2xhbXBsaW5nCi0gICAgICAgIGlmICh0bXUuc193cmFwID09IEdHTF9DTEFNUCkgewotICAgICAgICAgICAgY29uc3QgaW50IHdpZHRoID0gdG11LnN1cmZhY2Uud2lkdGg7Ci0gICAgICAgICAgICBzMCAqPSB3aWR0aDsKLSAgICAgICAgICAgIHMxICo9IHdpZHRoOwotICAgICAgICAgICAgczIgKj0gd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRtdS50X3dyYXAgPT0gR0dMX0NMQU1QKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgaGVpZ2h0ID0gdG11LnN1cmZhY2UuaGVpZ2h0OwotICAgICAgICAgICAgdDAgKj0gaGVpZ2h0OwotICAgICAgICAgICAgdDEgKj0gaGVpZ2h0OwotICAgICAgICAgICAgdDIgKj0gaGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIGl0dFs2XSA9IC1sZXJwLml0ZXJhdG9yc1NjYWxlKGl0dCswLCBzMCwgczEsIHMyKTsKLSAgICAgICAgaXR0WzddID0gLWxlcnAuaXRlcmF0b3JzU2NhbGUoaXR0KzMsIHQwLCB0MSwgdDIpOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleENvb3JkR3JhZFNjYWxlOHh2KGMsIGksIGl0dCk7Ci0gICAgfQotfQotCi12b2lkIGxlcnBfdGV4Y29vcmRzX3cob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQotewotICAgIGNvbnN0IGNvbXB1dGVfaXRlcmF0b3JzX3QmIGxlcnAgPSBjLT5sZXJwOwotICAgIGludDMyX3QgaXR0WzhdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSk7Ci0gICAgaW50MzJfdCBpdHdbM107Ci0KLSAgICAvLyBjb21wdXRlIFcncyBzY2FsZSB0byAyLjMwCi0gICAgaW50MzJfdCB3MCA9IHYwLT53aW5kb3cudzsKLSAgICBpbnQzMl90IHcxID0gdjEtPndpbmRvdy53OwotICAgIGludDMyX3QgdzIgPSB2Mi0+d2luZG93Lnc7Ci0gICAgaW50IHdzY2FsZSA9IDMyIC0gZ2dsQ2x6KHcwfHcxfHcyKTsKLQotICAgIC8vIGNvbXB1dGUgdGhlIGphY29iaWFuIHVzaW5nIGJsb2NrIGZsb2F0aW5nLXBvaW50ICAgIAotICAgIGludCBzYyA9IGxlcnAuaXRlcmF0b3JzU2NhbGUoaXR3LCB3MCwgdzEsIHcyKTsKLSAgICBzYyArPSAgd3NjYWxlIC0gMTY7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy53R3JhZDN4dihjLCBpdHcpOwotCi0gICAgZm9yIChpbnQgaT0wIDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHRleHR1cmVfdCYgdG11ID0gYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldOwotICAgICAgICBpZiAoIXRtdS5lbmFibGUpIAotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gY29tcHV0ZSB0aGUgamFjb2JpYW5zIHVzaW5nIGJsb2NrIGZsb2F0aW5nLXBvaW50Ci0gICAgICAgIGludDMyX3QgczAgPSB2MC0+dGV4dHVyZVtpXS5TOwotICAgICAgICBpbnQzMl90IHQwID0gdjAtPnRleHR1cmVbaV0uVDsKLSAgICAgICAgaW50MzJfdCBzMSA9IHYxLT50ZXh0dXJlW2ldLlM7Ci0gICAgICAgIGludDMyX3QgdDEgPSB2MS0+dGV4dHVyZVtpXS5UOwotICAgICAgICBpbnQzMl90IHMyID0gdjItPnRleHR1cmVbaV0uUzsKLSAgICAgICAgaW50MzJfdCB0MiA9IHYyLT50ZXh0dXJlW2ldLlQ7Ci0KLSAgICAgICAgY29uc3QgR0xlbnVtIG1pbl9maWx0ZXIgPSBjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZS0+bWluX2ZpbHRlcjsKLSAgICAgICAgaWYgKGdnbF91bmxpa2VseShtaW5fZmlsdGVyID49IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QpKSB7Ci0gICAgICAgICAgICBpbnQgbG9kID0gY29tcHV0ZV9sb2QoYywgaSwgczAsIHQwLCBzMSwgdDEsIHMyLCB0Mik7Ci0gICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmJpbmRUZXh0dXJlTG9kKGMsIGksCi0gICAgICAgICAgICAgICAgICAgICZjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZS0+bWlwKGxvZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHJlbXVsdGlwbHkgKHMsdCkgd2hlbiBjbGFtcGxpbmcKLSAgICAgICAgaWYgKHRtdS5zX3dyYXAgPT0gR0dMX0NMQU1QKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgd2lkdGggPSB0bXUuc3VyZmFjZS53aWR0aDsKLSAgICAgICAgICAgIHMwICo9IHdpZHRoOwotICAgICAgICAgICAgczEgKj0gd2lkdGg7Ci0gICAgICAgICAgICBzMiAqPSB3aWR0aDsKLSAgICAgICAgfQotICAgICAgICBpZiAodG11LnRfd3JhcCA9PSBHR0xfQ0xBTVApIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBoZWlnaHQgPSB0bXUuc3VyZmFjZS5oZWlnaHQ7Ci0gICAgICAgICAgICB0MCAqPSBoZWlnaHQ7Ci0gICAgICAgICAgICB0MSAqPSBoZWlnaHQ7Ci0gICAgICAgICAgICB0MiAqPSBoZWlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzMCA9IGdnbE11bHgoczAsIHcwLCB3c2NhbGUpOwotICAgICAgICB0MCA9IGdnbE11bHgodDAsIHcwLCB3c2NhbGUpOwotICAgICAgICBzMSA9IGdnbE11bHgoczEsIHcxLCB3c2NhbGUpOwotICAgICAgICB0MSA9IGdnbE11bHgodDEsIHcxLCB3c2NhbGUpOwotICAgICAgICBzMiA9IGdnbE11bHgoczIsIHcyLCB3c2NhbGUpOwotICAgICAgICB0MiA9IGdnbE11bHgodDIsIHcyLCB3c2NhbGUpOwotCi0gICAgICAgIGl0dFs2XSA9IHNjIC0gbGVycC5pdGVyYXRvcnNTY2FsZShpdHQrMCwgczAsIHMxLCBzMik7Ci0gICAgICAgIGl0dFs3XSA9IHNjIC0gbGVycC5pdGVyYXRvcnNTY2FsZShpdHQrMywgdDAsIHQxLCB0Mik7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4Q29vcmRHcmFkU2NhbGU4eHYoYywgaSwgaXR0KTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGlubGluZQotYm9vbCBjdWxsX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICBpZiAoZ2dsX2xpa2VseShjLT5jdWxsLmVuYWJsZSkpIHsKLSAgICAgICAgY29uc3QgR0xlbnVtIHdpbmRpbmcgPSAoYy0+bGVycC5hcmVhKCkgPiAwKSA/IEdMX0NXIDogR0xfQ0NXOwotICAgICAgICBjb25zdCBHTGVudW0gZmFjZSA9ICh3aW5kaW5nID09IGMtPmN1bGwuZnJvbnRGYWNlKSA/IEdMX0ZST05UIDogR0xfQkFDSzsKLSAgICAgICAgaWYgKGZhY2UgPT0gYy0+Y3VsbC5jdWxsRmFjZSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBjdWxsZWQhCi0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZQotR0xmaXhlZCBmcnVzdHVtUGxhbmVEaXN0KGludCBwbGFuZSwgY29uc3QgdmVjNF90JiBzKQotewotICAgIGNvbnN0IEdMZml4ZWQgZCA9IHMudlsgcGxhbmUgPj4gMSBdOwotICAgIHJldHVybiAgKChwbGFuZSAmIDEpID8gKHMudyAtIGQpIDogKHMudyArIGQpKTsgCi19Ci0KLXN0YXRpYyBpbmxpbmUKLWludDMyX3QgY2xpcERpdmlkZShHTGZpeGVkIGEsIEdMZml4ZWQgYikgewotICAgIC8vIHJldHVybnMgYSA0LjI4IGZpeGVkLXBvaW50Ci0gICAgcmV0dXJuIGdnbE11bERpdmkoMUxVPDwyOCwgYSwgYik7Ci19IAotCi12b2lkIGNsaXBfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQotewotICAgIHVpbnQzMl90IGFsbF9jYyA9ICh2MC0+ZmxhZ3MgfCB2MS0+ZmxhZ3MgfCB2Mi0+ZmxhZ3MpICYgdmVydGV4X3Q6OkNMSVBfQUxMOwotCi0gICAgdmVydGV4X3QgKnAwLCAqcDEsICpwMjsKLSAgICBjb25zdCBpbnQgTUFYX0NMSVBQSU5HX1BMQU5FUyA9IDYgKyBPR0xFU19NQVhfQ0xJUF9QTEFORVM7Ci0gICAgY29uc3QgaW50IE1BWF9WRVJUSUNFUyA9IDM7Ci0KLSAgICAvLyBUZW1wb3JhcnkgYnVmZmVyIHRvIGhvbGQgdGhlIG5ldyB2ZXJ0aWNlcy4gRWFjaCBwbGFuZSBjYW4gYWRkIHVwIHRvIAotICAgIC8vIHR3byBuZXcgdmVydGljZXMgKGJlY2F1c2UgdGhlIHBvbHlnb24gaXMgY29udmV4KS4KLSAgICAvLyBXZSBuZWVkIG9uZSBleHRyYSBlbGVtZW50LCB0byBoYW5kbGUgYW4gb3ZlcmZsb3cgY2FzZSB3aGVuCi0gICAgLy8gdGhlIHBvbHlnb24gZGVnZW5lcmF0ZXMgaW50byBzb21ldGhpbmcgbm9uIGNvbnZleC4KLSAgICB2ZXJ0ZXhfdCBidWZmZXJbTUFYX0NMSVBQSU5HX1BMQU5FUyAqIDIgKyAxXTsgICAvLyB+M0tCCi0gICAgdmVydGV4X3QqIGJ1ZiA9IGJ1ZmZlcjsKLQotICAgIC8vIG9yaWdpbmFsIGxpc3Qgb2YgdmVydGljZXMgKHBvbHlnb24gdG8gY2xpcCwgaW4gZmFjdCB0aGlzCi0gICAgLy8gZnVuY3Rpb24gd29ya3Mgd2l0aCBhbiBhcmJpdHJhcnkgcG9seWdvbikuCi0gICAgdmVydGV4X3QqIGluWzNdID0geyB2MCwgdjEsIHYyIH07Ci0gICAgCi0gICAgLy8gb3V0cHV0IGxpc3RzICh3ZSBuZWVkIDIsIHdoaWNoIHdlIHVzZSBiYWNrIGFuZCBmb3J0aCkKLSAgICAvLyAobWF4aW11bSBvdXRwb3V0IGxpc3QncyBzaXplIGlzIE1BWF9DTElQUElOR19QTEFORVMgKyBNQVhfVkVSVElDRVMpCi0gICAgLy8gMiBtb3JlIGVsZW1lbnRzIGZvciBvdmVyZmxvdyB3aGVuIG5vbiBjb252ZXggcG9seWdvbnMuCi0gICAgdmVydGV4X3QqIG91dFsyXVtNQVhfQ0xJUFBJTkdfUExBTkVTICsgTUFYX1ZFUlRJQ0VTICsgMl07Ci0gICAgdW5zaWduZWQgaW50IG91dGkgPSAwOwotICAgIAotICAgIC8vIGN1cnJlbnQgaW5wdXQgbGlzdAotICAgIHZlcnRleF90KiogaXZsID0gaW47Ci0KLSAgICAvLyAzIGlucHV0IHZlcnRpY2VzLCAwIGluIHRoZSBvdXRwdXQgbGlzdCwgZmlyc3QgcGxhbmUKLSAgICB1bnNpZ25lZCBpbnQgaWMgPSAzOwotCi0gICAgLy8gVXNlciBjbGlwLXBsYW5lcyBmaXJzdCwgdGhlIGNsaXBwaW5nIGlzIGFsd2F5cyBkb25lIGluIGV5ZS1jb29yZGluYXRlCi0gICAgLy8gdGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYWxnb3JpdGhtIHRoYW4gZm9yIHRoZSB2aWV3LXZvbHVtZQotICAgIC8vIGNsaXBwaW5nLCBleGNlcHQgZm9yIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgZGlzdGFuY2UgKHZlcnRleCwgcGxhbmUpCi0gICAgLy8gYW5kIHRoZSBmYWN0IHRoYXQgd2UgbmVlZCB0byBjb21wdXRlIHRoZSBleWUtY29vcmRpbmF0ZXMgb2YgZWFjaAotICAgIC8vIG5ldyB2ZXJ0ZXggd2UgY3JlYXRlLgotICAgIAotICAgIGlmIChnZ2xfdW5saWtlbHkoYWxsX2NjICYgdmVydGV4X3Q6OlVTRVJfQ0xJUF9BTEwpKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHBsYW5lID0gMDsKLSAgICAgICAgdWludDMyX3QgY2MgPSAoYWxsX2NjICYgdmVydGV4X3Q6OlVTRVJfQ0xJUF9BTEwpID4+IDg7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChjYyAmIDEpIHsgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHBvaW50ZXJzIHRvIG91ciBvdXRwdXQgbGlzdCAoaGVhZCBhbmQgY3VycmVudCkKLSAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCoqIGNvbnN0IG92bCA9ICZvdXRbb3V0aV1bMF07Ci0gICAgICAgICAgICAgICAgdmVydGV4X3QqKiBvdXRwdXQgPSBvdmw7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9jID0gMDsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2VudGluZWwgPSAwOwotICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHZlcnRleCwgY29tcHV0ZSBkaXN0YW5jZSB0byB0aGUgcGxhbmUKLSAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCogcyA9IGl2bFtpYy0xXTsKLSAgICAgICAgICAgICAgICBjb25zdCB2ZWM0X3QmIGVxdWF0aW9uID0gYy0+Y2xpcFBsYW5lcy5wbGFuZVtwbGFuZV0uZXF1YXRpb247Ci0gICAgICAgICAgICAgICAgR0xmaXhlZCBzZCA9IGRvdDQoZXF1YXRpb24udiwgcy0+ZXllLnYpOwotICAgICAgICAgICAgICAgIC8vIGNsaXAgZWFjaCB2ZXJ0ZXggYWdhaW5zdCB0aGlzIHBsYW5lLi4uCi0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wIDsgaTxpYyA7IGkrKykgeyAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCogcCA9IGl2bFtpXTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBwZCA9IGRvdDQoZXF1YXRpb24udiwgcC0+ZXllLnYpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2QgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGluc2lkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2MrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcyBpbnNpZGUsIHAgb3V0c2lkZSAoZXhpdGluZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHQgPSBjbGlwRGl2aWRlKHNkLCBzZC1wZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNsaXBFeWUoYywgYnVmLCB0LCBwLCBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0KysgPSBidWYrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3NlbnRpbmVsID49IDMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm9uLWNvbnZleCBwb2x5Z29uIQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzIG91dHNpZGUgKGVudGVyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHQgPSBjbGlwRGl2aWRlKHBkLCBwZC1zZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jbGlwRXllKGMsIGJ1ZiwgdCwgcywgcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IGJ1ZisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytzZW50aW5lbCA+PSAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBub24tY29udmV4IHBvbHlnb24hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2MrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIG91dHNpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzID0gcDsKLSAgICAgICAgICAgICAgICAgICAgc2QgPSBwZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gb3V0cHV0IGxpc3QgYmVjb21lIHRoZSBuZXcgaW5wdXQgbGlzdAotICAgICAgICAgICAgICAgIGlmIChvYzwzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGxlc3MgdGhhbiAzIHZlcnRpY2VzIGxlZnQ/IHdlJ3JlIGRvbmUhCi0gICAgICAgICAgICAgICAgaXZsID0gb3ZsOwotICAgICAgICAgICAgICAgIGljID0gb2M7Ci0gICAgICAgICAgICAgICAgb3V0aSA9IDEtb3V0aTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNjID4+PSAxOwotICAgICAgICAgICAgcGxhbmUrKzsKLSAgICAgICAgfSB3aGlsZSAoY2MpOwotICAgIH0KLQotICAgIC8vIGZydXN0dW0gY2xpcC1wbGFuZXMKLSAgICBpZiAoYWxsX2NjICYgdmVydGV4X3Q6OkZSVVNUVU1fQ0xJUF9BTEwpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBpbnQgcGxhbmUgPSAwOwotICAgICAgICB1aW50MzJfdCBjYyA9IGFsbF9jYyAmIHZlcnRleF90OjpGUlVTVFVNX0NMSVBfQUxMOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAoY2MgJiAxKSB7ICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBwb2ludGVycyB0byBvdXIgb3V0cHV0IGxpc3QgKGhlYWQgYW5kIGN1cnJlbnQpCi0gICAgICAgICAgICAgICAgdmVydGV4X3QqKiBjb25zdCBvdmwgPSAmb3V0W291dGldWzBdOwotICAgICAgICAgICAgICAgIHZlcnRleF90Kiogb3V0cHV0ID0gb3ZsOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvYyA9IDA7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNlbnRpbmVsID0gMDsKLSAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB2ZXJ0ZXgsIGNvbXB1dGUgZGlzdGFuY2UgdG8gdGhlIHBsYW5lCi0gICAgICAgICAgICAgICAgdmVydGV4X3QqIHMgPSBpdmxbaWMtMV07Ci0gICAgICAgICAgICAgICAgR0xmaXhlZCBzZCA9IGZydXN0dW1QbGFuZURpc3QocGxhbmUsIHMtPmNsaXApOwotICAgICAgICAgICAgICAgIC8vIGNsaXAgZWFjaCB2ZXJ0ZXggYWdhaW5zdCB0aGlzIHBsYW5lLi4uCi0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wIDsgaTxpYyA7IGkrKykgeyAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCogcCA9IGl2bFtpXTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBwZCA9IGZydXN0dW1QbGFuZURpc3QocGxhbmUsIHAtPmNsaXApOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2QgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGluc2lkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2MrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcyBpbnNpZGUsIHAgb3V0c2lkZSAoZXhpdGluZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHQgPSBjbGlwRGl2aWRlKHNkLCBzZC1wZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNsaXBWZXJ0ZXgoYywgYnVmLCB0LCBwLCBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0KysgPSBidWYrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3NlbnRpbmVsID49IDMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm9uLWNvbnZleCBwb2x5Z29uIQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzIG91dHNpZGUgKGVudGVyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHQgPSBjbGlwRGl2aWRlKHBkLCBwZC1zZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jbGlwVmVydGV4KGMsIGJ1ZiwgdCwgcywgcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IGJ1ZisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytzZW50aW5lbCA+PSAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBub24tY29udmV4IHBvbHlnb24hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2MrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIG91dHNpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzID0gcDsKLSAgICAgICAgICAgICAgICAgICAgc2QgPSBwZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gb3V0cHV0IGxpc3QgYmVjb21lIHRoZSBuZXcgaW5wdXQgbGlzdAotICAgICAgICAgICAgICAgIGlmIChvYzwzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGxlc3MgdGhhbiAzIHZlcnRpY2VzIGxlZnQ/IHdlJ3JlIGRvbmUhCi0gICAgICAgICAgICAgICAgaXZsID0gb3ZsOwotICAgICAgICAgICAgICAgIGljID0gb2M7Ci0gICAgICAgICAgICAgICAgb3V0aSA9IDEtb3V0aTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNjID4+PSAxOwotICAgICAgICAgICAgcGxhbmUrKzsKLSAgICAgICAgfSB3aGlsZSAoY2MpOwotICAgIH0KLSAgICAKLSAgICAvLyBmaW5hbGx5IHdlIGNhbiByZW5kZXIgb3VyIHRyaWFuZ2xlcy4uLgotICAgIHAwID0gaXZsWzBdOwotICAgIHAxID0gaXZsWzFdOwotICAgIGZvciAodW5zaWduZWQgaW50IGk9MiA7IGk8aWMgOyBpKyspIHsKLSAgICAgICAgcDIgPSBpdmxbaV07Ci0gICAgICAgIGMtPmxlcnAuaW5pdFRyaWFuZ2xlKHAwLCBwMSwgcDIpOwotICAgICAgICBpZiAoY3VsbF90cmlhbmdsZShjLCBwMCwgcDEsIHAyKSkgewotICAgICAgICAgICAgcDEgPSBwMjsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBjdWxsZWQhCi0gICAgICAgIH0KLSAgICAgICAgdHJpYW5nbGUoYywgcDAsIHAxLCBwMik7Ci0gICAgICAgIHAxID0gcDI7Ci0gICAgfQotfQotCi11bnNpZ25lZCBpbnQgY2xpcF9saW5lKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHMsIHZlcnRleF90KiBwKQotewotICAgIGNvbnN0IHVpbnQzMl90IGFsbF9jYyA9IChzLT5mbGFncyB8IHAtPmZsYWdzKSAmIHZlcnRleF90OjpDTElQX0FMTDsKLQotICAgIGlmIChnZ2xfdW5saWtlbHkoYWxsX2NjICYgdmVydGV4X3Q6OlVTRVJfQ0xJUF9BTEwpKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHBsYW5lID0gMDsKLSAgICAgICAgdWludDMyX3QgY2MgPSAoYWxsX2NjICYgdmVydGV4X3Q6OlVTRVJfQ0xJUF9BTEwpID4+IDg7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChjYyAmIDEpIHsKLSAgICAgICAgICAgICAgICBjb25zdCB2ZWM0X3QmIGVxdWF0aW9uID0gYy0+Y2xpcFBsYW5lcy5wbGFuZVtwbGFuZV0uZXF1YXRpb247Ci0gICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBzZCA9IGRvdDQoZXF1YXRpb24udiwgcy0+ZXllLnYpOwotICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgcGQgPSBkb3Q0KGVxdWF0aW9uLnYsIHAtPmV5ZS52KTsKLSAgICAgICAgICAgICAgICBpZiAoc2QgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBpbnNpZGUKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgaW5zaWRlLCBwIG91dHNpZGUgKGV4aXRpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHQgPSBjbGlwRGl2aWRlKHNkLCBzZC1wZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuY2xpcEV5ZShjLCBwLCB0LCBwLCBzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzIG91dHNpZGUgKGVudGVyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCB0ID0gY2xpcERpdmlkZShwZCwgcGQtc2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jbGlwRXllKGMsIHMsIHQsIHMsIHApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIG91dHNpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYyA+Pj0gMTsKLSAgICAgICAgICAgIHBsYW5lKys7Ci0gICAgICAgIH0gd2hpbGUgKGNjKTsKLSAgICB9Ci0KLSAgICAvLyBmcnVzdHVtIGNsaXAtcGxhbmVzCi0gICAgaWYgKGFsbF9jYyAmIHZlcnRleF90OjpGUlVTVFVNX0NMSVBfQUxMKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHBsYW5lID0gMDsKLSAgICAgICAgdWludDMyX3QgY2MgPSBhbGxfY2MgJiB2ZXJ0ZXhfdDo6RlJVU1RVTV9DTElQX0FMTDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKGNjICYgMSkgewotICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgc2QgPSBmcnVzdHVtUGxhbmVEaXN0KHBsYW5lLCBzLT5jbGlwKTsKLSAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHBkID0gZnJ1c3R1bVBsYW5lRGlzdChwbGFuZSwgcC0+Y2xpcCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaW5zaWRlCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzIGluc2lkZSwgcCBvdXRzaWRlIChleGl0aW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCB0ID0gY2xpcERpdmlkZShzZCwgc2QtcGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNsaXBWZXJ0ZXgoYywgcCwgdCwgcCwgcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcyBvdXRzaWRlIChlbnRlcmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUocGQsIHBkLXNkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuY2xpcFZlcnRleChjLCBzLCB0LCBzLCBwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBvdXRzaWRlCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2MgPj49IDE7Ci0gICAgICAgICAgICBwbGFuZSsrOwotICAgICAgICB9IHdoaWxlIChjYyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDI7Ci19Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5oIGIvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZWY2MDQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL3ByaW1pdGl2ZXMuaAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19QUklNSVRJVkVTX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19QUklNSVRJVkVTX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIGdsIHsKLXN0cnVjdCBvZ2xlc19jb250ZXh0X3Q7Ci19OwotCi12b2lkIG9nbGVzX3ZhbGlkYXRlX3ByaW1pdGl2ZXMob2dsZXNfY29udGV4dF90KiBjKTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfUFJJTUlUSVZFU19ICi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvc3RhdGUuY3BwIGIvb3BlbmdsL2xpYmFnbC9zdGF0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZTk2MTIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9zdGF0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OTcgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9zdGF0ZS5jcHAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiY29udGV4dC5oIgotI2luY2x1ZGUgImZwLmgiCi0jaW5jbHVkZSAic3RhdGUuaCIKLSNpbmNsdWRlICJhcnJheS5oIgotI2luY2x1ZGUgIm1hdHJpeC5oIgotI2luY2x1ZGUgInZlcnRleC5oIgotI2luY2x1ZGUgImxpZ2h0LmgiCi0jaW5jbHVkZSAidGV4dHVyZS5oIgotI2luY2x1ZGUgIkJ1ZmZlck9iamVjdE1hbmFnZXIuaCIKLSNpbmNsdWRlICJUZXh0dXJlT2JqZWN0TWFuYWdlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVuZG9yU3RyaW5nICAgICA9ICJBbmRyb2lkIjsKLXN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1JlbmRlcmVyU3RyaW5nICAgPSAiQW5kcm9pZCBQaXhlbEZsaW5nZXIgMS40IjsKLXN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlcnNpb25TdHJpbmcgICAgPSAiT3BlbkdMIEVTLUNNIDEuMCI7Ci1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdFeHRlbnNpb25zU3RyaW5nID0KLSAgICAiR0xfT0VTX2J5dGVfY29vcmRpbmF0ZXMgIiAgICAgICAgICAgICAgLy8gT0sKLSAgICAiR0xfT0VTX2ZpeGVkX3BvaW50ICIgICAgICAgICAgICAgICAgICAgLy8gT0sKLSAgICAiR0xfT0VTX3NpbmdsZV9wcmVjaXNpb24gIiAgICAgICAgICAgICAgLy8gT0sKLSAgICAiR0xfT0VTX3JlYWRfZm9ybWF0ICIgICAgICAgICAgICAgICAgICAgLy8gT0sKLSAgICAiR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZSAiICAgLy8gT0sKLSAgICAiR0xfT0VTX2RyYXdfdGV4dHVyZSAiICAgICAgICAgICAgICAgICAgLy8gT0sKLSAgICAiR0xfT0VTX21hdHJpeF9nZXQgIiAgICAgICAgICAgICAgICAgICAgLy8gT0sKLSAgICAiR0xfT0VTX3F1ZXJ5X21hdHJpeCAiICAgICAgICAgICAgICAgICAgLy8gT0sKLSAgICAvLyAgICAgICAgIkdMX09FU19wb2ludF9zaXplX2FycmF5ICIgICAgICAgICAgICAgIC8vIFRPRE8KLSAgICAvLyAgICAgICAgIkdMX09FU19wb2ludF9zcHJpdGUgIiAgICAgICAgICAgICAgICAgIC8vIFRPRE8KLSAgICAiR0xfT0VTX0VHTF9pbWFnZSAiICAgICAgICAgICAgICAgICAgICAgLy8gT0sKLSNpZmRlZiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZQotICAgICJHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZSAiICAvLyBPSwotI2VuZGlmCi0gICAgIkdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uICIgICAgICAgICAgIC8vIE9LCi0gICAgIkdMX0FSQl90ZXh0dXJlX25vbl9wb3dlcl9vZl90d28gIiAgICAgIC8vIE9LCi0gICAgIkdMX0FORFJPSURfdXNlcl9jbGlwX3BsYW5lICIgICAgICAgICAgIC8vIE9LCi0gICAgIkdMX0FORFJPSURfdmVydGV4X2J1ZmZlcl9vYmplY3QgIiAgICAgIC8vIE9LCi0gICAgIkdMX0FORFJPSURfZ2VuZXJhdGVfbWlwbWFwICIgICAgICAgICAgIC8vIE9LCi0gICAgOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNlbmRpZgotCi1vZ2xlc19jb250ZXh0X3QgKm9nbGVzX2luaXQoc2l6ZV90IGV4dHJhKQotewotICAgIHZvaWQqIGNvbnN0IGJhc2UgPSBtYWxsb2MoZXh0cmEgKyBzaXplb2Yob2dsZXNfY29udGV4dF90KSArIDMyKTsKLSAgICBpZiAoIWJhc2UpIHJldHVybiAwOwotCi0gICAgb2dsZXNfY29udGV4dF90ICpjID0KLSAgICAgICAgICAgIChvZ2xlc19jb250ZXh0X3QgKikoKHB0cmRpZmZfdChiYXNlKSArIGV4dHJhICsgMzEpICYgfjB4MUZMKTsKLSAgICBtZW1zZXQoYywgMCwgc2l6ZW9mKG9nbGVzX2NvbnRleHRfdCkpOwotICAgIGdnbF9pbml0X2NvbnRleHQoJihjLT5yYXN0ZXJpemVyKSk7Ci0KLSAgICAvLyBYWFg6IHRoaXMgc2hvdWxkIGJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudAotICAgIHNwPEVHTFN1cmZhY2VNYW5hZ2VyPiBzbWdyKG5ldyBFR0xTdXJmYWNlTWFuYWdlcigpKTsKLSAgICBjLT5zdXJmYWNlTWFuYWdlciA9IHNtZ3IuZ2V0KCk7Ci0gICAgYy0+c3VyZmFjZU1hbmFnZXItPmluY1N0cm9uZyhjKTsKLQotICAgIHNwPEVHTEJ1ZmZlck9iamVjdE1hbmFnZXI+IGJvbWdyKG5ldyBFR0xCdWZmZXJPYmplY3RNYW5hZ2VyKCkpOwotICAgIGMtPmJ1ZmZlck9iamVjdE1hbmFnZXIgPSBib21nci5nZXQoKTsKLSAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5pbmNTdHJvbmcoYyk7Ci0KLSAgICBvZ2xlc19pbml0X2FycmF5KGMpOwotICAgIG9nbGVzX2luaXRfbWF0cml4KGMpOwotICAgIG9nbGVzX2luaXRfdmVydGV4KGMpOwotICAgIG9nbGVzX2luaXRfbGlnaHQoYyk7Ci0gICAgb2dsZXNfaW5pdF90ZXh0dXJlKGMpOwotCi0gICAgYy0+cmFzdGVyaXplci5iYXNlID0gYmFzZTsKLSAgICBjLT5wb2ludC5zaXplID0gVFJJX09ORTsKLSAgICBjLT5saW5lLndpZHRoID0gVFJJX09ORTsKLQotICAgIC8vIGluIE9wZW5HTCwgd3JpdGluZyB0byB0aGUgZGVwdGggYnVmZmVyIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRlcHRoTWFzayhjLCAxKTsKLQotICAgIC8vIE9wZW5HTCBlbmFibGVzIGRpdGhlcmluZyBieSBkZWZhdWx0Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5lbmFibGUoYywgR0xfRElUSEVSKTsKLQotICAgIHJldHVybiBjOwotfQotCi12b2lkIG9nbGVzX3VuaW5pdChvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgb2dsZXNfdW5pbml0X2FycmF5KGMpOwotICAgIG9nbGVzX3VuaW5pdF9tYXRyaXgoYyk7Ci0gICAgb2dsZXNfdW5pbml0X3ZlcnRleChjKTsKLSAgICBvZ2xlc191bmluaXRfbGlnaHQoYyk7Ci0gICAgb2dsZXNfdW5pbml0X3RleHR1cmUoYyk7Ci0gICAgYy0+c3VyZmFjZU1hbmFnZXItPmRlY1N0cm9uZyhjKTsKLSAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5kZWNTdHJvbmcoYyk7Ci0gICAgZ2dsX3VuaW5pdF9jb250ZXh0KCYoYy0+cmFzdGVyaXplcikpOwotICAgIGZyZWUoYy0+cmFzdGVyaXplci5iYXNlKTsKLX0KLQotdm9pZCBfb2dsZXNfZXJyb3Iob2dsZXNfY29udGV4dF90KiBjLCBHTGVudW0gZXJyb3IpCi17Ci0gICAgaWYgKGMtPmVycm9yID09IEdMX05PX0VSUk9SKQotICAgICAgICBjLT5lcnJvciA9IGVycm9yOwotfQotCi1zdGF0aWMgYm9vbCBzdGVuY2lsb3BfdmFsaWQoR0xlbnVtIG9wKSB7Ci0gICAgc3dpdGNoIChvcCkgewotICAgIGNhc2UgR0xfS0VFUDoKLSAgICBjYXNlIEdMX1pFUk86Ci0gICAgY2FzZSBHTF9SRVBMQUNFOgotICAgIGNhc2UgR0xfSU5DUjoKLSAgICBjYXNlIEdMX0RFQ1I6Ci0gICAgY2FzZSBHTF9JTlZFUlQ6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9kaXNhYmxlKG9nbGVzX2NvbnRleHRfdCogYywgR0xlbnVtIGNhcCwgaW50IGVuYWJsZWQpCi17Ci0gICAgaWYgKChjYXAgPj0gR0xfTElHSFQwKSAmJiAoY2FwPEdMX0xJR0hUMCtPR0xFU19NQVhfTElHSFRTKSkgewotICAgICAgICBjLT5saWdodGluZy5saWdodHNbY2FwLUdMX0xJR0hUMF0uZW5hYmxlID0gZW5hYmxlZDsKLSAgICAgICAgYy0+bGlnaHRpbmcuZW5hYmxlZExpZ2h0cyAmPSB+KDE8PChjYXAtR0xfTElHSFQwKSk7Ci0gICAgICAgIGMtPmxpZ2h0aW5nLmVuYWJsZWRMaWdodHMgfD0gKGVuYWJsZWQ8PChjYXAtR0xfTElHSFQwKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGNhcCkgewotICAgIGNhc2UgR0xfUE9JTlRfU01PT1RIOgotICAgICAgICBjLT5wb2ludC5zbW9vdGggPSBlbmFibGVkOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0xJTkVfU01PT1RIOgotICAgICAgICBjLT5saW5lLnNtb290aCA9IGVuYWJsZWQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfRklMTDoKLSAgICAgICAgYy0+cG9seWdvbk9mZnNldC5lbmFibGUgPSBlbmFibGVkOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0NVTExfRkFDRToKLSAgICAgICAgYy0+Y3VsbC5lbmFibGUgPSBlbmFibGVkOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0xJR0hUSU5HOgotICAgICAgICBjLT5saWdodGluZy5lbmFibGUgPSBlbmFibGVkOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0NPTE9SX01BVEVSSUFMOgotICAgICAgICBjLT5saWdodGluZy5jb2xvck1hdGVyaWFsLmVuYWJsZSA9IGVuYWJsZWQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfTk9STUFMSVpFOgotICAgIGNhc2UgR0xfUkVTQ0FMRV9OT1JNQUw6Ci0gICAgICAgIGMtPnRyYW5zZm9ybXMucmVzY2FsZU5vcm1hbHMgPSBlbmFibGVkID8gY2FwIDogMDsKLSAgICAgICAgLy8gWFhYOiBpbnZhbGlkYXRlIG12aXQKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdMX0NMSVBfUExBTkUwOgotICAgIGNhc2UgR0xfQ0xJUF9QTEFORTE6Ci0gICAgY2FzZSBHTF9DTElQX1BMQU5FMjoKLSAgICBjYXNlIEdMX0NMSVBfUExBTkUzOgotICAgIGNhc2UgR0xfQ0xJUF9QTEFORTQ6Ci0gICAgY2FzZSBHTF9DTElQX1BMQU5FNToKLSAgICAgICAgYy0+Y2xpcFBsYW5lcy5lbmFibGUgJj0gfigxPDwoY2FwLUdMX0NMSVBfUExBTkUwKSk7Ci0gICAgICAgIGMtPmNsaXBQbGFuZXMuZW5hYmxlIHw9IChlbmFibGVkPDwoY2FwLUdMX0NMSVBfUExBTkUwKSk7Ci0gICAgICAgIG9nbGVzX2ludmFsaWRhdGVfcGVyc3BlY3RpdmUoYyk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHTF9GT0c6Ci0gICAgY2FzZSBHTF9ERVBUSF9URVNUOgotICAgICAgICBvZ2xlc19pbnZhbGlkYXRlX3BlcnNwZWN0aXZlKGMpOwotICAgICAgICAvLyBmYWxsLXRocm91Z2guLi4KLSAgICBjYXNlIEdMX0JMRU5EOgotICAgIGNhc2UgR0xfU0NJU1NPUl9URVNUOgotICAgIGNhc2UgR0xfQUxQSEFfVEVTVDoKLSAgICBjYXNlIEdMX0NPTE9SX0xPR0lDX09QOgotICAgIGNhc2UgR0xfRElUSEVSOgotICAgIGNhc2UgR0xfU1RFTkNJTF9URVNUOgotICAgIGNhc2UgR0xfVEVYVFVSRV8yRDoKLSAgICAgICAgLy8gdGhlc2UgbmVlZCB0byBmYWxsIHRocm91Z2ggaW50byB0aGUgcmFzdGVyaXplcgotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmVuYWJsZURpc2FibGUoYywgY2FwLCBlbmFibGVkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUzoKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5lbmFibGVEaXNhYmxlKGMsIEdMX1RFWFRVUkVfMkQsIGVuYWJsZWQpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgR0xfTVVMVElTQU1QTEU6Ci0gICAgY2FzZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0U6Ci0gICAgY2FzZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FOgotICAgIGNhc2UgR0xfU0FNUExFX0NPVkVSQUdFOgotICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgaW1wbGVtZW50YXRpb24KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCi0KLS8vIFRoZXNlIG9uZXMgYXJlIHN1cGVyLWVhc3ksIHdlJ3JlIG5vdCBzdXBwb3J0aW5nIHRob3NlIGZlYXR1cmVzIQotdm9pZCBnbFNhbXBsZUNvdmVyYWdlKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7Ci19Ci12b2lkIGdsU2FtcGxlQ292ZXJhZ2V4KEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7Ci19Ci12b2lkIGdsU3RlbmNpbEZ1bmMoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChmdW5jIDwgR0xfTkVWRVIgfHwgZnVuYyA+IEdMX0FMV0FZUykgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIGZyb20gT3BlbkdMfEVTIDEuMCBzZXBjaWZpY2F0aW9uOgotICAgIC8vIElmIHRoZXJlIGlzIG5vIHN0ZW5jaWwgYnVmZmVyLCBubyBzdGVuY2lsIG1vZGlmaWNhdGlvbiBjYW4gb2NjdXIKLSAgICAvLyBhbmQgaXQgaXMgYXMgaWYgdGhlIHN0ZW5jaWwgdGVzdCBhbHdheXMgcGFzc2VzLgotfQotCi12b2lkIGdsU3RlbmNpbE9wKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKChzdGVuY2lsb3BfdmFsaWQoZmFpbCkgJgotICAgICAgICAgc3RlbmNpbG9wX3ZhbGlkKHpmYWlsKSAmCi0gICAgICAgICBzdGVuY2lsb3BfdmFsaWQoenBhc3MpKSA9PSAwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBnbEFscGhhRnVuYyhHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKQotewotICAgIGdsQWxwaGFGdW5jeChmdW5jLCBnZ2xGbG9hdFRvRml4ZWQocmVmKSk7Ci19Ci0KLXZvaWQgZ2xDdWxsRmFjZShHTGVudW0gbW9kZSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2UgR0xfRlJPTlQ6Ci0gICAgY2FzZSBHTF9CQUNLOgotICAgIGNhc2UgR0xfRlJPTlRfQU5EX0JBQ0s6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgfQotICAgIGMtPmN1bGwuY3VsbEZhY2UgPSBtb2RlOwotfQotCi12b2lkIGdsRnJvbnRGYWNlKEdMZW51bSBtb2RlKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgY2FzZSBHTF9DVzoKLSAgICBjYXNlIEdMX0NDVzoKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT5jdWxsLmZyb250RmFjZSA9IG1vZGU7Ci19Ci0KLXZvaWQgZ2xIaW50KEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgc3dpdGNoICh0YXJnZXQpIHsKLSAgICBjYXNlIEdMX0ZPR19ISU5UOgotICAgIGNhc2UgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQ6Ci0gICAgY2FzZSBHTF9MSU5FX1NNT09USF9ISU5UOgotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1BPSU5UX1NNT09USF9ISU5UOgotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmVuYWJsZURpc2FibGUoYywKLSAgICAgICAgICAgICAgICBHR0xfUE9JTlRfU01PT1RIX05JQ0UsIG1vZGU9PUdMX05JQ0VTVCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UOgotICAgICAgICBjLT5wZXJzcGVjdGl2ZSA9IChtb2RlID09IEdMX05JQ0VTVCkgPyAxIDogMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICB9Ci19Ci0KLXZvaWQgZ2xFbmFibGUoR0xlbnVtIGNhcCkgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgZW5hYmxlX2Rpc2FibGUoYywgY2FwLCAxKTsKLX0KLXZvaWQgZ2xEaXNhYmxlKEdMZW51bSBjYXApIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGVuYWJsZV9kaXNhYmxlKGMsIGNhcCwgMCk7Ci19Ci0KLXZvaWQgZ2xGaW5pc2goKQoteyAvLyBub3RoaW5nIHRvIGRvIGZvciBvdXIgc29mdHdhcmUgaW1wbGVtZW50YXRpb24KLX0KLQotdm9pZCBnbEZsdXNoKCkKLXsgLy8gbm90aGluZyB0byBkbyBmb3Igb3VyIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uCi19Ci0KLUdMZW51bSBnbEdldEVycm9yKCkKLXsKLSAgICAvLyBGcm9tIE9wZW5HTHxFUyAxLjAgc3BlY2lmaWNhdGlvbjoKLSAgICAvLyBJZiBtb3JlIHRoYW4gb25lIGZsYWcgaGFzIHJlY29yZGVkIGFuIGVycm9yLCBnbEdldEVycm9yIHJldHVybnMKLSAgICAvLyBhbmQgY2xlYXJzIGFuIGFyYml0cmFyeSBlcnJvciBmbGFnIHZhbHVlLiBUaHVzLCBnbEdldEVycm9yIHNob3VsZAotICAgIC8vIGFsd2F5cyBiZSBjYWxsZWQgaW4gYSBsb29wLCB1bnRpbCBpdCByZXR1cm5zIEdMX05PX0VSUk9SLAotICAgIC8vIGlmIGFsbCBlcnJvciBmbGFncyBhcmUgdG8gYmUgcmVzZXQuCi0KLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChjLT5lcnJvcikgewotICAgICAgICBjb25zdCBHTGVudW0gcmV0KGMtPmVycm9yKTsKLSAgICAgICAgYy0+ZXJyb3IgPSAwOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGlmIChjLT5yYXN0ZXJpemVyLmVycm9yKSB7Ci0gICAgICAgIGNvbnN0IEdMZW51bSByZXQoYy0+cmFzdGVyaXplci5lcnJvcik7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIuZXJyb3IgPSAwOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHJldHVybiBHTF9OT19FUlJPUjsKLX0KLQotY29uc3QgR0x1Ynl0ZSogZ2xHZXRTdHJpbmcoR0xlbnVtIHN0cmluZykKLXsKLSAgICBzd2l0Y2ggKHN0cmluZykgewotICAgIGNhc2UgR0xfVkVORE9SOiAgICAgcmV0dXJuIChjb25zdCBHTHVieXRlKilnVmVuZG9yU3RyaW5nOwotICAgIGNhc2UgR0xfUkVOREVSRVI6ICAgcmV0dXJuIChjb25zdCBHTHVieXRlKilnUmVuZGVyZXJTdHJpbmc7Ci0gICAgY2FzZSBHTF9WRVJTSU9OOiAgICByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKWdWZXJzaW9uU3RyaW5nOwotICAgIGNhc2UgR0xfRVhURU5TSU9OUzogcmV0dXJuIChjb25zdCBHTHVieXRlKilnRXh0ZW5zaW9uc1N0cmluZzsKLSAgICB9Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIGdsR2V0SW50ZWdlcnYoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQotewotICAgIGludCBpOwotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgc3dpdGNoIChwbmFtZSkgewotICAgIGNhc2UgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFOgotICAgICAgICBwYXJhbXNbMF0gPSAwOwotICAgICAgICBwYXJhbXNbMV0gPSBHR0xfTUFYX0FMSUFTRURfUE9JTlRfU0laRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0U6Ci0gICAgICAgIHBhcmFtc1swXSA9IDA7Ci0gICAgICAgIHBhcmFtc1sxXSA9IEdHTF9NQVhfQUxJQVNFRF9QT0lOVF9TSVpFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0FMUEhBX0JJVFM6IHsKLSAgICAgICAgaW50IGluZGV4ID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmNvbG9yLmZvcm1hdDsKLSAgICAgICAgR0dMRm9ybWF0IGNvbnN0ICogZm9ybWF0cyA9IGdnbEdldFBpeGVsRm9ybWF0VGFibGUoKTsKLSAgICAgICAgcGFyYW1zWzBdID0gZm9ybWF0c1tpbmRleF0uYWggLSBmb3JtYXRzW2luZGV4XS5hbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBjYXNlIEdMX1JFRF9CSVRTOiB7Ci0gICAgICAgIGludCBpbmRleCA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5mb3JtYXQ7Ci0gICAgICAgIEdHTEZvcm1hdCBjb25zdCAqIGZvcm1hdHMgPSBnZ2xHZXRQaXhlbEZvcm1hdFRhYmxlKCk7Ci0gICAgICAgIHBhcmFtc1swXSA9IGZvcm1hdHNbaW5kZXhdLnJoIC0gZm9ybWF0c1tpbmRleF0ucmw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgY2FzZSBHTF9HUkVFTl9CSVRTOiB7Ci0gICAgICAgIGludCBpbmRleCA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5mb3JtYXQ7Ci0gICAgICAgIEdHTEZvcm1hdCBjb25zdCAqIGZvcm1hdHMgPSBnZ2xHZXRQaXhlbEZvcm1hdFRhYmxlKCk7Ci0gICAgICAgIHBhcmFtc1swXSA9IGZvcm1hdHNbaW5kZXhdLmdoIC0gZm9ybWF0c1tpbmRleF0uZ2w7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgY2FzZSBHTF9CTFVFX0JJVFM6IHsKLSAgICAgICAgaW50IGluZGV4ID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmNvbG9yLmZvcm1hdDsKLSAgICAgICAgR0dMRm9ybWF0IGNvbnN0ICogZm9ybWF0cyA9IGdnbEdldFBpeGVsRm9ybWF0VGFibGUoKTsKLSAgICAgICAgcGFyYW1zWzBdID0gZm9ybWF0c1tpbmRleF0uYmggLSBmb3JtYXRzW2luZGV4XS5ibDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBjYXNlIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOgotICAgICAgICBwYXJhbXNbIDBdID0gR0xfUEFMRVRURTRfUkdCOF9PRVM7Ci0gICAgICAgIHBhcmFtc1sgMV0gPSBHTF9QQUxFVFRFNF9SR0JBOF9PRVM7Ci0gICAgICAgIHBhcmFtc1sgMl0gPSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVM7Ci0gICAgICAgIHBhcmFtc1sgM10gPSBHTF9QQUxFVFRFNF9SR0JBNF9PRVM7Ci0gICAgICAgIHBhcmFtc1sgNF0gPSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUzsKLSAgICAgICAgcGFyYW1zWyA1XSA9IEdMX1BBTEVUVEU4X1JHQjhfT0VTOwotICAgICAgICBwYXJhbXNbIDZdID0gR0xfUEFMRVRURThfUkdCQThfT0VTOwotICAgICAgICBwYXJhbXNbIDddID0gR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTOwotICAgICAgICBwYXJhbXNbIDhdID0gR0xfUEFMRVRURThfUkdCQTRfT0VTOwotICAgICAgICBwYXJhbXNbIDldID0gR0xfUEFMRVRURThfUkdCNV9BMV9PRVM7Ci0gICAgICAgIGkgPSAxMDsKLSNpZmRlZiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZQotICAgICAgICBwYXJhbXNbaSsrXSA9IEdMX0VUQzFfUkdCOF9PRVM7Ci0jZW5kaWYKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9ERVBUSF9CSVRTOgotICAgICAgICBwYXJhbXNbMF0gPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuZGVwdGguZm9ybWF0ID8gMCA6IDE2OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUzoKLSAgICAgICAgcGFyYW1zWzBdID0gR0xfUkdCOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVM6Ci0gICAgICAgIHBhcmFtc1swXSA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX01BWF9MSUdIVFM6Ci0gICAgICAgIHBhcmFtc1swXSA9IE9HTEVTX01BWF9MSUdIVFM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfTUFYX0NMSVBfUExBTkVTOgotICAgICAgICBwYXJhbXNbMF0gPSBPR0xFU19NQVhfQ0xJUF9QTEFORVM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSDoKLSAgICAgICAgcGFyYW1zWzBdID0gT0dMRVNfTU9ERUxWSUVXX1NUQUNLX0RFUFRIOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIOgotICAgICAgICBwYXJhbXNbMF0gPSBPR0xFU19QUk9KRUNUSU9OX1NUQUNLX0RFUFRIOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRIOgotICAgICAgICBwYXJhbXNbMF0gPSBPR0xFU19URVhUVVJFX1NUQUNLX0RFUFRIOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX01BWF9URVhUVVJFX1NJWkU6Ci0gICAgICAgIHBhcmFtc1swXSA9IEdHTF9NQVhfVEVYVFVSRV9TSVpFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX01BWF9URVhUVVJFX1VOSVRTOgotICAgICAgICBwYXJhbXNbMF0gPSBHR0xfVEVYVFVSRV9VTklUX0NPVU5UOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX01BWF9WSUVXUE9SVF9ESU1TOgotICAgICAgICBwYXJhbXNbMF0gPSBHR0xfTUFYX1ZJRVdQT1JUX0RJTVM7Ci0gICAgICAgIHBhcmFtc1sxXSA9IEdHTF9NQVhfVklFV1BPUlRfRElNUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6Ci0gICAgICAgIHBhcmFtc1swXSA9IE9HTEVTX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRToKLSAgICAgICAgcGFyYW1zWzBdID0gMDsKLSAgICAgICAgcGFyYW1zWzFdID0gR0dMX01BWF9TTU9PVEhfTElORV9XSURUSDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRToKLSAgICAgICAgcGFyYW1zWzBdID0gMDsKLSAgICAgICAgcGFyYW1zWzFdID0gR0dMX01BWF9TTU9PVEhfUE9JTlRfU0laRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9TVEVOQ0lMX0JJVFM6Ci0gICAgICAgIHBhcmFtc1swXSA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfU1VCUElYRUxfQklUUzoKLSAgICAgICAgcGFyYW1zWzBdID0gR0dMX1NVQlBJWEVMX0JJVFM7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUzoKLSAgICAgICAgbWVtY3B5KCBwYXJhbXMsCi0gICAgICAgICAgICAgICAgYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXcudG9wKCkuZWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgICAxNipzaXplb2YoR0xpbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVM6Ci0gICAgICAgIG1lbWNweSggcGFyYW1zLAotICAgICAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMucHJvamVjdGlvbi50b3AoKS5lbGVtZW50cygpLAotICAgICAgICAgICAgICAgIDE2KnNpemVvZihHTGludCkpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUzoKLSAgICAgICAgbWVtY3B5KCBwYXJhbXMsCi0gICAgICAgICAgICAgICAgYy0+dHJhbnNmb3Jtcy50ZXh0dXJlW2MtPnRleHR1cmVzLmFjdGl2ZV0udG9wKCkuZWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgICAxNipzaXplb2YoR0xpbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBnbFBvaW50U2l6ZShHTGZsb2F0IHNpemUpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoc2l6ZSA8PSAwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+cG9pbnQuc2l6ZSA9IFRSSV9GUk9NX0ZJWEVEKGdnbEZsb2F0VG9GaXhlZChzaXplKSk7Ci19Ci0KLXZvaWQgZ2xQb2ludFNpemV4KEdMZml4ZWQgc2l6ZSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChzaXplIDw9IDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT5wb2ludC5zaXplID0gVFJJX0ZST01fRklYRUQoc2l6ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBnbExpbmVXaWR0aChHTGZsb2F0IHdpZHRoKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHdpZHRoIDw9IDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT5saW5lLndpZHRoID0gVFJJX0ZST01fRklYRUQoZ2dsRmxvYXRUb0ZpeGVkKHdpZHRoKSk7Ci19Ci0KLXZvaWQgZ2xMaW5lV2lkdGh4KEdMZml4ZWQgd2lkdGgpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAod2lkdGggPD0gMCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGMtPmxpbmUud2lkdGggPSBUUklfRlJPTV9GSVhFRCh3aWR0aCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBnbENvbG9yTWFzayhHTGJvb2xlYW4gciwgR0xib29sZWFuIGcsIEdMYm9vbGVhbiBiLCBHTGJvb2xlYW4gYSkgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvck1hc2soYywgciwgZywgYiwgYSk7Ci19Ci0KLXZvaWQgZ2xEZXB0aE1hc2soR0xib29sZWFuIGZsYWcpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZGVwdGhNYXNrKGMsIGZsYWcpOwotfQotCi12b2lkIGdsU3RlbmNpbE1hc2soR0x1aW50IG1hc2spIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3Muc3RlbmNpbE1hc2soYywgbWFzayk7Ci19Ci0KLXZvaWQgZ2xEZXB0aEZ1bmMoR0xlbnVtIGZ1bmMpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZGVwdGhGdW5jKGMsIGZ1bmMpOwotfQotCi12b2lkIGdsTG9naWNPcChHTGVudW0gb3Bjb2RlKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmxvZ2ljT3AoYywgb3Bjb2RlKTsKLX0KLQotdm9pZCBnbEFscGhhRnVuY3goR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5hbHBoYUZ1bmN4KGMsIGZ1bmMsIHJlZik7Ci19Ci0KLXZvaWQgZ2xCbGVuZEZ1bmMoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmJsZW5kRnVuYyhjLCBzZmFjdG9yLCBkZmFjdG9yKTsKLX0KLQotdm9pZCBnbENsZWFyKEdMYml0ZmllbGQgbWFzaykgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5jbGVhcihjLCBtYXNrKTsKLX0KLQotdm9pZCBnbENsZWFyQ29sb3J4KEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNsZWFyQ29sb3J4KGMsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLQotdm9pZCBnbENsZWFyQ29sb3IoR0xjbGFtcGYgciwgR0xjbGFtcGYgZywgR0xjbGFtcGYgYiwgR0xjbGFtcGYgYSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY2xlYXJDb2xvcngoYywKLSAgICAgICAgICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKHIpLAotICAgICAgICAgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoZyksCi0gICAgICAgICAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChiKSwKLSAgICAgICAgICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGEpKTsKLX0KLQotdm9pZCBnbENsZWFyRGVwdGh4KEdMY2xhbXB4IGRlcHRoKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNsZWFyRGVwdGh4KGMsIGRlcHRoKTsKLX0KLQotdm9pZCBnbENsZWFyRGVwdGhmKEdMY2xhbXBmIGRlcHRoKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5jbGVhckRlcHRoeChjLCBnZ2xGbG9hdFRvRml4ZWQoZGVwdGgpKTsKLX0KLQotdm9pZCBnbENsZWFyU3RlbmNpbChHTGludCBzKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNsZWFyU3RlbmNpbChjLCBzKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvc3RhdGUuaCBiL29wZW5nbC9saWJhZ2wvc3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhNWNjYi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL3N0YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL3N0YXRlLmgKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfU1RBVEVfSAotI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1NUQVRFX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9waXhlbGZsaW5nZXIvZ2dsX2NvbnRleHQuaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotb2dsZXNfY29udGV4dF90ICpvZ2xlc19pbml0KHNpemVfdCBleHRyYSk7Ci12b2lkIG9nbGVzX3VuaW5pdChvZ2xlc19jb250ZXh0X3QqIGMpOwotdm9pZCBfb2dsZXNfZXJyb3Iob2dsZXNfY29udGV4dF90KiBjLCBHTGVudW0gZXJyb3IpOwotCi0jaWZuZGVmIFRSQUNFX0dMX0VSUk9SUwotI2RlZmluZSBUUkFDRV9HTF9FUlJPUlMgMAotI2VuZGlmCi0KLSNpZiBUUkFDRV9HTF9FUlJPUlMKLSNkZWZpbmUgb2dsZXNfZXJyb3IoYywgZXJyb3IpIFwKLWRvIHsgXAotICBwcmludGYoIm9nbGVzX2Vycm9yIGF0IGZpbGUgJXMgbGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgXAotICBfb2dsZXNfZXJyb3IoYywgZXJyb3IpOyBcCi19IHdoaWxlICgwKQotI2Vsc2UgLyogIVRSQUNFX0dMX0VSUk9SUyAqLwotI2RlZmluZSBvZ2xlc19lcnJvcihjLCBlcnJvcikgX29nbGVzX2Vycm9yKChjKSwgKGVycm9yKSkKLSNlbmRpZgotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19TVEFURV9ICi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvdGV4dHVyZS5jcHAgYi9vcGVuZ2wvbGliYWdsL3RleHR1cmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODUzNmRmLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvdGV4dHVyZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjU2ICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvdGV4dHVyZS5jcHAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiY29udGV4dC5oIgotI2luY2x1ZGUgImZwLmgiCi0jaW5jbHVkZSAic3RhdGUuaCIKLSNpbmNsdWRlICJ0ZXh0dXJlLmgiCi0jaW5jbHVkZSAiVGV4dHVyZU9iamVjdE1hbmFnZXIuaCIKLQotI2luY2x1ZGUgPEVUQzEvZXRjMS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgYmluZFRleHR1cmVUbXUoCi0gICAgb2dsZXNfY29udGV4dF90KiBjLCBpbnQgdG11LCBHTHVpbnQgdGV4dHVyZSwgY29uc3Qgc3A8RUdMVGV4dHVyZU9iamVjdD4mIHRleCk7Ci0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi12b2lkIGdlbmVyYXRlTWlwbWFwKG9nbGVzX2NvbnRleHRfdCogYywgR0xpbnQgbGV2ZWwpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIEluaXQKLSNlbmRpZgotCi12b2lkIG9nbGVzX2luaXRfdGV4dHVyZShvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgYy0+dGV4dHVyZXMucGFja0FsaWdubWVudCAgID0gNDsKLSAgICBjLT50ZXh0dXJlcy51bnBhY2tBbGlnbm1lbnQgPSA0OwotCi0gICAgLy8gZWFjaCBjb250ZXh0IGhhcyBhIGRlZmF1bHQgbmFtZWQgKDApIHRleHR1cmUgKG5vdCBzaGFyZWQpCi0gICAgYy0+dGV4dHVyZXMuZGVmYXVsdFRleHR1cmUgPSBuZXcgRUdMVGV4dHVyZU9iamVjdCgpOwotICAgIGMtPnRleHR1cmVzLmRlZmF1bHRUZXh0dXJlLT5pbmNTdHJvbmcoYyk7Ci0KLSAgICAvLyBiaW5kIHRoZSBkZWZhdWx0IHRleHR1cmUgdG8gZWFjaCB0ZXh0dXJlIHVuaXQKLSAgICBmb3IgKGludCBpPTA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBiaW5kVGV4dHVyZVRtdShjLCBpLCAwLCBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZSk7Ci0gICAgICAgIG1lbXNldChjLT5jdXJyZW50LnRleHR1cmVbaV0udiwgMCwgc2l6ZW9mKHZlYzRfdCkpOwotICAgICAgICBjLT5jdXJyZW50LnRleHR1cmVbaV0uUSA9IDB4MTAwMDA7Ci0gICAgfQotfQotCi12b2lkIG9nbGVzX3VuaW5pdF90ZXh0dXJlKG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBpZiAoYy0+dGV4dHVyZXMuZ2dsKQotICAgICAgICBnZ2xVbmluaXQoYy0+dGV4dHVyZXMuZ2dsKTsKLSAgICBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZS0+ZGVjU3Ryb25nKGMpOwotICAgIGZvciAoaW50IGk9MDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7Ci0gICAgICAgIGlmIChjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZSkKLSAgICAgICAgICAgIGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5kZWNTdHJvbmcoYyk7Ci0gICAgfQotfQotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQotdm9pZCB2YWxpZGF0ZV90bXUob2dsZXNfY29udGV4dF90KiBjLCBpbnQgaSkKLXsKLSAgICB0ZXh0dXJlX3VuaXRfdCYgdShjLT50ZXh0dXJlcy50bXVbaV0pOwotICAgIGlmICh1LmRpcnR5KSB7Ci0gICAgICAgIHUuZGlydHkgPSAwOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmFjdGl2ZVRleHR1cmUoYywgaSk7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYmluZFRleHR1cmUoYywgJih1LnRleHR1cmUtPnN1cmZhY2UpKTsKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhHZW5pKGMsIEdHTF9TLAotICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfQVVUT01BVElDKTsKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhHZW5pKGMsIEdHTF9ULAotICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfQVVUT01BVElDKTsKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsIEdHTF9URVhUVVJFXzJELAotICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX1dSQVBfUywgdS50ZXh0dXJlLT53cmFwcyk7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4UGFyYW1ldGVyaShjLCBHR0xfVEVYVFVSRV8yRCwKLSAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV9XUkFQX1QsIHUudGV4dHVyZS0+d3JhcHQpOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleFBhcmFtZXRlcmkoYywgR0dMX1RFWFRVUkVfMkQsCi0gICAgICAgICAgICAgICAgR0dMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgdS50ZXh0dXJlLT5taW5fZmlsdGVyKTsKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsIEdHTF9URVhUVVJFXzJELAotICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX01BR19GSUxURVIsIHUudGV4dHVyZS0+bWFnX2ZpbHRlcik7Ci0KLSAgICAgICAgLy8gZGlzYWJsZSB0aGlzIHRleHR1cmUgdW5pdCBpZiBpdCdzIG5vdCBjb21wbGV0ZQotICAgICAgICBpZiAoIXUudGV4dHVyZS0+aXNDb21wbGV0ZSgpKSB7Ci0gICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRpc2FibGUoYywgR0dMX1RFWFRVUkVfMkQpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIG9nbGVzX3ZhbGlkYXRlX3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBpZiAoYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLmVuYWJsZSkKLSAgICAgICAgICAgIHZhbGlkYXRlX3RtdShjLCBpKTsKLSAgICB9Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5hY3RpdmVUZXh0dXJlKGMsIGMtPnRleHR1cmVzLmFjdGl2ZSk7Ci19Ci0KLXN0YXRpYwotdm9pZCBpbnZhbGlkYXRlX3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjLCBpbnQgdG11LCB1aW50OF90IGZsYWdzID0gMHhGRikgewotICAgIGMtPnRleHR1cmVzLnRtdVt0bXVdLmRpcnR5ID0gZmxhZ3M7Ci19Ci0KLS8qCi0gKiBJZiB0aGUgYWN0aXZlIHRleHR1cmVzIGFyZSBFR0xJbWFnZSwgdGhleSBuZWVkIHRvIGJlIGxvY2tlZCBiZWZvcmUKLSAqIHRoZXkgY2FuIGJlIHVzZWQuCi0gKgotICogRklYTUU6IGNvZGUgYmVsb3cgaXMgZmFyIGZyb20gYmVpbmcgb3B0aW1hbAotICoKLSAqLwotCi12b2lkIG9nbGVzX2xvY2tfdGV4dHVyZXMob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBpZiAoYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLmVuYWJsZSkgewotICAgICAgICAgICAgdGV4dHVyZV91bml0X3QmIHUoYy0+dGV4dHVyZXMudG11W2ldKTsKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIG5hdGl2ZV9idWZmZXIgPSB1LnRleHR1cmUtPmJ1ZmZlcjsKLSAgICAgICAgICAgIGlmIChuYXRpdmVfYnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5hY3RpdmVUZXh0dXJlKGMsIGkpOwotICAgICAgICAgICAgICAgIGh3X21vZHVsZV90IGNvbnN0KiBwTW9kdWxlOwotICAgICAgICAgICAgICAgIGlmIChod19nZXRfbW9kdWxlKEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmcE1vZHVsZSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgZ3JhbGxvY19tb2R1bGVfdCBjb25zdCogbW9kdWxlID0KLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxncmFsbG9jX21vZHVsZV90IGNvbnN0Kj4ocE1vZHVsZSk7Ci0KLSAgICAgICAgICAgICAgICB2b2lkKiB2YWRkcjsKLSAgICAgICAgICAgICAgICBpbnQgZXJyID0gbW9kdWxlLT5sb2NrKG1vZHVsZSwgbmF0aXZlX2J1ZmZlci0+aGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgbmF0aXZlX2J1ZmZlci0+d2lkdGgsIG5hdGl2ZV9idWZmZXItPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ2YWRkcik7Ci0KLSAgICAgICAgICAgICAgICB1LnRleHR1cmUtPnNldEltYWdlQml0cyh2YWRkcik7Ci0gICAgICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5iaW5kVGV4dHVyZShjLCAmKHUudGV4dHVyZS0+c3VyZmFjZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIG9nbGVzX3VubG9ja190ZXh0dXJlcyhvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgZm9yIChpbnQgaT0wIDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7Ci0gICAgICAgIGlmIChjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0uZW5hYmxlKSB7Ci0gICAgICAgICAgICB0ZXh0dXJlX3VuaXRfdCYgdShjLT50ZXh0dXJlcy50bXVbaV0pOwotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogbmF0aXZlX2J1ZmZlciA9IHUudGV4dHVyZS0+YnVmZmVyOwotICAgICAgICAgICAgaWYgKG5hdGl2ZV9idWZmZXIpIHsKLSAgICAgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmFjdGl2ZVRleHR1cmUoYywgaSk7Ci0gICAgICAgICAgICAgICAgaHdfbW9kdWxlX3QgY29uc3QqIHBNb2R1bGU7Ci0gICAgICAgICAgICAgICAgaWYgKGh3X2dldF9tb2R1bGUoR1JBTExPQ19IQVJEV0FSRV9NT0RVTEVfSUQsICZwTW9kdWxlKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBncmFsbG9jX21vZHVsZV90IGNvbnN0KiBtb2R1bGUgPQotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGdyYWxsb2NfbW9kdWxlX3QgY29uc3QqPihwTW9kdWxlKTsKLQotICAgICAgICAgICAgICAgIG1vZHVsZS0+dW5sb2NrKG1vZHVsZSwgbmF0aXZlX2J1ZmZlci0+aGFuZGxlKTsKLSAgICAgICAgICAgICAgICB1LnRleHR1cmUtPnNldEltYWdlQml0cyhOVUxMKTsKLSAgICAgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmJpbmRUZXh0dXJlKGMsICYodS50ZXh0dXJlLT5zdXJmYWNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5hY3RpdmVUZXh0dXJlKGMsIGMtPnRleHR1cmVzLmFjdGl2ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIEZvcm1hdCBjb252ZXJzaW9uCi0jZW5kaWYKLQotc3RhdGljIHVpbnQzMl90IGdsMmZvcm1hdF90YWJsZVs2XVs0XSA9IHsKLSAgICAvLyBCWVRFLCA1NjUsIDQ0NDQsIDU1NTEKLSAgICB7IEdHTF9QSVhFTF9GT1JNQVRfQV84LAotICAgICAgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdMX0FMUEhBCi0gICAgeyBHR0xfUElYRUxfRk9STUFUX1JHQl84ODgsCi0gICAgICBHR0xfUElYRUxfRk9STUFUX1JHQl81NjUsCi0gICAgICAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0xfUkdCCi0gICAgeyBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4OCwKLSAgICAgIDAsCi0gICAgICBHR0xfUElYRUxfRk9STUFUX1JHQkFfNDQ0NCwKLSAgICAgIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxIH0sICAgICAvLyBHTF9SR0JBCi0gICAgeyBHR0xfUElYRUxfRk9STUFUX0xfOCwKLSAgICAgIDAsIDAsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBHTF9MVU1JTkFOQ0UKLSAgICB7IEdHTF9QSVhFTF9GT1JNQVRfTEFfODgsCi0gICAgICAwLCAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0xfTFVNSU5BTkNFX0FMUEhBCi19OwotCi1zdGF0aWMgaW50MzJfdCBjb252ZXJ0R0xQaXhlbEZvcm1hdChHTGludCBmb3JtYXQsIEdMZW51bSB0eXBlKQotewotICAgIGludDMyX3QgZmkgPSAtMTsKLSAgICBpbnQzMl90IHRpID0gLTE7Ci0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICBjYXNlIEdMX0FMUEhBOiAgICAgICAgICAgICAgZmkgPSAwOyAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9SR0I6ICAgICAgICAgICAgICAgIGZpID0gMTsgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfUkdCQTogICAgICAgICAgICAgICBmaSA9IDI7ICAgICBicmVhazsKLSAgICBjYXNlIEdMX0xVTUlOQU5DRTogICAgICAgICAgZmkgPSAzOyAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9MVU1JTkFOQ0VfQUxQSEE6ICAgIGZpID0gNDsgICAgIGJyZWFrOwotICAgIH0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6ICAgICAgICAgIHRpID0gMDsgYnJlYWs7Ci0gICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTogICB0aSA9IDE7IGJyZWFrOwotICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNDogdGkgPSAyOyBicmVhazsKLSAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzE6IHRpID0gMzsgYnJlYWs7Ci0gICAgfQotICAgIGlmIChmaT09LTEgfHwgdGk9PS0xKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZ2wyZm9ybWF0X3RhYmxlW2ZpXVt0aV07Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIEdMZW51bSB2YWxpZEZvcm1hdFR5cGUob2dsZXNfY29udGV4dF90KiBjLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSkKLXsKLSAgICBHTGVudW0gZXJyb3IgPSAwOwotICAgIGlmIChmb3JtYXQ8R0xfQUxQSEEgfHwgZm9ybWF0PkdMX0xVTUlOQU5DRV9BTFBIQSkgewotICAgICAgICBlcnJvciA9IEdMX0lOVkFMSURfRU5VTTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgIT0gR0xfVU5TSUdORURfQllURSAmJiB0eXBlICE9IEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgJiYKLSAgICAgICAgdHlwZSAhPSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICYmIHR5cGUgIT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUpIHsKLSAgICAgICAgZXJyb3IgPSBHTF9JTlZBTElEX0VOVU07Ci0gICAgfQotICAgIGlmICh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICYmIGZvcm1hdCAhPSBHTF9SR0IpIHsKLSAgICAgICAgZXJyb3IgPSBHTF9JTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgaWYgKCh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgfHwKLSAgICAgICAgIHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSkgICYmIGZvcm1hdCAhPSBHTF9SR0JBKSB7Ci0gICAgICAgIGVycm9yID0gR0xfSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGlmIChlcnJvcikgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnJvcik7Ci0gICAgfQotICAgIHJldHVybiBlcnJvcjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1HR0xDb250ZXh0KiBnZXRSYXN0ZXJpemVyKG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBHR0xDb250ZXh0KiBnZ2wgPSBjLT50ZXh0dXJlcy5nZ2w7Ci0gICAgaWYgKGdnbF91bmxpa2VseSghZ2dsKSkgewotICAgICAgICAvLyB0aGlzIGlzIHF1aXRlIGhlYXZ5IHRoZSBmaXJzdCB0aW1lLi4uCi0gICAgICAgIGdnbEluaXQoJmdnbCk7Ci0gICAgICAgIGlmICghZ2dsKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBHR0xmaXhlZCBjb2xvcnNbNF0gPSB7IDAsIDAsIDAsIDB4MTAwMDAgfTsKLSAgICAgICAgYy0+dGV4dHVyZXMuZ2dsID0gZ2dsOwotICAgICAgICBnZ2wtPmFjdGl2ZVRleHR1cmUoZ2dsLCAwKTsKLSAgICAgICAgZ2dsLT5lbmFibGUoZ2dsLCBHR0xfVEVYVFVSRV8yRCk7Ci0gICAgICAgIGdnbC0+dGV4RW52aShnZ2wsIEdHTF9URVhUVVJFX0VOViwgR0dMX1RFWFRVUkVfRU5WX01PREUsIEdHTF9SRVBMQUNFKTsKLSAgICAgICAgZ2dsLT5kaXNhYmxlKGdnbCwgR0dMX0RJVEhFUik7Ci0gICAgICAgIGdnbC0+c2hhZGVNb2RlbChnZ2wsIEdHTF9GTEFUKTsKLSAgICAgICAgZ2dsLT5jb2xvcjR4dihnZ2wsIGNvbG9ycyk7Ci0gICAgfQotICAgIHJldHVybiBnZ2w7Ci19Ci0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi1pbnQgY29weVBpeGVscygKLSAgICAgICAgb2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICBjb25zdCBHR0xTdXJmYWNlJiBkc3QsCi0gICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsCi0gICAgICAgIGNvbnN0IEdHTFN1cmZhY2UmIHNyYywKLSAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3LCBHTHNpemVpIGgpCi17Ci0gICAgaWYgKChkc3QuZm9ybWF0ID09IHNyYy5mb3JtYXQpICYmCi0gICAgICAgIChkc3Quc3RyaWRlID09IHNyYy5zdHJpZGUpICYmCi0gICAgICAgIChkc3Qud2lkdGggPT0gc3JjLndpZHRoKSAmJgotICAgICAgICAoZHN0LmhlaWdodCA9PSBzcmMuaGVpZ2h0KSAmJgotICAgICAgICAoZHN0LnN0cmlkZSA+IDApICYmCi0gICAgICAgICgoeHx5KSA9PSAwKSAmJgotICAgICAgICAoKHhvZmZzZXR8eW9mZnNldCkgPT0gMCkpCi0gICAgewotICAgICAgICAvLyB0aGlzIGlzIGEgY29tbW9uIGNhc2UuLi4KLSAgICAgICAgY29uc3QgR0dMRm9ybWF0JiBwaXhlbEZvcm1hdChjLT5yYXN0ZXJpemVyLmZvcm1hdHNbc3JjLmZvcm1hdF0pOwotICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IHNyYy5oZWlnaHQgKiBzcmMuc3RyaWRlICogcGl4ZWxGb3JtYXQuc2l6ZTsKLSAgICAgICAgbWVtY3B5KGRzdC5kYXRhLCBzcmMuZGF0YSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIHVzZSBwaXhlbC1mbGluZ2VyIHRvIGhhbmRsZSBhbGwgdGhlIGNvbnZlcnNpb25zCi0gICAgR0dMQ29udGV4dCogZ2dsID0gZ2V0UmFzdGVyaXplcihjKTsKLSAgICBpZiAoIWdnbCkgewotICAgICAgICAvLyB0aGUgb25seSByZWFzb24gdGhpcyB3b3VsZCBmYWlsIGlzIGJlY2F1c2Ugd2UgcmFuIG91dCBvZiBtZW1vcnkKLSAgICAgICAgcmV0dXJuIEdMX09VVF9PRl9NRU1PUlk7Ci0gICAgfQotCi0gICAgZ2dsLT5jb2xvckJ1ZmZlcihnZ2wsICZkc3QpOwotICAgIGdnbC0+YmluZFRleHR1cmUoZ2dsLCAmc3JjKTsKLSAgICBnZ2wtPnRleENvb3JkMmkoZ2dsLCB4LXhvZmZzZXQsIHkteW9mZnNldCk7Ci0gICAgZ2dsLT5yZWN0aShnZ2wsIHhvZmZzZXQsIHlvZmZzZXQsIHhvZmZzZXQrdywgeW9mZnNldCtoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQotc3A8RUdMVGV4dHVyZU9iamVjdD4gZ2V0QW5kQmluZEFjdGl2ZVRleHR1cmVPYmplY3Qob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+IHRleDsKLSAgICBjb25zdCBpbnQgYWN0aXZlID0gYy0+dGV4dHVyZXMuYWN0aXZlOwotICAgIGNvbnN0IEdMdWludCBuYW1lID0gYy0+dGV4dHVyZXMudG11W2FjdGl2ZV0ubmFtZTsKLQotICAgIC8vIGZyZWUgdGhlIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXNseSBib3VuZCBvYmplY3QKLSAgICB0ZXh0dXJlX3VuaXRfdCYgdShjLT50ZXh0dXJlcy50bXVbYWN0aXZlXSk7Ci0gICAgaWYgKHUudGV4dHVyZSkKLSAgICAgICAgdS50ZXh0dXJlLT5kZWNTdHJvbmcoYyk7Ci0KLSAgICBpZiAobmFtZSA9PSAwKSB7Ci0gICAgICAgIC8vIDAgaXMgb3VyIGxvY2FsIHRleHR1cmUgb2JqZWN0LCBub3Qgc2hhcmVkIHdpdGggYW55b25lLgotICAgICAgICAvLyBCdXQgaXQgYWZmZWN0cyBhbGwgYm91bmQgVE1VcyBpbW1lZGlhdGVseS4KLSAgICAgICAgLy8gKHdlIG5lZWQgdG8gaW52YWxpZGF0ZSBhbGwgdW5pdHMgYm91bmQgdG8gdGhpcyB0ZXh0dXJlIG9iamVjdCkKLSAgICAgICAgdGV4ID0gYy0+dGV4dHVyZXMuZGVmYXVsdFRleHR1cmU7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICAgICAgaWYgKGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlID09IHRleC5nZXQoKSkKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlX3RleHR1cmUoYywgaSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBnZXQgYSBuZXcgdGV4dHVyZSBvYmplY3QgZm9yIHRoYXQgbmFtZQotICAgICAgICB0ZXggPSBjLT5zdXJmYWNlTWFuYWdlci0+cmVwbGFjZVRleHR1cmUobmFtZSk7Ci0gICAgfQotCi0gICAgLy8gYmluZCB0aGlzIHRleHR1cmUgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIHRleHR1cmUgdW5pdAotICAgIC8vIGFuZCBhZGQgYSByZWZlcmVuY2UgdG8gdGhpcyB0ZXh0dXJlIG9iamVjdAotICAgIHUudGV4dHVyZSA9IHRleC5nZXQoKTsKLSAgICB1LnRleHR1cmUtPmluY1N0cm9uZyhjKTsKLSAgICB1Lm5hbWUgPSBuYW1lOwotICAgIGludmFsaWRhdGVfdGV4dHVyZShjLCBhY3RpdmUpOwotICAgIHJldHVybiB0ZXg7Ci19Ci0KLXZvaWQgYmluZFRleHR1cmVUbXUoCi0gICAgb2dsZXNfY29udGV4dF90KiBjLCBpbnQgdG11LCBHTHVpbnQgdGV4dHVyZSwgY29uc3Qgc3A8RUdMVGV4dHVyZU9iamVjdD4mIHRleCkKLXsKLSAgICBpZiAodGV4LmdldCgpID09IGMtPnRleHR1cmVzLnRtdVt0bXVdLnRleHR1cmUpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIGZyZWUgdGhlIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXNseSBib3VuZCBvYmplY3QKLSAgICB0ZXh0dXJlX3VuaXRfdCYgdShjLT50ZXh0dXJlcy50bXVbdG11XSk7Ci0gICAgaWYgKHUudGV4dHVyZSkKLSAgICAgICAgdS50ZXh0dXJlLT5kZWNTdHJvbmcoYyk7Ci0KLSAgICAvLyBiaW5kIHRoaXMgdGV4dHVyZSB0byB0aGUgY3VycmVudCBhY3RpdmUgdGV4dHVyZSB1bml0Ci0gICAgLy8gYW5kIGFkZCBhIHJlZmVyZW5jZSB0byB0aGlzIHRleHR1cmUgb2JqZWN0Ci0gICAgdS50ZXh0dXJlID0gdGV4LmdldCgpOwotICAgIHUudGV4dHVyZS0+aW5jU3Ryb25nKGMpOwotICAgIHUubmFtZSA9IHRleHR1cmU7Ci0gICAgaW52YWxpZGF0ZV90ZXh0dXJlKGMsIHRtdSk7Ci19Ci0KLWludCBjcmVhdGVUZXh0dXJlU3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIEdHTFN1cmZhY2UqKiBvdXRTdXJmYWNlLCBpbnQzMl90KiBvdXRTaXplLCBHTGludCBsZXZlbCwKLSAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAotICAgICAgICBHTGVudW0gY29tcHJlc3NlZEZvcm1hdCA9IDApCi17Ci0gICAgLy8gZmluZCBvdXQgd2hpY2ggdGV4dHVyZSBpcyBib3VuZCB0byB0aGUgY3VycmVudCB1bml0Ci0gICAgY29uc3QgaW50IGFjdGl2ZSA9IGMtPnRleHR1cmVzLmFjdGl2ZTsKLSAgICBjb25zdCBHTHVpbnQgbmFtZSA9IGMtPnRleHR1cmVzLnRtdVthY3RpdmVdLm5hbWU7Ci0KLSAgICAvLyBjb252ZXJ0IHRoZSBwaXhlbGZvcm1hdCB0byBvbmUgd2UgY2FuIGhhbmRsZQotICAgIGNvbnN0IGludDMyX3QgZm9ybWF0SWR4ID0gY29udmVydEdMUGl4ZWxGb3JtYXQoZm9ybWF0LCB0eXBlKTsKLSAgICBpZiAoZm9ybWF0SWR4ID09IDApIHsgLy8gd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhpcwotICAgICAgICByZXR1cm4gR0xfSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgLy8gZmlndXJlIG91dCB0aGUgc2l6ZSB3ZSBuZWVkIGFzIHdlbGwgYXMgdGhlIHN0cmlkZQotICAgIGNvbnN0IEdHTEZvcm1hdCYgcGl4ZWxGb3JtYXQoYy0+cmFzdGVyaXplci5mb3JtYXRzW2Zvcm1hdElkeF0pOwotICAgIGNvbnN0IGludDMyX3QgYWxpZ24gPSBjLT50ZXh0dXJlcy51bnBhY2tBbGlnbm1lbnQtMTsKLSAgICBjb25zdCBpbnQzMl90IGJwciA9ICgod2lkdGggKiBwaXhlbEZvcm1hdC5zaXplKSArIGFsaWduKSAmIH5hbGlnbjsKLSAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGJwciAqIGhlaWdodDsKLSAgICBjb25zdCBpbnQzMl90IHN0cmlkZSA9IGJwciAvIHBpeGVsRm9ybWF0LnNpemU7Ci0KLSAgICBpZiAobGV2ZWwgPiAwKSB7Ci0gICAgICAgIGNvbnN0IGludCBhY3RpdmUgPSBjLT50ZXh0dXJlcy5hY3RpdmU7Ci0gICAgICAgIEVHTFRleHR1cmVPYmplY3QqIHRleCA9IGMtPnRleHR1cmVzLnRtdVthY3RpdmVdLnRleHR1cmU7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHRleC0+cmVhbGxvY2F0ZShsZXZlbCwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGZvcm1hdElkeCwgY29tcHJlc3NlZEZvcm1hdCwgYnByKTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikKLSAgICAgICAgICAgIHJldHVybiBHTF9PVVRfT0ZfTUVNT1JZOwotICAgICAgICBHR0xTdXJmYWNlJiBzdXJmYWNlID0gdGV4LT5lZGl0TWlwKGxldmVsKTsKLSAgICAgICAgKm91dFN1cmZhY2UgPSAmc3VyZmFjZTsKLSAgICAgICAgKm91dFNpemUgPSBzaXplOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXggPSBnZXRBbmRCaW5kQWN0aXZlVGV4dHVyZU9iamVjdChjKTsKLSAgICBzdGF0dXNfdCBlcnIgPSB0ZXgtPnJlYWxsb2NhdGUobGV2ZWwsCi0gICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGZvcm1hdElkeCwgY29tcHJlc3NlZEZvcm1hdCwgYnByKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKQotICAgICAgICByZXR1cm4gR0xfT1VUX09GX01FTU9SWTsKLQotICAgIHRleC0+aW50ZXJuYWxmb3JtYXQgPSBmb3JtYXQ7Ci0gICAgKm91dFN1cmZhY2UgPSAmdGV4LT5zdXJmYWNlOwotICAgICpvdXRTaXplID0gc2l6ZTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHNpemVfdCBkYXRhU2l6ZVBhbGV0dGU0KGludCBudW1MZXZlbHMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCkKLXsKLSAgICBpbnQgaW5kZXhCaXRzID0gODsKLSAgICBpbnQgZW50cnlTaXplID0gMDsKLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCOF9PRVM6Ci0gICAgICAgIGluZGV4Qml0cyA9IDQ7Ci0gICAgICAgIC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBHTF9QQUxFVFRFOF9SR0I4X09FUzoKLSAgICAgICAgZW50cnlTaXplID0gMzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE4X09FUzoKLSAgICAgICAgaW5kZXhCaXRzID0gNDsKLSAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE4X09FUzoKLSAgICAgICAgZW50cnlTaXplID0gNDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUzoKLSAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE0X09FUzoKLSAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTOgotICAgICAgICBpbmRleEJpdHMgPSA0OwotICAgICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTOgotICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQTRfT0VTOgotICAgIGNhc2UgR0xfUEFMRVRURThfUkdCNV9BMV9PRVM6Ci0gICAgICAgIGVudHJ5U2l6ZSA9IDI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHNpemVfdCBzaXplID0gKDEgPDwgaW5kZXhCaXRzKSAqIGVudHJ5U2l6ZTsgLy8gcGFsZXR0ZSBzaXplCi0KLSAgICBmb3IgKGludCBpPTAgOyBpPCBudW1MZXZlbHMgOyBpKyspIHsKLSAgICAgICAgaW50IHcgPSAod2lkdGggID4+IGkpID8gOiAxOwotICAgICAgICBpbnQgaCA9IChoZWlnaHQgPj4gaSkgPyA6IDE7Ci0gICAgICAgIGludCBsZXZlbFNpemUgPSBoICogKCh3ICogaW5kZXhCaXRzKSAvIDgpID8gOiAxOwotICAgICAgICBzaXplICs9IGxldmVsU2l6ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgZGVjb2RlUGFsZXR0ZTQoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgbGV2ZWwsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnN1cmZhY2UsIGludCBzdHJpZGUsIGludCBmb3JtYXQpCi0KLXsKLSAgICBpbnQgaW5kZXhCaXRzID0gODsKLSAgICBpbnQgZW50cnlTaXplID0gMDsKLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCOF9PRVM6Ci0gICAgICAgIGluZGV4Qml0cyA9IDQ7Ci0gICAgICAgIC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBHTF9QQUxFVFRFOF9SR0I4X09FUzoKLSAgICAgICAgZW50cnlTaXplID0gMzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE4X09FUzoKLSAgICAgICAgaW5kZXhCaXRzID0gNDsKLSAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE4X09FUzoKLSAgICAgICAgZW50cnlTaXplID0gNDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUzoKLSAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE0X09FUzoKLSAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTOgotICAgICAgICBpbmRleEJpdHMgPSA0OwotICAgICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTOgotICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQTRfT0VTOgotICAgIGNhc2UgR0xfUEFMRVRURThfUkdCNV9BMV9PRVM6Ci0gICAgICAgIGVudHJ5U2l6ZSA9IDI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNvbnN0IGludCBwYWxldHRlU2l6ZSA9ICgxIDw8IGluZGV4Qml0cykgKiBlbnRyeVNpemU7Ci0KLSAgICB1aW50OF90IGNvbnN0KiBwaXhlbHMgPSAodWludDhfdCAqKWRhdGEgKyBwYWxldHRlU2l6ZTsKLSAgICBmb3IgKGludCBpPTAgOyBpPGxldmVsIDsgaSsrKSB7Ci0gICAgICAgIGludCB3ID0gKHdpZHRoICA+PiBpKSA/IDogMTsKLSAgICAgICAgaW50IGggPSAoaGVpZ2h0ID4+IGkpID8gOiAxOwotICAgICAgICBwaXhlbHMgKz0gaCAqICgodyAqIGluZGV4Qml0cykgLyA4KTsKLSAgICB9Ci0gICAgd2lkdGggID0gKHdpZHRoICA+PiBsZXZlbCkgPyA6IDE7Ci0gICAgaGVpZ2h0ID0gKGhlaWdodCA+PiBsZXZlbCkgPyA6IDE7Ci0KLSAgICBpZiAoZW50cnlTaXplID09IDIpIHsKLSAgICAgICAgdWludDhfdCBjb25zdCogY29uc3QgcGFsZXR0ZSA9ICh1aW50OF90KilkYXRhOwotICAgICAgICBmb3IgKGludCB5PTAgOyB5PGhlaWdodCA7IHkrKykgewotICAgICAgICAgICAgdWludDhfdCogcCA9ICh1aW50OF90KilzdXJmYWNlICsgeSpzdHJpZGUqMjsKLSAgICAgICAgICAgIGlmIChpbmRleEJpdHMgPT0gOCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8d2lkdGggOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMiAqICgqcGl4ZWxzKyspOwotICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDBdOwotICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDFdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3aWR0aCA7IHgrPTIpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHYgPSAqcGl4ZWxzKys7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDIgKiAodiA+PiA0KTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHgrMSA8IHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDIgKiAodiAmIDB4Rik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDBdOwotICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZW50cnlTaXplID09IDMpIHsKLSAgICAgICAgdWludDhfdCBjb25zdCogY29uc3QgcGFsZXR0ZSA9ICh1aW50OF90KilkYXRhOwotICAgICAgICBmb3IgKGludCB5PTAgOyB5PGhlaWdodCA7IHkrKykgewotICAgICAgICAgICAgdWludDhfdCogcCA9ICh1aW50OF90KilzdXJmYWNlICsgeSpzdHJpZGUqMzsKLSAgICAgICAgICAgIGlmIChpbmRleEJpdHMgPT0gOCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8d2lkdGggOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMyAqICgqcGl4ZWxzKyspOwotICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDBdOwotICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDFdOwotICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDJdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3aWR0aCA7IHgrPTIpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHYgPSAqcGl4ZWxzKys7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDMgKiAodiA+PiA0KTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAyXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHgrMSA8IHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDMgKiAodiAmIDB4Rik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDBdOwotICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMl07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGVudHJ5U2l6ZSA9PSA0KSB7Ci0gICAgICAgIHVpbnQ4X3QgY29uc3QqIGNvbnN0IHBhbGV0dGUgPSAodWludDhfdCopZGF0YTsKLSAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoZWlnaHQgOyB5KyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHAgPSAodWludDhfdCopc3VyZmFjZSArIHkqc3RyaWRlKjQ7Ci0gICAgICAgICAgICBpZiAoaW5kZXhCaXRzID09IDgpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHdpZHRoIDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDQgKiAoKnBpeGVscysrKTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAyXTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAzXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8d2lkdGggOyB4Kz0yKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB2ID0gKnBpeGVscysrOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSA0ICogKHYgPj4gNCk7Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMl07Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgM107Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4KzEgPCB3aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSA0ICogKHYgJiAweEYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDJdOwotICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAzXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi12b2lkIHNldF9kZXB0aF9hbmRfZm9nKG9nbGVzX2NvbnRleHRfdCogYywgR0dMZml4ZWQgeikKLXsKLSAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOwotICAgIC8vIHdlIG5lZWQgdG8gY29tcHV0ZSBadwotICAgIGludDMyX3QgaXRlcmF0b3JzWzNdOwotICAgIGl0ZXJhdG9yc1sxXSA9IGl0ZXJhdG9yc1syXSA9IDA7Ci0gICAgR0dMZml4ZWQgWnc7Ci0gICAgR0dMZml4ZWQgbiA9IGdnbEZsb2F0VG9GaXhlZChjLT50cmFuc2Zvcm1zLnZwdC56TmVhcik7Ci0gICAgR0dMZml4ZWQgZiA9IGdnbEZsb2F0VG9GaXhlZChjLT50cmFuc2Zvcm1zLnZwdC56RmFyKTsKLSAgICBpZiAoejw9MCkgICAgICAgICAgICAgICBadyA9IG47Ci0gICAgZWxzZSBpZiAoej49MHgxMDAwMCkgICAgWncgPSBmOwotICAgIGVsc2UgICAgICAgICAgICBadyA9IGdnbE11bEFkZHgoeiwgKGYtbiksIG4pOwotICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpIHsKLSAgICAgICAgLy8gc2V0IHVwIGZvZyBpZiBuZWVkZWQuLi4KLSAgICAgICAgaXRlcmF0b3JzWzBdID0gYy0+Zm9nLmZvZyhjLCBadyk7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZm9nR3JhZDN4dihjLCBpdGVyYXRvcnMpOwotICAgIH0KLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfREVQVEhfVEVTVCkgewotICAgICAgICAvLyBzZXQgdXAgei10ZXN0IGlmIG5lZWRlZC4uLgotICAgICAgICBpbnQzMl90IHogPSAoWncgJiB+KFp3Pj4zMSkpOwotICAgICAgICBpZiAoeiA+PSAweDEwMDAwKQotICAgICAgICAgICAgeiA9IDB4RkZGRjsKLSAgICAgICAgaXRlcmF0b3JzWzBdID0gKHogPDwgMTYpIHwgejsKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy56R3JhZDN4dihjLCBpdGVyYXRvcnMpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgR2VuZXJhdGUgbWltYXBzCi0jZW5kaWYKLQotZXh0ZXJuIHN0YXR1c190IGJ1aWxkQVB5cmFtaWQob2dsZXNfY29udGV4dF90KiBjLCBFR0xUZXh0dXJlT2JqZWN0KiB0ZXgpOwotCi12b2lkIGdlbmVyYXRlTWlwbWFwKG9nbGVzX2NvbnRleHRfdCogYywgR0xpbnQgbGV2ZWwpCi17Ci0gICAgaWYgKGxldmVsID09IDApIHsKLSAgICAgICAgY29uc3QgaW50IGFjdGl2ZSA9IGMtPnRleHR1cmVzLmFjdGl2ZTsKLSAgICAgICAgRUdMVGV4dHVyZU9iamVjdCogdGV4ID0gYy0+dGV4dHVyZXMudG11W2FjdGl2ZV0udGV4dHVyZTsKLSAgICAgICAgaWYgKHRleC0+Z2VuZXJhdGVfbWlwbWFwKSB7Ci0gICAgICAgICAgICBpZiAoYnVpbGRBUHlyYW1pZChjLCB0ZXgpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkIHRleFBhcmFtZXRlcngoCi0gICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSwgb2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCAmJiB0YXJnZXQgIT0gR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEVHTFRleHR1cmVPYmplY3QqIHRleHR1cmVPYmplY3QgPSBjLT50ZXh0dXJlcy50bXVbYy0+dGV4dHVyZXMuYWN0aXZlXS50ZXh0dXJlOwotICAgIHN3aXRjaCAocG5hbWUpIHsKLSAgICBjYXNlIEdMX1RFWFRVUkVfV1JBUF9TOgotICAgICAgICBpZiAoKHBhcmFtID09IEdMX1JFUEVBVCkgfHwKLSAgICAgICAgICAgIChwYXJhbSA9PSBHTF9DTEFNUF9UT19FREdFKSkgewotICAgICAgICAgICAgdGV4dHVyZU9iamVjdC0+d3JhcHMgPSBwYXJhbTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdvdG8gaW52YWxpZF9lbnVtOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfVEVYVFVSRV9XUkFQX1Q6Ci0gICAgICAgIGlmICgocGFyYW0gPT0gR0xfUkVQRUFUKSB8fAotICAgICAgICAgICAgKHBhcmFtID09IEdMX0NMQU1QX1RPX0VER0UpKSB7Ci0gICAgICAgICAgICB0ZXh0dXJlT2JqZWN0LT53cmFwdCA9IHBhcmFtOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ290byBpbnZhbGlkX2VudW07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9URVhUVVJFX01JTl9GSUxURVI6Ci0gICAgICAgIGlmICgocGFyYW0gPT0gR0xfTkVBUkVTVCkgfHwKLSAgICAgICAgICAgIChwYXJhbSA9PSBHTF9MSU5FQVIpIHx8Ci0gICAgICAgICAgICAocGFyYW0gPT0gR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCkgfHwKLSAgICAgICAgICAgIChwYXJhbSA9PSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QpIHx8Ci0gICAgICAgICAgICAocGFyYW0gPT0gR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSKSB8fAotICAgICAgICAgICAgKHBhcmFtID09IEdMX0xJTkVBUl9NSVBNQVBfTElORUFSKSkgewotICAgICAgICAgICAgdGV4dHVyZU9iamVjdC0+bWluX2ZpbHRlciA9IHBhcmFtOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ290byBpbnZhbGlkX2VudW07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9URVhUVVJFX01BR19GSUxURVI6Ci0gICAgICAgIGlmICgocGFyYW0gPT0gR0xfTkVBUkVTVCkgfHwKLSAgICAgICAgICAgIChwYXJhbSA9PSBHTF9MSU5FQVIpKSB7Ci0gICAgICAgICAgICB0ZXh0dXJlT2JqZWN0LT5tYWdfZmlsdGVyID0gcGFyYW07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnb3RvIGludmFsaWRfZW51bTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0dFTkVSQVRFX01JUE1BUDoKLSAgICAgICAgdGV4dHVyZU9iamVjdC0+Z2VuZXJhdGVfbWlwbWFwID0gcGFyYW07Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci1pbnZhbGlkX2VudW06Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW52YWxpZGF0ZV90ZXh0dXJlKGMsIGMtPnRleHR1cmVzLmFjdGl2ZSk7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZCBkcmF3VGV4eE9FU0ltcChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHcsIEdMZml4ZWQgaCwKLSAgICAgICAgb2dsZXNfY29udGV4dF90KiBjKQotewotICAgIG9nbGVzX2xvY2tfdGV4dHVyZXMoYyk7Ci0KLSAgICBjb25zdCBHR0xTdXJmYWNlJiBjYlN1cmZhY2UgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuczsKLSAgICB5ID0gZ2dsSW50VG9GaXhlZChjYlN1cmZhY2UuaGVpZ2h0KSAtICh5ICsgaCk7Ci0gICAgdyA+Pj0gRklYRURfQklUUzsKLSAgICBoID4+PSBGSVhFRF9CSVRTOwotCi0gICAgLy8gc2V0IHVwIGFsbCB0ZXh0dXJlIHVuaXRzCi0gICAgZm9yIChpbnQgaT0wIDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7Ci0gICAgICAgIGlmICghYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLmVuYWJsZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGludDMyX3QgdGV4Y29vcmRzWzhdOwotICAgICAgICB0ZXh0dXJlX3VuaXRfdCYgdShjLT50ZXh0dXJlcy50bXVbaV0pOwotCi0gICAgICAgIC8vIHZhbGlkYXRlIHRoaXMgdG11IChiaW5kLCB3cmFwLCBmaWx0ZXIpCi0gICAgICAgIHZhbGlkYXRlX3RtdShjLCBpKTsKLSAgICAgICAgLy8gd2UgQ0xBTVAgaGVyZSwgd2hpY2ggd29ya3Mgd2l0aCBwcmVtdWx0aXBsaWVkIChzLHQpCi0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4UGFyYW1ldGVyaShjLAotICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFXzJELCBHR0xfVEVYVFVSRV9XUkFQX1MsIEdHTF9DTEFNUCk7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4UGFyYW1ldGVyaShjLAotICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFXzJELCBHR0xfVEVYVFVSRV9XUkFQX1QsIEdHTF9DTEFNUCk7Ci0gICAgICAgIHUuZGlydHkgPSAweEZGOyAvLyBYWFg6IHNob3VsZCBiZSBtb3JlIHN1YnRsZQotCi0gICAgICAgIEVHTFRleHR1cmVPYmplY3QqIHRleHR1cmVPYmplY3QgPSB1LnRleHR1cmU7Ci0gICAgICAgIGNvbnN0IEdMaW50IFVjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFswXSA8PCAxNjsKLSAgICAgICAgY29uc3QgR0xpbnQgVmNyID0gdGV4dHVyZU9iamVjdC0+Y3JvcF9yZWN0WzFdIDw8IDE2OwotICAgICAgICBjb25zdCBHTGludCBXY3IgPSB0ZXh0dXJlT2JqZWN0LT5jcm9wX3JlY3RbMl0gPDwgMTY7Ci0gICAgICAgIGNvbnN0IEdMaW50IEhjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFszXSA8PCAxNjsKLQotICAgICAgICAvLyBjb21wdXRlcyB0ZXh0dXJlIGNvb3JkaW5hdGVzIChwcmUtbXVsdGlwbGllZCkKLSAgICAgICAgaW50MzJfdCBkc2R4ID0gV2NyIC8gdzsgICAvLyBkc2R4ID0gICgoV2NyL3cpL1d0KSpXdAotICAgICAgICBpbnQzMl90IGR0ZHkgPS1IY3IgLyBoOyAgIC8vIGR0ZHkgPSAtKChIY3IvaCkvSHQpKkh0Ci0gICAgICAgIGludDMyX3QgczAgICA9IFVjciAgICAgICAtIGdnbE11bHgoZHNkeCwgeCk7IC8vIHMwID0gVWNyIC0geCAqIGRzZHgKLSAgICAgICAgaW50MzJfdCB0MCAgID0gKFZjcitIY3IpIC0gZ2dsTXVseChkdGR5LCB5KTsgLy8gdDAgPSAoVmNyK0hjcikgLSB5KmR0ZHkKLSAgICAgICAgdGV4Y29vcmRzWzBdID0gczA7Ci0gICAgICAgIHRleGNvb3Jkc1sxXSA9IGRzZHg7Ci0gICAgICAgIHRleGNvb3Jkc1syXSA9IDA7Ci0gICAgICAgIHRleGNvb3Jkc1szXSA9IHQwOwotICAgICAgICB0ZXhjb29yZHNbNF0gPSAwOwotICAgICAgICB0ZXhjb29yZHNbNV0gPSBkdGR5OwotICAgICAgICB0ZXhjb29yZHNbNl0gPSAwOwotICAgICAgICB0ZXhjb29yZHNbN10gPSAwOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleENvb3JkR3JhZFNjYWxlOHh2KGMsIGksIHRleGNvb3Jkcyk7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGVuYWJsZXMgJiAoR0dMX0VOQUJMRV9ERVBUSF9URVNUfEdHTF9FTkFCTEVfRk9HKSkpCi0gICAgICAgIHNldF9kZXB0aF9hbmRfZm9nKGMsIHopOwotCi0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5hY3RpdmVUZXh0dXJlKGMsIGMtPnRleHR1cmVzLmFjdGl2ZSk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvcjR4dihjLCBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLnYpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZGlzYWJsZShjLCBHR0xfV19MRVJQKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRpc2FibGUoYywgR0dMX0FBKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnNoYWRlTW9kZWwoYywgR0xfRkxBVCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5yZWN0aShjLAotICAgICAgICAgICAgZ2dsRml4ZWRUb0ludFJvdW5kKHgpLAotICAgICAgICAgICAgZ2dsRml4ZWRUb0ludFJvdW5kKHkpLAotICAgICAgICAgICAgZ2dsRml4ZWRUb0ludFJvdW5kKHgpK3csCi0gICAgICAgICAgICBnZ2xGaXhlZFRvSW50Um91bmQoeSkraCk7Ci0KLSAgICBvZ2xlc191bmxvY2tfdGV4dHVyZXMoYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRyYXdUZXh4T0VTKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgdywgR0xmaXhlZCBoLAotICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgLy8gcXVpY2tseSByZWplY3QgZW1wdHkgcmVjdHMKLSAgICBpZiAoKHd8aCkgPD0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZHJhd1RleHhPRVNJbXAoeCwgeSwgeiwgdywgaCwgYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRyYXdUZXhpT0VTKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcsIEdMaW50IGgsIG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICAvLyBBbGwgY29vcmRpbmF0ZXMgYXJlIGludGVnZXIsIHNvIGlmIHdlIGhhdmUgb25seSBvbmUKLSAgICAvLyB0ZXh0dXJlIHVuaXQgYWN0aXZlIGFuZCBubyBzY2FsaW5nIGlzIHJlcXVpcmVkCi0gICAgLy8gVEhFTiwgd2UgY2FuIHVzZSBvdXIgc3BlY2lhbCAxOjEgbWFwcGluZwotICAgIC8vIHdoaWNoIGlzIGEgbG90IGZhc3Rlci4KLQotICAgIGlmIChnZ2xfbGlrZWx5KGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlZF90bXUgPT0gMSkpIHsKLSAgICAgICAgY29uc3QgaW50IHRtdSA9IDA7Ci0gICAgICAgIHRleHR1cmVfdW5pdF90JiB1KGMtPnRleHR1cmVzLnRtdVt0bXVdKTsKLSAgICAgICAgRUdMVGV4dHVyZU9iamVjdCogdGV4dHVyZU9iamVjdCA9IHUudGV4dHVyZTsKLSAgICAgICAgY29uc3QgR0xpbnQgV2NyID0gdGV4dHVyZU9iamVjdC0+Y3JvcF9yZWN0WzJdOwotICAgICAgICBjb25zdCBHTGludCBIY3IgPSB0ZXh0dXJlT2JqZWN0LT5jcm9wX3JlY3RbM107Ci0KLSAgICAgICAgaWYgKCh3ID09IFdjcikgJiYgKGggPT0gLUhjcikpIHsKLSAgICAgICAgICAgIGlmICgod3xoKSA8PSAwKSByZXR1cm47IC8vIHF1aWNrbHkgcmVqZWN0IGVtcHR5IHJlY3RzCi0KLSAgICAgICAgICAgIGlmICh1LmRpcnR5KSB7Ci0gICAgICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5hY3RpdmVUZXh0dXJlKGMsIHRtdSk7Ci0gICAgICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5iaW5kVGV4dHVyZShjLCAmKHUudGV4dHVyZS0+c3VyZmFjZSkpOwotICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4UGFyYW1ldGVyaShjLCBHR0xfVEVYVFVSRV8yRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX01JTl9GSUxURVIsIHUudGV4dHVyZS0+bWluX2ZpbHRlcik7Ci0gICAgICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsIEdHTF9URVhUVVJFXzJELAotICAgICAgICAgICAgICAgICAgICAgICAgR0dMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgdS50ZXh0dXJlLT5tYWdfZmlsdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4R2VuaShjLCBHR0xfUywKLSAgICAgICAgICAgICAgICAgICAgR0dMX1RFWFRVUkVfR0VOX01PREUsIEdHTF9PTkVfVE9fT05FKTsKLSAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4R2VuaShjLCBHR0xfVCwKLSAgICAgICAgICAgICAgICAgICAgR0dMX1RFWFRVUkVfR0VOX01PREUsIEdHTF9PTkVfVE9fT05FKTsKLSAgICAgICAgICAgIHUuZGlydHkgPSAweEZGOyAvLyBYWFg6IHNob3VsZCBiZSBtb3JlIHN1YnRsZQotICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5hY3RpdmVUZXh0dXJlKGMsIGMtPnRleHR1cmVzLmFjdGl2ZSk7Ci0KLSAgICAgICAgICAgIGNvbnN0IEdHTFN1cmZhY2UmIGNiU3VyZmFjZSA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5zOwotICAgICAgICAgICAgeSA9IGNiU3VyZmFjZS5oZWlnaHQgLSAoeSArIGgpOwotICAgICAgICAgICAgY29uc3QgR0xpbnQgVWNyID0gdGV4dHVyZU9iamVjdC0+Y3JvcF9yZWN0WzBdOwotICAgICAgICAgICAgY29uc3QgR0xpbnQgVmNyID0gdGV4dHVyZU9iamVjdC0+Y3JvcF9yZWN0WzFdOwotICAgICAgICAgICAgY29uc3QgR0xpbnQgczAgID0gVWNyIC0geDsKLSAgICAgICAgICAgIGNvbnN0IEdMaW50IHQwICA9IChWY3IgKyBIY3IpIC0geTsKLQotICAgICAgICAgICAgY29uc3QgR0x1aW50IHR3ID0gdGV4dHVyZU9iamVjdC0+c3VyZmFjZS53aWR0aDsKLSAgICAgICAgICAgIGNvbnN0IEdMdWludCB0aCA9IHRleHR1cmVPYmplY3QtPnN1cmZhY2UuaGVpZ2h0OwotICAgICAgICAgICAgaWYgKCh1aW50MzJfdChzMCt4K3cpID4gdHcpIHx8ICh1aW50MzJfdCh0MCt5K2gpID4gdGgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIEdMIHNwZWMgaXMgdW5jbGVhciBhYm91dCB3aGF0IHNob3VsZCBoYXBwZW4KLSAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIHNvIHdlIGp1c3QgdXNlIHRoZSBzbG93IGNhc2UsIHdoaWNoCi0gICAgICAgICAgICAgICAgLy8gYXQgbGVhc3Qgd29uJ3QgY3Jhc2gKLSAgICAgICAgICAgICAgICBnb3RvIHNsb3dfY2FzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2dsZXNfbG9ja190ZXh0dXJlcyhjKTsKLQotICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhDb29yZDJpKGMsIHMwLCB0MCk7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOwotICAgICAgICAgICAgaWYgKGdnbF91bmxpa2VseShlbmFibGVzICYgKEdHTF9FTkFCTEVfREVQVEhfVEVTVHxHR0xfRU5BQkxFX0ZPRykpKQotICAgICAgICAgICAgICAgIHNldF9kZXB0aF9hbmRfZm9nKGMsIGdnbEludFRvRml4ZWQoeikpOwotCi0gICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yNHh2KGMsIGMtPmN1cnJlbnRDb2xvckNsYW1wZWQudik7Ci0gICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRpc2FibGUoYywgR0dMX1dfTEVSUCk7Ci0gICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRpc2FibGUoYywgR0dMX0FBKTsKLSAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3Muc2hhZGVNb2RlbChjLCBHTF9GTEFUKTsKLSAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MucmVjdGkoYywgeCwgeSwgeCt3LCB5K2gpOwotCi0gICAgICAgICAgICBvZ2xlc191bmxvY2tfdGV4dHVyZXMoYyk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotc2xvd19jYXNlOgotICAgIGRyYXdUZXh4T0VTSW1wKAotICAgICAgICAgICAgZ2dsSW50VG9GaXhlZCh4KSwgZ2dsSW50VG9GaXhlZCh5KSwgZ2dsSW50VG9GaXhlZCh6KSwKLSAgICAgICAgICAgIGdnbEludFRvRml4ZWQodyksIGdnbEludFRvRml4ZWQoaCksCi0gICAgICAgICAgICBjKTsKLX0KLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBUZXh0dXJlIEFQSQotI2VuZGlmCi0KLXZvaWQgZ2xBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXh0dXJlKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHVpbnQzMl90KHRleHR1cmUtR0xfVEVYVFVSRTApID4gdWludDMyX3QoR0dMX1RFWFRVUkVfVU5JVF9DT1VOVCkpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT50ZXh0dXJlcy5hY3RpdmUgPSB0ZXh0dXJlIC0gR0xfVEVYVFVSRTA7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5hY3RpdmVUZXh0dXJlKGMsIGMtPnRleHR1cmVzLmFjdGl2ZSk7Ci19Ci0KLXZvaWQgZ2xCaW5kVGV4dHVyZShHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCAmJiB0YXJnZXQgIT0gR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEJpbmQgb3IgY3JlYXRlIGEgdGV4dHVyZQotICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+IHRleDsKLSAgICBpZiAodGV4dHVyZSA9PSAwKSB7Ci0gICAgICAgIC8vIDAgaXMgb3VyIGxvY2FsIHRleHR1cmUgb2JqZWN0Ci0gICAgICAgIHRleCA9IGMtPnRleHR1cmVzLmRlZmF1bHRUZXh0dXJlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRleCA9IGMtPnN1cmZhY2VNYW5hZ2VyLT50ZXh0dXJlKHRleHR1cmUpOwotICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KHRleCA9PSAwKSkgewotICAgICAgICAgICAgdGV4ID0gYy0+c3VyZmFjZU1hbmFnZXItPmNyZWF0ZVRleHR1cmUodGV4dHVyZSk7Ci0gICAgICAgICAgICBpZiAodGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9PVVRfT0ZfTUVNT1JZKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYmluZFRleHR1cmVUbXUoYywgYy0+dGV4dHVyZXMuYWN0aXZlLCB0ZXh0dXJlLCB0ZXgpOwotfQotCi12b2lkIGdsR2VuVGV4dHVyZXMoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKG48MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBnZW5lcmF0ZSB1bmlxdWUgKHNoYXJlZCkgdGV4dHVyZSBuYW1lcwotICAgIGMtPnN1cmZhY2VNYW5hZ2VyLT5nZXRUb2tlbihuLCB0ZXh0dXJlcyk7Ci19Ci0KLXZvaWQgZ2xEZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAobjwwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gSWYgZGVsZXRpbmcgYSBib3VuZCB0ZXh0dXJlLCBiaW5kIHRoaXMgdW5pdCB0byAwCi0gICAgZm9yIChpbnQgdD0wIDsgdDxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgdCsrKSB7Ci0gICAgICAgIGlmIChjLT50ZXh0dXJlcy50bXVbdF0ubmFtZSA9PSAwKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8biA7IGkrKykgewotICAgICAgICAgICAgaWYgKHRleHR1cmVzW2ldICYmICh0ZXh0dXJlc1tpXSA9PSBjLT50ZXh0dXJlcy50bXVbdF0ubmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBiaW5kIHRoaXMgdG11IHRvIHRleHR1cmUgMAotICAgICAgICAgICAgICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+IHRleChjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZSk7Ci0gICAgICAgICAgICAgICAgYmluZFRleHR1cmVUbXUoYywgdCwgMCwgdGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBjLT5zdXJmYWNlTWFuYWdlci0+ZGVsZXRlVGV4dHVyZXMobiwgdGV4dHVyZXMpOwotICAgIGMtPnN1cmZhY2VNYW5hZ2VyLT5yZWN5Y2xlVG9rZW5zKG4sIHRleHR1cmVzKTsKLX0KLQotdm9pZCBnbE11bHRpVGV4Q29vcmQ0ZigKLSAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHVpbnQzMl90KHRhcmdldC1HTF9URVhUVVJFMCkgPiB1aW50MzJfdChHR0xfVEVYVFVSRV9VTklUX0NPVU5UKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNvbnN0IGludCB0bXUgPSB0YXJnZXQtR0xfVEVYVFVSRTA7Ci0gICAgYy0+Y3VycmVudC50ZXh0dXJlW3RtdV0uUyA9IGdnbEZsb2F0VG9GaXhlZChzKTsKLSAgICBjLT5jdXJyZW50LnRleHR1cmVbdG11XS5UID0gZ2dsRmxvYXRUb0ZpeGVkKHQpOwotICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlIgPSBnZ2xGbG9hdFRvRml4ZWQocik7Ci0gICAgYy0+Y3VycmVudC50ZXh0dXJlW3RtdV0uUSA9IGdnbEZsb2F0VG9GaXhlZChxKTsKLX0KLQotdm9pZCBnbE11bHRpVGV4Q29vcmQ0eCgKLSAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHVpbnQzMl90KHRhcmdldC1HTF9URVhUVVJFMCkgPiB1aW50MzJfdChHR0xfVEVYVFVSRV9VTklUX0NPVU5UKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNvbnN0IGludCB0bXUgPSB0YXJnZXQtR0xfVEVYVFVSRTA7Ci0gICAgYy0+Y3VycmVudC50ZXh0dXJlW3RtdV0uUyA9IHM7Ci0gICAgYy0+Y3VycmVudC50ZXh0dXJlW3RtdV0uVCA9IHQ7Ci0gICAgYy0+Y3VycmVudC50ZXh0dXJlW3RtdV0uUiA9IHI7Ci0gICAgYy0+Y3VycmVudC50ZXh0dXJlW3RtdV0uUSA9IHE7Ci19Ci0KLXZvaWQgZ2xQaXhlbFN0b3JlaShHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKChwbmFtZSAhPSBHTF9QQUNLX0FMSUdOTUVOVCkgJiYgKHBuYW1lICE9IEdMX1VOUEFDS19BTElHTk1FTlQpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKChwYXJhbTw9MCB8fCBwYXJhbT44KSB8fCAocGFyYW0gJiAocGFyYW0tMSkpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwbmFtZSA9PSBHTF9QQUNLX0FMSUdOTUVOVCkKLSAgICAgICAgYy0+dGV4dHVyZXMucGFja0FsaWdubWVudCA9IHBhcmFtOwotICAgIGlmIChwbmFtZSA9PSBHTF9VTlBBQ0tfQUxJR05NRU5UKQotICAgICAgICBjLT50ZXh0dXJlcy51bnBhY2tBbGlnbm1lbnQgPSBwYXJhbTsKLX0KLQotdm9pZCBnbFRleEVudmYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhFbnZpKGMsIHRhcmdldCwgcG5hbWUsIEdMaW50KHBhcmFtKSk7Ci19Ci0KLXZvaWQgZ2xUZXhFbnZmdigKLSAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAocG5hbWUgPT0gR0xfVEVYVFVSRV9FTlZfTU9ERSkgewotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEVudmkoYywgdGFyZ2V0LCBwbmFtZSwgR0xpbnQoKnBhcmFtcykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwbmFtZSA9PSBHTF9URVhUVVJFX0VOVl9DT0xPUikgewotICAgICAgICBHR0xmaXhlZCBmaXhlZFs0XTsKLSAgICAgICAgZm9yIChpbnQgaT0wIDsgaTw0IDsgaSsrKQotICAgICAgICAgICAgZml4ZWRbaV0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zW2ldKTsKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhFbnZ4dihjLCB0YXJnZXQsIHBuYW1lLCBmaXhlZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLX0KLQotdm9pZCBnbFRleEVudngoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhFbnZpKGMsIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLX0KLQotdm9pZCBnbFRleEVudnh2KAotICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4RW52eHYoYywgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLQotdm9pZCBnbFRleFBhcmFtZXRlcml2KAotICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50KiBwYXJhbXMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQgJiYgdGFyZ2V0ICE9IEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBFR0xUZXh0dXJlT2JqZWN0KiB0ZXh0dXJlT2JqZWN0ID0gYy0+dGV4dHVyZXMudG11W2MtPnRleHR1cmVzLmFjdGl2ZV0udGV4dHVyZTsKLSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVM6Ci0gICAgICAgIG1lbWNweSh0ZXh0dXJlT2JqZWN0LT5jcm9wX3JlY3QsIHBhcmFtcywgNCpzaXplb2YoR0xpbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgdGV4UGFyYW1ldGVyeCh0YXJnZXQsIHBuYW1lLCBHTGZpeGVkKHBhcmFtc1swXSksIGMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi12b2lkIGdsVGV4UGFyYW1ldGVyZigKLSAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgdGV4UGFyYW1ldGVyeCh0YXJnZXQsIHBuYW1lLCBHTGZpeGVkKHBhcmFtKSwgYyk7Ci19Ci0KLXZvaWQgZ2xUZXhQYXJhbWV0ZXJ4KAotICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICB0ZXhQYXJhbWV0ZXJ4KHRhcmdldCwgcG5hbWUsIHBhcmFtLCBjKTsKLX0KLQotdm9pZCBnbFRleFBhcmFtZXRlcmkoCi0gICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICB0ZXhQYXJhbWV0ZXJ4KHRhcmdldCwgcG5hbWUsIEdMZml4ZWQocGFyYW0pLCBjKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jZW5kaWYKLQotdm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEKAotICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LAotICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLAotICAgICAgICBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHRhcmdldCAhPSBHTF9URVhUVVJFXzJEKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHdpZHRoPDAgfHwgaGVpZ2h0PDAgfHwgYm9yZGVyIT0wKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gInVuY29tcHJlc3MiIHRoZSB0ZXh0dXJlIHNpbmNlIHBpeGVsZmxpbmdlciBkb2Vzbid0IHN1cHBvcnQKLSAgICAvLyBhbnkgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBuYXRpdmVseS4KLSAgICBHTGVudW0gZm9ybWF0OwotICAgIEdMZW51bSB0eXBlOwotICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQpIHsKLSAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQjhfT0VTOgotICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCOF9PRVM6Ci0gICAgICAgIGZvcm1hdCAgICAgID0gR0xfUkdCOwotICAgICAgICB0eXBlICAgICAgICA9IEdMX1VOU0lHTkVEX0JZVEU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQThfT0VTOgotICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCQThfT0VTOgotICAgICAgICBmb3JtYXQgICAgICA9IEdMX1JHQkE7Ci0gICAgICAgIHR5cGUgICAgICAgID0gR0xfVU5TSUdORURfQllURTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVM6Ci0gICAgY2FzZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVM6Ci0gICAgICAgIGZvcm1hdCAgICAgID0gR0xfUkdCOwotICAgICAgICB0eXBlICAgICAgICA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE0X09FUzoKLSAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE0X09FUzoKLSAgICAgICAgZm9ybWF0ICAgICAgPSBHTF9SR0JBOwotICAgICAgICB0eXBlICAgICAgICA9IEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfUEFMRVRURThfUkdCNV9BMV9PRVM6Ci0gICAgY2FzZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUzoKLSAgICAgICAgZm9ybWF0ICAgICAgPSBHTF9SR0JBOwotICAgICAgICB0eXBlICAgICAgICA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzE7Ci0gICAgICAgIGJyZWFrOwotI2lmZGVmIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlCi0gICAgY2FzZSBHTF9FVEMxX1JHQjhfT0VTOgotICAgICAgICBmb3JtYXQgICAgICA9IEdMX1JHQjsKLSAgICAgICAgdHlwZSAgICAgICAgPSBHTF9VTlNJR05FRF9CWVRFOwotICAgICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWRhdGEgfHwgIXdpZHRoIHx8ICFoZWlnaHQpIHsKLSAgICAgICAgLy8gdW5jbGVhciBpZiB0aGlzIGlzIGFuIGVycm9yIG9yIG5vdC4uLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50MzJfdCBzaXplOwotICAgIEdHTFN1cmZhY2UqIHN1cmZhY2U7Ci0KLSNpZmRlZiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZQotICAgIGlmIChpbnRlcm5hbGZvcm1hdCA9PSBHTF9FVEMxX1JHQjhfT0VTKSB7Ci0gICAgICAgIEdMc2l6ZWkgY29tcHJlc3NlZFNpemUgPSBldGMxX2dldF9lbmNvZGVkX2RhdGFfc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKGNvbXByZXNzZWRTaXplID4gaW1hZ2VTaXplKSB7Ci0gICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnQgZXJyb3IgPSBjcmVhdGVUZXh0dXJlU3VyZmFjZShjLCAmc3VyZmFjZSwgJnNpemUsCi0gICAgICAgICAgICAgICAgbGV2ZWwsIGZvcm1hdCwgdHlwZSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyb3IpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChldGMxX2RlY29kZV9pbWFnZSgKLSAgICAgICAgICAgICAgICAoY29uc3QgZXRjMV9ieXRlKilkYXRhLAotICAgICAgICAgICAgICAgIChldGMxX2J5dGUqKXN1cmZhY2UtPmRhdGEsCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMywgc3VyZmFjZS0+c3RyaWRlKjMpICE9IDApIHsKLSAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyBhbGwgbWlwbWFwIGxldmVscyBhcmUgc3BlY2lmaWVkIGF0IG9uY2UuCi0gICAgY29uc3QgaW50IG51bUxldmVscyA9IGxldmVsPDAgPyAtbGV2ZWwgOiAxOwotCi0gICAgaWYgKGRhdGFTaXplUGFsZXR0ZTQobnVtTGV2ZWxzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpID4gaW1hZ2VTaXplKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaT0wIDsgaTxudW1MZXZlbHMgOyBpKyspIHsKLSAgICAgICAgaW50IGxvZF93ID0gKHdpZHRoICA+PiBpKSA/IDogMTsKLSAgICAgICAgaW50IGxvZF9oID0gKGhlaWdodCA+PiBpKSA/IDogMTsKLSAgICAgICAgaW50IGVycm9yID0gY3JlYXRlVGV4dHVyZVN1cmZhY2UoYywgJnN1cmZhY2UsICZzaXplLAotICAgICAgICAgICAgICAgIGksIGZvcm1hdCwgdHlwZSwgbG9kX3csIGxvZF9oKTsKLSAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnJvcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZGVjb2RlUGFsZXR0ZTQoZGF0YSwgaSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBzdXJmYWNlLT5kYXRhLCBzdXJmYWNlLT5zdHJpZGUsIGludGVybmFsZm9ybWF0KTsKLSAgICB9Ci19Ci0KLQotdm9pZCBnbFRleEltYWdlMkQoCi0gICAgICAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwKLSAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwKLSAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHRhcmdldCAhPSBHTF9URVhUVVJFXzJEKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHdpZHRoPDAgfHwgaGVpZ2h0PDAgfHwgYm9yZGVyIT0wIHx8IGxldmVsIDwgMCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZm9ybWF0ICE9IChHTGVudW0paW50ZXJuYWxmb3JtYXQpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh2YWxpZEZvcm1hdFR5cGUoYywgZm9ybWF0LCB0eXBlKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50MzJfdCBzaXplID0gMDsKLSAgICBHR0xTdXJmYWNlKiBzdXJmYWNlID0gMDsKLSAgICBpbnQgZXJyb3IgPSBjcmVhdGVUZXh0dXJlU3VyZmFjZShjLCAmc3VyZmFjZSwgJnNpemUsCi0gICAgICAgICAgICBsZXZlbCwgZm9ybWF0LCB0eXBlLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyb3IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBpeGVscykgewotICAgICAgICBjb25zdCBpbnQzMl90IGZvcm1hdElkeCA9IGNvbnZlcnRHTFBpeGVsRm9ybWF0KGZvcm1hdCwgdHlwZSk7Ci0gICAgICAgIGNvbnN0IEdHTEZvcm1hdCYgcGl4ZWxGb3JtYXQoYy0+cmFzdGVyaXplci5mb3JtYXRzW2Zvcm1hdElkeF0pOwotICAgICAgICBjb25zdCBpbnQzMl90IGFsaWduID0gYy0+dGV4dHVyZXMudW5wYWNrQWxpZ25tZW50LTE7Ci0gICAgICAgIGNvbnN0IGludDMyX3QgYnByID0gKCh3aWR0aCAqIHBpeGVsRm9ybWF0LnNpemUpICsgYWxpZ24pICYgfmFsaWduOwotICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGJwciAqIGhlaWdodDsKLSAgICAgICAgY29uc3QgaW50MzJfdCBzdHJpZGUgPSBicHIgLyBwaXhlbEZvcm1hdC5zaXplOwotCi0gICAgICAgIEdHTFN1cmZhY2UgdXNlclN1cmZhY2U7Ci0gICAgICAgIHVzZXJTdXJmYWNlLnZlcnNpb24gPSBzaXplb2YodXNlclN1cmZhY2UpOwotICAgICAgICB1c2VyU3VyZmFjZS53aWR0aCAgPSB3aWR0aDsKLSAgICAgICAgdXNlclN1cmZhY2UuaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB1c2VyU3VyZmFjZS5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgICAgIHVzZXJTdXJmYWNlLmZvcm1hdCA9IGZvcm1hdElkeDsKLSAgICAgICAgdXNlclN1cmZhY2UuY29tcHJlc3NlZEZvcm1hdCA9IDA7Ci0gICAgICAgIHVzZXJTdXJmYWNlLmRhdGEgPSAoR0x1Ynl0ZSopcGl4ZWxzOwotCi0gICAgICAgIGludCBlcnIgPSBjb3B5UGl4ZWxzKGMsICpzdXJmYWNlLCAwLCAwLCB1c2VyU3VyZmFjZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZ2VuZXJhdGVNaXBtYXAoYywgbGV2ZWwpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQoCi0gICAgICAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LAotICAgICAgICBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKLSAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsCi0gICAgICAgIGNvbnN0IEdMdm9pZCAqZGF0YSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci19Ci0KLXZvaWQgZ2xUZXhTdWJJbWFnZTJEKAotICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwKLSAgICAgICAgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0gICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh4b2Zmc2V0PDAgfHwgeW9mZnNldDwwIHx8IHdpZHRoPDAgfHwgaGVpZ2h0PDAgfHwgbGV2ZWw8MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodmFsaWRGb3JtYXRUeXBlKGMsIGZvcm1hdCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRleHR1cmUgaXMgYm91bmQgdG8gdGhlIGN1cnJlbnQgdW5pdAotICAgIGNvbnN0IGludCBhY3RpdmUgPSBjLT50ZXh0dXJlcy5hY3RpdmU7Ci0gICAgRUdMVGV4dHVyZU9iamVjdCogdGV4ID0gYy0+dGV4dHVyZXMudG11W2FjdGl2ZV0udGV4dHVyZTsKLSAgICBjb25zdCBHR0xTdXJmYWNlJiBzdXJmYWNlKHRleC0+bWlwKGxldmVsKSk7Ci0KLSAgICBpZiAoIXRleC0+aW50ZXJuYWxmb3JtYXQgfHwgdGV4LT5kaXJlY3QpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGZvcm1hdCAhPSB0ZXgtPmludGVybmFsZm9ybWF0KSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoKHhvZmZzZXQgKyB3aWR0aCAgPiBHTHNpemVpKHN1cmZhY2Uud2lkdGgpKSB8fAotICAgICAgICAoeW9mZnNldCArIGhlaWdodCA+IEdMc2l6ZWkoc3VyZmFjZS5oZWlnaHQpKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuOyAvLyBva2F5LCBidXQgbm8tb3AuCi0gICAgfQotCi0gICAgLy8gZmlndXJlIG91dCB0aGUgc2l6ZSB3ZSBuZWVkIGFzIHdlbGwgYXMgdGhlIHN0cmlkZQotICAgIGNvbnN0IGludDMyX3QgZm9ybWF0SWR4ID0gY29udmVydEdMUGl4ZWxGb3JtYXQoZm9ybWF0LCB0eXBlKTsKLSAgICBpZiAoZm9ybWF0SWR4ID09IDApIHsgLy8gd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhpcwotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBHR0xGb3JtYXQmIHBpeGVsRm9ybWF0KGMtPnJhc3Rlcml6ZXIuZm9ybWF0c1tmb3JtYXRJZHhdKTsKLSAgICBjb25zdCBpbnQzMl90IGFsaWduID0gYy0+dGV4dHVyZXMudW5wYWNrQWxpZ25tZW50LTE7Ci0gICAgY29uc3QgaW50MzJfdCBicHIgPSAoKHdpZHRoICogcGl4ZWxGb3JtYXQuc2l6ZSkgKyBhbGlnbikgJiB+YWxpZ247Ci0gICAgY29uc3Qgc2l6ZV90IHNpemUgPSBicHIgKiBoZWlnaHQ7Ci0gICAgY29uc3QgaW50MzJfdCBzdHJpZGUgPSBicHIgLyBwaXhlbEZvcm1hdC5zaXplOwotICAgIEdHTFN1cmZhY2UgdXNlclN1cmZhY2U7Ci0gICAgdXNlclN1cmZhY2UudmVyc2lvbiA9IHNpemVvZih1c2VyU3VyZmFjZSk7Ci0gICAgdXNlclN1cmZhY2Uud2lkdGggID0gd2lkdGg7Ci0gICAgdXNlclN1cmZhY2UuaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHVzZXJTdXJmYWNlLnN0cmlkZSA9IHN0cmlkZTsKLSAgICB1c2VyU3VyZmFjZS5mb3JtYXQgPSBmb3JtYXRJZHg7Ci0gICAgdXNlclN1cmZhY2UuY29tcHJlc3NlZEZvcm1hdCA9IDA7Ci0gICAgdXNlclN1cmZhY2UuZGF0YSA9IChHTHVieXRlKilwaXhlbHM7Ci0KLSAgICBpbnQgZXJyID0gY29weVBpeGVscyhjLAotICAgICAgICAgICAgc3VyZmFjZSwgeG9mZnNldCwgeW9mZnNldCwKLSAgICAgICAgICAgIHVzZXJTdXJmYWNlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBpZiAoZXJyKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZU1pcG1hcChjLCBsZXZlbCk7Ci0KLSAgICAvLyBzaW5jZSB3ZSBvbmx5IGNoYW5nZWQgdGhlIGNvbnRlbnQgb2YgdGhlIHRleHR1cmUsIHdlIGRvbid0IG5lZWQKLSAgICAvLyB0byBjYWxsIGJpbmRUZXh0dXJlIG9uIHRoZSBtYWluIHJhc3Rlcml6ZXIuCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBnbENvcHlUZXhJbWFnZTJEKAotICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LAotICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKLSAgICAgICAgR0xpbnQgYm9yZGVyKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHRhcmdldCAhPSBHTF9URVhUVVJFXzJEKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGludGVybmFsZm9ybWF0PEdMX0FMUEhBIHx8IGludGVybmFsZm9ybWF0PkdMX0xVTUlOQU5DRV9BTFBIQSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh3aWR0aDwwIHx8IGhlaWdodDwwIHx8IGJvcmRlciE9MCB8fCBsZXZlbDwwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgR0xlbnVtIGZvcm1hdCA9IDA7Ci0gICAgR0xlbnVtIHR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOwotICAgIGNvbnN0IEdHTFN1cmZhY2UmIGNiU3VyZmFjZSA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5zOwotICAgIGNvbnN0IGludCBjYkZvcm1hdElkeCA9IGNiU3VyZmFjZS5mb3JtYXQ7Ci0gICAgc3dpdGNoIChjYkZvcm1hdElkeCkgewotICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OgotICAgICAgICB0eXBlID0gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTE6Ci0gICAgICAgIHR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0OgotICAgICAgICB0eXBlID0gR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQpIHsKLSAgICBjYXNlIEdMX0FMUEhBOgotICAgIGNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOgotICAgIGNhc2UgR0xfTFVNSU5BTkNFOgotICAgICAgICB0eXBlID0gR0xfVU5TSUdORURfQllURTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gZmlndXJlIG91dCB0aGUgZm9ybWF0IHRvIHVzZSBmb3IgdGhlIG5ldyB0ZXh0dXJlCi0gICAgc3dpdGNoIChjYkZvcm1hdElkeCkgewotICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6Ci0gICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX0FfODoKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxOgotICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQ6Ci0gICAgICAgIGZvcm1hdCA9IGludGVybmFsZm9ybWF0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OgotICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfODg4OgotICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OgotICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9MXzg6Ci0gICAgICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQpIHsKLSAgICAgICAgY2FzZSBHTF9MVU1JTkFOQ0U6Ci0gICAgICAgIGNhc2UgR0xfUkdCOgotICAgICAgICAgICAgZm9ybWF0ID0gaW50ZXJuYWxmb3JtYXQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoZm9ybWF0ID09IDApIHsKLSAgICAgICAgLy8gaW52YWxpZCBjb21iaW5hdGlvbgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gY3JlYXRlIHRoZSBuZXcgdGV4dHVyZS4uLgotICAgIGludDMyX3Qgc2l6ZTsKLSAgICBHR0xTdXJmYWNlKiBzdXJmYWNlOwotICAgIGludCBlcnJvciA9IGNyZWF0ZVRleHR1cmVTdXJmYWNlKGMsICZzdXJmYWNlLCAmc2l6ZSwKLSAgICAgICAgICAgIGxldmVsLCBmb3JtYXQsIHR5cGUsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChlcnJvcikgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnJvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgYm90dG9tIHJvdyBpcyBzdG9yZWQgZmlyc3QgaW4gdGV4dHVyZXMKLSAgICBHR0xTdXJmYWNlIHR4U3VyZmFjZSgqc3VyZmFjZSk7Ci0gICAgdHhTdXJmYWNlLnN0cmlkZSA9IC10eFN1cmZhY2Uuc3RyaWRlOwotCi0gICAgLy8gKHgseSkgaXMgdGhlIGxvd2VyLWxlZnQgY29ybmVyIG9mIGNvbG9yQnVmZmVyCi0gICAgeSA9IGNiU3VyZmFjZS5oZWlnaHQgLSAoeSArIGhlaWdodCk7Ci0KLSAgICAvKiBUaGUgR0xFUyBzcGVjIHNheXM6Ci0gICAgICogSWYgYW55IG9mIHRoZSBwaXhlbHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGFyZSBvdXRzaWRlCi0gICAgICogdGhlIGZyYW1lYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCByZW5kZXJpbmcgY29udGV4dCwKLSAgICAgKiB0aGVuIHRoZSB2YWx1ZXMgb2J0YWluZWQgZm9yIHRob3NlIHBpeGVscyBhcmUgdW5kZWZpbmVkLgotICAgICAqLwotICAgIGlmICh4K3dpZHRoID4gR0xpbnQoY2JTdXJmYWNlLndpZHRoKSkKLSAgICAgICAgd2lkdGggPSBjYlN1cmZhY2Uud2lkdGggLSB4OwotCi0gICAgaWYgKHkraGVpZ2h0ID4gR0xpbnQoY2JTdXJmYWNlLmhlaWdodCkpCi0gICAgICAgIGhlaWdodCA9IGNiU3VyZmFjZS5oZWlnaHQgLSB5OwotCi0gICAgaW50IGVyciA9IGNvcHlQaXhlbHMoYywKLSAgICAgICAgICAgIHR4U3VyZmFjZSwgMCwgMCwKLSAgICAgICAgICAgIGNiU3VyZmFjZSwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKGVycikgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnIpOwotICAgIH0KLQotICAgIGdlbmVyYXRlTWlwbWFwKGMsIGxldmVsKTsKLX0KLQotdm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEKAotICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwKLSAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoeG9mZnNldDwwIHx8IHlvZmZzZXQ8MCB8fCB3aWR0aDwwIHx8IGhlaWdodDwwIHx8IGxldmVsPDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybjsgLy8gb2theSwgYnV0IG5vLW9wLgotICAgIH0KLQotICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRleHR1cmUgaXMgYm91bmQgdG8gdGhlIGN1cnJlbnQgdW5pdAotICAgIGNvbnN0IGludCBhY3RpdmUgPSBjLT50ZXh0dXJlcy5hY3RpdmU7Ci0gICAgRUdMVGV4dHVyZU9iamVjdCogdGV4ID0gYy0+dGV4dHVyZXMudG11W2FjdGl2ZV0udGV4dHVyZTsKLSAgICBjb25zdCBHR0xTdXJmYWNlJiBzdXJmYWNlKHRleC0+bWlwKGxldmVsKSk7Ci0KLSAgICBpZiAoIXRleC0+aW50ZXJuYWxmb3JtYXQpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgoeG9mZnNldCArIHdpZHRoICA+IEdMc2l6ZWkoc3VyZmFjZS53aWR0aCkpIHx8Ci0gICAgICAgICh5b2Zmc2V0ICsgaGVpZ2h0ID4gR0xzaXplaShzdXJmYWNlLmhlaWdodCkpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhlIGJvdHRvbSByb3cgaXMgc3RvcmVkIGZpcnN0IGluIHRleHR1cmVzCi0gICAgR0dMU3VyZmFjZSB0eFN1cmZhY2Uoc3VyZmFjZSk7Ci0gICAgdHhTdXJmYWNlLnN0cmlkZSA9IC10eFN1cmZhY2Uuc3RyaWRlOwotCi0gICAgLy8gKHgseSkgaXMgdGhlIGxvd2VyLWxlZnQgY29ybmVyIG9mIGNvbG9yQnVmZmVyCi0gICAgY29uc3QgR0dMU3VyZmFjZSYgY2JTdXJmYWNlID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmNvbG9yLnM7Ci0gICAgeSA9IGNiU3VyZmFjZS5oZWlnaHQgLSAoeSArIGhlaWdodCk7Ci0KLSAgICAvKiBUaGUgR0xFUyBzcGVjIHNheXM6Ci0gICAgICogSWYgYW55IG9mIHRoZSBwaXhlbHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGFyZSBvdXRzaWRlCi0gICAgICogdGhlIGZyYW1lYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCByZW5kZXJpbmcgY29udGV4dCwKLSAgICAgKiB0aGVuIHRoZSB2YWx1ZXMgb2J0YWluZWQgZm9yIHRob3NlIHBpeGVscyBhcmUgdW5kZWZpbmVkLgotICAgICAqLwotICAgIGlmICh4K3dpZHRoID4gR0xpbnQoY2JTdXJmYWNlLndpZHRoKSkKLSAgICAgICAgd2lkdGggPSBjYlN1cmZhY2Uud2lkdGggLSB4OwotCi0gICAgaWYgKHkraGVpZ2h0ID4gR0xpbnQoY2JTdXJmYWNlLmhlaWdodCkpCi0gICAgICAgIGhlaWdodCA9IGNiU3VyZmFjZS5oZWlnaHQgLSB5OwotCi0gICAgaW50IGVyciA9IGNvcHlQaXhlbHMoYywKLSAgICAgICAgICAgIHR4U3VyZmFjZSwgeG9mZnNldCwgeW9mZnNldCwKLSAgICAgICAgICAgIGNiU3VyZmFjZSwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKGVycikgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVNaXBtYXAoYywgbGV2ZWwpOwotfQotCi12b2lkIGdsUmVhZFBpeGVscygKLSAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0gICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICgoZm9ybWF0ICE9IEdMX1JHQkEpICYmIChmb3JtYXQgIT0gR0xfUkdCKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgodHlwZSAhPSBHTF9VTlNJR05FRF9CWVRFKSAmJiAodHlwZSAhPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSkpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAod2lkdGg8MCB8fCBoZWlnaHQ8MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoeDwwIHx8IHk8MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludDMyX3QgZm9ybWF0SWR4ID0gR0dMX1BJWEVMX0ZPUk1BVF9OT05FOwotICAgIGlmICgoZm9ybWF0ID09IEdMX1JHQkEpICYmICh0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpKSB7Ci0gICAgICAgIGZvcm1hdElkeCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OwotICAgIH0gZWxzZSBpZiAoKGZvcm1hdCA9PSBHTF9SR0IpICYmICh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81KSkgewotICAgICAgICBmb3JtYXRJZHggPSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgR0dMU3VyZmFjZSYgcmVhZFN1cmZhY2UgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMucmVhZC5zOwotICAgIGlmICgoeCt3aWR0aCA+IEdMaW50KHJlYWRTdXJmYWNlLndpZHRoKSkgfHwKLSAgICAgICAgICAgICh5K2hlaWdodCA+IEdMaW50KHJlYWRTdXJmYWNlLmhlaWdodCkpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgR0dMRm9ybWF0JiBwaXhlbEZvcm1hdChjLT5yYXN0ZXJpemVyLmZvcm1hdHNbZm9ybWF0SWR4XSk7Ci0gICAgY29uc3QgaW50MzJfdCBhbGlnbiA9IGMtPnRleHR1cmVzLnBhY2tBbGlnbm1lbnQtMTsKLSAgICBjb25zdCBpbnQzMl90IGJwciA9ICgod2lkdGggKiBwaXhlbEZvcm1hdC5zaXplKSArIGFsaWduKSAmIH5hbGlnbjsKLSAgICBjb25zdCBpbnQzMl90IHN0cmlkZSA9IGJwciAvIHBpeGVsRm9ybWF0LnNpemU7Ci0KLSAgICBHR0xTdXJmYWNlIHVzZXJTdXJmYWNlOwotICAgIHVzZXJTdXJmYWNlLnZlcnNpb24gPSBzaXplb2YodXNlclN1cmZhY2UpOwotICAgIHVzZXJTdXJmYWNlLndpZHRoICA9IHdpZHRoOwotICAgIHVzZXJTdXJmYWNlLmhlaWdodCA9IGhlaWdodDsKLSAgICB1c2VyU3VyZmFjZS5zdHJpZGUgPSAtc3RyaWRlOyAvLyBib3R0b20gcm93IGlzIHRyYW5zZmVyZWQgZmlyc3QKLSAgICB1c2VyU3VyZmFjZS5mb3JtYXQgPSBmb3JtYXRJZHg7Ci0gICAgdXNlclN1cmZhY2UuY29tcHJlc3NlZEZvcm1hdCA9IDA7Ci0gICAgdXNlclN1cmZhY2UuZGF0YSA9IChHTHVieXRlKilwaXhlbHM7Ci0KLSAgICAvLyB1c2UgcGl4ZWwtZmxpbmdlciB0byBoYW5kbGUgYWxsIHRoZSBjb252ZXJzaW9ucwotICAgIEdHTENvbnRleHQqIGdnbCA9IGdldFJhc3Rlcml6ZXIoYyk7Ci0gICAgaWYgKCFnZ2wpIHsKLSAgICAgICAgLy8gdGhlIG9ubHkgcmVhc29uIHRoaXMgd291bGQgZmFpbCBpcyBiZWNhdXNlIHdlIHJhbiBvdXQgb2YgbWVtb3J5Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX09VVF9PRl9NRU1PUlkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZ2dsLT5jb2xvckJ1ZmZlcihnZ2wsICZ1c2VyU3VyZmFjZSk7ICAvLyBkZXN0aW5hdGlvbiBpcyB1c2VyIGJ1ZmZlcgotICAgIGdnbC0+YmluZFRleHR1cmUoZ2dsLCAmcmVhZFN1cmZhY2UpOyAgLy8gc291cmNlIGlzIHJlYWQtYnVmZmVyCi0gICAgZ2dsLT50ZXhDb29yZDJpKGdnbCwgeCwgcmVhZFN1cmZhY2UuaGVpZ2h0IC0gKHkgKyBoZWlnaHQpKTsKLSAgICBnZ2wtPnJlY3RpKGdnbCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIERyYXdUZXh0dXJlIEV4dGVuc2lvbgotI2VuZGlmCi0KLXZvaWQgZ2xEcmF3VGV4c3ZPRVMoY29uc3QgR0xzaG9ydCogY29vcmRzKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBkcmF3VGV4aU9FUyhjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10sIGNvb3Jkc1s0XSwgYyk7Ci19Ci12b2lkIGdsRHJhd1RleGl2T0VTKGNvbnN0IEdMaW50KiBjb29yZHMpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGRyYXdUZXhpT0VTKGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjb29yZHNbMl0sIGNvb3Jkc1szXSwgY29vcmRzWzRdLCBjKTsKLX0KLXZvaWQgZ2xEcmF3VGV4c09FUyhHTHNob3J0IHggLCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3LCBHTHNob3J0IGgpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGRyYXdUZXhpT0VTKHgsIHksIHosIHcsIGgsIGMpOwotfQotdm9pZCBnbERyYXdUZXhpT0VTKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcsIEdMaW50IGgpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGRyYXdUZXhpT0VTKHgsIHksIHosIHcsIGgsIGMpOwotfQotCi12b2lkIGdsRHJhd1RleGZ2T0VTKGNvbnN0IEdMZmxvYXQqIGNvb3JkcykgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgZHJhd1RleHhPRVMoCi0gICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoY29vcmRzWzBdKSwKLSAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChjb29yZHNbMV0pLAotICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGNvb3Jkc1syXSksCi0gICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoY29vcmRzWzNdKSwKLSAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChjb29yZHNbNF0pLAotICAgICAgICAgICAgYyk7Ci19Ci12b2lkIGdsRHJhd1RleHh2T0VTKGNvbnN0IEdMZml4ZWQqIGNvb3JkcykgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgZHJhd1RleHhPRVMoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdLCBjb29yZHNbNF0sIGMpOwotfQotdm9pZCBnbERyYXdUZXhmT0VTKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdywgR0xmbG9hdCBoKXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGRyYXdUZXh4T0VTKAotICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKHgpLCBnZ2xGbG9hdFRvRml4ZWQoeSksIGdnbEZsb2F0VG9GaXhlZCh6KSwKLSAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZCh3KSwgZ2dsRmxvYXRUb0ZpeGVkKGgpLAotICAgICAgICAgICAgYyk7Ci19Ci12b2lkIGdsRHJhd1RleHhPRVMoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3LCBHTGZpeGVkIGgpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGRyYXdUZXh4T0VTKHgsIHksIHosIHcsIGgsIGMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBFR0wgSW1hZ2UgRXh0ZW5zaW9uCi0jZW5kaWYKLQotdm9pZCBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQgJiYgdGFyZ2V0ICE9IEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoaW1hZ2UgPT0gRUdMX05PX0lNQUdFX0tIUikgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIG5hdGl2ZV9idWZmZXIgPSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciopaW1hZ2U7Ci0gICAgaWYgKG5hdGl2ZV9idWZmZXItPmNvbW1vbi5tYWdpYyAhPSBBTkRST0lEX05BVElWRV9CVUZGRVJfTUFHSUMpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG5hdGl2ZV9idWZmZXItPmNvbW1vbi52ZXJzaW9uICE9IHNpemVvZihBTmF0aXZlV2luZG93QnVmZmVyKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGJpbmQgaXQgdG8gdGhlIHRleHR1cmUgdW5pdAotICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+IHRleCA9IGdldEFuZEJpbmRBY3RpdmVUZXh0dXJlT2JqZWN0KGMpOwotICAgIHRleC0+c2V0SW1hZ2UobmF0aXZlX2J1ZmZlcik7Ci19Ci0KLXZvaWQgZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICh0YXJnZXQgIT0gR0xfUkVOREVSQlVGRkVSX09FUykgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGltYWdlID09IEVHTF9OT19JTUFHRV9LSFIpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBuYXRpdmVfYnVmZmVyID0gKEFOYXRpdmVXaW5kb3dCdWZmZXIqKWltYWdlOwotICAgIGlmIChuYXRpdmVfYnVmZmVyLT5jb21tb24ubWFnaWMgIT0gQU5EUk9JRF9OQVRJVkVfQlVGRkVSX01BR0lDKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChuYXRpdmVfYnVmZmVyLT5jb21tb24udmVyc2lvbiAhPSBzaXplb2YoQU5hdGl2ZVdpbmRvd0J1ZmZlcikpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyB3ZWxsLCB3ZSdyZSBub3Qgc3VwcG9ydGluZyB0aGlzIGV4dGVuc2lvbiBhbnl3YXlzCi19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3RleHR1cmUuaCBiL29wZW5nbC9saWJhZ2wvdGV4dHVyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGY3NTUwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvdGV4dHVyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy90ZXh0dXJlLmgKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfVEVYVFVSRV9ICi0jZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfVEVYVFVSRV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvcGl4ZWxmbGluZ2VyL2dnbF9jb250ZXh0Lmg+Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0KLSNpbmNsdWRlICJjb250ZXh0LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdm9pZCBvZ2xlc19pbml0X3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjKTsKLXZvaWQgb2dsZXNfdW5pbml0X3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjKTsKLXZvaWQgb2dsZXNfdmFsaWRhdGVfdGV4dHVyZShvZ2xlc19jb250ZXh0X3QqIGMpOwotdm9pZCBvZ2xlc19sb2NrX3RleHR1cmVzKG9nbGVzX2NvbnRleHRfdCogYyk7Ci12b2lkIG9nbGVzX3VubG9ja190ZXh0dXJlcyhvZ2xlc19jb250ZXh0X3QqIGMpOwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19URVhUVVJFX0gKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvdmVydGV4LmNwcCBiL29wZW5nbC9saWJhZ2wvdmVydGV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkMDRkNi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL3ZlcnRleC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy92ZXJ0ZXguY3BwCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiY29udGV4dC5oIgotI2luY2x1ZGUgImZwLmgiCi0jaW5jbHVkZSAidmVydGV4LmgiCi0jaW5jbHVkZSAic3RhdGUuaCIKLSNpbmNsdWRlICJtYXRyaXguaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgb2dsZXNfaW5pdF92ZXJ0ZXgob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGMtPmN1bGwuZW5hYmxlID0gR0xfRkFMU0U7Ci0gICAgYy0+Y3VsbC5jdWxsRmFjZSA9IEdMX0JBQ0s7Ci0gICAgYy0+Y3VsbC5mcm9udEZhY2UgPSBHTF9DQ1c7Ci0KLSAgICBjLT5jdXJyZW50LmNvbG9yLnIgPSAweDEwMDAwOwotICAgIGMtPmN1cnJlbnQuY29sb3IuZyA9IDB4MTAwMDA7Ci0gICAgYy0+Y3VycmVudC5jb2xvci5iID0gMHgxMDAwMDsKLSAgICBjLT5jdXJyZW50LmNvbG9yLmEgPSAweDEwMDAwOwotCi0gICAgYy0+Y3VycmVudE5vcm1hbC56ID0gMHgxMDAwMDsKLX0KLQotdm9pZCBvZ2xlc191bmluaXRfdmVydGV4KG9nbGVzX2NvbnRleHRfdCogYykKLXsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdmVydGV4IHByb2Nlc3NpbmcKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRGl2aWRlcyBhIHZlcnRleCBjbGlwIGNvb3JkaW5hdGVzIGJ5IFcKLXN0YXRpYyBpbmxpbmUKLXZvaWQgcGVyc3BlY3RpdmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdiwgdWludDMyX3QgZW5hYmxlcykKLXsKLSAgICAvLyBbeCx5LHpdd2luZG93ID0gdnB0ICogKFt4LHksel1jbGlwIC8gY2xpcC53KQotICAgIC8vIFt3XXdpbmRvdyA9IDEvdwotCi0gICAgLy8gV2l0aCBhIHJlZ3VsYXIgcHJvamVjdGlvbiBnZW5lcmF0ZWQgYnkgZ2xGcnVzdHVtKCksCi0gICAgLy8gd2UgaGF2ZSB3PS16LCB0aGVyZWZvcmUsIHcgaXMgaW4gW3pOZWFyLCB6RmFyXS4KLSAgICAvLyBBbHNvLCB6TmVhciBhbmQgekZhciBhcmUgc3RyaWNseSBwb3NpdGl2ZSwKLSAgICAvLyBhbmQgMS93ICh3aW5kb3cudykgaXMgaW4gWzEvekZhciwgMS96TmVhcl0sIHVzdWFsbHkgdGhpcwotICAgIC8vIG1lYW5zIF0wLCAraW5mWyAtLSBob3dldmVyLCBpdCBpcyBhbHdheXMgcmVjb21tZW5kZWQKLSAgICAvLyB0byB1c2UgYXMgbGFyZ2UgdmFsdWVzIGFzIHBvc3NpYmxlIGZvciB6TmVhci4KLSAgICAvLyBBbGwgaW4gYWxsLCB3IGlzIHVzdWFsbHkgc21hbGxlciB0aGFuIDEuMCAoYXNzdW1pbmcKLSAgICAvLyB6TmVhciBpcyBhdCBsZWFzdCAxLjApOyBhbmQgZXZlbiBpZiB6TmVhciBpcyBzbWFsbGVyIHRoYW4gMS4wCi0gICAgLy8gdmFsdWVzIG9mIHcgd29uJ3QgYmUgdG9vIGJpZy4KLQotICAgIGNvbnN0IGludDMyX3QgcncgPSBnZ2xSZWNpcDI4KHYtPmNsaXAudyk7Ci0gICAgY29uc3QgR0xmaXhlZCogY29uc3QgbSA9IGMtPnRyYW5zZm9ybXMudnB0LnRyYW5zZm9ybS5tYXRyaXgubTsKLSAgICB2LT53aW5kb3cudyA9IHJ3OwotICAgIHYtPndpbmRvdy54ID0gZ2dsTXVsQWRkeChnZ2xNdWx4KHYtPmNsaXAueCwgcncsIDE2KSwgbVsgMF0sIG1bMTJdLCAyOCk7IAotICAgIHYtPndpbmRvdy55ID0gZ2dsTXVsQWRkeChnZ2xNdWx4KHYtPmNsaXAueSwgcncsIDE2KSwgbVsgNV0sIG1bMTNdLCAyOCk7Ci0gICAgdi0+d2luZG93LnggPSBUUklfRlJPTV9GSVhFRCh2LT53aW5kb3cueCk7Ci0gICAgdi0+d2luZG93LnkgPSBUUklfRlJPTV9GSVhFRCh2LT53aW5kb3cueSk7Ci0gICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0RFUFRIX1RFU1QpIHsKLSAgICAgICAgdi0+d2luZG93LnogPSBnZ2xNdWxBZGR4KGdnbE11bHgodi0+Y2xpcC56LCBydywgMTYpLCBtWzEwXSwgbVsxNF0sIDI4KTsKLSAgICB9Ci19Ci0KLS8vIGZydXN0dW0gY2xpcHBpbmcgYW5kIFctZGl2aWRlCi1zdGF0aWMgaW5saW5lCi12b2lkIGNsaXBGcnVzdHVtUGVyc3BlY3RpdmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdiwgdWludDMyX3QgZW5hYmxlcykKLXsKLSAgICAvLyBuZGMgPSBjbGlwIC8gVwotICAgIC8vIHdpbmRvdyA9IG5jZCAqIHZpZXdwb3J0Ci0gICAgCi0gICAgLy8gY2xpcCB0byB0aGUgdmlldy12b2x1bWUKLSAgICB1aW50MzJfdCBjbGlwID0gdi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7Ci0gICAgY29uc3QgR0xmaXhlZCB3ID0gdi0+Y2xpcC53OwotICAgIGlmICh2LT5jbGlwLnggPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX0w7Ci0gICAgaWYgKHYtPmNsaXAueCA+ICB3KSAgIGNsaXAgfD0gdmVydGV4X3Q6OkNMSVBfUjsKLSAgICBpZiAodi0+Y2xpcC55IDwgLXcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9COwotICAgIGlmICh2LT5jbGlwLnkgPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX1Q7Ci0gICAgaWYgKHYtPmNsaXAueiA8IC13KSAgIGNsaXAgfD0gdmVydGV4X3Q6OkNMSVBfTjsKLSAgICBpZiAodi0+Y2xpcC56ID4gIHcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9GOwotCi0gICAgdi0+ZmxhZ3MgfD0gY2xpcDsKLSAgICBjLT5hcnJheXMuY3VsbCAmPSBjbGlwOwotCi0gICAgaWYgKGdnbF9saWtlbHkoIWNsaXApKSB7Ci0gICAgICAgIC8vIGlmIHRoZSB2ZXJ0ZXggaXMgY2xpcHBlZCwgd2UgZG9uJ3QgZG8gdGhlIHBlcnNwZWN0aXZlCi0gICAgICAgIC8vIGRpdmlkZSwgc2luY2Ugd2UgZG9uJ3QgbmVlZCBpdHMgd2luZG93IGNvb3JkaW5hdGVzLgotICAgICAgICBwZXJzcGVjdGl2ZShjLCB2LCBlbmFibGVzKTsKLSAgICB9Ci19Ci0KLS8vIGZydXN0dW0gY2xpcHBpbmcsIHVzZXIgY2xpcHBpbmcgYW5kIFctZGl2aWRlCi1zdGF0aWMgaW5saW5lCi12b2lkIGNsaXBBbGxQZXJzcGVjdGl2ZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2LCB1aW50MzJfdCBlbmFibGVzKQotewotICAgIC8vIGNvbXB1dGUgZXllIGNvb3JkaW5hdGVzCi0gICAgYy0+YXJyYXlzLm12X3RyYW5zZm9ybSgKLSAgICAgICAgICAgICZjLT50cmFuc2Zvcm1zLm1vZGVsdmlldy50cmFuc2Zvcm0sICZ2LT5leWUsICZ2LT5vYmopOwotICAgIHYtPmZsYWdzIHw9IHZlcnRleF90OjpFWUU7Ci0KLSAgICAvLyBjbGlwIHRoaXMgdmVydGV4IGFnYWluc3QgZWFjaCB1c2VyIGNsaXAgcGxhbmUKLSAgICB1aW50MzJfdCBjbGlwID0gMDsKLSAgICBpbnQgcGxhbmVzID0gYy0+Y2xpcFBsYW5lcy5lbmFibGU7Ci0gICAgd2hpbGUgKHBsYW5lcykgewotICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gZ2dsQ2x6KHBsYW5lcyk7Ci0gICAgICAgIHBsYW5lcyAmPSB+KDE8PGkpOwotICAgICAgICAvLyBYWFg6IHdlIHNob3VsZCBoYXZlIGEgc3BlY2lhbCBkb3QoKSBmb3IgMiwzLDQgY29vcmRzIHZlcnRpY2VzCi0gICAgICAgIEdMZml4ZWQgZCA9IGRvdDQoYy0+Y2xpcFBsYW5lcy5wbGFuZVtpXS5lcXVhdGlvbi52LCB2LT5leWUudik7Ci0gICAgICAgIGlmIChkIDwgMCkgewotICAgICAgICAgICAgY2xpcCB8PSAweDEwMDw8aTsKLSAgICAgICAgfQotICAgIH0KLSAgICB2LT5mbGFncyB8PSBjbGlwOwotCi0gICAgY2xpcEZydXN0dW1QZXJzcGVjdGl2ZShjLCB2LCBlbmFibGVzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIG9nbGVzX3ZlcnRleF9wcm9qZWN0KG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKLSAgICBwZXJzcGVjdGl2ZShjLCB2LCBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXMpOwotfQotCi12b2lkIG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTJEKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCi17Ci0gICAgLy8gaGVyZSB3ZSBhc3N1bWUgdz0xLjAgYW5kIHRoZSB2aWV3cG9ydCB0cmFuc2Zvcm1hdGlvbgotICAgIC8vIGhhcyBiZWVuIGFwcGxpZWQgYWxyZWFkeS4KLSAgICBjLT5hcnJheXMuY3VsbCA9IDA7Ci0gICAgdi0+d2luZG93LnggPSBUUklfRlJPTV9GSVhFRCh2LT5jbGlwLngpOwotICAgIHYtPndpbmRvdy55ID0gVFJJX0ZST01fRklYRUQodi0+Y2xpcC55KTsKLSAgICB2LT53aW5kb3cueiA9IHYtPmNsaXAuejsKLSAgICB2LT53aW5kb3cudyA9IHYtPmNsaXAudyA8PCAxMjsKLX0KLQotdm9pZCBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUzRFoob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikgewotICAgIGNsaXBGcnVzdHVtUGVyc3BlY3RpdmUoYywgdiwgR0dMX0VOQUJMRV9ERVBUSF9URVNUKTsKLX0KLXZvaWQgb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlM0Qob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikgewotICAgIGNsaXBGcnVzdHVtUGVyc3BlY3RpdmUoYywgdiwgMCk7Ci19Ci12b2lkIG9nbGVzX3ZlcnRleF9jbGlwQWxsUGVyc3BlY3RpdmUzRFoob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikgewotICAgIGNsaXBBbGxQZXJzcGVjdGl2ZShjLCB2LCBHR0xfRU5BQkxFX0RFUFRIX1RFU1QpOwotfQotdm9pZCBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0Qob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikgewotICAgIGNsaXBBbGxQZXJzcGVjdGl2ZShjLCB2LCAwKTsKLX0KLQotc3RhdGljIHZvaWQgY2xpcFBsYW5leChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQqIGVxdSwgb2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGNvbnN0IGludCBwID0gcGxhbmUgLSBHTF9DTElQX1BMQU5FMDsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KHVpbnQzMl90KHApID4gKEdMX0NMSVBfUExBTkU1IC0gR0xfQ0xJUF9QTEFORTApKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmVjNF90JiBlcXVhdGlvbiA9IGMtPmNsaXBQbGFuZXMucGxhbmVbcF0uZXF1YXRpb247Ci0gICAgbWVtY3B5KGVxdWF0aW9uLnYsIGVxdSwgc2l6ZW9mKHZlYzRfdCkpOwotCi0gICAgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtKGMsIHRyYW5zZm9ybV9zdGF0ZV90OjpNVklUKTsKLSAgICB0cmFuc2Zvcm1fdCYgbXZpdCA9IGMtPnRyYW5zZm9ybXMubXZpdDQ7Ci0gICAgbXZpdC5wb2ludDQoJm12aXQsICZlcXVhdGlvbiwgJmVxdWF0aW9uKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLQotdm9pZCBnbENvbG9yNGYoR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+Y3VycmVudC5jb2xvci5yICAgICAgID0gZ2dsRmxvYXRUb0ZpeGVkKHIpOwotICAgIGMtPmN1cnJlbnRDb2xvckNsYW1wZWQuciA9IGdnbENsYW1weChjLT5jdXJyZW50LmNvbG9yLnIpOwotICAgIGMtPmN1cnJlbnQuY29sb3IuZyAgICAgICA9IGdnbEZsb2F0VG9GaXhlZChnKTsKLSAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLmcgPSBnZ2xDbGFtcHgoYy0+Y3VycmVudC5jb2xvci5nKTsKLSAgICBjLT5jdXJyZW50LmNvbG9yLmIgICAgICAgPSBnZ2xGbG9hdFRvRml4ZWQoYik7Ci0gICAgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC5iID0gZ2dsQ2xhbXB4KGMtPmN1cnJlbnQuY29sb3IuYik7Ci0gICAgYy0+Y3VycmVudC5jb2xvci5hICAgICAgID0gZ2dsRmxvYXRUb0ZpeGVkKGEpOwotICAgIGMtPmN1cnJlbnRDb2xvckNsYW1wZWQuYSA9IGdnbENsYW1weChjLT5jdXJyZW50LmNvbG9yLmEpOwotfQotCi12b2lkIGdsQ29sb3I0eChHTGZpeGVkIHIsIEdMZml4ZWQgZywgR0xmaXhlZCBiLCBHTGZpeGVkIGEpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5jdXJyZW50LmNvbG9yLnIgPSByOwotICAgIGMtPmN1cnJlbnQuY29sb3IuZyA9IGc7Ci0gICAgYy0+Y3VycmVudC5jb2xvci5iID0gYjsKLSAgICBjLT5jdXJyZW50LmNvbG9yLmEgPSBhOwotICAgIGMtPmN1cnJlbnRDb2xvckNsYW1wZWQuciA9IGdnbENsYW1weChyKTsKLSAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLmcgPSBnZ2xDbGFtcHgoZyk7Ci0gICAgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC5iID0gZ2dsQ2xhbXB4KGIpOwotICAgIGMtPmN1cnJlbnRDb2xvckNsYW1wZWQuYSA9IGdnbENsYW1weChhKTsKLX0KLQotdm9pZCBnbE5vcm1hbDNmKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5jdXJyZW50Tm9ybWFsLnggPSBnZ2xGbG9hdFRvRml4ZWQoeCk7Ci0gICAgYy0+Y3VycmVudE5vcm1hbC55ID0gZ2dsRmxvYXRUb0ZpeGVkKHkpOwotICAgIGMtPmN1cnJlbnROb3JtYWwueiA9IGdnbEZsb2F0VG9GaXhlZCh6KTsKLX0KLQotdm9pZCBnbE5vcm1hbDN4KEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5jdXJyZW50Tm9ybWFsLnggPSB4OwotICAgIGMtPmN1cnJlbnROb3JtYWwueSA9IHk7Ci0gICAgYy0+Y3VycmVudE5vcm1hbC56ID0gejsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIGdsQ2xpcFBsYW5lZihHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQqIGVxdSkKLXsKLSAgICBjb25zdCBHTGZpeGVkIGVxdXhbNF0gPSB7Ci0gICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoZXF1WzBdKSwKLSAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChlcXVbMV0pLAotICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGVxdVsyXSksCi0gICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoZXF1WzNdKQotICAgIH07Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjbGlwUGxhbmV4KHBsYW5lLCBlcXV4LCBjKTsKLX0KLQotdm9pZCBnbENsaXBQbGFuZXgoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkKiBlcXUpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjbGlwUGxhbmV4KHBsYW5lLCBlcXUsIGMpOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguaCBiL29wZW5nbC9saWJhZ2wvdmVydGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZTYyMTMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvdmVydGV4LmgKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfVkVSVEVYX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19WRVJURVhfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIGdsIHsKLXN0cnVjdCB2ZXJ0ZXhfdDsKLXN0cnVjdCBvZ2xlc19jb250ZXh0X3Q7Ci19OwotCi12b2lkIG9nbGVzX2luaXRfdmVydGV4KG9nbGVzX2NvbnRleHRfdCogYyk7Ci12b2lkIG9nbGVzX3VuaW5pdF92ZXJ0ZXgob2dsZXNfY29udGV4dF90KiBjKTsKLQotdm9pZCBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUyRChvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopOwotCi12b2lkIG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEKG9nbGVzX2NvbnRleHRfdCosIHZlcnRleF90Kik7Ci12b2lkIG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEWihvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopOwotdm9pZCBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0Qob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqKTsKLXZvaWQgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEWihvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopOwotCi0KLXZvaWQgb2dsZXNfdmVydGV4X3Byb2plY3Qob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCopOwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19WRVJURVhfSAotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9BbmRyb2lkLm1rIGIvb3BlbmdsL2xpYnMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiYzY0ZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJ1aWxkIE1FVEEgRUdMIGxpYnJhcnkKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IAkgICAgICAgXAotCUVHTC9lZ2xfdGxzLmNwcCAgICAgICAgXAotCUVHTC9lZ2xfY2FjaGUuY3BwICAgICAgXAotCUVHTC9lZ2xfZGlzcGxheS5jcHAgICAgXAotCUVHTC9lZ2xfb2JqZWN0LmNwcCAgICAgXAotCUVHTC9lZ2wuY3BwIAkgICAgICAgXAotCUVHTC9lZ2xBcGkuY3BwIAkgICAgICAgXAotCUVHTC90cmFjZS5jcHAgICAgICAgICAgICAgIFwKLQlFR0wvZ2V0UHJvY0FkZHJlc3MuY3BwLmFybSBcCi0JRUdML0xvYWRlci5jcHAgCSAgICAgICBcCi0jCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkdMRVNfdHJhY2UKLUxPQ0FMX0xETElCUyA6PSAtbHB0aHJlYWQgLWxkbAotTE9DQUxfTU9EVUxFOj0gbGliRUdMCi1MT0NBTF9MREZMQUdTICs9IC1XbCwtLWV4Y2x1ZGUtbGlicz1BTEwKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLSMgQmlvbmljJ3MgcHJpdmF0ZSBUTFMgaGVhZGVyIHJlbGllcyBvbiB0aGUgQVJDSF9BUk1fSEFWRV9UTFNfUkVHSVNURVIgdG8KLSMgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBUTFMgY29kZXBhdGgKLWlmZXEgKCQoQVJDSF9BUk1fSEFWRV9UTFNfUkVHSVNURVIpLHRydWUpCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9BUk1fVExTX1JFR0lTVEVSCi1lbmRpZgotIyB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgcHJpdmF0ZSBCaW9uaWMgaGVhZGVyIDxiaW9uaWNfdGxzLmg+Ci1MT0NBTF9DX0lOQ0xVREVTICs9IGJpb25pYy9saWJjL3ByaXZhdGUKLQotTE9DQUxfQ0ZMQUdTICs9IC1ETE9HX1RBRz1cImxpYkVHTFwiCi1MT0NBTF9DRkxBR1MgKz0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgotTE9DQUxfQ0ZMQUdTICs9IC1ERUdMX1RSQUNFPTEKLQotaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLG1zbTdrKQotTE9DQUxfQ0ZMQUdTICs9IC1EQURSRU5PMTMwPTEKLWVuZGlmCi0KLWlmZXEgKCQoQVJDSF9BUk1fSEFWRV9UTFNfUkVHSVNURVIpLHRydWUpCi0gIExPQ0FMX0NGTEFHUyArPSAtREhBVkVfQVJNX1RMU19SRUdJU1RFUgotZW5kaWYKLQotaWZuZXEgKCQoTUFYX0VHTF9DQUNIRV9FTlRSWV9TSVpFKSwpCi0gIExPQ0FMX0NGTEFHUyArPSAtRE1BWF9FR0xfQ0FDSEVfRU5UUllfU0laRT0kKE1BWF9FR0xfQ0FDSEVfRU5UUllfU0laRSkKLWVuZGlmCi0KLWlmbmVxICgkKE1BWF9FR0xfQ0FDSEVfU0laRSksKQotICBMT0NBTF9DRkxBR1MgKz0gLURNQVhfRUdMX0NBQ0hFX1NJWkU9JChNQVhfRUdMX0NBQ0hFX1NJWkUpCi1lbmRpZgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi1pbnN0YWxsZWRfbGliRUdMIDo9ICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkKLQotIyBPcGVuR0wgZHJpdmVycyBjb25maWcgZmlsZQotaWZuZXEgKCQoQk9BUkRfRUdMX0NGRyksKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBlZ2wuY2ZnCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUKS9saWIvZWdsCi1MT0NBTF9TUkNfRklMRVMgOj0gLi4vLi4vLi4vLi4vJChCT0FSRF9FR0xfQ0ZHKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotCi0jIG1ha2Ugc3VyZSB3ZSBkZXBlbmQgb24gZWdsLmNmZywgc28gaXQgZ2V0cyBpbnN0YWxsZWQKLSQoaW5zdGFsbGVkX2xpYkVHTCk6IHwgZWdsLmNmZwotCi1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJ1aWxkIHRoZSB3cmFwcGVyIE9wZW5HTCBFUyAxLnggbGlicmFyeQotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gCQlcCi0JR0xFU19DTS9nbC5jcHAuYXJtIAlcCi0jCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3V0aWxzIGxpYkVHTAotTE9DQUxfTERMSUJTIDo9IC1scHRocmVhZCAtbGRsCi1MT0NBTF9NT0RVTEU6PSBsaWJHTEVTdjFfQ00KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotIyB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgcHJpdmF0ZSBCaW9uaWMgaGVhZGVyIDxiaW9uaWNfdGxzLmg+Ci1pZmVxICgkKEFSQ0hfQVJNX0hBVkVfVExTX1JFR0lTVEVSKSx0cnVlKQotICAgIExPQ0FMX0NGTEFHUyArPSAtREhBVkVfQVJNX1RMU19SRUdJU1RFUgotZW5kaWYKLUxPQ0FMX0NfSU5DTFVERVMgKz0gYmlvbmljL2xpYmMvcHJpdmF0ZQotCi1MT0NBTF9DRkxBR1MgKz0gLURMT0dfVEFHPVwibGliR0xFU3YxXCIKLUxPQ0FMX0NGTEFHUyArPSAtREdMX0dMRVhUX1BST1RPVFlQRVMgLURFR0xfRUdMRVhUX1BST1RPVFlQRVMKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCi0KLWlmZXEgKCQoQVJDSF9BUk1fSEFWRV9UTFNfUkVHSVNURVIpLHRydWUpCi0gIExPQ0FMX0NGTEFHUyArPSAtREhBVkVfQVJNX1RMU19SRUdJU1RFUgotZW5kaWYKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQnVpbGQgdGhlIHdyYXBwZXIgT3BlbkdMIEVTIDIueCBsaWJyYXJ5Ci0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAJCVwKLQlHTEVTMi9nbDIuY3BwLmFybSAJXAotIwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJFR0wKLUxPQ0FMX0xETElCUyA6PSAtbHB0aHJlYWQgLWxkbAotTE9DQUxfTU9EVUxFOj0gbGliR0xFU3YyCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLSMgd2UgbmVlZCB0byBhY2Nlc3MgdGhlIHByaXZhdGUgQmlvbmljIGhlYWRlciA8YmlvbmljX3Rscy5oPgotaWZlcSAoJChBUkNIX0FSTV9IQVZFX1RMU19SRUdJU1RFUiksdHJ1ZSkKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURIQVZFX0FSTV9UTFNfUkVHSVNURVIKLWVuZGlmCi1MT0NBTF9DX0lOQ0xVREVTICs9IGJpb25pYy9saWJjL3ByaXZhdGUKLQotTE9DQUxfQ0ZMQUdTICs9IC1ETE9HX1RBRz1cImxpYkdMRVN2MlwiCi1MT0NBTF9DRkxBR1MgKz0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgotCi1pZmVxICgkKEFSQ0hfQVJNX0hBVkVfVExTX1JFR0lTVEVSKSx0cnVlKQotICBMT0NBTF9DRkxBR1MgKz0gLURIQVZFX0FSTV9UTFNfUkVHSVNURVIKLWVuZGlmCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCdWlsZCB0aGUgRVRDMSBob3N0IHN0YXRpYyBsaWJyYXJ5Ci0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAJCVwKLQlFVEMxL2V0YzEuY3BwIAlcCi0jCi0KLUxPQ0FMX0xETElCUyA6PSAtbHB0aHJlYWQgLWxkbAotTE9DQUxfTU9EVUxFOj0gbGliRVRDMQotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCdWlsZCB0aGUgRVRDMSBkZXZpY2UgbGlicmFyeQotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gCQlcCi0JRVRDMS9ldGMxLmNwcCAJXAotIwotCi1MT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKLUxPQ0FMX01PRFVMRTo9IGxpYkVUQzEKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvTG9hZGVyLmNwcCBiL29wZW5nbC9saWJzL0VHTC9Mb2FkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjEwMTZjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0VHTC9Mb2FkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qIAotICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotCi0jaW5jbHVkZSAiZWdsZGVmcy5oIgotI2luY2x1ZGUgImdsZXN0cmFjZS5oIgotI2luY2x1ZGUgImhvb2tzLmgiCi0jaW5jbHVkZSAiTG9hZGVyLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vKgotICogRUdMIGRyaXZlcnMgYXJlIGNhbGxlZAotICogCi0gKiAvc3lzdGVtL2xpYi9lZ2wvbGlie1tFR0x8R0xFU3YxX0NNfEdMRVN2Ml0gfCBHTEVTfV8kVEFHLnNvIAotICogCi0gKi8KLQotQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKCBMb2FkZXIgKQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjaGVjayB3aGV0aGVyIHdlIHJ1biBpbnNpZGUgdGhlIGVtdWxhdG9yLAotICogYW5kIGlmIHRoaXMgaXMgdGhlIGNhc2Ugd2hldGhlciBHTEVTIEdQVSBlbXVsYXRpb24gaXMgc3VwcG9ydGVkLgotICoKLSAqIFJldHVybmVkIHZhbHVlcyBhcmU6Ci0gKiAgLTEgICAtPiBub3QgcnVubmluZyBpbnNpZGUgdGhlIGVtdWxhdG9yCi0gKiAgIDAgICAtPiBydW5uaW5nIGluc2lkZSB0aGUgZW11bGF0b3IsIGJ1dCBHUFUgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQKLSAqICAgMSAgIC0+IHJ1bm5pbmcgaW5zaWRlIHRoZSBlbXVsYXRvciwgR1BVIGVtdWxhdGlvbiBpcyBzdXBwb3J0ZWQKLSAqICAgICAgICAgIHRocm91Z2ggdGhlICJlbXVsYXRpb24iIGNvbmZpZy4KLSAqLwotc3RhdGljIGludAotY2hlY2tHbGVzRW11bGF0aW9uU3RhdHVzKHZvaWQpCi17Ci0gICAgLyogV2UncmUgZ29pbmcgdG8gY2hlY2sgZm9yIHRoZSBmb2xsb3dpbmcga2VybmVsIHBhcmFtZXRlcnM6Ci0gICAgICoKLSAgICAgKiAgICBxZW11PTEgICAgICAgICAgICAgICAgICAgICAgLT4gdGVsbHMgdXMgdGhhdCB3ZSBydW4gaW5zaWRlIHRoZSBlbXVsYXRvcgotICAgICAqICAgIGFuZHJvaWQucWVtdS5nbGVzPTxudW1iZXI+ICAtPiB0ZWxscyB1cyB0aGUgR0xFUyBHUFUgZW11bGF0aW9uIHN0YXR1cwotICAgICAqCi0gICAgICogTm90ZSB0aGF0IHdlIHdpbGwgcmV0dXJuIDxudW1iZXI+IGlmIHdlIGZpbmQgaXQuIFRoaXMgbGV0IHVzIHN1cHBvcnQKLSAgICAgKiBtb3JlIGFkZGl0aW9ubmFsIGVtdWxhdGlvbiBtb2RlcyBpbiB0aGUgZnV0dXJlLgotICAgICAqLwotICAgIGNoYXIgIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpbnQgICByZXN1bHQgPSAtMTsKLQotICAgIC8qIEZpcnN0LCBjaGVjayBmb3IgcWVtdT0xICovCi0gICAgcHJvcGVydHlfZ2V0KCJyby5rZXJuZWwucWVtdSIscHJvcCwiMCIpOwotICAgIGlmIChhdG9pKHByb3ApICE9IDEpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIFdlIGFyZSBpbiB0aGUgZW11bGF0b3IsIGdldCBHUFUgc3RhdHVzIHZhbHVlICovCi0gICAgcHJvcGVydHlfZ2V0KCJyby5rZXJuZWwucWVtdS5nbGVzIixwcm9wLCIwIik7Ci0gICAgcmV0dXJuIGF0b2kocHJvcCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTG9hZGVyOjpkcml2ZXJfdDo6ZHJpdmVyX3Qodm9pZCogZ2xlcykgCi17Ci0gICAgZHNvWzBdID0gZ2xlczsKLSAgICBmb3IgKHNpemVfdCBpPTEgOyBpPE5FTEVNKGRzbykgOyBpKyspCi0gICAgICAgIGRzb1tpXSA9IDA7Ci19Ci0KLUxvYWRlcjo6ZHJpdmVyX3Q6On5kcml2ZXJfdCgpIAotewotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8TkVMRU0oZHNvKSA7IGkrKykgewotICAgICAgICBpZiAoZHNvW2ldKSB7Ci0gICAgICAgICAgICBkbGNsb3NlKGRzb1tpXSk7Ci0gICAgICAgICAgICBkc29baV0gPSAwOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBMb2FkZXI6OmRyaXZlcl90OjpzZXQodm9pZCogaG5kLCBpbnQzMl90IGFwaSkKLXsKLSAgICBzd2l0Y2ggKGFwaSkgewotICAgICAgICBjYXNlIEVHTDoKLSAgICAgICAgICAgIGRzb1swXSA9IGhuZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdMRVN2MV9DTToKLSAgICAgICAgICAgIGRzb1sxXSA9IGhuZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdMRVN2MjoKLSAgICAgICAgICAgIGRzb1syXSA9IGhuZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxvYWRlcjo6TG9hZGVyKCkKLXsKLSAgICBjaGFyIGxpbmVbMjU2XTsKLSAgICBjaGFyIHRhZ1syNTZdOwotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBHTEVTIGVtdWxhdGlvbiAqLwotICAgIGlmIChjaGVja0dsZXNFbXVsYXRpb25TdGF0dXMoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dEKCJFbXVsYXRvciB3aXRob3V0IEdQVSBzdXBwb3J0IGRldGVjdGVkLiAiCi0gICAgICAgICAgICAgICJGYWxsYmFjayB0byBzb2Z0d2FyZSByZW5kZXJlci4iKTsKLSAgICAgICAgbURyaXZlclRhZy5zZXRUbygiYW5kcm9pZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogT3RoZXJ3aXNlLCB1c2UgZWdsLmNmZyAqLwotICAgIEZJTEUqIGNmZyA9IGZvcGVuKCIvc3lzdGVtL2xpYi9lZ2wvZWdsLmNmZyIsICJyIik7Ci0gICAgaWYgKGNmZyA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIGRlZmF1bHQgY29uZmlnCi0gICAgICAgIEFMT0dEKCJlZ2wuY2ZnIG5vdCBmb3VuZCwgdXNpbmcgZGVmYXVsdCBjb25maWciKTsKLSAgICAgICAgbURyaXZlclRhZy5zZXRUbygiYW5kcm9pZCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdoaWxlIChmZ2V0cyhsaW5lLCAyNTYsIGNmZykpIHsKLSAgICAgICAgICAgIGludCBkcHksIGltcGw7Ci0gICAgICAgICAgICBpZiAoc3NjYW5mKGxpbmUsICIldSAldSAlcyIsICZkcHksICZpbXBsLCB0YWcpID09IDMpIHsKLSAgICAgICAgICAgICAgICAvL0FMT0dEKCI+Pj4gJXUgJXUgJXMiLCBkcHksIGltcGwsIHRhZyk7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugb25seSBsb2FkIHRoZSBoL3cgYWNjZWxlcmF0ZWQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgICBpZiAodGFnICE9IFN0cmluZzgoImFuZHJvaWQiKSkgewotICAgICAgICAgICAgICAgICAgICBtRHJpdmVyVGFnID0gdGFnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmY2xvc2UoY2ZnKTsKLSAgICB9Ci19Ci0KLUxvYWRlcjo6fkxvYWRlcigpCi17Ci0gICAgR0xUcmFjZV9zdG9wKCk7Ci19Ci0KLXZvaWQqIExvYWRlcjo6b3BlbihlZ2xfY29ubmVjdGlvbl90KiBjbngpCi17Ci0gICAgdm9pZCogZHNvOwotICAgIGRyaXZlcl90KiBobmQgPSAwOwotICAgIAotICAgIGNoYXIgY29uc3QqIHRhZyA9IG1Ecml2ZXJUYWcuc3RyaW5nKCk7Ci0gICAgaWYgKHRhZykgewotICAgICAgICBkc28gPSBsb2FkX2RyaXZlcigiR0xFUyIsIHRhZywgY254LCBFR0wgfCBHTEVTdjFfQ00gfCBHTEVTdjIpOwotICAgICAgICBpZiAoZHNvKSB7Ci0gICAgICAgICAgICBobmQgPSBuZXcgZHJpdmVyX3QoZHNvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEFsd2F5cyBsb2FkIEVHTCBmaXJzdAotICAgICAgICAgICAgZHNvID0gbG9hZF9kcml2ZXIoIkVHTCIsIHRhZywgY254LCBFR0wpOwotICAgICAgICAgICAgaWYgKGRzbykgewotICAgICAgICAgICAgICAgIGhuZCA9IG5ldyBkcml2ZXJfdChkc28pOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBtb3JlIGF1dG9tYXRlZAotICAgICAgICAgICAgICAgIGhuZC0+c2V0KCBsb2FkX2RyaXZlcigiR0xFU3YxX0NNIiwgdGFnLCBjbngsIEdMRVN2MV9DTSksIEdMRVN2MV9DTSApOwotICAgICAgICAgICAgICAgIGhuZC0+c2V0KCBsb2FkX2RyaXZlcigiR0xFU3YyIiwgICAgdGFnLCBjbngsIEdMRVN2MiksICAgIEdMRVN2MiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgTE9HX0ZBVEFMX0lGKCFpbmRleCAmJiAhaG5kLAotICAgICAgICAgICAgImNvdWxkbid0IGZpbmQgdGhlIGRlZmF1bHQgT3BlbkdMIEVTIGltcGxlbWVudGF0aW9uICIKLSAgICAgICAgICAgICJmb3IgZGVmYXVsdCBkaXNwbGF5Iik7Ci0gICAgCi0gICAgcmV0dXJuICh2b2lkKilobmQ7Ci19Ci0KLXN0YXR1c190IExvYWRlcjo6Y2xvc2Uodm9pZCogZHJpdmVyKQotewotICAgIGRyaXZlcl90KiBobmQgPSAoZHJpdmVyX3QqKWRyaXZlcjsKLSAgICBkZWxldGUgaG5kOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBMb2FkZXI6OmluaXRfYXBpKHZvaWQqIGRzbywgCi0gICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCAqIGFwaSwgCi0gICAgICAgIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUqIGN1cnIsIAotICAgICAgICBnZXRQcm9jQWRkcmVzc1R5cGUgZ2V0UHJvY0FkZHJlc3MpIAotewotICAgIGNvbnN0IHNzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIHNjcmFwW1NJWkVdOwotICAgIHdoaWxlICgqYXBpKSB7Ci0gICAgICAgIGNoYXIgY29uc3QgKiBuYW1lID0gKmFwaTsKLSAgICAgICAgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBmID0gCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlkbHN5bShkc28sIG5hbWUpOwotICAgICAgICBpZiAoZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBjb3VsZG4ndCBmaW5kIHRoZSBlbnRyeS1wb2ludCwgdXNlIGVnbEdldFByb2NBZGRyZXNzKCkKLSAgICAgICAgICAgIGYgPSBnZXRQcm9jQWRkcmVzcyhuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBUcnkgd2l0aG91dCB0aGUgT0VTIHBvc3RmaXgKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBzc2l6ZV90KHN0cmxlbihuYW1lKSkgLSAzOwotICAgICAgICAgICAgaWYgKChpbmRleD4wICYmIChpbmRleDxTSVpFLTEpKSAmJiAoIXN0cmNtcChuYW1lK2luZGV4LCAiT0VTIikpKSB7Ci0gICAgICAgICAgICAgICAgc3RybmNweShzY3JhcCwgbmFtZSwgaW5kZXgpOwotICAgICAgICAgICAgICAgIHNjcmFwW2luZGV4XSA9IDA7Ci0gICAgICAgICAgICAgICAgZiA9IChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWRsc3ltKGRzbywgc2NyYXApOwotICAgICAgICAgICAgICAgIC8vQUxPR0RfSUYoZiwgImZvdW5kIDwlcz4gaW5zdGVhZCIsIHNjcmFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBUcnkgd2l0aCB0aGUgT0VTIHBvc3RmaXgKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBzc2l6ZV90KHN0cmxlbihuYW1lKSkgLSAzOwotICAgICAgICAgICAgaWYgKGluZGV4PjAgJiYgc3RyY21wKG5hbWUraW5kZXgsICJPRVMiKSkgewotICAgICAgICAgICAgICAgIHNucHJpbnRmKHNjcmFwLCBTSVpFLCAiJXNPRVMiLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBmID0gKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZGxzeW0oZHNvLCBzY3JhcCk7Ci0gICAgICAgICAgICAgICAgLy9BTE9HRF9JRihmLCAiZm91bmQgPCVzPiBpbnN0ZWFkIiwgc2NyYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vQUxPR0QoIiVzIiwgbmFtZSk7Ci0gICAgICAgICAgICBmID0gKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xfdW5pbXBsZW1lbnRlZDsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEdMX0VYVF9kZWJ1Z19sYWJlbCBpcyBzcGVjaWFsLCB3ZSBhbHdheXMgcmVwb3J0IGl0IGFzCi0gICAgICAgICAgICAgKiBzdXBwb3J0ZWQsIGl0J3MgaGFuZGxlZCBieSBHTEVTX3RyYWNlLiBJZiBHTEVTX3RyYWNlIGlzIG5vdAotICAgICAgICAgICAgICogZW5hYmxlZCwgdGhlbiB0aGVzZSBhcmUgbm8tb3BzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiZ2xJbnNlcnRFdmVudE1hcmtlckVYVCIpKSB7Ci0gICAgICAgICAgICAgICAgZiA9IChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsX25vb3A7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImdsUHVzaEdyb3VwTWFya2VyRVhUIikpIHsKLSAgICAgICAgICAgICAgICBmID0gKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xfbm9vcDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZ2xQb3BHcm91cE1hcmtlckVYVCIpKSB7Ci0gICAgICAgICAgICAgICAgZiA9IChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsX25vb3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKmN1cnIrKyA9IGY7Ci0gICAgICAgIGFwaSsrOwotICAgIH0KLX0KLQotdm9pZCAqTG9hZGVyOjpsb2FkX2RyaXZlcihjb25zdCBjaGFyKiBraW5kLCBjb25zdCBjaGFyICp0YWcsCi0gICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNueCwgdWludDMyX3QgbWFzaykKLXsKLSAgICBjaGFyIGRyaXZlcl9hYnNvbHV0ZV9wYXRoW1BBVEhfTUFYXTsKLSAgICBjb25zdCBjaGFyKiBjb25zdCBzZWFyY2gxID0gIi92ZW5kb3IvbGliL2VnbC9saWIlc18lcy5zbyI7Ci0gICAgY29uc3QgY2hhciogY29uc3Qgc2VhcmNoMiA9ICIvc3lzdGVtL2xpYi9lZ2wvbGliJXNfJXMuc28iOwotCi0gICAgc25wcmludGYoZHJpdmVyX2Fic29sdXRlX3BhdGgsIFBBVEhfTUFYLCBzZWFyY2gxLCBraW5kLCB0YWcpOwotICAgIGlmIChhY2Nlc3MoZHJpdmVyX2Fic29sdXRlX3BhdGgsIFJfT0spKSB7Ci0gICAgICAgIHNucHJpbnRmKGRyaXZlcl9hYnNvbHV0ZV9wYXRoLCBQQVRIX01BWCwgc2VhcmNoMiwga2luZCwgdGFnKTsKLSAgICAgICAgaWYgKGFjY2Vzcyhkcml2ZXJfYWJzb2x1dGVfcGF0aCwgUl9PSykpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaGFwcGVucyBvZnRlbiwgd2UgZG9uJ3Qgd2FudCB0byBsb2cgYW4gZXJyb3IKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCogZHNvID0gZGxvcGVuKGRyaXZlcl9hYnNvbHV0ZV9wYXRoLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOwotICAgIGlmIChkc28gPT0gMCkgewotICAgICAgICBjb25zdCBjaGFyKiBlcnIgPSBkbGVycm9yKCk7Ci0gICAgICAgIEFMT0dFKCJsb2FkX2RyaXZlciglcyk6ICVzIiwgZHJpdmVyX2Fic29sdXRlX3BhdGgsIGVycj9lcnI6InVua25vd24iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQUxPR0QoImxvYWRlZCAlcyIsIGRyaXZlcl9hYnNvbHV0ZV9wYXRoKTsKLQotICAgIGlmIChtYXNrICYgRUdMKSB7Ci0gICAgICAgIGdldFByb2NBZGRyZXNzID0gKGdldFByb2NBZGRyZXNzVHlwZSlkbHN5bShkc28sICJlZ2xHZXRQcm9jQWRkcmVzcyIpOwotCi0gICAgICAgIEFMT0dFX0lGKCFnZXRQcm9jQWRkcmVzcywgCi0gICAgICAgICAgICAgICAgImNhbid0IGZpbmQgZWdsR2V0UHJvY0FkZHJlc3MoKSBpbiAlcyIsIGRyaXZlcl9hYnNvbHV0ZV9wYXRoKTsKLQotICAgICAgICBlZ2xfdCogZWdsID0gJmNueC0+ZWdsOwotICAgICAgICBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKiBjdXJyID0KLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKillZ2w7Ci0gICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCAqIGFwaSA9IGVnbF9uYW1lczsKLSAgICAgICAgd2hpbGUgKCphcGkpIHsKLSAgICAgICAgICAgIGNoYXIgY29uc3QgKiBuYW1lID0gKmFwaTsKLSAgICAgICAgICAgIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgZiA9IAotICAgICAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWRsc3ltKGRzbywgbmFtZSk7Ci0gICAgICAgICAgICBpZiAoZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLy8gY291bGRuJ3QgZmluZCB0aGUgZW50cnktcG9pbnQsIHVzZSBlZ2xHZXRQcm9jQWRkcmVzcygpCi0gICAgICAgICAgICAgICAgZiA9IGdldFByb2NBZGRyZXNzKG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChmID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKTA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgKmN1cnIrKyA9IGY7Ci0gICAgICAgICAgICBhcGkrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAobWFzayAmIEdMRVN2MV9DTSkgewotICAgICAgICBpbml0X2FwaShkc28sIGdsX25hbWVzLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUqKQotICAgICAgICAgICAgICAgICZjbngtPmhvb2tzW2VnbF9jb25uZWN0aW9uX3Q6OkdMRVN2MV9JTkRFWF0tPmdsLAotICAgICAgICAgICAgZ2V0UHJvY0FkZHJlc3MpOwotICAgIH0KLQotICAgIGlmIChtYXNrICYgR0xFU3YyKSB7Ci0gICAgICBpbml0X2FwaShkc28sIGdsX25hbWVzLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUqKQotICAgICAgICAgICAgICAgICZjbngtPmhvb2tzW2VnbF9jb25uZWN0aW9uX3Q6OkdMRVN2Ml9JTkRFWF0tPmdsLAotICAgICAgICAgICAgZ2V0UHJvY0FkZHJlc3MpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZHNvOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML0xvYWRlci5oIGIvb3BlbmdsL2xpYnMvRUdML0xvYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc3M2NiLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0VHTC9Mb2FkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qIAotICoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRUdMX0xPQURFUl9ICi0jZGVmaW5lIEFORFJPSURfRUdMX0xPQURFUl9ICi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGVnbF9jb25uZWN0aW9uX3Q7Ci0KLWNsYXNzIExvYWRlciA6IHB1YmxpYyBTaW5nbGV0b248TG9hZGVyPgotewotICAgIGZyaWVuZCBjbGFzcyBTaW5nbGV0b248TG9hZGVyPjsKLQotICAgIHR5cGVkZWYgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSAoKmdldFByb2NBZGRyZXNzVHlwZSkoCi0gICAgICAgICAgICBjb25zdCBjaGFyKik7Ci0gICAKLSAgICBlbnVtIHsKLSAgICAgICAgRUdMICAgICAgICAgPSAweDAxLAotICAgICAgICBHTEVTdjFfQ00gICA9IDB4MDIsCi0gICAgICAgIEdMRVN2MiAgICAgID0gMHgwNAotICAgIH07Ci0gICAgc3RydWN0IGRyaXZlcl90IHsKLSAgICAgICAgZHJpdmVyX3Qodm9pZCogZ2xlcyk7Ci0gICAgICAgIH5kcml2ZXJfdCgpOwotICAgICAgICBzdGF0dXNfdCBzZXQodm9pZCogaG5kLCBpbnQzMl90IGFwaSk7Ci0gICAgICAgIHZvaWQqIGRzb1szXTsKLSAgICB9OwotICAgIAotICAgIFN0cmluZzggbURyaXZlclRhZzsKLSAgICBnZXRQcm9jQWRkcmVzc1R5cGUgZ2V0UHJvY0FkZHJlc3M7Ci0gICAgCi1wdWJsaWM6Ci0gICAgfkxvYWRlcigpOwotICAgIAotICAgIHZvaWQqIG9wZW4oZWdsX2Nvbm5lY3Rpb25fdCogY254KTsKLSAgICBzdGF0dXNfdCBjbG9zZSh2b2lkKiBkcml2ZXIpOwotICAgIAotcHJpdmF0ZToKLSAgICBMb2FkZXIoKTsKLSAgICB2b2lkICpsb2FkX2RyaXZlcihjb25zdCBjaGFyKiBraW5kLCBjb25zdCBjaGFyICp0YWcsIGVnbF9jb25uZWN0aW9uX3QqIGNueCwgdWludDMyX3QgbWFzayk7Ci0KLSAgICBzdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQotICAgIHZvaWQgaW5pdF9hcGkodm9pZCogZHNvLCAKLSAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCAqIGFwaSwgCi0gICAgICAgICAgICBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKiBjdXJyLCAKLSAgICAgICAgICAgIGdldFByb2NBZGRyZXNzVHlwZSBnZXRQcm9jQWRkcmVzcyk7IAotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8qIEFORFJPSURfRUdMX0xPQURFUl9IICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcCBiL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWM1Y2UxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qIAotICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL21lbW9yeS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSAiZWdsZGVmcy5oIgotI2luY2x1ZGUgImVnbF9pbXBsLmgiCi0jaW5jbHVkZSAiZWdsX3Rscy5oIgotI2luY2x1ZGUgImdsZXN0cmFjZS5oIgotI2luY2x1ZGUgImhvb2tzLmgiCi0jaW5jbHVkZSAiTG9hZGVyLmgiCi0KLSNpbmNsdWRlICJlZ2xfZGlzcGxheS5oIgotI2luY2x1ZGUgImVnbF9vYmplY3QuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lZ2xfY29ubmVjdGlvbl90IGdFR0xJbXBsOwotZ2xfaG9va3NfdCBnSG9va3NbMl07Ci1nbF9ob29rc190IGdIb29rc05vQ29udGV4dDsKLXB0aHJlYWRfa2V5X3QgZ0dMV3JhcHBlcktleSA9IC0xOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBFR0xfVFJBQ0UKLQotRUdMQVBJIHB0aHJlYWRfa2V5X3QgZ0dMVHJhY2VLZXkgPSAtMTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgZ0VHTERlYnVnTGV2ZWw7Ci0KLXN0YXRpYyBpbnQgc0VHTFRyYWNlTGV2ZWw7Ci1zdGF0aWMgaW50IHNFR0xBcHBsaWNhdGlvblRyYWNlTGV2ZWw7Ci0KLWV4dGVybiBnbF9ob29rc190IGdIb29rc1RyYWNlOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0R2xUcmFjZVRocmVhZFNwZWNpZmljKGdsX2hvb2tzX3QgY29uc3QgKnZhbHVlKSB7Ci0gICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnR0xUcmFjZUtleSwgdmFsdWUpOwotfQotCi1nbF9ob29rc190IGNvbnN0KiBnZXRHTFRyYWNlVGhyZWFkU3BlY2lmaWMoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGdsX2hvb2tzX3QqPihwdGhyZWFkX2dldHNwZWNpZmljKGdHTFRyYWNlS2V5KSk7Ci19Ci0KLXZvaWQgaW5pdEVnbFRyYWNlTGV2ZWwoKSB7Ci0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgiZGVidWcuZWdsLnRyYWNlIiwgdmFsdWUsICIwIik7Ci0gICAgaW50IHByb3BlcnR5TGV2ZWwgPSBhdG9pKHZhbHVlKTsKLSAgICBpbnQgYXBwbGljYXRpb25MZXZlbCA9IHNFR0xBcHBsaWNhdGlvblRyYWNlTGV2ZWw7Ci0gICAgc0VHTFRyYWNlTGV2ZWwgPSBwcm9wZXJ0eUxldmVsID4gYXBwbGljYXRpb25MZXZlbCA/IHByb3BlcnR5TGV2ZWwgOiBhcHBsaWNhdGlvbkxldmVsOwotCi0gICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5lZ2wuZGVidWdfcHJvYyIsIHZhbHVlLCAiIik7Ci0gICAgaWYgKHN0cmxlbih2YWx1ZSkgPT0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbG9uZyBwaWQgPSBnZXRwaWQoKTsKLSAgICBjaGFyIHByb2NQYXRoWzEyOF0gPSB7fTsKLSAgICBzcHJpbnRmKHByb2NQYXRoLCAiL3Byb2MvJWxkL2NtZGxpbmUiLCBwaWQpOwotICAgIEZJTEUgKiBmaWxlID0gZm9wZW4ocHJvY1BhdGgsICJyIik7Ci0gICAgaWYgKGZpbGUpIHsKLSAgICAgICAgY2hhciBjbWRsaW5lWzI1Nl0gPSB7fTsKLSAgICAgICAgaWYgKGZnZXRzKGNtZGxpbmUsIHNpemVvZihjbWRsaW5lKSAtIDEsIGZpbGUpKSB7Ci0gICAgICAgICAgICBpZiAoIXN0cm5jbXAodmFsdWUsIGNtZGxpbmUsIHN0cmxlbih2YWx1ZSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0IEVHTCBkZWJ1ZyBpZiB0aGUgImRlYnVnLmVnbC5kZWJ1Z19wcm9jIiBwcm9wZXJ0eQotICAgICAgICAgICAgICAgIC8vIG1hdGNoZXMgdGhlIHByZWZpeCBvZiB0aGlzIGFwcGxpY2F0aW9uJ3MgY29tbWFuZCBsaW5lCi0gICAgICAgICAgICAgICAgZ0VHTERlYnVnTGV2ZWwgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZjbG9zZShmaWxlKTsKLSAgICB9Ci0KLSAgICBpZiAoZ0VHTERlYnVnTGV2ZWwgPiAwKSB7Ci0gICAgICAgIEdMVHJhY2Vfc3RhcnQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgc2V0R0xIb29rc1RocmVhZFNwZWNpZmljKGdsX2hvb2tzX3QgY29uc3QgKnZhbHVlKSB7Ci0gICAgaWYgKHNFR0xUcmFjZUxldmVsID4gMCkgewotICAgICAgICBzZXRHbFRyYWNlVGhyZWFkU3BlY2lmaWModmFsdWUpOwotICAgICAgICBzZXRHbFRocmVhZFNwZWNpZmljKCZnSG9va3NUcmFjZSk7Ci0gICAgfSBlbHNlIGlmIChnRUdMRGVidWdMZXZlbCA+IDAgJiYgdmFsdWUgIT0gJmdIb29rc05vQ29udGV4dCkgewotICAgICAgICBzZXRHbFRyYWNlVGhyZWFkU3BlY2lmaWModmFsdWUpOwotICAgICAgICBzZXRHbFRocmVhZFNwZWNpZmljKEdMVHJhY2VfZ2V0R0xIb29rcygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRHbFRocmVhZFNwZWNpZmljKHZhbHVlKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBHbG9iYWwgZW50cnkgcG9pbnQgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIG1vZGlmeSB0aGVpciBvd24gdHJhY2UgbGV2ZWwuCi0gKiBUaGUgZWZmZWN0aXZlIHRyYWNlIGxldmVsIGlzIHRoZSBtYXggb2YgdGhpcyBsZXZlbCBhbmQgdGhlIHZhbHVlIG9mIGRlYnVnLmVnbC50cmFjZS4KLSAqLwotZXh0ZXJuICJDIgotdm9pZCBzZXRHTFRyYWNlTGV2ZWwoaW50IGxldmVsKSB7Ci0gICAgc0VHTEFwcGxpY2F0aW9uVHJhY2VMZXZlbCA9IGxldmVsOwotfQotCi0jZWxzZQotCi12b2lkIHNldEdMSG9va3NUaHJlYWRTcGVjaWZpYyhnbF9ob29rc190IGNvbnN0ICp2YWx1ZSkgewotICAgIHNldEdsVGhyZWFkU3BlY2lmaWModmFsdWUpOwotfQotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IGdsX25vX2NvbnRleHQoKSB7Ci0gICAgaWYgKGVnbF90bHNfdDo6bG9nTm9Db250ZXh0Q2FsbCgpKSB7Ci0gICAgICAgIEFMT0dFKCJjYWxsIHRvIE9wZW5HTCBFUyBBUEkgd2l0aCBubyBjdXJyZW50IGNvbnRleHQgIgotICAgICAgICAgICAgICIobG9nZ2VkIG9uY2UgcGVyIHRocmVhZCkiKTsKLSAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmVnbC5jYWxsc3RhY2siLCB2YWx1ZSwgIjAiKTsKLSAgICAgICAgaWYgKGF0b2kodmFsdWUpKSB7Ci0gICAgICAgICAgICBDYWxsU3RhY2sgc3RhY2s7Ci0gICAgICAgICAgICBzdGFjay51cGRhdGUoKTsKLSAgICAgICAgICAgIHN0YWNrLmR1bXAoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZWFybHlfZWdsX2luaXQodm9pZCkgCi17Ci0jaWYgIVVTRV9GQVNUX1RMU19LRVkKLSAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmdHTFdyYXBwZXJLZXksIE5VTEwpOwotI2VuZGlmCi0jaWYgRUdMX1RSQUNFCi0gICAgcHRocmVhZF9rZXlfY3JlYXRlKCZnR0xUcmFjZUtleSwgTlVMTCk7Ci0gICAgaW5pdEVnbFRyYWNlTGV2ZWwoKTsKLSNlbmRpZgotICAgIHVpbnQzMl90IGFkZHIgPSAodWludDMyX3QpKCh2b2lkKilnbF9ub19jb250ZXh0KTsKLSAgICBhbmRyb2lkX21lbXNldDMyKAotICAgICAgICAgICAgKHVpbnQzMl90Kikodm9pZCopJmdIb29rc05vQ29udGV4dCwgCi0gICAgICAgICAgICBhZGRyLCAKLSAgICAgICAgICAgIHNpemVvZihnSG9va3NOb0NvbnRleHQpKTsKLQotICAgIHNldEdMSG9va3NUaHJlYWRTcGVjaWZpYygmZ0hvb2tzTm9Db250ZXh0KTsKLX0KLQotc3RhdGljIHB0aHJlYWRfb25jZV90IG9uY2VfY29udHJvbCA9IFBUSFJFQURfT05DRV9JTklUOwotc3RhdGljIGludCBzRWFybHlJbml0U3RhdGUgPSBwdGhyZWFkX29uY2UoJm9uY2VfY29udHJvbCwgJmVhcmx5X2VnbF9pbml0KTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lZ2xfZGlzcGxheV90KiB2YWxpZGF0ZV9kaXNwbGF5KEVHTERpc3BsYXkgZHB5KSB7Ci0gICAgZWdsX2Rpc3BsYXlfdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCAoZWdsX2Rpc3BsYXlfdCopTlVMTCk7Ci0gICAgaWYgKCFkcC0+aXNSZWFkeSgpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX05PVF9JTklUSUFMSVpFRCwgKGVnbF9kaXNwbGF5X3QqKU5VTEwpOwotCi0gICAgcmV0dXJuIGRwOwotfQotCi1lZ2xfY29ubmVjdGlvbl90KiB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnLAotICAgICAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiYgZHApIHsKLSAgICBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKQotICAgICAgICByZXR1cm4gKGVnbF9jb25uZWN0aW9uX3QqKSBOVUxMOwotCi0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTkZJRywgKGVnbF9jb25uZWN0aW9uX3QqKU5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gY254OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IEdMdWJ5dGUgKiBlZ2xfZ2V0X3N0cmluZ19mb3JfY3VycmVudF9jb250ZXh0KEdMZW51bSBuYW1lKSB7Ci0gICAgLy8gTk9URTogcmV0dXJuaW5nIE5VTEwgaGVyZSB3aWxsIGZhbGwtYmFjayB0byB0aGUgZGVmYXVsdAotICAgIC8vIGltcGxlbWVudGF0aW9uLgotCi0gICAgRUdMQ29udGV4dCBjb250ZXh0ID0gZWdsX3Rsc190OjpnZXRDb250ZXh0KCk7Ci0gICAgaWYgKGNvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZWdsX2NvbnRleHRfdCBjb25zdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjb250ZXh0KTsKLSAgICBpZiAoYyA9PSBOVUxMKSAvLyB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ5IGNvbnN0cnVjdGlvbgotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGlmIChuYW1lICE9IEdMX0VYVEVOU0lPTlMpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgcmV0dXJuIChjb25zdCBHTHVieXRlICopYy0+Z2xfZXh0ZW5zaW9ucy5zdHJpbmcoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyB0aGlzIG11dGV4IHByb3RlY3RzOgotLy8gICAgZC0+ZGlzcFtdCi0vLyAgICBlZ2xfaW5pdF9kcml2ZXJzX2xvY2tlZCgpCi0vLwotc3RhdGljIEVHTEJvb2xlYW4gZWdsX2luaXRfZHJpdmVyc19sb2NrZWQoKSB7Ci0gICAgaWYgKHNFYXJseUluaXRTdGF0ZSkgewotICAgICAgICAvLyBpbml0aWFsaXplZCBieSBzdGF0aWMgY3Rvci4gc2hvdWxkIGJlIHNldCBoZXJlLgotICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOwotICAgIH0KLQotICAgIC8vIGdldCBvdXIgZHJpdmVyIGxvYWRlcgotICAgIExvYWRlciYgbG9hZGVyKExvYWRlcjo6Z2V0SW5zdGFuY2UoKSk7Ci0KLSAgICAvLyBkeW5hbWljYWxseSBsb2FkIG91ciBFR0wgaW1wbGVtZW50YXRpb24KLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvID09IDApIHsKLSAgICAgICAgY254LT5ob29rc1tlZ2xfY29ubmVjdGlvbl90OjpHTEVTdjFfSU5ERVhdID0KLSAgICAgICAgICAgICAgICAmZ0hvb2tzW2VnbF9jb25uZWN0aW9uX3Q6OkdMRVN2MV9JTkRFWF07Ci0gICAgICAgIGNueC0+aG9va3NbZWdsX2Nvbm5lY3Rpb25fdDo6R0xFU3YyX0lOREVYXSA9Ci0gICAgICAgICAgICAgICAgJmdIb29rc1tlZ2xfY29ubmVjdGlvbl90OjpHTEVTdjJfSU5ERVhdOwotICAgICAgICBjbngtPmRzbyA9IGxvYWRlci5vcGVuKGNueCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNueC0+ZHNvID8gRUdMX1RSVUUgOiBFR0xfRkFMU0U7Ci19Ci0KLXN0YXRpYyBwdGhyZWFkX211dGV4X3Qgc0luaXREcml2ZXJNdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci0KLUVHTEJvb2xlYW4gZWdsX2luaXRfZHJpdmVycygpIHsKLSAgICBFR0xCb29sZWFuIHJlczsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnNJbml0RHJpdmVyTXV0ZXgpOwotICAgIHJlcyA9IGVnbF9pbml0X2RyaXZlcnNfbG9ja2VkKCk7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNJbml0RHJpdmVyTXV0ZXgpOwotICAgIHJldHVybiByZXM7Ci19Ci0KLXZvaWQgZ2xfdW5pbXBsZW1lbnRlZCgpIHsKLSAgICBBTE9HRSgiY2FsbGVkIHVuaW1wbGVtZW50ZWQgT3BlbkdMIEVTIEFQSSIpOwotfQotCi12b2lkIGdsX25vb3AoKSB7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIFVTRV9GQVNUX1RMU19LRVkKLQotLy8gV2UgaGF2ZSBhIGRlZGljYXRlZCBUTFMgc2xvdCBpbiBiaW9uaWMKLXN0YXRpYyBpbmxpbmUgZ2xfaG9va3NfdCBjb25zdCAqIHZvbGF0aWxlICogZ2V0X3Rsc19ob29rcygpIHsKLSAgICB2b2xhdGlsZSB2b2lkICp0bHNfYmFzZSA9IF9fZ2V0X3RscygpOwotICAgIGdsX2hvb2tzX3QgY29uc3QgKiB2b2xhdGlsZSAqIHRsc19ob29rcyA9Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGdsX2hvb2tzX3QgY29uc3QgKiB2b2xhdGlsZSAqPih0bHNfYmFzZSk7Ci0gICAgcmV0dXJuIHRsc19ob29rczsKLX0KLQotdm9pZCBzZXRHbFRocmVhZFNwZWNpZmljKGdsX2hvb2tzX3QgY29uc3QgKnZhbHVlKSB7Ci0gICAgZ2xfaG9va3NfdCBjb25zdCAqIHZvbGF0aWxlICogdGxzX2hvb2tzID0gZ2V0X3Rsc19ob29rcygpOwotICAgIHRsc19ob29rc1tUTFNfU0xPVF9PUEVOR0xfQVBJXSA9IHZhbHVlOwotfQotCi1nbF9ob29rc190IGNvbnN0KiBnZXRHbFRocmVhZFNwZWNpZmljKCkgewotICAgIGdsX2hvb2tzX3QgY29uc3QgKiB2b2xhdGlsZSAqIHRsc19ob29rcyA9IGdldF90bHNfaG9va3MoKTsKLSAgICBnbF9ob29rc190IGNvbnN0KiBob29rcyA9IHRsc19ob29rc1tUTFNfU0xPVF9PUEVOR0xfQVBJXTsKLSAgICBpZiAoaG9va3MpIHJldHVybiBob29rczsKLSAgICByZXR1cm4gJmdIb29rc05vQ29udGV4dDsKLX0KLQotI2Vsc2UKLQotdm9pZCBzZXRHbFRocmVhZFNwZWNpZmljKGdsX2hvb2tzX3QgY29uc3QgKnZhbHVlKSB7Ci0gICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnR0xXcmFwcGVyS2V5LCB2YWx1ZSk7Ci19Ci0KLWdsX2hvb2tzX3QgY29uc3QqIGdldEdsVGhyZWFkU3BlY2lmaWMoKSB7Ci0gICAgZ2xfaG9va3NfdCBjb25zdCogaG9va3MgPSAgc3RhdGljX2Nhc3Q8Z2xfaG9va3NfdCo+KHB0aHJlYWRfZ2V0c3BlY2lmaWMoZ0dMV3JhcHBlcktleSkpOwotICAgIGlmIChob29rcykgcmV0dXJuIGhvb2tzOwotICAgIHJldHVybiAmZ0hvb2tzTm9Db250ZXh0OwotfQotCi0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gR0wgLyBFR0wgaG9va3MKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI3VuZGVmIEdMX0VOVFJZCi0jdW5kZWYgRUdMX0VOVFJZCi0jZGVmaW5lIEdMX0VOVFJZKF9yLCBfYXBpLCAuLi4pICNfYXBpLAotI2RlZmluZSBFR0xfRU5UUlkoX3IsIF9hcGksIC4uLikgI19hcGksCi0KLWNoYXIgY29uc3QgKiBjb25zdCBnbF9uYW1lc1tdID0gewotICAgICNpbmNsdWRlICJlbnRyaWVzLmluIgotICAgIE5VTEwKLX07Ci0KLWNoYXIgY29uc3QgKiBjb25zdCBlZ2xfbmFtZXNbXSA9IHsKLSAgICAjaW5jbHVkZSAiZWdsX2VudHJpZXMuaW4iCi0gICAgTlVMTAotfTsKLQotI3VuZGVmIEdMX0VOVFJZCi0jdW5kZWYgRUdMX0VOVFJZCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbEFwaS5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvZWdsQXBpLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiZDgyZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsQXBpLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMzkgKzAsMCBAQAotLyogCi0gKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgotI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbWVtb3J5Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi0jaW5jbHVkZSAiZWdsX2ltcGwuaCIKLSNpbmNsdWRlICJlZ2xfdGxzLmgiCi0jaW5jbHVkZSAiZ2xlc3RyYWNlLmgiCi0jaW5jbHVkZSAiaG9va3MuaCIKLQotI2luY2x1ZGUgImVnbF9kaXNwbGF5LmgiCi0jaW5jbHVkZSAiZWdsX2ltcGwuaCIKLSNpbmNsdWRlICJlZ2xfb2JqZWN0LmgiCi0jaW5jbHVkZSAiZWdsX3Rscy5oIgotI2luY2x1ZGUgImVnbGRlZnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2RlZmluZSBFR0xfVkVSU0lPTl9IV19BTkRST0lEICAweDMxNDMKLQotc3RydWN0IGV4dGVudGlvbl9tYXBfdCB7Ci0gICAgY29uc3QgY2hhciogbmFtZTsKLSAgICBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGFkZHJlc3M7Ci19OwotCi1zdGF0aWMgY29uc3QgZXh0ZW50aW9uX21hcF90IHNFeHRlbnRpb25NYXBbXSA9IHsKLSAgICB7ICJlZ2xMb2NrU3VyZmFjZUtIUiIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZWdsTG9ja1N1cmZhY2VLSFIgfSwKLSAgICB7ICJlZ2xVbmxvY2tTdXJmYWNlS0hSIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZlZ2xVbmxvY2tTdXJmYWNlS0hSIH0sCi0gICAgeyAiZWdsQ3JlYXRlSW1hZ2VLSFIiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmVnbENyZWF0ZUltYWdlS0hSIH0sCi0gICAgeyAiZWdsRGVzdHJveUltYWdlS0hSIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZlZ2xEZXN0cm95SW1hZ2VLSFIgfSwKLSAgICB7ICJlZ2xHZXRTeXN0ZW1UaW1lRnJlcXVlbmN5TlYiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmVnbEdldFN5c3RlbVRpbWVGcmVxdWVuY3lOViB9LAotICAgIHsgImVnbEdldFN5c3RlbVRpbWVOViIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZWdsR2V0U3lzdGVtVGltZU5WIH0sCi19OwotCi0vLyBhY2Nlc3NlcyBwcm90ZWN0ZWQgYnkgc0V4dGVuc2lvbk1hcE11dGV4Ci1zdGF0aWMgRGVmYXVsdEtleWVkVmVjdG9yPFN0cmluZzgsIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGU+IHNHTEV4dGVudGlvbk1hcDsKLXN0YXRpYyBpbnQgc0dMRXh0ZW50aW9uU2xvdCA9IDA7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IHNFeHRlbnNpb25NYXBNdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci0KLXN0YXRpYyB2b2lkKCpmaW5kUHJvY0FkZHJlc3MoY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgY29uc3QgZXh0ZW50aW9uX21hcF90KiBtYXAsIHNpemVfdCBuKSkoKSB7Ci0gICAgZm9yICh1aW50MzJfdCBpPTAgOyBpPG4gOyBpKyspIHsKLSAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgbWFwW2ldLm5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwW2ldLmFkZHJlc3M7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotZXh0ZXJuIHZvaWQgc2V0R0xIb29rc1RocmVhZFNwZWNpZmljKGdsX2hvb2tzX3QgY29uc3QgKnZhbHVlKTsKLWV4dGVybiBFR0xCb29sZWFuIGVnbF9pbml0X2RyaXZlcnMoKTsKLWV4dGVybiBjb25zdCBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGdFeHRlbnNpb25Gb3J3YXJkZXJzW01BWF9OVU1CRVJfT0ZfR0xfRVhURU5TSU9OU107Ci1leHRlcm4gaW50IGdFR0xEZWJ1Z0xldmVsOwotZXh0ZXJuIGdsX2hvb2tzX3QgZ0hvb2tzVHJhY2U7Ci19IC8vIG5hbWVzcGFjZSBhbmRyb2lkOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhckVycm9yKCkgeyBlZ2xfdGxzX3Q6OmNsZWFyRXJyb3IoKTsgfQotc3RhdGljIGlubGluZSBFR0xDb250ZXh0IGdldENvbnRleHQoKSB7IHJldHVybiBlZ2xfdGxzX3Q6OmdldENvbnRleHQoKTsgfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTERpc3BsYXkgZWdsR2V0RGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBkaXNwbGF5KQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIHVpbnQzMl90IGluZGV4ID0gdWludDMyX3QoZGlzcGxheSk7Ci0gICAgaWYgKGluZGV4ID49IE5VTV9ESVNQTEFZUykgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9OT19ESVNQTEFZKTsKLSAgICB9Ci0KLSAgICBpZiAoZWdsX2luaXRfZHJpdmVycygpID09IEVHTF9GQUxTRSkgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9OT19ESVNQTEFZKTsKLSAgICB9Ci0KLSAgICBFR0xEaXNwbGF5IGRweSA9IGVnbF9kaXNwbGF5X3Q6OmdldEZyb21OYXRpdmVEaXNwbGF5KGRpc3BsYXkpOwotICAgIHJldHVybiBkcHk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEluaXRpYWxpemF0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTEJvb2xlYW4gZWdsSW5pdGlhbGl6ZShFR0xEaXNwbGF5IGRweSwgRUdMaW50ICptYWpvciwgRUdMaW50ICptaW5vcikKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0KLSAgICBFR0xCb29sZWFuIHJlcyA9IGRwLT5pbml0aWFsaXplKG1ham9yLCBtaW5vcik7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1FR0xCb29sZWFuIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRweSkKLXsKLSAgICAvLyBOT1RFOiBkb24ndCB1bmxvYWQgdGhlIGRyaXZlcnMgYi9jIHNvbWUgQVBJcyBjYW4gYmUgY2FsbGVkCi0gICAgLy8gYWZ0ZXIgZWdsVGVybWluYXRlKCkgaGFzIGJlZW4gY2FsbGVkLiBlZ2xUZXJtaW5hdGUoKSBvbmx5Ci0gICAgLy8gdGVybWluYXRlcyBhbiBFR0xEaXNwbGF5LCBub3QgYSBFR0wgaXRzZWxmLgotCi0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0KLSAgICBFR0xCb29sZWFuIHJlcyA9IGRwLT50ZXJtaW5hdGUoKTsKLSAgICAKLSAgICByZXR1cm4gcmVzOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb25maWd1cmF0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTEJvb2xlYW4gZWdsR2V0Q29uZmlncyggICBFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb25maWcgKmNvbmZpZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBpZiAobnVtX2NvbmZpZz09MCkgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Ci0gICAgfQotCi0gICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfRkFMU0U7Ci0gICAgKm51bV9jb25maWcgPSAwOwotCi0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbykgewotICAgICAgICByZXMgPSBjbngtPmVnbC5lZ2xHZXRDb25maWdzKAotICAgICAgICAgICAgICAgIGRwLT5kaXNwLmRweSwgY29uZmlncywgY29uZmlnX3NpemUsIG51bV9jb25maWcpOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsQ2hvb3NlQ29uZmlnKCBFR0xEaXNwbGF5IGRweSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgKm51bV9jb25maWcpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBpZiAobnVtX2NvbmZpZz09MCkgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Ci0gICAgfQotCi0gICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfRkFMU0U7Ci0gICAgKm51bV9jb25maWcgPSAwOwotCi0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbykgewotICAgICAgICByZXMgPSBjbngtPmVnbC5lZ2xDaG9vc2VDb25maWcoCi0gICAgICAgICAgICAgICAgZHAtPmRpc3AuZHB5LCBhdHRyaWJfbGlzdCwgY29uZmlncywgY29uZmlnX3NpemUsIG51bV9jb25maWcpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi1FR0xCb29sZWFuIGVnbEdldENvbmZpZ0F0dHJpYihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCA9IDA7Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY254ID0gdmFsaWRhdGVfZGlzcGxheV9jb25maWcoZHB5LCBjb25maWcsIGRwKTsKLSAgICBpZiAoIWNueCkgcmV0dXJuIEVHTF9GQUxTRTsKLSAgICAKLSAgICByZXR1cm4gY254LT5lZ2wuZWdsR2V0Q29uZmlnQXR0cmliKAotICAgICAgICAgICAgZHAtPmRpc3AuZHB5LCBjb25maWcsIGF0dHJpYnV0ZSwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBzdXJmYWNlcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FR0xTdXJmYWNlIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCA9IDA7Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY254ID0gdmFsaWRhdGVfZGlzcGxheV9jb25maWcoZHB5LCBjb25maWcsIGRwKTsKLSAgICBpZiAoY254KSB7Ci0gICAgICAgIEVHTERpc3BsYXkgaURweSA9IGRwLT5kaXNwLmRweTsKLSAgICAgICAgRUdMaW50IGZvcm1hdDsKLQotICAgICAgICBpZiAobmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdCh3aW5kb3csIE5BVElWRV9XSU5ET1dfQVBJX0VHTCkgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJFR0xOYXRpdmVXaW5kb3dUeXBlICVwIGFscmVhZHkgY29ubmVjdGVkIHRvIGFub3RoZXIgQVBJIiwKLSAgICAgICAgICAgICAgICAgICAgd2luZG93KTsKLSAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX05BVElWRV9XSU5ET1csIEVHTF9OT19TVVJGQUNFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB0aGUgbmF0aXZlIHdpbmRvdydzIGJ1ZmZlcnMgZm9ybWF0IHRvIG1hdGNoIHRoaXMgY29uZmlnCi0gICAgICAgIGlmIChjbngtPmVnbC5lZ2xHZXRDb25maWdBdHRyaWIoaURweSwKLSAgICAgICAgICAgICAgICBjb25maWcsIEVHTF9OQVRJVkVfVklTVUFMX0lELCAmZm9ybWF0KSkgewotICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KHdpbmRvdywgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yIHNldHRpbmcgbmF0aXZlIHdpbmRvdyBwaXhlbCBmb3JtYXQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KHdpbmRvdywgTkFUSVZFX1dJTkRPV19BUElfRUdMKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTkFUSVZFX1dJTkRPVywgRUdMX05PX1NVUkZBQ0UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZSBFR0wgc3BlYyByZXF1aXJlcyB0aGF0IGEgbmV3IEVHTFN1cmZhY2UgZGVmYXVsdCB0byBzd2FwIGludGVydmFsCi0gICAgICAgIC8vIDEsIHNvIGV4cGxpY2l0bHkgc2V0IHRoYXQgb24gdGhlIHdpbmRvdyBoZXJlLgotICAgICAgICBBTmF0aXZlV2luZG93KiBhbncgPSByZWludGVycHJldF9jYXN0PEFOYXRpdmVXaW5kb3cqPih3aW5kb3cpOwotICAgICAgICBhbnctPnNldFN3YXBJbnRlcnZhbChhbncsIDEpOwotCi0gICAgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IGNueC0+ZWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoCi0gICAgICAgICAgICAgICAgaURweSwgY29uZmlnLCB3aW5kb3csIGF0dHJpYl9saXN0KTsKLSAgICAgICAgaWYgKHN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QqIHMgPSBuZXcgZWdsX3N1cmZhY2VfdChkcHksIGNvbmZpZywgd2luZG93LCBzdXJmYWNlLCBjbngpOwotICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFR0xTdXJmYWNlIGNyZWF0aW9uIGZhaWxlZAotICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdCh3aW5kb3csIDApOwotICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KHdpbmRvdywgTkFUSVZFX1dJTkRPV19BUElfRUdMKTsKLSAgICB9Ci0gICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOwotfQotCi1FR0xTdXJmYWNlIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UoICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCA9IDA7Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY254ID0gdmFsaWRhdGVfZGlzcGxheV9jb25maWcoZHB5LCBjb25maWcsIGRwKTsKLSAgICBpZiAoY254KSB7Ci0gICAgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IGNueC0+ZWdsLmVnbENyZWF0ZVBpeG1hcFN1cmZhY2UoCi0gICAgICAgICAgICAgICAgZHAtPmRpc3AuZHB5LCBjb25maWcsIHBpeG1hcCwgYXR0cmliX2xpc3QpOwotICAgICAgICBpZiAoc3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICAgICAgZWdsX3N1cmZhY2VfdCogcyA9IG5ldyBlZ2xfc3VyZmFjZV90KGRweSwgY29uZmlnLCBOVUxMLCBzdXJmYWNlLCBjbngpOwotICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOwotfQotCi1FR0xTdXJmYWNlIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKCBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAgPSAwOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNueCA9IHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKGRweSwgY29uZmlnLCBkcCk7Ci0gICAgaWYgKGNueCkgewotICAgICAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBjbngtPmVnbC5lZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSgKLSAgICAgICAgICAgICAgICBkcC0+ZGlzcC5kcHksIGNvbmZpZywgYXR0cmliX2xpc3QpOwotICAgICAgICBpZiAoc3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICAgICAgZWdsX3N1cmZhY2VfdCogcyA9IG5ldyBlZ2xfc3VyZmFjZV90KGRweSwgY29uZmlnLCBOVUxMLCBzdXJmYWNlLCBjbngpOwotICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOwotfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1FR0xCb29sZWFuIGVnbERlc3Ryb3lTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBTdXJmYWNlUmVmIF9zKGRwLCBzdXJmYWNlKTsKLSAgICBpZiAoIV9zLmdldCgpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotCi0gICAgZWdsX3N1cmZhY2VfdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShzdXJmYWNlKTsKLSAgICBFR0xCb29sZWFuIHJlc3VsdCA9IHMtPmNueC0+ZWdsLmVnbERlc3Ryb3lTdXJmYWNlKGRwLT5kaXNwLmRweSwgcy0+c3VyZmFjZSk7Ci0gICAgaWYgKHJlc3VsdCA9PSBFR0xfVFJVRSkgewotICAgICAgICBfcy50ZXJtaW5hdGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRUdMQm9vbGVhbiBlZ2xRdWVyeVN1cmZhY2UoIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIFN1cmZhY2VSZWYgX3MoZHAsIHN1cmZhY2UpOwotICAgIGlmICghX3MuZ2V0KCkpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci0KLSAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKHN1cmZhY2UpOwotICAgIHJldHVybiBzLT5jbngtPmVnbC5lZ2xRdWVyeVN1cmZhY2UoCi0gICAgICAgICAgICBkcC0+ZGlzcC5kcHksIHMtPnN1cmZhY2UsIGF0dHJpYnV0ZSwgdmFsdWUpOwotfQotCi12b2lkIEVHTEFQSSBlZ2xCZWdpbkZyYW1lKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTdXJmYWNlUmVmIF9zKGRwLCBzdXJmYWNlKTsKLSAgICBpZiAoIV9zLmdldCgpKSB7Ci0gICAgICAgIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludDY0X3QgdGltZXN0YW1wID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShzdXJmYWNlKTsKLSAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChzLT53aW4uZ2V0KCksIHRpbWVzdGFtcCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvbnRleHRzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTENvbnRleHQgZWdsQ3JlYXRlQ29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb250ZXh0IHNoYXJlX2xpc3QsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAgPSAwOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNueCA9IHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKGRweSwgY29uZmlnLCBkcCk7Ci0gICAgaWYgKGNueCkgewotICAgICAgICBpZiAoc2hhcmVfbGlzdCAhPSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICAgICAgZWdsX2NvbnRleHRfdCogY29uc3QgYyA9IGdldF9jb250ZXh0KHNoYXJlX2xpc3QpOwotICAgICAgICAgICAgc2hhcmVfbGlzdCA9IGMtPmNvbnRleHQ7Ci0gICAgICAgIH0KLSAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gY254LT5lZ2wuZWdsQ3JlYXRlQ29udGV4dCgKLSAgICAgICAgICAgICAgICBkcC0+ZGlzcC5kcHksIGNvbmZpZywgc2hhcmVfbGlzdCwgYXR0cmliX2xpc3QpOwotICAgICAgICBpZiAoY29udGV4dCAhPSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICAgICAgLy8gZmlndXJlIG91dCBpZiBpdCdzIGEgR0xFU3YxIG9yIEdMRVN2MgotICAgICAgICAgICAgaW50IHZlcnNpb24gPSAwOwotICAgICAgICAgICAgaWYgKGF0dHJpYl9saXN0KSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCphdHRyaWJfbGlzdCAhPSBFR0xfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICBHTGludCBhdHRyID0gKmF0dHJpYl9saXN0Kys7Ci0gICAgICAgICAgICAgICAgICAgIEdMaW50IHZhbHVlID0gKmF0dHJpYl9saXN0Kys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyID09IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBlZ2xfY29ubmVjdGlvbl90OjpHTEVTdjFfSU5ERVg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZWdsX2Nvbm5lY3Rpb25fdDo6R0xFU3YyX0lOREVYOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVnbF9jb250ZXh0X3QqIGMgPSBuZXcgZWdsX2NvbnRleHRfdChkcHksIGNvbnRleHQsIGNvbmZpZywgY254LCB2ZXJzaW9uKTsKLSNpZiBFR0xfVFJBQ0UKLSAgICAgICAgICAgIGlmIChnRUdMRGVidWdMZXZlbCA+IDApCi0gICAgICAgICAgICAgICAgR0xUcmFjZV9lZ2xDcmVhdGVDb250ZXh0KHZlcnNpb24sIGMpOwotI2VuZGlmCi0gICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRUdMX05PX0NPTlRFWFQ7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsRGVzdHJveUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4KQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKQotICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgQ29udGV4dFJlZiBfYyhkcCwgY3R4KTsKLSAgICBpZiAoIV9jLmdldCgpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOwotICAgIAotICAgIGVnbF9jb250ZXh0X3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKLSAgICBFR0xCb29sZWFuIHJlc3VsdCA9IGMtPmNueC0+ZWdsLmVnbERlc3Ryb3lDb250ZXh0KGRwLT5kaXNwLmRweSwgYy0+Y29udGV4dCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBFR0xfVFJVRSkgewotICAgICAgICBfYy50ZXJtaW5hdGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRUdMQm9vbGVhbiBlZ2xNYWtlQ3VycmVudCggIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMU3VyZmFjZSByZWFkLCBFR0xDb250ZXh0IGN0eCkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0KLSAgICAvLyBJZiBjdHggaXMgbm90IEVHTF9OT19DT05URVhULCByZWFkIGlzIG5vdCBFR0xfTk9fU1VSRkFDRSwgb3IgZHJhdyBpcyBub3QKLSAgICAvLyBFR0xfTk9fU1VSRkFDRSwgdGhlbiBhbiBFR0xfTk9UX0lOSVRJQUxJWkVEIGVycm9yIGlzIGdlbmVyYXRlZCBpZiBkcHkgaXMKLSAgICAvLyBhIHZhbGlkIGJ1dCB1bmluaXRpYWxpemVkIGRpc3BsYXkuCi0gICAgaWYgKCAoY3R4ICE9IEVHTF9OT19DT05URVhUKSB8fCAocmVhZCAhPSBFR0xfTk9fU1VSRkFDRSkgfHwKLSAgICAgICAgIChkcmF3ICE9IEVHTF9OT19TVVJGQUNFKSApIHsKLSAgICAgICAgaWYgKCFkcC0+aXNSZWFkeSgpKSByZXR1cm4gc2V0RXJyb3IoRUdMX05PVF9JTklUSUFMSVpFRCwgRUdMX0ZBTFNFKTsKLSAgICB9Ci0KLSAgICAvLyBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBwYXNzZWQgaW4KLSAgICBDb250ZXh0UmVmIF9jKGRwLCBjdHgpOwotICAgIFN1cmZhY2VSZWYgX2QoZHAsIGRyYXcpOwotICAgIFN1cmZhY2VSZWYgX3IoZHAsIHJlYWQpOwotCi0gICAgLy8gdmFsaWRhdGUgdGhlIGNvbnRleHQgKGlmIG5vdCBFR0xfTk9fQ09OVEVYVCkKLSAgICBpZiAoKGN0eCAhPSBFR0xfTk9fQ09OVEVYVCkgJiYgIV9jLmdldCgpKSB7Ci0gICAgICAgIC8vIEVHTF9OT19DT05URVhUIGlzIHZhbGlkCi0gICAgICAgIHJldHVybiBFR0xfRkFMU0U7Ci0gICAgfQotCi0gICAgLy8gdGhlc2UgYXJlIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uJ3Mgb2JqZWN0Ci0gICAgRUdMQ29udGV4dCBpbXBsX2N0eCAgPSBFR0xfTk9fQ09OVEVYVDsKLSAgICBFR0xTdXJmYWNlIGltcGxfZHJhdyA9IEVHTF9OT19TVVJGQUNFOwotICAgIEVHTFN1cmZhY2UgaW1wbF9yZWFkID0gRUdMX05PX1NVUkZBQ0U7Ci0KLSAgICAvLyB0aGVzZSBhcmUgb3VyIG9iamVjdHMgc3RydWN0cyBwYXNzZWQgaW4KLSAgICBlZ2xfY29udGV4dF90ICAgICAgICogYyA9IE5VTEw7Ci0gICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGQgPSBOVUxMOwotICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiByID0gTlVMTDsKLQotICAgIC8vIHRoZXNlIGFyZSB0aGUgY3VycmVudCBvYmplY3RzIHN0cnVjdHMKLSAgICBlZ2xfY29udGV4dF90ICogY3VyX2MgPSBnZXRfY29udGV4dChnZXRDb250ZXh0KCkpOwotICAgIAotICAgIGlmIChjdHggIT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgYyA9IGdldF9jb250ZXh0KGN0eCk7Ci0gICAgICAgIGltcGxfY3R4ID0gYy0+Y29udGV4dDsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBubyBjb250ZXh0IGdpdmVuLCB1c2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjdXJyZW50IGNvbnRleHQKLSAgICAgICAgaWYgKGN1cl9jID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIG5vIGN1cnJlbnQgY29udGV4dAotICAgICAgICAgICAgaWYgKGRyYXcgIT0gRUdMX05PX1NVUkZBQ0UgfHwgcmVhZCAhPSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICAgICAgICAgIC8vIGNhbGxpbmcgZWdsTWFrZUN1cnJlbnQoIC4uLiwgIT0wLCAhPTAsIEVHTF9OT19DT05URVhUKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX0ZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG5vdCBhbiBlcnJvciwgdGhlcmUgaXMganVzdCBubyBjdXJyZW50IGNvbnRleHQuCi0gICAgICAgICAgICByZXR1cm4gRUdMX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyByZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbidzIGRyYXcgRUdMU3VyZmFjZQotICAgIGlmIChkcmF3ICE9IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgIGQgPSBnZXRfc3VyZmFjZShkcmF3KTsKLSAgICAgICAgaW1wbF9kcmF3ID0gZC0+c3VyZmFjZTsKLSAgICB9Ci0KLSAgICAvLyByZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbidzIHJlYWQgRUdMU3VyZmFjZQotICAgIGlmIChyZWFkICE9IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgIHIgPSBnZXRfc3VyZmFjZShyZWFkKTsKLSAgICAgICAgaW1wbF9yZWFkID0gci0+c3VyZmFjZTsKLSAgICB9Ci0KLQotICAgIEVHTEJvb2xlYW4gcmVzdWx0ID0gY29uc3RfY2FzdDxlZ2xfZGlzcGxheV90Kj4oZHApLT5tYWtlQ3VycmVudChjLCBjdXJfYywKLSAgICAgICAgICAgIGRyYXcsIHJlYWQsIGN0eCwKLSAgICAgICAgICAgIGltcGxfZHJhdywgaW1wbF9yZWFkLCBpbXBsX2N0eCk7Ci0KLSAgICBpZiAocmVzdWx0ID09IEVHTF9UUlVFKSB7Ci0gICAgICAgIGlmIChjKSB7Ci0gICAgICAgICAgICBzZXRHTEhvb2tzVGhyZWFkU3BlY2lmaWMoYy0+Y254LT5ob29rc1tjLT52ZXJzaW9uXSk7Ci0gICAgICAgICAgICBlZ2xfdGxzX3Q6OnNldENvbnRleHQoY3R4KTsKLSNpZiBFR0xfVFJBQ0UKLSAgICAgICAgICAgIGlmIChnRUdMRGVidWdMZXZlbCA+IDApCi0gICAgICAgICAgICAgICAgR0xUcmFjZV9lZ2xNYWtlQ3VycmVudChjLT52ZXJzaW9uLCBjLT5jbngtPmhvb2tzW2MtPnZlcnNpb25dLCBjdHgpOwotI2VuZGlmCi0gICAgICAgICAgICBfYy5hY3F1aXJlKCk7Ci0gICAgICAgICAgICBfci5hY3F1aXJlKCk7Ci0gICAgICAgICAgICBfZC5hY3F1aXJlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRHTEhvb2tzVGhyZWFkU3BlY2lmaWMoJmdIb29rc05vQ29udGV4dCk7Ci0gICAgICAgICAgICBlZ2xfdGxzX3Q6OnNldENvbnRleHQoRUdMX05PX0NPTlRFWFQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gdGhpcyB3aWxsIEFMT0dFIHRoZSBlcnJvcgotICAgICAgICByZXN1bHQgPSBzZXRFcnJvcihjLT5jbngtPmVnbC5lZ2xHZXRFcnJvcigpLCBFR0xfRkFMU0UpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLUVHTEJvb2xlYW4gZWdsUXVlcnlDb250ZXh0KCBFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIENvbnRleHRSZWYgX2MoZHAsIGN0eCk7Ci0gICAgaWYgKCFfYy5nZXQoKSkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKLQotICAgIGVnbF9jb250ZXh0X3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKLSAgICByZXR1cm4gYy0+Y254LT5lZ2wuZWdsUXVlcnlDb250ZXh0KAotICAgICAgICAgICAgZHAtPmRpc3AuZHB5LCBjLT5jb250ZXh0LCBhdHRyaWJ1dGUsIHZhbHVlKTsKLQotfQotCi1FR0xDb250ZXh0IGVnbEdldEN1cnJlbnRDb250ZXh0KHZvaWQpCi17Ci0gICAgLy8gY291bGQgYmUgY2FsbGVkIGJlZm9yZSBlZ2xJbml0aWFsaXplKCksIGJ1dCB3ZSB3b3VsZG4ndCBoYXZlIGEgY29udGV4dAotICAgIC8vIHRoZW4sIGFuZCB0aGlzIGZ1bmN0aW9uIHdvdWxkIGNvcnJlY3RseSByZXR1cm4gRUdMX05PX0NPTlRFWFQuCi0KLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBFR0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKLSAgICByZXR1cm4gY3R4OwotfQotCi1FR0xTdXJmYWNlIGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTGludCByZWFkZHJhdykKLXsKLSAgICAvLyBjb3VsZCBiZSBjYWxsZWQgYmVmb3JlIGVnbEluaXRpYWxpemUoKSwgYnV0IHdlIHdvdWxkbid0IGhhdmUgYSBjb250ZXh0Ci0gICAgLy8gdGhlbiwgYW5kIHRoaXMgZnVuY3Rpb24gd291bGQgY29ycmVjdGx5IHJldHVybiBFR0xfTk9fU1VSRkFDRS4KLQotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIEVHTENvbnRleHQgY3R4ID0gZ2V0Q29udGV4dCgpOwotICAgIGlmIChjdHgpIHsKLSAgICAgICAgZWdsX2NvbnRleHRfdCBjb25zdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOwotICAgICAgICBpZiAoIWMpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9OT19TVVJGQUNFKTsKLSAgICAgICAgc3dpdGNoIChyZWFkZHJhdykgewotICAgICAgICAgICAgY2FzZSBFR0xfUkVBRDogcmV0dXJuIGMtPnJlYWQ7Ci0gICAgICAgICAgICBjYXNlIEVHTF9EUkFXOiByZXR1cm4gYy0+ZHJhdzsgICAgICAgICAgICAKLSAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX05PX1NVUkZBQ0UpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKLX0KLQotRUdMRGlzcGxheSBlZ2xHZXRDdXJyZW50RGlzcGxheSh2b2lkKQotewotICAgIC8vIGNvdWxkIGJlIGNhbGxlZCBiZWZvcmUgZWdsSW5pdGlhbGl6ZSgpLCBidXQgd2Ugd291bGRuJ3QgaGF2ZSBhIGNvbnRleHQKLSAgICAvLyB0aGVuLCBhbmQgdGhpcyBmdW5jdGlvbiB3b3VsZCBjb3JyZWN0bHkgcmV0dXJuIEVHTF9OT19ESVNQTEFZLgotCi0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgRUdMQ29udGV4dCBjdHggPSBnZXRDb250ZXh0KCk7Ci0gICAgaWYgKGN0eCkgewotICAgICAgICBlZ2xfY29udGV4dF90IGNvbnN0ICogY29uc3QgYyA9IGdldF9jb250ZXh0KGN0eCk7Ci0gICAgICAgIGlmICghYykgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX05PX1NVUkZBQ0UpOwotICAgICAgICByZXR1cm4gYy0+ZHB5OwotICAgIH0KLSAgICByZXR1cm4gRUdMX05PX0RJU1BMQVk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsV2FpdEdMKHZvaWQpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmICghY254LT5kc28pCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7Ci0KLSAgICByZXR1cm4gY254LT5lZ2wuZWdsV2FpdEdMKCk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsV2FpdE5hdGl2ZShFR0xpbnQgZW5naW5lKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoIWNueC0+ZHNvKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOwotCi0gICAgcmV0dXJuIGNueC0+ZWdsLmVnbFdhaXROYXRpdmUoZW5naW5lKTsKLX0KLQotRUdMaW50IGVnbEdldEVycm9yKHZvaWQpCi17Ci0gICAgRUdMaW50IGVyciA9IEVHTF9TVUNDRVNTOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoY254LT5kc28pIHsKLSAgICAgICAgZXJyID0gY254LT5lZ2wuZWdsR2V0RXJyb3IoKTsKLSAgICB9Ci0gICAgaWYgKGVyciA9PSBFR0xfU1VDQ0VTUykgewotICAgICAgICBlcnIgPSBlZ2xfdGxzX3Q6OmdldEVycm9yKCk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLV9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgZWdsR2V0UHJvY0FkZHJlc3MoY29uc3QgY2hhciAqcHJvY25hbWUpCi17Ci0gICAgLy8gZWdsR2V0UHJvY0FkZHJlc3MoKSBjb3VsZCBiZSB0aGUgdmVyeSBmaXJzdCBmdW5jdGlvbiBjYWxsZWQKLSAgICAvLyBpbiB3aGljaCBjYXNlIHdlIG11c3QgbWFrZSBzdXJlIHdlJ3ZlIGluaXRpYWxpemVkIG91cnNlbHZlcywgdGhpcwotICAgIC8vIGhhcHBlbnMgdGhlIGZpcnN0IHRpbWUgZWdsX2dldF9kaXNwbGF5KCkgaXMgY2FsbGVkLgotCi0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgaWYgKGVnbF9pbml0X2RyaXZlcnMoKSA9PSBFR0xfRkFMU0UpIHsKLSAgICAgICAgc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIE5VTEwpOwotICAgICAgICByZXR1cm4gIE5VTEw7Ci0gICAgfQotCi0gICAgLy8gVGhlIEVHTF9BTkRST0lEX2Jsb2JfY2FjaGUgZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZXhwb3NlZCB0bwotICAgIC8vIGFwcGxpY2F0aW9ucy4gIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgQW5kcm9pZCBFR0wgbGF5ZXIuCi0gICAgaWYgKCFzdHJjbXAocHJvY25hbWUsICJlZ2xTZXRCbG9iQ2FjaGVGdW5jc0FORFJPSUQiKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGFkZHI7Ci0gICAgYWRkciA9IGZpbmRQcm9jQWRkcmVzcyhwcm9jbmFtZSwgc0V4dGVudGlvbk1hcCwgTkVMRU0oc0V4dGVudGlvbk1hcCkpOwotICAgIGlmIChhZGRyKSByZXR1cm4gYWRkcjsKLQotCi0gICAgLy8gdGhpcyBwcm90ZWN0cyBhY2Nlc3NlcyB0byBzR0xFeHRlbnRpb25NYXAgYW5kIHNHTEV4dGVudGlvblNsb3QKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnNFeHRlbnNpb25NYXBNdXRleCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2luY2UgZWdsR2V0UHJvY0FkZHJlc3MoKSBpcyBub3QgYXNzb2NpYXRlZCB0byBhbnl0aGluZywgaXQgbmVlZHMKLSAgICAgICAgICogdG8gcmV0dXJuIGEgZnVuY3Rpb24gcG9pbnRlciB0aGF0ICJ3b3JrcyIgcmVnYXJkbGVzcyBvZiB3aGF0Ci0gICAgICAgICAqIHRoZSBjdXJyZW50IGNvbnRleHQgaXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEZvciB0aGlzIHJlYXNvbiwgd2UgcmV0dXJuIGEgImZvcndhcmRlciIsIGEgc21hbGwgc3R1YiB0aGF0IHRha2VzCi0gICAgICAgICAqIGNhcmUgb2YgY2FsbGluZyB0aGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0Ci0gICAgICAgICAqIGN1cnJlbnRseSBib3VuZC4KLSAgICAgICAgICoKLSAgICAgICAgICogV2UgZmlyc3QgbG9vayBmb3IgZXh0ZW5zaW9ucyB3ZSd2ZSBhbHJlYWR5IHJlc29sdmVkLCBpZiB3ZSdyZSBzZWVpbmcKLSAgICAgICAgICogdGhpcyBleHRlbnNpb24gZm9yIHRoZSBmaXJzdCB0aW1lLCB3ZSBnbyB0aHJvdWdoIGFsbCBvdXIKLSAgICAgICAgICogaW1wbGVtZW50YXRpb25zIGFuZCBjYWxsIGVnbEdldFByb2NBZGRyZXNzKCkgYW5kIHJlY29yZCB0aGUKLSAgICAgICAgICogcmVzdWx0IGluIHRoZSBhcHByb3ByaWF0ZSBpbXBsZW1lbnRhdGlvbiBob29rcyBhbmQgcmV0dXJuIHRoZQotICAgICAgICAgKiBhZGRyZXNzIG9mIHRoZSBmb3J3YXJkZXIgY29ycmVzcG9uZGluZyB0byB0aGF0IGhvb2sgc2V0LgotICAgICAgICAgKgotICAgICAgICAgKi8KLQotICAgICAgICBjb25zdCBTdHJpbmc4IG5hbWUocHJvY25hbWUpOwotICAgICAgICBhZGRyID0gc0dMRXh0ZW50aW9uTWFwLnZhbHVlRm9yKG5hbWUpOwotICAgICAgICBjb25zdCBpbnQgc2xvdCA9IHNHTEV4dGVudGlvblNsb3Q7Ci0KLSAgICAgICAgQUxPR0VfSUYoc2xvdCA+PSBNQVhfTlVNQkVSX09GX0dMX0VYVEVOU0lPTlMsCi0gICAgICAgICAgICAgICAgIm5vIG1vcmUgc2xvdHMgZm9yIGVnbEdldFByb2NBZGRyZXNzKFwiJXNcIikiLAotICAgICAgICAgICAgICAgIHByb2NuYW1lKTsKLQotI2lmIEVHTF9UUkFDRQotICAgICAgICBnbF9ob29rc190ICpkZWJ1Z0hvb2tzID0gR0xUcmFjZV9nZXRHTEhvb2tzKCk7Ci0jZW5kaWYKLQotICAgICAgICBpZiAoIWFkZHIgJiYgKHNsb3QgPCBNQVhfTlVNQkVSX09GX0dMX0VYVEVOU0lPTlMpKSB7Ci0gICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICAgICAgICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmVnbC5lZ2xHZXRQcm9jQWRkcmVzcykgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBFeHRlbnNpb25zIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgYm91bmQgY29udGV4dAotICAgICAgICAgICAgICAgIGNueC0+aG9va3NbZWdsX2Nvbm5lY3Rpb25fdDo6R0xFU3YxX0lOREVYXS0+ZXh0LmV4dGVuc2lvbnNbc2xvdF0gPQotICAgICAgICAgICAgICAgIGNueC0+aG9va3NbZWdsX2Nvbm5lY3Rpb25fdDo6R0xFU3YyX0lOREVYXS0+ZXh0LmV4dGVuc2lvbnNbc2xvdF0gPQotI2lmIEVHTF9UUkFDRQotICAgICAgICAgICAgICAgIGRlYnVnSG9va3MtPmV4dC5leHRlbnNpb25zW3Nsb3RdID0KLSAgICAgICAgICAgICAgICBnSG9va3NUcmFjZS5leHQuZXh0ZW5zaW9uc1tzbG90XSA9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNueC0+ZWdsLmVnbEdldFByb2NBZGRyZXNzKHByb2NuYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgYWRkciA9IGdFeHRlbnNpb25Gb3J3YXJkZXJzW3Nsb3RdOwotICAgICAgICAgICAgICAgIHNHTEV4dGVudGlvbk1hcC5hZGQobmFtZSwgYWRkcik7Ci0gICAgICAgICAgICAgICAgc0dMRXh0ZW50aW9uU2xvdCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc0V4dGVuc2lvbk1hcE11dGV4KTsKLSAgICByZXR1cm4gYWRkcjsKLX0KLQotRUdMQm9vbGVhbiBlZ2xTd2FwQnVmZmVycyhFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3KQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBTdXJmYWNlUmVmIF9zKGRwLCBkcmF3KTsKLSAgICBpZiAoIV9zLmdldCgpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotCi0jaWYgRUdMX1RSQUNFCi0gICAgaWYgKGdFR0xEZWJ1Z0xldmVsID4gMCkKLSAgICAgICAgR0xUcmFjZV9lZ2xTd2FwQnVmZmVycyhkcHksIGRyYXcpOwotI2VuZGlmCi0KLSAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKGRyYXcpOwotICAgIHJldHVybiBzLT5jbngtPmVnbC5lZ2xTd2FwQnVmZmVycyhkcC0+ZGlzcC5kcHksIHMtPnN1cmZhY2UpOwotfQotCi1FR0xCb29sZWFuIGVnbENvcHlCdWZmZXJzKCAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVQaXhtYXBUeXBlIHRhcmdldCkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIFN1cmZhY2VSZWYgX3MoZHAsIHN1cmZhY2UpOwotICAgIGlmICghX3MuZ2V0KCkpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci0KLSAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKHN1cmZhY2UpOwotICAgIHJldHVybiBzLT5jbngtPmVnbC5lZ2xDb3B5QnVmZmVycyhkcC0+ZGlzcC5kcHksIHMtPnN1cmZhY2UsIHRhcmdldCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGVnbFF1ZXJ5U3RyaW5nKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgbmFtZSkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkgcmV0dXJuIChjb25zdCBjaGFyICopIE5VTEw7Ci0KLSAgICBzd2l0Y2ggKG5hbWUpIHsKLSAgICAgICAgY2FzZSBFR0xfVkVORE9SOgotICAgICAgICAgICAgcmV0dXJuIGRwLT5nZXRWZW5kb3JTdHJpbmcoKTsKLSAgICAgICAgY2FzZSBFR0xfVkVSU0lPTjoKLSAgICAgICAgICAgIHJldHVybiBkcC0+Z2V0VmVyc2lvblN0cmluZygpOwotICAgICAgICBjYXNlIEVHTF9FWFRFTlNJT05TOgotICAgICAgICAgICAgcmV0dXJuIGRwLT5nZXRFeHRlbnNpb25TdHJpbmcoKTsKLSAgICAgICAgY2FzZSBFR0xfQ0xJRU5UX0FQSVM6Ci0gICAgICAgICAgICByZXR1cm4gZHAtPmdldENsaWVudEFwaVN0cmluZygpOwotICAgICAgICBjYXNlIEVHTF9WRVJTSU9OX0hXX0FORFJPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gZHAtPmRpc3AucXVlcnlTdHJpbmcudmVyc2lvbjsKLSAgICB9Ci0gICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCAoY29uc3QgY2hhciAqKTApOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVHTCAxLjEKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMQm9vbGVhbiBlZ2xTdXJmYWNlQXR0cmliKAotICAgICAgICBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgdmFsdWUpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBTdXJmYWNlUmVmIF9zKGRwLCBzdXJmYWNlKTsKLSAgICBpZiAoIV9zLmdldCgpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotCi0gICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShzdXJmYWNlKTsKLSAgICBpZiAocy0+Y254LT5lZ2wuZWdsU3VyZmFjZUF0dHJpYikgewotICAgICAgICByZXR1cm4gcy0+Y254LT5lZ2wuZWdsU3VyZmFjZUF0dHJpYigKLSAgICAgICAgICAgICAgICBkcC0+ZGlzcC5kcHksIHMtPnN1cmZhY2UsIGF0dHJpYnV0ZSwgdmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotfQotCi1FR0xCb29sZWFuIGVnbEJpbmRUZXhJbWFnZSgKLSAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcikKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIFN1cmZhY2VSZWYgX3MoZHAsIHN1cmZhY2UpOwotICAgIGlmICghX3MuZ2V0KCkpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci0KLSAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKHN1cmZhY2UpOwotICAgIGlmIChzLT5jbngtPmVnbC5lZ2xCaW5kVGV4SW1hZ2UpIHsKLSAgICAgICAgcmV0dXJuIHMtPmNueC0+ZWdsLmVnbEJpbmRUZXhJbWFnZSgKLSAgICAgICAgICAgICAgICBkcC0+ZGlzcC5kcHksIHMtPnN1cmZhY2UsIGJ1ZmZlcik7Ci0gICAgfQotICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsUmVsZWFzZVRleEltYWdlKAotICAgICAgICBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYnVmZmVyKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgU3VyZmFjZVJlZiBfcyhkcCwgc3VyZmFjZSk7Ci0gICAgaWYgKCFfcy5nZXQoKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLQotICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiBjb25zdCBzID0gZ2V0X3N1cmZhY2Uoc3VyZmFjZSk7Ci0gICAgaWYgKHMtPmNueC0+ZWdsLmVnbFJlbGVhc2VUZXhJbWFnZSkgewotICAgICAgICByZXR1cm4gcy0+Y254LT5lZ2wuZWdsUmVsZWFzZVRleEltYWdlKAotICAgICAgICAgICAgICAgIGRwLT5kaXNwLmRweSwgcy0+c3VyZmFjZSwgYnVmZmVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xTd2FwSW50ZXJ2YWwoRUdMRGlzcGxheSBkcHksIEVHTGludCBpbnRlcnZhbCkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX1RSVUU7Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmVnbC5lZ2xTd2FwSW50ZXJ2YWwpIHsKLSAgICAgICAgcmVzID0gY254LT5lZ2wuZWdsU3dhcEludGVydmFsKGRwLT5kaXNwLmRweSwgaW50ZXJ2YWwpOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRUdMIDEuMgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FR0xCb29sZWFuIGVnbFdhaXRDbGllbnQodm9pZCkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKCFjbngtPmRzbykKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKLQotICAgIEVHTEJvb2xlYW4gcmVzOwotICAgIGlmIChjbngtPmVnbC5lZ2xXYWl0Q2xpZW50KSB7Ci0gICAgICAgIHJlcyA9IGNueC0+ZWdsLmVnbFdhaXRDbGllbnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBjbngtPmVnbC5lZ2xXYWl0R0woKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotRUdMQm9vbGVhbiBlZ2xCaW5kQVBJKEVHTGVudW0gYXBpKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGlmIChlZ2xfaW5pdF9kcml2ZXJzKCkgPT0gRUdMX0ZBTFNFKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKLSAgICB9Ci0KLSAgICAvLyBiaW5kIHRoaXMgQVBJIG9uIGFsbCBFR0xzCi0gICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfVFJVRTsKLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvICYmIGNueC0+ZWdsLmVnbEJpbmRBUEkpIHsKLSAgICAgICAgcmVzID0gY254LT5lZ2wuZWdsQmluZEFQSShhcGkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi1FR0xlbnVtIGVnbFF1ZXJ5QVBJKHZvaWQpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgaWYgKGVnbF9pbml0X2RyaXZlcnMoKSA9PSBFR0xfRkFMU0UpIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOwotICAgIH0KLQotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoY254LT5kc28gJiYgY254LT5lZ2wuZWdsUXVlcnlBUEkpIHsKLSAgICAgICAgcmV0dXJuIGNueC0+ZWdsLmVnbFF1ZXJ5QVBJKCk7Ci0gICAgfQotCi0gICAgLy8gb3IsIGl0IGNhbiBvbmx5IGJlIE9wZW5HTCBFUwotICAgIHJldHVybiBFR0xfT1BFTkdMX0VTX0FQSTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xSZWxlYXNlVGhyZWFkKHZvaWQpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgLy8gSWYgdGhlcmUgaXMgY29udGV4dCBib3VuZCB0byB0aGUgdGhyZWFkLCByZWxlYXNlIGl0Ci0gICAgZWdsX2Rpc3BsYXlfdDo6bG9zZUN1cnJlbnQoZ2V0X2NvbnRleHQoZ2V0Q29udGV4dCgpKSk7Ci0KLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvICYmIGNueC0+ZWdsLmVnbFJlbGVhc2VUaHJlYWQpIHsKLSAgICAgICAgY254LT5lZ2wuZWdsUmVsZWFzZVRocmVhZCgpOwotICAgIH0KLQotICAgIGVnbF90bHNfdDo6Y2xlYXJUTFMoKTsKLSNpZiBFR0xfVFJBQ0UKLSAgICBpZiAoZ0VHTERlYnVnTGV2ZWwgPiAwKQotICAgICAgICBHTFRyYWNlX2VnbFJlbGVhc2VUaHJlYWQoKTsKLSNlbmRpZgotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotRUdMU3VyZmFjZSBlZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlcigKLSAgICAgICAgICBFR0xEaXNwbGF5IGRweSwgRUdMZW51bSBidWZ0eXBlLCBFR0xDbGllbnRCdWZmZXIgYnVmZmVyLAotICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAgPSAwOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNueCA9IHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKGRweSwgY29uZmlnLCBkcCk7Ci0gICAgaWYgKCFjbngpIHJldHVybiBFR0xfRkFMU0U7Ci0gICAgaWYgKGNueC0+ZWdsLmVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBjbngtPmVnbC5lZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlcigKLSAgICAgICAgICAgICAgICBkcC0+ZGlzcC5kcHksIGJ1ZnR5cGUsIGJ1ZmZlciwgY29uZmlnLCBhdHRyaWJfbGlzdCk7Ci0gICAgfQotICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTkZJRywgRUdMX05PX1NVUkZBQ0UpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFR0xfRUdMRVhUX1ZFUlNJT04gMwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FR0xCb29sZWFuIGVnbExvY2tTdXJmYWNlS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCi0gICAgICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBTdXJmYWNlUmVmIF9zKGRwLCBzdXJmYWNlKTsKLSAgICBpZiAoIV9zLmdldCgpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotCi0gICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShzdXJmYWNlKTsKLSAgICBpZiAocy0+Y254LT5lZ2wuZWdsTG9ja1N1cmZhY2VLSFIpIHsKLSAgICAgICAgcmV0dXJuIHMtPmNueC0+ZWdsLmVnbExvY2tTdXJmYWNlS0hSKAotICAgICAgICAgICAgICAgIGRwLT5kaXNwLmRweSwgcy0+c3VyZmFjZSwgYXR0cmliX2xpc3QpOwotICAgIH0KLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotfQotCi1FR0xCb29sZWFuIGVnbFVubG9ja1N1cmZhY2VLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIFN1cmZhY2VSZWYgX3MoZHAsIHN1cmZhY2UpOwotICAgIGlmICghX3MuZ2V0KCkpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci0KLSAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKHN1cmZhY2UpOwotICAgIGlmIChzLT5jbngtPmVnbC5lZ2xVbmxvY2tTdXJmYWNlS0hSKSB7Ci0gICAgICAgIHJldHVybiBzLT5jbngtPmVnbC5lZ2xVbmxvY2tTdXJmYWNlS0hSKGRwLT5kaXNwLmRweSwgcy0+c3VyZmFjZSk7Ci0gICAgfQotICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci19Ci0KLUVHTEltYWdlS0hSIGVnbENyZWF0ZUltYWdlS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMZW51bSB0YXJnZXQsCi0gICAgICAgIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfTk9fSU1BR0VfS0hSOwotCi0gICAgQ29udGV4dFJlZiBfYyhkcCwgY3R4KTsKLSAgICBlZ2xfY29udGV4dF90ICogY29uc3QgYyA9IF9jLmdldCgpOwotCi0gICAgRUdMSW1hZ2VLSFIgcmVzdWx0ID0gRUdMX05PX0lNQUdFX0tIUjsKLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvICYmIGNueC0+ZWdsLmVnbENyZWF0ZUltYWdlS0hSKSB7Ci0gICAgICAgIHJlc3VsdCA9IGNueC0+ZWdsLmVnbENyZWF0ZUltYWdlS0hSKAotICAgICAgICAgICAgICAgIGRwLT5kaXNwLmRweSwKLSAgICAgICAgICAgICAgICBjID8gYy0+Y29udGV4dCA6IEVHTF9OT19DT05URVhULAotICAgICAgICAgICAgICAgIHRhcmdldCwgYnVmZmVyLCBhdHRyaWJfbGlzdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsRGVzdHJveUltYWdlS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xJbWFnZUtIUiBpbWcpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvICYmIGNueC0+ZWdsLmVnbERlc3Ryb3lJbWFnZUtIUikgewotICAgICAgICBjbngtPmVnbC5lZ2xEZXN0cm95SW1hZ2VLSFIoZHAtPmRpc3AuZHB5LCBpbWcpOwotICAgIH0KLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVHTF9FR0xFWFRfVkVSU0lPTiA1Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotRUdMU3luY0tIUiBlZ2xDcmVhdGVTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIHR5cGUsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfTk9fU1lOQ19LSFI7Ci0KLSAgICBFR0xTeW5jS0hSIHJlc3VsdCA9IEVHTF9OT19TWU5DX0tIUjsKLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvICYmIGNueC0+ZWdsLmVnbENyZWF0ZVN5bmNLSFIpIHsKLSAgICAgICAgcmVzdWx0ID0gY254LT5lZ2wuZWdsQ3JlYXRlU3luY0tIUihkcC0+ZGlzcC5kcHksIHR5cGUsIGF0dHJpYl9saXN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRUdMQm9vbGVhbiBlZ2xEZXN0cm95U3luY0tIUihFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgRUdMQm9vbGVhbiByZXN1bHQgPSBFR0xfRkFMU0U7Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmVnbC5lZ2xEZXN0cm95U3luY0tIUikgewotICAgICAgICByZXN1bHQgPSBjbngtPmVnbC5lZ2xEZXN0cm95U3luY0tIUihkcC0+ZGlzcC5kcHksIHN5bmMpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1FR0xpbnQgZWdsQ2xpZW50V2FpdFN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywKLSAgICAgICAgRUdMaW50IGZsYWdzLCBFR0xUaW1lS0hSIHRpbWVvdXQpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBFR0xCb29sZWFuIHJlc3VsdCA9IEVHTF9GQUxTRTsKLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvICYmIGNueC0+ZWdsLmVnbENsaWVudFdhaXRTeW5jS0hSKSB7Ci0gICAgICAgIHJlc3VsdCA9IGNueC0+ZWdsLmVnbENsaWVudFdhaXRTeW5jS0hSKAotICAgICAgICAgICAgICAgIGRwLT5kaXNwLmRweSwgc3luYywgZmxhZ3MsIHRpbWVvdXQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1FR0xCb29sZWFuIGVnbEdldFN5bmNBdHRyaWJLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywKLSAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIEVHTEJvb2xlYW4gcmVzdWx0ID0gRUdMX0ZBTFNFOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoY254LT5kc28gJiYgY254LT5lZ2wuZWdsR2V0U3luY0F0dHJpYktIUikgewotICAgICAgICByZXN1bHQgPSBjbngtPmVnbC5lZ2xHZXRTeW5jQXR0cmliS0hSKAotICAgICAgICAgICAgICAgIGRwLT5kaXNwLmRweSwgc3luYywgYXR0cmlidXRlLCB2YWx1ZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEFORFJPSUQgZXh0ZW5zaW9ucwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKiBBTkRST0lEIGV4dGVuc2lvbnMgZW50cnktcG9pbnQgZ28gaGVyZSAqLwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBOVklESUEgZXh0ZW5zaW9ucwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRUdMdWludDY0TlYgZWdsR2V0U3lzdGVtVGltZUZyZXF1ZW5jeU5WKCkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBpZiAoZWdsX2luaXRfZHJpdmVycygpID09IEVHTF9GQUxTRSkgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Ci0gICAgfQotCi0gICAgRUdMdWludDY0TlYgcmV0ID0gMDsKLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0KLSAgICBpZiAoY254LT5kc28gJiYgY254LT5lZ2wuZWdsR2V0U3lzdGVtVGltZUZyZXF1ZW5jeU5WKSB7Ci0gICAgICAgIHJldHVybiBjbngtPmVnbC5lZ2xHZXRTeXN0ZW1UaW1lRnJlcXVlbmN5TlYoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2V0RXJyb3JRdWlldChFR0xfQkFEX0RJU1BMQVksIDApOwotfQotCi1FR0x1aW50NjROViBlZ2xHZXRTeXN0ZW1UaW1lTlYoKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGlmIChlZ2xfaW5pdF9kcml2ZXJzKCkgPT0gRUdMX0ZBTFNFKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKLSAgICB9Ci0KLSAgICBFR0x1aW50NjROViByZXQgPSAwOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLQotICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmVnbC5lZ2xHZXRTeXN0ZW1UaW1lTlYpIHsKLSAgICAgICAgcmV0dXJuIGNueC0+ZWdsLmVnbEdldFN5c3RlbVRpbWVOVigpOwotICAgIH0KLQotICAgIHJldHVybiBzZXRFcnJvclF1aWV0KEVHTF9CQURfRElTUExBWSwgMCk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsX2NhY2hlLmNwcCBiL29wZW5nbC9saWJzL0VHTC9lZ2xfY2FjaGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzlmYjVmLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0VHTC9lZ2xfY2FjaGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZWdsX2NhY2hlLmgiCi0jaW5jbHVkZSAiZWdsX2Rpc3BsYXkuaCIKLSNpbmNsdWRlICJlZ2xfaW1wbC5oIgotI2luY2x1ZGUgImVnbGRlZnMuaCIKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaWZuZGVmIE1BWF9FR0xfQ0FDSEVfRU5UUllfU0laRQotI2RlZmluZSBNQVhfRUdMX0NBQ0hFX0VOVFJZX1NJWkUgKDE2ICogMTAyNCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBNQVhfRUdMX0NBQ0hFX1NJWkUKLSNkZWZpbmUgTUFYX0VHTF9DQUNIRV9TSVpFICg2NCAqIDEwMjQpOwotI2VuZGlmCi0KLS8vIENhY2hlIHNpemUgbGltaXRzLgotc3RhdGljIGNvbnN0IHNpemVfdCBtYXhLZXlTaXplID0gMTAyNDsKLXN0YXRpYyBjb25zdCBzaXplX3QgbWF4VmFsdWVTaXplID0gTUFYX0VHTF9DQUNIRV9FTlRSWV9TSVpFOwotc3RhdGljIGNvbnN0IHNpemVfdCBtYXhUb3RhbFNpemUgPSBNQVhfRUdMX0NBQ0hFX1NJWkU7Ci0KLS8vIENhY2hlIGZpbGUgaGVhZGVyCi1zdGF0aWMgY29uc3QgY2hhciogY2FjaGVGaWxlTWFnaWMgPSAiRUdMJCI7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGNhY2hlRmlsZUhlYWRlclNpemUgPSA4OwotCi0vLyBUaGUgdGltZSBpbiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHNhdmluZyBuZXdseSBpbnNlcnRlZCBjYWNoZSBlbnRyaWVzLgotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkZWZlcnJlZFNhdmVEZWxheSA9IDQ7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2RlZmluZSBCQ19FWFRfU1RSICJFR0xfQU5EUk9JRF9ibG9iX2NhY2hlIgotCi0vLwotLy8gQ2FsbGJhY2sgZnVuY3Rpb25zIHBhc3NlZCB0byBFR0wuCi0vLwotc3RhdGljIHZvaWQgc2V0QmxvYihjb25zdCB2b2lkKiBrZXksIEVHTHNpemVpQU5EUk9JRCBrZXlTaXplLAotICAgICAgICBjb25zdCB2b2lkKiB2YWx1ZSwgRUdMc2l6ZWlBTkRST0lEIHZhbHVlU2l6ZSkgewotICAgIGVnbF9jYWNoZV90OjpnZXQoKS0+c2V0QmxvYihrZXksIGtleVNpemUsIHZhbHVlLCB2YWx1ZVNpemUpOwotfQotCi1zdGF0aWMgRUdMc2l6ZWlBTkRST0lEIGdldEJsb2IoY29uc3Qgdm9pZCoga2V5LCBFR0xzaXplaUFORFJPSUQga2V5U2l6ZSwKLSAgICAgICAgdm9pZCogdmFsdWUsIEVHTHNpemVpQU5EUk9JRCB2YWx1ZVNpemUpIHsKLSAgICByZXR1cm4gZWdsX2NhY2hlX3Q6OmdldCgpLT5nZXRCbG9iKGtleSwga2V5U2l6ZSwgdmFsdWUsIHZhbHVlU2l6ZSk7Ci19Ci0KLS8vCi0vLyBlZ2xfY2FjaGVfdCBkZWZpbml0aW9uCi0vLwotZWdsX2NhY2hlX3Q6OmVnbF9jYWNoZV90KCkgOgotICAgICAgICBtSW5pdGlhbGl6ZWQoZmFsc2UpLAotICAgICAgICBtQmxvYkNhY2hlKE5VTEwpIHsKLX0KLQotZWdsX2NhY2hlX3Q6On5lZ2xfY2FjaGVfdCgpIHsKLX0KLQotZWdsX2NhY2hlX3QgZWdsX2NhY2hlX3Q6OnNDYWNoZTsKLQotZWdsX2NhY2hlX3QqIGVnbF9jYWNoZV90OjpnZXQoKSB7Ci0gICAgcmV0dXJuICZzQ2FjaGU7Ci19Ci0KLXZvaWQgZWdsX2NhY2hlX3Q6OmluaXRpYWxpemUoZWdsX2Rpc3BsYXlfdCAqZGlzcGxheSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvICYmIGNueC0+bWFqb3IgPj0gMCAmJiBjbngtPm1pbm9yID49IDApIHsKLSAgICAgICAgY29uc3QgY2hhciogZXh0cyA9IGRpc3BsYXktPmRpc3AucXVlcnlTdHJpbmcuZXh0ZW5zaW9uczsKLSAgICAgICAgc2l6ZV90IGJjRXh0TGVuID0gc3RybGVuKEJDX0VYVF9TVFIpOwotICAgICAgICBzaXplX3QgZXh0c0xlbiA9IHN0cmxlbihleHRzKTsKLSAgICAgICAgYm9vbCBlcXVhbCA9ICFzdHJjbXAoQkNfRVhUX1NUUiwgZXh0cyk7Ci0gICAgICAgIGJvb2wgYXRTdGFydCA9ICFzdHJuY21wKEJDX0VYVF9TVFIgIiAiLCBleHRzLCBiY0V4dExlbisxKTsKLSAgICAgICAgYm9vbCBhdEVuZCA9IChiY0V4dExlbisxKSA8IGV4dHNMZW4gJiYKLSAgICAgICAgICAgICAgICAhc3RyY21wKCIgIiBCQ19FWFRfU1RSLCBleHRzICsgZXh0c0xlbiAtIChiY0V4dExlbisxKSk7Ci0gICAgICAgIGJvb2wgaW5NaWRkbGUgPSBzdHJzdHIoZXh0cywgIiAiIEJDX0VYVF9TVFIgIiAiKTsKLSAgICAgICAgaWYgKGVxdWFsIHx8IGF0U3RhcnQgfHwgYXRFbmQgfHwgaW5NaWRkbGUpIHsKLSAgICAgICAgICAgIFBGTkVHTFNFVEJMT0JDQUNIRUZVTkNTQU5EUk9JRFBST0MgZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEOwotICAgICAgICAgICAgZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEID0KLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQRk5FR0xTRVRCTE9CQ0FDSEVGVU5DU0FORFJPSURQUk9DPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbngtPmVnbC5lZ2xHZXRQcm9jQWRkcmVzcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlZ2xTZXRCbG9iQ2FjaGVGdW5jc0FORFJPSUQiKSk7Ci0gICAgICAgICAgICBpZiAoZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRUdMX0FORFJPSURfYmxvYl9jYWNoZSBhZHZlcnRpc2VkLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHVuYWJsZSB0byBnZXQgZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlZ2xTZXRCbG9iQ2FjaGVGdW5jc0FORFJPSUQoZGlzcGxheS0+ZGlzcC5kcHksCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnNldEJsb2IsIGFuZHJvaWQ6OmdldEJsb2IpOwotICAgICAgICAgICAgRUdMaW50IGVyciA9IGNueC0+ZWdsLmVnbEdldEVycm9yKCk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IEVHTF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImVnbFNldEJsb2JDYWNoZUZ1bmNzQU5EUk9JRCByZXN1bHRlZCBpbiBhbiBlcnJvcjogIgotICAgICAgICAgICAgICAgICAgICAgICAgIiUjeCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwotfQotCi12b2lkIGVnbF9jYWNoZV90Ojp0ZXJtaW5hdGUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBpZiAobUJsb2JDYWNoZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNhdmVCbG9iQ2FjaGVMb2NrZWQoKTsKLSAgICAgICAgbUJsb2JDYWNoZSA9IE5VTEw7Ci0gICAgfQotICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOwotfQotCi12b2lkIGVnbF9jYWNoZV90OjpzZXRCbG9iKGNvbnN0IHZvaWQqIGtleSwgRUdMc2l6ZWlBTkRST0lEIGtleVNpemUsCi0gICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlLCBFR0xzaXplaUFORFJPSUQgdmFsdWVTaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIGlmIChrZXlTaXplIDwgMCB8fCB2YWx1ZVNpemUgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJFR0xfQU5EUk9JRF9ibG9iX2NhY2hlIHNldDogbmVnYXRpdmUgc2l6ZXMgYXJlIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUluaXRpYWxpemVkKSB7Ci0gICAgICAgIHNwPEJsb2JDYWNoZT4gYmMgPSBnZXRCbG9iQ2FjaGVMb2NrZWQoKTsKLSAgICAgICAgYmMtPnNldChrZXksIGtleVNpemUsIHZhbHVlLCB2YWx1ZVNpemUpOwotCi0gICAgICAgIGlmICghbVNhdmVQZW5kaW5nKSB7Ci0gICAgICAgICAgICBjbGFzcyBEZWZlcnJlZFNhdmVUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICBEZWZlcnJlZFNhdmVUaHJlYWQoKSA6IFRocmVhZChmYWxzZSkge30KLQotICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgewotICAgICAgICAgICAgICAgICAgICBzbGVlcChkZWZlcnJlZFNhdmVEZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgIGVnbF9jYWNoZV90KiBjID0gZWdsX2NhY2hlX3Q6OmdldCgpOwotICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhjLT5tTXV0ZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYy0+bUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5zYXZlQmxvYkNhY2hlTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYy0+bVNhdmVQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAvLyBUaGUgdGhyZWFkIHdpbGwgaG9sZCBhIHN0cm9uZyByZWYgdG8gaXRzZWxmIHVudGlsIGl0IGhhcyBmaW5pc2hlZAotICAgICAgICAgICAgLy8gcnVubmluZywgc28gdGhlcmUncyBubyBuZWVkIHRvIGtlZXAgYSByZWYgYXJvdW5kLgotICAgICAgICAgICAgc3A8VGhyZWFkPiBkZWZlcnJlZFNhdmVUaHJlYWQobmV3IERlZmVycmVkU2F2ZVRocmVhZCgpKTsKLSAgICAgICAgICAgIG1TYXZlUGVuZGluZyA9IHRydWU7Ci0gICAgICAgICAgICBkZWZlcnJlZFNhdmVUaHJlYWQtPnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1FR0xzaXplaUFORFJPSUQgZWdsX2NhY2hlX3Q6OmdldEJsb2IoY29uc3Qgdm9pZCoga2V5LCBFR0xzaXplaUFORFJPSUQga2V5U2l6ZSwKLSAgICAgICAgdm9pZCogdmFsdWUsIEVHTHNpemVpQU5EUk9JRCB2YWx1ZVNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKGtleVNpemUgPCAwIHx8IHZhbHVlU2l6ZSA8IDApIHsKLSAgICAgICAgQUxPR1coIkVHTF9BTkRST0lEX2Jsb2JfY2FjaGUgc2V0OiBuZWdhdGl2ZSBzaXplcyBhcmUgbm90IGFsbG93ZWQiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICBzcDxCbG9iQ2FjaGU+IGJjID0gZ2V0QmxvYkNhY2hlTG9ja2VkKCk7Ci0gICAgICAgIHJldHVybiBiYy0+Z2V0KGtleSwga2V5U2l6ZSwgdmFsdWUsIHZhbHVlU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIGVnbF9jYWNoZV90OjpzZXRDYWNoZUZpbGVuYW1lKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBtRmlsZW5hbWUgPSBmaWxlbmFtZTsKLX0KLQotc3A8QmxvYkNhY2hlPiBlZ2xfY2FjaGVfdDo6Z2V0QmxvYkNhY2hlTG9ja2VkKCkgewotICAgIGlmIChtQmxvYkNhY2hlID09IE5VTEwpIHsKLSAgICAgICAgbUJsb2JDYWNoZSA9IG5ldyBCbG9iQ2FjaGUobWF4S2V5U2l6ZSwgbWF4VmFsdWVTaXplLCBtYXhUb3RhbFNpemUpOwotICAgICAgICBsb2FkQmxvYkNhY2hlTG9ja2VkKCk7Ci0gICAgfQotICAgIHJldHVybiBtQmxvYkNhY2hlOwotfQotCi1zdGF0aWMgdWludDMyX3QgY3JjMzJjKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IGxlbikgewotICAgIGNvbnN0IHVpbnQzMl90IHBvbHlCaXRzID0gMHg4MkY2M0I3ODsKLSAgICB1aW50MzJfdCByID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIHIgXj0gYnVmW2ldOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7IGorKykgewotICAgICAgICAgICAgaWYgKHIgJiAxKSB7Ci0gICAgICAgICAgICAgICAgciA9IChyID4+IDEpIF4gcG9seUJpdHM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHIgPj49IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHI7Ci19Ci0KLXZvaWQgZWdsX2NhY2hlX3Q6OnNhdmVCbG9iQ2FjaGVMb2NrZWQoKSB7Ci0gICAgaWYgKG1GaWxlbmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgc2l6ZV90IGNhY2hlU2l6ZSA9IG1CbG9iQ2FjaGUtPmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICAgICAgc2l6ZV90IGhlYWRlclNpemUgPSBjYWNoZUZpbGVIZWFkZXJTaXplOwotICAgICAgICBjb25zdCBjaGFyKiBmbmFtZSA9IG1GaWxlbmFtZS5zdHJpbmcoKTsKLQotICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIHRoZSBmaWxlIHdpdGggbm8gcGVybWlzc2lvbnMgc28gd2UgY2FuIHdyaXRlIGl0Ci0gICAgICAgIC8vIHdpdGhvdXQgYW55b25lIHRyeWluZyB0byByZWFkIGl0LgotICAgICAgICBpbnQgZmQgPSBvcGVuKGZuYW1lLCBPX0NSRUFUIHwgT19FWENMIHwgT19SRFdSLCAwKTsKLSAgICAgICAgaWYgKGZkID09IC0xKSB7Ci0gICAgICAgICAgICBpZiAoZXJybm8gPT0gRUVYSVNUKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGZpbGUgZXhpc3RzLCBkZWxldGUgaXQgYW5kIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICBpZiAodW5saW5rKGZuYW1lKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBObyBwb2ludCBpbiByZXRyeWluZyBpZiB0aGUgdW5saW5rIGZhaWxlZC4KLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yIHVubGlua2luZyBjYWNoZSBmaWxlICVzOiAlcyAoJWQpIiwgZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gUmV0cnkgbm93IHRoYXQgd2UndmUgdW5saW5rZWQgdGhlIGZpbGUuCi0gICAgICAgICAgICAgICAgZmQgPSBvcGVuKGZuYW1lLCBPX0NSRUFUIHwgT19FWENMIHwgT19SRFdSLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvciBjcmVhdGluZyBjYWNoZSBmaWxlICVzOiAlcyAoJWQpIiwgZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgZmlsZVNpemUgPSBoZWFkZXJTaXplICsgY2FjaGVTaXplOwotICAgICAgICBpZiAoZnRydW5jYXRlKGZkLCBmaWxlU2l6ZSkgPT0gLTEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBzZXR0aW5nIGNhY2hlIGZpbGUgc2l6ZTogJXMgKCVkKSIsIHN0cmVycm9yKGVycm5vKSwKLSAgICAgICAgICAgICAgICAgICAgZXJybm8pOwotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICAgICAgdW5saW5rKGZuYW1lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQ4X3QqIGJ1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1tYXAoTlVMTCwgZmlsZVNpemUsCi0gICAgICAgICAgICAgICAgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApKTsKLSAgICAgICAgaWYgKGJ1ZiA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgbW1hcGluZyBjYWNoZSBmaWxlOiAlcyAoJWQpIiwgc3RyZXJyb3IoZXJybm8pLAotICAgICAgICAgICAgICAgICAgICBlcnJubyk7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICB1bmxpbmsoZm5hbWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJsb2JDYWNoZS0+ZmxhdHRlbihidWYgKyBoZWFkZXJTaXplLCBjYWNoZVNpemUsIE5VTEwsCi0gICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciB3cml0aW5nIGNhY2hlIGNvbnRlbnRzOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCi0gICAgICAgICAgICAgICAgICAgIC1lcnIpOwotICAgICAgICAgICAgbXVubWFwKGJ1ZiwgZmlsZVNpemUpOwotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICAgICAgdW5saW5rKGZuYW1lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdyaXRlIHRoZSBmaWxlIG1hZ2ljIGFuZCBDUkMKLSAgICAgICAgbWVtY3B5KGJ1ZiwgY2FjaGVGaWxlTWFnaWMsIDQpOwotICAgICAgICB1aW50MzJfdCogY3JjID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KGJ1ZiArIDQpOwotICAgICAgICAqY3JjID0gY3JjMzJjKGJ1ZiArIGhlYWRlclNpemUsIGNhY2hlU2l6ZSk7Ci0KLSAgICAgICAgbXVubWFwKGJ1ZiwgZmlsZVNpemUpOwotICAgICAgICBmY2htb2QoZmQsIFNfSVJVU1IpOwotICAgICAgICBjbG9zZShmZCk7Ci0gICAgfQotfQotCi12b2lkIGVnbF9jYWNoZV90Ojpsb2FkQmxvYkNhY2hlTG9ja2VkKCkgewotICAgIGlmIChtRmlsZW5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBoZWFkZXJTaXplID0gY2FjaGVGaWxlSGVhZGVyU2l6ZTsKLQotICAgICAgICBpbnQgZmQgPSBvcGVuKG1GaWxlbmFtZS5zdHJpbmcoKSwgT19SRE9OTFksIDApOwotICAgICAgICBpZiAoZmQgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3Igb3BlbmluZyBjYWNoZSBmaWxlICVzOiAlcyAoJWQpIiwgbUZpbGVuYW1lLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0QnVmOwotICAgICAgICBpZiAoZnN0YXQoZmQsICZzdGF0QnVmKSA9PSAtMSkgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIHN0YXQnaW5nIGNhY2hlIGZpbGU6ICVzICglZCkiLCBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNhbml0eSBjaGVjayB0aGUgc2l6ZSBiZWZvcmUgdHJ5aW5nIHRvIG1tYXAgaXQuCi0gICAgICAgIHNpemVfdCBmaWxlU2l6ZSA9IHN0YXRCdWYuc3Rfc2l6ZTsKLSAgICAgICAgaWYgKGZpbGVTaXplID4gbWF4VG90YWxTaXplICogMikgewotICAgICAgICAgICAgQUxPR0UoImNhY2hlIGZpbGUgaXMgdG9vIGxhcmdlOiAlI2xseCIsIHN0YXRCdWYuc3Rfc2l6ZSk7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50OF90KiBidWYgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtbWFwKE5VTEwsIGZpbGVTaXplLAotICAgICAgICAgICAgICAgIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKSk7Ci0gICAgICAgIGlmIChidWYgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIG1tYXBpbmcgY2FjaGUgZmlsZTogJXMgKCVkKSIsIHN0cmVycm9yKGVycm5vKSwKLSAgICAgICAgICAgICAgICAgICAgZXJybm8pOwotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIGZpbGUgbWFnaWMgYW5kIENSQwotICAgICAgICBzaXplX3QgY2FjaGVTaXplID0gZmlsZVNpemUgLSBoZWFkZXJTaXplOwotICAgICAgICBpZiAobWVtY21wKGJ1ZiwgY2FjaGVGaWxlTWFnaWMsIDQpICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJjYWNoZSBmaWxlIGhhcyBiYWQgbW9qbyIpOwotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90KiBjcmMgPSByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oYnVmICsgNCk7Ci0gICAgICAgIGlmIChjcmMzMmMoYnVmICsgaGVhZGVyU2l6ZSwgY2FjaGVTaXplKSAhPSAqY3JjKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY2FjaGUgZmlsZSBmYWlsZWQgQ1JDIGNoZWNrIik7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQmxvYkNhY2hlLT51bmZsYXR0ZW4oYnVmICsgaGVhZGVyU2l6ZSwgY2FjaGVTaXplLCBOVUxMLAotICAgICAgICAgICAgICAgIDApOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcmVhZGluZyBjYWNoZSBjb250ZW50czogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAotICAgICAgICAgICAgICAgICAgICAtZXJyKTsKLSAgICAgICAgICAgIG11bm1hcChidWYsIGZpbGVTaXplKTsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG11bm1hcChidWYsIGZpbGVTaXplKTsKLSAgICAgICAgY2xvc2UoZmQpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2xfY2FjaGUuaCBiL29wZW5nbC9saWJzL0VHTC9lZ2xfY2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc2MDAwOS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsX2NhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FR0xfQ0FDSEVfSAotI2RlZmluZSBBTkRST0lEX0VHTF9DQUNIRV9ICi0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvQmxvYkNhY2hlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBlZ2xfZGlzcGxheV90OwotCi1jbGFzcyBFR0xBUEkgZWdsX2NhY2hlX3QgewotcHVibGljOgotCi0gICAgLy8gZ2V0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzaW5nbGV0b24gZWdsX2NhY2hlX3Qgb2JqZWN0LiAgVGhpcwotICAgIC8vIHNpbmdsZXRvbiBvYmplY3Qgd2lsbCBuZXZlciBiZSBkZXN0cm95ZWQuCi0gICAgc3RhdGljIGVnbF9jYWNoZV90KiBnZXQoKTsKLQotICAgIC8vIGluaXRpYWxpemUgcHV0cyB0aGUgZWdsX2NhY2hlX3QgaW50byBhbiBpbml0aWFsaXplZCBzdGF0ZSwgc3VjaCB0aGF0IGl0Ci0gICAgLy8gaXMgYWJsZSB0byBpbnNlcnQgYW5kIHJldHJpZXZlIGVudHJpZXMgZnJvbSB0aGUgY2FjaGUuICBUaGlzIHNob3VsZCBiZQotICAgIC8vIGNhbGxlZCB3aGVuIEVHTCBpcyBpbml0aWFsaXplZC4gIFdoZW4gbm90IGluIHRoZSBpbml0aWFsaXplZCBzdGF0ZSB0aGUKLSAgICAvLyBnZXRCbG9iIGFuZCBzZXRCbG9iIG1ldGhvZHMgd2lsbCByZXR1cm4gd2l0aG91dCBwZXJmb3JtaW5nIGFueSBjYWNoZQotICAgIC8vIG9wZXJhdGlvbnMuCi0gICAgdm9pZCBpbml0aWFsaXplKGVnbF9kaXNwbGF5X3QqIGRpc3BsYXkpOwotCi0gICAgLy8gdGVybWluYXRlIHB1dHMgdGhlIGVnbF9jYWNoZV90IGJhY2sgaW50byB0aGUgdW5pbml0aWFsaXplZCBzdGF0ZS4gIFdoZW4KLSAgICAvLyBpbiB0aGlzIHN0YXRlIHRoZSBnZXRCbG9iIGFuZCBzZXRCbG9iIG1ldGhvZHMgd2lsbCByZXR1cm4gd2l0aG91dAotICAgIC8vIHBlcmZvcm1pbmcgYW55IGNhY2hlIG9wZXJhdGlvbnMuCi0gICAgdm9pZCB0ZXJtaW5hdGUoKTsKLQotICAgIC8vIHNldEJsb2IgYXR0ZW1wdHMgdG8gaW5zZXJ0IGEgbmV3IGtleS92YWx1ZSBibG9iIHBhaXIgaW50byB0aGUgY2FjaGUuCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBieSB0aGUgaGFyZHdhcmUgdmVuZG9yJ3MgRUdMIGltcGxlbWVudGF0aW9uIHZpYSB0aGUKLSAgICAvLyBFR0xfQU5EUk9JRF9ibG9iX2NhY2hlIGV4dGVuc2lvbi4KLSAgICB2b2lkIHNldEJsb2IoY29uc3Qgdm9pZCoga2V5LCBFR0xzaXplaUFORFJPSUQga2V5U2l6ZSwgY29uc3Qgdm9pZCogdmFsdWUsCi0gICAgICAgIEVHTHNpemVpQU5EUk9JRCB2YWx1ZVNpemUpOwotCi0gICAgLy8gZ2V0QmxvYiBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYmxvYiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBrZXkKLSAgICAvLyBibG9iIGZyb20gY2FjaGUuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBoYXJkd2FyZSB2ZW5kb3IncyBFR0wKLSAgICAvLyBpbXBsZW1lbnRhdGlvbiB2aWEgdGhlIEVHTF9BTkRST0lEX2Jsb2JfY2FjaGUgZXh0ZW5zaW9uLgotICAgIEVHTHNpemVpQU5EUk9JRCBnZXRCbG9iKGNvbnN0IHZvaWQqIGtleSwgRUdMc2l6ZWlBTkRST0lEIGtleVNpemUsCi0gICAgICAgIHZvaWQqIHZhbHVlLCBFR0xzaXplaUFORFJPSUQgdmFsdWVTaXplKTsKLQotICAgIC8vIHNldENhY2hlRmlsZW5hbWUgc2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHN0b3JlCi0gICAgLy8gY2FjaGUgY29udGVudHMgZnJvbSBvbmUgcHJvZ3JhbSBpbnZvY2F0aW9uIHRvIGFub3RoZXIuCi0gICAgdm9pZCBzZXRDYWNoZUZpbGVuYW1lKGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKLQotcHJpdmF0ZToKLSAgICAvLyBDcmVhdGlvbiBhbmQgKHRoZSBsYWNrIG9mKSBkZXN0cnVjdGlvbiBpcyBoYW5kbGVkIGludGVybmFsbHkuCi0gICAgZWdsX2NhY2hlX3QoKTsKLSAgICB+ZWdsX2NhY2hlX3QoKTsKLQotICAgIC8vIENvcHlpbmcgaXMgZGlzYWxsb3dlZC4KLSAgICBlZ2xfY2FjaGVfdChjb25zdCBlZ2xfY2FjaGVfdCYpOyAvLyBub3QgaW1wbGVtZW50ZWQKLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBlZ2xfY2FjaGVfdCYpOyAvLyBub3QgaW1wbGVtZW50ZWQKLQotICAgIC8vIGdldEJsb2JDYWNoZUxvY2tlZCByZXR1cm5zIHRoZSBCbG9iQ2FjaGUgb2JqZWN0IGJlaW5nIHVzZWQgdG8gc3RvcmUgdGhlCi0gICAgLy8ga2V5L3ZhbHVlIGJsb2IgcGFpcnMuICBJZiB0aGUgQmxvYkNhY2hlIG9iamVjdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQsCi0gICAgLy8gdGhpcyB3aWxsIGRvIHNvLCBsb2FkaW5nIHRoZSBzZXJpYWxpemVkIGNhY2hlIGNvbnRlbnRzIGZyb20gZGlzayBpZgotICAgIC8vIHBvc3NpYmxlLgotICAgIHNwPEJsb2JDYWNoZT4gZ2V0QmxvYkNhY2hlTG9ja2VkKCk7Ci0KLSAgICAvLyBzYXZlQmxvYkNhY2hlIGF0dGVtcHRzIHRvIHNhdmUgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgbUJsb2JDYWNoZSB0bwotICAgIC8vIGRpc2suCi0gICAgdm9pZCBzYXZlQmxvYkNhY2hlTG9ja2VkKCk7Ci0KLSAgICAvLyBsb2FkQmxvYkNhY2hlIGF0dGVtcHRzIHRvIGxvYWQgdGhlIHNhdmVkIGNhY2hlIGNvbnRlbnRzIGZyb20gZGlzayBpbnRvCi0gICAgLy8gbUJsb2JDYWNoZS4KLSAgICB2b2lkIGxvYWRCbG9iQ2FjaGVMb2NrZWQoKTsKLQotICAgIC8vIG1Jbml0aWFsaXplZCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZWdsX2NhY2hlX3QgaXMgaW4gdGhlIGluaXRpYWxpemVkCi0gICAgLy8gc3RhdGUuICBJdCBpcyBpbml0aWFsaXplZCB0byBmYWxzZSBhdCBjb25zdHJ1Y3Rpb24gdGltZSwgYW5kIGdldHMgc2V0IHRvCi0gICAgLy8gdHJ1ZSB3aGVuIGluaXRpYWxpemUgaXMgY2FsbGVkLiAgSXQgaXMgc2V0IGJhY2sgdG8gZmFsc2Ugd2hlbiB0ZXJtaW5hdGUKLSAgICAvLyBpcyBjYWxsZWQuICBXaGVuIGluIHRoaXMgc3RhdGUsIHRoZSBjYWNoZSBiZWhhdmVzIGFzIG5vcm1hbC4gIFdoZW4gbm90LAotICAgIC8vIHRoZSBnZXRCbG9iIGFuZCBzZXRCbG9iIG1ldGhvZHMgd2lsbCByZXR1cm4gd2l0aG91dCBwZXJmb3JtaW5nIGFueSBjYWNoZQotICAgIC8vIG9wZXJhdGlvbnMuCi0gICAgYm9vbCBtSW5pdGlhbGl6ZWQ7Ci0KLSAgICAvLyBtQmxvYkNhY2hlIGlzIHRoZSBjYWNoZSBpbiB3aGljaCB0aGUga2V5L3ZhbHVlIGJsb2IgcGFpcnMgYXJlIHN0b3JlZC4gIEl0Ci0gICAgLy8gaXMgaW5pdGlhbGx5IE5VTEwsIGFuZCB3aWxsIGJlIGluaXRpYWxpemVkIGJ5IGdldEJsb2JDYWNoZUxvY2tlZCB0aGUKLSAgICAvLyBmaXJzdCB0aW1lIGl0J3MgbmVlZGVkLgotICAgIHNwPEJsb2JDYWNoZT4gbUJsb2JDYWNoZTsKLQotICAgIC8vIG1GaWxlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBmb3Igc3RvcmluZyBjYWNoZSBjb250ZW50cyBpbiBiZXR3ZWVuCi0gICAgLy8gcHJvZ3JhbSBpbnZvY2F0aW9ucy4gIEl0IGlzIGluaXRpYWxpemVkIHRvIGFuIGVtcHR5IHN0cmluZyBhdAotICAgIC8vIGNvbnN0cnVjdGlvbiB0aW1lLCBhbmQgY2FuIGJlIHNldCB3aXRoIHRoZSBzZXRDYWNoZUZpbGVuYW1lIG1ldGhvZC4gIEFuCi0gICAgLy8gZW1wdHkgc3RyaW5nIGluZGljYXRlcyB0aGF0IHRoZSBjYWNoZSBzaG91bGQgbm90IGJlIHNhdmVkIHRvIG9yIHJlc3RvcmVkCi0gICAgLy8gZnJvbSBkaXNrLgotICAgIFN0cmluZzggbUZpbGVuYW1lOwotCi0gICAgLy8gbVNhdmVQZW5kaW5nIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhIGRlZmVycmVkIHNhdmUgb3BlcmF0aW9uIGlzCi0gICAgLy8gcGVuZGluZy4gIEVhY2ggdGltZSBhIGtleS92YWx1ZSBwYWlyIGlzIGluc2VydGVkIGludG8gdGhlIGNhY2hlIHZpYQotICAgIC8vIHNldEJsb2IsIGEgZGVmZXJyZWQgc2F2ZSBpcyBpbml0aWF0ZWQgaWYgb25lIGlzIG5vdCBhbHJlYWR5IHBlbmRpbmcuCi0gICAgLy8gVGhpcyB3aWxsIHdhaXQgc29tZSBhbW91bnQgb2YgdGltZSBhbmQgdGhlbiB0cmlnZ2VyIGEgc2F2ZSBvZiB0aGUgY2FjaGUKLSAgICAvLyBjb250ZW50cyB0byBkaXNrLgotICAgIGJvb2wgbVNhdmVQZW5kaW5nOwotCi0gICAgLy8gbU11dGV4IGlzIHRoZSBtdXRleCB1c2VkIHRvIHByZXZlbnQgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG1lbWJlcgotICAgIC8vIHZhcmlhYmxlcy4gSXQgbXVzdCBiZSBsb2NrZWQgd2hlbmV2ZXIgdGhlIG1lbWJlciB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkLgotICAgIG11dGFibGUgTXV0ZXggbU11dGV4OwotCi0gICAgLy8gc0NhY2hlIGlzIHRoZSBzaW5nbGV0b24gZWdsX2NhY2hlX3Qgb2JqZWN0LgotICAgIHN0YXRpYyBlZ2xfY2FjaGVfdCBzQ2FjaGU7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9FR0xfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbF9kaXNwbGF5LmNwcCBiL29wZW5nbC9saWJzL0VHTC9lZ2xfZGlzcGxheS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NWI0Y2UuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2VnbF9kaXNwbGF5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKiAKLSAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiZWdsX2NhY2hlLmgiCi0jaW5jbHVkZSAiZWdsX2Rpc3BsYXkuaCIKLSNpbmNsdWRlICJlZ2xfb2JqZWN0LmgiCi0jaW5jbHVkZSAiZWdsX3Rscy5oIgotI2luY2x1ZGUgImVnbF9pbXBsLmgiCi0jaW5jbHVkZSAiTG9hZGVyLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBzVmVuZG9yU3RyaW5nICAgICA9ICJBbmRyb2lkIjsKLXN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3Qgc1ZlcnNpb25TdHJpbmcgICAgPSAiMS40IEFuZHJvaWQgTUVUQS1FR0wiOwotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBzQ2xpZW50QXBpU3RyaW5nICA9ICJPcGVuR0wgRVMiOwotCi0vLyB0aGlzIGlzIHRoZSBsaXN0IG9mIEVHTCBleHRlbnNpb25zIHRoYXQgYXJlIGV4cG9zZWQgdG8gYXBwbGljYXRpb25zCi0vLyBzb21lIG9mIHRoZW0gYXJlIG1hbmRhdG9yeSBiZWNhdXNlIHVzZWQgYnkgdGhlIEFORFJPSUQgc3lzdGVtLgotLy8KLS8vIG1hbmRhdG9yeSBleHRlbnNpb25zIGFyZSByZXF1aXJlZCBwZXIgdGhlIENERCBhbmQgbm90IGV4cGxpY2l0bHkKLS8vIGNoZWNrZWQgZHVyaW5nIEVHTCBpbml0aWFsaXphdGlvbi4gdGhlIHN5c3RlbSAqYXNzdW1lcyogdGhlc2UgZXh0ZW5zaW9ucwotLy8gYXJlIHByZXNlbnQuIHRoZSBzeXN0ZW0gbWF5IG5vdCBmdW5jdGlvbiBwcm9wZXJseSBpZiBzb21lIG1hbmRhdG9yeQotLy8gZXh0ZW5zaW9ucyBhcmUgbWlzc2luZy4KLS8vCi0vLyBOT1RFOiBzRXh0ZW5zaW9uU3RyaW5nIE1VU1QgYmUgaGF2ZSBhIHNpbmdsZSBzcGFjZSBhcyB0aGUgbGFzdCBjaGFyYWN0ZXIuCi0vLwotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBzRXh0ZW5zaW9uU3RyaW5nICA9Ci0gICAgICAgICJFR0xfS0hSX2ltYWdlICIgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYW5kYXRvcnkKLSAgICAgICAgIkVHTF9LSFJfaW1hZ2VfYmFzZSAiICAgICAgICAgICAgICAgICAgIC8vIG1hbmRhdG9yeQotICAgICAgICAiRUdMX0tIUl9pbWFnZV9waXhtYXAgIgotICAgICAgICAiRUdMX0tIUl9nbF90ZXh0dXJlXzJEX2ltYWdlICIKLSAgICAgICAgIkVHTF9LSFJfZ2xfdGV4dHVyZV9jdWJlbWFwX2ltYWdlICIKLSAgICAgICAgIkVHTF9LSFJfZ2xfcmVuZGVyYnVmZmVyX2ltYWdlICIKLSAgICAgICAgIkVHTF9LSFJfZmVuY2Vfc3luYyAiCi0gICAgICAgICJFR0xfTlZfc3lzdGVtX3RpbWUgIgotICAgICAgICAiRUdMX0FORFJPSURfaW1hZ2VfbmF0aXZlX2J1ZmZlciAiICAgICAgLy8gbWFuZGF0b3J5Ci0gICAgICAgIDsKLQotLy8gZXh0ZW5zaW9ucyBub3QgZXhwb3NlZCB0byBhcHBsaWNhdGlvbnMgYnV0IHVzZWQgYnkgdGhlIEFORFJPSUQgc3lzdGVtCi0vLyAgICAgICJFR0xfQU5EUk9JRF9yZWNvcmRhYmxlICIgICAgICAgICAgICAgICAvLyBtYW5kYXRvcnkKLS8vICAgICAgIkVHTF9BTkRST0lEX2Jsb2JfY2FjaGUgIiAgICAgICAgICAgICAgIC8vIHN0cm9uZ2x5IHJlY29tbWVuZGVkCi0KLWV4dGVybiB2b2lkIGluaXRFZ2xUcmFjZUxldmVsKCk7Ci1leHRlcm4gdm9pZCBzZXRHTEhvb2tzVGhyZWFkU3BlY2lmaWMoZ2xfaG9va3NfdCBjb25zdCAqdmFsdWUpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWVnbF9kaXNwbGF5X3QgZWdsX2Rpc3BsYXlfdDo6c0Rpc3BsYXlbTlVNX0RJU1BMQVlTXTsKLQotZWdsX2Rpc3BsYXlfdDo6ZWdsX2Rpc3BsYXlfdCgpIDoKLSAgICBtYWdpYygnX2RweScpLCByZWZzKDApIHsKLX0KLQotZWdsX2Rpc3BsYXlfdDo6fmVnbF9kaXNwbGF5X3QoKSB7Ci0gICAgbWFnaWMgPSAwOwotICAgIGVnbF9jYWNoZV90OjpnZXQoKS0+dGVybWluYXRlKCk7Ci19Ci0KLWVnbF9kaXNwbGF5X3QqIGVnbF9kaXNwbGF5X3Q6OmdldChFR0xEaXNwbGF5IGRweSkgewotICAgIHVpbnRwdHJfdCBpbmRleCA9IHVpbnRwdHJfdChkcHkpLTFVOwotICAgIHJldHVybiAoaW5kZXggPj0gTlVNX0RJU1BMQVlTKSA/IE5VTEwgOiAmc0Rpc3BsYXlbaW5kZXhdOwotfQotCi12b2lkIGVnbF9kaXNwbGF5X3Q6OmFkZE9iamVjdChlZ2xfb2JqZWN0X3QqIG9iamVjdCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChsb2NrKTsKLSAgICBvYmplY3RzLmFkZChvYmplY3QpOwotfQotCi12b2lkIGVnbF9kaXNwbGF5X3Q6OnJlbW92ZU9iamVjdChlZ2xfb2JqZWN0X3QqIG9iamVjdCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChsb2NrKTsKLSAgICBvYmplY3RzLnJlbW92ZShvYmplY3QpOwotfQotCi1ib29sIGVnbF9kaXNwbGF5X3Q6OmdldE9iamVjdChlZ2xfb2JqZWN0X3QqIG9iamVjdCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChsb2NrKTsKLSAgICBpZiAob2JqZWN0cy5pbmRleE9mKG9iamVjdCkgPj0gMCkgewotICAgICAgICBpZiAob2JqZWN0LT5nZXREaXNwbGF5KCkgPT0gdGhpcykgewotICAgICAgICAgICAgb2JqZWN0LT5pbmNSZWYoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotRUdMRGlzcGxheSBlZ2xfZGlzcGxheV90OjpnZXRGcm9tTmF0aXZlRGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBkaXNwKSB7Ci0gICAgaWYgKHVpbnRwdHJfdChkaXNwKSA+PSBOVU1fRElTUExBWVMpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgcmV0dXJuIHNEaXNwbGF5W3VpbnRwdHJfdChkaXNwKV0uZ2V0RGlzcGxheShkaXNwKTsKLX0KLQotRUdMRGlzcGxheSBlZ2xfZGlzcGxheV90OjpnZXREaXNwbGF5KEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRpc3BsYXkpIHsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChsb2NrKTsKLQotICAgIC8vIGdldCBvdXIgZHJpdmVyIGxvYWRlcgotICAgIExvYWRlciYgbG9hZGVyKExvYWRlcjo6Z2V0SW5zdGFuY2UoKSk7Ci0KLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvICYmIGRpc3AuZHB5ID09IEVHTF9OT19ESVNQTEFZKSB7Ci0gICAgICAgIEVHTERpc3BsYXkgZHB5ID0gY254LT5lZ2wuZWdsR2V0RGlzcGxheShkaXNwbGF5KTsKLSAgICAgICAgZGlzcC5kcHkgPSBkcHk7Ci0gICAgICAgIGlmIChkcHkgPT0gRUdMX05PX0RJU1BMQVkpIHsKLSAgICAgICAgICAgIGxvYWRlci5jbG9zZShjbngtPmRzbyk7Ci0gICAgICAgICAgICBjbngtPmRzbyA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRUdMRGlzcGxheSh1aW50cHRyX3QoZGlzcGxheSkgKyAxVSk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsX2Rpc3BsYXlfdDo6aW5pdGlhbGl6ZShFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7Ci0KLSAgICBpZiAocmVmcyA+IDApIHsKLSAgICAgICAgaWYgKG1ham9yICE9IE5VTEwpCi0gICAgICAgICAgICAqbWFqb3IgPSBWRVJTSU9OX01BSk9SOwotICAgICAgICBpZiAobWlub3IgIT0gTlVMTCkKLSAgICAgICAgICAgICptaW5vciA9IFZFUlNJT05fTUlOT1I7Ci0gICAgICAgIHJlZnMrKzsKLSAgICAgICAgcmV0dXJuIEVHTF9UUlVFOwotICAgIH0KLQotI2lmIEVHTF9UUkFDRQotCi0gICAgLy8gQ2FsbGVkIGJvdGggYXQgZWFybHlfaW5pdCB0aW1lIGFuZCBhdCB0aGlzIHRpbWUuIChFYXJseV9pbml0IGlzIHByZS16eWdvdGUsIHNvCi0gICAgLy8gdGhlIGluZm9ybWF0aW9uIGZyb20gdGhhdCBjYWxsIG1heSBiZSBzdGFsZS4pCi0gICAgaW5pdEVnbFRyYWNlTGV2ZWwoKTsKLQotI2VuZGlmCi0KLSAgICBzZXRHTEhvb2tzVGhyZWFkU3BlY2lmaWMoJmdIb29rc05vQ29udGV4dCk7Ci0KLSAgICAvLyBpbml0aWFsaXplIGVhY2ggRUdMIGFuZAotICAgIC8vIGJ1aWxkIG91ciBvd24gZXh0ZW5zaW9uIHN0cmluZyBmaXJzdCwgYmFzZWQgb24gdGhlIGV4dGVuc2lvbiB3ZSBrbm93Ci0gICAgLy8gYW5kIHRoZSBleHRlbnNpb24gc3VwcG9ydGVkIGJ5IG91ciBjbGllbnQgaW1wbGVtZW50YXRpb24KLQotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBjbngtPm1ham9yID0gLTE7Ci0gICAgY254LT5taW5vciA9IC0xOwotICAgIGlmIChjbngtPmRzbykgewotCi0jaWYgZGVmaW5lZChBRFJFTk8xMzApCi0jd2FybmluZyAiQWRyZW5vLTEzMCBlZ2xJbml0aWFsaXplKCkgd29ya2Fyb3VuZCIKLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIEFEUkVOTyAxMzAgZHJpdmVyIHJldHVybnMgYSBkaWZmZXJlbnQgRUdMRGlzcGxheSBlYWNoIHRpbWUKLSAgICAgICAgICogZWdsR2V0RGlzcGxheSgpIGlzIGNhbGxlZCwgYnV0IGFsc28gbWFrZXMgdGhlIEVHTERpc3BsYXkgaW52YWxpZAotICAgICAgICAgKiBhZnRlciBlZ2xUZXJtaW5hdGUoKSBoYXMgYmVlbiBjYWxsZWQsIHNvIHRoYXQgZWdsSW5pdGlhbGl6ZSgpCi0gICAgICAgICAqIGNhbm5vdCBiZSBjYWxsZWQgYWdhaW4uIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdG8gY2FsbAotICAgICAgICAgKiBlZ2xHZXREaXNwbGF5KCkgYmVmb3JlIGNhbGxpbmcgZWdsSW5pdGlhbGl6ZSgpOwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGkgPT0gSU1QTF9IQVJEV0FSRSkgewotICAgICAgICAgICAgZGlzcFtpXS5kcHkgPSBjbngtPmVnbC5lZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICBFR0xEaXNwbGF5IGlkcHkgPSBkaXNwLmRweTsKLSAgICAgICAgaWYgKGNueC0+ZWdsLmVnbEluaXRpYWxpemUoaWRweSwgJmNueC0+bWFqb3IsICZjbngtPm1pbm9yKSkgewotICAgICAgICAgICAgLy9BTE9HRCgiaW5pdGlhbGl6ZWQgZHB5PSVwLCB2ZXI9JWQuJWQsIGNueD0lcCIsCi0gICAgICAgICAgICAvLyAgICAgICAgaWRweSwgY254LT5tYWpvciwgY254LT5taW5vciwgY254KTsKLQotICAgICAgICAgICAgLy8gZGlzcGxheSBpcyBub3cgaW5pdGlhbGl6ZWQKLSAgICAgICAgICAgIGRpc3Auc3RhdGUgPSBlZ2xfZGlzcGxheV90OjpJTklUSUFMSVpFRDsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBxdWVyeS1zdHJpbmdzIGZvciB0aGlzIGRpc3BsYXkgZm9yIGVhY2ggaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIGRpc3AucXVlcnlTdHJpbmcudmVuZG9yID0gY254LT5lZ2wuZWdsUXVlcnlTdHJpbmcoaWRweSwKLSAgICAgICAgICAgICAgICAgICAgRUdMX1ZFTkRPUik7Ci0gICAgICAgICAgICBkaXNwLnF1ZXJ5U3RyaW5nLnZlcnNpb24gPSBjbngtPmVnbC5lZ2xRdWVyeVN0cmluZyhpZHB5LAotICAgICAgICAgICAgICAgICAgICBFR0xfVkVSU0lPTik7Ci0gICAgICAgICAgICBkaXNwLnF1ZXJ5U3RyaW5nLmV4dGVuc2lvbnMgPSBjbngtPmVnbC5lZ2xRdWVyeVN0cmluZyhpZHB5LAotICAgICAgICAgICAgICAgICAgICBFR0xfRVhURU5TSU9OUyk7Ci0gICAgICAgICAgICBkaXNwLnF1ZXJ5U3RyaW5nLmNsaWVudEFwaSA9IGNueC0+ZWdsLmVnbFF1ZXJ5U3RyaW5nKGlkcHksCi0gICAgICAgICAgICAgICAgICAgIEVHTF9DTElFTlRfQVBJUyk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJlZ2xJbml0aWFsaXplKCVwKSBmYWlsZWQgKCVzKSIsIGlkcHksCi0gICAgICAgICAgICAgICAgICAgIGVnbF90bHNfdDo6ZWdsX3N0cmVycm9yKGNueC0+ZWdsLmVnbEdldEVycm9yKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHRoZSBxdWVyeSBzdHJpbmdzIGFyZSBwZXItZGlzcGxheQotICAgIG1WZW5kb3JTdHJpbmcuc2V0VG8oc1ZlbmRvclN0cmluZyk7Ci0gICAgbVZlcnNpb25TdHJpbmcuc2V0VG8oc1ZlcnNpb25TdHJpbmcpOwotICAgIG1DbGllbnRBcGlTdHJpbmcuc2V0VG8oc0NsaWVudEFwaVN0cmluZyk7Ci0KLSAgICAvLyB3ZSBvbmx5IGFkZCBleHRlbnNpb25zIHRoYXQgZXhpc3QgaW4gdGhlIGltcGxlbWVudGF0aW9uCi0gICAgY2hhciBjb25zdCogc3RhcnQgPSBzRXh0ZW5zaW9uU3RyaW5nOwotICAgIGNoYXIgY29uc3QqIGVuZDsKLSAgICBkbyB7Ci0gICAgICAgIC8vIGZpbmQgdGhlIHNwYWNlIHNlcGFyYXRpbmcgdGhpcyBleHRlbnNpb24gZm9yIHRoZSBuZXh0IG9uZQotICAgICAgICBlbmQgPSBzdHJjaHIoc3RhcnQsICcgJyk7Ci0gICAgICAgIGlmIChlbmQpIHsKLSAgICAgICAgICAgIC8vIGxlbmd0aCBvZiB0aGUgZXh0ZW5zaW9uIHN0cmluZwotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGxlbiA9IGVuZCAtIHN0YXJ0OwotICAgICAgICAgICAgaWYgKGxlbikgewotICAgICAgICAgICAgICAgIC8vIE5PVEU6IHdlIGNvdWxkIGF2b2lkIHRoZSBjb3B5IGlmIHdlIGhhZCBzdHJuc3RyLgotICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggZXh0KHN0YXJ0LCBsZW4pOwotICAgICAgICAgICAgICAgIC8vIG5vdyBsb29rIGZvciB0aGlzIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgIGlmIChkaXNwLnF1ZXJ5U3RyaW5nLmV4dGVuc2lvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZmluZCBpdCwgYWRkIHRoaXMgZXh0ZW5zaW9uIHN0cmluZyB0byBvdXIgbGlzdAotICAgICAgICAgICAgICAgICAgICAvLyAoYW5kIGRvbid0IGZvcmdldCB0aGUgc3BhY2UpCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1hdGNoID0gc3Ryc3RyKGRpc3AucXVlcnlTdHJpbmcuZXh0ZW5zaW9ucywgZXh0LnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoICYmIChtYXRjaFtsZW5dID09ICcgJyB8fCBtYXRjaFtsZW5dID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRXh0ZW5zaW9uU3RyaW5nLmFwcGVuZChzdGFydCwgbGVuKzEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgbmV4dCBleHRlbnNpb24gc3RyaW5nLCBhbmQgc2tpcCB0aGUgc3BhY2UuCi0gICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChlbmQpOwotCi0gICAgZWdsX2NhY2hlX3Q6OmdldCgpLT5pbml0aWFsaXplKHRoaXMpOwotCi0gICAgcmVmcysrOwotICAgIGlmIChtYWpvciAhPSBOVUxMKQotICAgICAgICAqbWFqb3IgPSBWRVJTSU9OX01BSk9SOwotICAgIGlmIChtaW5vciAhPSBOVUxMKQotICAgICAgICAqbWlub3IgPSBWRVJTSU9OX01JTk9SOwotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xfZGlzcGxheV90Ojp0ZXJtaW5hdGUoKSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7Ci0KLSAgICBpZiAocmVmcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfTk9UX0lOSVRJQUxJWkVELCBFR0xfRkFMU0UpOwotICAgIH0KLQotICAgIC8vIHRoaXMgaXMgc3BlY2lmaWMgdG8gQW5kcm9pZCwgZGlzcGxheSB0ZXJtaW5hdGlvbiBpcyByZWYtY291bnRlZC4KLSAgICBpZiAocmVmcyA+IDEpIHsKLSAgICAgICAgcmVmcy0tOwotICAgICAgICByZXR1cm4gRUdMX1RSVUU7Ci0gICAgfQotCi0gICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfRkFMU0U7Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyAmJiBkaXNwLnN0YXRlID09IGVnbF9kaXNwbGF5X3Q6OklOSVRJQUxJWkVEKSB7Ci0gICAgICAgIGlmIChjbngtPmVnbC5lZ2xUZXJtaW5hdGUoZGlzcC5kcHkpID09IEVHTF9GQUxTRSkgewotICAgICAgICAgICAgQUxPR1coImVnbFRlcm1pbmF0ZSglcCkgZmFpbGVkICglcykiLCBkaXNwLmRweSwKLSAgICAgICAgICAgICAgICAgICAgZWdsX3Rsc190OjplZ2xfc3RyZXJyb3IoY254LT5lZ2wuZWdsR2V0RXJyb3IoKSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJFVklTSVQ6IGl0J3MgdW5jbGVhciB3aGF0IHRvIGRvIGlmIGVnbFRlcm1pbmF0ZSgpIGZhaWxzCi0gICAgICAgIGRpc3Auc3RhdGUgPSBlZ2xfZGlzcGxheV90OjpURVJNSU5BVEVEOwotICAgICAgICByZXMgPSBFR0xfVFJVRTsKLSAgICB9Ci0KLSAgICAvLyBNYXJrIGFsbCBvYmplY3RzIHJlbWFpbmluZyBpbiB0aGUgbGlzdCBhcyB0ZXJtaW5hdGVkLCB1bmxlc3MKLSAgICAvLyB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlIHRvIHRoZW0sIGl0IHdoaWNoIGNhc2UsIHdlJ3JlIGZyZWUgdG8KLSAgICAvLyBkZWxldGUgdGhlbS4KLSAgICBzaXplX3QgY291bnQgPSBvYmplY3RzLnNpemUoKTsKLSAgICBBTE9HV19JRihjb3VudCwgImVnbFRlcm1pbmF0ZSgpIGNhbGxlZCB3LyAlZCBvYmplY3RzIHJlbWFpbmluZyIsIGNvdW50KTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIGVnbF9vYmplY3RfdCogbyA9IG9iamVjdHMuaXRlbUF0KGkpOwotICAgICAgICBvLT5kZXN0cm95KCk7Ci0gICAgfQotCi0gICAgLy8gdGhpcyBtYXJrcyBhbGwgb2JqZWN0IGhhbmRsZXMgYXJlICJ0ZXJtaW5hdGVkIgotICAgIG9iamVjdHMuY2xlYXIoKTsKLQotICAgIHJlZnMtLTsKLSAgICByZXR1cm4gcmVzOwotfQotCi12b2lkIGVnbF9kaXNwbGF5X3Q6Omxvc2VDdXJyZW50KGVnbF9jb250ZXh0X3QgKiBjdXJfYykKLXsKLSAgICBpZiAoY3VyX2MpIHsKLSAgICAgICAgZWdsX2Rpc3BsYXlfdCogZGlzcGxheSA9IGN1cl9jLT5nZXREaXNwbGF5KCk7Ci0gICAgICAgIGlmIChkaXNwbGF5KSB7Ci0gICAgICAgICAgICBkaXNwbGF5LT5sb3NlQ3VycmVudEltcGwoY3VyX2MpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIGVnbF9kaXNwbGF5X3Q6Omxvc2VDdXJyZW50SW1wbChlZ2xfY29udGV4dF90ICogY3VyX2MpCi17Ci0gICAgLy8gYnkgY29uc3RydWN0aW9uLCB0aGVzZSBhcmUgZWl0aGVyIDAgb3IgdmFsaWQgKHBvc3NpYmx5IHRlcm1pbmF0ZWQpCi0gICAgLy8gaXQgc2hvdWxkIGJlIGltcG9zc2libGUgZm9yIHRoZXNlIHRvIGJlIGludmFsaWQKLSAgICBDb250ZXh0UmVmIF9jdXJfYyhjdXJfYyk7Ci0gICAgU3VyZmFjZVJlZiBfY3VyX3IoY3VyX2MgPyBnZXRfc3VyZmFjZShjdXJfYy0+cmVhZCkgOiBOVUxMKTsKLSAgICBTdXJmYWNlUmVmIF9jdXJfZChjdXJfYyA/IGdldF9zdXJmYWNlKGN1cl9jLT5kcmF3KSA6IE5VTEwpOwotCi0gICAgeyAvLyBzY29wZSBmb3IgdGhlIGxvY2sKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGxvY2spOwotICAgICAgICBjdXJfYy0+b25Mb29zZUN1cnJlbnQoKTsKLQotICAgIH0KLQotICAgIC8vIFRoaXMgY2Fubm90IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgYmVjYXVzZSBpdCBtaWdodCBlbmQtdXAKLSAgICAvLyBjYWxsaW5nIGJhY2sgaW50byBFR0wgKGluIHBhcnRpY3VsYXIgd2hlbiBhIHN1cmZhY2UgaXMgZGVzdHJveWVkCi0gICAgLy8gaXQgY2FsbHMgQU5hdGl2ZVdpbmRvdzo6ZGlzY29ubmVjdAotICAgIF9jdXJfYy5yZWxlYXNlKCk7Ci0gICAgX2N1cl9yLnJlbGVhc2UoKTsKLSAgICBfY3VyX2QucmVsZWFzZSgpOwotfQotCi1FR0xCb29sZWFuIGVnbF9kaXNwbGF5X3Q6Om1ha2VDdXJyZW50KGVnbF9jb250ZXh0X3QqIGMsIGVnbF9jb250ZXh0X3QqIGN1cl9jLAotICAgICAgICBFR0xTdXJmYWNlIGRyYXcsIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgsCi0gICAgICAgIEVHTFN1cmZhY2UgaW1wbF9kcmF3LCBFR0xTdXJmYWNlIGltcGxfcmVhZCwgRUdMQ29udGV4dCBpbXBsX2N0eCkKLXsKLSAgICBFR0xCb29sZWFuIHJlc3VsdDsKLQotICAgIC8vIGJ5IGNvbnN0cnVjdGlvbiwgdGhlc2UgYXJlIGVpdGhlciAwIG9yIHZhbGlkIChwb3NzaWJseSB0ZXJtaW5hdGVkKQotICAgIC8vIGl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIGZvciB0aGVzZSB0byBiZSBpbnZhbGlkCi0gICAgQ29udGV4dFJlZiBfY3VyX2MoY3VyX2MpOwotICAgIFN1cmZhY2VSZWYgX2N1cl9yKGN1cl9jID8gZ2V0X3N1cmZhY2UoY3VyX2MtPnJlYWQpIDogTlVMTCk7Ci0gICAgU3VyZmFjZVJlZiBfY3VyX2QoY3VyX2MgPyBnZXRfc3VyZmFjZShjdXJfYy0+ZHJhdykgOiBOVUxMKTsKLQotICAgIHsgLy8gc2NvcGUgZm9yIHRoZSBsb2NrCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChsb2NrKTsKLSAgICAgICAgaWYgKGMpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGMtPmNueC0+ZWdsLmVnbE1ha2VDdXJyZW50KAotICAgICAgICAgICAgICAgICAgICBkaXNwLmRweSwgaW1wbF9kcmF3LCBpbXBsX3JlYWQsIGltcGxfY3R4KTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gRUdMX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBjLT5vbk1ha2VDdXJyZW50KGRyYXcsIHJlYWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gY3VyX2MtPmNueC0+ZWdsLmVnbE1ha2VDdXJyZW50KAotICAgICAgICAgICAgICAgICAgICBkaXNwLmRweSwgaW1wbF9kcmF3LCBpbXBsX3JlYWQsIGltcGxfY3R4KTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gRUdMX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBjdXJfYy0+b25Mb29zZUN1cnJlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXN1bHQgPT0gRUdMX1RSVUUpIHsKLSAgICAgICAgLy8gVGhpcyBjYW5ub3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCBiZWNhdXNlIGl0IG1pZ2h0IGVuZC11cAotICAgICAgICAvLyBjYWxsaW5nIGJhY2sgaW50byBFR0wgKGluIHBhcnRpY3VsYXIgd2hlbiBhIHN1cmZhY2UgaXMgZGVzdHJveWVkCi0gICAgICAgIC8vIGl0IGNhbGxzIEFOYXRpdmVXaW5kb3c6OmRpc2Nvbm5lY3QKLSAgICAgICAgX2N1cl9jLnJlbGVhc2UoKTsKLSAgICAgICAgX2N1cl9yLnJlbGVhc2UoKTsKLSAgICAgICAgX2N1cl9kLnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbF9kaXNwbGF5LmggYi9vcGVuZ2wvbGlicy9FR0wvZWdsX2Rpc3BsYXkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0ODIyOC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsX2Rpc3BsYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKiAKLSAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0VHTF9ESVNQTEFZX0gKLSNkZWZpbmUgQU5EUk9JRF9FR0xfRElTUExBWV9ICi0KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSAiZWdsZGVmcy5oIgotI2luY2x1ZGUgImhvb2tzLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgZWdsX29iamVjdF90OwotY2xhc3MgZWdsX2NvbnRleHRfdDsKLWNsYXNzIGVnbF9jb25uZWN0aW9uX3Q7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgRUdMQVBJIGVnbF9kaXNwbGF5X3QgeyAvLyBtYXJrZWQgYXMgRUdMQVBJIGZvciB0ZXN0aW5nIHB1cnBvc2VzCi0gICAgc3RhdGljIGVnbF9kaXNwbGF5X3Qgc0Rpc3BsYXlbTlVNX0RJU1BMQVlTXTsKLSAgICBFR0xEaXNwbGF5IGdldERpc3BsYXkoRUdMTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheSk7Ci0gICAgdm9pZCBsb3NlQ3VycmVudEltcGwoZWdsX2NvbnRleHRfdCAqIGN1cl9jKTsKLQotcHVibGljOgotICAgIGVudW0gewotICAgICAgICBOT1RfSU5JVElBTElaRUQgPSAwLAotICAgICAgICBJTklUSUFMSVpFRCAgICAgPSAxLAotICAgICAgICBURVJNSU5BVEVEICAgICAgPSAyCi0gICAgfTsKLQotICAgIGVnbF9kaXNwbGF5X3QoKTsKLSAgICB+ZWdsX2Rpc3BsYXlfdCgpOwotCi0gICAgRUdMQm9vbGVhbiBpbml0aWFsaXplKEVHTGludCAqbWFqb3IsIEVHTGludCAqbWlub3IpOwotICAgIEVHTEJvb2xlYW4gdGVybWluYXRlKCk7Ci0KLSAgICAvLyBhZGQgb2JqZWN0IHRvIHRoaXMgZGlzcGxheSdzIGxpc3QKLSAgICB2b2lkIGFkZE9iamVjdChlZ2xfb2JqZWN0X3QqIG9iamVjdCk7Ci0gICAgLy8gcmVtb3ZlIG9iamVjdCBmcm9tIHRoaXMgZGlzcGxheSdzIGxpc3QKLSAgICB2b2lkIHJlbW92ZU9iamVjdChlZ2xfb2JqZWN0X3QqIG9iamVjdCk7Ci0gICAgLy8gYWRkIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4gcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBvYmplY3QuCi0gICAgYm9vbCBnZXRPYmplY3QoZWdsX29iamVjdF90KiBvYmplY3QpIGNvbnN0OwotCi0gICAgc3RhdGljIGVnbF9kaXNwbGF5X3QqIGdldChFR0xEaXNwbGF5IGRweSk7Ci0gICAgc3RhdGljIEVHTERpc3BsYXkgZ2V0RnJvbU5hdGl2ZURpc3BsYXkoRUdMTmF0aXZlRGlzcGxheVR5cGUgZGlzcCk7Ci0KLSAgICBFR0xCb29sZWFuIG1ha2VDdXJyZW50KGVnbF9jb250ZXh0X3QqIGMsIGVnbF9jb250ZXh0X3QqIGN1cl9jLAotICAgICAgICAgICAgRUdMU3VyZmFjZSBkcmF3LCBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY3R4LAotICAgICAgICAgICAgRUdMU3VyZmFjZSBpbXBsX2RyYXcsIEVHTFN1cmZhY2UgaW1wbF9yZWFkLCBFR0xDb250ZXh0IGltcGxfY3R4KTsKLSAgICBzdGF0aWMgdm9pZCBsb3NlQ3VycmVudChlZ2xfY29udGV4dF90ICogY3VyX2MpOwotCi0gICAgaW5saW5lIGJvb2wgaXNSZWFkeSgpIGNvbnN0IHsgcmV0dXJuIChyZWZzID4gMCk7IH0KLSAgICBpbmxpbmUgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbWFnaWMgPT0gJ19kcHknOyB9Ci0gICAgaW5saW5lIGJvb2wgaXNBbGl2ZSgpIGNvbnN0IHsgcmV0dXJuIGlzVmFsaWQoKTsgfQotCi0gICAgY2hhciBjb25zdCAqIGdldFZlbmRvclN0cmluZygpIGNvbnN0IHsgcmV0dXJuIG1WZW5kb3JTdHJpbmcuc3RyaW5nKCk7IH0KLSAgICBjaGFyIGNvbnN0ICogZ2V0VmVyc2lvblN0cmluZygpIGNvbnN0IHsgcmV0dXJuIG1WZXJzaW9uU3RyaW5nLnN0cmluZygpOyB9Ci0gICAgY2hhciBjb25zdCAqIGdldENsaWVudEFwaVN0cmluZygpIGNvbnN0IHsgcmV0dXJuIG1DbGllbnRBcGlTdHJpbmcuc3RyaW5nKCk7IH0KLSAgICBjaGFyIGNvbnN0ICogZ2V0RXh0ZW5zaW9uU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbUV4dGVuc2lvblN0cmluZy5zdHJpbmcoKTsgfQotCi0gICAgaW5saW5lIHVpbnQzMl90IGdldFJlZnNDb3VudCgpIGNvbnN0IHsgcmV0dXJuIHJlZnM7IH0KLQotICAgIHN0cnVjdCBzdHJpbmdzX3QgewotICAgICAgICBjaGFyIGNvbnN0ICogdmVuZG9yOwotICAgICAgICBjaGFyIGNvbnN0ICogdmVyc2lvbjsKLSAgICAgICAgY2hhciBjb25zdCAqIGNsaWVudEFwaTsKLSAgICAgICAgY2hhciBjb25zdCAqIGV4dGVuc2lvbnM7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBEaXNwbGF5SW1wbCB7Ci0gICAgICAgIERpc3BsYXlJbXBsKCkgOiBkcHkoRUdMX05PX0RJU1BMQVkpLCBzdGF0ZShOT1RfSU5JVElBTElaRUQpIHsgfQotICAgICAgICBFR0xEaXNwbGF5ICBkcHk7Ci0gICAgICAgIEVHTGludCAgICAgIHN0YXRlOwotICAgICAgICBzdHJpbmdzX3QgICBxdWVyeVN0cmluZzsKLSAgICB9OwotCi1wcml2YXRlOgotICAgIHVpbnQzMl90ICAgICAgICBtYWdpYzsKLQotcHVibGljOgotICAgIERpc3BsYXlJbXBsICAgICBkaXNwOwotCi1wcml2YXRlOgotICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIHJlZnM7Ci0gICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbG9jazsKLSAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxlZ2xfb2JqZWN0X3QqPiBvYmplY3RzOwotICAgICAgICAgICAgU3RyaW5nOCBtVmVuZG9yU3RyaW5nOwotICAgICAgICAgICAgU3RyaW5nOCBtVmVyc2lvblN0cmluZzsKLSAgICAgICAgICAgIFN0cmluZzggbUNsaWVudEFwaVN0cmluZzsKLSAgICAgICAgICAgIFN0cmluZzggbUV4dGVuc2lvblN0cmluZzsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW5saW5lIGVnbF9kaXNwbGF5X3QqIGdldF9kaXNwbGF5KEVHTERpc3BsYXkgZHB5KSB7Ci0gICAgcmV0dXJuIGVnbF9kaXNwbGF5X3Q6OmdldChkcHkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWVnbF9kaXNwbGF5X3QqIHZhbGlkYXRlX2Rpc3BsYXkoRUdMRGlzcGxheSBkcHkpOwotZWdsX2Nvbm5lY3Rpb25fdCogdmFsaWRhdGVfZGlzcGxheV9jb25maWcoRUdMRGlzcGxheSBkcHksCi0gICAgICAgIEVHTENvbmZpZyBjb25maWcsIGVnbF9kaXNwbGF5X3QgY29uc3QqJiBkcCk7Ci1FR0xCb29sZWFuIHZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgpOwotRUdMQm9vbGVhbiB2YWxpZGF0ZV9kaXNwbGF5X3N1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX0VHTF9ESVNQTEFZX0gKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2xfZW50cmllcy5pbiBiL29wZW5nbC9saWJzL0VHTC9lZ2xfZW50cmllcy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkMmE3ZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsX2VudHJpZXMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi1FR0xfRU5UUlkoRUdMRGlzcGxheSwgZWdsR2V0RGlzcGxheSwgTmF0aXZlRGlzcGxheVR5cGUpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsSW5pdGlhbGl6ZSwgRUdMRGlzcGxheSwgRUdMaW50KiwgRUdMaW50KikKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xUZXJtaW5hdGUsIEVHTERpc3BsYXkpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsR2V0Q29uZmlncywgRUdMRGlzcGxheSwgRUdMQ29uZmlnKiwgRUdMaW50LCBFR0xpbnQqKQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbENob29zZUNvbmZpZywgRUdMRGlzcGxheSwgY29uc3QgRUdMaW50ICosIEVHTENvbmZpZyAqLCBFR0xpbnQsIEVHTGludCAqKQotCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsR2V0Q29uZmlnQXR0cmliLCBFR0xEaXNwbGF5LCBFR0xDb25maWcsIEVHTGludCwgRUdMaW50ICopCi1FR0xfRU5UUlkoRUdMU3VyZmFjZSwgZWdsQ3JlYXRlV2luZG93U3VyZmFjZSwgRUdMRGlzcGxheSwgRUdMQ29uZmlnLCBOYXRpdmVXaW5kb3dUeXBlLCBjb25zdCBFR0xpbnQgKikKLUVHTF9FTlRSWShFR0xTdXJmYWNlLCBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlLCBFR0xEaXNwbGF5LCBFR0xDb25maWcsIE5hdGl2ZVBpeG1hcFR5cGUsIGNvbnN0IEVHTGludCAqKQotRUdMX0VOVFJZKEVHTFN1cmZhY2UsIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlLCAgRUdMRGlzcGxheSwgRUdMQ29uZmlnLCBjb25zdCBFR0xpbnQgKikKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xEZXN0cm95U3VyZmFjZSwgRUdMRGlzcGxheSwgRUdMU3VyZmFjZSkKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xRdWVyeVN1cmZhY2UsICBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xpbnQsIEVHTGludCAqKQotRUdMX0VOVFJZKEVHTENvbnRleHQsIGVnbENyZWF0ZUNvbnRleHQsIEVHTERpc3BsYXksIEVHTENvbmZpZywgRUdMQ29udGV4dCwgY29uc3QgRUdMaW50ICopCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsRGVzdHJveUNvbnRleHQsIEVHTERpc3BsYXksIEVHTENvbnRleHQpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsTWFrZUN1cnJlbnQsIEVHTERpc3BsYXksIEVHTFN1cmZhY2UsIEVHTFN1cmZhY2UsIEVHTENvbnRleHQpCi1FR0xfRU5UUlkoRUdMQ29udGV4dCwgZWdsR2V0Q3VycmVudENvbnRleHQsIHZvaWQpCi1FR0xfRU5UUlkoRUdMU3VyZmFjZSwgZWdsR2V0Q3VycmVudFN1cmZhY2UsIEVHTGludCkKLUVHTF9FTlRSWShFR0xEaXNwbGF5LCBlZ2xHZXRDdXJyZW50RGlzcGxheSwgdm9pZCkKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xRdWVyeUNvbnRleHQsICBFR0xEaXNwbGF5LCBFR0xDb250ZXh0LCBFR0xpbnQsIEVHTGludCAqKQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbFdhaXRHTCwgdm9pZCkKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xXYWl0TmF0aXZlLCBFR0xpbnQpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsU3dhcEJ1ZmZlcnMsIEVHTERpc3BsYXksIEVHTFN1cmZhY2UpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsQ29weUJ1ZmZlcnMsIEVHTERpc3BsYXksIEVHTFN1cmZhY2UsIE5hdGl2ZVBpeG1hcFR5cGUpCi1FR0xfRU5UUlkoRUdMaW50LCBlZ2xHZXRFcnJvciwgdm9pZCkKLUVHTF9FTlRSWShjb25zdCBjaGFyKiwgZWdsUXVlcnlTdHJpbmcsIEVHTERpc3BsYXksIEVHTGludCkKLUVHTF9FTlRSWShfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlLCBlZ2xHZXRQcm9jQWRkcmVzcywgY29uc3QgY2hhciAqKQotCi0vKiBFR0wgMS4xICovCi0KLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xTdXJmYWNlQXR0cmliLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xpbnQsIEVHTGludCkKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xCaW5kVGV4SW1hZ2UsIEVHTERpc3BsYXksIEVHTFN1cmZhY2UsIEVHTGludCkKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xSZWxlYXNlVGV4SW1hZ2UsIEVHTERpc3BsYXksIEVHTFN1cmZhY2UsIEVHTGludCkKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xTd2FwSW50ZXJ2YWwsIEVHTERpc3BsYXksIEVHTGludCkKLQotLyogRUdMIDEuMiAqLwotCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsQmluZEFQSSwgRUdMZW51bSkKLUVHTF9FTlRSWShFR0xlbnVtLCBlZ2xRdWVyeUFQSSwgdm9pZCkKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xXYWl0Q2xpZW50LCB2b2lkKQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbFJlbGVhc2VUaHJlYWQsIHZvaWQpCi1FR0xfRU5UUlkoRUdMU3VyZmFjZSwgZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIsIEVHTERpc3BsYXksIEVHTGVudW0sIEVHTENsaWVudEJ1ZmZlciwgRUdMQ29uZmlnLCBjb25zdCBFR0xpbnQgKikKLQotLyogRUdMIDEuMyAqLwotCi0vKiBFR0wgMS40ICovCi0KLS8qIEVHTF9FR0xFWFRfVkVSU0lPTiAzICovCi0KLUVHTF9FTlRSWShFR0xCb29sZWFuLCAgZWdsTG9ja1N1cmZhY2VLSFIsICAgRUdMRGlzcGxheSwgRUdMU3VyZmFjZSwgY29uc3QgRUdMaW50ICopCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgIGVnbFVubG9ja1N1cmZhY2VLSFIsIEVHTERpc3BsYXksIEVHTFN1cmZhY2UpCi1FR0xfRU5UUlkoRUdMSW1hZ2VLSFIsIGVnbENyZWF0ZUltYWdlS0hSLCAgIEVHTERpc3BsYXksIEVHTENvbnRleHQsIEVHTGVudW0sIEVHTENsaWVudEJ1ZmZlciwgY29uc3QgRUdMaW50ICopCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgIGVnbERlc3Ryb3lJbWFnZUtIUiwgIEVHTERpc3BsYXksIEVHTEltYWdlS0hSKQotCi0vKiBFR0xfRUdMRVhUX1ZFUlNJT04gNSAqLwotCi1FR0xfRU5UUlkoRUdMU3luY0tIUiwgICBlZ2xDcmVhdGVTeW5jS0hSLCAgICAgICBFR0xEaXNwbGF5LCBFR0xlbnVtLCBjb25zdCBFR0xpbnQgKikKLUVHTF9FTlRSWShFR0xCb29sZWFuLCAgIGVnbERlc3Ryb3lTeW5jS0hSLCAgICAgIEVHTERpc3BsYXksIEVHTFN5bmNLSFIpCi1FR0xfRU5UUlkoRUdMaW50LCAgICAgICBlZ2xDbGllbnRXYWl0U3luY0tIUiwgICBFR0xEaXNwbGF5LCBFR0xTeW5jS0hSLCBFR0xpbnQsIEVHTFRpbWVLSFIpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgICBlZ2xHZXRTeW5jQXR0cmliS0hSLCAgICBFR0xEaXNwbGF5LCBFR0xTeW5jS0hSLCBFR0xpbnQsIEVHTGludCAqKQotCi0vKiBBTkRST0lEIGV4dGVuc2lvbnMgKi8KLQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbFNldFN3YXBSZWN0YW5nbGVBTkRST0lELCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xpbnQsIEVHTGludCwgRUdMaW50LCBFR0xpbnQpCi1FR0xfRU5UUlkoRUdMQ2xpZW50QnVmZmVyLCBlZ2xHZXRSZW5kZXJCdWZmZXJBTkRST0lELCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlKQotCi0vKiBOVklESUEgZXh0ZW5zaW9ucyAqLwotCi1FR0xfRU5UUlkoRUdMdWludDY0TlYsIGVnbEdldFN5c3RlbVRpbWVGcmVxdWVuY3lOViwgdm9pZCkKLUVHTF9FTlRSWShFR0x1aW50NjROViwgZWdsR2V0U3lzdGVtVGltZU5WLCB2b2lkKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbF9vYmplY3QuY3BwIGIvb3BlbmdsL2xpYnMvRUdML2VnbF9vYmplY3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGNiYjMxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0VHTC9lZ2xfb2JqZWN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKiAKLSAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJlZ2xfb2JqZWN0LmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZWdsX29iamVjdF90OjplZ2xfb2JqZWN0X3QoZWdsX2Rpc3BsYXlfdCogZGlzcCkgOgotICAgIGRpc3BsYXkoZGlzcCksIGNvdW50KDEpIHsKLSAgICAvLyBOT1RFOiB0aGlzIGRvZXMgYW4gaW1wbGljaXQgaW5jUmVmCi0gICAgZGlzcGxheS0+YWRkT2JqZWN0KHRoaXMpOwotfQotCi1lZ2xfb2JqZWN0X3Q6On5lZ2xfb2JqZWN0X3QoKSB7Ci19Ci0KLXZvaWQgZWdsX29iamVjdF90Ojp0ZXJtaW5hdGUoKSB7Ci0gICAgLy8gdGhpcyBtYXJrcyB0aGUgb2JqZWN0IGFzICJ0ZXJtaW5hdGVkIgotICAgIGRpc3BsYXktPnJlbW92ZU9iamVjdCh0aGlzKTsKLSAgICBpZiAoZGVjUmVmKCkgPT0gMSkgewotICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuIGJlY2F1c2UgdGhpcyBpcyBjYWxsZWQgZnJvbSBMb2NhbFJlZgotICAgICAgICBBTE9HRSgiZWdsX29iamVjdF90Ojp0ZXJtaW5hdGUoKSByZW1vdmVkIHRoZSBsYXN0IHJlZmVyZW5jZSEiKTsKLSAgICB9Ci19Ci0KLXZvaWQgZWdsX29iamVjdF90OjpkZXN0cm95KCkgewotICAgIGlmIChkZWNSZWYoKSA9PSAxKSB7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0KLX0KLQotYm9vbCBlZ2xfb2JqZWN0X3Q6OmdldChlZ2xfZGlzcGxheV90IGNvbnN0KiBkaXNwbGF5LCBlZ2xfb2JqZWN0X3QqIG9iamVjdCkgewotICAgIC8vIHVzZWQgYnkgTG9jYWxSZWYsIHRoaXMgZG9lcyBhbiBpbmNSZWYoKSBhdG9taWNhbGx5IHdpdGgKLSAgICAvLyBjaGVja2luZyB0aGF0IHRoZSBvYmplY3QgaXMgdmFsaWQuCi0gICAgcmV0dXJuIGRpc3BsYXktPmdldE9iamVjdChvYmplY3QpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWVnbF9jb250ZXh0X3Q6OmVnbF9jb250ZXh0X3QoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY29udGV4dCwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCBjb25zdCogY254LCBpbnQgdmVyc2lvbikgOgotICAgIGVnbF9vYmplY3RfdChnZXRfZGlzcGxheShkcHkpKSwgZHB5KGRweSksIGNvbnRleHQoY29udGV4dCksCi0gICAgICAgICAgICBjb25maWcoY29uZmlnKSwgcmVhZCgwKSwgZHJhdygwKSwgY254KGNueCksCi0gICAgICAgICAgICB2ZXJzaW9uKHZlcnNpb24pCi17Ci19Ci0KLXZvaWQgZWdsX2NvbnRleHRfdDo6b25Mb29zZUN1cnJlbnQoKSB7Ci0gICAgcmVhZCA9IE5VTEw7Ci0gICAgZHJhdyA9IE5VTEw7Ci19Ci0KLXZvaWQgZWdsX2NvbnRleHRfdDo6b25NYWtlQ3VycmVudChFR0xTdXJmYWNlIGRyYXcsIEVHTFN1cmZhY2UgcmVhZCkgewotICAgIHRoaXMtPnJlYWQgPSByZWFkOwotICAgIHRoaXMtPmRyYXcgPSBkcmF3OwotCi0gICAgLyoKLSAgICAgKiBIZXJlIHdlIGNhY2hlIHRoZSBHTF9FWFRFTlNJT05TIHN0cmluZyBmb3IgdGhpcyBjb250ZXh0IGFuZCB3ZQotICAgICAqIGFkZCB0aGUgZXh0ZW5zaW9ucyBhbHdheXMgaGFuZGxlZCBieSB0aGUgd3JhcHBlcgotICAgICAqLwotCi0gICAgaWYgKGdsX2V4dGVuc2lvbnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIGNhbGwgdGhlIGltcGxlbWVudGF0aW9uJ3MgZ2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUykKLSAgICAgICAgY29uc3QgY2hhciogZXh0cyA9IChjb25zdCBjaGFyICopZ0VHTEltcGwuaG9va3NbdmVyc2lvbl0tPmdsLmdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpOwotICAgICAgICBnbF9leHRlbnNpb25zLnNldFRvKGV4dHMpOwotICAgICAgICBpZiAoZ2xfZXh0ZW5zaW9ucy5maW5kKCJHTF9FWFRfZGVidWdfbWFya2VyIikgPCAwKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHRlbXAoIkdMX0VYVF9kZWJ1Z19tYXJrZXIgIik7Ci0gICAgICAgICAgICB0ZW1wLmFwcGVuZChnbF9leHRlbnNpb25zKTsKLSAgICAgICAgICAgIGdsX2V4dGVuc2lvbnMuc2V0VG8odGVtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsX29iamVjdC5oIGIvb3BlbmdsL2xpYnMvRUdML2VnbF9vYmplY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5MWY1NC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsX29iamVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qIAotICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRUdMX09CSkVDVF9ICi0jZGVmaW5lIEFORFJPSURfRUdMX09CSkVDVF9ICi0KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotCi0jaW5jbHVkZSAiZWdsX2Rpc3BsYXkuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgZWdsX2Rpc3BsYXlfdDsKLQotY2xhc3MgZWdsX29iamVjdF90IHsKLSAgICBlZ2xfZGlzcGxheV90ICpkaXNwbGF5OwotICAgIG11dGFibGUgdm9sYXRpbGUgaW50MzJfdCBjb3VudDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfmVnbF9vYmplY3RfdCgpOwotCi1wdWJsaWM6Ci0gICAgZWdsX29iamVjdF90KGVnbF9kaXNwbGF5X3QqIGRpc3BsYXkpOwotICAgIHZvaWQgZGVzdHJveSgpOwotCi0gICAgaW5saW5lIGludDMyX3QgaW5jUmVmKCkgeyByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZjb3VudCk7IH0KLSAgICBpbmxpbmUgaW50MzJfdCBkZWNSZWYoKSB7IHJldHVybiBhbmRyb2lkX2F0b21pY19kZWMoJmNvdW50KTsgfQotICAgIGlubGluZSBlZ2xfZGlzcGxheV90KiBnZXREaXNwbGF5KCkgY29uc3QgeyByZXR1cm4gZGlzcGxheTsgfQotCi1wcml2YXRlOgotICAgIHZvaWQgdGVybWluYXRlKCk7Ci0gICAgc3RhdGljIGJvb2wgZ2V0KGVnbF9kaXNwbGF5X3QgY29uc3QqIGRpc3BsYXksIGVnbF9vYmplY3RfdCogb2JqZWN0KTsKLQotcHVibGljOgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBOLCB0eXBlbmFtZSBUPgotICAgIGNsYXNzIExvY2FsUmVmIHsKLSAgICAgICAgZWdsX29iamVjdF90KiByZWY7Ci0gICAgICAgIExvY2FsUmVmKCk7Ci0gICAgICAgIExvY2FsUmVmKGNvbnN0IExvY2FsUmVmKiByaHMpOwotICAgIHB1YmxpYzoKLSAgICAgICAgfkxvY2FsUmVmKCk7Ci0gICAgICAgIGV4cGxpY2l0IExvY2FsUmVmKGVnbF9vYmplY3RfdCogcmhzKTsKLSAgICAgICAgZXhwbGljaXQgTG9jYWxSZWYoZWdsX2Rpc3BsYXlfdCBjb25zdCogZGlzcGxheSwgVCBvKSA6IHJlZigwKSB7Ci0gICAgICAgICAgICBlZ2xfb2JqZWN0X3QqIG5hdGl2ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Tio+KG8pOwotICAgICAgICAgICAgaWYgKG8gJiYgZWdsX29iamVjdF90OjpnZXQoZGlzcGxheSwgbmF0aXZlKSkgewotICAgICAgICAgICAgICAgIHJlZiA9IG5hdGl2ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbmxpbmUgTiogZ2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PE4qPihyZWYpOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgYWNxdWlyZSgpIGNvbnN0OwotICAgICAgICB2b2lkIHJlbGVhc2UoKSBjb25zdDsKLSAgICAgICAgdm9pZCB0ZXJtaW5hdGUoKTsKLSAgICB9OwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBOLCB0eXBlbmFtZSBUPgotICAgIGZyaWVuZCBjbGFzcyBMb2NhbFJlZjsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIE4sIHR5cGVuYW1lIFQ+Ci1lZ2xfb2JqZWN0X3Q6OkxvY2FsUmVmPE4sIFQ+OjpMb2NhbFJlZihlZ2xfb2JqZWN0X3QqIHJocykgOiByZWYocmhzKSB7Ci0gICAgaWYgKHJlZikgewotICAgICAgICByZWYtPmluY1JlZigpOwotICAgIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE4sIHR5cGVuYW1lIFQ+Ci1lZ2xfb2JqZWN0X3Q6OkxvY2FsUmVmPE4sVD46On5Mb2NhbFJlZigpIHsKLSAgICBpZiAocmVmKSB7Ci0gICAgICAgIHJlZi0+ZGVzdHJveSgpOwotICAgIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE4sIHR5cGVuYW1lIFQ+Ci12b2lkIGVnbF9vYmplY3RfdDo6TG9jYWxSZWY8TixUPjo6YWNxdWlyZSgpIGNvbnN0IHsKLSAgICBpZiAocmVmKSB7Ci0gICAgICAgIHJlZi0+aW5jUmVmKCk7Ci0gICAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTiwgdHlwZW5hbWUgVD4KLXZvaWQgZWdsX29iamVjdF90OjpMb2NhbFJlZjxOLFQ+OjpyZWxlYXNlKCkgY29uc3QgewotICAgIGlmIChyZWYpIHsKLSAgICAgICAgaWYgKHJlZi0+ZGVjUmVmKCkgPT0gMSkgewotICAgICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbiBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkIGZyb20gTG9jYWxSZWYKLSAgICAgICAgICAgIEFMT0dFKCJMb2NhbFJlZjo6cmVsZWFzZSgpIHJlbW92ZWQgdGhlIGxhc3QgcmVmZXJlbmNlISIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTiwgdHlwZW5hbWUgVD4KLXZvaWQgZWdsX29iamVjdF90OjpMb2NhbFJlZjxOLFQ+Ojp0ZXJtaW5hdGUoKSB7Ci0gICAgaWYgKHJlZikgewotICAgICAgICByZWYtPnRlcm1pbmF0ZSgpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBlZ2xfc3VyZmFjZV90IDogcHVibGljIGVnbF9vYmplY3RfdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgfmVnbF9zdXJmYWNlX3QoKSB7Ci0gICAgICAgIEFOYXRpdmVXaW5kb3cqIGNvbnN0IHdpbmRvdyA9IHdpbi5nZXQoKTsKLSAgICAgICAgaWYgKHdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdCh3aW5kb3csIDApOwotICAgICAgICAgICAgaWYgKG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3Qod2luZG93LCBOQVRJVkVfV0lORE9XX0FQSV9FR0wpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkVHTE5hdGl2ZVdpbmRvd1R5cGUgJXAgZGlzY29ubmVjdCBmYWlsZWQiLCB3aW5kb3cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotcHVibGljOgotICAgIHR5cGVkZWYgZWdsX29iamVjdF90OjpMb2NhbFJlZjxlZ2xfc3VyZmFjZV90LCBFR0xTdXJmYWNlPiBSZWY7Ci0KLSAgICBlZ2xfc3VyZmFjZV90KEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbiwKLSAgICAgICAgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZSwgZWdsX2Nvbm5lY3Rpb25fdCBjb25zdCogY254KSA6Ci0gICAgICAgIGVnbF9vYmplY3RfdChnZXRfZGlzcGxheShkcHkpKSwgZHB5KGRweSksIHN1cmZhY2Uoc3VyZmFjZSksCi0gICAgICAgICAgICAgICAgY29uZmlnKGNvbmZpZyksIHdpbih3aW4pLCBjbngoY254KSB7Ci0gICAgfQotICAgIEVHTERpc3BsYXkgZHB5OwotICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICBFR0xDb25maWcgY29uZmlnOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbjsKLSAgICBlZ2xfY29ubmVjdGlvbl90IGNvbnN0KiBjbng7Ci19OwotCi1jbGFzcyBlZ2xfY29udGV4dF90OiBwdWJsaWMgZWdsX29iamVjdF90IHsKLXByb3RlY3RlZDoKLSAgICB+ZWdsX2NvbnRleHRfdCgpIHt9Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBlZ2xfb2JqZWN0X3Q6OkxvY2FsUmVmPGVnbF9jb250ZXh0X3QsIEVHTENvbnRleHQ+IFJlZjsKLQotICAgIGVnbF9jb250ZXh0X3QoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY29udGV4dCwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgICAgIGVnbF9jb25uZWN0aW9uX3QgY29uc3QqIGNueCwgaW50IHZlcnNpb24pOwotCi0gICAgdm9pZCBvbkxvb3NlQ3VycmVudCgpOwotICAgIHZvaWQgb25NYWtlQ3VycmVudChFR0xTdXJmYWNlIGRyYXcsIEVHTFN1cmZhY2UgcmVhZCk7Ci0KLSAgICBFR0xEaXNwbGF5IGRweTsKLSAgICBFR0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgICBFR0xTdXJmYWNlIHJlYWQ7Ci0gICAgRUdMU3VyZmFjZSBkcmF3OwotICAgIGVnbF9jb25uZWN0aW9uX3QgY29uc3QqIGNueDsKLSAgICBpbnQgdmVyc2lvbjsKLSAgICBTdHJpbmc4IGdsX2V4dGVuc2lvbnM7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXR5cGVkZWYgZWdsX3N1cmZhY2VfdDo6UmVmICBTdXJmYWNlUmVmOwotdHlwZWRlZiBlZ2xfY29udGV4dF90OjpSZWYgIENvbnRleHRSZWY7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGU8dHlwZW5hbWUgTkFUSVZFLCB0eXBlbmFtZSBFR0w+Ci1zdGF0aWMgaW5saW5lIE5BVElWRSogZWdsX3RvX25hdGl2ZV9jYXN0KEVHTCBhcmcpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxOQVRJVkUqPihhcmcpOwotfQotCi1zdGF0aWMgaW5saW5lCi1lZ2xfc3VyZmFjZV90KiBnZXRfc3VyZmFjZShFR0xTdXJmYWNlIHN1cmZhY2UpIHsKLSAgICByZXR1cm4gZWdsX3RvX25hdGl2ZV9jYXN0PGVnbF9zdXJmYWNlX3Q+KHN1cmZhY2UpOwotfQotCi1zdGF0aWMgaW5saW5lCi1lZ2xfY29udGV4dF90KiBnZXRfY29udGV4dChFR0xDb250ZXh0IGNvbnRleHQpIHsKLSAgICByZXR1cm4gZWdsX3RvX25hdGl2ZV9jYXN0PGVnbF9jb250ZXh0X3Q+KGNvbnRleHQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9FR0xfT0JKRUNUX0gKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2xfdGxzLmNwcCBiL29wZW5nbC9saWJzL0VHTC9lZ2xfdGxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjZmFlMS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsX3Rscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotCi0jaW5jbHVkZSAiZWdsX3Rscy5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotcHRocmVhZF9rZXlfdCBlZ2xfdGxzX3Q6OnNLZXkgPSAtMTsKLXB0aHJlYWRfbXV0ZXhfdCBlZ2xfdGxzX3Q6OnNMb2NrS2V5ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKLQotZWdsX3Rsc190OjplZ2xfdGxzX3QoKQotICAgIDogZXJyb3IoRUdMX1NVQ0NFU1MpLCBjdHgoMCksIGxvZ0NhbGxXaXRoTm9Db250ZXh0KEVHTF9UUlVFKSB7Ci19Ci0KLWNvbnN0IGNoYXIgKmVnbF90bHNfdDo6ZWdsX3N0cmVycm9yKEVHTGludCBlcnIpIHsKLSAgICBzd2l0Y2ggKGVycikgewotICAgICAgICBjYXNlIEVHTF9TVUNDRVNTOiAgICAgICAgICAgICAgIHJldHVybiAiRUdMX1NVQ0NFU1MiOwotICAgICAgICBjYXNlIEVHTF9OT1RfSU5JVElBTElaRUQ6ICAgICAgIHJldHVybiAiRUdMX05PVF9JTklUSUFMSVpFRCI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9BQ0NFU1M6ICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX0FDQ0VTUyI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9BTExPQzogICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX0FMTE9DIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0FUVFJJQlVURTogICAgICAgICByZXR1cm4gIkVHTF9CQURfQVRUUklCVVRFIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0NPTkZJRzogICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfQ09ORklHIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0NPTlRFWFQ6ICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfQ09OVEVYVCI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0U6ICAgcmV0dXJuICJFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRSI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9ESVNQTEFZOiAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX0RJU1BMQVkiOwotICAgICAgICBjYXNlIEVHTF9CQURfTUFUQ0g6ICAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9NQVRDSCI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfUElYTUFQOiAgICAgcmV0dXJuICJFR0xfQkFEX05BVElWRV9QSVhNQVAiOwotICAgICAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1dJTkRPVzogICAgIHJldHVybiAiRUdMX0JBRF9OQVRJVkVfV0lORE9XIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX1BBUkFNRVRFUjogICAgICAgICByZXR1cm4gIkVHTF9CQURfUEFSQU1FVEVSIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX1NVUkZBQ0U6ICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfU1VSRkFDRSI7Ci0gICAgICAgIGNhc2UgRUdMX0NPTlRFWFRfTE9TVDogICAgICAgICAgcmV0dXJuICJFR0xfQ09OVEVYVF9MT1NUIjsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuICJVTktOT1dOIjsKLSAgICB9Ci19Ci0KLXZvaWQgZWdsX3Rsc190Ojp2YWxpZGF0ZVRMU0tleSgpCi17Ci0gICAgaWYgKHNLZXkgPT0gLTEpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzTG9ja0tleSk7Ci0gICAgICAgIGlmIChzS2V5ID09IC0xKQotICAgICAgICAgICAgcHRocmVhZF9rZXlfY3JlYXRlKCZzS2V5LCBOVUxMKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNMb2NrS2V5KTsKLSAgICB9Ci19Ci0KLXZvaWQgZWdsX3Rsc190OjpzZXRFcnJvckV0Y0ltcGwoCi0gICAgICAgIGNvbnN0IGNoYXIqIGNhbGxlciwgaW50IGxpbmUsIEVHTGludCBlcnJvciwgYm9vbCBxdWlldCkgewotICAgIHZhbGlkYXRlVExTS2V5KCk7Ci0gICAgZWdsX3Rsc190KiB0bHMgPSBnZXRUTFMoKTsKLSAgICBpZiAodGxzLT5lcnJvciAhPSBlcnJvcikgewotICAgICAgICBpZiAoIXF1aWV0KSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6JWQgZXJyb3IgJXggKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgIGNhbGxlciwgbGluZSwgZXJyb3IsIGVnbF9zdHJlcnJvcihlcnJvcikpOwotICAgICAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICAgICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5lZ2wuY2FsbHN0YWNrIiwgdmFsdWUsICIwIik7Ci0gICAgICAgICAgICBpZiAoYXRvaSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBDYWxsU3RhY2sgc3RhY2s7Ci0gICAgICAgICAgICAgICAgc3RhY2sudXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgc3RhY2suZHVtcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRscy0+ZXJyb3IgPSBlcnJvcjsKLSAgICB9Ci19Ci0KLWJvb2wgZWdsX3Rsc190Ojpsb2dOb0NvbnRleHRDYWxsKCkgewotICAgIGVnbF90bHNfdCogdGxzID0gZ2V0VExTKCk7Ci0gICAgaWYgKHRscy0+bG9nQ2FsbFdpdGhOb0NvbnRleHQgPT0gdHJ1ZSkgewotICAgICAgICB0bHMtPmxvZ0NhbGxXaXRoTm9Db250ZXh0ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWVnbF90bHNfdCogZWdsX3Rsc190OjpnZXRUTFMoKSB7Ci0gICAgZWdsX3Rsc190KiB0bHMgPSAoZWdsX3Rsc190KilwdGhyZWFkX2dldHNwZWNpZmljKHNLZXkpOwotICAgIGlmICh0bHMgPT0gMCkgewotICAgICAgICB0bHMgPSBuZXcgZWdsX3Rsc190OwotICAgICAgICBwdGhyZWFkX3NldHNwZWNpZmljKHNLZXksIHRscyk7Ci0gICAgfQotICAgIHJldHVybiB0bHM7Ci19Ci0KLXZvaWQgZWdsX3Rsc190OjpjbGVhclRMUygpIHsKLSAgICBpZiAoc0tleSAhPSAtMSkgewotICAgICAgICBlZ2xfdGxzX3QqIHRscyA9IChlZ2xfdGxzX3QqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoc0tleSk7Ci0gICAgICAgIGlmICh0bHMpIHsKLSAgICAgICAgICAgIGRlbGV0ZSB0bHM7Ci0gICAgICAgICAgICBwdGhyZWFkX3NldHNwZWNpZmljKHNLZXksIDApOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIGVnbF90bHNfdDo6Y2xlYXJFcnJvcigpIHsKLSAgICAvLyBUaGlzIG11c3QgY2xlYXIgdGhlIGVycm9yIGZyb20gYWxsIHRoZSB1bmRlcmx5aW5nIEVHTCBpbXBsZW1lbnRhdGlvbnMgYXMKLSAgICAvLyB3ZWxsIGFzIHRoZSBFR0wgd3JhcHBlciBsYXllci4KLSAgICBlZ2xHZXRFcnJvcigpOwotfQotCi1FR0xpbnQgZWdsX3Rsc190OjpnZXRFcnJvcigpIHsKLSAgICBpZiAoc0tleSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIEVHTF9TVUNDRVNTOwotICAgIGVnbF90bHNfdCogdGxzID0gKGVnbF90bHNfdCopcHRocmVhZF9nZXRzcGVjaWZpYyhzS2V5KTsKLSAgICBpZiAoIXRscykgcmV0dXJuIEVHTF9TVUNDRVNTOwotICAgIEVHTGludCBlcnJvciA9IHRscy0+ZXJyb3I7Ci0gICAgdGxzLT5lcnJvciA9IEVHTF9TVUNDRVNTOwotICAgIHJldHVybiBlcnJvcjsKLX0KLQotdm9pZCBlZ2xfdGxzX3Q6OnNldENvbnRleHQoRUdMQ29udGV4dCBjdHgpIHsKLSAgICB2YWxpZGF0ZVRMU0tleSgpOwotICAgIGdldFRMUygpLT5jdHggPSBjdHg7Ci19Ci0KLUVHTENvbnRleHQgZWdsX3Rsc190OjpnZXRDb250ZXh0KCkgewotICAgIGlmIChzS2V5ID09IC0xKQotICAgICAgICByZXR1cm4gRUdMX05PX0NPTlRFWFQ7Ci0gICAgZWdsX3Rsc190KiB0bHMgPSAoZWdsX3Rsc190ICopcHRocmVhZF9nZXRzcGVjaWZpYyhzS2V5KTsKLSAgICBpZiAoIXRscykgcmV0dXJuIEVHTF9OT19DT05URVhUOwotICAgIHJldHVybiB0bHMtPmN0eDsKLX0KLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsX3Rscy5oIGIvb3BlbmdsL2xpYnMvRUdML2VnbF90bHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0MmNhMC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsX3Rscy5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FR0xfVExTX0gKLSNkZWZpbmUgQU5EUk9JRF9FR0xfVExTX0gKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLQotI2luY2x1ZGUgImVnbGRlZnMuaCIKLSNpbmNsdWRlICJob29rcy5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIERiZ0NvbnRleHQ7Ci0KLWNsYXNzIGVnbF90bHNfdCB7Ci0gICAgc3RhdGljIHB0aHJlYWRfa2V5X3Qgc0tleTsKLSAgICBzdGF0aWMgcHRocmVhZF9tdXRleF90IHNMb2NrS2V5OwotCi0gICAgRUdMaW50ICAgICAgZXJyb3I7Ci0gICAgRUdMQ29udGV4dCAgY3R4OwotICAgIEVHTEJvb2xlYW4gIGxvZ0NhbGxXaXRoTm9Db250ZXh0OwotCi0gICAgZWdsX3Rsc190KCk7Ci0gICAgc3RhdGljIHZvaWQgdmFsaWRhdGVUTFNLZXkoKTsKLSAgICBzdGF0aWMgdm9pZCBzZXRFcnJvckV0Y0ltcGwoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBjYWxsZXIsIGludCBsaW5lLCBFR0xpbnQgZXJyb3IsIGJvb2wgcXVpZXQpOwotCi1wdWJsaWM6Ci0gICAgc3RhdGljIGVnbF90bHNfdCogZ2V0VExTKCk7Ci0gICAgc3RhdGljIHZvaWQgY2xlYXJUTFMoKTsKLSAgICBzdGF0aWMgdm9pZCBjbGVhckVycm9yKCk7Ci0gICAgc3RhdGljIEVHTGludCBnZXRFcnJvcigpOwotICAgIHN0YXRpYyB2b2lkIHNldENvbnRleHQoRUdMQ29udGV4dCBjdHgpOwotICAgIHN0YXRpYyBFR0xDb250ZXh0IGdldENvbnRleHQoKTsKLSAgICBzdGF0aWMgYm9vbCBsb2dOb0NvbnRleHRDYWxsKCk7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmVnbF9zdHJlcnJvcihFR0xpbnQgZXJyKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdGljIFQgc2V0RXJyb3JFdGMoY29uc3QgY2hhciogY2FsbGVyLAotICAgICAgICAgICAgaW50IGxpbmUsIEVHTGludCBlcnJvciwgVCByZXR1cm5WYWx1ZSwgYm9vbCBxdWlldCA9IGZhbHNlKSB7Ci0gICAgICAgIHNldEVycm9yRXRjSW1wbChjYWxsZXIsIGxpbmUsIGVycm9yLCBxdWlldCk7Ci0gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICB9Ci19OwotCi0jZGVmaW5lIHNldEVycm9yKF9lLCBfcikgICAgICAgIFwKLSAgICBlZ2xfdGxzX3Q6OnNldEVycm9yRXRjKF9fRlVOQ1RJT05fXywgX19MSU5FX18sIF9lLCBfcikKLQotI2RlZmluZSBzZXRFcnJvclF1aWV0KF9lLCBfcikgICBcCi0gICAgZWdsX3Rsc190OjpzZXRFcnJvckV0YyhfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBfZSwgX3IsIHRydWUpCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIEVHTF9UUkFDRQotCi1leHRlcm4gZ2xfaG9va3NfdCBjb25zdCogZ2V0R0xUcmFjZVRocmVhZFNwZWNpZmljKCk7Ci0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9FR0xfVExTX0gKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2xkZWZzLmggYi9vcGVuZ2wvbGlicy9FR0wvZWdsZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTAwYzFjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0VHTC9lZ2xkZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0VHTERFRlNfSAotI2RlZmluZSBBTkRST0lEX0VHTERFRlNfSAotCi0jaW5jbHVkZSAiaG9va3MuaCIKLQotI2RlZmluZSBWRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgVkVSU0lPTl9NSU5PUiA0Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gIEVHTERpc3BsYXkgYXJlIGdsb2JhbCwgbm90IGF0dGFjaGVkIHRvIGEgZ2l2ZW4gdGhyZWFkCi1jb25zdCB1bnNpZ25lZCBpbnQgTlVNX0RJU1BMQVlTID0gMTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgZWdsX2Nvbm5lY3Rpb25fdCB7Ci0gICAgZW51bSB7Ci0gICAgICAgIEdMRVN2MV9JTkRFWCA9IDAsCi0gICAgICAgIEdMRVN2Ml9JTkRFWCA9IDEKLSAgICB9OwotCi0gICAgaW5saW5lIGVnbF9jb25uZWN0aW9uX3QoKSA6IGRzbygwKSB7IH0KLSAgICB2b2lkICogICAgICAgICAgICAgIGRzbzsKLSAgICBnbF9ob29rc190ICogICAgICAgIGhvb2tzWzJdOwotICAgIEVHTGludCAgICAgICAgICAgICAgbWFqb3I7Ci0gICAgRUdMaW50ICAgICAgICAgICAgICBtaW5vcjsKLSAgICBlZ2xfdCAgICAgICAgICAgICAgIGVnbDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZXh0ZXJuIGdsX2hvb2tzX3QgZ0hvb2tzWzJdOwotZXh0ZXJuIGdsX2hvb2tzX3QgZ0hvb2tzTm9Db250ZXh0OwotZXh0ZXJuIHB0aHJlYWRfa2V5X3QgZ0dMV3JhcHBlcktleTsKLWV4dGVybiAiQyIgdm9pZCBnbF91bmltcGxlbWVudGVkKCk7Ci1leHRlcm4gIkMiIHZvaWQgZ2xfbm9vcCgpOwotCi1leHRlcm4gY2hhciBjb25zdCAqIGNvbnN0IGdsX25hbWVzW107Ci1leHRlcm4gY2hhciBjb25zdCAqIGNvbnN0IGVnbF9uYW1lc1tdOwotCi1leHRlcm4gZWdsX2Nvbm5lY3Rpb25fdCBnRUdMSW1wbDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8qIEFORFJPSURfRUdMREVGU19IICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZ2V0UHJvY0FkZHJlc3MuY3BwIGIvb3BlbmdsL2xpYnMvRUdML2dldFByb2NBZGRyZXNzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjZjM4ZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZ2V0UHJvY0FkZHJlc3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCi0jaW5jbHVkZSAiZWdsZGVmcy5oIgotI2luY2x1ZGUgImhvb2tzLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI3VuZGVmIEFQSV9FTlRSWQotI3VuZGVmIENBTExfR0xfRVhURU5TSU9OX0FQSQotI3VuZGVmIEdMX0VYVEVOU0lPTgotI3VuZGVmIEdMX0VYVEVOU0lPTl9OQU1FCi0jdW5kZWYgR0xfRVhURU5TSU9OX0FSUkFZCi0jdW5kZWYgR0xfRVhURU5TSU9OX0xJU1QKLSN1bmRlZiBHRVRfVExTCi0KLSNpZiBVU0VfRkFTVF9UTFNfS0VZCi0KLSAgICAjaWZkZWYgSEFWRV9BUk1fVExTX1JFR0lTVEVSCi0gICAgICAgICNkZWZpbmUgR0VUX1RMUyhyZWcpIFwKLSAgICAgICAgICAgICJtcmMgcDE1LCAwLCAiICNyZWcgIiwgYzEzLCBjMCwgMyBcbiIKLSAgICAjZWxzZQotICAgICAgICAjZGVmaW5lIEdFVF9UTFMocmVnKSBcCi0gICAgICAgICAgICAibW92ICAgIiAjcmVnICIsICMweEZGRkYwRkZGICAgICAgXG4iICBcCi0gICAgICAgICAgICAibGRyICAgIiAjcmVnICIsIFsiICNyZWcgIiwgIy0xNV0gXG4iCi0gICAgI2VuZGlmCi0KLSAgICAjZGVmaW5lIEFQSV9FTlRSWShfYXBpKSBfX2F0dHJpYnV0ZV9fKChuYWtlZCkpIF9hcGkKLQotICAgICNkZWZpbmUgQ0FMTF9HTF9FWFRFTlNJT05fQVBJKF9hcGkpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGFzbSB2b2xhdGlsZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBHRVRfVExTKHIxMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgImxkciAgIHIxMiwgW3IxMiwgJVt0bHNdXSBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJjbXAgICByMTIsICMwICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAibGRybmUgcjEyLCBbcjEyLCAlW2FwaV1dIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgImNtcG5lIHIxMiwgIzAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJieG5lICByMTIgICAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAiYnggICAgbHIgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDogW3Rsc10gIkoiKFRMU19TTE9UX09QRU5HTF9BUEkqNCksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIFthcGldICJKIihfX2J1aWx0aW5fb2Zmc2V0b2YoZ2xfaG9va3NfdCwgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQuZXh0ZW5zaW9uc1tfYXBpXSkpICAgIFwKLSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICApOwotCi0gICAgI2RlZmluZSBHTF9FWFRFTlNJT05fTkFNRShfbikgICBfX2dsRXh0RndkIyNfbgotCi0gICAgI2RlZmluZSBHTF9FWFRFTlNJT04oX24pICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdm9pZCBBUElfRU5UUlkoR0xfRVhURU5TSU9OX05BTUUoX24pKSgpIHsgICAgXAotICAgICAgICAgICAgQ0FMTF9HTF9FWFRFTlNJT05fQVBJKF9uKTsgICAgICAgICAgICAgICBcCi0gICAgICAgIH0KLQotCi0jZWxzZQotCi0gICAgI2RlZmluZSBHTF9FWFRFTlNJT05fTkFNRShfbikgTlVMTAotCi0gICAgI2RlZmluZSBHTF9FWFRFTlNJT04oX24pCi0KLSAgICAjd2FybmluZyAiZWdsR2V0UHJvY0FkZHJlc3MoKSBwYXJ0aWFsbHkgc3VwcG9ydGVkIgotCi0jZW5kaWYKLQotCi0jZGVmaW5lIEdMX0VYVEVOU0lPTl9MSVNUKG5hbWUpIFwKLSAgICBuYW1lKDApICAgbmFtZSgxKSAgIG5hbWUoMikgICBuYW1lKDMpICAgbmFtZSg0KSAgIG5hbWUoNSkgICBuYW1lKDYpICAgbmFtZSg3KSAgXAotICAgIG5hbWUoOCkgICBuYW1lKDkpICAgbmFtZSgxMCkgIG5hbWUoMTEpICBuYW1lKDEyKSAgbmFtZSgxMykgIG5hbWUoMTQpICBuYW1lKDE1KSBcCi0gICAgbmFtZSgxNikgIG5hbWUoMTcpICBuYW1lKDE4KSAgbmFtZSgxOSkgIG5hbWUoMjApICBuYW1lKDIxKSAgbmFtZSgyMikgIG5hbWUoMjMpIFwKLSAgICBuYW1lKDI0KSAgbmFtZSgyNSkgIG5hbWUoMjYpICBuYW1lKDI3KSAgbmFtZSgyOCkgIG5hbWUoMjkpICBuYW1lKDMwKSAgbmFtZSgzMSkgXAotICAgIG5hbWUoMzIpICBuYW1lKDMzKSAgbmFtZSgzNCkgIG5hbWUoMzUpICBuYW1lKDM2KSAgbmFtZSgzNykgIG5hbWUoMzgpICBuYW1lKDM5KSBcCi0gICAgbmFtZSg0MCkgIG5hbWUoNDEpICBuYW1lKDQyKSAgbmFtZSg0MykgIG5hbWUoNDQpICBuYW1lKDQ1KSAgbmFtZSg0NikgIG5hbWUoNDcpIFwKLSAgICBuYW1lKDQ4KSAgbmFtZSg0OSkgIG5hbWUoNTApICBuYW1lKDUxKSAgbmFtZSg1MikgIG5hbWUoNTMpICBuYW1lKDU0KSAgbmFtZSg1NSkgXAotICAgIG5hbWUoNTYpICBuYW1lKDU3KSAgbmFtZSg1OCkgIG5hbWUoNTkpICBuYW1lKDYwKSAgbmFtZSg2MSkgIG5hbWUoNjIpICBuYW1lKDYzKSBcCi0gICAgbmFtZSg2NCkgIG5hbWUoNjUpICBuYW1lKDY2KSAgbmFtZSg2NykgIG5hbWUoNjgpICBuYW1lKDY5KSAgbmFtZSg3MCkgIG5hbWUoNzEpIFwKLSAgICBuYW1lKDcyKSAgbmFtZSg3MykgIG5hbWUoNzQpICBuYW1lKDc1KSAgbmFtZSg3NikgIG5hbWUoNzcpICBuYW1lKDc4KSAgbmFtZSg3OSkgXAotICAgIG5hbWUoODApICBuYW1lKDgxKSAgbmFtZSg4MikgIG5hbWUoODMpICBuYW1lKDg0KSAgbmFtZSg4NSkgIG5hbWUoODYpICBuYW1lKDg3KSBcCi0gICAgbmFtZSg4OCkgIG5hbWUoODkpICBuYW1lKDkwKSAgbmFtZSg5MSkgIG5hbWUoOTIpICBuYW1lKDkzKSAgbmFtZSg5NCkgIG5hbWUoOTUpIFwKLSAgICBuYW1lKDk2KSAgbmFtZSg5NykgIG5hbWUoOTgpICBuYW1lKDk5KSAgXAotICAgIG5hbWUoMTAwKSBuYW1lKDEwMSkgbmFtZSgxMDIpIG5hbWUoMTAzKSBuYW1lKDEwNCkgbmFtZSgxMDUpIG5hbWUoMTA2KSBuYW1lKDEwNykgXAotICAgIG5hbWUoMTA4KSBuYW1lKDEwOSkgbmFtZSgxMTApIG5hbWUoMTExKSBuYW1lKDExMikgbmFtZSgxMTMpIG5hbWUoMTE0KSBuYW1lKDExNSkgXAotICAgIG5hbWUoMTE2KSBuYW1lKDExNykgbmFtZSgxMTgpIG5hbWUoMTE5KSBuYW1lKDEyMCkgbmFtZSgxMjEpIG5hbWUoMTIyKSBuYW1lKDEyMykgXAotICAgIG5hbWUoMTI0KSBuYW1lKDEyNSkgbmFtZSgxMjYpIG5hbWUoMTI3KSBuYW1lKDEyOCkgbmFtZSgxMjkpIG5hbWUoMTMwKSBuYW1lKDEzMSkgXAotICAgIG5hbWUoMTMyKSBuYW1lKDEzMykgbmFtZSgxMzQpIG5hbWUoMTM1KSBuYW1lKDEzNikgbmFtZSgxMzcpIG5hbWUoMTM4KSBuYW1lKDEzOSkgXAotICAgIG5hbWUoMTQwKSBuYW1lKDE0MSkgbmFtZSgxNDIpIG5hbWUoMTQzKSBuYW1lKDE0NCkgbmFtZSgxNDUpIG5hbWUoMTQ2KSBuYW1lKDE0NykgXAotICAgIG5hbWUoMTQ4KSBuYW1lKDE0OSkgbmFtZSgxNTApIG5hbWUoMTUxKSBuYW1lKDE1MikgbmFtZSgxNTMpIG5hbWUoMTU0KSBuYW1lKDE1NSkgXAotICAgIG5hbWUoMTU2KSBuYW1lKDE1NykgbmFtZSgxNTgpIG5hbWUoMTU5KSBuYW1lKDE2MCkgbmFtZSgxNjEpIG5hbWUoMTYyKSBuYW1lKDE2MykgXAotICAgIG5hbWUoMTY0KSBuYW1lKDE2NSkgbmFtZSgxNjYpIG5hbWUoMTY3KSBuYW1lKDE2OCkgbmFtZSgxNjkpIG5hbWUoMTcwKSBuYW1lKDE3MSkgXAotICAgIG5hbWUoMTcyKSBuYW1lKDE3MykgbmFtZSgxNzQpIG5hbWUoMTc1KSBuYW1lKDE3NikgbmFtZSgxNzcpIG5hbWUoMTc4KSBuYW1lKDE3OSkgXAotICAgIG5hbWUoMTgwKSBuYW1lKDE4MSkgbmFtZSgxODIpIG5hbWUoMTgzKSBuYW1lKDE4NCkgbmFtZSgxODUpIG5hbWUoMTg2KSBuYW1lKDE4NykgXAotICAgIG5hbWUoMTg4KSBuYW1lKDE4OSkgbmFtZSgxOTApIG5hbWUoMTkxKSBuYW1lKDE5MikgbmFtZSgxOTMpIG5hbWUoMTk0KSBuYW1lKDE5NSkgXAotICAgIG5hbWUoMTk2KSBuYW1lKDE5NykgbmFtZSgxOTgpIG5hbWUoMTk5KSBcCi0gICAgbmFtZSgyMDApIG5hbWUoMjAxKSBuYW1lKDIwMikgbmFtZSgyMDMpIG5hbWUoMjA0KSBuYW1lKDIwNSkgbmFtZSgyMDYpIG5hbWUoMjA3KSBcCi0gICAgbmFtZSgyMDgpIG5hbWUoMjA5KSBuYW1lKDIxMCkgbmFtZSgyMTEpIG5hbWUoMjEyKSBuYW1lKDIxMykgbmFtZSgyMTQpIG5hbWUoMjE1KSBcCi0gICAgbmFtZSgyMTYpIG5hbWUoMjE3KSBuYW1lKDIxOCkgbmFtZSgyMTkpIG5hbWUoMjIwKSBuYW1lKDIyMSkgbmFtZSgyMjIpIG5hbWUoMjIzKSBcCi0gICAgbmFtZSgyMjQpIG5hbWUoMjI1KSBuYW1lKDIyNikgbmFtZSgyMjcpIG5hbWUoMjI4KSBuYW1lKDIyOSkgbmFtZSgyMzApIG5hbWUoMjMxKSBcCi0gICAgbmFtZSgyMzIpIG5hbWUoMjMzKSBuYW1lKDIzNCkgbmFtZSgyMzUpIG5hbWUoMjM2KSBuYW1lKDIzNykgbmFtZSgyMzgpIG5hbWUoMjM5KSBcCi0gICAgbmFtZSgyNDApIG5hbWUoMjQxKSBuYW1lKDI0MikgbmFtZSgyNDMpIG5hbWUoMjQ0KSBuYW1lKDI0NSkgbmFtZSgyNDYpIG5hbWUoMjQ3KSBcCi0gICAgbmFtZSgyNDgpIG5hbWUoMjQ5KSBuYW1lKDI1MCkgbmFtZSgyNTEpIG5hbWUoMjUyKSBuYW1lKDI1MykgbmFtZSgyNTQpIG5hbWUoMjU1KQotCi0KLUdMX0VYVEVOU0lPTl9MSVNUKCBHTF9FWFRFTlNJT04gKQotCi0jZGVmaW5lIEdMX0VYVEVOU0lPTl9BUlJBWShfbikgIEdMX0VYVEVOU0lPTl9OQU1FKF9uKSwKLQotZXh0ZXJuIGNvbnN0IF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgZ0V4dGVuc2lvbkZvcndhcmRlcnNbTUFYX05VTUJFUl9PRl9HTF9FWFRFTlNJT05TXSA9IHsKLSAgICAgICAgR0xfRVhURU5TSU9OX0xJU1QoIEdMX0VYVEVOU0lPTl9BUlJBWSApCi0gfTsKLQotI3VuZGVmIEdFVF9UTFMKLSN1bmRlZiBHTF9FWFRFTlNJT05fTElTVAotI3VuZGVmIEdMX0VYVEVOU0lPTl9BUlJBWQotI3VuZGVmIEdMX0VYVEVOU0lPTl9OQU1FCi0jdW5kZWYgR0xfRVhURU5TSU9OCi0jdW5kZWYgQVBJX0VOVFJZCi0jdW5kZWYgQ0FMTF9HTF9FWFRFTlNJT05fQVBJCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC90cmFjZS5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvdHJhY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjkwN2MxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0VHTC90cmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZiBFR0xfVFJBQ0UKLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCi0jaW5jbHVkZSAiZWdsX3Rscy5oIgotI2luY2x1ZGUgImhvb2tzLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IEdMZW51bVN0cmluZyB7Ci0gICAgR0xlbnVtIGU7Ci0gICAgY29uc3QgY2hhciogczsKLX07Ci0KLSN1bmRlZiBHTF9FTlVNCi0jZGVmaW5lIEdMX0VOVU0oVkFMLE5BTUUpIHtWQUwsICNOQU1FfSwKLQotc3RhdGljIEdMZW51bVN0cmluZyBnX2VudW1uYW1lc1tdID0gewotI2luY2x1ZGUgImVudW1zLmluIgotfTsKLSN1bmRlZiBHTF9FTlVNCi0KLXN0YXRpYyBpbnQgY29tcGFyZUdMRW51bShjb25zdCB2b2lkKiBhLCBjb25zdCB2b2lkKiBiKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgR0xlbnVtU3RyaW5nKikgYSktPmUgLSAoKGNvbnN0IEdMZW51bVN0cmluZyopIGIpLT5lOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciogR0xFbnVtVG9TdHJpbmcoR0xlbnVtIGUpIHsKLSAgICBHTGVudW1TdHJpbmcga2V5ID0ge2UsICIifTsKLSAgICBjb25zdCBHTGVudW1TdHJpbmcqIHJlc3VsdCA9IChjb25zdCBHTGVudW1TdHJpbmcqKSBic2VhcmNoKAotICAgICAgICAma2V5LCBnX2VudW1uYW1lcywKLSAgICAgICAgc2l6ZW9mKGdfZW51bW5hbWVzKSAvIHNpemVvZihnX2VudW1uYW1lc1swXSksCi0gICAgICAgIHNpemVvZihnX2VudW1uYW1lc1swXSksIGNvbXBhcmVHTEVudW0pOwotICAgIGlmIChyZXN1bHQpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC0+czsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBHTGJvb2xlYW5Ub1N0cmluZyhHTGJvb2xlYW4gYXJnKSB7Ci0gICAgcmV0dXJuIGFyZyA/ICJHTF9UUlVFIiA6ICJHTF9GQUxTRSI7Ci19Ci0KLXN0YXRpYyBHTGVudW1TdHJpbmcgZ19iaXRmaWVsZE5hbWVzW10gPSB7Ci0gICAgezB4MDAwMDQwMDAsICJHTF9DT0xPUl9CVUZGRVJfQklUIn0sCi0gICAgezB4MDAwMDA0MDAsICJHTF9TVEVOQ0lMX0JVRkZFUl9CSVQifSwKLSAgICB7MHgwMDAwMDEwMCwgIkdMX0RFUFRIX0JVRkZFUl9CSVQifQotfTsKLQotY2xhc3MgU3RyaW5nQnVpbGRlciB7Ci0gICAgc3RhdGljIGNvbnN0IGludCBsaW5lU2l6ZSA9IDUwMDsKLSAgICBjaGFyIGxpbmVbbGluZVNpemVdOwotICAgIGludCBsaW5lX2luZGV4OwotcHVibGljOgotICAgIFN0cmluZ0J1aWxkZXIoKSB7Ci0gICAgICAgIGxpbmVfaW5kZXggPSAwOwotICAgICAgICBsaW5lWzBdID0gJ1wwJzsKLSAgICB9Ci0gICAgdm9pZCBhcHBlbmQoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdwOwotICAgICAgICB2YV9zdGFydChhcmdwLCBmbXQpOwotICAgICAgICBsaW5lX2luZGV4ICs9IHZzbnByaW50ZihsaW5lICsgbGluZV9pbmRleCwgbGluZVNpemUtbGluZV9pbmRleCwgZm10LCBhcmdwKTsKLSAgICAgICAgdmFfZW5kKGFyZ3ApOwotICAgIH0KLSAgICBjb25zdCBjaGFyKiBnZXRTdHJpbmcoKSB7Ci0gICAgICAgIGxpbmVfaW5kZXggPSAwOwotICAgICAgICBsaW5lW2xpbmVTaXplLTFdID0gJ1wwJzsKLSAgICAgICAgcmV0dXJuIGxpbmU7Ci0gICAgfQotfTsKLQotCi1zdGF0aWMgdm9pZCBUcmFjZUdMU2hhZGVyU291cmNlKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsCi0gICAgY29uc3QgR0xjaGFyKiogc3RyaW5nLCBjb25zdCBHTGludCogbGVuZ3RoKSB7Ci0gICAgQUxPR0QoImNvbnN0IGNoYXIqIHNoYWRlclNyY1tdID0geyIpOwotICAgIGZvciAoR0xzaXplaSBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgY29uc3QgY2hhciogY29tbWEgPSBpIDwgY291bnQtMSA/ICIsIiA6ICIiOwotICAgICAgICBjb25zdCBHTGNoYXIqIHMgPSBzdHJpbmdbaV07Ci0gICAgICAgIGlmIChsZW5ndGgpIHsKLSAgICAgICAgICAgIEdMaW50IGxlbiA9IGxlbmd0aFtpXTsKLSAgICAgICAgICAgIEFMT0dEKCIgICAgXCIlKnNcIiVzIiwgbGVuLCBzLCBjb21tYSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRCgiICAgIFwiJXNcIiVzIiwgcywgY29tbWEpOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dEKCJ9OyIpOwotICAgIGlmIChsZW5ndGgpIHsKLSAgICAgICAgQUxPR0QoImNvbnN0IEdMaW50KiBzaGFkZXJMZW5ndGhbXSA9IHsiKTsKLSAgICAgICAgZm9yIChHTHNpemVpIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWEgPSBpIDwgY291bnQtMSA/ICIsIiA6ICIiOwotICAgICAgICAgICAgR0xpbnQgbGVuID0gbGVuZ3RoW2ldOwotICAgICAgICAgICAgQUxPR0QoIiAgICBcIiVkXCIlcyIsIGxlbiwgY29tbWEpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dEKCJ9OyIpOwotICAgICAgICBBTE9HRCgiZ2xTaGFkZXJTb3VyY2UoJXUsICV1LCBzaGFkZXJTcmMsIHNoYWRlckxlbmd0aCk7IiwKLSAgICAgICAgICAgIHNoYWRlciwgY291bnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dEKCJnbFNoYWRlclNvdXJjZSgldSwgJXUsIHNoYWRlclNyYywgKGNvbnN0IEdMaW50KikgMCk7IiwKLSAgICAgICAgICAgIHNoYWRlciwgY291bnQpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgVHJhY2VWYWx1ZShpbnQgZWxlbWVudENvdW50LCBjaGFyIHR5cGUsCi0gICAgICAgIEdMc2l6ZWkgY2h1bmtDb3VudCwgR0xzaXplaSBjaHVua1NpemUsIGNvbnN0IHZvaWQqIHZhbHVlKSB7Ci0gICAgU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyOwotICAgIEdMc2l6ZWkgY291bnQgPSBjaHVua0NvdW50ICogY2h1bmtTaXplOwotICAgIGJvb2wgaXNGbG9hdCA9IHR5cGUgPT0gJ2YnOwotICAgIGNvbnN0IGNoYXIqIHR5cGVTdHJpbmcgPSBpc0Zsb2F0ID8gIkdMZmxvYXQiIDogIkdMaW50IjsKLSAgICBBTE9HRCgiY29uc3QgJXMgdmFsdWVbXSA9IHsiLCB0eXBlU3RyaW5nKTsKLSAgICBmb3IgKEdMc2l6ZWkgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAgICAiKTsKLSAgICAgICAgZm9yIChpbnQgZSA9IDA7IGUgPCBlbGVtZW50Q291bnQ7IGUrKykgewotICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWEgPSAiLCAiOwotICAgICAgICAgICAgaWYgKGUgPT0gZWxlbWVudENvdW50LTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBjb3VudCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAiIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb21tYSA9ICIsIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNGbG9hdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIlZyVzIiwgKiAoR0xmbG9hdCopIHZhbHVlLCBjb21tYSk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAodm9pZCopICgoKEdMZmxvYXQqKSB2YWx1ZSkgKyAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiVkJXMiLCAqIChHTGludCopIHZhbHVlLCBjb21tYSk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAodm9pZCopICgoKEdMaW50KikgdmFsdWUpICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0QoIiVzIiwgYnVpbGRlci5nZXRTdHJpbmcoKSk7Ci0gICAgICAgIGlmIChjaHVua1NpemUgPiAxICYmIGkgPCBjb3VudC0xCi0gICAgICAgICAgICAgICAgJiYgKGkgJSBjaHVua1NpemUpID09IChjaHVua1NpemUtMSkpIHsKLSAgICAgICAgICAgIEFMT0dEKCIlcyIsICIiKTsgLy8gUHJpbnQgYSBibGFuayBsaW5lLgotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dEKCJ9OyIpOwotfQotCi1zdGF0aWMgdm9pZCBUcmFjZVVuaWZvcm12KGludCBlbGVtZW50Q291bnQsIGNoYXIgdHlwZSwKLSAgICAgICAgR0x1aW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCB2b2lkKiB2YWx1ZSkgewotICAgIFRyYWNlVmFsdWUoZWxlbWVudENvdW50LCB0eXBlLCBjb3VudCwgMSwgdmFsdWUpOwotICAgIEFMT0dEKCJnbFVuaWZvcm0lZCVjKCV1LCAldSwgdmFsdWUpOyIsIGVsZW1lbnRDb3VudCwgdHlwZSwgbG9jYXRpb24sIGNvdW50KTsKLX0KLQotc3RhdGljIHZvaWQgVHJhY2VVbmlmb3JtTWF0cml4KGludCBtYXRyaXhTaWRlTGVuZ3RoLAotICAgICAgICBHTHVpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IHZvaWQqIHZhbHVlKSB7Ci0gICAgVHJhY2VWYWx1ZShtYXRyaXhTaWRlTGVuZ3RoLCAnZicsIGNvdW50LCBtYXRyaXhTaWRlTGVuZ3RoLCB2YWx1ZSk7Ci0gICAgQUxPR0QoImdsVW5pZm9ybU1hdHJpeCVkZnYoJXUsICV1LCAlcywgdmFsdWUpOyIsIG1hdHJpeFNpZGVMZW5ndGgsIGxvY2F0aW9uLCBjb3VudCwKLSAgICAgICAgICAgIEdMYm9vbGVhblRvU3RyaW5nKHRyYW5zcG9zZSkpOwotfQotCi1zdGF0aWMgdm9pZCBUcmFjZUdMKGNvbnN0IGNoYXIqIG5hbWUsIGludCBudW1BcmdzLCAuLi4pIHsKLSAgICB2YV9saXN0IGFyZ3A7Ci0gICAgdmFfc3RhcnQoYXJncCwgbnVtQXJncyk7Ci0gICAgaW50IG5hbWVMZW4gPSBzdHJsZW4obmFtZSk7Ci0KLSAgICAvLyBnbFNoYWRlclNvdXJjZQotICAgIGlmIChuYW1lTGVuID09IDE0ICYmIHN0cmNtcChuYW1lLCAiZ2xTaGFkZXJTb3VyY2UiKSA9PSAwKSB7Ci0gICAgICAgIHZhX2FyZyhhcmdwLCBjb25zdCBjaGFyKik7Ci0gICAgICAgIEdMdWludCBzaGFkZXIgPSB2YV9hcmcoYXJncCwgR0x1aW50KTsKLSAgICAgICAgdmFfYXJnKGFyZ3AsIGNvbnN0IGNoYXIqKTsKLSAgICAgICAgR0xzaXplaSBjb3VudCA9IHZhX2FyZyhhcmdwLCBHTHNpemVpKTsKLSAgICAgICAgdmFfYXJnKGFyZ3AsIGNvbnN0IGNoYXIqKTsKLSAgICAgICAgY29uc3QgR0xjaGFyKiogc3RyaW5nID0gKGNvbnN0IEdMY2hhcioqKSB2YV9hcmcoYXJncCwgdm9pZCopOwotICAgICAgICB2YV9hcmcoYXJncCwgY29uc3QgY2hhciopOwotICAgICAgICBjb25zdCBHTGludCogbGVuZ3RoID0gKGNvbnN0IEdMaW50KikgdmFfYXJnKGFyZ3AsIHZvaWQqKTsKLSAgICAgICAgdmFfZW5kKGFyZ3ApOwotICAgICAgICBUcmFjZUdMU2hhZGVyU291cmNlKHNoYWRlciwgY291bnQsIHN0cmluZywgbGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGdsVW5pZm9ybVhYdgotCi0gICAgaWYgKG5hbWVMZW4gPT0gMTIgJiYgc3RybmNtcChuYW1lLCAiZ2xVbmlmb3JtIiwgOSkgPT0gMCAmJiBuYW1lWzExXSA9PSAndicpIHsKLSAgICAgICAgaW50IGVsZW1lbnRDb3VudCA9IG5hbWVbOV0gLSAnMCc7IC8vIDEuLjQKLSAgICAgICAgY2hhciB0eXBlID0gbmFtZVsxMF07IC8vICdmJyBvciAnaScKLSAgICAgICAgdmFfYXJnKGFyZ3AsIGNvbnN0IGNoYXIqKTsKLSAgICAgICAgR0x1aW50IGxvY2F0aW9uID0gdmFfYXJnKGFyZ3AsIEdMdWludCk7Ci0gICAgICAgIHZhX2FyZyhhcmdwLCBjb25zdCBjaGFyKik7Ci0gICAgICAgIEdMc2l6ZWkgY291bnQgPSB2YV9hcmcoYXJncCwgR0xzaXplaSk7Ci0gICAgICAgIHZhX2FyZyhhcmdwLCBjb25zdCBjaGFyKik7Ci0gICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlID0gKGNvbnN0IHZvaWQqKSB2YV9hcmcoYXJncCwgdm9pZCopOwotICAgICAgICB2YV9lbmQoYXJncCk7Ci0gICAgICAgIFRyYWNlVW5pZm9ybXYoZWxlbWVudENvdW50LCB0eXBlLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGdsVW5pZm9ybU1hdHJpeFhmdgotCi0gICAgaWYgKG5hbWVMZW4gPT0gMTggJiYgc3RybmNtcChuYW1lLCAiZ2xVbmlmb3JtTWF0cml4IiwgMTUpID09IDAKLSAgICAgICAgICAgICYmIG5hbWVbMTZdID09ICdmJyAmJiBuYW1lWzE3XSA9PSAndicpIHsKLSAgICAgICAgaW50IG1hdHJpeFNpZGVMZW5ndGggPSBuYW1lWzE1XSAtICcwJzsgLy8gMi4uNAotICAgICAgICB2YV9hcmcoYXJncCwgY29uc3QgY2hhciopOwotICAgICAgICBHTHVpbnQgbG9jYXRpb24gPSB2YV9hcmcoYXJncCwgR0x1aW50KTsKLSAgICAgICAgdmFfYXJnKGFyZ3AsIGNvbnN0IGNoYXIqKTsKLSAgICAgICAgR0xzaXplaSBjb3VudCA9IHZhX2FyZyhhcmdwLCBHTHNpemVpKTsKLSAgICAgICAgdmFfYXJnKGFyZ3AsIGNvbnN0IGNoYXIqKTsKLSAgICAgICAgR0xib29sZWFuIHRyYW5zcG9zZSA9IChHTGJvb2xlYW4pIHZhX2FyZyhhcmdwLCBpbnQpOwotICAgICAgICB2YV9hcmcoYXJncCwgY29uc3QgY2hhciopOwotICAgICAgICBjb25zdCB2b2lkKiB2YWx1ZSA9IChjb25zdCB2b2lkKikgdmFfYXJnKGFyZ3AsIHZvaWQqKTsKLSAgICAgICAgdmFfZW5kKGFyZ3ApOwotICAgICAgICBUcmFjZVVuaWZvcm1NYXRyaXgobWF0cml4U2lkZUxlbmd0aCwgbG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKLSAgICBidWlsZGVyLmFwcGVuZCgiJXMoIiwgbmFtZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBjaGFyKiB0eXBlID0gdmFfYXJnKGFyZ3AsIGNvbnN0IGNoYXIqKTsKLSAgICAgICAgYm9vbCBpc1B0ciA9IHR5cGVbc3RybGVuKHR5cGUpLTFdID09ICcqJwotICAgICAgICAgICAgfHwgc3RyY21wKHR5cGUsICJHTGVnbEltYWdlT0VTIikgPT0gMDsKLSAgICAgICAgaWYgKGlzUHRyKSB7Ci0gICAgICAgICAgICBjb25zdCB2b2lkKiBhcmcgPSB2YV9hcmcoYXJncCwgY29uc3Qgdm9pZCopOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiglcykgMHglMDh4IiwgdHlwZSwgKHNpemVfdCkgYXJnKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgIkdMYml0ZmllbGQiKSA9PSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgYXJnID0gdmFfYXJnKGFyZ3AsIHNpemVfdCk7Ci0gICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGdfYml0ZmllbGROYW1lcykgLyBzaXplb2YoZ19iaXRmaWVsZE5hbWVzWzBdKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgR0xlbnVtU3RyaW5nKiBiID0gJmdfYml0ZmllbGROYW1lc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoYi0+ZSAmIGFyZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIHwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiVzIiwgYi0+cyk7Ci0gICAgICAgICAgICAgICAgICAgIGFyZyAmPSB+Yi0+ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmlyc3QgfHwgYXJnICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgfCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjB4JTA4eCIsIGFyZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJHTGJvb2xlYW4iKSA9PSAwKSB7Ci0gICAgICAgICAgICBHTGJvb2xlYW4gYXJnID0gdmFfYXJnKGFyZ3AsIGludCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiJXMiLCBHTGJvb2xlYW5Ub1N0cmluZyhhcmcpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgIkdMY2xhbXBmIikgPT0gMCkgewotICAgICAgICAgICAgZG91YmxlIGFyZyA9IHZhX2FyZyhhcmdwLCBkb3VibGUpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiVnIiwgYXJnKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgIkdMZW51bSIpID09IDApIHsKLSAgICAgICAgICAgIEdMZW51bSBhcmcgPSB2YV9hcmcoYXJncCwgaW50KTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMgPSBHTEVudW1Ub1N0cmluZyhhcmcpOwotICAgICAgICAgICAgaWYgKHMpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiJXMiLCBzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjB4JXgiLCBhcmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh0eXBlLCAiR0xmaXhlZCIpID09IDApIHsKLSAgICAgICAgICAgIGludCBhcmcgPSB2YV9hcmcoYXJncCwgaW50KTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIweCUwOHgiLCBhcmcpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh0eXBlLCAiR0xmbG9hdCIpID09IDApIHsKLSAgICAgICAgICAgIGRvdWJsZSBhcmcgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIlZyIsIGFyZyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJHTGludCIpID09IDApIHsKLSAgICAgICAgICAgIGludCBhcmcgPSB2YV9hcmcoYXJncCwgaW50KTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMgPSBOVUxMOwotICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAiZ2xUZXhQYXJhbWV0ZXJpIikgPT0gMCkgewotICAgICAgICAgICAgICAgIHMgPSBHTEVudW1Ub1N0cmluZyhhcmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHMpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiJXMiLCBzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiVkIiwgYXJnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgIkdMaW50cHRyIikgPT0gMCkgewotICAgICAgICAgICAgaW50IGFyZyA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBpbnQpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiV1IiwgYXJnKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgIkdMc2l6ZWkiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpbnQgYXJnID0gdmFfYXJnKGFyZ3AsIHNpemVfdCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiJXUiLCBhcmcpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh0eXBlLCAiR0xzaXplaXB0ciIpID09IDApIHsKLSAgICAgICAgICAgIGludCBhcmcgPSB2YV9hcmcoYXJncCwgc2l6ZV90KTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIldSIsIGFyZyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJHTHVpbnQiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpbnQgYXJnID0gdmFfYXJnKGFyZ3AsIHVuc2lnbmVkIGludCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiJXUiLCBhcmcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIi8qID8/PyAlcyAqLyIsIHR5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYnVpbGRlci5hcHBlbmQoIik7Iik7Ci0gICAgQUxPR0QoIiVzIiwgYnVpbGRlci5nZXRTdHJpbmcoKSk7Ci0gICAgdmFfZW5kKGFyZ3ApOwotfQotCi0jdW5kZWYgVFJBQ0VfR0xfVk9JRAotI3VuZGVmIFRSQUNFX0dMCi0KLSNkZWZpbmUgVFJBQ0VfR0xfVk9JRChfYXBpLCBfYXJncywgX2FyZ0xpc3QsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgVHJhY2luZ18gIyMgX2FwaSBfYXJncyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVHJhY2VHTCgjX2FwaSwgX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R0xUcmFjZVRocmVhZFNwZWNpZmljKCktPmdsOyAgXAotICAgIF9jLT5fYXBpIF9hcmdMaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgVFJBQ0VfR0woX3R5cGUsIF9hcGksIF9hcmdzLCBfYXJnTGlzdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIF90eXBlIFRyYWNpbmdfICMjIF9hcGkgX2FyZ3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVHJhY2VHTCgjX2FwaSwgX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdMVHJhY2VUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKLSAgICByZXR1cm4gX2MtPl9hcGkgX2FyZ0xpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICIuLi90cmFjZS5pbiIKLX0KLQotI3VuZGVmIFRSQUNFX0dMX1ZPSUQKLSN1bmRlZiBUUkFDRV9HTAotCi0jZGVmaW5lIEdMX0VOVFJZKF9yLCBfYXBpLCAuLi4pIFRyYWNpbmdfICMjIF9hcGksCi1FR0xBUEkgZ2xfaG9va3NfdCBnSG9va3NUcmFjZSA9IHsKLSAgICB7Ci0gICAgICAgICNpbmNsdWRlICJlbnRyaWVzLmluIgotICAgIH0sCi0gICAgewotICAgICAgICB7MH0KLSAgICB9Ci19OwotI3VuZGVmIEdMX0VOVFJZCi0KLQotI3VuZGVmIFRSQUNFX0dMX1ZPSUQKLSN1bmRlZiBUUkFDRV9HTAotCi0vLyBkZWZpbmUgdGhlIEVTIDEuMCBEZWJ1Z19nbCogZnVuY3Rpb25zIGFzIFRyYWNpbmdfZ2wgZnVuY3Rpb25zCi0jZGVmaW5lIFRSQUNFX0dMX1ZPSUQoX2FwaSwgX2FyZ3MsIF9hcmdMaXN0LCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyB2b2lkIERlYnVnXyAjIyBfYXBpIF9hcmdzIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBUcmFjZUdMKCNfYXBpLCBfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHTFRyYWNlVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCi0gICAgX2MtPl9hcGkgX2FyZ0xpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBUUkFDRV9HTChfdHlwZSwgX2FwaSwgX2FyZ3MsIF9hcmdMaXN0LCAuLi4pICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgX3R5cGUgRGVidWdfICMjIF9hcGkgX2FyZ3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVHJhY2VHTCgjX2FwaSwgX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdMVHJhY2VUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKLSAgICByZXR1cm4gX2MtPl9hcGkgX2FyZ0xpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICIuLi9kZWJ1Zy5pbiIKLX0KLQotI3VuZGVmIFRSQUNFX0dMX1ZPSUQKLSN1bmRlZiBUUkFDRV9HTAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gRUdMX1RSQUNFCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FVEMxL2V0YzEuY3BwIGIvb3BlbmdsL2xpYnMvRVRDMS9ldGMxLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkMTA4NS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FVEMxL2V0YzEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjcwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlIDxFVEMxL2V0YzEuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBGcm9tIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZ2xlcy9leHRlbnNpb25zL09FUy9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZS50eHQKLQotIFRoZSBudW1iZXIgb2YgYml0cyB0aGF0IHJlcHJlc2VudCBhIDR4NCB0ZXhlbCBibG9jayBpcyA2NCBiaXRzIGlmCi0gPGludGVybmFsZm9ybWF0PiBpcyBnaXZlbiBieSBFVEMxX1JHQjhfT0VTLgotCi0gVGhlIGRhdGEgZm9yIGEgYmxvY2sgaXMgYSBudW1iZXIgb2YgYnl0ZXMsCi0KLSB7cTAsIHExLCBxMiwgcTMsIHE0LCBxNSwgcTYsIHE3fQotCi0gd2hlcmUgYnl0ZSBxMCBpcyBsb2NhdGVkIGF0IHRoZSBsb3dlc3QgbWVtb3J5IGFkZHJlc3MgYW5kIHE3IGF0Ci0gdGhlIGhpZ2hlc3QuIFRoZSA2NCBiaXRzIHNwZWNpZnlpbmcgdGhlIGJsb2NrIGlzIHRoZW4gcmVwcmVzZW50ZWQKLSBieSB0aGUgZm9sbG93aW5nIDY0IGJpdCBpbnRlZ2VyOgotCi0gaW50NjRiaXQgPSAyNTYqKDI1NiooMjU2KigyNTYqKDI1NiooMjU2KigyNTYqcTArcTEpK3EyKStxMykrcTQpK3E1KStxNikrcTc7Ci0KLSBFVEMxX1JHQjhfT0VTOgotCi0gYSkgYml0IGxheW91dCBpbiBiaXRzIDYzIHRocm91Z2ggMzIgaWYgZGlmZmJpdCA9IDAKLQotIDYzIDYyIDYxIDYwIDU5IDU4IDU3IDU2IDU1IDU0IDUzIDUyIDUxIDUwIDQ5IDQ4Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSB8IGJhc2UgY29sMSB8IGJhc2UgY29sMiB8IGJhc2UgY29sMSB8IGJhc2UgY29sMiB8Ci0gfCBSMSAoNGJpdHMpfCBSMiAoNGJpdHMpfCBHMSAoNGJpdHMpfCBHMiAoNGJpdHMpfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MCAzOSAzOCAzNyAzNiAzNSAzNCAgMzMgIDMyCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gfCBiYXNlIGNvbDEgfCBiYXNlIGNvbDIgfCB0YWJsZSAgfCB0YWJsZSAgfGRpZmZ8ZmxpcHwKLSB8IEIxICg0Yml0cyl8IEIyICg0Yml0cyl8IGN3IDEgICB8IGN3IDIgICB8Yml0IHxiaXQgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSBiKSBiaXQgbGF5b3V0IGluIGJpdHMgNjMgdGhyb3VnaCAzMiBpZiBkaWZmYml0ID0gMQotCi0gNjMgNjIgNjEgNjAgNTkgNTggNTcgNTYgNTUgNTQgNTMgNTIgNTEgNTAgNDkgNDgKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgYmFzZSBjb2wxICAgIHwgZGNvbCAyIHwgYmFzZSBjb2wxICAgIHwgZGNvbCAyIHwKLSB8IFIxJyAoNSBiaXRzKSB8IGRSMiAgICB8IEcxJyAoNSBiaXRzKSB8IGRHMiAgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIDQ3IDQ2IDQ1IDQ0IDQzIDQyIDQxIDQwIDM5IDM4IDM3IDM2IDM1IDM0ICAzMyAgMzIKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSB8IGJhc2UgY29sIDEgICB8IGRjb2wgMiB8IHRhYmxlICB8IHRhYmxlICB8ZGlmZnxmbGlwfAotIHwgQjEnICg1IGJpdHMpIHwgZEIyICAgIHwgY3cgMSAgIHwgY3cgMiAgIHxiaXQgfGJpdCB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotIGMpIGJpdCBsYXlvdXQgaW4gYml0cyAzMSB0aHJvdWdoIDAgKGluIGJvdGggY2FzZXMpCi0KLSAzMSAzMCAyOSAyOCAyNyAyNiAyNSAyNCAyMyAyMiAyMSAyMCAxOSAxOCAxNyAxNgotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gfCAgICAgICBtb3N0IHNpZ25pZmljYW50IHBpeGVsIGluZGV4IGJpdHMgICAgICAgfAotIHwgcHwgb3wgbnwgbXwgbHwga3wganwgaXwgaHwgZ3wgZnwgZXwgZHwgY3wgYnwgYXwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gMTUgMTQgMTMgMTIgMTEgMTAgIDkgIDggIDcgIDYgIDUgIDQgIDMgICAyICAgMSAgMAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gfCAgICAgICAgIGxlYXN0IHNpZ25pZmljYW50IHBpeGVsIGluZGV4IGJpdHMgICAgICAgfAotIHwgcHwgb3wgbnwgbXwgbHwga3wganwgaXwgaHwgZ3wgZnwgZXwgZHwgYyB8IGIgfCBhIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSBBZGQgdGFibGUgMy4xNy4yOiBJbnRlbnNpdHkgbW9kaWZpZXIgc2V0cyBmb3IgRVRDMSBjb21wcmVzc2VkIHRleHR1cmVzOgotCi0gdGFibGUgY29kZXdvcmQgICAgICAgICAgICAgICAgbW9kaWZpZXIgdGFibGUKLSAtLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAwICAgICAgICAgICAgICAgICAgICAgLTggIC0yICAyICAgOAotIDEgICAgICAgICAgICAgICAgICAgIC0xNyAgLTUgIDUgIDE3Ci0gMiAgICAgICAgICAgICAgICAgICAgLTI5ICAtOSAgOSAgMjkKLSAzICAgICAgICAgICAgICAgICAgICAtNDIgLTEzIDEzICA0MgotIDQgICAgICAgICAgICAgICAgICAgIC02MCAtMTggMTggIDYwCi0gNSAgICAgICAgICAgICAgICAgICAgLTgwIC0yNCAyNCAgODAKLSA2ICAgICAgICAgICAgICAgICAgIC0xMDYgLTMzIDMzIDEwNgotIDcgICAgICAgICAgICAgICAgICAgLTE4MyAtNDcgNDcgMTgzCi0KLQotIEFkZCB0YWJsZSAzLjE3LjMgTWFwcGluZyBmcm9tIHBpeGVsIGluZGV4IHZhbHVlcyB0byBtb2RpZmllciB2YWx1ZXMgZm9yCi0gRVRDMSBjb21wcmVzc2VkIHRleHR1cmVzOgotCi0gcGl4ZWwgaW5kZXggdmFsdWUKLSAtLS0tLS0tLS0tLS0tLS0KLSBtc2IgICAgIGxzYiAgICAgICAgICAgcmVzdWx0aW5nIG1vZGlmaWVyIHZhbHVlCi0gLS0tLS0gICAtLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gMSAgICAgICAxICAgICAgICAgICAgLWIgKGxhcmdlIG5lZ2F0aXZlIHZhbHVlKQotIDEgICAgICAgMCAgICAgICAgICAgIC1hIChzbWFsbCBuZWdhdGl2ZSB2YWx1ZSkKLSAwICAgICAgIDAgICAgICAgICAgICAgYSAoc21hbGwgcG9zaXRpdmUgdmFsdWUpCi0gMCAgICAgICAxICAgICAgICAgICAgIGIgKGxhcmdlIHBvc2l0aXZlIHZhbHVlKQotCi0KLSAqLwotCi1zdGF0aWMgY29uc3QgaW50IGtNb2RpZmllclRhYmxlW10gPSB7Ci0vKiAwICovMiwgOCwgLTIsIC04LAotLyogMSAqLzUsIDE3LCAtNSwgLTE3LAotLyogMiAqLzksIDI5LCAtOSwgLTI5LAotLyogMyAqLzEzLCA0MiwgLTEzLCAtNDIsCi0vKiA0ICovMTgsIDYwLCAtMTgsIC02MCwKLS8qIDUgKi8yNCwgODAsIC0yNCwgLTgwLAotLyogNiAqLzMzLCAxMDYsIC0zMywgLTEwNiwKLS8qIDcgKi80NywgMTgzLCAtNDcsIC0xODMgfTsKLQotc3RhdGljIGNvbnN0IGludCBrTG9va3VwWzhdID0geyAwLCAxLCAyLCAzLCAtNCwgLTMsIC0yLCAtMSB9OwotCi1zdGF0aWMgaW5saW5lIGV0YzFfYnl0ZSBjbGFtcChpbnQgeCkgewotICAgIHJldHVybiAoZXRjMV9ieXRlKSAoeCA+PSAwID8gKHggPCAyNTUgPyB4IDogMjU1KSA6IDApOwotfQotCi1zdGF0aWMKLWlubGluZSBpbnQgY29udmVydDRUbzgoaW50IGIpIHsKLSAgICBpbnQgYyA9IGIgJiAweGY7Ci0gICAgcmV0dXJuIChjIDw8IDQpIHwgYzsKLX0KLQotc3RhdGljCi1pbmxpbmUgaW50IGNvbnZlcnQ1VG84KGludCBiKSB7Ci0gICAgaW50IGMgPSBiICYgMHgxZjsKLSAgICByZXR1cm4gKGMgPDwgMykgfCAoYyA+PiAyKTsKLX0KLQotc3RhdGljCi1pbmxpbmUgaW50IGNvbnZlcnQ2VG84KGludCBiKSB7Ci0gICAgaW50IGMgPSBiICYgMHgzZjsKLSAgICByZXR1cm4gKGMgPDwgMikgfCAoYyA+PiA0KTsKLX0KLQotc3RhdGljCi1pbmxpbmUgaW50IGRpdmlkZUJ5MjU1KGludCBkKSB7Ci0gICAgcmV0dXJuIChkICsgMTI4ICsgKGQgPj4gOCkpID4+IDg7Ci19Ci0KLXN0YXRpYwotaW5saW5lIGludCBjb252ZXJ0OFRvNChpbnQgYikgewotICAgIGludCBjID0gYiAmIDB4ZmY7Ci0gICAgcmV0dXJuIGRpdmlkZUJ5MjU1KGMgKiAxNSk7Ci19Ci0KLXN0YXRpYwotaW5saW5lIGludCBjb252ZXJ0OFRvNShpbnQgYikgewotICAgIGludCBjID0gYiAmIDB4ZmY7Ci0gICAgcmV0dXJuIGRpdmlkZUJ5MjU1KGMgKiAzMSk7Ci19Ci0KLXN0YXRpYwotaW5saW5lIGludCBjb252ZXJ0RGlmZihpbnQgYmFzZSwgaW50IGRpZmYpIHsKLSAgICByZXR1cm4gY29udmVydDVUbzgoKDB4MWYgJiBiYXNlKSArIGtMb29rdXBbMHg3ICYgZGlmZl0pOwotfQotCi1zdGF0aWMKLXZvaWQgZGVjb2RlX3N1YmJsb2NrKGV0YzFfYnl0ZSogcE91dCwgaW50IHIsIGludCBnLCBpbnQgYiwgY29uc3QgaW50KiB0YWJsZSwKLSAgICAgICAgZXRjMV91aW50MzIgbG93LCBib29sIHNlY29uZCwgYm9vbCBmbGlwcGVkKSB7Ci0gICAgaW50IGJhc2VYID0gMDsKLSAgICBpbnQgYmFzZVkgPSAwOwotICAgIGlmIChzZWNvbmQpIHsKLSAgICAgICAgaWYgKGZsaXBwZWQpIHsKLSAgICAgICAgICAgIGJhc2VZID0gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJhc2VYID0gMjsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgewotICAgICAgICBpbnQgeCwgeTsKLSAgICAgICAgaWYgKGZsaXBwZWQpIHsKLSAgICAgICAgICAgIHggPSBiYXNlWCArIChpID4+IDEpOwotICAgICAgICAgICAgeSA9IGJhc2VZICsgKGkgJiAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHggPSBiYXNlWCArIChpID4+IDIpOwotICAgICAgICAgICAgeSA9IGJhc2VZICsgKGkgJiAzKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgayA9IHkgKyAoeCAqIDQpOwotICAgICAgICBpbnQgb2Zmc2V0ID0gKChsb3cgPj4gaykgJiAxKSB8ICgobG93ID4+IChrICsgMTUpKSAmIDIpOwotICAgICAgICBpbnQgZGVsdGEgPSB0YWJsZVtvZmZzZXRdOwotICAgICAgICBldGMxX2J5dGUqIHEgPSBwT3V0ICsgMyAqICh4ICsgNCAqIHkpOwotICAgICAgICAqcSsrID0gY2xhbXAociArIGRlbHRhKTsKLSAgICAgICAgKnErKyA9IGNsYW1wKGcgKyBkZWx0YSk7Ci0gICAgICAgICpxKysgPSBjbGFtcChiICsgZGVsdGEpOwotICAgIH0KLX0KLQotLy8gSW5wdXQgaXMgYW4gRVRDMSBjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRhdGEuCi0vLyBPdXRwdXQgaXMgYSA0IHggNCBzcXVhcmUgb2YgMy1ieXRlIHBpeGVscyBpbiBmb3JtIFIsIEcsIEIKLQotdm9pZCBldGMxX2RlY29kZV9ibG9jayhjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV9ieXRlKiBwT3V0KSB7Ci0gICAgZXRjMV91aW50MzIgaGlnaCA9IChwSW5bMF0gPDwgMjQpIHwgKHBJblsxXSA8PCAxNikgfCAocEluWzJdIDw8IDgpIHwgcEluWzNdOwotICAgIGV0YzFfdWludDMyIGxvdyA9IChwSW5bNF0gPDwgMjQpIHwgKHBJbls1XSA8PCAxNikgfCAocEluWzZdIDw8IDgpIHwgcEluWzddOwotICAgIGludCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOwotICAgIGlmIChoaWdoICYgMikgewotICAgICAgICAvLyBkaWZmZXJlbnRpYWwKLSAgICAgICAgaW50IHJCYXNlID0gaGlnaCA+PiAyNzsKLSAgICAgICAgaW50IGdCYXNlID0gaGlnaCA+PiAxOTsKLSAgICAgICAgaW50IGJCYXNlID0gaGlnaCA+PiAxMTsKLSAgICAgICAgcjEgPSBjb252ZXJ0NVRvOChyQmFzZSk7Ci0gICAgICAgIHIyID0gY29udmVydERpZmYockJhc2UsIGhpZ2ggPj4gMjQpOwotICAgICAgICBnMSA9IGNvbnZlcnQ1VG84KGdCYXNlKTsKLSAgICAgICAgZzIgPSBjb252ZXJ0RGlmZihnQmFzZSwgaGlnaCA+PiAxNik7Ci0gICAgICAgIGIxID0gY29udmVydDVUbzgoYkJhc2UpOwotICAgICAgICBiMiA9IGNvbnZlcnREaWZmKGJCYXNlLCBoaWdoID4+IDgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIG5vdCBkaWZmZXJlbnRpYWwKLSAgICAgICAgcjEgPSBjb252ZXJ0NFRvOChoaWdoID4+IDI4KTsKLSAgICAgICAgcjIgPSBjb252ZXJ0NFRvOChoaWdoID4+IDI0KTsKLSAgICAgICAgZzEgPSBjb252ZXJ0NFRvOChoaWdoID4+IDIwKTsKLSAgICAgICAgZzIgPSBjb252ZXJ0NFRvOChoaWdoID4+IDE2KTsKLSAgICAgICAgYjEgPSBjb252ZXJ0NFRvOChoaWdoID4+IDEyKTsKLSAgICAgICAgYjIgPSBjb252ZXJ0NFRvOChoaWdoID4+IDgpOwotICAgIH0KLSAgICBpbnQgdGFibGVJbmRleEEgPSA3ICYgKGhpZ2ggPj4gNSk7Ci0gICAgaW50IHRhYmxlSW5kZXhCID0gNyAmIChoaWdoID4+IDIpOwotICAgIGNvbnN0IGludCogdGFibGVBID0ga01vZGlmaWVyVGFibGUgKyB0YWJsZUluZGV4QSAqIDQ7Ci0gICAgY29uc3QgaW50KiB0YWJsZUIgPSBrTW9kaWZpZXJUYWJsZSArIHRhYmxlSW5kZXhCICogNDsKLSAgICBib29sIGZsaXBwZWQgPSAoaGlnaCAmIDEpICE9IDA7Ci0gICAgZGVjb2RlX3N1YmJsb2NrKHBPdXQsIHIxLCBnMSwgYjEsIHRhYmxlQSwgbG93LCBmYWxzZSwgZmxpcHBlZCk7Ci0gICAgZGVjb2RlX3N1YmJsb2NrKHBPdXQsIHIyLCBnMiwgYjIsIHRhYmxlQiwgbG93LCB0cnVlLCBmbGlwcGVkKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGV0YzFfdWludDMyIGhpZ2g7Ci0gICAgZXRjMV91aW50MzIgbG93OwotICAgIGV0YzFfdWludDMyIHNjb3JlOyAvLyBMb3dlciBpcyBtb3JlIGFjY3VyYXRlCi19IGV0Y19jb21wcmVzc2VkOwotCi1zdGF0aWMKLWlubGluZSB2b2lkIHRha2VfYmVzdChldGNfY29tcHJlc3NlZCogYSwgY29uc3QgZXRjX2NvbXByZXNzZWQqIGIpIHsKLSAgICBpZiAoYS0+c2NvcmUgPiBiLT5zY29yZSkgewotICAgICAgICAqYSA9ICpiOwotICAgIH0KLX0KLQotc3RhdGljCi12b2lkIGV0Y19hdmVyYWdlX2NvbG9yc19zdWJibG9jayhjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV91aW50MzIgaW5NYXNrLAotICAgICAgICBldGMxX2J5dGUqIHBDb2xvcnMsIGJvb2wgZmxpcHBlZCwgYm9vbCBzZWNvbmQpIHsKLSAgICBpbnQgciA9IDA7Ci0gICAgaW50IGcgPSAwOwotICAgIGludCBiID0gMDsKLQotICAgIGlmIChmbGlwcGVkKSB7Ci0gICAgICAgIGludCBieSA9IDA7Ci0gICAgICAgIGlmIChzZWNvbmQpIHsKLSAgICAgICAgICAgIGJ5ID0gMjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDI7IHkrKykgewotICAgICAgICAgICAgaW50IHl5ID0gYnkgKyB5OwotICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCA0OyB4KyspIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IHggKyA0ICogeXk7Ci0gICAgICAgICAgICAgICAgaWYgKGluTWFzayAmICgxIDw8IGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcCA9IHBJbiArIGkgKiAzOwotICAgICAgICAgICAgICAgICAgICByICs9ICoocCsrKTsKLSAgICAgICAgICAgICAgICAgICAgZyArPSAqKHArKyk7Ci0gICAgICAgICAgICAgICAgICAgIGIgKz0gKihwKyspOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBieCA9IDA7Ci0gICAgICAgIGlmIChzZWNvbmQpIHsKLSAgICAgICAgICAgIGJ4ID0gMjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDQ7IHkrKykgewotICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAyOyB4KyspIHsKLSAgICAgICAgICAgICAgICBpbnQgeHggPSBieCArIHg7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSB4eCArIDQgKiB5OwotICAgICAgICAgICAgICAgIGlmIChpbk1hc2sgJiAoMSA8PCBpKSkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBldGMxX2J5dGUqIHAgPSBwSW4gKyBpICogMzsKLSAgICAgICAgICAgICAgICAgICAgciArPSAqKHArKyk7Ci0gICAgICAgICAgICAgICAgICAgIGcgKz0gKihwKyspOwotICAgICAgICAgICAgICAgICAgICBiICs9ICoocCsrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcENvbG9yc1swXSA9IChldGMxX2J5dGUpKChyICsgNCkgPj4gMyk7Ci0gICAgcENvbG9yc1sxXSA9IChldGMxX2J5dGUpKChnICsgNCkgPj4gMyk7Ci0gICAgcENvbG9yc1syXSA9IChldGMxX2J5dGUpKChiICsgNCkgPj4gMyk7Ci19Ci0KLXN0YXRpYwotaW5saW5lIGludCBzcXVhcmUoaW50IHgpIHsKLSAgICByZXR1cm4geCAqIHg7Ci19Ci0KLXN0YXRpYyBldGMxX3VpbnQzMiBjaG9vc2VNb2RpZmllcihjb25zdCBldGMxX2J5dGUqIHBCYXNlQ29sb3JzLAotICAgICAgICBjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV91aW50MzIgKnBMb3csIGludCBiaXRJbmRleCwKLSAgICAgICAgY29uc3QgaW50KiBwTW9kaWZpZXJUYWJsZSkgewotICAgIGV0YzFfdWludDMyIGJlc3RTY29yZSA9IH4wOwotICAgIGludCBiZXN0SW5kZXggPSAwOwotICAgIGludCBwaXhlbFIgPSBwSW5bMF07Ci0gICAgaW50IHBpeGVsRyA9IHBJblsxXTsKLSAgICBpbnQgcGl4ZWxCID0gcEluWzJdOwotICAgIGludCByID0gcEJhc2VDb2xvcnNbMF07Ci0gICAgaW50IGcgPSBwQmFzZUNvbG9yc1sxXTsKLSAgICBpbnQgYiA9IHBCYXNlQ29sb3JzWzJdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgIGludCBtb2RpZmllciA9IHBNb2RpZmllclRhYmxlW2ldOwotICAgICAgICBpbnQgZGVjb2RlZEcgPSBjbGFtcChnICsgbW9kaWZpZXIpOwotICAgICAgICBldGMxX3VpbnQzMiBzY29yZSA9IChldGMxX3VpbnQzMikgKDYgKiBzcXVhcmUoZGVjb2RlZEcgLSBwaXhlbEcpKTsKLSAgICAgICAgaWYgKHNjb3JlID49IGJlc3RTY29yZSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGRlY29kZWRSID0gY2xhbXAociArIG1vZGlmaWVyKTsKLSAgICAgICAgc2NvcmUgKz0gKGV0YzFfdWludDMyKSAoMyAqIHNxdWFyZShkZWNvZGVkUiAtIHBpeGVsUikpOwotICAgICAgICBpZiAoc2NvcmUgPj0gYmVzdFNjb3JlKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZGVjb2RlZEIgPSBjbGFtcChiICsgbW9kaWZpZXIpOwotICAgICAgICBzY29yZSArPSAoZXRjMV91aW50MzIpIHNxdWFyZShkZWNvZGVkQiAtIHBpeGVsQik7Ci0gICAgICAgIGlmIChzY29yZSA8IGJlc3RTY29yZSkgewotICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICBiZXN0SW5kZXggPSBpOwotICAgICAgICB9Ci0gICAgfQotICAgIGV0YzFfdWludDMyIGxvd01hc2sgPSAoKChiZXN0SW5kZXggPj4gMSkgPDwgMTYpIHwgKGJlc3RJbmRleCAmIDEpKQotICAgICAgICAgICAgPDwgYml0SW5kZXg7Ci0gICAgKnBMb3cgfD0gbG93TWFzazsKLSAgICByZXR1cm4gYmVzdFNjb3JlOwotfQotCi1zdGF0aWMKLXZvaWQgZXRjX2VuY29kZV9zdWJibG9ja19oZWxwZXIoY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyIGluTWFzaywKLSAgICAgICAgZXRjX2NvbXByZXNzZWQqIHBDb21wcmVzc2VkLCBib29sIGZsaXBwZWQsIGJvb2wgc2Vjb25kLAotICAgICAgICBjb25zdCBldGMxX2J5dGUqIHBCYXNlQ29sb3JzLCBjb25zdCBpbnQqIHBNb2RpZmllclRhYmxlKSB7Ci0gICAgaW50IHNjb3JlID0gcENvbXByZXNzZWQtPnNjb3JlOwotICAgIGlmIChmbGlwcGVkKSB7Ci0gICAgICAgIGludCBieSA9IDA7Ci0gICAgICAgIGlmIChzZWNvbmQpIHsKLSAgICAgICAgICAgIGJ5ID0gMjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDI7IHkrKykgewotICAgICAgICAgICAgaW50IHl5ID0gYnkgKyB5OwotICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCA0OyB4KyspIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IHggKyA0ICogeXk7Ci0gICAgICAgICAgICAgICAgaWYgKGluTWFzayAmICgxIDw8IGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjb3JlICs9IGNob29zZU1vZGlmaWVyKHBCYXNlQ29sb3JzLCBwSW4gKyBpICogMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvbXByZXNzZWQtPmxvdywgeXkgKyB4ICogNCwgcE1vZGlmaWVyVGFibGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBieCA9IDA7Ci0gICAgICAgIGlmIChzZWNvbmQpIHsKLSAgICAgICAgICAgIGJ4ID0gMjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDQ7IHkrKykgewotICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAyOyB4KyspIHsKLSAgICAgICAgICAgICAgICBpbnQgeHggPSBieCArIHg7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSB4eCArIDQgKiB5OwotICAgICAgICAgICAgICAgIGlmIChpbk1hc2sgJiAoMSA8PCBpKSkgewotICAgICAgICAgICAgICAgICAgICBzY29yZSArPSBjaG9vc2VNb2RpZmllcihwQmFzZUNvbG9ycywgcEluICsgaSAqIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb21wcmVzc2VkLT5sb3csIHkgKyB4eCAqIDQsIHBNb2RpZmllclRhYmxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcENvbXByZXNzZWQtPnNjb3JlID0gc2NvcmU7Ci19Ci0KLXN0YXRpYyBib29sIGluUmFuZ2U0Yml0U2lnbmVkKGludCBjb2xvcikgewotICAgIHJldHVybiBjb2xvciA+PSAtNCAmJiBjb2xvciA8PSAzOwotfQotCi1zdGF0aWMgdm9pZCBldGNfZW5jb2RlQmFzZUNvbG9ycyhldGMxX2J5dGUqIHBCYXNlQ29sb3JzLAotICAgICAgICBjb25zdCBldGMxX2J5dGUqIHBDb2xvcnMsIGV0Y19jb21wcmVzc2VkKiBwQ29tcHJlc3NlZCkgewotICAgIGludCByMSwgZzEsIGIxLCByMiwgZzIsIGIyOyAvLyA4IGJpdCBiYXNlIGNvbG9ycyBmb3Igc3ViLWJsb2NrcwotICAgIGJvb2wgZGlmZmVyZW50aWFsOwotICAgIHsKLSAgICAgICAgaW50IHI1MSA9IGNvbnZlcnQ4VG81KHBDb2xvcnNbMF0pOwotICAgICAgICBpbnQgZzUxID0gY29udmVydDhUbzUocENvbG9yc1sxXSk7Ci0gICAgICAgIGludCBiNTEgPSBjb252ZXJ0OFRvNShwQ29sb3JzWzJdKTsKLSAgICAgICAgaW50IHI1MiA9IGNvbnZlcnQ4VG81KHBDb2xvcnNbM10pOwotICAgICAgICBpbnQgZzUyID0gY29udmVydDhUbzUocENvbG9yc1s0XSk7Ci0gICAgICAgIGludCBiNTIgPSBjb252ZXJ0OFRvNShwQ29sb3JzWzVdKTsKLQotICAgICAgICByMSA9IGNvbnZlcnQ1VG84KHI1MSk7Ci0gICAgICAgIGcxID0gY29udmVydDVUbzgoZzUxKTsKLSAgICAgICAgYjEgPSBjb252ZXJ0NVRvOChiNTEpOwotCi0gICAgICAgIGludCBkciA9IHI1MiAtIHI1MTsKLSAgICAgICAgaW50IGRnID0gZzUyIC0gZzUxOwotICAgICAgICBpbnQgZGIgPSBiNTIgLSBiNTE7Ci0KLSAgICAgICAgZGlmZmVyZW50aWFsID0gaW5SYW5nZTRiaXRTaWduZWQoZHIpICYmIGluUmFuZ2U0Yml0U2lnbmVkKGRnKQotICAgICAgICAgICAgICAgICYmIGluUmFuZ2U0Yml0U2lnbmVkKGRiKTsKLSAgICAgICAgaWYgKGRpZmZlcmVudGlhbCkgewotICAgICAgICAgICAgcjIgPSBjb252ZXJ0NVRvOChyNTEgKyBkcik7Ci0gICAgICAgICAgICBnMiA9IGNvbnZlcnQ1VG84KGc1MSArIGRnKTsKLSAgICAgICAgICAgIGIyID0gY29udmVydDVUbzgoYjUxICsgZGIpOwotICAgICAgICAgICAgcENvbXByZXNzZWQtPmhpZ2ggfD0gKHI1MSA8PCAyNykgfCAoKDcgJiBkcikgPDwgMjQpIHwgKGc1MSA8PCAxOSkKLSAgICAgICAgICAgICAgICAgICAgfCAoKDcgJiBkZykgPDwgMTYpIHwgKGI1MSA8PCAxMSkgfCAoKDcgJiBkYikgPDwgOCkgfCAyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFkaWZmZXJlbnRpYWwpIHsKLSAgICAgICAgaW50IHI0MSA9IGNvbnZlcnQ4VG80KHBDb2xvcnNbMF0pOwotICAgICAgICBpbnQgZzQxID0gY29udmVydDhUbzQocENvbG9yc1sxXSk7Ci0gICAgICAgIGludCBiNDEgPSBjb252ZXJ0OFRvNChwQ29sb3JzWzJdKTsKLSAgICAgICAgaW50IHI0MiA9IGNvbnZlcnQ4VG80KHBDb2xvcnNbM10pOwotICAgICAgICBpbnQgZzQyID0gY29udmVydDhUbzQocENvbG9yc1s0XSk7Ci0gICAgICAgIGludCBiNDIgPSBjb252ZXJ0OFRvNChwQ29sb3JzWzVdKTsKLSAgICAgICAgcjEgPSBjb252ZXJ0NFRvOChyNDEpOwotICAgICAgICBnMSA9IGNvbnZlcnQ0VG84KGc0MSk7Ci0gICAgICAgIGIxID0gY29udmVydDRUbzgoYjQxKTsKLSAgICAgICAgcjIgPSBjb252ZXJ0NFRvOChyNDIpOwotICAgICAgICBnMiA9IGNvbnZlcnQ0VG84KGc0Mik7Ci0gICAgICAgIGIyID0gY29udmVydDRUbzgoYjQyKTsKLSAgICAgICAgcENvbXByZXNzZWQtPmhpZ2ggfD0gKHI0MSA8PCAyOCkgfCAocjQyIDw8IDI0KSB8IChnNDEgPDwgMjApIHwgKGc0MgotICAgICAgICAgICAgICAgIDw8IDE2KSB8IChiNDEgPDwgMTIpIHwgKGI0MiA8PCA4KTsKLSAgICB9Ci0gICAgcEJhc2VDb2xvcnNbMF0gPSByMTsKLSAgICBwQmFzZUNvbG9yc1sxXSA9IGcxOwotICAgIHBCYXNlQ29sb3JzWzJdID0gYjE7Ci0gICAgcEJhc2VDb2xvcnNbM10gPSByMjsKLSAgICBwQmFzZUNvbG9yc1s0XSA9IGcyOwotICAgIHBCYXNlQ29sb3JzWzVdID0gYjI7Ci19Ci0KLXN0YXRpYwotdm9pZCBldGNfZW5jb2RlX2Jsb2NrX2hlbHBlcihjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV91aW50MzIgaW5NYXNrLAotICAgICAgICBjb25zdCBldGMxX2J5dGUqIHBDb2xvcnMsIGV0Y19jb21wcmVzc2VkKiBwQ29tcHJlc3NlZCwgYm9vbCBmbGlwcGVkKSB7Ci0gICAgcENvbXByZXNzZWQtPnNjb3JlID0gfjA7Ci0gICAgcENvbXByZXNzZWQtPmhpZ2ggPSAoZmxpcHBlZCA/IDEgOiAwKTsKLSAgICBwQ29tcHJlc3NlZC0+bG93ID0gMDsKLQotICAgIGV0YzFfYnl0ZSBwQmFzZUNvbG9yc1s2XTsKLQotICAgIGV0Y19lbmNvZGVCYXNlQ29sb3JzKHBCYXNlQ29sb3JzLCBwQ29sb3JzLCBwQ29tcHJlc3NlZCk7Ci0KLSAgICBpbnQgb3JpZ2luYWxIaWdoID0gcENvbXByZXNzZWQtPmhpZ2g7Ci0KLSAgICBjb25zdCBpbnQqIHBNb2RpZmllclRhYmxlID0ga01vZGlmaWVyVGFibGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyssIHBNb2RpZmllclRhYmxlICs9IDQpIHsKLSAgICAgICAgZXRjX2NvbXByZXNzZWQgdGVtcDsKLSAgICAgICAgdGVtcC5zY29yZSA9IDA7Ci0gICAgICAgIHRlbXAuaGlnaCA9IG9yaWdpbmFsSGlnaCB8IChpIDw8IDUpOwotICAgICAgICB0ZW1wLmxvdyA9IDA7Ci0gICAgICAgIGV0Y19lbmNvZGVfc3ViYmxvY2tfaGVscGVyKHBJbiwgaW5NYXNrLCAmdGVtcCwgZmxpcHBlZCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgcEJhc2VDb2xvcnMsIHBNb2RpZmllclRhYmxlKTsKLSAgICAgICAgdGFrZV9iZXN0KHBDb21wcmVzc2VkLCAmdGVtcCk7Ci0gICAgfQotICAgIHBNb2RpZmllclRhYmxlID0ga01vZGlmaWVyVGFibGU7Ci0gICAgZXRjX2NvbXByZXNzZWQgZmlyc3RIYWxmID0gKnBDb21wcmVzc2VkOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrLCBwTW9kaWZpZXJUYWJsZSArPSA0KSB7Ci0gICAgICAgIGV0Y19jb21wcmVzc2VkIHRlbXA7Ci0gICAgICAgIHRlbXAuc2NvcmUgPSBmaXJzdEhhbGYuc2NvcmU7Ci0gICAgICAgIHRlbXAuaGlnaCA9IGZpcnN0SGFsZi5oaWdoIHwgKGkgPDwgMik7Ci0gICAgICAgIHRlbXAubG93ID0gZmlyc3RIYWxmLmxvdzsKLSAgICAgICAgZXRjX2VuY29kZV9zdWJibG9ja19oZWxwZXIocEluLCBpbk1hc2ssICZ0ZW1wLCBmbGlwcGVkLCB0cnVlLAotICAgICAgICAgICAgICAgIHBCYXNlQ29sb3JzICsgMywgcE1vZGlmaWVyVGFibGUpOwotICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAqcENvbXByZXNzZWQgPSB0ZW1wOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGFrZV9iZXN0KHBDb21wcmVzc2VkLCAmdGVtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlQmlnRW5kaWFuKGV0YzFfYnl0ZSogcE91dCwgZXRjMV91aW50MzIgZCkgewotICAgIHBPdXRbMF0gPSAoZXRjMV9ieXRlKShkID4+IDI0KTsKLSAgICBwT3V0WzFdID0gKGV0YzFfYnl0ZSkoZCA+PiAxNik7Ci0gICAgcE91dFsyXSA9IChldGMxX2J5dGUpKGQgPj4gOCk7Ci0gICAgcE91dFszXSA9IChldGMxX2J5dGUpIGQ7Ci19Ci0KLS8vIElucHV0IGlzIGEgNCB4IDQgc3F1YXJlIG9mIDMtYnl0ZSBwaXhlbHMgaW4gZm9ybSBSLCBHLCBCCi0vLyBpbm1hc2sgaXMgYSAxNi1iaXQgbWFzayB3aGVyZSBiaXQgKDEgPDwgKHggKyB5ICogNCkpIHRlbGxzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgKHgseSkKLS8vIHBpeGVsIGlzIHZhbGlkIG9yIG5vdC4gSW52YWxpZCBwaXhlbCBjb2xvciB2YWx1ZXMgYXJlIGlnbm9yZWQgd2hlbiBjb21wcmVzc2luZy4KLS8vIE91dHB1dCBpcyBhbiBFVEMxIGNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgZGF0YS4KLQotdm9pZCBldGMxX2VuY29kZV9ibG9jayhjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV91aW50MzIgaW5NYXNrLAotICAgICAgICBldGMxX2J5dGUqIHBPdXQpIHsKLSAgICBldGMxX2J5dGUgY29sb3JzWzZdOwotICAgIGV0YzFfYnl0ZSBmbGlwcGVkQ29sb3JzWzZdOwotICAgIGV0Y19hdmVyYWdlX2NvbG9yc19zdWJibG9jayhwSW4sIGluTWFzaywgY29sb3JzLCBmYWxzZSwgZmFsc2UpOwotICAgIGV0Y19hdmVyYWdlX2NvbG9yc19zdWJibG9jayhwSW4sIGluTWFzaywgY29sb3JzICsgMywgZmFsc2UsIHRydWUpOwotICAgIGV0Y19hdmVyYWdlX2NvbG9yc19zdWJibG9jayhwSW4sIGluTWFzaywgZmxpcHBlZENvbG9ycywgdHJ1ZSwgZmFsc2UpOwotICAgIGV0Y19hdmVyYWdlX2NvbG9yc19zdWJibG9jayhwSW4sIGluTWFzaywgZmxpcHBlZENvbG9ycyArIDMsIHRydWUsIHRydWUpOwotCi0gICAgZXRjX2NvbXByZXNzZWQgYSwgYjsKLSAgICBldGNfZW5jb2RlX2Jsb2NrX2hlbHBlcihwSW4sIGluTWFzaywgY29sb3JzLCAmYSwgZmFsc2UpOwotICAgIGV0Y19lbmNvZGVfYmxvY2tfaGVscGVyKHBJbiwgaW5NYXNrLCBmbGlwcGVkQ29sb3JzLCAmYiwgdHJ1ZSk7Ci0gICAgdGFrZV9iZXN0KCZhLCAmYik7Ci0gICAgd3JpdGVCaWdFbmRpYW4ocE91dCwgYS5oaWdoKTsKLSAgICB3cml0ZUJpZ0VuZGlhbihwT3V0ICsgNCwgYS5sb3cpOwotfQotCi0vLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGVuY29kZWQgaW1hZ2UgZGF0YSAoZG9lcyBub3QgaW5jbHVkZSBzaXplIG9mIFBLTSBoZWFkZXIpLgotCi1ldGMxX3VpbnQzMiBldGMxX2dldF9lbmNvZGVkX2RhdGFfc2l6ZShldGMxX3VpbnQzMiB3aWR0aCwgZXRjMV91aW50MzIgaGVpZ2h0KSB7Ci0gICAgcmV0dXJuICgoKHdpZHRoICsgMykgJiB+MykgKiAoKGhlaWdodCArIDMpICYgfjMpKSA+PiAxOwotfQotCi0vLyBFbmNvZGUgYW4gZW50aXJlIGltYWdlLgotLy8gcEluIC0gcG9pbnRlciB0byB0aGUgaW1hZ2UgZGF0YS4gRm9ybWF0dGVkIHN1Y2ggdGhhdCB0aGUgUmVkIGNvbXBvbmVudCBvZgotLy8gICAgICAgcGl4ZWwgKHgseSkgaXMgYXQgcEluICsgcGl4ZWxTaXplICogeCArIHN0cmlkZSAqIHkgKyByZWRPZmZzZXQ7Ci0vLyBwT3V0IC0gcG9pbnRlciB0byBlbmNvZGVkIGRhdGEuIE11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIGVudGlyZSBlbmNvZGVkIGltYWdlLgotCi1pbnQgZXRjMV9lbmNvZGVfaW1hZ2UoY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQsCi0gICAgICAgIGV0YzFfdWludDMyIHBpeGVsU2l6ZSwgZXRjMV91aW50MzIgc3RyaWRlLCBldGMxX2J5dGUqIHBPdXQpIHsKLSAgICBpZiAocGl4ZWxTaXplIDwgMiB8fCBwaXhlbFNpemUgPiAzKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGtZTWFza1tdID0geyAweDAsIDB4ZiwgMHhmZiwgMHhmZmYsIDB4ZmZmZiB9OwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBrWE1hc2tbXSA9IHsgMHgwLCAweDExMTEsIDB4MzMzMywgMHg3Nzc3LAotICAgICAgICAgICAgMHhmZmZmIH07Ci0gICAgZXRjMV9ieXRlIGJsb2NrW0VUQzFfREVDT0RFRF9CTE9DS19TSVpFXTsKLSAgICBldGMxX2J5dGUgZW5jb2RlZFtFVEMxX0VOQ09ERURfQkxPQ0tfU0laRV07Ci0KLSAgICBldGMxX3VpbnQzMiBlbmNvZGVkV2lkdGggPSAod2lkdGggKyAzKSAmIH4zOwotICAgIGV0YzFfdWludDMyIGVuY29kZWRIZWlnaHQgPSAoaGVpZ2h0ICsgMykgJiB+MzsKLQotICAgIGZvciAoZXRjMV91aW50MzIgeSA9IDA7IHkgPCBlbmNvZGVkSGVpZ2h0OyB5ICs9IDQpIHsKLSAgICAgICAgZXRjMV91aW50MzIgeUVuZCA9IGhlaWdodCAtIHk7Ci0gICAgICAgIGlmICh5RW5kID4gNCkgewotICAgICAgICAgICAgeUVuZCA9IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHltYXNrID0ga1lNYXNrW3lFbmRdOwotICAgICAgICBmb3IgKGV0YzFfdWludDMyIHggPSAwOyB4IDwgZW5jb2RlZFdpZHRoOyB4ICs9IDQpIHsKLSAgICAgICAgICAgIGV0YzFfdWludDMyIHhFbmQgPSB3aWR0aCAtIHg7Ci0gICAgICAgICAgICBpZiAoeEVuZCA+IDQpIHsKLSAgICAgICAgICAgICAgICB4RW5kID0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBtYXNrID0geW1hc2sgJiBrWE1hc2tbeEVuZF07Ci0gICAgICAgICAgICBmb3IgKGV0YzFfdWludDMyIGN5ID0gMDsgY3kgPCB5RW5kOyBjeSsrKSB7Ci0gICAgICAgICAgICAgICAgZXRjMV9ieXRlKiBxID0gYmxvY2sgKyAoY3kgKiA0KSAqIDM7Ci0gICAgICAgICAgICAgICAgY29uc3QgZXRjMV9ieXRlKiBwID0gcEluICsgcGl4ZWxTaXplICogeCArIHN0cmlkZSAqICh5ICsgY3kpOwotICAgICAgICAgICAgICAgIGlmIChwaXhlbFNpemUgPT0gMykgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkocSwgcCwgeEVuZCAqIDMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoZXRjMV91aW50MzIgY3ggPSAwOyBjeCA8IHhFbmQ7IGN4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbCA9IChwWzFdIDw8IDgpIHwgcFswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpxKysgPSBjb252ZXJ0NVRvOChwaXhlbCA+PiAxMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gY29udmVydDZUbzgocGl4ZWwgPj4gNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gY29udmVydDVUbzgocGl4ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBwaXhlbFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBldGMxX2VuY29kZV9ibG9jayhibG9jaywgbWFzaywgZW5jb2RlZCk7Ci0gICAgICAgICAgICBtZW1jcHkocE91dCwgZW5jb2RlZCwgc2l6ZW9mKGVuY29kZWQpKTsKLSAgICAgICAgICAgIHBPdXQgKz0gc2l6ZW9mKGVuY29kZWQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vLyBEZWNvZGUgYW4gZW50aXJlIGltYWdlLgotLy8gcEluIC0gcG9pbnRlciB0byBlbmNvZGVkIGRhdGEuCi0vLyBwT3V0IC0gcG9pbnRlciB0byB0aGUgaW1hZ2UgZGF0YS4gV2lsbCBiZSB3cml0dGVuIHN1Y2ggdGhhdCB0aGUgUmVkIGNvbXBvbmVudCBvZgotLy8gICAgICAgcGl4ZWwgKHgseSkgaXMgYXQgcEluICsgcGl4ZWxTaXplICogeCArIHN0cmlkZSAqIHkgKyByZWRPZmZzZXQuIE11c3QgYmUKLS8vICAgICAgICBsYXJnZSBlbm91Z2ggdG8gc3RvcmUgZW50aXJlIGltYWdlLgotCi0KLWludCBldGMxX2RlY29kZV9pbWFnZShjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV9ieXRlKiBwT3V0LAotICAgICAgICBldGMxX3VpbnQzMiB3aWR0aCwgZXRjMV91aW50MzIgaGVpZ2h0LAotICAgICAgICBldGMxX3VpbnQzMiBwaXhlbFNpemUsIGV0YzFfdWludDMyIHN0cmlkZSkgewotICAgIGlmIChwaXhlbFNpemUgPCAyIHx8IHBpeGVsU2l6ZSA+IDMpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBldGMxX2J5dGUgYmxvY2tbRVRDMV9ERUNPREVEX0JMT0NLX1NJWkVdOwotCi0gICAgZXRjMV91aW50MzIgZW5jb2RlZFdpZHRoID0gKHdpZHRoICsgMykgJiB+MzsKLSAgICBldGMxX3VpbnQzMiBlbmNvZGVkSGVpZ2h0ID0gKGhlaWdodCArIDMpICYgfjM7Ci0KLSAgICBmb3IgKGV0YzFfdWludDMyIHkgPSAwOyB5IDwgZW5jb2RlZEhlaWdodDsgeSArPSA0KSB7Ci0gICAgICAgIGV0YzFfdWludDMyIHlFbmQgPSBoZWlnaHQgLSB5OwotICAgICAgICBpZiAoeUVuZCA+IDQpIHsKLSAgICAgICAgICAgIHlFbmQgPSA0OwotICAgICAgICB9Ci0gICAgICAgIGZvciAoZXRjMV91aW50MzIgeCA9IDA7IHggPCBlbmNvZGVkV2lkdGg7IHggKz0gNCkgewotICAgICAgICAgICAgZXRjMV91aW50MzIgeEVuZCA9IHdpZHRoIC0geDsKLSAgICAgICAgICAgIGlmICh4RW5kID4gNCkgewotICAgICAgICAgICAgICAgIHhFbmQgPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXRjMV9kZWNvZGVfYmxvY2socEluLCBibG9jayk7Ci0gICAgICAgICAgICBwSW4gKz0gRVRDMV9FTkNPREVEX0JMT0NLX1NJWkU7Ci0gICAgICAgICAgICBmb3IgKGV0YzFfdWludDMyIGN5ID0gMDsgY3kgPCB5RW5kOyBjeSsrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgZXRjMV9ieXRlKiBxID0gYmxvY2sgKyAoY3kgKiA0KSAqIDM7Ci0gICAgICAgICAgICAgICAgZXRjMV9ieXRlKiBwID0gcE91dCArIHBpeGVsU2l6ZSAqIHggKyBzdHJpZGUgKiAoeSArIGN5KTsKLSAgICAgICAgICAgICAgICBpZiAocGl4ZWxTaXplID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHAsIHEsIHhFbmQgKiAzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGV0YzFfdWludDMyIGN4ID0gMDsgY3ggPCB4RW5kOyBjeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldGMxX2J5dGUgciA9ICpxKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldGMxX2J5dGUgZyA9ICpxKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldGMxX2J5dGUgYiA9ICpxKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldGMxX3VpbnQzMiBwaXhlbCA9ICgociA+PiAzKSA8PCAxMSkgfCAoKGcgPj4gMikgPDwgNSkgfCAoYiA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSAoZXRjMV9ieXRlKSBwaXhlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSAoZXRjMV9ieXRlKSAocGl4ZWwgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtNYWdpY1tdID0geyAnUCcsICdLJywgJ00nLCAnICcsICcxJywgJzAnIH07Ci0KLXN0YXRpYyBjb25zdCBldGMxX3VpbnQzMiBFVEMxX1BLTV9GT1JNQVRfT0ZGU0VUID0gNjsKLXN0YXRpYyBjb25zdCBldGMxX3VpbnQzMiBFVEMxX1BLTV9FTkNPREVEX1dJRFRIX09GRlNFVCA9IDg7Ci1zdGF0aWMgY29uc3QgZXRjMV91aW50MzIgRVRDMV9QS01fRU5DT0RFRF9IRUlHSFRfT0ZGU0VUID0gMTA7Ci1zdGF0aWMgY29uc3QgZXRjMV91aW50MzIgRVRDMV9QS01fV0lEVEhfT0ZGU0VUID0gMTI7Ci1zdGF0aWMgY29uc3QgZXRjMV91aW50MzIgRVRDMV9QS01fSEVJR0hUX09GRlNFVCA9IDE0OwotCi1zdGF0aWMgY29uc3QgZXRjMV91aW50MzIgRVRDMV9SR0JfTk9fTUlQTUFQUyA9IDA7Ci0KLXN0YXRpYyB2b2lkIHdyaXRlQkVVaW50MTYoZXRjMV9ieXRlKiBwT3V0LCBldGMxX3VpbnQzMiBkYXRhKSB7Ci0gICAgcE91dFswXSA9IChldGMxX2J5dGUpIChkYXRhID4+IDgpOwotICAgIHBPdXRbMV0gPSAoZXRjMV9ieXRlKSBkYXRhOwotfQotCi1zdGF0aWMgZXRjMV91aW50MzIgcmVhZEJFVWludDE2KGNvbnN0IGV0YzFfYnl0ZSogcEluKSB7Ci0gICAgcmV0dXJuIChwSW5bMF0gPDwgOCkgfCBwSW5bMV07Ci19Ci0KLS8vIEZvcm1hdCBhIFBLTSBoZWFkZXIKLQotdm9pZCBldGMxX3BrbV9mb3JtYXRfaGVhZGVyKGV0YzFfYnl0ZSogcEhlYWRlciwgZXRjMV91aW50MzIgd2lkdGgsIGV0YzFfdWludDMyIGhlaWdodCkgewotICAgIG1lbWNweShwSGVhZGVyLCBrTWFnaWMsIHNpemVvZihrTWFnaWMpKTsKLSAgICBldGMxX3VpbnQzMiBlbmNvZGVkV2lkdGggPSAod2lkdGggKyAzKSAmIH4zOwotICAgIGV0YzFfdWludDMyIGVuY29kZWRIZWlnaHQgPSAoaGVpZ2h0ICsgMykgJiB+MzsKLSAgICB3cml0ZUJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9GT1JNQVRfT0ZGU0VULCBFVEMxX1JHQl9OT19NSVBNQVBTKTsKLSAgICB3cml0ZUJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9FTkNPREVEX1dJRFRIX09GRlNFVCwgZW5jb2RlZFdpZHRoKTsKLSAgICB3cml0ZUJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9FTkNPREVEX0hFSUdIVF9PRkZTRVQsIGVuY29kZWRIZWlnaHQpOwotICAgIHdyaXRlQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX1dJRFRIX09GRlNFVCwgd2lkdGgpOwotICAgIHdyaXRlQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0hFSUdIVF9PRkZTRVQsIGhlaWdodCk7Ci19Ci0KLS8vIENoZWNrIGlmIGEgUEtNIGhlYWRlciBpcyBjb3JyZWN0bHkgZm9ybWF0dGVkLgotCi1ldGMxX2Jvb2wgZXRjMV9wa21faXNfdmFsaWQoY29uc3QgZXRjMV9ieXRlKiBwSGVhZGVyKSB7Ci0gICAgaWYgKG1lbWNtcChwSGVhZGVyLCBrTWFnaWMsIHNpemVvZihrTWFnaWMpKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGV0YzFfdWludDMyIGZvcm1hdCA9IHJlYWRCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fRk9STUFUX09GRlNFVCk7Ci0gICAgZXRjMV91aW50MzIgZW5jb2RlZFdpZHRoID0gcmVhZEJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9FTkNPREVEX1dJRFRIX09GRlNFVCk7Ci0gICAgZXRjMV91aW50MzIgZW5jb2RlZEhlaWdodCA9IHJlYWRCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fRU5DT0RFRF9IRUlHSFRfT0ZGU0VUKTsKLSAgICBldGMxX3VpbnQzMiB3aWR0aCA9IHJlYWRCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fV0lEVEhfT0ZGU0VUKTsKLSAgICBldGMxX3VpbnQzMiBoZWlnaHQgPSByZWFkQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0hFSUdIVF9PRkZTRVQpOwotICAgIHJldHVybiBmb3JtYXQgPT0gRVRDMV9SR0JfTk9fTUlQTUFQUyAmJgotICAgICAgICAgICAgZW5jb2RlZFdpZHRoID49IHdpZHRoICYmIGVuY29kZWRXaWR0aCAtIHdpZHRoIDwgNCAmJgotICAgICAgICAgICAgZW5jb2RlZEhlaWdodCA+PSBoZWlnaHQgJiYgZW5jb2RlZEhlaWdodCAtIGhlaWdodCA8IDQ7Ci19Ci0KLS8vIFJlYWQgdGhlIGltYWdlIHdpZHRoIGZyb20gYSBQS00gaGVhZGVyCi0KLWV0YzFfdWludDMyIGV0YzFfcGttX2dldF93aWR0aChjb25zdCBldGMxX2J5dGUqIHBIZWFkZXIpIHsKLSAgICByZXR1cm4gcmVhZEJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9XSURUSF9PRkZTRVQpOwotfQotCi0vLyBSZWFkIHRoZSBpbWFnZSBoZWlnaHQgZnJvbSBhIFBLTSBoZWFkZXIKLQotZXRjMV91aW50MzIgZXRjMV9wa21fZ2V0X2hlaWdodChjb25zdCBldGMxX2J5dGUqIHBIZWFkZXIpewotICAgIHJldHVybiByZWFkQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0hFSUdIVF9PRkZTRVQpOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyLmNwcCBiL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNDVjMmIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKiAKLSAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotCi0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgImhvb2tzLmgiCi0jaW5jbHVkZSAiZWdsX2ltcGwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEFjdHVhbCBHTCBlbnRyeS1wb2ludHMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI3VuZGVmIEFQSV9FTlRSWQotI3VuZGVmIENBTExfR0xfQVBJCi0jdW5kZWYgQ0FMTF9HTF9BUElfUkVUVVJOCi0KLSNkZWZpbmUgREVCVUdfQ0FMTF9HTF9BUEkgMAotCi0jaWYgVVNFX0ZBU1RfVExTX0tFWQotCi0gICAgI2lmZGVmIEhBVkVfQVJNX1RMU19SRUdJU1RFUgotICAgICAgICAjZGVmaW5lIEdFVF9UTFMocmVnKSBcCi0gICAgICAgICAgICAibXJjIHAxNSwgMCwgIiAjcmVnICIsIGMxMywgYzAsIDMgXG4iCi0gICAgI2Vsc2UKLSAgICAgICAgI2RlZmluZSBHRVRfVExTKHJlZykgXAotICAgICAgICAgICAgIm1vdiAgICIgI3JlZyAiLCAjMHhGRkZGMEZGRiAgICAgIFxuIiAgXAotICAgICAgICAgICAgImxkciAgICIgI3JlZyAiLCBbIiAjcmVnICIsICMtMTVdIFxuIgotICAgICNlbmRpZgotCi0gICAgI2RlZmluZSBBUElfRU5UUlkoX2FwaSkgX19hdHRyaWJ1dGVfXygobmFrZWQpKSBfYXBpCi0KLSAgICAjZGVmaW5lIENBTExfR0xfQVBJKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBhc20gdm9sYXRpbGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgR0VUX1RMUyhyMTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJsZHIgICByMTIsIFtyMTIsICVbdGxzXV0gXG4iICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAiY21wICAgcjEyLCAjMCAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgImxkcm5lIHBjLCAgW3IxMiwgJVthcGldXSBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJtb3YgICByMCwgIzAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAiYnggICAgbHIgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDogW3Rsc10gIkoiKFRMU19TTE9UX09QRU5HTF9BUEkqNCksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIFthcGldICJKIihfX2J1aWx0aW5fb2Zmc2V0b2YoZ2xfaG9va3NfdCwgZ2wuX2FwaSkpICAgIFwKLSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICApOwotCi0gICAgI2RlZmluZSBDQUxMX0dMX0FQSV9SRVRVUk4oX2FwaSwgLi4uKSBcCi0gICAgICAgIENBTExfR0xfQVBJKF9hcGksIF9fVkFfQVJHU19fKSBcCi0gICAgICAgIHJldHVybiAwOyAvLyBwbGFjYXRlIGdjYydzIHdhcm5pbmdzLiBuZXZlciByZWFjaGVkLgotCi0jZWxzZQotCi0gICAgI2RlZmluZSBBUElfRU5UUlkoX2FwaSkgX2FwaQotCi0jaWYgREVCVUdfQ0FMTF9HTF9BUEkKLQotICAgICNkZWZpbmUgQ0FMTF9HTF9BUEkoX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCi0gICAgICAgIF9jLT5fYXBpKF9fVkFfQVJHU19fKTsgXAotICAgICAgICBHTGVudW0gc3RhdHVzID0gR0xfTk9fRVJST1I7IFwKLSAgICAgICAgd2hpbGUgKChzdGF0dXMgPSBnbEdldEVycm9yKCkpICE9IEdMX05PX0VSUk9SKSB7IFwKLSAgICAgICAgICAgIEFMT0dEKCJbIiAjX2FwaSAiXSAweCV4Iiwgc3RhdHVzKTsgXAotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAjZGVmaW5lIENBTExfR0xfQVBJKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHbFRocmVhZFNwZWNpZmljKCktPmdsOyAgXAotICAgICAgICBfYy0+X2FwaShfX1ZBX0FSR1NfXyk7Ci0KLSNlbmRpZgotCi0gICAgI2RlZmluZSBDQUxMX0dMX0FQSV9SRVRVUk4oX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R2xUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKLSAgICAgICAgcmV0dXJuIF9jLT5fYXBpKF9fVkFfQVJHU19fKQotCi0jZW5kaWYKLQotCi1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICJnbDJfYXBpLmluIgotI2luY2x1ZGUgImdsMmV4dF9hcGkuaW4iCi19Ci0KLSN1bmRlZiBBUElfRU5UUlkKLSN1bmRlZiBDQUxMX0dMX0FQSQotI3VuZGVmIENBTExfR0xfQVBJX1JFVFVSTgotCi0vKgotICogZ2xHZXRTdHJpbmcoKSBpcyBzcGVjaWFsIGJlY2F1c2Ugd2UgZXhwb3NlIHNvbWUgZXh0ZW5zaW9ucyBpbiB0aGUgd3JhcHBlcgotICovCi0KLWV4dGVybiAiQyIgY29uc3QgR0x1Ynl0ZSAqIF9fZ2xHZXRTdHJpbmcoR0xlbnVtIG5hbWUpOwotCi1jb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcoR0xlbnVtIG5hbWUpCi17Ci0gICAgY29uc3QgR0x1Ynl0ZSAqIHJldCA9IGVnbF9nZXRfc3RyaW5nX2Zvcl9jdXJyZW50X2NvbnRleHQobmFtZSk7Ci0gICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldCA9IF9fZ2xHZXRTdHJpbmcobmFtZSk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTMi9nbDJfYXBpLmluIGIvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyX2FwaS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4OWE1Mi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTMi9nbDJfYXBpLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLXZvaWQgQVBJX0VOVFJZKGdsQWN0aXZlVGV4dHVyZSkoR0xlbnVtIHRleHR1cmUpIHsKLSAgICBDQUxMX0dMX0FQSShnbEFjdGl2ZVRleHR1cmUsIHRleHR1cmUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xBdHRhY2hTaGFkZXIpKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xBdHRhY2hTaGFkZXIsIHByb2dyYW0sIHNoYWRlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJpbmRBdHRyaWJMb2NhdGlvbikoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyKiBuYW1lKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCaW5kQXR0cmliTG9jYXRpb24sIHByb2dyYW0sIGluZGV4LCBuYW1lKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmluZEJ1ZmZlcikoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikgewotICAgIENBTExfR0xfQVBJKGdsQmluZEJ1ZmZlciwgdGFyZ2V0LCBidWZmZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCaW5kRnJhbWVidWZmZXIpKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcikgewotICAgIENBTExfR0xfQVBJKGdsQmluZEZyYW1lYnVmZmVyLCB0YXJnZXQsIGZyYW1lYnVmZmVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmluZFJlbmRlcmJ1ZmZlcikoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcikgewotICAgIENBTExfR0xfQVBJKGdsQmluZFJlbmRlcmJ1ZmZlciwgdGFyZ2V0LCByZW5kZXJidWZmZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCaW5kVGV4dHVyZSkoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJpbmRUZXh0dXJlLCB0YXJnZXQsIHRleHR1cmUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCbGVuZENvbG9yKShHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQmxlbmRDb2xvciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCbGVuZEVxdWF0aW9uKSggR0xlbnVtIG1vZGUgKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCbGVuZEVxdWF0aW9uLCBtb2RlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlKShHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlLCBtb2RlUkdCLCBtb2RlQWxwaGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCbGVuZEZ1bmMpKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikgewotICAgIENBTExfR0xfQVBJKGdsQmxlbmRGdW5jLCBzZmFjdG9yLCBkZmFjdG9yKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmxlbmRGdW5jU2VwYXJhdGUpKEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCbGVuZEZ1bmNTZXBhcmF0ZSwgc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJ1ZmZlckRhdGEpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhLCBHTGVudW0gdXNhZ2UpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJ1ZmZlckRhdGEsIHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNhZ2UpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCdWZmZXJTdWJEYXRhKShHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCdWZmZXJTdWJEYXRhLCB0YXJnZXQsIG9mZnNldCwgc2l6ZSwgZGF0YSk7Ci19Ci1HTGVudW0gQVBJX0VOVFJZKGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cykoR0xlbnVtIHRhcmdldCkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMsIHRhcmdldCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsZWFyKShHTGJpdGZpZWxkIG1hc2spIHsKLSAgICBDQUxMX0dMX0FQSShnbENsZWFyLCBtYXNrKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJDb2xvcikoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbENsZWFyQ29sb3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJEZXB0aGYpKEdMY2xhbXBmIGRlcHRoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGVhckRlcHRoZiwgZGVwdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGVhclN0ZW5jaWwpKEdMaW50IHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbENsZWFyU3RlbmNpbCwgcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENvbG9yTWFzaykoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb2xvck1hc2ssIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29tcGlsZVNoYWRlcikoR0x1aW50IHNoYWRlcikgewotICAgIENBTExfR0xfQVBJKGdsQ29tcGlsZVNoYWRlciwgc2hhZGVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29tcHJlc3NlZFRleEltYWdlMkQpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvbXByZXNzZWRUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBpbWFnZVNpemUsIGRhdGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb3B5VGV4SW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcikgewotICAgIENBTExfR0xfQVBJKGdsQ29weVRleEltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb3B5VGV4U3ViSW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb3B5VGV4U3ViSW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci19Ci1HTHVpbnQgQVBJX0VOVFJZKGdsQ3JlYXRlUHJvZ3JhbSkodm9pZCkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbENyZWF0ZVByb2dyYW0pOwotfQotR0x1aW50IEFQSV9FTlRSWShnbENyZWF0ZVNoYWRlcikoR0xlbnVtIHR5cGUpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xDcmVhdGVTaGFkZXIsIHR5cGUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDdWxsRmFjZSkoR0xlbnVtIG1vZGUpIHsKLSAgICBDQUxMX0dMX0FQSShnbEN1bGxGYWNlLCBtb2RlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlQnVmZmVycykoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGJ1ZmZlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZUJ1ZmZlcnMsIG4sIGJ1ZmZlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVGcmFtZWJ1ZmZlcnMpKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZUZyYW1lYnVmZmVycywgbiwgZnJhbWVidWZmZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlUHJvZ3JhbSkoR0x1aW50IHByb2dyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZVByb2dyYW0sIHByb2dyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVSZW5kZXJidWZmZXJzKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsRGVsZXRlUmVuZGVyYnVmZmVycywgbiwgcmVuZGVyYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlbGV0ZVNoYWRlcikoR0x1aW50IHNoYWRlcikgewotICAgIENBTExfR0xfQVBJKGdsRGVsZXRlU2hhZGVyLCBzaGFkZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVUZXh0dXJlcykoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHRleHR1cmVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVUZXh0dXJlcywgbiwgdGV4dHVyZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZXB0aEZ1bmMpKEdMZW51bSBmdW5jKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZXB0aEZ1bmMsIGZ1bmMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZXB0aE1hc2spKEdMYm9vbGVhbiBmbGFnKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZXB0aE1hc2ssIGZsYWcpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZXB0aFJhbmdlZikoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlcHRoUmFuZ2VmLCB6TmVhciwgekZhcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERldGFjaFNoYWRlcikoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbERldGFjaFNoYWRlciwgcHJvZ3JhbSwgc2hhZGVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGlzYWJsZSkoR0xlbnVtIGNhcCkgewotICAgIENBTExfR0xfQVBJKGdsRGlzYWJsZSwgY2FwKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KShHTHVpbnQgaW5kZXgpIHsKLSAgICBDQUxMX0dMX0FQSShnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSwgaW5kZXgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEcmF3QXJyYXlzKShHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpIHsKLSAgICBDQUxMX0dMX0FQSShnbERyYXdBcnJheXMsIG1vZGUsIGZpcnN0LCBjb3VudCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERyYXdFbGVtZW50cykoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIGluZGljZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERyYXdFbGVtZW50cywgbW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFbmFibGUpKEdMZW51bSBjYXApIHsKLSAgICBDQUxMX0dMX0FQSShnbEVuYWJsZSwgY2FwKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkpKEdMdWludCBpbmRleCkgewotICAgIENBTExfR0xfQVBJKGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXksIGluZGV4KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRmluaXNoKSh2b2lkKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGaW5pc2gpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGbHVzaCkodm9pZCkgewotICAgIENBTExfR0xfQVBJKGdsRmx1c2gpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyLCB0YXJnZXQsIGF0dGFjaG1lbnQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJhbWVidWZmZXJUZXh0dXJlMkQpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZyYW1lYnVmZmVyVGV4dHVyZTJELCB0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGcm9udEZhY2UpKEdMZW51bSBtb2RlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcm9udEZhY2UsIG1vZGUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZW5CdWZmZXJzKShHTHNpemVpIG4sIEdMdWludCogYnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsR2VuQnVmZmVycywgbiwgYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlbmVyYXRlTWlwbWFwKShHTGVudW0gdGFyZ2V0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5lcmF0ZU1pcG1hcCwgdGFyZ2V0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2VuRnJhbWVidWZmZXJzKShHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5GcmFtZWJ1ZmZlcnMsIG4sIGZyYW1lYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlblJlbmRlcmJ1ZmZlcnMpKEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5SZW5kZXJidWZmZXJzLCBuLCByZW5kZXJidWZmZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2VuVGV4dHVyZXMpKEdMc2l6ZWkgbiwgR0x1aW50KiB0ZXh0dXJlcykgewotICAgIENBTExfR0xfQVBJKGdsR2VuVGV4dHVyZXMsIG4sIHRleHR1cmVzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0QWN0aXZlQXR0cmliKShHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRBY3RpdmVBdHRyaWIsIHByb2dyYW0sIGluZGV4LCBidWZzaXplLCBsZW5ndGgsIHNpemUsIHR5cGUsIG5hbWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRBY3RpdmVVbmlmb3JtKShHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRBY3RpdmVVbmlmb3JtLCBwcm9ncmFtLCBpbmRleCwgYnVmc2l6ZSwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0QXR0YWNoZWRTaGFkZXJzKShHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBtYXhjb3VudCwgR0xzaXplaSogY291bnQsIEdMdWludCogc2hhZGVycykgewotICAgIENBTExfR0xfQVBJKGdsR2V0QXR0YWNoZWRTaGFkZXJzLCBwcm9ncmFtLCBtYXhjb3VudCwgY291bnQsIHNoYWRlcnMpOwotfQotaW50IEFQSV9FTlRSWShnbEdldEF0dHJpYkxvY2F0aW9uKShHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsR2V0QXR0cmliTG9jYXRpb24sIHByb2dyYW0sIG5hbWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRCb29sZWFudikoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4qIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0Qm9vbGVhbnYsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLUdMZW51bSBBUElfRU5UUlkoZ2xHZXRFcnJvcikodm9pZCkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbEdldEVycm9yKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0RmxvYXR2KShHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0RmxvYXR2LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2LCB0YXJnZXQsIGF0dGFjaG1lbnQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRJbnRlZ2VydikoR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRJbnRlZ2VydiwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFByb2dyYW1pdikoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0UHJvZ3JhbWl2LCBwcm9ncmFtLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0UHJvZ3JhbUluZm9Mb2cpKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRQcm9ncmFtSW5mb0xvZywgcHJvZ3JhbSwgYnVmc2l6ZSwgbGVuZ3RoLCBpbmZvbG9nKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFNoYWRlcml2KShHTHVpbnQgc2hhZGVyLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFNoYWRlcml2LCBzaGFkZXIsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRTaGFkZXJJbmZvTG9nKShHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRTaGFkZXJJbmZvTG9nLCBzaGFkZXIsIGJ1ZnNpemUsIGxlbmd0aCwgaW5mb2xvZyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCkoR0xlbnVtIHNoYWRlcnR5cGUsIEdMZW51bSBwcmVjaXNpb250eXBlLCBHTGludCogcmFuZ2UsIEdMaW50KiBwcmVjaXNpb24pIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCwgc2hhZGVydHlwZSwgcHJlY2lzaW9udHlwZSwgcmFuZ2UsIHByZWNpc2lvbik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFNoYWRlclNvdXJjZSkoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogc291cmNlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRTaGFkZXJTb3VyY2UsIHNoYWRlciwgYnVmc2l6ZSwgbGVuZ3RoLCBzb3VyY2UpOwotfQotY29uc3QgR0x1Ynl0ZSogQVBJX0VOVFJZKF9fZ2xHZXRTdHJpbmcpKEdMZW51bSBuYW1lKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsR2V0U3RyaW5nLCBuYW1lKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4UGFyYW1ldGVyZnYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhQYXJhbWV0ZXJmdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4UGFyYW1ldGVyaXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyaXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFVuaWZvcm1mdikoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0KiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFVuaWZvcm1mdiwgcHJvZ3JhbSwgbG9jYXRpb24sIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFVuaWZvcm1pdikoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRVbmlmb3JtaXYsIHByb2dyYW0sIGxvY2F0aW9uLCBwYXJhbXMpOwotfQotaW50IEFQSV9FTlRSWShnbEdldFVuaWZvcm1Mb2NhdGlvbikoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbEdldFVuaWZvcm1Mb2NhdGlvbiwgcHJvZ3JhbSwgbmFtZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFZlcnRleEF0dHJpYmZ2KShHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRWZXJ0ZXhBdHRyaWJmdiwgaW5kZXgsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRWZXJ0ZXhBdHRyaWJpdikoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFZlcnRleEF0dHJpYml2LCBpbmRleCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2KShHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiogcG9pbnRlcikgewotICAgIENBTExfR0xfQVBJKGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYsIGluZGV4LCBwbmFtZSwgcG9pbnRlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEhpbnQpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xIaW50LCB0YXJnZXQsIG1vZGUpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzQnVmZmVyKShHTHVpbnQgYnVmZmVyKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNCdWZmZXIsIGJ1ZmZlcik7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNFbmFibGVkKShHTGVudW0gY2FwKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNFbmFibGVkLCBjYXApOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzRnJhbWVidWZmZXIpKEdMdWludCBmcmFtZWJ1ZmZlcikgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzRnJhbWVidWZmZXIsIGZyYW1lYnVmZmVyKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc1Byb2dyYW0pKEdMdWludCBwcm9ncmFtKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNQcm9ncmFtLCBwcm9ncmFtKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc1JlbmRlcmJ1ZmZlcikoR0x1aW50IHJlbmRlcmJ1ZmZlcikgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzUmVuZGVyYnVmZmVyLCByZW5kZXJidWZmZXIpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzU2hhZGVyKShHTHVpbnQgc2hhZGVyKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNTaGFkZXIsIHNoYWRlcik7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNUZXh0dXJlKShHTHVpbnQgdGV4dHVyZSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzVGV4dHVyZSwgdGV4dHVyZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpbmVXaWR0aCkoR0xmbG9hdCB3aWR0aCkgewotICAgIENBTExfR0xfQVBJKGdsTGluZVdpZHRoLCB3aWR0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpbmtQcm9ncmFtKShHTHVpbnQgcHJvZ3JhbSkgewotICAgIENBTExfR0xfQVBJKGdsTGlua1Byb2dyYW0sIHByb2dyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQaXhlbFN0b3JlaSkoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsUGl4ZWxTdG9yZWksIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFBvbHlnb25PZmZzZXQpKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQb2x5Z29uT2Zmc2V0LCBmYWN0b3IsIHVuaXRzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVhZFBpeGVscykoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQqIHBpeGVscykgewotICAgIENBTExfR0xfQVBJKGdsUmVhZFBpeGVscywgeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlbGVhc2VTaGFkZXJDb21waWxlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UsIHRhcmdldCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTYW1wbGVDb3ZlcmFnZSkoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFNhbXBsZUNvdmVyYWdlLCB2YWx1ZSwgaW52ZXJ0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU2Npc3NvcikoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFNjaXNzb3IsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTaGFkZXJCaW5hcnkpKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBzaGFkZXJzLCBHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCBHTHZvaWQqIGJpbmFyeSwgR0xzaXplaSBsZW5ndGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbFNoYWRlckJpbmFyeSwgbiwgc2hhZGVycywgYmluYXJ5Zm9ybWF0LCBiaW5hcnksIGxlbmd0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFNoYWRlclNvdXJjZSkoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiogc3RyaW5nLCBjb25zdCBHTGludCogbGVuZ3RoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTaGFkZXJTb3VyY2UsIHNoYWRlciwgY291bnQsIHN0cmluZywgbGVuZ3RoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbEZ1bmMpKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsRnVuYywgZnVuYywgcmVmLCBtYXNrKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSkoR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsRnVuY1NlcGFyYXRlLCBmYWNlLCBmdW5jLCByZWYsIG1hc2spOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTdGVuY2lsTWFzaykoR0x1aW50IG1hc2spIHsKLSAgICBDQUxMX0dMX0FQSShnbFN0ZW5jaWxNYXNrLCBtYXNrKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbE1hc2tTZXBhcmF0ZSkoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsTWFza1NlcGFyYXRlLCBmYWNlLCBtYXNrKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbE9wKShHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpIHsKLSAgICBDQUxMX0dMX0FQSShnbFN0ZW5jaWxPcCwgZmFpbCwgemZhaWwsIHpwYXNzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbE9wU2VwYXJhdGUpKEdMZW51bSBmYWNlLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpIHsKLSAgICBDQUxMX0dMX0FQSShnbFN0ZW5jaWxPcFNlcGFyYXRlLCBmYWNlLCBmYWlsLCB6ZmFpbCwgenBhc3MpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhJbWFnZTJEKShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscykgewotICAgIENBTExfR0xfQVBJKGdsVGV4SW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJmKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcmYsIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyZnYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJmdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyaSkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyaSwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJpdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4U3ViSW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybTFmKShHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtMWYsIGxvY2F0aW9uLCB4KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybTFmdikoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm0xZnYsIGxvY2F0aW9uLCBjb3VudCwgdik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm0xaSkoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm0xaSwgbG9jYXRpb24sIHgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtMWl2KShHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm0xaXYsIGxvY2F0aW9uLCBjb3VudCwgdik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm0yZikoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtMmYsIGxvY2F0aW9uLCB4LCB5KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybTJmdikoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm0yZnYsIGxvY2F0aW9uLCBjb3VudCwgdik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm0yaSkoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm0yaSwgbG9jYXRpb24sIHgsIHkpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtMml2KShHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm0yaXYsIGxvY2F0aW9uLCBjb3VudCwgdik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm0zZikoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm0zZiwgbG9jYXRpb24sIHgsIHksIHopOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtM2Z2KShHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdikgewotICAgIENBTExfR0xfQVBJKGdsVW5pZm9ybTNmdiwgbG9jYXRpb24sIGNvdW50LCB2KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybTNpKShHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeikgewotICAgIENBTExfR0xfQVBJKGdsVW5pZm9ybTNpLCBsb2NhdGlvbiwgeCwgeSwgeik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm0zaXYpKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdikgewotICAgIENBTExfR0xfQVBJKGdsVW5pZm9ybTNpdiwgbG9jYXRpb24sIGNvdW50LCB2KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybTRmKShHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtNGYsIGxvY2F0aW9uLCB4LCB5LCB6LCB3KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybTRmdikoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm00ZnYsIGxvY2F0aW9uLCBjb3VudCwgdik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm00aSkoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm00aSwgbG9jYXRpb24sIHgsIHksIHosIHcpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtNGl2KShHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm00aXYsIGxvY2F0aW9uLCBjb3VudCwgdik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm1NYXRyaXgyZnYpKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsVW5pZm9ybU1hdHJpeDJmdiwgbG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybU1hdHJpeDNmdikoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtTWF0cml4M2Z2LCBsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtTWF0cml4NGZ2KShHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm1NYXRyaXg0ZnYsIGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVzZVByb2dyYW0pKEdMdWludCBwcm9ncmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVc2VQcm9ncmFtLCBwcm9ncmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVmFsaWRhdGVQcm9ncmFtKShHTHVpbnQgcHJvZ3JhbSkgewotICAgIENBTExfR0xfQVBJKGdsVmFsaWRhdGVQcm9ncmFtLCBwcm9ncmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVmVydGV4QXR0cmliMWYpKEdMdWludCBpbmR4LCBHTGZsb2F0IHgpIHsKLSAgICBDQUxMX0dMX0FQSShnbFZlcnRleEF0dHJpYjFmLCBpbmR4LCB4KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVmVydGV4QXR0cmliMWZ2KShHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xWZXJ0ZXhBdHRyaWIxZnYsIGluZHgsIHZhbHVlcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFZlcnRleEF0dHJpYjJmKShHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpIHsKLSAgICBDQUxMX0dMX0FQSShnbFZlcnRleEF0dHJpYjJmLCBpbmR4LCB4LCB5KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVmVydGV4QXR0cmliMmZ2KShHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xWZXJ0ZXhBdHRyaWIyZnYsIGluZHgsIHZhbHVlcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFZlcnRleEF0dHJpYjNmKShHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgewotICAgIENBTExfR0xfQVBJKGdsVmVydGV4QXR0cmliM2YsIGluZHgsIHgsIHksIHopOwotfQotdm9pZCBBUElfRU5UUlkoZ2xWZXJ0ZXhBdHRyaWIzZnYpKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFZlcnRleEF0dHJpYjNmdiwgaW5keCwgdmFsdWVzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVmVydGV4QXR0cmliNGYpKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpIHsKLSAgICBDQUxMX0dMX0FQSShnbFZlcnRleEF0dHJpYjRmLCBpbmR4LCB4LCB5LCB6LCB3KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVmVydGV4QXR0cmliNGZ2KShHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xWZXJ0ZXhBdHRyaWI0ZnYsIGluZHgsIHZhbHVlcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFZlcnRleEF0dHJpYlBvaW50ZXIpKEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHB0cikgewotICAgIENBTExfR0xfQVBJKGdsVmVydGV4QXR0cmliUG9pbnRlciwgaW5keCwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlLCBwdHIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xWaWV3cG9ydCkoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFZpZXdwb3J0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVMyL2dsMmV4dF9hcGkuaW4gYi9vcGVuZ2wvbGlicy9HTEVTMi9nbDJleHRfYXBpLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzgxMDc1Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVMyL2dsMmV4dF9hcGkuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotdm9pZCBBUElfRU5UUlkoZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUykoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSkgewotICAgIENBTExfR0xfQVBJKGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMsIHRhcmdldCwgaW1hZ2UpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMpKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpIHsKLSAgICBDQUxMX0dMX0FQSShnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUywgdGFyZ2V0LCBpbWFnZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFByb2dyYW1CaW5hcnlPRVMpKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xlbnVtICpiaW5hcnlGb3JtYXQsIEdMdm9pZCAqYmluYXJ5KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRQcm9ncmFtQmluYXJ5T0VTLCBwcm9ncmFtLCBidWZTaXplLCBsZW5ndGgsIGJpbmFyeUZvcm1hdCwgYmluYXJ5KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbUJpbmFyeU9FUykoR0x1aW50IHByb2dyYW0sIEdMZW51bSBiaW5hcnlGb3JtYXQsIGNvbnN0IEdMdm9pZCAqYmluYXJ5LCBHTGludCBsZW5ndGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1CaW5hcnlPRVMsIHByb2dyYW0sIGJpbmFyeUZvcm1hdCwgYmluYXJ5LCBsZW5ndGgpOwotfQotdm9pZCogQVBJX0VOVFJZKGdsTWFwQnVmZmVyT0VTKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsTWFwQnVmZmVyT0VTLCB0YXJnZXQsIGFjY2Vzcyk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsVW5tYXBCdWZmZXJPRVMpKEdMZW51bSB0YXJnZXQpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xVbm1hcEJ1ZmZlck9FUywgdGFyZ2V0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0QnVmZmVyUG9pbnRlcnZPRVMpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRCdWZmZXJQb2ludGVydk9FUywgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4SW1hZ2UzRE9FUykoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhJbWFnZTNET0VTLCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGJvcmRlciwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhTdWJJbWFnZTNET0VTKShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscykgewotICAgIENBTExfR0xfQVBJKGdsVGV4U3ViSW1hZ2UzRE9FUywgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29weVRleFN1YkltYWdlM0RPRVMpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsQ29weVRleFN1YkltYWdlM0RPRVMsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb21wcmVzc2VkVGV4SW1hZ2UzRE9FUykoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgewotICAgIENBTExfR0xfQVBJKGdsQ29tcHJlc3NlZFRleEltYWdlM0RPRVMsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgYm9yZGVyLCBpbWFnZVNpemUsIGRhdGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUykoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUywgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgaW1hZ2VTaXplLCBkYXRhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVMpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZyYW1lYnVmZmVyVGV4dHVyZTNET0VTLCB0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwsIHpvZmZzZXQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCaW5kVmVydGV4QXJyYXlPRVMpKEdMdWludCBhcnJheSkgewotICAgIENBTExfR0xfQVBJKGdsQmluZFZlcnRleEFycmF5T0VTLCBhcnJheSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlbGV0ZVZlcnRleEFycmF5c09FUykoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cykgewotICAgIENBTExfR0xfQVBJKGdsRGVsZXRlVmVydGV4QXJyYXlzT0VTLCBuLCBhcnJheXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZW5WZXJ0ZXhBcnJheXNPRVMpKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdlblZlcnRleEFycmF5c09FUywgbiwgYXJyYXlzKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc1ZlcnRleEFycmF5T0VTKShHTHVpbnQgYXJyYXkpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc1ZlcnRleEFycmF5T0VTLCBhcnJheSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFBlcmZNb25pdG9yR3JvdXBzQU1EKShHTGludCAqbnVtR3JvdXBzLCBHTHNpemVpIGdyb3Vwc1NpemUsIEdMdWludCAqZ3JvdXBzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRQZXJmTW9uaXRvckdyb3Vwc0FNRCwgbnVtR3JvdXBzLCBncm91cHNTaXplLCBncm91cHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1EKShHTHVpbnQgZ3JvdXAsIEdMaW50ICpudW1Db3VudGVycywgR0xpbnQgKm1heEFjdGl2ZUNvdW50ZXJzLCBHTHNpemVpIGNvdW50ZXJTaXplLCBHTHVpbnQgKmNvdW50ZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1ELCBncm91cCwgbnVtQ291bnRlcnMsIG1heEFjdGl2ZUNvdW50ZXJzLCBjb3VudGVyU2l6ZSwgY291bnRlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EKShHTHVpbnQgZ3JvdXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmdyb3VwU3RyaW5nKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1ELCBncm91cCwgYnVmU2l6ZSwgbGVuZ3RoLCBncm91cFN0cmluZyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRCkoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqY291bnRlclN0cmluZykgewotICAgIENBTExfR0xfQVBJKGdsR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1ELCBncm91cCwgY291bnRlciwgYnVmU2l6ZSwgbGVuZ3RoLCBjb3VudGVyU3RyaW5nKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0UGVyZk1vbml0b3JDb3VudGVySW5mb0FNRCkoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKmRhdGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQsIGdyb3VwLCBjb3VudGVyLCBwbmFtZSwgZGF0YSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlblBlcmZNb25pdG9yc0FNRCkoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5QZXJmTW9uaXRvcnNBTUQsIG4sIG1vbml0b3JzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlUGVyZk1vbml0b3JzQU1EKShHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZVBlcmZNb25pdG9yc0FNRCwgbiwgbW9uaXRvcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EKShHTHVpbnQgbW9uaXRvciwgR0xib29sZWFuIGVuYWJsZSwgR0x1aW50IGdyb3VwLCBHTGludCBudW1Db3VudGVycywgR0x1aW50ICpjb3VudGVyc0xpc3QpIHsKLSAgICBDQUxMX0dMX0FQSShnbFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQsIG1vbml0b3IsIGVuYWJsZSwgZ3JvdXAsIG51bUNvdW50ZXJzLCBjb3VudGVyc0xpc3QpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCZWdpblBlcmZNb25pdG9yQU1EKShHTHVpbnQgbW9uaXRvcikgewotICAgIENBTExfR0xfQVBJKGdsQmVnaW5QZXJmTW9uaXRvckFNRCwgbW9uaXRvcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEVuZFBlcmZNb25pdG9yQU1EKShHTHVpbnQgbW9uaXRvcikgewotICAgIENBTExfR0xfQVBJKGdsRW5kUGVyZk1vbml0b3JBTUQsIG1vbml0b3IpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1EKShHTHVpbnQgbW9uaXRvciwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGRhdGFTaXplLCBHTHVpbnQgKmRhdGEsIEdMaW50ICpieXRlc1dyaXR0ZW4pIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQsIG1vbml0b3IsIHBuYW1lLCBkYXRhU2l6ZSwgZGF0YSwgYnl0ZXNXcml0dGVuKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmxpdEZyYW1lYnVmZmVyQU5HTEUpKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCbGl0RnJhbWVidWZmZXJBTkdMRSwgc3JjWDAsIHNyY1kwLCBzcmNYMSwgc3JjWTEsIGRzdFgwLCBkc3RZMCwgZHN0WDEsIGRzdFkxLCBtYXNrLCBmaWx0ZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBTkdMRSkoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBTkdMRSwgdGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFLCB0YXJnZXQsIHNhbXBsZXMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSkodm9pZCkgewotICAgIENBTExfR0xfQVBJKGdsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExhYmVsT2JqZWN0RVhUKShHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbGFiZWwpIHsKLSAgICBDQUxMX0dMX0FQSShnbExhYmVsT2JqZWN0RVhULCB0eXBlLCBvYmplY3QsIGxlbmd0aCwgbGFiZWwpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRPYmplY3RMYWJlbEVYVCkoR0xlbnVtIHR5cGUsIEdMdWludCBvYmplY3QsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmxhYmVsKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRPYmplY3RMYWJlbEVYVCwgdHlwZSwgb2JqZWN0LCBidWZTaXplLCBsZW5ndGgsIGxhYmVsKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsSW5zZXJ0RXZlbnRNYXJrZXJFWFQpKEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKm1hcmtlcikgewotICAgIENBTExfR0xfQVBJKGdsSW5zZXJ0RXZlbnRNYXJrZXJFWFQsIGxlbmd0aCwgbWFya2VyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHVzaEdyb3VwTWFya2VyRVhUKShHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbFB1c2hHcm91cE1hcmtlckVYVCwgbGVuZ3RoLCBtYXJrZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb3BHcm91cE1hcmtlckVYVCkodm9pZCkgewotICAgIENBTExfR0xfQVBJKGdsUG9wR3JvdXBNYXJrZXJFWFQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtQXR0YWNobWVudHMsIGNvbnN0IEdMZW51bSAqYXR0YWNobWVudHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERpc2NhcmRGcmFtZWJ1ZmZlckVYVCwgdGFyZ2V0LCBudW1BdHRhY2htZW50cywgYXR0YWNobWVudHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhULCB0YXJnZXQsIHNhbXBsZXMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVCkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhULCB0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwsIHNhbXBsZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xNdWx0aURyYXdBcnJheXNFWFQpKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCkgewotICAgIENBTExfR0xfQVBJKGdsTXVsdGlEcmF3QXJyYXlzRVhULCBtb2RlLCBmaXJzdCwgY291bnQsIHByaW1jb3VudCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE11bHRpRHJhd0VsZW1lbnRzRVhUKShHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCkgewotICAgIENBTExfR0xfQVBJKGdsTXVsdGlEcmF3RWxlbWVudHNFWFQsIG1vZGUsIGNvdW50LCB0eXBlLCBpbmRpY2VzLCBwcmltY291bnQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZW5RdWVyaWVzRVhUKShHTHNpemVpIG4sIEdMdWludCAqaWRzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5RdWVyaWVzRVhULCBuLCBpZHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVRdWVyaWVzRVhUKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVRdWVyaWVzRVhULCBuLCBpZHMpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzUXVlcnlFWFQpKEdMdWludCBpZCkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzUXVlcnlFWFQsIGlkKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmVnaW5RdWVyeUVYVCkoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCZWdpblF1ZXJ5RVhULCB0YXJnZXQsIGlkKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRW5kUXVlcnlFWFQpKEdMZW51bSB0YXJnZXQpIHsKLSAgICBDQUxMX0dMX0FQSShnbEVuZFF1ZXJ5RVhULCB0YXJnZXQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRRdWVyeWl2RVhUKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFF1ZXJ5aXZFWFQsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFF1ZXJ5T2JqZWN0dWl2RVhUKShHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFF1ZXJ5T2JqZWN0dWl2RVhULCBpZCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci1HTGVudW0gQVBJX0VOVFJZKGdsR2V0R3JhcGhpY3NSZXNldFN0YXR1c0VYVCkodm9pZCkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZWFkblBpeGVsc0VYVCkoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIHZvaWQgKmRhdGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlYWRuUGl4ZWxzRVhULCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIGJ1ZlNpemUsIGRhdGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRuVW5pZm9ybWZ2RVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0blVuaWZvcm1mdkVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIGJ1ZlNpemUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldG5Vbmlmb3JtaXZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRuVW5pZm9ybWl2RVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgYnVmU2l6ZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVXNlUHJvZ3JhbVN0YWdlc0VYVCkoR0x1aW50IHBpcGVsaW5lLCBHTGJpdGZpZWxkIHN0YWdlcywgR0x1aW50IHByb2dyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFVzZVByb2dyYW1TdGFnZXNFWFQsIHBpcGVsaW5lLCBzdGFnZXMsIHByb2dyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xBY3RpdmVTaGFkZXJQcm9ncmFtRVhUKShHTHVpbnQgcGlwZWxpbmUsIEdMdWludCBwcm9ncmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xBY3RpdmVTaGFkZXJQcm9ncmFtRVhULCBwaXBlbGluZSwgcHJvZ3JhbSk7Ci19Ci1HTHVpbnQgQVBJX0VOVFJZKGdsQ3JlYXRlU2hhZGVyUHJvZ3JhbXZFWFQpKEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIgKipzdHJpbmdzKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsQ3JlYXRlU2hhZGVyUHJvZ3JhbXZFWFQsIHR5cGUsIGNvdW50LCBzdHJpbmdzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmluZFByb2dyYW1QaXBlbGluZUVYVCkoR0x1aW50IHBpcGVsaW5lKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCaW5kUHJvZ3JhbVBpcGVsaW5lRVhULCBwaXBlbGluZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlbGV0ZVByb2dyYW1QaXBlbGluZXNFWFQpKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwaXBlbGluZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZVByb2dyYW1QaXBlbGluZXNFWFQsIG4sIHBpcGVsaW5lcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlblByb2dyYW1QaXBlbGluZXNFWFQpKEdMc2l6ZWkgbiwgR0x1aW50ICpwaXBlbGluZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdlblByb2dyYW1QaXBlbGluZXNFWFQsIG4sIHBpcGVsaW5lcyk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNQcm9ncmFtUGlwZWxpbmVFWFQpKEdMdWludCBwaXBlbGluZSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzUHJvZ3JhbVBpcGVsaW5lRVhULCBwaXBlbGluZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1QYXJhbWV0ZXJpRVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCB2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVBhcmFtZXRlcmlFWFQsIHByb2dyYW0sIHBuYW1lLCB2YWx1ZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFByb2dyYW1QaXBlbGluZWl2RVhUKShHTHVpbnQgcGlwZWxpbmUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0UHJvZ3JhbVBpcGVsaW5laXZFWFQsIHBpcGVsaW5lLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm0xaUVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtVW5pZm9ybTFpRVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgeCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtMmlFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm0yaUVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIHgsIHkpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTNpRVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtM2lFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5LCB6KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm00aUVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtVW5pZm9ybTRpRVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgeCwgeSwgeiwgdyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtMWZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtVW5pZm9ybTFmRVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgeCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtMmZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtMmZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm0zZkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtVW5pZm9ybTNmRVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgeCwgeSwgeik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtNGZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtVW5pZm9ybTRmRVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgeCwgeSwgeiwgdyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtMWl2RVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm0xaXZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTJpdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtMml2RVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm0zaXZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB2YWx1ZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtNGl2RVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm00aXZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTFmdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm0xZnZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTJmdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm0yZnZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTNmdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm0zZnZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTRmdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm00ZnZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2RVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xWYWxpZGF0ZVByb2dyYW1QaXBlbGluZUVYVCkoR0x1aW50IHBpcGVsaW5lKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xWYWxpZGF0ZVByb2dyYW1QaXBlbGluZUVYVCwgcGlwZWxpbmUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nRVhUKShHTHVpbnQgcGlwZWxpbmUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9Mb2cpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFByb2dyYW1QaXBlbGluZUluZm9Mb2dFWFQsIHBpcGVsaW5lLCBidWZTaXplLCBsZW5ndGgsIGluZm9Mb2cpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhTdG9yYWdlMURFWFQpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFN0b3JhZ2UxREVYVCwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFN0b3JhZ2UyREVYVCkoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFN0b3JhZ2UyREVYVCwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4U3RvcmFnZTNERVhUKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCkgewotICAgIENBTExfR0xfQVBJKGdsVGV4U3RvcmFnZTNERVhULCB0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4dHVyZVN0b3JhZ2UxREVYVCkoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleHR1cmVTdG9yYWdlMURFWFQsIHRleHR1cmUsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXh0dXJlU3RvcmFnZTJERVhUKShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleHR1cmVTdG9yYWdlMkRFWFQsIHRleHR1cmUsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleHR1cmVTdG9yYWdlM0RFWFQpKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCkgewotICAgIENBTExfR0xfQVBJKGdsVGV4dHVyZVN0b3JhZ2UzREVYVCwgdGV4dHVyZSwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUlNRykoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcsIHRhcmdldCwgc2FtcGxlcywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcsIHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCwgc2FtcGxlcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENvdmVyYWdlTWFza05WKShHTGJvb2xlYW4gbWFzaykgewotICAgIENBTExfR0xfQVBJKGdsQ292ZXJhZ2VNYXNrTlYsIG1hc2spOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WKShHTGVudW0gb3BlcmF0aW9uKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WLCBvcGVyYXRpb24pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEcmF3QnVmZmVyc05WKShHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcykgewotICAgIENBTExfR0xfQVBJKGdsRHJhd0J1ZmZlcnNOViwgbiwgYnVmcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlbGV0ZUZlbmNlc05WKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVGZW5jZXNOViwgbiwgZmVuY2VzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2VuRmVuY2VzTlYpKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdlbkZlbmNlc05WLCBuLCBmZW5jZXMpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzRmVuY2VOVikoR0x1aW50IGZlbmNlKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNGZW5jZU5WLCBmZW5jZSk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsVGVzdEZlbmNlTlYpKEdMdWludCBmZW5jZSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbFRlc3RGZW5jZU5WLCBmZW5jZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEZlbmNlaXZOVikoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEZlbmNlaXZOViwgZmVuY2UsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGaW5pc2hGZW5jZU5WKShHTHVpbnQgZmVuY2UpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZpbmlzaEZlbmNlTlYsIGZlbmNlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU2V0RmVuY2VOVikoR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTZXRGZW5jZU5WLCBmZW5jZSwgY29uZGl0aW9uKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVhZEJ1ZmZlck5WKShHTGVudW0gbW9kZSkgewotICAgIENBTExfR0xfQVBJKGdsUmVhZEJ1ZmZlck5WLCBtb2RlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQWxwaGFGdW5jUUNPTSkoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZikgewotICAgIENBTExfR0xfQVBJKGdsQWxwaGFGdW5jUUNPTSwgZnVuYywgcmVmKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0RHJpdmVyQ29udHJvbHNRQ09NKShHTGludCAqbnVtLCBHTHNpemVpIHNpemUsIEdMdWludCAqZHJpdmVyQ29udHJvbHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldERyaXZlckNvbnRyb2xzUUNPTSwgbnVtLCBzaXplLCBkcml2ZXJDb250cm9scyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldERyaXZlckNvbnRyb2xTdHJpbmdRQ09NKShHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZykgewotICAgIENBTExfR0xfQVBJKGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00sIGRyaXZlckNvbnRyb2wsIGJ1ZlNpemUsIGxlbmd0aCwgZHJpdmVyQ29udHJvbFN0cmluZyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NKShHTHVpbnQgZHJpdmVyQ29udHJvbCkgewotICAgIENBTExfR0xfQVBJKGdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00sIGRyaXZlckNvbnRyb2wpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00pKEdMdWludCBkcml2ZXJDb250cm9sKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00sIGRyaXZlckNvbnRyb2wpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRUZXh0dXJlc1FDT00pKEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldFRleHR1cmVzUUNPTSwgdGV4dHVyZXMsIG1heFRleHR1cmVzLCBudW1UZXh0dXJlcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldEJ1ZmZlcnNRQ09NKShHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRCdWZmZXJzUUNPTSwgYnVmZmVycywgbWF4QnVmZmVycywgbnVtQnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NKShHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTSwgcmVuZGVyYnVmZmVycywgbWF4UmVuZGVyYnVmZmVycywgbnVtUmVuZGVyYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00pKEdMdWludCAqZnJhbWVidWZmZXJzLCBHTGludCBtYXhGcmFtZWJ1ZmZlcnMsIEdMaW50ICpudW1GcmFtZWJ1ZmZlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00sIGZyYW1lYnVmZmVycywgbWF4RnJhbWVidWZmZXJzLCBudW1GcmFtZWJ1ZmZlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSkoR0x1aW50IHRleHR1cmUsIEdMZW51bSBmYWNlLCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSwgdGV4dHVyZSwgZmFjZSwgbGV2ZWwsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00pKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00pKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGV4ZWxzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00sIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIHR5cGUsIHRleGVscyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTSkoR0xlbnVtIHRhcmdldCwgR0x2b2lkICoqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00sIHRhcmdldCwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0U2hhZGVyc1FDT00pKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldFNoYWRlcnNRQ09NLCBzaGFkZXJzLCBtYXhTaGFkZXJzLCBudW1TaGFkZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0UHJvZ3JhbXNRQ09NKShHTHVpbnQgKnByb2dyYW1zLCBHTGludCBtYXhQcm9ncmFtcywgR0xpbnQgKm51bVByb2dyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRQcm9ncmFtc1FDT00sIHByb2dyYW1zLCBtYXhQcm9ncmFtcywgbnVtUHJvZ3JhbXMpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00pKEdMdWludCBwcm9ncmFtKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSwgcHJvZ3JhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NKShHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTSwgcHJvZ3JhbSwgc2hhZGVydHlwZSwgc291cmNlLCBsZW5ndGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTdGFydFRpbGluZ1FDT00pKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzaykgewotICAgIENBTExfR0xfQVBJKGdsU3RhcnRUaWxpbmdRQ09NLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwcmVzZXJ2ZU1hc2spOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFbmRUaWxpbmdRQ09NKShHTGJpdGZpZWxkIHByZXNlcnZlTWFzaykgewotICAgIENBTExfR0xfQVBJKGdsRW5kVGlsaW5nUUNPTSwgcHJlc2VydmVNYXNrKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfQ00vZ2wuY3BwIGIvb3BlbmdsL2xpYnMvR0xFU19DTS9nbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2I2MGQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU19DTS9nbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyogCi0gKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgImhvb2tzLmgiCi0jaW5jbHVkZSAiZWdsX2ltcGwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLS8vIHNldCB0aGlzIHRvIDEgZm9yIGNydWRlIEdMIGRlYnVnZ2luZwotI2RlZmluZSBDSEVDS19GT1JfR0xfRVJST1JTICAgICAwCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGV4dGVuc2lvbnMgZm9yIHRoZSBmcmFtZXdvcmsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZXh0ZXJuICJDIiB7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yUG9pbnRlckJvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsCi0gICAgICAgIGNvbnN0IEdMdm9pZCAqcHRyLCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTm9ybWFsUG9pbnRlckJvdW5kcyhHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsCi0gICAgICAgIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleENvb3JkUG9pbnRlckJvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleFBvaW50ZXJCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCi0gICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFNpemVQb2ludGVyT0VTQm91bmRzKEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsV2VpZ2h0UG9pbnRlck9FU0JvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Ci19Ci0KLXZvaWQgZ2xDb2xvclBvaW50ZXJCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAotICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciwgR0xzaXplaSBjb3VudCkgewotICAgIGdsQ29sb3JQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcHRyKTsKLX0KLXZvaWQgZ2xOb3JtYWxQb2ludGVyQm91bmRzKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKLSAgICAgICAgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7Ci0gICAgZ2xOb3JtYWxQb2ludGVyKHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci12b2lkIGdsVGV4Q29vcmRQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7Ci0gICAgZ2xUZXhDb29yZFBvaW50ZXIoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLX0KLXZvaWQgZ2xWZXJ0ZXhQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7Ci0gICAgZ2xWZXJ0ZXhQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci0KLXZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFNpemVQb2ludGVyT0VTQm91bmRzKEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7Ci0gICAgZ2xQb2ludFNpemVQb2ludGVyT0VTKHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci0KLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7Ci0gICAgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLX0KLQotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xXZWlnaHRQb2ludGVyT0VTQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7Ci0gICAgZ2xXZWlnaHRQb2ludGVyT0VTKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEFjdHVhbCBHTCBlbnRyeS1wb2ludHMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI3VuZGVmIEFQSV9FTlRSWQotI3VuZGVmIENBTExfR0xfQVBJCi0jdW5kZWYgQ0FMTF9HTF9BUElfUkVUVVJOCi0KLSNpZiBVU0VfRkFTVF9UTFNfS0VZICYmICFDSEVDS19GT1JfR0xfRVJST1JTCi0KLSAgICAjaWZkZWYgSEFWRV9BUk1fVExTX1JFR0lTVEVSCi0gICAgICAgICNkZWZpbmUgR0VUX1RMUyhyZWcpIFwKLSAgICAgICAgICAgICJtcmMgcDE1LCAwLCAiICNyZWcgIiwgYzEzLCBjMCwgMyBcbiIKLSAgICAjZWxzZQotICAgICAgICAjZGVmaW5lIEdFVF9UTFMocmVnKSBcCi0gICAgICAgICAgICAibW92ICAgIiAjcmVnICIsICMweEZGRkYwRkZGICAgICAgXG4iICBcCi0gICAgICAgICAgICAibGRyICAgIiAjcmVnICIsIFsiICNyZWcgIiwgIy0xNV0gXG4iCi0gICAgI2VuZGlmCi0KLSAgICAjZGVmaW5lIEFQSV9FTlRSWShfYXBpKSBfX2F0dHJpYnV0ZV9fKChuYWtlZCkpIF9hcGkKLQotICAgICNkZWZpbmUgQ0FMTF9HTF9BUEkoX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGFzbSB2b2xhdGlsZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBHRVRfVExTKHIxMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgImxkciAgIHIxMiwgW3IxMiwgJVt0bHNdXSBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJjbXAgICByMTIsICMwICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAibGRybmUgcGMsICBbcjEyLCAlW2FwaV1dIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgIm1vdiAgIHIwLCAjMCAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJieCAgICBsciAgICAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOiBbdGxzXSAiSiIoVExTX1NMT1RfT1BFTkdMX0FQSSo0KSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgW2FwaV0gIkoiKF9fYnVpbHRpbl9vZmZzZXRvZihnbF9ob29rc190LCBnbC5fYXBpKSkgICAgXAotICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICk7Ci0KLSAgICAjZGVmaW5lIENBTExfR0xfQVBJX1JFVFVSTihfYXBpLCAuLi4pIFwKLSAgICAgICAgQ0FMTF9HTF9BUEkoX2FwaSwgX19WQV9BUkdTX18pIFwKLSAgICAgICAgcmV0dXJuIDA7IC8vIHBsYWNhdGUgZ2NjJ3Mgd2FybmluZ3MuIG5ldmVyIHJlYWNoZWQuCi0KLSNlbHNlCi0KLSAgICAjaWYgQ0hFQ0tfRk9SX0dMX0VSUk9SUwotICAgIAotICAgICAgICAjZGVmaW5lIENIRUNLX0dMX0VSUk9SUyhfYXBpKSBcCi0gICAgICAgICAgICBkbyB7IEdMaW50IGVyciA9IGdsR2V0RXJyb3IoKTsgXAotICAgICAgICAgICAgICAgIEFMT0dFX0lGKGVyciAhPSBHTF9OT19FUlJPUiwgIiVzIGZhaWxlZCAoMHglMDRYKSIsICNfYXBpLCBlcnIpOyBcCi0gICAgICAgICAgICB9IHdoaWxlKGZhbHNlKTsKLQotICAgICNlbHNlCi0KLSAgICAgICAgI2RlZmluZSBDSEVDS19HTF9FUlJPUlMoX2FwaSkgZG8geyB9IHdoaWxlKGZhbHNlKTsKLQotICAgICNlbmRpZgotCi0KLSAgICAjZGVmaW5lIEFQSV9FTlRSWShfYXBpKSBfYXBpCi0KLSAgICAjZGVmaW5lIENBTExfR0xfQVBJKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7IFwKLSAgICAgICAgX2MtPl9hcGkoX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ0hFQ0tfR0xfRVJST1JTKF9hcGkpCi0KLSAgICAjZGVmaW5lIENBTExfR0xfQVBJX1JFVFVSTihfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7IFwKLSAgICAgICAgcmV0dXJuIF9jLT5fYXBpKF9fVkFfQVJHU19fKQotCi0jZW5kaWYKLQotCi1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICJnbF9hcGkuaW4iCi0jaW5jbHVkZSAiZ2xleHRfYXBpLmluIgotfQotCi0jdW5kZWYgQVBJX0VOVFJZCi0jdW5kZWYgQ0FMTF9HTF9BUEkKLSN1bmRlZiBDQUxMX0dMX0FQSV9SRVRVUk4KLQotLyoKLSAqIGdsR2V0U3RyaW5nKCkgaXMgc3BlY2lhbCBiZWNhdXNlIHdlIGV4cG9zZSBzb21lIGV4dGVuc2lvbnMgaW4gdGhlIHdyYXBwZXIKLSAqLwotCi1leHRlcm4gIkMiIGNvbnN0IEdMdWJ5dGUgKiBfX2dsR2V0U3RyaW5nKEdMZW51bSBuYW1lKTsKLQotY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nKEdMZW51bSBuYW1lKQotewotICAgIGNvbnN0IEdMdWJ5dGUgKiByZXQgPSBlZ2xfZ2V0X3N0cmluZ19mb3JfY3VycmVudF9jb250ZXh0KG5hbWUpOwotICAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgICAgICByZXQgPSBfX2dsR2V0U3RyaW5nKG5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU19DTS9nbF9hcGkuaW4gYi9vcGVuZ2wvbGlicy9HTEVTX0NNL2dsX2FwaS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmNmIwYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX0NNL2dsX2FwaS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi12b2lkIEFQSV9FTlRSWShnbEFscGhhRnVuYykoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZikgewotICAgIENBTExfR0xfQVBJKGdsQWxwaGFGdW5jLCBmdW5jLCByZWYpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGVhckNvbG9yKShHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQ2xlYXJDb2xvciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGVhckRlcHRoZikoR0xjbGFtcGYgZGVwdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbENsZWFyRGVwdGhmLCBkZXB0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsaXBQbGFuZWYpKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pIHsKLSAgICBDQUxMX0dMX0FQSShnbENsaXBQbGFuZWYsIHBsYW5lLCBlcXVhdGlvbik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENvbG9yNGYpKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvbG9yNGYsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVwdGhSYW5nZWYpKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZXB0aFJhbmdlZiwgek5lYXIsIHpGYXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGb2dmKShHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbEZvZ2YsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZvZ2Z2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsRm9nZnYsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGcnVzdHVtZikoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgewotICAgIENBTExfR0xfQVBJKGdsRnJ1c3R1bWYsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRDbGlwUGxhbmVmKShHTGVudW0gcG5hbWUsIEdMZmxvYXQgZXFuWzRdKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRDbGlwUGxhbmVmLCBwbmFtZSwgZXFuKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0RmxvYXR2KShHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0RmxvYXR2LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0TGlnaHRmdikoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0TGlnaHRmdiwgbGlnaHQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRNYXRlcmlhbGZ2KShHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldE1hdGVyaWFsZnYsIGZhY2UsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhFbnZmdikoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFRleEVudmZ2LCBlbnYsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhQYXJhbWV0ZXJmdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFRleFBhcmFtZXRlcmZ2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaWdodE1vZGVsZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMaWdodE1vZGVsZiwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTGlnaHRNb2RlbGZ2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsTGlnaHRNb2RlbGZ2LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTGlnaHRmKShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsTGlnaHRmLCBsaWdodCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTGlnaHRmdikoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsTGlnaHRmdiwgbGlnaHQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaW5lV2lkdGgpKEdMZmxvYXQgd2lkdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbExpbmVXaWR0aCwgd2lkdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMb2FkTWF0cml4ZikoY29uc3QgR0xmbG9hdCAqbSkgewotICAgIENBTExfR0xfQVBJKGdsTG9hZE1hdHJpeGYsIG0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xNYXRlcmlhbGYpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbE1hdGVyaWFsZiwgZmFjZSwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWxmdikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbGZ2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTXVsdE1hdHJpeGYpKGNvbnN0IEdMZmxvYXQgKm0pIHsKLSAgICBDQUxMX0dMX0FQSShnbE11bHRNYXRyaXhmLCBtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTXVsdGlUZXhDb29yZDRmKShHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpIHsKLSAgICBDQUxMX0dMX0FQSShnbE11bHRpVGV4Q29vcmQ0ZiwgdGFyZ2V0LCBzLCB0LCByLCBxKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTm9ybWFsM2YpKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopIHsKLSAgICBDQUxMX0dMX0FQSShnbE5vcm1hbDNmLCBueCwgbnksIG56KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsT3J0aG9mKShHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xPcnRob2YsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcmYpKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJmLCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcmZ2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJmdiwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFBvaW50U2l6ZSkoR0xmbG9hdCBzaXplKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFNpemUsIHNpemUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2x5Z29uT2Zmc2V0KShHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cykgewotICAgIENBTExfR0xfQVBJKGdsUG9seWdvbk9mZnNldCwgZmFjdG9yLCB1bml0cyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJvdGF0ZWYpKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKLSAgICBDQUxMX0dMX0FQSShnbFJvdGF0ZWYsIGFuZ2xlLCB4LCB5LCB6KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU2NhbGVmKShHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTY2FsZWYsIHgsIHksIHopOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZmKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleEVudmYsIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4RW52ZnYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhFbnZmdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyZikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJmLCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcmZ2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyZnYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRyYW5zbGF0ZWYpKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKLSAgICBDQUxMX0dMX0FQSShnbFRyYW5zbGF0ZWYsIHgsIHksIHopOwotfQotdm9pZCBBUElfRU5UUlkoZ2xBY3RpdmVUZXh0dXJlKShHTGVudW0gdGV4dHVyZSkgewotICAgIENBTExfR0xfQVBJKGdsQWN0aXZlVGV4dHVyZSwgdGV4dHVyZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEFscGhhRnVuY3gpKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpIHsKLSAgICBDQUxMX0dMX0FQSShnbEFscGhhRnVuY3gsIGZ1bmMsIHJlZik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJpbmRCdWZmZXIpKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJpbmRCdWZmZXIsIHRhcmdldCwgYnVmZmVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmluZFRleHR1cmUpKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCaW5kVGV4dHVyZSwgdGFyZ2V0LCB0ZXh0dXJlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmxlbmRGdW5jKShHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJsZW5kRnVuYywgc2ZhY3RvciwgZGZhY3Rvcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJ1ZmZlckRhdGEpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJ1ZmZlckRhdGEsIHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNhZ2UpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCdWZmZXJTdWJEYXRhKShHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCdWZmZXJTdWJEYXRhLCB0YXJnZXQsIG9mZnNldCwgc2l6ZSwgZGF0YSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsZWFyKShHTGJpdGZpZWxkIG1hc2spIHsKLSAgICBDQUxMX0dMX0FQSShnbENsZWFyLCBtYXNrKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJDb2xvcngpKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGVhckNvbG9yeCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGVhckRlcHRoeCkoR0xjbGFtcHggZGVwdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbENsZWFyRGVwdGh4LCBkZXB0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsZWFyU3RlbmNpbCkoR0xpbnQgcykgewotICAgIENBTExfR0xfQVBJKGdsQ2xlYXJTdGVuY2lsLCBzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xpZW50QWN0aXZlVGV4dHVyZSkoR0xlbnVtIHRleHR1cmUpIHsKLSAgICBDQUxMX0dMX0FQSShnbENsaWVudEFjdGl2ZVRleHR1cmUsIHRleHR1cmUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGlwUGxhbmV4KShHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGlwUGxhbmV4LCBwbGFuZSwgZXF1YXRpb24pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb2xvcjR1YikoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQ29sb3I0dWIsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29sb3I0eCkoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQ29sb3I0eCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb2xvck1hc2spKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQ29sb3JNYXNrLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENvbG9yUG9pbnRlcikoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvbG9yUG9pbnRlciwgc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29tcHJlc3NlZFRleEltYWdlMkQpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvbXByZXNzZWRUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBpbWFnZVNpemUsIGRhdGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb3B5VGV4SW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcikgewotICAgIENBTExfR0xfQVBJKGdsQ29weVRleEltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb3B5VGV4U3ViSW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb3B5VGV4U3ViSW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEN1bGxGYWNlKShHTGVudW0gbW9kZSkgewotICAgIENBTExfR0xfQVBJKGdsQ3VsbEZhY2UsIG1vZGUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVCdWZmZXJzKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsRGVsZXRlQnVmZmVycywgbiwgYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlbGV0ZVRleHR1cmVzKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZVRleHR1cmVzLCBuLCB0ZXh0dXJlcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlcHRoRnVuYykoR0xlbnVtIGZ1bmMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlcHRoRnVuYywgZnVuYyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlcHRoTWFzaykoR0xib29sZWFuIGZsYWcpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlcHRoTWFzaywgZmxhZyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlcHRoUmFuZ2V4KShHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcikgewotICAgIENBTExfR0xfQVBJKGdsRGVwdGhSYW5nZXgsIHpOZWFyLCB6RmFyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGlzYWJsZSkoR0xlbnVtIGNhcCkgewotICAgIENBTExfR0xfQVBJKGdsRGlzYWJsZSwgY2FwKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGlzYWJsZUNsaWVudFN0YXRlKShHTGVudW0gYXJyYXkpIHsKLSAgICBDQUxMX0dMX0FQSShnbERpc2FibGVDbGllbnRTdGF0ZSwgYXJyYXkpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEcmF3QXJyYXlzKShHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpIHsKLSAgICBDQUxMX0dMX0FQSShnbERyYXdBcnJheXMsIG1vZGUsIGZpcnN0LCBjb3VudCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERyYXdFbGVtZW50cykoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERyYXdFbGVtZW50cywgbW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFbmFibGUpKEdMZW51bSBjYXApIHsKLSAgICBDQUxMX0dMX0FQSShnbEVuYWJsZSwgY2FwKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRW5hYmxlQ2xpZW50U3RhdGUpKEdMZW51bSBhcnJheSkgewotICAgIENBTExfR0xfQVBJKGdsRW5hYmxlQ2xpZW50U3RhdGUsIGFycmF5KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRmluaXNoKSh2b2lkKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGaW5pc2gpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGbHVzaCkodm9pZCkgewotICAgIENBTExfR0xfQVBJKGdsRmx1c2gpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGb2d4KShHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbEZvZ3gsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZvZ3h2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsRm9neHYsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGcm9udEZhY2UpKEdMZW51bSBtb2RlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcm9udEZhY2UsIG1vZGUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGcnVzdHVteCkoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgewotICAgIENBTExfR0xfQVBJKGdsRnJ1c3R1bXgsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRCb29sZWFudikoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0Qm9vbGVhbnYsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0Q2xpcFBsYW5leCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSkgewotICAgIENBTExfR0xfQVBJKGdsR2V0Q2xpcFBsYW5leCwgcG5hbWUsIGVxbik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlbkJ1ZmZlcnMpKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5CdWZmZXJzLCBuLCBidWZmZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2VuVGV4dHVyZXMpKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcykgewotICAgIENBTExfR0xfQVBJKGdsR2VuVGV4dHVyZXMsIG4sIHRleHR1cmVzKTsKLX0KLUdMZW51bSBBUElfRU5UUlkoZ2xHZXRFcnJvcikodm9pZCkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbEdldEVycm9yKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0Rml4ZWR2KShHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0Rml4ZWR2LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0SW50ZWdlcnYpKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0SW50ZWdlcnYsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRMaWdodHh2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRMaWdodHh2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldE1hdGVyaWFseHYpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0TWF0ZXJpYWx4diwgZmFjZSwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFBvaW50ZXJ2KShHTGVudW0gcG5hbWUsIEdMdm9pZCAqKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0UG9pbnRlcnYsIHBuYW1lLCBwYXJhbXMpOwotfQotY29uc3QgR0x1Ynl0ZSAqIEFQSV9FTlRSWShfX2dsR2V0U3RyaW5nKShHTGVudW0gbmFtZSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbEdldFN0cmluZywgbmFtZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFRleEVudml2KShHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFRleEVudml2LCBlbnYsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhFbnZ4dikoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFRleEVudnh2LCBlbnYsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhQYXJhbWV0ZXJpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhQYXJhbWV0ZXJpdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4UGFyYW1ldGVyeHYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhQYXJhbWV0ZXJ4diwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsSGludCkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpIHsKLSAgICBDQUxMX0dMX0FQSShnbEhpbnQsIHRhcmdldCwgbW9kZSk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNCdWZmZXIpKEdMdWludCBidWZmZXIpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc0J1ZmZlciwgYnVmZmVyKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc0VuYWJsZWQpKEdMZW51bSBjYXApIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc0VuYWJsZWQsIGNhcCk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNUZXh0dXJlKShHTHVpbnQgdGV4dHVyZSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzVGV4dHVyZSwgdGV4dHVyZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWx4KShHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWx4LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaWdodE1vZGVseHYpKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMaWdodE1vZGVseHYsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaWdodHgpKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMaWdodHgsIGxpZ2h0LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaWdodHh2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMaWdodHh2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpbmVXaWR0aHgpKEdMZml4ZWQgd2lkdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbExpbmVXaWR0aHgsIHdpZHRoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTG9hZElkZW50aXR5KSh2b2lkKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMb2FkSWRlbnRpdHkpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMb2FkTWF0cml4eCkoY29uc3QgR0xmaXhlZCAqbSkgewotICAgIENBTExfR0xfQVBJKGdsTG9hZE1hdHJpeHgsIG0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMb2dpY09wKShHTGVudW0gb3Bjb2RlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMb2dpY09wLCBvcGNvZGUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xNYXRlcmlhbHgpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbE1hdGVyaWFseCwgZmFjZSwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4dikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHh2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTWF0cml4TW9kZSkoR0xlbnVtIG1vZGUpIHsKLSAgICBDQUxMX0dMX0FQSShnbE1hdHJpeE1vZGUsIG1vZGUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xNdWx0TWF0cml4eCkoY29uc3QgR0xmaXhlZCAqbSkgewotICAgIENBTExfR0xfQVBJKGdsTXVsdE1hdHJpeHgsIG0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xNdWx0aVRleENvb3JkNHgpKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSkgewotICAgIENBTExfR0xfQVBJKGdsTXVsdGlUZXhDb29yZDR4LCB0YXJnZXQsIHMsIHQsIHIsIHEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xOb3JtYWwzeCkoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueikgewotICAgIENBTExfR0xfQVBJKGdsTm9ybWFsM3gsIG54LCBueSwgbnopOwotfQotdm9pZCBBUElfRU5UUlkoZ2xOb3JtYWxQb2ludGVyKShHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikgewotICAgIENBTExfR0xfQVBJKGdsTm9ybWFsUG9pbnRlciwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsT3J0aG94KShHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xPcnRob3gsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQaXhlbFN0b3JlaSkoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsUGl4ZWxTdG9yZWksIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFBvaW50UGFyYW1ldGVyeCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFBhcmFtZXRlcngsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFBvaW50UGFyYW1ldGVyeHYpKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFBhcmFtZXRlcnh2LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUG9pbnRTaXpleCkoR0xmaXhlZCBzaXplKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFNpemV4LCBzaXplKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUG9seWdvbk9mZnNldHgpKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQb2x5Z29uT2Zmc2V0eCwgZmFjdG9yLCB1bml0cyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFBvcE1hdHJpeCkodm9pZCkgewotICAgIENBTExfR0xfQVBJKGdsUG9wTWF0cml4KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHVzaE1hdHJpeCkodm9pZCkgewotICAgIENBTExfR0xfQVBJKGdsUHVzaE1hdHJpeCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJlYWRQaXhlbHMpKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlYWRQaXhlbHMsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUm90YXRleCkoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIENBTExfR0xfQVBJKGdsUm90YXRleCwgYW5nbGUsIHgsIHksIHopOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTYW1wbGVDb3ZlcmFnZSkoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFNhbXBsZUNvdmVyYWdlLCB2YWx1ZSwgaW52ZXJ0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU2FtcGxlQ292ZXJhZ2V4KShHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCkgewotICAgIENBTExfR0xfQVBJKGdsU2FtcGxlQ292ZXJhZ2V4LCB2YWx1ZSwgaW52ZXJ0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU2NhbGV4KShHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTY2FsZXgsIHgsIHksIHopOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTY2lzc29yKShHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsU2Npc3NvciwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFNoYWRlTW9kZWwpKEdMZW51bSBtb2RlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTaGFkZU1vZGVsLCBtb2RlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbEZ1bmMpKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsRnVuYywgZnVuYywgcmVmLCBtYXNrKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbE1hc2spKEdMdWludCBtYXNrKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsTWFzaywgbWFzayk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxPcCkoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsT3AsIGZhaWwsIHpmYWlsLCB6cGFzcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleENvb3JkUG9pbnRlcikoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleENvb3JkUG9pbnRlciwgc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4RW52aSkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsVGV4RW52aSwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZ4KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleEVudngsIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4RW52aXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsVGV4RW52aXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEVudnh2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsVGV4RW52eHYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEltYWdlMkQpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcmkpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcmksIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyeCkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJ4LCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcml2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcml2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJ4dikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcnh2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhTdWJJbWFnZTJEKShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscykgewotICAgIENBTExfR0xfQVBJKGdsVGV4U3ViSW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUcmFuc2xhdGV4KShHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUcmFuc2xhdGV4LCB4LCB5LCB6KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVmVydGV4UG9pbnRlcikoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbFZlcnRleFBvaW50ZXIsIHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFZpZXdwb3J0KShHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsVmlld3BvcnQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2ludFNpemVQb2ludGVyT0VTKShHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikgewotICAgIENBTExfR0xfQVBJKGdsUG9pbnRTaXplUG9pbnRlck9FUywgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfQ00vZ2xleHRfYXBpLmluIGIvb3BlbmdsL2xpYnMvR0xFU19DTS9nbGV4dF9hcGkuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDZjYjUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU19DTS9nbGV4dF9hcGkuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotdm9pZCBBUElfRU5UUlkoZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMpKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMsIG1vZGVSR0IsIG1vZGVBbHBoYSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJsZW5kRnVuY1NlcGFyYXRlT0VTKShHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQmxlbmRGdW5jU2VwYXJhdGVPRVMsIHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwgZHN0QWxwaGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCbGVuZEVxdWF0aW9uT0VTKShHTGVudW0gbW9kZSkgewotICAgIENBTExfR0xfQVBJKGdsQmxlbmRFcXVhdGlvbk9FUywgbW9kZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERyYXdUZXhzT0VTKShHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsRHJhd1RleHNPRVMsIHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4aU9FUykoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsRHJhd1RleGlPRVMsIHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4eE9FUykoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3aWR0aCwgR0xmaXhlZCBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbERyYXdUZXh4T0VTLCB4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleHN2T0VTKShjb25zdCBHTHNob3J0ICpjb29yZHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhzdk9FUywgY29vcmRzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleGl2T0VTKShjb25zdCBHTGludCAqY29vcmRzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4aXZPRVMsIGNvb3Jkcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERyYXdUZXh4dk9FUykoY29uc3QgR0xmaXhlZCAqY29vcmRzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4eHZPRVMsIGNvb3Jkcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERyYXdUZXhmT0VTKShHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsRHJhd1RleGZPRVMsIHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4ZnZPRVMpKGNvbnN0IEdMZmxvYXQgKmNvb3JkcykgewotICAgIENBTExfR0xfQVBJKGdsRHJhd1RleGZ2T0VTLCBjb29yZHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUykoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSkgewotICAgIENBTExfR0xfQVBJKGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMsIHRhcmdldCwgaW1hZ2UpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMpKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpIHsKLSAgICBDQUxMX0dMX0FQSShnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUywgdGFyZ2V0LCBpbWFnZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEFscGhhRnVuY3hPRVMpKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpIHsKLSAgICBDQUxMX0dMX0FQSShnbEFscGhhRnVuY3hPRVMsIGZ1bmMsIHJlZik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsZWFyQ29sb3J4T0VTKShHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQ2xlYXJDb2xvcnhPRVMsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJEZXB0aHhPRVMpKEdMY2xhbXB4IGRlcHRoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGVhckRlcHRoeE9FUywgZGVwdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGlwUGxhbmV4T0VTKShHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGlwUGxhbmV4T0VTLCBwbGFuZSwgZXF1YXRpb24pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb2xvcjR4T0VTKShHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb2xvcjR4T0VTLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlcHRoUmFuZ2V4T0VTKShHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcikgewotICAgIENBTExfR0xfQVBJKGdsRGVwdGhSYW5nZXhPRVMsIHpOZWFyLCB6RmFyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRm9neE9FUykoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGb2d4T0VTLCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGb2d4dk9FUykoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZvZ3h2T0VTLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJ1c3R1bXhPRVMpKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZydXN0dW14T0VTLCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0Q2xpcFBsYW5leE9FUykoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSkgewotICAgIENBTExfR0xfQVBJKGdsR2V0Q2xpcFBsYW5leE9FUywgcG5hbWUsIGVxbik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEZpeGVkdk9FUykoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEZpeGVkdk9FUywgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldExpZ2h0eHZPRVMpKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldExpZ2h0eHZPRVMsIGxpZ2h0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0TWF0ZXJpYWx4dk9FUykoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRNYXRlcmlhbHh2T0VTLCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4RW52eHZPRVMpKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhFbnZ4dk9FUywgZW52LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4UGFyYW1ldGVyeHZPRVMpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUywgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTGlnaHRNb2RlbHhPRVMpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsTGlnaHRNb2RlbHhPRVMsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWx4dk9FUykoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWx4dk9FUywgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpZ2h0eE9FUykoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbExpZ2h0eE9FUywgbGlnaHQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpZ2h0eHZPRVMpKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbExpZ2h0eHZPRVMsIGxpZ2h0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTGluZVdpZHRoeE9FUykoR0xmaXhlZCB3aWR0aCkgewotICAgIENBTExfR0xfQVBJKGdsTGluZVdpZHRoeE9FUywgd2lkdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMb2FkTWF0cml4eE9FUykoY29uc3QgR0xmaXhlZCAqbSkgewotICAgIENBTExfR0xfQVBJKGdsTG9hZE1hdHJpeHhPRVMsIG0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xNYXRlcmlhbHhPRVMpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbE1hdGVyaWFseE9FUywgZmFjZSwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4dk9FUykoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHh2T0VTLCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTXVsdE1hdHJpeHhPRVMpKGNvbnN0IEdMZml4ZWQgKm0pIHsKLSAgICBDQUxMX0dMX0FQSShnbE11bHRNYXRyaXh4T0VTLCBtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTXVsdGlUZXhDb29yZDR4T0VTKShHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpIHsKLSAgICBDQUxMX0dMX0FQSShnbE11bHRpVGV4Q29vcmQ0eE9FUywgdGFyZ2V0LCBzLCB0LCByLCBxKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTm9ybWFsM3hPRVMpKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopIHsKLSAgICBDQUxMX0dMX0FQSShnbE5vcm1hbDN4T0VTLCBueCwgbnksIG56KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsT3J0aG94T0VTKShHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xPcnRob3hPRVMsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcnhPRVMpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJ4T0VTLCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcnh2T0VTKShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJ4dk9FUywgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFBvaW50U2l6ZXhPRVMpKEdMZml4ZWQgc2l6ZSkgewotICAgIENBTExfR0xfQVBJKGdsUG9pbnRTaXpleE9FUywgc2l6ZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFBvbHlnb25PZmZzZXR4T0VTKShHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cykgewotICAgIENBTExfR0xfQVBJKGdsUG9seWdvbk9mZnNldHhPRVMsIGZhY3RvciwgdW5pdHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSb3RhdGV4T0VTKShHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSb3RhdGV4T0VTLCBhbmdsZSwgeCwgeSwgeik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFNhbXBsZUNvdmVyYWdleE9FUykoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFNhbXBsZUNvdmVyYWdleE9FUywgdmFsdWUsIGludmVydCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFNjYWxleE9FUykoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIENBTExfR0xfQVBJKGdsU2NhbGV4T0VTLCB4LCB5LCB6KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4RW52eE9FUykoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhFbnZ4T0VTLCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEVudnh2T0VTKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsVGV4RW52eHZPRVMsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcnhPRVMpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyeE9FUywgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJ4dk9FUykoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcnh2T0VTLCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUcmFuc2xhdGV4T0VTKShHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUcmFuc2xhdGV4T0VTLCB4LCB5LCB6KTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc1JlbmRlcmJ1ZmZlck9FUykoR0x1aW50IHJlbmRlcmJ1ZmZlcikgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzUmVuZGVyYnVmZmVyT0VTLCByZW5kZXJidWZmZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCaW5kUmVuZGVyYnVmZmVyT0VTKShHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCaW5kUmVuZGVyYnVmZmVyT0VTLCB0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMpKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTLCBuLCByZW5kZXJidWZmZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2VuUmVuZGVyYnVmZmVyc09FUykoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdlblJlbmRlcmJ1ZmZlcnNPRVMsIG4sIHJlbmRlcmJ1ZmZlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTLCB0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNGcmFtZWJ1ZmZlck9FUykoR0x1aW50IGZyYW1lYnVmZmVyKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNGcmFtZWJ1ZmZlck9FUywgZnJhbWVidWZmZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCaW5kRnJhbWVidWZmZXJPRVMpKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcikgewotICAgIENBTExfR0xfQVBJKGdsQmluZEZyYW1lYnVmZmVyT0VTLCB0YXJnZXQsIGZyYW1lYnVmZmVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMsIG4sIGZyYW1lYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlbkZyYW1lYnVmZmVyc09FUykoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsR2VuRnJhbWVidWZmZXJzT0VTLCBuLCBmcmFtZWJ1ZmZlcnMpOwotfQotR0xlbnVtIEFQSV9FTlRSWShnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMpKEdMZW51bSB0YXJnZXQpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTLCB0YXJnZXQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUykoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTLCB0YXJnZXQsIGF0dGFjaG1lbnQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTLCB0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUykoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMsIHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlbmVyYXRlTWlwbWFwT0VTKShHTGVudW0gdGFyZ2V0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5lcmF0ZU1pcG1hcE9FUywgdGFyZ2V0KTsKLX0KLXZvaWQqIEFQSV9FTlRSWShnbE1hcEJ1ZmZlck9FUykoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2VzcykgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbE1hcEJ1ZmZlck9FUywgdGFyZ2V0LCBhY2Nlc3MpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbFVubWFwQnVmZmVyT0VTKShHTGVudW0gdGFyZ2V0KSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsVW5tYXBCdWZmZXJPRVMsIHRhcmdldCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqKiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTLCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUykoR0x1aW50IG1hdHJpeHBhbGV0dGVpbmRleCkgewotICAgIENBTExfR0xfQVBJKGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMsIG1hdHJpeHBhbGV0dGVpbmRleCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUykodm9pZCkgewotICAgIENBTExfR0xfQVBJKGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTWF0cml4SW5kZXhQb2ludGVyT0VTKShHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikgewotICAgIENBTExfR0xfQVBJKGdsTWF0cml4SW5kZXhQb2ludGVyT0VTLCBzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xXZWlnaHRQb2ludGVyT0VTKShHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikgewotICAgIENBTExfR0xfQVBJKGdsV2VpZ2h0UG9pbnRlck9FUywgc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLX0KLUdMYml0ZmllbGQgQVBJX0VOVFJZKGdsUXVlcnlNYXRyaXh4T0VTKShHTGZpeGVkIG1hbnRpc3NhWzE2XSwgR0xpbnQgZXhwb25lbnRbMTZdKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsUXVlcnlNYXRyaXh4T0VTLCBtYW50aXNzYSwgZXhwb25lbnQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZXB0aFJhbmdlZk9FUykoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlcHRoUmFuZ2VmT0VTLCB6TmVhciwgekZhcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZydXN0dW1mT0VTKShHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcnVzdHVtZk9FUywgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE9ydGhvZk9FUykoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgewotICAgIENBTExfR0xfQVBJKGdsT3J0aG9mT0VTLCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xpcFBsYW5lZk9FUykoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbikgewotICAgIENBTExfR0xfQVBJKGdsQ2xpcFBsYW5lZk9FUywgcGxhbmUsIGVxdWF0aW9uKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0Q2xpcFBsYW5lZk9FUykoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSkgewotICAgIENBTExfR0xfQVBJKGdsR2V0Q2xpcFBsYW5lZk9FUywgcG5hbWUsIGVxbik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsZWFyRGVwdGhmT0VTKShHTGNsYW1wZiBkZXB0aCkgewotICAgIENBTExfR0xfQVBJKGdsQ2xlYXJEZXB0aGZPRVMsIGRlcHRoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4R2VuZk9FUykoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleEdlbmZPRVMsIGNvb3JkLCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhHZW5mdk9FUykoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsVGV4R2VuZnZPRVMsIGNvb3JkLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4R2VuaU9FUykoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhHZW5pT0VTLCBjb29yZCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4R2VuaXZPRVMpKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhHZW5pdk9FUywgY29vcmQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhHZW54T0VTKShHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsVGV4R2VueE9FUywgY29vcmQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEdlbnh2T0VTKShHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhHZW54dk9FUywgY29vcmQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhHZW5mdk9FUykoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0VGV4R2VuZnZPRVMsIGNvb3JkLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4R2VuaXZPRVMpKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhHZW5pdk9FUywgY29vcmQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhHZW54dk9FUykoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0VGV4R2VueHZPRVMsIGNvb3JkLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmluZFZlcnRleEFycmF5T0VTKShHTHVpbnQgYXJyYXkpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJpbmRWZXJ0ZXhBcnJheU9FUywgYXJyYXkpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMpKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZVZlcnRleEFycmF5c09FUywgbiwgYXJyYXlzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2VuVmVydGV4QXJyYXlzT0VTKShHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5WZXJ0ZXhBcnJheXNPRVMsIG4sIGFycmF5cyk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNWZXJ0ZXhBcnJheU9FUykoR0x1aW50IGFycmF5KSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNWZXJ0ZXhBcnJheU9FUywgYXJyYXkpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRSkoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRSwgdGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJlc29sdmVNdWx0aXNhbXBsZUZyYW1lYnVmZmVyQVBQTEUpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlc29sdmVNdWx0aXNhbXBsZUZyYW1lYnVmZmVyQVBQTEUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtQXR0YWNobWVudHMsIGNvbnN0IEdMZW51bSAqYXR0YWNobWVudHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERpc2NhcmRGcmFtZWJ1ZmZlckVYVCwgdGFyZ2V0LCBudW1BdHRhY2htZW50cywgYXR0YWNobWVudHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhULCB0YXJnZXQsIHNhbXBsZXMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVCkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhULCB0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwsIHNhbXBsZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xNdWx0aURyYXdBcnJheXNFWFQpKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCkgewotICAgIENBTExfR0xfQVBJKGdsTXVsdGlEcmF3QXJyYXlzRVhULCBtb2RlLCBmaXJzdCwgY291bnQsIHByaW1jb3VudCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE11bHRpRHJhd0VsZW1lbnRzRVhUKShHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCkgewotICAgIENBTExfR0xfQVBJKGdsTXVsdGlEcmF3RWxlbWVudHNFWFQsIG1vZGUsIGNvdW50LCB0eXBlLCBpbmRpY2VzLCBwcmltY291bnQpOwotfQotR0xlbnVtIEFQSV9FTlRSWShnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhUKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVhZG5QaXhlbHNFWFQpKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCB2b2lkICpkYXRhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZWFkblBpeGVsc0VYVCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBidWZTaXplLCBkYXRhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0blVuaWZvcm1mdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldG5Vbmlmb3JtZnZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBidWZTaXplLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRuVW5pZm9ybWl2RVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0blVuaWZvcm1pdkVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIGJ1ZlNpemUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFN0b3JhZ2UxREVYVCkoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCkgewotICAgIENBTExfR0xfQVBJKGdsVGV4U3RvcmFnZTFERVhULCB0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4U3RvcmFnZTJERVhUKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsVGV4U3RvcmFnZTJERVhULCB0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhTdG9yYWdlM0RFWFQpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhTdG9yYWdlM0RFWFQsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZGVwdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXh0dXJlU3RvcmFnZTFERVhUKShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCkgewotICAgIENBTExfR0xfQVBJKGdsVGV4dHVyZVN0b3JhZ2UxREVYVCwgdGV4dHVyZSwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleHR1cmVTdG9yYWdlMkRFWFQpKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsVGV4dHVyZVN0b3JhZ2UyREVYVCwgdGV4dHVyZSwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4dHVyZVN0b3JhZ2UzREVYVCkoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXh0dXJlU3RvcmFnZTNERVhULCB0ZXh0dXJlLCB0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xpcFBsYW5lZklNRykoR0xlbnVtIHAsIGNvbnN0IEdMZmxvYXQgKmVxbikgewotICAgIENBTExfR0xfQVBJKGdsQ2xpcFBsYW5lZklNRywgcCwgZXFuKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xpcFBsYW5leElNRykoR0xlbnVtIHAsIGNvbnN0IEdMZml4ZWQgKmVxbikgewotICAgIENBTExfR0xfQVBJKGdsQ2xpcFBsYW5leElNRywgcCwgZXFuKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUlNRywgdGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcykgewotICAgIENBTExfR0xfQVBJKGdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUlNRywgdGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsLCBzYW1wbGVzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlRmVuY2VzTlYpKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZUZlbmNlc05WLCBuLCBmZW5jZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZW5GZW5jZXNOVikoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcykgewotICAgIENBTExfR0xfQVBJKGdsR2VuRmVuY2VzTlYsIG4sIGZlbmNlcyk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNGZW5jZU5WKShHTHVpbnQgZmVuY2UpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc0ZlbmNlTlYsIGZlbmNlKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xUZXN0RmVuY2VOVikoR0x1aW50IGZlbmNlKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsVGVzdEZlbmNlTlYsIGZlbmNlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0RmVuY2Vpdk5WKShHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0RmVuY2Vpdk5WLCBmZW5jZSwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZpbmlzaEZlbmNlTlYpKEdMdWludCBmZW5jZSkgewotICAgIENBTExfR0xfQVBJKGdsRmluaXNoRmVuY2VOViwgZmVuY2UpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTZXRGZW5jZU5WKShHTHVpbnQgZmVuY2UsIEdMZW51bSBjb25kaXRpb24pIHsKLSAgICBDQUxMX0dMX0FQSShnbFNldEZlbmNlTlYsIGZlbmNlLCBjb25kaXRpb24pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXREcml2ZXJDb250cm9sc1FDT00pKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scykgewotICAgIENBTExfR0xfQVBJKGdsR2V0RHJpdmVyQ29udHJvbHNRQ09NLCBudW0sIHNpemUsIGRyaXZlckNvbnRyb2xzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00pKEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTSwgZHJpdmVyQ29udHJvbCwgYnVmU2l6ZSwgbGVuZ3RoLCBkcml2ZXJDb250cm9sU3RyaW5nKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00pKEdMdWludCBkcml2ZXJDb250cm9sKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTSwgZHJpdmVyQ29udHJvbCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERpc2FibGVEcml2ZXJDb250cm9sUUNPTSkoR0x1aW50IGRyaXZlckNvbnRyb2wpIHsKLSAgICBDQUxMX0dMX0FQSShnbERpc2FibGVEcml2ZXJDb250cm9sUUNPTSwgZHJpdmVyQ29udHJvbCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldFRleHR1cmVzUUNPTSkoR0x1aW50ICp0ZXh0dXJlcywgR0xpbnQgbWF4VGV4dHVyZXMsIEdMaW50ICpudW1UZXh0dXJlcykgewotICAgIENBTExfR0xfQVBJKGdsRXh0R2V0VGV4dHVyZXNRQ09NLCB0ZXh0dXJlcywgbWF4VGV4dHVyZXMsIG51bVRleHR1cmVzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0QnVmZmVyc1FDT00pKEdMdWludCAqYnVmZmVycywgR0xpbnQgbWF4QnVmZmVycywgR0xpbnQgKm51bUJ1ZmZlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldEJ1ZmZlcnNRQ09NLCBidWZmZXJzLCBtYXhCdWZmZXJzLCBudW1CdWZmZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00pKEdMdWludCAqcmVuZGVyYnVmZmVycywgR0xpbnQgbWF4UmVuZGVyYnVmZmVycywgR0xpbnQgKm51bVJlbmRlcmJ1ZmZlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NLCByZW5kZXJidWZmZXJzLCBtYXhSZW5kZXJidWZmZXJzLCBudW1SZW5kZXJidWZmZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0RnJhbWVidWZmZXJzUUNPTSkoR0x1aW50ICpmcmFtZWJ1ZmZlcnMsIEdMaW50IG1heEZyYW1lYnVmZmVycywgR0xpbnQgKm51bUZyYW1lYnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsRXh0R2V0RnJhbWVidWZmZXJzUUNPTSwgZnJhbWVidWZmZXJzLCBtYXhGcmFtZWJ1ZmZlcnMsIG51bUZyYW1lYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NKShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIGZhY2UsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NLCB0ZXh0dXJlLCBmYWNlLCBsZXZlbCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NLCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldFRleFN1YkltYWdlUUNPTSkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0ZXhlbHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldFRleFN1YkltYWdlUUNPTSwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgdHlwZSwgdGV4ZWxzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NKShHTGVudW0gdGFyZ2V0LCBHTHZvaWQgKipwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTSwgdGFyZ2V0LCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRTaGFkZXJzUUNPTSkoR0x1aW50ICpzaGFkZXJzLCBHTGludCBtYXhTaGFkZXJzLCBHTGludCAqbnVtU2hhZGVycykgewotICAgIENBTExfR0xfQVBJKGdsRXh0R2V0U2hhZGVyc1FDT00sIHNoYWRlcnMsIG1heFNoYWRlcnMsIG51bVNoYWRlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRQcm9ncmFtc1FDT00pKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldFByb2dyYW1zUUNPTSwgcHJvZ3JhbXMsIG1heFByb2dyYW1zLCBudW1Qcm9ncmFtcyk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSkoR0x1aW50IHByb2dyYW0pIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xFeHRJc1Byb2dyYW1CaW5hcnlRQ09NLCBwcm9ncmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00pKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NLCBwcm9ncmFtLCBzaGFkZXJ0eXBlLCBzb3VyY2UsIGxlbmd0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFN0YXJ0VGlsaW5nUUNPTSkoR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQsIEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTdGFydFRpbGluZ1FDT00sIHgsIHksIHdpZHRoLCBoZWlnaHQsIHByZXNlcnZlTWFzayk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEVuZFRpbGluZ1FDT00pKEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFbmRUaWxpbmdRQ09NLCBwcmVzZXJ2ZU1hc2spOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS8uZ2l0aWdub3JlIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGY4MjVlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotamF2YQotKi5weWMKLSouc3dwCi1weXJhdGVtcC5weQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9BbmRyb2lkLm1rIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjViNmIyLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBzcmMvZ2x0cmFjZV9hcGkuY3BwIFwKLSAgICBzcmMvZ2x0cmFjZV9jb250ZXh0LmNwcCBcCi0gICAgc3JjL2dsdHJhY2VfZWdsLmNwcCBcCi0gICAgc3JjL2dsdHJhY2VfZWdsYXBpLmNwcCBcCi0gICAgc3JjL2dsdHJhY2VfZml4dXAuY3BwIFwKLSAgICBzcmMvZ2x0cmFjZV9ob29rcy5jcHAgXAotICAgIHNyYy9nbHRyYWNlLnBiLmNwcCBcCi0gICAgc3JjL2dsdHJhY2VfdHJhbnNwb3J0LmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpIFwKLSAgICAkKExPQ0FMX1BBVEgpLy4uLyBcCi0gICAgZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKLSAgICBleHRlcm5hbC9wcm90b2J1Zi9zcmMgXAotICAgIGV4dGVybmFsIFwKLSAgICBiaW9uaWMKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER09PR0xFX1BST1RPQlVGX05PX1JUVEkKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlicHJvdG9idWYtY3BwLTIuMy4wLWxpdGUgbGlibHpmCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJzdGxwb3J0Ci0KLWlmZXEgKCQoQVJDSF9BUk1fSEFWRV9UTFNfUkVHSVNURVIpLHRydWUpCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9BUk1fVExTX1JFR0lTVEVSCi1lbmRpZgotCi1MT0NBTF9DRkxBR1MgKz0gLURMT0dfVEFHPVwibGliR0xFU190cmFjZVwiCi0KLSMgd2UgbmVlZCB0byBhY2Nlc3MgdGhlIHByaXZhdGUgQmlvbmljIGhlYWRlciA8YmlvbmljX3Rscy5oPgotIyBvbiBBUk0gcGxhdGZvcm1zLCB3ZSBuZWVkIHRvIG1pcnJvciB0aGUgQVJDSF9BUk1fSEFWRV9UTFNfUkVHSVNURVIKLSMgYmVoYXZpb3IgZnJvbSB0aGUgYmlvbmljIEFuZHJvaWQubWsgZmlsZQotaWZlcSAoJChUQVJHRVRfQVJDSCktJChBUkNIX0FSTV9IQVZFX1RMU19SRUdJU1RFUiksYXJtLXRydWUpCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9BUk1fVExTX1JFR0lTVEVSCi1lbmRpZgotTE9DQUxfQ19JTkNMVURFUyArPSBiaW9uaWMvbGliYy9wcml2YXRlCi0KLUxPQ0FMX01PRFVMRTo9IGxpYkdMRVNfdHJhY2UKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvREVTSUdOLnR4dCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvREVTSUdOLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4OWUxZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL0RFU0lHTi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1EZXNpZ24gb2YgdGhlIEdMRVMgVHJhY2luZyBMaWJyYXJ5Ci0KLUNvZGUgUnVudGltZSBCZWhhdmlvcjoKLQotICAgIEluaXRpYWxpemF0aW9uOgotICAgIAotICAgIGVnbF9kaXNwbGF5X3Q6OmluaXRpYWxpemUoKSBjYWxscyBpbml0RWdsVHJhY2VMZXZlbCgpIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB0cmFjaW5nIHNob3VsZCBiZQotICAgIGVuYWJsZWQuIEN1cnJlbnRseSwgdGhlIHNoZWxsIHByb3BlcnRpZXMgImRlYnVnLmVnbC50cmFjZSIgYW5kICJkZWJ1Zy5lZ2wuZGVidWdfcHJvYyIgdG9nZXRoZXIKLSAgICBjb250cm9sIHdoZXRoZXIgdHJhY2luZyBzaG91bGQgYmUgZW5hYmxlZCBmb3IgYSBjZXJ0YWluIHByb2Nlc3MuIElmIHRyYWNpbmcgaXMgZW5hYmxlZCwgdGhpcwotICAgIGNhbGxzIEdMVHJhY2Vfc3RhcnQoKSB0byBzdGFydCB0aGUgdHJhY2Ugc2VydmVyLgotICAgIAotICAgIE5vdGUgdGhhdCBpbml0RWdsVHJhY2VMZXZlbCgpIGlzIGFsc28gY2FsbGVkIGZyb20gZWFybHlfZWdsX2luaXQoKSwgYnV0IHRoYXQgaGFwcGVucyBpbiB0aGUKLSAgICBjb250ZXh0IG9mIHRoZSB6eWdvdGUsIHNvIHRoYXQgaW52b2NhdGlvbiBoYXMgbm8gZWZmZWN0LgotICAgIAotICAgIGVnbF9kaXNwbGF5X3Q6OmluaXRpYWxpemUoKSB0aGVuIGNhbGxzIHNldEdMSG9va3NUaHJlYWRTcGVjaWZpYygpIHdoZXJlIHdlIHNldCB0aGUgdGhyZWFkCi0gICAgc3BlY2lmaWMgZ2xfaG9va3Mgc3RydWN0dXJlIHRvIHBvaW50IHRvIHRoZSB0cmFjZSBpbXBsZW1lbnRhdGlvbi4gRnJvbSB0aGlzIHBvaW50IG9uLCBldmVyeQotICAgIEdMRVMgY2FsbCBpcyByZWRpcmVjdGVkIHRvIHRoZSB0cmFjZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAKLSAgICBBcHBsaWNhdGlvbiBydW50aW1lOgotCi0gICAgV2hpbGUgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcsIGFsbCBpdHMgR0xFUyBjYWxscyBhcmUgZGlyZWN0bHkgcm91dGVkIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcKLSAgICB0cmFjZSBpbXBsZW1lbnRhdGlvbi4KLQotICAgIEZvciBFR0wgY2FsbHMsIHRoZSB0cmFjZSBsaWJyYXJ5IHByb3ZpZGVzIGEgYnVuY2ggb2YgZnVuY3Rpb25zIHRoYXQgbXVzdCBiZSBleHBsaWNpdGx5IGNhbGxlZAotICAgIGZyb20gdGhlIEVHTCBsaWJyYXJ5LiBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkIGluIGdsZXN0cmFjZS5oCi0KLSAgICBBcHBsaWNhdGlvbiBzaHV0ZG93bjoKLQotICAgIEN1cnJlbnRseSwgdGhlIGFwcGxpY2F0aW9uIGlzIGtpbGxlZCB3aGVuIHRoZSB1c2VyIHN0b3BzIHRyYWNpbmcgZnJvbSB0aGUgZnJvbnRlbmQgR1VJLiBXZSBuZWVkCi0gICAgdG8gZXhwbG9yZSBpZiBhIG1vcmUgZ3JhY2VmdWwgbWV0aG9kIG9mIHN0b3BwaW5nIHRoZSBhcHBsaWNhdGlvbiwgb3IgZGV0YWNoaW5nIHRyYWNpbmcgZnJvbSB0aGUKLSAgICBhcHBsaWNhdGlvbiBpcyByZXF1aXJlZC4KLQotQ29kZSBTdHJ1Y3R1cmU6Ci0KLSAgICBnbGVzdHJhY2UuaCBkZWNsYXJlcyBhbGwgdGhlIGhvb2tzIGV4cG9zZWQgYnkgbGliZ2xlc3RyYWNlLiBUaGVzZSBhcmUgdXNlZCBieSBFR0wvZWdsLmNwcCBhbmQKLSAgICBFR0wvZWdsQXBpLmNwcCB0byBpbml0aWFsaXplIHRoZSB0cmFjZSBsaWJyYXJ5LCBhbmQgdG8gaW5mb3JtIHRoZSBsaWJyYXJ5IG9mIEVHTCBjYWxscy4KLQotICAgIEFsbCBHTCBjYWxscyBhcmUgcHJlc2VudCBpbiBHTEVTX1RyYWNlL3NyYy9nbHRyYWNlX2FwaS5jcHAuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgdGhlCi0gICAgR0xFU19UcmFjZS9zcmMvZ2VuYXBpLnB5IHNjcmlwdC4gVGhlIHN0cnVjdHVyZSBvZiBhbGwgdGhlIGZ1bmN0aW9ucyBsb29rcyBsaWtlIHRoaXM6Ci0KLSAgICAgICAgICAgIHZvaWQgR0xUcmFjZV9nbEZ1bmN0aW9uKGFyZ3MpIHsKLSAgICAgICAgICAgICAgICAvLyBkZWNsYXJlIGEgcHJvdG9idWYKLSAgICAgICAgICAgICAgICAvLyBjb3B5IGFyZ3VtZW50cyBpbnRvIHRoZSBwcm90b2J1ZgotICAgICAgICAgICAgICAgIC8vIGNhbGwgdGhlIG9yaWdpbmFsIEdMRVMgZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHJldHVybiB2YWx1ZSwgc2F2ZSBpdCBpbnRvIHRoZSBwcm90b2J1ZgotICAgICAgICAgICAgICAgIC8vIGZpeHVwIHRoZSBwcm90b2J1ZiBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAvLyB0cmFuc3BvcnQgdGhlIHByb3RvYnVmIHRvIHRoZSBob3N0Ci0gICAgICAgICAgICB9Ci0KLSAgICBUaGUgZml4dXBHTE1lc3NhZ2UoKSBjYWxsIGRvZXMgYW55IGN1c3RvbSBwcm9jZXNzaW5nIG9mIHRoZSBwcm90b2J1ZiBiYXNlZCBvbiB0aGUgR0xFUyBjYWxsLgotICAgIFRoaXMgdHlwaWNhbGx5IGFtb3VudHMgdG8gY29weWluZyB0aGUgZGF0YSBjb3JyZXNwb25kaW5nIHRvIGlucHV0IG9yIG91dHB1dCBwb2ludGVycy4KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvZGV2Lm1ha2UgYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL2Rldi5tYWtlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDYyNjBjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvZGV2Lm1ha2UKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyBOT1RFCi0jIyBUaGlzIGZpbGUgaXMgdXNlZCBmb3IgZGV2ZWxvcG1lbnQgcHVycG9zZXMgb25seS4gSXQgaXMgbm90IHVzZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4KLQotIyBnZW5lcmF0ZSBwcm90b2NvbCBidWZmZXIgZmlsZXMKLWdlbnByb3RvOiBnbHRyYWNlLnByb3RvCi0JYXByb3RvYyAtLWNwcF9vdXQ9c3JjIC0tamF2YV9vdXQ9amF2YSBnbHRyYWNlLnByb3RvCi0JbXYgc3JjL2dsdHJhY2UucGIuY2Mgc3JjL2dsdHJhY2UucGIuY3BwCi0KLXN5bmM6Ci0JYWRiIHJvb3QKLQlhZGIgcmVtb3VudAotCWFkYiBzaGVsbCBzdG9wCi0JYWRiIHN5bmMKLQlhZGIgc2hlbGwgc3RhcnQKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvZ2x0cmFjZS5wcm90byBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvZ2x0cmFjZS5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmMzU1NC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL2dsdHJhY2UucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw1NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5nbHRyYWNlOwotCi1vcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmdsdHJhY2UiOwotb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkdMUHJvdG9CdWYiOwotCi1tZXNzYWdlIEdMTWVzc2FnZSB7Ci0gICAgZW51bSBGdW5jdGlvbiB7Ci0gICAgICAgIGdsQWN0aXZlVGV4dHVyZSA9IDA7Ci0gICAgICAgIGdsQWxwaGFGdW5jID0gMTsKLSAgICAgICAgZ2xBbHBoYUZ1bmN4ID0gMjsKLSAgICAgICAgZ2xBbHBoYUZ1bmN4T0VTID0gMzsKLSAgICAgICAgZ2xBdHRhY2hTaGFkZXIgPSA0OwotICAgICAgICBnbEJlZ2luUGVyZk1vbml0b3JBTUQgPSA1OwotICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbiA9IDY7Ci0gICAgICAgIGdsQmluZEJ1ZmZlciA9IDc7Ci0gICAgICAgIGdsQmluZEZyYW1lYnVmZmVyID0gODsKLSAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXJPRVMgPSA5OwotICAgICAgICBnbEJpbmRSZW5kZXJidWZmZXIgPSAxMDsKLSAgICAgICAgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTID0gMTE7Ci0gICAgICAgIGdsQmluZFRleHR1cmUgPSAxMjsKLSAgICAgICAgZ2xCaW5kVmVydGV4QXJyYXlPRVMgPSAxMzsKLSAgICAgICAgZ2xCbGVuZENvbG9yID0gMTQ7Ci0gICAgICAgIGdsQmxlbmRFcXVhdGlvbiA9IDE1OwotICAgICAgICBnbEJsZW5kRXF1YXRpb25PRVMgPSAxNjsKLSAgICAgICAgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgPSAxNzsKLSAgICAgICAgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMgPSAxODsKLSAgICAgICAgZ2xCbGVuZEZ1bmMgPSAxOTsKLSAgICAgICAgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSA9IDIwOwotICAgICAgICBnbEJsZW5kRnVuY1NlcGFyYXRlT0VTID0gMjE7Ci0gICAgICAgIGdsQnVmZmVyRGF0YSA9IDIyOwotICAgICAgICBnbEJ1ZmZlclN1YkRhdGEgPSAyMzsKLSAgICAgICAgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzID0gMjQ7Ci0gICAgICAgIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyA9IDI1OwotICAgICAgICBnbENsZWFyQ29sb3IgPSAyNjsKLSAgICAgICAgZ2xDbGVhckNvbG9yeCA9IDI3OwotICAgICAgICBnbENsZWFyQ29sb3J4T0VTID0gMjg7Ci0gICAgICAgIGdsQ2xlYXJEZXB0aGYgPSAyOTsKLSAgICAgICAgZ2xDbGVhckRlcHRoZk9FUyA9IDMwOwotICAgICAgICBnbENsZWFyRGVwdGh4ID0gMzE7Ci0gICAgICAgIGdsQ2xlYXJEZXB0aHhPRVMgPSAzMjsKLSAgICAgICAgZ2xDbGVhciA9IDMzOwotICAgICAgICBnbENsZWFyU3RlbmNpbCA9IDM0OwotICAgICAgICBnbENsaWVudEFjdGl2ZVRleHR1cmUgPSAzNTsKLSAgICAgICAgZ2xDbGlwUGxhbmVmID0gMzY7Ci0gICAgICAgIGdsQ2xpcFBsYW5lZklNRyA9IDM3OwotICAgICAgICBnbENsaXBQbGFuZWZPRVMgPSAzODsKLSAgICAgICAgZ2xDbGlwUGxhbmV4ID0gMzk7Ci0gICAgICAgIGdsQ2xpcFBsYW5leElNRyA9IDQwOwotICAgICAgICBnbENsaXBQbGFuZXhPRVMgPSA0MTsKLSAgICAgICAgZ2xDb2xvcjRmID0gNDI7Ci0gICAgICAgIGdsQ29sb3I0dWIgPSA0MzsKLSAgICAgICAgZ2xDb2xvcjR4ID0gNDQ7Ci0gICAgICAgIGdsQ29sb3I0eE9FUyA9IDQ1OwotICAgICAgICBnbENvbG9yTWFzayA9IDQ2OwotICAgICAgICBnbENvbG9yUG9pbnRlciA9IDQ3OwotICAgICAgICBnbENvbXBpbGVTaGFkZXIgPSA0ODsKLSAgICAgICAgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCA9IDQ5OwotICAgICAgICBnbENvbXByZXNzZWRUZXhJbWFnZTNET0VTID0gNTA7Ci0gICAgICAgIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgPSA1MTsKLSAgICAgICAgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUyA9IDUyOwotICAgICAgICBnbENvcHlUZXhJbWFnZTJEID0gNTM7Ci0gICAgICAgIGdsQ29weVRleFN1YkltYWdlMkQgPSA1NDsKLSAgICAgICAgZ2xDb3B5VGV4U3ViSW1hZ2UzRE9FUyA9IDU1OwotICAgICAgICBnbENvdmVyYWdlTWFza05WID0gNTY7Ci0gICAgICAgIGdsQ292ZXJhZ2VPcGVyYXRpb25OViA9IDU3OwotICAgICAgICBnbENyZWF0ZVByb2dyYW0gPSA1ODsKLSAgICAgICAgZ2xDcmVhdGVTaGFkZXIgPSA1OTsKLSAgICAgICAgZ2xDdWxsRmFjZSA9IDYwOwotICAgICAgICBnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTID0gNjE7Ci0gICAgICAgIGdsRGVsZXRlQnVmZmVycyA9IDYyOwotICAgICAgICBnbERlbGV0ZUZlbmNlc05WID0gNjM7Ci0gICAgICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzID0gNjQ7Ci0gICAgICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTID0gNjU7Ci0gICAgICAgIGdsRGVsZXRlUGVyZk1vbml0b3JzQU1EID0gNjY7Ci0gICAgICAgIGdsRGVsZXRlUHJvZ3JhbSA9IDY3OwotICAgICAgICBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMgPSA2ODsKLSAgICAgICAgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTID0gNjk7Ci0gICAgICAgIGdsRGVsZXRlU2hhZGVyID0gNzA7Ci0gICAgICAgIGdsRGVsZXRlVGV4dHVyZXMgPSA3MTsKLSAgICAgICAgZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMgPSA3MjsKLSAgICAgICAgZ2xEZXB0aEZ1bmMgPSA3MzsKLSAgICAgICAgZ2xEZXB0aE1hc2sgPSA3NDsKLSAgICAgICAgZ2xEZXB0aFJhbmdlZiA9IDc1OwotICAgICAgICBnbERlcHRoUmFuZ2VmT0VTID0gNzY7Ci0gICAgICAgIGdsRGVwdGhSYW5nZXggPSA3NzsKLSAgICAgICAgZ2xEZXB0aFJhbmdleE9FUyA9IDc4OwotICAgICAgICBnbERldGFjaFNoYWRlciA9IDc5OwotICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZSA9IDgwOwotICAgICAgICBnbERpc2FibGVEcml2ZXJDb250cm9sUUNPTSA9IDgxOwotICAgICAgICBnbERpc2FibGUgPSA4MjsKLSAgICAgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkgPSA4MzsKLSAgICAgICAgZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQgPSA4NDsKLSAgICAgICAgZ2xEcmF3QXJyYXlzID0gODU7Ci0gICAgICAgIGdsRHJhd0VsZW1lbnRzID0gODY7Ci0gICAgICAgIGdsRHJhd1RleGZPRVMgPSA4NzsKLSAgICAgICAgZ2xEcmF3VGV4ZnZPRVMgPSA4ODsKLSAgICAgICAgZ2xEcmF3VGV4aU9FUyA9IDg5OwotICAgICAgICBnbERyYXdUZXhpdk9FUyA9IDkwOwotICAgICAgICBnbERyYXdUZXhzT0VTID0gOTE7Ci0gICAgICAgIGdsRHJhd1RleHN2T0VTID0gOTI7Ci0gICAgICAgIGdsRHJhd1RleHhPRVMgPSA5MzsKLSAgICAgICAgZ2xEcmF3VGV4eHZPRVMgPSA5NDsKLSAgICAgICAgZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgPSA5NTsKLSAgICAgICAgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyA9IDk2OwotICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlID0gOTc7Ci0gICAgICAgIGdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00gPSA5ODsKLSAgICAgICAgZ2xFbmFibGUgPSA5OTsKLSAgICAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSA9IDEwMDsKLSAgICAgICAgZ2xFbmRQZXJmTW9uaXRvckFNRCA9IDEwMTsKLSAgICAgICAgZ2xFbmRUaWxpbmdRQ09NID0gMTAyOwotICAgICAgICBnbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTSA9IDEwMzsKLSAgICAgICAgZ2xFeHRHZXRCdWZmZXJzUUNPTSA9IDEwNDsKLSAgICAgICAgZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NID0gMTA1OwotICAgICAgICBnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NID0gMTA2OwotICAgICAgICBnbEV4dEdldFByb2dyYW1zUUNPTSA9IDEwNzsKLSAgICAgICAgZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTSA9IDEwODsKLSAgICAgICAgZ2xFeHRHZXRTaGFkZXJzUUNPTSA9IDEwOTsKLSAgICAgICAgZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSA9IDExMDsKLSAgICAgICAgZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00gPSAxMTE7Ci0gICAgICAgIGdsRXh0R2V0VGV4dHVyZXNRQ09NID0gMTEyOwotICAgICAgICBnbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00gPSAxMTM7Ci0gICAgICAgIGdsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NID0gMTE0OwotICAgICAgICBnbEZpbmlzaEZlbmNlTlYgPSAxMTU7Ci0gICAgICAgIGdsRmluaXNoID0gMTE2OwotICAgICAgICBnbEZsdXNoID0gMTE3OwotICAgICAgICBnbEZvZ2YgPSAxMTg7Ci0gICAgICAgIGdsRm9nZnYgPSAxMTk7Ci0gICAgICAgIGdsRm9neCA9IDEyMDsKLSAgICAgICAgZ2xGb2d4T0VTID0gMTIxOwotICAgICAgICBnbEZvZ3h2ID0gMTIyOwotICAgICAgICBnbEZvZ3h2T0VTID0gMTIzOwotICAgICAgICBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyID0gMTI0OwotICAgICAgICBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTID0gMTI1OwotICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEID0gMTI2OwotICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcgPSAxMjc7Ci0gICAgICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMgPSAxMjg7Ci0gICAgICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVMgPSAxMjk7Ci0gICAgICAgIGdsRnJvbnRGYWNlID0gMTMwOwotICAgICAgICBnbEZydXN0dW1mID0gMTMxOwotICAgICAgICBnbEZydXN0dW1mT0VTID0gMTMyOwotICAgICAgICBnbEZydXN0dW14ID0gMTMzOwotICAgICAgICBnbEZydXN0dW14T0VTID0gMTM0OwotICAgICAgICBnbEdlbkJ1ZmZlcnMgPSAxMzU7Ci0gICAgICAgIGdsR2VuZXJhdGVNaXBtYXAgPSAxMzY7Ci0gICAgICAgIGdsR2VuZXJhdGVNaXBtYXBPRVMgPSAxMzc7Ci0gICAgICAgIGdsR2VuRmVuY2VzTlYgPSAxMzg7Ci0gICAgICAgIGdsR2VuRnJhbWVidWZmZXJzID0gMTM5OwotICAgICAgICBnbEdlbkZyYW1lYnVmZmVyc09FUyA9IDE0MDsKLSAgICAgICAgZ2xHZW5QZXJmTW9uaXRvcnNBTUQgPSAxNDE7Ci0gICAgICAgIGdsR2VuUmVuZGVyYnVmZmVycyA9IDE0MjsKLSAgICAgICAgZ2xHZW5SZW5kZXJidWZmZXJzT0VTID0gMTQzOwotICAgICAgICBnbEdlblRleHR1cmVzID0gMTQ0OwotICAgICAgICBnbEdlblZlcnRleEFycmF5c09FUyA9IDE0NTsKLSAgICAgICAgZ2xHZXRBY3RpdmVBdHRyaWIgPSAxNDY7Ci0gICAgICAgIGdsR2V0QWN0aXZlVW5pZm9ybSA9IDE0NzsKLSAgICAgICAgZ2xHZXRBdHRhY2hlZFNoYWRlcnMgPSAxNDg7Ci0gICAgICAgIGdsR2V0QXR0cmliTG9jYXRpb24gPSAxNDk7Ci0gICAgICAgIGdsR2V0Qm9vbGVhbnYgPSAxNTA7Ci0gICAgICAgIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgPSAxNTE7Ci0gICAgICAgIGdsR2V0QnVmZmVyUG9pbnRlcnZPRVMgPSAxNTI7Ci0gICAgICAgIGdsR2V0Q2xpcFBsYW5lZiA9IDE1MzsKLSAgICAgICAgZ2xHZXRDbGlwUGxhbmVmT0VTID0gMTU0OwotICAgICAgICBnbEdldENsaXBQbGFuZXggPSAxNTU7Ci0gICAgICAgIGdsR2V0Q2xpcFBsYW5leE9FUyA9IDE1NjsKLSAgICAgICAgZ2xHZXREcml2ZXJDb250cm9sc1FDT00gPSAxNTc7Ci0gICAgICAgIGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00gPSAxNTg7Ci0gICAgICAgIGdsR2V0RXJyb3IgPSAxNTk7Ci0gICAgICAgIGdsR2V0RmVuY2Vpdk5WID0gMTYwOwotICAgICAgICBnbEdldEZpeGVkdiA9IDE2MTsKLSAgICAgICAgZ2xHZXRGaXhlZHZPRVMgPSAxNjI7Ci0gICAgICAgIGdsR2V0RmxvYXR2ID0gMTYzOwotICAgICAgICBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2ID0gMTY0OwotICAgICAgICBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTID0gMTY1OwotICAgICAgICBnbEdldEludGVnZXJ2ID0gMTY2OwotICAgICAgICBnbEdldExpZ2h0ZnYgPSAxNjc7Ci0gICAgICAgIGdsR2V0TGlnaHR4diA9IDE2ODsKLSAgICAgICAgZ2xHZXRMaWdodHh2T0VTID0gMTY5OwotICAgICAgICBnbEdldE1hdGVyaWFsZnYgPSAxNzA7Ci0gICAgICAgIGdsR2V0TWF0ZXJpYWx4diA9IDE3MTsKLSAgICAgICAgZ2xHZXRNYXRlcmlhbHh2T0VTID0gMTcyOwotICAgICAgICBnbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQgPSAxNzM7Ci0gICAgICAgIGdsR2V0UGVyZk1vbml0b3JDb3VudGVySW5mb0FNRCA9IDE3NDsKLSAgICAgICAgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1EID0gMTc1OwotICAgICAgICBnbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRCA9IDE3NjsKLSAgICAgICAgZ2xHZXRQZXJmTW9uaXRvckdyb3Vwc0FNRCA9IDE3NzsKLSAgICAgICAgZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EID0gMTc4OwotICAgICAgICBnbEdldFBvaW50ZXJ2ID0gMTc5OwotICAgICAgICBnbEdldFByb2dyYW1CaW5hcnlPRVMgPSAxODA7Ci0gICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cgPSAxODE7Ci0gICAgICAgIGdsR2V0UHJvZ3JhbWl2ID0gMTgyOwotICAgICAgICBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2ID0gMTgzOwotICAgICAgICBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTID0gMTg0OwotICAgICAgICBnbEdldFNoYWRlckluZm9Mb2cgPSAxODU7Ci0gICAgICAgIGdsR2V0U2hhZGVyaXYgPSAxODY7Ci0gICAgICAgIGdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID0gMTg3OwotICAgICAgICBnbEdldFNoYWRlclNvdXJjZSA9IDE4ODsKLSAgICAgICAgZ2xHZXRTdHJpbmcgPSAxODk7Ci0gICAgICAgIGdsR2V0VGV4RW52ZnYgPSAxOTA7Ci0gICAgICAgIGdsR2V0VGV4RW52aXYgPSAxOTE7Ci0gICAgICAgIGdsR2V0VGV4RW52eHYgPSAxOTI7Ci0gICAgICAgIGdsR2V0VGV4RW52eHZPRVMgPSAxOTM7Ci0gICAgICAgIGdsR2V0VGV4R2VuZnZPRVMgPSAxOTQ7Ci0gICAgICAgIGdsR2V0VGV4R2VuaXZPRVMgPSAxOTU7Ci0gICAgICAgIGdsR2V0VGV4R2VueHZPRVMgPSAxOTY7Ci0gICAgICAgIGdsR2V0VGV4UGFyYW1ldGVyZnYgPSAxOTc7Ci0gICAgICAgIGdsR2V0VGV4UGFyYW1ldGVyaXYgPSAxOTg7Ci0gICAgICAgIGdsR2V0VGV4UGFyYW1ldGVyeHYgPSAxOTk7Ci0gICAgICAgIGdsR2V0VGV4UGFyYW1ldGVyeHZPRVMgPSAyMDA7Ci0gICAgICAgIGdsR2V0VW5pZm9ybWZ2ID0gMjAxOwotICAgICAgICBnbEdldFVuaWZvcm1pdiA9IDIwMjsKLSAgICAgICAgZ2xHZXRVbmlmb3JtTG9jYXRpb24gPSAyMDM7Ci0gICAgICAgIGdsR2V0VmVydGV4QXR0cmliZnYgPSAyMDQ7Ci0gICAgICAgIGdsR2V0VmVydGV4QXR0cmliaXYgPSAyMDU7Ci0gICAgICAgIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYgPSAyMDY7Ci0gICAgICAgIGdsSGludCA9IDIwNzsKLSAgICAgICAgZ2xJc0J1ZmZlciA9IDIwODsKLSAgICAgICAgZ2xJc0VuYWJsZWQgPSAyMDk7Ci0gICAgICAgIGdsSXNGZW5jZU5WID0gMjEwOwotICAgICAgICBnbElzRnJhbWVidWZmZXIgPSAyMTE7Ci0gICAgICAgIGdsSXNGcmFtZWJ1ZmZlck9FUyA9IDIxMjsKLSAgICAgICAgZ2xJc1Byb2dyYW0gPSAyMTM7Ci0gICAgICAgIGdsSXNSZW5kZXJidWZmZXIgPSAyMTQ7Ci0gICAgICAgIGdsSXNSZW5kZXJidWZmZXJPRVMgPSAyMTU7Ci0gICAgICAgIGdsSXNTaGFkZXIgPSAyMTY7Ci0gICAgICAgIGdsSXNUZXh0dXJlID0gMjE3OwotICAgICAgICBnbElzVmVydGV4QXJyYXlPRVMgPSAyMTg7Ci0gICAgICAgIGdsTGlnaHRmID0gMjE5OwotICAgICAgICBnbExpZ2h0ZnYgPSAyMjA7Ci0gICAgICAgIGdsTGlnaHRNb2RlbGYgPSAyMjE7Ci0gICAgICAgIGdsTGlnaHRNb2RlbGZ2ID0gMjIyOwotICAgICAgICBnbExpZ2h0TW9kZWx4ID0gMjIzOwotICAgICAgICBnbExpZ2h0TW9kZWx4T0VTID0gMjI0OwotICAgICAgICBnbExpZ2h0TW9kZWx4diA9IDIyNTsKLSAgICAgICAgZ2xMaWdodE1vZGVseHZPRVMgPSAyMjY7Ci0gICAgICAgIGdsTGlnaHR4ID0gMjI3OwotICAgICAgICBnbExpZ2h0eE9FUyA9IDIyODsKLSAgICAgICAgZ2xMaWdodHh2ID0gMjI5OwotICAgICAgICBnbExpZ2h0eHZPRVMgPSAyMzA7Ci0gICAgICAgIGdsTGluZVdpZHRoID0gMjMxOwotICAgICAgICBnbExpbmVXaWR0aHggPSAyMzI7Ci0gICAgICAgIGdsTGluZVdpZHRoeE9FUyA9IDIzMzsKLSAgICAgICAgZ2xMaW5rUHJvZ3JhbSA9IDIzNDsKLSAgICAgICAgZ2xMb2FkSWRlbnRpdHkgPSAyMzU7Ci0gICAgICAgIGdsTG9hZE1hdHJpeGYgPSAyMzY7Ci0gICAgICAgIGdsTG9hZE1hdHJpeHggPSAyMzc7Ci0gICAgICAgIGdsTG9hZE1hdHJpeHhPRVMgPSAyMzg7Ci0gICAgICAgIGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTID0gMjM5OwotICAgICAgICBnbExvZ2ljT3AgPSAyNDA7Ci0gICAgICAgIGdsTWFwQnVmZmVyT0VTID0gMjQxOwotICAgICAgICBnbE1hdGVyaWFsZiA9IDI0MjsKLSAgICAgICAgZ2xNYXRlcmlhbGZ2ID0gMjQzOwotICAgICAgICBnbE1hdGVyaWFseCA9IDI0NDsKLSAgICAgICAgZ2xNYXRlcmlhbHhPRVMgPSAyNDU7Ci0gICAgICAgIGdsTWF0ZXJpYWx4diA9IDI0NjsKLSAgICAgICAgZ2xNYXRlcmlhbHh2T0VTID0gMjQ3OwotICAgICAgICBnbE1hdHJpeEluZGV4UG9pbnRlck9FUyA9IDI0ODsKLSAgICAgICAgZ2xNYXRyaXhNb2RlID0gMjQ5OwotICAgICAgICBnbE11bHRpRHJhd0FycmF5c0VYVCA9IDI1MDsKLSAgICAgICAgZ2xNdWx0aURyYXdFbGVtZW50c0VYVCA9IDI1MTsKLSAgICAgICAgZ2xNdWx0aVRleENvb3JkNGYgPSAyNTI7Ci0gICAgICAgIGdsTXVsdGlUZXhDb29yZDR4ID0gMjUzOwotICAgICAgICBnbE11bHRpVGV4Q29vcmQ0eE9FUyA9IDI1NDsKLSAgICAgICAgZ2xNdWx0TWF0cml4ZiA9IDI1NTsKLSAgICAgICAgZ2xNdWx0TWF0cml4eCA9IDI1NjsKLSAgICAgICAgZ2xNdWx0TWF0cml4eE9FUyA9IDI1NzsKLSAgICAgICAgZ2xOb3JtYWwzZiA9IDI1ODsKLSAgICAgICAgZ2xOb3JtYWwzeCA9IDI1OTsKLSAgICAgICAgZ2xOb3JtYWwzeE9FUyA9IDI2MDsKLSAgICAgICAgZ2xOb3JtYWxQb2ludGVyID0gMjYxOwotICAgICAgICBnbE9ydGhvZiA9IDI2MjsKLSAgICAgICAgZ2xPcnRob2ZPRVMgPSAyNjM7Ci0gICAgICAgIGdsT3J0aG94ID0gMjY0OwotICAgICAgICBnbE9ydGhveE9FUyA9IDI2NTsKLSAgICAgICAgZ2xQaXhlbFN0b3JlaSA9IDI2NjsKLSAgICAgICAgZ2xQb2ludFBhcmFtZXRlcmYgPSAyNjc7Ci0gICAgICAgIGdsUG9pbnRQYXJhbWV0ZXJmdiA9IDI2ODsKLSAgICAgICAgZ2xQb2ludFBhcmFtZXRlcnggPSAyNjk7Ci0gICAgICAgIGdsUG9pbnRQYXJhbWV0ZXJ4T0VTID0gMjcwOwotICAgICAgICBnbFBvaW50UGFyYW1ldGVyeHYgPSAyNzE7Ci0gICAgICAgIGdsUG9pbnRQYXJhbWV0ZXJ4dk9FUyA9IDI3MjsKLSAgICAgICAgZ2xQb2ludFNpemUgPSAyNzM7Ci0gICAgICAgIGdsUG9pbnRTaXplUG9pbnRlck9FUyA9IDI3NDsKLSAgICAgICAgZ2xQb2ludFNpemV4ID0gMjc1OwotICAgICAgICBnbFBvaW50U2l6ZXhPRVMgPSAyNzY7Ci0gICAgICAgIGdsUG9seWdvbk9mZnNldCA9IDI3NzsKLSAgICAgICAgZ2xQb2x5Z29uT2Zmc2V0eCA9IDI3ODsKLSAgICAgICAgZ2xQb2x5Z29uT2Zmc2V0eE9FUyA9IDI3OTsKLSAgICAgICAgZ2xQb3BNYXRyaXggPSAyODA7Ci0gICAgICAgIGdsUHJvZ3JhbUJpbmFyeU9FUyA9IDI4MTsKLSAgICAgICAgZ2xQdXNoTWF0cml4ID0gMjgyOwotICAgICAgICBnbFF1ZXJ5TWF0cml4eE9FUyA9IDI4MzsKLSAgICAgICAgZ2xSZWFkUGl4ZWxzID0gMjg0OwotICAgICAgICBnbFJlbGVhc2VTaGFkZXJDb21waWxlciA9IDI4NTsKLSAgICAgICAgZ2xSZW5kZXJidWZmZXJTdG9yYWdlID0gMjg2OwotICAgICAgICBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUlNRyA9IDI4NzsKLSAgICAgICAgZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTID0gMjg4OwotICAgICAgICBnbFJvdGF0ZWYgPSAyODk7Ci0gICAgICAgIGdsUm90YXRleCA9IDI5MDsKLSAgICAgICAgZ2xSb3RhdGV4T0VTID0gMjkxOwotICAgICAgICBnbFNhbXBsZUNvdmVyYWdlID0gMjkyOwotICAgICAgICBnbFNhbXBsZUNvdmVyYWdleCA9IDI5MzsKLSAgICAgICAgZ2xTYW1wbGVDb3ZlcmFnZXhPRVMgPSAyOTQ7Ci0gICAgICAgIGdsU2NhbGVmID0gMjk1OwotICAgICAgICBnbFNjYWxleCA9IDI5NjsKLSAgICAgICAgZ2xTY2FsZXhPRVMgPSAyOTc7Ci0gICAgICAgIGdsU2Npc3NvciA9IDI5ODsKLSAgICAgICAgZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EID0gMjk5OwotICAgICAgICBnbFNldEZlbmNlTlYgPSAzMDA7Ci0gICAgICAgIGdsU2hhZGVNb2RlbCA9IDMwMTsKLSAgICAgICAgZ2xTaGFkZXJCaW5hcnkgPSAzMDI7Ci0gICAgICAgIGdsU2hhZGVyU291cmNlID0gMzAzOwotICAgICAgICBnbFN0YXJ0VGlsaW5nUUNPTSA9IDMwNDsKLSAgICAgICAgZ2xTdGVuY2lsRnVuYyA9IDMwNTsKLSAgICAgICAgZ2xTdGVuY2lsRnVuY1NlcGFyYXRlID0gMzA2OwotICAgICAgICBnbFN0ZW5jaWxNYXNrID0gMzA3OwotICAgICAgICBnbFN0ZW5jaWxNYXNrU2VwYXJhdGUgPSAzMDg7Ci0gICAgICAgIGdsU3RlbmNpbE9wID0gMzA5OwotICAgICAgICBnbFN0ZW5jaWxPcFNlcGFyYXRlID0gMzEwOwotICAgICAgICBnbFRlc3RGZW5jZU5WID0gMzExOwotICAgICAgICBnbFRleENvb3JkUG9pbnRlciA9IDMxMjsKLSAgICAgICAgZ2xUZXhFbnZmID0gMzEzOwotICAgICAgICBnbFRleEVudmZ2ID0gMzE0OwotICAgICAgICBnbFRleEVudmkgPSAzMTU7Ci0gICAgICAgIGdsVGV4RW52aXYgPSAzMTY7Ci0gICAgICAgIGdsVGV4RW52eCA9IDMxNzsKLSAgICAgICAgZ2xUZXhFbnZ4T0VTID0gMzE4OwotICAgICAgICBnbFRleEVudnh2ID0gMzE5OwotICAgICAgICBnbFRleEVudnh2T0VTID0gMzIwOwotICAgICAgICBnbFRleEdlbmZPRVMgPSAzMjE7Ci0gICAgICAgIGdsVGV4R2VuZnZPRVMgPSAzMjI7Ci0gICAgICAgIGdsVGV4R2VuaU9FUyA9IDMyMzsKLSAgICAgICAgZ2xUZXhHZW5pdk9FUyA9IDMyNDsKLSAgICAgICAgZ2xUZXhHZW54T0VTID0gMzI1OwotICAgICAgICBnbFRleEdlbnh2T0VTID0gMzI2OwotICAgICAgICBnbFRleEltYWdlMkQgPSAzMjc7Ci0gICAgICAgIGdsVGV4SW1hZ2UzRE9FUyA9IDMyODsKLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJmID0gMzI5OwotICAgICAgICBnbFRleFBhcmFtZXRlcmZ2ID0gMzMwOwotICAgICAgICBnbFRleFBhcmFtZXRlcmkgPSAzMzE7Ci0gICAgICAgIGdsVGV4UGFyYW1ldGVyaXYgPSAzMzI7Ci0gICAgICAgIGdsVGV4UGFyYW1ldGVyeCA9IDMzMzsKLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJ4T0VTID0gMzM0OwotICAgICAgICBnbFRleFBhcmFtZXRlcnh2ID0gMzM1OwotICAgICAgICBnbFRleFBhcmFtZXRlcnh2T0VTID0gMzM2OwotICAgICAgICBnbFRleFN1YkltYWdlMkQgPSAzMzc7Ci0gICAgICAgIGdsVGV4U3ViSW1hZ2UzRE9FUyA9IDMzODsKLSAgICAgICAgZ2xUcmFuc2xhdGVmID0gMzM5OwotICAgICAgICBnbFRyYW5zbGF0ZXggPSAzNDA7Ci0gICAgICAgIGdsVHJhbnNsYXRleE9FUyA9IDM0MTsKLSAgICAgICAgZ2xVbmlmb3JtMWYgPSAzNDI7Ci0gICAgICAgIGdsVW5pZm9ybTFmdiA9IDM0MzsKLSAgICAgICAgZ2xVbmlmb3JtMWkgPSAzNDQ7Ci0gICAgICAgIGdsVW5pZm9ybTFpdiA9IDM0NTsKLSAgICAgICAgZ2xVbmlmb3JtMmYgPSAzNDY7Ci0gICAgICAgIGdsVW5pZm9ybTJmdiA9IDM0NzsKLSAgICAgICAgZ2xVbmlmb3JtMmkgPSAzNDg7Ci0gICAgICAgIGdsVW5pZm9ybTJpdiA9IDM0OTsKLSAgICAgICAgZ2xVbmlmb3JtM2YgPSAzNTA7Ci0gICAgICAgIGdsVW5pZm9ybTNmdiA9IDM1MTsKLSAgICAgICAgZ2xVbmlmb3JtM2kgPSAzNTI7Ci0gICAgICAgIGdsVW5pZm9ybTNpdiA9IDM1MzsKLSAgICAgICAgZ2xVbmlmb3JtNGYgPSAzNTQ7Ci0gICAgICAgIGdsVW5pZm9ybTRmdiA9IDM1NTsKLSAgICAgICAgZ2xVbmlmb3JtNGkgPSAzNTY7Ci0gICAgICAgIGdsVW5pZm9ybTRpdiA9IDM1NzsKLSAgICAgICAgZ2xVbmlmb3JtTWF0cml4MmZ2ID0gMzU4OwotICAgICAgICBnbFVuaWZvcm1NYXRyaXgzZnYgPSAzNTk7Ci0gICAgICAgIGdsVW5pZm9ybU1hdHJpeDRmdiA9IDM2MDsKLSAgICAgICAgZ2xVbm1hcEJ1ZmZlck9FUyA9IDM2MTsKLSAgICAgICAgZ2xVc2VQcm9ncmFtID0gMzYyOwotICAgICAgICBnbFZhbGlkYXRlUHJvZ3JhbSA9IDM2MzsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWIxZiA9IDM2NDsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWIxZnYgPSAzNjU7Ci0gICAgICAgIGdsVmVydGV4QXR0cmliMmYgPSAzNjY7Ci0gICAgICAgIGdsVmVydGV4QXR0cmliMmZ2ID0gMzY3OwotICAgICAgICBnbFZlcnRleEF0dHJpYjNmID0gMzY4OwotICAgICAgICBnbFZlcnRleEF0dHJpYjNmdiA9IDM2OTsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWI0ZiA9IDM3MDsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWI0ZnYgPSAzNzE7Ci0gICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlciA9IDM3MjsKLSAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyID0gMzczOwotICAgICAgICBnbFZpZXdwb3J0ID0gMzc0OwotICAgICAgICBnbFdlaWdodFBvaW50ZXJPRVMgPSAzNzU7Ci0KLSAgICAgICAgZ2xBY3RpdmVTaGFkZXJQcm9ncmFtRVhUID0gNTAyOwotICAgICAgICBnbEFscGhhRnVuY1FDT00gPSA1MDM7Ci0gICAgICAgIGdsQmVnaW5RdWVyeUVYVCA9IDUwNDsKLSAgICAgICAgZ2xCaW5kUHJvZ3JhbVBpcGVsaW5lRVhUID0gNTA1OwotICAgICAgICBnbEJsaXRGcmFtZWJ1ZmZlckFOR0xFID0gNTA2OwotICAgICAgICBnbENyZWF0ZVNoYWRlclByb2dyYW12RVhUID0gNTA3OwotICAgICAgICBnbERlbGV0ZVByb2dyYW1QaXBlbGluZXNFWFQgPSA1MDg7Ci0gICAgICAgIGdsRGVsZXRlUXVlcmllc0VYVCA9IDUwOTsKLSAgICAgICAgZ2xEcmF3QnVmZmVyc05WID0gNTEwOwotICAgICAgICBnbEVuZFF1ZXJ5RVhUID0gNTExOwotICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQgPSA1MTI7Ci0gICAgICAgIGdsR2VuUHJvZ3JhbVBpcGVsaW5lc0VYVCA9IDUxMzsKLSAgICAgICAgZ2xHZW5RdWVyaWVzRVhUID0gNTE0OwotICAgICAgICBnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQgPSA1MTU7Ci0gICAgICAgIGdsR2V0T2JqZWN0TGFiZWxFWFQgPSA1MTY7Ci0gICAgICAgIGdsR2V0UHJvZ3JhbVBpcGVsaW5lSW5mb0xvZ0VYVCA9IDUxNzsKLSAgICAgICAgZ2xHZXRQcm9ncmFtUGlwZWxpbmVpdkVYVCA9IDUxODsKLSAgICAgICAgZ2xHZXRRdWVyeU9iamVjdHVpdkVYVCA9IDUxOTsKLSAgICAgICAgZ2xHZXRRdWVyeWl2RVhUID0gNTIwOwotICAgICAgICBnbEdldG5Vbmlmb3JtZnZFWFQgPSA1MjE7Ci0gICAgICAgIGdsR2V0blVuaWZvcm1pdkVYVCA9IDUyMTsKLSAgICAgICAgZ2xJbnNlcnRFdmVudE1hcmtlckVYVCA9IDUyMjsKLSAgICAgICAgZ2xJc1Byb2dyYW1QaXBlbGluZUVYVCA9IDUyMzsKLSAgICAgICAgZ2xJc1F1ZXJ5RVhUID0gNTI0OwotICAgICAgICBnbExhYmVsT2JqZWN0RVhUID0gNTI1OwotICAgICAgICBnbFBvcEdyb3VwTWFya2VyRVhUID0gNTI2OwotICAgICAgICBnbFByb2dyYW1QYXJhbWV0ZXJpRVhUID0gNTI3OwotICAgICAgICBnbFByb2dyYW1Vbmlmb3JtMWZFWFQgPSA1Mjg7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm0xZnZFWFQgPSA1Mjk7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm0xaUVYVCA9IDUzMDsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybTFpdkVYVCA9IDUzMTsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybTJmRVhUID0gNTMyOwotICAgICAgICBnbFByb2dyYW1Vbmlmb3JtMmZ2RVhUID0gNTMzOwotICAgICAgICBnbFByb2dyYW1Vbmlmb3JtMmlFWFQgPSA1MzQ7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm0yaXZFWFQgPSA1MzU7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm0zZkVYVCA9IDUzNjsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybTNmdkVYVCA9IDUzNzsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybTNpRVhUID0gNTM4OwotICAgICAgICBnbFByb2dyYW1Vbmlmb3JtM2l2RVhUID0gNTM5OwotICAgICAgICBnbFByb2dyYW1Vbmlmb3JtNGZFWFQgPSA1NDA7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm00ZnZFWFQgPSA1NDE7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm00aUVYVCA9IDU0MjsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybTRpdkVYVCA9IDU0MzsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdkVYVCA9IDU0NDsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVCA9IDU0NTsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRmdkVYVCA9IDU0NjsKLSAgICAgICAgZ2xQdXNoR3JvdXBNYXJrZXJFWFQgPSA1NDc7Ci0gICAgICAgIGdsUmVhZEJ1ZmZlck5WID0gNTQ4OwotICAgICAgICBnbFJlYWRuUGl4ZWxzRVhUID0gNTQ5OwotICAgICAgICBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFID0gNTUwOwotICAgICAgICBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFID0gNTUxOwotICAgICAgICBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCA9IDU1MjsKLSAgICAgICAgZ2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFID0gNTUzOwotICAgICAgICBnbFRleFN0b3JhZ2UxREVYVCA9IDU1NDsKLSAgICAgICAgZ2xUZXhTdG9yYWdlMkRFWFQgPSA1NTU7Ci0gICAgICAgIGdsVGV4U3RvcmFnZTNERVhUID0gNTU2OwotICAgICAgICBnbFRleHR1cmVTdG9yYWdlMURFWFQgPSA1NTc7Ci0gICAgICAgIGdsVGV4dHVyZVN0b3JhZ2UyREVYVCA9IDU1ODsKLSAgICAgICAgZ2xUZXh0dXJlU3RvcmFnZTNERVhUID0gNTU5OwotICAgICAgICBnbFVzZVByb2dyYW1TdGFnZXNFWFQgPSA1NjA7Ci0gICAgICAgIGdsVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmVFWFQgPSA1NjE7Ci0KLSAgICAgICAgZWdsR2V0RGlzcGxheSA9IDIwMDA7Ci0gICAgICAgIGVnbEluaXRpYWxpemUgPSAyMDAxOwotICAgICAgICBlZ2xUZXJtaW5hdGUgPSAyMDAyOwotICAgICAgICBlZ2xHZXRDb25maWdzID0gMjAwMzsKLSAgICAgICAgZWdsQ2hvb3NlQ29uZmlnID0gMjAwNDsKLSAgICAgICAgZWdsR2V0Q29uZmlnQXR0cmliID0gMjAwNTsKLSAgICAgICAgZWdsQ3JlYXRlV2luZG93U3VyZmFjZSA9IDIwMDY7Ci0gICAgICAgIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UgPSAyMDA3OwotICAgICAgICBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSA9IDIwMDg7Ci0gICAgICAgIGVnbERlc3Ryb3lTdXJmYWNlID0gMjAwOTsKLSAgICAgICAgZWdsUXVlcnlTdXJmYWNlID0gMjAxMDsKLSAgICAgICAgZWdsQ3JlYXRlQ29udGV4dCA9IDIwMTE7Ci0gICAgICAgIGVnbERlc3Ryb3lDb250ZXh0ID0gMjAxMjsKLSAgICAgICAgZWdsTWFrZUN1cnJlbnQgPSAyMDEzOwotICAgICAgICBlZ2xHZXRDdXJyZW50Q29udGV4dCA9IDIwMTQ7Ci0gICAgICAgIGVnbEdldEN1cnJlbnRTdXJmYWNlID0gMjAxNTsKLSAgICAgICAgZWdsR2V0Q3VycmVudERpc3BsYXkgPSAyMDE2OwotICAgICAgICBlZ2xRdWVyeUNvbnRleHQgPSAyMDE3OwotICAgICAgICBlZ2xXYWl0R0wgPSAyMDE4OwotICAgICAgICBlZ2xXYWl0TmF0aXZlID0gMjAxOTsKLSAgICAgICAgZWdsU3dhcEJ1ZmZlcnMgPSAyMDIwOwotICAgICAgICBlZ2xDb3B5QnVmZmVycyA9IDIwMjE7Ci0gICAgICAgIGVnbEdldEVycm9yID0gMjAyMjsKLSAgICAgICAgZWdsUXVlcnlTdHJpbmcgPSAyMDIzOwotICAgICAgICBlZ2xHZXRQcm9jQWRkcmVzcyA9IDIwMjQ7Ci0gICAgICAgIGVnbFN1cmZhY2VBdHRyaWIgPSAyMDI1OwotICAgICAgICBlZ2xCaW5kVGV4SW1hZ2UgPSAyMDI2OwotICAgICAgICBlZ2xSZWxlYXNlVGV4SW1hZ2UgPSAyMDI3OwotICAgICAgICBlZ2xTd2FwSW50ZXJ2YWwgPSAyMDI4OwotICAgICAgICBlZ2xCaW5kQVBJID0gMjAyOTsKLSAgICAgICAgZWdsUXVlcnlBUEkgPSAyMDMwOwotICAgICAgICBlZ2xXYWl0Q2xpZW50ID0gMjAzMTsKLSAgICAgICAgZWdsUmVsZWFzZVRocmVhZCA9IDIwMzI7Ci0gICAgICAgIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyID0gMjAzMzsKLSAgICAgICAgZWdsTG9ja1N1cmZhY2VLSFIgPSAyMDM0OwotICAgICAgICBlZ2xVbmxvY2tTdXJmYWNlS0hSID0gMjAzNTsKLSAgICAgICAgZWdsQ3JlYXRlSW1hZ2VLSFIgPSAyMDM2OwotICAgICAgICBlZ2xEZXN0cm95SW1hZ2VLSFIgPSAyMDM3OwotICAgICAgICBlZ2xDcmVhdGVTeW5jS0hSID0gMjAzODsKLSAgICAgICAgZWdsRGVzdHJveVN5bmNLSFIgPSAyMDM5OwotICAgICAgICBlZ2xDbGllbnRXYWl0U3luY0tIUiA9IDIwNDA7Ci0gICAgICAgIGVnbEdldFN5bmNBdHRyaWJLSFIgPSAyMDQxOwotICAgICAgICBlZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRCA9IDIwNDI7Ci0gICAgICAgIGVnbEdldFJlbmRlckJ1ZmZlckFORFJPSUQgPSAyMDQzOwotICAgICAgICBlZ2xHZXRTeXN0ZW1UaW1lRnJlcXVlbmN5TlYgPSAyMDQ0OwotICAgICAgICBlZ2xHZXRTeXN0ZW1UaW1lTlYgPSAyMDQ1OwotCi0gICAgICAgIGludmFsaWQgPSAzMDAwOwotICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXJEYXRhID0gMzAwMTsKLSAgICB9Ci0KLSAgICAvLyBBIEdMIGNhbGwncyByZXR1cm4gZGF0YSBhbmQgYXJndW1lbnRzIGFyZSBmb3JtYXR0ZWQgaW50byB0aGlzIERhdGFUeXBlCi0gICAgbWVzc2FnZSBEYXRhVHlwZSB7Ci0gICAgICAgIGVudW0gVHlwZSB7Ci0gICAgICAgICAgICBWT0lEID0gMTsgICAgICAgLy8gR0x2b2lkCi0gICAgICAgICAgICBDSEFSID0gMjsgICAgICAgLy8gR0xjaGFyCi0gICAgICAgICAgICBCWVRFID0gMzsgICAgICAgLy8gR0xieXRlLCBHTHVieXRlCi0gICAgICAgICAgICBJTlQgPSA0OyAgICAgICAgLy8gR0xiaXRmaWVsZCwgR0xzaG9ydCwgR0xpbnQsIEdMc2l6ZWksIEdMdXNob3J0LCBHTHVpbnQsIEdMZml4ZWQKLSAgICAgICAgICAgIEZMT0FUID0gNTsgICAgICAvLyBHTGZsb2F0LCBHTGNsYW1wZgotICAgICAgICAgICAgQk9PTCA9IDY7ICAgICAgIC8vIEdMYm9vbGVhbgotICAgICAgICAgICAgRU5VTSA9IDc7ICAgICAgIC8vIEdMZW51bQotICAgICAgICB9OwotCi0gICAgICAgIHJlcXVpcmVkIFR5cGUgICB0eXBlID0gMSBbZGVmYXVsdCA9IFZPSURdOwotICAgICAgICByZXF1aXJlZCBib29sICAgaXNBcnJheSA9IDIgW2RlZmF1bHQgPSBmYWxzZV07Ci0KLSAgICAgICAgcmVwZWF0ZWQgaW50MzIgIGludFZhbHVlID0gMzsKLSAgICAgICAgcmVwZWF0ZWQgZmxvYXQgIGZsb2F0VmFsdWUgPSA0OwotICAgICAgICByZXBlYXRlZCBieXRlcyAgY2hhclZhbHVlID0gNTsKLSAgICAgICAgcmVwZWF0ZWQgYnl0ZXMgIHJhd0J5dGVzID0gNjsKLSAgICAgICAgcmVwZWF0ZWQgYm9vbCAgIGJvb2xWYWx1ZSA9IDc7Ci0gICAgfQotCi0gICAgbWVzc2FnZSBGcmFtZUJ1ZmZlciB7Ci0gICAgICAgIHJlcXVpcmVkIGludDMyICB3aWR0aCA9IDE7Ci0gICAgICAgIHJlcXVpcmVkIGludDMyICBoZWlnaHQgPSAyOwotICAgICAgICByZXBlYXRlZCBieXRlcyAgY29udGVudHMgPSAzOwotICAgIH0KLQotICAgIHJlcXVpcmVkIGludDMyICAgICAgY29udGV4dF9pZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgLy8gR0wgY29udGV4dCBJRAotICAgIHJlcXVpcmVkIGludDY0ICAgICAgc3RhcnRfdGltZSA9IDI7ICAgICAgICAgICAgICAgICAgICAgLy8gdGltZSB3aGVuIGNhbGwgd2FzIGludm9rZWQKLSAgICByZXF1aXJlZCBpbnQzMiAgICAgIGR1cmF0aW9uID0gMzsgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmF0aW9uIG9mIHRoZSBjYWxsIChNT05PVE9OSUMgVElNRSkKLQotICAgIHJlcXVpcmVkIEZ1bmN0aW9uICAgZnVuY3Rpb24gPSA0IFtkZWZhdWx0ID0gaW52YWxpZF07ICAgLy8gR0wgZnVuY3Rpb24gY2FsbGVkCi0gICAgcmVwZWF0ZWQgRGF0YVR5cGUgICBhcmdzID0gNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHTCBmdW5jdGlvbidzIGFyZ3VtZW50cwotICAgIG9wdGlvbmFsIERhdGFUeXBlICAgcmV0dXJuVmFsdWUgPSA2OyAgICAgICAgICAgICAgICAgICAgLy8gR0wgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUKLQotICAgIG9wdGlvbmFsIEZyYW1lQnVmZmVyIGZiID0gNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGVudHMgb2YgdGhlIGZyYW1lYnVmZmVyCi0KLSAgICBvcHRpb25hbCBpbnQzMiAgICAgIHRocmVhZHRpbWUgPSA4OyAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmF0aW9uIG9mIHRoZSBjYWxsIChUSFJFQUQgVElNRSkKLX07CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlLnBiLmNwcCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2UucGIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTg3YzQ5Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2UucGIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA4MSArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotCi0jZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OCi0jaW5jbHVkZSAiZ2x0cmFjZS5wYi5oIgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgZ2x0cmFjZSB7Ci0KLXZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dsdHJhY2VfMmVwcm90bygpIHsKLSAgZGVsZXRlIEdMTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBHTE1lc3NhZ2VfRGF0YVR5cGU6OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotdm9pZCBwcm90b2J1Zl9BZGREZXNjX2dsdHJhY2VfMmVwcm90bygpIHsKLSAgc3RhdGljIGJvb2wgYWxyZWFkeV9oZXJlID0gZmFsc2U7Ci0gIGlmIChhbHJlYWR5X2hlcmUpIHJldHVybjsKLSAgYWxyZWFkeV9oZXJlID0gdHJ1ZTsKLSAgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OOwotCi0gIEdMTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgR0xNZXNzYWdlKCk7Ci0gIEdMTWVzc2FnZV9EYXRhVHlwZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgR0xNZXNzYWdlX0RhdGFUeXBlKCk7Ci0gIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyKCk7Ci0gIEdMTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBHTE1lc3NhZ2VfRGF0YVR5cGU6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok9uU2h1dGRvd24oJnByb3RvYnVmX1NodXRkb3duRmlsZV9nbHRyYWNlXzJlcHJvdG8pOwotfQotCi0vLyBGb3JjZSBBZGREZXNjcmlwdG9ycygpIHRvIGJlIGNhbGxlZCBhdCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gdGltZS4KLXN0cnVjdCBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfZ2x0cmFjZV8yZXByb3RvIHsKLSAgU3RhdGljRGVzY3JpcHRvckluaXRpYWxpemVyX2dsdHJhY2VfMmVwcm90bygpIHsKLSAgICBwcm90b2J1Zl9BZGREZXNjX2dsdHJhY2VfMmVwcm90bygpOwotICB9Ci19IHN0YXRpY19kZXNjcmlwdG9yX2luaXRpYWxpemVyX2dsdHJhY2VfMmVwcm90b187Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1ib29sIEdMTWVzc2FnZV9GdW5jdGlvbl9Jc1ZhbGlkKGludCB2YWx1ZSkgewotICBzd2l0Y2godmFsdWUpIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6Ci0gICAgY2FzZSA0OgotICAgIGNhc2UgNToKLSAgICBjYXNlIDY6Ci0gICAgY2FzZSA3OgotICAgIGNhc2UgODoKLSAgICBjYXNlIDk6Ci0gICAgY2FzZSAxMDoKLSAgICBjYXNlIDExOgotICAgIGNhc2UgMTI6Ci0gICAgY2FzZSAxMzoKLSAgICBjYXNlIDE0OgotICAgIGNhc2UgMTU6Ci0gICAgY2FzZSAxNjoKLSAgICBjYXNlIDE3OgotICAgIGNhc2UgMTg6Ci0gICAgY2FzZSAxOToKLSAgICBjYXNlIDIwOgotICAgIGNhc2UgMjE6Ci0gICAgY2FzZSAyMjoKLSAgICBjYXNlIDIzOgotICAgIGNhc2UgMjQ6Ci0gICAgY2FzZSAyNToKLSAgICBjYXNlIDI2OgotICAgIGNhc2UgMjc6Ci0gICAgY2FzZSAyODoKLSAgICBjYXNlIDI5OgotICAgIGNhc2UgMzA6Ci0gICAgY2FzZSAzMToKLSAgICBjYXNlIDMyOgotICAgIGNhc2UgMzM6Ci0gICAgY2FzZSAzNDoKLSAgICBjYXNlIDM1OgotICAgIGNhc2UgMzY6Ci0gICAgY2FzZSAzNzoKLSAgICBjYXNlIDM4OgotICAgIGNhc2UgMzk6Ci0gICAgY2FzZSA0MDoKLSAgICBjYXNlIDQxOgotICAgIGNhc2UgNDI6Ci0gICAgY2FzZSA0MzoKLSAgICBjYXNlIDQ0OgotICAgIGNhc2UgNDU6Ci0gICAgY2FzZSA0NjoKLSAgICBjYXNlIDQ3OgotICAgIGNhc2UgNDg6Ci0gICAgY2FzZSA0OToKLSAgICBjYXNlIDUwOgotICAgIGNhc2UgNTE6Ci0gICAgY2FzZSA1MjoKLSAgICBjYXNlIDUzOgotICAgIGNhc2UgNTQ6Ci0gICAgY2FzZSA1NToKLSAgICBjYXNlIDU2OgotICAgIGNhc2UgNTc6Ci0gICAgY2FzZSA1ODoKLSAgICBjYXNlIDU5OgotICAgIGNhc2UgNjA6Ci0gICAgY2FzZSA2MToKLSAgICBjYXNlIDYyOgotICAgIGNhc2UgNjM6Ci0gICAgY2FzZSA2NDoKLSAgICBjYXNlIDY1OgotICAgIGNhc2UgNjY6Ci0gICAgY2FzZSA2NzoKLSAgICBjYXNlIDY4OgotICAgIGNhc2UgNjk6Ci0gICAgY2FzZSA3MDoKLSAgICBjYXNlIDcxOgotICAgIGNhc2UgNzI6Ci0gICAgY2FzZSA3MzoKLSAgICBjYXNlIDc0OgotICAgIGNhc2UgNzU6Ci0gICAgY2FzZSA3NjoKLSAgICBjYXNlIDc3OgotICAgIGNhc2UgNzg6Ci0gICAgY2FzZSA3OToKLSAgICBjYXNlIDgwOgotICAgIGNhc2UgODE6Ci0gICAgY2FzZSA4MjoKLSAgICBjYXNlIDgzOgotICAgIGNhc2UgODQ6Ci0gICAgY2FzZSA4NToKLSAgICBjYXNlIDg2OgotICAgIGNhc2UgODc6Ci0gICAgY2FzZSA4ODoKLSAgICBjYXNlIDg5OgotICAgIGNhc2UgOTA6Ci0gICAgY2FzZSA5MToKLSAgICBjYXNlIDkyOgotICAgIGNhc2UgOTM6Ci0gICAgY2FzZSA5NDoKLSAgICBjYXNlIDk1OgotICAgIGNhc2UgOTY6Ci0gICAgY2FzZSA5NzoKLSAgICBjYXNlIDk4OgotICAgIGNhc2UgOTk6Ci0gICAgY2FzZSAxMDA6Ci0gICAgY2FzZSAxMDE6Ci0gICAgY2FzZSAxMDI6Ci0gICAgY2FzZSAxMDM6Ci0gICAgY2FzZSAxMDQ6Ci0gICAgY2FzZSAxMDU6Ci0gICAgY2FzZSAxMDY6Ci0gICAgY2FzZSAxMDc6Ci0gICAgY2FzZSAxMDg6Ci0gICAgY2FzZSAxMDk6Ci0gICAgY2FzZSAxMTA6Ci0gICAgY2FzZSAxMTE6Ci0gICAgY2FzZSAxMTI6Ci0gICAgY2FzZSAxMTM6Ci0gICAgY2FzZSAxMTQ6Ci0gICAgY2FzZSAxMTU6Ci0gICAgY2FzZSAxMTY6Ci0gICAgY2FzZSAxMTc6Ci0gICAgY2FzZSAxMTg6Ci0gICAgY2FzZSAxMTk6Ci0gICAgY2FzZSAxMjA6Ci0gICAgY2FzZSAxMjE6Ci0gICAgY2FzZSAxMjI6Ci0gICAgY2FzZSAxMjM6Ci0gICAgY2FzZSAxMjQ6Ci0gICAgY2FzZSAxMjU6Ci0gICAgY2FzZSAxMjY6Ci0gICAgY2FzZSAxMjc6Ci0gICAgY2FzZSAxMjg6Ci0gICAgY2FzZSAxMjk6Ci0gICAgY2FzZSAxMzA6Ci0gICAgY2FzZSAxMzE6Ci0gICAgY2FzZSAxMzI6Ci0gICAgY2FzZSAxMzM6Ci0gICAgY2FzZSAxMzQ6Ci0gICAgY2FzZSAxMzU6Ci0gICAgY2FzZSAxMzY6Ci0gICAgY2FzZSAxMzc6Ci0gICAgY2FzZSAxMzg6Ci0gICAgY2FzZSAxMzk6Ci0gICAgY2FzZSAxNDA6Ci0gICAgY2FzZSAxNDE6Ci0gICAgY2FzZSAxNDI6Ci0gICAgY2FzZSAxNDM6Ci0gICAgY2FzZSAxNDQ6Ci0gICAgY2FzZSAxNDU6Ci0gICAgY2FzZSAxNDY6Ci0gICAgY2FzZSAxNDc6Ci0gICAgY2FzZSAxNDg6Ci0gICAgY2FzZSAxNDk6Ci0gICAgY2FzZSAxNTA6Ci0gICAgY2FzZSAxNTE6Ci0gICAgY2FzZSAxNTI6Ci0gICAgY2FzZSAxNTM6Ci0gICAgY2FzZSAxNTQ6Ci0gICAgY2FzZSAxNTU6Ci0gICAgY2FzZSAxNTY6Ci0gICAgY2FzZSAxNTc6Ci0gICAgY2FzZSAxNTg6Ci0gICAgY2FzZSAxNTk6Ci0gICAgY2FzZSAxNjA6Ci0gICAgY2FzZSAxNjE6Ci0gICAgY2FzZSAxNjI6Ci0gICAgY2FzZSAxNjM6Ci0gICAgY2FzZSAxNjQ6Ci0gICAgY2FzZSAxNjU6Ci0gICAgY2FzZSAxNjY6Ci0gICAgY2FzZSAxNjc6Ci0gICAgY2FzZSAxNjg6Ci0gICAgY2FzZSAxNjk6Ci0gICAgY2FzZSAxNzA6Ci0gICAgY2FzZSAxNzE6Ci0gICAgY2FzZSAxNzI6Ci0gICAgY2FzZSAxNzM6Ci0gICAgY2FzZSAxNzQ6Ci0gICAgY2FzZSAxNzU6Ci0gICAgY2FzZSAxNzY6Ci0gICAgY2FzZSAxNzc6Ci0gICAgY2FzZSAxNzg6Ci0gICAgY2FzZSAxNzk6Ci0gICAgY2FzZSAxODA6Ci0gICAgY2FzZSAxODE6Ci0gICAgY2FzZSAxODI6Ci0gICAgY2FzZSAxODM6Ci0gICAgY2FzZSAxODQ6Ci0gICAgY2FzZSAxODU6Ci0gICAgY2FzZSAxODY6Ci0gICAgY2FzZSAxODc6Ci0gICAgY2FzZSAxODg6Ci0gICAgY2FzZSAxODk6Ci0gICAgY2FzZSAxOTA6Ci0gICAgY2FzZSAxOTE6Ci0gICAgY2FzZSAxOTI6Ci0gICAgY2FzZSAxOTM6Ci0gICAgY2FzZSAxOTQ6Ci0gICAgY2FzZSAxOTU6Ci0gICAgY2FzZSAxOTY6Ci0gICAgY2FzZSAxOTc6Ci0gICAgY2FzZSAxOTg6Ci0gICAgY2FzZSAxOTk6Ci0gICAgY2FzZSAyMDA6Ci0gICAgY2FzZSAyMDE6Ci0gICAgY2FzZSAyMDI6Ci0gICAgY2FzZSAyMDM6Ci0gICAgY2FzZSAyMDQ6Ci0gICAgY2FzZSAyMDU6Ci0gICAgY2FzZSAyMDY6Ci0gICAgY2FzZSAyMDc6Ci0gICAgY2FzZSAyMDg6Ci0gICAgY2FzZSAyMDk6Ci0gICAgY2FzZSAyMTA6Ci0gICAgY2FzZSAyMTE6Ci0gICAgY2FzZSAyMTI6Ci0gICAgY2FzZSAyMTM6Ci0gICAgY2FzZSAyMTQ6Ci0gICAgY2FzZSAyMTU6Ci0gICAgY2FzZSAyMTY6Ci0gICAgY2FzZSAyMTc6Ci0gICAgY2FzZSAyMTg6Ci0gICAgY2FzZSAyMTk6Ci0gICAgY2FzZSAyMjA6Ci0gICAgY2FzZSAyMjE6Ci0gICAgY2FzZSAyMjI6Ci0gICAgY2FzZSAyMjM6Ci0gICAgY2FzZSAyMjQ6Ci0gICAgY2FzZSAyMjU6Ci0gICAgY2FzZSAyMjY6Ci0gICAgY2FzZSAyMjc6Ci0gICAgY2FzZSAyMjg6Ci0gICAgY2FzZSAyMjk6Ci0gICAgY2FzZSAyMzA6Ci0gICAgY2FzZSAyMzE6Ci0gICAgY2FzZSAyMzI6Ci0gICAgY2FzZSAyMzM6Ci0gICAgY2FzZSAyMzQ6Ci0gICAgY2FzZSAyMzU6Ci0gICAgY2FzZSAyMzY6Ci0gICAgY2FzZSAyMzc6Ci0gICAgY2FzZSAyMzg6Ci0gICAgY2FzZSAyMzk6Ci0gICAgY2FzZSAyNDA6Ci0gICAgY2FzZSAyNDE6Ci0gICAgY2FzZSAyNDI6Ci0gICAgY2FzZSAyNDM6Ci0gICAgY2FzZSAyNDQ6Ci0gICAgY2FzZSAyNDU6Ci0gICAgY2FzZSAyNDY6Ci0gICAgY2FzZSAyNDc6Ci0gICAgY2FzZSAyNDg6Ci0gICAgY2FzZSAyNDk6Ci0gICAgY2FzZSAyNTA6Ci0gICAgY2FzZSAyNTE6Ci0gICAgY2FzZSAyNTI6Ci0gICAgY2FzZSAyNTM6Ci0gICAgY2FzZSAyNTQ6Ci0gICAgY2FzZSAyNTU6Ci0gICAgY2FzZSAyNTY6Ci0gICAgY2FzZSAyNTc6Ci0gICAgY2FzZSAyNTg6Ci0gICAgY2FzZSAyNTk6Ci0gICAgY2FzZSAyNjA6Ci0gICAgY2FzZSAyNjE6Ci0gICAgY2FzZSAyNjI6Ci0gICAgY2FzZSAyNjM6Ci0gICAgY2FzZSAyNjQ6Ci0gICAgY2FzZSAyNjU6Ci0gICAgY2FzZSAyNjY6Ci0gICAgY2FzZSAyNjc6Ci0gICAgY2FzZSAyNjg6Ci0gICAgY2FzZSAyNjk6Ci0gICAgY2FzZSAyNzA6Ci0gICAgY2FzZSAyNzE6Ci0gICAgY2FzZSAyNzI6Ci0gICAgY2FzZSAyNzM6Ci0gICAgY2FzZSAyNzQ6Ci0gICAgY2FzZSAyNzU6Ci0gICAgY2FzZSAyNzY6Ci0gICAgY2FzZSAyNzc6Ci0gICAgY2FzZSAyNzg6Ci0gICAgY2FzZSAyNzk6Ci0gICAgY2FzZSAyODA6Ci0gICAgY2FzZSAyODE6Ci0gICAgY2FzZSAyODI6Ci0gICAgY2FzZSAyODM6Ci0gICAgY2FzZSAyODQ6Ci0gICAgY2FzZSAyODU6Ci0gICAgY2FzZSAyODY6Ci0gICAgY2FzZSAyODc6Ci0gICAgY2FzZSAyODg6Ci0gICAgY2FzZSAyODk6Ci0gICAgY2FzZSAyOTA6Ci0gICAgY2FzZSAyOTE6Ci0gICAgY2FzZSAyOTI6Ci0gICAgY2FzZSAyOTM6Ci0gICAgY2FzZSAyOTQ6Ci0gICAgY2FzZSAyOTU6Ci0gICAgY2FzZSAyOTY6Ci0gICAgY2FzZSAyOTc6Ci0gICAgY2FzZSAyOTg6Ci0gICAgY2FzZSAyOTk6Ci0gICAgY2FzZSAzMDA6Ci0gICAgY2FzZSAzMDE6Ci0gICAgY2FzZSAzMDI6Ci0gICAgY2FzZSAzMDM6Ci0gICAgY2FzZSAzMDQ6Ci0gICAgY2FzZSAzMDU6Ci0gICAgY2FzZSAzMDY6Ci0gICAgY2FzZSAzMDc6Ci0gICAgY2FzZSAzMDg6Ci0gICAgY2FzZSAzMDk6Ci0gICAgY2FzZSAzMTA6Ci0gICAgY2FzZSAzMTE6Ci0gICAgY2FzZSAzMTI6Ci0gICAgY2FzZSAzMTM6Ci0gICAgY2FzZSAzMTQ6Ci0gICAgY2FzZSAzMTU6Ci0gICAgY2FzZSAzMTY6Ci0gICAgY2FzZSAzMTc6Ci0gICAgY2FzZSAzMTg6Ci0gICAgY2FzZSAzMTk6Ci0gICAgY2FzZSAzMjA6Ci0gICAgY2FzZSAzMjE6Ci0gICAgY2FzZSAzMjI6Ci0gICAgY2FzZSAzMjM6Ci0gICAgY2FzZSAzMjQ6Ci0gICAgY2FzZSAzMjU6Ci0gICAgY2FzZSAzMjY6Ci0gICAgY2FzZSAzMjc6Ci0gICAgY2FzZSAzMjg6Ci0gICAgY2FzZSAzMjk6Ci0gICAgY2FzZSAzMzA6Ci0gICAgY2FzZSAzMzE6Ci0gICAgY2FzZSAzMzI6Ci0gICAgY2FzZSAzMzM6Ci0gICAgY2FzZSAzMzQ6Ci0gICAgY2FzZSAzMzU6Ci0gICAgY2FzZSAzMzY6Ci0gICAgY2FzZSAzMzc6Ci0gICAgY2FzZSAzMzg6Ci0gICAgY2FzZSAzMzk6Ci0gICAgY2FzZSAzNDA6Ci0gICAgY2FzZSAzNDE6Ci0gICAgY2FzZSAzNDI6Ci0gICAgY2FzZSAzNDM6Ci0gICAgY2FzZSAzNDQ6Ci0gICAgY2FzZSAzNDU6Ci0gICAgY2FzZSAzNDY6Ci0gICAgY2FzZSAzNDc6Ci0gICAgY2FzZSAzNDg6Ci0gICAgY2FzZSAzNDk6Ci0gICAgY2FzZSAzNTA6Ci0gICAgY2FzZSAzNTE6Ci0gICAgY2FzZSAzNTI6Ci0gICAgY2FzZSAzNTM6Ci0gICAgY2FzZSAzNTQ6Ci0gICAgY2FzZSAzNTU6Ci0gICAgY2FzZSAzNTY6Ci0gICAgY2FzZSAzNTc6Ci0gICAgY2FzZSAzNTg6Ci0gICAgY2FzZSAzNTk6Ci0gICAgY2FzZSAzNjA6Ci0gICAgY2FzZSAzNjE6Ci0gICAgY2FzZSAzNjI6Ci0gICAgY2FzZSAzNjM6Ci0gICAgY2FzZSAzNjQ6Ci0gICAgY2FzZSAzNjU6Ci0gICAgY2FzZSAzNjY6Ci0gICAgY2FzZSAzNjc6Ci0gICAgY2FzZSAzNjg6Ci0gICAgY2FzZSAzNjk6Ci0gICAgY2FzZSAzNzA6Ci0gICAgY2FzZSAzNzE6Ci0gICAgY2FzZSAzNzI6Ci0gICAgY2FzZSAzNzM6Ci0gICAgY2FzZSAzNzQ6Ci0gICAgY2FzZSAzNzU6Ci0gICAgY2FzZSA1MDI6Ci0gICAgY2FzZSA1MDM6Ci0gICAgY2FzZSA1MDQ6Ci0gICAgY2FzZSA1MDU6Ci0gICAgY2FzZSA1MDY6Ci0gICAgY2FzZSA1MDc6Ci0gICAgY2FzZSA1MDg6Ci0gICAgY2FzZSA1MDk6Ci0gICAgY2FzZSA1MTA6Ci0gICAgY2FzZSA1MTE6Ci0gICAgY2FzZSA1MTI6Ci0gICAgY2FzZSA1MTM6Ci0gICAgY2FzZSA1MTQ6Ci0gICAgY2FzZSA1MTU6Ci0gICAgY2FzZSA1MTY6Ci0gICAgY2FzZSA1MTc6Ci0gICAgY2FzZSA1MTg6Ci0gICAgY2FzZSA1MTk6Ci0gICAgY2FzZSA1MjA6Ci0gICAgY2FzZSA1MjE6Ci0gICAgY2FzZSA1MjI6Ci0gICAgY2FzZSA1MjM6Ci0gICAgY2FzZSA1MjQ6Ci0gICAgY2FzZSA1MjU6Ci0gICAgY2FzZSA1MjY6Ci0gICAgY2FzZSA1Mjc6Ci0gICAgY2FzZSA1Mjg6Ci0gICAgY2FzZSA1Mjk6Ci0gICAgY2FzZSA1MzA6Ci0gICAgY2FzZSA1MzE6Ci0gICAgY2FzZSA1MzI6Ci0gICAgY2FzZSA1MzM6Ci0gICAgY2FzZSA1MzQ6Ci0gICAgY2FzZSA1MzU6Ci0gICAgY2FzZSA1MzY6Ci0gICAgY2FzZSA1Mzc6Ci0gICAgY2FzZSA1Mzg6Ci0gICAgY2FzZSA1Mzk6Ci0gICAgY2FzZSA1NDA6Ci0gICAgY2FzZSA1NDE6Ci0gICAgY2FzZSA1NDI6Ci0gICAgY2FzZSA1NDM6Ci0gICAgY2FzZSA1NDQ6Ci0gICAgY2FzZSA1NDU6Ci0gICAgY2FzZSA1NDY6Ci0gICAgY2FzZSA1NDc6Ci0gICAgY2FzZSA1NDg6Ci0gICAgY2FzZSA1NDk6Ci0gICAgY2FzZSA1NTA6Ci0gICAgY2FzZSA1NTE6Ci0gICAgY2FzZSA1NTI6Ci0gICAgY2FzZSA1NTM6Ci0gICAgY2FzZSA1NTQ6Ci0gICAgY2FzZSA1NTU6Ci0gICAgY2FzZSA1NTY6Ci0gICAgY2FzZSA1NTc6Ci0gICAgY2FzZSA1NTg6Ci0gICAgY2FzZSA1NTk6Ci0gICAgY2FzZSA1NjA6Ci0gICAgY2FzZSA1NjE6Ci0gICAgY2FzZSAyMDAwOgotICAgIGNhc2UgMjAwMToKLSAgICBjYXNlIDIwMDI6Ci0gICAgY2FzZSAyMDAzOgotICAgIGNhc2UgMjAwNDoKLSAgICBjYXNlIDIwMDU6Ci0gICAgY2FzZSAyMDA2OgotICAgIGNhc2UgMjAwNzoKLSAgICBjYXNlIDIwMDg6Ci0gICAgY2FzZSAyMDA5OgotICAgIGNhc2UgMjAxMDoKLSAgICBjYXNlIDIwMTE6Ci0gICAgY2FzZSAyMDEyOgotICAgIGNhc2UgMjAxMzoKLSAgICBjYXNlIDIwMTQ6Ci0gICAgY2FzZSAyMDE1OgotICAgIGNhc2UgMjAxNjoKLSAgICBjYXNlIDIwMTc6Ci0gICAgY2FzZSAyMDE4OgotICAgIGNhc2UgMjAxOToKLSAgICBjYXNlIDIwMjA6Ci0gICAgY2FzZSAyMDIxOgotICAgIGNhc2UgMjAyMjoKLSAgICBjYXNlIDIwMjM6Ci0gICAgY2FzZSAyMDI0OgotICAgIGNhc2UgMjAyNToKLSAgICBjYXNlIDIwMjY6Ci0gICAgY2FzZSAyMDI3OgotICAgIGNhc2UgMjAyODoKLSAgICBjYXNlIDIwMjk6Ci0gICAgY2FzZSAyMDMwOgotICAgIGNhc2UgMjAzMToKLSAgICBjYXNlIDIwMzI6Ci0gICAgY2FzZSAyMDMzOgotICAgIGNhc2UgMjAzNDoKLSAgICBjYXNlIDIwMzU6Ci0gICAgY2FzZSAyMDM2OgotICAgIGNhc2UgMjAzNzoKLSAgICBjYXNlIDIwMzg6Ci0gICAgY2FzZSAyMDM5OgotICAgIGNhc2UgMjA0MDoKLSAgICBjYXNlIDIwNDE6Ci0gICAgY2FzZSAyMDQyOgotICAgIGNhc2UgMjA0MzoKLSAgICBjYXNlIDIwNDQ6Ci0gICAgY2FzZSAyMDQ1OgotICAgIGNhc2UgMzAwMDoKLSAgICBjYXNlIDMwMDE6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQWN0aXZlVGV4dHVyZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQWxwaGFGdW5jOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xBbHBoYUZ1bmN4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xBbHBoYUZ1bmN4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xBdHRhY2hTaGFkZXI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJlZ2luUGVyZk1vbml0b3JBTUQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJpbmRBdHRyaWJMb2NhdGlvbjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQmluZEJ1ZmZlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQmluZEZyYW1lYnVmZmVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCaW5kRnJhbWVidWZmZXJPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJpbmRSZW5kZXJidWZmZXI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJpbmRSZW5kZXJidWZmZXJPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJpbmRUZXh0dXJlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCaW5kVmVydGV4QXJyYXlPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJsZW5kQ29sb3I7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJsZW5kRXF1YXRpb247Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJsZW5kRXF1YXRpb25PRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCbGVuZEZ1bmM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJsZW5kRnVuY1NlcGFyYXRlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQnVmZmVyRGF0YTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQnVmZmVyU3ViRGF0YTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1czsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xlYXJDb2xvcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xlYXJDb2xvcng7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsZWFyQ29sb3J4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDbGVhckRlcHRoZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xlYXJEZXB0aGZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsZWFyRGVwdGh4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDbGVhckRlcHRoeE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xlYXI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsZWFyU3RlbmNpbDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xpZW50QWN0aXZlVGV4dHVyZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xpcFBsYW5lZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xpcFBsYW5lZklNRzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xpcFBsYW5lZk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xpcFBsYW5leDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xpcFBsYW5leElNRzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xpcFBsYW5leE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ29sb3I0ZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ29sb3I0dWI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvbG9yNHg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvbG9yNHhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvbG9yTWFzazsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ29sb3JQb2ludGVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDb21waWxlU2hhZGVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDb21wcmVzc2VkVGV4SW1hZ2UyRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ29tcHJlc3NlZFRleEltYWdlM0RPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ29weVRleEltYWdlMkQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvcHlUZXhTdWJJbWFnZTJEOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDb3B5VGV4U3ViSW1hZ2UzRE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ292ZXJhZ2VNYXNrTlY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvdmVyYWdlT3BlcmF0aW9uTlY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENyZWF0ZVByb2dyYW07Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENyZWF0ZVNoYWRlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ3VsbEZhY2U7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZWxldGVCdWZmZXJzOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZWxldGVGZW5jZXNOVjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlRnJhbWVidWZmZXJzOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERlbGV0ZVBlcmZNb25pdG9yc0FNRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlUHJvZ3JhbTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlUmVuZGVyYnVmZmVyczsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlU2hhZGVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZWxldGVUZXh0dXJlczsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlVmVydGV4QXJyYXlzT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZXB0aEZ1bmM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERlcHRoTWFzazsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVwdGhSYW5nZWY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERlcHRoUmFuZ2VmT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZXB0aFJhbmdleDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVwdGhSYW5nZXhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERldGFjaFNoYWRlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGlzYWJsZUNsaWVudFN0YXRlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERpc2FibGU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGlzY2FyZEZyYW1lYnVmZmVyRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEcmF3QXJyYXlzOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEcmF3RWxlbWVudHM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERyYXdUZXhmT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEcmF3VGV4ZnZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERyYXdUZXhpT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEcmF3VGV4aXZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERyYXdUZXhzT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEcmF3VGV4c3ZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERyYXdUZXh4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEcmF3VGV4eHZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEVuYWJsZUNsaWVudFN0YXRlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFbmFibGVEcml2ZXJDb250cm9sUUNPTTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRW5hYmxlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRW5kUGVyZk1vbml0b3JBTUQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEVuZFRpbGluZ1FDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRXh0R2V0QnVmZmVyc1FDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEV4dEdldEZyYW1lYnVmZmVyc1FDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFeHRHZXRQcm9ncmFtc1FDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFeHRHZXRTaGFkZXJzUUNPTTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEV4dEdldFRleFN1YkltYWdlUUNPTTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRXh0R2V0VGV4dHVyZXNRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFeHRJc1Byb2dyYW1CaW5hcnlRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZpbmlzaEZlbmNlTlY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZpbmlzaDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRmx1c2g7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZvZ2Y7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZvZ2Z2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGb2d4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGb2d4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGb2d4djsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRm9neHZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRnJhbWVidWZmZXJUZXh0dXJlMkQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUc7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGcmFtZWJ1ZmZlclRleHR1cmUzRE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRnJvbnRGYWNlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGcnVzdHVtZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRnJ1c3R1bWZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZydXN0dW14OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGcnVzdHVteE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2VuQnVmZmVyczsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2VuZXJhdGVNaXBtYXA7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdlbmVyYXRlTWlwbWFwT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZW5GZW5jZXNOVjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2VuRnJhbWVidWZmZXJzOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZW5GcmFtZWJ1ZmZlcnNPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdlblBlcmZNb25pdG9yc0FNRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2VuUmVuZGVyYnVmZmVyczsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2VuUmVuZGVyYnVmZmVyc09FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2VuVGV4dHVyZXM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdlblZlcnRleEFycmF5c09FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0QWN0aXZlQXR0cmliOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRBY3RpdmVVbmlmb3JtOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRBdHRhY2hlZFNoYWRlcnM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldEF0dHJpYkxvY2F0aW9uOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRCb29sZWFudjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0QnVmZmVyUGFyYW1ldGVyaXY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRDbGlwUGxhbmVmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRDbGlwUGxhbmVmT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRDbGlwUGxhbmV4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRDbGlwUGxhbmV4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXREcml2ZXJDb250cm9sc1FDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldERyaXZlckNvbnRyb2xTdHJpbmdRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRFcnJvcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0RmVuY2Vpdk5WOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRGaXhlZHY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldEZpeGVkdk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0RmxvYXR2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldEludGVnZXJ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRMaWdodGZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRMaWdodHh2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRMaWdodHh2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRNYXRlcmlhbGZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRNYXRlcmlhbHh2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRNYXRlcmlhbHh2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1EOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1EOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1EOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFBlcmZNb25pdG9yR3JvdXBzQU1EOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRQb2ludGVydjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0UHJvZ3JhbUJpbmFyeU9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0UHJvZ3JhbUluZm9Mb2c7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFByb2dyYW1pdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRTaGFkZXJJbmZvTG9nOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRTaGFkZXJpdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRTaGFkZXJTb3VyY2U7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFN0cmluZzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0VGV4RW52ZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFRleEVudml2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRUZXhFbnZ4djsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0VGV4RW52eHZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFRleEdlbmZ2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRUZXhHZW5pdk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0VGV4R2VueHZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFRleFBhcmFtZXRlcmZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRUZXhQYXJhbWV0ZXJpdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0VGV4UGFyYW1ldGVyeHY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFRleFBhcmFtZXRlcnh2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRVbmlmb3JtZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFVuaWZvcm1pdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0VW5pZm9ybUxvY2F0aW9uOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRWZXJ0ZXhBdHRyaWJmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0VmVydGV4QXR0cmliaXY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xIaW50OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xJc0J1ZmZlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsSXNFbmFibGVkOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xJc0ZlbmNlTlY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbElzRnJhbWVidWZmZXI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbElzRnJhbWVidWZmZXJPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbElzUHJvZ3JhbTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsSXNSZW5kZXJidWZmZXI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbElzUmVuZGVyYnVmZmVyT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xJc1NoYWRlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsSXNUZXh0dXJlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xJc1ZlcnRleEFycmF5T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaWdodGY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExpZ2h0ZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExpZ2h0TW9kZWxmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaWdodE1vZGVsZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExpZ2h0TW9kZWx4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaWdodE1vZGVseE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTGlnaHRNb2RlbHh2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaWdodE1vZGVseHZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExpZ2h0eDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTGlnaHR4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaWdodHh2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaWdodHh2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaW5lV2lkdGg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExpbmVXaWR0aHg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExpbmVXaWR0aHhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExpbmtQcm9ncmFtOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMb2FkSWRlbnRpdHk7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExvYWRNYXRyaXhmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMb2FkTWF0cml4eDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTG9hZE1hdHJpeHhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTG9naWNPcDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTWFwQnVmZmVyT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNYXRlcmlhbGY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE1hdGVyaWFsZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE1hdGVyaWFseDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTWF0ZXJpYWx4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNYXRlcmlhbHh2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNYXRlcmlhbHh2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNYXRyaXhJbmRleFBvaW50ZXJPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE1hdHJpeE1vZGU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE11bHRpRHJhd0FycmF5c0VYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTXVsdGlEcmF3RWxlbWVudHNFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE11bHRpVGV4Q29vcmQ0ZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTXVsdGlUZXhDb29yZDR4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNdWx0aVRleENvb3JkNHhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE11bHRNYXRyaXhmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNdWx0TWF0cml4eDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTXVsdE1hdHJpeHhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE5vcm1hbDNmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xOb3JtYWwzeDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTm9ybWFsM3hPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE5vcm1hbFBvaW50ZXI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE9ydGhvZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsT3J0aG9mT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xPcnRob3g7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE9ydGhveE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUGl4ZWxTdG9yZWk7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvaW50UGFyYW1ldGVyZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUG9pbnRQYXJhbWV0ZXJmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUG9pbnRQYXJhbWV0ZXJ4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQb2ludFBhcmFtZXRlcnhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvaW50UGFyYW1ldGVyeHY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvaW50UGFyYW1ldGVyeHZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvaW50U2l6ZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUG9pbnRTaXplUG9pbnRlck9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUG9pbnRTaXpleDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUG9pbnRTaXpleE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUG9seWdvbk9mZnNldDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUG9seWdvbk9mZnNldHg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvbHlnb25PZmZzZXR4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQb3BNYXRyaXg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1CaW5hcnlPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFB1c2hNYXRyaXg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFF1ZXJ5TWF0cml4eE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUmVhZFBpeGVsczsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUmVsZWFzZVNoYWRlckNvbXBpbGVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUc7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFJvdGF0ZWY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFJvdGF0ZXg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFJvdGF0ZXhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFNhbXBsZUNvdmVyYWdlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTYW1wbGVDb3ZlcmFnZXg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFNhbXBsZUNvdmVyYWdleE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU2NhbGVmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTY2FsZXg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFNjYWxleE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU2Npc3NvcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU2V0RmVuY2VOVjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU2hhZGVNb2RlbDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU2hhZGVyQmluYXJ5OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTaGFkZXJTb3VyY2U7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFN0YXJ0VGlsaW5nUUNPTTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU3RlbmNpbEZ1bmM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFN0ZW5jaWxGdW5jU2VwYXJhdGU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFN0ZW5jaWxNYXNrOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTdGVuY2lsTWFza1NlcGFyYXRlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTdGVuY2lsT3A7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFN0ZW5jaWxPcFNlcGFyYXRlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXN0RmVuY2VOVjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4Q29vcmRQb2ludGVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhFbnZmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhFbnZmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4RW52aTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4RW52aXY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleEVudng7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleEVudnhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleEVudnh2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhFbnZ4dk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4R2VuZk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4R2VuZnZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleEdlbmlPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleEdlbml2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhHZW54T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhHZW54dk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4SW1hZ2UyRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4SW1hZ2UzRE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4UGFyYW1ldGVyZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4UGFyYW1ldGVyZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleFBhcmFtZXRlcmk7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleFBhcmFtZXRlcml2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhQYXJhbWV0ZXJ4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhQYXJhbWV0ZXJ4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhQYXJhbWV0ZXJ4djsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4UGFyYW1ldGVyeHZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleFN1YkltYWdlMkQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleFN1YkltYWdlM0RPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRyYW5zbGF0ZWY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRyYW5zbGF0ZXg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRyYW5zbGF0ZXhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVuaWZvcm0xZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybTFmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybTFpOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtMWl2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtMmY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVuaWZvcm0yZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVuaWZvcm0yaTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybTJpdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybTNmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtM2Z2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtM2k7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVuaWZvcm0zaXY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVuaWZvcm00ZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybTRmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybTRpOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtNGl2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtTWF0cml4MmZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtTWF0cml4M2Z2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtTWF0cml4NGZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbm1hcEJ1ZmZlck9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVXNlUHJvZ3JhbTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmFsaWRhdGVQcm9ncmFtOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWIxZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliMWZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWIyZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliMmZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWIzZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliM2Z2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWI0ZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliNGZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWJQb2ludGVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xWZXJ0ZXhQb2ludGVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xWaWV3cG9ydDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsV2VpZ2h0UG9pbnRlck9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQWN0aXZlU2hhZGVyUHJvZ3JhbUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQWxwaGFGdW5jUUNPTTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQmVnaW5RdWVyeUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQmluZFByb2dyYW1QaXBlbGluZUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQmxpdEZyYW1lYnVmZmVyQU5HTEU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENyZWF0ZVNoYWRlclByb2dyYW12RVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZWxldGVQcm9ncmFtUGlwZWxpbmVzRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZWxldGVRdWVyaWVzRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEcmF3QnVmZmVyc05WOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFbmRRdWVyeUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2VuUHJvZ3JhbVBpcGVsaW5lc0VYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2VuUXVlcmllc0VYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0R3JhcGhpY3NSZXNldFN0YXR1c0VYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0T2JqZWN0TGFiZWxFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFByb2dyYW1QaXBlbGluZUluZm9Mb2dFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFByb2dyYW1QaXBlbGluZWl2RVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRRdWVyeU9iamVjdHVpdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0UXVlcnlpdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0blVuaWZvcm1mdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0blVuaWZvcm1pdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsSW5zZXJ0RXZlbnRNYXJrZXJFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbElzUHJvZ3JhbVBpcGVsaW5lRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xJc1F1ZXJ5RVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMYWJlbE9iamVjdEVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUG9wR3JvdXBNYXJrZXJFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1QYXJhbWV0ZXJpRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTFmRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTFmdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0xaUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0xaXZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtMmZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtMmZ2RVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTJpRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTJpdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0zZkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0zZnZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtM2lFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtM2l2RVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTRmRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTRmdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm00aUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm00aXZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2RVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFB1c2hHcm91cE1hcmtlckVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUmVhZEJ1ZmZlck5WOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xSZWFkblBpeGVsc0VYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQU5HTEU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFJlc29sdmVNdWx0aXNhbXBsZUZyYW1lYnVmZmVyQVBQTEU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleFN0b3JhZ2UxREVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4U3RvcmFnZTJERVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhTdG9yYWdlM0RFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleHR1cmVTdG9yYWdlMURFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleHR1cmVTdG9yYWdlMkRFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleHR1cmVTdG9yYWdlM0RFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVzZVByb2dyYW1TdGFnZXNFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsR2V0RGlzcGxheTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbEluaXRpYWxpemU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xUZXJtaW5hdGU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xHZXRDb25maWdzOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsQ2hvb3NlQ29uZmlnOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsR2V0Q29uZmlnQXR0cmliOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsQ3JlYXRlV2luZG93U3VyZmFjZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbENyZWF0ZVBpeG1hcFN1cmZhY2U7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbERlc3Ryb3lTdXJmYWNlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsUXVlcnlTdXJmYWNlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsQ3JlYXRlQ29udGV4dDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbERlc3Ryb3lDb250ZXh0OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsTWFrZUN1cnJlbnQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xHZXRDdXJyZW50Q29udGV4dDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbEdldEN1cnJlbnRTdXJmYWNlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsR2V0Q3VycmVudERpc3BsYXk7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xRdWVyeUNvbnRleHQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xXYWl0R0w7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xXYWl0TmF0aXZlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsU3dhcEJ1ZmZlcnM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xDb3B5QnVmZmVyczsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbEdldEVycm9yOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsUXVlcnlTdHJpbmc7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xHZXRQcm9jQWRkcmVzczsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbFN1cmZhY2VBdHRyaWI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xCaW5kVGV4SW1hZ2U7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xSZWxlYXNlVGV4SW1hZ2U7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xTd2FwSW50ZXJ2YWw7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xCaW5kQVBJOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsUXVlcnlBUEk7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xXYWl0Q2xpZW50OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsUmVsZWFzZVRocmVhZDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsTG9ja1N1cmZhY2VLSFI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xVbmxvY2tTdXJmYWNlS0hSOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsQ3JlYXRlSW1hZ2VLSFI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xEZXN0cm95SW1hZ2VLSFI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xDcmVhdGVTeW5jS0hSOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsRGVzdHJveVN5bmNLSFI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xDbGllbnRXYWl0U3luY0tIUjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbEdldFN5bmNBdHRyaWJLSFI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbEdldFJlbmRlckJ1ZmZlckFORFJPSUQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xHZXRTeXN0ZW1UaW1lRnJlcXVlbmN5TlY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xHZXRTeXN0ZW1UaW1lTlY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjppbnZhbGlkOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OkZ1bmN0aW9uX01JTjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OkZ1bmN0aW9uX01BWDsKLWNvbnN0IGludCBHTE1lc3NhZ2U6OkZ1bmN0aW9uX0FSUkFZU0laRTsKLSNlbmRpZiAgLy8gX01TQ19WRVIKLWJvb2wgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKLSAgc3dpdGNoKHZhbHVlKSB7Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6Ci0gICAgY2FzZSA0OgotICAgIGNhc2UgNToKLSAgICBjYXNlIDY6Ci0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0jaWZuZGVmIF9NU0NfVkVSCi1jb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSBHTE1lc3NhZ2VfRGF0YVR5cGU6OlZPSUQ7Ci1jb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSBHTE1lc3NhZ2VfRGF0YVR5cGU6OkNIQVI7Ci1jb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSBHTE1lc3NhZ2VfRGF0YVR5cGU6OkJZVEU7Ci1jb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSBHTE1lc3NhZ2VfRGF0YVR5cGU6OklOVDsKLWNvbnN0IEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlIEdMTWVzc2FnZV9EYXRhVHlwZTo6RkxPQVQ7Ci1jb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSBHTE1lc3NhZ2VfRGF0YVR5cGU6OkJPT0w7Ci1jb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSBHTE1lc3NhZ2VfRGF0YVR5cGU6OkVOVU07Ci1jb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSBHTE1lc3NhZ2VfRGF0YVR5cGU6OlR5cGVfTUlOOwotY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgR0xNZXNzYWdlX0RhdGFUeXBlOjpUeXBlX01BWDsKLWNvbnN0IGludCBHTE1lc3NhZ2VfRGF0YVR5cGU6OlR5cGVfQVJSQVlTSVpFOwotI2VuZGlmICAvLyBfTVNDX1ZFUgotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IEdMTWVzc2FnZV9EYXRhVHlwZTo6a1R5cGVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmtJc0FycmF5RmllbGROdW1iZXI7Ci1jb25zdCBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlOjprSW50VmFsdWVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmtGbG9hdFZhbHVlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlOjprQ2hhclZhbHVlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlOjprUmF3Qnl0ZXNGaWVsZE51bWJlcjsKLWNvbnN0IGludCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmtCb29sVmFsdWVGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLUdMTWVzc2FnZV9EYXRhVHlwZTo6R0xNZXNzYWdlX0RhdGFUeXBlKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci19Ci0KLUdMTWVzc2FnZV9EYXRhVHlwZTo6R0xNZXNzYWdlX0RhdGFUeXBlKGNvbnN0IEdMTWVzc2FnZV9EYXRhVHlwZSYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICB0eXBlXyA9IDE7Ci0gIGlzYXJyYXlfID0gZmFsc2U7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLUdMTWVzc2FnZV9EYXRhVHlwZTo6fkdMTWVzc2FnZV9EYXRhVHlwZSgpIHsKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGUmIEdMTWVzc2FnZV9EYXRhVHlwZTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ2x0cmFjZV8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1HTE1lc3NhZ2VfRGF0YVR5cGUqIEdMTWVzc2FnZV9EYXRhVHlwZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1HTE1lc3NhZ2VfRGF0YVR5cGUqIEdMTWVzc2FnZV9EYXRhVHlwZTo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IEdMTWVzc2FnZV9EYXRhVHlwZTsKLX0KLQotdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIHR5cGVfID0gMTsKLSAgICBpc2FycmF5XyA9IGZhbHNlOwotICB9Ci0gIGludHZhbHVlXy5DbGVhcigpOwotICBmbG9hdHZhbHVlXy5DbGVhcigpOwotICBjaGFydmFsdWVfLkNsZWFyKCk7Ci0gIHJhd2J5dGVzXy5DbGVhcigpOwotICBib29sdmFsdWVfLkNsZWFyKCk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLWJvb2wgR0xNZXNzYWdlX0RhdGFUeXBlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXF1aXJlZCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZS5UeXBlIHR5cGUgPSAxIFtkZWZhdWx0ID0gVk9JRF07Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKLSAgICAgICAgICBpZiAoOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9Jc1ZhbGlkKHZhbHVlKSkgewotICAgICAgICAgICAgc2V0X3R5cGUoc3RhdGljX2Nhc3Q8IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgPih2YWx1ZSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9pc0FycmF5OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gcmVxdWlyZWQgYm9vbCBpc0FycmF5ID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgIHBhcnNlX2lzQXJyYXk6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZpc2FycmF5XykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9pbnRWYWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcGVhdGVkIGludDMyIGludFZhbHVlID0gMzsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgIHBhcnNlX2ludFZhbHVlOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIDEsIDI0LCBpbnB1dCwgdGhpcy0+bXV0YWJsZV9pbnR2YWx1ZSgpKSkpOwotICAgICAgICB9IGVsc2UgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpCi0gICAgICAgICAgICAgICAgICAgPT0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgICAgICAgICAgICAgICAgIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkUHJpbWl0aXZlTm9JbmxpbmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9pbnR2YWx1ZSgpKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjQpKSBnb3RvIHBhcnNlX2ludFZhbHVlOwotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNykpIGdvdG8gcGFyc2VfZmxvYXRWYWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcGVhdGVkIGZsb2F0IGZsb2F0VmFsdWUgPSA0OwotICAgICAgY2FzZSA0OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzIpIHsKLSAgICAgICAgIHBhcnNlX2Zsb2F0VmFsdWU6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFJlcGVhdGVkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGZsb2F0LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GTE9BVD4oCi0gICAgICAgICAgICAgICAgIDEsIDM3LCBpbnB1dCwgdGhpcy0+bXV0YWJsZV9mbG9hdHZhbHVlKCkpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykKLSAgICAgICAgICAgICAgICAgICA9PSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICAgICAgICAgICAgICAgICAgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZTwKLSAgICAgICAgICAgICAgICAgICBmbG9hdCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRkxPQVQ+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9mbG9hdHZhbHVlKCkpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNykpIGdvdG8gcGFyc2VfZmxvYXRWYWx1ZTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2NoYXJWYWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcGVhdGVkIGJ5dGVzIGNoYXJWYWx1ZSA9IDU7Ci0gICAgICBjYXNlIDU6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2VfY2hhclZhbHVlOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZEJ5dGVzKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5hZGRfY2hhcnZhbHVlKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9jaGFyVmFsdWU7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDUwKSkgZ290byBwYXJzZV9yYXdCeXRlczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcGVhdGVkIGJ5dGVzIHJhd0J5dGVzID0gNjsKLSAgICAgIGNhc2UgNjogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9yYXdCeXRlczoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRCeXRlcygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+YWRkX3Jhd2J5dGVzKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDUwKSkgZ290byBwYXJzZV9yYXdCeXRlczsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTYpKSBnb3RvIHBhcnNlX2Jvb2xWYWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcGVhdGVkIGJvb2wgYm9vbFZhbHVlID0gNzsKLSAgICAgIGNhc2UgNzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgIHBhcnNlX2Jvb2xWYWx1ZToKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCi0gICAgICAgICAgICAgICAgIDEsIDU2LCBpbnB1dCwgdGhpcy0+bXV0YWJsZV9ib29sdmFsdWUoKSkpKTsKLSAgICAgICAgfSBlbHNlIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKQotICAgICAgICAgICAgICAgICAgID09IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgICAgICAgICAgICAgICAgICBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZU5vSW5saW5lPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9ib29sdmFsdWUoKSkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU2KSkgZ290byBwYXJzZV9ib29sVmFsdWU7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZS5UeXBlIHR5cGUgPSAxIFtkZWZhdWx0ID0gVk9JRF07Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oCi0gICAgICAxLCB0aGlzLT50eXBlKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIHJlcXVpcmVkIGJvb2wgaXNBcnJheSA9IDIgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChfaGFzX2JpdCgxKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMiwgdGhpcy0+aXNhcnJheSgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyByZXBlYXRlZCBpbnQzMiBpbnRWYWx1ZSA9IDM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+aW50dmFsdWVfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigKLSAgICAgIDMsIHRoaXMtPmludHZhbHVlKGkpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyByZXBlYXRlZCBmbG9hdCBmbG9hdFZhbHVlID0gNDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5mbG9hdHZhbHVlX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRmxvYXQoCi0gICAgICA0LCB0aGlzLT5mbG9hdHZhbHVlKGkpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyByZXBlYXRlZCBieXRlcyBjaGFyVmFsdWUgPSA1OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmNoYXJ2YWx1ZV9zaXplKCk7IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzKAotICAgICAgNSwgdGhpcy0+Y2hhcnZhbHVlKGkpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyByZXBlYXRlZCBieXRlcyByYXdCeXRlcyA9IDY7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cmF3Ynl0ZXNfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCeXRlcygKLSAgICAgIDYsIHRoaXMtPnJhd2J5dGVzKGkpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyByZXBlYXRlZCBib29sIGJvb2xWYWx1ZSA9IDc7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+Ym9vbHZhbHVlX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgKLSAgICAgIDcsIHRoaXMtPmJvb2x2YWx1ZShpKSwgb3V0cHV0KTsKLSAgfQotICAKLX0KLQotaW50IEdMTWVzc2FnZV9EYXRhVHlwZTo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gcmVxdWlyZWQgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRGF0YVR5cGUuVHlwZSB0eXBlID0gMSBbZGVmYXVsdCA9IFZPSURdOwotICAgIGlmIChoYXNfdHlwZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+dHlwZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gcmVxdWlyZWQgYm9vbCBpc0FycmF5ID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICBpZiAoaGFzX2lzYXJyYXkoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgLy8gcmVwZWF0ZWQgaW50MzIgaW50VmFsdWUgPSAzOwotICB7Ci0gICAgaW50IGRhdGFfc2l6ZSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5pbnR2YWx1ZV9zaXplKCk7IGkrKykgewotICAgICAgZGF0YV9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgICAgSW50MzJTaXplKHRoaXMtPmludHZhbHVlKGkpKTsKLSAgICB9Ci0gICAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+aW50dmFsdWVfc2l6ZSgpICsgZGF0YV9zaXplOwotICB9Ci0gIAotICAvLyByZXBlYXRlZCBmbG9hdCBmbG9hdFZhbHVlID0gNDsKLSAgewotICAgIGludCBkYXRhX3NpemUgPSAwOwotICAgIGRhdGFfc2l6ZSA9IDQgKiB0aGlzLT5mbG9hdHZhbHVlX3NpemUoKTsKLSAgICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5mbG9hdHZhbHVlX3NpemUoKSArIGRhdGFfc2l6ZTsKLSAgfQotICAKLSAgLy8gcmVwZWF0ZWQgYnl0ZXMgY2hhclZhbHVlID0gNTsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+Y2hhcnZhbHVlX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5jaGFydmFsdWVfc2l6ZSgpOyBpKyspIHsKLSAgICB0b3RhbF9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpCeXRlc1NpemUoCi0gICAgICB0aGlzLT5jaGFydmFsdWUoaSkpOwotICB9Ci0gIAotICAvLyByZXBlYXRlZCBieXRlcyByYXdCeXRlcyA9IDY7Ci0gIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPnJhd2J5dGVzX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5yYXdieXRlc19zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkJ5dGVzU2l6ZSgKLSAgICAgIHRoaXMtPnJhd2J5dGVzKGkpKTsKLSAgfQotICAKLSAgLy8gcmVwZWF0ZWQgYm9vbCBib29sVmFsdWUgPSA3OwotICB7Ci0gICAgaW50IGRhdGFfc2l6ZSA9IDA7Ci0gICAgZGF0YV9zaXplID0gMSAqIHRoaXMtPmJvb2x2YWx1ZV9zaXplKCk7Ci0gICAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+Ym9vbHZhbHVlX3NpemUoKSArIGRhdGFfc2l6ZTsKLSAgfQotICAKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgKLSAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlJiBmcm9tKSB7Ci0gIE1lcmdlRnJvbSgqOjpnb29nbGU6OnByb3RvYnVmOjpkb3duX2Nhc3Q8Y29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlKj4oJmZyb20pKTsKLX0KLQotdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6Ok1lcmdlRnJvbShjb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGUmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgaW50dmFsdWVfLk1lcmdlRnJvbShmcm9tLmludHZhbHVlXyk7Ci0gIGZsb2F0dmFsdWVfLk1lcmdlRnJvbShmcm9tLmZsb2F0dmFsdWVfKTsKLSAgY2hhcnZhbHVlXy5NZXJnZUZyb20oZnJvbS5jaGFydmFsdWVfKTsKLSAgcmF3Ynl0ZXNfLk1lcmdlRnJvbShmcm9tLnJhd2J5dGVzXyk7Ci0gIGJvb2x2YWx1ZV8uTWVyZ2VGcm9tKGZyb20uYm9vbHZhbHVlXyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5faGFzX2JpdCgwKSkgewotICAgICAgc2V0X3R5cGUoZnJvbS50eXBlKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCgxKSkgewotICAgICAgc2V0X2lzYXJyYXkoZnJvbS5pc2FycmF5KCkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6Q29weUZyb20oY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotYm9vbCBHTE1lc3NhZ2VfRGF0YVR5cGU6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIGlmICgoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDMpICE9IDB4MDAwMDAwMDMpIHJldHVybiBmYWxzZTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6U3dhcChHTE1lc3NhZ2VfRGF0YVR5cGUqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RkOjpzd2FwKHR5cGVfLCBvdGhlci0+dHlwZV8pOwotICAgIHN0ZDo6c3dhcChpc2FycmF5Xywgb3RoZXItPmlzYXJyYXlfKTsKLSAgICBpbnR2YWx1ZV8uU3dhcCgmb3RoZXItPmludHZhbHVlXyk7Ci0gICAgZmxvYXR2YWx1ZV8uU3dhcCgmb3RoZXItPmZsb2F0dmFsdWVfKTsKLSAgICBjaGFydmFsdWVfLlN3YXAoJm90aGVyLT5jaGFydmFsdWVfKTsKLSAgICByYXdieXRlc18uU3dhcCgmb3RoZXItPnJhd2J5dGVzXyk7Ci0gICAgYm9vbHZhbHVlXy5Td2FwKCZvdGhlci0+Ym9vbHZhbHVlXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9Ci19Ci0KLTo6c3RkOjpzdHJpbmcgR0xNZXNzYWdlX0RhdGFUeXBlOjpHZXRUeXBlTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJhbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlIjsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IGludCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmtXaWR0aEZpZWxkTnVtYmVyOwotY29uc3QgaW50IEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6a0hlaWdodEZpZWxkTnVtYmVyOwotY29uc3QgaW50IEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6a0NvbnRlbnRzRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgotCi1HTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OkdMTWVzc2FnZV9GcmFtZUJ1ZmZlcigpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotfQotCi12b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1HTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OkdMTWVzc2FnZV9GcmFtZUJ1ZmZlcihjb25zdCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXImIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgd2lkdGhfID0gMDsKLSAgaGVpZ2h0XyA9IDA7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLUdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6fkdMTWVzc2FnZV9GcmFtZUJ1ZmZlcigpIHsKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXImIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ2x0cmFjZV8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1HTE1lc3NhZ2VfRnJhbWVCdWZmZXIqIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1HTE1lc3NhZ2VfRnJhbWVCdWZmZXIqIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjsKLX0KLQotdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIHdpZHRoXyA9IDA7Ci0gICAgaGVpZ2h0XyA9IDA7Ci0gIH0KLSAgY29udGVudHNfLkNsZWFyKCk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLWJvb2wgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXF1aXJlZCBpbnQzMiB3aWR0aCA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmd2lkdGhfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTYpKSBnb3RvIHBhcnNlX2hlaWdodDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcXVpcmVkIGludDMyIGhlaWdodCA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9oZWlnaHQ6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmaGVpZ2h0XykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9jb250ZW50czsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcGVhdGVkIGJ5dGVzIGNvbnRlbnRzID0gMzsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9jb250ZW50czoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRCeXRlcygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+YWRkX2NvbnRlbnRzKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9jb250ZW50czsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIHJlcXVpcmVkIGludDMyIHdpZHRoID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMSwgdGhpcy0+d2lkdGgoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gcmVxdWlyZWQgaW50MzIgaGVpZ2h0ID0gMjsKLSAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMiwgdGhpcy0+aGVpZ2h0KCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIHJlcGVhdGVkIGJ5dGVzIGNvbnRlbnRzID0gMzsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5jb250ZW50c19zaXplKCk7IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzKAotICAgICAgMywgdGhpcy0+Y29udGVudHMoaSksIG91dHB1dCk7Ci0gIH0KLSAgCi19Ci0KLWludCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OkJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIC8vIHJlcXVpcmVkIGludDMyIHdpZHRoID0gMTsKLSAgICBpZiAoaGFzX3dpZHRoKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+d2lkdGgoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIHJlcXVpcmVkIGludDMyIGhlaWdodCA9IDI7Ci0gICAgaWYgKGhhc19oZWlnaHQoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5oZWlnaHQoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIC8vIHJlcGVhdGVkIGJ5dGVzIGNvbnRlbnRzID0gMzsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+Y29udGVudHNfc2l6ZSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmNvbnRlbnRzX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Qnl0ZXNTaXplKAotICAgICAgdGhpcy0+Y29udGVudHMoaSkpOwotICB9Ci0gIAotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKAotICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIGZyb20pIHsKLSAgTWVyZ2VGcm9tKCo6Omdvb2dsZTo6cHJvdG9idWY6OmRvd25fY2FzdDxjb25zdCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXIqPigmZnJvbSkpOwotfQotCi12b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6TWVyZ2VGcm9tKGNvbnN0IEdMTWVzc2FnZV9GcmFtZUJ1ZmZlciYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb250ZW50c18uTWVyZ2VGcm9tKGZyb20uY29udGVudHNfKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLl9oYXNfYml0KDApKSB7Ci0gICAgICBzZXRfd2lkdGgoZnJvbS53aWR0aCgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMSkpIHsKLSAgICAgIHNldF9oZWlnaHQoZnJvbS5oZWlnaHQoKSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpDb3B5RnJvbShjb25zdCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXImIGZyb20pIHsKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgaWYgKChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMykgIT0gMHgwMDAwMDAwMykgcmV0dXJuIGZhbHNlOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpTd2FwKEdMTWVzc2FnZV9GcmFtZUJ1ZmZlciogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAod2lkdGhfLCBvdGhlci0+d2lkdGhfKTsKLSAgICBzdGQ6OnN3YXAoaGVpZ2h0Xywgb3RoZXItPmhlaWdodF8pOwotICAgIGNvbnRlbnRzXy5Td2FwKCZvdGhlci0+Y29udGVudHNfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KLX0KLQotOjpzdGQ6OnN0cmluZyBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OkdldFR5cGVOYW1lKCkgY29uc3QgewotICByZXR1cm4gImFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRnJhbWVCdWZmZXIiOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgaW50IEdMTWVzc2FnZTo6a0NvbnRleHRJZEZpZWxkTnVtYmVyOwotY29uc3QgaW50IEdMTWVzc2FnZTo6a1N0YXJ0VGltZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IEdMTWVzc2FnZTo6a0R1cmF0aW9uRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgR0xNZXNzYWdlOjprRnVuY3Rpb25GaWVsZE51bWJlcjsKLWNvbnN0IGludCBHTE1lc3NhZ2U6OmtBcmdzRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgR0xNZXNzYWdlOjprUmV0dXJuVmFsdWVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBHTE1lc3NhZ2U6OmtGYkZpZWxkTnVtYmVyOwotY29uc3QgaW50IEdMTWVzc2FnZTo6a1RocmVhZHRpbWVGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLUdMTWVzc2FnZTo6R0xNZXNzYWdlKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCkgewotICBTaGFyZWRDdG9yKCk7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci0gIHJldHVybnZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlKj4oJjo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICBmYl8gPSBjb25zdF9jYXN0PCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GcmFtZUJ1ZmZlcio+KCY6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLX0KLQotR0xNZXNzYWdlOjpHTE1lc3NhZ2UoY29uc3QgR0xNZXNzYWdlJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIEdMTWVzc2FnZTo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIGNvbnRleHRfaWRfID0gMDsKLSAgc3RhcnRfdGltZV8gPSBHT09HTEVfTE9OR0xPTkcoMCk7Ci0gIGR1cmF0aW9uXyA9IDA7Ci0gIGZ1bmN0aW9uXyA9IDMwMDA7Ci0gIHJldHVybnZhbHVlXyA9IE5VTEw7Ci0gIGZiXyA9IE5VTEw7Ci0gIHRocmVhZHRpbWVfID0gMDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotR0xNZXNzYWdlOjp+R0xNZXNzYWdlKCkgewotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlOjpTaGFyZWREdG9yKCkgewotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICAgIGRlbGV0ZSByZXR1cm52YWx1ZV87Ci0gICAgZGVsZXRlIGZiXzsKLSAgfQotfQotCi12b2lkIEdMTWVzc2FnZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCBHTE1lc3NhZ2UmIEdMTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ2x0cmFjZV8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1HTE1lc3NhZ2UqIEdMTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1HTE1lc3NhZ2UqIEdMTWVzc2FnZTo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IEdMTWVzc2FnZTsKLX0KLQotdm9pZCBHTE1lc3NhZ2U6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGNvbnRleHRfaWRfID0gMDsKLSAgICBzdGFydF90aW1lXyA9IEdPT0dMRV9MT05HTE9ORygwKTsKLSAgICBkdXJhdGlvbl8gPSAwOwotICAgIGZ1bmN0aW9uXyA9IDMwMDA7Ci0gICAgaWYgKF9oYXNfYml0KDUpKSB7Ci0gICAgICBpZiAocmV0dXJudmFsdWVfICE9IE5VTEwpIHJldHVybnZhbHVlXy0+OjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGU6OkNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChfaGFzX2JpdCg2KSkgewotICAgICAgaWYgKGZiXyAhPSBOVUxMKSBmYl8tPjo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpDbGVhcigpOwotICAgIH0KLSAgICB0aHJlYWR0aW1lXyA9IDA7Ci0gIH0KLSAgYXJnc18uQ2xlYXIoKTsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotYm9vbCBHTE1lc3NhZ2U6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgewotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIHJlcXVpcmVkIGludDMyIGNvbnRleHRfaWQgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmNvbnRleHRfaWRfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTYpKSBnb3RvIHBhcnNlX3N0YXJ0X3RpbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyByZXF1aXJlZCBpbnQ2NCBzdGFydF90aW1lID0gMjsKLSAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgIHBhcnNlX3N0YXJ0X3RpbWU6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQ2ND4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmc3RhcnRfdGltZV8pKSk7Ci0gICAgICAgICAgX3NldF9iaXQoMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNCkpIGdvdG8gcGFyc2VfZHVyYXRpb247Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyByZXF1aXJlZCBpbnQzMiBkdXJhdGlvbiA9IDM7Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9kdXJhdGlvbjoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZkdXJhdGlvbl8pKSk7Ci0gICAgICAgICAgX3NldF9iaXQoMik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzMikpIGdvdG8gcGFyc2VfZnVuY3Rpb247Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyByZXF1aXJlZCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5GdW5jdGlvbiBmdW5jdGlvbiA9IDQgW2RlZmF1bHQgPSBpbnZhbGlkXTsKLSAgICAgIGNhc2UgNDogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgIHBhcnNlX2Z1bmN0aW9uOgotICAgICAgICAgIGludCB2YWx1ZTsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGludCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSk7Ci0gICAgICAgICAgaWYgKDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0Z1bmN0aW9uX0lzVmFsaWQodmFsdWUpKSB7Ci0gICAgICAgICAgICBzZXRfZnVuY3Rpb24oc3RhdGljX2Nhc3Q8IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0Z1bmN0aW9uID4odmFsdWUpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MikpIGdvdG8gcGFyc2VfYXJnczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcGVhdGVkIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlIGFyZ3MgPSA1OwotICAgICAgY2FzZSA1OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgIHBhcnNlX2FyZ3M6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKLSAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX2FyZ3MoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2FyZ3M7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDUwKSkgZ290byBwYXJzZV9yZXR1cm5WYWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlIHJldHVyblZhbHVlID0gNjsKLSAgICAgIGNhc2UgNjogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9yZXR1cm5WYWx1ZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAotICAgICAgICAgICAgICAgaW5wdXQsIG11dGFibGVfcmV0dXJudmFsdWUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTgpKSBnb3RvIHBhcnNlX2ZiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRnJhbWVCdWZmZXIgZmIgPSA3OwotICAgICAgY2FzZSA3OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgIHBhcnNlX2ZiOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9mYigpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg2NCkpIGdvdG8gcGFyc2VfdGhyZWFkdGltZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIGludDMyIHRocmVhZHRpbWUgPSA4OwotICAgICAgY2FzZSA4OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgcGFyc2VfdGhyZWFkdGltZToKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZ0aHJlYWR0aW1lXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCg3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgR0xNZXNzYWdlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCBpbnQzMiBjb250ZXh0X2lkID0gMTsKLSAgaWYgKF9oYXNfYml0KDApKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMSwgdGhpcy0+Y29udGV4dF9pZCgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyByZXF1aXJlZCBpbnQ2NCBzdGFydF90aW1lID0gMjsKLSAgaWYgKF9oYXNfYml0KDEpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjQoMiwgdGhpcy0+c3RhcnRfdGltZSgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyByZXF1aXJlZCBpbnQzMiBkdXJhdGlvbiA9IDM7Ci0gIGlmIChfaGFzX2JpdCgyKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDMsIHRoaXMtPmR1cmF0aW9uKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIHJlcXVpcmVkIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkZ1bmN0aW9uIGZ1bmN0aW9uID0gNCBbZGVmYXVsdCA9IGludmFsaWRdOwotICBpZiAoX2hhc19iaXQoMykpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAotICAgICAgNCwgdGhpcy0+ZnVuY3Rpb24oKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gcmVwZWF0ZWQgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRGF0YVR5cGUgYXJncyA9IDU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+YXJnc19zaXplKCk7IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2UoCi0gICAgICA1LCB0aGlzLT5hcmdzKGkpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZSByZXR1cm5WYWx1ZSA9IDY7Ci0gIGlmIChfaGFzX2JpdCg1KSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2UoCi0gICAgICA2LCB0aGlzLT5yZXR1cm52YWx1ZSgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5GcmFtZUJ1ZmZlciBmYiA9IDc7Ci0gIGlmIChfaGFzX2JpdCg2KSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2UoCi0gICAgICA3LCB0aGlzLT5mYigpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiB0aHJlYWR0aW1lID0gODsKLSAgaWYgKF9oYXNfYml0KDcpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoOCwgdGhpcy0+dGhyZWFkdGltZSgpLCBvdXRwdXQpOwotICB9Ci0gIAotfQotCi1pbnQgR0xNZXNzYWdlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICAvLyByZXF1aXJlZCBpbnQzMiBjb250ZXh0X2lkID0gMTsKLSAgICBpZiAoaGFzX2NvbnRleHRfaWQoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5jb250ZXh0X2lkKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyByZXF1aXJlZCBpbnQ2NCBzdGFydF90aW1lID0gMjsKLSAgICBpZiAoaGFzX3N0YXJ0X3RpbWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDY0U2l6ZSgKLSAgICAgICAgICB0aGlzLT5zdGFydF90aW1lKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyByZXF1aXJlZCBpbnQzMiBkdXJhdGlvbiA9IDM7Ci0gICAgaWYgKGhhc19kdXJhdGlvbigpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPmR1cmF0aW9uKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyByZXF1aXJlZCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5GdW5jdGlvbiBmdW5jdGlvbiA9IDQgW2RlZmF1bHQgPSBpbnZhbGlkXTsKLSAgICBpZiAoaGFzX2Z1bmN0aW9uKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5mdW5jdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRGF0YVR5cGUgcmV0dXJuVmFsdWUgPSA2OwotICAgIGlmIChoYXNfcmV0dXJudmFsdWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICAgIHRoaXMtPnJldHVybnZhbHVlKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5GcmFtZUJ1ZmZlciBmYiA9IDc7Ci0gICAgaWYgKGhhc19mYigpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgICAgdGhpcy0+ZmIoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIGludDMyIHRocmVhZHRpbWUgPSA4OwotICAgIGlmIChoYXNfdGhyZWFkdGltZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPnRocmVhZHRpbWUoKSk7Ci0gICAgfQotICAgIAotICB9Ci0gIC8vIHJlcGVhdGVkIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlIGFyZ3MgPSA1OwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5hcmdzX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5hcmdzX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICB0aGlzLT5hcmdzKGkpKTsKLSAgfQotICAKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBHTE1lc3NhZ2U6OkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgKLSAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlJiBmcm9tKSB7Ci0gIE1lcmdlRnJvbSgqOjpnb29nbGU6OnByb3RvYnVmOjpkb3duX2Nhc3Q8Y29uc3QgR0xNZXNzYWdlKj4oJmZyb20pKTsKLX0KLQotdm9pZCBHTE1lc3NhZ2U6Ok1lcmdlRnJvbShjb25zdCBHTE1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgYXJnc18uTWVyZ2VGcm9tKGZyb20uYXJnc18pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIHNldF9jb250ZXh0X2lkKGZyb20uY29udGV4dF9pZCgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMSkpIHsKLSAgICAgIHNldF9zdGFydF90aW1lKGZyb20uc3RhcnRfdGltZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMikpIHsKLSAgICAgIHNldF9kdXJhdGlvbihmcm9tLmR1cmF0aW9uKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCgzKSkgewotICAgICAgc2V0X2Z1bmN0aW9uKGZyb20uZnVuY3Rpb24oKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDUpKSB7Ci0gICAgICBtdXRhYmxlX3JldHVybnZhbHVlKCktPjo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlOjpNZXJnZUZyb20oZnJvbS5yZXR1cm52YWx1ZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoNikpIHsKLSAgICAgIG11dGFibGVfZmIoKS0+OjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6Ok1lcmdlRnJvbShmcm9tLmZiKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCg3KSkgewotICAgICAgc2V0X3RocmVhZHRpbWUoZnJvbS50aHJlYWR0aW1lKCkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIEdMTWVzc2FnZTo6Q29weUZyb20oY29uc3QgR0xNZXNzYWdlJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotYm9vbCBHTE1lc3NhZ2U6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIGlmICgoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMGYpICE9IDB4MDAwMDAwMGYpIHJldHVybiBmYWxzZTsKLSAgCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnc19zaXplKCk7IGkrKykgewotICAgIGlmICghdGhpcy0+YXJncyhpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoaGFzX3JldHVybnZhbHVlKCkpIHsKLSAgICBpZiAoIXRoaXMtPnJldHVybnZhbHVlKCkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGhhc19mYigpKSB7Ci0gICAgaWYgKCF0aGlzLT5mYigpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEdMTWVzc2FnZTo6U3dhcChHTE1lc3NhZ2UqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RkOjpzd2FwKGNvbnRleHRfaWRfLCBvdGhlci0+Y29udGV4dF9pZF8pOwotICAgIHN0ZDo6c3dhcChzdGFydF90aW1lXywgb3RoZXItPnN0YXJ0X3RpbWVfKTsKLSAgICBzdGQ6OnN3YXAoZHVyYXRpb25fLCBvdGhlci0+ZHVyYXRpb25fKTsKLSAgICBzdGQ6OnN3YXAoZnVuY3Rpb25fLCBvdGhlci0+ZnVuY3Rpb25fKTsKLSAgICBhcmdzXy5Td2FwKCZvdGhlci0+YXJnc18pOwotICAgIHN0ZDo6c3dhcChyZXR1cm52YWx1ZV8sIG90aGVyLT5yZXR1cm52YWx1ZV8pOwotICAgIHN0ZDo6c3dhcChmYl8sIG90aGVyLT5mYl8pOwotICAgIHN0ZDo6c3dhcCh0aHJlYWR0aW1lXywgb3RoZXItPnRocmVhZHRpbWVfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KLX0KLQotOjpzdGQ6OnN0cmluZyBHTE1lc3NhZ2U6OkdldFR5cGVOYW1lKCkgY29uc3QgewotICByZXR1cm4gImFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UiOwotfQotCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCi0KLX0gIC8vIG5hbWVzcGFjZSBnbHRyYWNlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZS5wYi5oIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZS5wYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTAxYmU3Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2UucGIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4OTUgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ2x0cmFjZS5wcm90bwotCi0jaWZuZGVmIFBST1RPQlVGX2dsdHJhY2VfMmVwcm90b19fSU5DTFVERUQKLSNkZWZpbmUgUFJPVE9CVUZfZ2x0cmFjZV8yZXByb3RvX19JTkNMVURFRAotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotCi0jaWYgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gPCAyMDAzMDAwCi0jZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcwotI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuICBQbGVhc2UgdXBkYXRlCi0jZXJyb3IgeW91ciBoZWFkZXJzLgotI2VuZGlmCi0jaWYgMjAwMzAwMCA8IEdPT0dMRV9QUk9UT0JVRl9NSU5fUFJPVE9DX1ZFUlNJT04KLSNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhbiBvbGRlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcwotI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuICBQbGVhc2UKLSNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuCi0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGdsdHJhY2UgewotCi0vLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuCi12b2lkICBwcm90b2J1Zl9BZGREZXNjX2dsdHJhY2VfMmVwcm90bygpOwotdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dsdHJhY2VfMmVwcm90bygpOwotdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ2x0cmFjZV8yZXByb3RvKCk7Ci0KLWNsYXNzIEdMTWVzc2FnZTsKLWNsYXNzIEdMTWVzc2FnZV9EYXRhVHlwZTsKLWNsYXNzIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjsKLQotZW51bSBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSB7Ci0gIEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX1ZPSUQgPSAxLAotICBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9DSEFSID0gMiwKLSAgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfQllURSA9IDMsCi0gIEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0lOVCA9IDQsCi0gIEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0ZMT0FUID0gNSwKLSAgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfQk9PTCA9IDYsCi0gIEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0VOVU0gPSA3Ci19OwotYm9vbCBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSk7Ci1jb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9UeXBlX01JTiA9IEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX1ZPSUQ7Ci1jb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9UeXBlX01BWCA9IEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0VOVU07Ci1jb25zdCBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfVHlwZV9BUlJBWVNJWkUgPSBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9UeXBlX01BWCArIDE7Ci0KLWVudW0gR0xNZXNzYWdlX0Z1bmN0aW9uIHsKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQWN0aXZlVGV4dHVyZSA9IDAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEFscGhhRnVuYyA9IDEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEFscGhhRnVuY3ggPSAyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xBbHBoYUZ1bmN4T0VTID0gMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQXR0YWNoU2hhZGVyID0gNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmVnaW5QZXJmTW9uaXRvckFNRCA9IDUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRBdHRyaWJMb2NhdGlvbiA9IDYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRCdWZmZXIgPSA3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kRnJhbWVidWZmZXIgPSA4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kRnJhbWVidWZmZXJPRVMgPSA5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kUmVuZGVyYnVmZmVyID0gMTAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRSZW5kZXJidWZmZXJPRVMgPSAxMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmluZFRleHR1cmUgPSAxMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmluZFZlcnRleEFycmF5T0VTID0gMTMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsZW5kQ29sb3IgPSAxNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmxlbmRFcXVhdGlvbiA9IDE1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZEVxdWF0aW9uT0VTID0gMTYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSA9IDE3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMgPSAxOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmxlbmRGdW5jID0gMTksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsZW5kRnVuY1NlcGFyYXRlID0gMjAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsZW5kRnVuY1NlcGFyYXRlT0VTID0gMjEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJ1ZmZlckRhdGEgPSAyMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQnVmZmVyU3ViRGF0YSA9IDIzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzID0gMjQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgPSAyNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xlYXJDb2xvciA9IDI2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckNvbG9yeCA9IDI3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckNvbG9yeE9FUyA9IDI4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckRlcHRoZiA9IDI5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckRlcHRoZk9FUyA9IDMwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckRlcHRoeCA9IDMxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckRlcHRoeE9FUyA9IDMyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhciA9IDMzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhclN0ZW5jaWwgPSAzNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xpZW50QWN0aXZlVGV4dHVyZSA9IDM1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGlwUGxhbmVmID0gMzYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsaXBQbGFuZWZJTUcgPSAzNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xpcFBsYW5lZk9FUyA9IDM4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGlwUGxhbmV4ID0gMzksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsaXBQbGFuZXhJTUcgPSA0MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xpcFBsYW5leE9FUyA9IDQxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb2xvcjRmID0gNDIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbG9yNHViID0gNDMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbG9yNHggPSA0NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29sb3I0eE9FUyA9IDQ1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb2xvck1hc2sgPSA0NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29sb3JQb2ludGVyID0gNDcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbXBpbGVTaGFkZXIgPSA0OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29tcHJlc3NlZFRleEltYWdlMkQgPSA0OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29tcHJlc3NlZFRleEltYWdlM0RPRVMgPSA1MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgPSA1MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVMgPSA1MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29weVRleEltYWdlMkQgPSA1MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29weVRleFN1YkltYWdlMkQgPSA1NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29weVRleFN1YkltYWdlM0RPRVMgPSA1NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ292ZXJhZ2VNYXNrTlYgPSA1NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ292ZXJhZ2VPcGVyYXRpb25OViA9IDU3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDcmVhdGVQcm9ncmFtID0gNTgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENyZWF0ZVNoYWRlciA9IDU5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDdWxsRmFjZSA9IDYwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyA9IDYxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVCdWZmZXJzID0gNjIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZUZlbmNlc05WID0gNjMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZUZyYW1lYnVmZmVycyA9IDY0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgPSA2NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlUGVyZk1vbml0b3JzQU1EID0gNjYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVByb2dyYW0gPSA2NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlUmVuZGVyYnVmZmVycyA9IDY4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTID0gNjksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVNoYWRlciA9IDcwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVUZXh0dXJlcyA9IDcxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMgPSA3MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVwdGhGdW5jID0gNzMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlcHRoTWFzayA9IDc0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXB0aFJhbmdlZiA9IDc1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXB0aFJhbmdlZk9FUyA9IDc2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXB0aFJhbmdleCA9IDc3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXB0aFJhbmdleE9FUyA9IDc4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXRhY2hTaGFkZXIgPSA3OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGlzYWJsZUNsaWVudFN0YXRlID0gODAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERpc2FibGVEcml2ZXJDb250cm9sUUNPTSA9IDgxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEaXNhYmxlID0gODIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSA9IDgzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQgPSA4NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd0FycmF5cyA9IDg1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3RWxlbWVudHMgPSA4NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd1RleGZPRVMgPSA4NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd1RleGZ2T0VTID0gODgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXhpT0VTID0gODksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXhpdk9FUyA9IDkwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3VGV4c09FUyA9IDkxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3VGV4c3ZPRVMgPSA5MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd1RleHhPRVMgPSA5MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd1RleHh2T0VTID0gOTQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyA9IDk1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyA9IDk2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFbmFibGVDbGllbnRTdGF0ZSA9IDk3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTSA9IDk4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFbmFibGUgPSA5OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkgPSAxMDAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEVuZFBlcmZNb25pdG9yQU1EID0gMTAxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFbmRUaWxpbmdRQ09NID0gMTAyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00gPSAxMDMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldEJ1ZmZlcnNRQ09NID0gMTA0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NID0gMTA1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTSA9IDEwNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0UHJvZ3JhbXNRQ09NID0gMTA3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTSA9IDEwOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0U2hhZGVyc1FDT00gPSAxMDksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NID0gMTEwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00gPSAxMTEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldFRleHR1cmVzUUNPTSA9IDExMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSA9IDExMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NID0gMTE0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGaW5pc2hGZW5jZU5WID0gMTE1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGaW5pc2ggPSAxMTYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZsdXNoID0gMTE3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGb2dmID0gMTE4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGb2dmdiA9IDExOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRm9neCA9IDEyMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRm9neE9FUyA9IDEyMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRm9neHYgPSAxMjIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZvZ3h2T0VTID0gMTIzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciA9IDEyNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMgPSAxMjUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZyYW1lYnVmZmVyVGV4dHVyZTJEID0gMTI2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HID0gMTI3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyA9IDEyOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVMgPSAxMjksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZyb250RmFjZSA9IDEzMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJ1c3R1bWYgPSAxMzEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZydXN0dW1mT0VTID0gMTMyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcnVzdHVteCA9IDEzMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJ1c3R1bXhPRVMgPSAxMzQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlbkJ1ZmZlcnMgPSAxMzUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlbmVyYXRlTWlwbWFwID0gMTM2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5lcmF0ZU1pcG1hcE9FUyA9IDEzNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuRmVuY2VzTlYgPSAxMzgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlbkZyYW1lYnVmZmVycyA9IDEzOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuRnJhbWVidWZmZXJzT0VTID0gMTQwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5QZXJmTW9uaXRvcnNBTUQgPSAxNDEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlblJlbmRlcmJ1ZmZlcnMgPSAxNDIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlblJlbmRlcmJ1ZmZlcnNPRVMgPSAxNDMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlblRleHR1cmVzID0gMTQ0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5WZXJ0ZXhBcnJheXNPRVMgPSAxNDUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEFjdGl2ZUF0dHJpYiA9IDE0NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0QWN0aXZlVW5pZm9ybSA9IDE0NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0QXR0YWNoZWRTaGFkZXJzID0gMTQ4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRBdHRyaWJMb2NhdGlvbiA9IDE0OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0Qm9vbGVhbnYgPSAxNTAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEJ1ZmZlclBhcmFtZXRlcml2ID0gMTUxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRCdWZmZXJQb2ludGVydk9FUyA9IDE1MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0Q2xpcFBsYW5lZiA9IDE1MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0Q2xpcFBsYW5lZk9FUyA9IDE1NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0Q2xpcFBsYW5leCA9IDE1NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0Q2xpcFBsYW5leE9FUyA9IDE1NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0RHJpdmVyQ29udHJvbHNRQ09NID0gMTU3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTSA9IDE1OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0RXJyb3IgPSAxNTksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEZlbmNlaXZOViA9IDE2MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0Rml4ZWR2ID0gMTYxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRGaXhlZHZPRVMgPSAxNjIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEZsb2F0diA9IDE2MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYgPSAxNjQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTID0gMTY1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRJbnRlZ2VydiA9IDE2NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0TGlnaHRmdiA9IDE2NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0TGlnaHR4diA9IDE2OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0TGlnaHR4dk9FUyA9IDE2OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0TWF0ZXJpYWxmdiA9IDE3MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0TWF0ZXJpYWx4diA9IDE3MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0TWF0ZXJpYWx4dk9FUyA9IDE3MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRCA9IDE3MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UGVyZk1vbml0b3JDb3VudGVySW5mb0FNRCA9IDE3NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRCA9IDE3NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1EID0gMTc2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQZXJmTW9uaXRvckdyb3Vwc0FNRCA9IDE3NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRCA9IDE3OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UG9pbnRlcnYgPSAxNzksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFByb2dyYW1CaW5hcnlPRVMgPSAxODAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFByb2dyYW1JbmZvTG9nID0gMTgxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQcm9ncmFtaXYgPSAxODIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2ID0gMTgzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyA9IDE4NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0U2hhZGVySW5mb0xvZyA9IDE4NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0U2hhZGVyaXYgPSAxODYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9IDE4NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0U2hhZGVyU291cmNlID0gMTg4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRTdHJpbmcgPSAxODksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFRleEVudmZ2ID0gMTkwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhFbnZpdiA9IDE5MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4RW52eHYgPSAxOTIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFRleEVudnh2T0VTID0gMTkzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhHZW5mdk9FUyA9IDE5NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4R2VuaXZPRVMgPSAxOTUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFRleEdlbnh2T0VTID0gMTk2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhQYXJhbWV0ZXJmdiA9IDE5NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4UGFyYW1ldGVyaXYgPSAxOTgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFRleFBhcmFtZXRlcnh2ID0gMTk5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUyA9IDIwMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VW5pZm9ybWZ2ID0gMjAxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRVbmlmb3JtaXYgPSAyMDIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFVuaWZvcm1Mb2NhdGlvbiA9IDIwMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VmVydGV4QXR0cmliZnYgPSAyMDQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFZlcnRleEF0dHJpYml2ID0gMjA1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydiA9IDIwNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSGludCA9IDIwNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNCdWZmZXIgPSAyMDgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzRW5hYmxlZCA9IDIwOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNGZW5jZU5WID0gMjEwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc0ZyYW1lYnVmZmVyID0gMjExLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc0ZyYW1lYnVmZmVyT0VTID0gMjEyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc1Byb2dyYW0gPSAyMTMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzUmVuZGVyYnVmZmVyID0gMjE0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc1JlbmRlcmJ1ZmZlck9FUyA9IDIxNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNTaGFkZXIgPSAyMTYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzVGV4dHVyZSA9IDIxNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNWZXJ0ZXhBcnJheU9FUyA9IDIxOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRmID0gMjE5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodGZ2ID0gMjIwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodE1vZGVsZiA9IDIyMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRNb2RlbGZ2ID0gMjIyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodE1vZGVseCA9IDIyMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRNb2RlbHhPRVMgPSAyMjQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0TW9kZWx4diA9IDIyNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRNb2RlbHh2T0VTID0gMjI2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodHggPSAyMjcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0eE9FUyA9IDIyOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHR4diA9IDIyOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHR4dk9FUyA9IDIzMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGluZVdpZHRoID0gMjMxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaW5lV2lkdGh4ID0gMjMyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaW5lV2lkdGh4T0VTID0gMjMzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaW5rUHJvZ3JhbSA9IDIzNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTG9hZElkZW50aXR5ID0gMjM1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMb2FkTWF0cml4ZiA9IDIzNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTG9hZE1hdHJpeHggPSAyMzcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExvYWRNYXRyaXh4T0VTID0gMjM4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMgPSAyMzksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExvZ2ljT3AgPSAyNDAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE1hcEJ1ZmZlck9FUyA9IDI0MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0ZXJpYWxmID0gMjQyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRlcmlhbGZ2ID0gMjQzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRlcmlhbHggPSAyNDQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE1hdGVyaWFseE9FUyA9IDI0NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0ZXJpYWx4diA9IDI0NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0ZXJpYWx4dk9FUyA9IDI0NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0cml4SW5kZXhQb2ludGVyT0VTID0gMjQ4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRyaXhNb2RlID0gMjQ5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNdWx0aURyYXdBcnJheXNFWFQgPSAyNTAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE11bHRpRHJhd0VsZW1lbnRzRVhUID0gMjUxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNdWx0aVRleENvb3JkNGYgPSAyNTIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE11bHRpVGV4Q29vcmQ0eCA9IDI1MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdGlUZXhDb29yZDR4T0VTID0gMjU0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNdWx0TWF0cml4ZiA9IDI1NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdE1hdHJpeHggPSAyNTYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE11bHRNYXRyaXh4T0VTID0gMjU3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xOb3JtYWwzZiA9IDI1OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTm9ybWFsM3ggPSAyNTksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE5vcm1hbDN4T0VTID0gMjYwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xOb3JtYWxQb2ludGVyID0gMjYxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xPcnRob2YgPSAyNjIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE9ydGhvZk9FUyA9IDI2MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsT3J0aG94ID0gMjY0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xPcnRob3hPRVMgPSAyNjUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBpeGVsU3RvcmVpID0gMjY2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFBhcmFtZXRlcmYgPSAyNjcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50UGFyYW1ldGVyZnYgPSAyNjgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50UGFyYW1ldGVyeCA9IDI2OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9pbnRQYXJhbWV0ZXJ4T0VTID0gMjcwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFBhcmFtZXRlcnh2ID0gMjcxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFBhcmFtZXRlcnh2T0VTID0gMjcyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFNpemUgPSAyNzMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50U2l6ZVBvaW50ZXJPRVMgPSAyNzQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50U2l6ZXggPSAyNzUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50U2l6ZXhPRVMgPSAyNzYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvbHlnb25PZmZzZXQgPSAyNzcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvbHlnb25PZmZzZXR4ID0gMjc4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2x5Z29uT2Zmc2V0eE9FUyA9IDI3OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9wTWF0cml4ID0gMjgwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtQmluYXJ5T0VTID0gMjgxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQdXNoTWF0cml4ID0gMjgyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xRdWVyeU1hdHJpeHhPRVMgPSAyODMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlYWRQaXhlbHMgPSAyODQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlbGVhc2VTaGFkZXJDb21waWxlciA9IDI4NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVuZGVyYnVmZmVyU3RvcmFnZSA9IDI4NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HID0gMjg3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTID0gMjg4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSb3RhdGVmID0gMjg5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSb3RhdGV4ID0gMjkwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSb3RhdGV4T0VTID0gMjkxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTYW1wbGVDb3ZlcmFnZSA9IDI5MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2FtcGxlQ292ZXJhZ2V4ID0gMjkzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTYW1wbGVDb3ZlcmFnZXhPRVMgPSAyOTQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNjYWxlZiA9IDI5NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2NhbGV4ID0gMjk2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTY2FsZXhPRVMgPSAyOTcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNjaXNzb3IgPSAyOTgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQgPSAyOTksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNldEZlbmNlTlYgPSAzMDAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNoYWRlTW9kZWwgPSAzMDEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNoYWRlckJpbmFyeSA9IDMwMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2hhZGVyU291cmNlID0gMzAzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTdGFydFRpbGluZ1FDT00gPSAzMDQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFN0ZW5jaWxGdW5jID0gMzA1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTdGVuY2lsRnVuY1NlcGFyYXRlID0gMzA2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTdGVuY2lsTWFzayA9IDMwNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU3RlbmNpbE1hc2tTZXBhcmF0ZSA9IDMwOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU3RlbmNpbE9wID0gMzA5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTdGVuY2lsT3BTZXBhcmF0ZSA9IDMxMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGVzdEZlbmNlTlYgPSAzMTEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleENvb3JkUG9pbnRlciA9IDMxMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4RW52ZiA9IDMxMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4RW52ZnYgPSAzMTQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEVudmkgPSAzMTUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEVudml2ID0gMzE2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZ4ID0gMzE3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZ4T0VTID0gMzE4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZ4diA9IDMxOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4RW52eHZPRVMgPSAzMjAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEdlbmZPRVMgPSAzMjEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEdlbmZ2T0VTID0gMzIyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhHZW5pT0VTID0gMzIzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhHZW5pdk9FUyA9IDMyNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4R2VueE9FUyA9IDMyNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4R2VueHZPRVMgPSAzMjYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEltYWdlMkQgPSAzMjcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEltYWdlM0RPRVMgPSAzMjgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFBhcmFtZXRlcmYgPSAzMjksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFBhcmFtZXRlcmZ2ID0gMzMwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJpID0gMzMxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJpdiA9IDMzMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4UGFyYW1ldGVyeCA9IDMzMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4UGFyYW1ldGVyeE9FUyA9IDMzNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4UGFyYW1ldGVyeHYgPSAzMzUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFBhcmFtZXRlcnh2T0VTID0gMzM2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhTdWJJbWFnZTJEID0gMzM3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhTdWJJbWFnZTNET0VTID0gMzM4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUcmFuc2xhdGVmID0gMzM5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUcmFuc2xhdGV4ID0gMzQwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUcmFuc2xhdGV4T0VTID0gMzQxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMWYgPSAzNDIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0xZnYgPSAzNDMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0xaSA9IDM0NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybTFpdiA9IDM0NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybTJmID0gMzQ2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMmZ2ID0gMzQ3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMmkgPSAzNDgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0yaXYgPSAzNDksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0zZiA9IDM1MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybTNmdiA9IDM1MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybTNpID0gMzUyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtM2l2ID0gMzUzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtNGYgPSAzNTQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm00ZnYgPSAzNTUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm00aSA9IDM1NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybTRpdiA9IDM1NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybU1hdHJpeDJmdiA9IDM1OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybU1hdHJpeDNmdiA9IDM1OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybU1hdHJpeDRmdiA9IDM2MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5tYXBCdWZmZXJPRVMgPSAzNjEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVzZVByb2dyYW0gPSAzNjIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZhbGlkYXRlUHJvZ3JhbSA9IDM2MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliMWYgPSAzNjQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjFmdiA9IDM2NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliMmYgPSAzNjYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjJmdiA9IDM2NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliM2YgPSAzNjgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjNmdiA9IDM2OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliNGYgPSAzNzAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjRmdiA9IDM3MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliUG9pbnRlciA9IDM3MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4UG9pbnRlciA9IDM3MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmlld3BvcnQgPSAzNzQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFdlaWdodFBvaW50ZXJPRVMgPSAzNzUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEFjdGl2ZVNoYWRlclByb2dyYW1FWFQgPSA1MDIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEFscGhhRnVuY1FDT00gPSA1MDMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJlZ2luUXVlcnlFWFQgPSA1MDQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRQcm9ncmFtUGlwZWxpbmVFWFQgPSA1MDUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsaXRGcmFtZWJ1ZmZlckFOR0xFID0gNTA2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDcmVhdGVTaGFkZXJQcm9ncmFtdkVYVCA9IDUwNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlUHJvZ3JhbVBpcGVsaW5lc0VYVCA9IDUwOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlUXVlcmllc0VYVCA9IDUwOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd0J1ZmZlcnNOViA9IDUxMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRW5kUXVlcnlFWFQgPSA1MTEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQgPSA1MTIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlblByb2dyYW1QaXBlbGluZXNFWFQgPSA1MTMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlblF1ZXJpZXNFWFQgPSA1MTQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQgPSA1MTUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldE9iamVjdExhYmVsRVhUID0gNTE2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nRVhUID0gNTE3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQcm9ncmFtUGlwZWxpbmVpdkVYVCA9IDUxOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UXVlcnlPYmplY3R1aXZFWFQgPSA1MTksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFF1ZXJ5aXZFWFQgPSA1MjAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldG5Vbmlmb3JtZnZFWFQgPSA1MjEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldG5Vbmlmb3JtaXZFWFQgPSA1MjEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEluc2VydEV2ZW50TWFya2VyRVhUID0gNTIyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc1Byb2dyYW1QaXBlbGluZUVYVCA9IDUyMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNRdWVyeUVYVCA9IDUyNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGFiZWxPYmplY3RFWFQgPSA1MjUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvcEdyb3VwTWFya2VyRVhUID0gNTI2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVCA9IDUyNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0xZkVYVCA9IDUyOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0xZnZFWFQgPSA1MjksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtMWlFWFQgPSA1MzAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtMWl2RVhUID0gNTMxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTJmRVhUID0gNTMyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTJmdkVYVCA9IDUzMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0yaUVYVCA9IDUzNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0yaXZFWFQgPSA1MzUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtM2ZFWFQgPSA1MzYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtM2Z2RVhUID0gNTM3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTNpRVhUID0gNTM4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVCA9IDUzOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm00ZkVYVCA9IDU0MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm00ZnZFWFQgPSA1NDEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtNGlFWFQgPSA1NDIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtNGl2RVhUID0gNTQzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdkVYVCA9IDU0NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQgPSA1NDUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUID0gNTQ2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQdXNoR3JvdXBNYXJrZXJFWFQgPSA1NDcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlYWRCdWZmZXJOViA9IDU0OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVhZG5QaXhlbHNFWFQgPSA1NDksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFID0gNTUwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRSA9IDU1MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUID0gNTUyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFID0gNTUzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhTdG9yYWdlMURFWFQgPSA1NTQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFN0b3JhZ2UyREVYVCA9IDU1NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4U3RvcmFnZTNERVhUID0gNTU2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXh0dXJlU3RvcmFnZTFERVhUID0gNTU3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXh0dXJlU3RvcmFnZTJERVhUID0gNTU4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXh0dXJlU3RvcmFnZTNERVhUID0gNTU5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVc2VQcm9ncmFtU3RhZ2VzRVhUID0gNTYwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWYWxpZGF0ZVByb2dyYW1QaXBlbGluZUVYVCA9IDU2MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldERpc3BsYXkgPSAyMDAwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsSW5pdGlhbGl6ZSA9IDIwMDEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xUZXJtaW5hdGUgPSAyMDAyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0Q29uZmlncyA9IDIwMDMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDaG9vc2VDb25maWcgPSAyMDA0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0Q29uZmlnQXR0cmliID0gMjAwNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbENyZWF0ZVdpbmRvd1N1cmZhY2UgPSAyMDA2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSA9IDIwMDcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSA9IDIwMDgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xEZXN0cm95U3VyZmFjZSA9IDIwMDksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xRdWVyeVN1cmZhY2UgPSAyMDEwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ3JlYXRlQ29udGV4dCA9IDIwMTEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xEZXN0cm95Q29udGV4dCA9IDIwMTIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xNYWtlQ3VycmVudCA9IDIwMTMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXRDdXJyZW50Q29udGV4dCA9IDIwMTQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXRDdXJyZW50U3VyZmFjZSA9IDIwMTUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXRDdXJyZW50RGlzcGxheSA9IDIwMTYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xRdWVyeUNvbnRleHQgPSAyMDE3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsV2FpdEdMID0gMjAxOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFdhaXROYXRpdmUgPSAyMDE5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsU3dhcEJ1ZmZlcnMgPSAyMDIwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ29weUJ1ZmZlcnMgPSAyMDIxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0RXJyb3IgPSAyMDIyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsUXVlcnlTdHJpbmcgPSAyMDIzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0UHJvY0FkZHJlc3MgPSAyMDI0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsU3VyZmFjZUF0dHJpYiA9IDIwMjUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xCaW5kVGV4SW1hZ2UgPSAyMDI2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsUmVsZWFzZVRleEltYWdlID0gMjAyNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFN3YXBJbnRlcnZhbCA9IDIwMjgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xCaW5kQVBJID0gMjAyOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFF1ZXJ5QVBJID0gMjAzMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFdhaXRDbGllbnQgPSAyMDMxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsUmVsZWFzZVRocmVhZCA9IDIwMzIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlciA9IDIwMzMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xMb2NrU3VyZmFjZUtIUiA9IDIwMzQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xVbmxvY2tTdXJmYWNlS0hSID0gMjAzNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbENyZWF0ZUltYWdlS0hSID0gMjAzNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbERlc3Ryb3lJbWFnZUtIUiA9IDIwMzcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDcmVhdGVTeW5jS0hSID0gMjAzOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbERlc3Ryb3lTeW5jS0hSID0gMjAzOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbENsaWVudFdhaXRTeW5jS0hSID0gMjA0MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldFN5bmNBdHRyaWJLSFIgPSAyMDQxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsU2V0U3dhcFJlY3RhbmdsZUFORFJPSUQgPSAyMDQyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0UmVuZGVyQnVmZmVyQU5EUk9JRCA9IDIwNDMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXRTeXN0ZW1UaW1lRnJlcXVlbmN5TlYgPSAyMDQ0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0U3lzdGVtVGltZU5WID0gMjA0NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2ludmFsaWQgPSAzMDAwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YSA9IDMwMDEKLX07Ci1ib29sIEdMTWVzc2FnZV9GdW5jdGlvbl9Jc1ZhbGlkKGludCB2YWx1ZSk7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlX0Z1bmN0aW9uX0Z1bmN0aW9uX01JTiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEFjdGl2ZVRleHR1cmU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlX0Z1bmN0aW9uX0Z1bmN0aW9uX01BWCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYlBvaW50ZXJEYXRhOwotY29uc3QgaW50IEdMTWVzc2FnZV9GdW5jdGlvbl9GdW5jdGlvbl9BUlJBWVNJWkUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fRnVuY3Rpb25fTUFYICsgMTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBHTE1lc3NhZ2VfRGF0YVR5cGUgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSB7Ci0gcHVibGljOgotICBHTE1lc3NhZ2VfRGF0YVR5cGUoKTsKLSAgdmlydHVhbCB+R0xNZXNzYWdlX0RhdGFUeXBlKCk7Ci0gIAotICBHTE1lc3NhZ2VfRGF0YVR5cGUoY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlJiBmcm9tKTsKLSAgCi0gIGlubGluZSBHTE1lc3NhZ2VfRGF0YVR5cGUmIG9wZXJhdG9yPShjb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGUmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgCi0gIHN0YXRpYyBjb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGUmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChHTE1lc3NhZ2VfRGF0YVR5cGUqIG90aGVyKTsKLSAgCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBHTE1lc3NhZ2VfRGF0YVR5cGUqIE5ldygpIGNvbnN0OwotICB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGUmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGUmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICBwdWJsaWM6Ci0gIAotICA6OnN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgY29uc3Q7Ci0gIAotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgdHlwZWRlZiBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSBUeXBlOwotICBzdGF0aWMgY29uc3QgVHlwZSBWT0lEID0gR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfVk9JRDsKLSAgc3RhdGljIGNvbnN0IFR5cGUgQ0hBUiA9IEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0NIQVI7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIEJZVEUgPSBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9CWVRFOwotICBzdGF0aWMgY29uc3QgVHlwZSBJTlQgPSBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9JTlQ7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIEZMT0FUID0gR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfRkxPQVQ7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIEJPT0wgPSBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9CT09MOwotICBzdGF0aWMgY29uc3QgVHlwZSBFTlVNID0gR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfRU5VTTsKLSAgc3RhdGljIGlubGluZSBib29sIFR5cGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKLSAgICByZXR1cm4gR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfSXNWYWxpZCh2YWx1ZSk7Ci0gIH0KLSAgc3RhdGljIGNvbnN0IFR5cGUgVHlwZV9NSU4gPQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX1R5cGVfTUlOOwotICBzdGF0aWMgY29uc3QgVHlwZSBUeXBlX01BWCA9Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfVHlwZV9NQVg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgVHlwZV9BUlJBWVNJWkUgPQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX1R5cGVfQVJSQVlTSVpFOwotICAKLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIHJlcXVpcmVkIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlLlR5cGUgdHlwZSA9IDEgW2RlZmF1bHQgPSBWT0lEXTsKLSAgaW5saW5lIGJvb2wgaGFzX3R5cGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfdHlwZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtUeXBlRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSB0eXBlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF90eXBlKDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgdmFsdWUpOwotICAKLSAgLy8gcmVxdWlyZWQgYm9vbCBpc0FycmF5ID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaW5saW5lIGJvb2wgaGFzX2lzYXJyYXkoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaXNhcnJheSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtJc0FycmF5RmllbGROdW1iZXIgPSAyOwotICBpbmxpbmUgYm9vbCBpc2FycmF5KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9pc2FycmF5KGJvb2wgdmFsdWUpOwotICAKLSAgLy8gcmVwZWF0ZWQgaW50MzIgaW50VmFsdWUgPSAzOwotICBpbmxpbmUgaW50IGludHZhbHVlX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaW50dmFsdWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrSW50VmFsdWVGaWVsZE51bWJlciA9IDM7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGludHZhbHVlKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9pbnR2YWx1ZShpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBhZGRfaW50dmFsdWUoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKLSAgICAgIGludHZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKLSAgICAgIG11dGFibGVfaW50dmFsdWUoKTsKLSAgCi0gIC8vIHJlcGVhdGVkIGZsb2F0IGZsb2F0VmFsdWUgPSA0OwotICBpbmxpbmUgaW50IGZsb2F0dmFsdWVfc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9mbG9hdHZhbHVlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0Zsb2F0VmFsdWVGaWVsZE51bWJlciA9IDQ7Ci0gIGlubGluZSBmbG9hdCBmbG9hdHZhbHVlKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9mbG9hdHZhbHVlKGludCBpbmRleCwgZmxvYXQgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBhZGRfZmxvYXR2YWx1ZShmbG9hdCB2YWx1ZSk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IGZsb2F0ID4mCi0gICAgICBmbG9hdHZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IGZsb2F0ID4qCi0gICAgICBtdXRhYmxlX2Zsb2F0dmFsdWUoKTsKLSAgCi0gIC8vIHJlcGVhdGVkIGJ5dGVzIGNoYXJWYWx1ZSA9IDU7Ci0gIGlubGluZSBpbnQgY2hhcnZhbHVlX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfY2hhcnZhbHVlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NoYXJWYWx1ZUZpZWxkTnVtYmVyID0gNTsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGNoYXJ2YWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9jaGFydmFsdWUoaW50IGluZGV4KTsKLSAgaW5saW5lIHZvaWQgc2V0X2NoYXJ2YWx1ZShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2NoYXJ2YWx1ZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2NoYXJ2YWx1ZShpbnQgaW5kZXgsIGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBhZGRfY2hhcnZhbHVlKCk7Ci0gIGlubGluZSB2b2lkIGFkZF9jaGFydmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBhZGRfY2hhcnZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgYWRkX2NoYXJ2YWx1ZShjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYgY2hhcnZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KiBtdXRhYmxlX2NoYXJ2YWx1ZSgpOwotICAKLSAgLy8gcmVwZWF0ZWQgYnl0ZXMgcmF3Qnl0ZXMgPSA2OwotICBpbmxpbmUgaW50IHJhd2J5dGVzX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfcmF3Ynl0ZXMoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrUmF3Qnl0ZXNGaWVsZE51bWJlciA9IDY7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiByYXdieXRlcyhpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9yYXdieXRlcyhpbnQgaW5kZXgpOwotICBpbmxpbmUgdm9pZCBzZXRfcmF3Ynl0ZXMoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9yYXdieXRlcyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X3Jhd2J5dGVzKGludCBpbmRleCwgY29uc3Qgdm9pZCogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIGFkZF9yYXdieXRlcygpOwotICBpbmxpbmUgdm9pZCBhZGRfcmF3Ynl0ZXMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBhZGRfcmF3Ynl0ZXMoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBhZGRfcmF3Ynl0ZXMoY29uc3Qgdm9pZCogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mIHJhd2J5dGVzKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KiBtdXRhYmxlX3Jhd2J5dGVzKCk7Ci0gIAotICAvLyByZXBlYXRlZCBib29sIGJvb2xWYWx1ZSA9IDc7Ci0gIGlubGluZSBpbnQgYm9vbHZhbHVlX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfYm9vbHZhbHVlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0Jvb2xWYWx1ZUZpZWxkTnVtYmVyID0gNzsKLSAgaW5saW5lIGJvb2wgYm9vbHZhbHVlKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9ib29sdmFsdWUoaW50IGluZGV4LCBib29sIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgYWRkX2Jvb2x2YWx1ZShib29sIHZhbHVlKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgYm9vbCA+JgotICAgICAgYm9vbHZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IGJvb2wgPioKLSAgICAgIG11dGFibGVfYm9vbHZhbHVlKCk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6YW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZSkKLSBwcml2YXRlOgotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgaW50IHR5cGVfOwotICBib29sIGlzYXJyYXlfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiBpbnR2YWx1ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgZmxvYXQgPiBmbG9hdHZhbHVlXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiBjaGFydmFsdWVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+IHJhd2J5dGVzXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCBib29sID4gYm9vbHZhbHVlXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfZ2x0cmFjZV8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ2x0cmFjZV8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nbHRyYWNlXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDcgKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIEdMTWVzc2FnZV9EYXRhVHlwZSogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBHTE1lc3NhZ2VfRnJhbWVCdWZmZXIgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSB7Ci0gcHVibGljOgotICBHTE1lc3NhZ2VfRnJhbWVCdWZmZXIoKTsKLSAgdmlydHVhbCB+R0xNZXNzYWdlX0ZyYW1lQnVmZmVyKCk7Ci0gIAotICBHTE1lc3NhZ2VfRnJhbWVCdWZmZXIoY29uc3QgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyJiBmcm9tKTsKLSAgCi0gIGlubGluZSBHTE1lc3NhZ2VfRnJhbWVCdWZmZXImIG9wZXJhdG9yPShjb25zdCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXImIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgCi0gIHN0YXRpYyBjb25zdCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXImIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChHTE1lc3NhZ2VfRnJhbWVCdWZmZXIqIG90aGVyKTsKLSAgCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBHTE1lc3NhZ2VfRnJhbWVCdWZmZXIqIE5ldygpIGNvbnN0OwotICB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXImIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXImIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICBwdWJsaWM6Ci0gIAotICA6OnN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgY29uc3Q7Ci0gIAotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIHJlcXVpcmVkIGludDMyIHdpZHRoID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX3dpZHRoKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3dpZHRoKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1dpZHRoRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB3aWR0aCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfd2lkdGgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyByZXF1aXJlZCBpbnQzMiBoZWlnaHQgPSAyOwotICBpbmxpbmUgYm9vbCBoYXNfaGVpZ2h0KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hlaWdodCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtIZWlnaHRGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGhlaWdodCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfaGVpZ2h0KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gcmVwZWF0ZWQgYnl0ZXMgY29udGVudHMgPSAzOwotICBpbmxpbmUgaW50IGNvbnRlbnRzX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfY29udGVudHMoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrQ29udGVudHNGaWVsZE51bWJlciA9IDM7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBjb250ZW50cyhpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9jb250ZW50cyhpbnQgaW5kZXgpOwotICBpbmxpbmUgdm9pZCBzZXRfY29udGVudHMoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9jb250ZW50cyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2NvbnRlbnRzKGludCBpbmRleCwgY29uc3Qgdm9pZCogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIGFkZF9jb250ZW50cygpOwotICBpbmxpbmUgdm9pZCBhZGRfY29udGVudHMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBhZGRfY29udGVudHMoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBhZGRfY29udGVudHMoY29uc3Qgdm9pZCogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mIGNvbnRlbnRzKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KiBtdXRhYmxlX2NvbnRlbnRzKCk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6YW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5GcmFtZUJ1ZmZlcikKLSBwcml2YXRlOgotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB3aWR0aF87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgaGVpZ2h0XzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiBjb250ZW50c187Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX2dsdHJhY2VfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dsdHJhY2VfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ2x0cmFjZV8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBHTE1lc3NhZ2VfRnJhbWVCdWZmZXIqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgR0xNZXNzYWdlIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUgewotIHB1YmxpYzoKLSAgR0xNZXNzYWdlKCk7Ci0gIHZpcnR1YWwgfkdMTWVzc2FnZSgpOwotICAKLSAgR0xNZXNzYWdlKGNvbnN0IEdMTWVzc2FnZSYgZnJvbSk7Ci0gIAotICBpbmxpbmUgR0xNZXNzYWdlJiBvcGVyYXRvcj0oY29uc3QgR0xNZXNzYWdlJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgR0xNZXNzYWdlJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAotICB2b2lkIFN3YXAoR0xNZXNzYWdlKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgR0xNZXNzYWdlKiBOZXcoKSBjb25zdDsKLSAgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgR0xNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgR0xNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpzdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIHR5cGVkZWYgR0xNZXNzYWdlX0RhdGFUeXBlIERhdGFUeXBlOwotICB0eXBlZGVmIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlciBGcmFtZUJ1ZmZlcjsKLSAgCi0gIHR5cGVkZWYgR0xNZXNzYWdlX0Z1bmN0aW9uIEZ1bmN0aW9uOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xBY3RpdmVUZXh0dXJlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQWN0aXZlVGV4dHVyZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQWxwaGFGdW5jID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQWxwaGFGdW5jOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xBbHBoYUZ1bmN4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQWxwaGFGdW5jeDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQWxwaGFGdW5jeE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEFscGhhRnVuY3hPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEF0dGFjaFNoYWRlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEF0dGFjaFNoYWRlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmVnaW5QZXJmTW9uaXRvckFNRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJlZ2luUGVyZk1vbml0b3JBTUQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJpbmRBdHRyaWJMb2NhdGlvbiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRBdHRyaWJMb2NhdGlvbjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmluZEJ1ZmZlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRCdWZmZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJpbmRGcmFtZWJ1ZmZlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRGcmFtZWJ1ZmZlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmluZEZyYW1lYnVmZmVyT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmluZEZyYW1lYnVmZmVyT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCaW5kUmVuZGVyYnVmZmVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmluZFJlbmRlcmJ1ZmZlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmluZFJlbmRlcmJ1ZmZlck9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRSZW5kZXJidWZmZXJPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJpbmRUZXh0dXJlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmluZFRleHR1cmU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJpbmRWZXJ0ZXhBcnJheU9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRWZXJ0ZXhBcnJheU9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmxlbmRDb2xvciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsZW5kQ29sb3I7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJsZW5kRXF1YXRpb24gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZEVxdWF0aW9uOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCbGVuZEVxdWF0aW9uT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmxlbmRFcXVhdGlvbk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmxlbmRFcXVhdGlvblNlcGFyYXRlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJsZW5kRnVuYyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsZW5kRnVuYzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmxlbmRGdW5jU2VwYXJhdGUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZEZ1bmNTZXBhcmF0ZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmxlbmRGdW5jU2VwYXJhdGVPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQnVmZmVyRGF0YSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJ1ZmZlckRhdGE7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJ1ZmZlclN1YkRhdGEgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCdWZmZXJTdWJEYXRhOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1czsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENsZWFyQ29sb3IgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckNvbG9yOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGVhckNvbG9yeCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsZWFyQ29sb3J4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGVhckNvbG9yeE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsZWFyQ29sb3J4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGVhckRlcHRoZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsZWFyRGVwdGhmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGVhckRlcHRoZk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsZWFyRGVwdGhmT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGVhckRlcHRoeCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsZWFyRGVwdGh4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGVhckRlcHRoeE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsZWFyRGVwdGh4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGVhciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsZWFyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGVhclN0ZW5jaWwgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhclN0ZW5jaWw7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENsaWVudEFjdGl2ZVRleHR1cmUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGllbnRBY3RpdmVUZXh0dXJlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGlwUGxhbmVmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xpcFBsYW5lZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xpcFBsYW5lZklNRyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsaXBQbGFuZWZJTUc7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENsaXBQbGFuZWZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGlwUGxhbmVmT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGlwUGxhbmV4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xpcFBsYW5leDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xpcFBsYW5leElNRyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsaXBQbGFuZXhJTUc7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENsaXBQbGFuZXhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGlwUGxhbmV4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb2xvcjRmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29sb3I0ZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ29sb3I0dWIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb2xvcjR1YjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ29sb3I0eCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbG9yNHg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvbG9yNHhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb2xvcjR4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb2xvck1hc2sgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb2xvck1hc2s7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvbG9yUG9pbnRlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbG9yUG9pbnRlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ29tcGlsZVNoYWRlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbXBpbGVTaGFkZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvbXByZXNzZWRUZXhJbWFnZTJEID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29tcHJlc3NlZFRleEltYWdlMkQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvbXByZXNzZWRUZXhJbWFnZTNET0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29tcHJlc3NlZFRleEltYWdlM0RPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNET0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvcHlUZXhJbWFnZTJEID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29weVRleEltYWdlMkQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvcHlUZXhTdWJJbWFnZTJEID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29weVRleFN1YkltYWdlMkQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvcHlUZXhTdWJJbWFnZTNET0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29weVRleFN1YkltYWdlM0RPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvdmVyYWdlTWFza05WID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ292ZXJhZ2VNYXNrTlY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvdmVyYWdlT3BlcmF0aW9uTlYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDcmVhdGVQcm9ncmFtID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ3JlYXRlUHJvZ3JhbTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ3JlYXRlU2hhZGVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ3JlYXRlU2hhZGVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDdWxsRmFjZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEN1bGxGYWNlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZWxldGVCdWZmZXJzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlQnVmZmVyczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVsZXRlRmVuY2VzTlYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVGZW5jZXNOVjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVsZXRlRnJhbWVidWZmZXJzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlRnJhbWVidWZmZXJzOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERlbGV0ZVBlcmZNb25pdG9yc0FNRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVBlcmZNb25pdG9yc0FNRDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVsZXRlUHJvZ3JhbSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVByb2dyYW07Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVSZW5kZXJidWZmZXJzOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlUmVuZGVyYnVmZmVyc09FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVsZXRlU2hhZGVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlU2hhZGVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZWxldGVUZXh0dXJlcyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVRleHR1cmVzOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERlcHRoRnVuYyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlcHRoRnVuYzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVwdGhNYXNrID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVwdGhNYXNrOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZXB0aFJhbmdlZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlcHRoUmFuZ2VmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZXB0aFJhbmdlZk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlcHRoUmFuZ2VmT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZXB0aFJhbmdleCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlcHRoUmFuZ2V4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZXB0aFJhbmdleE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlcHRoUmFuZ2V4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZXRhY2hTaGFkZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXRhY2hTaGFkZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERpc2FibGVDbGllbnRTdGF0ZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERpc2FibGVDbGllbnRTdGF0ZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEaXNhYmxlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGlzYWJsZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERyYXdBcnJheXMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3QXJyYXlzOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEcmF3RWxlbWVudHMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3RWxlbWVudHM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERyYXdUZXhmT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd1RleGZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERyYXdUZXhmdk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXhmdk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRHJhd1RleGlPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3VGV4aU9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRHJhd1RleGl2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd1RleGl2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEcmF3VGV4c09FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXhzT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEcmF3VGV4c3ZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3VGV4c3ZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERyYXdUZXh4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd1RleHhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERyYXdUZXh4dk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXh4dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFbmFibGVDbGllbnRTdGF0ZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEVuYWJsZUNsaWVudFN0YXRlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFbmFibGUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFbmFibGU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRW5hYmxlVmVydGV4QXR0cmliQXJyYXk7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEVuZFBlcmZNb25pdG9yQU1EID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRW5kUGVyZk1vbml0b3JBTUQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEVuZFRpbGluZ1FDT00gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFbmRUaWxpbmdRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT007Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEV4dEdldEJ1ZmZlcnNRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0QnVmZmVyc1FDT007Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFeHRHZXRQcm9ncmFtc1FDT00gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRQcm9ncmFtc1FDT007Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT007Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEV4dEdldFNoYWRlcnNRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0U2hhZGVyc1FDT007Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT007Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEV4dEdldFRleFN1YkltYWdlUUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldFRleFN1YkltYWdlUUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRXh0R2V0VGV4dHVyZXNRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0VGV4dHVyZXNRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFeHRJc1Byb2dyYW1CaW5hcnlRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGaW5pc2hGZW5jZU5WID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRmluaXNoRmVuY2VOVjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRmluaXNoID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRmluaXNoOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGbHVzaCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZsdXNoOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGb2dmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRm9nZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRm9nZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGb2dmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRm9neCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZvZ3g7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEZvZ3hPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGb2d4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGb2d4diA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZvZ3h2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGb2d4dk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZvZ3h2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZyYW1lYnVmZmVyVGV4dHVyZTJEOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUlNRzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcmFtZWJ1ZmZlclRleHR1cmUzRE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRnJvbnRGYWNlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJvbnRGYWNlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGcnVzdHVtZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZydXN0dW1mOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGcnVzdHVtZk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZydXN0dW1mT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGcnVzdHVteCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZydXN0dW14OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGcnVzdHVteE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZydXN0dW14T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZW5CdWZmZXJzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuQnVmZmVyczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2VuZXJhdGVNaXBtYXAgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5lcmF0ZU1pcG1hcDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2VuZXJhdGVNaXBtYXBPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5lcmF0ZU1pcG1hcE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2VuRmVuY2VzTlYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5GZW5jZXNOVjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2VuRnJhbWVidWZmZXJzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuRnJhbWVidWZmZXJzOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5GcmFtZWJ1ZmZlcnNPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdlblBlcmZNb25pdG9yc0FNRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlblBlcmZNb25pdG9yc0FNRDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2VuUmVuZGVyYnVmZmVycyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlblJlbmRlcmJ1ZmZlcnM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5SZW5kZXJidWZmZXJzT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZW5UZXh0dXJlcyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlblRleHR1cmVzOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZW5WZXJ0ZXhBcnJheXNPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5WZXJ0ZXhBcnJheXNPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEFjdGl2ZUF0dHJpYiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEFjdGl2ZUF0dHJpYjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0QWN0aXZlVW5pZm9ybSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEFjdGl2ZVVuaWZvcm07Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEF0dGFjaGVkU2hhZGVycyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEF0dGFjaGVkU2hhZGVyczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0QXR0cmliTG9jYXRpb24gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRBdHRyaWJMb2NhdGlvbjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0Qm9vbGVhbnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRCb29sZWFudjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0QnVmZmVyUG9pbnRlcnZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRCdWZmZXJQb2ludGVydk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0Q2xpcFBsYW5lZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldENsaXBQbGFuZWY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldENsaXBQbGFuZWZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRDbGlwUGxhbmVmT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRDbGlwUGxhbmV4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0Q2xpcFBsYW5leDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0Q2xpcFBsYW5leE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldENsaXBQbGFuZXhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldERyaXZlckNvbnRyb2xzUUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldERyaXZlckNvbnRyb2xzUUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0RXJyb3IgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRFcnJvcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0RmVuY2Vpdk5WID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0RmVuY2Vpdk5WOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRGaXhlZHYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRGaXhlZHY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEZpeGVkdk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEZpeGVkdk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0RmxvYXR2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0RmxvYXR2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRJbnRlZ2VydiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEludGVnZXJ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRMaWdodGZ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0TGlnaHRmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0TGlnaHR4diA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldExpZ2h0eHY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldExpZ2h0eHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRMaWdodHh2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRNYXRlcmlhbGZ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0TWF0ZXJpYWxmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0TWF0ZXJpYWx4diA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldE1hdGVyaWFseHY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldE1hdGVyaWFseHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRNYXRlcmlhbHh2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1EID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UGVyZk1vbml0b3JDb3VudGVySW5mb0FNRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFBlcmZNb25pdG9yQ291bnRlcnNBTUQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1EOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFBlcmZNb25pdG9yR3JvdXBzQU1EID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFBlcmZNb25pdG9yR3JvdXBTdHJpbmdBTUQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRQb2ludGVydiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFBvaW50ZXJ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRQcm9ncmFtQmluYXJ5T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UHJvZ3JhbUJpbmFyeU9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UHJvZ3JhbUluZm9Mb2cgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQcm9ncmFtSW5mb0xvZzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UHJvZ3JhbWl2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UHJvZ3JhbWl2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRTaGFkZXJJbmZvTG9nID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0U2hhZGVySW5mb0xvZzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0U2hhZGVyaXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRTaGFkZXJpdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRTaGFkZXJTb3VyY2UgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRTaGFkZXJTb3VyY2U7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFN0cmluZyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFN0cmluZzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VGV4RW52ZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhFbnZmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VGV4RW52aXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhFbnZpdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VGV4RW52eHYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhFbnZ4djsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VGV4RW52eHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhFbnZ4dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VGV4R2VuZnZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhHZW5mdk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VGV4R2VuaXZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhHZW5pdk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VGV4R2VueHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhHZW54dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VGV4UGFyYW1ldGVyZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhQYXJhbWV0ZXJmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VGV4UGFyYW1ldGVyaXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhQYXJhbWV0ZXJpdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VGV4UGFyYW1ldGVyeHYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhQYXJhbWV0ZXJ4djsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VGV4UGFyYW1ldGVyeHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VW5pZm9ybWZ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VW5pZm9ybWZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRVbmlmb3JtaXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRVbmlmb3JtaXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFVuaWZvcm1Mb2NhdGlvbiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFVuaWZvcm1Mb2NhdGlvbjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VmVydGV4QXR0cmliZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRWZXJ0ZXhBdHRyaWJmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VmVydGV4QXR0cmliaXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRWZXJ0ZXhBdHRyaWJpdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSGludCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEhpbnQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbElzQnVmZmVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNCdWZmZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbElzRW5hYmxlZCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzRW5hYmxlZDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSXNGZW5jZU5WID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNGZW5jZU5WOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xJc0ZyYW1lYnVmZmVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNGcmFtZWJ1ZmZlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSXNGcmFtZWJ1ZmZlck9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzRnJhbWVidWZmZXJPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbElzUHJvZ3JhbSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzUHJvZ3JhbTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSXNSZW5kZXJidWZmZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc1JlbmRlcmJ1ZmZlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSXNSZW5kZXJidWZmZXJPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc1JlbmRlcmJ1ZmZlck9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSXNTaGFkZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc1NoYWRlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSXNUZXh0dXJlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNUZXh0dXJlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xJc1ZlcnRleEFycmF5T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNWZXJ0ZXhBcnJheU9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGlnaHRmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMaWdodGZ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGlnaHRNb2RlbGYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodE1vZGVsZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGlnaHRNb2RlbGZ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRNb2RlbGZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMaWdodE1vZGVseCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0TW9kZWx4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMaWdodE1vZGVseE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0TW9kZWx4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMaWdodE1vZGVseHYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodE1vZGVseHY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExpZ2h0TW9kZWx4dk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0TW9kZWx4dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGlnaHR4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHR4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMaWdodHhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodHhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExpZ2h0eHYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodHh2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMaWdodHh2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHR4dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGluZVdpZHRoID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGluZVdpZHRoOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMaW5lV2lkdGh4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGluZVdpZHRoeDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGluZVdpZHRoeE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpbmVXaWR0aHhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExpbmtQcm9ncmFtID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlua1Byb2dyYW07Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExvYWRJZGVudGl0eSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExvYWRJZGVudGl0eTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTG9hZE1hdHJpeGYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMb2FkTWF0cml4ZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTG9hZE1hdHJpeHggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMb2FkTWF0cml4eDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTG9hZE1hdHJpeHhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMb2FkTWF0cml4eE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMb2dpY09wID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTG9naWNPcDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTWFwQnVmZmVyT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWFwQnVmZmVyT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNYXRlcmlhbGYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRlcmlhbGY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE1hdGVyaWFsZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRlcmlhbGZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNYXRlcmlhbHggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRlcmlhbHg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE1hdGVyaWFseE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE1hdGVyaWFseE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTWF0ZXJpYWx4diA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE1hdGVyaWFseHY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE1hdGVyaWFseHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRlcmlhbHh2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE1hdHJpeE1vZGUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRyaXhNb2RlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNdWx0aURyYXdBcnJheXNFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNdWx0aURyYXdBcnJheXNFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE11bHRpRHJhd0VsZW1lbnRzRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdGlEcmF3RWxlbWVudHNFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE11bHRpVGV4Q29vcmQ0ZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE11bHRpVGV4Q29vcmQ0ZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTXVsdGlUZXhDb29yZDR4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdGlUZXhDb29yZDR4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNdWx0aVRleENvb3JkNHhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNdWx0aVRleENvb3JkNHhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE11bHRNYXRyaXhmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdE1hdHJpeGY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE11bHRNYXRyaXh4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdE1hdHJpeHg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE11bHRNYXRyaXh4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdE1hdHJpeHhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE5vcm1hbDNmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTm9ybWFsM2Y7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE5vcm1hbDN4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTm9ybWFsM3g7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE5vcm1hbDN4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTm9ybWFsM3hPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE5vcm1hbFBvaW50ZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xOb3JtYWxQb2ludGVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xPcnRob2YgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xPcnRob2Y7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE9ydGhvZk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE9ydGhvZk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsT3J0aG94ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsT3J0aG94OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xPcnRob3hPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xPcnRob3hPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBpeGVsU3RvcmVpID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUGl4ZWxTdG9yZWk7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvaW50UGFyYW1ldGVyZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50UGFyYW1ldGVyZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUG9pbnRQYXJhbWV0ZXJmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50UGFyYW1ldGVyZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvaW50UGFyYW1ldGVyeCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50UGFyYW1ldGVyeDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUG9pbnRQYXJhbWV0ZXJ4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9pbnRQYXJhbWV0ZXJ4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQb2ludFBhcmFtZXRlcnh2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9pbnRQYXJhbWV0ZXJ4djsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUG9pbnRQYXJhbWV0ZXJ4dk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50UGFyYW1ldGVyeHZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvaW50U2l6ZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50U2l6ZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUG9pbnRTaXplUG9pbnRlck9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50U2l6ZVBvaW50ZXJPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvaW50U2l6ZXggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFNpemV4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQb2ludFNpemV4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9pbnRTaXpleE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUG9seWdvbk9mZnNldCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvbHlnb25PZmZzZXQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvbHlnb25PZmZzZXR4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9seWdvbk9mZnNldHg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvbHlnb25PZmZzZXR4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9seWdvbk9mZnNldHhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvcE1hdHJpeCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvcE1hdHJpeDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbUJpbmFyeU9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1CaW5hcnlPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFB1c2hNYXRyaXggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQdXNoTWF0cml4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xRdWVyeU1hdHJpeHhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xRdWVyeU1hdHJpeHhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFJlYWRQaXhlbHMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZWFkUGl4ZWxzOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZW5kZXJidWZmZXJTdG9yYWdlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUc7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSb3RhdGVmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUm90YXRlZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUm90YXRleCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJvdGF0ZXg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFJvdGF0ZXhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSb3RhdGV4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTYW1wbGVDb3ZlcmFnZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNhbXBsZUNvdmVyYWdlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTYW1wbGVDb3ZlcmFnZXggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTYW1wbGVDb3ZlcmFnZXg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFNhbXBsZUNvdmVyYWdleE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNhbXBsZUNvdmVyYWdleE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU2NhbGVmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2NhbGVmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTY2FsZXggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTY2FsZXg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFNjYWxleE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNjYWxleE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU2Npc3NvciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNjaXNzb3I7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTZXRGZW5jZU5WID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2V0RmVuY2VOVjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU2hhZGVNb2RlbCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNoYWRlTW9kZWw7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFNoYWRlckJpbmFyeSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNoYWRlckJpbmFyeTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU2hhZGVyU291cmNlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2hhZGVyU291cmNlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTdGFydFRpbGluZ1FDT00gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTdGFydFRpbGluZ1FDT007Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFN0ZW5jaWxGdW5jID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU3RlbmNpbEZ1bmM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFN0ZW5jaWxGdW5jU2VwYXJhdGUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTdGVuY2lsRnVuY1NlcGFyYXRlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTdGVuY2lsTWFzayA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFN0ZW5jaWxNYXNrOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTdGVuY2lsTWFza1NlcGFyYXRlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU3RlbmNpbE1hc2tTZXBhcmF0ZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU3RlbmNpbE9wID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU3RlbmNpbE9wOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTdGVuY2lsT3BTZXBhcmF0ZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFN0ZW5jaWxPcFNlcGFyYXRlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXN0RmVuY2VOViA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRlc3RGZW5jZU5WOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhDb29yZFBvaW50ZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhDb29yZFBvaW50ZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleEVudmYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhFbnZmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEVudmZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhFbnZpID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4RW52aTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4RW52aXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZpdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4RW52eCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEVudng7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleEVudnhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZ4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhFbnZ4diA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEVudnh2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhFbnZ4dk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEVudnh2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhHZW5mT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4R2VuZk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4R2VuZnZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhHZW5mdk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4R2VuaU9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEdlbmlPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleEdlbml2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4R2VuaXZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleEdlbnhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhHZW54T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhHZW54dk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEdlbnh2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhJbWFnZTJEID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4SW1hZ2UyRDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4SW1hZ2UzRE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEltYWdlM0RPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleFBhcmFtZXRlcmYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhQYXJhbWV0ZXJmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFBhcmFtZXRlcmZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhQYXJhbWV0ZXJpID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4UGFyYW1ldGVyaTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4UGFyYW1ldGVyaXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJpdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4UGFyYW1ldGVyeCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFBhcmFtZXRlcng7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleFBhcmFtZXRlcnhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJ4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhQYXJhbWV0ZXJ4diA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFBhcmFtZXRlcnh2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhQYXJhbWV0ZXJ4dk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFBhcmFtZXRlcnh2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhTdWJJbWFnZTJEID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4U3ViSW1hZ2UyRDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4U3ViSW1hZ2UzRE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFN1YkltYWdlM0RPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRyYW5zbGF0ZWYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUcmFuc2xhdGVmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUcmFuc2xhdGV4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVHJhbnNsYXRleDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVHJhbnNsYXRleE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRyYW5zbGF0ZXhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0xZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0xZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVW5pZm9ybTFmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0xZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0xaSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0xaTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVW5pZm9ybTFpdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0xaXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0yZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0yZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVW5pZm9ybTJmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0yZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0yaSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0yaTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVW5pZm9ybTJpdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0yaXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0zZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0zZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVW5pZm9ybTNmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0zZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0zaSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0zaTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVW5pZm9ybTNpdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0zaXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm00ZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm00ZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVW5pZm9ybTRmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm00ZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm00aSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm00aTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVW5pZm9ybTRpdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm00aXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm1NYXRyaXgyZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtTWF0cml4MmZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVbmlmb3JtTWF0cml4M2Z2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybU1hdHJpeDNmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVW5pZm9ybU1hdHJpeDRmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm1NYXRyaXg0ZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVubWFwQnVmZmVyT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5tYXBCdWZmZXJPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVzZVByb2dyYW0gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVc2VQcm9ncmFtOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xWYWxpZGF0ZVByb2dyYW0gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWYWxpZGF0ZVByb2dyYW07Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFZlcnRleEF0dHJpYjFmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliMWY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFZlcnRleEF0dHJpYjFmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjFmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVmVydGV4QXR0cmliMmYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWIyZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVmVydGV4QXR0cmliMmZ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliMmZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xWZXJ0ZXhBdHRyaWIzZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjNmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xWZXJ0ZXhBdHRyaWIzZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWIzZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFZlcnRleEF0dHJpYjRmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliNGY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFZlcnRleEF0dHJpYjRmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjRmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVmVydGV4QXR0cmliUG9pbnRlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYlBvaW50ZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFZlcnRleFBvaW50ZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhQb2ludGVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xWaWV3cG9ydCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZpZXdwb3J0OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xXZWlnaHRQb2ludGVyT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsV2VpZ2h0UG9pbnRlck9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQWN0aXZlU2hhZGVyUHJvZ3JhbUVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEFjdGl2ZVNoYWRlclByb2dyYW1FWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEFscGhhRnVuY1FDT00gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xBbHBoYUZ1bmNRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCZWdpblF1ZXJ5RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmVnaW5RdWVyeUVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmluZFByb2dyYW1QaXBlbGluZUVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRQcm9ncmFtUGlwZWxpbmVFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJsaXRGcmFtZWJ1ZmZlckFOR0xFID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmxpdEZyYW1lYnVmZmVyQU5HTEU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENyZWF0ZVNoYWRlclByb2dyYW12RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ3JlYXRlU2hhZGVyUHJvZ3JhbXZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERlbGV0ZVByb2dyYW1QaXBlbGluZXNFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVQcm9ncmFtUGlwZWxpbmVzRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZWxldGVRdWVyaWVzRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlUXVlcmllc0VYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRHJhd0J1ZmZlcnNOViA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdCdWZmZXJzTlY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEVuZFF1ZXJ5RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRW5kUXVlcnlFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZW5Qcm9ncmFtUGlwZWxpbmVzRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuUHJvZ3JhbVBpcGVsaW5lc0VYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2VuUXVlcmllc0VYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlblF1ZXJpZXNFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRPYmplY3RMYWJlbEVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldE9iamVjdExhYmVsRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UHJvZ3JhbVBpcGVsaW5lSW5mb0xvZ0VYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UHJvZ3JhbVBpcGVsaW5laXZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQcm9ncmFtUGlwZWxpbmVpdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UXVlcnlPYmplY3R1aXZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRRdWVyeU9iamVjdHVpdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UXVlcnlpdkVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFF1ZXJ5aXZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldG5Vbmlmb3JtZnZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRuVW5pZm9ybWZ2RVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRuVW5pZm9ybWl2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0blVuaWZvcm1pdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSW5zZXJ0RXZlbnRNYXJrZXJFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJbnNlcnRFdmVudE1hcmtlckVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSXNQcm9ncmFtUGlwZWxpbmVFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc1Byb2dyYW1QaXBlbGluZUVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSXNRdWVyeUVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzUXVlcnlFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExhYmVsT2JqZWN0RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGFiZWxPYmplY3RFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvcEdyb3VwTWFya2VyRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9wR3JvdXBNYXJrZXJFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1QYXJhbWV0ZXJpRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVBhcmFtZXRlcmlFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtMWZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTFmRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtVW5pZm9ybTFmdkVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtMWZ2RVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtVW5pZm9ybTFpRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0xaUVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm0xaXZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTFpdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm0yZkVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtMmZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtMmZ2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0yZnZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtMmlFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTJpRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtVW5pZm9ybTJpdkVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtMml2RVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtVW5pZm9ybTNmRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0zZkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm0zZnZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTNmdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm0zaUVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtM2lFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtM2l2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0zaXZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtNGZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTRmRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtVW5pZm9ybTRmdkVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtNGZ2RVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtVW5pZm9ybTRpRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm00aUVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm00aXZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTRpdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRmdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHVzaEdyb3VwTWFya2VyRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHVzaEdyb3VwTWFya2VyRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSZWFkQnVmZmVyTlYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZWFkQnVmZmVyTlY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFJlYWRuUGl4ZWxzRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVhZG5QaXhlbHNFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQU5HTEU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQVBQTEU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlc29sdmVNdWx0aXNhbXBsZUZyYW1lYnVmZmVyQVBQTEU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleFN0b3JhZ2UxREVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFN0b3JhZ2UxREVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4U3RvcmFnZTJERVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4U3RvcmFnZTJERVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhTdG9yYWdlM0RFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhTdG9yYWdlM0RFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleHR1cmVTdG9yYWdlMURFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXh0dXJlU3RvcmFnZTFERVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXh0dXJlU3RvcmFnZTJERVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4dHVyZVN0b3JhZ2UyREVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4dHVyZVN0b3JhZ2UzREVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleHR1cmVTdG9yYWdlM0RFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVzZVByb2dyYW1TdGFnZXNFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVc2VQcm9ncmFtU3RhZ2VzRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xWYWxpZGF0ZVByb2dyYW1QaXBlbGluZUVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsR2V0RGlzcGxheSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXREaXNwbGF5OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsSW5pdGlhbGl6ZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xJbml0aWFsaXplOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsVGVybWluYXRlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFRlcm1pbmF0ZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEdldENvbmZpZ3MgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0Q29uZmlnczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbENob29zZUNvbmZpZyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDaG9vc2VDb25maWc7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xHZXRDb25maWdBdHRyaWIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0Q29uZmlnQXR0cmliOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsQ3JlYXRlV2luZG93U3VyZmFjZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDcmVhdGVQaXhtYXBTdXJmYWNlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2U7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xEZXN0cm95U3VyZmFjZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xEZXN0cm95U3VyZmFjZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbFF1ZXJ5U3VyZmFjZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xRdWVyeVN1cmZhY2U7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xDcmVhdGVDb250ZXh0ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbENyZWF0ZUNvbnRleHQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xEZXN0cm95Q29udGV4dCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xEZXN0cm95Q29udGV4dDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbE1ha2VDdXJyZW50ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbE1ha2VDdXJyZW50OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsR2V0Q3VycmVudENvbnRleHQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0Q3VycmVudENvbnRleHQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xHZXRDdXJyZW50U3VyZmFjZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXRDdXJyZW50U3VyZmFjZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEdldEN1cnJlbnREaXNwbGF5ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldEN1cnJlbnREaXNwbGF5OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsUXVlcnlDb250ZXh0ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFF1ZXJ5Q29udGV4dDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbFdhaXRHTCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xXYWl0R0w7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xXYWl0TmF0aXZlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFdhaXROYXRpdmU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xTd2FwQnVmZmVycyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xTd2FwQnVmZmVyczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbENvcHlCdWZmZXJzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbENvcHlCdWZmZXJzOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsR2V0RXJyb3IgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0RXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xRdWVyeVN0cmluZyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xRdWVyeVN0cmluZzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEdldFByb2NBZGRyZXNzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldFByb2NBZGRyZXNzOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsU3VyZmFjZUF0dHJpYiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xTdXJmYWNlQXR0cmliOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsQmluZFRleEltYWdlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEJpbmRUZXhJbWFnZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbFJlbGVhc2VUZXhJbWFnZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xSZWxlYXNlVGV4SW1hZ2U7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xTd2FwSW50ZXJ2YWwgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsU3dhcEludGVydmFsOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsQmluZEFQSSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xCaW5kQVBJOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsUXVlcnlBUEkgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsUXVlcnlBUEk7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xXYWl0Q2xpZW50ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFdhaXRDbGllbnQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xSZWxlYXNlVGhyZWFkID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFJlbGVhc2VUaHJlYWQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbExvY2tTdXJmYWNlS0hSID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbExvY2tTdXJmYWNlS0hSOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsVW5sb2NrU3VyZmFjZUtIUiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xVbmxvY2tTdXJmYWNlS0hSOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsQ3JlYXRlSW1hZ2VLSFIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ3JlYXRlSW1hZ2VLSFI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xEZXN0cm95SW1hZ2VLSFIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsRGVzdHJveUltYWdlS0hSOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsQ3JlYXRlU3luY0tIUiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDcmVhdGVTeW5jS0hSOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsRGVzdHJveVN5bmNLSFIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsRGVzdHJveVN5bmNLSFI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xDbGllbnRXYWl0U3luY0tIUiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDbGllbnRXYWl0U3luY0tIUjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEdldFN5bmNBdHRyaWJLSFIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0U3luY0F0dHJpYktIUjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbFNldFN3YXBSZWN0YW5nbGVBTkRST0lEID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFNldFN3YXBSZWN0YW5nbGVBTkRST0lEOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsR2V0UmVuZGVyQnVmZmVyQU5EUk9JRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXRSZW5kZXJCdWZmZXJBTkRST0lEOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsR2V0U3lzdGVtVGltZUZyZXF1ZW5jeU5WID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldFN5c3RlbVRpbWVGcmVxdWVuY3lOVjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEdldFN5c3RlbVRpbWVOViA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXRTeXN0ZW1UaW1lTlY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBpbnZhbGlkID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2ludmFsaWQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFZlcnRleEF0dHJpYlBvaW50ZXJEYXRhID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliUG9pbnRlckRhdGE7Ci0gIHN0YXRpYyBpbmxpbmUgYm9vbCBGdW5jdGlvbl9Jc1ZhbGlkKGludCB2YWx1ZSkgewotICAgIHJldHVybiBHTE1lc3NhZ2VfRnVuY3Rpb25fSXNWYWxpZCh2YWx1ZSk7Ci0gIH0KLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIEZ1bmN0aW9uX01JTiA9Ci0gICAgR0xNZXNzYWdlX0Z1bmN0aW9uX0Z1bmN0aW9uX01JTjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIEZ1bmN0aW9uX01BWCA9Ci0gICAgR0xNZXNzYWdlX0Z1bmN0aW9uX0Z1bmN0aW9uX01BWDsKLSAgc3RhdGljIGNvbnN0IGludCBGdW5jdGlvbl9BUlJBWVNJWkUgPQotICAgIEdMTWVzc2FnZV9GdW5jdGlvbl9GdW5jdGlvbl9BUlJBWVNJWkU7Ci0gIAotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgLy8gcmVxdWlyZWQgaW50MzIgY29udGV4dF9pZCA9IDE7Ci0gIGlubGluZSBib29sIGhhc19jb250ZXh0X2lkKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2NvbnRleHRfaWQoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrQ29udGV4dElkRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBjb250ZXh0X2lkKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9jb250ZXh0X2lkKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gcmVxdWlyZWQgaW50NjQgc3RhcnRfdGltZSA9IDI7Ci0gIGlubGluZSBib29sIGhhc19zdGFydF90aW1lKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3N0YXJ0X3RpbWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrU3RhcnRUaW1lRmllbGROdW1iZXIgPSAyOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCBzdGFydF90aW1lKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9zdGFydF90aW1lKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgdmFsdWUpOwotICAKLSAgLy8gcmVxdWlyZWQgaW50MzIgZHVyYXRpb24gPSAzOwotICBpbmxpbmUgYm9vbCBoYXNfZHVyYXRpb24oKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZHVyYXRpb24oKTsKLSAgc3RhdGljIGNvbnN0IGludCBrRHVyYXRpb25GaWVsZE51bWJlciA9IDM7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGR1cmF0aW9uKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9kdXJhdGlvbig6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgCi0gIC8vIHJlcXVpcmVkIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkZ1bmN0aW9uIGZ1bmN0aW9uID0gNCBbZGVmYXVsdCA9IGludmFsaWRdOwotICBpbmxpbmUgYm9vbCBoYXNfZnVuY3Rpb24oKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZnVuY3Rpb24oKTsKLSAgc3RhdGljIGNvbnN0IGludCBrRnVuY3Rpb25GaWVsZE51bWJlciA9IDQ7Ci0gIGlubGluZSA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GdW5jdGlvbiBmdW5jdGlvbigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfZnVuY3Rpb24oOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRnVuY3Rpb24gdmFsdWUpOwotICAKLSAgLy8gcmVwZWF0ZWQgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRGF0YVR5cGUgYXJncyA9IDU7Ci0gIGlubGluZSBpbnQgYXJnc19zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2FyZ3MoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrQXJnc0ZpZWxkTnVtYmVyID0gNTsKLSAgaW5saW5lIGNvbnN0IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlJiBhcmdzKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZSogbXV0YWJsZV9hcmdzKGludCBpbmRleCk7Ci0gIGlubGluZSA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZSogYWRkX2FyZ3MoKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUgPiYKLSAgICAgIGFyZ3MoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUgPioKLSAgICAgIG11dGFibGVfYXJncygpOwotICAKLSAgLy8gb3B0aW9uYWwgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRGF0YVR5cGUgcmV0dXJuVmFsdWUgPSA2OwotICBpbmxpbmUgYm9vbCBoYXNfcmV0dXJudmFsdWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfcmV0dXJudmFsdWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrUmV0dXJuVmFsdWVGaWVsZE51bWJlciA9IDY7Ci0gIGlubGluZSBjb25zdCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZSYgcmV0dXJudmFsdWUoKSBjb25zdDsKLSAgaW5saW5lIDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlKiBtdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gIAotICAvLyBvcHRpb25hbCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5GcmFtZUJ1ZmZlciBmYiA9IDc7Ci0gIGlubGluZSBib29sIGhhc19mYigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9mYigpOwotICBzdGF0aWMgY29uc3QgaW50IGtGYkZpZWxkTnVtYmVyID0gNzsKLSAgaW5saW5lIGNvbnN0IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0ZyYW1lQnVmZmVyJiBmYigpIGNvbnN0OwotICBpbmxpbmUgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRnJhbWVCdWZmZXIqIG11dGFibGVfZmIoKTsKLSAgCi0gIC8vIG9wdGlvbmFsIGludDMyIHRocmVhZHRpbWUgPSA4OwotICBpbmxpbmUgYm9vbCBoYXNfdGhyZWFkdGltZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl90aHJlYWR0aW1lKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1RocmVhZHRpbWVGaWVsZE51bWJlciA9IDg7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHRocmVhZHRpbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3RocmVhZHRpbWUoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6YW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZSkKLSBwcml2YXRlOgotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBjb250ZXh0X2lkXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCBzdGFydF90aW1lXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBkdXJhdGlvbl87Ci0gIGludCBmdW5jdGlvbl87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUgPiBhcmdzXzsKLSAgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUqIHJldHVybnZhbHVlXzsKLSAgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRnJhbWVCdWZmZXIqIGZiXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB0aHJlYWR0aW1lXzsKLSAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfZ2x0cmFjZV8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ2x0cmFjZV8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nbHRyYWNlXzJlcHJvdG8oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDggKyAzMSkgLyAzMl07Ci0gIAotICAvLyBXSFkgRE9FUyAmIEhBVkUgTE9XRVIgUFJFQ0VERU5DRSBUSEFOICE9ICE/Ci0gIGlubGluZSBib29sIF9oYXNfYml0KGludCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiAoX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmICgxdSA8PCAoaW5kZXggJSAzMikpKSAhPSAwOwotICB9Ci0gIGlubGluZSB2b2lkIF9zZXRfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gfD0gKDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX2NsZWFyX2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdICY9IH4oMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICAKLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIEdMTWVzc2FnZSogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gR0xNZXNzYWdlX0RhdGFUeXBlCi0KLS8vIHJlcXVpcmVkIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlLlR5cGUgdHlwZSA9IDEgW2RlZmF1bHQgPSBWT0lEXTsKLWlubGluZSBib29sIEdMTWVzc2FnZV9EYXRhVHlwZTo6aGFzX3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgwKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6Y2xlYXJfdHlwZSgpIHsKLSAgdHlwZV8gPSAxOwotICBfY2xlYXJfYml0KDApOwotfQotaW5saW5lIDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgR0xNZXNzYWdlX0RhdGFUeXBlOjp0eXBlKCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgPih0eXBlXyk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OnNldF90eXBlKDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgdmFsdWUpIHsKLSAgR09PR0xFX0RDSEVDSyg6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0lzVmFsaWQodmFsdWUpKTsKLSAgX3NldF9iaXQoMCk7Ci0gIHR5cGVfID0gdmFsdWU7Ci19Ci0KLS8vIHJlcXVpcmVkIGJvb2wgaXNBcnJheSA9IDIgW2RlZmF1bHQgPSBmYWxzZV07Ci1pbmxpbmUgYm9vbCBHTE1lc3NhZ2VfRGF0YVR5cGU6Omhhc19pc2FycmF5KCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmNsZWFyX2lzYXJyYXkoKSB7Ci0gIGlzYXJyYXlfID0gZmFsc2U7Ci0gIF9jbGVhcl9iaXQoMSk7Ci19Ci1pbmxpbmUgYm9vbCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmlzYXJyYXkoKSBjb25zdCB7Ci0gIHJldHVybiBpc2FycmF5XzsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6c2V0X2lzYXJyYXkoYm9vbCB2YWx1ZSkgewotICBfc2V0X2JpdCgxKTsKLSAgaXNhcnJheV8gPSB2YWx1ZTsKLX0KLQotLy8gcmVwZWF0ZWQgaW50MzIgaW50VmFsdWUgPSAzOwotaW5saW5lIGludCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmludHZhbHVlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBpbnR2YWx1ZV8uc2l6ZSgpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpjbGVhcl9pbnR2YWx1ZSgpIHsKLSAgaW50dmFsdWVfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBHTE1lc3NhZ2VfRGF0YVR5cGU6OmludHZhbHVlKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gaW50dmFsdWVfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OnNldF9pbnR2YWx1ZShpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgaW50dmFsdWVfLlNldChpbmRleCwgdmFsdWUpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjphZGRfaW50dmFsdWUoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBpbnR2YWx1ZV8uQWRkKHZhbHVlKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKLUdMTWVzc2FnZV9EYXRhVHlwZTo6aW50dmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiBpbnR2YWx1ZV87Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCi1HTE1lc3NhZ2VfRGF0YVR5cGU6Om11dGFibGVfaW50dmFsdWUoKSB7Ci0gIHJldHVybiAmaW50dmFsdWVfOwotfQotCi0vLyByZXBlYXRlZCBmbG9hdCBmbG9hdFZhbHVlID0gNDsKLWlubGluZSBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlOjpmbG9hdHZhbHVlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBmbG9hdHZhbHVlXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmNsZWFyX2Zsb2F0dmFsdWUoKSB7Ci0gIGZsb2F0dmFsdWVfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgZmxvYXQgR0xNZXNzYWdlX0RhdGFUeXBlOjpmbG9hdHZhbHVlKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gZmxvYXR2YWx1ZV8uR2V0KGluZGV4KTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6c2V0X2Zsb2F0dmFsdWUoaW50IGluZGV4LCBmbG9hdCB2YWx1ZSkgewotICBmbG9hdHZhbHVlXy5TZXQoaW5kZXgsIHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6YWRkX2Zsb2F0dmFsdWUoZmxvYXQgdmFsdWUpIHsKLSAgZmxvYXR2YWx1ZV8uQWRkKHZhbHVlKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IGZsb2F0ID4mCi1HTE1lc3NhZ2VfRGF0YVR5cGU6OmZsb2F0dmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiBmbG9hdHZhbHVlXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IGZsb2F0ID4qCi1HTE1lc3NhZ2VfRGF0YVR5cGU6Om11dGFibGVfZmxvYXR2YWx1ZSgpIHsKLSAgcmV0dXJuICZmbG9hdHZhbHVlXzsKLX0KLQotLy8gcmVwZWF0ZWQgYnl0ZXMgY2hhclZhbHVlID0gNTsKLWlubGluZSBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlOjpjaGFydmFsdWVfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGNoYXJ2YWx1ZV8uc2l6ZSgpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpjbGVhcl9jaGFydmFsdWUoKSB7Ci0gIGNoYXJ2YWx1ZV8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBHTE1lc3NhZ2VfRGF0YVR5cGU6OmNoYXJ2YWx1ZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGNoYXJ2YWx1ZV8uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBHTE1lc3NhZ2VfRGF0YVR5cGU6Om11dGFibGVfY2hhcnZhbHVlKGludCBpbmRleCkgewotICByZXR1cm4gY2hhcnZhbHVlXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6c2V0X2NoYXJ2YWx1ZShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIGNoYXJ2YWx1ZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OnNldF9jaGFydmFsdWUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkgewotICBjaGFydmFsdWVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpzZXRfY2hhcnZhbHVlKGludCBpbmRleCwgY29uc3Qgdm9pZCogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIGNoYXJ2YWx1ZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbigKLSAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIEdMTWVzc2FnZV9EYXRhVHlwZTo6YWRkX2NoYXJ2YWx1ZSgpIHsKLSAgcmV0dXJuIGNoYXJ2YWx1ZV8uQWRkKCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmFkZF9jaGFydmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgY2hhcnZhbHVlXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6YWRkX2NoYXJ2YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBjaGFydmFsdWVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjphZGRfY2hhcnZhbHVlKGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBjaGFydmFsdWVfLkFkZCgpLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JgotR0xNZXNzYWdlX0RhdGFUeXBlOjpjaGFydmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiBjaGFydmFsdWVfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qCi1HTE1lc3NhZ2VfRGF0YVR5cGU6Om11dGFibGVfY2hhcnZhbHVlKCkgewotICByZXR1cm4gJmNoYXJ2YWx1ZV87Ci19Ci0KLS8vIHJlcGVhdGVkIGJ5dGVzIHJhd0J5dGVzID0gNjsKLWlubGluZSBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlOjpyYXdieXRlc19zaXplKCkgY29uc3QgewotICByZXR1cm4gcmF3Ynl0ZXNfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6Y2xlYXJfcmF3Ynl0ZXMoKSB7Ci0gIHJhd2J5dGVzXy5DbGVhcigpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEdMTWVzc2FnZV9EYXRhVHlwZTo6cmF3Ynl0ZXMoaW50IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiByYXdieXRlc18uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBHTE1lc3NhZ2VfRGF0YVR5cGU6Om11dGFibGVfcmF3Ynl0ZXMoaW50IGluZGV4KSB7Ci0gIHJldHVybiByYXdieXRlc18uTXV0YWJsZShpbmRleCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OnNldF9yYXdieXRlcyhpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHJhd2J5dGVzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6c2V0X3Jhd2J5dGVzKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKLSAgcmF3Ynl0ZXNfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpzZXRfcmF3Ynl0ZXMoaW50IGluZGV4LCBjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgcmF3Ynl0ZXNfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oCi0gICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBHTE1lc3NhZ2VfRGF0YVR5cGU6OmFkZF9yYXdieXRlcygpIHsKLSAgcmV0dXJuIHJhd2J5dGVzXy5BZGQoKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6YWRkX3Jhd2J5dGVzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHJhd2J5dGVzXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6YWRkX3Jhd2J5dGVzKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHJhd2J5dGVzXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6YWRkX3Jhd2J5dGVzKGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICByYXdieXRlc18uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mCi1HTE1lc3NhZ2VfRGF0YVR5cGU6OnJhd2J5dGVzKCkgY29uc3QgewotICByZXR1cm4gcmF3Ynl0ZXNfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qCi1HTE1lc3NhZ2VfRGF0YVR5cGU6Om11dGFibGVfcmF3Ynl0ZXMoKSB7Ci0gIHJldHVybiAmcmF3Ynl0ZXNfOwotfQotCi0vLyByZXBlYXRlZCBib29sIGJvb2xWYWx1ZSA9IDc7Ci1pbmxpbmUgaW50IEdMTWVzc2FnZV9EYXRhVHlwZTo6Ym9vbHZhbHVlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBib29sdmFsdWVfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6Y2xlYXJfYm9vbHZhbHVlKCkgewotICBib29sdmFsdWVfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgYm9vbCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmJvb2x2YWx1ZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGJvb2x2YWx1ZV8uR2V0KGluZGV4KTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6c2V0X2Jvb2x2YWx1ZShpbnQgaW5kZXgsIGJvb2wgdmFsdWUpIHsKLSAgYm9vbHZhbHVlXy5TZXQoaW5kZXgsIHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6YWRkX2Jvb2x2YWx1ZShib29sIHZhbHVlKSB7Ci0gIGJvb2x2YWx1ZV8uQWRkKHZhbHVlKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IGJvb2wgPiYKLUdMTWVzc2FnZV9EYXRhVHlwZTo6Ym9vbHZhbHVlKCkgY29uc3QgewotICByZXR1cm4gYm9vbHZhbHVlXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IGJvb2wgPioKLUdMTWVzc2FnZV9EYXRhVHlwZTo6bXV0YWJsZV9ib29sdmFsdWUoKSB7Ci0gIHJldHVybiAmYm9vbHZhbHVlXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBHTE1lc3NhZ2VfRnJhbWVCdWZmZXIKLQotLy8gcmVxdWlyZWQgaW50MzIgd2lkdGggPSAxOwotaW5saW5lIGJvb2wgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpoYXNfd2lkdGgoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgwKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6Y2xlYXJfd2lkdGgoKSB7Ci0gIHdpZHRoXyA9IDA7Ci0gIF9jbGVhcl9iaXQoMCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OndpZHRoKCkgY29uc3QgewotICByZXR1cm4gd2lkdGhfOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpzZXRfd2lkdGgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCgwKTsKLSAgd2lkdGhfID0gdmFsdWU7Ci19Ci0KLS8vIHJlcXVpcmVkIGludDMyIGhlaWdodCA9IDI7Ci1pbmxpbmUgYm9vbCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6Omhhc19oZWlnaHQoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgxKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6Y2xlYXJfaGVpZ2h0KCkgewotICBoZWlnaHRfID0gMDsKLSAgX2NsZWFyX2JpdCgxKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6aGVpZ2h0KCkgY29uc3QgewotICByZXR1cm4gaGVpZ2h0XzsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6c2V0X2hlaWdodCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDEpOwotICBoZWlnaHRfID0gdmFsdWU7Ci19Ci0KLS8vIHJlcGVhdGVkIGJ5dGVzIGNvbnRlbnRzID0gMzsKLWlubGluZSBpbnQgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpjb250ZW50c19zaXplKCkgY29uc3QgewotICByZXR1cm4gY29udGVudHNfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6Y2xlYXJfY29udGVudHMoKSB7Ci0gIGNvbnRlbnRzXy5DbGVhcigpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6Y29udGVudHMoaW50IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBjb250ZW50c18uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6Om11dGFibGVfY29udGVudHMoaW50IGluZGV4KSB7Ci0gIHJldHVybiBjb250ZW50c18uTXV0YWJsZShpbmRleCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OnNldF9jb250ZW50cyhpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIGNvbnRlbnRzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6c2V0X2NvbnRlbnRzKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKLSAgY29udGVudHNfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpzZXRfY29udGVudHMoaW50IGluZGV4LCBjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgY29udGVudHNfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oCi0gICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmFkZF9jb250ZW50cygpIHsKLSAgcmV0dXJuIGNvbnRlbnRzXy5BZGQoKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6YWRkX2NvbnRlbnRzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIGNvbnRlbnRzXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6YWRkX2NvbnRlbnRzKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIGNvbnRlbnRzXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6YWRkX2NvbnRlbnRzKGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBjb250ZW50c18uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mCi1HTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmNvbnRlbnRzKCkgY29uc3QgewotICByZXR1cm4gY29udGVudHNfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qCi1HTE1lc3NhZ2VfRnJhbWVCdWZmZXI6Om11dGFibGVfY29udGVudHMoKSB7Ci0gIHJldHVybiAmY29udGVudHNfOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEdMTWVzc2FnZQotCi0vLyByZXF1aXJlZCBpbnQzMiBjb250ZXh0X2lkID0gMTsKLWlubGluZSBib29sIEdMTWVzc2FnZTo6aGFzX2NvbnRleHRfaWQoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgwKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZTo6Y2xlYXJfY29udGV4dF9pZCgpIHsKLSAgY29udGV4dF9pZF8gPSAwOwotICBfY2xlYXJfYml0KDApOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgR0xNZXNzYWdlOjpjb250ZXh0X2lkKCkgY29uc3QgewotICByZXR1cm4gY29udGV4dF9pZF87Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2U6OnNldF9jb250ZXh0X2lkKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIGNvbnRleHRfaWRfID0gdmFsdWU7Ci19Ci0KLS8vIHJlcXVpcmVkIGludDY0IHN0YXJ0X3RpbWUgPSAyOwotaW5saW5lIGJvb2wgR0xNZXNzYWdlOjpoYXNfc3RhcnRfdGltZSgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDEpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlOjpjbGVhcl9zdGFydF90aW1lKCkgewotICBzdGFydF90aW1lXyA9IEdPT0dMRV9MT05HTE9ORygwKTsKLSAgX2NsZWFyX2JpdCgxKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IEdMTWVzc2FnZTo6c3RhcnRfdGltZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXJ0X3RpbWVfOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlOjpzZXRfc3RhcnRfdGltZSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IHZhbHVlKSB7Ci0gIF9zZXRfYml0KDEpOwotICBzdGFydF90aW1lXyA9IHZhbHVlOwotfQotCi0vLyByZXF1aXJlZCBpbnQzMiBkdXJhdGlvbiA9IDM7Ci1pbmxpbmUgYm9vbCBHTE1lc3NhZ2U6Omhhc19kdXJhdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDIpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlOjpjbGVhcl9kdXJhdGlvbigpIHsKLSAgZHVyYXRpb25fID0gMDsKLSAgX2NsZWFyX2JpdCgyKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEdMTWVzc2FnZTo6ZHVyYXRpb24oKSBjb25zdCB7Ci0gIHJldHVybiBkdXJhdGlvbl87Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2U6OnNldF9kdXJhdGlvbig6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDIpOwotICBkdXJhdGlvbl8gPSB2YWx1ZTsKLX0KLQotLy8gcmVxdWlyZWQgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRnVuY3Rpb24gZnVuY3Rpb24gPSA0IFtkZWZhdWx0ID0gaW52YWxpZF07Ci1pbmxpbmUgYm9vbCBHTE1lc3NhZ2U6Omhhc19mdW5jdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDMpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlOjpjbGVhcl9mdW5jdGlvbigpIHsKLSAgZnVuY3Rpb25fID0gMzAwMDsKLSAgX2NsZWFyX2JpdCgzKTsKLX0KLWlubGluZSA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmZ1bmN0aW9uKCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0Z1bmN0aW9uID4oZnVuY3Rpb25fKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZTo6c2V0X2Z1bmN0aW9uKDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0Z1bmN0aW9uIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRnVuY3Rpb25fSXNWYWxpZCh2YWx1ZSkpOwotICBfc2V0X2JpdCgzKTsKLSAgZnVuY3Rpb25fID0gdmFsdWU7Ci19Ci0KLS8vIHJlcGVhdGVkIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlIGFyZ3MgPSA1OwotaW5saW5lIGludCBHTE1lc3NhZ2U6OmFyZ3Nfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGFyZ3NfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZTo6Y2xlYXJfYXJncygpIHsKLSAgYXJnc18uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZSYgR0xNZXNzYWdlOjphcmdzKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gYXJnc18uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZSogR0xNZXNzYWdlOjptdXRhYmxlX2FyZ3MoaW50IGluZGV4KSB7Ci0gIHJldHVybiBhcmdzXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZSogR0xNZXNzYWdlOjphZGRfYXJncygpIHsKLSAgcmV0dXJuIGFyZ3NfLkFkZCgpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUgPiYKLUdMTWVzc2FnZTo6YXJncygpIGNvbnN0IHsKLSAgcmV0dXJuIGFyZ3NfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUgPioKLUdMTWVzc2FnZTo6bXV0YWJsZV9hcmdzKCkgewotICByZXR1cm4gJmFyZ3NfOwotfQotCi0vLyBvcHRpb25hbCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZSByZXR1cm5WYWx1ZSA9IDY7Ci1pbmxpbmUgYm9vbCBHTE1lc3NhZ2U6Omhhc19yZXR1cm52YWx1ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDUpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlOjpjbGVhcl9yZXR1cm52YWx1ZSgpIHsKLSAgaWYgKHJldHVybnZhbHVlXyAhPSBOVUxMKSByZXR1cm52YWx1ZV8tPjo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlOjpDbGVhcigpOwotICBfY2xlYXJfYml0KDUpOwotfQotaW5saW5lIGNvbnN0IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlJiBHTE1lc3NhZ2U6OnJldHVybnZhbHVlKCkgY29uc3QgewotICByZXR1cm4gcmV0dXJudmFsdWVfICE9IE5VTEwgPyAqcmV0dXJudmFsdWVfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5yZXR1cm52YWx1ZV87Ci19Ci1pbmxpbmUgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUqIEdMTWVzc2FnZTo6bXV0YWJsZV9yZXR1cm52YWx1ZSgpIHsKLSAgX3NldF9iaXQoNSk7Ci0gIGlmIChyZXR1cm52YWx1ZV8gPT0gTlVMTCkgcmV0dXJudmFsdWVfID0gbmV3IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlOwotICByZXR1cm4gcmV0dXJudmFsdWVfOwotfQotCi0vLyBvcHRpb25hbCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5GcmFtZUJ1ZmZlciBmYiA9IDc7Ci1pbmxpbmUgYm9vbCBHTE1lc3NhZ2U6Omhhc19mYigpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDYpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlOjpjbGVhcl9mYigpIHsKLSAgaWYgKGZiXyAhPSBOVUxMKSBmYl8tPjo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpDbGVhcigpOwotICBfY2xlYXJfYml0KDYpOwotfQotaW5saW5lIGNvbnN0IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0ZyYW1lQnVmZmVyJiBHTE1lc3NhZ2U6OmZiKCkgY29uc3QgewotICByZXR1cm4gZmJfICE9IE5VTEwgPyAqZmJfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5mYl87Ci19Ci1pbmxpbmUgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRnJhbWVCdWZmZXIqIEdMTWVzc2FnZTo6bXV0YWJsZV9mYigpIHsKLSAgX3NldF9iaXQoNik7Ci0gIGlmIChmYl8gPT0gTlVMTCkgZmJfID0gbmV3IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0ZyYW1lQnVmZmVyOwotICByZXR1cm4gZmJfOwotfQotCi0vLyBvcHRpb25hbCBpbnQzMiB0aHJlYWR0aW1lID0gODsKLWlubGluZSBib29sIEdMTWVzc2FnZTo6aGFzX3RocmVhZHRpbWUoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCg3KTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZTo6Y2xlYXJfdGhyZWFkdGltZSgpIHsKLSAgdGhyZWFkdGltZV8gPSAwOwotICBfY2xlYXJfYml0KDcpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgR0xNZXNzYWdlOjp0aHJlYWR0aW1lKCkgY29uc3QgewotICByZXR1cm4gdGhyZWFkdGltZV87Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2U6OnNldF90aHJlYWR0aW1lKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgX3NldF9iaXQoNyk7Ci0gIHRocmVhZHRpbWVfID0gdmFsdWU7Ci19Ci0KLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKLQotfSAgLy8gbmFtZXNwYWNlIGdsdHJhY2UKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCi0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfZ2x0cmFjZV8yZXByb3RvX19JTkNMVURFRApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9hcGkuY3BwIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9hcGkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWY2Y2JiLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfYXBpLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ODYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIFRISVMgRklMRSBXQVMgR0VORVJBVEVEIEJZIEEgU0NSSVBULiBETyBOT1QgRURJVC4KLSAqLwotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotCi0jaW5jbHVkZSAiZ2x0cmFjZS5wYi5oIgotI2luY2x1ZGUgImdsdHJhY2VfY29udGV4dC5oIgotI2luY2x1ZGUgImdsdHJhY2VfZml4dXAuaCIKLSNpbmNsdWRlICJnbHRyYWNlX3RyYW5zcG9ydC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgZ2x0cmFjZSB7Ci0KLS8vIERlZmluaXRpb25zIGZvciBHTDIgQVBJcwotCi12b2lkIEdMVHJhY2VfZ2xBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXh0dXJlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xBY3RpdmVUZXh0dXJlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHR1cmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190ZXh0dXJlLT5hZGRfaW50dmFsdWUoKGludCl0ZXh0dXJlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xBY3RpdmVUZXh0dXJlKHRleHR1cmUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQXR0YWNoU2hhZGVyKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xBdHRhY2hTaGFkZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaGFkZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaGFkZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaGFkZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaGFkZXItPmFkZF9pbnR2YWx1ZShzaGFkZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBzaGFkZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQmluZEF0dHJpYkxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciogbmFtZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmluZEF0dHJpYkxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5kZXgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmRleCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZGV4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZGV4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmRleC0+YWRkX2ludHZhbHVlKGluZGV4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX25hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX25hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX25hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KW5hbWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBpbmRleCwgbmFtZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBuYW1lLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCaW5kQnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJpbmRCdWZmZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZmZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZmZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZmZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmZmVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZmZXItPmFkZF9pbnR2YWx1ZShidWZmZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJpbmRCdWZmZXIodGFyZ2V0LCBidWZmZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQmluZEZyYW1lYnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmluZEZyYW1lYnVmZmVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZnJhbWVidWZmZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mcmFtZWJ1ZmZlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19mcmFtZWJ1ZmZlci0+YWRkX2ludHZhbHVlKGZyYW1lYnVmZmVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCaW5kRnJhbWVidWZmZXIodGFyZ2V0LCBmcmFtZWJ1ZmZlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCaW5kUmVuZGVyYnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJpbmRSZW5kZXJidWZmZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZW5kZXJidWZmZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZW5kZXJidWZmZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZW5kZXJidWZmZXItPmFkZF9pbnR2YWx1ZShyZW5kZXJidWZmZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJpbmRSZW5kZXJidWZmZXIodGFyZ2V0LCByZW5kZXJidWZmZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQmluZFRleHR1cmUoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJpbmRUZXh0dXJlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHR1cmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RleHR1cmUtPmFkZF9pbnR2YWx1ZSh0ZXh0dXJlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCaW5kVGV4dHVyZSh0YXJnZXQsIHRleHR1cmUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQmxlbmRDb2xvcihHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmxlbmRDb2xvcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JlZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZWQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcmVkLT5hZGRfZmxvYXR2YWx1ZShyZWQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncmVlbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyZWVuID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JlZW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JlZW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfZ3JlZW4tPmFkZF9mbG9hdHZhbHVlKGdyZWVuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYmx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ibHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JsdWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfYmx1ZS0+YWRkX2Zsb2F0dmFsdWUoYmx1ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGFscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYWxwaGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19hbHBoYS0+YWRkX2Zsb2F0dmFsdWUoYWxwaGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJsZW5kQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQmxlbmRFcXVhdGlvbihHTGVudW0gbW9kZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmxlbmRFcXVhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb2RlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9kZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb2RlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbW9kZS0+YWRkX2ludHZhbHVlKChpbnQpbW9kZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmxlbmRFcXVhdGlvbihtb2RlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJsZW5kRXF1YXRpb25TZXBhcmF0ZShHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmxlbmRFcXVhdGlvblNlcGFyYXRlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZVJHQgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGVSR0IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb2RlUkdCLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGVSR0ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlUkdCLT5hZGRfaW50dmFsdWUoKGludCltb2RlUkdCKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZUFscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9kZUFscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9kZUFscGhhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGVBbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX21vZGVBbHBoYS0+YWRkX2ludHZhbHVlKChpbnQpbW9kZUFscGhhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUobW9kZVJHQiwgbW9kZUFscGhhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJsZW5kRnVuYyhHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJsZW5kRnVuYyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNmYWN0b3IKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zZmFjdG9yID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2ZhY3Rvci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zZmFjdG9yLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfc2ZhY3Rvci0+YWRkX2ludHZhbHVlKChpbnQpc2ZhY3Rvcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRmYWN0b3IKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kZmFjdG9yID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGZhY3Rvci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kZmFjdG9yLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZGZhY3Rvci0+YWRkX2ludHZhbHVlKChpbnQpZGZhY3Rvcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmxlbmRGdW5jKHNmYWN0b3IsIGRmYWN0b3IpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQmxlbmRGdW5jU2VwYXJhdGUoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJsZW5kRnVuY1NlcGFyYXRlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc3JjUkdCCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3JjUkdCID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3JjUkdCLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NyY1JHQi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3NyY1JHQi0+YWRkX2ludHZhbHVlKChpbnQpc3JjUkdCKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZHN0UkdCCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHN0UkdCID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZHN0UkdCLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RzdFJHQi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2RzdFJHQi0+YWRkX2ludHZhbHVlKChpbnQpZHN0UkdCKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc3JjQWxwaGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zcmNBbHBoYSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NyY0FscGhhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NyY0FscGhhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfc3JjQWxwaGEtPmFkZF9pbnR2YWx1ZSgoaW50KXNyY0FscGhhKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZHN0QWxwaGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kc3RBbHBoYSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RzdEFscGhhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RzdEFscGhhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZHN0QWxwaGEtPmFkZF9pbnR2YWx1ZSgoaW50KWRzdEFscGhhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCbGVuZEZ1bmNTZXBhcmF0ZShzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJ1ZmZlckRhdGEoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEsIEdMZW51bSB1c2FnZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQnVmZmVyRGF0YSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaXplLT5hZGRfaW50dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRhdGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kYXRhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGF0YS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kYXRhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kYXRhLT5hZGRfaW50dmFsdWUoKGludClkYXRhKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdXNhZ2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ191c2FnZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3VzYWdlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3VzYWdlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdXNhZ2UtPmFkZF9pbnR2YWx1ZSgoaW50KXVzYWdlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCdWZmZXJEYXRhKHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNhZ2UpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZGF0YSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQnVmZmVyU3ViRGF0YShHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCdWZmZXJTdWJEYXRhKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgb2Zmc2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfb2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfb2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX29mZnNldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfb2Zmc2V0LT5hZGRfaW50dmFsdWUob2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NpemUtPmFkZF9pbnR2YWx1ZShzaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGF0YQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RhdGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kYXRhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RhdGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RhdGEtPmFkZF9pbnR2YWx1ZSgoaW50KWRhdGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJ1ZmZlclN1YkRhdGEodGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZGF0YSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotR0xlbnVtIEdMVHJhY2VfZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMZW51bSB0YXJnZXQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGVudW0gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENoZWNrRnJhbWVidWZmZXJTdGF0dXModGFyZ2V0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIHJ0LT5hZGRfaW50dmFsdWUoKGludClyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGVhcihHTGJpdGZpZWxkIG1hc2spIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENsZWFyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWFzawotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21hc2sgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXNrLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21hc2stPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21hc2stPmFkZF9pbnR2YWx1ZShtYXNrKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDbGVhcihtYXNrKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENsZWFyQ29sb3IoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENsZWFyQ29sb3IpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3JlZC0+YWRkX2Zsb2F0dmFsdWUocmVkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZ3JlZW4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncmVlbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2dyZWVuLT5hZGRfZmxvYXR2YWx1ZShncmVlbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ibHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ibHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2JsdWUtPmFkZF9mbG9hdHZhbHVlKGJsdWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYWxwaGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfYWxwaGEtPmFkZF9mbG9hdHZhbHVlKGFscGhhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDbGVhckNvbG9yKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENsZWFyRGVwdGhmKEdMY2xhbXBmIGRlcHRoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGVhckRlcHRoZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRlcHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGVwdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kZXB0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kZXB0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19kZXB0aC0+YWRkX2Zsb2F0dmFsdWUoZGVwdGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENsZWFyRGVwdGhmKGRlcHRoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENsZWFyU3RlbmNpbChHTGludCBzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGVhclN0ZW5jaWwpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3MtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcy0+YWRkX2ludHZhbHVlKHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENsZWFyU3RlbmNpbChzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENvbG9yTWFzayhHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvbG9yTWFzayk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JlZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZWQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ19yZWQtPmFkZF9ib29sdmFsdWUocmVkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZ3JlZW4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncmVlbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfZ3JlZW4tPmFkZF9ib29sdmFsdWUoZ3JlZW4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBibHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYmx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX2JsdWUtPmFkZF9ib29sdmFsdWUoYmx1ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGFscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYWxwaGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX2FscGhhLT5hZGRfYm9vbHZhbHVlKGFscGhhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDb2xvck1hc2socmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ29tcGlsZVNoYWRlcihHTHVpbnQgc2hhZGVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDb21waWxlU2hhZGVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2hhZGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2hhZGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2hhZGVyLT5hZGRfaW50dmFsdWUoc2hhZGVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDb21wcmVzc2VkVGV4SW1hZ2UyRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludGVybmFsZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW50ZXJuYWxmb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClpbnRlcm5hbGZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJvcmRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JvcmRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JvcmRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ib3JkZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2JvcmRlci0+YWRkX2ludHZhbHVlKGJvcmRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGltYWdlU2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ltYWdlU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ltYWdlU2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbWFnZVNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ltYWdlU2l6ZS0+YWRkX2ludHZhbHVlKGltYWdlU2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRhdGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kYXRhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGF0YS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kYXRhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kYXRhLT5hZGRfaW50dmFsdWUoKGludClkYXRhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBpbWFnZVNpemUsIGRhdGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZGF0YSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHhvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeG9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194b2Zmc2V0LT5hZGRfaW50dmFsdWUoeG9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHlvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeW9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195b2Zmc2V0LT5hZGRfaW50dmFsdWUoeW9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Zvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGltYWdlU2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ltYWdlU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ltYWdlU2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbWFnZVNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ltYWdlU2l6ZS0+YWRkX2ludHZhbHVlKGltYWdlU2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRhdGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kYXRhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGF0YS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kYXRhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kYXRhLT5hZGRfaW50dmFsdWUoKGludClkYXRhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGltYWdlU2l6ZSwgZGF0YSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBkYXRhLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb3B5VGV4SW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDb3B5VGV4SW1hZ2UyRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludGVybmFsZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW50ZXJuYWxmb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClpbnRlcm5hbGZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJvcmRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JvcmRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JvcmRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ib3JkZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2JvcmRlci0+YWRkX2ludHZhbHVlKGJvcmRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ29weVRleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJvcmRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb3B5VGV4U3ViSW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvcHlUZXhTdWJJbWFnZTJEKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeG9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3hvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3hvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3hvZmZzZXQtPmFkZF9pbnR2YWx1ZSh4b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeW9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3lvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3lvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3lvZmZzZXQtPmFkZF9pbnR2YWx1ZSh5b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDb3B5VGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLUdMdWludCBHTFRyYWNlX2dsQ3JlYXRlUHJvZ3JhbSh2b2lkKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDcmVhdGVQcm9ncmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0x1aW50IHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDcmVhdGVQcm9ncmFtKCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIHJ0LT5hZGRfaW50dmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotR0x1aW50IEdMVHJhY2VfZ2xDcmVhdGVTaGFkZXIoR0xlbnVtIHR5cGUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENyZWF0ZVNoYWRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMdWludCByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ3JlYXRlU2hhZGVyKHR5cGUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBydC0+YWRkX2ludHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEN1bGxGYWNlKEdMZW51bSBtb2RlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDdWxsRmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb2RlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9kZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb2RlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbW9kZS0+YWRkX2ludHZhbHVlKChpbnQpbW9kZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ3VsbEZhY2UobW9kZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZWxldGVCdWZmZXJzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBidWZmZXJzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZWxldGVCdWZmZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZmZlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZmZlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KWJ1ZmZlcnMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlbGV0ZUJ1ZmZlcnMobiwgYnVmZmVycyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBidWZmZXJzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVsZXRlRnJhbWVidWZmZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZnJhbWVidWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnJhbWVidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZnJhbWVidWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZnJhbWVidWZmZXJzLT5hZGRfaW50dmFsdWUoKGludClmcmFtZWJ1ZmZlcnMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlbGV0ZUZyYW1lYnVmZmVycyhuLCBmcmFtZWJ1ZmZlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZnJhbWVidWZmZXJzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZWxldGVQcm9ncmFtKEdMdWludCBwcm9ncmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZWxldGVQcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVsZXRlUmVuZGVyYnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVsZXRlUmVuZGVyYnVmZmVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlbmRlcmJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZW5kZXJidWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZW5kZXJidWZmZXJzLT5hZGRfaW50dmFsdWUoKGludClyZW5kZXJidWZmZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZWxldGVSZW5kZXJidWZmZXJzKG4sIHJlbmRlcmJ1ZmZlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcmVuZGVyYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVsZXRlU2hhZGVyKEdMdWludCBzaGFkZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlbGV0ZVNoYWRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNoYWRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NoYWRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaGFkZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NoYWRlci0+YWRkX2ludHZhbHVlKHNoYWRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogdGV4dHVyZXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlbGV0ZVRleHR1cmVzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0dXJlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHR1cmVzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmVzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190ZXh0dXJlcy0+YWRkX2ludHZhbHVlKChpbnQpdGV4dHVyZXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlbGV0ZVRleHR1cmVzKG4sIHRleHR1cmVzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHRleHR1cmVzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZXB0aEZ1bmMoR0xlbnVtIGZ1bmMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlcHRoRnVuYyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZ1bmMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mdW5jID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZnVuYy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mdW5jLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZnVuYy0+YWRkX2ludHZhbHVlKChpbnQpZnVuYyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVwdGhGdW5jKGZ1bmMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVwdGhNYXNrKEdMYm9vbGVhbiBmbGFnKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZXB0aE1hc2spOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmbGFnCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmxhZyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZsYWctPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmxhZy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX2ZsYWctPmFkZF9ib29sdmFsdWUoZmxhZyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVwdGhNYXNrKGZsYWcpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVwdGhSYW5nZWYoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlcHRoUmFuZ2VmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgek5lYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196TmVhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3pOZWFyLT5hZGRfZmxvYXR2YWx1ZSh6TmVhcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpGYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196RmFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfekZhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196RmFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3pGYXItPmFkZF9mbG9hdHZhbHVlKHpGYXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlcHRoUmFuZ2VmKHpOZWFyLCB6RmFyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERldGFjaFNoYWRlcihHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGV0YWNoU2hhZGVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2hhZGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2hhZGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2hhZGVyLT5hZGRfaW50dmFsdWUoc2hhZGVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZXRhY2hTaGFkZXIocHJvZ3JhbSwgc2hhZGVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERpc2FibGUoR0xlbnVtIGNhcCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGlzYWJsZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNhcAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NhcCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NhcC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jYXAtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19jYXAtPmFkZF9pbnR2YWx1ZSgoaW50KWNhcCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGlzYWJsZShjYXApOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KEdMdWludCBpbmRleCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5kZXgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmRleCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZGV4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZGV4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmRleC0+YWRkX2ludHZhbHVlKGluZGV4KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRHJhd0FycmF5cyhHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERyYXdBcnJheXMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtb2RlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9kZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbW9kZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX21vZGUtPmFkZF9pbnR2YWx1ZSgoaW50KW1vZGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmaXJzdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZpcnN0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmlyc3QtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmlyc3QtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZpcnN0LT5hZGRfaW50dmFsdWUoZmlyc3QpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERyYXdBcnJheXMobW9kZSwgZmlyc3QsIGNvdW50KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERyYXdFbGVtZW50cyhHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogaW5kaWNlcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRHJhd0VsZW1lbnRzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb2RlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlLT5hZGRfaW50dmFsdWUoKGludCltb2RlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3R5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3R5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190eXBlLT5hZGRfaW50dmFsdWUoKGludCl0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5kaWNlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZGljZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmRpY2VzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZGljZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZGljZXMtPmFkZF9pbnR2YWx1ZSgoaW50KWluZGljZXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERyYXdFbGVtZW50cyhtb2RlLCBjb3VudCwgdHlwZSwgaW5kaWNlcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBpbmRpY2VzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFbmFibGUoR0xlbnVtIGNhcCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRW5hYmxlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY2FwCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY2FwID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY2FwLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NhcC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2NhcC0+YWRkX2ludHZhbHVlKChpbnQpY2FwKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFbmFibGUoY2FwKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEdMdWludCBpbmRleCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbmRleAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZGV4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5kZXgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW5kZXgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZGV4LT5hZGRfaW50dmFsdWUoaW5kZXgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGluZGV4KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZpbmlzaCh2b2lkKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGaW5pc2gpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZpbmlzaCgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRmx1c2godm9pZCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRmx1c2gpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZsdXNoKCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhdHRhY2htZW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXR0YWNobWVudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXR0YWNobWVudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPmFkZF9pbnR2YWx1ZSgoaW50KWF0dGFjaG1lbnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZW5kZXJidWZmZXJ0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXJ0YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZW5kZXJidWZmZXJ0YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVydGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVydGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludClyZW5kZXJidWZmZXJ0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZW5kZXJidWZmZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZW5kZXJidWZmZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZW5kZXJidWZmZXItPmFkZF9pbnR2YWx1ZShyZW5kZXJidWZmZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHRhcmdldCwgYXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRnJhbWVidWZmZXJUZXh0dXJlMkQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhdHRhY2htZW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXR0YWNobWVudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXR0YWNobWVudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPmFkZF9pbnR2YWx1ZSgoaW50KWF0dGFjaG1lbnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGV4dGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0ZXh0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0dXJlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dHVyZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdGV4dHVyZS0+YWRkX2ludHZhbHVlKHRleHR1cmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVsLT5hZGRfaW50dmFsdWUobGV2ZWwpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZyYW1lYnVmZmVyVGV4dHVyZTJEKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGcm9udEZhY2UoR0xlbnVtIG1vZGUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZyb250RmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb2RlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9kZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb2RlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbW9kZS0+YWRkX2ludHZhbHVlKChpbnQpbW9kZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRnJvbnRGYWNlKG1vZGUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2VuQnVmZmVycyhHTHNpemVpIG4sIEdMdWludCogYnVmZmVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2VuQnVmZmVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19idWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZmZXJzLT5hZGRfaW50dmFsdWUoKGludClidWZmZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZW5CdWZmZXJzKG4sIGJ1ZmZlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2VuZXJhdGVNaXBtYXAoR0xlbnVtIHRhcmdldCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2VuZXJhdGVNaXBtYXApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdlbmVyYXRlTWlwbWFwKHRhcmdldCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZW5GcmFtZWJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2VuRnJhbWVidWZmZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZnJhbWVidWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnJhbWVidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZnJhbWVidWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZnJhbWVidWZmZXJzLT5hZGRfaW50dmFsdWUoKGludClmcmFtZWJ1ZmZlcnMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdlbkZyYW1lYnVmZmVycyhuLCBmcmFtZWJ1ZmZlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZnJhbWVidWZmZXJzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZW5SZW5kZXJidWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZW5SZW5kZXJidWZmZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVuZGVyYnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JlbmRlcmJ1ZmZlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZW5kZXJidWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KXJlbmRlcmJ1ZmZlcnMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdlblJlbmRlcmJ1ZmZlcnMobiwgcmVuZGVyYnVmZmVycyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSByZW5kZXJidWZmZXJzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZW5UZXh0dXJlcyhHTHNpemVpIG4sIEdMdWludCogdGV4dHVyZXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdlblRleHR1cmVzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0dXJlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHR1cmVzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmVzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190ZXh0dXJlcy0+YWRkX2ludHZhbHVlKChpbnQpdGV4dHVyZXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdlblRleHR1cmVzKG4sIHRleHR1cmVzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHRleHR1cmVzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRBY3RpdmVBdHRyaWIoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0QWN0aXZlQXR0cmliKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5kZXgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmRleCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZGV4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZGV4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmRleC0+YWRkX2ludHZhbHVlKGluZGV4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmc2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZnNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZzaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZnNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZnNpemUtPmFkZF9pbnR2YWx1ZShidWZzaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUoKGludClsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKChpbnQpc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190eXBlLT5hZGRfaW50dmFsdWUoKGludCl0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX25hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX25hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX25hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KW5hbWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldEFjdGl2ZUF0dHJpYihwcm9ncmFtLCBpbmRleCwgYnVmc2l6ZSwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGxlbmd0aCwKLSAgICAgICAgKHZvaWQgKikgc2l6ZSwKLSAgICAgICAgKHZvaWQgKikgdHlwZSwKLSAgICAgICAgKHZvaWQgKikgbmFtZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0QWN0aXZlVW5pZm9ybShHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRBY3RpdmVVbmlmb3JtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5kZXgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmRleCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZGV4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZGV4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmRleC0+YWRkX2ludHZhbHVlKGluZGV4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmc2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZnNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZzaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZnNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZnNpemUtPmFkZF9pbnR2YWx1ZShidWZzaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUoKGludClsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKChpbnQpc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190eXBlLT5hZGRfaW50dmFsdWUoKGludCl0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX25hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX25hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX25hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KW5hbWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldEFjdGl2ZVVuaWZvcm0ocHJvZ3JhbSwgaW5kZXgsIGJ1ZnNpemUsIGxlbmd0aCwgc2l6ZSwgdHlwZSwgbmFtZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBsZW5ndGgsCi0gICAgICAgICh2b2lkICopIHNpemUsCi0gICAgICAgICh2b2lkICopIHR5cGUsCi0gICAgICAgICh2b2lkICopIG5hbWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldEF0dGFjaGVkU2hhZGVycyhHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBtYXhjb3VudCwgR0xzaXplaSogY291bnQsIEdMdWludCogc2hhZGVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0QXR0YWNoZWRTaGFkZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWF4Y291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXhjb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21heGNvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21heGNvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXhjb3VudC0+YWRkX2ludHZhbHVlKG1heGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKChpbnQpY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaGFkZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2hhZGVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NoYWRlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2hhZGVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2hhZGVycy0+YWRkX2ludHZhbHVlKChpbnQpc2hhZGVycyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0QXR0YWNoZWRTaGFkZXJzKHByb2dyYW0sIG1heGNvdW50LCBjb3VudCwgc2hhZGVycyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBjb3VudCwKLSAgICAgICAgKHZvaWQgKikgc2hhZGVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotaW50IEdMVHJhY2VfZ2xHZXRBdHRyaWJMb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRBdHRyaWJMb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uYW1lLT5hZGRfaW50dmFsdWUoKGludCluYW1lKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgaW50IHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBuYW1lKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgcnQtPmFkZF9pbnR2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBuYW1lLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRCb29sZWFudihHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRCb29sZWFudik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRCb29sZWFudihwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0QnVmZmVyUGFyYW1ldGVyaXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRCdWZmZXJQYXJhbWV0ZXJpdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1HTGVudW0gR0xUcmFjZV9nbEdldEVycm9yKHZvaWQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldEVycm9yKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xlbnVtIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRFcnJvcigpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgcnQtPmFkZF9pbnR2YWx1ZSgoaW50KXJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0RmxvYXR2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldEZsb2F0dihwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhdHRhY2htZW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXR0YWNobWVudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXR0YWNobWVudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPmFkZF9pbnR2YWx1ZSgoaW50KWF0dGFjaG1lbnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYodGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0SW50ZWdlcnYoR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRJbnRlZ2Vydik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRJbnRlZ2VydihwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0UHJvZ3JhbWl2KEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFByb2dyYW1pdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFByb2dyYW1JbmZvTG9nKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRQcm9ncmFtSW5mb0xvZyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJ1ZnNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZzaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19idWZzaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZzaXplLT5hZGRfaW50dmFsdWUoYnVmc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlbmd0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlbmd0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZW5ndGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlbmd0aC0+YWRkX2ludHZhbHVlKChpbnQpbGVuZ3RoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5mb2xvZwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZm9sb2cgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmZvbG9nLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZm9sb2ctPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZm9sb2ctPmFkZF9pbnR2YWx1ZSgoaW50KWluZm9sb2cpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGJ1ZnNpemUsIGxlbmd0aCwgaW5mb2xvZyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBsZW5ndGgsCi0gICAgICAgICh2b2lkICopIGluZm9sb2csCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0U2hhZGVyaXYoR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRTaGFkZXJpdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNoYWRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NoYWRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaGFkZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NoYWRlci0+YWRkX2ludHZhbHVlKHNoYWRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRTaGFkZXJpdihzaGFkZXIsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRTaGFkZXJJbmZvTG9nKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFNoYWRlckluZm9Mb2cpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaGFkZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaGFkZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaGFkZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaGFkZXItPmFkZF9pbnR2YWx1ZShzaGFkZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZnNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmc2l6ZS0+YWRkX2ludHZhbHVlKGJ1ZnNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZSgoaW50KWxlbmd0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZm9sb2cKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmZvbG9nID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5mb2xvZy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmZvbG9nLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmZvbG9nLT5hZGRfaW50dmFsdWUoKGludClpbmZvbG9nKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgYnVmc2l6ZSwgbGVuZ3RoLCBpbmZvbG9nKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGxlbmd0aCwKLSAgICAgICAgKHZvaWQgKikgaW5mb2xvZywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQqIHJhbmdlLCBHTGludCogcHJlY2lzaW9uKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaGFkZXJ0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2hhZGVydHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NoYWRlcnR5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2hhZGVydHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3NoYWRlcnR5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXNoYWRlcnR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcmVjaXNpb250eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJlY2lzaW9udHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ByZWNpc2lvbnR5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJlY2lzaW9udHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3ByZWNpc2lvbnR5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXByZWNpc2lvbnR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByYW5nZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JhbmdlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmFuZ2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmFuZ2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3JhbmdlLT5hZGRfaW50dmFsdWUoKGludClyYW5nZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByZWNpc2lvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ByZWNpc2lvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ByZWNpc2lvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcmVjaXNpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ByZWNpc2lvbi0+YWRkX2ludHZhbHVlKChpbnQpcHJlY2lzaW9uKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoc2hhZGVydHlwZSwgcHJlY2lzaW9udHlwZSwgcmFuZ2UsIHByZWNpc2lvbik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSByYW5nZSwKLSAgICAgICAgKHZvaWQgKikgcHJlY2lzaW9uLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRTaGFkZXJTb3VyY2UoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogc291cmNlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRTaGFkZXJTb3VyY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaGFkZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaGFkZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaGFkZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaGFkZXItPmFkZF9pbnR2YWx1ZShzaGFkZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZnNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmc2l6ZS0+YWRkX2ludHZhbHVlKGJ1ZnNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZSgoaW50KWxlbmd0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNvdXJjZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NvdXJjZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NvdXJjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zb3VyY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NvdXJjZS0+YWRkX2ludHZhbHVlKChpbnQpc291cmNlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRTaGFkZXJTb3VyY2Uoc2hhZGVyLCBidWZzaXplLCBsZW5ndGgsIHNvdXJjZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBsZW5ndGgsCi0gICAgICAgICh2b2lkICopIHNvdXJjZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotY29uc3QgR0x1Ynl0ZSogR0xUcmFjZV9nbEdldFN0cmluZyhHTGVudW0gbmFtZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0U3RyaW5nKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX25hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX25hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19uYW1lLT5hZGRfaW50dmFsdWUoKGludCluYW1lKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgY29uc3QgR0x1Ynl0ZSogcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFN0cmluZyhuYW1lKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgcnQtPmFkZF9pbnR2YWx1ZSgoaW50KXJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHJldFZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRUZXhQYXJhbWV0ZXJmdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0VGV4UGFyYW1ldGVyZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VGV4UGFyYW1ldGVyZnYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0VGV4UGFyYW1ldGVyaXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRUZXhQYXJhbWV0ZXJpdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRUZXhQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRVbmlmb3JtZnYoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0KiBwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFVuaWZvcm1mdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRVbmlmb3JtZnYocHJvZ3JhbSwgbG9jYXRpb24sIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFVuaWZvcm1pdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50KiBwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFVuaWZvcm1pdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRVbmlmb3JtaXYocHJvZ3JhbSwgbG9jYXRpb24sIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLWludCBHTFRyYWNlX2dsR2V0VW5pZm9ybUxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFVuaWZvcm1Mb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uYW1lLT5hZGRfaW50dmFsdWUoKGludCluYW1lKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgaW50IHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgbmFtZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIHJ0LT5hZGRfaW50dmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbmFtZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0VmVydGV4QXR0cmliZnYoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0VmVydGV4QXR0cmliZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbmRleAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZGV4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5kZXgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW5kZXgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZGV4LT5hZGRfaW50dmFsdWUoaW5kZXgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VmVydGV4QXR0cmliZnYoaW5kZXgsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRWZXJ0ZXhBdHRyaWJpdihHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0VmVydGV4QXR0cmliaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbmRleAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZGV4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5kZXgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW5kZXgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZGV4LT5hZGRfaW50dmFsdWUoaW5kZXgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VmVydGV4QXR0cmliaXYoaW5kZXgsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydihHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiogcG9pbnRlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbmRleAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZGV4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5kZXgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW5kZXgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZGV4LT5hZGRfaW50dmFsdWUoaW5kZXgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwb2ludGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG9pbnRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BvaW50ZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcG9pbnRlci0+YWRkX2ludHZhbHVlKChpbnQpcG9pbnRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYoaW5kZXgsIHBuYW1lLCBwb2ludGVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBvaW50ZXIsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEhpbnQoR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEhpbnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtb2RlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9kZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbW9kZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX21vZGUtPmFkZF9pbnR2YWx1ZSgoaW50KW1vZGUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEhpbnQodGFyZ2V0LCBtb2RlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNCdWZmZXIoR0x1aW50IGJ1ZmZlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSXNCdWZmZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZmZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZmZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZmZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmZmVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZmZXItPmFkZF9pbnR2YWx1ZShidWZmZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGJvb2xlYW4gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbElzQnVmZmVyKGJ1ZmZlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBydC0+YWRkX2Jvb2x2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbElzRW5hYmxlZChHTGVudW0gY2FwKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xJc0VuYWJsZWQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjYXAKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jYXAgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jYXAtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY2FwLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfY2FwLT5hZGRfaW50dmFsdWUoKGludCljYXApOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGJvb2xlYW4gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbElzRW5hYmxlZChjYXApOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgcnQtPmFkZF9ib29sdmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotR0xib29sZWFuIEdMVHJhY2VfZ2xJc0ZyYW1lYnVmZmVyKEdMdWludCBmcmFtZWJ1ZmZlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSXNGcmFtZWJ1ZmZlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZyYW1lYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnJhbWVidWZmZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mcmFtZWJ1ZmZlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mcmFtZWJ1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZnJhbWVidWZmZXItPmFkZF9pbnR2YWx1ZShmcmFtZWJ1ZmZlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMYm9vbGVhbiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsSXNGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBydC0+YWRkX2Jvb2x2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbElzUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSXNQcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xJc1Byb2dyYW0ocHJvZ3JhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBydC0+YWRkX2Jvb2x2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbElzUmVuZGVyYnVmZmVyKEdMdWludCByZW5kZXJidWZmZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbElzUmVuZGVyYnVmZmVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVuZGVyYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5hZGRfaW50dmFsdWUocmVuZGVyYnVmZmVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xJc1JlbmRlcmJ1ZmZlcihyZW5kZXJidWZmZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgcnQtPmFkZF9ib29sdmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotR0xib29sZWFuIEdMVHJhY2VfZ2xJc1NoYWRlcihHTHVpbnQgc2hhZGVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xJc1NoYWRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNoYWRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NoYWRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaGFkZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NoYWRlci0+YWRkX2ludHZhbHVlKHNoYWRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMYm9vbGVhbiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsSXNTaGFkZXIoc2hhZGVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIHJ0LT5hZGRfYm9vbHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNUZXh0dXJlKEdMdWludCB0ZXh0dXJlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xJc1RleHR1cmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0dXJlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dHVyZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdGV4dHVyZS0+YWRkX2ludHZhbHVlKHRleHR1cmUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGJvb2xlYW4gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbElzVGV4dHVyZSh0ZXh0dXJlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIHJ0LT5hZGRfYm9vbHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExpbmVXaWR0aChHTGZsb2F0IHdpZHRoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaW5lV2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9mbG9hdHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMaW5lV2lkdGgod2lkdGgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlua1Byb2dyYW0oR0x1aW50IHByb2dyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExpbmtQcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFBpeGVsU3RvcmVpKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFBpeGVsU3RvcmVpKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2ludHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQaXhlbFN0b3JlaShwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUG9seWdvbk9mZnNldChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9seWdvbk9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY3RvcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhY3RvciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZhY3Rvci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWN0b3ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfZmFjdG9yLT5hZGRfZmxvYXR2YWx1ZShmYWN0b3IpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB1bml0cwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3VuaXRzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdW5pdHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdW5pdHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfdW5pdHMtPmFkZF9mbG9hdHZhbHVlKHVuaXRzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQb2x5Z29uT2Zmc2V0KGZhY3RvciwgdW5pdHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUmVhZFBpeGVscyhHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCogcGl4ZWxzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xSZWFkUGl4ZWxzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Zvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3R5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3R5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190eXBlLT5hZGRfaW50dmFsdWUoKGludCl0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGl4ZWxzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGl4ZWxzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGl4ZWxzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BpeGVscy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGl4ZWxzLT5hZGRfaW50dmFsdWUoKGludClwaXhlbHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGl4ZWxzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIodm9pZCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUmVsZWFzZVNoYWRlckNvbXBpbGVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2UoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludGVybmFsZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW50ZXJuYWxmb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClpbnRlcm5hbGZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUmVuZGVyYnVmZmVyU3RvcmFnZSh0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFNhbXBsZUNvdmVyYWdlKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTYW1wbGVDb3ZlcmFnZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2Zsb2F0dmFsdWUodmFsdWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnZlcnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnZlcnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnZlcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW52ZXJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfaW52ZXJ0LT5hZGRfYm9vbHZhbHVlKGludmVydCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU2FtcGxlQ292ZXJhZ2UodmFsdWUsIGludmVydCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTY2lzc29yKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTY2lzc29yKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTY2lzc29yKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsU2hhZGVyQmluYXJ5KEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBzaGFkZXJzLCBHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCBHTHZvaWQqIGJpbmFyeSwgR0xzaXplaSBsZW5ndGgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFNoYWRlckJpbmFyeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNoYWRlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaGFkZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2hhZGVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaGFkZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaGFkZXJzLT5hZGRfaW50dmFsdWUoKGludClzaGFkZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYmluYXJ5Zm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmluYXJ5Zm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmluYXJ5Zm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JpbmFyeWZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2JpbmFyeWZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpYmluYXJ5Zm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYmluYXJ5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmluYXJ5ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmluYXJ5LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JpbmFyeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYmluYXJ5LT5hZGRfaW50dmFsdWUoKGludCliaW5hcnkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZShsZW5ndGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFNoYWRlckJpbmFyeShuLCBzaGFkZXJzLCBiaW5hcnlmb3JtYXQsIGJpbmFyeSwgbGVuZ3RoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHNoYWRlcnMsCi0gICAgICAgICh2b2lkICopIGJpbmFyeSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsU2hhZGVyU291cmNlKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhcioqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU2hhZGVyU291cmNlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2hhZGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2hhZGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2hhZGVyLT5hZGRfaW50dmFsdWUoc2hhZGVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc3RyaW5nCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3RyaW5nID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3RyaW5nLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3N0cmluZy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc3RyaW5nLT5hZGRfaW50dmFsdWUoKGludClzdHJpbmcpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZSgoaW50KWxlbmd0aCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU2hhZGVyU291cmNlKHNoYWRlciwgY291bnQsIHN0cmluZywgbGVuZ3RoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHN0cmluZywKLSAgICAgICAgKHZvaWQgKikgbGVuZ3RoLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTdGVuY2lsRnVuYyhHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU3RlbmNpbEZ1bmMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmdW5jCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnVuYyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Z1bmMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZnVuYy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Z1bmMtPmFkZF9pbnR2YWx1ZSgoaW50KWZ1bmMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWYKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWYgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWYtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVmLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZWYtPmFkZF9pbnR2YWx1ZShyZWYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXNrCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWFzayA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21hc2stPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWFzay0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWFzay0+YWRkX2ludHZhbHVlKG1hc2spOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFN0ZW5jaWxGdW5jKGZ1bmMsIHJlZiwgbWFzayk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTdGVuY2lsRnVuY1NlcGFyYXRlKEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFjZS0+YWRkX2ludHZhbHVlKChpbnQpZmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZ1bmMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mdW5jID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZnVuYy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mdW5jLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZnVuYy0+YWRkX2ludHZhbHVlKChpbnQpZnVuYyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlZgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JlZiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlZi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZWYtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3JlZi0+YWRkX2ludHZhbHVlKHJlZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1hc2sKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXNrID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWFzay0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXNrLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXNrLT5hZGRfaW50dmFsdWUobWFzayk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShmYWNlLCBmdW5jLCByZWYsIG1hc2spOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsU3RlbmNpbE1hc2soR0x1aW50IG1hc2spIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFN0ZW5jaWxNYXNrKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWFzawotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21hc2sgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXNrLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21hc2stPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21hc2stPmFkZF9pbnR2YWx1ZShtYXNrKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTdGVuY2lsTWFzayhtYXNrKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFN0ZW5jaWxNYXNrU2VwYXJhdGUoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTdGVuY2lsTWFza1NlcGFyYXRlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmFjZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWNlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZhY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mYWNlLT5hZGRfaW50dmFsdWUoKGludClmYWNlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWFzawotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21hc2sgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXNrLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21hc2stPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21hc2stPmFkZF9pbnR2YWx1ZShtYXNrKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTdGVuY2lsTWFza1NlcGFyYXRlKGZhY2UsIG1hc2spOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsU3RlbmNpbE9wKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU3RlbmNpbE9wKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmFpbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhaWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWlsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZhaWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mYWlsLT5hZGRfaW50dmFsdWUoKGludClmYWlsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgemZhaWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ZmFpbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pmYWlsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pmYWlsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfemZhaWwtPmFkZF9pbnR2YWx1ZSgoaW50KXpmYWlsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgenBhc3MKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196cGFzcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pwYXNzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pwYXNzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfenBhc3MtPmFkZF9pbnR2YWx1ZSgoaW50KXpwYXNzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTdGVuY2lsT3AoZmFpbCwgemZhaWwsIHpwYXNzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFN0ZW5jaWxPcFNlcGFyYXRlKEdMZW51bSBmYWNlLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFN0ZW5jaWxPcFNlcGFyYXRlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmFjZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWNlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZhY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mYWNlLT5hZGRfaW50dmFsdWUoKGludClmYWNlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmFpbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhaWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWlsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZhaWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mYWlsLT5hZGRfaW50dmFsdWUoKGludClmYWlsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgemZhaWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ZmFpbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pmYWlsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pmYWlsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfemZhaWwtPmFkZF9pbnR2YWx1ZSgoaW50KXpmYWlsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgenBhc3MKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196cGFzcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pwYXNzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pwYXNzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfenBhc3MtPmFkZF9pbnR2YWx1ZSgoaW50KXpwYXNzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTdGVuY2lsT3BTZXBhcmF0ZShmYWNlLCBmYWlsLCB6ZmFpbCwgenBhc3MpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4SW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4SW1hZ2UyRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludGVybmFsZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW50ZXJuYWxmb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPmFkZF9pbnR2YWx1ZShpbnRlcm5hbGZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJvcmRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JvcmRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JvcmRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ib3JkZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2JvcmRlci0+YWRkX2ludHZhbHVlKGJvcmRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Zvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBpeGVscwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BpeGVscyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpeGVscy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19waXhlbHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BpeGVscy0+YWRkX2ludHZhbHVlKChpbnQpcGl4ZWxzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBpeGVscywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyZihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleFBhcmFtZXRlcmYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9mbG9hdHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhQYXJhbWV0ZXJmKHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleFBhcmFtZXRlcmZ2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhQYXJhbWV0ZXJmdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhQYXJhbWV0ZXJmdih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhQYXJhbWV0ZXJpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleFBhcmFtZXRlcmkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleFBhcmFtZXRlcmkodGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyaXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhQYXJhbWV0ZXJpdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhTdWJJbWFnZTJEKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeG9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3hvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3hvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3hvZmZzZXQtPmFkZF9pbnR2YWx1ZSh4b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeW9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3lvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3lvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3lvZmZzZXQtPmFkZF9pbnR2YWx1ZSh5b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Zvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3R5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3R5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190eXBlLT5hZGRfaW50dmFsdWUoKGludCl0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGl4ZWxzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGl4ZWxzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGl4ZWxzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BpeGVscy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGl4ZWxzLT5hZGRfaW50dmFsdWUoKGludClwaXhlbHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleFN1YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGl4ZWxzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtMWYoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybTFmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTFmKGxvY2F0aW9uLCB4KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0xZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm0xZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3YtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdi0+YWRkX2ludHZhbHVlKChpbnQpdik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTFmdihsb2NhdGlvbiwgY291bnQsIHYpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTFpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVbmlmb3JtMWkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm0xaShsb2NhdGlvbiwgeCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtMWl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybTFpdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHYKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192LT5hZGRfaW50dmFsdWUoKGludCl2KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbmlmb3JtMWl2KGxvY2F0aW9uLCBjb3VudCwgdik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2LAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtMmYoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVbmlmb3JtMmYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ194LT5hZGRfZmxvYXR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeS0+YWRkX2Zsb2F0dmFsdWUoeSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTJmKGxvY2F0aW9uLCB4LCB5KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0yZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm0yZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3YtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdi0+YWRkX2ludHZhbHVlKChpbnQpdik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTJmdihsb2NhdGlvbiwgY291bnQsIHYpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTJpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVbmlmb3JtMmkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm0yaShsb2NhdGlvbiwgeCwgeSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtMml2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybTJpdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHYKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192LT5hZGRfaW50dmFsdWUoKGludCl2KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbmlmb3JtMml2KGxvY2F0aW9uLCBjb3VudCwgdik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2LAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtM2YoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm0zZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ195LT5hZGRfZmxvYXR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfei0+YWRkX2Zsb2F0dmFsdWUoeik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTNmKGxvY2F0aW9uLCB4LCB5LCB6KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0zZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm0zZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3YtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdi0+YWRkX2ludHZhbHVlKChpbnQpdik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTNmdihsb2NhdGlvbiwgY291bnQsIHYpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTNpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVbmlmb3JtM2kpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfei0+YWRkX2ludHZhbHVlKHopOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm0zaShsb2NhdGlvbiwgeCwgeSwgeik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtM2l2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybTNpdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHYKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192LT5hZGRfaW50dmFsdWUoKGludCl2KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbmlmb3JtM2l2KGxvY2F0aW9uLCBjb3VudCwgdik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2LAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtNGYoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybTRmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ktPmFkZF9mbG9hdHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196LT5hZGRfZmxvYXR2YWx1ZSh6KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3cgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ctPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfdy0+YWRkX2Zsb2F0dmFsdWUodyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTRmKGxvY2F0aW9uLCB4LCB5LCB6LCB3KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm00ZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm00ZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3YtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdi0+YWRkX2ludHZhbHVlKChpbnQpdik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTRmdihsb2NhdGlvbiwgY291bnQsIHYpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTRpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVbmlmb3JtNGkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfei0+YWRkX2ludHZhbHVlKHopOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ctPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdy0+YWRkX2ludHZhbHVlKHcpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm00aShsb2NhdGlvbiwgeCwgeSwgeiwgdyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtNGl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybTRpdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHYKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192LT5hZGRfaW50dmFsdWUoKGludCl2KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbmlmb3JtNGl2KGxvY2F0aW9uLCBjb3VudCwgdik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2LAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtTWF0cml4MmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybU1hdHJpeDJmdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRyYW5zcG9zZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RyYW5zcG9zZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RyYW5zcG9zZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190cmFuc3Bvc2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ190cmFuc3Bvc2UtPmFkZF9ib29sdmFsdWUodHJhbnNwb3NlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm1NYXRyaXgyZnYobG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtTWF0cml4M2Z2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybU1hdHJpeDNmdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRyYW5zcG9zZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RyYW5zcG9zZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RyYW5zcG9zZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190cmFuc3Bvc2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ190cmFuc3Bvc2UtPmFkZF9ib29sdmFsdWUodHJhbnNwb3NlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm1NYXRyaXgzZnYobG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtTWF0cml4NGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybU1hdHJpeDRmdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRyYW5zcG9zZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RyYW5zcG9zZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RyYW5zcG9zZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190cmFuc3Bvc2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ190cmFuc3Bvc2UtPmFkZF9ib29sdmFsdWUodHJhbnNwb3NlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVc2VQcm9ncmFtKEdMdWludCBwcm9ncmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVc2VQcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVc2VQcm9ncmFtKHByb2dyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVmFsaWRhdGVQcm9ncmFtKEdMdWludCBwcm9ncmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xWYWxpZGF0ZVByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFZhbGlkYXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjFmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYjFmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5keAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZHggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmR4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZHgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZHgtPmFkZF9pbnR2YWx1ZShpbmR4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVmVydGV4QXR0cmliMWYoaW5keCwgeCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWIxZnYoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliMWZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5keAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZHggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmR4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZHgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZHgtPmFkZF9pbnR2YWx1ZShpbmR4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWVzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWVzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdmFsdWVzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWVzLT5hZGRfaW50dmFsdWUoKGludCl2YWx1ZXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFZlcnRleEF0dHJpYjFmdihpbmR4LCB2YWx1ZXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWVzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWIyZihHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYjJmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5keAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZHggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmR4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZHgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZHgtPmFkZF9pbnR2YWx1ZShpbmR4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ktPmFkZF9mbG9hdHZhbHVlKHkpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFZlcnRleEF0dHJpYjJmKGluZHgsIHgsIHkpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVmVydGV4QXR0cmliMmZ2KEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYjJmdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmR4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5keC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmR4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmR4LT5hZGRfaW50dmFsdWUoaW5keCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ZhbHVlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ZhbHVlcy0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWVzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xWZXJ0ZXhBdHRyaWIyZnYoaW5keCwgdmFsdWVzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVmVydGV4QXR0cmliM2YoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYjNmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5keAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZHggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmR4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZHgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZHgtPmFkZF9pbnR2YWx1ZShpbmR4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ktPmFkZF9mbG9hdHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196LT5hZGRfZmxvYXR2YWx1ZSh6KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xWZXJ0ZXhBdHRyaWIzZihpbmR4LCB4LCB5LCB6KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjNmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWIzZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbmR4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5keCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZHgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW5keC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW5keC0+YWRkX2ludHZhbHVlKGluZHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2YWx1ZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdmFsdWVzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZXMtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVmVydGV4QXR0cmliM2Z2KGluZHgsIHZhbHVlcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2YWx1ZXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjRmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYjRmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5keAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZHggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmR4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZHgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZHgtPmFkZF9pbnR2YWx1ZShpbmR4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ktPmFkZF9mbG9hdHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196LT5hZGRfZmxvYXR2YWx1ZSh6KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3cgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ctPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfdy0+YWRkX2Zsb2F0dmFsdWUodyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVmVydGV4QXR0cmliNGYoaW5keCwgeCwgeSwgeiwgdyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWI0ZnYoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliNGZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5keAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZHggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmR4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZHgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZHgtPmFkZF9pbnR2YWx1ZShpbmR4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWVzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWVzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdmFsdWVzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWVzLT5hZGRfaW50dmFsdWUoKGludCl2YWx1ZXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFZlcnRleEF0dHJpYjRmdihpbmR4LCB2YWx1ZXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWVzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHB0cikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliUG9pbnRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmR4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5keC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmR4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmR4LT5hZGRfaW50dmFsdWUoaW5keCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaXplLT5hZGRfaW50dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG5vcm1hbGl6ZWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ub3JtYWxpemVkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbm9ybWFsaXplZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ub3JtYWxpemVkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfbm9ybWFsaXplZC0+YWRkX2Jvb2x2YWx1ZShub3JtYWxpemVkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc3RyaWRlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3RyaWRlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3RyaWRlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc3RyaWRlLT5hZGRfaW50dmFsdWUoc3RyaWRlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHRyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHRyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHRyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3B0ci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHRyLT5hZGRfaW50dmFsdWUoKGludClwdHIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFZlcnRleEF0dHJpYlBvaW50ZXIoaW5keCwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlLCBwdHIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcHRyLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xWaWV3cG9ydChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVmlld3BvcnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFZpZXdwb3J0KHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotCi0vLyBEZWZpbml0aW9ucyBmb3IgR0wyRXh0IEFQSXMKLQotdm9pZCBHTFRyYWNlX2dsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbWFnZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ltYWdlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW1hZ2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW1hZ2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ltYWdlLT5hZGRfaW50dmFsdWUoKGludClpbWFnZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVModGFyZ2V0LCBpbWFnZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBpbWFnZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGltYWdlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW1hZ2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbWFnZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbWFnZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW1hZ2UtPmFkZF9pbnR2YWx1ZSgoaW50KWltYWdlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVModGFyZ2V0LCBpbWFnZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBpbWFnZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0UHJvZ3JhbUJpbmFyeU9FUyhHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCBHTHZvaWQgKmJpbmFyeSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UHJvZ3JhbUJpbmFyeU9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJ1ZlNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZTaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19idWZTaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZTaXplLT5hZGRfaW50dmFsdWUoYnVmU2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlbmd0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlbmd0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZW5ndGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlbmd0aC0+YWRkX2ludHZhbHVlKChpbnQpbGVuZ3RoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYmluYXJ5Rm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmluYXJ5Rm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmluYXJ5Rm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JpbmFyeUZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYmluYXJ5Rm9ybWF0LT5hZGRfaW50dmFsdWUoKGludCliaW5hcnlGb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBiaW5hcnkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19iaW5hcnkgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19iaW5hcnktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYmluYXJ5LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19iaW5hcnktPmFkZF9pbnR2YWx1ZSgoaW50KWJpbmFyeSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UHJvZ3JhbUJpbmFyeU9FUyhwcm9ncmFtLCBidWZTaXplLCBsZW5ndGgsIGJpbmFyeUZvcm1hdCwgYmluYXJ5KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGxlbmd0aCwKLSAgICAgICAgKHZvaWQgKikgYmluYXJ5Rm9ybWF0LAotICAgICAgICAodm9pZCAqKSBiaW5hcnksCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1CaW5hcnlPRVMoR0x1aW50IHByb2dyYW0sIEdMZW51bSBiaW5hcnlGb3JtYXQsIGNvbnN0IEdMdm9pZCAqYmluYXJ5LCBHTGludCBsZW5ndGgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1CaW5hcnlPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBiaW5hcnlGb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19iaW5hcnlGb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19iaW5hcnlGb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYmluYXJ5Rm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfYmluYXJ5Rm9ybWF0LT5hZGRfaW50dmFsdWUoKGludCliaW5hcnlGb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBiaW5hcnkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19iaW5hcnkgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19iaW5hcnktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYmluYXJ5LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19iaW5hcnktPmFkZF9pbnR2YWx1ZSgoaW50KWJpbmFyeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlbmd0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlbmd0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZW5ndGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlbmd0aC0+YWRkX2ludHZhbHVlKGxlbmd0aCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUHJvZ3JhbUJpbmFyeU9FUyhwcm9ncmFtLCBiaW5hcnlGb3JtYXQsIGJpbmFyeSwgbGVuZ3RoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGJpbmFyeSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCogR0xUcmFjZV9nbE1hcEJ1ZmZlck9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xNYXBCdWZmZXJPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhY2Nlc3MKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hY2Nlc3MgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hY2Nlc3MtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYWNjZXNzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfYWNjZXNzLT5hZGRfaW50dmFsdWUoKGludClhY2Nlc3MpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICB2b2lkKiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTWFwQnVmZmVyT0VTKHRhcmdldCwgYWNjZXNzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgcnQtPmFkZF9pbnR2YWx1ZSgoaW50KXJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHJldFZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbFVubWFwQnVmZmVyT0VTKEdMZW51bSB0YXJnZXQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVubWFwQnVmZmVyT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbm1hcEJ1ZmZlck9FUyh0YXJnZXQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgcnQtPmFkZF9ib29sdmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0QnVmZmVyUG9pbnRlcnZPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqKiBwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldEJ1ZmZlclBvaW50ZXJ2T0VTKHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleEltYWdlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhJbWFnZTNET0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW50ZXJuYWxmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnRlcm5hbGZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWludGVybmFsZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGVwdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kZXB0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kZXB0aC0+YWRkX2ludHZhbHVlKGRlcHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYm9yZGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYm9yZGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYm9yZGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JvcmRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYm9yZGVyLT5hZGRfaW50dmFsdWUoYm9yZGVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Zvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3R5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3R5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190eXBlLT5hZGRfaW50dmFsdWUoKGludCl0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGl4ZWxzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGl4ZWxzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGl4ZWxzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BpeGVscy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGl4ZWxzLT5hZGRfaW50dmFsdWUoKGludClwaXhlbHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEltYWdlM0RPRVModGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBib3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBpeGVscywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4U3ViSW1hZ2UzRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4U3ViSW1hZ2UzRE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHhvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeG9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194b2Zmc2V0LT5hZGRfaW50dmFsdWUoeG9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHlvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeW9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195b2Zmc2V0LT5hZGRfaW50dmFsdWUoeW9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfem9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196b2Zmc2V0LT5hZGRfaW50dmFsdWUoem9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRlcHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGVwdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kZXB0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kZXB0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGVwdGgtPmFkZF9pbnR2YWx1ZShkZXB0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Zvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBpeGVscwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BpeGVscyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpeGVscy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19waXhlbHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BpeGVscy0+YWRkX2ludHZhbHVlKChpbnQpcGl4ZWxzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhTdWJJbWFnZTNET0VTKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwaXhlbHMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENvcHlUZXhTdWJJbWFnZTNET0VTKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ29weVRleFN1YkltYWdlM0RPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVsLT5hZGRfaW50dmFsdWUobGV2ZWwpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4b2Zmc2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeG9mZnNldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3hvZmZzZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeG9mZnNldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeG9mZnNldC0+YWRkX2ludHZhbHVlKHhvZmZzZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5b2Zmc2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeW9mZnNldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3lvZmZzZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeW9mZnNldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeW9mZnNldC0+YWRkX2ludHZhbHVlKHlvZmZzZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6b2Zmc2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfem9mZnNldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pvZmZzZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfem9mZnNldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfem9mZnNldC0+YWRkX2ludHZhbHVlKHpvZmZzZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENvcHlUZXhTdWJJbWFnZTNET0VTKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ29tcHJlc3NlZFRleEltYWdlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ29tcHJlc3NlZFRleEltYWdlM0RPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVsLT5hZGRfaW50dmFsdWUobGV2ZWwpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkZXB0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RlcHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGVwdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGVwdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RlcHRoLT5hZGRfaW50dmFsdWUoZGVwdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBib3JkZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ib3JkZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ib3JkZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYm9yZGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ib3JkZXItPmFkZF9pbnR2YWx1ZShib3JkZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbWFnZVNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbWFnZVNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbWFnZVNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW1hZ2VTaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbWFnZVNpemUtPmFkZF9pbnR2YWx1ZShpbWFnZVNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkYXRhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGF0YSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RhdGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGF0YS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGF0YS0+YWRkX2ludHZhbHVlKChpbnQpZGF0YSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ29tcHJlc3NlZFRleEltYWdlM0RPRVModGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBib3JkZXIsIGltYWdlU2l6ZSwgZGF0YSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBkYXRhLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNET0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeG9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3hvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3hvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3hvZmZzZXQtPmFkZF9pbnR2YWx1ZSh4b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeW9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3lvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3lvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3lvZmZzZXQtPmFkZF9pbnR2YWx1ZSh5b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgem9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pvZmZzZXQtPmFkZF9pbnR2YWx1ZSh6b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGVwdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kZXB0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kZXB0aC0+YWRkX2ludHZhbHVlKGRlcHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Zvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW1hZ2VTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW1hZ2VTaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW1hZ2VTaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ltYWdlU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW1hZ2VTaXplLT5hZGRfaW50dmFsdWUoaW1hZ2VTaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGF0YQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RhdGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kYXRhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RhdGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RhdGEtPmFkZF9pbnR2YWx1ZSgoaW50KWRhdGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENvbXByZXNzZWRUZXhTdWJJbWFnZTNET0VTKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIGltYWdlU2l6ZSwgZGF0YSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBkYXRhLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGcmFtZWJ1ZmZlclRleHR1cmUzRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCB6b2Zmc2V0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGcmFtZWJ1ZmZlclRleHR1cmUzRE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGF0dGFjaG1lbnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hdHRhY2htZW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYXR0YWNobWVudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hdHRhY2htZW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfYXR0YWNobWVudC0+YWRkX2ludHZhbHVlKChpbnQpYXR0YWNobWVudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHRhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHRhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190ZXh0YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRleHRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHR1cmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0dXJlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190ZXh0dXJlLT5hZGRfaW50dmFsdWUodGV4dHVyZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfem9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196b2Zmc2V0LT5hZGRfaW50dmFsdWUoem9mZnNldCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVModGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsLCB6b2Zmc2V0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJpbmRWZXJ0ZXhBcnJheU9FUyhHTHVpbnQgYXJyYXkpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJpbmRWZXJ0ZXhBcnJheU9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGFycmF5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXJyYXkgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hcnJheS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hcnJheS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYXJyYXktPmFkZF9pbnR2YWx1ZShhcnJheSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmluZFZlcnRleEFycmF5T0VTKGFycmF5KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVZlcnRleEFycmF5c09FUyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhcnJheXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hcnJheXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hcnJheXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXJyYXlzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19hcnJheXMtPmFkZF9pbnR2YWx1ZSgoaW50KWFycmF5cyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVsZXRlVmVydGV4QXJyYXlzT0VTKG4sIGFycmF5cyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBhcnJheXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdlblZlcnRleEFycmF5c09FUyhHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZW5WZXJ0ZXhBcnJheXNPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhcnJheXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hcnJheXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hcnJheXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXJyYXlzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19hcnJheXMtPmFkZF9pbnR2YWx1ZSgoaW50KWFycmF5cyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2VuVmVydGV4QXJyYXlzT0VTKG4sIGFycmF5cyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBhcnJheXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNWZXJ0ZXhBcnJheU9FUyhHTHVpbnQgYXJyYXkpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbElzVmVydGV4QXJyYXlPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhcnJheQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FycmF5ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYXJyYXktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXJyYXktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2FycmF5LT5hZGRfaW50dmFsdWUoYXJyYXkpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGJvb2xlYW4gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbElzVmVydGV4QXJyYXlPRVMoYXJyYXkpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgcnQtPmFkZF9ib29sdmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQoR0xpbnQgKm51bUdyb3VwcywgR0xzaXplaSBncm91cHNTaXplLCBHTHVpbnQgKmdyb3VwcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBudW1Hcm91cHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19udW1Hcm91cHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19udW1Hcm91cHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnVtR3JvdXBzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19udW1Hcm91cHMtPmFkZF9pbnR2YWx1ZSgoaW50KW51bUdyb3Vwcyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGdyb3Vwc1NpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncm91cHNTaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JvdXBzU2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ncm91cHNTaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ncm91cHNTaXplLT5hZGRfaW50dmFsdWUoZ3JvdXBzU2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGdyb3VwcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyb3VwcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyb3Vwcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ncm91cHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2dyb3Vwcy0+YWRkX2ludHZhbHVlKChpbnQpZ3JvdXBzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRQZXJmTW9uaXRvckdyb3Vwc0FNRChudW1Hcm91cHMsIGdyb3Vwc1NpemUsIGdyb3Vwcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBudW1Hcm91cHMsCi0gICAgICAgICh2b2lkICopIGdyb3VwcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRChHTHVpbnQgZ3JvdXAsIEdMaW50ICpudW1Db3VudGVycywgR0xpbnQgKm1heEFjdGl2ZUNvdW50ZXJzLCBHTHNpemVpIGNvdW50ZXJTaXplLCBHTHVpbnQgKmNvdW50ZXJzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1EKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZ3JvdXAKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncm91cCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyb3VwLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2dyb3VwLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ncm91cC0+YWRkX2ludHZhbHVlKGdyb3VwKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnVtQ291bnRlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19udW1Db3VudGVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX251bUNvdW50ZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX251bUNvdW50ZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19udW1Db3VudGVycy0+YWRkX2ludHZhbHVlKChpbnQpbnVtQ291bnRlcnMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXhBY3RpdmVDb3VudGVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21heEFjdGl2ZUNvdW50ZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWF4QWN0aXZlQ291bnRlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWF4QWN0aXZlQ291bnRlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21heEFjdGl2ZUNvdW50ZXJzLT5hZGRfaW50dmFsdWUoKGludCltYXhBY3RpdmVDb3VudGVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50ZXJTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnRlclNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudGVyU2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudGVyU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnRlclNpemUtPmFkZF9pbnR2YWx1ZShjb3VudGVyU2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50ZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnRlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudGVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudGVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnRlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KWNvdW50ZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1EKGdyb3VwLCBudW1Db3VudGVycywgbWF4QWN0aXZlQ291bnRlcnMsIGNvdW50ZXJTaXplLCBjb3VudGVycyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBudW1Db3VudGVycywKLSAgICAgICAgKHZvaWQgKikgbWF4QWN0aXZlQ291bnRlcnMsCi0gICAgICAgICh2b2lkICopIGNvdW50ZXJzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EKEdMdWludCBncm91cCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZ3JvdXBTdHJpbmcpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFBlcmZNb25pdG9yR3JvdXBTdHJpbmdBTUQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncm91cAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyb3VwID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JvdXAtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JvdXAtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2dyb3VwLT5hZGRfaW50dmFsdWUoZ3JvdXApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmU2l6ZS0+YWRkX2ludHZhbHVlKGJ1ZlNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZSgoaW50KWxlbmd0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGdyb3VwU3RyaW5nCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZ3JvdXBTdHJpbmcgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ncm91cFN0cmluZy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ncm91cFN0cmluZy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZ3JvdXBTdHJpbmctPmFkZF9pbnR2YWx1ZSgoaW50KWdyb3VwU3RyaW5nKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EKGdyb3VwLCBidWZTaXplLCBsZW5ndGgsIGdyb3VwU3RyaW5nKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGxlbmd0aCwKLSAgICAgICAgKHZvaWQgKikgZ3JvdXBTdHJpbmcsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpjb3VudGVyU3RyaW5nKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncm91cAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyb3VwID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JvdXAtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JvdXAtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2dyb3VwLT5hZGRfaW50dmFsdWUoZ3JvdXApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50ZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnRlci0+YWRkX2ludHZhbHVlKGNvdW50ZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmU2l6ZS0+YWRkX2ludHZhbHVlKGJ1ZlNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZSgoaW50KWxlbmd0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50ZXJTdHJpbmcKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudGVyU3RyaW5nID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnRlclN0cmluZy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudGVyU3RyaW5nLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudGVyU3RyaW5nLT5hZGRfaW50dmFsdWUoKGludCljb3VudGVyU3RyaW5nKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQoZ3JvdXAsIGNvdW50ZXIsIGJ1ZlNpemUsIGxlbmd0aCwgY291bnRlclN0cmluZyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBsZW5ndGgsCi0gICAgICAgICh2b2lkICopIGNvdW50ZXJTdHJpbmcsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKmRhdGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncm91cAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyb3VwID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JvdXAtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JvdXAtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2dyb3VwLT5hZGRfaW50dmFsdWUoZ3JvdXApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50ZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnRlci0+YWRkX2ludHZhbHVlKGNvdW50ZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkYXRhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGF0YSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RhdGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGF0YS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGF0YS0+YWRkX2ludHZhbHVlKChpbnQpZGF0YSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UGVyZk1vbml0b3JDb3VudGVySW5mb0FNRChncm91cCwgY291bnRlciwgcG5hbWUsIGRhdGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZGF0YSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2VuUGVyZk1vbml0b3JzQU1EKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2VuUGVyZk1vbml0b3JzQU1EKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9uaXRvcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb25pdG9ycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vbml0b3JzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vbml0b3JzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tb25pdG9ycy0+YWRkX2ludHZhbHVlKChpbnQpbW9uaXRvcnMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdlblBlcmZNb25pdG9yc0FNRChuLCBtb25pdG9ycyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBtb25pdG9ycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVsZXRlUGVyZk1vbml0b3JzQU1EKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVsZXRlUGVyZk1vbml0b3JzQU1EKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9uaXRvcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb25pdG9ycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vbml0b3JzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vbml0b3JzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tb25pdG9ycy0+YWRkX2ludHZhbHVlKChpbnQpbW9uaXRvcnMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlbGV0ZVBlcmZNb25pdG9yc0FNRChuLCBtb25pdG9ycyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBtb25pdG9ycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRChHTHVpbnQgbW9uaXRvciwgR0xib29sZWFuIGVuYWJsZSwgR0x1aW50IGdyb3VwLCBHTGludCBudW1Db3VudGVycywgR0x1aW50ICpjb3VudGVyc0xpc3QpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtb25pdG9yCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9uaXRvciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vbml0b3ItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbW9uaXRvci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbW9uaXRvci0+YWRkX2ludHZhbHVlKG1vbml0b3IpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBlbmFibGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19lbmFibGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19lbmFibGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZW5hYmxlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfZW5hYmxlLT5hZGRfYm9vbHZhbHVlKGVuYWJsZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGdyb3VwCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZ3JvdXAgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ncm91cC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ncm91cC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZ3JvdXAtPmFkZF9pbnR2YWx1ZShncm91cCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG51bUNvdW50ZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnVtQ291bnRlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19udW1Db3VudGVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19udW1Db3VudGVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbnVtQ291bnRlcnMtPmFkZF9pbnR2YWx1ZShudW1Db3VudGVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50ZXJzTGlzdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ZXJzTGlzdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50ZXJzTGlzdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudGVyc0xpc3QtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50ZXJzTGlzdC0+YWRkX2ludHZhbHVlKChpbnQpY291bnRlcnNMaXN0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EKG1vbml0b3IsIGVuYWJsZSwgZ3JvdXAsIG51bUNvdW50ZXJzLCBjb3VudGVyc0xpc3QpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgY291bnRlcnNMaXN0LAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCZWdpblBlcmZNb25pdG9yQU1EKEdMdWludCBtb25pdG9yKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCZWdpblBlcmZNb25pdG9yQU1EKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9uaXRvcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vbml0b3IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb25pdG9yLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vbml0b3ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21vbml0b3ItPmFkZF9pbnR2YWx1ZShtb25pdG9yKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCZWdpblBlcmZNb25pdG9yQU1EKG1vbml0b3IpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRW5kUGVyZk1vbml0b3JBTUQoR0x1aW50IG1vbml0b3IpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEVuZFBlcmZNb25pdG9yQU1EKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9uaXRvcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vbml0b3IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb25pdG9yLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vbml0b3ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21vbml0b3ItPmFkZF9pbnR2YWx1ZShtb25pdG9yKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFbmRQZXJmTW9uaXRvckFNRChtb25pdG9yKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQoR0x1aW50IG1vbml0b3IsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBkYXRhU2l6ZSwgR0x1aW50ICpkYXRhLCBHTGludCAqYnl0ZXNXcml0dGVuKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1EKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9uaXRvcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vbml0b3IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb25pdG9yLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vbml0b3ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21vbml0b3ItPmFkZF9pbnR2YWx1ZShtb25pdG9yKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGF0YVNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kYXRhU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RhdGFTaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RhdGFTaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kYXRhU2l6ZS0+YWRkX2ludHZhbHVlKGRhdGFTaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGF0YQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RhdGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kYXRhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RhdGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RhdGEtPmFkZF9pbnR2YWx1ZSgoaW50KWRhdGEpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBieXRlc1dyaXR0ZW4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ieXRlc1dyaXR0ZW4gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ieXRlc1dyaXR0ZW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnl0ZXNXcml0dGVuLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ieXRlc1dyaXR0ZW4tPmFkZF9pbnR2YWx1ZSgoaW50KWJ5dGVzV3JpdHRlbik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRChtb25pdG9yLCBwbmFtZSwgZGF0YVNpemUsIGRhdGEsIGJ5dGVzV3JpdHRlbik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBkYXRhLAotICAgICAgICAodm9pZCAqKSBieXRlc1dyaXR0ZW4sCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJsaXRGcmFtZWJ1ZmZlckFOR0xFKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCbGl0RnJhbWVidWZmZXJBTkdMRSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNyY1gwCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3JjWDAgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zcmNYMC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zcmNYMC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc3JjWDAtPmFkZF9pbnR2YWx1ZShzcmNYMCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNyY1kwCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3JjWTAgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zcmNZMC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zcmNZMC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc3JjWTAtPmFkZF9pbnR2YWx1ZShzcmNZMCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNyY1gxCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3JjWDEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zcmNYMS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zcmNYMS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc3JjWDEtPmFkZF9pbnR2YWx1ZShzcmNYMSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNyY1kxCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3JjWTEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zcmNZMS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zcmNZMS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc3JjWTEtPmFkZF9pbnR2YWx1ZShzcmNZMSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRzdFgwCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHN0WDAgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kc3RYMC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kc3RYMC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZHN0WDAtPmFkZF9pbnR2YWx1ZShkc3RYMCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRzdFkwCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHN0WTAgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kc3RZMC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kc3RZMC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZHN0WTAtPmFkZF9pbnR2YWx1ZShkc3RZMCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRzdFgxCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHN0WDEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kc3RYMS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kc3RYMS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZHN0WDEtPmFkZF9pbnR2YWx1ZShkc3RYMSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRzdFkxCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHN0WTEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kc3RZMS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kc3RZMS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZHN0WTEtPmFkZF9pbnR2YWx1ZShkc3RZMSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1hc2sKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXNrID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWFzay0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXNrLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXNrLT5hZGRfaW50dmFsdWUobWFzayk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZpbHRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZpbHRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZpbHRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19maWx0ZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19maWx0ZXItPmFkZF9pbnR2YWx1ZSgoaW50KWZpbHRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmxpdEZyYW1lYnVmZmVyQU5HTEUoc3JjWDAsIHNyY1kwLCBzcmNYMSwgc3JjWTEsIGRzdFgwLCBkc3RZMCwgZHN0WDEsIGRzdFkxLCBtYXNrLCBmaWx0ZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQU5HTEUoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBTkdMRSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNhbXBsZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zYW1wbGVzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2FtcGxlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zYW1wbGVzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zYW1wbGVzLT5hZGRfaW50dmFsdWUoc2FtcGxlcyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludGVybmFsZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW50ZXJuYWxmb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClpbnRlcm5hbGZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQU5HTEUodGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2FtcGxlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NhbXBsZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zYW1wbGVzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NhbXBsZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NhbXBsZXMtPmFkZF9pbnR2YWx1ZShzYW1wbGVzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW50ZXJuYWxmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnRlcm5hbGZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWludGVybmFsZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRSh0YXJnZXQsIHNhbXBsZXMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFJlc29sdmVNdWx0aXNhbXBsZUZyYW1lYnVmZmVyQVBQTEUodm9pZCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGFiZWxPYmplY3RFWFQoR0xlbnVtIHR5cGUsIEdMdWludCBvYmplY3QsIEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKmxhYmVsKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMYWJlbE9iamVjdEVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG9iamVjdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX29iamVjdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX29iamVjdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19vYmplY3QtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX29iamVjdC0+YWRkX2ludHZhbHVlKG9iamVjdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlbmd0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlbmd0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZW5ndGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlbmd0aC0+YWRkX2ludHZhbHVlKGxlbmd0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxhYmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGFiZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sYWJlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sYWJlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGFiZWwtPmFkZF9pbnR2YWx1ZSgoaW50KWxhYmVsKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMYWJlbE9iamVjdEVYVCh0eXBlLCBvYmplY3QsIGxlbmd0aCwgbGFiZWwpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbGFiZWwsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldE9iamVjdExhYmVsRVhUKEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpsYWJlbCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0T2JqZWN0TGFiZWxFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBvYmplY3QKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19vYmplY3QgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19vYmplY3QtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfb2JqZWN0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19vYmplY3QtPmFkZF9pbnR2YWx1ZShvYmplY3QpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmU2l6ZS0+YWRkX2ludHZhbHVlKGJ1ZlNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZSgoaW50KWxlbmd0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxhYmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGFiZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sYWJlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sYWJlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGFiZWwtPmFkZF9pbnR2YWx1ZSgoaW50KWxhYmVsKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRPYmplY3RMYWJlbEVYVCh0eXBlLCBvYmplY3QsIGJ1ZlNpemUsIGxlbmd0aCwgbGFiZWwpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbGVuZ3RoLAotICAgICAgICAodm9pZCAqKSBsYWJlbCwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsSW5zZXJ0RXZlbnRNYXJrZXJFWFQoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xJbnNlcnRFdmVudE1hcmtlckVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlbmd0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlbmd0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZW5ndGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlbmd0aC0+YWRkX2ludHZhbHVlKGxlbmd0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1hcmtlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21hcmtlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21hcmtlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXJrZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21hcmtlci0+YWRkX2ludHZhbHVlKChpbnQpbWFya2VyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xJbnNlcnRFdmVudE1hcmtlckVYVChsZW5ndGgsIG1hcmtlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBtYXJrZXIsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFB1c2hHcm91cE1hcmtlckVYVChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFB1c2hHcm91cE1hcmtlckVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlbmd0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlbmd0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZW5ndGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlbmd0aC0+YWRkX2ludHZhbHVlKGxlbmd0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1hcmtlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21hcmtlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21hcmtlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXJrZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21hcmtlci0+YWRkX2ludHZhbHVlKChpbnQpbWFya2VyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQdXNoR3JvdXBNYXJrZXJFWFQobGVuZ3RoLCBtYXJrZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbWFya2VyLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQb3BHcm91cE1hcmtlckVYVCh2b2lkKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQb3BHcm91cE1hcmtlckVYVCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUG9wR3JvdXBNYXJrZXJFWFQoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERpc2NhcmRGcmFtZWJ1ZmZlckVYVChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEaXNjYXJkRnJhbWVidWZmZXJFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBudW1BdHRhY2htZW50cwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX251bUF0dGFjaG1lbnRzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnVtQXR0YWNobWVudHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnVtQXR0YWNobWVudHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX251bUF0dGFjaG1lbnRzLT5hZGRfaW50dmFsdWUobnVtQXR0YWNobWVudHMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhdHRhY2htZW50cwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2F0dGFjaG1lbnRzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYXR0YWNobWVudHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXR0YWNobWVudHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2F0dGFjaG1lbnRzLT5hZGRfaW50dmFsdWUoKGludClhdHRhY2htZW50cyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGlzY2FyZEZyYW1lYnVmZmVyRVhUKHRhcmdldCwgbnVtQXR0YWNobWVudHMsIGF0dGFjaG1lbnRzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGF0dGFjaG1lbnRzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzYW1wbGVzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2FtcGxlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NhbXBsZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2FtcGxlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2FtcGxlcy0+YWRkX2ludHZhbHVlKHNhbXBsZXMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCh0YXJnZXQsIHNhbXBsZXMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXR0YWNobWVudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2F0dGFjaG1lbnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hdHRhY2htZW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19hdHRhY2htZW50LT5hZGRfaW50dmFsdWUoKGludClhdHRhY2htZW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHRhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RleHRhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGV4dGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHR1cmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RleHR1cmUtPmFkZF9pbnR2YWx1ZSh0ZXh0dXJlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2FtcGxlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NhbXBsZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zYW1wbGVzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NhbXBsZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NhbXBsZXMtPmFkZF9pbnR2YWx1ZShzYW1wbGVzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCwgc2FtcGxlcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xNdWx0aURyYXdBcnJheXNFWFQoR0xlbnVtIG1vZGUsIEdMaW50ICpmaXJzdCwgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xNdWx0aURyYXdBcnJheXNFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtb2RlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9kZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbW9kZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX21vZGUtPmFkZF9pbnR2YWx1ZSgoaW50KW1vZGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmaXJzdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZpcnN0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmlyc3QtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmlyc3QtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZpcnN0LT5hZGRfaW50dmFsdWUoKGludClmaXJzdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZSgoaW50KWNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJpbWNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJpbWNvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJpbWNvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ByaW1jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJpbWNvdW50LT5hZGRfaW50dmFsdWUocHJpbWNvdW50KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNdWx0aURyYXdBcnJheXNFWFQobW9kZSwgZmlyc3QsIGNvdW50LCBwcmltY291bnQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZmlyc3QsCi0gICAgICAgICh2b2lkICopIGNvdW50LAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xNdWx0aURyYXdFbGVtZW50c0VYVChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTXVsdGlEcmF3RWxlbWVudHNFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtb2RlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9kZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbW9kZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX21vZGUtPmFkZF9pbnR2YWx1ZSgoaW50KW1vZGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoKGludCljb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZGljZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmRpY2VzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5kaWNlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmRpY2VzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmRpY2VzLT5hZGRfaW50dmFsdWUoKGludClpbmRpY2VzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJpbWNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJpbWNvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJpbWNvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ByaW1jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJpbWNvdW50LT5hZGRfaW50dmFsdWUocHJpbWNvdW50KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNdWx0aURyYXdFbGVtZW50c0VYVChtb2RlLCBjb3VudCwgdHlwZSwgaW5kaWNlcywgcHJpbWNvdW50KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGNvdW50LAotICAgICAgICAodm9pZCAqKSBpbmRpY2VzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZW5RdWVyaWVzRVhUKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdlblF1ZXJpZXNFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpZHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pZHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pZHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaWRzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pZHMtPmFkZF9pbnR2YWx1ZSgoaW50KWlkcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2VuUXVlcmllc0VYVChuLCBpZHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgaWRzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZWxldGVRdWVyaWVzRVhUKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlbGV0ZVF1ZXJpZXNFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpZHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pZHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pZHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaWRzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pZHMtPmFkZF9pbnR2YWx1ZSgoaW50KWlkcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVsZXRlUXVlcmllc0VYVChuLCBpZHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgaWRzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbElzUXVlcnlFWFQoR0x1aW50IGlkKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xJc1F1ZXJ5RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2lkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2lkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pZC0+YWRkX2ludHZhbHVlKGlkKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xJc1F1ZXJ5RVhUKGlkKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIHJ0LT5hZGRfYm9vbHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJlZ2luUXVlcnlFWFQoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCZWdpblF1ZXJ5RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2lkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2lkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pZC0+YWRkX2ludHZhbHVlKGlkKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCZWdpblF1ZXJ5RVhUKHRhcmdldCwgaWQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRW5kUXVlcnlFWFQoR0xlbnVtIHRhcmdldCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRW5kUXVlcnlFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEVuZFF1ZXJ5RVhUKHRhcmdldCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRRdWVyeWl2RVhUKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UXVlcnlpdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRRdWVyeWl2RVhUKHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFF1ZXJ5T2JqZWN0dWl2RVhUKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UXVlcnlPYmplY3R1aXZFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2lkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaWQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2lkLT5hZGRfaW50dmFsdWUoaWQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UXVlcnlPYmplY3R1aXZFWFQoaWQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1HTGVudW0gR0xUcmFjZV9nbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQodm9pZCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0R3JhcGhpY3NSZXNldFN0YXR1c0VYVCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMZW51bSByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0R3JhcGhpY3NSZXNldFN0YXR1c0VYVCgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgcnQtPmFkZF9pbnR2YWx1ZSgoaW50KXJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFJlYWRuUGl4ZWxzRVhUKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCB2b2lkICpkYXRhKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xSZWFkblBpeGVsc0VYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Zvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJ1ZlNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZTaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19idWZTaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZTaXplLT5hZGRfaW50dmFsdWUoYnVmU2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRhdGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kYXRhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGF0YS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kYXRhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kYXRhLT5hZGRfaW50dmFsdWUoKGludClkYXRhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xSZWFkblBpeGVsc0VYVCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIGJ1ZlNpemUsIGRhdGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZGF0YSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0blVuaWZvcm1mdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgZmxvYXQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0blVuaWZvcm1mdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJ1ZlNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZTaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19idWZTaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZTaXplLT5hZGRfaW50dmFsdWUoYnVmU2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRuVW5pZm9ybWZ2RVhUKHByb2dyYW0sIGxvY2F0aW9uLCBidWZTaXplLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRuVW5pZm9ybWl2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRuVW5pZm9ybWl2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmU2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZlNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZTaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZlNpemUtPmFkZF9pbnR2YWx1ZShidWZTaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldG5Vbmlmb3JtaXZFWFQocHJvZ3JhbSwgbG9jYXRpb24sIGJ1ZlNpemUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFVzZVByb2dyYW1TdGFnZXNFWFQoR0x1aW50IHBpcGVsaW5lLCBHTGJpdGZpZWxkIHN0YWdlcywgR0x1aW50IHByb2dyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVzZVByb2dyYW1TdGFnZXNFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwaXBlbGluZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BpcGVsaW5lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGlwZWxpbmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGlwZWxpbmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BpcGVsaW5lLT5hZGRfaW50dmFsdWUocGlwZWxpbmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzdGFnZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zdGFnZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zdGFnZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3RhZ2VzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zdGFnZXMtPmFkZF9pbnR2YWx1ZShzdGFnZXMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVzZVByb2dyYW1TdGFnZXNFWFQocGlwZWxpbmUsIHN0YWdlcywgcHJvZ3JhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xBY3RpdmVTaGFkZXJQcm9ncmFtRVhUKEdMdWludCBwaXBlbGluZSwgR0x1aW50IHByb2dyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEFjdGl2ZVNoYWRlclByb2dyYW1FWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwaXBlbGluZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BpcGVsaW5lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGlwZWxpbmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGlwZWxpbmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BpcGVsaW5lLT5hZGRfaW50dmFsdWUocGlwZWxpbmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEFjdGl2ZVNoYWRlclByb2dyYW1FWFQocGlwZWxpbmUsIHByb2dyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotR0x1aW50IEdMVHJhY2VfZ2xDcmVhdGVTaGFkZXJQcm9ncmFtdkVYVChHTGVudW0gdHlwZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyICoqc3RyaW5ncykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ3JlYXRlU2hhZGVyUHJvZ3JhbXZFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzdHJpbmdzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3RyaW5ncyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3N0cmluZ3MtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3RyaW5ncy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc3RyaW5ncy0+YWRkX2ludHZhbHVlKChpbnQpc3RyaW5ncyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMdWludCByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ3JlYXRlU2hhZGVyUHJvZ3JhbXZFWFQodHlwZSwgY291bnQsIHN0cmluZ3MpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBydC0+YWRkX2ludHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHN0cmluZ3MsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJpbmRQcm9ncmFtUGlwZWxpbmVFWFQoR0x1aW50IHBpcGVsaW5lKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCaW5kUHJvZ3JhbVBpcGVsaW5lRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGlwZWxpbmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19waXBlbGluZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19waXBlbGluZS0+YWRkX2ludHZhbHVlKHBpcGVsaW5lKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCaW5kUHJvZ3JhbVBpcGVsaW5lRVhUKHBpcGVsaW5lKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVByb2dyYW1QaXBlbGluZXNFWFQoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnBpcGVsaW5lcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVsZXRlUHJvZ3JhbVBpcGVsaW5lc0VYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBpcGVsaW5lcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BpcGVsaW5lcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpcGVsaW5lcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19waXBlbGluZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BpcGVsaW5lcy0+YWRkX2ludHZhbHVlKChpbnQpcGlwZWxpbmVzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZWxldGVQcm9ncmFtUGlwZWxpbmVzRVhUKG4sIHBpcGVsaW5lcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwaXBlbGluZXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdlblByb2dyYW1QaXBlbGluZXNFWFQoR0xzaXplaSBuLCBHTHVpbnQgKnBpcGVsaW5lcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2VuUHJvZ3JhbVBpcGVsaW5lc0VYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBpcGVsaW5lcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BpcGVsaW5lcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpcGVsaW5lcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19waXBlbGluZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BpcGVsaW5lcy0+YWRkX2ludHZhbHVlKChpbnQpcGlwZWxpbmVzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZW5Qcm9ncmFtUGlwZWxpbmVzRVhUKG4sIHBpcGVsaW5lcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwaXBlbGluZXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNQcm9ncmFtUGlwZWxpbmVFWFQoR0x1aW50IHBpcGVsaW5lKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xJc1Byb2dyYW1QaXBlbGluZUVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBpcGVsaW5lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGlwZWxpbmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19waXBlbGluZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19waXBlbGluZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGlwZWxpbmUtPmFkZF9pbnR2YWx1ZShwaXBlbGluZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMYm9vbGVhbiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsSXNQcm9ncmFtUGlwZWxpbmVFWFQocGlwZWxpbmUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgcnQtPmFkZF9ib29sdmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVBhcmFtZXRlcmlFWFQoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1QYXJhbWV0ZXJpRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKHZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVChwcm9ncmFtLCBwbmFtZSwgdmFsdWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0UHJvZ3JhbVBpcGVsaW5laXZFWFQoR0x1aW50IHBpcGVsaW5lLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFByb2dyYW1QaXBlbGluZWl2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGlwZWxpbmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19waXBlbGluZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19waXBlbGluZS0+YWRkX2ludHZhbHVlKHBpcGVsaW5lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFByb2dyYW1QaXBlbGluZWl2RVhUKHBpcGVsaW5lLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0xaUVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtMWlFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtMWlFWFQocHJvZ3JhbSwgbG9jYXRpb24sIHgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0yaUVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtMmlFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtMmlFWFQocHJvZ3JhbSwgbG9jYXRpb24sIHgsIHkpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0zaUVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtM2lFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfei0+YWRkX2ludHZhbHVlKHopOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtM2lFWFQocHJvZ3JhbSwgbG9jYXRpb24sIHgsIHksIHopOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm00aUVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtNGlFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfei0+YWRkX2ludHZhbHVlKHopOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ctPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdy0+YWRkX2ludHZhbHVlKHcpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtNGlFWFQocHJvZ3JhbSwgbG9jYXRpb24sIHgsIHksIHosIHcpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0xZkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0xZkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtMWZFWFQocHJvZ3JhbSwgbG9jYXRpb24sIHgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0yZkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTJmRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ktPmFkZF9mbG9hdHZhbHVlKHkpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtMmZFWFQocHJvZ3JhbSwgbG9jYXRpb24sIHgsIHkpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0zZkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtM2ZFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ194LT5hZGRfZmxvYXR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeS0+YWRkX2Zsb2F0dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3otPmFkZF9mbG9hdHZhbHVlKHopOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtM2ZFWFQocHJvZ3JhbSwgbG9jYXRpb24sIHgsIHksIHopOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm00ZkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm00ZkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ195LT5hZGRfZmxvYXR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfei0+YWRkX2Zsb2F0dmFsdWUoeik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHcKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ctPmFkZF9mbG9hdHZhbHVlKHcpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtNGZFWFQocHJvZ3JhbSwgbG9jYXRpb24sIHgsIHksIHosIHcpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0xaXZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtMWl2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtMWl2RVhUKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMml2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTJpdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTJpdkVYVChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0zaXZFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ZhbHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdmFsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdmFsdWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ZhbHVlLT5hZGRfaW50dmFsdWUoKGludCl2YWx1ZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUHJvZ3JhbVVuaWZvcm0zaXZFWFQocHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB2YWx1ZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2YWx1ZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm00aXZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtNGl2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtNGl2RVhUKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMWZ2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtMWZ2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtMWZ2RVhUKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMmZ2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtMmZ2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtMmZ2RVhUKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtM2Z2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtM2Z2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtM2Z2RVhUKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtNGZ2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtNGZ2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtNGZ2RVhUKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdHJhbnNwb3NlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHJhbnNwb3NlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RyYW5zcG9zZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX3RyYW5zcG9zZS0+YWRkX2Jvb2x2YWx1ZSh0cmFuc3Bvc2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ZhbHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdmFsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdmFsdWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ZhbHVlLT5hZGRfaW50dmFsdWUoKGludCl2YWx1ZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQocHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRyYW5zcG9zZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RyYW5zcG9zZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RyYW5zcG9zZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190cmFuc3Bvc2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ190cmFuc3Bvc2UtPmFkZF9ib29sdmFsdWUodHJhbnNwb3NlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2RVhUKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2YWx1ZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnZFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0cmFuc3Bvc2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190cmFuc3Bvc2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190cmFuc3Bvc2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5hZGRfYm9vbHZhbHVlKHRyYW5zcG9zZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRmdkVYVChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lRVhUKEdMdWludCBwaXBlbGluZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmVFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwaXBlbGluZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BpcGVsaW5lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGlwZWxpbmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGlwZWxpbmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BpcGVsaW5lLT5hZGRfaW50dmFsdWUocGlwZWxpbmUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lRVhUKHBpcGVsaW5lKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFByb2dyYW1QaXBlbGluZUluZm9Mb2dFWFQoR0x1aW50IHBpcGVsaW5lLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGlwZWxpbmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19waXBlbGluZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19waXBlbGluZS0+YWRkX2ludHZhbHVlKHBpcGVsaW5lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmU2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZlNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZTaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZlNpemUtPmFkZF9pbnR2YWx1ZShidWZTaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUoKGludClsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbmZvTG9nCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5mb0xvZyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZm9Mb2ctPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW5mb0xvZy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW5mb0xvZy0+YWRkX2ludHZhbHVlKChpbnQpaW5mb0xvZyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UHJvZ3JhbVBpcGVsaW5lSW5mb0xvZ0VYVChwaXBlbGluZSwgYnVmU2l6ZSwgbGVuZ3RoLCBpbmZvTG9nKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGxlbmd0aCwKLSAgICAgICAgKHZvaWQgKikgaW5mb0xvZywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4U3RvcmFnZTFERVhUKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleFN0b3JhZ2UxREVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVscwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVscyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVscy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVscy0+YWRkX2ludHZhbHVlKGxldmVscyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludGVybmFsZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW50ZXJuYWxmb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClpbnRlcm5hbGZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4U3RvcmFnZTFERVhUKHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4U3RvcmFnZTJERVhUKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhTdG9yYWdlMkRFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWxzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbHMtPmFkZF9pbnR2YWx1ZShsZXZlbHMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleFN0b3JhZ2UyREVYVCh0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4U3RvcmFnZTNERVhUKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhTdG9yYWdlM0RFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWxzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbHMtPmFkZF9pbnR2YWx1ZShsZXZlbHMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkZXB0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RlcHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGVwdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGVwdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RlcHRoLT5hZGRfaW50dmFsdWUoZGVwdGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleFN0b3JhZ2UzREVYVCh0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleHR1cmVTdG9yYWdlMURFWFQoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleHR1cmVTdG9yYWdlMURFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0dXJlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dHVyZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdGV4dHVyZS0+YWRkX2ludHZhbHVlKHRleHR1cmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWxzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbHMtPmFkZF9pbnR2YWx1ZShsZXZlbHMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleHR1cmVTdG9yYWdlMURFWFQodGV4dHVyZSwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXh0dXJlU3RvcmFnZTJERVhUKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4dHVyZVN0b3JhZ2UyREVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHR1cmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0dXJlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190ZXh0dXJlLT5hZGRfaW50dmFsdWUodGV4dHVyZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVscwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVscyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVscy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVscy0+YWRkX2ludHZhbHVlKGxldmVscyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludGVybmFsZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW50ZXJuYWxmb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClpbnRlcm5hbGZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4dHVyZVN0b3JhZ2UyREVYVCh0ZXh0dXJlLCB0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4dHVyZVN0b3JhZ2UzREVYVChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleHR1cmVTdG9yYWdlM0RFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0dXJlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dHVyZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdGV4dHVyZS0+YWRkX2ludHZhbHVlKHRleHR1cmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWxzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbHMtPmFkZF9pbnR2YWx1ZShsZXZlbHMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkZXB0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RlcHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGVwdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGVwdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RlcHRoLT5hZGRfaW50dmFsdWUoZGVwdGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleHR1cmVTdG9yYWdlM0RFWFQodGV4dHVyZSwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzYW1wbGVzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2FtcGxlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NhbXBsZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2FtcGxlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2FtcGxlcy0+YWRkX2ludHZhbHVlKHNhbXBsZXMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUlNRyh0YXJnZXQsIHNhbXBsZXMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXR0YWNobWVudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2F0dGFjaG1lbnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hdHRhY2htZW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19hdHRhY2htZW50LT5hZGRfaW50dmFsdWUoKGludClhdHRhY2htZW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHRhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RleHRhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGV4dGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHR1cmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RleHR1cmUtPmFkZF9pbnR2YWx1ZSh0ZXh0dXJlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2FtcGxlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NhbXBsZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zYW1wbGVzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NhbXBsZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NhbXBsZXMtPmFkZF9pbnR2YWx1ZShzYW1wbGVzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCwgc2FtcGxlcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb3ZlcmFnZU1hc2tOVihHTGJvb2xlYW4gbWFzaykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ292ZXJhZ2VNYXNrTlYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXNrCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWFzayA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21hc2stPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWFzay0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX21hc2stPmFkZF9ib29sdmFsdWUobWFzayk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ292ZXJhZ2VNYXNrTlYobWFzayk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WKEdMZW51bSBvcGVyYXRpb24pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvdmVyYWdlT3BlcmF0aW9uTlYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBvcGVyYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19vcGVyYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19vcGVyYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfb3BlcmF0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfb3BlcmF0aW9uLT5hZGRfaW50dmFsdWUoKGludClvcGVyYXRpb24pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENvdmVyYWdlT3BlcmF0aW9uTlYob3BlcmF0aW9uKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERyYXdCdWZmZXJzTlYoR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERyYXdCdWZmZXJzTlYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmcy0+YWRkX2ludHZhbHVlKChpbnQpYnVmcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRHJhd0J1ZmZlcnNOVihuLCBidWZzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGJ1ZnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlbGV0ZUZlbmNlc05WKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlbGV0ZUZlbmNlc05WKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmVuY2VzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmVuY2VzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmVuY2VzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZlbmNlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZmVuY2VzLT5hZGRfaW50dmFsdWUoKGludClmZW5jZXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlbGV0ZUZlbmNlc05WKG4sIGZlbmNlcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBmZW5jZXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdlbkZlbmNlc05WKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdlbkZlbmNlc05WKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmVuY2VzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmVuY2VzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmVuY2VzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZlbmNlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZmVuY2VzLT5hZGRfaW50dmFsdWUoKGludClmZW5jZXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdlbkZlbmNlc05WKG4sIGZlbmNlcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBmZW5jZXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNGZW5jZU5WKEdMdWludCBmZW5jZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSXNGZW5jZU5WKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmVuY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mZW5jZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZlbmNlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZlbmNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19mZW5jZS0+YWRkX2ludHZhbHVlKGZlbmNlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xJc0ZlbmNlTlYoZmVuY2UpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgcnQtPmFkZF9ib29sdmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotR0xib29sZWFuIEdMVHJhY2VfZ2xUZXN0RmVuY2VOVihHTHVpbnQgZmVuY2UpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRlc3RGZW5jZU5WKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmVuY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mZW5jZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZlbmNlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZlbmNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19mZW5jZS0+YWRkX2ludHZhbHVlKGZlbmNlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXN0RmVuY2VOVihmZW5jZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBydC0+YWRkX2Jvb2x2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRGZW5jZWl2TlYoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldEZlbmNlaXZOVik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZlbmNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmVuY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mZW5jZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mZW5jZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZmVuY2UtPmFkZF9pbnR2YWx1ZShmZW5jZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRGZW5jZWl2TlYoZmVuY2UsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGaW5pc2hGZW5jZU5WKEdMdWludCBmZW5jZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRmluaXNoRmVuY2VOVik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZlbmNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmVuY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mZW5jZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mZW5jZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZmVuY2UtPmFkZF9pbnR2YWx1ZShmZW5jZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRmluaXNoRmVuY2VOVihmZW5jZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTZXRGZW5jZU5WKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU2V0RmVuY2VOVik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZlbmNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmVuY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mZW5jZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mZW5jZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZmVuY2UtPmFkZF9pbnR2YWx1ZShmZW5jZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvbmRpdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvbmRpdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvbmRpdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb25kaXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19jb25kaXRpb24tPmFkZF9pbnR2YWx1ZSgoaW50KWNvbmRpdGlvbik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU2V0RmVuY2VOVihmZW5jZSwgY29uZGl0aW9uKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFJlYWRCdWZmZXJOVihHTGVudW0gbW9kZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUmVhZEJ1ZmZlck5WKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb2RlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlLT5hZGRfaW50dmFsdWUoKGludCltb2RlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xSZWFkQnVmZmVyTlYobW9kZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xBbHBoYUZ1bmNRQ09NKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEFscGhhRnVuY1FDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmdW5jCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnVuYyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Z1bmMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZnVuYy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Z1bmMtPmFkZF9pbnR2YWx1ZSgoaW50KWZ1bmMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWYKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWYgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWYtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVmLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3JlZi0+YWRkX2Zsb2F0dmFsdWUocmVmKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xBbHBoYUZ1bmNRQ09NKGZ1bmMsIHJlZik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXREcml2ZXJDb250cm9sc1FDT00oR0xpbnQgKm51bSwgR0xzaXplaSBzaXplLCBHTHVpbnQgKmRyaXZlckNvbnRyb2xzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXREcml2ZXJDb250cm9sc1FDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBudW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19udW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19udW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnVtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19udW0tPmFkZF9pbnR2YWx1ZSgoaW50KW51bSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaXplLT5hZGRfaW50dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRyaXZlckNvbnRyb2xzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHJpdmVyQ29udHJvbHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kcml2ZXJDb250cm9scy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kcml2ZXJDb250cm9scy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbHMtPmFkZF9pbnR2YWx1ZSgoaW50KWRyaXZlckNvbnRyb2xzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXREcml2ZXJDb250cm9sc1FDT00obnVtLCBzaXplLCBkcml2ZXJDb250cm9scyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBudW0sCi0gICAgICAgICh2b2lkICopIGRyaXZlckNvbnRyb2xzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTShHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkcml2ZXJDb250cm9sCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHJpdmVyQ29udHJvbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RyaXZlckNvbnRyb2wtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbC0+YWRkX2ludHZhbHVlKGRyaXZlckNvbnRyb2wpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmU2l6ZS0+YWRkX2ludHZhbHVlKGJ1ZlNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZSgoaW50KWxlbmd0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRyaXZlckNvbnRyb2xTdHJpbmcKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kcml2ZXJDb250cm9sU3RyaW5nID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbFN0cmluZy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kcml2ZXJDb250cm9sU3RyaW5nLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kcml2ZXJDb250cm9sU3RyaW5nLT5hZGRfaW50dmFsdWUoKGludClkcml2ZXJDb250cm9sU3RyaW5nKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTShkcml2ZXJDb250cm9sLCBidWZTaXplLCBsZW5ndGgsIGRyaXZlckNvbnRyb2xTdHJpbmcpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbGVuZ3RoLAotICAgICAgICAodm9pZCAqKSBkcml2ZXJDb250cm9sU3RyaW5nLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTShHTHVpbnQgZHJpdmVyQ29udHJvbCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkcml2ZXJDb250cm9sCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHJpdmVyQ29udHJvbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RyaXZlckNvbnRyb2wtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbC0+YWRkX2ludHZhbHVlKGRyaXZlckNvbnRyb2wpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NKGRyaXZlckNvbnRyb2wpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NKEdMdWludCBkcml2ZXJDb250cm9sKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkcml2ZXJDb250cm9sCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHJpdmVyQ29udHJvbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RyaXZlckNvbnRyb2wtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbC0+YWRkX2ludHZhbHVlKGRyaXZlckNvbnRyb2wpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERpc2FibGVEcml2ZXJDb250cm9sUUNPTShkcml2ZXJDb250cm9sKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEV4dEdldFRleHR1cmVzUUNPTShHTHVpbnQgKnRleHR1cmVzLCBHTGludCBtYXhUZXh0dXJlcywgR0xpbnQgKm51bVRleHR1cmVzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFeHRHZXRUZXh0dXJlc1FDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0dXJlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHR1cmVzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dHVyZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dHVyZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RleHR1cmVzLT5hZGRfaW50dmFsdWUoKGludCl0ZXh0dXJlcyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1heFRleHR1cmVzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWF4VGV4dHVyZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXhUZXh0dXJlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXhUZXh0dXJlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWF4VGV4dHVyZXMtPmFkZF9pbnR2YWx1ZShtYXhUZXh0dXJlcyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG51bVRleHR1cmVzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnVtVGV4dHVyZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19udW1UZXh0dXJlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19udW1UZXh0dXJlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbnVtVGV4dHVyZXMtPmFkZF9pbnR2YWx1ZSgoaW50KW51bVRleHR1cmVzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFeHRHZXRUZXh0dXJlc1FDT00odGV4dHVyZXMsIG1heFRleHR1cmVzLCBudW1UZXh0dXJlcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB0ZXh0dXJlcywKLSAgICAgICAgKHZvaWQgKikgbnVtVGV4dHVyZXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEV4dEdldEJ1ZmZlcnNRQ09NKEdMdWludCAqYnVmZmVycywgR0xpbnQgbWF4QnVmZmVycywgR0xpbnQgKm51bUJ1ZmZlcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEV4dEdldEJ1ZmZlcnNRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZmZlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZmZlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KWJ1ZmZlcnMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXhCdWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWF4QnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21heEJ1ZmZlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWF4QnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWF4QnVmZmVycy0+YWRkX2ludHZhbHVlKG1heEJ1ZmZlcnMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBudW1CdWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnVtQnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX251bUJ1ZmZlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnVtQnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbnVtQnVmZmVycy0+YWRkX2ludHZhbHVlKChpbnQpbnVtQnVmZmVycyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRXh0R2V0QnVmZmVyc1FDT00oYnVmZmVycywgbWF4QnVmZmVycywgbnVtQnVmZmVycyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBidWZmZXJzLAotICAgICAgICAodm9pZCAqKSBudW1CdWZmZXJzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTShHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlbmRlcmJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZW5kZXJidWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZW5kZXJidWZmZXJzLT5hZGRfaW50dmFsdWUoKGludClyZW5kZXJidWZmZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWF4UmVuZGVyYnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21heFJlbmRlcmJ1ZmZlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXhSZW5kZXJidWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21heFJlbmRlcmJ1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21heFJlbmRlcmJ1ZmZlcnMtPmFkZF9pbnR2YWx1ZShtYXhSZW5kZXJidWZmZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnVtUmVuZGVyYnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX251bVJlbmRlcmJ1ZmZlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19udW1SZW5kZXJidWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX251bVJlbmRlcmJ1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX251bVJlbmRlcmJ1ZmZlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KW51bVJlbmRlcmJ1ZmZlcnMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NKHJlbmRlcmJ1ZmZlcnMsIG1heFJlbmRlcmJ1ZmZlcnMsIG51bVJlbmRlcmJ1ZmZlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcmVuZGVyYnVmZmVycywKLSAgICAgICAgKHZvaWQgKikgbnVtUmVuZGVyYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRXh0R2V0RnJhbWVidWZmZXJzUUNPTShHTHVpbnQgKmZyYW1lYnVmZmVycywgR0xpbnQgbWF4RnJhbWVidWZmZXJzLCBHTGludCAqbnVtRnJhbWVidWZmZXJzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZnJhbWVidWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnJhbWVidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZnJhbWVidWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZnJhbWVidWZmZXJzLT5hZGRfaW50dmFsdWUoKGludClmcmFtZWJ1ZmZlcnMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXhGcmFtZWJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXhGcmFtZWJ1ZmZlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXhGcmFtZWJ1ZmZlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWF4RnJhbWVidWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXhGcmFtZWJ1ZmZlcnMtPmFkZF9pbnR2YWx1ZShtYXhGcmFtZWJ1ZmZlcnMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBudW1GcmFtZWJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19udW1GcmFtZWJ1ZmZlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19udW1GcmFtZWJ1ZmZlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnVtRnJhbWVidWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19udW1GcmFtZWJ1ZmZlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KW51bUZyYW1lYnVmZmVycyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRXh0R2V0RnJhbWVidWZmZXJzUUNPTShmcmFtZWJ1ZmZlcnMsIG1heEZyYW1lYnVmZmVycywgbnVtRnJhbWVidWZmZXJzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGZyYW1lYnVmZmVycywKLSAgICAgICAgKHZvaWQgKikgbnVtRnJhbWVidWZmZXJzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIGZhY2UsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHR1cmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RleHR1cmUtPmFkZF9pbnR2YWx1ZSh0ZXh0dXJlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmFjZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWNlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZhY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mYWNlLT5hZGRfaW50dmFsdWUoKGludClmYWNlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NKHRleHR1cmUsIGZhY2UsIGxldmVsLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NKHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEV4dEdldFRleFN1YkltYWdlUUNPTShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRleGVscykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeG9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3hvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3hvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3hvZmZzZXQtPmFkZF9pbnR2YWx1ZSh4b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeW9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3lvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3lvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3lvZmZzZXQtPmFkZF9pbnR2YWx1ZSh5b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgem9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pvZmZzZXQtPmFkZF9pbnR2YWx1ZSh6b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGVwdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kZXB0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kZXB0aC0+YWRkX2ludHZhbHVlKGRlcHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Zvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3R5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3R5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190eXBlLT5hZGRfaW50dmFsdWUoKGludCl0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4ZWxzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4ZWxzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4ZWxzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleGVscy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdGV4ZWxzLT5hZGRfaW50dmFsdWUoKGludCl0ZXhlbHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEV4dEdldFRleFN1YkltYWdlUUNPTSh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCB0eXBlLCB0ZXhlbHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdGV4ZWxzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00oR0xlbnVtIHRhcmdldCwgR0x2b2lkICoqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NKHRhcmdldCwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRXh0R2V0U2hhZGVyc1FDT00oR0x1aW50ICpzaGFkZXJzLCBHTGludCBtYXhTaGFkZXJzLCBHTGludCAqbnVtU2hhZGVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRXh0R2V0U2hhZGVyc1FDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaGFkZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2hhZGVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NoYWRlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2hhZGVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2hhZGVycy0+YWRkX2ludHZhbHVlKChpbnQpc2hhZGVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1heFNoYWRlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXhTaGFkZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWF4U2hhZGVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXhTaGFkZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXhTaGFkZXJzLT5hZGRfaW50dmFsdWUobWF4U2hhZGVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG51bVNoYWRlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19udW1TaGFkZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnVtU2hhZGVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19udW1TaGFkZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19udW1TaGFkZXJzLT5hZGRfaW50dmFsdWUoKGludCludW1TaGFkZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFeHRHZXRTaGFkZXJzUUNPTShzaGFkZXJzLCBtYXhTaGFkZXJzLCBudW1TaGFkZXJzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHNoYWRlcnMsCi0gICAgICAgICh2b2lkICopIG51bVNoYWRlcnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEV4dEdldFByb2dyYW1zUUNPTShHTHVpbnQgKnByb2dyYW1zLCBHTGludCBtYXhQcm9ncmFtcywgR0xpbnQgKm51bVByb2dyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFeHRHZXRQcm9ncmFtc1FDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW1zLT5hZGRfaW50dmFsdWUoKGludClwcm9ncmFtcyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1heFByb2dyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWF4UHJvZ3JhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXhQcm9ncmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXhQcm9ncmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWF4UHJvZ3JhbXMtPmFkZF9pbnR2YWx1ZShtYXhQcm9ncmFtcyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG51bVByb2dyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnVtUHJvZ3JhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19udW1Qcm9ncmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19udW1Qcm9ncmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbnVtUHJvZ3JhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KW51bVByb2dyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFeHRHZXRQcm9ncmFtc1FDT00ocHJvZ3JhbXMsIG1heFByb2dyYW1zLCBudW1Qcm9ncmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwcm9ncmFtcywKLSAgICAgICAgKHZvaWQgKikgbnVtUHJvZ3JhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLUdMYm9vbGVhbiBHTFRyYWNlX2dsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTShHTHVpbnQgcHJvZ3JhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMYm9vbGVhbiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTShwcm9ncmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIHJ0LT5hZGRfYm9vbHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2hhZGVydHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NoYWRlcnR5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaGFkZXJ0eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NoYWRlcnR5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19zaGFkZXJ0eXBlLT5hZGRfaW50dmFsdWUoKGludClzaGFkZXJ0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc291cmNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc291cmNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc291cmNlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NvdXJjZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc291cmNlLT5hZGRfaW50dmFsdWUoKGludClzb3VyY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZSgoaW50KWxlbmd0aCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00ocHJvZ3JhbSwgc2hhZGVydHlwZSwgc291cmNlLCBsZW5ndGgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgc291cmNlLAotICAgICAgICAodm9pZCAqKSBsZW5ndGgsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFN0YXJ0VGlsaW5nUUNPTShHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCwgR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFN0YXJ0VGlsaW5nUUNPTSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByZXNlcnZlTWFzawotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ByZXNlcnZlTWFzayA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ByZXNlcnZlTWFzay0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcmVzZXJ2ZU1hc2stPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ByZXNlcnZlTWFzay0+YWRkX2ludHZhbHVlKHByZXNlcnZlTWFzayk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU3RhcnRUaWxpbmdRQ09NKHgsIHksIHdpZHRoLCBoZWlnaHQsIHByZXNlcnZlTWFzayk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFbmRUaWxpbmdRQ09NKEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFbmRUaWxpbmdRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJlc2VydmVNYXNrCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJlc2VydmVNYXNrID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJlc2VydmVNYXNrLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ByZXNlcnZlTWFzay0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJlc2VydmVNYXNrLT5hZGRfaW50dmFsdWUocHJlc2VydmVNYXNrKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFbmRUaWxpbmdRQ09NKHByZXNlcnZlTWFzayk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi0KLS8vIERlZmluaXRpb25zIGZvciBHTDEgQVBJcwotCi12b2lkIEdMVHJhY2VfZ2xBbHBoYUZ1bmMoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQWxwaGFGdW5jKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZnVuYwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Z1bmMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mdW5jLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Z1bmMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mdW5jLT5hZGRfaW50dmFsdWUoKGludClmdW5jKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVmCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVmID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVmLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlZi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19yZWYtPmFkZF9mbG9hdHZhbHVlKHJlZik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQWxwaGFGdW5jKGZ1bmMsIHJlZik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGlwUGxhbmVmKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENsaXBQbGFuZWYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbGFuZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BsYW5lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGxhbmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGxhbmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbGFuZS0+YWRkX2ludHZhbHVlKChpbnQpcGxhbmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBlcXVhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VxdWF0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZXF1YXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZXF1YXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2VxdWF0aW9uLT5hZGRfaW50dmFsdWUoKGludCllcXVhdGlvbik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ2xpcFBsYW5lZihwbGFuZSwgZXF1YXRpb24pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZXF1YXRpb24sCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENvbG9yNGYoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ29sb3I0Zik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JlZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZWQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcmVkLT5hZGRfZmxvYXR2YWx1ZShyZWQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncmVlbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyZWVuID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JlZW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JlZW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfZ3JlZW4tPmFkZF9mbG9hdHZhbHVlKGdyZWVuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYmx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ibHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JsdWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfYmx1ZS0+YWRkX2Zsb2F0dmFsdWUoYmx1ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGFscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYWxwaGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19hbHBoYS0+YWRkX2Zsb2F0dmFsdWUoYWxwaGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENvbG9yNGYocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRm9nZihHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZvZ2YpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9mbG9hdHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGb2dmKHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGb2dmdihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRm9nZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRm9nZnYocG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZydXN0dW1mKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZydXN0dW1mKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVmdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlZnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZWZ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlZnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfbGVmdC0+YWRkX2Zsb2F0dmFsdWUobGVmdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19yaWdodC0+YWRkX2Zsb2F0dmFsdWUocmlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBib3R0b20KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ib3R0b20gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ib3R0b20tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2JvdHRvbS0+YWRkX2Zsb2F0dmFsdWUoYm90dG9tKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdG9wCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdG9wID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdG9wLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RvcC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ190b3AtPmFkZF9mbG9hdHZhbHVlKHRvcCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpOZWFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfek5lYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196TmVhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196TmVhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196TmVhci0+YWRkX2Zsb2F0dmFsdWUoek5lYXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6RmFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfekZhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pGYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfekZhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196RmFyLT5hZGRfZmxvYXR2YWx1ZSh6RmFyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGcnVzdHVtZihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldENsaXBQbGFuZWYoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0Q2xpcFBsYW5lZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGVxbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VxbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Vxbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19lcW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2Vxbi0+YWRkX2ludHZhbHVlKChpbnQpZXFuKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRDbGlwUGxhbmVmKHBuYW1lLCBlcW4pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZXFuLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRMaWdodGZ2KEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldExpZ2h0ZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19saWdodC0+YWRkX2ludHZhbHVlKChpbnQpbGlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0TGlnaHRmdihsaWdodCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldE1hdGVyaWFsZnYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRNYXRlcmlhbGZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmFjZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWNlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZhY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mYWNlLT5hZGRfaW50dmFsdWUoKGludClmYWNlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldE1hdGVyaWFsZnYoZmFjZSwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFRleEVudmZ2KEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRUZXhFbnZmdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGVudgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VudiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Vudi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19lbnYtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19lbnYtPmFkZF9pbnR2YWx1ZSgoaW50KWVudik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRUZXhFbnZmdihlbnYsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMaWdodE1vZGVsZihHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExpZ2h0TW9kZWxmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfZmxvYXR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGlnaHRNb2RlbGYocG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExpZ2h0TW9kZWxmdihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTGlnaHRNb2RlbGZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExpZ2h0TW9kZWxmdihwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlnaHRmKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaWdodGYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19saWdodC0+YWRkX2ludHZhbHVlKChpbnQpbGlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9mbG9hdHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMaWdodGYobGlnaHQsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMaWdodGZ2KEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExpZ2h0ZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19saWdodC0+YWRkX2ludHZhbHVlKChpbnQpbGlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGlnaHRmdihsaWdodCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExvYWRNYXRyaXhmKGNvbnN0IEdMZmxvYXQgKm0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExvYWRNYXRyaXhmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX20gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX20tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX20tPmFkZF9pbnR2YWx1ZSgoaW50KW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExvYWRNYXRyaXhmKG0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTWF0ZXJpYWxmKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE1hdGVyaWFsZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFjZS0+YWRkX2ludHZhbHVlKChpbnQpZmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2Zsb2F0dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE1hdGVyaWFsZihmYWNlLCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTWF0ZXJpYWxmdihHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE1hdGVyaWFsZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmYWNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmFjZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZhY2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmFjZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ZhY2UtPmFkZF9pbnR2YWx1ZSgoaW50KWZhY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTWF0ZXJpYWxmdihmYWNlLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTXVsdE1hdHJpeGYoY29uc3QgR0xmbG9hdCAqbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTXVsdE1hdHJpeGYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX20tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbS0+YWRkX2ludHZhbHVlKChpbnQpbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTXVsdE1hdHJpeGYobSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBtLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xNdWx0aVRleENvb3JkNGYoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xNdWx0aVRleENvb3JkNGYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3MtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19zLT5hZGRfZmxvYXR2YWx1ZShzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3QgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3QtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfdC0+YWRkX2Zsb2F0dmFsdWUodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ItPmFkZF9mbG9hdHZhbHVlKHIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBxCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3EtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19xLT5hZGRfZmxvYXR2YWx1ZShxKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNdWx0aVRleENvb3JkNGYodGFyZ2V0LCBzLCB0LCByLCBxKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE5vcm1hbDNmKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE5vcm1hbDNmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbngKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ueCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX254LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX254LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX254LT5hZGRfZmxvYXR2YWx1ZShueCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG55Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnkgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ueS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ueS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19ueS0+YWRkX2Zsb2F0dmFsdWUobnkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX256ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnotPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnotPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfbnotPmFkZF9mbG9hdHZhbHVlKG56KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xOb3JtYWwzZihueCwgbnksIG56KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE9ydGhvZihHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xPcnRob2YpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZWZ0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVmdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlZnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVmdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19sZWZ0LT5hZGRfZmxvYXR2YWx1ZShsZWZ0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3JpZ2h0LT5hZGRfZmxvYXR2YWx1ZShyaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJvdHRvbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JvdHRvbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JvdHRvbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ib3R0b20tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfYm90dG9tLT5hZGRfZmxvYXR2YWx1ZShib3R0b20pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0b3AKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190b3AgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190b3AtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdG9wLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3RvcC0+YWRkX2Zsb2F0dmFsdWUodG9wKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgek5lYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196TmVhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3pOZWFyLT5hZGRfZmxvYXR2YWx1ZSh6TmVhcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpGYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196RmFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfekZhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196RmFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3pGYXItPmFkZF9mbG9hdHZhbHVlKHpGYXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE9ydGhvZihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFBvaW50UGFyYW1ldGVyZihHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFBvaW50UGFyYW1ldGVyZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2Zsb2F0dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFBvaW50UGFyYW1ldGVyZihwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUG9pbnRQYXJhbWV0ZXJmdihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9pbnRQYXJhbWV0ZXJmdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQb2ludFBhcmFtZXRlcmZ2KHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQb2ludFNpemUoR0xmbG9hdCBzaXplKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQb2ludFNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19zaXplLT5hZGRfZmxvYXR2YWx1ZShzaXplKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQb2ludFNpemUoc2l6ZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xSb3RhdGVmKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFJvdGF0ZWYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhbmdsZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FuZ2xlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYW5nbGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYW5nbGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfYW5nbGUtPmFkZF9mbG9hdHZhbHVlKGFuZ2xlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ktPmFkZF9mbG9hdHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196LT5hZGRfZmxvYXR2YWx1ZSh6KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xSb3RhdGVmKGFuZ2xlLCB4LCB5LCB6KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFNjYWxlZihHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTY2FsZWYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ194LT5hZGRfZmxvYXR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeS0+YWRkX2Zsb2F0dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3otPmFkZF9mbG9hdHZhbHVlKHopOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFNjYWxlZih4LCB5LCB6KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleEVudmYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhFbnZmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfZmxvYXR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4RW52Zih0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhFbnZmdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4RW52ZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4RW52ZnYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVHJhbnNsYXRlZihHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUcmFuc2xhdGVmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ktPmFkZF9mbG9hdHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196LT5hZGRfZmxvYXR2YWx1ZSh6KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUcmFuc2xhdGVmKHgsIHksIHopOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQWxwaGFGdW5jeChHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xBbHBoYUZ1bmN4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZnVuYwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Z1bmMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mdW5jLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Z1bmMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mdW5jLT5hZGRfaW50dmFsdWUoKGludClmdW5jKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVmCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVmID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVmLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlZi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVmLT5hZGRfaW50dmFsdWUocmVmKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xBbHBoYUZ1bmN4KGZ1bmMsIHJlZik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGVhckNvbG9yeChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ2xlYXJDb2xvcngpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZWQtPmFkZF9pbnR2YWx1ZShyZWQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncmVlbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyZWVuID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JlZW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JlZW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2dyZWVuLT5hZGRfaW50dmFsdWUoZ3JlZW4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBibHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYmx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYmx1ZS0+YWRkX2ludHZhbHVlKGJsdWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYWxwaGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2FscGhhLT5hZGRfaW50dmFsdWUoYWxwaGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENsZWFyQ29sb3J4KHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENsZWFyRGVwdGh4KEdMY2xhbXB4IGRlcHRoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGVhckRlcHRoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRlcHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGVwdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kZXB0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kZXB0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGVwdGgtPmFkZF9pbnR2YWx1ZShkZXB0aCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ2xlYXJEZXB0aHgoZGVwdGgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ2xpZW50QWN0aXZlVGV4dHVyZShHTGVudW0gdGV4dHVyZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ2xpZW50QWN0aXZlVGV4dHVyZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHR1cmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0dXJlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGV4dHVyZS0+YWRkX2ludHZhbHVlKChpbnQpdGV4dHVyZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ2xpZW50QWN0aXZlVGV4dHVyZSh0ZXh0dXJlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENsaXBQbGFuZXgoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ2xpcFBsYW5leCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBsYW5lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGxhbmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbGFuZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbGFuZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BsYW5lLT5hZGRfaW50dmFsdWUoKGludClwbGFuZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGVxdWF0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZXF1YXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19lcXVhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19lcXVhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZXF1YXRpb24tPmFkZF9pbnR2YWx1ZSgoaW50KWVxdWF0aW9uKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDbGlwUGxhbmV4KHBsYW5lLCBlcXVhdGlvbik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBlcXVhdGlvbiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ29sb3I0dWIoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ29sb3I0dWIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCWVRFKTsKLSAgICBhcmdfcmVkLT5hZGRfaW50dmFsdWUoKGludClyZWQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncmVlbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyZWVuID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JlZW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JlZW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJZVEUpOwotICAgIGFyZ19ncmVlbi0+YWRkX2ludHZhbHVlKChpbnQpZ3JlZW4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBibHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYmx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6QllURSk7Ci0gICAgYXJnX2JsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KWJsdWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYWxwaGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJZVEUpOwotICAgIGFyZ19hbHBoYS0+YWRkX2ludHZhbHVlKChpbnQpYWxwaGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENvbG9yNHViKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENvbG9yNHgoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ29sb3I0eCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JlZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZWQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3JlZC0+YWRkX2ludHZhbHVlKHJlZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGdyZWVuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZ3JlZW4gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ncmVlbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ncmVlbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZ3JlZW4tPmFkZF9pbnR2YWx1ZShncmVlbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ibHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ibHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ibHVlLT5hZGRfaW50dmFsdWUoYmx1ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGFscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYWxwaGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYWxwaGEtPmFkZF9pbnR2YWx1ZShhbHBoYSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ29sb3I0eChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb2xvclBvaW50ZXIoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvbG9yUG9pbnRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaXplLT5hZGRfaW50dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHN0cmlkZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3N0cmlkZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zdHJpZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3N0cmlkZS0+YWRkX2ludHZhbHVlKHN0cmlkZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBvaW50ZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wb2ludGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wb2ludGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wb2ludGVyLT5hZGRfaW50dmFsdWUoKGludClwb2ludGVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDb2xvclBvaW50ZXIoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBvaW50ZXIsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlcHRoUmFuZ2V4KEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZXB0aFJhbmdleCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpOZWFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfek5lYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196TmVhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196TmVhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfek5lYXItPmFkZF9pbnR2YWx1ZSh6TmVhcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpGYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196RmFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfekZhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196RmFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196RmFyLT5hZGRfaW50dmFsdWUoekZhcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVwdGhSYW5nZXgoek5lYXIsIHpGYXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGlzYWJsZUNsaWVudFN0YXRlKEdMZW51bSBhcnJheSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGlzYWJsZUNsaWVudFN0YXRlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXJyYXkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hcnJheSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2FycmF5LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2FycmF5LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfYXJyYXktPmFkZF9pbnR2YWx1ZSgoaW50KWFycmF5KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEaXNhYmxlQ2xpZW50U3RhdGUoYXJyYXkpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRW5hYmxlQ2xpZW50U3RhdGUoR0xlbnVtIGFycmF5KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFbmFibGVDbGllbnRTdGF0ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGFycmF5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXJyYXkgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hcnJheS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hcnJheS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2FycmF5LT5hZGRfaW50dmFsdWUoKGludClhcnJheSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoYXJyYXkpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRm9neChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZvZ3gpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZvZ3gocG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZvZ3h2KEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGb2d4dik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGb2d4dihwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRnJ1c3R1bXgoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRnJ1c3R1bXgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZWZ0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVmdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlZnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVmdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVmdC0+YWRkX2ludHZhbHVlKGxlZnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3JpZ2h0LT5hZGRfaW50dmFsdWUocmlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBib3R0b20KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ib3R0b20gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ib3R0b20tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ib3R0b20tPmFkZF9pbnR2YWx1ZShib3R0b20pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0b3AKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190b3AgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190b3AtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdG9wLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190b3AtPmFkZF9pbnR2YWx1ZSh0b3ApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6TmVhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pOZWFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfek5lYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfek5lYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pOZWFyLT5hZGRfaW50dmFsdWUoek5lYXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6RmFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfekZhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pGYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfekZhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfekZhci0+YWRkX2ludHZhbHVlKHpGYXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZydXN0dW14KGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0Q2xpcFBsYW5leChHTGVudW0gcG5hbWUsIEdMZml4ZWQgZXFuWzRdKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRDbGlwUGxhbmV4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZXFuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZXFuID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZXFuLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Vxbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZXFuLT5hZGRfaW50dmFsdWUoKGludCllcW4pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldENsaXBQbGFuZXgocG5hbWUsIGVxbik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBlcW4sCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldEZpeGVkdihHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0Rml4ZWR2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldEZpeGVkdihwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0TGlnaHR4dihHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRMaWdodHh2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19saWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbGlnaHQtPmFkZF9pbnR2YWx1ZSgoaW50KWxpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldExpZ2h0eHYobGlnaHQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRNYXRlcmlhbHh2KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0TWF0ZXJpYWx4dik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFjZS0+YWRkX2ludHZhbHVlKChpbnQpZmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRNYXRlcmlhbHh2KGZhY2UsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRQb2ludGVydihHTGVudW0gcG5hbWUsIEdMdm9pZCAqKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UG9pbnRlcnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UG9pbnRlcnYocG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFRleEVudml2KEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0VGV4RW52aXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBlbnYKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19lbnYgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19lbnYtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZW52LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZW52LT5hZGRfaW50dmFsdWUoKGludCllbnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VGV4RW52aXYoZW52LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0VGV4RW52eHYoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFRleEVudnh2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZW52Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZW52ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZW52LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Vudi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Vudi0+YWRkX2ludHZhbHVlKChpbnQpZW52KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFRleEVudnh2KGVudiwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFRleFBhcmFtZXRlcnh2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRUZXhQYXJhbWV0ZXJ4dik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRUZXhQYXJhbWV0ZXJ4dih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMaWdodE1vZGVseChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExpZ2h0TW9kZWx4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2ludHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMaWdodE1vZGVseChwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlnaHRNb2RlbHh2KEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaWdodE1vZGVseHYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGlnaHRNb2RlbHh2KHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMaWdodHgoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExpZ2h0eCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19saWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19saWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2xpZ2h0LT5hZGRfaW50dmFsdWUoKGludClsaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGlnaHR4KGxpZ2h0LCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlnaHR4dihHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaWdodHh2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19saWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbGlnaHQtPmFkZF9pbnR2YWx1ZSgoaW50KWxpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExpZ2h0eHYobGlnaHQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMaW5lV2lkdGh4KEdMZml4ZWQgd2lkdGgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExpbmVXaWR0aHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExpbmVXaWR0aHgod2lkdGgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTG9hZElkZW50aXR5KHZvaWQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExvYWRJZGVudGl0eSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTG9hZElkZW50aXR5KCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMb2FkTWF0cml4eChjb25zdCBHTGZpeGVkICptKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMb2FkTWF0cml4eCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tLT5hZGRfaW50dmFsdWUoKGludCltKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMb2FkTWF0cml4eChtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIG0sCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExvZ2ljT3AoR0xlbnVtIG9wY29kZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTG9naWNPcCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG9wY29kZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX29wY29kZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX29wY29kZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19vcGNvZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19vcGNvZGUtPmFkZF9pbnR2YWx1ZSgoaW50KW9wY29kZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTG9naWNPcChvcGNvZGUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTWF0ZXJpYWx4KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE1hdGVyaWFseCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFjZS0+YWRkX2ludHZhbHVlKChpbnQpZmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTWF0ZXJpYWx4KGZhY2UsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xNYXRlcmlhbHh2KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTWF0ZXJpYWx4dik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFjZS0+YWRkX2ludHZhbHVlKChpbnQpZmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNYXRlcmlhbHh2KGZhY2UsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xNYXRyaXhNb2RlKEdMZW51bSBtb2RlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xNYXRyaXhNb2RlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb2RlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlLT5hZGRfaW50dmFsdWUoKGludCltb2RlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNYXRyaXhNb2RlKG1vZGUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTXVsdE1hdHJpeHgoY29uc3QgR0xmaXhlZCAqbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTXVsdE1hdHJpeHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX20tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbS0+YWRkX2ludHZhbHVlKChpbnQpbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTXVsdE1hdHJpeHgobSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBtLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xNdWx0aVRleENvb3JkNHgoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xNdWx0aVRleENvb3JkNHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3MtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcy0+YWRkX2ludHZhbHVlKHMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3QtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdC0+YWRkX2ludHZhbHVlKHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfci0+YWRkX2ludHZhbHVlKHIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBxCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3EtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcS0+YWRkX2ludHZhbHVlKHEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE11bHRpVGV4Q29vcmQ0eCh0YXJnZXQsIHMsIHQsIHIsIHEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTm9ybWFsM3goR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTm9ybWFsM3gpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBueAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX254ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbngtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbngtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX254LT5hZGRfaW50dmFsdWUobngpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBueQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX255ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX255LT5hZGRfaW50dmFsdWUobnkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX256ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnotPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnotPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX256LT5hZGRfaW50dmFsdWUobnopOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE5vcm1hbDN4KG54LCBueSwgbnopOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTm9ybWFsUG9pbnRlcihHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTm9ybWFsUG9pbnRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHN0cmlkZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3N0cmlkZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zdHJpZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3N0cmlkZS0+YWRkX2ludHZhbHVlKHN0cmlkZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBvaW50ZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wb2ludGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wb2ludGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wb2ludGVyLT5hZGRfaW50dmFsdWUoKGludClwb2ludGVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xOb3JtYWxQb2ludGVyKHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwb2ludGVyLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xPcnRob3goR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsT3J0aG94KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVmdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlZnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZWZ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlZnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlZnQtPmFkZF9pbnR2YWx1ZShsZWZ0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yaWdodC0+YWRkX2ludHZhbHVlKHJpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYm90dG9tCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYm90dG9tID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JvdHRvbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYm90dG9tLT5hZGRfaW50dmFsdWUoYm90dG9tKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdG9wCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdG9wID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdG9wLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RvcC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdG9wLT5hZGRfaW50dmFsdWUodG9wKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgek5lYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196TmVhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196TmVhci0+YWRkX2ludHZhbHVlKHpOZWFyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgekZhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pGYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196RmFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pGYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pGYXItPmFkZF9pbnR2YWx1ZSh6RmFyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xPcnRob3gobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQb2ludFBhcmFtZXRlcngoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQb2ludFBhcmFtZXRlcngpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFBvaW50UGFyYW1ldGVyeChwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUG9pbnRQYXJhbWV0ZXJ4dihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9pbnRQYXJhbWV0ZXJ4dik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQb2ludFBhcmFtZXRlcnh2KHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQb2ludFNpemV4KEdMZml4ZWQgc2l6ZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9pbnRTaXpleCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaXplLT5hZGRfaW50dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUG9pbnRTaXpleChzaXplKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFBvbHlnb25PZmZzZXR4KEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQb2x5Z29uT2Zmc2V0eCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY3RvcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhY3RvciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZhY3Rvci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWN0b3ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZhY3Rvci0+YWRkX2ludHZhbHVlKGZhY3Rvcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHVuaXRzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdW5pdHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ191bml0cy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ191bml0cy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdW5pdHMtPmFkZF9pbnR2YWx1ZSh1bml0cyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUG9seWdvbk9mZnNldHgoZmFjdG9yLCB1bml0cyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQb3BNYXRyaXgodm9pZCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9wTWF0cml4KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQb3BNYXRyaXgoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFB1c2hNYXRyaXgodm9pZCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUHVzaE1hdHJpeCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUHVzaE1hdHJpeCgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUm90YXRleChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xSb3RhdGV4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYW5nbGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hbmdsZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2FuZ2xlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2FuZ2xlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19hbmdsZS0+YWRkX2ludHZhbHVlKGFuZ2xlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3otPmFkZF9pbnR2YWx1ZSh6KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xSb3RhdGV4KGFuZ2xlLCB4LCB5LCB6KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFNhbXBsZUNvdmVyYWdleChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU2FtcGxlQ292ZXJhZ2V4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKHZhbHVlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW52ZXJ0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW52ZXJ0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW52ZXJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludmVydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX2ludmVydC0+YWRkX2Jvb2x2YWx1ZShpbnZlcnQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFNhbXBsZUNvdmVyYWdleCh2YWx1ZSwgaW52ZXJ0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFNjYWxleChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTY2FsZXgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfei0+YWRkX2ludHZhbHVlKHopOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFNjYWxleCh4LCB5LCB6KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFNoYWRlTW9kZWwoR0xlbnVtIG1vZGUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFNoYWRlTW9kZWwpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtb2RlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9kZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbW9kZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX21vZGUtPmFkZF9pbnR2YWx1ZSgoaW50KW1vZGUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFNoYWRlTW9kZWwobW9kZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhDb29yZFBvaW50ZXIoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleENvb3JkUG9pbnRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaXplLT5hZGRfaW50dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHN0cmlkZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3N0cmlkZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zdHJpZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3N0cmlkZS0+YWRkX2ludHZhbHVlKHN0cmlkZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBvaW50ZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wb2ludGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wb2ludGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wb2ludGVyLT5hZGRfaW50dmFsdWUoKGludClwb2ludGVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhDb29yZFBvaW50ZXIoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBvaW50ZXIsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleEVudmkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4RW52aSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4RW52aSh0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhFbnZ4KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4RW52eCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4RW52eCh0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhFbnZpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleEVudml2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEVudml2KHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleEVudnh2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhFbnZ4dik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhFbnZ4dih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhQYXJhbWV0ZXJ4KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4UGFyYW1ldGVyeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4UGFyYW1ldGVyeCh0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhQYXJhbWV0ZXJ4dihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4UGFyYW1ldGVyeHYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4UGFyYW1ldGVyeHYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVHJhbnNsYXRleChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUcmFuc2xhdGV4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3otPmFkZF9pbnR2YWx1ZSh6KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUcmFuc2xhdGV4KHgsIHksIHopOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVmVydGV4UG9pbnRlcihHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVmVydGV4UG9pbnRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaXplLT5hZGRfaW50dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHN0cmlkZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3N0cmlkZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zdHJpZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3N0cmlkZS0+YWRkX2ludHZhbHVlKHN0cmlkZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBvaW50ZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wb2ludGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wb2ludGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wb2ludGVyLT5hZGRfaW50dmFsdWUoKGludClwb2ludGVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xWZXJ0ZXhQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwb2ludGVyLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQb2ludFNpemVQb2ludGVyT0VTKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQb2ludFNpemVQb2ludGVyT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3R5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3R5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190eXBlLT5hZGRfaW50dmFsdWUoKGludCl0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc3RyaWRlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3RyaWRlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3RyaWRlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc3RyaWRlLT5hZGRfaW50dmFsdWUoc3RyaWRlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG9pbnRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BvaW50ZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wb2ludGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BvaW50ZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BvaW50ZXItPmFkZF9pbnR2YWx1ZSgoaW50KXBvaW50ZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFBvaW50U2l6ZVBvaW50ZXJPRVModHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBvaW50ZXIsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLQotLy8gRGVmaW5pdGlvbnMgZm9yIEdMMUV4dCBBUElzCi0KLXZvaWQgR0xUcmFjZV9nbEJsZW5kRXF1YXRpb25TZXBhcmF0ZU9FUyhHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZVJHQgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGVSR0IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb2RlUkdCLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGVSR0ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlUkdCLT5hZGRfaW50dmFsdWUoKGludCltb2RlUkdCKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZUFscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9kZUFscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9kZUFscGhhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGVBbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX21vZGVBbHBoYS0+YWRkX2ludHZhbHVlKChpbnQpbW9kZUFscGhhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMobW9kZVJHQiwgbW9kZUFscGhhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJsZW5kRnVuY1NlcGFyYXRlT0VTKEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNyY1JHQgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NyY1JHQiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NyY1JHQi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zcmNSR0ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19zcmNSR0ItPmFkZF9pbnR2YWx1ZSgoaW50KXNyY1JHQik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRzdFJHQgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RzdFJHQiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RzdFJHQi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kc3RSR0ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19kc3RSR0ItPmFkZF9pbnR2YWx1ZSgoaW50KWRzdFJHQik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNyY0FscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3JjQWxwaGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zcmNBbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zcmNBbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3NyY0FscGhhLT5hZGRfaW50dmFsdWUoKGludClzcmNBbHBoYSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRzdEFscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHN0QWxwaGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kc3RBbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kc3RBbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2RzdEFscGhhLT5hZGRfaW50dmFsdWUoKGludClkc3RBbHBoYSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmxlbmRGdW5jU2VwYXJhdGVPRVMoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCbGVuZEVxdWF0aW9uT0VTKEdMZW51bSBtb2RlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCbGVuZEVxdWF0aW9uT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb2RlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlLT5hZGRfaW50dmFsdWUoKGludCltb2RlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCbGVuZEVxdWF0aW9uT0VTKG1vZGUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRHJhd1RleHNPRVMoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERyYXdUZXhzT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3otPmFkZF9pbnR2YWx1ZSh6KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEcmF3VGV4c09FUyh4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERyYXdUZXhpT0VTKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERyYXdUZXhpT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3otPmFkZF9pbnR2YWx1ZSh6KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEcmF3VGV4aU9FUyh4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERyYXdUZXh4T0VTKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEcmF3VGV4eE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196LT5hZGRfaW50dmFsdWUoeik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRHJhd1RleHhPRVMoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEcmF3VGV4c3ZPRVMoY29uc3QgR0xzaG9ydCAqY29vcmRzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEcmF3VGV4c3ZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb29yZHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb29yZHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb29yZHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY29vcmRzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb29yZHMtPmFkZF9pbnR2YWx1ZSgoaW50KWNvb3Jkcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRHJhd1RleHN2T0VTKGNvb3Jkcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBjb29yZHMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERyYXdUZXhpdk9FUyhjb25zdCBHTGludCAqY29vcmRzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEcmF3VGV4aXZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb29yZHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb29yZHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb29yZHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY29vcmRzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb29yZHMtPmFkZF9pbnR2YWx1ZSgoaW50KWNvb3Jkcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRHJhd1RleGl2T0VTKGNvb3Jkcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBjb29yZHMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERyYXdUZXh4dk9FUyhjb25zdCBHTGZpeGVkICpjb29yZHMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERyYXdUZXh4dk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvb3JkcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Nvb3JkcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Nvb3Jkcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb29yZHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2Nvb3Jkcy0+YWRkX2ludHZhbHVlKChpbnQpY29vcmRzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEcmF3VGV4eHZPRVMoY29vcmRzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGNvb3JkcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRHJhd1RleGZPRVMoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERyYXdUZXhmT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ktPmFkZF9mbG9hdHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196LT5hZGRfZmxvYXR2YWx1ZSh6KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfZmxvYXR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfZmxvYXR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERyYXdUZXhmT0VTKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRHJhd1RleGZ2T0VTKGNvbnN0IEdMZmxvYXQgKmNvb3JkcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRHJhd1RleGZ2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY29vcmRzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY29vcmRzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY29vcmRzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Nvb3Jkcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY29vcmRzLT5hZGRfaW50dmFsdWUoKGludCljb29yZHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERyYXdUZXhmdk9FUyhjb29yZHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgY29vcmRzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xBbHBoYUZ1bmN4T0VTKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEFscGhhRnVuY3hPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmdW5jCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnVuYyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Z1bmMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZnVuYy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Z1bmMtPmFkZF9pbnR2YWx1ZSgoaW50KWZ1bmMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWYKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWYgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWYtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVmLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZWYtPmFkZF9pbnR2YWx1ZShyZWYpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEFscGhhRnVuY3hPRVMoZnVuYywgcmVmKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENsZWFyQ29sb3J4T0VTKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGVhckNvbG9yeE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JlZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZWQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3JlZC0+YWRkX2ludHZhbHVlKHJlZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGdyZWVuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZ3JlZW4gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ncmVlbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ncmVlbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZ3JlZW4tPmFkZF9pbnR2YWx1ZShncmVlbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ibHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ibHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ibHVlLT5hZGRfaW50dmFsdWUoYmx1ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGFscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYWxwaGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYWxwaGEtPmFkZF9pbnR2YWx1ZShhbHBoYSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ2xlYXJDb2xvcnhPRVMocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ2xlYXJEZXB0aHhPRVMoR0xjbGFtcHggZGVwdGgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENsZWFyRGVwdGh4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGVwdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kZXB0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kZXB0aC0+YWRkX2ludHZhbHVlKGRlcHRoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDbGVhckRlcHRoeE9FUyhkZXB0aCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGlwUGxhbmV4T0VTKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENsaXBQbGFuZXhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbGFuZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BsYW5lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGxhbmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGxhbmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbGFuZS0+YWRkX2ludHZhbHVlKChpbnQpcGxhbmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBlcXVhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VxdWF0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZXF1YXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZXF1YXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2VxdWF0aW9uLT5hZGRfaW50dmFsdWUoKGludCllcXVhdGlvbik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ2xpcFBsYW5leE9FUyhwbGFuZSwgZXF1YXRpb24pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZXF1YXRpb24sCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENvbG9yNHhPRVMoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ29sb3I0eE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JlZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZWQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3JlZC0+YWRkX2ludHZhbHVlKHJlZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGdyZWVuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZ3JlZW4gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ncmVlbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ncmVlbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZ3JlZW4tPmFkZF9pbnR2YWx1ZShncmVlbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ibHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ibHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ibHVlLT5hZGRfaW50dmFsdWUoYmx1ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGFscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYWxwaGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYWxwaGEtPmFkZF9pbnR2YWx1ZShhbHBoYSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ29sb3I0eE9FUyhyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZXB0aFJhbmdleE9FUyhHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVwdGhSYW5nZXhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6TmVhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pOZWFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfek5lYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfek5lYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pOZWFyLT5hZGRfaW50dmFsdWUoek5lYXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6RmFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfekZhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pGYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfekZhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfekZhci0+YWRkX2ludHZhbHVlKHpGYXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlcHRoUmFuZ2V4T0VTKHpOZWFyLCB6RmFyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZvZ3hPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGb2d4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2ludHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGb2d4T0VTKHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGb2d4dk9FUyhHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRm9neHZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRm9neHZPRVMocG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZydXN0dW14T0VTKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZydXN0dW14T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVmdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlZnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZWZ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlZnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlZnQtPmFkZF9pbnR2YWx1ZShsZWZ0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yaWdodC0+YWRkX2ludHZhbHVlKHJpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYm90dG9tCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYm90dG9tID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JvdHRvbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYm90dG9tLT5hZGRfaW50dmFsdWUoYm90dG9tKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdG9wCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdG9wID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdG9wLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RvcC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdG9wLT5hZGRfaW50dmFsdWUodG9wKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgek5lYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196TmVhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196TmVhci0+YWRkX2ludHZhbHVlKHpOZWFyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgekZhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pGYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196RmFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pGYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pGYXItPmFkZF9pbnR2YWx1ZSh6RmFyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGcnVzdHVteE9FUyhsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldENsaXBQbGFuZXhPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0Q2xpcFBsYW5leE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGVxbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VxbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Vxbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19lcW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2Vxbi0+YWRkX2ludHZhbHVlKChpbnQpZXFuKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRDbGlwUGxhbmV4T0VTKHBuYW1lLCBlcW4pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZXFuLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRGaXhlZHZPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldEZpeGVkdk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRGaXhlZHZPRVMocG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldExpZ2h0eHZPRVMoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0TGlnaHR4dk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19saWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19saWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2xpZ2h0LT5hZGRfaW50dmFsdWUoKGludClsaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRMaWdodHh2T0VTKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0TWF0ZXJpYWx4dk9FUyhHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldE1hdGVyaWFseHZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmYWNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmFjZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZhY2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmFjZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ZhY2UtPmFkZF9pbnR2YWx1ZSgoaW50KWZhY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0TWF0ZXJpYWx4dk9FUyhmYWNlLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0VGV4RW52eHZPRVMoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFRleEVudnh2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZW52Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZW52ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZW52LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Vudi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Vudi0+YWRkX2ludHZhbHVlKChpbnQpZW52KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFRleEVudnh2T0VTKGVudiwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFRleFBhcmFtZXRlcnh2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUyh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMaWdodE1vZGVseE9FUyhHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExpZ2h0TW9kZWx4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2ludHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMaWdodE1vZGVseE9FUyhwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlnaHRNb2RlbHh2T0VTKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaWdodE1vZGVseHZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGlnaHRNb2RlbHh2T0VTKHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMaWdodHhPRVMoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExpZ2h0eE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19saWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19saWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2xpZ2h0LT5hZGRfaW50dmFsdWUoKGludClsaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGlnaHR4T0VTKGxpZ2h0LCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlnaHR4dk9FUyhHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaWdodHh2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19saWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbGlnaHQtPmFkZF9pbnR2YWx1ZSgoaW50KWxpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExpZ2h0eHZPRVMobGlnaHQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMaW5lV2lkdGh4T0VTKEdMZml4ZWQgd2lkdGgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExpbmVXaWR0aHhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExpbmVXaWR0aHhPRVMod2lkdGgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTG9hZE1hdHJpeHhPRVMoY29uc3QgR0xmaXhlZCAqbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTG9hZE1hdHJpeHhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX20tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbS0+YWRkX2ludHZhbHVlKChpbnQpbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTG9hZE1hdHJpeHhPRVMobSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBtLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xNYXRlcmlhbHhPRVMoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTWF0ZXJpYWx4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmFjZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWNlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZhY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mYWNlLT5hZGRfaW50dmFsdWUoKGludClmYWNlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2ludHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNYXRlcmlhbHhPRVMoZmFjZSwgcG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE1hdGVyaWFseHZPRVMoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xNYXRlcmlhbHh2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmFjZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWNlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZhY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mYWNlLT5hZGRfaW50dmFsdWUoKGludClmYWNlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE1hdGVyaWFseHZPRVMoZmFjZSwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE11bHRNYXRyaXh4T0VTKGNvbnN0IEdMZml4ZWQgKm0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE11bHRNYXRyaXh4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX20gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX20tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX20tPmFkZF9pbnR2YWx1ZSgoaW50KW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE11bHRNYXRyaXh4T0VTKG0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTXVsdGlUZXhDb29yZDR4T0VTKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTXVsdGlUZXhDb29yZDR4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3MgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3MtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3MtPmFkZF9pbnR2YWx1ZShzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3QgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3QtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3QtPmFkZF9pbnR2YWx1ZSh0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ItPmFkZF9pbnR2YWx1ZShyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3EgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19xLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3EtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3EtPmFkZF9pbnR2YWx1ZShxKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNdWx0aVRleENvb3JkNHhPRVModGFyZ2V0LCBzLCB0LCByLCBxKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE5vcm1hbDN4T0VTKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE5vcm1hbDN4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbngKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ueCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX254LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX254LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ueC0+YWRkX2ludHZhbHVlKG54KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ueSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX255LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX255LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ueS0+YWRkX2ludHZhbHVlKG55KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ueiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX256LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX256LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uei0+YWRkX2ludHZhbHVlKG56KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xOb3JtYWwzeE9FUyhueCwgbnksIG56KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE9ydGhveE9FUyhHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xPcnRob3hPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZWZ0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVmdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlZnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVmdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVmdC0+YWRkX2ludHZhbHVlKGxlZnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3JpZ2h0LT5hZGRfaW50dmFsdWUocmlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBib3R0b20KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ib3R0b20gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ib3R0b20tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ib3R0b20tPmFkZF9pbnR2YWx1ZShib3R0b20pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0b3AKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190b3AgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190b3AtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdG9wLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190b3AtPmFkZF9pbnR2YWx1ZSh0b3ApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6TmVhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pOZWFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfek5lYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfek5lYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pOZWFyLT5hZGRfaW50dmFsdWUoek5lYXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6RmFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfekZhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pGYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfekZhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfekZhci0+YWRkX2ludHZhbHVlKHpGYXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE9ydGhveE9FUyhsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFBvaW50UGFyYW1ldGVyeE9FUyhHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFBvaW50UGFyYW1ldGVyeE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUG9pbnRQYXJhbWV0ZXJ4T0VTKHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQb2ludFBhcmFtZXRlcnh2T0VTKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQb2ludFBhcmFtZXRlcnh2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFBvaW50UGFyYW1ldGVyeHZPRVMocG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFBvaW50U2l6ZXhPRVMoR0xmaXhlZCBzaXplKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQb2ludFNpemV4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NpemUtPmFkZF9pbnR2YWx1ZShzaXplKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQb2ludFNpemV4T0VTKHNpemUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUG9seWdvbk9mZnNldHhPRVMoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFBvbHlnb25PZmZzZXR4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmFjdG9yCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmFjdG9yID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjdG9yLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZhY3Rvci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZmFjdG9yLT5hZGRfaW50dmFsdWUoZmFjdG9yKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdW5pdHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ191bml0cyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3VuaXRzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3VuaXRzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ191bml0cy0+YWRkX2ludHZhbHVlKHVuaXRzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQb2x5Z29uT2Zmc2V0eE9FUyhmYWN0b3IsIHVuaXRzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFJvdGF0ZXhPRVMoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUm90YXRleE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGFuZ2xlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYW5nbGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hbmdsZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hbmdsZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYW5nbGUtPmFkZF9pbnR2YWx1ZShhbmdsZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196LT5hZGRfaW50dmFsdWUoeik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUm90YXRleE9FUyhhbmdsZSwgeCwgeSwgeik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTYW1wbGVDb3ZlcmFnZXhPRVMoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFNhbXBsZUNvdmVyYWdleE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSh2YWx1ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludmVydAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludmVydCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludmVydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnZlcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ19pbnZlcnQtPmFkZF9ib29sdmFsdWUoaW52ZXJ0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTYW1wbGVDb3ZlcmFnZXhPRVModmFsdWUsIGludmVydCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTY2FsZXhPRVMoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU2NhbGV4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3otPmFkZF9pbnR2YWx1ZSh6KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTY2FsZXhPRVMoeCwgeSwgeik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhFbnZ4T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4RW52eE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4RW52eE9FUyh0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhFbnZ4dk9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4RW52eHZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4RW52eHZPRVModGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyeE9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleFBhcmFtZXRlcnhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleFBhcmFtZXRlcnhPRVModGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyeHZPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleFBhcmFtZXRlcnh2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleFBhcmFtZXRlcnh2T0VTKHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRyYW5zbGF0ZXhPRVMoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVHJhbnNsYXRleE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196LT5hZGRfaW50dmFsdWUoeik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVHJhbnNsYXRleE9FUyh4LCB5LCB6KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNSZW5kZXJidWZmZXJPRVMoR0x1aW50IHJlbmRlcmJ1ZmZlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSXNSZW5kZXJidWZmZXJPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZW5kZXJidWZmZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZW5kZXJidWZmZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZW5kZXJidWZmZXItPmFkZF9pbnR2YWx1ZShyZW5kZXJidWZmZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGJvb2xlYW4gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbElzUmVuZGVyYnVmZmVyT0VTKHJlbmRlcmJ1ZmZlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBydC0+YWRkX2Jvb2x2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCaW5kUmVuZGVyYnVmZmVyT0VTKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJpbmRSZW5kZXJidWZmZXJPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZW5kZXJidWZmZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZW5kZXJidWZmZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZW5kZXJidWZmZXItPmFkZF9pbnR2YWx1ZShyZW5kZXJidWZmZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJpbmRSZW5kZXJidWZmZXJPRVModGFyZ2V0LCByZW5kZXJidWZmZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlbmRlcmJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZW5kZXJidWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZW5kZXJidWZmZXJzLT5hZGRfaW50dmFsdWUoKGludClyZW5kZXJidWZmZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTKG4sIHJlbmRlcmJ1ZmZlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcmVuZGVyYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2VuUmVuZGVyYnVmZmVyc09FUyhHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2VuUmVuZGVyYnVmZmVyc09FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlbmRlcmJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZW5kZXJidWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZW5kZXJidWZmZXJzLT5hZGRfaW50dmFsdWUoKGludClyZW5kZXJidWZmZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZW5SZW5kZXJidWZmZXJzT0VTKG4sIHJlbmRlcmJ1ZmZlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcmVuZGVyYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW50ZXJuYWxmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnRlcm5hbGZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWludGVybmFsZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTKHRhcmdldCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbElzRnJhbWVidWZmZXJPRVMoR0x1aW50IGZyYW1lYnVmZmVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xJc0ZyYW1lYnVmZmVyT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZnJhbWVidWZmZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mcmFtZWJ1ZmZlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19mcmFtZWJ1ZmZlci0+YWRkX2ludHZhbHVlKGZyYW1lYnVmZmVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xJc0ZyYW1lYnVmZmVyT0VTKGZyYW1lYnVmZmVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIHJ0LT5hZGRfYm9vbHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJpbmRGcmFtZWJ1ZmZlck9FUyhHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJpbmRGcmFtZWJ1ZmZlck9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZyYW1lYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnJhbWVidWZmZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mcmFtZWJ1ZmZlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mcmFtZWJ1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZnJhbWVidWZmZXItPmFkZF9pbnR2YWx1ZShmcmFtZWJ1ZmZlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmluZEZyYW1lYnVmZmVyT0VTKHRhcmdldCwgZnJhbWVidWZmZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVsZXRlRnJhbWVidWZmZXJzT0VTKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlbGV0ZUZyYW1lYnVmZmVyc09FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZyYW1lYnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZyYW1lYnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mcmFtZWJ1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+YWRkX2ludHZhbHVlKChpbnQpZnJhbWVidWZmZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMobiwgZnJhbWVidWZmZXJzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGZyYW1lYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2VuRnJhbWVidWZmZXJzT0VTKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdlbkZyYW1lYnVmZmVyc09FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZyYW1lYnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZyYW1lYnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mcmFtZWJ1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+YWRkX2ludHZhbHVlKChpbnQpZnJhbWVidWZmZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMobiwgZnJhbWVidWZmZXJzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGZyYW1lYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotR0xlbnVtIEdMVHJhY2VfZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTKEdMZW51bSB0YXJnZXQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGVudW0gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVModGFyZ2V0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIHJ0LT5hZGRfaW50dmFsdWUoKGludClyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhdHRhY2htZW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXR0YWNobWVudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXR0YWNobWVudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPmFkZF9pbnR2YWx1ZSgoaW50KWF0dGFjaG1lbnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZW5kZXJidWZmZXJ0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXJ0YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZW5kZXJidWZmZXJ0YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVydGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVydGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludClyZW5kZXJidWZmZXJ0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZW5kZXJidWZmZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZW5kZXJidWZmZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZW5kZXJidWZmZXItPmFkZF9pbnR2YWx1ZShyZW5kZXJidWZmZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTKHRhcmdldCwgYXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhdHRhY2htZW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXR0YWNobWVudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXR0YWNobWVudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPmFkZF9pbnR2YWx1ZSgoaW50KWF0dGFjaG1lbnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGV4dGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0ZXh0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0dXJlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dHVyZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdGV4dHVyZS0+YWRkX2ludHZhbHVlKHRleHR1cmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVsLT5hZGRfaW50dmFsdWUobGV2ZWwpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGF0dGFjaG1lbnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hdHRhY2htZW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYXR0YWNobWVudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hdHRhY2htZW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfYXR0YWNobWVudC0+YWRkX2ludHZhbHVlKChpbnQpYXR0YWNobWVudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyh0YXJnZXQsIGF0dGFjaG1lbnQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZW5lcmF0ZU1pcG1hcE9FUyhHTGVudW0gdGFyZ2V0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZW5lcmF0ZU1pcG1hcE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2VuZXJhdGVNaXBtYXBPRVModGFyZ2V0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTKEdMdWludCBtYXRyaXhwYWxldHRlaW5kZXgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWF0cml4cGFsZXR0ZWluZGV4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWF0cml4cGFsZXR0ZWluZGV4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWF0cml4cGFsZXR0ZWluZGV4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21hdHJpeHBhbGV0dGVpbmRleC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWF0cml4cGFsZXR0ZWluZGV4LT5hZGRfaW50dmFsdWUobWF0cml4cGFsZXR0ZWluZGV4KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyhtYXRyaXhwYWxldHRlaW5kZXgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTKHZvaWQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTKCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE1hdHJpeEluZGV4UG9pbnRlck9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaXplLT5hZGRfaW50dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHN0cmlkZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3N0cmlkZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zdHJpZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3N0cmlkZS0+YWRkX2ludHZhbHVlKHN0cmlkZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBvaW50ZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wb2ludGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wb2ludGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wb2ludGVyLT5hZGRfaW50dmFsdWUoKGludClwb2ludGVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBvaW50ZXIsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFdlaWdodFBvaW50ZXJPRVMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFdlaWdodFBvaW50ZXJPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKHNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzdHJpZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zdHJpZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zdHJpZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3RyaWRlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zdHJpZGUtPmFkZF9pbnR2YWx1ZShzdHJpZGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwb2ludGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG9pbnRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BvaW50ZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcG9pbnRlci0+YWRkX2ludHZhbHVlKChpbnQpcG9pbnRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsV2VpZ2h0UG9pbnRlck9FUyhzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcG9pbnRlciwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotR0xiaXRmaWVsZCBHTFRyYWNlX2dsUXVlcnlNYXRyaXh4T0VTKEdMZml4ZWQgbWFudGlzc2FbMTZdLCBHTGludCBleHBvbmVudFsxNl0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFF1ZXJ5TWF0cml4eE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1hbnRpc3NhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWFudGlzc2EgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYW50aXNzYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYW50aXNzYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWFudGlzc2EtPmFkZF9pbnR2YWx1ZSgoaW50KW1hbnRpc3NhKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZXhwb25lbnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19leHBvbmVudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2V4cG9uZW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2V4cG9uZW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19leHBvbmVudC0+YWRkX2ludHZhbHVlKChpbnQpZXhwb25lbnQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGJpdGZpZWxkIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xRdWVyeU1hdHJpeHhPRVMobWFudGlzc2EsIGV4cG9uZW50KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgcnQtPmFkZF9pbnR2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBtYW50aXNzYSwKLSAgICAgICAgKHZvaWQgKikgZXhwb25lbnQsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlcHRoUmFuZ2VmT0VTKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZXB0aFJhbmdlZk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpOZWFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfek5lYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196TmVhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196TmVhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196TmVhci0+YWRkX2Zsb2F0dmFsdWUoek5lYXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6RmFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfekZhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pGYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfekZhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196RmFyLT5hZGRfZmxvYXR2YWx1ZSh6RmFyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZXB0aFJhbmdlZk9FUyh6TmVhciwgekZhcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGcnVzdHVtZk9FUyhHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGcnVzdHVtZk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlZnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZWZ0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVmdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZWZ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2xlZnQtPmFkZF9mbG9hdHZhbHVlKGxlZnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcmlnaHQtPmFkZF9mbG9hdHZhbHVlKHJpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYm90dG9tCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYm90dG9tID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JvdHRvbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19ib3R0b20tPmFkZF9mbG9hdHZhbHVlKGJvdHRvbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRvcAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RvcCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RvcC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190b3AtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfdG9wLT5hZGRfZmxvYXR2YWx1ZSh0b3ApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6TmVhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pOZWFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfek5lYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfek5lYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfek5lYXItPmFkZF9mbG9hdHZhbHVlKHpOZWFyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgekZhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pGYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196RmFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pGYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfekZhci0+YWRkX2Zsb2F0dmFsdWUoekZhcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRnJ1c3R1bWZPRVMobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xPcnRob2ZPRVMoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsT3J0aG9mT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVmdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlZnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZWZ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlZnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfbGVmdC0+YWRkX2Zsb2F0dmFsdWUobGVmdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19yaWdodC0+YWRkX2Zsb2F0dmFsdWUocmlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBib3R0b20KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ib3R0b20gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ib3R0b20tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2JvdHRvbS0+YWRkX2Zsb2F0dmFsdWUoYm90dG9tKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdG9wCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdG9wID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdG9wLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RvcC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ190b3AtPmFkZF9mbG9hdHZhbHVlKHRvcCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpOZWFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfek5lYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196TmVhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196TmVhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196TmVhci0+YWRkX2Zsb2F0dmFsdWUoek5lYXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6RmFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfekZhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pGYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfekZhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196RmFyLT5hZGRfZmxvYXR2YWx1ZSh6RmFyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xPcnRob2ZPRVMobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGlwUGxhbmVmT0VTKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENsaXBQbGFuZWZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbGFuZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BsYW5lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGxhbmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGxhbmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbGFuZS0+YWRkX2ludHZhbHVlKChpbnQpcGxhbmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBlcXVhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VxdWF0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZXF1YXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZXF1YXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2VxdWF0aW9uLT5hZGRfaW50dmFsdWUoKGludCllcXVhdGlvbik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ2xpcFBsYW5lZk9FUyhwbGFuZSwgZXF1YXRpb24pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZXF1YXRpb24sCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldENsaXBQbGFuZWZPRVMoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0Q2xpcFBsYW5lZk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGVxbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VxbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Vxbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19lcW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2Vxbi0+YWRkX2ludHZhbHVlKChpbnQpZXFuKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRDbGlwUGxhbmVmT0VTKHBuYW1lLCBlcW4pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZXFuLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGVhckRlcHRoZk9FUyhHTGNsYW1wZiBkZXB0aCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ2xlYXJEZXB0aGZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkZXB0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RlcHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGVwdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGVwdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfZGVwdGgtPmFkZF9mbG9hdHZhbHVlKGRlcHRoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDbGVhckRlcHRoZk9FUyhkZXB0aCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhHZW5mT0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhHZW5mT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY29vcmQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb29yZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfY29vcmQtPmFkZF9pbnR2YWx1ZSgoaW50KWNvb3JkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfZmxvYXR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4R2VuZk9FUyhjb29yZCwgcG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleEdlbmZ2T0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleEdlbmZ2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY29vcmQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb29yZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfY29vcmQtPmFkZF9pbnR2YWx1ZSgoaW50KWNvb3JkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEdlbmZ2T0VTKGNvb3JkLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4R2VuaU9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleEdlbmlPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb29yZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Nvb3JkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY29vcmQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY29vcmQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19jb29yZC0+YWRkX2ludHZhbHVlKChpbnQpY29vcmQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEdlbmlPRVMoY29vcmQsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhHZW5pdk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4R2VuaXZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb29yZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Nvb3JkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY29vcmQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY29vcmQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19jb29yZC0+YWRkX2ludHZhbHVlKChpbnQpY29vcmQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4R2VuaXZPRVMoY29vcmQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhHZW54T0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhHZW54T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY29vcmQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb29yZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfY29vcmQtPmFkZF9pbnR2YWx1ZSgoaW50KWNvb3JkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2ludHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhHZW54T0VTKGNvb3JkLCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4R2VueHZPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4R2VueHZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb29yZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Nvb3JkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY29vcmQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY29vcmQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19jb29yZC0+YWRkX2ludHZhbHVlKChpbnQpY29vcmQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4R2VueHZPRVMoY29vcmQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRUZXhHZW5mdk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRUZXhHZW5mdk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvb3JkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY29vcmQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb29yZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb29yZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Nvb3JkLT5hZGRfaW50dmFsdWUoKGludCljb29yZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRUZXhHZW5mdk9FUyhjb29yZCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFRleEdlbml2T0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRUZXhHZW5pdk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvb3JkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY29vcmQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb29yZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb29yZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Nvb3JkLT5hZGRfaW50dmFsdWUoKGludCljb29yZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRUZXhHZW5pdk9FUyhjb29yZCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFRleEdlbnh2T0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFRleEdlbnh2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY29vcmQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb29yZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfY29vcmQtPmFkZF9pbnR2YWx1ZSgoaW50KWNvb3JkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFRleEdlbnh2T0VTKGNvb3JkLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ2xpcFBsYW5lZklNRyhHTGVudW0gcCwgY29uc3QgR0xmbG9hdCAqZXFuKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGlwUGxhbmVmSU1HKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3AgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3AtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wLT5hZGRfaW50dmFsdWUoKGludClwKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZXFuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZXFuID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZXFuLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Vxbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZXFuLT5hZGRfaW50dmFsdWUoKGludCllcW4pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENsaXBQbGFuZWZJTUcocCwgZXFuKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGVxbiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ2xpcFBsYW5leElNRyhHTGVudW0gcCwgY29uc3QgR0xmaXhlZCAqZXFuKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGlwUGxhbmV4SU1HKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3AgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3AtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wLT5hZGRfaW50dmFsdWUoKGludClwKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZXFuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZXFuID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZXFuLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Vxbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZXFuLT5hZGRfaW50dmFsdWUoKGludCllcW4pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENsaXBQbGFuZXhJTUcocCwgZXFuKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGVxbiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotCi19OyAvLyBuYW1lc3BhY2UgZ2x0cmFjZQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfYXBpLmggYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWJjYWMwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogVEhJUyBGSUxFIFdBUyBHRU5FUkFURUQgQlkgQSBTQ1JJUFQuIERPIE5PVCBFRElULgotICovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBnbHRyYWNlIHsKLQotLy8gRGVjbGFyYXRpb25zIGZvciBHTDIgQVBJcwotCi12b2lkIEdMVHJhY2VfZ2xBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXh0dXJlKTsKLXZvaWQgR0xUcmFjZV9nbEF0dGFjaFNoYWRlcihHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcik7Ci12b2lkIEdMVHJhY2VfZ2xCaW5kQXR0cmliTG9jYXRpb24oR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyKiBuYW1lKTsKLXZvaWQgR0xUcmFjZV9nbEJpbmRCdWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcik7Ci12b2lkIEdMVHJhY2VfZ2xCaW5kRnJhbWVidWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKTsKLXZvaWQgR0xUcmFjZV9nbEJpbmRSZW5kZXJidWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci12b2lkIEdMVHJhY2VfZ2xCaW5kVGV4dHVyZShHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSk7Ci12b2lkIEdMVHJhY2VfZ2xCbGVuZENvbG9yKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKLXZvaWQgR0xUcmFjZV9nbEJsZW5kRXF1YXRpb24oR0xlbnVtIG1vZGUpOwotdm9pZCBHTFRyYWNlX2dsQmxlbmRFcXVhdGlvblNlcGFyYXRlKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKLXZvaWQgR0xUcmFjZV9nbEJsZW5kRnVuYyhHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpOwotdm9pZCBHTFRyYWNlX2dsQmxlbmRGdW5jU2VwYXJhdGUoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOwotdm9pZCBHTFRyYWNlX2dsQnVmZmVyRGF0YShHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKTsKLXZvaWQgR0xUcmFjZV9nbEJ1ZmZlclN1YkRhdGEoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Ci1HTGVudW0gR0xUcmFjZV9nbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xlbnVtIHRhcmdldCk7Ci12b2lkIEdMVHJhY2VfZ2xDbGVhcihHTGJpdGZpZWxkIG1hc2spOwotdm9pZCBHTFRyYWNlX2dsQ2xlYXJDb2xvcihHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7Ci12b2lkIEdMVHJhY2VfZ2xDbGVhckRlcHRoZihHTGNsYW1wZiBkZXB0aCk7Ci12b2lkIEdMVHJhY2VfZ2xDbGVhclN0ZW5jaWwoR0xpbnQgcyk7Ci12b2lkIEdMVHJhY2VfZ2xDb2xvck1hc2soR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKTsKLXZvaWQgR0xUcmFjZV9nbENvbXBpbGVTaGFkZXIoR0x1aW50IHNoYWRlcik7Ci12b2lkIEdMVHJhY2VfZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKTsKLXZvaWQgR0xUcmFjZV9nbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Ci12b2lkIEdMVHJhY2VfZ2xDb3B5VGV4SW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKLXZvaWQgR0xUcmFjZV9nbENvcHlUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTHVpbnQgR0xUcmFjZV9nbENyZWF0ZVByb2dyYW0odm9pZCk7Ci1HTHVpbnQgR0xUcmFjZV9nbENyZWF0ZVNoYWRlcihHTGVudW0gdHlwZSk7Ci12b2lkIEdMVHJhY2VfZ2xDdWxsRmFjZShHTGVudW0gbW9kZSk7Ci12b2lkIEdMVHJhY2VfZ2xEZWxldGVCdWZmZXJzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBidWZmZXJzKTsKLXZvaWQgR0xUcmFjZV9nbERlbGV0ZUZyYW1lYnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKTsKLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVByb2dyYW0oR0x1aW50IHByb2dyYW0pOwotdm9pZCBHTFRyYWNlX2dsRGVsZXRlUmVuZGVyYnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycyk7Ci12b2lkIEdMVHJhY2VfZ2xEZWxldGVTaGFkZXIoR0x1aW50IHNoYWRlcik7Ci12b2lkIEdMVHJhY2VfZ2xEZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogdGV4dHVyZXMpOwotdm9pZCBHTFRyYWNlX2dsRGVwdGhGdW5jKEdMZW51bSBmdW5jKTsKLXZvaWQgR0xUcmFjZV9nbERlcHRoTWFzayhHTGJvb2xlYW4gZmxhZyk7Ci12b2lkIEdMVHJhY2VfZ2xEZXB0aFJhbmdlZihHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7Ci12b2lkIEdMVHJhY2VfZ2xEZXRhY2hTaGFkZXIoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOwotdm9pZCBHTFRyYWNlX2dsRGlzYWJsZShHTGVudW0gY2FwKTsKLXZvaWQgR0xUcmFjZV9nbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShHTHVpbnQgaW5kZXgpOwotdm9pZCBHTFRyYWNlX2dsRHJhd0FycmF5cyhHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOwotdm9pZCBHTFRyYWNlX2dsRHJhd0VsZW1lbnRzKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBpbmRpY2VzKTsKLXZvaWQgR0xUcmFjZV9nbEVuYWJsZShHTGVudW0gY2FwKTsKLXZvaWQgR0xUcmFjZV9nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEdMdWludCBpbmRleCk7Ci12b2lkIEdMVHJhY2VfZ2xGaW5pc2godm9pZCk7Ci12b2lkIEdMVHJhY2VfZ2xGbHVzaCh2b2lkKTsKLXZvaWQgR0xUcmFjZV9nbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKLXZvaWQgR0xUcmFjZV9nbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwotdm9pZCBHTFRyYWNlX2dsRnJvbnRGYWNlKEdMZW51bSBtb2RlKTsKLXZvaWQgR0xUcmFjZV9nbEdlbkJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQqIGJ1ZmZlcnMpOwotdm9pZCBHTFRyYWNlX2dsR2VuZXJhdGVNaXBtYXAoR0xlbnVtIHRhcmdldCk7Ci12b2lkIEdMVHJhY2VfZ2xHZW5GcmFtZWJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7Ci12b2lkIEdMVHJhY2VfZ2xHZW5SZW5kZXJidWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKTsKLXZvaWQgR0xUcmFjZV9nbEdlblRleHR1cmVzKEdMc2l6ZWkgbiwgR0x1aW50KiB0ZXh0dXJlcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRBY3RpdmVBdHRyaWIoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRBY3RpdmVVbmlmb3JtKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpOwotdm9pZCBHTFRyYWNlX2dsR2V0QXR0YWNoZWRTaGFkZXJzKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIG1heGNvdW50LCBHTHNpemVpKiBjb3VudCwgR0x1aW50KiBzaGFkZXJzKTsKLWludCBHTFRyYWNlX2dsR2V0QXR0cmliTG9jYXRpb24oR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRCb29sZWFudihHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiogcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldEJ1ZmZlclBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci1HTGVudW0gR0xUcmFjZV9nbEdldEVycm9yKHZvaWQpOwotdm9pZCBHTFRyYWNlX2dsR2V0RmxvYXR2KEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0SW50ZWdlcnYoR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFByb2dyYW1pdihHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFByb2dyYW1JbmZvTG9nKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKTsKLXZvaWQgR0xUcmFjZV9nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRTaGFkZXJpdihHTHVpbnQgc2hhZGVyLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0U2hhZGVySW5mb0xvZyhHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKTsKLXZvaWQgR0xUcmFjZV9nbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdChHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHByZWNpc2lvbnR5cGUsIEdMaW50KiByYW5nZSwgR0xpbnQqIHByZWNpc2lvbik7Ci12b2lkIEdMVHJhY2VfZ2xHZXRTaGFkZXJTb3VyY2UoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogc291cmNlKTsKLWNvbnN0IEdMdWJ5dGUqIEdMVHJhY2VfZ2xHZXRTdHJpbmcoR0xlbnVtIG5hbWUpOwotdm9pZCBHTFRyYWNlX2dsR2V0VGV4UGFyYW1ldGVyZnYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0VGV4UGFyYW1ldGVyaXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFVuaWZvcm1mdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQqIHBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRVbmlmb3JtaXYoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCogcGFyYW1zKTsKLWludCBHTFRyYWNlX2dsR2V0VW5pZm9ybUxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpOwotdm9pZCBHTFRyYWNlX2dsR2V0VmVydGV4QXR0cmliZnYoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRWZXJ0ZXhBdHRyaWJpdihHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydihHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiogcG9pbnRlcik7Ci12b2lkIEdMVHJhY2VfZ2xIaW50KEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKTsKLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNCdWZmZXIoR0x1aW50IGJ1ZmZlcik7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbElzRW5hYmxlZChHTGVudW0gY2FwKTsKLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNGcmFtZWJ1ZmZlcihHTHVpbnQgZnJhbWVidWZmZXIpOwotR0xib29sZWFuIEdMVHJhY2VfZ2xJc1Byb2dyYW0oR0x1aW50IHByb2dyYW0pOwotR0xib29sZWFuIEdMVHJhY2VfZ2xJc1JlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKTsKLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNTaGFkZXIoR0x1aW50IHNoYWRlcik7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbElzVGV4dHVyZShHTHVpbnQgdGV4dHVyZSk7Ci12b2lkIEdMVHJhY2VfZ2xMaW5lV2lkdGgoR0xmbG9hdCB3aWR0aCk7Ci12b2lkIEdMVHJhY2VfZ2xMaW5rUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSk7Ci12b2lkIEdMVHJhY2VfZ2xQaXhlbFN0b3JlaShHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFBvbHlnb25PZmZzZXQoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpOwotdm9pZCBHTFRyYWNlX2dsUmVhZFBpeGVscyhHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCogcGl4ZWxzKTsKLXZvaWQgR0xUcmFjZV9nbFJlbGVhc2VTaGFkZXJDb21waWxlcih2b2lkKTsKLXZvaWQgR0xUcmFjZV9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2UoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci12b2lkIEdMVHJhY2VfZ2xTYW1wbGVDb3ZlcmFnZShHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Ci12b2lkIEdMVHJhY2VfZ2xTY2lzc29yKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXZvaWQgR0xUcmFjZV9nbFNoYWRlckJpbmFyeShHTHNpemVpIG4sIGNvbnN0IEdMdWludCogc2hhZGVycywgR0xlbnVtIGJpbmFyeWZvcm1hdCwgY29uc3QgR0x2b2lkKiBiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKTsKLXZvaWQgR0xUcmFjZV9nbFNoYWRlclNvdXJjZShHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqKiBzdHJpbmcsIGNvbnN0IEdMaW50KiBsZW5ndGgpOwotdm9pZCBHTFRyYWNlX2dsU3RlbmNpbEZ1bmMoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spOwotdm9pZCBHTFRyYWNlX2dsU3RlbmNpbEZ1bmNTZXBhcmF0ZShHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spOwotdm9pZCBHTFRyYWNlX2dsU3RlbmNpbE1hc2soR0x1aW50IG1hc2spOwotdm9pZCBHTFRyYWNlX2dsU3RlbmNpbE1hc2tTZXBhcmF0ZShHTGVudW0gZmFjZSwgR0x1aW50IG1hc2spOwotdm9pZCBHTFRyYWNlX2dsU3RlbmNpbE9wKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyk7Ci12b2lkIEdMVHJhY2VfZ2xTdGVuY2lsT3BTZXBhcmF0ZShHTGVudW0gZmFjZSwgR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKLXZvaWQgR0xUcmFjZV9nbFRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpOwotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyZihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyZnYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0KiBwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyaShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFRleFBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQqIHBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0xZihHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0xZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpOwotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTFpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0xaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0yZihHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTJmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdik7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtMmkoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpOwotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTJpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpOwotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTNmKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0zZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpOwotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTNpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0zaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm00ZihHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm00ZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpOwotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTRpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm00aXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm1NYXRyaXgyZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm1NYXRyaXgzZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm1NYXRyaXg0ZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFVzZVByb2dyYW0oR0x1aW50IHByb2dyYW0pOwotdm9pZCBHTFRyYWNlX2dsVmFsaWRhdGVQcm9ncmFtKEdMdWludCBwcm9ncmFtKTsKLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjFmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgpOwotdm9pZCBHTFRyYWNlX2dsVmVydGV4QXR0cmliMWZ2KEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpOwotdm9pZCBHTFRyYWNlX2dsVmVydGV4QXR0cmliMmYoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjJmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjNmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjNmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjRmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwotdm9pZCBHTFRyYWNlX2dsVmVydGV4QXR0cmliNGZ2KEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpOwotdm9pZCBHTFRyYWNlX2dsVmVydGV4QXR0cmliUG9pbnRlcihHTHVpbnQgaW5keCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwdHIpOwotdm9pZCBHTFRyYWNlX2dsVmlld3BvcnQoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotCi0vLyBEZWNsYXJhdGlvbnMgZm9yIEdMMkV4dCBBUElzCi0KLXZvaWQgR0xUcmFjZV9nbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOwotdm9pZCBHTFRyYWNlX2dsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOwotdm9pZCBHTFRyYWNlX2dsR2V0UHJvZ3JhbUJpbmFyeU9FUyhHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCBHTHZvaWQgKmJpbmFyeSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtQmluYXJ5T0VTKEdMdWludCBwcm9ncmFtLCBHTGVudW0gYmluYXJ5Rm9ybWF0LCBjb25zdCBHTHZvaWQgKmJpbmFyeSwgR0xpbnQgbGVuZ3RoKTsKLXZvaWQqIEdMVHJhY2VfZ2xNYXBCdWZmZXJPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2Vzcyk7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbFVubWFwQnVmZmVyT0VTKEdMZW51bSB0YXJnZXQpOwotdm9pZCBHTFRyYWNlX2dsR2V0QnVmZmVyUG9pbnRlcnZPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqKiBwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsVGV4SW1hZ2UzRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpOwotdm9pZCBHTFRyYWNlX2dsVGV4U3ViSW1hZ2UzRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyk7Ci12b2lkIEdMVHJhY2VfZ2xDb3B5VGV4U3ViSW1hZ2UzRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdm9pZCBHTFRyYWNlX2dsQ29tcHJlc3NlZFRleEltYWdlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Ci12b2lkIEdMVHJhY2VfZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpOwotdm9pZCBHTFRyYWNlX2dsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCk7Ci12b2lkIEdMVHJhY2VfZ2xCaW5kVmVydGV4QXJyYXlPRVMoR0x1aW50IGFycmF5KTsKLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVZlcnRleEFycmF5c09FUyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKTsKLXZvaWQgR0xUcmFjZV9nbEdlblZlcnRleEFycmF5c09FUyhHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKTsKLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNWZXJ0ZXhBcnJheU9FUyhHTHVpbnQgYXJyYXkpOwotdm9pZCBHTFRyYWNlX2dsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQoR0xpbnQgKm51bUdyb3VwcywgR0xzaXplaSBncm91cHNTaXplLCBHTHVpbnQgKmdyb3Vwcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1EKEdMdWludCBncm91cCwgR0xpbnQgKm51bUNvdW50ZXJzLCBHTGludCAqbWF4QWN0aXZlQ291bnRlcnMsIEdMc2l6ZWkgY291bnRlclNpemUsIEdMdWludCAqY291bnRlcnMpOwotdm9pZCBHTFRyYWNlX2dsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRChHTHVpbnQgZ3JvdXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmdyb3VwU3RyaW5nKTsKLXZvaWQgR0xUcmFjZV9nbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpjb3VudGVyU3RyaW5nKTsKLXZvaWQgR0xUcmFjZV9nbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKmRhdGEpOwotdm9pZCBHTFRyYWNlX2dsR2VuUGVyZk1vbml0b3JzQU1EKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyk7Ci12b2lkIEdMVHJhY2VfZ2xEZWxldGVQZXJmTW9uaXRvcnNBTUQoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKTsKLXZvaWQgR0xUcmFjZV9nbFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQoR0x1aW50IG1vbml0b3IsIEdMYm9vbGVhbiBlbmFibGUsIEdMdWludCBncm91cCwgR0xpbnQgbnVtQ291bnRlcnMsIEdMdWludCAqY291bnRlcnNMaXN0KTsKLXZvaWQgR0xUcmFjZV9nbEJlZ2luUGVyZk1vbml0b3JBTUQoR0x1aW50IG1vbml0b3IpOwotdm9pZCBHTFRyYWNlX2dsRW5kUGVyZk1vbml0b3JBTUQoR0x1aW50IG1vbml0b3IpOwotdm9pZCBHTFRyYWNlX2dsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRChHTHVpbnQgbW9uaXRvciwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGRhdGFTaXplLCBHTHVpbnQgKmRhdGEsIEdMaW50ICpieXRlc1dyaXR0ZW4pOwotdm9pZCBHTFRyYWNlX2dsQmxpdEZyYW1lYnVmZmVyQU5HTEUoR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLCBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpOwotdm9pZCBHTFRyYWNlX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQU5HTEUoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXZvaWQgR0xUcmFjZV9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci12b2lkIEdMVHJhY2VfZ2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFKHZvaWQpOwotdm9pZCBHTFRyYWNlX2dsTGFiZWxPYmplY3RFWFQoR0xlbnVtIHR5cGUsIEdMdWludCBvYmplY3QsIEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKmxhYmVsKTsKLXZvaWQgR0xUcmFjZV9nbEdldE9iamVjdExhYmVsRVhUKEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpsYWJlbCk7Ci12b2lkIEdMVHJhY2VfZ2xJbnNlcnRFdmVudE1hcmtlckVYVChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpOwotdm9pZCBHTFRyYWNlX2dsUHVzaEdyb3VwTWFya2VyRVhUKEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKm1hcmtlcik7Ci12b2lkIEdMVHJhY2VfZ2xQb3BHcm91cE1hcmtlckVYVCh2b2lkKTsKLXZvaWQgR0xUcmFjZV9nbERpc2NhcmRGcmFtZWJ1ZmZlckVYVChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKTsKLXZvaWQgR0xUcmFjZV9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdm9pZCBHTFRyYWNlX2dsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpOwotdm9pZCBHTFRyYWNlX2dsTXVsdGlEcmF3QXJyYXlzRVhUKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Ci12b2lkIEdMVHJhY2VfZ2xNdWx0aURyYXdFbGVtZW50c0VYVChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7Ci12b2lkIEdMVHJhY2VfZ2xHZW5RdWVyaWVzRVhUKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOwotdm9pZCBHTFRyYWNlX2dsRGVsZXRlUXVlcmllc0VYVChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNRdWVyeUVYVChHTHVpbnQgaWQpOwotdm9pZCBHTFRyYWNlX2dsQmVnaW5RdWVyeUVYVChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOwotdm9pZCBHTFRyYWNlX2dsRW5kUXVlcnlFWFQoR0xlbnVtIHRhcmdldCk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRRdWVyeWl2RVhUKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRRdWVyeU9iamVjdHVpdkVYVChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOwotR0xlbnVtIEdMVHJhY2VfZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhUKHZvaWQpOwotdm9pZCBHTFRyYWNlX2dsUmVhZG5QaXhlbHNFWFQoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIHZvaWQgKmRhdGEpOwotdm9pZCBHTFRyYWNlX2dsR2V0blVuaWZvcm1mdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgZmxvYXQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRuVW5pZm9ybWl2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbFVzZVByb2dyYW1TdGFnZXNFWFQoR0x1aW50IHBpcGVsaW5lLCBHTGJpdGZpZWxkIHN0YWdlcywgR0x1aW50IHByb2dyYW0pOwotdm9pZCBHTFRyYWNlX2dsQWN0aXZlU2hhZGVyUHJvZ3JhbUVYVChHTHVpbnQgcGlwZWxpbmUsIEdMdWludCBwcm9ncmFtKTsKLUdMdWludCBHTFRyYWNlX2dsQ3JlYXRlU2hhZGVyUHJvZ3JhbXZFWFQoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciAqKnN0cmluZ3MpOwotdm9pZCBHTFRyYWNlX2dsQmluZFByb2dyYW1QaXBlbGluZUVYVChHTHVpbnQgcGlwZWxpbmUpOwotdm9pZCBHTFRyYWNlX2dsRGVsZXRlUHJvZ3JhbVBpcGVsaW5lc0VYVChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcGlwZWxpbmVzKTsKLXZvaWQgR0xUcmFjZV9nbEdlblByb2dyYW1QaXBlbGluZXNFWFQoR0xzaXplaSBuLCBHTHVpbnQgKnBpcGVsaW5lcyk7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbElzUHJvZ3JhbVBpcGVsaW5lRVhUKEdMdWludCBwaXBlbGluZSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCB2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRQcm9ncmFtUGlwZWxpbmVpdkVYVChHTHVpbnQgcGlwZWxpbmUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTFpRVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTJpRVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTNpRVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTRpRVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTFmRVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KTsKLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMmZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTNmRVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTRmRVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMWl2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMml2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtM2l2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtNGl2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMWZ2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0yZnZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTNmdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtNGZ2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdm9pZCBHTFRyYWNlX2dsVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmVFWFQoR0x1aW50IHBpcGVsaW5lKTsKLXZvaWQgR0xUcmFjZV9nbEdldFByb2dyYW1QaXBlbGluZUluZm9Mb2dFWFQoR0x1aW50IHBpcGVsaW5lLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKTsKLXZvaWQgR0xUcmFjZV9nbFRleFN0b3JhZ2UxREVYVChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKLXZvaWQgR0xUcmFjZV9nbFRleFN0b3JhZ2UyREVYVChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhTdG9yYWdlM0RFWFQoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOwotdm9pZCBHTFRyYWNlX2dsVGV4dHVyZVN0b3JhZ2UxREVYVChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7Ci12b2lkIEdMVHJhY2VfZ2xUZXh0dXJlU3RvcmFnZTJERVhUKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci12b2lkIEdMVHJhY2VfZ2xUZXh0dXJlU3RvcmFnZTNERVhUKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7Ci12b2lkIEdMVHJhY2VfZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXZvaWQgR0xUcmFjZV9nbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKTsKLXZvaWQgR0xUcmFjZV9nbENvdmVyYWdlTWFza05WKEdMYm9vbGVhbiBtYXNrKTsKLXZvaWQgR0xUcmFjZV9nbENvdmVyYWdlT3BlcmF0aW9uTlYoR0xlbnVtIG9wZXJhdGlvbik7Ci12b2lkIEdMVHJhY2VfZ2xEcmF3QnVmZmVyc05WKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKLXZvaWQgR0xUcmFjZV9nbERlbGV0ZUZlbmNlc05WKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpOwotdm9pZCBHTFRyYWNlX2dsR2VuRmVuY2VzTlYoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcyk7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbElzRmVuY2VOVihHTHVpbnQgZmVuY2UpOwotR0xib29sZWFuIEdMVHJhY2VfZ2xUZXN0RmVuY2VOVihHTHVpbnQgZmVuY2UpOwotdm9pZCBHTFRyYWNlX2dsR2V0RmVuY2Vpdk5WKEdMdWludCBmZW5jZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEZpbmlzaEZlbmNlTlYoR0x1aW50IGZlbmNlKTsKLXZvaWQgR0xUcmFjZV9nbFNldEZlbmNlTlYoR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKTsKLXZvaWQgR0xUcmFjZV9nbFJlYWRCdWZmZXJOVihHTGVudW0gbW9kZSk7Ci12b2lkIEdMVHJhY2VfZ2xBbHBoYUZ1bmNRQ09NKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOwotdm9pZCBHTFRyYWNlX2dsR2V0RHJpdmVyQ29udHJvbHNRQ09NKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTShHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZyk7Ci12b2lkIEdMVHJhY2VfZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTShHTHVpbnQgZHJpdmVyQ29udHJvbCk7Ci12b2lkIEdMVHJhY2VfZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00oR0x1aW50IGRyaXZlckNvbnRyb2wpOwotdm9pZCBHTFRyYWNlX2dsRXh0R2V0VGV4dHVyZXNRQ09NKEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpOwotdm9pZCBHTFRyYWNlX2dsRXh0R2V0QnVmZmVyc1FDT00oR0x1aW50ICpidWZmZXJzLCBHTGludCBtYXhCdWZmZXJzLCBHTGludCAqbnVtQnVmZmVycyk7Ci12b2lkIEdMVHJhY2VfZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTShHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKTsKLXZvaWQgR0xUcmFjZV9nbEV4dEdldEZyYW1lYnVmZmVyc1FDT00oR0x1aW50ICpmcmFtZWJ1ZmZlcnMsIEdMaW50IG1heEZyYW1lYnVmZmVycywgR0xpbnQgKm51bUZyYW1lYnVmZmVycyk7Ci12b2lkIEdMVHJhY2VfZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIGZhY2UsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGV4ZWxzKTsKLXZvaWQgR0xUcmFjZV9nbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTShHTGVudW0gdGFyZ2V0LCBHTHZvaWQgKipwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsRXh0R2V0U2hhZGVyc1FDT00oR0x1aW50ICpzaGFkZXJzLCBHTGludCBtYXhTaGFkZXJzLCBHTGludCAqbnVtU2hhZGVycyk7Ci12b2lkIEdMVHJhY2VfZ2xFeHRHZXRQcm9ncmFtc1FDT00oR0x1aW50ICpwcm9ncmFtcywgR0xpbnQgbWF4UHJvZ3JhbXMsIEdMaW50ICpudW1Qcm9ncmFtcyk7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00oR0x1aW50IHByb2dyYW0pOwotdm9pZCBHTFRyYWNlX2dsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00oR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBHTGNoYXIgKnNvdXJjZSwgR0xpbnQgKmxlbmd0aCk7Ci12b2lkIEdMVHJhY2VfZ2xTdGFydFRpbGluZ1FDT00oR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQsIEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKTsKLXZvaWQgR0xUcmFjZV9nbEVuZFRpbGluZ1FDT00oR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spOwotCi0vLyBEZWNsYXJhdGlvbnMgZm9yIEdMMSBBUElzCi0KLXZvaWQgR0xUcmFjZV9nbEFscGhhRnVuYyhHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKTsKLXZvaWQgR0xUcmFjZV9nbENsaXBQbGFuZWYoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbik7Ci12b2lkIEdMVHJhY2VfZ2xDb2xvcjRmKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpOwotdm9pZCBHTFRyYWNlX2dsRm9nZihHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsRm9nZnYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsRnJ1c3R1bWYoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Ci12b2lkIEdMVHJhY2VfZ2xHZXRDbGlwUGxhbmVmKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pOwotdm9pZCBHTFRyYWNlX2dsR2V0TGlnaHRmdihHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldE1hdGVyaWFsZnYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFRleEVudmZ2KEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbExpZ2h0TW9kZWxmKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xMaWdodE1vZGVsZnYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsTGlnaHRmKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbExpZ2h0ZnYoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xMb2FkTWF0cml4Zihjb25zdCBHTGZsb2F0ICptKTsKLXZvaWQgR0xUcmFjZV9nbE1hdGVyaWFsZihHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbE1hdGVyaWFsZnYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbE11bHRNYXRyaXhmKGNvbnN0IEdMZmxvYXQgKm0pOwotdm9pZCBHTFRyYWNlX2dsTXVsdGlUZXhDb29yZDRmKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7Ci12b2lkIEdMVHJhY2VfZ2xOb3JtYWwzZihHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KTsKLXZvaWQgR0xUcmFjZV9nbE9ydGhvZihHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKLXZvaWQgR0xUcmFjZV9nbFBvaW50UGFyYW1ldGVyZihHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsUG9pbnRQYXJhbWV0ZXJmdihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xQb2ludFNpemUoR0xmbG9hdCBzaXplKTsKLXZvaWQgR0xUcmFjZV9nbFJvdGF0ZWYoR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci12b2lkIEdMVHJhY2VfZ2xTY2FsZWYoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci12b2lkIEdMVHJhY2VfZ2xUZXhFbnZmKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhFbnZmdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xUcmFuc2xhdGVmKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotdm9pZCBHTFRyYWNlX2dsQWxwaGFGdW5jeChHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKTsKLXZvaWQgR0xUcmFjZV9nbENsZWFyQ29sb3J4KEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKTsKLXZvaWQgR0xUcmFjZV9nbENsZWFyRGVwdGh4KEdMY2xhbXB4IGRlcHRoKTsKLXZvaWQgR0xUcmFjZV9nbENsaWVudEFjdGl2ZVRleHR1cmUoR0xlbnVtIHRleHR1cmUpOwotdm9pZCBHTFRyYWNlX2dsQ2xpcFBsYW5leChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKTsKLXZvaWQgR0xUcmFjZV9nbENvbG9yNHViKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpOwotdm9pZCBHTFRyYWNlX2dsQ29sb3I0eChHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKTsKLXZvaWQgR0xUcmFjZV9nbENvbG9yUG9pbnRlcihHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci12b2lkIEdMVHJhY2VfZ2xEZXB0aFJhbmdleChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7Ci12b2lkIEdMVHJhY2VfZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xlbnVtIGFycmF5KTsKLXZvaWQgR0xUcmFjZV9nbEVuYWJsZUNsaWVudFN0YXRlKEdMZW51bSBhcnJheSk7Ci12b2lkIEdMVHJhY2VfZ2xGb2d4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xGb2d4dihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xGcnVzdHVteChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKLXZvaWQgR0xUcmFjZV9nbEdldENsaXBQbGFuZXgoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRGaXhlZHYoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0TGlnaHR4dihHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldE1hdGVyaWFseHYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFBvaW50ZXJ2KEdMZW51bSBwbmFtZSwgR0x2b2lkICoqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFRleEVudml2KEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRUZXhFbnZ4dihHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRUZXhQYXJhbWV0ZXJ4dihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xMaWdodE1vZGVseChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsTGlnaHRNb2RlbHh2KEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbExpZ2h0eChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xMaWdodHh2KEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsTGluZVdpZHRoeChHTGZpeGVkIHdpZHRoKTsKLXZvaWQgR0xUcmFjZV9nbExvYWRJZGVudGl0eSh2b2lkKTsKLXZvaWQgR0xUcmFjZV9nbExvYWRNYXRyaXh4KGNvbnN0IEdMZml4ZWQgKm0pOwotdm9pZCBHTFRyYWNlX2dsTG9naWNPcChHTGVudW0gb3Bjb2RlKTsKLXZvaWQgR0xUcmFjZV9nbE1hdGVyaWFseChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbE1hdGVyaWFseHYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbE1hdHJpeE1vZGUoR0xlbnVtIG1vZGUpOwotdm9pZCBHTFRyYWNlX2dsTXVsdE1hdHJpeHgoY29uc3QgR0xmaXhlZCAqbSk7Ci12b2lkIEdMVHJhY2VfZ2xNdWx0aVRleENvb3JkNHgoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKTsKLXZvaWQgR0xUcmFjZV9nbE5vcm1hbDN4KEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopOwotdm9pZCBHTFRyYWNlX2dsTm9ybWFsUG9pbnRlcihHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci12b2lkIEdMVHJhY2VfZ2xPcnRob3goR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Ci12b2lkIEdMVHJhY2VfZ2xQb2ludFBhcmFtZXRlcngoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFBvaW50UGFyYW1ldGVyeHYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsUG9pbnRTaXpleChHTGZpeGVkIHNpemUpOwotdm9pZCBHTFRyYWNlX2dsUG9seWdvbk9mZnNldHgoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpOwotdm9pZCBHTFRyYWNlX2dsUG9wTWF0cml4KHZvaWQpOwotdm9pZCBHTFRyYWNlX2dsUHVzaE1hdHJpeCh2b2lkKTsKLXZvaWQgR0xUcmFjZV9nbFJvdGF0ZXgoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Ci12b2lkIEdMVHJhY2VfZ2xTYW1wbGVDb3ZlcmFnZXgoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwotdm9pZCBHTFRyYWNlX2dsU2NhbGV4KEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotdm9pZCBHTFRyYWNlX2dsU2hhZGVNb2RlbChHTGVudW0gbW9kZSk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhDb29yZFBvaW50ZXIoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdm9pZCBHTFRyYWNlX2dsVGV4RW52aShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFRleEVudngoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFRleEVudml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhFbnZ4dihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhQYXJhbWV0ZXJ4KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhQYXJhbWV0ZXJ4dihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xUcmFuc2xhdGV4KEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotdm9pZCBHTFRyYWNlX2dsVmVydGV4UG9pbnRlcihHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci12b2lkIEdMVHJhY2VfZ2xQb2ludFNpemVQb2ludGVyT0VTKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLQotLy8gRGVjbGFyYXRpb25zIGZvciBHTDFFeHQgQVBJcwotCi12b2lkIEdMVHJhY2VfZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwotdm9pZCBHTFRyYWNlX2dsQmxlbmRGdW5jU2VwYXJhdGVPRVMoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOwotdm9pZCBHTFRyYWNlX2dsQmxlbmRFcXVhdGlvbk9FUyhHTGVudW0gbW9kZSk7Ci12b2lkIEdMVHJhY2VfZ2xEcmF3VGV4c09FUyhHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCk7Ci12b2lkIEdMVHJhY2VfZ2xEcmF3VGV4aU9FUyhHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0KTsKLXZvaWQgR0xUcmFjZV9nbERyYXdUZXh4T0VTKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KTsKLXZvaWQgR0xUcmFjZV9nbERyYXdUZXhzdk9FUyhjb25zdCBHTHNob3J0ICpjb29yZHMpOwotdm9pZCBHTFRyYWNlX2dsRHJhd1RleGl2T0VTKGNvbnN0IEdMaW50ICpjb29yZHMpOwotdm9pZCBHTFRyYWNlX2dsRHJhd1RleHh2T0VTKGNvbnN0IEdMZml4ZWQgKmNvb3Jkcyk7Ci12b2lkIEdMVHJhY2VfZ2xEcmF3VGV4Zk9FUyhHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCk7Ci12b2lkIEdMVHJhY2VfZ2xEcmF3VGV4ZnZPRVMoY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKLXZvaWQgR0xUcmFjZV9nbEFscGhhRnVuY3hPRVMoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7Ci12b2lkIEdMVHJhY2VfZ2xDbGVhckNvbG9yeE9FUyhHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSk7Ci12b2lkIEdMVHJhY2VfZ2xDbGVhckRlcHRoeE9FUyhHTGNsYW1weCBkZXB0aCk7Ci12b2lkIEdMVHJhY2VfZ2xDbGlwUGxhbmV4T0VTKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pOwotdm9pZCBHTFRyYWNlX2dsQ29sb3I0eE9FUyhHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKTsKLXZvaWQgR0xUcmFjZV9nbERlcHRoUmFuZ2V4T0VTKEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKTsKLXZvaWQgR0xUcmFjZV9nbEZvZ3hPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbEZvZ3h2T0VTKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEZydXN0dW14T0VTKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOwotdm9pZCBHTFRyYWNlX2dsR2V0Q2xpcFBsYW5leE9FUyhHTGVudW0gcG5hbWUsIEdMZml4ZWQgZXFuWzRdKTsKLXZvaWQgR0xUcmFjZV9nbEdldEZpeGVkdk9FUyhHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRMaWdodHh2T0VTKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0TWF0ZXJpYWx4dk9FUyhHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0VGV4RW52eHZPRVMoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0VGV4UGFyYW1ldGVyeHZPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsTGlnaHRNb2RlbHhPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbExpZ2h0TW9kZWx4dk9FUyhHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xMaWdodHhPRVMoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsTGlnaHR4dk9FUyhHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbExpbmVXaWR0aHhPRVMoR0xmaXhlZCB3aWR0aCk7Ci12b2lkIEdMVHJhY2VfZ2xMb2FkTWF0cml4eE9FUyhjb25zdCBHTGZpeGVkICptKTsKLXZvaWQgR0xUcmFjZV9nbE1hdGVyaWFseE9FUyhHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbE1hdGVyaWFseHZPRVMoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbE11bHRNYXRyaXh4T0VTKGNvbnN0IEdMZml4ZWQgKm0pOwotdm9pZCBHTFRyYWNlX2dsTXVsdGlUZXhDb29yZDR4T0VTKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSk7Ci12b2lkIEdMVHJhY2VfZ2xOb3JtYWwzeE9FUyhHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KTsKLXZvaWQgR0xUcmFjZV9nbE9ydGhveE9FUyhHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKLXZvaWQgR0xUcmFjZV9nbFBvaW50UGFyYW1ldGVyeE9FUyhHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsUG9pbnRQYXJhbWV0ZXJ4dk9FUyhHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xQb2ludFNpemV4T0VTKEdMZml4ZWQgc2l6ZSk7Ci12b2lkIEdMVHJhY2VfZ2xQb2x5Z29uT2Zmc2V0eE9FUyhHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyk7Ci12b2lkIEdMVHJhY2VfZ2xSb3RhdGV4T0VTKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotdm9pZCBHTFRyYWNlX2dsU2FtcGxlQ292ZXJhZ2V4T0VTKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKLXZvaWQgR0xUcmFjZV9nbFNjYWxleE9FUyhHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLXZvaWQgR0xUcmFjZV9nbFRleEVudnhPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFRleEVudnh2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbFRleFBhcmFtZXRlcnhPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFRleFBhcmFtZXRlcnh2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbFRyYW5zbGF0ZXhPRVMoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbElzUmVuZGVyYnVmZmVyT0VTKEdMdWludCByZW5kZXJidWZmZXIpOwotdm9pZCBHTFRyYWNlX2dsQmluZFJlbmRlcmJ1ZmZlck9FUyhHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwotdm9pZCBHTFRyYWNlX2dsR2VuUmVuZGVyYnVmZmVyc09FUyhHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycyk7Ci12b2lkIEdMVHJhY2VfZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdm9pZCBHTFRyYWNlX2dsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNGcmFtZWJ1ZmZlck9FUyhHTHVpbnQgZnJhbWVidWZmZXIpOwotdm9pZCBHTFRyYWNlX2dsQmluZEZyYW1lYnVmZmVyT0VTKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7Ci12b2lkIEdMVHJhY2VfZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7Ci12b2lkIEdMVHJhY2VfZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7Ci1HTGVudW0gR0xUcmFjZV9nbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMoR0xlbnVtIHRhcmdldCk7Ci12b2lkIEdMVHJhY2VfZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci12b2lkIEdMVHJhY2VfZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKLXZvaWQgR0xUcmFjZV9nbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2VuZXJhdGVNaXBtYXBPRVMoR0xlbnVtIHRhcmdldCk7Ci12b2lkIEdMVHJhY2VfZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyhHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KTsKLXZvaWQgR0xUcmFjZV9nbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyh2b2lkKTsKLXZvaWQgR0xUcmFjZV9nbE1hdHJpeEluZGV4UG9pbnRlck9FUyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci12b2lkIEdMVHJhY2VfZ2xXZWlnaHRQb2ludGVyT0VTKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLUdMYml0ZmllbGQgR0xUcmFjZV9nbFF1ZXJ5TWF0cml4eE9FUyhHTGZpeGVkIG1hbnRpc3NhWzE2XSwgR0xpbnQgZXhwb25lbnRbMTZdKTsKLXZvaWQgR0xUcmFjZV9nbERlcHRoUmFuZ2VmT0VTKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKLXZvaWQgR0xUcmFjZV9nbEZydXN0dW1mT0VTKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOwotdm9pZCBHTFRyYWNlX2dsT3J0aG9mT0VTKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOwotdm9pZCBHTFRyYWNlX2dsQ2xpcFBsYW5lZk9FUyhHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKTsKLXZvaWQgR0xUcmFjZV9nbEdldENsaXBQbGFuZWZPRVMoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSk7Ci12b2lkIEdMVHJhY2VfZ2xDbGVhckRlcHRoZk9FUyhHTGNsYW1wZiBkZXB0aCk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhHZW5mT0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFRleEdlbmZ2T0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsVGV4R2VuaU9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsVGV4R2VuaXZPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsVGV4R2VueE9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhHZW54dk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFRleEdlbmZ2T0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0VGV4R2VuaXZPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0VGV4R2VueHZPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xDbGlwUGxhbmVmSU1HKEdMZW51bSBwLCBjb25zdCBHTGZsb2F0ICplcW4pOwotdm9pZCBHTFRyYWNlX2dsQ2xpcFBsYW5leElNRyhHTGVudW0gcCwgY29uc3QgR0xmaXhlZCAqZXFuKTsKLQotfTsgLy8gbmFtZXNwYWNlIGdsdHJhY2UKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2NvbnRleHQuY3BwIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9jb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkYmI0My4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2NvbnRleHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCi1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICJsaWJsemYvbHpmLmgiCi19Ci0KLSNpbmNsdWRlICJnbHRyYWNlX2NvbnRleHQuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGdsdHJhY2UgewotCi11c2luZyA6OmFuZHJvaWQ6OmdsX2hvb2tzX3Q7Ci0KLXN0YXRpYyBwdGhyZWFkX2tleV90IHNUTFNLZXkgPSAtMTsKLXN0YXRpYyBwdGhyZWFkX29uY2VfdCBzUHRocmVhZE9uY2VLZXkgPSBQVEhSRUFEX09OQ0VfSU5JVDsKLQotdm9pZCBjcmVhdGVUTFNLZXkoKSB7Ci0gICAgcHRocmVhZF9rZXlfY3JlYXRlKCZzVExTS2V5LCBOVUxMKTsKLX0KLQotR0xUcmFjZUNvbnRleHQgKmdldEdMVHJhY2VDb250ZXh0KCkgewotICAgIHJldHVybiAoR0xUcmFjZUNvbnRleHQqKSBwdGhyZWFkX2dldHNwZWNpZmljKHNUTFNLZXkpOwotfQotCi12b2lkIHNldEdMVHJhY2VDb250ZXh0KEdMVHJhY2VDb250ZXh0ICpjKSB7Ci0gICAgcHRocmVhZF9zZXRzcGVjaWZpYyhzVExTS2V5LCBjKTsKLX0KLQotdm9pZCBzZXR1cFRyYWNlQ29udGV4dFRocmVhZFNwZWNpZmljKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0KSB7Ci0gICAgcHRocmVhZF9vbmNlKCZzUHRocmVhZE9uY2VLZXksIGNyZWF0ZVRMU0tleSk7Ci0gICAgc2V0R0xUcmFjZUNvbnRleHQoY29udGV4dCk7Ci19Ci0KLXZvaWQgcmVsZWFzZUNvbnRleHQoKSB7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmMgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotICAgIGlmIChjICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIGM7Ci0gICAgICAgIHNldEdMVHJhY2VDb250ZXh0KE5VTEwpOwotICAgIH0KLX0KLQotR0xUcmFjZVN0YXRlOjpHTFRyYWNlU3RhdGUoVENQU3RyZWFtICpzdHJlYW0pIHsKLSAgICBtVHJhY2VDb250ZXh0SWRzID0gMDsKLSAgICBtU3RyZWFtID0gc3RyZWFtOwotCi0gICAgbUNvbGxlY3RGYk9uRWdsU3dhcCA9IGZhbHNlOwotICAgIG1Db2xsZWN0RmJPbkdsRHJhdyA9IGZhbHNlOwotICAgIG1Db2xsZWN0VGV4dHVyZURhdGFPbkdsVGV4SW1hZ2UgPSBmYWxzZTsKLSAgICBwdGhyZWFkX3J3bG9ja19pbml0KCZtVHJhY2VPcHRpb25zUndMb2NrLCBOVUxMKTsKLX0KLQotR0xUcmFjZVN0YXRlOjp+R0xUcmFjZVN0YXRlKCkgewotICAgIGlmIChtU3RyZWFtKSB7Ci0gICAgICAgIG1TdHJlYW0tPmNsb3NlU3RyZWFtKCk7Ci0gICAgICAgIG1TdHJlYW0gPSBOVUxMOwotICAgIH0KLX0KLQotVENQU3RyZWFtICpHTFRyYWNlU3RhdGU6OmdldFN0cmVhbSgpIHsKLSAgICByZXR1cm4gbVN0cmVhbTsKLX0KLQotdm9pZCBHTFRyYWNlU3RhdGU6OnNhZmVTZXRWYWx1ZShib29sICpwdHIsIGJvb2wgdmFsdWUsIHB0aHJlYWRfcndsb2NrX3QgKmxvY2spIHsKLSAgICBwdGhyZWFkX3J3bG9ja193cmxvY2sobG9jayk7Ci0gICAgKnB0ciA9IHZhbHVlOwotICAgIHB0aHJlYWRfcndsb2NrX3VubG9jayhsb2NrKTsKLX0KLQotYm9vbCBHTFRyYWNlU3RhdGU6OnNhZmVHZXRWYWx1ZShib29sICpwdHIsIHB0aHJlYWRfcndsb2NrX3QgKmxvY2spIHsKLSAgICBwdGhyZWFkX3J3bG9ja19yZGxvY2sobG9jayk7Ci0gICAgYm9vbCB2YWx1ZSA9ICpwdHI7Ci0gICAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKGxvY2spOwotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotdm9pZCBHTFRyYWNlU3RhdGU6OnNldENvbGxlY3RGYk9uRWdsU3dhcChib29sIGVuKSB7Ci0gICAgc2FmZVNldFZhbHVlKCZtQ29sbGVjdEZiT25FZ2xTd2FwLCBlbiwgJm1UcmFjZU9wdGlvbnNSd0xvY2spOwotfQotCi12b2lkIEdMVHJhY2VTdGF0ZTo6c2V0Q29sbGVjdEZiT25HbERyYXcoYm9vbCBlbikgewotICAgIHNhZmVTZXRWYWx1ZSgmbUNvbGxlY3RGYk9uR2xEcmF3LCBlbiwgJm1UcmFjZU9wdGlvbnNSd0xvY2spOwotfQotCi12b2lkIEdMVHJhY2VTdGF0ZTo6c2V0Q29sbGVjdFRleHR1cmVEYXRhT25HbFRleEltYWdlKGJvb2wgZW4pIHsKLSAgICBzYWZlU2V0VmFsdWUoJm1Db2xsZWN0VGV4dHVyZURhdGFPbkdsVGV4SW1hZ2UsIGVuLCAmbVRyYWNlT3B0aW9uc1J3TG9jayk7Ci19Ci0KLWJvb2wgR0xUcmFjZVN0YXRlOjpzaG91bGRDb2xsZWN0RmJPbkVnbFN3YXAoKSB7Ci0gICAgcmV0dXJuIHNhZmVHZXRWYWx1ZSgmbUNvbGxlY3RGYk9uRWdsU3dhcCwgJm1UcmFjZU9wdGlvbnNSd0xvY2spOwotfQotCi1ib29sIEdMVHJhY2VTdGF0ZTo6c2hvdWxkQ29sbGVjdEZiT25HbERyYXcoKSB7Ci0gICAgcmV0dXJuIHNhZmVHZXRWYWx1ZSgmbUNvbGxlY3RGYk9uR2xEcmF3LCAmbVRyYWNlT3B0aW9uc1J3TG9jayk7Ci19Ci0KLWJvb2wgR0xUcmFjZVN0YXRlOjpzaG91bGRDb2xsZWN0VGV4dHVyZURhdGFPbkdsVGV4SW1hZ2UoKSB7Ci0gICAgcmV0dXJuIHNhZmVHZXRWYWx1ZSgmbUNvbGxlY3RUZXh0dXJlRGF0YU9uR2xUZXhJbWFnZSwgJm1UcmFjZU9wdGlvbnNSd0xvY2spOwotfQotCi1HTFRyYWNlQ29udGV4dCAqR0xUcmFjZVN0YXRlOjpjcmVhdGVUcmFjZUNvbnRleHQoaW50IHZlcnNpb24sIEVHTENvbnRleHQgZWdsQ29udGV4dCkgewotICAgIGludCBpZCA9IF9fc3luY19mZXRjaF9hbmRfYWRkKCZtVHJhY2VDb250ZXh0SWRzLCAxKTsKLQotICAgIGNvbnN0IHNpemVfdCBERUZBVUxUX0JVRkZFUl9TSVpFID0gODE5MjsKLSAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSAqc3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG1TdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotICAgIEdMVHJhY2VDb250ZXh0ICp0cmFjZUNvbnRleHQgPSBuZXcgR0xUcmFjZUNvbnRleHQoaWQsIHRoaXMsIHN0cmVhbSk7Ci0gICAgbVBlckNvbnRleHRTdGF0ZVtlZ2xDb250ZXh0XSA9IHRyYWNlQ29udGV4dDsKLQotICAgIHJldHVybiB0cmFjZUNvbnRleHQ7Ci19Ci0KLUdMVHJhY2VDb250ZXh0ICpHTFRyYWNlU3RhdGU6OmdldFRyYWNlQ29udGV4dChFR0xDb250ZXh0IGMpIHsKLSAgICByZXR1cm4gbVBlckNvbnRleHRTdGF0ZVtjXTsKLX0KLQotR0xUcmFjZUNvbnRleHQ6OkdMVHJhY2VDb250ZXh0KGludCBpZCwgR0xUcmFjZVN0YXRlICpzdGF0ZSwgQnVmZmVyZWRPdXRwdXRTdHJlYW0gKnN0cmVhbSkgOgotICAgIG1JZChpZCksCi0gICAgbVN0YXRlKHN0YXRlKSwKLSAgICBtQnVmZmVyZWRPdXRwdXRTdHJlYW0oc3RyZWFtKSwKLSAgICBtRWxlbWVudEFycmF5QnVmZmVycyhEZWZhdWx0S2V5ZWRWZWN0b3I8R0x1aW50LCBFbGVtZW50QXJyYXlCdWZmZXIqPihOVUxMKSkKLXsKLSAgICBmYmNvbnRlbnRzID0gZmJjb21wcmVzc2VkID0gTlVMTDsKLSAgICBmYmNvbnRlbnRzU2l6ZSA9IDA7Ci19Ci0KLWludCBHTFRyYWNlQ29udGV4dDo6Z2V0SWQoKSB7Ci0gICAgcmV0dXJuIG1JZDsKLX0KLQotR0xUcmFjZVN0YXRlICpHTFRyYWNlQ29udGV4dDo6Z2V0R2xvYmFsVHJhY2VTdGF0ZSgpIHsKLSAgICByZXR1cm4gbVN0YXRlOwotfQotCi12b2lkIEdMVHJhY2VDb250ZXh0OjpyZXNpemVGQk1lbW9yeSh1bnNpZ25lZCBtaW5TaXplKSB7Ci0gICAgaWYgKGZiY29udGVudHNTaXplID49IG1pblNpemUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChmYmNvbnRlbnRzICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShmYmNvbnRlbnRzKTsKLSAgICAgICAgZnJlZShmYmNvbXByZXNzZWQpOwotICAgIH0KLQotICAgIGZiY29udGVudHMgPSBtYWxsb2MobWluU2l6ZSk7Ci0gICAgZmJjb21wcmVzc2VkID0gbWFsbG9jKG1pblNpemUpOwotCi0gICAgZmJjb250ZW50c1NpemUgPSBtaW5TaXplOwotfQotCi0vKiogb2J0YWluIGEgcG9pbnRlciB0byB0aGUgY29tcHJlc3NlZCBmcmFtZWJ1ZmZlciBpbWFnZSAqLwotdm9pZCBHTFRyYWNlQ29udGV4dDo6Z2V0Q29tcHJlc3NlZEZCKHZvaWQgKipmYiwgdW5zaWduZWQgKmZic2l6ZSwgdW5zaWduZWQgKmZid2lkdGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpmYmhlaWdodCwgRkJCaW5kaW5nIGZiVG9SZWFkKSB7Ci0gICAgaW50IHZpZXdwb3J0WzRdID0ge307Ci0gICAgaG9va3MtPmdsLmdsR2V0SW50ZWdlcnYoR0xfVklFV1BPUlQsIHZpZXdwb3J0KTsKLSAgICB1bnNpZ25lZCBmYkNvbnRlbnRzU2l6ZSA9IHZpZXdwb3J0WzJdICogdmlld3BvcnRbM10gKiA0OwotCi0gICAgcmVzaXplRkJNZW1vcnkoZmJDb250ZW50c1NpemUpOwotCi0gICAgLy8gc3dpdGNoIGN1cnJlbnQgZnJhbWVidWZmZXIgYmluZGluZyBpZiBuZWNlc3NhcnkKLSAgICBHTGludCBjdXJyZW50RmIgPSAtMTsKLSAgICBib29sIGZiU3dpdGNoZWQgPSBmYWxzZTsKLSAgICBpZiAoZmJUb1JlYWQgIT0gQ1VSUkVOVExZX0JPVU5EX0ZCKSB7Ci0gICAgICAgIGhvb2tzLT5nbC5nbEdldEludGVnZXJ2KEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkcsICZjdXJyZW50RmIpOwotCi0gICAgICAgIGlmIChjdXJyZW50RmIgIT0gMCkgewotICAgICAgICAgICAgaG9va3MtPmdsLmdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCAwKTsKLSAgICAgICAgICAgIGZiU3dpdGNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaG9va3MtPmdsLmdsUmVhZFBpeGVscyh2aWV3cG9ydFswXSwgdmlld3BvcnRbMV0sIHZpZXdwb3J0WzJdLCB2aWV3cG9ydFszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBmYmNvbnRlbnRzKTsKLQotICAgIC8vIHN3aXRjaCBiYWNrIHRvIHByZXZpb3VzbHkgYm91bmQgYnVmZmVyIGlmIG5lY2Vzc2FyeQotICAgIGlmIChmYlN3aXRjaGVkKSB7Ci0gICAgICAgIGhvb2tzLT5nbC5nbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgY3VycmVudEZiKTsKLSAgICB9Ci0KLSAgICAqZmJzaXplID0gbHpmX2NvbXByZXNzKGZiY29udGVudHMsIGZiQ29udGVudHNTaXplLCBmYmNvbXByZXNzZWQsIGZiQ29udGVudHNTaXplKTsKLSAgICAqZmIgPSBmYmNvbXByZXNzZWQ7Ci0gICAgKmZid2lkdGggPSB2aWV3cG9ydFsyXTsKLSAgICAqZmJoZWlnaHQgPSB2aWV3cG9ydFszXTsKLX0KLQotdm9pZCBHTFRyYWNlQ29udGV4dDo6dHJhY2VHTE1lc3NhZ2UoR0xNZXNzYWdlICptc2cpIHsKLSAgICBtQnVmZmVyZWRPdXRwdXRTdHJlYW0tPnNlbmQobXNnKTsKLQotICAgIEdMTWVzc2FnZV9GdW5jdGlvbiBmdW5jID0gbXNnLT5mdW5jdGlvbigpOwotICAgIGlmIChmdW5jID09IEdMTWVzc2FnZTo6ZWdsU3dhcEJ1ZmZlcnMKLSAgICAgICAgfHwgZnVuYyA9PSBHTE1lc3NhZ2U6OmdsRHJhd0FycmF5cwotICAgICAgICB8fCBmdW5jID09IEdMTWVzc2FnZTo6Z2xEcmF3RWxlbWVudHMpIHsKLSAgICAgICAgbUJ1ZmZlcmVkT3V0cHV0U3RyZWFtLT5mbHVzaCgpOwotICAgIH0KLX0KLQotdm9pZCBHTFRyYWNlQ29udGV4dDo6YmluZEJ1ZmZlcihHTHVpbnQgYnVmZmVySWQsIEdMdm9pZCAqZGF0YSwgR0xzaXplaXB0ciBzaXplKSB7Ci0gICAgLy8gZnJlZSBwcmV2aW91c2x5IGJvdW5kIGJ1ZmZlciBpZiBhbnkKLSAgICBFbGVtZW50QXJyYXlCdWZmZXIgKm9sZEJ1ZmZlciA9IG1FbGVtZW50QXJyYXlCdWZmZXJzLnZhbHVlRm9yKGJ1ZmZlcklkKTsKLSAgICBpZiAob2xkQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG9sZEJ1ZmZlcjsKLSAgICB9Ci0KLSAgICBtRWxlbWVudEFycmF5QnVmZmVycy5hZGQoYnVmZmVySWQsIG5ldyBFbGVtZW50QXJyYXlCdWZmZXIoZGF0YSwgc2l6ZSkpOwotfQotCi12b2lkIEdMVHJhY2VDb250ZXh0OjpnZXRCdWZmZXIoR0x1aW50IGJ1ZmZlcklkLCBHTHZvaWQgKipkYXRhLCBHTHNpemVpcHRyICpzaXplKSB7Ci0gICAgRWxlbWVudEFycmF5QnVmZmVyICpidWZmZXIgPSBtRWxlbWVudEFycmF5QnVmZmVycy52YWx1ZUZvcihidWZmZXJJZCk7Ci0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICpkYXRhID0gTlVMTDsKLSAgICAgICAgKnNpemUgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpkYXRhID0gYnVmZmVyLT5nZXRCdWZmZXIoKTsKLSAgICAgICAgKnNpemUgPSBidWZmZXItPmdldFNpemUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgR0xUcmFjZUNvbnRleHQ6OnVwZGF0ZUJ1ZmZlclN1YkRhdGEoR0x1aW50IGJ1ZmZlcklkLCBHTGludHB0ciBvZmZzZXQsIEdMdm9pZCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWlwdHIgc2l6ZSkgewotICAgIEVsZW1lbnRBcnJheUJ1ZmZlciAqYnVmZmVyID0gbUVsZW1lbnRBcnJheUJ1ZmZlcnMudmFsdWVGb3IoYnVmZmVySWQpOwotICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgICAgICBidWZmZXItPnVwZGF0ZVN1YkJ1ZmZlcihvZmZzZXQsIGRhdGEsIHNpemUpOwotICAgIH0KLX0KLQotdm9pZCBHTFRyYWNlQ29udGV4dDo6ZGVsZXRlQnVmZmVyKEdMdWludCBidWZmZXJJZCkgewotICAgIEVsZW1lbnRBcnJheUJ1ZmZlciAqYnVmZmVyID0gbUVsZW1lbnRBcnJheUJ1ZmZlcnMudmFsdWVGb3IoYnVmZmVySWQpOwotICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgYnVmZmVyOwotICAgICAgICBtRWxlbWVudEFycmF5QnVmZmVycy5yZW1vdmVJdGVtKGJ1ZmZlcklkKTsKLSAgICB9Ci19Ci0KLUVsZW1lbnRBcnJheUJ1ZmZlcjo6RWxlbWVudEFycmF5QnVmZmVyKEdMdm9pZCAqYnVmLCBHTHNpemVpcHRyIHNpemUpIHsKLSAgICBtQnVmID0gbWFsbG9jKHNpemUpOwotICAgIG1TaXplID0gc2l6ZTsKLQotICAgIGlmIChidWYgIT0gTlVMTCkgewotICAgICAgICBtZW1jcHkobUJ1ZiwgYnVmLCBzaXplKTsKLSAgICB9Ci19Ci0KLUVsZW1lbnRBcnJheUJ1ZmZlcjo6fkVsZW1lbnRBcnJheUJ1ZmZlcigpIHsKLSAgICBpZiAobUJ1ZiAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUJ1Zik7Ci0gICAgICAgIG1TaXplID0gMDsKLSAgICB9Ci0KLSAgICBtQnVmID0gTlVMTDsKLX0KLQotdm9pZCBFbGVtZW50QXJyYXlCdWZmZXI6OnVwZGF0ZVN1YkJ1ZmZlcihHTGludHB0ciBvZmZzZXQsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xzaXplaXB0ciBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIHNpemUgPD0gbVNpemUpIHsKLSAgICAgICAgbWVtY3B5KChjaGFyKiltQnVmICsgb2Zmc2V0LCBkYXRhLCBzaXplKTsKLSAgICB9Ci19Ci0KLUdMdm9pZCAqRWxlbWVudEFycmF5QnVmZmVyOjpnZXRCdWZmZXIoKSB7Ci0gICAgcmV0dXJuIG1CdWY7Ci19Ci0KLUdMc2l6ZWlwdHIgRWxlbWVudEFycmF5QnVmZmVyOjpnZXRTaXplKCkgewotICAgIHJldHVybiBtU2l6ZTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGdsdHJhY2UKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2NvbnRleHQuaCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfY29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjNjZmRjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfY29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19HTFRSQUNFX0NPTlRFWFRfSF8KLSNkZWZpbmUgX19HTFRSQUNFX0NPTlRFWFRfSF8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLQotI2luY2x1ZGUgImhvb2tzLmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV90cmFuc3BvcnQuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGdsdHJhY2UgewotCi11c2luZyA6OmFuZHJvaWQ6OmdsX2hvb2tzX3Q7Ci0KLWVudW0gRkJCaW5kaW5nIHtDVVJSRU5UTFlfQk9VTkRfRkIsIEZCMH07Ci0KLWNsYXNzIEdMVHJhY2VTdGF0ZTsKLQotY2xhc3MgRWxlbWVudEFycmF5QnVmZmVyIHsKLSAgICBHTHZvaWQgKm1CdWY7Ci0gICAgR0xzaXplaXB0ciBtU2l6ZTsKLQotcHVibGljOgotICAgIEVsZW1lbnRBcnJheUJ1ZmZlcigpOm1CdWYoTlVMTCksIG1TaXplKDApIHt9Ci0gICAgRWxlbWVudEFycmF5QnVmZmVyKEdMdm9pZCAqYnVmLCBHTHNpemVpcHRyIHNpemUpOwotICAgIH5FbGVtZW50QXJyYXlCdWZmZXIoKTsKLQotICAgIHZvaWQgdXBkYXRlU3ViQnVmZmVyKEdMaW50cHRyIG9mZnNldCwgY29uc3QgR0x2b2lkKiBkYXRhLCBHTHNpemVpcHRyIHNpemUpOwotICAgIEdMdm9pZCAqZ2V0QnVmZmVyKCk7Ci0gICAgR0xzaXplaXB0ciBnZXRTaXplKCk7Ci19OwotCi0vKiogR0wgVHJhY2UgQ29udGV4dCBpbmZvIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEVHTENvbnRleHQgKi8KLWNsYXNzIEdMVHJhY2VDb250ZXh0IHsKLSAgICBpbnQgbUlkOyAgICAgICAgICAgICAgICAgICAgLyogdW5pcXVlIGNvbnRleHQgaWQgKi8KLSAgICBHTFRyYWNlU3RhdGUgKm1TdGF0ZTsgICAgICAgLyogcGFyZW50IEdMIFRyYWNlIHN0YXRlIChmb3IgcGVyIHByb2Nlc3MgR0wgVHJhY2UgU3RhdGUgSW5mbykgKi8KLQotICAgIHZvaWQgKmZiY29udGVudHM7ICAgICAgICAgICAvKiBtZW1vcnkgYXJlYSB0byByZWFkIGZyYW1lYnVmZmVyIGNvbnRlbnRzICovCi0gICAgdm9pZCAqZmJjb21wcmVzc2VkOyAgICAgICAgIC8qIGRlc3RpbmF0aW9uIGZvciBsemYgY29tcHJlc3NlZCBmcmFtZWJ1ZmZlciAqLwotICAgIHVuc2lnbmVkIGZiY29udGVudHNTaXplOyAgICAvKiBzaXplIG9mIGZiY29udGVudHMgJiBmYmNvbXByZXNzZWQgYnVmZmVycyAqLwotCi0gICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gKm1CdWZmZXJlZE91dHB1dFN0cmVhbTsgLyogc3RyZWFtIHdoZXJlIHRyYWNlIGluZm8gaXMgc2VudCAqLwotCi0gICAgLyogbGlzdCBvZiBlbGVtZW50IGFycmF5IGJ1ZmZlcnMgaW4gdXNlLiAqLwotICAgIERlZmF1bHRLZXllZFZlY3RvcjxHTHVpbnQsIEVsZW1lbnRBcnJheUJ1ZmZlcio+IG1FbGVtZW50QXJyYXlCdWZmZXJzOwotCi0gICAgdm9pZCByZXNpemVGQk1lbW9yeSh1bnNpZ25lZCBtaW5TaXplKTsKLXB1YmxpYzoKLSAgICBnbF9ob29rc190ICpob29rczsKLQotICAgIEdMVHJhY2VDb250ZXh0KGludCBpZCwgR0xUcmFjZVN0YXRlICpzdGF0ZSwgQnVmZmVyZWRPdXRwdXRTdHJlYW0gKnN0cmVhbSk7Ci0gICAgaW50IGdldElkKCk7Ci0gICAgR0xUcmFjZVN0YXRlICpnZXRHbG9iYWxUcmFjZVN0YXRlKCk7Ci0gICAgdm9pZCBnZXRDb21wcmVzc2VkRkIodm9pZCAqKmZiLCB1bnNpZ25lZCAqZmJzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpmYndpZHRoLCB1bnNpZ25lZCAqZmJoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJCaW5kaW5nIGZiVG9SZWFkKTsKLQotICAgIC8vIE1ldGhvZHMgdG8gd29yayB3aXRoIGVsZW1lbnQgYXJyYXkgYnVmZmVycwotICAgIHZvaWQgYmluZEJ1ZmZlcihHTHVpbnQgYnVmZmVySWQsIEdMdm9pZCAqZGF0YSwgR0xzaXplaXB0ciBzaXplKTsKLSAgICB2b2lkIGdldEJ1ZmZlcihHTHVpbnQgYnVmZmVySWQsIEdMdm9pZCAqKmRhdGEsIEdMc2l6ZWlwdHIgKnNpemUpOwotICAgIHZvaWQgdXBkYXRlQnVmZmVyU3ViRGF0YShHTHVpbnQgYnVmZmVySWQsIEdMaW50cHRyIG9mZnNldCwgR0x2b2lkICpkYXRhLCBHTHNpemVpcHRyIHNpemUpOwotICAgIHZvaWQgZGVsZXRlQnVmZmVyKEdMdWludCBidWZmZXJJZCk7Ci0KLSAgICB2b2lkIHRyYWNlR0xNZXNzYWdlKEdMTWVzc2FnZSAqbXNnKTsKLX07Ci0KLS8qKiBQZXIgcHJvY2VzcyB0cmFjZSBzdGF0ZS4gKi8KLWNsYXNzIEdMVHJhY2VTdGF0ZSB7Ci0gICAgaW50IG1UcmFjZUNvbnRleHRJZHM7Ci0gICAgVENQU3RyZWFtICptU3RyZWFtOwotICAgIHN0ZDo6bWFwPEVHTENvbnRleHQsIEdMVHJhY2VDb250ZXh0Kj4gbVBlckNvbnRleHRTdGF0ZTsKLQotICAgIC8qIE9wdGlvbnMgY29udHJvbGxpbmcgYWRkaXRpb25hbCBkYXRhIHRvIGJlIGNvbGxlY3RlZCBvbgotICAgICAgIGNlcnRhaW4gdHJhY2UgY2FsbHMuICovCi0gICAgYm9vbCBtQ29sbGVjdEZiT25FZ2xTd2FwOwotICAgIGJvb2wgbUNvbGxlY3RGYk9uR2xEcmF3OwotICAgIGJvb2wgbUNvbGxlY3RUZXh0dXJlRGF0YU9uR2xUZXhJbWFnZTsKLSAgICBwdGhyZWFkX3J3bG9ja190IG1UcmFjZU9wdGlvbnNSd0xvY2s7Ci0KLSAgICAvKiBoZWxwZXIgbWV0aG9kcyB0byBnZXQvc2V0IHZhbHVlcyB1c2luZyBwcm92aWRlZCBsb2NrIGZvciBtdXR1YWwgZXhjbHVzaW9uLiAqLwotICAgIHZvaWQgc2FmZVNldFZhbHVlKGJvb2wgKnB0ciwgYm9vbCB2YWx1ZSwgcHRocmVhZF9yd2xvY2tfdCAqbG9jayk7Ci0gICAgYm9vbCBzYWZlR2V0VmFsdWUoYm9vbCAqcHRyLCBwdGhyZWFkX3J3bG9ja190ICpsb2NrKTsKLXB1YmxpYzoKLSAgICBHTFRyYWNlU3RhdGUoVENQU3RyZWFtICpzdHJlYW0pOwotICAgIH5HTFRyYWNlU3RhdGUoKTsKLQotICAgIEdMVHJhY2VDb250ZXh0ICpjcmVhdGVUcmFjZUNvbnRleHQoaW50IHZlcnNpb24sIEVHTENvbnRleHQgYyk7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdldFRyYWNlQ29udGV4dChFR0xDb250ZXh0IGMpOwotCi0gICAgVENQU3RyZWFtICpnZXRTdHJlYW0oKTsKLQotICAgIC8qIE1ldGhvZHMgdG8gc2V0IHRyYWNlIG9wdGlvbnMuICovCi0gICAgdm9pZCBzZXRDb2xsZWN0RmJPbkVnbFN3YXAoYm9vbCBlbik7Ci0gICAgdm9pZCBzZXRDb2xsZWN0RmJPbkdsRHJhdyhib29sIGVuKTsKLSAgICB2b2lkIHNldENvbGxlY3RUZXh0dXJlRGF0YU9uR2xUZXhJbWFnZShib29sIGVuKTsKLQotICAgIC8qIE1ldGhvZHMgdG8gcmV0cmlldmUgdHJhY2Ugb3B0aW9ucy4gKi8KLSAgICBib29sIHNob3VsZENvbGxlY3RGYk9uRWdsU3dhcCgpOwotICAgIGJvb2wgc2hvdWxkQ29sbGVjdEZiT25HbERyYXcoKTsKLSAgICBib29sIHNob3VsZENvbGxlY3RUZXh0dXJlRGF0YU9uR2xUZXhJbWFnZSgpOwotfTsKLQotdm9pZCBzZXR1cFRyYWNlQ29udGV4dFRocmVhZFNwZWNpZmljKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0KTsKLUdMVHJhY2VDb250ZXh0ICpnZXRHTFRyYWNlQ29udGV4dCgpOwotdm9pZCByZWxlYXNlQ29udGV4dCgpOwotCi19OwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2VnbC5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2VnbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMTY4MmEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9lZ2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgImdsdHJhY2UucGIuaCIKLSNpbmNsdWRlICJnbHRyYWNlX2NvbnRleHQuaCIKLSNpbmNsdWRlICJnbHRyYWNlX2ZpeHVwLmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV90cmFuc3BvcnQuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGdsdHJhY2UgewotCi12b2lkIEdMVHJhY2VfZWdsQ3JlYXRlQ29udGV4dChpbnQgdmVyc2lvbiwgaW50IGNvbnRleHRJZCkgewotICAgIEdMTWVzc2FnZSBnbG1lc3NhZ2U7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1lc3NhZ2Uuc2V0X2NvbnRleHRfaWQoY29udGV4dElkKTsKLSAgICBnbG1lc3NhZ2Uuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6ZWdsQ3JlYXRlQ29udGV4dCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZlcnNpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192ZXJzaW9uID0gZ2xtZXNzYWdlLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZlcnNpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdmVyc2lvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmVyc2lvbi0+YWRkX2ludHZhbHVlKHZlcnNpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb250ZXh0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY29udGV4dCA9IGdsbWVzc2FnZS5hZGRfYXJncygpOwotICAgIGFyZ19jb250ZXh0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvbnRleHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvbnRleHQtPmFkZF9pbnR2YWx1ZShjb250ZXh0SWQpOwotCi0gICAgLy8gc2V0IHN0YXJ0IHRpbWUgYW5kIGR1cmF0aW9uCi0gICAgZ2xtZXNzYWdlLnNldF9zdGFydF90aW1lKHN5c3RlbVRpbWUoKSk7Ci0gICAgZ2xtZXNzYWdlLnNldF9kdXJhdGlvbigwKTsKLQotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbWVzc2FnZSk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9lZ2xNYWtlQ3VycmVudChpbnQgY29udGV4dElkKSB7Ci0gICAgR0xNZXNzYWdlIGdsbWVzc2FnZTsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbWVzc2FnZS5zZXRfY29udGV4dF9pZChjb250ZXh0SWQpOwotICAgIGdsbWVzc2FnZS5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjplZ2xNYWtlQ3VycmVudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvbnRleHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb250ZXh0ID0gZ2xtZXNzYWdlLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvbnRleHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY29udGV4dC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY29udGV4dC0+YWRkX2ludHZhbHVlKGNvbnRleHRJZCk7Ci0KLSAgICAvLyBzZXQgc3RhcnQgdGltZSBhbmQgZHVyYXRpb24KLSAgICBnbG1lc3NhZ2Uuc2V0X3N0YXJ0X3RpbWUoc3lzdGVtVGltZSgpKTsKLSAgICBnbG1lc3NhZ2Uuc2V0X2R1cmF0aW9uKDApOwotCi0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtZXNzYWdlKTsKLX0KLQotdm9pZCBHTFRyYWNlX2VnbFN3YXBCdWZmZXJzKHZvaWQgKmRweSwgdm9pZCAqZHJhdykgewotICAgIEdMTWVzc2FnZSBnbG1lc3NhZ2U7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1lc3NhZ2Uuc2V0X2NvbnRleHRfaWQoZ2xDb250ZXh0LT5nZXRJZCgpKTsKLSAgICBnbG1lc3NhZ2Uuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6ZWdsU3dhcEJ1ZmZlcnMpOwotCi0gICAgaWYgKGdsQ29udGV4dC0+Z2V0R2xvYmFsVHJhY2VTdGF0ZSgpLT5zaG91bGRDb2xsZWN0RmJPbkVnbFN3YXAoKSkgewotICAgICAgICAvLyByZWFkIEZCMCBzaW5jZSB0aGF0IGlzIHdoYXQgaXMgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4KLSAgICAgICAgZml4dXBfYWRkRkJDb250ZW50cyhnbENvbnRleHQsICZnbG1lc3NhZ2UsIEZCMCk7Ci0gICAgfQotCi0gICAgLy8gc2V0IHN0YXJ0IHRpbWUgYW5kIGR1cmF0aW9uCi0gICAgZ2xtZXNzYWdlLnNldF9zdGFydF90aW1lKHN5c3RlbVRpbWUoKSk7Ci0gICAgZ2xtZXNzYWdlLnNldF9kdXJhdGlvbigwKTsKLQotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbWVzc2FnZSk7Ci19Ci0KLX07Ci19OwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9lZ2wuaCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfZWdsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Njg0YzUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9lZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19HTFRSQUNFX0VHTF9IXwotI2RlZmluZSBfX0dMVFJBQ0VfRUdMX0hfCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBnbHRyYWNlIHsKLQotdm9pZCBHTFRyYWNlX2VnbENyZWF0ZUNvbnRleHQoaW50IHZlcnNpb24sIGludCBjb250ZXh0SWQpOwotdm9pZCBHTFRyYWNlX2VnbE1ha2VDdXJyZW50KGludCBjb250ZXh0SWQpOwotdm9pZCBHTFRyYWNlX2VnbFN3YXBCdWZmZXJzKHZvaWQgKmRweSwgdm9pZCAqZHJhdyk7Ci0KLX07Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfZWdsYXBpLmNwcCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfZWdsYXBpLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0MjE1My4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2VnbGFwaS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotCi0jaW5jbHVkZSAiaG9va3MuaCIKLSNpbmNsdWRlICJnbGVzdHJhY2UuaCIKLQotI2luY2x1ZGUgImdsdHJhY2VfY29udGV4dC5oIgotI2luY2x1ZGUgImdsdHJhY2VfZWdsLmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV9ob29rcy5oIgotI2luY2x1ZGUgImdsdHJhY2VfdHJhbnNwb3J0LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgZ2x0cmFjZTo6R0xUcmFjZVN0YXRlOwotdXNpbmcgZ2x0cmFjZTo6R0xUcmFjZUNvbnRleHQ7Ci11c2luZyBnbHRyYWNlOjpUQ1BTdHJlYW07Ci0KLXN0YXRpYyBHTFRyYWNlU3RhdGUgKnNHTFRyYWNlU3RhdGU7Ci1zdGF0aWMgcHRocmVhZF90IHNSZWNlaXZlVGhyZWFkSWQ7Ci0KLS8qKgotICogVGFzayB0aGF0IG1vbml0b3JzIHRoZSBjb250cm9sIHN0cmVhbSBmcm9tIHRoZSBob3N0IGFuZCB1cGRhdGVzCi0gKiB0aGUgdHJhY2Ugc3RhdHVzIGFjY29yZGluZyB0byBjb21tYW5kcyByZWNlaXZlZCBmcm9tIHRoZSBob3N0LgotICovCi1zdGF0aWMgdm9pZCAqY29tbWFuZFJlY2VpdmVUYXNrKHZvaWQgKmFyZykgewotICAgIEdMVHJhY2VTdGF0ZSAqc3RhdGUgPSAoR0xUcmFjZVN0YXRlICopYXJnOwotICAgIFRDUFN0cmVhbSAqc3RyZWFtID0gc3RhdGUtPmdldFN0cmVhbSgpOwotCi0gICAgLy8gQ3VycmVudGx5LCB0aGVyZSBhcmUgdmVyeSBmZXcgdXNlciBjb25maWd1cmFibGUgc2V0dGluZ3MuCi0gICAgLy8gQXMgYSByZXN1bHQsIHRoZXkgY2FuIGJlIGVuY29kZWQgaW4gYSBzaW5nbGUgaW50ZWdlci4KLSAgICBpbnQgY21kOwotICAgIGVudW0gVHJhY2VTZXR0aW5nc01hc2tzIHsKLSAgICAgICAgUkVBRF9GQl9PTl9FR0xTV0FQX01BU0sgPSAxIDw8IDAsCi0gICAgICAgIFJFQURfRkJfT05fR0xEUkFXX01BU0sgPSAxIDw8IDEsCi0gICAgICAgIFJFQURfVEVYVFVSRV9EQVRBX09OX0dMVEVYSU1BR0VfTUFTSyA9IDEgPDwgMiwKLSAgICB9OwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50IG4gPSBzdHJlYW0tPnJlY2VpdmUoJmNtZCwgNCk7Ci0gICAgICAgIGlmIChuICE9IDQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY21kID0gbnRvaGwoY21kKTsKLQotICAgICAgICBib29sIGNvbGxlY3RGYk9uRWdsU3dhcCA9IChjbWQgJiBSRUFEX0ZCX09OX0VHTFNXQVBfTUFTSykgIT0gMDsKLSAgICAgICAgYm9vbCBjb2xsZWN0RmJPbkdsRHJhdyA9IChjbWQgJiBSRUFEX0ZCX09OX0dMRFJBV19NQVNLKSAhPSAwOwotICAgICAgICBib29sIGNvbGxlY3RUZXh0dXJlRGF0YSA9IChjbWQgJiBSRUFEX1RFWFRVUkVfREFUQV9PTl9HTFRFWElNQUdFX01BU0spICE9IDA7Ci0KLSAgICAgICAgc3RhdGUtPnNldENvbGxlY3RGYk9uRWdsU3dhcChjb2xsZWN0RmJPbkVnbFN3YXApOwotICAgICAgICBzdGF0ZS0+c2V0Q29sbGVjdEZiT25HbERyYXcoY29sbGVjdEZiT25HbERyYXcpOwotICAgICAgICBzdGF0ZS0+c2V0Q29sbGVjdFRleHR1cmVEYXRhT25HbFRleEltYWdlKGNvbGxlY3RUZXh0dXJlRGF0YSk7Ci0KLSAgICAgICAgQUxPR0QoInRyYWNlIG9wdGlvbnM6IGVnbHN3YXA6ICVkLCBnbGRyYXc6ICVkLCB0ZXhJbWFnZTogJWQiLAotICAgICAgICAgICAgY29sbGVjdEZiT25FZ2xTd2FwLCBjb2xsZWN0RmJPbkdsRHJhdywgY29sbGVjdFRleHR1cmVEYXRhKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBHTFRyYWNlX3N0YXJ0KCkgewotICAgIGNoYXIgdWRzTmFtZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotCi0gICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5lZ2wuZGVidWdfcG9ydG5hbWUiLCB1ZHNOYW1lLCAiZ2x0cmFjZSIpOwotICAgIGludCBjbGllbnRTb2NrZXQgPSBnbHRyYWNlOjphY2NlcHRDbGllbnRDb25uZWN0aW9uKHVkc05hbWUpOwotICAgIGlmIChjbGllbnRTb2NrZXQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJFcnJvciBjcmVhdGluZyBHTFRyYWNlIHNlcnZlciBzb2NrZXQuIFF1aXR0aW5nIGFwcGxpY2F0aW9uLiIpOwotICAgICAgICBleGl0KC0xKTsKLSAgICB9Ci0KLSAgICAvLyBjcmVhdGUgY29tbXVuaWNhdGlvbiBjaGFubmVsIHRvIHRoZSBob3N0Ci0gICAgVENQU3RyZWFtICpzdHJlYW0gPSBuZXcgVENQU3RyZWFtKGNsaWVudFNvY2tldCk7Ci0KLSAgICAvLyBpbml0aWFsaXplIHRyYWNpbmcgc3RhdGUKLSAgICBzR0xUcmFjZVN0YXRlID0gbmV3IEdMVHJhY2VTdGF0ZShzdHJlYW0pOwotCi0gICAgcHRocmVhZF9jcmVhdGUoJnNSZWNlaXZlVGhyZWFkSWQsIE5VTEwsIGNvbW1hbmRSZWNlaXZlVGFzaywgc0dMVHJhY2VTdGF0ZSk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9zdG9wKCkgewotICAgIGRlbGV0ZSBzR0xUcmFjZVN0YXRlOwotICAgIHNHTFRyYWNlU3RhdGUgPSBOVUxMOwotfQotCi12b2lkIEdMVHJhY2VfZWdsQ3JlYXRlQ29udGV4dChpbnQgdmVyc2lvbiwgRUdMQ29udGV4dCBjKSB7Ci0gICAgLy8gdXBkYXRlIHRyYWNlIHN0YXRlIGZvciBuZXcgRUdMIGNvbnRleHQKLSAgICBHTFRyYWNlQ29udGV4dCAqdHJhY2VDb250ZXh0ID0gc0dMVHJhY2VTdGF0ZS0+Y3JlYXRlVHJhY2VDb250ZXh0KHZlcnNpb24sIGMpOwotICAgIGdsdHJhY2U6OnNldHVwVHJhY2VDb250ZXh0VGhyZWFkU3BlY2lmaWModHJhY2VDb250ZXh0KTsKLQotICAgIC8vIHRyYWNlIGNvbW1hbmQgdGhyb3VnaCB0byB0aGUgaG9zdAotICAgIGdsdHJhY2U6OkdMVHJhY2VfZWdsQ3JlYXRlQ29udGV4dCh2ZXJzaW9uLCB0cmFjZUNvbnRleHQtPmdldElkKCkpOwotfQotCi12b2lkIEdMVHJhY2VfZWdsTWFrZUN1cnJlbnQoY29uc3QgdW5zaWduZWQgdmVyc2lvbiwgZ2xfaG9va3NfdCAqaG9va3MsIEVHTENvbnRleHQgYykgewotICAgIC8vIHNldHVwIHBlciBjb250ZXh0IHN0YXRlCi0gICAgR0xUcmFjZUNvbnRleHQgKnRyYWNlQ29udGV4dCA9IHNHTFRyYWNlU3RhdGUtPmdldFRyYWNlQ29udGV4dChjKTsKLSAgICB0cmFjZUNvbnRleHQtPmhvb2tzID0gaG9va3M7Ci0gICAgZ2x0cmFjZTo6c2V0dXBUcmFjZUNvbnRleHRUaHJlYWRTcGVjaWZpYyh0cmFjZUNvbnRleHQpOwotCi0gICAgLy8gdHJhY2UgY29tbWFuZCB0aHJvdWdoIHRvIHRoZSBob3N0Ci0gICAgZ2x0cmFjZTo6R0xUcmFjZV9lZ2xNYWtlQ3VycmVudCh0cmFjZUNvbnRleHQtPmdldElkKCkpOwotfQotCi12b2lkIEdMVHJhY2VfZWdsUmVsZWFzZVRocmVhZCgpIHsKLSAgICBnbHRyYWNlOjpyZWxlYXNlQ29udGV4dCgpOwotfQotCi12b2lkIEdMVHJhY2VfZWdsU3dhcEJ1ZmZlcnModm9pZCAqZHB5LCB2b2lkICpkcmF3KSB7Ci0gICAgZ2x0cmFjZTo6R0xUcmFjZV9lZ2xTd2FwQnVmZmVycyhkcHksIGRyYXcpOwotfQotCi1nbF9ob29rc190ICpHTFRyYWNlX2dldEdMSG9va3MoKSB7Ci0gICAgcmV0dXJuIGdsdHJhY2U6OmdldEdMSG9va3MoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9maXh1cC5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2ZpeHVwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5N2IyNi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2ZpeHVwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlICJnbHRyYWNlLnBiLmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV9hcGkuaCIKLSNpbmNsdWRlICJnbHRyYWNlX2NvbnRleHQuaCIKLSNpbmNsdWRlICJnbHRyYWNlX2ZpeHVwLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBnbHRyYWNlIHsKLQotdW5zaWduZWQgZ2V0Qnl0ZXNQZXJUZXhlbChjb25zdCBHTGVudW0gZm9ybWF0LCBjb25zdCBHTGVudW0gdHlwZSkgewotICAgIC8qCi0gICAgRGVzY3JpcHRpb24gZnJvbSBnbFRleEltYWdlMkQgc3BlYzoKLQotICAgIERhdGEgaXMgcmVhZCBmcm9tIGRhdGEgYXMgYSBzZXF1ZW5jZSBvZiB1bnNpZ25lZCBieXRlcyBvciBzaG9ydHMsIGRlcGVuZGluZyBvbiB0eXBlLgotICAgIFdoZW4gdHlwZSBpcyBHTF9VTlNJR05FRF9CWVRFLCBlYWNoIG9mIHRoZSBieXRlcyBpcyBpbnRlcnByZXRlZCBhcyBvbmUgY29sb3IgY29tcG9uZW50LgotICAgIFdoZW4gdHlwZSBpcyBvbmUgb2YgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQsIG9yCi0gICAgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSwgZWFjaCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcyBjb250YWluaW5nIGFsbAotICAgIHRoZSBjb21wb25lbnRzIGZvciBhIHNpbmdsZSB0ZXhlbCwgd2l0aCB0aGUgY29sb3IgY29tcG9uZW50cyBhcnJhbmdlZCBhY2NvcmRpbmcgdG8KLSAgICBmb3JtYXQuIENvbG9yIGNvbXBvbmVudHMgYXJlIHRyZWF0ZWQgYXMgZ3JvdXBzIG9mIG9uZSwgdHdvLCB0aHJlZSwgb3IgZm91ciB2YWx1ZXMsCi0gICAgYWdhaW4gYmFzZWQgb24gZm9ybWF0LiBHcm91cHMgb2YgY29tcG9uZW50cyBhcmUgcmVmZXJyZWQgdG8gYXMgdGV4ZWxzLgotCi0gICAgd2lkdGggw5cgaGVpZ2h0IHRleGVscyBhcmUgcmVhZCBmcm9tIG1lbW9yeSwgc3RhcnRpbmcgYXQgbG9jYXRpb24gZGF0YS4gQnkgZGVmYXVsdCwKLSAgICB0aGVzZSB0ZXhlbHMgYXJlIHRha2VuIGZyb20gYWRqYWNlbnQgbWVtb3J5IGxvY2F0aW9ucywgZXhjZXB0IHRoYXQgYWZ0ZXIgYWxsIHdpZHRoCi0gICAgdGV4ZWxzIGFyZSByZWFkLCB0aGUgcmVhZCBwb2ludGVyIGlzIGFkdmFuY2VkIHRvIHRoZSBuZXh0IGZvdXItYnl0ZSBib3VuZGFyeS4KLSAgICBUaGUgZm91ci1ieXRlIHJvdyBhbGlnbm1lbnQgaXMgc3BlY2lmaWVkIGJ5IGdsUGl4ZWxTdG9yZWkgd2l0aCBhcmd1bWVudAotICAgIEdMX1VOUEFDS19BTElHTk1FTlQsIGFuZCBpdCBjYW4gYmUgc2V0IHRvIG9uZSwgdHdvLCBmb3VyLCBvciBlaWdodCBieXRlcy4KLSAgICAqLwotCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNToKLSAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQ6Ci0gICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOgotICAgICAgICByZXR1cm4gMjsKLSAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJHZXRCeXRlc1BlclBpeGVsOiB1bmtub3duIHR5cGUgJXgiLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgIGNhc2UgR0xfQUxQSEE6Ci0gICAgY2FzZSBHTF9MVU1JTkFOQ0U6Ci0gICAgICAgIHJldHVybiAxOwotICAgIGNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOgotICAgICAgICByZXR1cm4gMjsKLSAgICBjYXNlIEdMX1JHQjoKLSAgICAgICAgcmV0dXJuIDM7Ci0gICAgY2FzZSBHTF9SR0JBOgotICAgIGNhc2UgMHg4MEUxOiAvLyBHTF9CR1JBX0VYVAotICAgICAgICByZXR1cm4gNDsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiR2V0Qnl0ZXNQZXJQaXhlbDogdW5rbm93biBmb3JtYXQgJXgiLCBmb3JtYXQpOwotICAgIH0KLQotICAgIHJldHVybiAxOyAgIC8vIGluIGRvdWJ0Li4uCi19Ci0KLXZvaWQgZml4dXBfR2VuZXJpY0Zsb2F0QXJyYXkoaW50IGFyZ0luZGV4LCBpbnQgbkZsb2F0cywgR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqc3JjKSB7Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmxvYXRhcnJheSA9IGdsbXNnLT5tdXRhYmxlX2FyZ3MoYXJnSW5kZXgpOwotICAgIEdMZmxvYXQgKmZsb2F0cCA9IChHTGZsb2F0ICopc3JjOwotCi0gICAgaWYgKGZsb2F0cCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhcmdfZmxvYXRhcnJheS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19mbG9hdGFycmF5LT5zZXRfaXNhcnJheSh0cnVlKTsKLSAgICBhcmdfZmxvYXRhcnJheS0+Y2xlYXJfZmxvYXR2YWx1ZSgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuRmxvYXRzOyBpKyssIGZsb2F0cCsrKSB7Ci0gICAgICAgIGFyZ19mbG9hdGFycmF5LT5hZGRfZmxvYXR2YWx1ZSgqZmxvYXRwKTsKLSAgICB9Ci19Ci0KLXZvaWQgZml4dXBfR2VuZXJpY0ludEFycmF5KGludCBhcmdJbmRleCwgaW50IG5JbnRzLCBHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpzcmMpIHsKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnRhcnJheSA9IGdsbXNnLT5tdXRhYmxlX2FyZ3MoYXJnSW5kZXgpOwotICAgIEdMaW50ICppbnRwID0gKEdMaW50ICopc3JjOwotCi0gICAgaWYgKGludHAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXJnX2ludGFycmF5LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbnRhcnJheS0+c2V0X2lzYXJyYXkodHJ1ZSk7Ci0gICAgYXJnX2ludGFycmF5LT5jbGVhcl9pbnR2YWx1ZSgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuSW50czsgaSsrLCBpbnRwKyspIHsKLSAgICAgICAgYXJnX2ludGFycmF5LT5hZGRfaW50dmFsdWUoKmludHApOwotICAgIH0KLX0KLQotdm9pZCBmaXh1cF9HZW5lcmljRW51bUFycmF5KGludCBhcmdJbmRleCwgaW50IG5FbnVtcywgR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqc3JjKSB7Ci0gICAgLy8gZml4dXAgYXMgaWYgdGhleSB3ZXJlIGludHMKLSAgICBmaXh1cF9HZW5lcmljSW50QXJyYXkoYXJnSW5kZXgsIG5FbnVtcywgZ2xtc2csIHNyYyk7Ci0KLSAgICAvLyBhbmQgdGhlbiBzZXQgdGhlIGRhdGEgdHlwZSB0byBiZSBlbnVtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZW51bWFycmF5ID0gZ2xtc2ctPm11dGFibGVfYXJncyhhcmdJbmRleCk7Ci0gICAgYXJnX2VudW1hcnJheS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci19Ci0KLS8qKiBHZW5lcmljIGhlbHBlciBmdW5jdGlvbjogZXh0cmFjdCBwb2ludGVyIGF0IGFyZ0luZGV4IGFuZAotICAgIHJlcGxhY2UgaXQgd2l0aCB0aGUgQyBzdHlsZSBzdHJpbmcgYXQgKnBvaW50ZXIgKi8KLXZvaWQgZml4dXBfQ1N0cmluZ1B0cihpbnQgYXJnSW5kZXgsIEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnNyYykgewotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnID0gZ2xtc2ctPm11dGFibGVfYXJncyhhcmdJbmRleCk7Ci0gICAgR0xjaGFyICpwdHIgPSAoR0xjaGFyICopIHNyYzsKLQotICAgIGFyZy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Q0hBUik7Ci0gICAgYXJnLT5zZXRfaXNhcnJheSh0cnVlKTsKLSAgICBhcmctPmFkZF9jaGFydmFsdWUocHRyKTsKLX0KLQotdm9pZCBmaXh1cF9nbEdldFN0cmluZyhHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpwb2ludGVyc1RvRml4dXBbXSkgewotICAgIC8qIGNvbnN0IEdMdWJ5dGUqIEdMVHJhY2VfZ2xHZXRTdHJpbmcoR0xlbnVtIG5hbWUpICovCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpyZXQgPSBnbG1zZy0+bXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIEdMY2hhciAqcHRyID0gKEdMY2hhciAqKSBwb2ludGVyc1RvRml4dXBbMF07Ci0KLSAgICBpZiAocHRyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpDSEFSKTsKLSAgICAgICAgcmV0LT5zZXRfaXNhcnJheSh0cnVlKTsKLSAgICAgICAgcmV0LT5hZGRfY2hhcnZhbHVlKHB0cik7Ci0gICAgfQotfQotCi0vKiBBZGQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmcmFtZWJ1ZmZlciB0byB0aGUgcHJvdG9idWYgbWVzc2FnZSAqLwotdm9pZCBmaXh1cF9hZGRGQkNvbnRlbnRzKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0LCBHTE1lc3NhZ2UgKmdsbXNnLCBGQkJpbmRpbmcgZmJUb1JlYWQpIHsKLSAgICB2b2lkICpmYmNvbnRlbnRzOwotICAgIHVuc2lnbmVkIGZic2l6ZSwgZmJ3aWR0aCwgZmJoZWlnaHQ7Ci0gICAgY29udGV4dC0+Z2V0Q29tcHJlc3NlZEZCKCZmYmNvbnRlbnRzLCAmZmJzaXplLCAmZmJ3aWR0aCwgJmZiaGVpZ2h0LCBmYlRvUmVhZCk7Ci0KLSAgICBHTE1lc3NhZ2VfRnJhbWVCdWZmZXIgKmZiID0gZ2xtc2ctPm11dGFibGVfZmIoKTsKLSAgICBmYi0+c2V0X3dpZHRoKGZid2lkdGgpOwotICAgIGZiLT5zZXRfaGVpZ2h0KGZiaGVpZ2h0KTsKLSAgICBmYi0+YWRkX2NvbnRlbnRzKGZiY29udGVudHMsIGZic2l6ZSk7Ci19Ci0KLS8qKiBDb21tb24gZml4dXAgcm91dGluZyBmb3IgZ2xUZXhJbWFnZTJEICYgZ2xUZXhTdWJJbWFnZTJELiAqLwotdm9pZCBmaXh1cF9nbFRleEltYWdlKGludCB3aWR0aEluZGV4LCBpbnQgaGVpZ2h0SW5kZXgsIEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKmRhdGFTcmMpIHsKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgYXJnX3dpZHRoICA9IGdsbXNnLT5hcmdzKHdpZHRoSW5kZXgpOwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSBhcmdfaGVpZ2h0ID0gZ2xtc2ctPmFyZ3MoaGVpZ2h0SW5kZXgpOwotCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlIGFyZ19mb3JtYXQgPSBnbG1zZy0+YXJncyg2KTsKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgYXJnX3R5cGUgICA9IGdsbXNnLT5hcmdzKDcpOwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RhdGEgID0gZ2xtc2ctPm11dGFibGVfYXJncyg4KTsKLQotICAgIEdMc2l6ZWkgd2lkdGggID0gYXJnX3dpZHRoLmludHZhbHVlKDApOwotICAgIEdMc2l6ZWkgaGVpZ2h0ID0gYXJnX2hlaWdodC5pbnR2YWx1ZSgwKTsKLSAgICBHTGVudW0gZm9ybWF0ICA9IGFyZ19mb3JtYXQuaW50dmFsdWUoMCk7Ci0gICAgR0xlbnVtIHR5cGUgICAgPSBhcmdfdHlwZS5pbnR2YWx1ZSgwKTsKLSAgICB2b2lkICpkYXRhICAgICA9ICh2b2lkICopIGRhdGFTcmM7Ci0KLSAgICBpbnQgYnl0ZXNQZXJUZXhlbCA9IGdldEJ5dGVzUGVyVGV4ZWwoZm9ybWF0LCB0eXBlKTsKLQotICAgIGFyZ19kYXRhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCWVRFKTsKLSAgICBhcmdfZGF0YS0+Y2xlYXJfcmF3Ynl0ZXMoKTsKLQotICAgIGlmIChkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgYXJnX2RhdGEtPnNldF9pc2FycmF5KHRydWUpOwotICAgICAgICBhcmdfZGF0YS0+YWRkX3Jhd2J5dGVzKGRhdGEsIGJ5dGVzUGVyVGV4ZWwgKiB3aWR0aCAqIGhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXJnX2RhdGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICAgICAgYXJnX2RhdGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OlZPSUQpOwotICAgIH0KLX0KLQotCi12b2lkIGZpeHVwX2dsVGV4SW1hZ2UyRChHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpwb2ludGVyc1RvRml4dXBbXSkgewotICAgIC8qIHZvaWQgZ2xUZXhJbWFnZTJEKEdMZW51bSB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGludGVybmFsZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICpkYXRhKTsKLSAgICAqLwotICAgIGludCB3aWR0aEluZGV4ID0gMzsKLSAgICBpbnQgaGVpZ2h0SW5kZXggPSA0OwotICAgIGZpeHVwX2dsVGV4SW1hZ2Uod2lkdGhJbmRleCwgaGVpZ2h0SW5kZXgsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotfQotCi12b2lkIGZpeHVwX2dsVGV4U3ViSW1hZ2UyRChHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpwb2ludGVyc1RvRml4dXBbXSkgewotICAgIC8qCi0gICAgdm9pZCBnbFRleFN1YkltYWdlMkQoR0xlbnVtIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHlvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKiBkYXRhKTsKLSAgICAqLwotICAgIGludCB3aWR0aEluZGV4ID0gNDsKLSAgICBpbnQgaGVpZ2h0SW5kZXggPSA1OwotICAgIGZpeHVwX2dsVGV4SW1hZ2Uod2lkdGhJbmRleCwgaGVpZ2h0SW5kZXgsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotfQotCi12b2lkIGZpeHVwX2dsU2hhZGVyU291cmNlKEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnBvaW50ZXJzVG9GaXh1cFtdKSB7Ci0gICAgLyogdm9pZCBnbFNoYWRlclNvdXJjZShHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqKiBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGludCogbGVuZ3RoKSAqLwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSBhcmdfY291bnQgID0gZ2xtc2ctPmFyZ3MoMSk7Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlIGFyZ19sZW5wICAgPSBnbG1zZy0+YXJncygzKTsKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zdHJwcCA9IGdsbXNnLT5tdXRhYmxlX2FyZ3MoMik7Ci0KLSAgICBHTHNpemVpIGNvdW50ID0gYXJnX2NvdW50LmludHZhbHVlKDApOwotICAgIEdMY2hhciAqKnN0cmluZ3BwID0gKEdMY2hhciAqKikgcG9pbnRlcnNUb0ZpeHVwWzBdOwotICAgIEdMaW50ICpsZW5ndGhwID0gKEdMaW50ICopIHBvaW50ZXJzVG9GaXh1cFsxXTsKLQotICAgIGFyZ19zdHJwcC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Q0hBUik7Ci0gICAgYXJnX3N0cnBwLT5zZXRfaXNhcnJheSh0cnVlKTsKLSAgICBhcmdfc3RycHAtPmNsZWFyX2NoYXJ2YWx1ZSgpOwotCi0gICAgOjpzdGQ6OnN0cmluZyBzcmMgPSAiIjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgaWYgKGxlbmd0aHAgIT0gTlVMTCkKLSAgICAgICAgICAgIHNyYy5hcHBlbmQoKnN0cmluZ3BwLCAqbGVuZ3RocCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNyYy5hcHBlbmQoKnN0cmluZ3BwKTsgIC8vIGFzc3VtZSBudWxsIHRlcm1pbmF0ZWQKLSAgICAgICAgc3RyaW5ncHArKzsKLSAgICAgICAgbGVuZ3RocCsrOwotICAgIH0KLQotICAgIGFyZ19zdHJwcC0+YWRkX2NoYXJ2YWx1ZShzcmMpOwotfQotCi12b2lkIGZpeHVwX2dsVW5pZm9ybUdlbmVyaWNJbnRlZ2VyKGludCBhcmdJbmRleCwgaW50IG5JbnRlZ2VycywgR0xNZXNzYWdlICpnbG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pIHsKLSAgICAvKiB2b2lkIGdsVW5pZm9ybT9pdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsgKi8KLSAgICBmaXh1cF9HZW5lcmljSW50QXJyYXkoYXJnSW5kZXgsIG5JbnRlZ2VycywgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cFswXSk7Ci19Ci0KLXZvaWQgZml4dXBfZ2xVbmlmb3JtR2VuZXJpYyhpbnQgYXJnSW5kZXgsIGludCBuRmxvYXRzLCBHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpzcmMpIHsKLSAgICBmaXh1cF9HZW5lcmljRmxvYXRBcnJheShhcmdJbmRleCwgbkZsb2F0cywgZ2xtc2csIHNyYyk7Ci19Ci0KLXZvaWQgZml4dXBfZ2xVbmlmb3JtTWF0cml4R2VuZXJpYyhpbnQgbWF0cml4U2l6ZSwgR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pIHsKLSAgICAvKiB2b2lkIGdsVW5pZm9ybU1hdHJpeD9mdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0KiB2YWx1ZSkgKi8KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgYXJnX2NvdW50ICA9IGdsbXNnLT5hcmdzKDEpOwotICAgIGludCBuX21hdHJpY2VzID0gYXJnX2NvdW50LmludHZhbHVlKDApOwotICAgIGZpeHVwX2dsVW5pZm9ybUdlbmVyaWMoMywgbWF0cml4U2l6ZSAqIG1hdHJpeFNpemUgKiBuX21hdHJpY2VzLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLX0KLQotdm9pZCBmaXh1cF9nbEdlbkdlbmVyaWMoR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pIHsKLSAgICAvKiB2b2lkIGdsR2VuKihHTHNpemVpIG4sIEdMdWludCAqIGJ1ZmZlcnMpOyAqLwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSBhcmdfbiAgPSBnbG1zZy0+YXJncygwKTsKLSAgICBHTHNpemVpIG4gPSBhcmdfbi5pbnR2YWx1ZSgwKTsKLQotICAgIGZpeHVwX0dlbmVyaWNJbnRBcnJheSgxLCBuLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLX0KLQotdm9pZCBmaXh1cF9nbERlbGV0ZUdlbmVyaWMoR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pIHsKLSAgICAvKiB2b2lkIGdsRGVsZXRlKihHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7ICovCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlIGFyZ19uICA9IGdsbXNnLT5hcmdzKDApOwotICAgIEdMc2l6ZWkgbiA9IGFyZ19uLmludHZhbHVlKDApOwotCi0gICAgZml4dXBfR2VuZXJpY0ludEFycmF5KDEsIG4sIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotfQotCi12b2lkIGZpeHVwX2dsR2V0Qm9vbGVhbnYoR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pIHsKLSAgICAvKiB2b2lkIGdsR2V0Qm9vbGVhbnYoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcyk7ICovCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2ctPm11dGFibGVfYXJncygxKTsKLSAgICBHTGJvb2xlYW4gKnNyYyA9IChHTGJvb2xlYW4qKSBwb2ludGVyc1RvRml4dXBbMF07Ci0KLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheSh0cnVlKTsKLSAgICBhcmdfcGFyYW1zLT5jbGVhcl9ib29sdmFsdWUoKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfYm9vbHZhbHVlKCpzcmMpOwotfQotCi12b2lkIGZpeHVwX2dsR2V0RmxvYXR2KEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnBvaW50ZXJzVG9GaXh1cFtdKSB7Ci0gICAgLyogdm9pZCBnbEdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7ICovCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2ctPm11dGFibGVfYXJncygxKTsKLSAgICBHTGZsb2F0ICpzcmMgPSAoR0xmbG9hdCopIHBvaW50ZXJzVG9GaXh1cFswXTsKLQotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheSh0cnVlKTsKLSAgICBhcmdfcGFyYW1zLT5jbGVhcl9mbG9hdHZhbHVlKCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2Zsb2F0dmFsdWUoKnNyYyk7Ci19Ci0KLXZvaWQgZml4dXBfZ2xMaW5rUHJvZ3JhbShHTE1lc3NhZ2UgKmdsbXNnKSB7Ci0gICAgLyogdm9pZCBnbExpbmtQcm9ncmFtKEdMdWludCBwcm9ncmFtKTsgKi8KLSAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsbXNnLT5hcmdzKDApLmludHZhbHVlKDApOwotCi0gICAgLyogV2UgZG9uJ3QgaGF2ZSB0byBmaXh1cCB0aGlzIGNhbGwsIGJ1dCBhcyBzb29uIGFzIGEgcHJvZ3JhbSBpcyBsaW5rZWQsCi0gICAgICAgd2Ugb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IGFsbCBhY3RpdmUgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgdG8KLSAgICAgICBwYXNzIG9uIHRvIHRoZSBkZWJ1Z2dlci4gTm90ZSB0aGF0IGluIG9yZGVyIHRvIHBhc3MgdGhpcyBpbmZvIHRvCi0gICAgICAgdGhlIGRlYnVnZ2VyLCBhbGwgd2UgbmVlZCB0byBkbyBpcyBjYWxsIHRoZSB0cmFjZSB2ZXJzaW9ucyBvZiB0aGUKLSAgICAgICBuZWNlc3NhcnkgY2FsbHMuICovCi0KLSAgICBHTGludCBuLCBtYXhOYW1lTGVuZ3RoOwotICAgIEdMY2hhciAqbmFtZTsKLSAgICBHTGludCBzaXplOwotICAgIEdMZW51bSB0eXBlOwotCi0gICAgLy8gb2J0YWluIGluZm8gcmVnYXJkaW5nIGFjdGl2ZSBhdHRyaWJ1dGVzCi0gICAgR0xUcmFjZV9nbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9BQ1RJVkVfQVRUUklCVVRFUywgJm4pOwotICAgIEdMVHJhY2VfZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RILCAmbWF4TmFtZUxlbmd0aCk7Ci0KLSAgICBuYW1lID0gKEdMY2hhciAqKSBtYWxsb2MobWF4TmFtZUxlbmd0aCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgR0xUcmFjZV9nbEdldEFjdGl2ZUF0dHJpYihwcm9ncmFtLCBpLCBtYXhOYW1lTGVuZ3RoLCBOVUxMLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOwotICAgIH0KLSAgICBmcmVlKG5hbWUpOwotCi0gICAgLy8gb2J0YWluIGluZm8gcmVnYXJkaW5nIGFjdGl2ZSB1bmlmb3JtcwotICAgIEdMVHJhY2VfZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfQUNUSVZFX1VOSUZPUk1TLCAmbik7Ci0gICAgR0xUcmFjZV9nbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RILCAmbWF4TmFtZUxlbmd0aCk7Ci0KLSAgICBuYW1lID0gKEdMY2hhciAqKSBtYWxsb2MobWF4TmFtZUxlbmd0aCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgR0xUcmFjZV9nbEdldEFjdGl2ZVVuaWZvcm0ocHJvZ3JhbSwgaSwgbWF4TmFtZUxlbmd0aCwgTlVMTCwgJnNpemUsICZ0eXBlLCBuYW1lKTsKLSAgICB9Ci0gICAgZnJlZShuYW1lKTsKLX0KLQotLyoqIEdpdmVuIGEgZ2xHZXRBY3RpdmVbVW5pZm9ybXxBdHRyaWJdIGNhbGwsIG9idGFpbiB0aGUgbG9jYXRpb24KLSAqICBvZiB0aGUgdmFyaWFibGUgb2YgZ2l2ZW4gbmFtZSBpbiB0aGUgY2FsbC4KLSAqLwotaW50IGdldFNoYWRlclZhcmlhYmxlTG9jYXRpb24oR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsIEdMTWVzc2FnZSAqZ2xtc2csIEdMY2hhciAqbmFtZSkgewotICAgIEdMTWVzc2FnZV9GdW5jdGlvbiBmdW5jID0gZ2xtc2ctPmZ1bmN0aW9uKCk7Ci0gICAgaWYgKGZ1bmMgIT0gR0xNZXNzYWdlOjpnbEdldEFjdGl2ZUF0dHJpYiAmJiBmdW5jICE9IEdMTWVzc2FnZTo6Z2xHZXRBY3RpdmVVbmlmb3JtKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpbnQgcHJvZ3JhbSA9IGdsbXNnLT5hcmdzKDApLmludHZhbHVlKDApOwotCi0gICAgaWYgKGZ1bmMgPT0gR0xNZXNzYWdlOjpnbEdldEFjdGl2ZUF0dHJpYikgewotICAgICAgICByZXR1cm4gY29udGV4dC0+aG9va3MtPmdsLmdsR2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgbmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQtPmhvb2tzLT5nbC5nbEdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCBuYW1lKTsKLSAgICB9Ci19Ci0KLXZvaWQgZml4dXBfZ2xHZXRBY3RpdmVBdHRyaWJPclVuaWZvcm0oR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsIEdMTWVzc2FnZSAqZ2xtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pIHsKLSAgICAvKiB2b2lkIGdsR2V0QWN0aXZlQXR0cmliKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwKLSAgICAgICAgICAgICAgICBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSk7ICovCi0gICAgLyogdm9pZCBnbEdldEFjdGl2ZVVuaWZvcm0oR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLAotICAgICAgICAgICAgICAgIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKSAqLwotCi0gICAgZml4dXBfR2VuZXJpY0ludEFycmF5KDMsIDEsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOyAgICAgLy8gbGVuZ3RoCi0gICAgZml4dXBfR2VuZXJpY0ludEFycmF5KDQsIDEsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMV0pOyAgICAgLy8gc2l6ZQotICAgIGZpeHVwX0dlbmVyaWNFbnVtQXJyYXkoNSwgMSwgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cFsyXSk7ICAgIC8vIHR5cGUKLSAgICBmaXh1cF9DU3RyaW5nUHRyKDYsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbM10pOyAgICAgICAgICAgICAvLyBuYW1lCi0KLSAgICAvLyBUaGUgaW5kZXggYXJndW1lbnQgaW4gdGhlIGdsR2V0QWN0aXZlW0F0dHJpYnxVbmlmb3JtXSBmdW5jdGlvbnMKLSAgICAvLyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBhY3R1YWwgbG9jYXRpb24gaW5kZXggYXMgdXNlZCBpbgotICAgIC8vIGdsVW5pZm9ybSooKSBvciBnbFZlcnRleEF0dHJpYiooKSB0byBhY3R1YWxseSB1cGxvYWQgdGhlIGRhdGEuCi0gICAgLy8gSW4gb3JkZXIgdG8gbWFrZSB0aGluZ3Mgc2ltcGxlciBmb3IgdGhlIGRlYnVnZ2VyLCB3ZSBhbHNvIHBhc3MKLSAgICAvLyBhIGhpZGRlbiBsb2NhdGlvbiBhcmd1bWVudCB0aGF0IHN0b3JlcyB0aGUgYWN0dWFsIGxvY2F0aW9uLgotICAgIC8vIGFwcGVuZCB0aGUgbG9jYXRpb24gdmFsdWUgdG8gdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQgbGlzdAotICAgIGludCBsb2NhdGlvbiA9IGdldFNoYWRlclZhcmlhYmxlTG9jYXRpb24oY29udGV4dCwgZ2xtc2csIChHTGNoYXIqKXBvaW50ZXJzVG9GaXh1cFszXSk7Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy0+YWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotfQotCi1HTGludCBnbEdldEludGVnZXIoR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsIEdMZW51bSBwYXJhbSkgewotICAgIEdMaW50IHg7Ci0gICAgY29udGV4dC0+aG9va3MtPmdsLmdsR2V0SW50ZWdlcnYocGFyYW0sICZ4KTsKLSAgICByZXR1cm4geDsKLX0KLQotR0xpbnQgZ2xHZXRWZXJ0ZXhBdHRyaWIoR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lKSB7Ci0gICAgR0xpbnQgeDsKLSAgICBjb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRWZXJ0ZXhBdHRyaWJpdihpbmRleCwgcG5hbWUsICZ4KTsKLSAgICByZXR1cm4geDsKLX0KLQotYm9vbCBpc1VzaW5nQXJyYXlCdWZmZXJzKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0KSB7Ci0gICAgcmV0dXJuIGdsR2V0SW50ZWdlcihjb250ZXh0LCBHTF9BUlJBWV9CVUZGRVJfQklORElORykgIT0gMDsKLX0KLQotYm9vbCBpc1VzaW5nRWxlbWVudEFycmF5QnVmZmVycyhHTFRyYWNlQ29udGV4dCAqY29udGV4dCkgewotICAgIHJldHVybiBnbEdldEludGVnZXIoY29udGV4dCwgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORykgIT0gMDsKLX0KLQotLyoqIENvcHkgQGxlbiBieXRlcyBvZiBkYXRhIGZyb20gQHNyYyBpbnRvIHRoZSBAZGF0YUluZGV4J3RoIGFyZ3VtZW50IG9mIHRoZSBtZXNzYWdlLiAqLwotdm9pZCBhZGRHbEJ1ZmZlckRhdGEoR0xNZXNzYWdlICpnbG1zZywgaW50IGRhdGFJbmRleCwgR0x2b2lkICpzcmMsIEdMc2l6ZWlwdHIgbGVuKSB7Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGF0YXAgPSBnbG1zZy0+bXV0YWJsZV9hcmdzKGRhdGFJbmRleCk7Ci0gICAgYXJnX2RhdGFwLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpWT0lEKTsKLSAgICBhcmdfZGF0YXAtPnNldF9pc2FycmF5KHRydWUpOwotICAgIGFyZ19kYXRhcC0+Y2xlYXJfaW50dmFsdWUoKTsKLSAgICBhcmdfZGF0YXAtPmFkZF9yYXdieXRlcyhzcmMsIGxlbik7Ci19Ci0KLXZvaWQgZml4dXBfZ2xCdWZmZXJEYXRhKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0LCBHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpwb2ludGVyc1RvRml4dXBbXSkgewotICAgIC8qIHZvaWQgZ2xCdWZmZXJEYXRhKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhLCBHTGVudW0gdXNhZ2UpICovCi0gICAgR0xzaXplaXB0ciBzaXplID0gZ2xtc2ctPmFyZ3MoMSkuaW50dmFsdWUoMCk7Ci0gICAgR0x2b2lkICpkYXRhcCA9IChHTHZvaWQgKikgcG9pbnRlcnNUb0ZpeHVwWzBdOwotCi0gICAgLy8gU2F2ZSBlbGVtZW50IGFycmF5IGJ1ZmZlcnMgZm9yIGZ1dHVyZSB1c2UgdG8gZml4dXAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVycwotICAgIC8vIHdoZW4gYSBnbERyYXdFbGVtZW50cygpIGNhbGwgaXMgcGVyZm9ybWVkLgotICAgIEdMZW51bSB0YXJnZXQgPSBnbG1zZy0+YXJncygwKS5pbnR2YWx1ZSgwKTsKLSAgICBpZiAodGFyZ2V0ID09IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSKSB7Ci0gICAgICAgIEdMaW50IGJ1ZmZlcklkID0gZ2xHZXRJbnRlZ2VyKGNvbnRleHQsIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcpOwotICAgICAgICBjb250ZXh0LT5iaW5kQnVmZmVyKGJ1ZmZlcklkLCBkYXRhcCwgc2l6ZSk7Ci0gICAgfQotCi0gICAgLy8gYWRkIGJ1ZmZlciBkYXRhIHRvIHRoZSBwcm90b2J1ZiBtZXNzYWdlCi0gICAgaWYgKGRhdGFwICE9IE5VTEwpIHsKLSAgICAgICAgYWRkR2xCdWZmZXJEYXRhKGdsbXNnLCAyLCBkYXRhcCwgc2l6ZSk7Ci0gICAgfQotfQotCi12b2lkIGZpeHVwX2dsQnVmZmVyU3ViRGF0YShHTFRyYWNlQ29udGV4dCAqY29udGV4dCwgR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pIHsKLSAgICAvKiB2b2lkIGdsQnVmZmVyU3ViRGF0YShHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSAqLwotICAgIEdMZW51bSB0YXJnZXQgPSBnbG1zZy0+YXJncygwKS5pbnR2YWx1ZSgwKTsKLSAgICBHTGludHB0ciBvZmZzZXQgPSBnbG1zZy0+YXJncygxKS5pbnR2YWx1ZSgwKTsKLSAgICBHTHNpemVpcHRyIHNpemUgPSBnbG1zZy0+YXJncygyKS5pbnR2YWx1ZSgwKTsKLSAgICBHTHZvaWQgKmRhdGFwID0gKEdMdm9pZCAqKSBwb2ludGVyc1RvRml4dXBbMF07Ci0gICAgaWYgKHRhcmdldCA9PSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUikgewotICAgICAgICBHTGludCBidWZmZXJJZCA9IGdsR2V0SW50ZWdlcihjb250ZXh0LCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HKTsKLSAgICAgICAgY29udGV4dC0+dXBkYXRlQnVmZmVyU3ViRGF0YShidWZmZXJJZCwgb2Zmc2V0LCBkYXRhcCwgc2l6ZSk7Ci0gICAgfQotCi0gICAgLy8gYWRkIGJ1ZmZlciBkYXRhIHRvIHRoZSBwcm90b2J1ZiBtZXNzYWdlCi0gICAgYWRkR2xCdWZmZXJEYXRhKGdsbXNnLCAzLCBkYXRhcCwgc2l6ZSk7Ci19Ci0KLS8qKiBPYnRhaW4gdGhlIHNpemUgb2YgZWFjaCB2ZXJ0ZXggYXR0cmlidXRlLiAqLwotaW50IHZlcnRleEF0dHJpYlNpemUoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgbnVtQ29tcG9uZW50cykgewotICAgIGludCBzaXplUGVyQ29tcG9uZW50OwotCi0gICAgc3dpdGNoKHR5cGUpIHsKLSAgICBjYXNlIEdMX0JZVEU6Ci0gICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgotICAgICAgICBzaXplUGVyQ29tcG9uZW50ID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9TSE9SVDoKLSAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUOgotICAgICAgICBzaXplUGVyQ29tcG9uZW50ID0gMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9GSVhFRDoKLSAgICBjYXNlIEdMX0ZMT0FUOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHNpemVQZXJDb21wb25lbnQgPSA0OwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2l6ZVBlckNvbXBvbmVudCAqIG51bUNvbXBvbmVudHM7Ci19Ci0KLS8qKiBDcmVhdGUgYW5kIHNlbmQgYSBnbFZlcnRleEF0dHJpYlBvaW50ZXJEYXRhIHRyYWNlIG1lc3NhZ2UgdG8gdGhlIGhvc3QuICovCi12b2lkIHRyYWNlX2dsVmVydGV4QXR0cmliUG9pbnRlckRhdGEoR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgR0x1aW50IG1pbkluZGV4LCBHTHVpbnQgbWF4SW5kZXgsIG5zZWNzX3Qgc3RhcnRUaW1lKSB7Ci0gICAgLyogdm9pZCBnbFZlcnRleEF0dHJpYlBvaW50ZXJEYXRhKEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgaW50IG1pbkluZGV4LCBpbnQgbWF4SW5kZXgpICovCi0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBjb250ZXh0OwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmR4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5keC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmR4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmR4LT5hZGRfaW50dmFsdWUoaW5keCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaXplLT5hZGRfaW50dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG5vcm1hbGl6ZWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ub3JtYWxpemVkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbm9ybWFsaXplZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ub3JtYWxpemVkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfbm9ybWFsaXplZC0+YWRkX2Jvb2x2YWx1ZShub3JtYWxpemVkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc3RyaWRlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3RyaWRlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3RyaWRlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc3RyaWRlLT5hZGRfaW50dmFsdWUoc3RyaWRlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHRyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHRyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHRyLT5zZXRfaXNhcnJheSh0cnVlKTsKLSAgICBhcmdfcHRyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCWVRFKTsKLSAgICBpbnQgcGVyVmVydGV4U2l6ZSA9IHZlcnRleEF0dHJpYlNpemUodHlwZSwgc2l6ZSk7Ci0gICAgR0xjaGFyICpwID0gKEdMY2hhciopIHB0cjsKLSAgICBzdGQ6OnN0cmluZyBkYXRhOwotICAgIGZvciAoR0x1aW50IGkgPSBtaW5JbmRleDsgaSA8IG1heEluZGV4OyBpKyspIHsKLSAgICAgICAgZGF0YS5hcHBlbmQocCwgcGVyVmVydGV4U2l6ZSk7Ci0gICAgICAgIHAgKz0gc3RyaWRlID09IDAgPyBwZXJWZXJ0ZXhTaXplIDogc3RyaWRlOwotICAgIH0KLSAgICBhcmdfcHRyLT5hZGRfcmF3Ynl0ZXMoZGF0YSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1pbiBpbmRleAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21pbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21pbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19taW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21pbi0+YWRkX2ludHZhbHVlKG1pbkluZGV4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWF4IGluZGV4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWF4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWF4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21heC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWF4LT5hZGRfaW50dmFsdWUobWF4SW5kZXgpOwotCi0gICAgZ2xtc2cuc2V0X2NvbnRleHRfaWQoY29udGV4dC0+Z2V0SWQoKSk7Ci0gICAgZ2xtc2cuc2V0X3N0YXJ0X3RpbWUoc3RhcnRUaW1lKTsKLSAgICBnbG1zZy5zZXRfdGhyZWFkdGltZSgwKTsKLSAgICBnbG1zZy5zZXRfZHVyYXRpb24oMCk7Ci0KLSAgICBjb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIGZpbmRNaW5BbmRNYXhJbmRpY2VzKEdMdm9pZCAqaW5kaWNlcywgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50ICptaW5JbmRleCwgR0x1aW50ICptYXhJbmRleCkgewotICAgIEdMdWludCBpbmRleDsKLSAgICAqbWluSW5kZXggPSBVSU5UX01BWDsKLSAgICAqbWF4SW5kZXggPSAwOwotCi0gICAgaWYgKGluZGljZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChHTHNpemVpIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBpZiAodHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKSB7Ci0gICAgICAgICAgICBpbmRleCA9ICooKEdMdWJ5dGUqKSBpbmRpY2VzICsgaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmRleCA9ICooKEdMdXNob3J0KikgaW5kaWNlcyArIGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZGV4IDwgKm1pbkluZGV4KSAqbWluSW5kZXggPSBpbmRleDsKLSAgICAgICAgaWYgKGluZGV4ID4gKm1heEluZGV4KSAqbWF4SW5kZXggPSBpbmRleDsKLSAgICB9Ci19Ci0KLXZvaWQgdHJhY2VfVmVydGV4QXR0cmliUG9pbnRlckRhdGEoR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG1pbkluZGV4LCBHTHVpbnQgbWF4SW5kZXgsIG5zZWNzX3QgdGltZSkgewotICAgIEdMdWludCBtYXhBdHRyaWJzID0gZ2xHZXRJbnRlZ2VyKGNvbnRleHQsIEdMX01BWF9WRVJURVhfQVRUUklCUyk7Ci0gICAgZm9yIChHTHVpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1heEF0dHJpYnM7IGluZGV4KyspIHsKLSAgICAgICAgaWYgKCFnbEdldFZlcnRleEF0dHJpYihjb250ZXh0LCBpbmRleCwgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEKSkgewotICAgICAgICAgICAgLy8gdmVydGV4IGFycmF5IGRpc2FibGVkCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnbEdldFZlcnRleEF0dHJpYihjb250ZXh0LCBpbmRleCwgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORykpIHsKLSAgICAgICAgICAgIC8vIHZibwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBHTGludCBzaXplID0gZ2xHZXRWZXJ0ZXhBdHRyaWIoY29udGV4dCwgaW5kZXgsIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSk7Ci0gICAgICAgIEdMZW51bSB0eXBlID0gZ2xHZXRWZXJ0ZXhBdHRyaWIoY29udGV4dCwgaW5kZXgsIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRSk7Ci0gICAgICAgIEdMYm9vbGVhbiBub3JtID0gZ2xHZXRWZXJ0ZXhBdHRyaWIoY29udGV4dCwgaW5kZXgsIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCk7Ci0gICAgICAgIEdMc2l6ZWkgc3RyaWRlID0gZ2xHZXRWZXJ0ZXhBdHRyaWIoY29udGV4dCwgaW5kZXgsIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFKTsKLSAgICAgICAgR0x2b2lkKiBwdHI7Ci0gICAgICAgIGNvbnRleHQtPmhvb2tzLT5nbC5nbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2KGluZGV4LCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVIsICZwdHIpOwotCi0gICAgICAgIHRyYWNlX2dsVmVydGV4QXR0cmliUG9pbnRlckRhdGEoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHNpemUsIHR5cGUsIG5vcm0sIHN0cmlkZSwgcHRyLAotICAgICAgICAgICAgICAgICAgICBtaW5JbmRleCwgbWF4SW5kZXgsIHRpbWUpOwotICAgIH0KLX0KLQotdm9pZCB0cmFjZV9WZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YUZvckdsRHJhd0FycmF5cyhHTFRyYWNlQ29udGV4dCAqY29udGV4dCwgR0xNZXNzYWdlICpnbG1zZykgewotICAgIC8qIHZvaWQgZ2xEcmF3QXJyYXlzKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkgKi8KLSAgICBHTHNpemVpIGNvdW50ID0gZ2xtc2ctPmFyZ3MoMikuaW50dmFsdWUoMCk7Ci0KLSAgICAvLyBWZXJ0ZXggYXR0cmliIHBvaW50ZXIgZGF0YSBwYXRjaHVwIGNhbGxzIHNob3VsZCBhcHBlYXIgYXMgaWYKLSAgICAvLyB0aGV5IG9jY3VycmVkIHJpZ2h0IGJlZm9yZSB0aGUgZHJhdyBjYWxsLgotICAgIG5zZWNzX3QgdGltZSA9IGdsbXNnLT5zdGFydF90aW1lKCkgLSAxOwotCi0gICAgdHJhY2VfVmVydGV4QXR0cmliUG9pbnRlckRhdGEoY29udGV4dCwgMCwgY291bnQsIHRpbWUpOwotfQotCi12b2lkIHRyYWNlX1ZlcnRleEF0dHJpYlBvaW50ZXJEYXRhRm9yR2xEcmF3RWxlbWVudHMoR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsIEdMTWVzc2FnZSAqZ2xtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x2b2lkICppbmRpY2VzKSB7Ci0gICAgLyogdm9pZCBnbERyYXdFbGVtZW50cyhHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogaW5kaWNlcykgKi8KLSAgICBHTHNpemVpIGNvdW50ID0gZ2xtc2ctPmFyZ3MoMSkuaW50dmFsdWUoMCk7Ci0gICAgR0xlbnVtIHR5cGUgPSBnbG1zZy0+YXJncygyKS5pbnR2YWx1ZSgwKTsKLSAgICBHTHVpbnQgaW5kZXg7Ci0KLSAgICBHTHVpbnQgbWluSW5kZXgsIG1heEluZGV4OwotCi0gICAgLy8gVGhlIGluZGV4IGJ1ZmZlciBpcyBlaXRoZXIgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBnbERyYXdFbGVtZW50cygpIGNhbGwsCi0gICAgLy8gb3IgaXQgaXMgc3RvcmVkIGluIHRoZSBjdXJyZW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLgotICAgIEdMdm9pZCAqaW5kZXhCdWZmZXI7Ci0gICAgaWYgKGlzVXNpbmdFbGVtZW50QXJyYXlCdWZmZXJzKGNvbnRleHQpKSB7Ci0gICAgICAgIEdMc2l6ZWlwdHIgZWFCdWZmZXJTaXplOwotICAgICAgICBHTHVpbnQgYnVmZmVySWQgPSBnbEdldEludGVnZXIoY29udGV4dCwgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyk7Ci0gICAgICAgIGNvbnRleHQtPmdldEJ1ZmZlcihidWZmZXJJZCwgJmluZGV4QnVmZmVyLCAmZWFCdWZmZXJTaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbmRleEJ1ZmZlciA9IGluZGljZXM7Ci0gICAgfQotCi0gICAgLy8gUmF0aGVyIHRoYW4gc2VuZGluZyB2ZXJ0ZXggYXR0cmlidXRlIGRhdGEgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgaW5kaWNlcwotICAgIC8vIGJlaW5nIGRyYXduLCB3ZSBzZW5kIHRoZSB2ZXJ0ZXggYXR0cmlidXRlIGRhdGEgZm9yIHRoZSBlbnRpcmUgcmFuZ2Ugb2YKLSAgICAvLyBpbmRpY2VzIGJlaW5nIGRyYXduLCBpbmNsdWRpbmcgdGhlIG9uZXMgbm90IGRyYXduLiBUaGUgbWluICYgbWF4IGluZGljZXMKLSAgICAvLyBwcm92aWRlIHRoZSByYW5nZSBvZiBpbmRpY2VzIGJlaW5nIGRyYXduLgotICAgIGZpbmRNaW5BbmRNYXhJbmRpY2VzKGluZGV4QnVmZmVyLCBjb3VudCwgdHlwZSwgJm1pbkluZGV4LCAmbWF4SW5kZXgpOwotCi0gICAgLy8gVmVydGV4IGF0dHJpYiBwb2ludGVyIGRhdGEgcGF0Y2h1cCBjYWxscyBzaG91bGQgYXBwZWFyIGFzIGlmCi0gICAgLy8gdGhleSBvY2N1cnJlZCByaWdodCBiZWZvcmUgdGhlIGRyYXcgY2FsbC4KLSAgICBuc2Vjc190IHRpbWUgPSBnbG1zZy0+c3RhcnRfdGltZSgpIC0gMTsKLQotICAgIHRyYWNlX1ZlcnRleEF0dHJpYlBvaW50ZXJEYXRhKGNvbnRleHQsIG1pbkluZGV4LCBtYXhJbmRleCArIDEsIHRpbWUpOwotfQotCi12b2lkIGZpeHVwX2dsRHJhd0FycmF5cyhHTFRyYWNlQ29udGV4dCAqY29udGV4dCwgR0xNZXNzYWdlICpnbG1zZykgewotICAgIC8vIFRyYWNlIGFsbCB2ZXJ0ZXggYXR0cmlidXRlIGRhdGEgc3RvcmVkIGluIGNsaWVudCBzcGFjZS4KLSAgICB0cmFjZV9WZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YUZvckdsRHJhd0FycmF5cyhjb250ZXh0LCBnbG1zZyk7Ci0KLSAgICAvLyBBdHRhY2ggdGhlIEZCIGlmIHJlcXVlc3RlZAotICAgIGlmIChjb250ZXh0LT5nZXRHbG9iYWxUcmFjZVN0YXRlKCktPnNob3VsZENvbGxlY3RGYk9uR2xEcmF3KCkpIHsKLSAgICAgICAgZml4dXBfYWRkRkJDb250ZW50cyhjb250ZXh0LCBnbG1zZywgQ1VSUkVOVExZX0JPVU5EX0ZCKTsKLSAgICB9Ci19Ci0KLXZvaWQgZml4dXBfZ2xEcmF3RWxlbWVudHMoR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsIEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnBvaW50ZXJzVG9GaXh1cFtdKSB7Ci0gICAgLyogdm9pZCBnbERyYXdFbGVtZW50cyhHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogaW5kaWNlcykgKi8KLSAgICBHTHZvaWQgKmluZGljZXMgPSBwb2ludGVyc1RvRml4dXBbMF07Ci0gICAgR0xlbnVtIHR5cGUgPSBnbG1zZy0+YXJncygyKS5pbnR2YWx1ZSgwKTsKLSAgICBHTHNpemVpIGNvdW50ID0gZ2xtc2ctPmFyZ3MoMSkuaW50dmFsdWUoMCk7Ci0gICAgR0x1aW50IGluZGV4OwotCi0gICAgLy8gVHJhY2UgYWxsIHZlcnRleCBhdHRyaWJ1dGUgZGF0YSBzdG9yZWQgaW4gY2xpZW50IHNwYWNlLgotICAgIHRyYWNlX1ZlcnRleEF0dHJpYlBvaW50ZXJEYXRhRm9yR2xEcmF3RWxlbWVudHMoY29udGV4dCwgZ2xtc2csIGluZGljZXMpOwotCi0gICAgLy8gRml4dXAgaW5kaWNlcyBhcmd1bWVudAotICAgIGlmICghaXNVc2luZ0VsZW1lbnRBcnJheUJ1ZmZlcnMoY29udGV4dCkpIHsKLSAgICAgICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5kaWNlcyA9IGdsbXNnLT5tdXRhYmxlX2FyZ3MoMyk7Ci0gICAgICAgIGFyZ19pbmRpY2VzLT5zZXRfaXNhcnJheSh0cnVlKTsKLSAgICAgICAgYXJnX2luZGljZXMtPmNsZWFyX2ludHZhbHVlKCk7Ci0gICAgICAgIGFyZ19pbmRpY2VzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgICAgICBmb3IgKEdMc2l6ZWkgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAqKChHTHVieXRlKikgaW5kaWNlcyArIGkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9ICooKEdMdXNob3J0KikgaW5kaWNlcyArIGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJnX2luZGljZXMtPmFkZF9pbnR2YWx1ZShpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBdHRhY2ggdGhlIEZCIGlmIHJlcXVlc3RlZAotICAgIGlmIChjb250ZXh0LT5nZXRHbG9iYWxUcmFjZVN0YXRlKCktPnNob3VsZENvbGxlY3RGYk9uR2xEcmF3KCkpIHsKLSAgICAgICAgZml4dXBfYWRkRkJDb250ZW50cyhjb250ZXh0LCBnbG1zZywgQ1VSUkVOVExZX0JPVU5EX0ZCKTsKLSAgICB9Ci19Ci0KLXZvaWQgZml4dXBHTE1lc3NhZ2UoR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsIG5zZWNzX3Qgd2FsbFN0YXJ0LCBuc2Vjc190IHdhbGxFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRocmVhZFN0YXJ0LCBuc2Vjc190IHRocmVhZEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnBvaW50ZXJzVG9GaXh1cFtdKSB7Ci0gICAgLy8gZm9yIGFsbCBtZXNzYWdlcywgc2V0IHRoZSBjdXJyZW50IGNvbnRleHQgaWQKLSAgICBnbG1zZy0+c2V0X2NvbnRleHRfaWQoY29udGV4dC0+Z2V0SWQoKSk7Ci0KLSAgICAvLyBzZXQgc3RhcnQgdGltZSBhbmQgZHVyYXRpb24KLSAgICBnbG1zZy0+c2V0X3N0YXJ0X3RpbWUod2FsbFN0YXJ0KTsKLSAgICBnbG1zZy0+c2V0X2R1cmF0aW9uKCh1bnNpZ25lZCkod2FsbEVuZCAtIHdhbGxTdGFydCkpOwotICAgIGdsbXNnLT5zZXRfdGhyZWFkdGltZSgodW5zaWduZWQpKHRocmVhZEVuZCAtIHRocmVhZFN0YXJ0KSk7Ci0KLSAgICAvLyBkbyBhbnkgY3VzdG9tIG1lc3NhZ2UgZGVwZW5kZW50IHByb2Nlc3NpbmcKLSAgICBzd2l0Y2ggKGdsbXNnLT5mdW5jdGlvbigpKSB7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsRGVsZXRlQnVmZmVyczogICAgICAvKiBnbERlbGV0ZUJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpOyAqLwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbERlbGV0ZUZyYW1lYnVmZmVyczogLyogZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpOyAqLwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbERlbGV0ZVJlbmRlcmJ1ZmZlcnM6LyogZ2xEZWxldGVSZW5kZXJidWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsgKi8KLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xEZWxldGVUZXh0dXJlczogICAgIC8qIGdsRGVsZXRlVGV4dHVyZXMoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsgKi8KLSAgICAgICAgZml4dXBfZ2xEZWxldGVHZW5lcmljKGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xHZW5CdWZmZXJzOiAgICAgICAgLyogdm9pZCBnbEdlbkJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpOyAqLwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbEdlbkZyYW1lYnVmZmVyczogICAvKiB2b2lkIGdsR2VuRnJhbWVidWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsgKi8KLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xHZW5SZW5kZXJidWZmZXJzOiAgLyogdm9pZCBnbEdlbkZyYW1lYnVmZmVycyhHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7ICovCi0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2VuVGV4dHVyZXM6ICAgICAgIC8qIHZvaWQgZ2xHZW5UZXh0dXJlcyhHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpOyAqLwotICAgICAgICBmaXh1cF9nbEdlbkdlbmVyaWMoZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbExpbmtQcm9ncmFtOiAgICAgICAvKiB2b2lkIGdsTGlua1Byb2dyYW0oR0x1aW50IHByb2dyYW0pOyAqLwotICAgICAgICBmaXh1cF9nbExpbmtQcm9ncmFtKGdsbXNnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2V0QWN0aXZlQXR0cmliOgotICAgICAgICBmaXh1cF9nbEdldEFjdGl2ZUF0dHJpYk9yVW5pZm9ybShjb250ZXh0LCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2V0QWN0aXZlVW5pZm9ybToKLSAgICAgICAgZml4dXBfZ2xHZXRBY3RpdmVBdHRyaWJPclVuaWZvcm0oY29udGV4dCwgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbEJpbmRBdHRyaWJMb2NhdGlvbjoKLSAgICAgICAgLyogdm9pZCBnbEJpbmRBdHRyaWJMb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBjb25zdCBHTGNoYXIqIG5hbWUpOyAqLwotICAgICAgICBmaXh1cF9DU3RyaW5nUHRyKDIsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xHZXRBdHRyaWJMb2NhdGlvbjoKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xHZXRVbmlmb3JtTG9jYXRpb246Ci0gICAgICAgIC8qIGludCBnbEdldEF0dHJpYkxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpICovCi0gICAgICAgIC8qIGludCBnbEdldFVuaWZvcm1Mb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKSAqLwotICAgICAgICBmaXh1cF9DU3RyaW5nUHRyKDEsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xHZXRCb29sZWFudjoKLSAgICAgICAgZml4dXBfZ2xHZXRCb29sZWFudihnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2V0RmxvYXR2OgotICAgICAgICBmaXh1cF9nbEdldEZsb2F0dihnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2V0SW50ZWdlcnY6ICAgICAgICAvKiB2b2lkIGdsR2V0SW50ZWdlcnYoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsgKi8KLSAgICAgICAgZml4dXBfR2VuZXJpY0ludEFycmF5KDEsIDEsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xHZXRQcm9ncmFtaXY6Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXY6Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2V0U2hhZGVyaXY6Ci0gICAgICAgIC8qIHZvaWQgZ2xHZXRQcm9ncmFtaXYoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgKi8KLSAgICAgICAgLyogdm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgKi8KLSAgICAgICAgLyogdm9pZCBnbEdldFNoYWRlcml2KEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgKi8KLSAgICAgICAgZml4dXBfR2VuZXJpY0ludEFycmF5KDIsIDEsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xHZXRTdHJpbmc6Ci0gICAgICAgIGZpeHVwX2dsR2V0U3RyaW5nKGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xUZXhJbWFnZTJEOgotICAgICAgICBpZiAoY29udGV4dC0+Z2V0R2xvYmFsVHJhY2VTdGF0ZSgpLT5zaG91bGRDb2xsZWN0VGV4dHVyZURhdGFPbkdsVGV4SW1hZ2UoKSkgewotICAgICAgICAgICAgZml4dXBfZ2xUZXhJbWFnZTJEKGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbFRleFN1YkltYWdlMkQ6Ci0gICAgICAgIGlmIChjb250ZXh0LT5nZXRHbG9iYWxUcmFjZVN0YXRlKCktPnNob3VsZENvbGxlY3RUZXh0dXJlRGF0YU9uR2xUZXhJbWFnZSgpKSB7Ci0gICAgICAgICAgICBmaXh1cF9nbFRleFN1YkltYWdlMkQoZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsU2hhZGVyU291cmNlOgotICAgICAgICBmaXh1cF9nbFNoYWRlclNvdXJjZShnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsVW5pZm9ybTFpdjoKLSAgICAgICAgLyogdm9pZCBnbFVuaWZvcm0xaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7ICovCi0gICAgICAgIGZpeHVwX2dsVW5pZm9ybUdlbmVyaWNJbnRlZ2VyKDIsIDEsIGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xVbmlmb3JtMml2OgotICAgICAgICAvKiB2b2lkIGdsVW5pZm9ybTJpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsgKi8KLSAgICAgICAgZml4dXBfZ2xVbmlmb3JtR2VuZXJpY0ludGVnZXIoMiwgMiwgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbFVuaWZvcm0zaXY6Ci0gICAgICAgIC8qIHZvaWQgZ2xVbmlmb3JtM2l2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOyAqLwotICAgICAgICBmaXh1cF9nbFVuaWZvcm1HZW5lcmljSW50ZWdlcigyLCAzLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsVW5pZm9ybTRpdjoKLSAgICAgICAgLyogdm9pZCBnbFVuaWZvcm00aXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7ICovCi0gICAgICAgIGZpeHVwX2dsVW5pZm9ybUdlbmVyaWNJbnRlZ2VyKDIsIDQsIGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xVbmlmb3JtMWZ2OgotICAgICAgICAvKiB2b2lkIGdsVW5pZm9ybTFmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOyAqLwotICAgICAgICBmaXh1cF9nbFVuaWZvcm1HZW5lcmljKDIsIDEsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xVbmlmb3JtMmZ2OgotICAgICAgICAvKiB2b2lkIGdsVW5pZm9ybTJmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOyAqLwotICAgICAgICBmaXh1cF9nbFVuaWZvcm1HZW5lcmljKDIsIDIsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xVbmlmb3JtM2Z2OgotICAgICAgICAvKiB2b2lkIGdsVW5pZm9ybTNmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOyAqLwotICAgICAgICBmaXh1cF9nbFVuaWZvcm1HZW5lcmljKDIsIDMsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xVbmlmb3JtNGZ2OgotICAgICAgICAvKiB2b2lkIGdsVW5pZm9ybTRmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOyAqLwotICAgICAgICBmaXh1cF9nbFVuaWZvcm1HZW5lcmljKDIsIDQsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xVbmlmb3JtTWF0cml4MmZ2OgotICAgICAgICAvKiB2b2lkIGdsVW5pZm9ybU1hdHJpeDJmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCogdmFsdWUpICovCi0gICAgICAgIGZpeHVwX2dsVW5pZm9ybU1hdHJpeEdlbmVyaWMoMiwgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbFVuaWZvcm1NYXRyaXgzZnY6Ci0gICAgICAgIC8qIHZvaWQgZ2xVbmlmb3JtTWF0cml4MmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0KiB2YWx1ZSkgKi8KLSAgICAgICAgZml4dXBfZ2xVbmlmb3JtTWF0cml4R2VuZXJpYygzLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsVW5pZm9ybU1hdHJpeDRmdjoKLSAgICAgICAgLyogdm9pZCBnbFVuaWZvcm1NYXRyaXg0ZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQqIHZhbHVlKSAqLwotICAgICAgICBmaXh1cF9nbFVuaWZvcm1NYXRyaXhHZW5lcmljKDQsIGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xCdWZmZXJEYXRhOgotICAgICAgICAvKiB2b2lkIGdsQnVmZmVyRGF0YShHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKSAqLwotICAgICAgICBmaXh1cF9nbEJ1ZmZlckRhdGEoY29udGV4dCwgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbEJ1ZmZlclN1YkRhdGE6Ci0gICAgICAgIC8qIHZvaWQgZ2xCdWZmZXJTdWJEYXRhKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpICovCi0gICAgICAgIGZpeHVwX2dsQnVmZmVyU3ViRGF0YShjb250ZXh0LCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsRHJhd0FycmF5czoKLSAgICAgICAgLyogdm9pZCBnbERyYXdBcnJheXMoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KSAqLwotICAgICAgICBmaXh1cF9nbERyYXdBcnJheXMoY29udGV4dCwgZ2xtc2cpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xEcmF3RWxlbWVudHM6Ci0gICAgICAgIC8qIHZvaWQgZ2xEcmF3RWxlbWVudHMoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIGluZGljZXMpICovCi0gICAgICAgIGZpeHVwX2dsRHJhd0VsZW1lbnRzKGNvbnRleHQsIGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xQdXNoR3JvdXBNYXJrZXJFWFQ6Ci0gICAgICAgIC8qIHZvaWQgUHVzaEdyb3VwTWFya2VyRVhUKHNpemVpIGxlbmd0aCwgY29uc3QgY2hhciAqbWFya2VyKTsgKi8KLSAgICAgICAgZml4dXBfQ1N0cmluZ1B0cigxLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsSW5zZXJ0RXZlbnRNYXJrZXJFWFQ6Ci0gICAgICAgIC8qIHZvaWQgSW5zZXJ0RXZlbnRNYXJrZXJFWFQoc2l6ZWkgbGVuZ3RoLCBjb25zdCBjaGFyICptYXJrZXIpOyAqLwotICAgICAgICBmaXh1cF9DU3RyaW5nUHRyKDEsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLX07Ci19OwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9maXh1cC5oIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9maXh1cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTMwMTI1Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfZml4dXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19HTFRSQUNFX0ZJWFVQX0hfCi0jZGVmaW5lIF9fR0xUUkFDRV9GSVhVUF9IXwotCi0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlICJnbHRyYWNlLnBiLmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV9jb250ZXh0LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBnbHRyYWNlIHsKLQotdm9pZCBmaXh1cEdMTWVzc2FnZShHTFRyYWNlQ29udGV4dCAqY3VyQ29udGV4dCwgbnNlY3NfdCB3YWxsU3RhcnQsIG5zZWNzX3Qgd2FsbEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGhyZWFkU3RhcnQsIG5zZWNzX3QgdGhyZWFkRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xNZXNzYWdlICptZXNzYWdlLCB2b2lkICpwb2ludGVyc1RvRml4dXBbXSk7Ci12b2lkIGZpeHVwX2FkZEZCQ29udGVudHMoR0xUcmFjZUNvbnRleHQgKmN1ckNvbnRleHQsIEdMTWVzc2FnZSAqbWVzc2FnZSwgRkJCaW5kaW5nIGZiVG9SZWFkKTsKLQotfTsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9ob29rcy5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2hvb2tzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4ZDQ2My4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2hvb2tzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJob29rcy5oIgotI2luY2x1ZGUgImdsdHJhY2VfYXBpLmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV9ob29rcy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgZ2x0cmFjZSB7Ci0KLS8vIEhvb2sgdXAgYWxsIHRoZSBHTFRyYWNlIGZ1bmN0aW9ucwotI2RlZmluZSBHTF9FTlRSWShfciwgX2FwaSwgLi4uKSBHTFRyYWNlXyAjIyBfYXBpLAotRUdMQVBJIGdsX2hvb2tzX3QgZ0hvb2tzRGVidWcgPSB7Ci0gICAgewotICAgICAgICAjaW5jbHVkZSAiZW50cmllcy5pbiIKLSAgICB9LAotICAgIHsKLSAgICAgICAgezB9Ci0gICAgfQotfTsKLSN1bmRlZiBHTF9FTlRSWQotCi1nbF9ob29rc190ICpnZXRHTEhvb2tzKCkgewotICAgIHJldHVybiAmZ0hvb2tzRGVidWc7Ci19Ci0KLX07Ci19OwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9ob29rcy5oIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9ob29rcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTQ2YTA5Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfaG9va3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19HTERfSE9PS1NfSF8KLSNkZWZpbmUgX19HTERfSE9PS1NfSF8KLQotI2luY2x1ZGUgImhvb2tzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBnbHRyYWNlIHsKLQotdXNpbmcgOjphbmRyb2lkOjpnbF9ob29rc190OwotCi1nbF9ob29rc190ICpnZXRHTEhvb2tzKCk7Ci0KLX07Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfdHJhbnNwb3J0LmNwcCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfdHJhbnNwb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1MWIxMi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX3RyYW5zcG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy91bi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLQotI2luY2x1ZGUgImdsdHJhY2VfdHJhbnNwb3J0LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBnbHRyYWNlIHsKLQotaW50IGFjY2VwdENsaWVudENvbm5lY3Rpb24oY2hhciAqc29ja25hbWUpIHsKLSAgICBpbnQgc2VydmVyU29ja2V0ID0gc29ja2V0KEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCk7Ci0gICAgaWYgKHNlcnZlclNvY2tldCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkVycm9yICglZCkgd2hpbGUgY3JlYXRpbmcgc29ja2V0LiBDaGVjayBpZiBhcHAgaGFzIG5ldHdvcmsgcGVybWlzc2lvbnMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc3RydWN0IHNvY2thZGRyX3VuIHNlcnZlciwgY2xpZW50OwotCi0gICAgbWVtc2V0KCZzZXJ2ZXIsIDAsIHNpemVvZiBzZXJ2ZXIpOwotICAgIHNlcnZlci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLSAgICAvLyB0aGUgZmlyc3QgYnl0ZSBvZiBzdW5fcGF0aCBzaG91bGQgYmUgJ1wwJyBmb3IgYWJzdHJhY3QgbmFtZXNwYWNlCi0gICAgc3RyY3B5KHNlcnZlci5zdW5fcGF0aCArIDEsIHNvY2tuYW1lKTsKLQotICAgIC8vIG5vdGUgdGhhdCBzb2NrYWRkcl9sZW4gc2hvdWxkIGJlIHNldCB0byB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgYnVmZmVyIHRoYXQgaXMgdXNlZC4KLSAgICBzb2NrbGVuX3Qgc29ja2FkZHJfbGVuID0gc2l6ZW9mKHNlcnZlci5zdW5fZmFtaWx5KSArIHN0cmxlbihzb2NrbmFtZSkgKyAxOwotICAgIGlmIChiaW5kKHNlcnZlclNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyLCBzb2NrYWRkcl9sZW4pIDwgMCkgewotICAgICAgICBjbG9zZShzZXJ2ZXJTb2NrZXQpOwotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGJpbmQgdGhlIHNlcnZlciBzb2NrZXQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmIChsaXN0ZW4oc2VydmVyU29ja2V0LCAxKSA8IDApIHsKLSAgICAgICAgY2xvc2Uoc2VydmVyU29ja2V0KTsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBsaXN0ZW4gb24gc2VydmVyIHNvY2tldCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgQUxPR0QoImdsdHJhY2U6OndhaXRGb3JDbGllbnRDb25uZWN0aW9uOiBzZXJ2ZXIgbGlzdGVuaW5nIEAgcGF0aCAlcyIsIHNvY2tuYW1lKTsKLQotICAgIGludCBjbGllbnRTb2NrZXQgPSBhY2NlcHQoc2VydmVyU29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopJmNsaWVudCwgJnNvY2thZGRyX2xlbik7Ci0gICAgaWYgKGNsaWVudFNvY2tldCA8IDApIHsKLSAgICAgICAgY2xvc2Uoc2VydmVyU29ja2V0KTsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY2NlcHQgY2xpZW50IGNvbm5lY3Rpb24iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIEFMT0dEKCJnbHRyYWNlOjp3YWl0Rm9yQ2xpZW50Q29ubmVjdGlvbjogY2xpZW50IGNvbm5lY3RlZC4iKTsKLQotICAgIC8vIGRvIG5vdCBhY2NlcHQgYW55IG1vcmUgaW5jb21pbmcgY29ubmVjdGlvbnMKLSAgICBjbG9zZShzZXJ2ZXJTb2NrZXQpOwotCi0gICAgcmV0dXJuIGNsaWVudFNvY2tldDsKLX0KLQotVENQU3RyZWFtOjpUQ1BTdHJlYW0oaW50IHNvY2tldCkgewotICAgIG1Tb2NrZXQgPSBzb2NrZXQ7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZtU29ja2V0V3JpdGVNdXRleCwgTlVMTCk7Ci19Ci0KLVRDUFN0cmVhbTo6flRDUFN0cmVhbSgpIHsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1Tb2NrZXRXcml0ZU11dGV4KTsKLX0KLQotdm9pZCBUQ1BTdHJlYW06OmNsb3NlU3RyZWFtKCkgewotICAgIGlmIChtU29ja2V0ID4gMCkgewotICAgICAgICBjbG9zZShtU29ja2V0KTsKLSAgICAgICAgbVNvY2tldCA9IDA7Ci0gICAgfQotfQotCi1pbnQgVENQU3RyZWFtOjpzZW5kKHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikgewotICAgIGlmIChtU29ja2V0IDw9IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbVNvY2tldFdyaXRlTXV0ZXgpOwotICAgIGludCBuID0gd3JpdGUobVNvY2tldCwgYnVmLCBsZW4pOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtU29ja2V0V3JpdGVNdXRleCk7Ci0KLSAgICByZXR1cm4gbjsKLX0KLQotaW50IFRDUFN0cmVhbTo6cmVjZWl2ZSh2b2lkICpkYXRhLCBzaXplX3QgbGVuKSB7Ci0gICAgaWYgKG1Tb2NrZXQgPD0gMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlYWQobVNvY2tldCwgZGF0YSwgbGVuKTsKLX0KLQotQnVmZmVyZWRPdXRwdXRTdHJlYW06OkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKFRDUFN0cmVhbSAqc3RyZWFtLCBzaXplX3QgYnVmZmVyU2l6ZSkgewotICAgIG1TdHJlYW0gPSBzdHJlYW07Ci0KLSAgICBtQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7Ci0gICAgbVN0cmluZ0J1ZmZlciA9ICIiOwotICAgIG1TdHJpbmdCdWZmZXIucmVzZXJ2ZShidWZmZXJTaXplKTsKLX0KLQotaW50IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmluZ0J1ZmZlci5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpbnQgbiA9IG1TdHJlYW0tPnNlbmQoKHZvaWQgKiltU3RyaW5nQnVmZmVyLmRhdGEoKSwgbVN0cmluZ0J1ZmZlci5zaXplKCkpOwotICAgIG1TdHJpbmdCdWZmZXIuY2xlYXIoKTsKLSAgICByZXR1cm4gbjsKLX0KLQotdm9pZCBCdWZmZXJlZE91dHB1dFN0cmVhbTo6ZW5xdWV1ZU1lc3NhZ2UoR0xNZXNzYWdlICptc2cpIHsKLSAgICBjb25zdCB1aW50MzJfdCBsZW4gPSBtc2ctPkJ5dGVTaXplKCk7Ci0KLSAgICBtU3RyaW5nQnVmZmVyLmFwcGVuZCgoY29uc3QgY2hhciAqKSZsZW4sIHNpemVvZihsZW4pKTsgICAgLy8gYXBwZW5kIGhlYWRlcgotICAgIG1zZy0+QXBwZW5kVG9TdHJpbmcoJm1TdHJpbmdCdWZmZXIpOyAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmQgbWVzc2FnZQotfQotCi1pbnQgQnVmZmVyZWRPdXRwdXRTdHJlYW06OnNlbmQoR0xNZXNzYWdlICptc2cpIHsKLSAgICBlbnF1ZXVlTWVzc2FnZShtc2cpOwotCi0gICAgaWYgKG1TdHJpbmdCdWZmZXIuc2l6ZSgpID4gbUJ1ZmZlclNpemUpIHsKLSAgICAgICAgcmV0dXJuIGZsdXNoKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLX07ICAvLyBuYW1lc3BhY2UgZ2x0cmFjZQotfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX3RyYW5zcG9ydC5oIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV90cmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2NTAzNS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX3RyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0dMVFJBQ0VfVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9fR0xUUkFDRV9UUkFOU1BPUlRfSF8KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgImdsdHJhY2UucGIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGdsdHJhY2UgewotCi0vKioKLSAqIFRDUFN0cmVhbSBwcm92aWRlcyBhIFRDUCBiYXNlZCBjb21tdW5pY2F0aW9uIGNoYW5uZWwgZnJvbSB0aGUgZGV2aWNlIHRvCi0gKiB0aGUgaG9zdCBmb3IgdHJhbnNmZXJyaW5nIEdMTWVzc2FnZXMuCi0gKi8KLWNsYXNzIFRDUFN0cmVhbSB7Ci0gICAgaW50IG1Tb2NrZXQ7Ci0gICAgcHRocmVhZF9tdXRleF90IG1Tb2NrZXRXcml0ZU11dGV4OwotcHVibGljOgotICAgIC8qKiBDcmVhdGUgYSBUQ1AgYmFzZWQgY29tbXVuaWNhdGlvbiBjaGFubmVsIG92ZXIgQHNvY2tldCAqLwotICAgIFRDUFN0cmVhbShpbnQgc29ja2V0KTsKLSAgICB+VENQU3RyZWFtKCk7Ci0KLSAgICAvKiogQ2xvc2UgdGhlIGNoYW5uZWwuICovCi0gICAgdm9pZCBjbG9zZVN0cmVhbSgpOwotCi0gICAgLyoqIFNlbmQgQGRhdGEgb2Ygc2l6ZSBAbGVuIHRvIGhvc3QuIC4gUmV0dXJucyAtMSBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLiAqLwotICAgIGludCBzZW5kKHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOwotCi0gICAgLyoqIFJlY2VpdmUgZGF0YSBpbnRvIEBidWYgZnJvbSB0aGUgcmVtb3RlIGVuZC4gVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuICovCi0gICAgaW50IHJlY2VpdmUodm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci19OwotCi0vKioKLSAqIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIHByb3ZpZGVzIGJ1ZmZlcmluZyBvZiBkYXRhIHNlbnQgdG8gdGhlIHVuZGVybHlpbmcKLSAqIHVuYnVmZmVyZWQgY2hhbm5lbC4KLSAqLwotY2xhc3MgQnVmZmVyZWRPdXRwdXRTdHJlYW0gewotICAgIFRDUFN0cmVhbSAqbVN0cmVhbTsKLQotICAgIHNpemVfdCBtQnVmZmVyU2l6ZTsKLSAgICBzdGQ6OnN0cmluZyBtU3RyaW5nQnVmZmVyOwotCi0gICAgLyoqIEVucXVldWUgbWVzc2FnZSBpbnRvIGludGVybmFsIGJ1ZmZlci4gKi8KLSAgICB2b2lkIGVucXVldWVNZXNzYWdlKEdMTWVzc2FnZSAqbXNnKTsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBCdWZmZXJlZCBzdHJlYW0gb2Ygc2l6ZSBAYnVmZmVyU2l6ZSwgdXNpbmcgQHN0cmVhbSBhcwotICAgICAqIGl0cyB1bmRlcmx5aW5nIGNoYW5uZWwgZm9yIHRyYW5zcG9ydC4KLSAgICAgKi8KLSAgICBCdWZmZXJlZE91dHB1dFN0cmVhbShUQ1BTdHJlYW0gKnN0cmVhbSwgc2l6ZV90IGJ1ZmZlclNpemUpOwotCi0gICAgLyoqCi0gICAgICogU2VuZCBAbXNnLiBUaGUgbWVzc2FnZSBjb3VsZCBiZSBidWZmZXJlZCBhbmQgc2VudCBsYXRlciB3aXRoIGEKLSAgICAgKiBzdWJzZXF1ZW50IG1lc3NhZ2UuIFJldHVybnMgLTEgb24gZXJyb3IsIDAgb24gc3VjY2Vzcy4KLSAgICAgKi8KLSAgICBpbnQgc2VuZChHTE1lc3NhZ2UgKm1zZyk7Ci0KLSAgICAvKiogU2VuZCBhbnkgYnVmZmVyZWQgbWVzc2FnZXMsIHJldHVybnMgLTEgb24gZXJyb3IsIDAgb24gc3VjY2Vzcy4gKi8KLSAgICBpbnQgZmx1c2goKTsKLX07Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2Q6IHN0YXJ0IGEgc2VydmVyIGxpc3RlbmluZyBhdCBAc29ja05hbWUgKHVuaXggZG9tYWluIHNvY2tldCwKLSAqIGFic3RyYWN0IG5hbWVzcGFjZSBwYXRoKSwgYW5kIHdhaXQgZm9yIGEgY2xpZW50IGNvbm5lY3Rpb24uCi0gKiBSZXR1cm5zIHRoZSBjb25uZWN0ZWQgY2xpZW50IHNvY2tldCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLgotICovCi1pbnQgYWNjZXB0Q2xpZW50Q29ubmVjdGlvbihjaGFyICpzb2NrTmFtZSk7Ci0KLX07Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvdG9vbHMvZ2VuYXBpLnB5IGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS90b29scy9nZW5hcGkucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0MDM0YzEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS90b29scy9nZW5hcGkucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgQUJPVVQKLSMgICBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSB0cmFjZSBpbXBsZW1lbnRhdGlvbnMgb2YgYWxsCi0jICAgT3BlbkdMIGNhbGxzLiBXaGVuIGV4ZWN1dGVkLCBpdCByZWFkcyB0aGUgc3BlY3MgZm9yIHRoZSBPcGVuR0wgY2FsbHMKLSMgICBmcm9tIHRoZSBmaWxlcyBHTEVTMi9nbDJfYXBpLmluLCBHTEVTMi9nbDJleHRfYXBpLmluLCBHTEVTX0NNL2dsX2FwaS5pbiwKLSMgICBhbmQgR0xFU19DTS9nbGV4dF9hcGkuaW4sIGFuZCBnZW5lcmF0ZXMgdHJhY2UgdmVyc2lvbnMgZm9yIGFsbCB0aGUgCi0jICAgZGVmaW5lZCBmdW5jdGlvbnMuCi0jCi0jIFBSRVJFUVVJU0lURVMKLSMgICBUbyBnZW5lcmF0ZSBDKysgZmlsZXMsIHRoaXMgc2NyaXB0IHVzZXMgdGhlICdweXJhdGVtcCcgdGVtcGxhdGUKLSMgICBtb2R1bGUuIFRoZSBvbmx5IHJlYXNvbiB0byB1c2UgcHlyYXRlbXAgaXMgdGhhdCBpdCBpcyBleHRyZW1seQotIyAgIHNpbXBsZSB0byBpbnN0YWxsOgotIyAgICQgd2dldCBodHRwOi8vd3d3LnNpbXBsZS1pcy1iZXR0ZXIub3JnL3RlbXBsYXRlL3B5cmF0ZW1wLWN1cnJlbnQvcHlyYXRlbXAucHkKLSMgICBQdXQgdGhlIGZpbGUgaW4gdGhlIEdMRVNfdHJhY2UvdG9vbHMgZm9sZGVyLCBvciB1cGRhdGUgUFlUSE9OUEFUSAotIyAgIHRvIHBvaW50IHRvIHdoZXJldmVyIGl0IHdhcyBkb3dubG9hZGVkLgotIwotIyBVU0FHRQotIyAgICQgY2QgR0xFU190cmFjZSAgICAgICAtIHJ1biB0aGUgcHJvZ3JhbSBmcm9tIEdMRVMyX3RyYWNlIGZvbGRlcgotIyAgICQgLi90b29scy9nZW5hcGkucHkgICAtIGdlbmVyYXRlcyBhIC5jcHAgYW5kIC5oIGZpbGUKLSMgICAkIG12ICouY3BwICouaCBzcmMvICAgLSBtb3ZlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgaW50byB0aGUgc3JjIGZvbGRlcgotCi1pbXBvcnQgc3lzCi1pbXBvcnQgcmUKLWltcG9ydCBweXJhdGVtcAotCi0jIENvbnN0YW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm90b2J1ZiBEYXRhVHlwZS5UeXBlCi1jbGFzcyBEYXRhVHlwZToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6Ci0gICAgICAgIHNlbGYubmFtZSA9IG5hbWUKLQotICAgIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgICAgICBpZiBzZWxmLm5hbWUgPT0gInBvaW50ZXIiOiAgIyBwb2ludGVycyBtYXAgdG8gdGhlIElOVCBEYXRhVHlwZQotICAgICAgICAgICAgcmV0dXJuICJJTlQiCi0gICAgICAgIHJldHVybiBzZWxmLm5hbWUudXBwZXIoKQotCi0gICAgZGVmIGdldFByb3RvYnVmQ2FsbChzZWxmKToKLSAgICAgICAgaWYgc2VsZi5uYW1lID09ICJ2b2lkIjoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkF0dGVtcHQgdG8gc2V0IHZvaWQgdmFsdWUiKQotICAgICAgICBlbGlmIHNlbGYubmFtZSA9PSAiY2hhciIgb3Igc2VsZi5uYW1lID09ICJieXRlIiBcCi0gICAgICAgICAgICAgICAgb3Igc2VsZi5uYW1lID09ICJwb2ludGVyIiBvciBzZWxmLm5hbWUgPT0gImVudW0iOgotICAgICAgICAgICAgcmV0dXJuICJhZGRfaW50dmFsdWUoKGludCkiCi0gICAgICAgIGVsaWYgc2VsZi5uYW1lID09ICJpbnQiOgotICAgICAgICAgICAgcmV0dXJuICJhZGRfaW50dmFsdWUoIgotICAgICAgICBlbGlmIHNlbGYubmFtZSA9PSAiZmxvYXQiOgotICAgICAgICAgICAgcmV0dXJuICJhZGRfZmxvYXR2YWx1ZSgiCi0gICAgICAgIGVsaWYgc2VsZi5uYW1lID09ICJib29sIjoKLSAgICAgICAgICAgIHJldHVybiAiYWRkX2Jvb2x2YWx1ZSgiCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmtub3duIHZhbHVlIHR5cGUgJXMiICUgc2VsZi5uYW1lKQotCi1EYXRhVHlwZS5WT0lEID0gRGF0YVR5cGUoInZvaWQiKQotRGF0YVR5cGUuQ0hBUiA9IERhdGFUeXBlKCJjaGFyIikKLURhdGFUeXBlLkJZVEUgPSBEYXRhVHlwZSgiYnl0ZSIpCi1EYXRhVHlwZS5FTlVNID0gRGF0YVR5cGUoImVudW0iKQotRGF0YVR5cGUuQk9PTCA9IERhdGFUeXBlKCJib29sIikKLURhdGFUeXBlLklOVCA9IERhdGFUeXBlKCJpbnQiKQotRGF0YVR5cGUuRkxPQVQgPSBEYXRhVHlwZSgiZmxvYXQiKQotRGF0YVR5cGUuUE9JTlRFUiA9IERhdGFUeXBlKCJwb2ludGVyIikKLQotIyBtYXBwaW5nIG9mIEdMIHR5cGVzIHRvIHByb3RvYnVmIERhdGFUeXBlCi1HTDJQUk9UT0JVRl9UWVBFX01BUCA9IHsKLSAgICAiR0x2b2lkIjpEYXRhVHlwZS5WT0lELAotICAgICJ2b2lkIjpEYXRhVHlwZS5WT0lELAotICAgICJHTGNoYXIiOkRhdGFUeXBlLkNIQVIsCi0gICAgIkdMZW51bSI6RGF0YVR5cGUuRU5VTSwKLSAgICAiR0xib29sZWFuIjpEYXRhVHlwZS5CT09MLAotICAgICJHTGJpdGZpZWxkIjpEYXRhVHlwZS5JTlQsCi0gICAgIkdMYnl0ZSI6RGF0YVR5cGUuQllURSwKLSAgICAiR0xzaG9ydCI6RGF0YVR5cGUuSU5ULAotICAgICJHTGludCI6RGF0YVR5cGUuSU5ULAotICAgICJpbnQiOkRhdGFUeXBlLklOVCwKLSAgICAiR0xzaXplaSI6RGF0YVR5cGUuSU5ULAotICAgICJHTHVieXRlIjpEYXRhVHlwZS5CWVRFLAotICAgICJHTHVzaG9ydCI6RGF0YVR5cGUuSU5ULAotICAgICJHTHVpbnQiOkRhdGFUeXBlLklOVCwKLSAgICAiR0xmbG9hdCI6RGF0YVR5cGUuRkxPQVQsCi0gICAgIkdMY2xhbXBmIjpEYXRhVHlwZS5GTE9BVCwKLSAgICAiR0xmaXhlZCI6RGF0YVR5cGUuSU5ULAotICAgICJHTGNsYW1weCI6RGF0YVR5cGUuSU5ULAotICAgICJHTHNpemVpcHRyIjpEYXRhVHlwZS5JTlQsCi0gICAgIkdMaW50cHRyIjpEYXRhVHlwZS5JTlQsCi0gICAgIkdMZWdsSW1hZ2VPRVMiOkRhdGFUeXBlLlBPSU5URVIsCi19Ci0KLUFQSV9TUEVDUyA9IFsKLSAgICAoJ0dMMicsJy4uL0dMRVMyL2dsMl9hcGkuaW4nKSwKLSAgICAoJ0dMMkV4dCcsJy4uL0dMRVMyL2dsMmV4dF9hcGkuaW4nKSwKLSAgICAoJ0dMMScsJy4uL0dMRVNfQ00vZ2xfYXBpLmluJyksCi0gICAgKCdHTDFFeHQnLCcuLi9HTEVTX0NNL2dsZXh0X2FwaS5pbicpLAotXQotCi1IRUFERVJfTElDRU5TRSA9ICIiIi8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIFRISVMgRklMRSBXQVMgR0VORVJBVEVEIEJZIEEgU0NSSVBULiBETyBOT1QgRURJVC4KLSAqLwotIiIiCi0KLUhFQURFUl9JTkNMVURFUyA9ICIiIgotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLQotI2luY2x1ZGUgImdsdHJhY2UucGIuaCIKLSNpbmNsdWRlICJnbHRyYWNlX2NvbnRleHQuaCIKLSNpbmNsdWRlICJnbHRyYWNlX2ZpeHVwLmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV90cmFuc3BvcnQuaCIKLSIiIgotCi1IRUFERVJfTkFNRVNQQUNFX1NUQVJUID0gIiIiCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgZ2x0cmFjZSB7Ci0iIiIKLQotRk9PVEVSX1RFWFQgPSAiIiIKLX07IC8vIG5hbWVzcGFjZSBnbHRyYWNlCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotIiIiCi0KLVRSQUNFX0NBTExfVEVNUExBVEUgPSBweXJhdGVtcC5UZW1wbGF0ZSgKLSIiIiQhcmV0VHlwZSEkIEdMVHJhY2VfJCFmdW5jISQoJCFpbnB1dEFyZ0xpc3QhJCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OiQhZnVuYyEkKTsKLTwhLS0oaWYgbGVuKHBhcnNlZEFyZ3MpID4gMCktLT4KLSAgICA8IS0tKGZvciBhcmduYW1lLCBhcmd0eXBlIGluIHBhcnNlZEFyZ3MpLS0+Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50ICQhYXJnbmFtZSEkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfJCFhcmduYW1lISQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ18kIWFyZ25hbWUhJC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ18kIWFyZ25hbWUhJC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6JCFhcmd0eXBlISQpOwotICAgIGFyZ18kIWFyZ25hbWUhJC0+JCFhcmd0eXBlLmdldFByb3RvYnVmQ2FsbCgpISQkIWFyZ25hbWUhJCk7Ci0gICAgPCEtLShlbmQpLS0+Ci08IS0tKGVuZCktLT4KLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci08IS0tKGlmIHJldFR5cGUgIT0gInZvaWQiKS0tPgotICAgICQhcmV0VHlwZSEkIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuJCFjYWxsc2l0ZSEkOwotPCEtLShlbHNlKS0tPgotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLiQhY2FsbHNpdGUhJDsKLTwhLS0oZW5kKS0tPgotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotPCEtLShpZiByZXRUeXBlICE9ICJ2b2lkIiktLT4KLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OiQhcmV0RGF0YVR5cGUhJCk7Ci0gICAgcnQtPiQhcmV0RGF0YVR5cGUuZ2V0UHJvdG9idWZDYWxsKCkhJHJldFZhbHVlKTsKLTwhLS0oZW5kKS0tPgotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLTwhLS0oZm9yIGFyZ25hbWUsIGFyZ3R5cGUgaW4gcGFyc2VkQXJncyktLT4KLSAgICA8IS0tKGlmIGFyZ3R5cGUgPT0gRGF0YVR5cGUuUE9JTlRFUiktLT4KLSAgICAgICAgKHZvaWQgKikgJCFhcmduYW1lISQsCi0gICAgPCEtLShlbmQpLS0+Ci08IS0tKGVuZCktLT4KLTwhLS0oaWYgcmV0RGF0YVR5cGUgPT0gRGF0YVR5cGUuUE9JTlRFUiktLT4KLSAgICAgICAgKHZvaWQgKikgcmV0VmFsdWUsCi08IS0tKGVuZCktLT4KLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLTwhLS0oaWYgcmV0VHlwZSAhPSAidm9pZCIpLS0+Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci08IS0tKGVuZCktLT4KLX0KLSIiIikKLQotZGVmIGdldERhdGFUeXBlRnJvbUt3KGt3KToKLSAgICAiIiIgR2V0IHRoZSBkYXRhIHR5cGUgZ2l2ZW4gZGVjbGFyYXRpb24uCi0gICAgQWxsIHBvaW50ZXIgZGVjbGFyYXRpb25zIGFyZSBvZiB0eXBlIERhdGFUeXBlLlBPSU5URVIKLQotICAgIGUuZy46IEdMdm9pZCAtPiBEYXRhVHlwZS5WT0lEIiIiCi0KLSAgICBpZiBrdy5jb3VudCgnKicpID4gMDoKLSAgICAgICAgcmV0dXJuIERhdGFUeXBlLlBPSU5URVIKLSAgICByZXR1cm4gR0wyUFJPVE9CVUZfVFlQRV9NQVAuZ2V0KGt3KQotCi1kZWYgZ2V0TmFtZVR5cGVQYWlyKGRlY2wpOgotICAgICIiIiBTcGxpdCBkZWNsYXJhdGlvbiBvZiBhIHZhcmlhYmxlIHRvIGEgdHVwbGUgb2YgKHZhcmlhYmxlIG5hbWUsIERhdGFUeXBlKS4KLSAgICBlLmcuICJjb25zdCBHTENoYXIqIHZhck5hbWUiIC0+ICh2YXJOYW1lLCBQT0lOVEVSKSAiIiIKLSAgICBlbGVtZW50cyA9IGRlY2wuc3RyaXAoKS5zcGxpdCgnICcpCi0gICAgbmFtZSA9IE5vbmUKLSAgICBpZiBsZW4oZWxlbWVudHMpID4gMToKLSAgICAgICAgbmFtZSA9ICIgIi5qb2luKGVsZW1lbnRzWy0xOl0pLnN0cmlwKCkgICAgICAjIGxhc3QgZWxlbWVudCBpcyB0aGUgbmFtZQotICAgICAgICBkYXRhVHlwZSA9ICIgIi5qb2luKGVsZW1lbnRzWzotMV0pLnN0cmlwKCkgICMgZXZlcnl0aGluZyBlbHNlIGlzIHRoZSBkYXRhIHR5cGUKLQotICAgICAgICAjIGlmIG5hbWUgaXMgYSBwb2ludGVyIChlLmcuICIqcHRyIiksIHRoZW4gcmVtb3ZlIHRoZSAiKiIgZnJvbSB0aGUgbmFtZQotICAgICAgICAjIGFuZCBhZGQgaXQgdG8gdGhlIGRhdGEgdHlwZQotICAgICAgICBwb2ludGVyc0luTmFtZSA9IG5hbWUuY291bnQoIioiKSAgICAgICAgICAgIAotICAgICAgICBpZiBwb2ludGVyc0luTmFtZSA+IDA6Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCIqIiwgIiIpCi0gICAgICAgICAgICBkYXRhVHlwZSArPSAiKiIgKiBwb2ludGVyc0luTmFtZQotCi0gICAgICAgICMgaWYgbmFtZSBpcyBhbiBhcnJheSAoZS5nLiAiYXJyYXlbMTBdIiksIHRoZW4gcmVtb3ZlIHRoZSAiW1hdIiBmcm9tIHRoZSBuYW1lCi0gICAgICAgICMgYW5kIG1ha2UgdGhlIGRhdGF0eXBlIHRvIGJlIGEgcG9pbnRlcgotICAgICAgICBhcnJheXNJbk5hbWUgPSBuYW1lLmNvdW50KCJbIikKLSAgICAgICAgaWYgYXJyYXlzSW5OYW1lID4gMDoKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lLnNwbGl0KCdbJylbMF0KLSAgICAgICAgICAgIGRhdGFUeXBlICs9ICIqIgotICAgIGVsc2U6Ci0gICAgICAgIGRhdGFUeXBlID0gZWxlbWVudHNbMF0KLSAgICByZXR1cm4gKG5hbWUsIGdldERhdGFUeXBlRnJvbUt3KGRhdGFUeXBlKSkKLQotZGVmIHBhcnNlQXJncyhhcmdsaXN0KToKLSAgICAiIiIgUGFyc2UgdGhlIGFyZ3VtZW50IGxpc3QgaW50byBhIGxpc3Qgb2YgKHZhciBuYW1lLCBEYXRhVHlwZSkgdHVwbGVzICIiIgotICAgIGFyZ3MgPSBhcmdsaXN0LnNwbGl0KCcsJykKLSAgICBhcmdzID0gbWFwKGxhbWJkYSB4OiB4LnN0cmlwKCksIGFyZ3MpICAgICMgcmVtb3ZlIHVubmVjZXNzYXJ5IHdoaXRlc3BhY2VzCi0gICAgYXJndHlwZWxpc3QgPSBtYXAoZ2V0TmFtZVR5cGVQYWlyLCBhcmdzKSAjIHNwbGl0IGFyZyBpbnRvIGFyZyB0eXBlIGFuZCBhcmcgbmFtZQotICAgIGlmIGxlbihhcmd0eXBlbGlzdCkgPT0gMToKLSAgICAgICAgKG5hbWUsIGFyZ3R5cGUpID0gYXJndHlwZWxpc3RbMF0KLSAgICAgICAgaWYgYXJndHlwZSA9PSBEYXRhVHlwZS5WT0lEOgotICAgICAgICAgICAgcmV0dXJuIFtdCi0KLSAgICByZXR1cm4gYXJndHlwZWxpc3QKLQotY2xhc3MgQXBpQ2FsbChvYmplY3QpOgotICAgICIiIkFuIEFwaUNhbGwgbW9kZWxzIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBPcGVuR0wgQVBJIiIiCi0KLSAgICAjIFJlZ2V4IHRvIG1hdGNoIEFQSV9FTlRSWSBzcGVjaWZpY2F0aW9uOgotICAgICMgICAgICAgZS5nLiB2b2lkIEFQSV9FTlRSWShnbEFjdGl2ZVRleHR1cmUpKEdMZW51bSB0ZXh0dXJlKSB7Ci0gICAgIyB0aGUgcmVnZXggdXNlcyBhIG5vbiBncmVlZHkgbWF0Y2ggKD8pIHRvIG1hdGNoIHRoZSBmaXJzdCBjbG9zaW5nIHBhcmVuCi0gICAgQVBJX0VOVFJZX1JFR0VYID0gIiguKilBUElfRU5UUllcKC4qP1wpXCgoLio/KVwpIgotCi0gICAgIyBSZWdleCB0byBtYXRjaCBDQUxMX0dMX0FQSSBzcGVjaWZpY2F0aW9uOgotICAgICMgICAgICAgZS5nLiBDQUxMX0dMX0FQSShnbEN1bGxGYWNlLCBtb2RlKTsgCi0gICAgIyAgICAgICAgICAgIENBTExfR0xfQVBJX1JFVFVSTihnbENyZWF0ZVByb2dyYW0pOwotICAgIENBTExfR0xfQVBJX1JFR0VYID0gIkNBTExfR0xfQVBJKF9SRVRVUk4pP1woKC4qKVwpOyIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcmVmaXgsIGFwaWVudHJ5LCBjYWxsc2l0ZSk6Ci0gICAgICAgICIiIkNvbnN0cnVjdCBhbiBBcGlDYWxsIGZyb20gaXRzIHNwZWNpZmljYXRpb24uCi0KLSAgICAgICAgVGhlIHNwZWNpZmljYXRpb24gaXMgcHJvdmlkZWQgYnkgdGhlIHR3byBhcmd1bWVudHM6Ci0gICAgICAgIHByZWZpeDogcHJlZml4IHRvIHVzZSBmb3IgZnVuY3Rpb24gbmFtZXMKLSAgICAgICAgZGVmbjogc3BlY2lmaWNhdGlvbiBsaW5lIGNvbnRhaW5pbmcgQVBJX0VOVFJZIG1hY3JvCi0gICAgICAgICAgICAgIGUuZzogdm9pZCBBUElfRU5UUlkoZ2xBY3RpdmVUZXh0dXJlKShHTGVudW0gdGV4dHVyZSkgewotICAgICAgICBjYWxsc2l0ZTogc3BlY2lmaWNhdGlvbiBsaW5lIGNvbnRhaW5pbmcgQ0FMTF9HTF9BUEkgbWFjcm8KLSAgICAgICAgICAgICAgZS5nOiBDQUxMX0dMX0FQSShnbEFjdGl2ZVRleHR1cmUsIHRleHR1cmUpOyAgICAgICAgCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLnByZWZpeCA9IHByZWZpeAotICAgICAgICBzZWxmLnJldCA9IHNlbGYuZ2V0UmV0dXJuVHlwZShhcGllbnRyeSkKLSAgICAgICAgc2VsZi5hcmdsaXN0ID0gc2VsZi5nZXRBcmdMaXN0KGFwaWVudHJ5KQotCi0gICAgICAgICMgc29tZSBmdW5jdGlvbnMgKGUuZy4gX19nbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyksIGRlZmluZSB0aGVpcgotICAgICAgICAjIG5hbWVzIG9uZSB3YXkgaW4gdGhlIEFQSV9FTlRSWSBhbmQgYW5vdGhlciB3YXkgaW4gdGhlIENBTExfR0xfQVBJIG1hY3Jvcy4KLSAgICAgICAgIyBzbyBzZWxmLmZ1bmMgaXMgcmVhc3NpZ25lZCBiYXNlZCBvbiB3aGF0IGlzIHRoZXJlIGluIHRoZSBjYWxsIHNpdGUKLSAgICAgICAgc2VsZi5mdW5jID0gc2VsZi5nZXRGdW5jKGNhbGxzaXRlKQotICAgICAgICBzZWxmLmNhbGxzaXRlID0gc2VsZi5nZXRDYWxsU2l0ZShjYWxsc2l0ZSkKLQotICAgIGRlZiBnZXRSZXR1cm5UeXBlKHNlbGYsIGFwaWVudHJ5KToKLSAgICAgICAgJycnRXh0cmFjdCB0aGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUgQVBJX0VOVFJZIHNwZWNpZmljYXRpb24nJycKLSAgICAgICAgbSA9IHJlLnNlYXJjaChzZWxmLkFQSV9FTlRSWV9SRUdFWCwgYXBpZW50cnkpCi0gICAgICAgIGlmIG5vdCBtOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJXMgZG9lcyBub3QgbWF0Y2ggQVBJX0VOVFJZIHNwZWNpZmljYXRpb24gJXMiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChhcGllbnRyeSwgc2VsZi5BUElfRU5UUllfUkVHRVgpKQotCi0gICAgICAgIHJldHVybiBtLmdyb3VwKDEpLnN0cmlwKCkKLQotICAgIGRlZiBnZXRBcmdMaXN0KHNlbGYsIGFwaWVudHJ5KToKLSAgICAgICAgJycnRXh0cmFjdCB0aGUgYXJndW1lbnQgbGlzdCBmcm9tIHRoZSBBUElfRU5UUlkgc3BlY2lmaWNhdGlvbicnJwotICAgICAgICBtID0gcmUuc2VhcmNoKHNlbGYuQVBJX0VOVFJZX1JFR0VYLCBhcGllbnRyeSkKLSAgICAgICAgaWYgbm90IG06Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCIlcyBkb2VzIG5vdCBtYXRjaCBBUElfRU5UUlkgc3BlY2lmaWNhdGlvbiAlcyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGFwaWVudHJ5LCBzZWxmLkFQSV9FTlRSWV9SRUdFWCkpCi0KLSAgICAgICAgcmV0dXJuIG0uZ3JvdXAoMikuc3RyaXAoKQotCi0gICAgZGVmIHBhcnNlQ2FsbFNpdGUoc2VsZiwgY2FsbHNpdGUpOgotICAgICAgICBtID0gcmUuc2VhcmNoKHNlbGYuQ0FMTF9HTF9BUElfUkVHRVgsIGNhbGxzaXRlKQotICAgICAgICBpZiBub3QgbToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIiVzIGRvZXMgbm90IG1hdGNoIENBTExfR0xfQVBJIHNwZWNpZmljYXRpb24gKCVzKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoY2FsbHNpdGUsIHNlbGYuQ0FMTF9HTF9BUElfUkVHRVgpKQotCi0gICAgICAgIGFyZ2xpc3QgPSBtLmdyb3VwKDIpCi0gICAgICAgIGFyZ3MgPSBhcmdsaXN0LnNwbGl0KCcsJykKLSAgICAgICAgYXJncyA9IG1hcChsYW1iZGEgeDogeC5zdHJpcCgpLCBhcmdzKQotCi0gICAgICAgIHJldHVybiBhcmdzCi0KLSAgICBkZWYgZ2V0Q2FsbFNpdGUoc2VsZiwgY2FsbHNpdGUpOgotICAgICAgICAnJydFeHRyYWN0IHRoZSBjYWxsc2l0ZSBmcm9tIHRoZSBDQUxMX0dMX0FQSSBzcGVjaWZpY2F0aW9uJycnCi0gICAgICAgIGFyZ3MgPSBzZWxmLnBhcnNlQ2FsbFNpdGUoY2FsbHNpdGUpCi0gICAgICAgIHJldHVybiAiJXMoJXMpIiAlIChhcmdzWzBdLCAiLCAiLmpvaW4oYXJnc1sxOl0pKQotCi0gICAgZGVmIGdldEZ1bmMoc2VsZiwgY2FsbHNpdGUpOgotICAgICAgICAnJydFeHRyYWN0IHRoZSBmdW5jdGlvbiBuYW1lIGZyb20gdGhlIENBTExfR0xfQVBJIHNwZWNpZmljYXRpb24nJycKLSAgICAgICAgYXJncyA9IHNlbGYucGFyc2VDYWxsU2l0ZShjYWxsc2l0ZSkKLSAgICAgICAgcmV0dXJuIGFyZ3NbMF0KLQotICAgIGRlZiBnZW5EZWNsYXJhdGlvbihzZWxmKToKLSAgICAgICAgcmV0dXJuICIlcyBHTFRyYWNlXyVzKCVzKTsiICUgKHNlbGYucmV0LCBzZWxmLmZ1bmMsIHNlbGYuYXJnbGlzdCkKLQotICAgIGRlZiBnZW5Db2RlKHNlbGYpOgotICAgICAgICByZXR1cm4gVFJBQ0VfQ0FMTF9URU1QTEFURShmdW5jID0gc2VsZi5mdW5jLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VHlwZSA9IHNlbGYucmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXREYXRhVHlwZSA9IGdldERhdGFUeXBlRnJvbUt3KHNlbGYucmV0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRBcmdMaXN0ID0gc2VsZi5hcmdsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsc2l0ZSA9IHNlbGYuY2FsbHNpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZEFyZ3MgPSBwYXJzZUFyZ3Moc2VsZi5hcmdsaXN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGU9RGF0YVR5cGUpCi0KLWRlZiBnZXRBcGlzKGFwaUVudHJ5RmlsZSwgcHJlZml4KToKLSAgICAnJydHZXQgYSBsaXN0IG9mIGFsbCBBcGlDYWxscyBpbiBwcm92aWRlZCBzcGVjaWZpY2F0aW9uIGZpbGUnJycKLSAgICBsaW5lcyA9IG9wZW4oYXBpRW50cnlGaWxlKS5yZWFkbGluZXMoKQotCi0gICAgYXBpcyA9IFtdCi0gICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGxpbmVzKS8zKToKLSAgICAgICAgYXBpcy5hcHBlbmQoQXBpQ2FsbChwcmVmaXgsIGxpbmVzW2kqM10sIGxpbmVzW2kqMysxXSkpCi0KLSAgICByZXR1cm4gYXBpcwotCi1kZWYgcGFyc2VBbGxTcGVjcyhzcGVjcyk6Ci0gICAgYXBpcyA9IFtdCi0gICAgZm9yIG5hbWUsIHNwZWNmaWxlIGluIHNwZWNzOgotICAgICAgICBhID0gZ2V0QXBpcyhzcGVjZmlsZSwgbmFtZSkKLSAgICAgICAgcHJpbnQgJ1BhcnNlZCAlcyBBUElzIGZyb20gJXMsICMgb2YgZW50cmllcyA9ICVkJyAlIChuYW1lLCBzcGVjZmlsZSwgbGVuKGEpKQotICAgICAgICBhcGlzLmV4dGVuZChhKQotICAgIHJldHVybiBhcGlzCi0KLWRlZiByZW1vdmVEdXBsaWNhdGVzKGFwaXMpOgotICAgICcnJ1JlbW92ZSBhbGwgZHVwbGljYXRlIGZ1bmN0aW9uIGVudHJpZXMuCi0KLSAgICBUaGUgaW5wdXQgbGlzdCBjb250YWlucyBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gR0wxIGFuZCBHTDIgQVBJcy4KLSAgICBUaGlzIHdpbGwgcmV0dXJuIGEgbGlzdCB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGZpcnN0IGZ1bmN0aW9uIGlmIHRoZXJlIGFyZQotICAgIG11bHRpcGxlIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUuJycnCi0gICAgdW5pcXMgPSBbXQotICAgIGZ1bmNzID0gc2V0KCkKLSAgICBmb3IgYXBpIGluIGFwaXM6Ci0gICAgICAgIGlmIGFwaS5mdW5jIG5vdCBpbiBmdW5jczoKLSAgICAgICAgICAgIHVuaXFzLmFwcGVuZChhcGkpCi0gICAgICAgICAgICBmdW5jcy5hZGQoYXBpLmZ1bmMpCi0KLSAgICByZXR1cm4gdW5pcXMKLQotZGVmIGdlbkhlYWRlcnMoYXBpcywgZm5hbWUpOgotICAgIGxpbmVzID0gW10KLSAgICBsaW5lcy5hcHBlbmQoSEVBREVSX0xJQ0VOU0UpCi0gICAgbGluZXMuYXBwZW5kKEhFQURFUl9OQU1FU1BBQ0VfU1RBUlQpCi0gICAgcHJlZml4ID0gIiIKLSAgICBmb3IgYXBpIGluIGFwaXM6Ci0gICAgICAgIGlmIHByZWZpeCAhPSBhcGkucHJlZml4OgotICAgICAgICAgICAgbGluZXMuYXBwZW5kKCJcbi8vIERlY2xhcmF0aW9ucyBmb3IgJXMgQVBJc1xuXG4iICUgYXBpLnByZWZpeCkKLSAgICAgICAgICAgIHByZWZpeCA9IGFwaS5wcmVmaXgKLSAgICAgICAgbGluZXMuYXBwZW5kKGFwaS5nZW5EZWNsYXJhdGlvbigpKQotICAgICAgICBsaW5lcy5hcHBlbmQoIlxuIikKLSAgICBsaW5lcy5hcHBlbmQoRk9PVEVSX1RFWFQpCi0KLSAgICB3aXRoIG9wZW4oZm5hbWUsICJ3IikgYXMgZjoKLSAgICAgICAgZi53cml0ZWxpbmVzKGxpbmVzKQotCi1kZWYgZ2VuU3JjcyhhcGlzLCBmbmFtZSk6Ci0gICAgbGluZXMgPSBbXQotICAgIGxpbmVzLmFwcGVuZChIRUFERVJfTElDRU5TRSkKLSAgICBsaW5lcy5hcHBlbmQoSEVBREVSX0lOQ0xVREVTKQotICAgIGxpbmVzLmFwcGVuZChIRUFERVJfTkFNRVNQQUNFX1NUQVJUKQotICAgIHByZWZpeCA9ICIiCi0gICAgZm9yIGFwaSBpbiBhcGlzOgotICAgICAgICBpZiBwcmVmaXggIT0gYXBpLnByZWZpeDoKLSAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiXG4vLyBEZWZpbml0aW9ucyBmb3IgJXMgQVBJc1xuXG4iICUgYXBpLnByZWZpeCkKLSAgICAgICAgICAgIHByZWZpeCA9IGFwaS5wcmVmaXgKLSAgICAgICAgbGluZXMuYXBwZW5kKGFwaS5nZW5Db2RlKCkpCi0gICAgICAgIGxpbmVzLmFwcGVuZCgiXG4iKQotICAgIGxpbmVzLmFwcGVuZChGT09URVJfVEVYVCkKLQotICAgIHdpdGggb3BlbihmbmFtZSwgInciKSBhcyBmOgotICAgICAgICBmLndyaXRlbGluZXMobGluZXMpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgYXBpcyA9IHBhcnNlQWxsU3BlY3MoQVBJX1NQRUNTKSAgICAgIyByZWFkIGluIGFsbCB0aGUgc3BlY2ZpbGVzCi0gICAgYXBpcyA9IHJlbW92ZUR1cGxpY2F0ZXMoYXBpcykgICAgICAgIyByZW1vdmUgZHVwbGljYXRpb24gb2YgZnVuY3Rpb25zIGNvbW1vbiB0byBHTDEgYW5kIEdMMgotICAgIGdlbkhlYWRlcnMoYXBpcywgJ2dsdHJhY2VfYXBpLmgnKSAgIyBnZW5lcmF0ZSBoZWFkZXIgZmlsZQotICAgIGdlblNyY3MoYXBpcywgJ2dsdHJhY2VfYXBpLmNwcCcpICAgIyBnZW5lcmF0ZSBzb3VyY2UgZmlsZQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS90b29scy90ZXN0Z2VuYXBpLnB5IGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS90b29scy90ZXN0Z2VuYXBpLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTE0OTU0Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvdG9vbHMvdGVzdGdlbmFwaS5weQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jIFVTQUdFCi0jICAgJCBjZCBHTEVTX3RyYWNlL3Rvb2xzCi0jICAgJCBweXRob24gdGVzdGdlbmFwaS5weQotCi1pbXBvcnQgdW5pdHRlc3QKLWZyb20gZ2VuYXBpIGltcG9ydCBEYXRhVHlwZSwgQXBpQ2FsbCwgZ2V0QXBpcywgcGFyc2VBcmdzCi0KLWNsYXNzIFRlc3RBcGlDYWxsKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgdGVzdF9wYXJzaW5nKHNlbGYpOgotICAgICAgICBhcGllbnRyeSA9ICd2b2lkIEFQSV9FTlRSWShnbENvcHlUZXhTdWJJbWFnZTJEKShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgJyBcCi0gICAgICAgICAgICAgICAgICAgJ0dMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsICcgXAotICAgICAgICAgICAgICAgICAgICdHTHNpemVpIGhlaWdodCkgeycKLSAgICAgICAgY2FsbHNpdGUgPSAnQ0FMTF9HTF9BUEkoZ2xDb3B5VGV4SW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHgsIHksJyBcCi0gICAgICAgICAgICAgICAgICAgJ3dpZHRoLCBoZWlnaHQsIGJvcmRlcik7JwotCi0gICAgICAgIGFwaSA9IEFwaUNhbGwoIkdMIiwgYXBpZW50cnksIGNhbGxzaXRlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFwaS5mdW5jLCAiZ2xDb3B5VGV4SW1hZ2UyRCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXBpLmNhbGxzaXRlLCAnZ2xDb3B5VGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgJyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gsIHksIHdpZHRoLCBoZWlnaHQsIGJvcmRlciknKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFwaS5yZXQsICd2b2lkJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcGkuYXJnbGlzdCwgJ0dMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCAnIFwKLSAgICAgICAgICAgICAgICAgICAnR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgJyBcCi0gICAgICAgICAgICAgICAgICAgJ0dMc2l6ZWkgaGVpZ2h0JykKLQotICAgIGRlZiB0ZXN0X251bV9mdW5jdGlvbnNfcGFyc2VkKHNlbGYpOgotICAgICAgICBnbDJfYXBpcyA9IGdldEFwaXMoJy4uLy4uL0dMRVMyL2dsMl9hcGkuaW4nLCAnR0wyJykKLSAgICAgICAgZ2wyZXh0X2FwaXMgPSBnZXRBcGlzKCcuLi8uLi9HTEVTMi9nbDJleHRfYXBpLmluJywgJ0dMMkV4dCcpCi0gICAgICAgIGdsX2FwaXMgPSBnZXRBcGlzKCcuLi8uLi9HTEVTX0NNL2dsX2FwaS5pbicsICJHTDEiKQotICAgICAgICBnbGV4dF9hcGlzID0gZ2V0QXBpcygnLi4vLi4vR0xFU19DTS9nbGV4dF9hcGkuaW4nLCAnR0wxRXh0JykKLQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihnbDJfYXBpcyksIDE0MikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2wyZXh0X2FwaXMpLCAxMjEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdsX2FwaXMpLCAxNDUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdsZXh0X2FwaXMpLCAxNDApCi0KLSAgICBkZWYgdGVzdF9wYXJzZUFyZ3Moc2VsZik6Ci0gICAgICAgIGFyZ3MgPSBwYXJzZUFyZ3MoInZvaWQiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhcmdzKSwgMCkKLQotICAgICAgICBhcmdzID0gcGFyc2VBcmdzKCJHTGNoYXIgYSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgWygiYSIsIERhdGFUeXBlLkNIQVIpXSkKLQotICAgICAgICBhcmdzID0gcGFyc2VBcmdzKCJHTGNoYXIgKmEiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFsoImEiLCBEYXRhVHlwZS5QT0lOVEVSKV0pCi0KLSAgICAgICAgYXJncyA9IHBhcnNlQXJncygiR0xpbnQgZXhwb25lbnRbMTZdIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbKCJleHBvbmVudCIsIERhdGFUeXBlLlBPSU5URVIpXSkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL2RlYnVnLmluIGIvb3BlbmdsL2xpYnMvZGVidWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MmIyZGEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvZGVidWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLy8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG5vdCBkZWZpbmVkIGluIEdMRVN2Ml9kYmcKLVRSQUNFX0dMX1ZPSUQoZ2xBbHBoYUZ1bmMsIChHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKSwgKGZ1bmMsIHJlZiksIDIsICJHTGVudW0iLCBmdW5jLCAiR0xjbGFtcGYiLCByZWYpCi1UUkFDRV9HTF9WT0lEKGdsQWxwaGFGdW5jeCwgKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpLCAoZnVuYywgcmVmKSwgMiwgIkdMZW51bSIsIGZ1bmMsICJHTGNsYW1weCIsIHJlZikKLVRSQUNFX0dMX1ZPSUQoZ2xBbHBoYUZ1bmN4T0VTLCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZiksIChmdW5jLCByZWYpLCAyLCAiR0xlbnVtIiwgZnVuYywgIkdMY2xhbXB4IiwgcmVmKQotVFJBQ0VfR0xfVk9JRChnbEJlZ2luUGVyZk1vbml0b3JBTUQsIChHTHVpbnQgbW9uaXRvciksIChtb25pdG9yKSwgMSwgIkdMdWludCIsIG1vbml0b3IpCi1UUkFDRV9HTF9WT0lEKGdsQmluZEZyYW1lYnVmZmVyT0VTLCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKSwgKHRhcmdldCwgZnJhbWVidWZmZXIpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0x1aW50IiwgZnJhbWVidWZmZXIpCi1UUkFDRV9HTF9WT0lEKGdsQmluZFJlbmRlcmJ1ZmZlck9FUywgKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpLCAodGFyZ2V0LCByZW5kZXJidWZmZXIpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0x1aW50IiwgcmVuZGVyYnVmZmVyKQotVFJBQ0VfR0xfVk9JRChnbEJpbmRWZXJ0ZXhBcnJheU9FUywgKEdMdWludCBhcnJheSksIChhcnJheSksIDEsICJHTHVpbnQiLCBhcnJheSkKLVRSQUNFX0dMX1ZPSUQoZ2xCbGVuZEVxdWF0aW9uT0VTLCAoR0xlbnVtIG1vZGUpLCAobW9kZSksIDEsICJHTGVudW0iLCBtb2RlKQotVFJBQ0VfR0xfVk9JRChnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZU9FUywgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKSwgKG1vZGVSR0IsIG1vZGVBbHBoYSksIDIsICJHTGVudW0iLCBtb2RlUkdCLCAiR0xlbnVtIiwgbW9kZUFscGhhKQotVFJBQ0VfR0xfVk9JRChnbEJsZW5kRnVuY1NlcGFyYXRlT0VTLCAoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpLCAoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSksIDQsICJHTGVudW0iLCBzcmNSR0IsICJHTGVudW0iLCBkc3RSR0IsICJHTGVudW0iLCBzcmNBbHBoYSwgIkdMZW51bSIsIGRzdEFscGhhKQotVFJBQ0VfR0woR0xlbnVtLCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMsIChHTGVudW0gdGFyZ2V0KSwgKHRhcmdldCksIDEsICJHTGVudW0iLCB0YXJnZXQpCi1UUkFDRV9HTF9WT0lEKGdsQ2xlYXJDb2xvcngsIChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSksIDQsICJHTGNsYW1weCIsIHJlZCwgIkdMY2xhbXB4IiwgZ3JlZW4sICJHTGNsYW1weCIsIGJsdWUsICJHTGNsYW1weCIsIGFscGhhKQotVFJBQ0VfR0xfVk9JRChnbENsZWFyQ29sb3J4T0VTLCAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLCA0LCAiR0xjbGFtcHgiLCByZWQsICJHTGNsYW1weCIsIGdyZWVuLCAiR0xjbGFtcHgiLCBibHVlLCAiR0xjbGFtcHgiLCBhbHBoYSkKLVRSQUNFX0dMX1ZPSUQoZ2xDbGVhckRlcHRoZk9FUywgKEdMY2xhbXBmIGRlcHRoKSwgKGRlcHRoKSwgMSwgIkdMY2xhbXBmIiwgZGVwdGgpCi1UUkFDRV9HTF9WT0lEKGdsQ2xlYXJEZXB0aHgsIChHTGNsYW1weCBkZXB0aCksIChkZXB0aCksIDEsICJHTGNsYW1weCIsIGRlcHRoKQotVFJBQ0VfR0xfVk9JRChnbENsZWFyRGVwdGh4T0VTLCAoR0xjbGFtcHggZGVwdGgpLCAoZGVwdGgpLCAxLCAiR0xjbGFtcHgiLCBkZXB0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xDbGllbnRBY3RpdmVUZXh0dXJlLCAoR0xlbnVtIHRleHR1cmUpLCAodGV4dHVyZSksIDEsICJHTGVudW0iLCB0ZXh0dXJlKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZWYsIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKSwgKHBsYW5lLCBlcXVhdGlvbiksIDIsICJHTGVudW0iLCBwbGFuZSwgImNvbnN0IEdMZmxvYXQgKiIsIGVxdWF0aW9uKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZWZJTUcsIChHTGVudW0gcCwgY29uc3QgR0xmbG9hdCAqZXFuKSwgKHAsIGVxbiksIDIsICJHTGVudW0iLCBwLCAiY29uc3QgR0xmbG9hdCAqIiwgZXFuKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZWZPRVMsIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKSwgKHBsYW5lLCBlcXVhdGlvbiksIDIsICJHTGVudW0iLCBwbGFuZSwgImNvbnN0IEdMZmxvYXQgKiIsIGVxdWF0aW9uKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZXgsIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKSwgKHBsYW5lLCBlcXVhdGlvbiksIDIsICJHTGVudW0iLCBwbGFuZSwgImNvbnN0IEdMZml4ZWQgKiIsIGVxdWF0aW9uKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZXhJTUcsIChHTGVudW0gcCwgY29uc3QgR0xmaXhlZCAqZXFuKSwgKHAsIGVxbiksIDIsICJHTGVudW0iLCBwLCAiY29uc3QgR0xmaXhlZCAqIiwgZXFuKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZXhPRVMsIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKSwgKHBsYW5lLCBlcXVhdGlvbiksIDIsICJHTGVudW0iLCBwbGFuZSwgImNvbnN0IEdMZml4ZWQgKiIsIGVxdWF0aW9uKQotVFJBQ0VfR0xfVk9JRChnbENvbG9yNGYsIChHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSwgNCwgIkdMZmxvYXQiLCByZWQsICJHTGZsb2F0IiwgZ3JlZW4sICJHTGZsb2F0IiwgYmx1ZSwgIkdMZmxvYXQiLCBhbHBoYSkKLVRSQUNFX0dMX1ZPSUQoZ2xDb2xvcjR1YiwgKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLCA0LCAiR0x1Ynl0ZSIsIHJlZCwgIkdMdWJ5dGUiLCBncmVlbiwgIkdMdWJ5dGUiLCBibHVlLCAiR0x1Ynl0ZSIsIGFscGhhKQotVFJBQ0VfR0xfVk9JRChnbENvbG9yNHgsIChHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSwgNCwgIkdMZml4ZWQiLCByZWQsICJHTGZpeGVkIiwgZ3JlZW4sICJHTGZpeGVkIiwgYmx1ZSwgIkdMZml4ZWQiLCBhbHBoYSkKLVRSQUNFX0dMX1ZPSUQoZ2xDb2xvcjR4T0VTLCAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSksIDQsICJHTGZpeGVkIiwgcmVkLCAiR0xmaXhlZCIsIGdyZWVuLCAiR0xmaXhlZCIsIGJsdWUsICJHTGZpeGVkIiwgYWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQ29sb3JQb2ludGVyLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKSwgNCwgIkdMaW50Iiwgc2l6ZSwgIkdMZW51bSIsIHR5cGUsICJHTHNpemVpIiwgc3RyaWRlLCAiY29uc3QgR0x2b2lkICoiLCBwb2ludGVyKQotVFJBQ0VfR0xfVk9JRChnbENvbXByZXNzZWRUZXhJbWFnZTNET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSksICh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGJvcmRlciwgaW1hZ2VTaXplLCBkYXRhKSwgOSwgIkdMZW51bSIsIHRhcmdldCwgIkdMaW50IiwgbGV2ZWwsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTHNpemVpIiwgZGVwdGgsICJHTGludCIsIGJvcmRlciwgIkdMc2l6ZWkiLCBpbWFnZVNpemUsICJjb25zdCBHTHZvaWQqIiwgZGF0YSkKLVRSQUNFX0dMX1ZPSUQoZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSksICh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEpLCAxMSwgIkdMZW51bSIsIHRhcmdldCwgIkdMaW50IiwgbGV2ZWwsICJHTGludCIsIHhvZmZzZXQsICJHTGludCIsIHlvZmZzZXQsICJHTGludCIsIHpvZmZzZXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xzaXplaSIsIGRlcHRoLCAiR0xlbnVtIiwgZm9ybWF0LCAiR0xzaXplaSIsIGltYWdlU2l6ZSwgImNvbnN0IEdMdm9pZCoiLCBkYXRhKQotVFJBQ0VfR0xfVk9JRChnbENvcHlUZXhTdWJJbWFnZTNET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpLCA5LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnQiLCBsZXZlbCwgIkdMaW50IiwgeG9mZnNldCwgIkdMaW50IiwgeW9mZnNldCwgIkdMaW50Iiwgem9mZnNldCwgIkdMaW50IiwgeCwgIkdMaW50IiwgeSwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsQ292ZXJhZ2VNYXNrTlYsIChHTGJvb2xlYW4gbWFzayksIChtYXNrKSwgMSwgIkdMYm9vbGVhbiIsIG1hc2spCi1UUkFDRV9HTF9WT0lEKGdsQ292ZXJhZ2VPcGVyYXRpb25OViwgKEdMZW51bSBvcGVyYXRpb24pLCAob3BlcmF0aW9uKSwgMSwgIkdMZW51bSIsIG9wZXJhdGlvbikKLVRSQUNFX0dMX1ZPSUQoZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUywgKEdMdWludCBtYXRyaXhwYWxldHRlaW5kZXgpLCAobWF0cml4cGFsZXR0ZWluZGV4KSwgMSwgIkdMdWludCIsIG1hdHJpeHBhbGV0dGVpbmRleCkKLVRSQUNFX0dMX1ZPSUQoZ2xEZWxldGVGZW5jZXNOViwgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpLCAobiwgZmVuY2VzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiY29uc3QgR0x1aW50ICoiLCBmZW5jZXMpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTLCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyksIChuLCBmcmFtZWJ1ZmZlcnMpLCAyLCAiR0xzaXplaSIsIG4sICJjb25zdCBHTHVpbnQqIiwgZnJhbWVidWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbERlbGV0ZVBlcmZNb25pdG9yc0FNRCwgKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyksIChuLCBtb25pdG9ycyksIDIsICJHTHNpemVpIiwgbiwgIkdMdWludCAqIiwgbW9uaXRvcnMpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKSwgKG4sIHJlbmRlcmJ1ZmZlcnMpLCAyLCAiR0xzaXplaSIsIG4sICJjb25zdCBHTHVpbnQqIiwgcmVuZGVyYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMsIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKSwgKG4sIGFycmF5cyksIDIsICJHTHNpemVpIiwgbiwgImNvbnN0IEdMdWludCAqIiwgYXJyYXlzKQotVFJBQ0VfR0xfVk9JRChnbERlcHRoUmFuZ2VmT0VTLCAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpLCAoek5lYXIsIHpGYXIpLCAyLCAiR0xjbGFtcGYiLCB6TmVhciwgIkdMY2xhbXBmIiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xEZXB0aFJhbmdleCwgKEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKSwgKHpOZWFyLCB6RmFyKSwgMiwgIkdMY2xhbXB4Iiwgek5lYXIsICJHTGNsYW1weCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsRGVwdGhSYW5nZXhPRVMsIChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhciksICh6TmVhciwgekZhciksIDIsICJHTGNsYW1weCIsIHpOZWFyLCAiR0xjbGFtcHgiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbERpc2FibGVDbGllbnRTdGF0ZSwgKEdMZW51bSBhcnJheSksIChhcnJheSksIDEsICJHTGVudW0iLCBhcnJheSkKLVRSQUNFX0dMX1ZPSUQoZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00sIChHTHVpbnQgZHJpdmVyQ29udHJvbCksIChkcml2ZXJDb250cm9sKSwgMSwgIkdMdWludCIsIGRyaXZlckNvbnRyb2wpCi1UUkFDRV9HTF9WT0lEKGdsRGlzY2FyZEZyYW1lYnVmZmVyRVhULCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywgY29uc3QgR0xlbnVtICphdHRhY2htZW50cyksICh0YXJnZXQsIG51bUF0dGFjaG1lbnRzLCBhdHRhY2htZW50cyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTHNpemVpIiwgbnVtQXR0YWNobWVudHMsICJjb25zdCBHTGVudW0gKiIsIGF0dGFjaG1lbnRzKQotVFJBQ0VfR0xfVk9JRChnbERyYXdUZXhmT0VTLCAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQpLCAoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCksIDUsICJHTGZsb2F0IiwgeCwgIkdMZmxvYXQiLCB5LCAiR0xmbG9hdCIsIHosICJHTGZsb2F0Iiwgd2lkdGgsICJHTGZsb2F0IiwgaGVpZ2h0KQotVFJBQ0VfR0xfVk9JRChnbERyYXdUZXhmdk9FUywgKGNvbnN0IEdMZmxvYXQgKmNvb3JkcyksIChjb29yZHMpLCAxLCAiY29uc3QgR0xmbG9hdCAqIiwgY29vcmRzKQotVFJBQ0VfR0xfVk9JRChnbERyYXdUZXhpT0VTLCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCksICh4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KSwgNSwgIkdMaW50IiwgeCwgIkdMaW50IiwgeSwgIkdMaW50IiwgeiwgIkdMaW50Iiwgd2lkdGgsICJHTGludCIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4aXZPRVMsIChjb25zdCBHTGludCAqY29vcmRzKSwgKGNvb3JkcyksIDEsICJjb25zdCBHTGludCAqIiwgY29vcmRzKQotVFJBQ0VfR0xfVk9JRChnbERyYXdUZXhzT0VTLCAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQpLCAoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCksIDUsICJHTHNob3J0IiwgeCwgIkdMc2hvcnQiLCB5LCAiR0xzaG9ydCIsIHosICJHTHNob3J0Iiwgd2lkdGgsICJHTHNob3J0IiwgaGVpZ2h0KQotVFJBQ0VfR0xfVk9JRChnbERyYXdUZXhzdk9FUywgKGNvbnN0IEdMc2hvcnQgKmNvb3JkcyksIChjb29yZHMpLCAxLCAiY29uc3QgR0xzaG9ydCAqIiwgY29vcmRzKQotVFJBQ0VfR0xfVk9JRChnbERyYXdUZXh4T0VTLCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3aWR0aCwgR0xmaXhlZCBoZWlnaHQpLCAoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCksIDUsICJHTGZpeGVkIiwgeCwgIkdMZml4ZWQiLCB5LCAiR0xmaXhlZCIsIHosICJHTGZpeGVkIiwgd2lkdGgsICJHTGZpeGVkIiwgaGVpZ2h0KQotVFJBQ0VfR0xfVk9JRChnbERyYXdUZXh4dk9FUywgKGNvbnN0IEdMZml4ZWQgKmNvb3JkcyksIChjb29yZHMpLCAxLCAiY29uc3QgR0xmaXhlZCAqIiwgY29vcmRzKQotVFJBQ0VfR0xfVk9JRChnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUywgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpLCAodGFyZ2V0LCBpbWFnZSksIDIsICJHTGVudW0iLCB0YXJnZXQsICJHTGVnbEltYWdlT0VTIiwgaW1hZ2UpCi1UUkFDRV9HTF9WT0lEKGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKSwgKHRhcmdldCwgaW1hZ2UpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlZ2xJbWFnZU9FUyIsIGltYWdlKQotVFJBQ0VfR0xfVk9JRChnbEVuYWJsZUNsaWVudFN0YXRlLCAoR0xlbnVtIGFycmF5KSwgKGFycmF5KSwgMSwgIkdMZW51bSIsIGFycmF5KQotVFJBQ0VfR0xfVk9JRChnbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NLCAoR0x1aW50IGRyaXZlckNvbnRyb2wpLCAoZHJpdmVyQ29udHJvbCksIDEsICJHTHVpbnQiLCBkcml2ZXJDb250cm9sKQotVFJBQ0VfR0xfVk9JRChnbEVuZFBlcmZNb25pdG9yQU1ELCAoR0x1aW50IG1vbml0b3IpLCAobW9uaXRvciksIDEsICJHTHVpbnQiLCBtb25pdG9yKQotVFJBQ0VfR0xfVk9JRChnbEVuZFRpbGluZ1FDT00sIChHTGJpdGZpZWxkIHByZXNlcnZlTWFzayksIChwcmVzZXJ2ZU1hc2spLCAxLCAiR0xiaXRmaWVsZCIsIHByZXNlcnZlTWFzaykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00sIChHTGVudW0gdGFyZ2V0LCBHTHZvaWQgKipwYXJhbXMpLCAodGFyZ2V0LCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0x2b2lkICoqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldEJ1ZmZlcnNRQ09NLCAoR0x1aW50ICpidWZmZXJzLCBHTGludCBtYXhCdWZmZXJzLCBHTGludCAqbnVtQnVmZmVycyksIChidWZmZXJzLCBtYXhCdWZmZXJzLCBudW1CdWZmZXJzKSwgMywgIkdMdWludCAqIiwgYnVmZmVycywgIkdMaW50IiwgbWF4QnVmZmVycywgIkdMaW50ICoiLCBudW1CdWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00sIChHTHVpbnQgKmZyYW1lYnVmZmVycywgR0xpbnQgbWF4RnJhbWVidWZmZXJzLCBHTGludCAqbnVtRnJhbWVidWZmZXJzKSwgKGZyYW1lYnVmZmVycywgbWF4RnJhbWVidWZmZXJzLCBudW1GcmFtZWJ1ZmZlcnMpLCAzLCAiR0x1aW50ICoiLCBmcmFtZWJ1ZmZlcnMsICJHTGludCIsIG1heEZyYW1lYnVmZmVycywgIkdMaW50ICoiLCBudW1GcmFtZWJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00sIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKSwgKHByb2dyYW0sIHNoYWRlcnR5cGUsIHNvdXJjZSwgbGVuZ3RoKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGVudW0iLCBzaGFkZXJ0eXBlLCAiR0xjaGFyICoiLCBzb3VyY2UsICJHTGludCAqIiwgbGVuZ3RoKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldFByb2dyYW1zUUNPTSwgKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpLCAocHJvZ3JhbXMsIG1heFByb2dyYW1zLCBudW1Qcm9ncmFtcyksIDMsICJHTHVpbnQgKiIsIHByb2dyYW1zLCAiR0xpbnQiLCBtYXhQcm9ncmFtcywgIkdMaW50ICoiLCBudW1Qcm9ncmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTSwgKEdMdWludCAqcmVuZGVyYnVmZmVycywgR0xpbnQgbWF4UmVuZGVyYnVmZmVycywgR0xpbnQgKm51bVJlbmRlcmJ1ZmZlcnMpLCAocmVuZGVyYnVmZmVycywgbWF4UmVuZGVyYnVmZmVycywgbnVtUmVuZGVyYnVmZmVycyksIDMsICJHTHVpbnQgKiIsIHJlbmRlcmJ1ZmZlcnMsICJHTGludCIsIG1heFJlbmRlcmJ1ZmZlcnMsICJHTGludCAqIiwgbnVtUmVuZGVyYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRTaGFkZXJzUUNPTSwgKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpLCAoc2hhZGVycywgbWF4U2hhZGVycywgbnVtU2hhZGVycyksIDMsICJHTHVpbnQgKiIsIHNoYWRlcnMsICJHTGludCIsIG1heFNoYWRlcnMsICJHTGludCAqIiwgbnVtU2hhZGVycykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSwgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyksICh0ZXh0dXJlLCBmYWNlLCBsZXZlbCwgcG5hbWUsIHBhcmFtcyksIDUsICJHTHVpbnQiLCB0ZXh0dXJlLCAiR0xlbnVtIiwgZmFjZSwgIkdMaW50IiwgbGV2ZWwsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NLCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0ZXhlbHMpLCAodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgdHlwZSwgdGV4ZWxzKSwgMTEsICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCB4b2Zmc2V0LCAiR0xpbnQiLCB5b2Zmc2V0LCAiR0xpbnQiLCB6b2Zmc2V0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMc2l6ZWkiLCBkZXB0aCwgIkdMZW51bSIsIGZvcm1hdCwgIkdMZW51bSIsIHR5cGUsICJHTHZvaWQgKiIsIHRleGVscykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRUZXh0dXJlc1FDT00sIChHTHVpbnQgKnRleHR1cmVzLCBHTGludCBtYXhUZXh0dXJlcywgR0xpbnQgKm51bVRleHR1cmVzKSwgKHRleHR1cmVzLCBtYXhUZXh0dXJlcywgbnVtVGV4dHVyZXMpLCAzLCAiR0x1aW50ICoiLCB0ZXh0dXJlcywgIkdMaW50IiwgbWF4VGV4dHVyZXMsICJHTGludCAqIiwgbnVtVGV4dHVyZXMpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSwgKEdMdWludCBwcm9ncmFtKSwgKHByb2dyYW0pLCAxLCAiR0x1aW50IiwgcHJvZ3JhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00sIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xGaW5pc2hGZW5jZU5WLCAoR0x1aW50IGZlbmNlKSwgKGZlbmNlKSwgMSwgIkdMdWludCIsIGZlbmNlKQotVFJBQ0VfR0xfVk9JRChnbEZvZ2YsIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbEZvZ2Z2LCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xGb2d4LCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xGb2d4T0VTLCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xGb2d4diwgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsRm9neHZPRVMsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpLCAodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlciksIDQsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBhdHRhY2htZW50LCAiR0xlbnVtIiwgcmVuZGVyYnVmZmVydGFyZ2V0LCAiR0x1aW50IiwgcmVuZGVyYnVmZmVyKQotVFJBQ0VfR0xfVk9JRChnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpLCAodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsLCBzYW1wbGVzKSwgNiwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGF0dGFjaG1lbnQsICJHTGVudW0iLCB0ZXh0YXJnZXQsICJHTHVpbnQiLCB0ZXh0dXJlLCAiR0xpbnQiLCBsZXZlbCwgIkdMc2l6ZWkiLCBzYW1wbGVzKQotVFJBQ0VfR0xfVk9JRChnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCksICh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgYXR0YWNobWVudCwgIkdMZW51bSIsIHRleHRhcmdldCwgIkdMdWludCIsIHRleHR1cmUsICJHTGludCIsIGxldmVsKQotVFJBQ0VfR0xfVk9JRChnbEZyYW1lYnVmZmVyVGV4dHVyZTNET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCksICh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwsIHpvZmZzZXQpLCA2LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgYXR0YWNobWVudCwgIkdMZW51bSIsIHRleHRhcmdldCwgIkdMdWludCIsIHRleHR1cmUsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCB6b2Zmc2V0KQotVFJBQ0VfR0xfVk9JRChnbEZydXN0dW1mLCAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSwgNiwgIkdMZmxvYXQiLCBsZWZ0LCAiR0xmbG9hdCIsIHJpZ2h0LCAiR0xmbG9hdCIsIGJvdHRvbSwgIkdMZmxvYXQiLCB0b3AsICJHTGZsb2F0Iiwgek5lYXIsICJHTGZsb2F0IiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xGcnVzdHVtZk9FUywgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciksIDYsICJHTGZsb2F0IiwgbGVmdCwgIkdMZmxvYXQiLCByaWdodCwgIkdMZmxvYXQiLCBib3R0b20sICJHTGZsb2F0IiwgdG9wLCAiR0xmbG9hdCIsIHpOZWFyLCAiR0xmbG9hdCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsRnJ1c3R1bXgsIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpLCA2LCAiR0xmaXhlZCIsIGxlZnQsICJHTGZpeGVkIiwgcmlnaHQsICJHTGZpeGVkIiwgYm90dG9tLCAiR0xmaXhlZCIsIHRvcCwgIkdMZml4ZWQiLCB6TmVhciwgIkdMZml4ZWQiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbEZydXN0dW14T0VTLCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSwgNiwgIkdMZml4ZWQiLCBsZWZ0LCAiR0xmaXhlZCIsIHJpZ2h0LCAiR0xmaXhlZCIsIGJvdHRvbSwgIkdMZml4ZWQiLCB0b3AsICJHTGZpeGVkIiwgek5lYXIsICJHTGZpeGVkIiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xHZW5GZW5jZXNOViwgKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpLCAobiwgZmVuY2VzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50ICoiLCBmZW5jZXMpCi1UUkFDRV9HTF9WT0lEKGdsR2VuRnJhbWVidWZmZXJzT0VTLCAoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyksIChuLCBmcmFtZWJ1ZmZlcnMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQqIiwgZnJhbWVidWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbEdlblBlcmZNb25pdG9yc0FNRCwgKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyksIChuLCBtb25pdG9ycyksIDIsICJHTHNpemVpIiwgbiwgIkdMdWludCAqIiwgbW9uaXRvcnMpCi1UUkFDRV9HTF9WT0lEKGdsR2VuUmVuZGVyYnVmZmVyc09FUywgKEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKSwgKG4sIHJlbmRlcmJ1ZmZlcnMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQqIiwgcmVuZGVyYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xHZW5WZXJ0ZXhBcnJheXNPRVMsIChHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKSwgKG4sIGFycmF5cyksIDIsICJHTHNpemVpIiwgbiwgIkdMdWludCAqIiwgYXJyYXlzKQotVFJBQ0VfR0xfVk9JRChnbEdlbmVyYXRlTWlwbWFwT0VTLCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpLCAxLCAiR0xlbnVtIiwgdGFyZ2V0KQotVFJBQ0VfR0xfVk9JRChnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKiogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMdm9pZCAqKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRDbGlwUGxhbmVmLCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSksIChwbmFtZSwgZXFuKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCIsIGVxbikKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRDbGlwUGxhbmVmT0VTLCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSksIChwbmFtZSwgZXFuKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCIsIGVxbikKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRDbGlwUGxhbmV4LCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSksIChwbmFtZSwgZXFuKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIGVxbikKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRDbGlwUGxhbmV4T0VTLCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSksIChwbmFtZSwgZXFuKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIGVxbikKLVRSQUNFX0dMX1ZPSUQoZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTSwgKEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKSwgKGRyaXZlckNvbnRyb2wsIGJ1ZlNpemUsIGxlbmd0aCwgZHJpdmVyQ29udHJvbFN0cmluZyksIDQsICJHTHVpbnQiLCBkcml2ZXJDb250cm9sLCAiR0xzaXplaSIsIGJ1ZlNpemUsICJHTHNpemVpICoiLCBsZW5ndGgsICJHTGNoYXIgKiIsIGRyaXZlckNvbnRyb2xTdHJpbmcpCi1UUkFDRV9HTF9WT0lEKGdsR2V0RHJpdmVyQ29udHJvbHNRQ09NLCAoR0xpbnQgKm51bSwgR0xzaXplaSBzaXplLCBHTHVpbnQgKmRyaXZlckNvbnRyb2xzKSwgKG51bSwgc2l6ZSwgZHJpdmVyQ29udHJvbHMpLCAzLCAiR0xpbnQgKiIsIG51bSwgIkdMc2l6ZWkiLCBzaXplLCAiR0x1aW50ICoiLCBkcml2ZXJDb250cm9scykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRGZW5jZWl2TlYsIChHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyksIChmZW5jZSwgcG5hbWUsIHBhcmFtcyksIDMsICJHTHVpbnQiLCBmZW5jZSwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRGaXhlZHYsIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldEZpeGVkdk9FUywgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwgKHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHBhcmFtcyksIDQsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBhdHRhY2htZW50LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0TGlnaHRmdiwgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRMaWdodHh2LCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChsaWdodCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBsaWdodCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldExpZ2h0eHZPRVMsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0TWF0ZXJpYWxmdiwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyksIChmYWNlLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRNYXRlcmlhbHh2LCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldE1hdGVyaWFseHZPRVMsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAoZmFjZSwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRCwgKEdMdWludCBtb25pdG9yLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgZGF0YVNpemUsIEdMdWludCAqZGF0YSwgR0xpbnQgKmJ5dGVzV3JpdHRlbiksIChtb25pdG9yLCBwbmFtZSwgZGF0YVNpemUsIGRhdGEsIGJ5dGVzV3JpdHRlbiksIDUsICJHTHVpbnQiLCBtb25pdG9yLCAiR0xlbnVtIiwgcG5hbWUsICJHTHNpemVpIiwgZGF0YVNpemUsICJHTHVpbnQgKiIsIGRhdGEsICJHTGludCAqIiwgYnl0ZXNXcml0dGVuKQotVFJBQ0VfR0xfVk9JRChnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQsIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqZGF0YSksIChncm91cCwgY291bnRlciwgcG5hbWUsIGRhdGEpLCA0LCAiR0x1aW50IiwgZ3JvdXAsICJHTHVpbnQiLCBjb3VudGVyLCAiR0xlbnVtIiwgcG5hbWUsICJHTHZvaWQgKiIsIGRhdGEpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1ELCAoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqY291bnRlclN0cmluZyksIChncm91cCwgY291bnRlciwgYnVmU2l6ZSwgbGVuZ3RoLCBjb3VudGVyU3RyaW5nKSwgNSwgIkdMdWludCIsIGdyb3VwLCAiR0x1aW50IiwgY291bnRlciwgIkdMc2l6ZWkiLCBidWZTaXplLCAiR0xzaXplaSAqIiwgbGVuZ3RoLCAiR0xjaGFyICoiLCBjb3VudGVyU3RyaW5nKQotVFJBQ0VfR0xfVk9JRChnbEdldFBlcmZNb25pdG9yQ291bnRlcnNBTUQsIChHTHVpbnQgZ3JvdXAsIEdMaW50ICpudW1Db3VudGVycywgR0xpbnQgKm1heEFjdGl2ZUNvdW50ZXJzLCBHTHNpemVpIGNvdW50ZXJTaXplLCBHTHVpbnQgKmNvdW50ZXJzKSwgKGdyb3VwLCBudW1Db3VudGVycywgbWF4QWN0aXZlQ291bnRlcnMsIGNvdW50ZXJTaXplLCBjb3VudGVycyksIDUsICJHTHVpbnQiLCBncm91cCwgIkdMaW50ICoiLCBudW1Db3VudGVycywgIkdMaW50ICoiLCBtYXhBY3RpdmVDb3VudGVycywgIkdMc2l6ZWkiLCBjb3VudGVyU2l6ZSwgIkdMdWludCAqIiwgY291bnRlcnMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRCwgKEdMdWludCBncm91cCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZ3JvdXBTdHJpbmcpLCAoZ3JvdXAsIGJ1ZlNpemUsIGxlbmd0aCwgZ3JvdXBTdHJpbmcpLCA0LCAiR0x1aW50IiwgZ3JvdXAsICJHTHNpemVpIiwgYnVmU2l6ZSwgIkdMc2l6ZWkgKiIsIGxlbmd0aCwgIkdMY2hhciAqIiwgZ3JvdXBTdHJpbmcpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQsIChHTGludCAqbnVtR3JvdXBzLCBHTHNpemVpIGdyb3Vwc1NpemUsIEdMdWludCAqZ3JvdXBzKSwgKG51bUdyb3VwcywgZ3JvdXBzU2l6ZSwgZ3JvdXBzKSwgMywgIkdMaW50ICoiLCBudW1Hcm91cHMsICJHTHNpemVpIiwgZ3JvdXBzU2l6ZSwgIkdMdWludCAqIiwgZ3JvdXBzKQotVFJBQ0VfR0xfVk9JRChnbEdldFBvaW50ZXJ2LCAoR0xlbnVtIHBuYW1lLCBHTHZvaWQgKipwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMdm9pZCAqKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQcm9ncmFtQmluYXJ5T0VTLCAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGVudW0gKmJpbmFyeUZvcm1hdCwgR0x2b2lkICpiaW5hcnkpLCAocHJvZ3JhbSwgYnVmU2l6ZSwgbGVuZ3RoLCBiaW5hcnlGb3JtYXQsIGJpbmFyeSksIDUsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xzaXplaSIsIGJ1ZlNpemUsICJHTHNpemVpICoiLCBsZW5ndGgsICJHTGVudW0gKiIsIGJpbmFyeUZvcm1hdCwgIkdMdm9pZCAqIiwgYmluYXJ5KQotVFJBQ0VfR0xfVk9JRChnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50KiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhFbnZmdiwgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSwgKGVudiwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBlbnYsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhFbnZpdiwgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyksIChlbnYsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZW52LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleEVudnh2LCAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAoZW52LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGVudiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleEVudnh2T0VTLCAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAoZW52LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGVudiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleEdlbmZ2T0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyksIChjb29yZCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBjb29yZCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleEdlbml2T0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpLCAoY29vcmQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4R2VueHZPRVMsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGNvb3JkLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4UGFyYW1ldGVyeHYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4UGFyYW1ldGVyeHZPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNGZW5jZU5WLCAoR0x1aW50IGZlbmNlKSwgKGZlbmNlKSwgMSwgIkdMdWludCIsIGZlbmNlKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbElzRnJhbWVidWZmZXJPRVMsIChHTHVpbnQgZnJhbWVidWZmZXIpLCAoZnJhbWVidWZmZXIpLCAxLCAiR0x1aW50IiwgZnJhbWVidWZmZXIpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNSZW5kZXJidWZmZXJPRVMsIChHTHVpbnQgcmVuZGVyYnVmZmVyKSwgKHJlbmRlcmJ1ZmZlciksIDEsICJHTHVpbnQiLCByZW5kZXJidWZmZXIpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNWZXJ0ZXhBcnJheU9FUywgKEdMdWludCBhcnJheSksIChhcnJheSksIDEsICJHTHVpbnQiLCBhcnJheSkKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodE1vZGVsZiwgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRNb2RlbGZ2LCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodE1vZGVseCwgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRNb2RlbHhPRVMsIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0TW9kZWx4diwgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRNb2RlbHh2T0VTLCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodGYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksIChsaWdodCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRmdiwgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodHgsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChsaWdodCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHR4T0VTLCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAobGlnaHQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCBsaWdodCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0eHYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHR4dk9FUywgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xMaW5lV2lkdGh4LCAoR0xmaXhlZCB3aWR0aCksICh3aWR0aCksIDEsICJHTGZpeGVkIiwgd2lkdGgpCi1UUkFDRV9HTF9WT0lEKGdsTGluZVdpZHRoeE9FUywgKEdMZml4ZWQgd2lkdGgpLCAod2lkdGgpLCAxLCAiR0xmaXhlZCIsIHdpZHRoKQotVFJBQ0VfR0xfVk9JRChnbExvYWRJZGVudGl0eSwgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMX1ZPSUQoZ2xMb2FkTWF0cml4ZiwgKGNvbnN0IEdMZmxvYXQgKm0pLCAobSksIDEsICJjb25zdCBHTGZsb2F0ICoiLCBtKQotVFJBQ0VfR0xfVk9JRChnbExvYWRNYXRyaXh4LCAoY29uc3QgR0xmaXhlZCAqbSksIChtKSwgMSwgImNvbnN0IEdMZml4ZWQgKiIsIG0pCi1UUkFDRV9HTF9WT0lEKGdsTG9hZE1hdHJpeHhPRVMsIChjb25zdCBHTGZpeGVkICptKSwgKG0pLCAxLCAiY29uc3QgR0xmaXhlZCAqIiwgbSkKLVRSQUNFX0dMX1ZPSUQoZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMsICh2b2lkKSwgKCksIDApCi1UUkFDRV9HTF9WT0lEKGdsTG9naWNPcCwgKEdMZW51bSBvcGNvZGUpLCAob3Bjb2RlKSwgMSwgIkdMZW51bSIsIG9wY29kZSkKLVRSQUNFX0dMKHZvaWQqLCBnbE1hcEJ1ZmZlck9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpLCAodGFyZ2V0LCBhY2Nlc3MpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgYWNjZXNzKQotVFJBQ0VfR0xfVk9JRChnbE1hdGVyaWFsZiwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAoZmFjZSwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRlcmlhbGZ2LCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmbG9hdCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbE1hdGVyaWFseCwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAoZmFjZSwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRlcmlhbHhPRVMsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKGZhY2UsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTWF0ZXJpYWx4diwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChmYWNlLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRlcmlhbHh2T0VTLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbE1hdHJpeEluZGV4UG9pbnRlck9FUywgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciksIDQsICJHTGludCIsIHNpemUsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIHN0cmlkZSwgImNvbnN0IEdMdm9pZCAqIiwgcG9pbnRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRyaXhNb2RlLCAoR0xlbnVtIG1vZGUpLCAobW9kZSksIDEsICJHTGVudW0iLCBtb2RlKQotVFJBQ0VfR0xfVk9JRChnbE11bHRNYXRyaXhmLCAoY29uc3QgR0xmbG9hdCAqbSksIChtKSwgMSwgImNvbnN0IEdMZmxvYXQgKiIsIG0pCi1UUkFDRV9HTF9WT0lEKGdsTXVsdE1hdHJpeHgsIChjb25zdCBHTGZpeGVkICptKSwgKG0pLCAxLCAiY29uc3QgR0xmaXhlZCAqIiwgbSkKLVRSQUNFX0dMX1ZPSUQoZ2xNdWx0TWF0cml4eE9FUywgKGNvbnN0IEdMZml4ZWQgKm0pLCAobSksIDEsICJjb25zdCBHTGZpeGVkICoiLCBtKQotVFJBQ0VfR0xfVk9JRChnbE11bHRpRHJhd0FycmF5c0VYVCwgKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCksIChtb2RlLCBmaXJzdCwgY291bnQsIHByaW1jb3VudCksIDQsICJHTGVudW0iLCBtb2RlLCAiR0xpbnQgKiIsIGZpcnN0LCAiR0xzaXplaSAqIiwgY291bnQsICJHTHNpemVpIiwgcHJpbWNvdW50KQotVFJBQ0VfR0xfVk9JRChnbE11bHRpRHJhd0VsZW1lbnRzRVhULCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpLCAobW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMsIHByaW1jb3VudCksIDUsICJHTGVudW0iLCBtb2RlLCAiY29uc3QgR0xzaXplaSAqIiwgY291bnQsICJHTGVudW0iLCB0eXBlLCAiY29uc3QgR0x2b2lkKiAqIiwgaW5kaWNlcywgIkdMc2l6ZWkiLCBwcmltY291bnQpCi1UUkFDRV9HTF9WT0lEKGdsTXVsdGlUZXhDb29yZDRmLCAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKSwgKHRhcmdldCwgcywgdCwgciwgcSksIDUsICJHTGVudW0iLCB0YXJnZXQsICJHTGZsb2F0IiwgcywgIkdMZmxvYXQiLCB0LCAiR0xmbG9hdCIsIHIsICJHTGZsb2F0IiwgcSkKLVRSQUNFX0dMX1ZPSUQoZ2xNdWx0aVRleENvb3JkNHgsIChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpLCAodGFyZ2V0LCBzLCB0LCByLCBxKSwgNSwgIkdMZW51bSIsIHRhcmdldCwgIkdMZml4ZWQiLCBzLCAiR0xmaXhlZCIsIHQsICJHTGZpeGVkIiwgciwgIkdMZml4ZWQiLCBxKQotVFJBQ0VfR0xfVk9JRChnbE11bHRpVGV4Q29vcmQ0eE9FUywgKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSksICh0YXJnZXQsIHMsIHQsIHIsIHEpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xmaXhlZCIsIHMsICJHTGZpeGVkIiwgdCwgIkdMZml4ZWQiLCByLCAiR0xmaXhlZCIsIHEpCi1UUkFDRV9HTF9WT0lEKGdsTm9ybWFsM2YsIChHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KSwgKG54LCBueSwgbnopLCAzLCAiR0xmbG9hdCIsIG54LCAiR0xmbG9hdCIsIG55LCAiR0xmbG9hdCIsIG56KQotVFJBQ0VfR0xfVk9JRChnbE5vcm1hbDN4LCAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueiksIChueCwgbnksIG56KSwgMywgIkdMZml4ZWQiLCBueCwgIkdMZml4ZWQiLCBueSwgIkdMZml4ZWQiLCBueikKLVRSQUNFX0dMX1ZPSUQoZ2xOb3JtYWwzeE9FUywgKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopLCAobngsIG55LCBueiksIDMsICJHTGZpeGVkIiwgbngsICJHTGZpeGVkIiwgbnksICJHTGZpeGVkIiwgbnopCi1UUkFDRV9HTF9WT0lEKGdsTm9ybWFsUG9pbnRlciwgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSwgKHR5cGUsIHN0cmlkZSwgcG9pbnRlciksIDMsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIHN0cmlkZSwgImNvbnN0IEdMdm9pZCAqIiwgcG9pbnRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xPcnRob2YsIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpLCA2LCAiR0xmbG9hdCIsIGxlZnQsICJHTGZsb2F0IiwgcmlnaHQsICJHTGZsb2F0IiwgYm90dG9tLCAiR0xmbG9hdCIsIHRvcCwgIkdMZmxvYXQiLCB6TmVhciwgIkdMZmxvYXQiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbE9ydGhvZk9FUywgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciksIDYsICJHTGZsb2F0IiwgbGVmdCwgIkdMZmxvYXQiLCByaWdodCwgIkdMZmxvYXQiLCBib3R0b20sICJHTGZsb2F0IiwgdG9wLCAiR0xmbG9hdCIsIHpOZWFyLCAiR0xmbG9hdCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsT3J0aG94LCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSwgNiwgIkdMZml4ZWQiLCBsZWZ0LCAiR0xmaXhlZCIsIHJpZ2h0LCAiR0xmaXhlZCIsIGJvdHRvbSwgIkdMZml4ZWQiLCB0b3AsICJHTGZpeGVkIiwgek5lYXIsICJHTGZpeGVkIiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xPcnRob3hPRVMsIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpLCA2LCAiR0xmaXhlZCIsIGxlZnQsICJHTGZpeGVkIiwgcmlnaHQsICJHTGZpeGVkIiwgYm90dG9tLCAiR0xmaXhlZCIsIHRvcCwgIkdMZml4ZWQiLCB6TmVhciwgIkdMZml4ZWQiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50UGFyYW1ldGVyZiwgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRQYXJhbWV0ZXJmdiwgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRQYXJhbWV0ZXJ4LCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xQb2ludFBhcmFtZXRlcnhPRVMsIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50UGFyYW1ldGVyeHYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50UGFyYW1ldGVyeHZPRVMsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50U2l6ZSwgKEdMZmxvYXQgc2l6ZSksIChzaXplKSwgMSwgIkdMZmxvYXQiLCBzaXplKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50U2l6ZVBvaW50ZXJPRVMsIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciksICh0eXBlLCBzdHJpZGUsIHBvaW50ZXIpLCAzLCAiR0xlbnVtIiwgdHlwZSwgIkdMc2l6ZWkiLCBzdHJpZGUsICJjb25zdCBHTHZvaWQgKiIsIHBvaW50ZXIpCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRTaXpleCwgKEdMZml4ZWQgc2l6ZSksIChzaXplKSwgMSwgIkdMZml4ZWQiLCBzaXplKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50U2l6ZXhPRVMsIChHTGZpeGVkIHNpemUpLCAoc2l6ZSksIDEsICJHTGZpeGVkIiwgc2l6ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQb2x5Z29uT2Zmc2V0eCwgKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKSwgKGZhY3RvciwgdW5pdHMpLCAyLCAiR0xmaXhlZCIsIGZhY3RvciwgIkdMZml4ZWQiLCB1bml0cykKLVRSQUNFX0dMX1ZPSUQoZ2xQb2x5Z29uT2Zmc2V0eE9FUywgKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKSwgKGZhY3RvciwgdW5pdHMpLCAyLCAiR0xmaXhlZCIsIGZhY3RvciwgIkdMZml4ZWQiLCB1bml0cykKLVRSQUNFX0dMX1ZPSUQoZ2xQb3BNYXRyaXgsICh2b2lkKSwgKCksIDApCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbUJpbmFyeU9FUywgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gYmluYXJ5Rm9ybWF0LCBjb25zdCBHTHZvaWQgKmJpbmFyeSwgR0xpbnQgbGVuZ3RoKSwgKHByb2dyYW0sIGJpbmFyeUZvcm1hdCwgYmluYXJ5LCBsZW5ndGgpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMZW51bSIsIGJpbmFyeUZvcm1hdCwgImNvbnN0IEdMdm9pZCAqIiwgYmluYXJ5LCAiR0xpbnQiLCBsZW5ndGgpCi1UUkFDRV9HTF9WT0lEKGdsUHVzaE1hdHJpeCwgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMKEdMYml0ZmllbGQsIGdsUXVlcnlNYXRyaXh4T0VTLCAoR0xmaXhlZCBtYW50aXNzYVsxNl0sIEdMaW50IGV4cG9uZW50WzE2XSksIChtYW50aXNzYSwgZXhwb25lbnQpLCAyLCAiR0xmaXhlZCIsIG1hbnRpc3NhLCAiR0xpbnQiLCBleHBvbmVudCkKLVRSQUNFX0dMX1ZPSUQoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcsIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAodGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCksIDUsICJHTGVudW0iLCB0YXJnZXQsICJHTHNpemVpIiwgc2FtcGxlcywgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KSwgNCwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xSb3RhdGVmLCAoR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiksIChhbmdsZSwgeCwgeSwgeiksIDQsICJHTGZsb2F0IiwgYW5nbGUsICJHTGZsb2F0IiwgeCwgIkdMZmxvYXQiLCB5LCAiR0xmbG9hdCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsUm90YXRleCwgKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopLCAoYW5nbGUsIHgsIHksIHopLCA0LCAiR0xmaXhlZCIsIGFuZ2xlLCAiR0xmaXhlZCIsIHgsICJHTGZpeGVkIiwgeSwgIkdMZml4ZWQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFJvdGF0ZXhPRVMsIChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSwgKGFuZ2xlLCB4LCB5LCB6KSwgNCwgIkdMZml4ZWQiLCBhbmdsZSwgIkdMZml4ZWQiLCB4LCAiR0xmaXhlZCIsIHksICJHTGZpeGVkIiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xTYW1wbGVDb3ZlcmFnZXgsIChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCksICh2YWx1ZSwgaW52ZXJ0KSwgMiwgIkdMY2xhbXB4IiwgdmFsdWUsICJHTGJvb2xlYW4iLCBpbnZlcnQpCi1UUkFDRV9HTF9WT0lEKGdsU2FtcGxlQ292ZXJhZ2V4T0VTLCAoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpLCAodmFsdWUsIGludmVydCksIDIsICJHTGNsYW1weCIsIHZhbHVlLCAiR0xib29sZWFuIiwgaW52ZXJ0KQotVFJBQ0VfR0xfVk9JRChnbFNjYWxlZiwgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopLCAoeCwgeSwgeiksIDMsICJHTGZsb2F0IiwgeCwgIkdMZmxvYXQiLCB5LCAiR0xmbG9hdCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsU2NhbGV4LCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiksICh4LCB5LCB6KSwgMywgIkdMZml4ZWQiLCB4LCAiR0xmaXhlZCIsIHksICJHTGZpeGVkIiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xTY2FsZXhPRVMsIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSwgKHgsIHksIHopLCAzLCAiR0xmaXhlZCIsIHgsICJHTGZpeGVkIiwgeSwgIkdMZml4ZWQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQsIChHTHVpbnQgbW9uaXRvciwgR0xib29sZWFuIGVuYWJsZSwgR0x1aW50IGdyb3VwLCBHTGludCBudW1Db3VudGVycywgR0x1aW50ICpjb3VudGVyc0xpc3QpLCAobW9uaXRvciwgZW5hYmxlLCBncm91cCwgbnVtQ291bnRlcnMsIGNvdW50ZXJzTGlzdCksIDUsICJHTHVpbnQiLCBtb25pdG9yLCAiR0xib29sZWFuIiwgZW5hYmxlLCAiR0x1aW50IiwgZ3JvdXAsICJHTGludCIsIG51bUNvdW50ZXJzLCAiR0x1aW50ICoiLCBjb3VudGVyc0xpc3QpCi1UUkFDRV9HTF9WT0lEKGdsU2V0RmVuY2VOViwgKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbiksIChmZW5jZSwgY29uZGl0aW9uKSwgMiwgIkdMdWludCIsIGZlbmNlLCAiR0xlbnVtIiwgY29uZGl0aW9uKQotVFJBQ0VfR0xfVk9JRChnbFNoYWRlTW9kZWwsIChHTGVudW0gbW9kZSksIChtb2RlKSwgMSwgIkdMZW51bSIsIG1vZGUpCi1UUkFDRV9HTF9WT0lEKGdsU3RhcnRUaWxpbmdRQ09NLCAoR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQsIEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKSwgKHgsIHksIHdpZHRoLCBoZWlnaHQsIHByZXNlcnZlTWFzayksIDUsICJHTHVpbnQiLCB4LCAiR0x1aW50IiwgeSwgIkdMdWludCIsIHdpZHRoLCAiR0x1aW50IiwgaGVpZ2h0LCAiR0xiaXRmaWVsZCIsIHByZXNlcnZlTWFzaykKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xUZXN0RmVuY2VOViwgKEdMdWludCBmZW5jZSksIChmZW5jZSksIDEsICJHTHVpbnQiLCBmZW5jZSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhDb29yZFBvaW50ZXIsIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciksIChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpLCA0LCAiR0xpbnQiLCBzaXplLCAiR0xlbnVtIiwgdHlwZSwgIkdMc2l6ZWkiLCBzdHJpZGUsICJjb25zdCBHTHZvaWQgKiIsIHBvaW50ZXIpCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52ZiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhFbnZmdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhFbnZpLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52aXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhFbnZ4LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleEVudnhPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52eHYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52eHZPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4R2VuZk9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhHZW5mdk9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpLCAoY29vcmQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhHZW5pT0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4R2VuaXZPRVMsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyksIChjb29yZCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBjb29yZCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhHZW54T0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAoY29vcmQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCBjb29yZCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleEdlbnh2T0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChjb29yZCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBjb29yZCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFRleEltYWdlM0RPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpLCAodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBib3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKSwgMTAsICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xlbnVtIiwgaW50ZXJuYWxmb3JtYXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xzaXplaSIsIGRlcHRoLCAiR0xpbnQiLCBib3JkZXIsICJHTGVudW0iLCBmb3JtYXQsICJHTGVudW0iLCB0eXBlLCAiY29uc3QgR0x2b2lkKiIsIHBpeGVscykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhQYXJhbWV0ZXJ4LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleFBhcmFtZXRlcnhPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4UGFyYW1ldGVyeHYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4UGFyYW1ldGVyeHZPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4U3ViSW1hZ2UzRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKSwgKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIHR5cGUsIHBpeGVscyksIDExLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnQiLCBsZXZlbCwgIkdMaW50IiwgeG9mZnNldCwgIkdMaW50IiwgeW9mZnNldCwgIkdMaW50Iiwgem9mZnNldCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTHNpemVpIiwgZGVwdGgsICJHTGVudW0iLCBmb3JtYXQsICJHTGVudW0iLCB0eXBlLCAiY29uc3QgR0x2b2lkKiIsIHBpeGVscykKLVRSQUNFX0dMX1ZPSUQoZ2xUcmFuc2xhdGVmLCAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiksICh4LCB5LCB6KSwgMywgIkdMZmxvYXQiLCB4LCAiR0xmbG9hdCIsIHksICJHTGZsb2F0IiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xUcmFuc2xhdGV4LCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiksICh4LCB5LCB6KSwgMywgIkdMZml4ZWQiLCB4LCAiR0xmaXhlZCIsIHksICJHTGZpeGVkIiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xUcmFuc2xhdGV4T0VTLCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiksICh4LCB5LCB6KSwgMywgIkdMZml4ZWQiLCB4LCAiR0xmaXhlZCIsIHksICJHTGZpeGVkIiwgeikKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xVbm1hcEJ1ZmZlck9FUywgKEdMZW51bSB0YXJnZXQpLCAodGFyZ2V0KSwgMSwgIkdMZW51bSIsIHRhcmdldCkKLVRSQUNFX0dMX1ZPSUQoZ2xWZXJ0ZXhQb2ludGVyLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKSwgNCwgIkdMaW50Iiwgc2l6ZSwgIkdMZW51bSIsIHR5cGUsICJHTHNpemVpIiwgc3RyaWRlLCAiY29uc3QgR0x2b2lkICoiLCBwb2ludGVyKQotVFJBQ0VfR0xfVk9JRChnbFdlaWdodFBvaW50ZXJPRVMsIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciksIChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpLCA0LCAiR0xpbnQiLCBzaXplLCAiR0xlbnVtIiwgdHlwZSwgIkdMc2l6ZWkiLCBzdHJpZGUsICJjb25zdCBHTHZvaWQgKiIsIHBvaW50ZXIpCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9lZ2xfaW1wbC5oIGIvb3BlbmdsL2xpYnMvZWdsX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwZTkwOC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9lZ2xfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogCi0gKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FR0xfSU1QTF9ICi0jZGVmaW5lIEFORFJPSURfRUdMX0lNUExfSAotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8RUdML2VnbHBsYXRmb3JtLmg+Ci0KLSNpbmNsdWRlICJob29rcy5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTEFQSSBjb25zdCBHTHVieXRlICogZWdsX2dldF9zdHJpbmdfZm9yX2N1cnJlbnRfY29udGV4dChHTGVudW0gbmFtZSk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvKiBBTkRST0lEX0VHTF9JTVBMX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL2VudHJpZXMuaW4gYi9vcGVuZ2wvbGlicy9lbnRyaWVzLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzE2ZDc4Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL2VudHJpZXMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotR0xfRU5UUlkodm9pZCwgZ2xBY3RpdmVTaGFkZXJQcm9ncmFtRVhULCBHTHVpbnQgcGlwZWxpbmUsIEdMdWludCBwcm9ncmFtKQotR0xfRU5UUlkodm9pZCwgZ2xBY3RpdmVUZXh0dXJlLCBHTGVudW0gdGV4dHVyZSkKLUdMX0VOVFJZKHZvaWQsIGdsQWxwaGFGdW5jLCBHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKQotR0xfRU5UUlkodm9pZCwgZ2xBbHBoYUZ1bmNRQ09NLCBHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKQotR0xfRU5UUlkodm9pZCwgZ2xBbHBoYUZ1bmN4LCBHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKQotR0xfRU5UUlkodm9pZCwgZ2xBbHBoYUZ1bmN4T0VTLCBHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKQotR0xfRU5UUlkodm9pZCwgZ2xBdHRhY2hTaGFkZXIsIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKQotR0xfRU5UUlkodm9pZCwgZ2xCZWdpblBlcmZNb25pdG9yQU1ELCBHTHVpbnQgbW9uaXRvcikKLUdMX0VOVFJZKHZvaWQsIGdsQmVnaW5RdWVyeUVYVCwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKQotR0xfRU5UUlkodm9pZCwgZ2xCaW5kQXR0cmliTG9jYXRpb24sIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciogbmFtZSkKLUdMX0VOVFJZKHZvaWQsIGdsQmluZEJ1ZmZlciwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikKLUdMX0VOVFJZKHZvaWQsIGdsQmluZEZyYW1lYnVmZmVyLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpCi1HTF9FTlRSWSh2b2lkLCBnbEJpbmRGcmFtZWJ1ZmZlck9FUywgR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKQotR0xfRU5UUlkodm9pZCwgZ2xCaW5kUHJvZ3JhbVBpcGVsaW5lRVhULCBHTHVpbnQgcGlwZWxpbmUpCi1HTF9FTlRSWSh2b2lkLCBnbEJpbmRSZW5kZXJidWZmZXIsIEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpCi1HTF9FTlRSWSh2b2lkLCBnbEJpbmRSZW5kZXJidWZmZXJPRVMsIEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpCi1HTF9FTlRSWSh2b2lkLCBnbEJpbmRUZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSkKLUdMX0VOVFJZKHZvaWQsIGdsQmluZFZlcnRleEFycmF5T0VTLCBHTHVpbnQgYXJyYXkpCi1HTF9FTlRSWSh2b2lkLCBnbEJsZW5kQ29sb3IsIEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKQotR0xfRU5UUlkodm9pZCwgZ2xCbGVuZEVxdWF0aW9uLCAgR0xlbnVtIG1vZGUgKQotR0xfRU5UUlkodm9pZCwgZ2xCbGVuZEVxdWF0aW9uT0VTLCBHTGVudW0gbW9kZSkKLUdMX0VOVFJZKHZvaWQsIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlLCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSkKLUdMX0VOVFJZKHZvaWQsIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTLCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSkKLUdMX0VOVFJZKHZvaWQsIGdsQmxlbmRGdW5jLCBHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpCi1HTF9FTlRSWSh2b2lkLCBnbEJsZW5kRnVuY1NlcGFyYXRlLCBHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSkKLUdMX0VOVFJZKHZvaWQsIGdsQmxlbmRGdW5jU2VwYXJhdGVPRVMsIEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKQotR0xfRU5UUlkodm9pZCwgZ2xCbGl0RnJhbWVidWZmZXJBTkdMRSwgR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLCBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpCi1HTF9FTlRSWSh2b2lkLCBnbEJ1ZmZlckRhdGEsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpCi1HTF9FTlRSWSh2b2lkLCBnbEJ1ZmZlclN1YkRhdGEsIEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpCi1HTF9FTlRSWShHTGVudW0sIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cywgR0xlbnVtIHRhcmdldCkKLUdMX0VOVFJZKEdMZW51bSwgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTLCBHTGVudW0gdGFyZ2V0KQotR0xfRU5UUlkodm9pZCwgZ2xDbGVhciwgR0xiaXRmaWVsZCBtYXNrKQotR0xfRU5UUlkodm9pZCwgZ2xDbGVhckNvbG9yLCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSkKLUdMX0VOVFJZKHZvaWQsIGdsQ2xlYXJDb2xvcngsIEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKQotR0xfRU5UUlkodm9pZCwgZ2xDbGVhckNvbG9yeE9FUywgR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpCi1HTF9FTlRSWSh2b2lkLCBnbENsZWFyRGVwdGhmLCBHTGNsYW1wZiBkZXB0aCkKLUdMX0VOVFJZKHZvaWQsIGdsQ2xlYXJEZXB0aGZPRVMsIEdMY2xhbXBmIGRlcHRoKQotR0xfRU5UUlkodm9pZCwgZ2xDbGVhckRlcHRoeCwgR0xjbGFtcHggZGVwdGgpCi1HTF9FTlRSWSh2b2lkLCBnbENsZWFyRGVwdGh4T0VTLCBHTGNsYW1weCBkZXB0aCkKLUdMX0VOVFJZKHZvaWQsIGdsQ2xlYXJTdGVuY2lsLCBHTGludCBzKQotR0xfRU5UUlkodm9pZCwgZ2xDbGllbnRBY3RpdmVUZXh0dXJlLCBHTGVudW0gdGV4dHVyZSkKLUdMX0VOVFJZKHZvaWQsIGdsQ2xpcFBsYW5lZiwgR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbikKLUdMX0VOVFJZKHZvaWQsIGdsQ2xpcFBsYW5lZklNRywgR0xlbnVtIHAsIGNvbnN0IEdMZmxvYXQgKmVxbikKLUdMX0VOVFJZKHZvaWQsIGdsQ2xpcFBsYW5lZk9FUywgR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbikKLUdMX0VOVFJZKHZvaWQsIGdsQ2xpcFBsYW5leCwgR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbikKLUdMX0VOVFJZKHZvaWQsIGdsQ2xpcFBsYW5leElNRywgR0xlbnVtIHAsIGNvbnN0IEdMZml4ZWQgKmVxbikKLUdMX0VOVFJZKHZvaWQsIGdsQ2xpcFBsYW5leE9FUywgR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbikKLUdMX0VOVFJZKHZvaWQsIGdsQ29sb3I0ZiwgR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSkKLUdMX0VOVFJZKHZvaWQsIGdsQ29sb3I0dWIsIEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpCi1HTF9FTlRSWSh2b2lkLCBnbENvbG9yNHgsIEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpCi1HTF9FTlRSWSh2b2lkLCBnbENvbG9yNHhPRVMsIEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpCi1HTF9FTlRSWSh2b2lkLCBnbENvbG9yTWFzaywgR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKQotR0xfRU5UUlkodm9pZCwgZ2xDb2xvclBvaW50ZXIsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKQotR0xfRU5UUlkodm9pZCwgZ2xDb21waWxlU2hhZGVyLCBHTHVpbnQgc2hhZGVyKQotR0xfRU5UUlkodm9pZCwgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSkKLUdMX0VOVFJZKHZvaWQsIGdsQ29tcHJlc3NlZFRleEltYWdlM0RPRVMsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpCi1HTF9FTlRSWSh2b2lkLCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJELCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpCi1HTF9FTlRSWSh2b2lkLCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNET0VTLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpCi1HTF9FTlRSWSh2b2lkLCBnbENvcHlUZXhJbWFnZTJELCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKQotR0xfRU5UUlkodm9pZCwgZ2xDb3B5VGV4U3ViSW1hZ2UyRCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQotR0xfRU5UUlkodm9pZCwgZ2xDb3B5VGV4U3ViSW1hZ2UzRE9FUywgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQotR0xfRU5UUlkodm9pZCwgZ2xDb3ZlcmFnZU1hc2tOViwgR0xib29sZWFuIG1hc2spCi1HTF9FTlRSWSh2b2lkLCBnbENvdmVyYWdlT3BlcmF0aW9uTlYsIEdMZW51bSBvcGVyYXRpb24pCi1HTF9FTlRSWShHTHVpbnQsIGdsQ3JlYXRlUHJvZ3JhbSwgdm9pZCkKLUdMX0VOVFJZKEdMdWludCwgZ2xDcmVhdGVTaGFkZXIsIEdMZW51bSB0eXBlKQotR0xfRU5UUlkoR0x1aW50LCBnbENyZWF0ZVNoYWRlclByb2dyYW12RVhULCBHTGVudW0gdHlwZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyICoqc3RyaW5ncykKLUdMX0VOVFJZKHZvaWQsIGdsQ3VsbEZhY2UsIEdMZW51bSBtb2RlKQotR0xfRU5UUlkodm9pZCwgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUywgR0x1aW50IG1hdHJpeHBhbGV0dGVpbmRleCkKLUdMX0VOVFJZKHZvaWQsIGdsRGVsZXRlQnVmZmVycywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbERlbGV0ZUZlbmNlc05WLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKQotR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycykKLUdMX0VOVFJZKHZvaWQsIGdsRGVsZXRlUGVyZk1vbml0b3JzQU1ELCBHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpCi1HTF9FTlRSWSh2b2lkLCBnbERlbGV0ZVByb2dyYW0sIEdMdWludCBwcm9ncmFtKQotR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVQcm9ncmFtUGlwZWxpbmVzRVhULCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcGlwZWxpbmVzKQotR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVRdWVyaWVzRVhULCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKQotR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVSZW5kZXJidWZmZXJzLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycykKLUdMX0VOVFJZKHZvaWQsIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbERlbGV0ZVNoYWRlciwgR0x1aW50IHNoYWRlcikKLUdMX0VOVFJZKHZvaWQsIGdsRGVsZXRlVGV4dHVyZXMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcykKLUdMX0VOVFJZKHZvaWQsIGdsRGVsZXRlVmVydGV4QXJyYXlzT0VTLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKQotR0xfRU5UUlkodm9pZCwgZ2xEZXB0aEZ1bmMsIEdMZW51bSBmdW5jKQotR0xfRU5UUlkodm9pZCwgZ2xEZXB0aE1hc2ssIEdMYm9vbGVhbiBmbGFnKQotR0xfRU5UUlkodm9pZCwgZ2xEZXB0aFJhbmdlZiwgR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpCi1HTF9FTlRSWSh2b2lkLCBnbERlcHRoUmFuZ2VmT0VTLCBHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcikKLUdMX0VOVFJZKHZvaWQsIGdsRGVwdGhSYW5nZXgsIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKQotR0xfRU5UUlkodm9pZCwgZ2xEZXB0aFJhbmdleE9FUywgR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpCi1HTF9FTlRSWSh2b2lkLCBnbERldGFjaFNoYWRlciwgR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpCi1HTF9FTlRSWSh2b2lkLCBnbERpc2FibGUsIEdMZW51bSBjYXApCi1HTF9FTlRSWSh2b2lkLCBnbERpc2FibGVDbGllbnRTdGF0ZSwgR0xlbnVtIGFycmF5KQotR0xfRU5UUlkodm9pZCwgZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00sIEdMdWludCBkcml2ZXJDb250cm9sKQotR0xfRU5UUlkodm9pZCwgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXksIEdMdWludCBpbmRleCkKLUdMX0VOVFJZKHZvaWQsIGdsRGlzY2FyZEZyYW1lYnVmZmVyRVhULCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKQotR0xfRU5UUlkodm9pZCwgZ2xEcmF3QXJyYXlzLCBHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpCi1HTF9FTlRSWSh2b2lkLCBnbERyYXdCdWZmZXJzTlYsIEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKQotR0xfRU5UUlkodm9pZCwgZ2xEcmF3RWxlbWVudHMsIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzKQotR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4Zk9FUywgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbERyYXdUZXhmdk9FUywgY29uc3QgR0xmbG9hdCAqY29vcmRzKQotR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4aU9FUywgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCkKLUdMX0VOVFJZKHZvaWQsIGdsRHJhd1RleGl2T0VTLCBjb25zdCBHTGludCAqY29vcmRzKQotR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4c09FUywgR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbERyYXdUZXhzdk9FUywgY29uc3QgR0xzaG9ydCAqY29vcmRzKQotR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4eE9FUywgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3aWR0aCwgR0xmaXhlZCBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbERyYXdUZXh4dk9FUywgY29uc3QgR0xmaXhlZCAqY29vcmRzKQotR0xfRU5UUlkodm9pZCwgZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMsIEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpCi1HTF9FTlRSWSh2b2lkLCBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKQotR0xfRU5UUlkodm9pZCwgZ2xFbmFibGUsIEdMZW51bSBjYXApCi1HTF9FTlRSWSh2b2lkLCBnbEVuYWJsZUNsaWVudFN0YXRlLCBHTGVudW0gYXJyYXkpCi1HTF9FTlRSWSh2b2lkLCBnbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NLCBHTHVpbnQgZHJpdmVyQ29udHJvbCkKLUdMX0VOVFJZKHZvaWQsIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXksIEdMdWludCBpbmRleCkKLUdMX0VOVFJZKHZvaWQsIGdsRW5kUGVyZk1vbml0b3JBTUQsIEdMdWludCBtb25pdG9yKQotR0xfRU5UUlkodm9pZCwgZ2xFbmRRdWVyeUVYVCwgR0xlbnVtIHRhcmdldCkKLUdMX0VOVFJZKHZvaWQsIGdsRW5kVGlsaW5nUUNPTSwgR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spCi1HTF9FTlRSWSh2b2lkLCBnbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTSwgR0xlbnVtIHRhcmdldCwgR0x2b2lkICoqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xFeHRHZXRCdWZmZXJzUUNPTSwgR0x1aW50ICpidWZmZXJzLCBHTGludCBtYXhCdWZmZXJzLCBHTGludCAqbnVtQnVmZmVycykKLUdMX0VOVFJZKHZvaWQsIGdsRXh0R2V0RnJhbWVidWZmZXJzUUNPTSwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMsIEdMaW50IG1heEZyYW1lYnVmZmVycywgR0xpbnQgKm51bUZyYW1lYnVmZmVycykKLUdMX0VOVFJZKHZvaWQsIGdsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00sIEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpCi1HTF9FTlRSWSh2b2lkLCBnbEV4dEdldFByb2dyYW1zUUNPTSwgR0x1aW50ICpwcm9ncmFtcywgR0xpbnQgbWF4UHJvZ3JhbXMsIEdMaW50ICpudW1Qcm9ncmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00sIEdMdWludCAqcmVuZGVyYnVmZmVycywgR0xpbnQgbWF4UmVuZGVyYnVmZmVycywgR0xpbnQgKm51bVJlbmRlcmJ1ZmZlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbEV4dEdldFNoYWRlcnNRQ09NLCBHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKQotR0xfRU5UUlkodm9pZCwgZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSwgR0x1aW50IHRleHR1cmUsIEdMZW51bSBmYWNlLCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00sIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGV4ZWxzKQotR0xfRU5UUlkodm9pZCwgZ2xFeHRHZXRUZXh0dXJlc1FDT00sIEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSwgR0x1aW50IHByb2dyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsRmluaXNoLCB2b2lkKQotR0xfRU5UUlkodm9pZCwgZ2xGaW5pc2hGZW5jZU5WLCBHTHVpbnQgZmVuY2UpCi1HTF9FTlRSWSh2b2lkLCBnbEZsdXNoLCB2b2lkKQotR0xfRU5UUlkodm9pZCwgZ2xGb2dmLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbEZvZ2Z2LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsRm9neCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xGb2d4T0VTLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbEZvZ3h2LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsRm9neHZPRVMsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpCi1HTF9FTlRSWSh2b2lkLCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcikKLUdMX0VOVFJZKHZvaWQsIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpCi1HTF9FTlRSWSh2b2lkLCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcykKLUdMX0VOVFJZKHZvaWQsIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUlNRywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKQotR0xfRU5UUlkodm9pZCwgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCkKLUdMX0VOVFJZKHZvaWQsIGdsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpCi1HTF9FTlRSWSh2b2lkLCBnbEZyb250RmFjZSwgR0xlbnVtIG1vZGUpCi1HTF9FTlRSWSh2b2lkLCBnbEZydXN0dW1mLCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKQotR0xfRU5UUlkodm9pZCwgZ2xGcnVzdHVtZk9FUywgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKLUdMX0VOVFJZKHZvaWQsIGdsRnJ1c3R1bXgsIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpCi1HTF9FTlRSWSh2b2lkLCBnbEZydXN0dW14T0VTLCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKQotR0xfRU5UUlkodm9pZCwgZ2xHZW5CdWZmZXJzLCBHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycykKLUdMX0VOVFJZKHZvaWQsIGdsR2VuRmVuY2VzTlYsIEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdlbkZyYW1lYnVmZmVycywgR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycykKLUdMX0VOVFJZKHZvaWQsIGdsR2VuRnJhbWVidWZmZXJzT0VTLCBHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKQotR0xfRU5UUlkodm9pZCwgZ2xHZW5QZXJmTW9uaXRvcnNBTUQsIEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycykKLUdMX0VOVFJZKHZvaWQsIGdsR2VuUHJvZ3JhbVBpcGVsaW5lc0VYVCwgR0xzaXplaSBuLCBHTHVpbnQgKnBpcGVsaW5lcykKLUdMX0VOVFJZKHZvaWQsIGdsR2VuUXVlcmllc0VYVCwgR0xzaXplaSBuLCBHTHVpbnQgKmlkcykKLUdMX0VOVFJZKHZvaWQsIGdsR2VuUmVuZGVyYnVmZmVycywgR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMsIEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKQotR0xfRU5UUlkodm9pZCwgZ2xHZW5UZXh0dXJlcywgR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKQotR0xfRU5UUlkodm9pZCwgZ2xHZW5WZXJ0ZXhBcnJheXNPRVMsIEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdlbmVyYXRlTWlwbWFwLCBHTGVudW0gdGFyZ2V0KQotR0xfRU5UUlkodm9pZCwgZ2xHZW5lcmF0ZU1pcG1hcE9FUywgR0xlbnVtIHRhcmdldCkKLUdMX0VOVFJZKHZvaWQsIGdsR2V0QWN0aXZlQXR0cmliLCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRBY3RpdmVVbmlmb3JtLCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRBdHRhY2hlZFNoYWRlcnMsIEdMdWludCBwcm9ncmFtLCBHTHNpemVpIG1heGNvdW50LCBHTHNpemVpKiBjb3VudCwgR0x1aW50KiBzaGFkZXJzKQotR0xfRU5UUlkoaW50LCBnbEdldEF0dHJpYkxvY2F0aW9uLCBHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRCb29sZWFudiwgR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0QnVmZmVyUG9pbnRlcnZPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkICoqIHBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0Q2xpcFBsYW5lZiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSkKLUdMX0VOVFJZKHZvaWQsIGdsR2V0Q2xpcFBsYW5lZk9FUywgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSkKLUdMX0VOVFJZKHZvaWQsIGdsR2V0Q2xpcFBsYW5leCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSkKLUdMX0VOVFJZKHZvaWQsIGdsR2V0Q2xpcFBsYW5leE9FUywgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSkKLUdMX0VOVFJZKHZvaWQsIGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00sIEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKQotR0xfRU5UUlkodm9pZCwgZ2xHZXREcml2ZXJDb250cm9sc1FDT00sIEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scykKLUdMX0VOVFJZKEdMZW51bSwgZ2xHZXRFcnJvciwgdm9pZCkKLUdMX0VOVFJZKHZvaWQsIGdsR2V0RmVuY2Vpdk5WLCBHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0Rml4ZWR2LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0Rml4ZWR2T0VTLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0RmxvYXR2LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKQotR0xfRU5UUlkoR0xlbnVtLCBnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQsIHZvaWQpCi1HTF9FTlRSWSh2b2lkLCBnbEdldEludGVnZXJ2LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldExpZ2h0ZnYsIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldExpZ2h0eHYsIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldExpZ2h0eHZPRVMsIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldE1hdGVyaWFsZnYsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0TWF0ZXJpYWx4diwgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRNYXRlcmlhbHh2T0VTLCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldE9iamVjdExhYmVsRVhULCBHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqbGFiZWwpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQsIEdMdWludCBtb25pdG9yLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgZGF0YVNpemUsIEdMdWludCAqZGF0YSwgR0xpbnQgKmJ5dGVzV3JpdHRlbikKLUdMX0VOVFJZKHZvaWQsIGdsR2V0UGVyZk1vbml0b3JDb3VudGVySW5mb0FNRCwgR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKmRhdGEpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRCwgR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqY291bnRlclN0cmluZykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRCwgR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRCwgR0x1aW50IGdyb3VwLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpncm91cFN0cmluZykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQsIEdMaW50ICpudW1Hcm91cHMsIEdMc2l6ZWkgZ3JvdXBzU2l6ZSwgR0x1aW50ICpncm91cHMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFBvaW50ZXJ2LCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0UHJvZ3JhbUJpbmFyeU9FUywgR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGVudW0gKmJpbmFyeUZvcm1hdCwgR0x2b2lkICpiaW5hcnkpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFByb2dyYW1JbmZvTG9nLCBHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0UHJvZ3JhbVBpcGVsaW5lSW5mb0xvZ0VYVCwgR0x1aW50IHBpcGVsaW5lLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRQcm9ncmFtUGlwZWxpbmVpdkVYVCwgR0x1aW50IHBpcGVsaW5lLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFByb2dyYW1pdiwgR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0UXVlcnlPYmplY3R1aXZFWFQsIEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0UXVlcnlpdkVYVCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRTaGFkZXJJbmZvTG9nLCBHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQsIEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQqIHJhbmdlLCBHTGludCogcHJlY2lzaW9uKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRTaGFkZXJTb3VyY2UsIEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIHNvdXJjZSkKLUdMX0VOVFJZKHZvaWQsIGdsR2V0U2hhZGVyaXYsIEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykKLUdMX0VOVFJZKGNvbnN0IEdMdWJ5dGUgKiwgZ2xHZXRTdHJpbmcsIEdMZW51bSBuYW1lKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhFbnZmdiwgR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFRleEVudml2LCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFRleEVudnh2LCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0VGV4RW52eHZPRVMsIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhHZW5mdk9FUywgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0VGV4R2VuaXZPRVMsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhHZW54dk9FUywgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0VGV4UGFyYW1ldGVyZnYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhQYXJhbWV0ZXJpdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhQYXJhbWV0ZXJ4diwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFRleFBhcmFtZXRlcnh2T0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKGludCwgZ2xHZXRVbmlmb3JtTG9jYXRpb24sIEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFVuaWZvcm1mdiwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0KiBwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFVuaWZvcm1pdiwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCogcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydiwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFZlcnRleEF0dHJpYmZ2LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRWZXJ0ZXhBdHRyaWJpdiwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldG5Vbmlmb3JtZnZFWFQsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBmbG9hdCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRuVW5pZm9ybWl2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsSGludCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpCi1HTF9FTlRSWSh2b2lkLCBnbEluc2VydEV2ZW50TWFya2VyRVhULCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNCdWZmZXIsIEdMdWludCBidWZmZXIpCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNFbmFibGVkLCBHTGVudW0gY2FwKQotR0xfRU5UUlkoR0xib29sZWFuLCBnbElzRmVuY2VOViwgR0x1aW50IGZlbmNlKQotR0xfRU5UUlkoR0xib29sZWFuLCBnbElzRnJhbWVidWZmZXIsIEdMdWludCBmcmFtZWJ1ZmZlcikKLUdMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc0ZyYW1lYnVmZmVyT0VTLCBHTHVpbnQgZnJhbWVidWZmZXIpCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNQcm9ncmFtLCBHTHVpbnQgcHJvZ3JhbSkKLUdMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc1Byb2dyYW1QaXBlbGluZUVYVCwgR0x1aW50IHBpcGVsaW5lKQotR0xfRU5UUlkoR0xib29sZWFuLCBnbElzUXVlcnlFWFQsIEdMdWludCBpZCkKLUdMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc1JlbmRlcmJ1ZmZlciwgR0x1aW50IHJlbmRlcmJ1ZmZlcikKLUdMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc1JlbmRlcmJ1ZmZlck9FUywgR0x1aW50IHJlbmRlcmJ1ZmZlcikKLUdMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc1NoYWRlciwgR0x1aW50IHNoYWRlcikKLUdMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc1RleHR1cmUsIEdMdWludCB0ZXh0dXJlKQotR0xfRU5UUlkoR0xib29sZWFuLCBnbElzVmVydGV4QXJyYXlPRVMsIEdMdWludCBhcnJheSkKLUdMX0VOVFJZKHZvaWQsIGdsTGFiZWxPYmplY3RFWFQsIEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICpsYWJlbCkKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHRNb2RlbGYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHRNb2RlbGZ2LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHRNb2RlbHgsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHRNb2RlbHhPRVMsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHRNb2RlbHh2LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHRNb2RlbHh2T0VTLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHRmLCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHRmdiwgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHR4LCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHR4T0VTLCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHR4diwgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsTGlnaHR4dk9FUywgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsTGluZVdpZHRoLCBHTGZsb2F0IHdpZHRoKQotR0xfRU5UUlkodm9pZCwgZ2xMaW5lV2lkdGh4LCBHTGZpeGVkIHdpZHRoKQotR0xfRU5UUlkodm9pZCwgZ2xMaW5lV2lkdGh4T0VTLCBHTGZpeGVkIHdpZHRoKQotR0xfRU5UUlkodm9pZCwgZ2xMaW5rUHJvZ3JhbSwgR0x1aW50IHByb2dyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbExvYWRJZGVudGl0eSwgdm9pZCkKLUdMX0VOVFJZKHZvaWQsIGdsTG9hZE1hdHJpeGYsIGNvbnN0IEdMZmxvYXQgKm0pCi1HTF9FTlRSWSh2b2lkLCBnbExvYWRNYXRyaXh4LCBjb25zdCBHTGZpeGVkICptKQotR0xfRU5UUlkodm9pZCwgZ2xMb2FkTWF0cml4eE9FUywgY29uc3QgR0xmaXhlZCAqbSkKLUdMX0VOVFJZKHZvaWQsIGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTLCB2b2lkKQotR0xfRU5UUlkodm9pZCwgZ2xMb2dpY09wLCBHTGVudW0gb3Bjb2RlKQotR0xfRU5UUlkodm9pZCosIGdsTWFwQnVmZmVyT0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKQotR0xfRU5UUlkodm9pZCwgZ2xNYXRlcmlhbGYsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFsZnYsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsTWF0ZXJpYWx4LCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xNYXRlcmlhbHhPRVMsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFseHYsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsTWF0ZXJpYWx4dk9FUywgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKQotR0xfRU5UUlkodm9pZCwgZ2xNYXRyaXhNb2RlLCBHTGVudW0gbW9kZSkKLUdMX0VOVFJZKHZvaWQsIGdsTXVsdE1hdHJpeGYsIGNvbnN0IEdMZmxvYXQgKm0pCi1HTF9FTlRSWSh2b2lkLCBnbE11bHRNYXRyaXh4LCBjb25zdCBHTGZpeGVkICptKQotR0xfRU5UUlkodm9pZCwgZ2xNdWx0TWF0cml4eE9FUywgY29uc3QgR0xmaXhlZCAqbSkKLUdMX0VOVFJZKHZvaWQsIGdsTXVsdGlEcmF3QXJyYXlzRVhULCBHTGVudW0gbW9kZSwgR0xpbnQgKmZpcnN0LCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpCi1HTF9FTlRSWSh2b2lkLCBnbE11bHRpRHJhd0VsZW1lbnRzRVhULCBHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCkKLUdMX0VOVFJZKHZvaWQsIGdsTXVsdGlUZXhDb29yZDRmLCBHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpCi1HTF9FTlRSWSh2b2lkLCBnbE11bHRpVGV4Q29vcmQ0eCwgR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKQotR0xfRU5UUlkodm9pZCwgZ2xNdWx0aVRleENvb3JkNHhPRVMsIEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSkKLUdMX0VOVFJZKHZvaWQsIGdsTm9ybWFsM2YsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopCi1HTF9FTlRSWSh2b2lkLCBnbE5vcm1hbDN4LCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KQotR0xfRU5UUlkodm9pZCwgZ2xOb3JtYWwzeE9FUywgR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueikKLUdMX0VOVFJZKHZvaWQsIGdsTm9ybWFsUG9pbnRlciwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCi1HTF9FTlRSWSh2b2lkLCBnbE9ydGhvZiwgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKLUdMX0VOVFJZKHZvaWQsIGdsT3J0aG9mT0VTLCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKQotR0xfRU5UUlkodm9pZCwgZ2xPcnRob3gsIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpCi1HTF9FTlRSWSh2b2lkLCBnbE9ydGhveE9FUywgR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikKLUdMX0VOVFJZKHZvaWQsIGdsUGl4ZWxTdG9yZWksIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFBvaW50UGFyYW1ldGVyZiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xQb2ludFBhcmFtZXRlcmZ2LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsUG9pbnRQYXJhbWV0ZXJ4LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFBvaW50UGFyYW1ldGVyeE9FUywgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xQb2ludFBhcmFtZXRlcnh2LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsUG9pbnRQYXJhbWV0ZXJ4dk9FUywgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbFBvaW50U2l6ZSwgR0xmbG9hdCBzaXplKQotR0xfRU5UUlkodm9pZCwgZ2xQb2ludFNpemVQb2ludGVyT0VTLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKLUdMX0VOVFJZKHZvaWQsIGdsUG9pbnRTaXpleCwgR0xmaXhlZCBzaXplKQotR0xfRU5UUlkodm9pZCwgZ2xQb2ludFNpemV4T0VTLCBHTGZpeGVkIHNpemUpCi1HTF9FTlRSWSh2b2lkLCBnbFBvbHlnb25PZmZzZXQsIEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKQotR0xfRU5UUlkodm9pZCwgZ2xQb2x5Z29uT2Zmc2V0eCwgR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpCi1HTF9FTlRSWSh2b2lkLCBnbFBvbHlnb25PZmZzZXR4T0VTLCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cykKLUdMX0VOVFJZKHZvaWQsIGdsUG9wR3JvdXBNYXJrZXJFWFQsIHZvaWQpCi1HTF9FTlRSWSh2b2lkLCBnbFBvcE1hdHJpeCwgdm9pZCkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbUJpbmFyeU9FUywgR0x1aW50IHByb2dyYW0sIEdMZW51bSBiaW5hcnlGb3JtYXQsIGNvbnN0IEdMdm9pZCAqYmluYXJ5LCBHTGludCBsZW5ndGgpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1QYXJhbWV0ZXJpRVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCB2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbVVuaWZvcm0xZkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtMWZ2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybTFpRVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtMWl2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbVVuaWZvcm0yZkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbVVuaWZvcm0yZnZFWFQsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtMmlFWFQsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbVVuaWZvcm0yaXZFWFQsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybTNmRVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtM2Z2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybTNpRVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtM2l2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbVVuaWZvcm00ZkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtNGZ2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybTRpRVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtNGl2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRmdkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUHVzaEdyb3VwTWFya2VyRVhULCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpCi1HTF9FTlRSWSh2b2lkLCBnbFB1c2hNYXRyaXgsIHZvaWQpCi1HTF9FTlRSWShHTGJpdGZpZWxkLCBnbFF1ZXJ5TWF0cml4eE9FUywgR0xmaXhlZCBtYW50aXNzYVsxNl0sIEdMaW50IGV4cG9uZW50WzE2XSkKLUdMX0VOVFJZKHZvaWQsIGdsUmVhZEJ1ZmZlck5WLCBHTGVudW0gbW9kZSkKLUdMX0VOVFJZKHZvaWQsIGdsUmVhZFBpeGVscywgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscykKLUdMX0VOVFJZKHZvaWQsIGdsUmVhZG5QaXhlbHNFWFQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCB2b2lkICpkYXRhKQotR0xfRU5UUlkodm9pZCwgZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIsIHZvaWQpCi1HTF9FTlRSWSh2b2lkLCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQotR0xfRU5UUlkodm9pZCwgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKLUdMX0VOVFJZKHZvaWQsIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKLUdMX0VOVFJZKHZvaWQsIGdsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSwgdm9pZCkKLUdMX0VOVFJZKHZvaWQsIGdsUm90YXRlZiwgR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKLUdMX0VOVFJZKHZvaWQsIGdsUm90YXRleCwgR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikKLUdMX0VOVFJZKHZvaWQsIGdsUm90YXRleE9FUywgR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikKLUdMX0VOVFJZKHZvaWQsIGdsU2FtcGxlQ292ZXJhZ2UsIEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KQotR0xfRU5UUlkodm9pZCwgZ2xTYW1wbGVDb3ZlcmFnZXgsIEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KQotR0xfRU5UUlkodm9pZCwgZ2xTYW1wbGVDb3ZlcmFnZXhPRVMsIEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KQotR0xfRU5UUlkodm9pZCwgZ2xTY2FsZWYsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCi1HTF9FTlRSWSh2b2lkLCBnbFNjYWxleCwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikKLUdMX0VOVFJZKHZvaWQsIGdsU2NhbGV4T0VTLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQotR0xfRU5UUlkodm9pZCwgZ2xTY2lzc29yLCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKLUdMX0VOVFJZKHZvaWQsIGdsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRCwgR0x1aW50IG1vbml0b3IsIEdMYm9vbGVhbiBlbmFibGUsIEdMdWludCBncm91cCwgR0xpbnQgbnVtQ291bnRlcnMsIEdMdWludCAqY291bnRlcnNMaXN0KQotR0xfRU5UUlkodm9pZCwgZ2xTZXRGZW5jZU5WLCBHTHVpbnQgZmVuY2UsIEdMZW51bSBjb25kaXRpb24pCi1HTF9FTlRSWSh2b2lkLCBnbFNoYWRlTW9kZWwsIEdMZW51bSBtb2RlKQotR0xfRU5UUlkodm9pZCwgZ2xTaGFkZXJCaW5hcnksIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBzaGFkZXJzLCBHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCBHTHZvaWQqIGJpbmFyeSwgR0xzaXplaSBsZW5ndGgpCi1HTF9FTlRSWSh2b2lkLCBnbFNoYWRlclNvdXJjZSwgR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiogc3RyaW5nLCBjb25zdCBHTGludCogbGVuZ3RoKQotR0xfRU5UUlkodm9pZCwgZ2xTdGFydFRpbGluZ1FDT00sIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzaykKLUdMX0VOVFJZKHZvaWQsIGdsU3RlbmNpbEZ1bmMsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKQotR0xfRU5UUlkodm9pZCwgZ2xTdGVuY2lsRnVuY1NlcGFyYXRlLCBHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spCi1HTF9FTlRSWSh2b2lkLCBnbFN0ZW5jaWxNYXNrLCBHTHVpbnQgbWFzaykKLUdMX0VOVFJZKHZvaWQsIGdsU3RlbmNpbE1hc2tTZXBhcmF0ZSwgR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKQotR0xfRU5UUlkodm9pZCwgZ2xTdGVuY2lsT3AsIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykKLUdMX0VOVFJZKHZvaWQsIGdsU3RlbmNpbE9wU2VwYXJhdGUsIEdMZW51bSBmYWNlLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsVGVzdEZlbmNlTlYsIEdMdWludCBmZW5jZSkKLUdMX0VOVFJZKHZvaWQsIGdsVGV4Q29vcmRQb2ludGVyLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKLUdMX0VOVFJZKHZvaWQsIGdsVGV4RW52ZiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZmdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbFRleEVudmksIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFRleEVudml2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbFRleEVudngsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsVGV4RW52eE9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZ4diwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbFRleEVudnh2T0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4R2VuZk9FUywgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFRleEdlbmZ2T0VTLCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhHZW5pT0VTLCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFRleEdlbml2T0VTLCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4R2VueE9FUywgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFRleEdlbnh2T0VTLCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhJbWFnZTJELCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4SW1hZ2UzRE9FUywgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhQYXJhbWV0ZXJmLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcmZ2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyaSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyaXYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyeCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhQYXJhbWV0ZXJ4T0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcnh2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyeHZPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhTdG9yYWdlMURFWFQsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpCi1HTF9FTlRSWSh2b2lkLCBnbFRleFN0b3JhZ2UyREVYVCwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbFRleFN0b3JhZ2UzREVYVCwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpCi1HTF9FTlRSWSh2b2lkLCBnbFRleFN1YkltYWdlMkQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhTdWJJbWFnZTNET0VTLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4dHVyZVN0b3JhZ2UxREVYVCwgR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpCi1HTF9FTlRSWSh2b2lkLCBnbFRleHR1cmVTdG9yYWdlMkRFWFQsIEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKLUdMX0VOVFJZKHZvaWQsIGdsVGV4dHVyZVN0b3JhZ2UzREVYVCwgR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKQotR0xfRU5UUlkodm9pZCwgZ2xUcmFuc2xhdGVmLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQotR0xfRU5UUlkodm9pZCwgZ2xUcmFuc2xhdGV4LCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQotR0xfRU5UUlkodm9pZCwgZ2xUcmFuc2xhdGV4T0VTLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtMWYsIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpCi1HTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0xZnYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtMWksIEdMaW50IGxvY2F0aW9uLCBHTGludCB4KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtMWl2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpCi1HTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0yZiwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtMmZ2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdikKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTJpLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSkKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTJpdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtM2YsIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtM2Z2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdikKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTNpLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeikKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTNpdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtNGYsIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpCi1HTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm00ZnYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtNGksIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtNGl2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpCi1HTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm1NYXRyaXgyZnYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybU1hdHJpeDNmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtTWF0cml4NGZ2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsVW5tYXBCdWZmZXJPRVMsIEdMZW51bSB0YXJnZXQpCi1HTF9FTlRSWSh2b2lkLCBnbFVzZVByb2dyYW0sIEdMdWludCBwcm9ncmFtKQotR0xfRU5UUlkodm9pZCwgZ2xVc2VQcm9ncmFtU3RhZ2VzRVhULCBHTHVpbnQgcGlwZWxpbmUsIEdMYml0ZmllbGQgc3RhZ2VzLCBHTHVpbnQgcHJvZ3JhbSkKLUdMX0VOVFJZKHZvaWQsIGdsVmFsaWRhdGVQcm9ncmFtLCBHTHVpbnQgcHJvZ3JhbSkKLUdMX0VOVFJZKHZvaWQsIGdsVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmVFWFQsIEdMdWludCBwaXBlbGluZSkKLUdMX0VOVFJZKHZvaWQsIGdsVmVydGV4QXR0cmliMWYsIEdMdWludCBpbmR4LCBHTGZsb2F0IHgpCi1HTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYjFmdiwgR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykKLUdMX0VOVFJZKHZvaWQsIGdsVmVydGV4QXR0cmliMmYsIEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSkKLUdMX0VOVFJZKHZvaWQsIGdsVmVydGV4QXR0cmliMmZ2LCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKQotR0xfRU5UUlkodm9pZCwgZ2xWZXJ0ZXhBdHRyaWIzZiwgR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCi1HTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYjNmdiwgR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykKLUdMX0VOVFJZKHZvaWQsIGdsVmVydGV4QXR0cmliNGYsIEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpCi1HTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYjRmdiwgR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykKLUdMX0VOVFJZKHZvaWQsIGdsVmVydGV4QXR0cmliUG9pbnRlciwgR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcHRyKQotR0xfRU5UUlkodm9pZCwgZ2xWZXJ0ZXhQb2ludGVyLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKLUdMX0VOVFJZKHZvaWQsIGdsVmlld3BvcnQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQotR0xfRU5UUlkodm9pZCwgZ2xXZWlnaHRQb2ludGVyT0VTLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL2VudW1zLmluIGIvb3BlbmdsL2xpYnMvZW51bXMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYmM4NjYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvZW51bXMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3MDIgKzAsMCBAQAotR0xfRU5VTSgweDAwMDAsR0xfUE9JTlRTKQotR0xfRU5VTSgweDAwMDAwMDAxLEdMX1ZFUlRFWF9TSEFERVJfQklUX0VYVCkKLUdMX0VOVU0oMHgwMDAwMDAwMixHTF9GUkFHTUVOVF9TSEFERVJfQklUX0VYVCkKLUdMX0VOVU0oMHgwMDAxLEdMX0xJTkVTKQotR0xfRU5VTSgweDAwMDIsR0xfTElORV9MT09QKQotR0xfRU5VTSgweDAwMDMsR0xfTElORV9TVFJJUCkKLUdMX0VOVU0oMHgwMDA0LEdMX1RSSUFOR0xFUykKLUdMX0VOVU0oMHgwMDA1LEdMX1RSSUFOR0xFX1NUUklQKQotR0xfRU5VTSgweDAwMDYsR0xfVFJJQU5HTEVfRkFOKQotR0xfRU5VTSgweDAxMDQsR0xfQUREKQotR0xfRU5VTSgweDAyMDAsR0xfTkVWRVIpCi1HTF9FTlVNKDB4MDIwMSxHTF9MRVNTKQotR0xfRU5VTSgweDAyMDIsR0xfRVFVQUwpCi1HTF9FTlVNKDB4MDIwMyxHTF9MRVFVQUwpCi1HTF9FTlVNKDB4MDIwNCxHTF9HUkVBVEVSKQotR0xfRU5VTSgweDAyMDUsR0xfTk9URVFVQUwpCi1HTF9FTlVNKDB4MDIwNixHTF9HRVFVQUwpCi1HTF9FTlVNKDB4MDIwNyxHTF9BTFdBWVMpCi1HTF9FTlVNKDB4MDMwMCxHTF9TUkNfQ09MT1IpCi1HTF9FTlVNKDB4MDMwMSxHTF9PTkVfTUlOVVNfU1JDX0NPTE9SKQotR0xfRU5VTSgweDAzMDIsR0xfU1JDX0FMUEhBKQotR0xfRU5VTSgweDAzMDMsR0xfT05FX01JTlVTX1NSQ19BTFBIQSkKLUdMX0VOVU0oMHgwMzA0LEdMX0RTVF9BTFBIQSkKLUdMX0VOVU0oMHgwMzA1LEdMX09ORV9NSU5VU19EU1RfQUxQSEEpCi1HTF9FTlVNKDB4MDMwNixHTF9EU1RfQ09MT1IpCi1HTF9FTlVNKDB4MDMwNyxHTF9PTkVfTUlOVVNfRFNUX0NPTE9SKQotR0xfRU5VTSgweDAzMDgsR0xfU1JDX0FMUEhBX1NBVFVSQVRFKQotR0xfRU5VTSgweDA0MDQsR0xfRlJPTlQpCi1HTF9FTlVNKDB4MDQwNSxHTF9CQUNLKQotR0xfRU5VTSgweDA0MDgsR0xfRlJPTlRfQU5EX0JBQ0spCi1HTF9FTlVNKDB4MDUwMCxHTF9JTlZBTElEX0VOVU0pCi1HTF9FTlVNKDB4MDUwMSxHTF9JTlZBTElEX1ZBTFVFKQotR0xfRU5VTSgweDA1MDIsR0xfSU5WQUxJRF9PUEVSQVRJT04pCi1HTF9FTlVNKDB4MDUwMyxHTF9TVEFDS19PVkVSRkxPVykKLUdMX0VOVU0oMHgwNTA0LEdMX1NUQUNLX1VOREVSRkxPVykKLUdMX0VOVU0oMHgwNTA1LEdMX09VVF9PRl9NRU1PUlkpCi1HTF9FTlVNKDB4MDUwNixHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTl9PRVMpCi1HTF9FTlVNKDB4MDgwMCxHTF9FWFApCi1HTF9FTlVNKDB4MDgwMSxHTF9FWFAyKQotR0xfRU5VTSgweDA5MDAsR0xfQ1cpCi1HTF9FTlVNKDB4MDkwMSxHTF9DQ1cpCi1HTF9FTlVNKDB4MEIwMCxHTF9DVVJSRU5UX0NPTE9SKQotR0xfRU5VTSgweDBCMDIsR0xfQ1VSUkVOVF9OT1JNQUwpCi1HTF9FTlVNKDB4MEIwMyxHTF9DVVJSRU5UX1RFWFRVUkVfQ09PUkRTKQotR0xfRU5VTSgweDBCMTAsR0xfUE9JTlRfU01PT1RIKQotR0xfRU5VTSgweDBCMTEsR0xfUE9JTlRfU0laRSkKLUdMX0VOVU0oMHgwQjEyLEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFKQotR0xfRU5VTSgweDBCMjAsR0xfTElORV9TTU9PVEgpCi1HTF9FTlVNKDB4MEIyMSxHTF9MSU5FX1dJRFRIKQotR0xfRU5VTSgweDBCMjIsR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UpCi1HTF9FTlVNKDB4MEI0NCxHTF9DVUxMX0ZBQ0UpCi1HTF9FTlVNKDB4MEI0NSxHTF9DVUxMX0ZBQ0VfTU9ERSkKLUdMX0VOVU0oMHgwQjQ2LEdMX0ZST05UX0ZBQ0UpCi1HTF9FTlVNKDB4MEI1MCxHTF9MSUdIVElORykKLUdMX0VOVU0oMHgwQjUyLEdMX0xJR0hUX01PREVMX1RXT19TSURFKQotR0xfRU5VTSgweDBCNTMsR0xfTElHSFRfTU9ERUxfQU1CSUVOVCkKLUdMX0VOVU0oMHgwQjU0LEdMX1NIQURFX01PREVMKQotR0xfRU5VTSgweDBCNTcsR0xfQ09MT1JfTUFURVJJQUwpCi1HTF9FTlVNKDB4MEI2MCxHTF9GT0cpCi1HTF9FTlVNKDB4MEI2MixHTF9GT0dfREVOU0lUWSkKLUdMX0VOVU0oMHgwQjYzLEdMX0ZPR19TVEFSVCkKLUdMX0VOVU0oMHgwQjY0LEdMX0ZPR19FTkQpCi1HTF9FTlVNKDB4MEI2NSxHTF9GT0dfTU9ERSkKLUdMX0VOVU0oMHgwQjY2LEdMX0ZPR19DT0xPUikKLUdMX0VOVU0oMHgwQjcwLEdMX0RFUFRIX1JBTkdFKQotR0xfRU5VTSgweDBCNzEsR0xfREVQVEhfVEVTVCkKLUdMX0VOVU0oMHgwQjcyLEdMX0RFUFRIX1dSSVRFTUFTSykKLUdMX0VOVU0oMHgwQjczLEdMX0RFUFRIX0NMRUFSX1ZBTFVFKQotR0xfRU5VTSgweDBCNzQsR0xfREVQVEhfRlVOQykKLUdMX0VOVU0oMHgwQjkwLEdMX1NURU5DSUxfVEVTVCkKLUdMX0VOVU0oMHgwQjkxLEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUpCi1HTF9FTlVNKDB4MEI5MixHTF9TVEVOQ0lMX0ZVTkMpCi1HTF9FTlVNKDB4MEI5MyxHTF9TVEVOQ0lMX1ZBTFVFX01BU0spCi1HTF9FTlVNKDB4MEI5NCxHTF9TVEVOQ0lMX0ZBSUwpCi1HTF9FTlVNKDB4MEI5NSxHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCkKLUdMX0VOVU0oMHgwQjk2LEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTKQotR0xfRU5VTSgweDBCOTcsR0xfU1RFTkNJTF9SRUYpCi1HTF9FTlVNKDB4MEI5OCxHTF9TVEVOQ0lMX1dSSVRFTUFTSykKLUdMX0VOVU0oMHgwQkEwLEdMX01BVFJJWF9NT0RFKQotR0xfRU5VTSgweDBCQTEsR0xfTk9STUFMSVpFKQotR0xfRU5VTSgweDBCQTIsR0xfVklFV1BPUlQpCi1HTF9FTlVNKDB4MEJBMyxHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgpCi1HTF9FTlVNKDB4MEJBNCxHTF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIKQotR0xfRU5VTSgweDBCQTUsR0xfVEVYVFVSRV9TVEFDS19ERVBUSCkKLUdMX0VOVU0oMHgwQkE2LEdMX01PREVMVklFV19NQVRSSVgpCi1HTF9FTlVNKDB4MEJBNyxHTF9QUk9KRUNUSU9OX01BVFJJWCkKLUdMX0VOVU0oMHgwQkE4LEdMX1RFWFRVUkVfTUFUUklYKQotR0xfRU5VTSgweDBCQzAsR0xfQUxQSEFfVEVTVCkKLUdMX0VOVU0oMHgwQkMxLEdMX0FMUEhBX1RFU1RfRlVOQykKLUdMX0VOVU0oMHgwQkMyLEdMX0FMUEhBX1RFU1RfUkVGKQotR0xfRU5VTSgweDBCRDAsR0xfRElUSEVSKQotR0xfRU5VTSgweDBCRTAsR0xfQkxFTkRfRFNUKQotR0xfRU5VTSgweDBCRTEsR0xfQkxFTkRfU1JDKQotR0xfRU5VTSgweDBCRTIsR0xfQkxFTkQpCi1HTF9FTlVNKDB4MEJGMCxHTF9MT0dJQ19PUF9NT0RFKQotR0xfRU5VTSgweDBCRjIsR0xfQ09MT1JfTE9HSUNfT1ApCi1HTF9FTlVNKDB4MEMwMixHTF9SRUFEX0JVRkZFUl9OVikKLUdMX0VOVU0oMHgwQzEwLEdMX1NDSVNTT1JfQk9YKQotR0xfRU5VTSgweDBDMTEsR0xfU0NJU1NPUl9URVNUKQotR0xfRU5VTSgweDBDMjIsR0xfQ09MT1JfQ0xFQVJfVkFMVUUpCi1HTF9FTlVNKDB4MEMyMyxHTF9DT0xPUl9XUklURU1BU0spCi1HTF9FTlVNKDB4MEM1MCxHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQpCi1HTF9FTlVNKDB4MEM1MSxHTF9QT0lOVF9TTU9PVEhfSElOVCkKLUdMX0VOVU0oMHgwQzUyLEdMX0xJTkVfU01PT1RIX0hJTlQpCi1HTF9FTlVNKDB4MEM1NCxHTF9GT0dfSElOVCkKLUdMX0VOVU0oMHgwQ0YyLEdMX1VOUEFDS19ST1dfTEVOR1RIKQotR0xfRU5VTSgweDBDRjMsR0xfVU5QQUNLX1NLSVBfUk9XUykKLUdMX0VOVU0oMHgwQ0Y0LEdMX1VOUEFDS19TS0lQX1BJWEVMUykKLUdMX0VOVU0oMHgwQ0Y1LEdMX1VOUEFDS19BTElHTk1FTlQpCi1HTF9FTlVNKDB4MEQwNSxHTF9QQUNLX0FMSUdOTUVOVCkKLUdMX0VOVU0oMHgwRDFDLEdMX0FMUEhBX1NDQUxFKQotR0xfRU5VTSgweDBEMzEsR0xfTUFYX0xJR0hUUykKLUdMX0VOVU0oMHgwRDMyLEdMX01BWF9DTElQX1BMQU5FUykKLUdMX0VOVU0oMHgwRDMzLEdMX01BWF9URVhUVVJFX1NJWkUpCi1HTF9FTlVNKDB4MEQzNixHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIKQotR0xfRU5VTSgweDBEMzgsR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgpCi1HTF9FTlVNKDB4MEQzOSxHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCkKLUdMX0VOVU0oMHgwRDNBLEdMX01BWF9WSUVXUE9SVF9ESU1TKQotR0xfRU5VTSgweDBENTAsR0xfU1VCUElYRUxfQklUUykKLUdMX0VOVU0oMHgwRDUyLEdMX1JFRF9CSVRTKQotR0xfRU5VTSgweDBENTMsR0xfR1JFRU5fQklUUykKLUdMX0VOVU0oMHgwRDU0LEdMX0JMVUVfQklUUykKLUdMX0VOVU0oMHgwRDU1LEdMX0FMUEhBX0JJVFMpCi1HTF9FTlVNKDB4MEQ1NixHTF9ERVBUSF9CSVRTKQotR0xfRU5VTSgweDBENTcsR0xfU1RFTkNJTF9CSVRTKQotR0xfRU5VTSgweDBERTEsR0xfVEVYVFVSRV8yRCkKLUdMX0VOVU0oMHgxMTAwLEdMX0RPTlRfQ0FSRSkKLUdMX0VOVU0oMHgxMTAxLEdMX0ZBU1RFU1QpCi1HTF9FTlVNKDB4MTEwMixHTF9OSUNFU1QpCi1HTF9FTlVNKDB4MTIwMCxHTF9BTUJJRU5UKQotR0xfRU5VTSgweDEyMDEsR0xfRElGRlVTRSkKLUdMX0VOVU0oMHgxMjAyLEdMX1NQRUNVTEFSKQotR0xfRU5VTSgweDEyMDMsR0xfUE9TSVRJT04pCi1HTF9FTlVNKDB4MTIwNCxHTF9TUE9UX0RJUkVDVElPTikKLUdMX0VOVU0oMHgxMjA1LEdMX1NQT1RfRVhQT05FTlQpCi1HTF9FTlVNKDB4MTIwNixHTF9TUE9UX0NVVE9GRikKLUdMX0VOVU0oMHgxMjA3LEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OKQotR0xfRU5VTSgweDEyMDgsR0xfTElORUFSX0FUVEVOVUFUSU9OKQotR0xfRU5VTSgweDEyMDksR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OKQotR0xfRU5VTSgweDE0MDAsR0xfQllURSkKLUdMX0VOVU0oMHgxNDAxLEdMX1VOU0lHTkVEX0JZVEUpCi1HTF9FTlVNKDB4MTQwMixHTF9TSE9SVCkKLUdMX0VOVU0oMHgxNDAzLEdMX1VOU0lHTkVEX1NIT1JUKQotR0xfRU5VTSgweDE0MDQsR0xfSU5UKQotR0xfRU5VTSgweDE0MDUsR0xfVU5TSUdORURfSU5UKQotR0xfRU5VTSgweDE0MDYsR0xfRkxPQVQpCi1HTF9FTlVNKDB4MTQwQyxHTF9GSVhFRCkKLUdMX0VOVU0oMHgxNTAwLEdMX0NMRUFSKQotR0xfRU5VTSgweDE1MDEsR0xfQU5EKQotR0xfRU5VTSgweDE1MDIsR0xfQU5EX1JFVkVSU0UpCi1HTF9FTlVNKDB4MTUwMyxHTF9DT1BZKQotR0xfRU5VTSgweDE1MDQsR0xfQU5EX0lOVkVSVEVEKQotR0xfRU5VTSgweDE1MDUsR0xfTk9PUCkKLUdMX0VOVU0oMHgxNTA2LEdMX1hPUikKLUdMX0VOVU0oMHgxNTA3LEdMX09SKQotR0xfRU5VTSgweDE1MDgsR0xfTk9SKQotR0xfRU5VTSgweDE1MDksR0xfRVFVSVYpCi1HTF9FTlVNKDB4MTUwQSxHTF9JTlZFUlQpCi1HTF9FTlVNKDB4MTUwQixHTF9PUl9SRVZFUlNFKQotR0xfRU5VTSgweDE1MEMsR0xfQ09QWV9JTlZFUlRFRCkKLUdMX0VOVU0oMHgxNTBELEdMX09SX0lOVkVSVEVEKQotR0xfRU5VTSgweDE1MEUsR0xfTkFORCkKLUdMX0VOVU0oMHgxNTBGLEdMX1NFVCkKLUdMX0VOVU0oMHgxNjAwLEdMX0VNSVNTSU9OKQotR0xfRU5VTSgweDE2MDEsR0xfU0hJTklORVNTKQotR0xfRU5VTSgweDE2MDIsR0xfQU1CSUVOVF9BTkRfRElGRlVTRSkKLUdMX0VOVU0oMHgxNzAwLEdMX01PREVMVklFVykKLUdMX0VOVU0oMHgxNzAxLEdMX1BST0pFQ1RJT04pCi1HTF9FTlVNKDB4MTcwMixHTF9URVhUVVJFKQotR0xfRU5VTSgweDE4MDAsR0xfQ09MT1JfRVhUKQotR0xfRU5VTSgweDE4MDEsR0xfREVQVEhfRVhUKQotR0xfRU5VTSgweDE4MDIsR0xfU1RFTkNJTF9FWFQpCi1HTF9FTlVNKDB4MTkwMSxHTF9TVEVOQ0lMX0lOREVYKQotR0xfRU5VTSgweDE5MDIsR0xfREVQVEhfQ09NUE9ORU5UKQotR0xfRU5VTSgweDE5MDMsR0xfUkVEX0VYVCkKLUdMX0VOVU0oMHgxOTA2LEdMX0FMUEhBKQotR0xfRU5VTSgweDE5MDcsR0xfUkdCKQotR0xfRU5VTSgweDE5MDgsR0xfUkdCQSkKLUdMX0VOVU0oMHgxOTA5LEdMX0xVTUlOQU5DRSkKLUdMX0VOVU0oMHgxOTBBLEdMX0xVTUlOQU5DRV9BTFBIQSkKLUdMX0VOVU0oMHgxRDAwLEdMX0ZMQVQpCi1HTF9FTlVNKDB4MUQwMSxHTF9TTU9PVEgpCi1HTF9FTlVNKDB4MUUwMCxHTF9LRUVQKQotR0xfRU5VTSgweDFFMDEsR0xfUkVQTEFDRSkKLUdMX0VOVU0oMHgxRTAyLEdMX0lOQ1IpCi1HTF9FTlVNKDB4MUUwMyxHTF9ERUNSKQotR0xfRU5VTSgweDFGMDAsR0xfVkVORE9SKQotR0xfRU5VTSgweDFGMDEsR0xfUkVOREVSRVIpCi1HTF9FTlVNKDB4MUYwMixHTF9WRVJTSU9OKQotR0xfRU5VTSgweDFGMDMsR0xfRVhURU5TSU9OUykKLUdMX0VOVU0oMHgyMTAwLEdMX01PRFVMQVRFKQotR0xfRU5VTSgweDIxMDEsR0xfREVDQUwpCi1HTF9FTlVNKDB4MjIwMCxHTF9URVhUVVJFX0VOVl9NT0RFKQotR0xfRU5VTSgweDIyMDEsR0xfVEVYVFVSRV9FTlZfQ09MT1IpCi1HTF9FTlVNKDB4MjMwMCxHTF9URVhUVVJFX0VOVikKLUdMX0VOVU0oMHgyNTAwLEdMX1RFWFRVUkVfR0VOX01PREVfT0VTKQotR0xfRU5VTSgweDI2MDAsR0xfTkVBUkVTVCkKLUdMX0VOVU0oMHgyNjAxLEdMX0xJTkVBUikKLUdMX0VOVU0oMHgyNzAwLEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QpCi1HTF9FTlVNKDB4MjcwMSxHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QpCi1HTF9FTlVNKDB4MjcwMixHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIpCi1HTF9FTlVNKDB4MjcwMyxHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUikKLUdMX0VOVU0oMHgyODAwLEdMX1RFWFRVUkVfTUFHX0ZJTFRFUikKLUdMX0VOVU0oMHgyODAxLEdMX1RFWFRVUkVfTUlOX0ZJTFRFUikKLUdMX0VOVU0oMHgyODAyLEdMX1RFWFRVUkVfV1JBUF9TKQotR0xfRU5VTSgweDI4MDMsR0xfVEVYVFVSRV9XUkFQX1QpCi1HTF9FTlVNKDB4MjkwMSxHTF9SRVBFQVQpCi1HTF9FTlVNKDB4MkEwMCxHTF9QT0xZR09OX09GRlNFVF9VTklUUykKLUdMX0VOVU0oMHgzMDAwLEdMX0NMSVBfUExBTkUwKQotR0xfRU5VTSgweDMwMDEsR0xfQ0xJUF9QTEFORTEpCi1HTF9FTlVNKDB4MzAwMixHTF9DTElQX1BMQU5FMikKLUdMX0VOVU0oMHgzMDAzLEdMX0NMSVBfUExBTkUzKQotR0xfRU5VTSgweDMwMDQsR0xfQ0xJUF9QTEFORTQpCi1HTF9FTlVNKDB4MzAwNSxHTF9DTElQX1BMQU5FNSkKLUdMX0VOVU0oMHg0MDAwLEdMX0xJR0hUMCkKLUdMX0VOVU0oMHg0MDAxLEdMX0xJR0hUMSkKLUdMX0VOVU0oMHg0MDAyLEdMX0xJR0hUMikKLUdMX0VOVU0oMHg0MDAzLEdMX0xJR0hUMykKLUdMX0VOVU0oMHg0MDA0LEdMX0xJR0hUNCkKLUdMX0VOVU0oMHg0MDA1LEdMX0xJR0hUNSkKLUdMX0VOVU0oMHg0MDA2LEdMX0xJR0hUNikKLUdMX0VOVU0oMHg0MDA3LEdMX0xJR0hUNykKLUdMX0VOVU0oMHg4MDAwLEdMX0NPVkVSQUdFX0JVRkZFUl9CSVRfTlYpCi1HTF9FTlVNKDB4ODAwMSxHTF9DT05TVEFOVF9DT0xPUikKLUdMX0VOVU0oMHg4MDAyLEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUikKLUdMX0VOVU0oMHg4MDAzLEdMX0NPTlNUQU5UX0FMUEhBKQotR0xfRU5VTSgweDgwMDQsR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBKQotR0xfRU5VTSgweDgwMDUsR0xfQkxFTkRfQ09MT1IpCi1HTF9FTlVNKDB4ODAwNixHTF9GVU5DX0FERF9PRVMpCi1HTF9FTlVNKDB4ODAwNyxHTF9NSU5fRVhUKQotR0xfRU5VTSgweDgwMDgsR0xfTUFYX0VYVCkKLUdMX0VOVU0oMHg4MDA5LEdMX0JMRU5EX0VRVUFUSU9OX1JHQl9PRVMpCi1HTF9FTlVNKDB4ODAwQSxHTF9GVU5DX1NVQlRSQUNUX09FUykKLUdMX0VOVU0oMHg4MDBCLEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVF9PRVMpCi1HTF9FTlVNKDB4ODAzMyxHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80KQotR0xfRU5VTSgweDgwMzQsR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSkKLUdMX0VOVU0oMHg4MDM3LEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwpCi1HTF9FTlVNKDB4ODAzOCxHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IpCi1HTF9FTlVNKDB4ODAzQSxHTF9SRVNDQUxFX05PUk1BTCkKLUdMX0VOVU0oMHg4MDNDLEdMX0FMUEhBOF9FWFQpCi1HTF9FTlVNKDB4ODA0MCxHTF9MVU1JTkFOQ0U4X0VYVCkKLUdMX0VOVU0oMHg4MDQ1LEdMX0xVTUlOQU5DRThfQUxQSEE4X0VYVCkKLUdMX0VOVU0oMHg4MDUxLEdMX1JHQjhfT0VTKQotR0xfRU5VTSgweDgwNTIsR0xfUkdCMTBfRVhUKQotR0xfRU5VTSgweDgwNTYsR0xfUkdCQTRfT0VTKQotR0xfRU5VTSgweDgwNTcsR0xfUkdCNV9BMV9PRVMpCi1HTF9FTlVNKDB4ODA1OCxHTF9SR0JBOF9PRVMpCi1HTF9FTlVNKDB4ODA1OSxHTF9SR0IxMF9BMl9FWFQpCi1HTF9FTlVNKDB4ODA2OSxHTF9URVhUVVJFX0JJTkRJTkdfMkQpCi1HTF9FTlVNKDB4ODA2QSxHTF9URVhUVVJFX0JJTkRJTkdfM0RfT0VTKQotR0xfRU5VTSgweDgwNkYsR0xfVEVYVFVSRV8zRF9PRVMpCi1HTF9FTlVNKDB4ODA3MixHTF9URVhUVVJFX1dSQVBfUl9PRVMpCi1HTF9FTlVNKDB4ODA3MyxHTF9NQVhfM0RfVEVYVFVSRV9TSVpFX09FUykKLUdMX0VOVU0oMHg4MDc0LEdMX1ZFUlRFWF9BUlJBWSkKLUdMX0VOVU0oMHg4MDc1LEdMX05PUk1BTF9BUlJBWSkKLUdMX0VOVU0oMHg4MDc2LEdMX0NPTE9SX0FSUkFZKQotR0xfRU5VTSgweDgwNzgsR0xfVEVYVFVSRV9DT09SRF9BUlJBWSkKLUdMX0VOVU0oMHg4MDdBLEdMX1ZFUlRFWF9BUlJBWV9TSVpFKQotR0xfRU5VTSgweDgwN0IsR0xfVkVSVEVYX0FSUkFZX1RZUEUpCi1HTF9FTlVNKDB4ODA3QyxHTF9WRVJURVhfQVJSQVlfU1RSSURFKQotR0xfRU5VTSgweDgwN0UsR0xfTk9STUFMX0FSUkFZX1RZUEUpCi1HTF9FTlVNKDB4ODA3RixHTF9OT1JNQUxfQVJSQVlfU1RSSURFKQotR0xfRU5VTSgweDgwODEsR0xfQ09MT1JfQVJSQVlfU0laRSkKLUdMX0VOVU0oMHg4MDgyLEdMX0NPTE9SX0FSUkFZX1RZUEUpCi1HTF9FTlVNKDB4ODA4MyxHTF9DT0xPUl9BUlJBWV9TVFJJREUpCi1HTF9FTlVNKDB4ODA4OCxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUpCi1HTF9FTlVNKDB4ODA4OSxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUpCi1HTF9FTlVNKDB4ODA4QSxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSkKLUdMX0VOVU0oMHg4MDhFLEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSKQotR0xfRU5VTSgweDgwOEYsR0xfTk9STUFMX0FSUkFZX1BPSU5URVIpCi1HTF9FTlVNKDB4ODA5MCxHTF9DT0xPUl9BUlJBWV9QT0lOVEVSKQotR0xfRU5VTSgweDgwOTIsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSKQotR0xfRU5VTSgweDgwOUQsR0xfTVVMVElTQU1QTEUpCi1HTF9FTlVNKDB4ODA5RSxHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpCi1HTF9FTlVNKDB4ODA5RixHTF9TQU1QTEVfQUxQSEFfVE9fT05FKQotR0xfRU5VTSgweDgwQTAsR0xfU0FNUExFX0NPVkVSQUdFKQotR0xfRU5VTSgweDgwQTgsR0xfU0FNUExFX0JVRkZFUlMpCi1HTF9FTlVNKDB4ODBBOSxHTF9TQU1QTEVTKQotR0xfRU5VTSgweDgwQUEsR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFKQotR0xfRU5VTSgweDgwQUIsR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCkKLUdMX0VOVU0oMHg4MEM4LEdMX0JMRU5EX0RTVF9SR0JfT0VTKQotR0xfRU5VTSgweDgwQzksR0xfQkxFTkRfU1JDX1JHQl9PRVMpCi1HTF9FTlVNKDB4ODBDQSxHTF9CTEVORF9EU1RfQUxQSEFfT0VTKQotR0xfRU5VTSgweDgwQ0IsR0xfQkxFTkRfU1JDX0FMUEhBX09FUykKLUdMX0VOVU0oMHg4MEUxLEdMX0JHUkFfRVhUKQotR0xfRU5VTSgweDgxMjYsR0xfUE9JTlRfU0laRV9NSU4pCi1HTF9FTlVNKDB4ODEyNyxHTF9QT0lOVF9TSVpFX01BWCkKLUdMX0VOVU0oMHg4MTI4LEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUpCi1HTF9FTlVNKDB4ODEyOSxHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTikKLUdMX0VOVU0oMHg4MTJGLEdMX0NMQU1QX1RPX0VER0UpCi1HTF9FTlVNKDB4ODEzRCxHTF9URVhUVVJFX01BWF9MRVZFTF9BUFBMRSkKLUdMX0VOVU0oMHg4MTkxLEdMX0dFTkVSQVRFX01JUE1BUCkKLUdMX0VOVU0oMHg4MTkyLEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UKQotR0xfRU5VTSgweDgxQTUsR0xfREVQVEhfQ09NUE9ORU5UMTZfT0VTKQotR0xfRU5VTSgweDgxQTYsR0xfREVQVEhfQ09NUE9ORU5UMjRfT0VTKQotR0xfRU5VTSgweDgxQTcsR0xfREVQVEhfQ09NUE9ORU5UMzJfT0VTKQotR0xfRU5VTSgweDgyMTAsR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT0xPUl9FTkNPRElOR19FWFQpCi1HTF9FTlVNKDB4ODIxMSxHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTVBPTkVOVF9UWVBFX0VYVCkKLUdMX0VOVU0oMHg4MjI3LEdMX1JHX0VYVCkKLUdMX0VOVU0oMHg4MjI5LEdMX1I4X0VYVCkKLUdMX0VOVU0oMHg4MjJCLEdMX1JHOF9FWFQpCi1HTF9FTlVNKDB4ODIyRCxHTF9SMTZGX0VYVCkKLUdMX0VOVU0oMHg4MjJGLEdMX1JHMTZGX0VYVCkKLUdMX0VOVU0oMHg4MjUyLEdMX0xPU0VfQ09OVEVYVF9PTl9SRVNFVF9FWFQpCi1HTF9FTlVNKDB4ODI1MyxHTF9HVUlMVFlfQ09OVEVYVF9SRVNFVF9FWFQpCi1HTF9FTlVNKDB4ODI1NCxHTF9JTk5PQ0VOVF9DT05URVhUX1JFU0VUX0VYVCkKLUdMX0VOVU0oMHg4MjU1LEdMX1VOS05PV05fQ09OVEVYVF9SRVNFVF9FWFQpCi1HTF9FTlVNKDB4ODI1NixHTF9SRVNFVF9OT1RJRklDQVRJT05fU1RSQVRFR1lfRVhUKQotR0xfRU5VTSgweDgyNTgsR0xfUFJPR1JBTV9TRVBBUkFCTEVfRVhUKQotR0xfRU5VTSgweDgyNTksR0xfQUNUSVZFX1BST0dSQU1fRVhUKQotR0xfRU5VTSgweDgyNUEsR0xfUFJPR1JBTV9QSVBFTElORV9CSU5ESU5HX0VYVCkKLUdMX0VOVU0oMHg4MjYxLEdMX05PX1JFU0VUX05PVElGSUNBVElPTl9FWFQpCi1HTF9FTlVNKDB4ODM2MyxHTF9VTlNJR05FRF9TSE9SVF81XzZfNSkKLUdMX0VOVU0oMHg4MzY1LEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWX0VYVCkKLUdMX0VOVU0oMHg4MzY2LEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWX0VYVCkKLUdMX0VOVU0oMHg4MzY4LEdMX1VOU0lHTkVEX0lOVF8yXzEwXzEwXzEwX1JFVl9FWFQpCi1HTF9FTlVNKDB4ODM3MCxHTF9NSVJST1JFRF9SRVBFQVRfT0VTKQotR0xfRU5VTSgweDgzRjAsR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCkKLUdMX0VOVU0oMHg4M0YxLEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUKQotR0xfRU5VTSgweDg0NkQsR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFKQotR0xfRU5VTSgweDg0NkUsR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFKQotR0xfRU5VTSgweDg0QzAsR0xfVEVYVFVSRTApCi1HTF9FTlVNKDB4ODRDMSxHTF9URVhUVVJFMSkKLUdMX0VOVU0oMHg4NEMyLEdMX1RFWFRVUkUyKQotR0xfRU5VTSgweDg0QzMsR0xfVEVYVFVSRTMpCi1HTF9FTlVNKDB4ODRDNCxHTF9URVhUVVJFNCkKLUdMX0VOVU0oMHg4NEM1LEdMX1RFWFRVUkU1KQotR0xfRU5VTSgweDg0QzYsR0xfVEVYVFVSRTYpCi1HTF9FTlVNKDB4ODRDNyxHTF9URVhUVVJFNykKLUdMX0VOVU0oMHg4NEM4LEdMX1RFWFRVUkU4KQotR0xfRU5VTSgweDg0QzksR0xfVEVYVFVSRTkpCi1HTF9FTlVNKDB4ODRDQSxHTF9URVhUVVJFMTApCi1HTF9FTlVNKDB4ODRDQixHTF9URVhUVVJFMTEpCi1HTF9FTlVNKDB4ODRDQyxHTF9URVhUVVJFMTIpCi1HTF9FTlVNKDB4ODRDRCxHTF9URVhUVVJFMTMpCi1HTF9FTlVNKDB4ODRDRSxHTF9URVhUVVJFMTQpCi1HTF9FTlVNKDB4ODRDRixHTF9URVhUVVJFMTUpCi1HTF9FTlVNKDB4ODREMCxHTF9URVhUVVJFMTYpCi1HTF9FTlVNKDB4ODREMSxHTF9URVhUVVJFMTcpCi1HTF9FTlVNKDB4ODREMixHTF9URVhUVVJFMTgpCi1HTF9FTlVNKDB4ODREMyxHTF9URVhUVVJFMTkpCi1HTF9FTlVNKDB4ODRENCxHTF9URVhUVVJFMjApCi1HTF9FTlVNKDB4ODRENSxHTF9URVhUVVJFMjEpCi1HTF9FTlVNKDB4ODRENixHTF9URVhUVVJFMjIpCi1HTF9FTlVNKDB4ODRENyxHTF9URVhUVVJFMjMpCi1HTF9FTlVNKDB4ODREOCxHTF9URVhUVVJFMjQpCi1HTF9FTlVNKDB4ODREOSxHTF9URVhUVVJFMjUpCi1HTF9FTlVNKDB4ODREQSxHTF9URVhUVVJFMjYpCi1HTF9FTlVNKDB4ODREQixHTF9URVhUVVJFMjcpCi1HTF9FTlVNKDB4ODREQyxHTF9URVhUVVJFMjgpCi1HTF9FTlVNKDB4ODRERCxHTF9URVhUVVJFMjkpCi1HTF9FTlVNKDB4ODRERSxHTF9URVhUVVJFMzApCi1HTF9FTlVNKDB4ODRERixHTF9URVhUVVJFMzEpCi1HTF9FTlVNKDB4ODRFMCxHTF9BQ1RJVkVfVEVYVFVSRSkKLUdMX0VOVU0oMHg4NEUxLEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSkKLUdMX0VOVU0oMHg4NEUyLEdMX01BWF9URVhUVVJFX1VOSVRTKQotR0xfRU5VTSgweDg0RTcsR0xfU1VCVFJBQ1QpCi1HTF9FTlVNKDB4ODRFOCxHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkVfT0VTKQotR0xfRU5VTSgweDg0RjIsR0xfQUxMX0NPTVBMRVRFRF9OVikKLUdMX0VOVU0oMHg4NEYzLEdMX0ZFTkNFX1NUQVRVU19OVikKLUdMX0VOVU0oMHg4NEY0LEdMX0ZFTkNFX0NPTkRJVElPTl9OVikKLUdMX0VOVU0oMHg4NEY5LEdMX0RFUFRIX1NURU5DSUxfT0VTKQotR0xfRU5VTSgweDg0RkEsR0xfVU5TSUdORURfSU5UXzI0XzhfT0VTKQotR0xfRU5VTSgweDg0RkQsR0xfTUFYX1RFWFRVUkVfTE9EX0JJQVNfRVhUKQotR0xfRU5VTSgweDg0RkUsR0xfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpCi1HTF9FTlVNKDB4ODRGRixHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpCi1HTF9FTlVNKDB4ODUwMCxHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MX0VYVCkKLUdMX0VOVU0oMHg4NTAxLEdMX1RFWFRVUkVfTE9EX0JJQVNfRVhUKQotR0xfRU5VTSgweDg1MDcsR0xfSU5DUl9XUkFQX09FUykKLUdMX0VOVU0oMHg4NTA4LEdMX0RFQ1JfV1JBUF9PRVMpCi1HTF9FTlVNKDB4ODUxMSxHTF9OT1JNQUxfTUFQX09FUykKLUdMX0VOVU0oMHg4NTEyLEdMX1JFRkxFQ1RJT05fTUFQX09FUykKLUdMX0VOVU0oMHg4NTEzLEdMX1RFWFRVUkVfQ1VCRV9NQVBfT0VTKQotR0xfRU5VTSgweDg1MTQsR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQX09FUykKLUdMX0VOVU0oMHg4NTE1LEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9PRVMpCi1HTF9FTlVNKDB4ODUxNixHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfT0VTKQotR0xfRU5VTSgweDg1MTcsR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX09FUykKLUdMX0VOVU0oMHg4NTE4LEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9PRVMpCi1HTF9FTlVNKDB4ODUxOSxHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfT0VTKQotR0xfRU5VTSgweDg1MUEsR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX09FUykKLUdMX0VOVU0oMHg4NTFDLEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkVfT0VTKQotR0xfRU5VTSgweDg1NzAsR0xfQ09NQklORSkKLUdMX0VOVU0oMHg4NTcxLEdMX0NPTUJJTkVfUkdCKQotR0xfRU5VTSgweDg1NzIsR0xfQ09NQklORV9BTFBIQSkKLUdMX0VOVU0oMHg4NTczLEdMX1JHQl9TQ0FMRSkKLUdMX0VOVU0oMHg4NTc0LEdMX0FERF9TSUdORUQpCi1HTF9FTlVNKDB4ODU3NSxHTF9JTlRFUlBPTEFURSkKLUdMX0VOVU0oMHg4NTc2LEdMX0NPTlNUQU5UKQotR0xfRU5VTSgweDg1NzcsR0xfUFJJTUFSWV9DT0xPUikKLUdMX0VOVU0oMHg4NTc4LEdMX1BSRVZJT1VTKQotR0xfRU5VTSgweDg1ODAsR0xfU1JDMF9SR0IpCi1HTF9FTlVNKDB4ODU4MSxHTF9TUkMxX1JHQikKLUdMX0VOVU0oMHg4NTgyLEdMX1NSQzJfUkdCKQotR0xfRU5VTSgweDg1ODgsR0xfU1JDMF9BTFBIQSkKLUdMX0VOVU0oMHg4NTg5LEdMX1NSQzFfQUxQSEEpCi1HTF9FTlVNKDB4ODU4QSxHTF9TUkMyX0FMUEhBKQotR0xfRU5VTSgweDg1OTAsR0xfT1BFUkFORDBfUkdCKQotR0xfRU5VTSgweDg1OTEsR0xfT1BFUkFORDFfUkdCKQotR0xfRU5VTSgweDg1OTIsR0xfT1BFUkFORDJfUkdCKQotR0xfRU5VTSgweDg1OTgsR0xfT1BFUkFORDBfQUxQSEEpCi1HTF9FTlVNKDB4ODU5OSxHTF9PUEVSQU5EMV9BTFBIQSkKLUdMX0VOVU0oMHg4NTlBLEdMX09QRVJBTkQyX0FMUEhBKQotR0xfRU5VTSgweDg1QjUsR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkdfT0VTKQotR0xfRU5VTSgweDg1QkEsR0xfVU5TSUdORURfU0hPUlRfOF84X0FQUExFKQotR0xfRU5VTSgweDg1QkIsR0xfVU5TSUdORURfU0hPUlRfOF84X1JFVl9BUFBMRSkKLUdMX0VOVU0oMHg4NjIyLEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCkKLUdMX0VOVU0oMHg4NjIzLEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSkKLUdMX0VOVU0oMHg4NjI0LEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFKQotR0xfRU5VTSgweDg2MjUsR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFKQotR0xfRU5VTSgweDg2MjYsR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCKQotR0xfRU5VTSgweDg2NDUsR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSKQotR0xfRU5VTSgweDg2QTIsR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTKQotR0xfRU5VTSgweDg2QTMsR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMpCi1HTF9FTlVNKDB4ODZBNCxHTF9NQVhfVkVSVEVYX1VOSVRTX09FUykKLUdMX0VOVU0oMHg4NkE5LEdMX1dFSUdIVF9BUlJBWV9UWVBFX09FUykKLUdMX0VOVU0oMHg4NkFBLEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfT0VTKQotR0xfRU5VTSgweDg2QUIsR0xfV0VJR0hUX0FSUkFZX1NJWkVfT0VTKQotR0xfRU5VTSgweDg2QUMsR0xfV0VJR0hUX0FSUkFZX1BPSU5URVJfT0VTKQotR0xfRU5VTSgweDg2QUQsR0xfV0VJR0hUX0FSUkFZX09FUykKLUdMX0VOVU0oMHg4NkFFLEdMX0RPVDNfUkdCKQotR0xfRU5VTSgweDg2QUYsR0xfRE9UM19SR0JBKQotR0xfRU5VTSgweDg3NDAsR0xfWjQwMF9CSU5BUllfQU1EKQotR0xfRU5VTSgweDg3NDEsR0xfUFJPR1JBTV9CSU5BUllfTEVOR1RIX09FUykKLUdMX0VOVU0oMHg4NzY0LEdMX0JVRkZFUl9TSVpFKQotR0xfRU5VTSgweDg3NjUsR0xfQlVGRkVSX1VTQUdFKQotR0xfRU5VTSgweDg3RUUsR0xfQVRDX1JHQkFfSU5URVJQT0xBVEVEX0FMUEhBX0FNRCkKLUdMX0VOVU0oMHg4N0Y5LEdMXzNEQ19YX0FNRCkKLUdMX0VOVU0oMHg4N0ZBLEdMXzNEQ19YWV9BTUQpCi1HTF9FTlVNKDB4ODdGRSxHTF9OVU1fUFJPR1JBTV9CSU5BUllfRk9STUFUU19PRVMpCi1HTF9FTlVNKDB4ODdGRixHTF9QUk9HUkFNX0JJTkFSWV9GT1JNQVRTX09FUykKLUdMX0VOVU0oMHg4ODAwLEdMX1NURU5DSUxfQkFDS19GVU5DKQotR0xfRU5VTSgweDg4MDEsR0xfU1RFTkNJTF9CQUNLX0ZBSUwpCi1HTF9FTlVNKDB4ODgwMixHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMKQotR0xfRU5VTSgweDg4MDMsR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTUykKLUdMX0VOVU0oMHg4ODE0LEdMX1JHQkEzMkZfRVhUKQotR0xfRU5VTSgweDg4MTUsR0xfUkdCMzJGX0VYVCkKLUdMX0VOVU0oMHg4ODE2LEdMX0FMUEhBMzJGX0VYVCkKLUdMX0VOVU0oMHg4ODE4LEdMX0xVTUlOQU5DRTMyRl9FWFQpCi1HTF9FTlVNKDB4ODgxOSxHTF9MVU1JTkFOQ0VfQUxQSEEzMkZfRVhUKQotR0xfRU5VTSgweDg4MUEsR0xfUkdCQTE2Rl9FWFQpCi1HTF9FTlVNKDB4ODgxQixHTF9SR0IxNkZfRVhUKQotR0xfRU5VTSgweDg4MUMsR0xfQUxQSEExNkZfRVhUKQotR0xfRU5VTSgweDg4MUUsR0xfTFVNSU5BTkNFMTZGX0VYVCkKLUdMX0VOVU0oMHg4ODFGLEdMX0xVTUlOQU5DRV9BTFBIQTE2Rl9FWFQpCi1HTF9FTlVNKDB4ODgyMyxHTF9XUklURU9OTFlfUkVOREVSSU5HX1FDT00pCi1HTF9FTlVNKDB4ODgyNCxHTF9NQVhfRFJBV19CVUZGRVJTX05WKQotR0xfRU5VTSgweDg4MjUsR0xfRFJBV19CVUZGRVIwX05WKQotR0xfRU5VTSgweDg4MjYsR0xfRFJBV19CVUZGRVIxX05WKQotR0xfRU5VTSgweDg4MjcsR0xfRFJBV19CVUZGRVIyX05WKQotR0xfRU5VTSgweDg4MjgsR0xfRFJBV19CVUZGRVIzX05WKQotR0xfRU5VTSgweDg4MjksR0xfRFJBV19CVUZGRVI0X05WKQotR0xfRU5VTSgweDg4MkEsR0xfRFJBV19CVUZGRVI1X05WKQotR0xfRU5VTSgweDg4MkIsR0xfRFJBV19CVUZGRVI2X05WKQotR0xfRU5VTSgweDg4MkMsR0xfRFJBV19CVUZGRVI3X05WKQotR0xfRU5VTSgweDg4MkQsR0xfRFJBV19CVUZGRVI4X05WKQotR0xfRU5VTSgweDg4MkUsR0xfRFJBV19CVUZGRVI5X05WKQotR0xfRU5VTSgweDg4MkYsR0xfRFJBV19CVUZGRVIxMF9OVikKLUdMX0VOVU0oMHg4ODMwLEdMX0RSQVdfQlVGRkVSMTFfTlYpCi1HTF9FTlVNKDB4ODgzMSxHTF9EUkFXX0JVRkZFUjEyX05WKQotR0xfRU5VTSgweDg4MzIsR0xfRFJBV19CVUZGRVIxM19OVikKLUdMX0VOVU0oMHg4ODMzLEdMX0RSQVdfQlVGRkVSMTRfTlYpCi1HTF9FTlVNKDB4ODgzNCxHTF9EUkFXX0JVRkZFUjE1X05WKQotR0xfRU5VTSgweDg4M0QsR0xfQkxFTkRfRVFVQVRJT05fQUxQSEFfT0VTKQotR0xfRU5VTSgweDg4NDAsR0xfTUFUUklYX1BBTEVUVEVfT0VTKQotR0xfRU5VTSgweDg4NDIsR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfT0VTKQotR0xfRU5VTSgweDg4NDMsR0xfQ1VSUkVOVF9QQUxFVFRFX01BVFJJWF9PRVMpCi1HTF9FTlVNKDB4ODg0NCxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfT0VTKQotR0xfRU5VTSgweDg4NDYsR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfT0VTKQotR0xfRU5VTSgweDg4NDcsR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTKQotR0xfRU5VTSgweDg4NDgsR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9PRVMpCi1HTF9FTlVNKDB4ODg0OSxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9PRVMpCi1HTF9FTlVNKDB4ODg0QyxHTF9URVhUVVJFX0NPTVBBUkVfTU9ERV9FWFQpCi1HTF9FTlVNKDB4ODg0RCxHTF9URVhUVVJFX0NPTVBBUkVfRlVOQ19FWFQpCi1HTF9FTlVNKDB4ODg0RSxHTF9DT01QQVJFX1JFRl9UT19URVhUVVJFX0VYVCkKLUdMX0VOVU0oMHg4ODYxLEdMX1BPSU5UX1NQUklURV9PRVMpCi1HTF9FTlVNKDB4ODg2MixHTF9DT09SRF9SRVBMQUNFX09FUykKLUdMX0VOVU0oMHg4ODY1LEdMX0NVUlJFTlRfUVVFUllfRVhUKQotR0xfRU5VTSgweDg4NjYsR0xfUVVFUllfUkVTVUxUX0VYVCkKLUdMX0VOVU0oMHg4ODY3LEdMX1FVRVJZX1JFU1VMVF9BVkFJTEFCTEVfRVhUKQotR0xfRU5VTSgweDg4NjksR0xfTUFYX1ZFUlRFWF9BVFRSSUJTKQotR0xfRU5VTSgweDg4NkEsR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEKQotR0xfRU5VTSgweDg4NzIsR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMpCi1HTF9FTlVNKDB4ODg5MixHTF9BUlJBWV9CVUZGRVIpCi1HTF9FTlVNKDB4ODg5MyxHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUikKLUdMX0VOVU0oMHg4ODk0LEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HKQotR0xfRU5VTSgweDg4OTUsR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORykKLUdMX0VOVU0oMHg4ODk2LEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORykKLUdMX0VOVU0oMHg4ODk3LEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORykKLUdMX0VOVU0oMHg4ODk4LEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HKQotR0xfRU5VTSgweDg4OUEsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORykKLUdMX0VOVU0oMHg4ODlFLEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMpCi1HTF9FTlVNKDB4ODg5RixHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HKQotR0xfRU5VTSgweDg4QjksR0xfV1JJVEVfT05MWV9PRVMpCi1HTF9FTlVNKDB4ODhCQixHTF9CVUZGRVJfQUNDRVNTX09FUykKLUdMX0VOVU0oMHg4OEJDLEdMX0JVRkZFUl9NQVBQRURfT0VTKQotR0xfRU5VTSgweDg4QkQsR0xfQlVGRkVSX01BUF9QT0lOVEVSX09FUykKLUdMX0VOVU0oMHg4OEUwLEdMX1NUUkVBTV9EUkFXKQotR0xfRU5VTSgweDg4RTQsR0xfU1RBVElDX0RSQVcpCi1HTF9FTlVNKDB4ODhFOCxHTF9EWU5BTUlDX0RSQVcpCi1HTF9FTlVNKDB4ODhGMCxHTF9ERVBUSDI0X1NURU5DSUw4X09FUykKLUdMX0VOVU0oMHg4OThBLEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMpCi1HTF9FTlVNKDB4ODk4QixHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMpCi1HTF9FTlVNKDB4ODk4QyxHTF9QT0lOVF9TSVpFX0FSUkFZX1BPSU5URVJfT0VTKQotR0xfRU5VTSgweDg5OEQsR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMpCi1HTF9FTlVNKDB4ODk4RSxHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMpCi1HTF9FTlVNKDB4ODk4RixHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMpCi1HTF9FTlVNKDB4OEExRixHTF9SR0JfNDIyX0FQUExFKQotR0xfRU5VTSgweDhBNEYsR0xfUFJPR1JBTV9QSVBFTElORV9PQkpFQ1RfRVhUKQotR0xfRU5VTSgweDhCMzAsR0xfRlJBR01FTlRfU0hBREVSKQotR0xfRU5VTSgweDhCMzEsR0xfVkVSVEVYX1NIQURFUikKLUdMX0VOVU0oMHg4QjQwLEdMX1BST0dSQU1fT0JKRUNUX0VYVCkKLUdMX0VOVU0oMHg4QjQ4LEdMX1NIQURFUl9PQkpFQ1RfRVhUKQotR0xfRU5VTSgweDhCNEMsR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTKQotR0xfRU5VTSgweDhCNEQsR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMpCi1HTF9FTlVNKDB4OEI0RixHTF9TSEFERVJfVFlQRSkKLUdMX0VOVU0oMHg4QjUwLEdMX0ZMT0FUX1ZFQzIpCi1HTF9FTlVNKDB4OEI1MSxHTF9GTE9BVF9WRUMzKQotR0xfRU5VTSgweDhCNTIsR0xfRkxPQVRfVkVDNCkKLUdMX0VOVU0oMHg4QjUzLEdMX0lOVF9WRUMyKQotR0xfRU5VTSgweDhCNTQsR0xfSU5UX1ZFQzMpCi1HTF9FTlVNKDB4OEI1NSxHTF9JTlRfVkVDNCkKLUdMX0VOVU0oMHg4QjU2LEdMX0JPT0wpCi1HTF9FTlVNKDB4OEI1NyxHTF9CT09MX1ZFQzIpCi1HTF9FTlVNKDB4OEI1OCxHTF9CT09MX1ZFQzMpCi1HTF9FTlVNKDB4OEI1OSxHTF9CT09MX1ZFQzQpCi1HTF9FTlVNKDB4OEI1QSxHTF9GTE9BVF9NQVQyKQotR0xfRU5VTSgweDhCNUIsR0xfRkxPQVRfTUFUMykKLUdMX0VOVU0oMHg4QjVDLEdMX0ZMT0FUX01BVDQpCi1HTF9FTlVNKDB4OEI1RSxHTF9TQU1QTEVSXzJEKQotR0xfRU5VTSgweDhCNUYsR0xfU0FNUExFUl8zRF9PRVMpCi1HTF9FTlVNKDB4OEI2MCxHTF9TQU1QTEVSX0NVQkUpCi1HTF9FTlVNKDB4OEI2MixHTF9TQU1QTEVSXzJEX1NIQURPV19FWFQpCi1HTF9FTlVNKDB4OEI4MCxHTF9ERUxFVEVfU1RBVFVTKQotR0xfRU5VTSgweDhCODEsR0xfQ09NUElMRV9TVEFUVVMpCi1HTF9FTlVNKDB4OEI4MixHTF9MSU5LX1NUQVRVUykKLUdMX0VOVU0oMHg4QjgzLEdMX1ZBTElEQVRFX1NUQVRVUykKLUdMX0VOVU0oMHg4Qjg0LEdMX0lORk9fTE9HX0xFTkdUSCkKLUdMX0VOVU0oMHg4Qjg1LEdMX0FUVEFDSEVEX1NIQURFUlMpCi1HTF9FTlVNKDB4OEI4NixHTF9BQ1RJVkVfVU5JRk9STVMpCi1HTF9FTlVNKDB4OEI4NyxHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIKQotR0xfRU5VTSgweDhCODgsR0xfU0hBREVSX1NPVVJDRV9MRU5HVEgpCi1HTF9FTlVNKDB4OEI4OSxHTF9BQ1RJVkVfQVRUUklCVVRFUykKLUdMX0VOVU0oMHg4QjhBLEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCkKLUdMX0VOVU0oMHg4QjhCLEdMX0ZSQUdNRU5UX1NIQURFUl9ERVJJVkFUSVZFX0hJTlRfT0VTKQotR0xfRU5VTSgweDhCOEMsR0xfU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OKQotR0xfRU5VTSgweDhCOEQsR0xfQ1VSUkVOVF9QUk9HUkFNKQotR0xfRU5VTSgweDhCOTAsR0xfUEFMRVRURTRfUkdCOF9PRVMpCi1HTF9FTlVNKDB4OEI5MSxHTF9QQUxFVFRFNF9SR0JBOF9PRVMpCi1HTF9FTlVNKDB4OEI5MixHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMpCi1HTF9FTlVNKDB4OEI5MyxHTF9QQUxFVFRFNF9SR0JBNF9PRVMpCi1HTF9FTlVNKDB4OEI5NCxHTF9QQUxFVFRFNF9SR0I1X0ExX09FUykKLUdMX0VOVU0oMHg4Qjk1LEdMX1BBTEVUVEU4X1JHQjhfT0VTKQotR0xfRU5VTSgweDhCOTYsR0xfUEFMRVRURThfUkdCQThfT0VTKQotR0xfRU5VTSgweDhCOTcsR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTKQotR0xfRU5VTSgweDhCOTgsR0xfUEFMRVRURThfUkdCQTRfT0VTKQotR0xfRU5VTSgweDhCOTksR0xfUEFMRVRURThfUkdCNV9BMV9PRVMpCi1HTF9FTlVNKDB4OEI5QSxHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTKQotR0xfRU5VTSgweDhCOUIsR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTKQotR0xfRU5VTSgweDhCOUMsR0xfUE9JTlRfU0laRV9BUlJBWV9PRVMpCi1HTF9FTlVNKDB4OEI5RCxHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMpCi1HTF9FTlVNKDB4OEI5RSxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTKQotR0xfRU5VTSgweDhCOUYsR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMpCi1HTF9FTlVNKDB4OEJDMCxHTF9DT1VOVEVSX1RZUEVfQU1EKQotR0xfRU5VTSgweDhCQzEsR0xfQ09VTlRFUl9SQU5HRV9BTUQpCi1HTF9FTlVNKDB4OEJDMixHTF9VTlNJR05FRF9JTlQ2NF9BTUQpCi1HTF9FTlVNKDB4OEJDMyxHTF9QRVJDRU5UQUdFX0FNRCkKLUdMX0VOVU0oMHg4QkM0LEdMX1BFUkZNT05fUkVTVUxUX0FWQUlMQUJMRV9BTUQpCi1HTF9FTlVNKDB4OEJDNSxHTF9QRVJGTU9OX1JFU1VMVF9TSVpFX0FNRCkKLUdMX0VOVU0oMHg4QkM2LEdMX1BFUkZNT05fUkVTVUxUX0FNRCkKLUdMX0VOVU0oMHg4QkQyLEdMX1RFWFRVUkVfV0lEVEhfUUNPTSkKLUdMX0VOVU0oMHg4QkQzLEdMX1RFWFRVUkVfSEVJR0hUX1FDT00pCi1HTF9FTlVNKDB4OEJENCxHTF9URVhUVVJFX0RFUFRIX1FDT00pCi1HTF9FTlVNKDB4OEJENSxHTF9URVhUVVJFX0lOVEVSTkFMX0ZPUk1BVF9RQ09NKQotR0xfRU5VTSgweDhCRDYsR0xfVEVYVFVSRV9GT1JNQVRfUUNPTSkKLUdMX0VOVU0oMHg4QkQ3LEdMX1RFWFRVUkVfVFlQRV9RQ09NKQotR0xfRU5VTSgweDhCRDgsR0xfVEVYVFVSRV9JTUFHRV9WQUxJRF9RQ09NKQotR0xfRU5VTSgweDhCRDksR0xfVEVYVFVSRV9OVU1fTEVWRUxTX1FDT00pCi1HTF9FTlVNKDB4OEJEQSxHTF9URVhUVVJFX1RBUkdFVF9RQ09NKQotR0xfRU5VTSgweDhCREIsR0xfVEVYVFVSRV9PQkpFQ1RfVkFMSURfUUNPTSkKLUdMX0VOVU0oMHg4QkRDLEdMX1NUQVRFX1JFU1RPUkUpCi1HTF9FTlVNKDB4OEMwMCxHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HKQotR0xfRU5VTSgweDhDMDEsR0xfQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRykKLUdMX0VOVU0oMHg4QzAyLEdMX0NPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HKQotR0xfRU5VTSgweDhDMDMsR0xfQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUcpCi1HTF9FTlVNKDB4OEMwNCxHTF9NT0RVTEFURV9DT0xPUl9JTUcpCi1HTF9FTlVNKDB4OEMwNSxHTF9SRUNJUF9BRERfU0lHTkVEX0FMUEhBX0lNRykKLUdMX0VOVU0oMHg4QzA2LEdMX1RFWFRVUkVfQUxQSEFfTU9EVUxBVEVfSU1HKQotR0xfRU5VTSgweDhDMDcsR0xfRkFDVE9SX0FMUEhBX01PRFVMQVRFX0lNRykKLUdMX0VOVU0oMHg4QzA4LEdMX0ZSQUdNRU5UX0FMUEhBX01PRFVMQVRFX0lNRykKLUdMX0VOVU0oMHg4QzA5LEdMX0FERF9CTEVORF9JTUcpCi1HTF9FTlVNKDB4OEMwQSxHTF9TR1hfQklOQVJZX0lNRykKLUdMX0VOVU0oMHg4QzE3LEdMX1VOU0lHTkVEX05PUk1BTElaRURfRVhUKQotR0xfRU5VTSgweDhDMkYsR0xfQU5ZX1NBTVBMRVNfUEFTU0VEX0VYVCkKLUdMX0VOVU0oMHg4QzQwLEdMX1NSR0JfRVhUKQotR0xfRU5VTSgweDhDNDIsR0xfU1JHQl9BTFBIQV9FWFQpCi1HTF9FTlVNKDB4OEM0MyxHTF9TUkdCOF9BTFBIQThfRVhUKQotR0xfRU5VTSgweDhDOTIsR0xfQVRDX1JHQl9BTUQpCi1HTF9FTlVNKDB4OEM5MyxHTF9BVENfUkdCQV9FWFBMSUNJVF9BTFBIQV9BTUQpCi1HTF9FTlVNKDB4OENBMyxHTF9TVEVOQ0lMX0JBQ0tfUkVGKQotR0xfRU5VTSgweDhDQTQsR0xfU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0spCi1HTF9FTlVNKDB4OENBNSxHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLKQotR0xfRU5VTSgweDhDQTYsR0xfRlJBTUVCVUZGRVJfQklORElOR19PRVMpCi1HTF9FTlVNKDB4OENBNyxHTF9SRU5ERVJCVUZGRVJfQklORElOR19PRVMpCi1HTF9FTlVNKDB4OENBOCxHTF9SRUFEX0ZSQU1FQlVGRkVSX0FQUExFKQotR0xfRU5VTSgweDhDQTksR0xfRFJBV19GUkFNRUJVRkZFUl9BUFBMRSkKLUdMX0VOVU0oMHg4Q0FBLEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElOR19BUFBMRSkKLUdMX0VOVU0oMHg4Q0FCLEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTX0FQUExFKQotR0xfRU5VTSgweDhDRDAsR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRV9PRVMpCi1HTF9FTlVNKDB4OENEMSxHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX09FUykKLUdMX0VOVU0oMHg4Q0QyLEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTF9PRVMpCi1HTF9FTlVNKDB4OENEMyxHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9PRVMpCi1HTF9FTlVNKDB4OENENCxHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfM0RfWk9GRlNFVF9PRVMpCi1HTF9FTlVNKDB4OENENSxHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9PRVMpCi1HTF9FTlVNKDB4OENENixHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRfT0VTKQotR0xfRU5VTSgweDhDRDcsR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfT0VTKQotR0xfRU5VTSgweDhDRDksR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TX09FUykKLUdMX0VOVU0oMHg4Q0RBLEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19PRVMpCi1HTF9FTlVNKDB4OENERCxHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9PRVMpCi1HTF9FTlVNKDB4OENERixHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfTlYpCi1HTF9FTlVNKDB4OENFMCxHTF9DT0xPUl9BVFRBQ0hNRU5UMF9PRVMpCi1HTF9FTlVNKDB4OENFMSxHTF9DT0xPUl9BVFRBQ0hNRU5UMV9OVikKLUdMX0VOVU0oMHg4Q0UyLEdMX0NPTE9SX0FUVEFDSE1FTlQyX05WKQotR0xfRU5VTSgweDhDRTMsR0xfQ09MT1JfQVRUQUNITUVOVDNfTlYpCi1HTF9FTlVNKDB4OENFNCxHTF9DT0xPUl9BVFRBQ0hNRU5UNF9OVikKLUdMX0VOVU0oMHg4Q0U1LEdMX0NPTE9SX0FUVEFDSE1FTlQ1X05WKQotR0xfRU5VTSgweDhDRTYsR0xfQ09MT1JfQVRUQUNITUVOVDZfTlYpCi1HTF9FTlVNKDB4OENFNyxHTF9DT0xPUl9BVFRBQ0hNRU5UN19OVikKLUdMX0VOVU0oMHg4Q0U4LEdMX0NPTE9SX0FUVEFDSE1FTlQ4X05WKQotR0xfRU5VTSgweDhDRTksR0xfQ09MT1JfQVRUQUNITUVOVDlfTlYpCi1HTF9FTlVNKDB4OENFQSxHTF9DT0xPUl9BVFRBQ0hNRU5UMTBfTlYpCi1HTF9FTlVNKDB4OENFQixHTF9DT0xPUl9BVFRBQ0hNRU5UMTFfTlYpCi1HTF9FTlVNKDB4OENFQyxHTF9DT0xPUl9BVFRBQ0hNRU5UMTJfTlYpCi1HTF9FTlVNKDB4OENFRCxHTF9DT0xPUl9BVFRBQ0hNRU5UMTNfTlYpCi1HTF9FTlVNKDB4OENFRSxHTF9DT0xPUl9BVFRBQ0hNRU5UMTRfTlYpCi1HTF9FTlVNKDB4OENFRixHTF9DT0xPUl9BVFRBQ0hNRU5UMTVfTlYpCi1HTF9FTlVNKDB4OEQwMCxHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUykKLUdMX0VOVU0oMHg4RDIwLEdMX1NURU5DSUxfQVRUQUNITUVOVF9PRVMpCi1HTF9FTlVNKDB4OEQ0MCxHTF9GUkFNRUJVRkZFUl9PRVMpCi1HTF9FTlVNKDB4OEQ0MSxHTF9SRU5ERVJCVUZGRVJfT0VTKQotR0xfRU5VTSgweDhENDIsR0xfUkVOREVSQlVGRkVSX1dJRFRIX09FUykKLUdMX0VOVU0oMHg4RDQzLEdMX1JFTkRFUkJVRkZFUl9IRUlHSFRfT0VTKQotR0xfRU5VTSgweDhENDQsR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVF9PRVMpCi1HTF9FTlVNKDB4OEQ0NixHTF9TVEVOQ0lMX0lOREVYMV9PRVMpCi1HTF9FTlVNKDB4OEQ0NyxHTF9TVEVOQ0lMX0lOREVYNF9PRVMpCi1HTF9FTlVNKDB4OEQ0OCxHTF9TVEVOQ0lMX0lOREVYOF9PRVMpCi1HTF9FTlVNKDB4OEQ1MCxHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkVfT0VTKQotR0xfRU5VTSgweDhENTEsR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkVfT0VTKQotR0xfRU5VTSgweDhENTIsR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRV9PRVMpCi1HTF9FTlVNKDB4OEQ1MyxHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9PRVMpCi1HTF9FTlVNKDB4OEQ1NCxHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9PRVMpCi1HTF9FTlVNKDB4OEQ1NSxHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX09FUykKLUdMX0VOVU0oMHg4RDU2LEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEVfQVBQTEUpCi1HTF9FTlVNKDB4OEQ1NyxHTF9NQVhfU0FNUExFU19BUFBMRSkKLUdMX0VOVU0oMHg4RDYwLEdMX1RFWFRVUkVfR0VOX1NUUl9PRVMpCi1HTF9FTlVNKDB4OEQ2MSxHTF9IQUxGX0ZMT0FUX09FUykKLUdMX0VOVU0oMHg4RDYyLEdMX1JHQjU2NV9PRVMpCi1HTF9FTlVNKDB4OEQ2NCxHTF9FVEMxX1JHQjhfT0VTKQotR0xfRU5VTSgweDhENjUsR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpCi1HTF9FTlVNKDB4OEQ2NixHTF9TQU1QTEVSX0VYVEVSTkFMX09FUykKLUdMX0VOVU0oMHg4RDY3LEdMX1RFWFRVUkVfQklORElOR19FWFRFUk5BTF9PRVMpCi1HTF9FTlVNKDB4OEQ2OCxHTF9SRVFVSVJFRF9URVhUVVJFX0lNQUdFX1VOSVRTX09FUykKLUdMX0VOVU0oMHg4RDZBLEdMX0FOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkVfRVhUKQotR0xfRU5VTSgweDhENkMsR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX1NBTVBMRVNfRVhUKQotR0xfRU5VTSgweDhERjAsR0xfTE9XX0ZMT0FUKQotR0xfRU5VTSgweDhERjEsR0xfTUVESVVNX0ZMT0FUKQotR0xfRU5VTSgweDhERjIsR0xfSElHSF9GTE9BVCkKLUdMX0VOVU0oMHg4REYzLEdMX0xPV19JTlQpCi1HTF9FTlVNKDB4OERGNCxHTF9NRURJVU1fSU5UKQotR0xfRU5VTSgweDhERjUsR0xfSElHSF9JTlQpCi1HTF9FTlVNKDB4OERGNixHTF9VTlNJR05FRF9JTlRfMTBfMTBfMTBfMl9PRVMpCi1HTF9FTlVNKDB4OERGNyxHTF9JTlRfMTBfMTBfMTBfMl9PRVMpCi1HTF9FTlVNKDB4OERGOCxHTF9TSEFERVJfQklOQVJZX0ZPUk1BVFMpCi1HTF9FTlVNKDB4OERGOSxHTF9OVU1fU0hBREVSX0JJTkFSWV9GT1JNQVRTKQotR0xfRU5VTSgweDhERkEsR0xfU0hBREVSX0NPTVBJTEVSKQotR0xfRU5VTSgweDhERkIsR0xfTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMpCi1HTF9FTlVNKDB4OERGQyxHTF9NQVhfVkFSWUlOR19WRUNUT1JTKQotR0xfRU5VTSgweDhERkQsR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUykKLUdMX0VOVU0oMHg4RTJDLEdMX0RFUFRIX0NPTVBPTkVOVDE2X05PTkxJTkVBUl9OVikKLUdMX0VOVU0oMHg4RUQwLEdMX0NPVkVSQUdFX0NPTVBPTkVOVF9OVikKLUdMX0VOVU0oMHg4RUQxLEdMX0NPVkVSQUdFX0NPTVBPTkVOVDRfTlYpCi1HTF9FTlVNKDB4OEVEMixHTF9DT1ZFUkFHRV9BVFRBQ0hNRU5UX05WKQotR0xfRU5VTSgweDhFRDMsR0xfQ09WRVJBR0VfQlVGRkVSU19OVikKLUdMX0VOVU0oMHg4RUQ0LEdMX0NPVkVSQUdFX1NBTVBMRVNfTlYpCi1HTF9FTlVNKDB4OEVENSxHTF9DT1ZFUkFHRV9BTExfRlJBR01FTlRTX05WKQotR0xfRU5VTSgweDhFRDYsR0xfQ09WRVJBR0VfRURHRV9GUkFHTUVOVFNfTlYpCi1HTF9FTlVNKDB4OEVENyxHTF9DT1ZFUkFHRV9BVVRPTUFUSUNfTlYpCi1HTF9FTlVNKDB4OEY2MCxHTF9NQUxJX1NIQURFUl9CSU5BUllfQVJNKQotR0xfRU5VTSgweDhGQTAsR0xfUEVSRk1PTl9HTE9CQUxfTU9ERV9RQ09NKQotR0xfRU5VTSgweDhGQzQsR0xfU0hBREVSX0JJTkFSWV9WSVYpCi1HTF9FTlVNKDB4OTBGMyxHTF9DT05URVhUX1JPQlVTVF9BQ0NFU1NfRVhUKQotR0xfRU5VTSgweDkxMkYsR0xfVEVYVFVSRV9JTU1VVEFCTEVfRk9STUFUX0VYVCkKLUdMX0VOVU0oMHg5MTMwLEdMX1NHWF9QUk9HUkFNX0JJTkFSWV9JTUcpCi1HTF9FTlVNKDB4OTEzMyxHTF9SRU5ERVJCVUZGRVJfU0FNUExFU19FWFQpCi1HTF9FTlVNKDB4OTEzNCxHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFX0VYVCkKLUdMX0VOVU0oMHg5MTM1LEdMX01BWF9TQU1QTEVTX0VYVCkKLUdMX0VOVU0oMHg5MTM2LEdMX1RFWFRVUkVfU0FNUExFU19JTUcpCi1HTF9FTlVNKDB4OTE1MSxHTF9CVUZGRVJfT0JKRUNUX0VYVCkKLUdMX0VOVU0oMHg5MTUzLEdMX1FVRVJZX09CSkVDVF9FWFQpCi1HTF9FTlVNKDB4OTE1NCxHTF9WRVJURVhfQVJSQVlfT0JKRUNUX0VYVCkKLUdMX0VOVU0oMHg5MjUwLEdMX1NIQURFUl9CSU5BUllfRE1QKQotR0xfRU5VTSgweDkzQTEsR0xfQkdSQThfRVhUKQotR0xfRU5VTSgweEZGRkZGRkZGLEdMX0FMTF9TSEFERVJfQklUU19FWFQpCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9nbGVzdHJhY2UuaCBiL29wZW5nbC9saWJzL2dsZXN0cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDhmOTdiLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL2dsZXN0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBBUEkgcHJvdmlkZWQgYnkgdGhlIGdsZXN0cmFjZSBsaWJyYXJ5LgotICovCi0KLSNpZm5kZWYgX0dMRVNfVFJBQ0VfSF8KLSNkZWZpbmUgX0dMRVNfVFJBQ0VfSF8KLQotI2luY2x1ZGUgImhvb2tzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyogSG9va3MgdG8gYmUgY2FsbGVkIGJ5ICJpbnRlcmVzdGluZyIgRUdMIGZ1bmN0aW9ucy4gKi8KLXZvaWQgR0xUcmFjZV9lZ2xDcmVhdGVDb250ZXh0KGludCB2ZXJzaW9uLCBFR0xDb250ZXh0IGMpOwotdm9pZCBHTFRyYWNlX2VnbE1ha2VDdXJyZW50KHVuc2lnbmVkIHZlcnNpb24sIGdsX2hvb2tzX3QgKmhvb2tzLCBFR0xDb250ZXh0IGMpOwotdm9pZCBHTFRyYWNlX2VnbFJlbGVhc2VUaHJlYWQoKTsKLXZvaWQgR0xUcmFjZV9lZ2xTd2FwQnVmZmVycyh2b2lkKiwgdm9pZCopOwotCi0vKiBTdGFydCBhbmQgc3RvcCBHTCBUcmFjaW5nLiAqLwotdm9pZCBHTFRyYWNlX3N0YXJ0KCk7Ci12b2lkIEdMVHJhY2Vfc3RvcCgpOwotCi0vKiBPYnRhaW4gdGhlIGdsX2hvb2tzIHN0cnVjdHVyZSBmaWxsZWQgd2l0aCB0aGUgdHJhY2UgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBHTCBmdW5jdGlvbnMuICovCi1nbF9ob29rc190ICpHTFRyYWNlX2dldEdMSG9va3MoKTsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9ob29rcy5oIGIvb3BlbmdsL2xpYnMvaG9va3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxYjM4OS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9ob29rcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogCi0gKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9HTEVTX0NNX0hPT0tTX0gKLSNkZWZpbmUgQU5EUk9JRF9HTEVTX0NNX0hPT0tTX0gKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2lmICFkZWZpbmVkKF9fYXJtX18pCi0jZGVmaW5lIFVTRV9TTE9XX0JJTkRJTkcgICAgICAgICAgICAxCi0jZWxzZQotI2RlZmluZSBVU0VfU0xPV19CSU5ESU5HICAgICAgICAgICAgMAotI2VuZGlmCi0jdW5kZWYgTkVMRU0KLSNkZWZpbmUgTkVMRU0oeCkgICAgICAgICAgICAgICAgICAgIChzaXplb2YoeCkvc2l6ZW9mKCooeCkpKQotCi0vLyBtYXhpbXVtIG51bWJlciBvZiBHTCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHkgaW4KLS8vIGEgZ2l2ZW4gcHJvY2Vzcy4gdGhpcyBsaW1pdGF0aW9uIGV4aXN0cyBiZWNhdXNlIHdlIG5lZWQgdG8gaGF2ZQotLy8gYSBzdGF0aWMgZnVuY3Rpb24gZm9yIGVhY2ggZXh0ZW5zaW9uIGFuZCBjdXJyZW50bHkgdGhlc2Ugc3RhdGljIGZ1bmN0aW9ucwotLy8gYXJlIGdlbmVyYXRlZCBhdCBjb21waWxlIHRpbWUuCi0jZGVmaW5lIE1BWF9OVU1CRVJfT0ZfR0xfRVhURU5TSU9OUyAyNTYKLQotCi0jaWYgZGVmaW5lZChIQVZFX0FORFJPSURfT1MpICYmICFVU0VfU0xPV19CSU5ESU5HICYmIF9fT1BUSU1JWkVfXwotI2RlZmluZSBVU0VfRkFTVF9UTFNfS0VZICAgICAgICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgVVNFX0ZBU1RfVExTX0tFWSAgICAgICAgICAgIDAKLSNlbmRpZgotCi0jaWYgVVNFX0ZBU1RfVExTX0tFWQotIyAgIGluY2x1ZGUgPGJpb25pY190bHMuaD4gIC8qIHNwZWNpYWwgcHJpdmF0ZSBDIGxpYnJhcnkgaGVhZGVyICovCi0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBHTCAvIEVHTCBob29rcwotCi0jdW5kZWYgR0xfRU5UUlkKLSN1bmRlZiBFR0xfRU5UUlkKLSNkZWZpbmUgR0xfRU5UUlkoX3IsIF9hcGksIC4uLikgX3IgKCpfYXBpKShfX1ZBX0FSR1NfXyk7Ci0jZGVmaW5lIEVHTF9FTlRSWShfciwgX2FwaSwgLi4uKSBfciAoKl9hcGkpKF9fVkFfQVJHU19fKTsKLQotc3RydWN0IGVnbF90IHsKLSAgICAjaW5jbHVkZSAiRUdML2VnbF9lbnRyaWVzLmluIgotfTsKLQotc3RydWN0IGdsX2hvb2tzX3QgewotICAgIHN0cnVjdCBnbF90IHsKLSAgICAgICAgI2luY2x1ZGUgImVudHJpZXMuaW4iCi0gICAgfSBnbDsKLSAgICBzdHJ1Y3QgZ2xfZXh0X3QgewotICAgICAgICBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGV4dGVuc2lvbnNbTUFYX05VTUJFUl9PRl9HTF9FWFRFTlNJT05TXTsKLSAgICB9IGV4dDsKLX07Ci0jdW5kZWYgR0xfRU5UUlkKLSN1bmRlZiBFR0xfRU5UUlkKLQotRUdMQVBJIHZvaWQgc2V0R2xUaHJlYWRTcGVjaWZpYyhnbF9ob29rc190IGNvbnN0ICp2YWx1ZSk7Ci1FR0xBUEkgZ2xfaG9va3NfdCBjb25zdCogZ2V0R2xUaHJlYWRTcGVjaWZpYygpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLyogQU5EUk9JRF9HTEVTX0NNX0hPT0tTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL3Rvb2xzL2dlbmZpbGVzIGIvb3BlbmdsL2xpYnMvdG9vbHMvZ2VuZmlsZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwYmJmMDguLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvdG9vbHMvZ2VuZmlsZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jISAvYmluL3NoCi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLi9nbGFwaWdlbiAuLi8uLi9pbmNsdWRlL0dMRVMvZ2wuaCAgICAgID4gLi4vR0xFU19DTS9nbF9hcGkuaW4KLS4vZ2xhcGlnZW4gLi4vLi4vaW5jbHVkZS9HTEVTL2dsZXh0LmggICA+IC4uL0dMRVNfQ00vZ2xleHRfYXBpLmluCi0uL2dsYXBpZ2VuIC4uLy4uL2luY2x1ZGUvR0xFUzIvZ2wyLmggICAgPiAuLi9HTEVTMi9nbDJfYXBpLmluCi0uL2dsYXBpZ2VuIC4uLy4uL2luY2x1ZGUvR0xFUzIvZ2wyZXh0LmggPiAuLi9HTEVTMi9nbDJleHRfYXBpLmluCi0KLS4vZ2xlbnRyeWdlbiAuLi8uLi9pbmNsdWRlL0dMRVMvZ2wuaCAgICAgID4gL3RtcC9nbF9lbnRyaWVzLmluCi0uL2dsZW50cnlnZW4gLi4vLi4vaW5jbHVkZS9HTEVTL2dsZXh0LmggICA+IC90bXAvZ2xleHRfZW50cmllcy5pbgotLi9nbGVudHJ5Z2VuIC4uLy4uL2luY2x1ZGUvR0xFUzIvZ2wyLmggICAgPiAvdG1wL2dsMl9lbnRyaWVzLmluCi0uL2dsZW50cnlnZW4gLi4vLi4vaW5jbHVkZS9HTEVTMi9nbDJleHQuaCA+IC90bXAvZ2wyZXh0X2VudHJpZXMuaW4KLQotY2F0IC90bXAvZ2xfZW50cmllcy5pbiBcCi0gICAgL3RtcC9nbGV4dF9lbnRyaWVzLmluIFwKLSAgICAvdG1wL2dsMl9lbnRyaWVzLmluIFwKLSAgICAvdG1wL2dsMmV4dF9lbnRyaWVzLmluIFwKLSAgICAgICAgfCBzb3J0IC10LCAtazIgXAotICAgICAgICB8IGF3ayAtRiwgJyFfWyQyXSsrJyBcCi0gICAgICAgICAgICA+IC4uL2VudHJpZXMuaW4KLQotLi9nbHRyYWNlZ2VuIC4uL2VudHJpZXMuaW4gPi4uL3RyYWNlLmluCi0KLWNhdCAuLi8uLi9pbmNsdWRlL0dMRVMvZ2wuaCBcCi0gICAgLi4vLi4vaW5jbHVkZS9HTEVTL2dsZXh0LmggXAotICAgIC4uLy4uL2luY2x1ZGUvR0xFUzIvZ2wyLmggXAotICAgIC4uLy4uL2luY2x1ZGUvR0xFUzIvZ2wyZXh0LmggXAotICAgICAgICB8IC4vZ2xlbnVtc2dlbiBcCi0gICAgICAgIHwgc29ydCBcCi0gICAgICAgID4gLi4vZW51bXMuaW4KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvdG9vbHMvZ2xhcGlnZW4gYi9vcGVuZ2wvbGlicy90b29scy9nbGFwaWdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ4MzM0Zi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy90b29scy9nbGFwaWdlbgorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSMhIC91c3IvYmluL3BlcmwKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi11c2Ugc3RyaWN0OwotCi1zdWIgcnRyaW0oJCkKLXsKLSAgICBteSAkc3RyaW5nID0gc2hpZnQ7Ci0gICAgJHN0cmluZyA9fiBzL1xzKyQvLzsKLSAgICByZXR1cm4gJHN0cmluZzsKLX0KLQotd2hpbGUgKG15ICRsaW5lID0gPD4pIHsKLSAgbmV4dCBpZiAkbGluZSA9fiAvXlwvLzsKLSAgbmV4dCBpZiAkbGluZSA9fiAvXiMvOwotICBuZXh0IGlmICRsaW5lID1+IC9eXHMqJC87Ci0gIGlmICgkbGluZSAhfiAvXkdMX0FQSShDQUxMKT9ccysoLispXHMrR0xfQVBJRU5UUllccysoW1x3XSspXHMqXCgoW15cKV0rKVwpOy8pIHsKLSAgICBuZXh0OwotICB9Ci0gIG15ICR0eXBlID0gcnRyaW0oJDIpOwotICBteSAkbmFtZSA9ICQzOwotICBteSAkYXJncyA9ICQ0OwotCi0gICNwcmludGYoIiVzIiwgJGxpbmUpOwotICAKLSAgbXkgJHByZWZpeCA9ICIiOwotICBpZiAoJG5hbWUgZXEgImdsR2V0U3RyaW5nIikgewotICAgICRwcmVmaXggPSAiX18iOwotICB9Ci0gIAotICBwcmludGYoIiVzIEFQSV9FTlRSWSglcyVzKSglcykiLCAkdHlwZSwgJHByZWZpeCwgJG5hbWUsICRhcmdzKTsKLSAgCi0gIHByaW50ZigiIHtcbiIpOwotICBpZiAoJHR5cGUgZXEgInZvaWQiKSB7Ci0gICAgcHJpbnRmKCIgICAgQ0FMTF9HTF9BUEkoJXMiLCAkbmFtZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCIgICAgQ0FMTF9HTF9BUElfUkVUVVJOKCVzIiwgJG5hbWUpOwotICB9Ci0gIG15IEBhcmdzID0gc3BsaXQgJywnLCAkYXJnczsKLSAgbXkgJGxlbiA9IHNjYWxhcihAYXJncyk7Ci0gIGZvciAobXkgJG51bSA9IDA7ICRudW0gPCAkbGVuOyAkbnVtKyspIHsKLSAgICBpZiAoJGFyZ3NbJG51bV0gbmUgInZvaWQiKSB7Ci0gICAgICBwcmludCAiLCAiOwotICAgICAgIwotICAgICAgIyBleHRyYWN0IHRoZSBuYW1lIGZyb20gdGhlIHBhcmFtZXRlcgotICAgICAgIyB0eXBlIG5hbWUKLSAgICAgICMgY29uc3QgdHlwZSAqbmFtZQotICAgICAgIyB0eXBlICpuYW1lCi0gICAgICAjIHR5cGUgbmFtZVs0XQotICAgICAgIwotICAgICAgaWYgKCRhcmdzWyRudW1dID1+IC8oXFMrXHMpK1wqKlxzKihbXHddKykvKSB7Ci0gICAgICAgIHByaW50ZigiJXMiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHByaW50ZigiKTtcbiIpOwotICBwcmludGYoIn1cbiIpOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL3Rvb2xzL2dsZW50cnlnZW4gYi9vcGVuZ2wvbGlicy90b29scy9nbGVudHJ5Z2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzBmMDQxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL3Rvb2xzL2dsZW50cnlnZW4KKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jISAvdXNyL2Jpbi9wZXJsCi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotdXNlIHN0cmljdDsKLQotc3ViIHJ0cmltKCQpCi17Ci0gICAgbXkgJHN0cmluZyA9IHNoaWZ0OwotICAgICRzdHJpbmcgPX4gcy9ccyskLy87Ci0gICAgcmV0dXJuICRzdHJpbmc7Ci19Ci0KLXdoaWxlIChteSAkbGluZSA9IDw+KSB7Ci0gIG5leHQgaWYgJGxpbmUgPX4gL15cLy87Ci0gIG5leHQgaWYgJGxpbmUgPX4gL14jLzsKLSAgbmV4dCBpZiAkbGluZSA9fiAvXlxzKiQvOwotICBpZiAoJGxpbmUgIX4gL15HTF9BUEkoQ0FMTCk/XHMrKC4rKVxzK0dMX0FQSUVOVFJZXHMrKFtcd10rKVxzKlwoKFteXCldKylcKTsvKSB7Ci0gICAgbmV4dDsKLSAgfQotICBteSAkdHlwZSA9IHJ0cmltKCQyKTsKLSAgbXkgJG5hbWUgPSAkMzsKLSAgbXkgJGFyZ3MgPSAkNDsKLQotICBwcmludGYoIkdMX0VOVFJZKCVzLCAlcywgJXMpXG4iLCAkdHlwZSwgJG5hbWUsICRhcmdzKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL3Rvb2xzL2dsZW51bXNnZW4gYi9vcGVuZ2wvbGlicy90b29scy9nbGVudW1zZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYWU1ZmJmLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL3Rvb2xzL2dsZW51bXNnZW4KKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jISAvdXNyL2Jpbi9wZXJsCi0jCi0jIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotdXNlIHN0cmljdDsKLQotbXkgJWVudW1IYXNoID0gKCk7Ci0KLXdoaWxlIChteSAkbGluZSA9IDxTVERJTj4pIHsKLSAgbmV4dCBpZiAkbGluZSA9fiAvXlwvLzsKLSAgIyBTa2lwIGJpdGZpZWxkIGRlZmluaXRpb25zLgotICBuZXh0IGlmICRsaW5lID1+IC9fQklUKFxkK198XHMrKS87Ci0gIGlmICgkbGluZSAhfiAvXiNkZWZpbmVccysoXFMrKVxzKygweFxTKykvKSB7Ci0gICAgbmV4dDsKLSAgfQotICBteSAkZW51bU5hbWUgPSAkMTsKLSAgbXkgJGVudW1WYWx1ZSA9ICQyOwotICBuZXh0IGlmIGV4aXN0cygkZW51bUhhc2ggeyAkZW51bVZhbHVlIH0pOwotICAkZW51bUhhc2ggeyAkZW51bVZhbHVlIH0gPSAkZW51bU5hbWU7Ci0gIHByaW50ZigiR0xfRU5VTSglcywlcylcbiIsICRlbnVtVmFsdWUsICRlbnVtTmFtZSk7Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvdG9vbHMvZ2x0cmFjZWdlbiBiL29wZW5nbC9saWJzL3Rvb2xzL2dsdHJhY2VnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhNDI2NTMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvdG9vbHMvZ2x0cmFjZWdlbgorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSMhIC91c3IvYmluL3BlcmwKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi11c2Ugc3RyaWN0OwotCi1zdWIgcnRyaW0oJCkKLXsKLSAgICBteSAkc3RyaW5nID0gc2hpZnQ7Ci0gICAgJHN0cmluZyA9fiBzL1xzKyQvLzsKLSAgICByZXR1cm4gJHN0cmluZzsKLX0KLQotd2hpbGUgKG15ICRsaW5lID0gPD4pIHsKLSAgbmV4dCBpZiAkbGluZSA9fiAvXlwvLzsKLSAgbmV4dCBpZiAkbGluZSA9fiAvXiMvOwotICBuZXh0IGlmICRsaW5lID1+IC9eXHMqJC87Ci0gIGlmICgkbGluZSAhfiAvXkdMX0VOVFJZXCgoW14sXSspLCAoW14sXSspLCAoW15cKV0rKVwpLykgewotICAgIG5leHQ7Ci0gIH0KLSAgbXkgJHR5cGUgPSAkMTsKLSAgbXkgJG5hbWUgPSAkMjsKLSAgbXkgJGFyZ3MgPSAkMzsKLSAgCi0gIG15IEBhcmdzID0gc3BsaXQgJywnLCAkYXJnczsKLSAgbXkgJGxlbiA9IHNjYWxhcihAYXJncyk7Ci0gIG15ICRub25Wb2lkQXJnTGVuID0gMDsKLSAgZm9yIChteSAkbnVtID0gMDsgJG51bSA8ICRsZW47ICRudW0rKykgewotICAgIGlmICgkYXJnc1skbnVtXSBuZSAidm9pZCIpIHsKLSAgICAgICRub25Wb2lkQXJnTGVuKys7Ci0gICAgfQotICB9Ci0gIGlmICgkdHlwZSBlcSAidm9pZCIpIHsKLSAgICBwcmludGYoIlRSQUNFX0dMX1ZPSUQoIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJUUkFDRV9HTCglcywgIiwgJHR5cGUpOwotICB9Ci0gIAotICBwcmludGYoIiVzLCAoJXMpLCAoIiwgJG5hbWUsICRhcmdzKTsKLSAgICBmb3IgKG15ICRudW0gPSAwOyAkbnVtIDwgJGxlbjsgJG51bSsrKSB7Ci0gICAgaWYgKCRhcmdzWyRudW1dIG5lICJ2b2lkIikgewotICAgICAgaWYgKCRudW0gPiAwKSB7Ci0gICAgICAgIHByaW50ICIsICI7Ci0gICAgICB9Ci0gICAgICAjCi0gICAgICAjIGV4dHJhY3QgdGhlIG5hbWUgZnJvbSB0aGUgcGFyYW1ldGVyCi0gICAgICAjIHR5cGUgbmFtZQotICAgICAgIyBjb25zdCB0eXBlICpuYW1lCi0gICAgICAjIHR5cGUgKm5hbWUKLSAgICAgICMgdHlwZSBuYW1lWzRdCi0gICAgICAjCi0gICAgICBpZiAoJGFyZ3NbJG51bV0gPX4gLyhcUytccykrXCoqXHMqKFtcd10rKS8pIHsKLSAgICAgICAgcHJpbnRmKCIlcyIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcHJpbnRmKCIpLCAlZCIsICRub25Wb2lkQXJnTGVuKTsKLSAgZm9yIChteSAkbnVtID0gMDsgJG51bSA8ICRsZW47ICRudW0rKykgewotICAgIGlmICgkYXJnc1skbnVtXSBuZSAidm9pZCIpIHsKLSAgICAgICMKLSAgICAgICMgZXh0cmFjdCB0aGUgbmFtZSBmcm9tIHRoZSBwYXJhbWV0ZXIKLSAgICAgICMgdHlwZSBuYW1lCi0gICAgICAjIGNvbnN0IHR5cGUgKm5hbWUKLSAgICAgICMgdHlwZSAqbmFtZQotICAgICAgIyB0eXBlIG5hbWVbNF0KLSAgICAgICMKLSAgICAgIG15ICRhcmcgPSAkYXJnc1skbnVtXTsKLSAgICAgIGlmICgkYXJnID1+IC8oXFMrXHMpK1wqKlxzKihbXHddKykvKSB7Ci0gICAgICAgIG15ICRuYW1lID0gJDI7Ci0gICAgICAgIGlmICgkYXJnID1+IC8oKGNvbnN0ICkqKFxTK1xzKStcKiopXHMqKFtcd10rKS8pIHsKLSAgICAgICAgICBteSAkdHlwZSA9IHJ0cmltKCQxKTsKLSAgICAgICAgICBwcmludGYoIiwgXCIlc1wiLCAlcyIsICR0eXBlLCAkbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcHJpbnRmKCIpXG4iKTsKLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy90cmFjZS5pbiBiL29wZW5nbC9saWJzL3RyYWNlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWM1Yzg0Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL3RyYWNlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLVRSQUNFX0dMX1ZPSUQoZ2xBY3RpdmVTaGFkZXJQcm9ncmFtRVhULCAoR0x1aW50IHBpcGVsaW5lLCBHTHVpbnQgcHJvZ3JhbSksIChwaXBlbGluZSwgcHJvZ3JhbSksIDIsICJHTHVpbnQiLCBwaXBlbGluZSwgIkdMdWludCIsIHByb2dyYW0pCi1UUkFDRV9HTF9WT0lEKGdsQWN0aXZlVGV4dHVyZSwgKEdMZW51bSB0ZXh0dXJlKSwgKHRleHR1cmUpLCAxLCAiR0xlbnVtIiwgdGV4dHVyZSkKLVRSQUNFX0dMX1ZPSUQoZ2xBbHBoYUZ1bmMsIChHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKSwgKGZ1bmMsIHJlZiksIDIsICJHTGVudW0iLCBmdW5jLCAiR0xjbGFtcGYiLCByZWYpCi1UUkFDRV9HTF9WT0lEKGdsQWxwaGFGdW5jUUNPTSwgKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpLCAoZnVuYywgcmVmKSwgMiwgIkdMZW51bSIsIGZ1bmMsICJHTGNsYW1wZiIsIHJlZikKLVRSQUNFX0dMX1ZPSUQoZ2xBbHBoYUZ1bmN4LCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZiksIChmdW5jLCByZWYpLCAyLCAiR0xlbnVtIiwgZnVuYywgIkdMY2xhbXB4IiwgcmVmKQotVFJBQ0VfR0xfVk9JRChnbEFscGhhRnVuY3hPRVMsIChHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKSwgKGZ1bmMsIHJlZiksIDIsICJHTGVudW0iLCBmdW5jLCAiR0xjbGFtcHgiLCByZWYpCi1UUkFDRV9HTF9WT0lEKGdsQXR0YWNoU2hhZGVyLCAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpLCAocHJvZ3JhbSwgc2hhZGVyKSwgMiwgIkdMdWludCIsIHByb2dyYW0sICJHTHVpbnQiLCBzaGFkZXIpCi1UUkFDRV9HTF9WT0lEKGdsQmVnaW5QZXJmTW9uaXRvckFNRCwgKEdMdWludCBtb25pdG9yKSwgKG1vbml0b3IpLCAxLCAiR0x1aW50IiwgbW9uaXRvcikKLVRSQUNFX0dMX1ZPSUQoZ2xCZWdpblF1ZXJ5RVhULCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKSwgKHRhcmdldCwgaWQpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0x1aW50IiwgaWQpCi1UUkFDRV9HTF9WT0lEKGdsQmluZEF0dHJpYkxvY2F0aW9uLCAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyKiBuYW1lKSwgKHByb2dyYW0sIGluZGV4LCBuYW1lKSwgMywgIkdMdWludCIsIHByb2dyYW0sICJHTHVpbnQiLCBpbmRleCwgImNvbnN0IEdMY2hhcioiLCBuYW1lKQotVFJBQ0VfR0xfVk9JRChnbEJpbmRCdWZmZXIsIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKSwgKHRhcmdldCwgYnVmZmVyKSwgMiwgIkdMZW51bSIsIHRhcmdldCwgIkdMdWludCIsIGJ1ZmZlcikKLVRSQUNFX0dMX1ZPSUQoZ2xCaW5kRnJhbWVidWZmZXIsIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpLCAodGFyZ2V0LCBmcmFtZWJ1ZmZlciksIDIsICJHTGVudW0iLCB0YXJnZXQsICJHTHVpbnQiLCBmcmFtZWJ1ZmZlcikKLVRSQUNFX0dMX1ZPSUQoZ2xCaW5kRnJhbWVidWZmZXJPRVMsIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpLCAodGFyZ2V0LCBmcmFtZWJ1ZmZlciksIDIsICJHTGVudW0iLCB0YXJnZXQsICJHTHVpbnQiLCBmcmFtZWJ1ZmZlcikKLVRSQUNFX0dMX1ZPSUQoZ2xCaW5kUHJvZ3JhbVBpcGVsaW5lRVhULCAoR0x1aW50IHBpcGVsaW5lKSwgKHBpcGVsaW5lKSwgMSwgIkdMdWludCIsIHBpcGVsaW5lKQotVFJBQ0VfR0xfVk9JRChnbEJpbmRSZW5kZXJidWZmZXIsIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSwgKHRhcmdldCwgcmVuZGVyYnVmZmVyKSwgMiwgIkdMZW51bSIsIHRhcmdldCwgIkdMdWludCIsIHJlbmRlcmJ1ZmZlcikKLVRSQUNFX0dMX1ZPSUQoZ2xCaW5kUmVuZGVyYnVmZmVyT0VTLCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlciksICh0YXJnZXQsIHJlbmRlcmJ1ZmZlciksIDIsICJHTGVudW0iLCB0YXJnZXQsICJHTHVpbnQiLCByZW5kZXJidWZmZXIpCi1UUkFDRV9HTF9WT0lEKGdsQmluZFRleHR1cmUsIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSksICh0YXJnZXQsIHRleHR1cmUpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0x1aW50IiwgdGV4dHVyZSkKLVRSQUNFX0dMX1ZPSUQoZ2xCaW5kVmVydGV4QXJyYXlPRVMsIChHTHVpbnQgYXJyYXkpLCAoYXJyYXkpLCAxLCAiR0x1aW50IiwgYXJyYXkpCi1UUkFDRV9HTF9WT0lEKGdsQmxlbmRDb2xvciwgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSwgNCwgIkdMY2xhbXBmIiwgcmVkLCAiR0xjbGFtcGYiLCBncmVlbiwgIkdMY2xhbXBmIiwgYmx1ZSwgIkdMY2xhbXBmIiwgYWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQmxlbmRFcXVhdGlvbiwgKCBHTGVudW0gbW9kZSApLCAobW9kZSksIDEsICJHTGVudW0iLCBtb2RlKQotVFJBQ0VfR0xfVk9JRChnbEJsZW5kRXF1YXRpb25PRVMsIChHTGVudW0gbW9kZSksIChtb2RlKSwgMSwgIkdMZW51bSIsIG1vZGUpCi1UUkFDRV9HTF9WT0lEKGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlLCAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpLCAobW9kZVJHQiwgbW9kZUFscGhhKSwgMiwgIkdMZW51bSIsIG1vZGVSR0IsICJHTGVudW0iLCBtb2RlQWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTLCAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpLCAobW9kZVJHQiwgbW9kZUFscGhhKSwgMiwgIkdMZW51bSIsIG1vZGVSR0IsICJHTGVudW0iLCBtb2RlQWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQmxlbmRGdW5jLCAoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKSwgKHNmYWN0b3IsIGRmYWN0b3IpLCAyLCAiR0xlbnVtIiwgc2ZhY3RvciwgIkdMZW51bSIsIGRmYWN0b3IpCi1UUkFDRV9HTF9WT0lEKGdsQmxlbmRGdW5jU2VwYXJhdGUsIChHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSksIChzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhKSwgNCwgIkdMZW51bSIsIHNyY1JHQiwgIkdMZW51bSIsIGRzdFJHQiwgIkdMZW51bSIsIHNyY0FscGhhLCAiR0xlbnVtIiwgZHN0QWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQmxlbmRGdW5jU2VwYXJhdGVPRVMsIChHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSksIChzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhKSwgNCwgIkdMZW51bSIsIHNyY1JHQiwgIkdMZW51bSIsIGRzdFJHQiwgIkdMZW51bSIsIHNyY0FscGhhLCAiR0xlbnVtIiwgZHN0QWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQmxpdEZyYW1lYnVmZmVyQU5HTEUsIChHTGludCBzcmNYMCwgR0xpbnQgc3JjWTAsIEdMaW50IHNyY1gxLCBHTGludCBzcmNZMSwgR0xpbnQgZHN0WDAsIEdMaW50IGRzdFkwLCBHTGludCBkc3RYMSwgR0xpbnQgZHN0WTEsIEdMYml0ZmllbGQgbWFzaywgR0xlbnVtIGZpbHRlciksIChzcmNYMCwgc3JjWTAsIHNyY1gxLCBzcmNZMSwgZHN0WDAsIGRzdFkwLCBkc3RYMSwgZHN0WTEsIG1hc2ssIGZpbHRlciksIDEwLCAiR0xpbnQiLCBzcmNYMCwgIkdMaW50Iiwgc3JjWTAsICJHTGludCIsIHNyY1gxLCAiR0xpbnQiLCBzcmNZMSwgIkdMaW50IiwgZHN0WDAsICJHTGludCIsIGRzdFkwLCAiR0xpbnQiLCBkc3RYMSwgIkdMaW50IiwgZHN0WTEsICJHTGJpdGZpZWxkIiwgbWFzaywgIkdMZW51bSIsIGZpbHRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xCdWZmZXJEYXRhLCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSksICh0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKSwgNCwgIkdMZW51bSIsIHRhcmdldCwgIkdMc2l6ZWlwdHIiLCBzaXplLCAiY29uc3QgR0x2b2lkICoiLCBkYXRhLCAiR0xlbnVtIiwgdXNhZ2UpCi1UUkFDRV9HTF9WT0lEKGdsQnVmZmVyU3ViRGF0YSwgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpLCAodGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpLCA0LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnRwdHIiLCBvZmZzZXQsICJHTHNpemVpcHRyIiwgc2l6ZSwgImNvbnN0IEdMdm9pZCAqIiwgZGF0YSkKLVRSQUNFX0dMKEdMZW51bSwgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzLCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpLCAxLCAiR0xlbnVtIiwgdGFyZ2V0KQotVFJBQ0VfR0woR0xlbnVtLCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMsIChHTGVudW0gdGFyZ2V0KSwgKHRhcmdldCksIDEsICJHTGVudW0iLCB0YXJnZXQpCi1UUkFDRV9HTF9WT0lEKGdsQ2xlYXIsIChHTGJpdGZpZWxkIG1hc2spLCAobWFzayksIDEsICJHTGJpdGZpZWxkIiwgbWFzaykKLVRSQUNFX0dMX1ZPSUQoZ2xDbGVhckNvbG9yLCAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLCA0LCAiR0xjbGFtcGYiLCByZWQsICJHTGNsYW1wZiIsIGdyZWVuLCAiR0xjbGFtcGYiLCBibHVlLCAiR0xjbGFtcGYiLCBhbHBoYSkKLVRSQUNFX0dMX1ZPSUQoZ2xDbGVhckNvbG9yeCwgKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSwgNCwgIkdMY2xhbXB4IiwgcmVkLCAiR0xjbGFtcHgiLCBncmVlbiwgIkdMY2xhbXB4IiwgYmx1ZSwgIkdMY2xhbXB4IiwgYWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQ2xlYXJDb2xvcnhPRVMsIChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSksIDQsICJHTGNsYW1weCIsIHJlZCwgIkdMY2xhbXB4IiwgZ3JlZW4sICJHTGNsYW1weCIsIGJsdWUsICJHTGNsYW1weCIsIGFscGhhKQotVFJBQ0VfR0xfVk9JRChnbENsZWFyRGVwdGhmLCAoR0xjbGFtcGYgZGVwdGgpLCAoZGVwdGgpLCAxLCAiR0xjbGFtcGYiLCBkZXB0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xDbGVhckRlcHRoZk9FUywgKEdMY2xhbXBmIGRlcHRoKSwgKGRlcHRoKSwgMSwgIkdMY2xhbXBmIiwgZGVwdGgpCi1UUkFDRV9HTF9WT0lEKGdsQ2xlYXJEZXB0aHgsIChHTGNsYW1weCBkZXB0aCksIChkZXB0aCksIDEsICJHTGNsYW1weCIsIGRlcHRoKQotVFJBQ0VfR0xfVk9JRChnbENsZWFyRGVwdGh4T0VTLCAoR0xjbGFtcHggZGVwdGgpLCAoZGVwdGgpLCAxLCAiR0xjbGFtcHgiLCBkZXB0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xDbGVhclN0ZW5jaWwsIChHTGludCBzKSwgKHMpLCAxLCAiR0xpbnQiLCBzKQotVFJBQ0VfR0xfVk9JRChnbENsaWVudEFjdGl2ZVRleHR1cmUsIChHTGVudW0gdGV4dHVyZSksICh0ZXh0dXJlKSwgMSwgIkdMZW51bSIsIHRleHR1cmUpCi1UUkFDRV9HTF9WT0lEKGdsQ2xpcFBsYW5lZiwgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pLCAocGxhbmUsIGVxdWF0aW9uKSwgMiwgIkdMZW51bSIsIHBsYW5lLCAiY29uc3QgR0xmbG9hdCAqIiwgZXF1YXRpb24pCi1UUkFDRV9HTF9WT0lEKGdsQ2xpcFBsYW5lZklNRywgKEdMZW51bSBwLCBjb25zdCBHTGZsb2F0ICplcW4pLCAocCwgZXFuKSwgMiwgIkdMZW51bSIsIHAsICJjb25zdCBHTGZsb2F0ICoiLCBlcW4pCi1UUkFDRV9HTF9WT0lEKGdsQ2xpcFBsYW5lZk9FUywgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pLCAocGxhbmUsIGVxdWF0aW9uKSwgMiwgIkdMZW51bSIsIHBsYW5lLCAiY29uc3QgR0xmbG9hdCAqIiwgZXF1YXRpb24pCi1UUkFDRV9HTF9WT0lEKGdsQ2xpcFBsYW5leCwgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pLCAocGxhbmUsIGVxdWF0aW9uKSwgMiwgIkdMZW51bSIsIHBsYW5lLCAiY29uc3QgR0xmaXhlZCAqIiwgZXF1YXRpb24pCi1UUkFDRV9HTF9WT0lEKGdsQ2xpcFBsYW5leElNRywgKEdMZW51bSBwLCBjb25zdCBHTGZpeGVkICplcW4pLCAocCwgZXFuKSwgMiwgIkdMZW51bSIsIHAsICJjb25zdCBHTGZpeGVkICoiLCBlcW4pCi1UUkFDRV9HTF9WT0lEKGdsQ2xpcFBsYW5leE9FUywgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pLCAocGxhbmUsIGVxdWF0aW9uKSwgMiwgIkdMZW51bSIsIHBsYW5lLCAiY29uc3QgR0xmaXhlZCAqIiwgZXF1YXRpb24pCi1UUkFDRV9HTF9WT0lEKGdsQ29sb3I0ZiwgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLCA0LCAiR0xmbG9hdCIsIHJlZCwgIkdMZmxvYXQiLCBncmVlbiwgIkdMZmxvYXQiLCBibHVlLCAiR0xmbG9hdCIsIGFscGhhKQotVFJBQ0VfR0xfVk9JRChnbENvbG9yNHViLCAoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSksIDQsICJHTHVieXRlIiwgcmVkLCAiR0x1Ynl0ZSIsIGdyZWVuLCAiR0x1Ynl0ZSIsIGJsdWUsICJHTHVieXRlIiwgYWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQ29sb3I0eCwgKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLCA0LCAiR0xmaXhlZCIsIHJlZCwgIkdMZml4ZWQiLCBncmVlbiwgIkdMZml4ZWQiLCBibHVlLCAiR0xmaXhlZCIsIGFscGhhKQotVFJBQ0VfR0xfVk9JRChnbENvbG9yNHhPRVMsIChHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSwgNCwgIkdMZml4ZWQiLCByZWQsICJHTGZpeGVkIiwgZ3JlZW4sICJHTGZpeGVkIiwgYmx1ZSwgIkdMZml4ZWQiLCBhbHBoYSkKLVRSQUNFX0dMX1ZPSUQoZ2xDb2xvck1hc2ssIChHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLCA0LCAiR0xib29sZWFuIiwgcmVkLCAiR0xib29sZWFuIiwgZ3JlZW4sICJHTGJvb2xlYW4iLCBibHVlLCAiR0xib29sZWFuIiwgYWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQ29sb3JQb2ludGVyLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKSwgNCwgIkdMaW50Iiwgc2l6ZSwgIkdMZW51bSIsIHR5cGUsICJHTHNpemVpIiwgc3RyaWRlLCAiY29uc3QgR0x2b2lkICoiLCBwb2ludGVyKQotVFJBQ0VfR0xfVk9JRChnbENvbXBpbGVTaGFkZXIsIChHTHVpbnQgc2hhZGVyKSwgKHNoYWRlciksIDEsICJHTHVpbnQiLCBzaGFkZXIpCi1UUkFDRV9HTF9WT0lEKGdsQ29tcHJlc3NlZFRleEltYWdlMkQsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKSwgKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGltYWdlU2l6ZSwgZGF0YSksIDgsICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xlbnVtIiwgaW50ZXJuYWxmb3JtYXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xpbnQiLCBib3JkZXIsICJHTHNpemVpIiwgaW1hZ2VTaXplLCAiY29uc3QgR0x2b2lkICoiLCBkYXRhKQotVFJBQ0VfR0xfVk9JRChnbENvbXByZXNzZWRUZXhJbWFnZTNET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSksICh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGJvcmRlciwgaW1hZ2VTaXplLCBkYXRhKSwgOSwgIkdMZW51bSIsIHRhcmdldCwgIkdMaW50IiwgbGV2ZWwsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTHNpemVpIiwgZGVwdGgsICJHTGludCIsIGJvcmRlciwgIkdMc2l6ZWkiLCBpbWFnZVNpemUsICJjb25zdCBHTHZvaWQqIiwgZGF0YSkKLVRSQUNFX0dMX1ZPSUQoZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCwgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSksICh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGltYWdlU2l6ZSwgZGF0YSksIDksICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCB4b2Zmc2V0LCAiR0xpbnQiLCB5b2Zmc2V0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMZW51bSIsIGZvcm1hdCwgIkdMc2l6ZWkiLCBpbWFnZVNpemUsICJjb25zdCBHTHZvaWQgKiIsIGRhdGEpCi1UUkFDRV9HTF9WT0lEKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpLCAodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgaW1hZ2VTaXplLCBkYXRhKSwgMTEsICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCB4b2Zmc2V0LCAiR0xpbnQiLCB5b2Zmc2V0LCAiR0xpbnQiLCB6b2Zmc2V0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMc2l6ZWkiLCBkZXB0aCwgIkdMZW51bSIsIGZvcm1hdCwgIkdMc2l6ZWkiLCBpbWFnZVNpemUsICJjb25zdCBHTHZvaWQqIiwgZGF0YSkKLVRSQUNFX0dMX1ZPSUQoZ2xDb3B5VGV4SW1hZ2UyRCwgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpLCAodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJvcmRlciksIDgsICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xlbnVtIiwgaW50ZXJuYWxmb3JtYXQsICJHTGludCIsIHgsICJHTGludCIsIHksICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xpbnQiLCBib3JkZXIpCi1UUkFDRV9HTF9WT0lEKGdsQ29weVRleFN1YkltYWdlMkQsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lkdGgsIGhlaWdodCksIDgsICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCB4b2Zmc2V0LCAiR0xpbnQiLCB5b2Zmc2V0LCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xDb3B5VGV4U3ViSW1hZ2UzRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSwgOSwgIkdMZW51bSIsIHRhcmdldCwgIkdMaW50IiwgbGV2ZWwsICJHTGludCIsIHhvZmZzZXQsICJHTGludCIsIHlvZmZzZXQsICJHTGludCIsIHpvZmZzZXQsICJHTGludCIsIHgsICJHTGludCIsIHksICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0KQotVFJBQ0VfR0xfVk9JRChnbENvdmVyYWdlTWFza05WLCAoR0xib29sZWFuIG1hc2spLCAobWFzayksIDEsICJHTGJvb2xlYW4iLCBtYXNrKQotVFJBQ0VfR0xfVk9JRChnbENvdmVyYWdlT3BlcmF0aW9uTlYsIChHTGVudW0gb3BlcmF0aW9uKSwgKG9wZXJhdGlvbiksIDEsICJHTGVudW0iLCBvcGVyYXRpb24pCi1UUkFDRV9HTChHTHVpbnQsIGdsQ3JlYXRlUHJvZ3JhbSwgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMKEdMdWludCwgZ2xDcmVhdGVTaGFkZXIsIChHTGVudW0gdHlwZSksICh0eXBlKSwgMSwgIkdMZW51bSIsIHR5cGUpCi1UUkFDRV9HTChHTHVpbnQsIGdsQ3JlYXRlU2hhZGVyUHJvZ3JhbXZFWFQsIChHTGVudW0gdHlwZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyICoqc3RyaW5ncyksICh0eXBlLCBjb3VudCwgc3RyaW5ncyksIDMsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIGNvdW50LCAiY29uc3QgR0xjaGFyICoqIiwgc3RyaW5ncykKLVRSQUNFX0dMX1ZPSUQoZ2xDdWxsRmFjZSwgKEdMZW51bSBtb2RlKSwgKG1vZGUpLCAxLCAiR0xlbnVtIiwgbW9kZSkKLVRSQUNFX0dMX1ZPSUQoZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUywgKEdMdWludCBtYXRyaXhwYWxldHRlaW5kZXgpLCAobWF0cml4cGFsZXR0ZWluZGV4KSwgMSwgIkdMdWludCIsIG1hdHJpeHBhbGV0dGVpbmRleCkKLVRSQUNFX0dMX1ZPSUQoZ2xEZWxldGVCdWZmZXJzLCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMpLCAobiwgYnVmZmVycyksIDIsICJHTHNpemVpIiwgbiwgImNvbnN0IEdMdWludCAqIiwgYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xEZWxldGVGZW5jZXNOViwgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpLCAobiwgZmVuY2VzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiY29uc3QgR0x1aW50ICoiLCBmZW5jZXMpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlRnJhbWVidWZmZXJzLCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyksIChuLCBmcmFtZWJ1ZmZlcnMpLCAyLCAiR0xzaXplaSIsIG4sICJjb25zdCBHTHVpbnQqIiwgZnJhbWVidWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbERlbGV0ZUZyYW1lYnVmZmVyc09FUywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpLCAobiwgZnJhbWVidWZmZXJzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiY29uc3QgR0x1aW50KiIsIGZyYW1lYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xEZWxldGVQZXJmTW9uaXRvcnNBTUQsIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpLCAobiwgbW9uaXRvcnMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQgKiIsIG1vbml0b3JzKQotVFJBQ0VfR0xfVk9JRChnbERlbGV0ZVByb2dyYW0sIChHTHVpbnQgcHJvZ3JhbSksIChwcm9ncmFtKSwgMSwgIkdMdWludCIsIHByb2dyYW0pCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlUHJvZ3JhbVBpcGVsaW5lc0VYVCwgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwaXBlbGluZXMpLCAobiwgcGlwZWxpbmVzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiY29uc3QgR0x1aW50ICoiLCBwaXBlbGluZXMpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlUXVlcmllc0VYVCwgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpLCAobiwgaWRzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiY29uc3QgR0x1aW50ICoiLCBpZHMpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlUmVuZGVyYnVmZmVycywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKSwgKG4sIHJlbmRlcmJ1ZmZlcnMpLCAyLCAiR0xzaXplaSIsIG4sICJjb25zdCBHTHVpbnQqIiwgcmVuZGVyYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTLCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpLCAobiwgcmVuZGVyYnVmZmVycyksIDIsICJHTHNpemVpIiwgbiwgImNvbnN0IEdMdWludCoiLCByZW5kZXJidWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbERlbGV0ZVNoYWRlciwgKEdMdWludCBzaGFkZXIpLCAoc2hhZGVyKSwgMSwgIkdMdWludCIsIHNoYWRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xEZWxldGVUZXh0dXJlcywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyksIChuLCB0ZXh0dXJlcyksIDIsICJHTHNpemVpIiwgbiwgImNvbnN0IEdMdWludCAqIiwgdGV4dHVyZXMpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlVmVydGV4QXJyYXlzT0VTLCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyksIChuLCBhcnJheXMpLCAyLCAiR0xzaXplaSIsIG4sICJjb25zdCBHTHVpbnQgKiIsIGFycmF5cykKLVRSQUNFX0dMX1ZPSUQoZ2xEZXB0aEZ1bmMsIChHTGVudW0gZnVuYyksIChmdW5jKSwgMSwgIkdMZW51bSIsIGZ1bmMpCi1UUkFDRV9HTF9WT0lEKGdsRGVwdGhNYXNrLCAoR0xib29sZWFuIGZsYWcpLCAoZmxhZyksIDEsICJHTGJvb2xlYW4iLCBmbGFnKQotVFJBQ0VfR0xfVk9JRChnbERlcHRoUmFuZ2VmLCAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpLCAoek5lYXIsIHpGYXIpLCAyLCAiR0xjbGFtcGYiLCB6TmVhciwgIkdMY2xhbXBmIiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xEZXB0aFJhbmdlZk9FUywgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKSwgKHpOZWFyLCB6RmFyKSwgMiwgIkdMY2xhbXBmIiwgek5lYXIsICJHTGNsYW1wZiIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsRGVwdGhSYW5nZXgsIChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhciksICh6TmVhciwgekZhciksIDIsICJHTGNsYW1weCIsIHpOZWFyLCAiR0xjbGFtcHgiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbERlcHRoUmFuZ2V4T0VTLCAoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpLCAoek5lYXIsIHpGYXIpLCAyLCAiR0xjbGFtcHgiLCB6TmVhciwgIkdMY2xhbXB4IiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xEZXRhY2hTaGFkZXIsIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlciksIChwcm9ncmFtLCBzaGFkZXIpLCAyLCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMdWludCIsIHNoYWRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xEaXNhYmxlLCAoR0xlbnVtIGNhcCksIChjYXApLCAxLCAiR0xlbnVtIiwgY2FwKQotVFJBQ0VfR0xfVk9JRChnbERpc2FibGVDbGllbnRTdGF0ZSwgKEdMZW51bSBhcnJheSksIChhcnJheSksIDEsICJHTGVudW0iLCBhcnJheSkKLVRSQUNFX0dMX1ZPSUQoZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00sIChHTHVpbnQgZHJpdmVyQ29udHJvbCksIChkcml2ZXJDb250cm9sKSwgMSwgIkdMdWludCIsIGRyaXZlckNvbnRyb2wpCi1UUkFDRV9HTF9WT0lEKGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5LCAoR0x1aW50IGluZGV4KSwgKGluZGV4KSwgMSwgIkdMdWludCIsIGluZGV4KQotVFJBQ0VfR0xfVk9JRChnbERpc2NhcmRGcmFtZWJ1ZmZlckVYVCwgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtQXR0YWNobWVudHMsIGNvbnN0IEdMZW51bSAqYXR0YWNobWVudHMpLCAodGFyZ2V0LCBudW1BdHRhY2htZW50cywgYXR0YWNobWVudHMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xzaXplaSIsIG51bUF0dGFjaG1lbnRzLCAiY29uc3QgR0xlbnVtICoiLCBhdHRhY2htZW50cykKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3QXJyYXlzLCAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KSwgKG1vZGUsIGZpcnN0LCBjb3VudCksIDMsICJHTGVudW0iLCBtb2RlLCAiR0xpbnQiLCBmaXJzdCwgIkdMc2l6ZWkiLCBjb3VudCkKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3QnVmZmVyc05WLCAoR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZnMpLCAobiwgYnVmcyksIDIsICJHTHNpemVpIiwgbiwgImNvbnN0IEdMZW51bSAqIiwgYnVmcykKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3RWxlbWVudHMsIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyksIChtb2RlLCBjb3VudCwgdHlwZSwgaW5kaWNlcyksIDQsICJHTGVudW0iLCBtb2RlLCAiR0xzaXplaSIsIGNvdW50LCAiR0xlbnVtIiwgdHlwZSwgImNvbnN0IEdMdm9pZCAqIiwgaW5kaWNlcykKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4Zk9FUywgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KSwgKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSwgIkdMZmxvYXQiLCB6LCAiR0xmbG9hdCIsIHdpZHRoLCAiR0xmbG9hdCIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4ZnZPRVMsIChjb25zdCBHTGZsb2F0ICpjb29yZHMpLCAoY29vcmRzKSwgMSwgImNvbnN0IEdMZmxvYXQgKiIsIGNvb3JkcykKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4aU9FUywgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpLCAoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCksIDUsICJHTGludCIsIHgsICJHTGludCIsIHksICJHTGludCIsIHosICJHTGludCIsIHdpZHRoLCAiR0xpbnQiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd1RleGl2T0VTLCAoY29uc3QgR0xpbnQgKmNvb3JkcyksIChjb29yZHMpLCAxLCAiY29uc3QgR0xpbnQgKiIsIGNvb3JkcykKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4c09FUywgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0KSwgKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xzaG9ydCIsIHgsICJHTHNob3J0IiwgeSwgIkdMc2hvcnQiLCB6LCAiR0xzaG9ydCIsIHdpZHRoLCAiR0xzaG9ydCIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4c3ZPRVMsIChjb25zdCBHTHNob3J0ICpjb29yZHMpLCAoY29vcmRzKSwgMSwgImNvbnN0IEdMc2hvcnQgKiIsIGNvb3JkcykKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4eE9FUywgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KSwgKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xmaXhlZCIsIHgsICJHTGZpeGVkIiwgeSwgIkdMZml4ZWQiLCB6LCAiR0xmaXhlZCIsIHdpZHRoLCAiR0xmaXhlZCIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4eHZPRVMsIChjb25zdCBHTGZpeGVkICpjb29yZHMpLCAoY29vcmRzKSwgMSwgImNvbnN0IEdMZml4ZWQgKiIsIGNvb3JkcykKLVRSQUNFX0dMX1ZPSUQoZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKSwgKHRhcmdldCwgaW1hZ2UpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlZ2xJbWFnZU9FUyIsIGltYWdlKQotVFJBQ0VfR0xfVk9JRChnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSksICh0YXJnZXQsIGltYWdlKSwgMiwgIkdMZW51bSIsIHRhcmdldCwgIkdMZWdsSW1hZ2VPRVMiLCBpbWFnZSkKLVRSQUNFX0dMX1ZPSUQoZ2xFbmFibGUsIChHTGVudW0gY2FwKSwgKGNhcCksIDEsICJHTGVudW0iLCBjYXApCi1UUkFDRV9HTF9WT0lEKGdsRW5hYmxlQ2xpZW50U3RhdGUsIChHTGVudW0gYXJyYXkpLCAoYXJyYXkpLCAxLCAiR0xlbnVtIiwgYXJyYXkpCi1UUkFDRV9HTF9WT0lEKGdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00sIChHTHVpbnQgZHJpdmVyQ29udHJvbCksIChkcml2ZXJDb250cm9sKSwgMSwgIkdMdWludCIsIGRyaXZlckNvbnRyb2wpCi1UUkFDRV9HTF9WT0lEKGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXksIChHTHVpbnQgaW5kZXgpLCAoaW5kZXgpLCAxLCAiR0x1aW50IiwgaW5kZXgpCi1UUkFDRV9HTF9WT0lEKGdsRW5kUGVyZk1vbml0b3JBTUQsIChHTHVpbnQgbW9uaXRvciksIChtb25pdG9yKSwgMSwgIkdMdWludCIsIG1vbml0b3IpCi1UUkFDRV9HTF9WT0lEKGdsRW5kUXVlcnlFWFQsIChHTGVudW0gdGFyZ2V0KSwgKHRhcmdldCksIDEsICJHTGVudW0iLCB0YXJnZXQpCi1UUkFDRV9HTF9WT0lEKGdsRW5kVGlsaW5nUUNPTSwgKEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKSwgKHByZXNlcnZlTWFzayksIDEsICJHTGJpdGZpZWxkIiwgcHJlc2VydmVNYXNrKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTSwgKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcyksICh0YXJnZXQsIHBhcmFtcyksIDIsICJHTGVudW0iLCB0YXJnZXQsICJHTHZvaWQgKioiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0QnVmZmVyc1FDT00sIChHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKSwgKGJ1ZmZlcnMsIG1heEJ1ZmZlcnMsIG51bUJ1ZmZlcnMpLCAzLCAiR0x1aW50ICoiLCBidWZmZXJzLCAiR0xpbnQiLCBtYXhCdWZmZXJzLCAiR0xpbnQgKiIsIG51bUJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0RnJhbWVidWZmZXJzUUNPTSwgKEdMdWludCAqZnJhbWVidWZmZXJzLCBHTGludCBtYXhGcmFtZWJ1ZmZlcnMsIEdMaW50ICpudW1GcmFtZWJ1ZmZlcnMpLCAoZnJhbWVidWZmZXJzLCBtYXhGcmFtZWJ1ZmZlcnMsIG51bUZyYW1lYnVmZmVycyksIDMsICJHTHVpbnQgKiIsIGZyYW1lYnVmZmVycywgIkdMaW50IiwgbWF4RnJhbWVidWZmZXJzLCAiR0xpbnQgKiIsIG51bUZyYW1lYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTSwgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpLCAocHJvZ3JhbSwgc2hhZGVydHlwZSwgc291cmNlLCBsZW5ndGgpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMZW51bSIsIHNoYWRlcnR5cGUsICJHTGNoYXIgKiIsIHNvdXJjZSwgIkdMaW50ICoiLCBsZW5ndGgpCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0UHJvZ3JhbXNRQ09NLCAoR0x1aW50ICpwcm9ncmFtcywgR0xpbnQgbWF4UHJvZ3JhbXMsIEdMaW50ICpudW1Qcm9ncmFtcyksIChwcm9ncmFtcywgbWF4UHJvZ3JhbXMsIG51bVByb2dyYW1zKSwgMywgIkdMdWludCAqIiwgcHJvZ3JhbXMsICJHTGludCIsIG1heFByb2dyYW1zLCAiR0xpbnQgKiIsIG51bVByb2dyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NLCAoR0x1aW50ICpyZW5kZXJidWZmZXJzLCBHTGludCBtYXhSZW5kZXJidWZmZXJzLCBHTGludCAqbnVtUmVuZGVyYnVmZmVycyksIChyZW5kZXJidWZmZXJzLCBtYXhSZW5kZXJidWZmZXJzLCBudW1SZW5kZXJidWZmZXJzKSwgMywgIkdMdWludCAqIiwgcmVuZGVyYnVmZmVycywgIkdMaW50IiwgbWF4UmVuZGVyYnVmZmVycywgIkdMaW50ICoiLCBudW1SZW5kZXJidWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldFNoYWRlcnNRQ09NLCAoR0x1aW50ICpzaGFkZXJzLCBHTGludCBtYXhTaGFkZXJzLCBHTGludCAqbnVtU2hhZGVycyksIChzaGFkZXJzLCBtYXhTaGFkZXJzLCBudW1TaGFkZXJzKSwgMywgIkdMdWludCAqIiwgc2hhZGVycywgIkdMaW50IiwgbWF4U2hhZGVycywgIkdMaW50ICoiLCBudW1TaGFkZXJzKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NLCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSBmYWNlLCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSwgKHRleHR1cmUsIGZhY2UsIGxldmVsLCBwbmFtZSwgcGFyYW1zKSwgNSwgIkdMdWludCIsIHRleHR1cmUsICJHTGVudW0iLCBmYWNlLCAiR0xpbnQiLCBsZXZlbCwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00sIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRleGVscyksICh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCB0eXBlLCB0ZXhlbHMpLCAxMSwgIkdMZW51bSIsIHRhcmdldCwgIkdMaW50IiwgbGV2ZWwsICJHTGludCIsIHhvZmZzZXQsICJHTGludCIsIHlvZmZzZXQsICJHTGludCIsIHpvZmZzZXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xzaXplaSIsIGRlcHRoLCAiR0xlbnVtIiwgZm9ybWF0LCAiR0xlbnVtIiwgdHlwZSwgIkdMdm9pZCAqIiwgdGV4ZWxzKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldFRleHR1cmVzUUNPTSwgKEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpLCAodGV4dHVyZXMsIG1heFRleHR1cmVzLCBudW1UZXh0dXJlcyksIDMsICJHTHVpbnQgKiIsIHRleHR1cmVzLCAiR0xpbnQiLCBtYXhUZXh0dXJlcywgIkdMaW50ICoiLCBudW1UZXh0dXJlcykKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xFeHRJc1Byb2dyYW1CaW5hcnlRQ09NLCAoR0x1aW50IHByb2dyYW0pLCAocHJvZ3JhbSksIDEsICJHTHVpbnQiLCBwcm9ncmFtKQotVFJBQ0VfR0xfVk9JRChnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbEZpbmlzaCwgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMX1ZPSUQoZ2xGaW5pc2hGZW5jZU5WLCAoR0x1aW50IGZlbmNlKSwgKGZlbmNlKSwgMSwgIkdMdWludCIsIGZlbmNlKQotVFJBQ0VfR0xfVk9JRChnbEZsdXNoLCAodm9pZCksICgpLCAwKQotVFJBQ0VfR0xfVk9JRChnbEZvZ2YsIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbEZvZ2Z2LCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xGb2d4LCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xGb2d4T0VTLCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xGb2d4diwgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsRm9neHZPRVMsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpLCAodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlciksIDQsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBhdHRhY2htZW50LCAiR0xlbnVtIiwgcmVuZGVyYnVmZmVydGFyZ2V0LCAiR0x1aW50IiwgcmVuZGVyYnVmZmVyKQotVFJBQ0VfR0xfVk9JRChnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpLCAodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlciksIDQsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBhdHRhY2htZW50LCAiR0xlbnVtIiwgcmVuZGVyYnVmZmVydGFyZ2V0LCAiR0x1aW50IiwgcmVuZGVyYnVmZmVyKQotVFJBQ0VfR0xfVk9JRChnbEZyYW1lYnVmZmVyVGV4dHVyZTJELCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCksICh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgYXR0YWNobWVudCwgIkdMZW51bSIsIHRleHRhcmdldCwgIkdMdWludCIsIHRleHR1cmUsICJHTGludCIsIGxldmVsKQotVFJBQ0VfR0xfVk9JRChnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpLCAodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsLCBzYW1wbGVzKSwgNiwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGF0dGFjaG1lbnQsICJHTGVudW0iLCB0ZXh0YXJnZXQsICJHTHVpbnQiLCB0ZXh0dXJlLCAiR0xpbnQiLCBsZXZlbCwgIkdMc2l6ZWkiLCBzYW1wbGVzKQotVFJBQ0VfR0xfVk9JRChnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpLCAodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsLCBzYW1wbGVzKSwgNiwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGF0dGFjaG1lbnQsICJHTGVudW0iLCB0ZXh0YXJnZXQsICJHTHVpbnQiLCB0ZXh0dXJlLCAiR0xpbnQiLCBsZXZlbCwgIkdMc2l6ZWkiLCBzYW1wbGVzKQotVFJBQ0VfR0xfVk9JRChnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCksICh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgYXR0YWNobWVudCwgIkdMZW51bSIsIHRleHRhcmdldCwgIkdMdWludCIsIHRleHR1cmUsICJHTGludCIsIGxldmVsKQotVFJBQ0VfR0xfVk9JRChnbEZyYW1lYnVmZmVyVGV4dHVyZTNET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCksICh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwsIHpvZmZzZXQpLCA2LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgYXR0YWNobWVudCwgIkdMZW51bSIsIHRleHRhcmdldCwgIkdMdWludCIsIHRleHR1cmUsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCB6b2Zmc2V0KQotVFJBQ0VfR0xfVk9JRChnbEZyb250RmFjZSwgKEdMZW51bSBtb2RlKSwgKG1vZGUpLCAxLCAiR0xlbnVtIiwgbW9kZSkKLVRSQUNFX0dMX1ZPSUQoZ2xGcnVzdHVtZiwgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciksIDYsICJHTGZsb2F0IiwgbGVmdCwgIkdMZmxvYXQiLCByaWdodCwgIkdMZmxvYXQiLCBib3R0b20sICJHTGZsb2F0IiwgdG9wLCAiR0xmbG9hdCIsIHpOZWFyLCAiR0xmbG9hdCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsRnJ1c3R1bWZPRVMsIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpLCA2LCAiR0xmbG9hdCIsIGxlZnQsICJHTGZsb2F0IiwgcmlnaHQsICJHTGZsb2F0IiwgYm90dG9tLCAiR0xmbG9hdCIsIHRvcCwgIkdMZmxvYXQiLCB6TmVhciwgIkdMZmxvYXQiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbEZydXN0dW14LCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSwgNiwgIkdMZml4ZWQiLCBsZWZ0LCAiR0xmaXhlZCIsIHJpZ2h0LCAiR0xmaXhlZCIsIGJvdHRvbSwgIkdMZml4ZWQiLCB0b3AsICJHTGZpeGVkIiwgek5lYXIsICJHTGZpeGVkIiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xGcnVzdHVteE9FUywgKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciksIDYsICJHTGZpeGVkIiwgbGVmdCwgIkdMZml4ZWQiLCByaWdodCwgIkdMZml4ZWQiLCBib3R0b20sICJHTGZpeGVkIiwgdG9wLCAiR0xmaXhlZCIsIHpOZWFyLCAiR0xmaXhlZCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsR2VuQnVmZmVycywgKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKSwgKG4sIGJ1ZmZlcnMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQgKiIsIGJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsR2VuRmVuY2VzTlYsIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKSwgKG4sIGZlbmNlcyksIDIsICJHTHNpemVpIiwgbiwgIkdMdWludCAqIiwgZmVuY2VzKQotVFJBQ0VfR0xfVk9JRChnbEdlbkZyYW1lYnVmZmVycywgKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpLCAobiwgZnJhbWVidWZmZXJzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50KiIsIGZyYW1lYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMsIChHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKSwgKG4sIGZyYW1lYnVmZmVycyksIDIsICJHTHNpemVpIiwgbiwgIkdMdWludCoiLCBmcmFtZWJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsR2VuUGVyZk1vbml0b3JzQU1ELCAoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKSwgKG4sIG1vbml0b3JzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50ICoiLCBtb25pdG9ycykKLVRSQUNFX0dMX1ZPSUQoZ2xHZW5Qcm9ncmFtUGlwZWxpbmVzRVhULCAoR0xzaXplaSBuLCBHTHVpbnQgKnBpcGVsaW5lcyksIChuLCBwaXBlbGluZXMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQgKiIsIHBpcGVsaW5lcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZW5RdWVyaWVzRVhULCAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyksIChuLCBpZHMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQgKiIsIGlkcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZW5SZW5kZXJidWZmZXJzLCAoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpLCAobiwgcmVuZGVyYnVmZmVycyksIDIsICJHTHNpemVpIiwgbiwgIkdMdWludCoiLCByZW5kZXJidWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbEdlblJlbmRlcmJ1ZmZlcnNPRVMsIChHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycyksIChuLCByZW5kZXJidWZmZXJzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50KiIsIHJlbmRlcmJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsR2VuVGV4dHVyZXMsIChHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpLCAobiwgdGV4dHVyZXMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQgKiIsIHRleHR1cmVzKQotVFJBQ0VfR0xfVk9JRChnbEdlblZlcnRleEFycmF5c09FUywgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpLCAobiwgYXJyYXlzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50ICoiLCBhcnJheXMpCi1UUkFDRV9HTF9WT0lEKGdsR2VuZXJhdGVNaXBtYXAsIChHTGVudW0gdGFyZ2V0KSwgKHRhcmdldCksIDEsICJHTGVudW0iLCB0YXJnZXQpCi1UUkFDRV9HTF9WT0lEKGdsR2VuZXJhdGVNaXBtYXBPRVMsIChHTGVudW0gdGFyZ2V0KSwgKHRhcmdldCksIDEsICJHTGVudW0iLCB0YXJnZXQpCi1UUkFDRV9HTF9WT0lEKGdsR2V0QWN0aXZlQXR0cmliLCAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSksIChwcm9ncmFtLCBpbmRleCwgYnVmc2l6ZSwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lKSwgNywgIkdMdWludCIsIHByb2dyYW0sICJHTHVpbnQiLCBpbmRleCwgIkdMc2l6ZWkiLCBidWZzaXplLCAiR0xzaXplaSoiLCBsZW5ndGgsICJHTGludCoiLCBzaXplLCAiR0xlbnVtKiIsIHR5cGUsICJHTGNoYXIqIiwgbmFtZSkKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRBY3RpdmVVbmlmb3JtLCAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSksIChwcm9ncmFtLCBpbmRleCwgYnVmc2l6ZSwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lKSwgNywgIkdMdWludCIsIHByb2dyYW0sICJHTHVpbnQiLCBpbmRleCwgIkdMc2l6ZWkiLCBidWZzaXplLCAiR0xzaXplaSoiLCBsZW5ndGgsICJHTGludCoiLCBzaXplLCAiR0xlbnVtKiIsIHR5cGUsICJHTGNoYXIqIiwgbmFtZSkKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRBdHRhY2hlZFNoYWRlcnMsIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBtYXhjb3VudCwgR0xzaXplaSogY291bnQsIEdMdWludCogc2hhZGVycyksIChwcm9ncmFtLCBtYXhjb3VudCwgY291bnQsIHNoYWRlcnMpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMc2l6ZWkiLCBtYXhjb3VudCwgIkdMc2l6ZWkqIiwgY291bnQsICJHTHVpbnQqIiwgc2hhZGVycykKLVRSQUNFX0dMKGludCwgZ2xHZXRBdHRyaWJMb2NhdGlvbiwgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpLCAocHJvZ3JhbSwgbmFtZSksIDIsICJHTHVpbnQiLCBwcm9ncmFtLCAiY29uc3QgR0xjaGFyKiIsIG5hbWUpCi1UUkFDRV9HTF9WT0lEKGdsR2V0Qm9vbGVhbnYsIChHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGJvb2xlYW4gKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKiogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMdm9pZCAqKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRDbGlwUGxhbmVmLCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSksIChwbmFtZSwgZXFuKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCIsIGVxbikKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRDbGlwUGxhbmVmT0VTLCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSksIChwbmFtZSwgZXFuKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCIsIGVxbikKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRDbGlwUGxhbmV4LCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSksIChwbmFtZSwgZXFuKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIGVxbikKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRDbGlwUGxhbmV4T0VTLCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSksIChwbmFtZSwgZXFuKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIGVxbikKLVRSQUNFX0dMX1ZPSUQoZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTSwgKEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKSwgKGRyaXZlckNvbnRyb2wsIGJ1ZlNpemUsIGxlbmd0aCwgZHJpdmVyQ29udHJvbFN0cmluZyksIDQsICJHTHVpbnQiLCBkcml2ZXJDb250cm9sLCAiR0xzaXplaSIsIGJ1ZlNpemUsICJHTHNpemVpICoiLCBsZW5ndGgsICJHTGNoYXIgKiIsIGRyaXZlckNvbnRyb2xTdHJpbmcpCi1UUkFDRV9HTF9WT0lEKGdsR2V0RHJpdmVyQ29udHJvbHNRQ09NLCAoR0xpbnQgKm51bSwgR0xzaXplaSBzaXplLCBHTHVpbnQgKmRyaXZlckNvbnRyb2xzKSwgKG51bSwgc2l6ZSwgZHJpdmVyQ29udHJvbHMpLCAzLCAiR0xpbnQgKiIsIG51bSwgIkdMc2l6ZWkiLCBzaXplLCAiR0x1aW50ICoiLCBkcml2ZXJDb250cm9scykKLVRSQUNFX0dMKEdMZW51bSwgZ2xHZXRFcnJvciwgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRGZW5jZWl2TlYsIChHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyksIChmZW5jZSwgcG5hbWUsIHBhcmFtcyksIDMsICJHTHVpbnQiLCBmZW5jZSwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRGaXhlZHYsIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldEZpeGVkdk9FUywgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0RmxvYXR2LCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpLCAodGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgcGFyYW1zKSwgNCwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGF0dGFjaG1lbnQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50KiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpLCAodGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgcGFyYW1zKSwgNCwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGF0dGFjaG1lbnQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50KiIsIHBhcmFtcykKLVRSQUNFX0dMKEdMZW51bSwgZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhULCAodm9pZCksICgpLCAwKQotVFJBQ0VfR0xfVk9JRChnbEdldEludGVnZXJ2LCAoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldExpZ2h0ZnYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0TGlnaHR4diwgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRMaWdodHh2T0VTLCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChsaWdodCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBsaWdodCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldE1hdGVyaWFsZnYsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpLCAoZmFjZSwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0TWF0ZXJpYWx4diwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChmYWNlLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRNYXRlcmlhbHh2T0VTLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldE9iamVjdExhYmVsRVhULCAoR0xlbnVtIHR5cGUsIEdMdWludCBvYmplY3QsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmxhYmVsKSwgKHR5cGUsIG9iamVjdCwgYnVmU2l6ZSwgbGVuZ3RoLCBsYWJlbCksIDUsICJHTGVudW0iLCB0eXBlLCAiR0x1aW50Iiwgb2JqZWN0LCAiR0xzaXplaSIsIGJ1ZlNpemUsICJHTHNpemVpICoiLCBsZW5ndGgsICJHTGNoYXIgKiIsIGxhYmVsKQotVFJBQ0VfR0xfVk9JRChnbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQsIChHTHVpbnQgbW9uaXRvciwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGRhdGFTaXplLCBHTHVpbnQgKmRhdGEsIEdMaW50ICpieXRlc1dyaXR0ZW4pLCAobW9uaXRvciwgcG5hbWUsIGRhdGFTaXplLCBkYXRhLCBieXRlc1dyaXR0ZW4pLCA1LCAiR0x1aW50IiwgbW9uaXRvciwgIkdMZW51bSIsIHBuYW1lLCAiR0xzaXplaSIsIGRhdGFTaXplLCAiR0x1aW50ICoiLCBkYXRhLCAiR0xpbnQgKiIsIGJ5dGVzV3JpdHRlbikKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1ELCAoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKmRhdGEpLCAoZ3JvdXAsIGNvdW50ZXIsIHBuYW1lLCBkYXRhKSwgNCwgIkdMdWludCIsIGdyb3VwLCAiR0x1aW50IiwgY291bnRlciwgIkdMZW51bSIsIHBuYW1lLCAiR0x2b2lkICoiLCBkYXRhKQotVFJBQ0VfR0xfVk9JRChnbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRCwgKEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmNvdW50ZXJTdHJpbmcpLCAoZ3JvdXAsIGNvdW50ZXIsIGJ1ZlNpemUsIGxlbmd0aCwgY291bnRlclN0cmluZyksIDUsICJHTHVpbnQiLCBncm91cCwgIkdMdWludCIsIGNvdW50ZXIsICJHTHNpemVpIiwgYnVmU2l6ZSwgIkdMc2l6ZWkgKiIsIGxlbmd0aCwgIkdMY2hhciAqIiwgY291bnRlclN0cmluZykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1ELCAoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycyksIChncm91cCwgbnVtQ291bnRlcnMsIG1heEFjdGl2ZUNvdW50ZXJzLCBjb3VudGVyU2l6ZSwgY291bnRlcnMpLCA1LCAiR0x1aW50IiwgZ3JvdXAsICJHTGludCAqIiwgbnVtQ291bnRlcnMsICJHTGludCAqIiwgbWF4QWN0aXZlQ291bnRlcnMsICJHTHNpemVpIiwgY291bnRlclNpemUsICJHTHVpbnQgKiIsIGNvdW50ZXJzKQotVFJBQ0VfR0xfVk9JRChnbEdldFBlcmZNb25pdG9yR3JvdXBTdHJpbmdBTUQsIChHTHVpbnQgZ3JvdXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmdyb3VwU3RyaW5nKSwgKGdyb3VwLCBidWZTaXplLCBsZW5ndGgsIGdyb3VwU3RyaW5nKSwgNCwgIkdMdWludCIsIGdyb3VwLCAiR0xzaXplaSIsIGJ1ZlNpemUsICJHTHNpemVpICoiLCBsZW5ndGgsICJHTGNoYXIgKiIsIGdyb3VwU3RyaW5nKQotVFJBQ0VfR0xfVk9JRChnbEdldFBlcmZNb25pdG9yR3JvdXBzQU1ELCAoR0xpbnQgKm51bUdyb3VwcywgR0xzaXplaSBncm91cHNTaXplLCBHTHVpbnQgKmdyb3VwcyksIChudW1Hcm91cHMsIGdyb3Vwc1NpemUsIGdyb3VwcyksIDMsICJHTGludCAqIiwgbnVtR3JvdXBzLCAiR0xzaXplaSIsIGdyb3Vwc1NpemUsICJHTHVpbnQgKiIsIGdyb3VwcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQb2ludGVydiwgKEdMZW51bSBwbmFtZSwgR0x2b2lkICoqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTHZvaWQgKioiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UHJvZ3JhbUJpbmFyeU9FUywgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xlbnVtICpiaW5hcnlGb3JtYXQsIEdMdm9pZCAqYmluYXJ5KSwgKHByb2dyYW0sIGJ1ZlNpemUsIGxlbmd0aCwgYmluYXJ5Rm9ybWF0LCBiaW5hcnkpLCA1LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMc2l6ZWkiLCBidWZTaXplLCAiR0xzaXplaSAqIiwgbGVuZ3RoLCAiR0xlbnVtICoiLCBiaW5hcnlGb3JtYXQsICJHTHZvaWQgKiIsIGJpbmFyeSkKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQcm9ncmFtSW5mb0xvZywgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKSwgKHByb2dyYW0sIGJ1ZnNpemUsIGxlbmd0aCwgaW5mb2xvZyksIDQsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xzaXplaSIsIGJ1ZnNpemUsICJHTHNpemVpKiIsIGxlbmd0aCwgIkdMY2hhcioiLCBpbmZvbG9nKQotVFJBQ0VfR0xfVk9JRChnbEdldFByb2dyYW1QaXBlbGluZUluZm9Mb2dFWFQsIChHTHVpbnQgcGlwZWxpbmUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9Mb2cpLCAocGlwZWxpbmUsIGJ1ZlNpemUsIGxlbmd0aCwgaW5mb0xvZyksIDQsICJHTHVpbnQiLCBwaXBlbGluZSwgIkdMc2l6ZWkiLCBidWZTaXplLCAiR0xzaXplaSAqIiwgbGVuZ3RoLCAiR0xjaGFyICoiLCBpbmZvTG9nKQotVFJBQ0VfR0xfVk9JRChnbEdldFByb2dyYW1QaXBlbGluZWl2RVhULCAoR0x1aW50IHBpcGVsaW5lLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpLCAocGlwZWxpbmUsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0x1aW50IiwgcGlwZWxpbmUsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UHJvZ3JhbWl2LCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksIChwcm9ncmFtLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMdWludCIsIHByb2dyYW0sICJHTGVudW0iLCBwbmFtZSwgIkdMaW50KiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRRdWVyeU9iamVjdHVpdkVYVCwgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyksIChpZCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTHVpbnQiLCBpZCwgIkdMZW51bSIsIHBuYW1lLCAiR0x1aW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UXVlcnlpdkVYVCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50KiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0U2hhZGVySW5mb0xvZywgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpLCAoc2hhZGVyLCBidWZzaXplLCBsZW5ndGgsIGluZm9sb2cpLCA0LCAiR0x1aW50Iiwgc2hhZGVyLCAiR0xzaXplaSIsIGJ1ZnNpemUsICJHTHNpemVpKiIsIGxlbmd0aCwgIkdMY2hhcioiLCBpbmZvbG9nKQotVFJBQ0VfR0xfVk9JRChnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCwgKEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQqIHJhbmdlLCBHTGludCogcHJlY2lzaW9uKSwgKHNoYWRlcnR5cGUsIHByZWNpc2lvbnR5cGUsIHJhbmdlLCBwcmVjaXNpb24pLCA0LCAiR0xlbnVtIiwgc2hhZGVydHlwZSwgIkdMZW51bSIsIHByZWNpc2lvbnR5cGUsICJHTGludCoiLCByYW5nZSwgIkdMaW50KiIsIHByZWNpc2lvbikKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRTaGFkZXJTb3VyY2UsIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBzb3VyY2UpLCAoc2hhZGVyLCBidWZzaXplLCBsZW5ndGgsIHNvdXJjZSksIDQsICJHTHVpbnQiLCBzaGFkZXIsICJHTHNpemVpIiwgYnVmc2l6ZSwgIkdMc2l6ZWkqIiwgbGVuZ3RoLCAiR0xjaGFyKiIsIHNvdXJjZSkKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRTaGFkZXJpdiwgKEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksIChzaGFkZXIsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0x1aW50Iiwgc2hhZGVyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCoiLCBwYXJhbXMpCi1UUkFDRV9HTChjb25zdCBHTHVieXRlICosIGdsR2V0U3RyaW5nLCAoR0xlbnVtIG5hbWUpLCAobmFtZSksIDEsICJHTGVudW0iLCBuYW1lKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleEVudmZ2LCAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpLCAoZW52LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGVudiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleEVudml2LCAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSwgKGVudiwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBlbnYsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4RW52eHYsIChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChlbnYsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZW52LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4RW52eHZPRVMsIChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChlbnYsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZW52LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4R2VuZnZPRVMsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGNvb3JkLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4R2VuaXZPRVMsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyksIChjb29yZCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBjb29yZCwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhHZW54dk9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAoY29vcmQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhQYXJhbWV0ZXJmdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhQYXJhbWV0ZXJpdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleFBhcmFtZXRlcnh2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleFBhcmFtZXRlcnh2T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0woaW50LCBnbEdldFVuaWZvcm1Mb2NhdGlvbiwgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpLCAocHJvZ3JhbSwgbmFtZSksIDIsICJHTHVpbnQiLCBwcm9ncmFtLCAiY29uc3QgR0xjaGFyKiIsIG5hbWUpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VW5pZm9ybWZ2LCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0KiBwYXJhbXMpLCAocHJvZ3JhbSwgbG9jYXRpb24sIHBhcmFtcyksIDMsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMZmxvYXQqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFVuaWZvcm1pdiwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQqIHBhcmFtcyksIChwcm9ncmFtLCBsb2NhdGlvbiwgcGFyYW1zKSwgMywgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xpbnQqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2LCAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpLCAoaW5kZXgsIHBuYW1lLCBwb2ludGVyKSwgMywgIkdMdWludCIsIGluZGV4LCAiR0xlbnVtIiwgcG5hbWUsICJHTHZvaWQqKiIsIHBvaW50ZXIpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VmVydGV4QXR0cmliZnYsIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKSwgKGluZGV4LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMdWludCIsIGluZGV4LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0KiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRWZXJ0ZXhBdHRyaWJpdiwgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwgKGluZGV4LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMdWludCIsIGluZGV4LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0blVuaWZvcm1mdkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBmbG9hdCAqcGFyYW1zKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBidWZTaXplLCBwYXJhbXMpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgYnVmU2l6ZSwgImZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0blVuaWZvcm1pdkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBidWZTaXplLCBwYXJhbXMpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgYnVmU2l6ZSwgIkdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsSGludCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKSwgKHRhcmdldCwgbW9kZSksIDIsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBtb2RlKQotVFJBQ0VfR0xfVk9JRChnbEluc2VydEV2ZW50TWFya2VyRVhULCAoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKSwgKGxlbmd0aCwgbWFya2VyKSwgMiwgIkdMc2l6ZWkiLCBsZW5ndGgsICJjb25zdCBHTGNoYXIgKiIsIG1hcmtlcikKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xJc0J1ZmZlciwgKEdMdWludCBidWZmZXIpLCAoYnVmZmVyKSwgMSwgIkdMdWludCIsIGJ1ZmZlcikKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xJc0VuYWJsZWQsIChHTGVudW0gY2FwKSwgKGNhcCksIDEsICJHTGVudW0iLCBjYXApCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNGZW5jZU5WLCAoR0x1aW50IGZlbmNlKSwgKGZlbmNlKSwgMSwgIkdMdWludCIsIGZlbmNlKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbElzRnJhbWVidWZmZXIsIChHTHVpbnQgZnJhbWVidWZmZXIpLCAoZnJhbWVidWZmZXIpLCAxLCAiR0x1aW50IiwgZnJhbWVidWZmZXIpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNGcmFtZWJ1ZmZlck9FUywgKEdMdWludCBmcmFtZWJ1ZmZlciksIChmcmFtZWJ1ZmZlciksIDEsICJHTHVpbnQiLCBmcmFtZWJ1ZmZlcikKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xJc1Byb2dyYW0sIChHTHVpbnQgcHJvZ3JhbSksIChwcm9ncmFtKSwgMSwgIkdMdWludCIsIHByb2dyYW0pCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNQcm9ncmFtUGlwZWxpbmVFWFQsIChHTHVpbnQgcGlwZWxpbmUpLCAocGlwZWxpbmUpLCAxLCAiR0x1aW50IiwgcGlwZWxpbmUpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNRdWVyeUVYVCwgKEdMdWludCBpZCksIChpZCksIDEsICJHTHVpbnQiLCBpZCkKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xJc1JlbmRlcmJ1ZmZlciwgKEdMdWludCByZW5kZXJidWZmZXIpLCAocmVuZGVyYnVmZmVyKSwgMSwgIkdMdWludCIsIHJlbmRlcmJ1ZmZlcikKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xJc1JlbmRlcmJ1ZmZlck9FUywgKEdMdWludCByZW5kZXJidWZmZXIpLCAocmVuZGVyYnVmZmVyKSwgMSwgIkdMdWludCIsIHJlbmRlcmJ1ZmZlcikKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xJc1NoYWRlciwgKEdMdWludCBzaGFkZXIpLCAoc2hhZGVyKSwgMSwgIkdMdWludCIsIHNoYWRlcikKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xJc1RleHR1cmUsIChHTHVpbnQgdGV4dHVyZSksICh0ZXh0dXJlKSwgMSwgIkdMdWludCIsIHRleHR1cmUpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNWZXJ0ZXhBcnJheU9FUywgKEdMdWludCBhcnJheSksIChhcnJheSksIDEsICJHTHVpbnQiLCBhcnJheSkKLVRSQUNFX0dMX1ZPSUQoZ2xMYWJlbE9iamVjdEVYVCwgKEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICpsYWJlbCksICh0eXBlLCBvYmplY3QsIGxlbmd0aCwgbGFiZWwpLCA0LCAiR0xlbnVtIiwgdHlwZSwgIkdMdWludCIsIG9iamVjdCwgIkdMc2l6ZWkiLCBsZW5ndGgsICJjb25zdCBHTGNoYXIgKiIsIGxhYmVsKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0TW9kZWxmLCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodE1vZGVsZnYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmbG9hdCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0TW9kZWx4LCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodE1vZGVseE9FUywgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRNb2RlbHh2LCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodE1vZGVseHZPRVMsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0ZiwgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodGZ2LCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyksIChsaWdodCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBsaWdodCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmbG9hdCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0eCwgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodHhPRVMsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChsaWdodCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHR4diwgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodHh2T0VTLCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChsaWdodCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBsaWdodCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbExpbmVXaWR0aCwgKEdMZmxvYXQgd2lkdGgpLCAod2lkdGgpLCAxLCAiR0xmbG9hdCIsIHdpZHRoKQotVFJBQ0VfR0xfVk9JRChnbExpbmVXaWR0aHgsIChHTGZpeGVkIHdpZHRoKSwgKHdpZHRoKSwgMSwgIkdMZml4ZWQiLCB3aWR0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xMaW5lV2lkdGh4T0VTLCAoR0xmaXhlZCB3aWR0aCksICh3aWR0aCksIDEsICJHTGZpeGVkIiwgd2lkdGgpCi1UUkFDRV9HTF9WT0lEKGdsTGlua1Byb2dyYW0sIChHTHVpbnQgcHJvZ3JhbSksIChwcm9ncmFtKSwgMSwgIkdMdWludCIsIHByb2dyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTG9hZElkZW50aXR5LCAodm9pZCksICgpLCAwKQotVFJBQ0VfR0xfVk9JRChnbExvYWRNYXRyaXhmLCAoY29uc3QgR0xmbG9hdCAqbSksIChtKSwgMSwgImNvbnN0IEdMZmxvYXQgKiIsIG0pCi1UUkFDRV9HTF9WT0lEKGdsTG9hZE1hdHJpeHgsIChjb25zdCBHTGZpeGVkICptKSwgKG0pLCAxLCAiY29uc3QgR0xmaXhlZCAqIiwgbSkKLVRSQUNFX0dMX1ZPSUQoZ2xMb2FkTWF0cml4eE9FUywgKGNvbnN0IEdMZml4ZWQgKm0pLCAobSksIDEsICJjb25zdCBHTGZpeGVkICoiLCBtKQotVFJBQ0VfR0xfVk9JRChnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUywgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMX1ZPSUQoZ2xMb2dpY09wLCAoR0xlbnVtIG9wY29kZSksIChvcGNvZGUpLCAxLCAiR0xlbnVtIiwgb3Bjb2RlKQotVFJBQ0VfR0wodm9pZCosIGdsTWFwQnVmZmVyT0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2VzcyksICh0YXJnZXQsIGFjY2VzcyksIDIsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBhY2Nlc3MpCi1UUkFDRV9HTF9WT0lEKGdsTWF0ZXJpYWxmLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksIChmYWNlLCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbE1hdGVyaWFsZnYsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpLCAoZmFjZSwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsTWF0ZXJpYWx4LCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChmYWNlLCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbE1hdGVyaWFseE9FUywgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAoZmFjZSwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRlcmlhbHh2LCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbE1hdGVyaWFseHZPRVMsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAoZmFjZSwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsTWF0cml4SW5kZXhQb2ludGVyT0VTLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKSwgNCwgIkdMaW50Iiwgc2l6ZSwgIkdMZW51bSIsIHR5cGUsICJHTHNpemVpIiwgc3RyaWRlLCAiY29uc3QgR0x2b2lkICoiLCBwb2ludGVyKQotVFJBQ0VfR0xfVk9JRChnbE1hdHJpeE1vZGUsIChHTGVudW0gbW9kZSksIChtb2RlKSwgMSwgIkdMZW51bSIsIG1vZGUpCi1UUkFDRV9HTF9WT0lEKGdsTXVsdE1hdHJpeGYsIChjb25zdCBHTGZsb2F0ICptKSwgKG0pLCAxLCAiY29uc3QgR0xmbG9hdCAqIiwgbSkKLVRSQUNFX0dMX1ZPSUQoZ2xNdWx0TWF0cml4eCwgKGNvbnN0IEdMZml4ZWQgKm0pLCAobSksIDEsICJjb25zdCBHTGZpeGVkICoiLCBtKQotVFJBQ0VfR0xfVk9JRChnbE11bHRNYXRyaXh4T0VTLCAoY29uc3QgR0xmaXhlZCAqbSksIChtKSwgMSwgImNvbnN0IEdMZml4ZWQgKiIsIG0pCi1UUkFDRV9HTF9WT0lEKGdsTXVsdGlEcmF3QXJyYXlzRVhULCAoR0xlbnVtIG1vZGUsIEdMaW50ICpmaXJzdCwgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KSwgKG1vZGUsIGZpcnN0LCBjb3VudCwgcHJpbWNvdW50KSwgNCwgIkdMZW51bSIsIG1vZGUsICJHTGludCAqIiwgZmlyc3QsICJHTHNpemVpICoiLCBjb3VudCwgIkdMc2l6ZWkiLCBwcmltY291bnQpCi1UUkFDRV9HTF9WT0lEKGdsTXVsdGlEcmF3RWxlbWVudHNFWFQsIChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCksIChtb2RlLCBjb3VudCwgdHlwZSwgaW5kaWNlcywgcHJpbWNvdW50KSwgNSwgIkdMZW51bSIsIG1vZGUsICJjb25zdCBHTHNpemVpICoiLCBjb3VudCwgIkdMZW51bSIsIHR5cGUsICJjb25zdCBHTHZvaWQqICoiLCBpbmRpY2VzLCAiR0xzaXplaSIsIHByaW1jb3VudCkKLVRSQUNFX0dMX1ZPSUQoZ2xNdWx0aVRleENvb3JkNGYsIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpLCAodGFyZ2V0LCBzLCB0LCByLCBxKSwgNSwgIkdMZW51bSIsIHRhcmdldCwgIkdMZmxvYXQiLCBzLCAiR0xmbG9hdCIsIHQsICJHTGZsb2F0IiwgciwgIkdMZmxvYXQiLCBxKQotVFJBQ0VfR0xfVk9JRChnbE11bHRpVGV4Q29vcmQ0eCwgKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSksICh0YXJnZXQsIHMsIHQsIHIsIHEpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xmaXhlZCIsIHMsICJHTGZpeGVkIiwgdCwgIkdMZml4ZWQiLCByLCAiR0xmaXhlZCIsIHEpCi1UUkFDRV9HTF9WT0lEKGdsTXVsdGlUZXhDb29yZDR4T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKSwgKHRhcmdldCwgcywgdCwgciwgcSksIDUsICJHTGVudW0iLCB0YXJnZXQsICJHTGZpeGVkIiwgcywgIkdMZml4ZWQiLCB0LCAiR0xmaXhlZCIsIHIsICJHTGZpeGVkIiwgcSkKLVRSQUNFX0dMX1ZPSUQoZ2xOb3JtYWwzZiwgKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopLCAobngsIG55LCBueiksIDMsICJHTGZsb2F0IiwgbngsICJHTGZsb2F0IiwgbnksICJHTGZsb2F0IiwgbnopCi1UUkFDRV9HTF9WT0lEKGdsTm9ybWFsM3gsIChHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KSwgKG54LCBueSwgbnopLCAzLCAiR0xmaXhlZCIsIG54LCAiR0xmaXhlZCIsIG55LCAiR0xmaXhlZCIsIG56KQotVFJBQ0VfR0xfVk9JRChnbE5vcm1hbDN4T0VTLCAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueiksIChueCwgbnksIG56KSwgMywgIkdMZml4ZWQiLCBueCwgIkdMZml4ZWQiLCBueSwgIkdMZml4ZWQiLCBueikKLVRSQUNFX0dMX1ZPSUQoZ2xOb3JtYWxQb2ludGVyLCAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpLCAodHlwZSwgc3RyaWRlLCBwb2ludGVyKSwgMywgIkdMZW51bSIsIHR5cGUsICJHTHNpemVpIiwgc3RyaWRlLCAiY29uc3QgR0x2b2lkICoiLCBwb2ludGVyKQotVFJBQ0VfR0xfVk9JRChnbE9ydGhvZiwgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciksIDYsICJHTGZsb2F0IiwgbGVmdCwgIkdMZmxvYXQiLCByaWdodCwgIkdMZmxvYXQiLCBib3R0b20sICJHTGZsb2F0IiwgdG9wLCAiR0xmbG9hdCIsIHpOZWFyLCAiR0xmbG9hdCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsT3J0aG9mT0VTLCAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSwgNiwgIkdMZmxvYXQiLCBsZWZ0LCAiR0xmbG9hdCIsIHJpZ2h0LCAiR0xmbG9hdCIsIGJvdHRvbSwgIkdMZmxvYXQiLCB0b3AsICJHTGZsb2F0Iiwgek5lYXIsICJHTGZsb2F0IiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xPcnRob3gsIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpLCA2LCAiR0xmaXhlZCIsIGxlZnQsICJHTGZpeGVkIiwgcmlnaHQsICJHTGZpeGVkIiwgYm90dG9tLCAiR0xmaXhlZCIsIHRvcCwgIkdMZml4ZWQiLCB6TmVhciwgIkdMZml4ZWQiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbE9ydGhveE9FUywgKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciksIDYsICJHTGZpeGVkIiwgbGVmdCwgIkdMZml4ZWQiLCByaWdodCwgIkdMZml4ZWQiLCBib3R0b20sICJHTGZpeGVkIiwgdG9wLCAiR0xmaXhlZCIsIHpOZWFyLCAiR0xmaXhlZCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsUGl4ZWxTdG9yZWksIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRQYXJhbWV0ZXJmLCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xQb2ludFBhcmFtZXRlcmZ2LCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xQb2ludFBhcmFtZXRlcngsIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50UGFyYW1ldGVyeE9FUywgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRQYXJhbWV0ZXJ4diwgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRQYXJhbWV0ZXJ4dk9FUywgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRTaXplLCAoR0xmbG9hdCBzaXplKSwgKHNpemUpLCAxLCAiR0xmbG9hdCIsIHNpemUpCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRTaXplUG9pbnRlck9FUywgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSwgKHR5cGUsIHN0cmlkZSwgcG9pbnRlciksIDMsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIHN0cmlkZSwgImNvbnN0IEdMdm9pZCAqIiwgcG9pbnRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xQb2ludFNpemV4LCAoR0xmaXhlZCBzaXplKSwgKHNpemUpLCAxLCAiR0xmaXhlZCIsIHNpemUpCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRTaXpleE9FUywgKEdMZml4ZWQgc2l6ZSksIChzaXplKSwgMSwgIkdMZml4ZWQiLCBzaXplKQotVFJBQ0VfR0xfVk9JRChnbFBvbHlnb25PZmZzZXQsIChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyksIChmYWN0b3IsIHVuaXRzKSwgMiwgIkdMZmxvYXQiLCBmYWN0b3IsICJHTGZsb2F0IiwgdW5pdHMpCi1UUkFDRV9HTF9WT0lEKGdsUG9seWdvbk9mZnNldHgsIChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyksIChmYWN0b3IsIHVuaXRzKSwgMiwgIkdMZml4ZWQiLCBmYWN0b3IsICJHTGZpeGVkIiwgdW5pdHMpCi1UUkFDRV9HTF9WT0lEKGdsUG9seWdvbk9mZnNldHhPRVMsIChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyksIChmYWN0b3IsIHVuaXRzKSwgMiwgIkdMZml4ZWQiLCBmYWN0b3IsICJHTGZpeGVkIiwgdW5pdHMpCi1UUkFDRV9HTF9WT0lEKGdsUG9wR3JvdXBNYXJrZXJFWFQsICh2b2lkKSwgKCksIDApCi1UUkFDRV9HTF9WT0lEKGdsUG9wTWF0cml4LCAodm9pZCksICgpLCAwKQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1CaW5hcnlPRVMsIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIGJpbmFyeUZvcm1hdCwgY29uc3QgR0x2b2lkICpiaW5hcnksIEdMaW50IGxlbmd0aCksIChwcm9ncmFtLCBiaW5hcnlGb3JtYXQsIGJpbmFyeSwgbGVuZ3RoKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGVudW0iLCBiaW5hcnlGb3JtYXQsICJjb25zdCBHTHZvaWQgKiIsIGJpbmFyeSwgIkdMaW50IiwgbGVuZ3RoKQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1QYXJhbWV0ZXJpRVhULCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpLCAocHJvZ3JhbSwgcG5hbWUsIHZhbHVlKSwgMywgIkdMdWludCIsIHByb2dyYW0sICJHTGVudW0iLCBwbmFtZSwgIkdMaW50IiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm0xZkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KSwgKHByb2dyYW0sIGxvY2F0aW9uLCB4KSwgMywgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xmbG9hdCIsIHgpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm0xZnZFWFQsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGZsb2F0ICoiLCB2YWx1ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybTFpRVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4KSwgKHByb2dyYW0sIGxvY2F0aW9uLCB4KSwgMywgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xpbnQiLCB4KQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtMWl2RVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpLCAocHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB2YWx1ZSksIDQsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMaW50ICoiLCB2YWx1ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybTJmRVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSksIChwcm9ncmFtLCBsb2NhdGlvbiwgeCwgeSksIDQsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMZmxvYXQiLCB4LCAiR0xmbG9hdCIsIHkpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm0yZnZFWFQsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGZsb2F0ICoiLCB2YWx1ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybTJpRVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KSwgKHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5KSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5KQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtMml2RVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpLCAocHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB2YWx1ZSksIDQsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMaW50ICoiLCB2YWx1ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybTNmRVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSwgKHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5LCB6KSwgNSwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSwgIkdMZmxvYXQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtM2Z2RVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSksIChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGNvdW50LCAiY29uc3QgR0xmbG9hdCAqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm0zaUVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiksIChwcm9ncmFtLCBsb2NhdGlvbiwgeCwgeSwgeiksIDUsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMaW50IiwgeCwgIkdMaW50IiwgeSwgIkdMaW50IiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGludCAqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm00ZkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KSwgKHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5LCB6LCB3KSwgNiwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSwgIkdMZmxvYXQiLCB6LCAiR0xmbG9hdCIsIHcpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm00ZnZFWFQsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGZsb2F0ICoiLCB2YWx1ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybTRpRVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KSwgKHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5LCB6LCB3KSwgNiwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5LCAiR0xpbnQiLCB6LCAiR0xpbnQiLCB3KQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtNGl2RVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpLCAocHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB2YWx1ZSksIDQsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMaW50ICoiLCB2YWx1ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpLCAocHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKSwgNSwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGNvdW50LCAiR0xib29sZWFuIiwgdHJhbnNwb3NlLCAiY29uc3QgR0xmbG9hdCAqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSksIDUsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgIkdMYm9vbGVhbiIsIHRyYW5zcG9zZSwgImNvbnN0IEdMZmxvYXQgKiIsIHZhbHVlKQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSksIChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpLCA1LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJHTGJvb2xlYW4iLCB0cmFuc3Bvc2UsICJjb25zdCBHTGZsb2F0ICoiLCB2YWx1ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQdXNoR3JvdXBNYXJrZXJFWFQsIChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpLCAobGVuZ3RoLCBtYXJrZXIpLCAyLCAiR0xzaXplaSIsIGxlbmd0aCwgImNvbnN0IEdMY2hhciAqIiwgbWFya2VyKQotVFJBQ0VfR0xfVk9JRChnbFB1c2hNYXRyaXgsICh2b2lkKSwgKCksIDApCi1UUkFDRV9HTChHTGJpdGZpZWxkLCBnbFF1ZXJ5TWF0cml4eE9FUywgKEdMZml4ZWQgbWFudGlzc2FbMTZdLCBHTGludCBleHBvbmVudFsxNl0pLCAobWFudGlzc2EsIGV4cG9uZW50KSwgMiwgIkdMZml4ZWQiLCBtYW50aXNzYSwgIkdMaW50IiwgZXhwb25lbnQpCi1UUkFDRV9HTF9WT0lEKGdsUmVhZEJ1ZmZlck5WLCAoR0xlbnVtIG1vZGUpLCAobW9kZSksIDEsICJHTGVudW0iLCBtb2RlKQotVFJBQ0VfR0xfVk9JRChnbFJlYWRQaXhlbHMsIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKSwgKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKSwgNywgIkdMaW50IiwgeCwgIkdMaW50IiwgeSwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTGVudW0iLCBmb3JtYXQsICJHTGVudW0iLCB0eXBlLCAiR0x2b2lkICoiLCBwaXhlbHMpCi1UUkFDRV9HTF9WT0lEKGdsUmVhZG5QaXhlbHNFWFQsIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgdm9pZCAqZGF0YSksICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIGJ1ZlNpemUsIGRhdGEpLCA4LCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMZW51bSIsIGZvcm1hdCwgIkdMZW51bSIsIHR5cGUsICJHTHNpemVpIiwgYnVmU2l6ZSwgInZvaWQgKiIsIGRhdGEpCi1UUkFDRV9HTF9WT0lEKGdsUmVsZWFzZVNoYWRlckNvbXBpbGVyLCAodm9pZCksICgpLCAwKQotVFJBQ0VfR0xfVk9JRChnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHRhcmdldCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpLCA0LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgaW50ZXJuYWxmb3JtYXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0KQotVFJBQ0VfR0xfVk9JRChnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFLCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHRhcmdldCwgc2FtcGxlcywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xzaXplaSIsIHNhbXBsZXMsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQVBQTEUsIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAodGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCksIDUsICJHTGVudW0iLCB0YXJnZXQsICJHTHNpemVpIiwgc2FtcGxlcywgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQsIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAodGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCksIDUsICJHTGVudW0iLCB0YXJnZXQsICJHTHNpemVpIiwgc2FtcGxlcywgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcsIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAodGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCksIDUsICJHTGVudW0iLCB0YXJnZXQsICJHTHNpemVpIiwgc2FtcGxlcywgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KSwgNCwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFLCAodm9pZCksICgpLCAwKQotVFJBQ0VfR0xfVk9JRChnbFJvdGF0ZWYsIChHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSwgKGFuZ2xlLCB4LCB5LCB6KSwgNCwgIkdMZmxvYXQiLCBhbmdsZSwgIkdMZmxvYXQiLCB4LCAiR0xmbG9hdCIsIHksICJHTGZsb2F0IiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xSb3RhdGV4LCAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiksIChhbmdsZSwgeCwgeSwgeiksIDQsICJHTGZpeGVkIiwgYW5nbGUsICJHTGZpeGVkIiwgeCwgIkdMZml4ZWQiLCB5LCAiR0xmaXhlZCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsUm90YXRleE9FUywgKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopLCAoYW5nbGUsIHgsIHksIHopLCA0LCAiR0xmaXhlZCIsIGFuZ2xlLCAiR0xmaXhlZCIsIHgsICJHTGZpeGVkIiwgeSwgIkdMZml4ZWQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFNhbXBsZUNvdmVyYWdlLCAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpLCAodmFsdWUsIGludmVydCksIDIsICJHTGNsYW1wZiIsIHZhbHVlLCAiR0xib29sZWFuIiwgaW52ZXJ0KQotVFJBQ0VfR0xfVk9JRChnbFNhbXBsZUNvdmVyYWdleCwgKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSwgKHZhbHVlLCBpbnZlcnQpLCAyLCAiR0xjbGFtcHgiLCB2YWx1ZSwgIkdMYm9vbGVhbiIsIGludmVydCkKLVRSQUNFX0dMX1ZPSUQoZ2xTYW1wbGVDb3ZlcmFnZXhPRVMsIChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCksICh2YWx1ZSwgaW52ZXJ0KSwgMiwgIkdMY2xhbXB4IiwgdmFsdWUsICJHTGJvb2xlYW4iLCBpbnZlcnQpCi1UUkFDRV9HTF9WT0lEKGdsU2NhbGVmLCAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiksICh4LCB5LCB6KSwgMywgIkdMZmxvYXQiLCB4LCAiR0xmbG9hdCIsIHksICJHTGZsb2F0IiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xTY2FsZXgsIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSwgKHgsIHksIHopLCAzLCAiR0xmaXhlZCIsIHgsICJHTGZpeGVkIiwgeSwgIkdMZml4ZWQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFNjYWxleE9FUywgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopLCAoeCwgeSwgeiksIDMsICJHTGZpeGVkIiwgeCwgIkdMZml4ZWQiLCB5LCAiR0xmaXhlZCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsU2Npc3NvciwgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHgsIHksIHdpZHRoLCBoZWlnaHQpLCA0LCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1ELCAoR0x1aW50IG1vbml0b3IsIEdMYm9vbGVhbiBlbmFibGUsIEdMdWludCBncm91cCwgR0xpbnQgbnVtQ291bnRlcnMsIEdMdWludCAqY291bnRlcnNMaXN0KSwgKG1vbml0b3IsIGVuYWJsZSwgZ3JvdXAsIG51bUNvdW50ZXJzLCBjb3VudGVyc0xpc3QpLCA1LCAiR0x1aW50IiwgbW9uaXRvciwgIkdMYm9vbGVhbiIsIGVuYWJsZSwgIkdMdWludCIsIGdyb3VwLCAiR0xpbnQiLCBudW1Db3VudGVycywgIkdMdWludCAqIiwgY291bnRlcnNMaXN0KQotVFJBQ0VfR0xfVk9JRChnbFNldEZlbmNlTlYsIChHTHVpbnQgZmVuY2UsIEdMZW51bSBjb25kaXRpb24pLCAoZmVuY2UsIGNvbmRpdGlvbiksIDIsICJHTHVpbnQiLCBmZW5jZSwgIkdMZW51bSIsIGNvbmRpdGlvbikKLVRSQUNFX0dMX1ZPSUQoZ2xTaGFkZU1vZGVsLCAoR0xlbnVtIG1vZGUpLCAobW9kZSksIDEsICJHTGVudW0iLCBtb2RlKQotVFJBQ0VfR0xfVk9JRChnbFNoYWRlckJpbmFyeSwgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBzaGFkZXJzLCBHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCBHTHZvaWQqIGJpbmFyeSwgR0xzaXplaSBsZW5ndGgpLCAobiwgc2hhZGVycywgYmluYXJ5Zm9ybWF0LCBiaW5hcnksIGxlbmd0aCksIDUsICJHTHNpemVpIiwgbiwgImNvbnN0IEdMdWludCoiLCBzaGFkZXJzLCAiR0xlbnVtIiwgYmluYXJ5Zm9ybWF0LCAiY29uc3QgR0x2b2lkKiIsIGJpbmFyeSwgIkdMc2l6ZWkiLCBsZW5ndGgpCi1UUkFDRV9HTF9WT0lEKGdsU2hhZGVyU291cmNlLCAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiogc3RyaW5nLCBjb25zdCBHTGludCogbGVuZ3RoKSwgKHNoYWRlciwgY291bnQsIHN0cmluZywgbGVuZ3RoKSwgNCwgIkdMdWludCIsIHNoYWRlciwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMY2hhcioqIiwgc3RyaW5nLCAiY29uc3QgR0xpbnQqIiwgbGVuZ3RoKQotVFJBQ0VfR0xfVk9JRChnbFN0YXJ0VGlsaW5nUUNPTSwgKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzayksICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwcmVzZXJ2ZU1hc2spLCA1LCAiR0x1aW50IiwgeCwgIkdMdWludCIsIHksICJHTHVpbnQiLCB3aWR0aCwgIkdMdWludCIsIGhlaWdodCwgIkdMYml0ZmllbGQiLCBwcmVzZXJ2ZU1hc2spCi1UUkFDRV9HTF9WT0lEKGdsU3RlbmNpbEZ1bmMsIChHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayksIChmdW5jLCByZWYsIG1hc2spLCAzLCAiR0xlbnVtIiwgZnVuYywgIkdMaW50IiwgcmVmLCAiR0x1aW50IiwgbWFzaykKLVRSQUNFX0dMX1ZPSUQoZ2xTdGVuY2lsRnVuY1NlcGFyYXRlLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSwgKGZhY2UsIGZ1bmMsIHJlZiwgbWFzayksIDQsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgZnVuYywgIkdMaW50IiwgcmVmLCAiR0x1aW50IiwgbWFzaykKLVRSQUNFX0dMX1ZPSUQoZ2xTdGVuY2lsTWFzaywgKEdMdWludCBtYXNrKSwgKG1hc2spLCAxLCAiR0x1aW50IiwgbWFzaykKLVRSQUNFX0dMX1ZPSUQoZ2xTdGVuY2lsTWFza1NlcGFyYXRlLCAoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKSwgKGZhY2UsIG1hc2spLCAyLCAiR0xlbnVtIiwgZmFjZSwgIkdMdWludCIsIG1hc2spCi1UUkFDRV9HTF9WT0lEKGdsU3RlbmNpbE9wLCAoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSwgKGZhaWwsIHpmYWlsLCB6cGFzcyksIDMsICJHTGVudW0iLCBmYWlsLCAiR0xlbnVtIiwgemZhaWwsICJHTGVudW0iLCB6cGFzcykKLVRSQUNFX0dMX1ZPSUQoZ2xTdGVuY2lsT3BTZXBhcmF0ZSwgKEdMZW51bSBmYWNlLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpLCAoZmFjZSwgZmFpbCwgemZhaWwsIHpwYXNzKSwgNCwgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBmYWlsLCAiR0xlbnVtIiwgemZhaWwsICJHTGVudW0iLCB6cGFzcykKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xUZXN0RmVuY2VOViwgKEdMdWludCBmZW5jZSksIChmZW5jZSksIDEsICJHTHVpbnQiLCBmZW5jZSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhDb29yZFBvaW50ZXIsIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciksIChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpLCA0LCAiR0xpbnQiLCBzaXplLCAiR0xlbnVtIiwgdHlwZSwgIkdMc2l6ZWkiLCBzdHJpZGUsICJjb25zdCBHTHZvaWQgKiIsIHBvaW50ZXIpCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52ZiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhFbnZmdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhFbnZpLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52aXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhFbnZ4LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleEVudnhPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52eHYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52eHZPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4R2VuZk9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhHZW5mdk9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpLCAoY29vcmQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhHZW5pT0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4R2VuaXZPRVMsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyksIChjb29yZCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBjb29yZCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhHZW54T0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAoY29vcmQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCBjb29yZCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleEdlbnh2T0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChjb29yZCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBjb29yZCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFRleEltYWdlMkQsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyksICh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVscyksIDksICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTGludCIsIGJvcmRlciwgIkdMZW51bSIsIGZvcm1hdCwgIkdMZW51bSIsIHR5cGUsICJjb25zdCBHTHZvaWQgKiIsIHBpeGVscykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhJbWFnZTNET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKSwgKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVscyksIDEwLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnQiLCBsZXZlbCwgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMc2l6ZWkiLCBkZXB0aCwgIkdMaW50IiwgYm9yZGVyLCAiR0xlbnVtIiwgZm9ybWF0LCAiR0xlbnVtIiwgdHlwZSwgImNvbnN0IEdMdm9pZCoiLCBwaXhlbHMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4UGFyYW1ldGVyZiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhQYXJhbWV0ZXJmdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhQYXJhbWV0ZXJpLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4UGFyYW1ldGVyaXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhQYXJhbWV0ZXJ4LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleFBhcmFtZXRlcnhPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4UGFyYW1ldGVyeHYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4UGFyYW1ldGVyeHZPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4U3RvcmFnZTFERVhULCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCksICh0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoKSwgNCwgIkdMZW51bSIsIHRhcmdldCwgIkdMc2l6ZWkiLCBsZXZlbHMsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhTdG9yYWdlMkRFWFQsIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xzaXplaSIsIGxldmVscywgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhTdG9yYWdlM0RFWFQsIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCksICh0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoKSwgNiwgIkdMZW51bSIsIHRhcmdldCwgIkdMc2l6ZWkiLCBsZXZlbHMsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTHNpemVpIiwgZGVwdGgpCi1UUkFDRV9HTF9WT0lEKGdsVGV4U3ViSW1hZ2UyRCwgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKSwgKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKSwgOSwgIkdMZW51bSIsIHRhcmdldCwgIkdMaW50IiwgbGV2ZWwsICJHTGludCIsIHhvZmZzZXQsICJHTGludCIsIHlvZmZzZXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xlbnVtIiwgZm9ybWF0LCAiR0xlbnVtIiwgdHlwZSwgImNvbnN0IEdMdm9pZCAqIiwgcGl4ZWxzKQotVFJBQ0VfR0xfVk9JRChnbFRleFN1YkltYWdlM0RPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyksICh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpLCAxMSwgIkdMZW51bSIsIHRhcmdldCwgIkdMaW50IiwgbGV2ZWwsICJHTGludCIsIHhvZmZzZXQsICJHTGludCIsIHlvZmZzZXQsICJHTGludCIsIHpvZmZzZXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xzaXplaSIsIGRlcHRoLCAiR0xlbnVtIiwgZm9ybWF0LCAiR0xlbnVtIiwgdHlwZSwgImNvbnN0IEdMdm9pZCoiLCBwaXhlbHMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4dHVyZVN0b3JhZ2UxREVYVCwgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKSwgKHRleHR1cmUsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgpLCA1LCAiR0x1aW50IiwgdGV4dHVyZSwgIkdMZW51bSIsIHRhcmdldCwgIkdMc2l6ZWkiLCBsZXZlbHMsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXh0dXJlU3RvcmFnZTJERVhULCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHRleHR1cmUsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCksIDYsICJHTHVpbnQiLCB0ZXh0dXJlLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xzaXplaSIsIGxldmVscywgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXh0dXJlU3RvcmFnZTNERVhULCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKSwgKHRleHR1cmUsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZGVwdGgpLCA3LCAiR0x1aW50IiwgdGV4dHVyZSwgIkdMZW51bSIsIHRhcmdldCwgIkdMc2l6ZWkiLCBsZXZlbHMsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTHNpemVpIiwgZGVwdGgpCi1UUkFDRV9HTF9WT0lEKGdsVHJhbnNsYXRlZiwgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopLCAoeCwgeSwgeiksIDMsICJHTGZsb2F0IiwgeCwgIkdMZmxvYXQiLCB5LCAiR0xmbG9hdCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsVHJhbnNsYXRleCwgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopLCAoeCwgeSwgeiksIDMsICJHTGZpeGVkIiwgeCwgIkdMZml4ZWQiLCB5LCAiR0xmaXhlZCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsVHJhbnNsYXRleE9FUywgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopLCAoeCwgeSwgeiksIDMsICJHTGZpeGVkIiwgeCwgIkdMZml4ZWQiLCB5LCAiR0xmaXhlZCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybTFmLCAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCksIChsb2NhdGlvbiwgeCksIDIsICJHTGludCIsIGxvY2F0aW9uLCAiR0xmbG9hdCIsIHgpCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybTFmdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSwgKGxvY2F0aW9uLCBjb3VudCwgdiksIDMsICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGNvdW50LCAiY29uc3QgR0xmbG9hdCoiLCB2KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm0xaSwgKEdMaW50IGxvY2F0aW9uLCBHTGludCB4KSwgKGxvY2F0aW9uLCB4KSwgMiwgIkdMaW50IiwgbG9jYXRpb24sICJHTGludCIsIHgpCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybTFpdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpLCAzLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMaW50KiIsIHYpCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybTJmLCAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KSwgKGxvY2F0aW9uLCB4LCB5KSwgMywgIkdMaW50IiwgbG9jYXRpb24sICJHTGZsb2F0IiwgeCwgIkdMZmxvYXQiLCB5KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm0yZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpLCAzLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMZmxvYXQqIiwgdikKLVRSQUNFX0dMX1ZPSUQoZ2xVbmlmb3JtMmksIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSksIChsb2NhdGlvbiwgeCwgeSksIDMsICJHTGludCIsIGxvY2F0aW9uLCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm0yaXYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSwgMywgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGludCoiLCB2KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm0zZiwgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSwgKGxvY2F0aW9uLCB4LCB5LCB6KSwgNCwgIkdMaW50IiwgbG9jYXRpb24sICJHTGZsb2F0IiwgeCwgIkdMZmxvYXQiLCB5LCAiR0xmbG9hdCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybTNmdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSwgKGxvY2F0aW9uLCBjb3VudCwgdiksIDMsICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGNvdW50LCAiY29uc3QgR0xmbG9hdCoiLCB2KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm0zaSwgKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KSwgKGxvY2F0aW9uLCB4LCB5LCB6KSwgNCwgIkdMaW50IiwgbG9jYXRpb24sICJHTGludCIsIHgsICJHTGludCIsIHksICJHTGludCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybTNpdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpLCAzLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMaW50KiIsIHYpCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybTRmLCAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyksIChsb2NhdGlvbiwgeCwgeSwgeiwgdyksIDUsICJHTGludCIsIGxvY2F0aW9uLCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSwgIkdMZmxvYXQiLCB6LCAiR0xmbG9hdCIsIHcpCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybTRmdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSwgKGxvY2F0aW9uLCBjb3VudCwgdiksIDMsICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGNvdW50LCAiY29uc3QgR0xmbG9hdCoiLCB2KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm00aSwgKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KSwgKGxvY2F0aW9uLCB4LCB5LCB6LCB3KSwgNSwgIkdMaW50IiwgbG9jYXRpb24sICJHTGludCIsIHgsICJHTGludCIsIHksICJHTGludCIsIHosICJHTGludCIsIHcpCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybTRpdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpLCAzLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMaW50KiIsIHYpCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybU1hdHJpeDJmdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSksIChsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpLCA0LCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgIkdMYm9vbGVhbiIsIHRyYW5zcG9zZSwgImNvbnN0IEdMZmxvYXQqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybU1hdHJpeDNmdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSksIChsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpLCA0LCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgIkdMYm9vbGVhbiIsIHRyYW5zcG9zZSwgImNvbnN0IEdMZmxvYXQqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybU1hdHJpeDRmdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSksIChsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpLCA0LCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgIkdMYm9vbGVhbiIsIHRyYW5zcG9zZSwgImNvbnN0IEdMZmxvYXQqIiwgdmFsdWUpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsVW5tYXBCdWZmZXJPRVMsIChHTGVudW0gdGFyZ2V0KSwgKHRhcmdldCksIDEsICJHTGVudW0iLCB0YXJnZXQpCi1UUkFDRV9HTF9WT0lEKGdsVXNlUHJvZ3JhbSwgKEdMdWludCBwcm9ncmFtKSwgKHByb2dyYW0pLCAxLCAiR0x1aW50IiwgcHJvZ3JhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xVc2VQcm9ncmFtU3RhZ2VzRVhULCAoR0x1aW50IHBpcGVsaW5lLCBHTGJpdGZpZWxkIHN0YWdlcywgR0x1aW50IHByb2dyYW0pLCAocGlwZWxpbmUsIHN0YWdlcywgcHJvZ3JhbSksIDMsICJHTHVpbnQiLCBwaXBlbGluZSwgIkdMYml0ZmllbGQiLCBzdGFnZXMsICJHTHVpbnQiLCBwcm9ncmFtKQotVFJBQ0VfR0xfVk9JRChnbFZhbGlkYXRlUHJvZ3JhbSwgKEdMdWludCBwcm9ncmFtKSwgKHByb2dyYW0pLCAxLCAiR0x1aW50IiwgcHJvZ3JhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xWYWxpZGF0ZVByb2dyYW1QaXBlbGluZUVYVCwgKEdMdWludCBwaXBlbGluZSksIChwaXBlbGluZSksIDEsICJHTHVpbnQiLCBwaXBlbGluZSkKLVRSQUNFX0dMX1ZPSUQoZ2xWZXJ0ZXhBdHRyaWIxZiwgKEdMdWludCBpbmR4LCBHTGZsb2F0IHgpLCAoaW5keCwgeCksIDIsICJHTHVpbnQiLCBpbmR4LCAiR0xmbG9hdCIsIHgpCi1UUkFDRV9HTF9WT0lEKGdsVmVydGV4QXR0cmliMWZ2LCAoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyksIChpbmR4LCB2YWx1ZXMpLCAyLCAiR0x1aW50IiwgaW5keCwgImNvbnN0IEdMZmxvYXQqIiwgdmFsdWVzKQotVFJBQ0VfR0xfVk9JRChnbFZlcnRleEF0dHJpYjJmLCAoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KSwgKGluZHgsIHgsIHkpLCAzLCAiR0x1aW50IiwgaW5keCwgIkdMZmxvYXQiLCB4LCAiR0xmbG9hdCIsIHkpCi1UUkFDRV9HTF9WT0lEKGdsVmVydGV4QXR0cmliMmZ2LCAoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyksIChpbmR4LCB2YWx1ZXMpLCAyLCAiR0x1aW50IiwgaW5keCwgImNvbnN0IEdMZmxvYXQqIiwgdmFsdWVzKQotVFJBQ0VfR0xfVk9JRChnbFZlcnRleEF0dHJpYjNmLCAoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopLCAoaW5keCwgeCwgeSwgeiksIDQsICJHTHVpbnQiLCBpbmR4LCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSwgIkdMZmxvYXQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFZlcnRleEF0dHJpYjNmdiwgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpLCAoaW5keCwgdmFsdWVzKSwgMiwgIkdMdWludCIsIGluZHgsICJjb25zdCBHTGZsb2F0KiIsIHZhbHVlcykKLVRSQUNFX0dMX1ZPSUQoZ2xWZXJ0ZXhBdHRyaWI0ZiwgKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpLCAoaW5keCwgeCwgeSwgeiwgdyksIDUsICJHTHVpbnQiLCBpbmR4LCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSwgIkdMZmxvYXQiLCB6LCAiR0xmbG9hdCIsIHcpCi1UUkFDRV9HTF9WT0lEKGdsVmVydGV4QXR0cmliNGZ2LCAoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyksIChpbmR4LCB2YWx1ZXMpLCAyLCAiR0x1aW50IiwgaW5keCwgImNvbnN0IEdMZmxvYXQqIiwgdmFsdWVzKQotVFJBQ0VfR0xfVk9JRChnbFZlcnRleEF0dHJpYlBvaW50ZXIsIChHTHVpbnQgaW5keCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwdHIpLCAoaW5keCwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlLCBwdHIpLCA2LCAiR0x1aW50IiwgaW5keCwgIkdMaW50Iiwgc2l6ZSwgIkdMZW51bSIsIHR5cGUsICJHTGJvb2xlYW4iLCBub3JtYWxpemVkLCAiR0xzaXplaSIsIHN0cmlkZSwgImNvbnN0IEdMdm9pZCoiLCBwdHIpCi1UUkFDRV9HTF9WT0lEKGdsVmVydGV4UG9pbnRlciwgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciksIDQsICJHTGludCIsIHNpemUsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIHN0cmlkZSwgImNvbnN0IEdMdm9pZCAqIiwgcG9pbnRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xWaWV3cG9ydCwgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHgsIHksIHdpZHRoLCBoZWlnaHQpLCA0LCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xXZWlnaHRQb2ludGVyT0VTLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKSwgNCwgIkdMaW50Iiwgc2l6ZSwgIkdMZW51bSIsIHR5cGUsICJHTHNpemVpIiwgc3RyaWRlLCAiY29uc3QgR0x2b2lkICoiLCBwb2ludGVyKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3NwZWNzL0VHTF9BTkRST0lEX2Jsb2JfY2FjaGUudHh0IGIvb3BlbmdsL3NwZWNzL0VHTF9BTkRST0lEX2Jsb2JfY2FjaGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWY0NWQzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9zcGVjcy9FR0xfQU5EUk9JRF9ibG9iX2NhY2hlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi1OYW1lCi0KLSAgICBBTkRST0lEX2Jsb2JfY2FjaGUKLQotTmFtZSBTdHJpbmdzCi0KLSAgICBFR0xfQU5EUk9JRF9ibG9iX2NhY2hlCi0KLUNvbnRyaWJ1dG9ycwotCi0gICAgSmFtaWUgR2VubmlzCi0KLUNvbnRhY3QKLQotICAgIEphbWllIEdlbm5pcywgR29vZ2xlIEluYy4gKGpnZW5uaXMgJ2F0JyBnb29nbGUuY29tKQotCi1TdGF0dXMKLQotICAgIERyYWZ0LgotCi1WZXJzaW9uCi0KLSAgICBWZXJzaW9uIDEsIEFwcmlsIDIyLCAyMDExCi0KLU51bWJlcgotCi0gICAgRUdMIEV4dGVuc2lvbiAjWFhYCi0KLURlcGVuZGVuY2llcwotCi0gICAgUmVxdWlyZXMgRUdMIDEuMAotCi0gICAgVGhpcyBleHRlbnNpb24gaXMgd3JpdHRlbiBhZ2FpbnN0IHRoZSB3b3JkaW5nIG9mIHRoZSBFR0wgMS40IFNwZWNpZmljYXRpb24KLQotT3ZlcnZpZXcKLQotICAgIFNoYWRlciBjb21waWxhdGlvbiBhbmQgb3B0aW1pemF0aW9uIGhhcyBiZWVuIGEgdHJvdWJsZXNvbWUgYXNwZWN0IG9mIE9wZW5HTAotICAgIHByb2dyYW1taW5nIGZvciBhIGxvbmcgdGltZS4gIEl0IGNhbiBjb25zdW1lIHNlY29uZHMgb2YgQ1BVIGN5Y2xlcyBkdXJpbmcKLSAgICBhcHBsaWNhdGlvbiBzdGFydC11cC4gIEFkZGl0aW9uYWxseSwgc3RhdGUtYmFzZWQgcmUtY29tcGlsZXMgZG9uZQotICAgIGludGVybmFsbHkgYnkgdGhlIGRyaXZlcnMgYWRkIGFuIHVucHJlZGljdGFibGUgZWxlbWVudCB0byBhcHBsaWNhdGlvbgotICAgIHBlcmZvcm1hbmNlIHR1bmluZywgb2Z0ZW4gbGVhZGluZyB0byBvY2Nhc2lvbmFsIHBhdXNlcyBpbiBvdGhlcndpc2Ugc21vb3RoCi0gICAgYW5pbWF0aW9ucy4KLQotICAgIFRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRocm91Z2ggd2hpY2ggY2xpZW50IEFQSQotICAgIGltcGxlbWVudGF0aW9ucyBtYXkgY2FjaGUgc2hhZGVyIGJpbmFyaWVzIGFmdGVyIHRoZXkgYXJlIGNvbXBpbGVkLiAgSXQgbWF5Ci0gICAgdGhlbiByZXRyaWV2ZSB0aG9zZSBjYWNoZWQgc2hhZGVycyBkdXJpbmcgc3Vic2VxdWVudCBleGVjdXRpb25zIG9mIHRoZSBzYW1lCi0gICAgcHJvZ3JhbS4gIFRoZSBtYW5hZ2VtZW50IG9mIHRoZSBjYWNoZSBpcyBoYW5kbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAob3IKLSAgICBtaWRkbGV3YXJlKSwgYWxsb3dpbmcgaXQgdG8gYmUgdHVuZWQgdG8gYSBwYXJ0aWN1bGFyIHBsYXRmb3JtIG9yCi0gICAgZW52aXJvbm1lbnQuCi0KLSAgICBXaGlsZSB0aGUgZm9jdXMgb2YgdGhpcyBleHRlbnNpb24gaXMgb24gcHJvdmlkaW5nIGEgcGVyc2lzdGVudCBjYWNoZSBmb3IKLSAgICBzaGFkZXIgYmluYXJpZXMsIGl0IG1heSBhbHNvIGJlIHVzZWZ1bCBmb3IgY2FjaGluZyBvdGhlciBkYXRhLiAgVGhpcyBpcwotICAgIHBlcmZlY3RseSBhY2NlcHRhYmxlLCBidXQgdGhlIGd1YXJhbnRlZXMgcHJvdmlkZWQgKG9yIGxhY2sgdGhlcmVvZikgd2VyZQotICAgIGRlc2lnbmVkIGFyb3VuZCB0aGUgc2hhZGVyIHVzZSBjYXNlLgotCi0gICAgTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgZXh0ZW5zaW9uIGlzIHdyaXR0ZW4gYXMgaWYgdGhlIGFwcGxpY2F0aW9uCi0gICAgaW1wbGVtZW50cyB0aGUgY2FjaGluZyBmdW5jdGlvbmFsaXR5LCBvbiB0aGUgQW5kcm9pZCBPUyBpdCBpcyBpbXBsZW1lbnRlZAotICAgIGFzIHBhcnQgb2YgdGhlIEFuZHJvaWQgRUdMIG1vZHVsZS4gIFRoaXMgZXh0ZW5zaW9uIGlzIG5vdCBleHBvc2VkIHRvCi0gICAgYXBwbGljYXRpb25zIG9uIEFuZHJvaWQsIGJ1dCB3aWxsIGJlIHVzZWQgYXV0b21hdGljYWxseSBpbiBldmVyeQotICAgIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyBFR0wgaWYgaXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nCi0gICAgZGV2aWNlLXNwZWNpZmljIEVHTCBpbXBsZW1lbnRhdGlvbi4KLQotTmV3IFR5cGVzCi0KLSAgICAvKgotICAgICAqIEVHTHNpemVpQU5EUk9JRCBpcyBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgZm9yIHJlcHJlc2VudGluZyB0aGUgc2l6ZSBvZiBhCi0gICAgICogbWVtb3J5IGJ1ZmZlci4KLSAgICAgKi8KLSAgICAjaW5jbHVkZSA8a2hycGxhdGZvcm0uaD4KLSAgICB0eXBlZGVmIGtocm9ub3Nfc3NpemVfdCBFR0xzaXplaUFORFJPSUQ7Ci0KLSAgICAvKgotICAgICAqIEVHTFNldEJsb2JGdW5jIGlzIGEgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbi1wcm92aWRlZCBmdW5jdGlvbiB0aGF0IGEKLSAgICAgKiBjbGllbnQgQVBJIGltcGxlbWVudGF0aW9uIG1heSB1c2UgdG8gaW5zZXJ0IGEga2V5L3ZhbHVlIHBhaXIgaW50byB0aGUKLSAgICAgKiBjYWNoZS4KLSAgICAgKi8KLSAgICB0eXBlZGVmIHZvaWQgKCpFR0xTZXRCbG9iRnVuY0FORFJPSUQpIChjb25zdCB2b2lkKiBrZXksCi0gICAgICAgIEVHTHNpemVpQU5EUk9JRCBrZXlTaXplLCBjb25zdCB2b2lkKiB2YWx1ZSwgRUdMc2l6ZWlBTkRST0lEIHZhbHVlU2l6ZSkKLQotICAgIC8qCi0gICAgICogRUdMR2V0QmxvYkZ1bmMgaXMgYSBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGZ1bmN0aW9uIHRoYXQgYQotICAgICAqIGNsaWVudCBBUEkgaW1wbGVtZW50YXRpb24gbWF5IHVzZSB0byByZXRyaWV2ZSBhIGNhY2hlZCB2YWx1ZSBmcm9tIHRoZQotICAgICAqIGNhY2hlLgotICAgICAqLwotICAgIHR5cGVkZWYgRUdMc2l6ZWlBTkRST0lEICgqRUdMR2V0QmxvYkZ1bmNBTkRST0lEKSAoY29uc3Qgdm9pZCoga2V5LAotICAgICAgICBFR0xzaXplaUFORFJPSUQga2V5U2l6ZSwgdm9pZCogdmFsdWUsIEVHTHNpemVpQU5EUk9JRCB2YWx1ZVNpemUpCi0KLU5ldyBQcm9jZWR1cmVzIGFuZCBGdW5jdGlvbnMKLQotICAgIHZvaWQgZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEKEVHTERpc3BsYXkgZHB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTFNldEJsb2JGdW5jIHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xHZXRCbG9iRnVuYyBnZXQpOwotCi1OZXcgVG9rZW5zCi0KLSAgICBOb25lLgotCi1DaGFuZ2VzIHRvIENoYXB0ZXIgMyBvZiB0aGUgRUdMIDEuNCBTcGVjaWZpY2F0aW9uIChFR0wgRnVuY3Rpb25zIGFuZCBFcnJvcnMpCi0KLSAgICBBZGQgYSBuZXcgc3Vic2VjdGlvbiBhZnRlciBTZWN0aW9uIDMuOCwgcGFnZSA1MAotICAgIChTeW5jaHJvbml6YXRpb24gUHJpbWl0aXZlcykKLQotICAgICIzLjkgUGVyc2lzdGVudCBDYWNoaW5nCi0KLSAgICBJbiBvcmRlciB0byBmYWNpbGl0YXRlIHBlcnNpc3RlbnQgY2FjaGluZyBvZiBpbnRlcm5hbCBjbGllbnQgQVBJIHN0YXRlIHRoYXQKLSAgICBpcyBzbG93IHRvIGNvbXB1dGUgb3IgY29sbGVjdCwgdGhlIGFwcGxpY2F0aW9uIG1heSBzcGVjaWZ5IGNhbGxiYWNrCi0gICAgZnVuY3Rpb24gcG9pbnRlcnMgdGhyb3VnaCB3aGljaCB0aGUgY2xpZW50IEFQSXMgY2FuIHJlcXVlc3QgZGF0YSBiZSBjYWNoZWQKLSAgICBhbmQgcmV0cmlldmVkLiAgVGhlIGNvbW1hbmQKLQotICAgICAgICB2b2lkIGVnbFNldEJsb2JDYWNoZUZ1bmNzQU5EUk9JRChFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgICAgIEVHTFNldEJsb2JGdW5jQU5EUk9JRCBzZXQsIEVHTEdldEJsb2JGdW5jQU5EUk9JRCBnZXQpOwotCi0gICAgc2V0cyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcnMgdGhhdCBjbGllbnQgQVBJcyBhc3NvY2lhdGVkIHdpdGgKLSAgICBkaXNwbGF5IDxkcHk+IGNhbiB1c2UgdG8gaW50ZXJhY3Qgd2l0aCBjYWNoaW5nIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkKLSAgICB0aGUgYXBwbGljYXRpb24uICA8c2V0PiBwb2ludHMgdG8gYSBmdW5jdGlvbiB0aGF0IGluc2VydHMgYSBuZXcgdmFsdWUgaW50bwotICAgIHRoZSBjYWNoZSBhbmQgYXNzb2NpYXRlcyBpdCB3aXRoIHRoZSBnaXZlbiBrZXkuICA8Z2V0PiBwb2ludHMgdG8gYSBmdW5jdGlvbgotICAgIHRoYXQgcmV0cmlldmVzIGZyb20gdGhlIGNhY2hlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBrZXkuICBUaGUKLSAgICBzZW1hbnRpY3Mgb2YgdGhlc2UgY2FsbGJhY2sgZnVuY3Rpb25zIGFyZSBkZXNjcmliZWQgaW4gU2VjdGlvbiAzLjkuMSAoQ2FjaGUKLSAgICBPcGVyYXRpb25zKS4KLQotICAgIENhY2hlIGZ1bmN0aW9ucyBtYXkgb25seSBiZSBzcGVjaWZpZWQgb25jZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuCi0gICAgRUdMRGlzcGxheS4gIFRoZSA8c2V0PiBhbmQgPGdldD4gZnVuY3Rpb25zIG1heSBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYW5kCi0gICAgZnJvbSBhbnkgdGhyZWFkIGZyb20gdGhlIHRpbWUgYXQgd2hpY2ggZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEIGlzCi0gICAgY2FsbGVkIHVudGlsIHRoZSB0aW1lIHRoYXQgdGhlIGxhc3QgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIDxkcHk+IGlzCi0gICAgZGVsZXRlZCBhbmQgPGRweT4gaXRzZWxmIGlzIHRlcm1pbmF0ZWQuICBDb25jdXJyZW50IGNhbGxzIHRvIHRoZXNlCi0gICAgZnVuY3Rpb25zIGZyb20gZGlmZmVyZW50IHRocmVhZHMgaXMgYWxzbyBhbGxvd2VkLgotCi0gICAgSWYgZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEIGdlbmVyYXRlcyBhbiBlcnJvciB0aGVuIGFsbCBjbGllbnQgQVBJcyBtdXN0Ci0gICAgYmVoYXZlIGFzIHRob3VnaCBlZ2xTZXRCbG9iQ2FjaGVGdW5jc0FORFJPSUQgd2FzIG5vdCBjYWxsZWQgZm9yIHRoZSBkaXNwbGF5Ci0gICAgPGRweT4uICBJZiA8c2V0PiBvciA8Z2V0PiBpcyBOVUxMIHRoZW4gYW4gRUdMX0JBRF9QQVJBTUVURVIgZXJyb3IgaXMKLSAgICBnZW5lcmF0ZWQuICBJZiBhIHN1Y2Nlc3NmdWwgZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEIGNhbGwgd2FzIGFscmVhZHkKLSAgICBtYWRlIGZvciA8ZHB5PiBhbmQgdGhlIGRpc3BsYXkgaGFzIG5vdCBzaW5jZSBiZWVuIHRlcm1pbmF0ZWQgdGhlbiBhbgotICAgIEVHTF9CQURfUEFSQU1FVEVSIGVycm9yIGlzIGdlbmVyYXRlZC4KLQotICAgIDMuOS4xIENhY2hlIE9wZXJhdGlvbnMKLQotICAgIFRvIGluc2VydCBhIG5ldyBiaW5hcnkgdmFsdWUgaW50byB0aGUgY2FjaGUgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIGEgZ2l2ZW4KLSAgICBrZXksIGEgY2xpZW50IEFQSSBpbXBsZW1lbnRhdGlvbiBjYW4gY2FsbCB0aGUgYXBwbGljYXRpb24tcHJvdmlkZWQgY2FsbGJhY2sKLSAgICBmdW5jdGlvbgotCi0gICAgICAgIHZvaWQgKCpzZXQpIChjb25zdCB2b2lkKiBrZXksIEVHTHNpemVpQU5EUk9JRCBrZXlTaXplLAotICAgICAgICAgICAgY29uc3Qgdm9pZCogdmFsdWUsIEVHTHNpemVpQU5EUk9JRCB2YWx1ZVNpemUpCi0KLSAgICA8a2V5PiBhbmQgPHZhbHVlPiBhcmUgcG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5IGFuZCB2YWx1ZSwKLSAgICByZXNwZWN0aXZlbHksIHRoYXQgYXJlIHRvIGJlIGluc2VydGVkLiAgPGtleVNpemU+IGFuZCA8dmFsdWVTaXplPiBzcGVjaWZ5Ci0gICAgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgcG9pbnRlZCB0byBieSA8a2V5PiBhbmQgPHZhbHVlPiwKLSAgICByZXNwZWN0aXZlbHkuCi0KLSAgICBObyBndWFyYW50ZWVzIGFyZSBtYWRlIGFzIHRvIHdoZXRoZXIgYSBnaXZlbiBrZXkvdmFsdWUgcGFpciBpcyBwcmVzZW50IGluCi0gICAgdGhlIGNhY2hlIGFmdGVyIHRoZSBzZXQgY2FsbC4gIElmIGEgZGlmZmVyZW50IHZhbHVlIGhhcyBiZWVuIGFzc29jaWF0ZWQKLSAgICB3aXRoIHRoZSBnaXZlbiBrZXkgaW4gdGhlIHBhc3QgdGhlbiBpdCBpcyB1bmRlZmluZWQgd2hpY2ggdmFsdWUsIGlmIGFueSwgaXMKLSAgICBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBhZnRlciB0aGUgc2V0IGNhbGwuICBOb3RlIHRoYXQgd2hpbGUgdGhlcmUgYXJlIG5vCi0gICAgZ3VhcmFudGVlcywgdGhlIGNhY2hlIGltcGxlbWVudGF0aW9uIHNob3VsZCBhdHRlbXB0IHRvIGNhY2hlIHRoZSBtb3N0Ci0gICAgcmVjZW50bHkgc2V0IHZhbHVlIGZvciBhIGdpdmVuIGtleS4KLQotICAgIFRvIHJldHJpZXZlIHRoZSBiaW5hcnkgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5IGZyb20gdGhlIGNhY2hlLCBhCi0gICAgY2xpZW50IEFQSSBpbXBsZW1lbnRhdGlvbiBjYW4gY2FsbCB0aGUgYXBwbGljYXRpb24tcHJvdmlkZWQgY2FsbGJhY2sKLSAgICBmdW5jdGlvbgotCi0gICAgICAgIEVHTHNpemVpQU5EUk9JRCAoKmdldCkgKGNvbnN0IHZvaWQqIGtleSwgRUdMc2l6ZWlBTkRST0lEIGtleVNpemUsCi0gICAgICAgICAgICB2b2lkKiB2YWx1ZSwgRUdMc2l6ZWlBTkRST0lEIHZhbHVlU2l6ZSkKLQotICAgIDxrZXk+IGlzIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrZXkuICA8a2V5U2l6ZT4gc3BlY2lmaWVzIHRoZQotICAgIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJpbmFyeSBrZXkgcG9pbnRlZCB0byBieSA8a2V5Pi4gIElmIHRoZSBjYWNoZSBjb250YWlucwotICAgIGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgdGhlbiB0aGUgc2l6ZSBvZiB0aGF0IGJpbmFyeSB2YWx1ZSBpbgotICAgIGJ5dGVzIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlIDAgaXMgcmV0dXJuZWQuCi0KLSAgICBJZiB0aGUgY2FjaGUgY29udGFpbnMgYSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBhbmQgaXRzIHNpemUgaW4gYnl0ZXMgaXMKLSAgICBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gPHZhbHVlU2l6ZT4gdGhlbiB0aGUgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGUgbWVtb3J5Ci0gICAgcG9pbnRlZCB0byBieSA8dmFsdWU+LiAgT3RoZXJ3aXNlIG5vdGhpbmcgaXMgd3JpdHRlbiB0byB0aGUgbWVtb3J5IHBvaW50ZWQKLSAgICB0byBieSA8dmFsdWU+LgotCi1Jc3N1ZXMKLQotICAgIDEuIEhvdyBzaG91bGQgZXJyb3JzIGJlIGhhbmRsZWQgaW4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucz8KLQotICAgIFJFU09MVkVEOiBObyBndWFyYW50ZWVzIGFyZSBtYWRlIGFib3V0IHRoZSBwcmVzZW5jZSBvZiB2YWx1ZXMgaW4gdGhlIGNhY2hlLAotICAgIHNvIHRoZXJlIHNob3VsZCBub3QgYmUgYSBuZWVkIHRvIHJldHVybiBlcnJvciBpbmZvcm1hdGlvbiB0byB0aGUgY2xpZW50IEFQSQotICAgIGltcGxlbWVudGF0aW9uLiAgVGhlIGNhY2hlIGltcGxlbWVudGF0aW9uIGNhbiBzaW1wbHkgZHJvcCBhIHZhbHVlIGlmIGl0Ci0gICAgZW5jb3VudGVycyBhbiBlcnJvciBkdXJpbmcgdGhlICdzZXQnIGNhbGxiYWNrLiAgU2ltaWxhcmx5LCBpdCBjYW4gc2ltcGx5Ci0gICAgcmV0dXJuIDAgaWYgaXQgZW5jb3V0ZXJzIGFuIGVycm9yIGluIGEgJ2dldCcgY2FsbGJhY2suCi0KLSAgICAyLiBXaGVuIGEgY2xpZW50IEFQSSBkcml2ZXIgZ2V0cyB1cGRhdGVkLCB0aGF0IG1heSBuZWVkIHRvIGludmFsaWRhdGUKLSAgICBwcmV2aW91c2x5IGNhY2hlZCBlbnRyaWVzLiAgSG93IGNhbiB0aGUgZHJpdmVyIGhhbmRsZSB0aGlzIHNpdHVhdGlvbj8KLQotICAgIFJFU1BPTlNFOiBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygd2F5cyB0aGUgZHJpdmVyIGNhbiBoYW5kbGUgdGhpcyBzaXR1YXRpb24uCi0gICAgVGhlIHJlY29tbWVuZGVkIHdheSBpcyB0byBpbmNsdWRlIHRoZSBkcml2ZXIgdmVyc2lvbiBpbiBhbGwgY2FjaGUga2V5cy4KLSAgICBUaGF0IHdheSBlYWNoIGRyaXZlciB2ZXJzaW9uIHdpbGwgdXNlIGEgc2V0IG9mIGNhY2hlIGtleXMgdGhhdCBhcmUgdW5pcXVlCi0gICAgdG8gdGhhdCB2ZXJzaW9uLCBhbmQgY29uZmxpY3RzIHNob3VsZCBuZXZlciBvY2N1ci4gIFVwZGF0aW5nIHRoZSBkcml2ZXIKLSAgICBjb3VsZCB0aGVuIGxlYXZlIGEgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgY2FjaGUgdGhhdCB3aWxsIG5ldmVyIGJlCi0gICAgcmVxdWVzdGVkIGFnYWluLiAgSWYgbmVlZGVkLCB0aGUgY2FjaGUgaW1wbGVtZW50YXRpb24gY2FuIGhhbmRsZSB0aG9zZQotICAgIHZhbHVlcyBpbiBzb21lIHdheSwgYnV0IHRoZSBkcml2ZXIgZG9lcyBub3QgbmVlZCB0byB0YWtlIGFueSBzcGVjaWFsCi0gICAgYWN0aW9uLgotCi0gICAgMy4gSG93IG11Y2ggZGF0YSBjYW4gYmUgc3RvcmVkIGluIHRoZSBjYWNoZT8KLQotICAgIFJFU1BPTlNFOiBUaGlzIGlzIGVudGlyZWx5IGRlcGVuZGVudCB1cG9uIHRoZSBjYWNoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICBQcmVzdW1hYmx5IGl0IHdpbGwgYmUgdHVuZWQgdG8gc3RvcmUgZW5vdWdoIGRhdGEgdG8gYmUgdXNlZnVsLCBidXQgbm90Ci0gICAgZW5vdWdoIHRvIGJlY29tZSBwcm9ibGVtYXRpYy4gOikKLQotUmV2aXNpb24gSGlzdG9yeQotCi0jMiAoSmFtaWUgR2VubmlzLCBBcHJpbCAyNSwgMjAxMSkKLSAgICAtIFN3YXBwZWQgdGhlIG9yZGVyIG9mIHRoZSBzaXplIGFuZCBwb2ludGVyIGFyZ3VtZW50cyB0byB0aGUgZ2V0IGFuZCBzZXQKLSAgICAgIGZ1bmN0aW9ucy4KLQotIzEgKEphbWllIEdlbm5pcywgQXByaWwgMjIsIDIwMTEpCi0gICAgLSBJbml0aWFsIGRyYWZ0LgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3NwZWNzL0VHTF9BTkRST0lEX3JlY29yZGFibGUudHh0IGIvb3BlbmdsL3NwZWNzL0VHTF9BTkRST0lEX3JlY29yZGFibGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGJkMjZmLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9zcGVjcy9FR0xfQU5EUk9JRF9yZWNvcmRhYmxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi1OYW1lCi0KLSAgICBBTkRST0lEX3JlY29yZGFibGUKLQotTmFtZSBTdHJpbmdzCi0KLSAgICBFR0xfQU5EUk9JRF9yZWNvcmRhYmxlCi0KLUNvbnRyaWJ1dG9ycwotCi0gICAgSmFtaWUgR2VubmlzCi0KLUNvbnRhY3QKLQotICAgIEphbWllIEdlbm5pcywgR29vZ2xlIEluYy4gKGpnZW5uaXMgJ2F0JyBnb29nbGUuY29tKQotCi1TdGF0dXMKLQotICAgIERyYWZ0LgotCi1WZXJzaW9uCi0KLSAgICBWZXJzaW9uIDEsIEp1bHkgOCwgMjAxMQotCi1OdW1iZXIKLQotICAgIEVHTCBFeHRlbnNpb24gI1hYWAotCi1EZXBlbmRlbmNpZXMKLQotICAgIFJlcXVpcmVzIEVHTCAxLjAKLQotICAgIFRoaXMgZXh0ZW5zaW9uIGlzIHdyaXR0ZW4gYWdhaW5zdCB0aGUgd29yZGluZyBvZiB0aGUgRUdMIDEuNCBTcGVjaWZpY2F0aW9uCi0KLU92ZXJ2aWV3Ci0KLSAgICBBbmRyb2lkIHN1cHBvcnRzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBBTmF0aXZlV2luZG93IGltcGxlbWVudGF0aW9ucyB0aGF0Ci0gICAgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIEVHTFN1cmZhY2UuICBPbmUgaW1wbGVtZW50YXRpb24sIHdoaWNoIHJlY29yZHMgdGhlCi0gICAgcmVuZGVyZWQgaW1hZ2UgYXMgYSB2aWRlbyBlYWNoIHRpbWUgZWdsU3dhcEJ1ZmZlcnMgZ2V0cyBjYWxsZWQsIG1heSBoYXZlCi0gICAgc29tZSBkZXZpY2Utc3BlY2lmaWMgcmVzdHJpY3Rpb25zLiAgQmVjYXVzZSBvZiB0aGlzLCBzb21lIEVHTENvbmZpZ3MgbWF5IGJlCi0gICAgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UgQU5hdGl2ZVdpbmRvd3MuICBUaGlzIGV4dGVuc2lvbiBpbnRyb2R1Y2VzIGEgbmV3Ci0gICAgYm9vbGVhbiBFR0xDb25maWcgYXR0cmlidXRlIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIEVHTENvbmZpZyBzdXBwb3J0cwotICAgIHJlbmRlcmluZyB0byBhbiBBTmF0aXZlV2luZG93IHRoYXQgcmVjb3JkcyBpbWFnZXMgdG8gYSB2aWRlby4KLQotTmV3IFR5cGVzCi0KLSAgICBOb25lLgotCi1OZXcgUHJvY2VkdXJlcyBhbmQgRnVuY3Rpb25zCi0KLSAgICBOb25lLgotCi1OZXcgVG9rZW5zCi0KLSAgICBBY2NlcHRlZCBieSB0aGUgPGF0dHJpYnV0ZT4gcGFyYW1ldGVyIG9mIGVnbEdldENvbmZpZ0F0dHJpYiBhbmQKLSAgICB0aGUgPGF0dHJpYl9saXN0PiBwYXJhbWV0ZXIgb2YgZWdsQ2hvb3NlQ29uZmlnOgotCi0gICAgICAgIEVHTF9SRUNPUkRBQkxFX0FORFJPSUQgICAgICAgICAgICAgICAgICAgICAgMHgzMTQyCi0KLUNoYW5nZXMgdG8gQ2hhcHRlciAzIG9mIHRoZSBFR0wgMS40IFNwZWNpZmljYXRpb24gKEVHTCBGdW5jdGlvbnMgYW5kIEVycm9ycykKLQotICAgIFNlY3Rpb24gMy40LCBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQsIGFkZCBhIHJvdyB0byBUYWJsZSAzLjEuCi0gICAgCi0gICAgICAgICAgICAgIEF0dHJpYnV0ZSAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICBOb3RlcwotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBFR0xfUkVDT1JEQUJMRV9BTkRST0lEICAgICBib29sZWFuICAgICB3aGV0aGVyIHZpZGVvIHJlY29yZGluZyBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQKLQotICAgIFNlY3Rpb24gMy40LCBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQsIGFkZCBhIHJvdyB0byBUYWJsZSAzLjQuCi0KLSAgICAgICAgICAgICAgQXR0cmlidXRlICAgICAgICAgICAgRGVmYXVsdCAgICAgU2VsZWN0aW9uICBTb3J0ICAgU29ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcml0ZXJpYSAgIE9yZGVyICBQcmlvcml0eQotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0gIC0tLS0tICAtLS0tLS0tLQotICAgICAgICBFR0xfUkVDT1JEQUJMRV9BTkRST0lEICBFR0xfRE9OVF9DQVJFICAgIEV4YWN0ICAgIE5vbmUKLQotICAgIFNlY3Rpb24gMy40LCBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQsIGFkZCBhIHBhcmFncmFwaCBhdCB0aGUgZW5kIG9mIHRoZQotICAgIHN1YnNlY3Rpb24gdGl0bGVkIE90aGVyIEVHTENvbmZpZyBBdHRyaWJ1dGUgRGVzY3JpcHRpb25zLgotCi0gICAgICAgIEVHTF9SRUNPUkRBQkxFX0FORFJPSUQgaXMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29uZmlnIG1heQotICAgICAgICBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBFR0xTdXJmYWNlIGZyb20gYW4gQU5hdGl2ZVdpbmRvdyB0aGF0IGlzIGEgdmlkZW8KLSAgICAgICAgcmVjb3JkZXIgYXMgaW5kaWNhdGVkIGJ5IHRoZSBOQVRJVkVfV0lORE9XX0lTX1ZJREVPX1JFQ09SREVSIHF1ZXJ5IG9uCi0gICAgICAgIHRoZSBBTmF0aXZlV2luZG93LgotCi0gICAgU2VjdGlvbiAzLjQuMSwgUXVlcnlpbmcgQ29uZmlndXJhdGlvbnMsIGNoYW5nZSB0aGUgbGFzdCBwYXJhZ3JhcGggYXMgZm9sbG93Ci0KLSAgICAgICAgRUdMQ29uZmlncyBhcmUgbm90IHNvcnRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHBhcmFtZXRlcnMKLSAgICAgICAgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IsIEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSwgRUdMX0NPTkZPUk1BTlQsCi0gICAgICAgIEVHTF9MRVZFTCwgRUdMX05BVElWRV9SRU5ERVJBQkxFLCBFR0xfTUFYX1NXQVBfSU5URVJWQUwsCi0gICAgICAgIEVHTF9NSU5fU1dBUF9JTlRFUlZBTCwgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX1NVUkZBQ0VfVFlQRSwKLSAgICAgICAgRUdMX1RSQU5TUEFSRU5UX1RZUEUsIEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUsCi0gICAgICAgIEVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSwgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUsIGFuZAotICAgICAgICBFR0xfUkVDT1JEQUJMRV9BTkRST0lELgotCi1Jc3N1ZXMKLQotICAgIDEuIFNob3VsZCB0aGlzIGZ1bmN0aW9uYWxpdHkgYmUgZXhwb3NlZCBhcyBhIG5ldyBhdHRyaWJ1dGUgb3IgYXMgYSBiaXQgaW4KLSAgICB0aGUgRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZD8KLQotICAgIFJFU09MVkVEOiBJdCBzaG91bGQgYmUgYSBuZXcgYXR0cmlidXRlLiAgSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byB1c2UgdXAgYQotICAgIGJpdCBpbiB0aGUgbGltaXQtc2l6ZSBiaXRmaWVsZCBmb3IgYSBwbGF0Zm9ybS1zcGVjaWZpYyBleHRlbnNpb24uCi0KLSAgICAyLiBIb3cgc2hvdWxkIHRoZSBuZXcgYXR0cmlidXRlIGFmZmVjdCB0aGUgc29ydGluZyBvZiBFR0xDb25maWdzPwotCi0gICAgUkVTT0xWRUQ6IEl0IHNob3VsZCBub3QgYWZmZWN0IHNvcnRpbmcuICBTb21lIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IGhhdmUKLSAgICBhbnkgZHJhd2JhY2sgYXNzb2NpYXRlZCB3aXRoIHVzaW5nIGEgcmVjb3JkYWJsZSBFR0xDb25maWcuICBTdWNoCi0gICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3QgaGF2ZSB0byBkb3VibGUtdXAgc29tZSBvZiB0aGVpciBjb25maWdzIHRvICBvbmUKLSAgICBzb3J0IGVhcmxpZXIgdGhhbiAuICBJbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBoYXZlIGRyYXdiYWNrcyBjYW4gdXNlIHRoZQotICAgIGV4aXN0aW5nIGNhdmVhdCBtZWNoYW5pc20gdG8gcmVwb3J0IHRoaXMgZHJhd2JhY2sgdG8gdGhlIGNsaWVudC4KLQotICAgIDMuIEhvdyBpcyB0aGlzIGV4dGVuc2lvbiBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZD8KLQotICAgIFJFU1BPTlNFOiBUaGVyZSBhcmUgdHdvIGJhc2ljIGFwcHJvYWNoZXMgdG8gaW1wbGVtZW50aW5nIHRoaXMgZXh0ZW5zaW9uCi0gICAgdGhhdCB3ZXJlIGNvbnNpZGVyZWQgZHVyaW5nIGl0cyBkZXNpZ24uICBJbiBib3RoIGNhc2VzIGl0IGlzIGFzc3VtZWQgdGhhdCBhCi0gICAgY29sb3Igc3BhY2UgY29udmVyc2lvbiBtdXN0IGJlIHBlcmZvcm1lZCBhdCBzb21lIHBvaW50IGJlY2F1c2UgbW9zdCB2aWRlbwotICAgIGVuY29kaW5nIGZvcm1hdHMgdXNlIGEgWVVWIGNvbG9yIHNwYWNlLiAgVGhlIHR3byBhcHByb2FjaGVzIGFyZQotICAgIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHBvaW50IGF0IHdoaWNoIHRoaXMgY29sb3Igc3BhY2UgY29udmVyc2lvbiBpcwotICAgIHBlcmZvcm1lZC4KLQotICAgIE9uZSBhcHByb2FjaCBpbnZvbHZlcyBwZXJmb3JtaW5nIHRoZSBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFzIHBhcnQgb2YgdGhlCi0gICAgZWdsU3dhcEJ1ZmZlcnMgY2FsbCBiZWZvcmUgcXVldWluZyB0aGUgcmVuZGVyZWQgaW1hZ2UgdG8gdGhlIEFOYXRpdmVXaW5kb3cuCi0gICAgSW4gdGhpcyBjYXNlLCB0aGUgVmlzdWFsSUQgb2YgdGhlIEVHTENvbmZpZyB3b3VsZCBjb3JyZXNwb25kIHRvIGEgWVVWCi0gICAgQW5kcm9pZCBIQUwgcGl4ZWwgZm9ybWF0IGZyb20gd2hpY2ggdGhlIHZpZGVvIGVuY29kZXIgY2FuIHJlYWQuICBUaGUKLSAgICBFR0xDb25maWcgd291bGQgbGlrZWx5IGhhdmUgdGhlIEVHTF9TTE9XX0NPTkZJRyBjYXZlYXQgYmVjYXVzZSB1c2luZyB0aGF0Ci0gICAgY29uZmlnIHRvIHJlbmRlciBub3JtYWwgd2luZG93IGNvbnRlbnRzIHdvdWxkIHJlc3VsdCBpbiBhbiBSR0IgLT4gWVVWIGNvbG9yCi0gICAgc3BhY2UgY29udmVyc2lvbiB3aGVuIHJlbmRlcmluZyB0aGUgZnJhbWUgYXMgd2VsbCBhcyBhIFlVViAtPiBSR0IKLSAgICBjb252ZXJzaW9uIHdoZW4gY29tcG9zaXRpbmcgdGhlIHdpbmRvdy4KLQotICAgIFRoZSBvdGhlciBhcHByb2FjaCBpbnZvbHZlcyBwZXJmb3JtaW5nIHRoZSBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGluIHRoZQotICAgIHZpZGVvIGVuY29kZXIuICBJbiB0aGlzIGNhc2UsIHRoZSBWaXN1YWxJRCBvZiB0aGUgRUdMQ29uZmlnIHdvdWxkCi0gICAgY29ycmVzcG9uZCB0byBhbiBSR0IgSEFMIHBpeGVsIGZvcm1hdCBmcm9tIHdoaWNoIHRoZSB2aWRlbyBlbmNvZGVyIGNhbgotICAgIHJlYWQuICBUaGUgRUdMQ29uZmlnIHdvdWxkIGxpa2VseSBub3QgbmVlZCB0byBoYXZlIGFueSBjYXZlYXQgc2V0LCBhcyB1c2luZwotICAgIHRoaXMgY29uZmlnIGZvciBub3JtYWwgd2luZG93IHJlbmRlcmluZyB3b3VsZCBub3QgaGF2ZSBhbnkgYWRkZWQgY29zdC4KLQotUmV2aXNpb24gSGlzdG9yeQotCi0jMiAoSmFtaWUgR2VubmlzLCBKdWx5IDE1LCAyMDExKQotICAgIC0gQWRkZWQgaXNzdWUgMy4KLQotIzEgKEphbWllIEdlbm5pcywgSnVseSA4LCAyMDExKQotICAgIC0gSW5pdGlhbCBkcmFmdC4KZGlmZiAtLWdpdCBhL29wZW5nbC9zcGVjcy9SRUFETUUgYi9vcGVuZ2wvc3BlY3MvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmIyNzhmLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9zcGVjcy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyBPcGVuR0wgRVMgYW5kIEVHTCBleHRlbnNpb24gc3BlY2lmaWNhdGlvbnMgdGhhdCBoYXZlCi1iZWVuIG9yIGFyZSBiZWluZyBkZWZpbmVkIGZvciBBbmRyb2lkLiAgCi0KLVRoZSB0YWJsZSBiZWxvdyB0cmFja3MgdXNhZ2Ugb2YgRUdMIGVudW1lcmFudCB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gcmVzZXJ2ZWQKLWZvciB1c2UgYnkgQW5kcm9pZCBleHRlbnNpb25zLgotCi0gICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb24KLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTB4MzE0MCAgICAgICAgICAgICAgIEVHTF9BTkRST0lEX2ltYWdlX25hdGl2ZV9idWZmZXIKLTB4MzE0MSAgICAgICAgICAgICAgICh1bnVzZWQpCi0weDMxNDIgICAgICAgICAgICAgICBFR0xfQU5EUk9JRF9yZWNvcmRhYmxlCi0weDMxNDMgICAgICAgICAgICAgICBFR0xfVkVSU0lPTl9IV19BTkRST0lEIChpbnRlcm5hbCB1c2UpCi0weDMxNDQgLSAweDMxNEYgICAgICAodW51c2VkKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL0VHTFRlc3QvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9FR0xUZXN0L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTA0ZDEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL0VHTFRlc3QvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMgQnVpbGQgdGhlIHVuaXQgdGVzdHMuCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gRUdMX3Rlc3QKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBlZ2xfY2FjaGVfdGVzdC5jcHAgXAotICAgIEVHTF90ZXN0LmNwcCBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYkVHTCBcCi0JbGliY3V0aWxzIFwKLQlsaWJzdGxwb3J0IFwKLQlsaWJ1dGlscyBcCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotCWxpYmd0ZXN0IFwKLQlsaWJndGVzdF9tYWluIFwKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgYmlvbmljIFwKLSAgICBiaW9uaWMvbGliYy9wcml2YXRlIFwKLSAgICBiaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAotICAgIGV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAotICAgIGV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCi0gICAgZnJhbWV3b3Jrcy9iYXNlL29wZW5nbC9saWJzIFwKLSAgICBmcmFtZXdvcmtzL2Jhc2Uvb3BlbmdsL2xpYnMvRUdMIFwKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMgSW5jbHVkZSBzdWJkaXJlY3RvcnkgbWFrZWZpbGVzCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIElmIHdlJ3JlIGJ1aWxkaW5nIHdpdGggT05FX1NIT1RfTUFLRUZJTEUgKG1tLCBtbW0pLCB0aGVuIHdoYXQgdGhlIGZyYW1ld29yawotIyB0ZWFtIHJlYWxseSB3YW50cyBpcyB0byBidWlsZCB0aGUgc3R1ZmYgZGVmaW5lZCBieSB0aGlzIG1ha2VmaWxlLgotaWZlcSAoLCQoT05FX1NIT1RfTUFLRUZJTEUpKQotaW5jbHVkZSAkKGNhbGwgZmlyc3QtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCi1lbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL0VHTFRlc3QvRUdMX3Rlc3QuY3BwIGIvb3BlbmdsL3Rlc3RzL0VHTFRlc3QvRUdMX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzdhZDMzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9FR0xUZXN0L0VHTF90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRUdMVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7Ci0KLXByb3RlY3RlZDoKLSAgICBFR0xUZXN0KCkgOgotICAgICAgICAgICAgbUVnbERpc3BsYXkoRUdMX05PX0RJU1BMQVkpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIG1FZ2xEaXNwbGF5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICAgICAgQVNTRVJUX05FKEVHTF9OT19ESVNQTEFZLCBtRWdsRGlzcGxheSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKLSAgICAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsSW5pdGlhbGl6ZShtRWdsRGlzcGxheSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbikpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiRWdsVmVyc2lvbk1ham9yIiwgbWFqb3JWZXJzaW9uKTsKLSAgICAgICAgUmVjb3JkUHJvcGVydHkoIkVnbFZlcnNpb25NYWpvciIsIG1pbm9yVmVyc2lvbik7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBFR0xCb29sZWFuIHN1Y2Nlc3MgPSBlZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1RSVUUsIHN1Y2Nlc3MpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIH0KLX07Ci0KLVRFU1RfRihFR0xUZXN0LCBESVNBQkxFRF9FR0xDb25maWdFaWdodEJpdEZpcnN0KSB7Ci0KLSAgICBFR0xpbnQgbnVtQ29uZmlnczsKLSAgICBFR0xDb25maWcgY29uZmlnOwotICAgIEVHTEJvb2xlYW4gc3VjY2VzczsKLSAgICBFR0xpbnQgYXR0cnNbXSA9IHsKLSAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsICAgICAgIEVHTF9XSU5ET1dfQklULAotICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgICAgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICAgICAgRUdMX05PTkUKLSAgICB9OwotCi0gICAgc3VjY2VzcyA9IGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwgYXR0cnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKLSAgICBBU1NFUlRfRVEoRUdMX1RSVUUsIHN1Y2Nlc3MpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgQVNTRVJUX0dFKG51bUNvbmZpZ3MsIDEpOwotCi0gICAgRUdMaW50IGNvbXBvbmVudHNbM107Ci0KLSAgICBzdWNjZXNzID0gZWdsR2V0Q29uZmlnQXR0cmliKG1FZ2xEaXNwbGF5LCBjb25maWcsIEVHTF9SRURfU0laRSwgJmNvbXBvbmVudHNbMF0pOwotICAgIEFTU0VSVF9FUShFR0xfVFJVRSwgc3VjY2Vzcyk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICBzdWNjZXNzID0gZWdsR2V0Q29uZmlnQXR0cmliKG1FZ2xEaXNwbGF5LCBjb25maWcsIEVHTF9HUkVFTl9TSVpFLCAmY29tcG9uZW50c1sxXSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9UUlVFLCBzdWNjZXNzKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIHN1Y2Nlc3MgPSBlZ2xHZXRDb25maWdBdHRyaWIobUVnbERpc3BsYXksIGNvbmZpZywgRUdMX0JMVUVfU0laRSwgJmNvbXBvbmVudHNbMl0pOwotICAgIEFTU0VSVF9FUShFR0xfVFJVRSwgc3VjY2Vzcyk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLQotICAgIEVYUEVDVF9HRShjb21wb25lbnRzWzBdLCA4KTsKLSAgICBFWFBFQ1RfR0UoY29tcG9uZW50c1sxXSwgOCk7Ci0gICAgRVhQRUNUX0dFKGNvbXBvbmVudHNbMl0sIDgpOwotfQotCi1URVNUX0YoRUdMVGVzdCwgRUdMQ29uZmlnUkdCQTg4ODhGaXJzdCkgewotCi0gICAgRUdMaW50IG51bUNvbmZpZ3M7Ci0gICAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgICBFR0xCb29sZWFuIHN1Y2Nlc3M7Ci0gICAgRUdMaW50IGF0dHJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCAgICAgICBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsICAgIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgICAgIDgsCi0gICAgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgICAgICA4LAotICAgICAgICAgICAgRUdMX0JMVUVfU0laRSwgICAgICAgICAgOCwKLSAgICAgICAgICAgIEVHTF9BTFBIQV9TSVpFLCAgICAgICAgIDgsCi0gICAgICAgICAgICBFR0xfTk9ORQotICAgIH07Ci0KLSAgICBzdWNjZXNzID0gZWdsQ2hvb3NlQ29uZmlnKG1FZ2xEaXNwbGF5LCBhdHRycywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOwotICAgIEFTU0VSVF9FUShFR0xfVFJVRSwgc3VjY2Vzcyk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICBBU1NFUlRfR0UobnVtQ29uZmlncywgMSk7Ci0KLSAgICBFR0xpbnQgY29tcG9uZW50c1s0XTsKLQotICAgIHN1Y2Nlc3MgPSBlZ2xHZXRDb25maWdBdHRyaWIobUVnbERpc3BsYXksIGNvbmZpZywgRUdMX1JFRF9TSVpFLCAmY29tcG9uZW50c1swXSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9UUlVFLCBzdWNjZXNzKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIHN1Y2Nlc3MgPSBlZ2xHZXRDb25maWdBdHRyaWIobUVnbERpc3BsYXksIGNvbmZpZywgRUdMX0dSRUVOX1NJWkUsICZjb21wb25lbnRzWzFdKTsKLSAgICBBU1NFUlRfRVEoRUdMX1RSVUUsIHN1Y2Nlc3MpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgc3VjY2VzcyA9IGVnbEdldENvbmZpZ0F0dHJpYihtRWdsRGlzcGxheSwgY29uZmlnLCBFR0xfQkxVRV9TSVpFLCAmY29tcG9uZW50c1syXSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9UUlVFLCBzdWNjZXNzKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIHN1Y2Nlc3MgPSBlZ2xHZXRDb25maWdBdHRyaWIobUVnbERpc3BsYXksIGNvbmZpZywgRUdMX0FMUEhBX1NJWkUsICZjb21wb25lbnRzWzNdKTsKLSAgICBBU1NFUlRfRVEoRUdMX1RSVUUsIHN1Y2Nlc3MpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICBFWFBFQ1RfR0UoY29tcG9uZW50c1swXSwgOCk7Ci0gICAgRVhQRUNUX0dFKGNvbXBvbmVudHNbMV0sIDgpOwotICAgIEVYUEVDVF9HRShjb21wb25lbnRzWzJdLCA4KTsKLSAgICBFWFBFQ1RfR0UoY29tcG9uZW50c1szXSwgOCk7Ci19Ci0KLQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL0VHTFRlc3QvZWdsX2NhY2hlX3Rlc3QuY3BwIGIvb3BlbmdsL3Rlc3RzL0VHTFRlc3QvZWdsX2NhY2hlX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q5ZTNlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9FR0xUZXN0L2VnbF9jYWNoZV90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFR0xfdGVzdCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImVnbF9jYWNoZS5oIgotI2luY2x1ZGUgImVnbF9kaXNwbGF5LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRUdMQ2FjaGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBtQ2FjaGUgPSBlZ2xfY2FjaGVfdDo6Z2V0KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBtQ2FjaGUtPnNldENhY2hlRmlsZW5hbWUoIiIpOwotICAgICAgICBtQ2FjaGUtPnRlcm1pbmF0ZSgpOwotICAgIH0KLQotICAgIGVnbF9jYWNoZV90KiBtQ2FjaGU7Ci19OwotCi1URVNUX0YoRUdMQ2FjaGVUZXN0LCBVbmluaXRpYWxpemVkQ2FjaGVBbHdheXNNaXNzZXMpIHsKLSAgICBjaGFyIGJ1Zls0XSA9IHsgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSB9OwotICAgIG1DYWNoZS0+c2V0QmxvYigiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0gICAgQVNTRVJUX0VRKDAsIG1DYWNoZS0+Z2V0QmxvYigiYWJjZCIsIDQsIGJ1ZiwgNCkpOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMl0pOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbM10pOwotfQotCi1URVNUX0YoRUdMQ2FjaGVUZXN0LCBJbml0aWFsaXplZENhY2hlQWx3YXlzSGl0cykgewotICAgIGNoYXIgYnVmWzRdID0geyAweGVlLCAweGVlLCAweGVlLCAweGVlIH07Ci0gICAgbUNhY2hlLT5pbml0aWFsaXplKGVnbF9kaXNwbGF5X3Q6OmdldChFR0xfREVGQVVMVF9ESVNQTEFZKSk7Ci0gICAgbUNhY2hlLT5zZXRCbG9iKCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKLSAgICBBU1NFUlRfRVEoNCwgbUNhY2hlLT5nZXRCbG9iKCJhYmNkIiwgNCwgYnVmLCA0KSk7Ci0gICAgQVNTRVJUX0VRKCdlJywgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoJ2YnLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUSgnZycsIGJ1ZlsyXSk7Ci0gICAgQVNTRVJUX0VRKCdoJywgYnVmWzNdKTsKLX0KLQotVEVTVF9GKEVHTENhY2hlVGVzdCwgVGVybWluYXRlZENhY2hlQWx3YXlzTWlzc2VzKSB7Ci0gICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBtQ2FjaGUtPmluaXRpYWxpemUoZWdsX2Rpc3BsYXlfdDo6Z2V0KEVHTF9ERUZBVUxUX0RJU1BMQVkpKTsKLSAgICBtQ2FjaGUtPnNldEJsb2IoImFiY2QiLCA0LCAiZWZnaCIsIDQpOwotICAgIG1DYWNoZS0+dGVybWluYXRlKCk7Ci0gICAgQVNTRVJUX0VRKDAsIG1DYWNoZS0+Z2V0QmxvYigiYWJjZCIsIDQsIGJ1ZiwgNCkpOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMl0pOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbM10pOwotfQotCi1jbGFzcyBFR0xDYWNoZVNlcmlhbGl6YXRpb25UZXN0IDogcHVibGljIEVHTENhY2hlVGVzdCB7Ci0KLXByb3RlY3RlZDoKLQotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgRUdMQ2FjaGVUZXN0OjpTZXRVcCgpOwotCi0gICAgICAgIGNoYXIqIHRuID0gdGVtcG5hbSgiL3NkY2FyZCIsICJFR0xfdGVzdC1jYWNoZS0iKTsKLSAgICAgICAgbUZpbGVuYW1lID0gdG47Ci0gICAgICAgIGZyZWUodG4pOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgdW5saW5rKG1GaWxlbmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIEVHTENhY2hlVGVzdDo6VGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IG1GaWxlbmFtZTsKLX07Ci0KLVRFU1RfRihFR0xDYWNoZVNlcmlhbGl6YXRpb25UZXN0LCBSZWluaXRpYWxpemVkQ2FjaGVDb250YWluc1ZhbHVlcykgewotICAgIGNoYXIgYnVmWzRdID0geyAweGVlLCAweGVlLCAweGVlLCAweGVlIH07Ci0gICAgbUNhY2hlLT5zZXRDYWNoZUZpbGVuYW1lKG1GaWxlbmFtZSk7Ci0gICAgbUNhY2hlLT5pbml0aWFsaXplKGVnbF9kaXNwbGF5X3Q6OmdldChFR0xfREVGQVVMVF9ESVNQTEFZKSk7Ci0gICAgbUNhY2hlLT5zZXRCbG9iKCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKLSAgICBtQ2FjaGUtPnRlcm1pbmF0ZSgpOwotICAgIG1DYWNoZS0+aW5pdGlhbGl6ZShlZ2xfZGlzcGxheV90OjpnZXQoRUdMX0RFRkFVTFRfRElTUExBWSkpOwotICAgIEFTU0VSVF9FUSg0LCBtQ2FjaGUtPmdldEJsb2IoImFiY2QiLCA0LCBidWYsIDQpKTsKLSAgICBBU1NFUlRfRVEoJ2UnLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUSgnZicsIGJ1ZlsxXSk7Ci0gICAgQVNTRVJUX0VRKCdnJywgYnVmWzJdKTsKLSAgICBBU1NFUlRfRVEoJ2gnLCBidWZbM10pOwotfQotCi19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0Zjc2ZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVM6PSBhcHAtbGludXguY3BwIGRlbW8uYy5hcm0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliRUdMIGxpYkdMRVN2MV9DTSBsaWJ1aQotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotTE9DQUxfTU9EVUxFOj0gYW5nZWxlcwotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvTU9EVUxFX0xJQ0VOU0VfQlNEX09SX0xHUEwgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9NT0RVTEVfTElDRU5TRV9CU0RfT1JfTEdQTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9NT0RVTEVfTElDRU5TRV9CU0RfT1JfTEdQTAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9SRUFETUUudHh0IGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiOGE0YS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQ0KLUNvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGENCi1XZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vDQotU2VlIGZpbGUgbGljZW5zZS50eHQgZm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbi4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi1UaGlzIGlzIGFuIE9wZW5HTCBFUyBwb3J0IG9mIHRoZSBzbWFsbCBzZWxmLXJ1bm5pbmcgZGVtb25zdHJhdGlvbg0KLWNhbGxlZCAiU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24iLCB3aGljaCB3YXMgZmlyc3QgcHJlc2VudGVkIGluIHRoZQ0KLUFzc2VtYmx5JzIwMDQgZXZlbnQuIEl0IHdvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIDQgS0IgaW50cm8NCi1jb21wZXRpdGlvbiBjYXRlZ29yeS4NCi0NCi1UaGUgZGVtb25zdHJhdGlvbiBmZWF0dXJlcyBhIHNpZ2h0c2VlaW5nIG9mIGEgZnV0dXJpc3RpYyBjaXR5DQotaGF2aW5nIG1hbnkgZGlmZmVyZW50IGtpbmQgb2YgYnVpbGRpbmdzIGFuZCBpdGVtcy4gRXZlcnl0aGluZyBpcw0KLWZsYXQgc2hhZGVkIHdpdGggdGhyZWUgZGlmZmVyZW50IGxpZ2h0cy4NCi0NCi1UaGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgbWFkZSBmb3IgZGVza3RvcCB3aXRoIE9wZW5HTC4gSXQgd2FzDQotbmF0dXJhbGx5IGhlYXZpbHkgc2l6ZSBvcHRpbWl6ZWQgaW4gb3JkZXIgdG8gZml0IGl0IGluIHRoZSBzaXplDQotbGltaXQuIEZvciB0aGlzIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgbXVjaCBvZiB0aGUgY29kZSBpcw0KLWNsZWFuZWQgdXAgYW5kIHRoZSBzb3VuZCBpcyByZW1vdmVkLiBBbHNvIGRldGFpbCBsZXZlbCBpcyBsb3dlcmVkLA0KLWFsdGhvdWdoIGl0IHN0aWxsIGNvbnRhaW5zIG92ZXIgNjAwMDAgZmFjZXMuDQotDQotVGhlIFdpbjMyICgyMDAwL1hQKSBiaW5hcnkgcGFja2FnZSBvZiBvcmlnaW5hbCB2ZXJzaW9uIGlzDQotYXZhaWxhYmxlIGZyb20gdGhpcyBhZGRyZXNzOiBodHRwOi8vamV0LnJvL2ZpbGVzL2FuZ2VsZXMuemlwDQotDQotRmlyc3QgdmVyc2lvbiBvZiB0aGlzIE9wZW5HTCBFUyBwb3J0IHdhcyBzdWJtaXR0ZWQgdG8gdGhlIEtocm9ub3MNCi1PcGVuR0wgRVMgQ29kaW5nIENoYWxsZW5nZSBoZWxkIGluIDIwMDQtMjAwNS4NCi0NCi1BcyBhIGNvZGUgZXhhbXBsZSwgdGhpcyBzb3VyY2Ugc2hvd3MgdGhlIGZvbGxvd2luZzoNCi0gICogSG93IHRvIGNyZWF0ZSBhIG1pbmltYWwgYW5kIHBvcnRhYmxlIGFkIGhvYyBmcmFtZXdvcmsNCi0gICAgZm9yIHNtYWxsIHRlc3RpbmcvZGVtb25zdHJhdGlvbiBwcm9ncmFtcy4gVGhpcyBmcmFtZXdvcmsNCi0gICAgY29tcGlsZXMgZm9yIGJvdGggZGVza3RvcCBhbmQgUG9ja2V0UEMgV2luMzIgZW52aXJvbm1lbnQsDQotICAgIGFuZCBhIHNlcGFyYXRlIHNvdXJjZSBpcyBpbmNsdWRlZCBmb3IgTGludXggd2l0aCBYMTEuDQotICAqIEhvdyB0byBkeW5hbWljYWxseSBmaW5kIGFuZCB1c2UgdGhlIE9wZW5HTCBFUyBETEwgb3INCi0gICAgc2hhcmVkIG9iamVjdCwgc28gdGhhdCB0aGUgbGlicmFyeSBpcyBub3QgbmVlZGVkIGF0DQotICAgIHRoZSBjb21waWxlL2xpbmsgc3RhZ2UuDQotICAqIEhvdyB0byB1c2UgdGhlIGJhc2ljIGZlYXR1cmVzIG9mIE9wZW5HTCBFUyAxLjAvMS4xDQotICAgIENvbW1vbiBMaXRlLCBzdWNoIGFzIHZlcnRleCBhcnJheXMsIGNvbG9yIGFycmF5cyBhbmQNCi0gICAgbGlnaHRpbmcuDQotICAqIEhvdyB0byBjcmVhdGUgYSBzZWxmIGNvbnRhaW5lZCBzbWFsbCBkZW1vbnN0cmF0aW9uDQotICAgIGFwcGxpY2F0aW9uIHdpdGggb2JqZWN0cyBnZW5lcmF0ZWQgdXNpbmcgcHJvY2VkdXJhbA0KLSAgICBhbGdvcml0aG1zLg0KLQ0KLUFzIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdhcyBvcHRpbWl6ZWQgZm9yIHNpemUgaW5zdGVhZCBvZg0KLXBlcmZvcm1hbmNlLCB0aGF0IGhvbGRzIHRydWUgZm9yIHRoaXMgT3BlbkdMIEVTIHZlcnNpb24gYXMNCi13ZWxsLiBUaHVzIHRoZSBwZXJmb3JtYW5jZSBjb3VsZCBiZSBzaWduaWZpY2FudGx5IGluY3JlYXNlZCwNCi1mb3IgZXhhbXBsZSBieSBjaGFuZ2luZyB0aGUgY29kZSB0byB1c2UgZ2xEcmF3RWxlbWVudHMNCi1pbnN0ZWFkIG9mIGdsRHJhd0FycmF5cy4gVGhlIGNvZGUgdXNlcyBvbmx5IE9wZW5HTCBFUyAxLjANCi1Db21tb24gTGl0ZSAtbGV2ZWwgZnVuY3Rpb24gY2FsbHMgd2l0aG91dCBhbnkgZXh0ZW5zaW9ucy4NCi0NCi1UaGUgcmVmZXJlbmNlIE9wZW5HTCBFUyBpbXBsZW1lbnRhdGlvbnMgdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbjoNCi0gICogSHlicmlkJ3MgT3BlbkdMIEVTIEFQSSBJbXBsZW1lbnRhdGlvbiAoR2VyYmVyYSkgdmVyc2lvbiAyLjAuNA0KLSAgICBQcmVidWlsdCBXaW4zMiBQQyBleGVjdXRhYmxlOiBTYW5PR0xFUy1HZXJiZXJhLmV4ZQ0KLSAgKiBQb3dlclZSIE1CWCBTREssIE9wZW5HTCBFUyBXaW5kb3dzIFBDIEVtdWxhdGlvbiB2ZXJzaW9uIDEuMDQuMTQuMDE3MA0KLSAgICBQcmVidWlsdCBXaW4zMiBQQyBleGVjdXRhYmxlOiBTYW5PR0xFUy1QVlJTREsuZXhlDQotDQotTm90ZSB0aGF0IERJU0FCTEVfSU1QT1JUR0wgcHJlcHJvY2Vzc29yIG1hY3JvIGNhbiBiZSB1c2VkDQotdG8gc3BlY2lmeSBub3QgdG8gdXNlIGR5bmFtaWMgcnVudGltZSBiaW5kaW5nIG9mIHRoZSBsaWJyYXJ5Lg0KLVlvdSBhbHNvIG5lZWQgdG8gZGVmaW5lIHByZXByb2Nlc3NvciBtYWNybyBQVlJTREsgdG8gY29tcGlsZQ0KLXRoZSBzb3VyY2Ugd2l0aCBQb3dlclZSIE9wZW5HTCBFUyBTREsuDQotDQotVGhlIGRlbW8gYXBwbGljYXRpb24gaXMgYnJpZWZseSB0ZXN0ZWQgd2l0aCBhIGZldyBvdGhlciBPcGVuR0wgRVMNCi1pbXBsZW1lbnRhdGlvbnMgYXMgd2VsbCAoZS5nLiBWaW5jZW50LCBHTEVTb25HTCBvbiBMaW51eCwgRGVsbA0KLUF4aW0gWDUwdikuIE1vc3Qgb2YgdGhlc2Ugb3RoZXIgaW1wbGVtZW50YXRpb25zIHJlbmRlcmVkIHRoZSBkZW1vDQotZXJyb25lb3VzbHkgaW4gc29tZSBhc3BlY3QuIFRoaXMgbWF5IGluZGljYXRlIHRoYXQgdGhlIGRlbW8gc291cmNlDQotY291bGQgc3RpbGwgaGF2ZSBzb21lIHdvcmsgdG8gZG8gd2l0aCBjb21wYXRpYmlsaXR5IGFuZCBjb3JyZWN0DQotQVBJIHVzYWdlLCBhbHRob3VnaCB0aGUgbm9uLWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb25zIGFyZSBtb3N0DQotcHJvYmFibHkgdW5maW5pc2hlZCBhcyB3ZWxsLg0KLQ0KLVRoYW5rcyBhbmQgQWNrbm93bGVkZ2VtZW50czoNCi0NCi0qIFRvbmkgTPZubmJlcmcgKCFDdWJlKSBjcmVhdGVkIHRoZSBtdXNpYyBmb3Igb3JpZ2luYWwgdmVyc2lvbiwgd2hpY2gNCi0gIGlzIG5vdCBmZWF0dXJlZCBpbiB0aGlzIE9wZW5HTCBFUyBwb3J0Lg0KLSogU2FyYSBLYXBsaSAoc3QgUmFuYSkgZm9yIGFkZGl0aW9uYWwgY2FtZXJhIHdvcmsuDQotKiBQYXVsIEJvdXJrZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1cGVyc2hhcGVzLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC1saW51eC5jcHAgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAtbGludXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWM2OGEyLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC1saW51eC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQotICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KLSAqCi0gKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgotICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCi0gKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCi0gKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCi0gKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCi0gKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCi0gKgotICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKLSAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICRJZDogYXBwLWxpbnV4LmMsdiAxLjQgMjAwNS8wMi8wOCAxODo0Mjo0OCB0b25pYyBFeHAgJAotICogJFJldmlzaW9uOiAxLjQgJAotICoKLSAqIFBhcnRzIG9mIHRoaXMgc291cmNlIGZpbGUgaXMgYmFzZWQgb24gdGVzdC9leGFtcGxlIGNvZGUgZnJvbQotICogR0xFU29uR0wgaW1wbGVtZW50YXRpb24gYnkgRGF2aWQgQmx5dGhlLiBIZXJlIGlzIGNvcHkgb2YgdGhlCi0gKiBsaWNlbnNlIG5vdGljZSBmcm9tIHRoYXQgc291cmNlOgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWQgQmx5dGhlICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIERBVklEIEJMWVRIRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotI2luY2x1ZGUgImFwcC5oIgotCi0KLWludCBnQXBwQWxpdmUgPSAxOwotCi1zdGF0aWMgY29uc3QgY2hhciBzQXBwTmFtZVtdID0KLSAgICAgICAgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgKExpbnV4KSI7Ci0KLXN0YXRpYyBpbnQgc1dpbmRvd1dpZHRoID0gV0lORE9XX0RFRkFVTFRfV0lEVEg7Ci1zdGF0aWMgaW50IHNXaW5kb3dIZWlnaHQgPSBXSU5ET1dfREVGQVVMVF9IRUlHSFQ7Ci1zdGF0aWMgRUdMRGlzcGxheSBzRWdsRGlzcGxheSA9IEVHTF9OT19ESVNQTEFZOwotc3RhdGljIEVHTENvbnRleHQgc0VnbENvbnRleHQgPSBFR0xfTk9fQ09OVEVYVDsKLXN0YXRpYyBFR0xTdXJmYWNlIHNFZ2xTdXJmYWNlID0gRUdMX05PX1NVUkZBQ0U7Ci0KLWNvbnN0IGNoYXIgKmVnbF9zdHJlcnJvcih1bnNpZ25lZCBlcnIpCi17Ci0gICAgc3dpdGNoKGVycil7Ci0gICAgICAgIGNhc2UgRUdMX1NVQ0NFU1M6IHJldHVybiAiU1VDQ0VTUyI7Ci0gICAgICAgIGNhc2UgRUdMX05PVF9JTklUSUFMSVpFRDogcmV0dXJuICJOT1QgSU5JVElBTElaRUQiOwotICAgICAgICBjYXNlIEVHTF9CQURfQUNDRVNTOiByZXR1cm4gIkJBRCBBQ0NFU1MiOwotICAgICAgICBjYXNlIEVHTF9CQURfQUxMT0M6IHJldHVybiAiQkFEIEFMTE9DIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0FUVFJJQlVURTogcmV0dXJuICJCQURfQVRUUklCVVRFIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0NPTkZJRzogcmV0dXJuICJCQUQgQ09ORklHIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0NPTlRFWFQ6IHJldHVybiAiQkFEIENPTlRFWFQiOwotICAgICAgICBjYXNlIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFOiByZXR1cm4gIkJBRCBDVVJSRU5UIFNVUkZBQ0UiOwotICAgICAgICBjYXNlIEVHTF9CQURfRElTUExBWTogcmV0dXJuICJCQUQgRElTUExBWSI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9NQVRDSDogcmV0dXJuICJCQUQgTUFUQ0giOwotICAgICAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1BJWE1BUDogcmV0dXJuICJCQUQgTkFUSVZFIFBJWE1BUCI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfV0lORE9XOiByZXR1cm4gIkJBRCBOQVRJVkUgV0lORE9XIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX1BBUkFNRVRFUjogcmV0dXJuICJCQUQgUEFSQU1FVEVSIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX1NVUkZBQ0U6IHJldHVybiAiQkFEX1NVUkZBQ0UiOwotICAgICAgICAvLyAgICBjYXNlIEVHTF9DT05URVhUX0xPU1Q6IHJldHVybiAiQ09OVEVYVCBMT1NUIjsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuICJVTktOT1dOIjsKLSAgICB9Ci19Ci0KLXZvaWQgZWdsX2Vycm9yKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgdW5zaWduZWQgZXJyID0gZWdsR2V0RXJyb3IoKTsKLSAgICBpZihlcnIgIT0gRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzKCk6IGVnbCBlcnJvciAweCV4ICglcylcbiIsIAotICAgICAgICAgICAgICAgIG5hbWUsIGVyciwgZWdsX3N0cmVycm9yKGVycikpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY2hlY2tHTEVycm9ycygpCi17Ci0gICAgR0xlbnVtIGVycm9yID0gZ2xHZXRFcnJvcigpOwotICAgIGlmIChlcnJvciAhPSBHTF9OT19FUlJPUikKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJHTCBFcnJvcjogMHglMDR4XG4iLCAoaW50KWVycm9yKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBjaGVja0VHTEVycm9ycygpCi17Ci0gICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKLSAgICAvLyBHTEVTb25HTCBzZWVtcyB0byBiZSByZXR1cm5pbmcgMCB3aGVuIHRoZXJlIGlzIG5vIGVycm9ycz8KLSAgICBpZiAoZXJyb3IgJiYgZXJyb3IgIT0gRUdMX1NVQ0NFU1MpCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRUdMIEVycm9yOiAweCUwNHhcbiIsIChpbnQpZXJyb3IpOwotfQotCi1zdGF0aWMgaW50IGluaXRHcmFwaGljcyh1bnNpZ25lZCBzYW1wbGVzKQotewotICAgIEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfREVQVEhfU0laRSwgMTYsCi0gICAgICAgICAgICBFR0xfU0FNUExFX0JVRkZFUlMsIHNhbXBsZXMgPyAxIDogMCwKLSAgICAgICAgICAgICAgICAgICAgRUdMX1NBTVBMRVMsIHNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgIEVHTF9OT05FCi0gICAgfTsKLQotICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKLSAgICBFR0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgICBFR0xTdXJmYWNlIHN1cmZhY2U7Ci0gICAgRUdMaW50IHcsIGg7Ci0gICAgRUdMRGlzcGxheSBkcHk7Ci0KLSAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyA9IGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsKLQotICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotCi0gICAgc3RhdHVzX3QgZXJyID0gRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdygKLSAgICAgICAgICAgIGRweSwgY29uZmlnQXR0cmlicywgd2luZG93LCAmY29uZmlnKTsKLSAgICBpZiAoZXJyKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgZmluZCBhbiBFR0xDb25maWcgbWF0Y2hpbmcgdGhlIHNjcmVlbiBmb3JtYXRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywgd2luZG93LCBOVUxMKTsKLSAgICBlZ2xfZXJyb3IoImVnbENyZWF0ZVdpbmRvd1N1cmZhY2UiKTsKLQotICAgIGZwcmludGYoc3RkZXJyLCJzdXJmYWNlID0gJXBcbiIsIHN1cmZhY2UpOwotCi0gICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOwotICAgIGVnbF9lcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOwotICAgIGZwcmludGYoc3RkZXJyLCJjb250ZXh0ID0gJXBcbiIsIGNvbnRleHQpOwotCi0gICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsKLSAgICBlZ2xfZXJyb3IoImVnbE1ha2VDdXJyZW50Iik7Ci0KLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZzV2luZG93V2lkdGgpOwotICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZzV2luZG93SGVpZ2h0KTsKLQotICAgIHNFZ2xEaXNwbGF5ID0gZHB5OwotICAgIHNFZ2xTdXJmYWNlID0gc3VyZmFjZTsKLSAgICBzRWdsQ29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgICBpZiAoc2FtcGxlcyA9PSAwKSB7Ci0gICAgICAgIC8vIEdMX01VTFRJU0FNUExFIGlzIGVuYWJsZWQgYnkgZGVmYXVsdAotICAgICAgICBnbERpc2FibGUoR0xfTVVMVElTQU1QTEUpOwotICAgIH0KLQotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkZWluaXRHcmFwaGljcygpCi17Ci0gICAgZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIGVnbERlc3Ryb3lDb250ZXh0KHNFZ2xEaXNwbGF5LCBzRWdsQ29udGV4dCk7Ci0gICAgZWdsRGVzdHJveVN1cmZhY2Uoc0VnbERpc3BsYXksIHNFZ2xTdXJmYWNlKTsKLSAgICBlZ2xUZXJtaW5hdGUoc0VnbERpc3BsYXkpOwotfQotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgdW5zaWduZWQgc2FtcGxlcyA9IDA7Ci0gICAgcHJpbnRmKCJ1c2FnZTogJXMgW3NhbXBsZXNdXG4iLCBhcmd2WzBdKTsKLSAgICBpZiAoYXJnYyA9PSAyKSB7Ci0gICAgICAgIHNhbXBsZXMgPSBhdG9pKCBhcmd2WzFdICk7Ci0gICAgICAgIHByaW50ZigiTXVsdGlzYW1wbGUgZW5hYmxlZDogR0xfU0FNUExFUyA9ICV1XG4iLCBzYW1wbGVzKTsKLSAgICB9Ci0KLSAgICBpZiAoIWluaXRHcmFwaGljcyhzYW1wbGVzKSkKLSAgICB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiR3JhcGhpY3MgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgYXBwSW5pdCgpOwotCi0gICAgc3RydWN0IHRpbWV2YWwgdGltZVRlbXA7Ci0gICAgaW50IGZyYW1lQ291bnQgPSAwOwotICAgIGdldHRpbWVvZmRheSgmdGltZVRlbXAsIE5VTEwpOwotICAgIGRvdWJsZSB0b3RhbFRpbWUgPSB0aW1lVGVtcC50dl91c2VjLzEwMDAwMDAuMCArIHRpbWVUZW1wLnR2X3NlYzsKLQotICAgIHdoaWxlIChnQXBwQWxpdmUpCi0gICAgewotICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lTm93OwotCi0gICAgICAgIGdldHRpbWVvZmRheSgmdGltZU5vdywgTlVMTCk7Ci0gICAgICAgIGFwcFJlbmRlcih0aW1lTm93LnR2X3NlYyAqIDEwMDAgKyB0aW1lTm93LnR2X3VzZWMgLyAxMDAwLAotICAgICAgICAgICAgICAgIHNXaW5kb3dXaWR0aCwgc1dpbmRvd0hlaWdodCk7Ci0gICAgICAgIGNoZWNrR0xFcnJvcnMoKTsKLSAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoc0VnbERpc3BsYXksIHNFZ2xTdXJmYWNlKTsKLSAgICAgICAgY2hlY2tFR0xFcnJvcnMoKTsKLSAgICAgICAgZnJhbWVDb3VudCsrOwotICAgIH0KLQotICAgIGdldHRpbWVvZmRheSgmdGltZVRlbXAsIE5VTEwpOwotCi0gICAgYXBwRGVpbml0KCk7Ci0gICAgZGVpbml0R3JhcGhpY3MoKTsKLQotICAgIHRvdGFsVGltZSA9ICh0aW1lVGVtcC50dl91c2VjLzEwMDAwMDAuMCArIHRpbWVUZW1wLnR2X3NlYykgLSB0b3RhbFRpbWU7Ci0gICAgcHJpbnRmKCJ0b3RhbFRpbWU9JWYgcywgZnJhbWVDb3VudD0lZCwgJS4yZiBmcHNcbiIsCi0gICAgICAgICAgICB0b3RhbFRpbWUsIGZyYW1lQ291bnQsIGZyYW1lQ291bnQvdG90YWxUaW1lKTsKLQotICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGViZDM1Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQotICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KLSAqCi0gKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgotICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCi0gKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCi0gKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCi0gKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCi0gKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCi0gKgotICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKLSAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICRJZDogYXBwLmgsdiAxLjE0IDIwMDUvMDIvMDYgMjE6MTM6NTQgdG9uaWMgRXhwICQKLSAqICRSZXZpc2lvbjogMS4xNCAkCi0gKi8KLQotI2lmbmRlZiBBUFBfSF9JTkNMVURFRAotI2RlZmluZSBBUFBfSF9JTkNMVURFRAotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0jZGVmaW5lIFdJTkRPV19ERUZBVUxUX1dJRFRIICAgIDY0MAotI2RlZmluZSBXSU5ET1dfREVGQVVMVF9IRUlHSFQgICA0ODAKLQotI2RlZmluZSBXSU5ET1dfQlBQICAgICAgICAgICAgICAxNgotCi0KLS8vIFRoZSBzaW1wbGUgZnJhbWV3b3JrIGV4cGVjdHMgdGhlIGFwcGxpY2F0aW9uIGNvZGUgdG8gZGVmaW5lIHRoZXNlIGZ1bmN0aW9ucy4KLWV4dGVybiB2b2lkIGFwcEluaXQoKTsKLWV4dGVybiB2b2lkIGFwcERlaW5pdCgpOwotZXh0ZXJuIHZvaWQgYXBwUmVuZGVyKGxvbmcgdGljaywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotLyogVmFsdWUgaXMgbm9uLXplcm8gd2hlbiBhcHBsaWNhdGlvbiBpcyBhbGl2ZSwgYW5kIDAgd2hlbiBpdCBpcyBjbG9zaW5nLgotICogRGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24gZnJhbWV3b3JrLgotICovCi1leHRlcm4gaW50IGdBcHBBbGl2ZTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLSNlbmRpZiAvLyAhQVBQX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2NhbXMuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2NhbXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxYWNiMy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9jYW1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLwotICoKLSAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6Ci0gKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKLSAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKLSAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KLSAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KLSAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KLSAqCi0gKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcwotICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogJElkOiBjYW1zLmgsdiAxLjcgMjAwNS8wMS8zMSAyMjoxNToxNSB0b25pYyBFeHAgJAotICogJFJldmlzaW9uOiAxLjcgJAotICovCi0KLSNpZm5kZWYgQ0FNU19IX0lOQ0xVREVECi0jZGVmaW5lIENBTVNfSF9JTkNMVURFRAotCi0KLS8qIExlbmd0aCBpbiBtaWxsaXNlY29uZHMgb2Ygb25lIGNhbWVyYSB0cmFjayBiYXNlIHVuaXQuCi0gKiBUaGUgdmFsdWUgb3JpZ2luYXRlcyBmcm9tIHRoZSBtdXNpYyBzeW5jaHJvbml6YXRpb24uCi0gKi8KLSNkZWZpbmUgQ0FNVFJBQ0tfTEVOICAgIDU0NDIKLQotCi0vLyBDYW1lcmEgdHJhY2sgZGVmaW5pdGlvbiBmb3Igb25lIGNhbWVyYSB0cnVja2luZyBzaG90LgotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBGaXZlIHBhcmFtZXRlcnMgb2Ygc3JjWzVdIGFuZCBkZXN0WzVdOgotICAgICAqIGV5ZVgsIGV5ZVksIGV5ZVosIHZpZXdBbmdsZSwgdmlld0hlaWdodE9mZnMKLSAgICAgKi8KLSAgICBzaG9ydCBzcmNbNV0sIGRlc3RbNV07Ci0gICAgdW5zaWduZWQgY2hhciBkaXN0OyAgICAgLy8gaWYgPjAsIGNhbSByb3RhdGVzIGFyb3VuZCBleWUgeHkgb24gZGlzdCAqIDAuMQotICAgIHVuc2lnbmVkIGNoYXIgbGVuOyAgICAgIC8vIGxlbmd0aCBtdWx0aXBsaWVyCi19IENBTVRSQUNLOwotCi1zdGF0aWMgQ0FNVFJBQ0sgc0NhbVRyYWNrc1tdID0KLXsKLSAgICB7IHsgNDUwMCwgMjcwMCwgMTAwLCA3MCwgLTMwIH0sIHsgNTAsIDUwLCAtOTAsIC0xMDAsIDAgfSwgMjAsIDEgfSwKLSAgICB7IHsgLTE0NDgsIDQyOTQsIDI1LCAzNjMsIDAgfSwgeyAtMTM2LCAyMDIsIDEyNSwgLTk4LCAxMDAgfSwgMCwgMSB9LAotICAgIHsgeyAxNDM3LCA0OTMwLCAyMDAsIC0yNzUsIC0yMCB9LCB7IDE2ODQsIDAsIDAsIDksIDAgfSwgMCwgMSB9LAotICAgIHsgeyAxODAwLCAzNjA5LCAyMDAsIDAsIDY3NSB9LCB7IDAsIDAsIDAsIDMwMCwgMCB9LCAwLCAxIH0sCi0gICAgeyB7IDkyMywgOTk2LCA1MCwgMjMzNiwgLTgwIH0sIHsgMCwgLTIwLCAtNTAsIDAsIDE3MCB9LCAwLCAxIH0sCi0gICAgeyB7IC0xNjYzLCAtNDMsIDYwMCwgMjE3MCwgMCB9LCB7IDIwLCAwLCAtNjAwLCAwLCAxMDAgfSwgMCwgMSB9LAotICAgIHsgeyAxMDQ5LCAtMTQyMCwgMTc1LCAyMTExLCAtMTcgfSwgeyAwLCAwLCAwLCAtMzM0LCAwIH0sIDAsIDIgfSwKLSAgICB7IHsgMCwgMCwgNTAsIDMwMCwgMjUgfSwgeyAwLCAwLCAwLCAzMDAsIDAgfSwgNzAsIDIgfSwKLSAgICB7IHsgLTQ3MywgLTk1MywgMzUwMCwgLTM1MywgLTM1MCB9LCB7IDAsIDAsIC0yODAwLCAwLCAwIH0sIDAsIDIgfSwKLSAgICB7IHsgMTkxLCAxOTM4LCAzNSwgMTEzOSwgLTE3IH0sIHsgMTIwNSwgLTI5MDksIDAsIDAsIDAgfSwgMCwgMiB9LAotICAgIHsgeyAtMTQ0OSwgLTI3MDAsIDE1MCwgMCwgMCB9LCB7IDAsIDIwMDAsIDAsIDAsIDAgfSwgMCwgMiB9LAotICAgIHsgeyA1MjczLCA0OTkyLCA2NTAsIDM3MywgLTUwIH0sIHsgLTQ1OTgsIC0zMDcyLCAwLCAwLCAwIH0sIDAsIDIgfSwKLSAgICB7IHsgMzIyMywgLTMyODIsIDEwNzUsIC0zOTMsIC0yNSB9LCB7IDE2NDksIC0xNjQ5LCAwLCAwLCAwIH0sIDAsIDIgfQotfTsKLSNkZWZpbmUgQ0FNVFJBQ0tfQ09VTlQgKHNpemVvZihjYW1UcmFja3MpIC8gc2l6ZW9mKGNhbVRyYWNrc1swXSkpCi0KLQotI2VuZGlmIC8vICFDQU1TX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2RlbW8uYyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2RlbW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyZjM5OC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTIgKzAsMCBAQAotLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQotICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KLSAqCi0gKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgotICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCi0gKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCi0gKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCi0gKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCi0gKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCi0gKgotICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKLSAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICRJZDogZGVtby5jLHYgMS4xMCAyMDA1LzAyLzA4IDIwOjU0OjM5IHRvbmljIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMTAgJAotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLQotI2luY2x1ZGUgImFwcC5oIgotI2luY2x1ZGUgInNoYXBlcy5oIgotI2luY2x1ZGUgImNhbXMuaCIKLQotCi0vLyBUb3RhbCBydW4gbGVuZ3RoIGlzIDIwICogY2FtZXJhIHRyYWNrIGJhc2UgdW5pdCBsZW5ndGggKHNlZSBjYW1zLmgpLgotI2RlZmluZSBSVU5fTEVOR1RIICAoMjAgKiBDQU1UUkFDS19MRU4pCi0jdW5kZWYgUEkKLSNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OTMyZgotI2RlZmluZSBSQU5ET01fVUlOVF9NQVggNjU1MzUKLQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzUmFuZG9tU2VlZCA9IDA7Ci0KLXN0YXRpYyB2b2lkIHNlZWRSYW5kb20odW5zaWduZWQgbG9uZyBzZWVkKQotewotICAgIHNSYW5kb21TZWVkID0gc2VlZDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZG9tVUludCgpCi17Ci0gICAgc1JhbmRvbVNlZWQgPSBzUmFuZG9tU2VlZCAqIDB4MzQzZmQgKyAweDI2OWVjMzsKLSAgICByZXR1cm4gc1JhbmRvbVNlZWQgPj4gMTY7Ci19Ci0KLQotLy8gQ2FwcGVkIGNvbnZlcnNpb24gZnJvbSBmbG9hdCB0byBmaXhlZC4KLXN0YXRpYyBsb25nIGZsb2F0VG9GaXhlZChmbG9hdCB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUgPCAtMzI3NjgpIHZhbHVlID0gLTMyNzY4OwotICAgIGlmICh2YWx1ZSA+IDMyNzY3KSB2YWx1ZSA9IDMyNzY3OwotICAgIHJldHVybiAobG9uZykodmFsdWUgKiA2NTUzNik7Ci19Ci0KLSNkZWZpbmUgRklYRUQodmFsdWUpIGZsb2F0VG9GaXhlZCh2YWx1ZSkKLQotCi0vLyBEZWZpbml0aW9uIG9mIG9uZSBHTCBvYmplY3QgaW4gdGhpcyBkZW1vLgotdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qIFZlcnRleCBhcnJheSBhbmQgY29sb3IgYXJyYXkgYXJlIGVuYWJsZWQgZm9yIGFsbCBvYmplY3RzLCBzbyB0aGVpcgotICAgICAqIHBvaW50ZXJzIG11c3QgYWx3YXlzIGJlIHZhbGlkIGFuZCBub24tTlVMTC4gTm9ybWFsIGFycmF5IGlzIG5vdAotICAgICAqIHVzZWQgYnkgdGhlIGdyb3VuZCBwbGFuZSwgc28gd2hlbiBpdHMgcG9pbnRlciBpcyBOVUxMIHRoZW4gbm9ybWFsCi0gICAgICogYXJyYXkgdXNhZ2UgaXMgZGlzYWJsZWQuCi0gICAgICoKLSAgICAgKiBWZXJ0ZXggYXJyYXkgaXMgc3VwcG9zZWQgdG8gdXNlIEdMX0ZJWEVEIGRhdGF0eXBlIGFuZCBzdHJpZGUgMAotICAgICAqIChpLmUuIHRpZ2h0bHkgcGFja2VkIGFycmF5KS4gQ29sb3IgYXJyYXkgaXMgc3VwcG9zZWQgdG8gaGF2ZSA0Ci0gICAgICogY29tcG9uZW50cyBwZXIgY29sb3Igd2l0aCBHTF9VTlNJR05FRF9CWVRFIGRhdGF0eXBlIGFuZCBzdHJpZGUgMC4KLSAgICAgKiBOb3JtYWwgYXJyYXkgaXMgc3VwcG9zZWQgdG8gdXNlIEdMX0ZJWEVEIGRhdGF0eXBlIGFuZCBzdHJpZGUgMC4KLSAgICAgKi8KLSAgICBHTGZpeGVkICp2ZXJ0ZXhBcnJheTsKLSAgICBHTHVieXRlICpjb2xvckFycmF5OwotICAgIEdMZml4ZWQgKm5vcm1hbEFycmF5OwotICAgIEdMaW50IHZlcnRleENvbXBvbmVudHM7Ci0gICAgR0xzaXplaSBjb3VudDsKLX0gR0xPQkpFQ1Q7Ci0KLQotc3RhdGljIGxvbmcgc1N0YXJ0VGljayA9IDA7Ci1zdGF0aWMgbG9uZyBzVGljayA9IDA7Ci0KLXN0YXRpYyBpbnQgc0N1cnJlbnRDYW1UcmFjayA9IDA7Ci1zdGF0aWMgbG9uZyBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrID0gMDsKLXN0YXRpYyBsb25nIHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgPSAweDdmZmZmZmZmOwotCi1zdGF0aWMgR0xPQkpFQ1QgKnNTdXBlclNoYXBlT2JqZWN0c1tTVVBFUlNIQVBFX0NPVU5UXSA9IHsgTlVMTCB9Owotc3RhdGljIEdMT0JKRUNUICpzR3JvdW5kUGxhbmUgPSBOVUxMOwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBmbG9hdCB4LCB5LCB6OwotfSBWRUNUT1IzOwotCi0KLXN0YXRpYyB2b2lkIGZyZWVHTE9iamVjdChHTE9CSkVDVCAqb2JqZWN0KQotewotICAgIGlmIChvYmplY3QgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOwotICAgIGZyZWUob2JqZWN0LT5ub3JtYWxBcnJheSk7Ci0gICAgZnJlZShvYmplY3QtPmNvbG9yQXJyYXkpOwotICAgIGZyZWUob2JqZWN0LT52ZXJ0ZXhBcnJheSk7Ci0gICAgZnJlZShvYmplY3QpOwotfQotCi0KLXN0YXRpYyBHTE9CSkVDVCAqIG5ld0dMT2JqZWN0KGxvbmcgdmVydGljZXMsIGludCB2ZXJ0ZXhDb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZU5vcm1hbEFycmF5KQotewotICAgIEdMT0JKRUNUICpyZXN1bHQ7Ci0gICAgcmVzdWx0ID0gKEdMT0JKRUNUICopbWFsbG9jKHNpemVvZihHTE9CSkVDVCkpOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0LT5jb3VudCA9IHZlcnRpY2VzOwotICAgIHJlc3VsdC0+dmVydGV4Q29tcG9uZW50cyA9IHZlcnRleENvbXBvbmVudHM7Ci0gICAgcmVzdWx0LT52ZXJ0ZXhBcnJheSA9IChHTGZpeGVkICopbWFsbG9jKHZlcnRpY2VzICogdmVydGV4Q29tcG9uZW50cyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHTGZpeGVkKSk7Ci0gICAgcmVzdWx0LT5jb2xvckFycmF5ID0gKEdMdWJ5dGUgKiltYWxsb2ModmVydGljZXMgKiA0ICogc2l6ZW9mKEdMdWJ5dGUpKTsKLSAgICBpZiAodXNlTm9ybWFsQXJyYXkpCi0gICAgewotICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5ID0gKEdMZml4ZWQgKiltYWxsb2ModmVydGljZXMgKiAzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHTGZpeGVkKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheSA9IE5VTEw7Ci0gICAgaWYgKHJlc3VsdC0+dmVydGV4QXJyYXkgPT0gTlVMTCB8fAotICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXkgPT0gTlVMTCB8fAotICAgICAgICAodXNlTm9ybWFsQXJyYXkgJiYgcmVzdWx0LT5ub3JtYWxBcnJheSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAgIGZyZWVHTE9iamVjdChyZXN1bHQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgdm9pZCBkcmF3R0xPYmplY3QoR0xPQkpFQ1QgKm9iamVjdCkKLXsKLSAgICBhc3NlcnQob2JqZWN0ICE9IE5VTEwpOwotCi0gICAgZ2xWZXJ0ZXhQb2ludGVyKG9iamVjdC0+dmVydGV4Q29tcG9uZW50cywgR0xfRklYRUQsCi0gICAgICAgICAgICAgICAgICAgIDAsIG9iamVjdC0+dmVydGV4QXJyYXkpOwotICAgIGdsQ29sb3JQb2ludGVyKDQsIEdMX1VOU0lHTkVEX0JZVEUsIDAsIG9iamVjdC0+Y29sb3JBcnJheSk7Ci0KLSAgICAvLyBBbHJlYWR5IGRvbmUgaW4gaW5pdGlhbGl6YXRpb246Ci0gICAgLy9nbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7Ci0gICAgLy9nbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLQotICAgIGlmIChvYmplY3QtPm5vcm1hbEFycmF5KQotICAgIHsKLSAgICAgICAgZ2xOb3JtYWxQb2ludGVyKEdMX0ZJWEVELCAwLCBvYmplY3QtPm5vcm1hbEFycmF5KTsKLSAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7Ci0gICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwgb2JqZWN0LT5jb3VudCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgdmVjdG9yM1N1YihWRUNUT1IzICpkZXN0LCBWRUNUT1IzICp2MSwgVkVDVE9SMyAqdjIpCi17Ci0gICAgZGVzdC0+eCA9IHYxLT54IC0gdjItPng7Ci0gICAgZGVzdC0+eSA9IHYxLT55IC0gdjItPnk7Ci0gICAgZGVzdC0+eiA9IHYxLT56IC0gdjItPno7Ci19Ci0KLQotc3RhdGljIHZvaWQgc3VwZXJTaGFwZU1hcChWRUNUT1IzICpwb2ludCwgZmxvYXQgcjEsIGZsb2F0IHIyLCBmbG9hdCB0LCBmbG9hdCBwKQotewotICAgIC8vIHNwaGVyZS1tYXBwaW5nIG9mIHN1cGVyc2hhcGUgcGFyYW1ldGVycwotICAgIHBvaW50LT54ID0gKGZsb2F0KShjb3ModCkgKiBjb3MocCkgLyByMSAvIHIyKTsKLSAgICBwb2ludC0+eSA9IChmbG9hdCkoc2luKHQpICogY29zKHApIC8gcjEgLyByMik7Ci0gICAgcG9pbnQtPnogPSAoZmxvYXQpKHNpbihwKSAvIHIyKTsKLX0KLQotCi1zdGF0aWMgZmxvYXQgc3NGdW5jKGNvbnN0IGZsb2F0IHQsIGNvbnN0IGZsb2F0ICpwKQotewotICAgIHJldHVybiAoZmxvYXQpKHBvdyhwb3coZmFicyhjb3MocFswXSAqIHQgLyA0KSkgLyBwWzFdLCBwWzRdKSArCi0gICAgICAgICAgICAgICAgICAgICAgIHBvdyhmYWJzKHNpbihwWzBdICogdCAvIDQpKSAvIHBbMl0sIHBbNV0pLCAxIC8gcFszXSkpOwotfQotCi0KLS8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBzdXBlcnNoYXBlIG9iamVjdC4KLS8vIEJhc2VkIG9uIFBhdWwgQm91cmtlJ3MgUE9WLVJheSBpbXBsZW1lbnRhdGlvbi4KLS8vIGh0dHA6Ly9hc3Ryb25vbXkuc3dpbi5lZHUuYXUvfnBib3Vya2UvcG92cmF5L3N1cGVyc2hhcGUvCi1zdGF0aWMgR0xPQkpFQ1QgKiBjcmVhdGVTdXBlclNoYXBlKGNvbnN0IGZsb2F0ICpwYXJhbXMpCi17Ci0gICAgY29uc3QgaW50IHJlc29sMSA9IChpbnQpcGFyYW1zW1NVUEVSU0hBUEVfUEFSQU1TIC0gM107Ci0gICAgY29uc3QgaW50IHJlc29sMiA9IChpbnQpcGFyYW1zW1NVUEVSU0hBUEVfUEFSQU1TIC0gMl07Ci0gICAgLy8gbGF0aXR1ZGUgMCB0byBwaS8yIGZvciBubyBtaXJyb3JlZCBib3R0b20KLSAgICAvLyAobGF0aXR1ZGVCZWdpbj09MCBmb3IgLXBpLzIgdG8gcGkvMiBvcmlnaW5hbGx5KQotICAgIGNvbnN0IGludCBsYXRpdHVkZUJlZ2luID0gcmVzb2wyIC8gNDsKLSAgICBjb25zdCBpbnQgbGF0aXR1ZGVFbmQgPSByZXNvbDIgLyAyOyAgICAvLyBub24taW5jbHVzaXZlCi0gICAgY29uc3QgaW50IGxvbmdpdHVkZUNvdW50ID0gcmVzb2wxOwotICAgIGNvbnN0IGludCBsYXRpdHVkZUNvdW50ID0gbGF0aXR1ZGVFbmQgLSBsYXRpdHVkZUJlZ2luOwotICAgIGNvbnN0IGxvbmcgdHJpYW5nbGVDb3VudCA9IGxvbmdpdHVkZUNvdW50ICogbGF0aXR1ZGVDb3VudCAqIDI7Ci0gICAgY29uc3QgbG9uZyB2ZXJ0aWNlcyA9IHRyaWFuZ2xlQ291bnQgKiAzOwotICAgIEdMT0JKRUNUICpyZXN1bHQ7Ci0gICAgZmxvYXQgYmFzZUNvbG9yWzNdOwotICAgIGludCBhLCBsb25naXR1ZGUsIGxhdGl0dWRlOwotICAgIGxvbmcgY3VycmVudFZlcnRleCwgY3VycmVudFF1YWQ7Ci0KLSAgICByZXN1bHQgPSBuZXdHTE9iamVjdCh2ZXJ0aWNlcywgMywgMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGZvciAoYSA9IDA7IGEgPCAzOyArK2EpCi0gICAgICAgIGJhc2VDb2xvclthXSA9ICgocmFuZG9tVUludCgpICUgMTU1KSArIDEwMCkgLyAyNTUuZjsKLQotICAgIGN1cnJlbnRRdWFkID0gMDsKLSAgICBjdXJyZW50VmVydGV4ID0gMDsKLQotICAgIC8vIGxvbmdpdHVkZSAtcGkgdG8gcGkKLSAgICBmb3IgKGxvbmdpdHVkZSA9IDA7IGxvbmdpdHVkZSA8IGxvbmdpdHVkZUNvdW50OyArK2xvbmdpdHVkZSkKLSAgICB7Ci0KLSAgICAgICAgLy8gbGF0aXR1ZGUgMCB0byBwaS8yCi0gICAgICAgIGZvciAobGF0aXR1ZGUgPSBsYXRpdHVkZUJlZ2luOyBsYXRpdHVkZSA8IGxhdGl0dWRlRW5kOyArK2xhdGl0dWRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmbG9hdCB0MSA9IC1QSSArIGxvbmdpdHVkZSAqIDIgKiBQSSAvIHJlc29sMTsKLSAgICAgICAgICAgIGZsb2F0IHQyID0gLVBJICsgKGxvbmdpdHVkZSArIDEpICogMiAqIFBJIC8gcmVzb2wxOwotICAgICAgICAgICAgZmxvYXQgcDEgPSAtUEkgLyAyICsgbGF0aXR1ZGUgKiAyICogUEkgLyByZXNvbDI7Ci0gICAgICAgICAgICBmbG9hdCBwMiA9IC1QSSAvIDIgKyAobGF0aXR1ZGUgKyAxKSAqIDIgKiBQSSAvIHJlc29sMjsKLSAgICAgICAgICAgIGZsb2F0IHIwLCByMSwgcjIsIHIzOwotCi0gICAgICAgICAgICByMCA9IHNzRnVuYyh0MSwgcGFyYW1zKTsKLSAgICAgICAgICAgIHIxID0gc3NGdW5jKHAxLCAmcGFyYW1zWzZdKTsKLSAgICAgICAgICAgIHIyID0gc3NGdW5jKHQyLCBwYXJhbXMpOwotICAgICAgICAgICAgcjMgPSBzc0Z1bmMocDIsICZwYXJhbXNbNl0pOwotCi0gICAgICAgICAgICBpZiAocjAgIT0gMCAmJiByMSAhPSAwICYmIHIyICE9IDAgJiYgcjMgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWRUNUT1IzIHBhLCBwYiwgcGMsIHBkOwotICAgICAgICAgICAgICAgIFZFQ1RPUjMgdjEsIHYyLCBuOwotICAgICAgICAgICAgICAgIGZsb2F0IGNhOwotICAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgIC8vZmxvYXQgbGVuU3EsIGludkxlblNxOwotCi0gICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGEsIHIwLCByMSwgdDEsIHAxKTsKLSAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwYiwgcjIsIHIxLCB0MiwgcDEpOwotICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBjLCByMiwgcjMsIHQyLCBwMik7Ci0gICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGQsIHIwLCByMywgdDEsIHAyKTsKLQotICAgICAgICAgICAgICAgIC8vIGtsdWRnZSB0byBzZXQgbG93ZXIgZWRnZSBvZiB0aGUgb2JqZWN0IHRvIGZpeGVkIGxldmVsCi0gICAgICAgICAgICAgICAgaWYgKGxhdGl0dWRlID09IGxhdGl0dWRlQmVnaW4gKyAxKQotICAgICAgICAgICAgICAgICAgICBwYS56ID0gcGIueiA9IDA7Ci0KLSAgICAgICAgICAgICAgICB2ZWN0b3IzU3ViKCZ2MSwgJnBiLCAmcGEpOwotICAgICAgICAgICAgICAgIHZlY3RvcjNTdWIoJnYyLCAmcGQsICZwYSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgbm9ybWFsIHdpdGggY3Jvc3MgcHJvZHVjdC4KLSAgICAgICAgICAgICAgICAvKiAgIGkgICAgaiAgICBrICAgICAgaSAgICBqCi0gICAgICAgICAgICAgICAgICogdjEueCB2MS55IHYxLnogfCB2MS54IHYxLnkKLSAgICAgICAgICAgICAgICAgKiB2Mi54IHYyLnkgdjIueiB8IHYyLnggdjIueQotICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgbi54ID0gdjEueSAqIHYyLnogLSB2MS56ICogdjIueTsKLSAgICAgICAgICAgICAgICBuLnkgPSB2MS56ICogdjIueCAtIHYxLnggKiB2Mi56OwotICAgICAgICAgICAgICAgIG4ueiA9IHYxLnggKiB2Mi55IC0gdjEueSAqIHYyLng7Ci0KLSAgICAgICAgICAgICAgICAvKiBQcmUtbm9ybWFsaXphdGlvbiBvZiB0aGUgbm9ybWFscyBpcyBkaXNhYmxlZCBoZXJlIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgKiB0aGV5IHdpbGwgYmUgbm9ybWFsaXplZCBhbnl3YXkgbGF0ZXIgZHVlIHRvIGF1dG9tYXRpYwotICAgICAgICAgICAgICAgICAqIG5vcm1hbGl6YXRpb24gKEdMX05PUk1BTElaRSkuIEl0IGlzIGVuYWJsZWQgYmVjYXVzZSB0aGUKLSAgICAgICAgICAgICAgICAgKiBvYmplY3RzIGFyZSBzY2FsZWQgd2l0aCBnbFNjYWxlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgbGVuU3EgPSBuLnggKiBuLnggKyBuLnkgKiBuLnkgKyBuLnogKiBuLno7Ci0gICAgICAgICAgICAgICAgaW52TGVuU3EgPSAoZmxvYXQpKDEgLyBzcXJ0KGxlblNxKSk7Ci0gICAgICAgICAgICAgICAgbi54ICo9IGludkxlblNxOwotICAgICAgICAgICAgICAgIG4ueSAqPSBpbnZMZW5TcTsKLSAgICAgICAgICAgICAgICBuLnogKj0gaW52TGVuU3E7Ci0gICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgIGNhID0gcGEueiArIDAuNWY7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBjdXJyZW50VmVydGV4ICogMzsKLSAgICAgICAgICAgICAgICAgICAgIGkgPCAoY3VycmVudFZlcnRleCArIDYpICogMzsKLSAgICAgICAgICAgICAgICAgICAgIGkgKz0gMykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXlbaV0gPSBGSVhFRChuLngpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2kgKyAxXSA9IEZJWEVEKG4ueSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXlbaSArIDJdID0gRklYRUQobi56KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDQ7Ci0gICAgICAgICAgICAgICAgICAgICBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDQ7Ci0gICAgICAgICAgICAgICAgICAgICBpICs9IDQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgYSwgY29sb3JbM107Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCAzOyArK2EpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yW2FdID0gKGludCkoY2EgKiBiYXNlQ29sb3JbYV0gKiAyNTUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yW2FdID4gMjU1KSBjb2xvclthXSA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaV0gPSAoR0x1Ynl0ZSljb2xvclswXTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAxXSA9IChHTHVieXRlKWNvbG9yWzFdOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDJdID0gKEdMdWJ5dGUpY29sb3JbMl07Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgM10gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBhLngpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBhLnkpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBhLnopOwotICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBiLngpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBiLnkpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBiLnopOwotICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBkLngpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBkLnkpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBkLnopOwotICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBiLngpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBiLnkpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBiLnopOwotICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBjLngpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBjLnkpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBjLnopOwotICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBkLngpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBkLnkpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBkLnopOwotICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKLSAgICAgICAgICAgIH0gLy8gcjAgJiYgcjEgJiYgcjIgJiYgcjMKLSAgICAgICAgICAgICsrY3VycmVudFF1YWQ7Ci0gICAgICAgIH0gLy8gbGF0aXR1ZGUKLSAgICB9IC8vIGxvbmdpdHVkZQotCi0gICAgLy8gU2V0IG51bWJlciBvZiB2ZXJ0aWNlcyBpbiBvYmplY3QgdG8gdGhlIGFjdHVhbCBhbW91bnQgY3JlYXRlZC4KLSAgICByZXN1bHQtPmNvdW50ID0gY3VycmVudFZlcnRleDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIEdMT0JKRUNUICogY3JlYXRlR3JvdW5kUGxhbmUoKQotewotICAgIGNvbnN0IGludCBzY2FsZSA9IDQ7Ci0gICAgY29uc3QgaW50IHlCZWdpbiA9IC0xNSwgeUVuZCA9IDE1OyAgICAvLyBlbmRzIGFyZSBub24taW5jbHVzaXZlCi0gICAgY29uc3QgaW50IHhCZWdpbiA9IC0xNSwgeEVuZCA9IDE1OwotICAgIGNvbnN0IGxvbmcgdHJpYW5nbGVDb3VudCA9ICh5RW5kIC0geUJlZ2luKSAqICh4RW5kIC0geEJlZ2luKSAqIDI7Ci0gICAgY29uc3QgbG9uZyB2ZXJ0aWNlcyA9IHRyaWFuZ2xlQ291bnQgKiAzOwotICAgIEdMT0JKRUNUICpyZXN1bHQ7Ci0gICAgaW50IHgsIHk7Ci0gICAgbG9uZyBjdXJyZW50VmVydGV4LCBjdXJyZW50UXVhZDsKLQotICAgIHJlc3VsdCA9IG5ld0dMT2JqZWN0KHZlcnRpY2VzLCAyLCAwKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY3VycmVudFF1YWQgPSAwOwotICAgIGN1cnJlbnRWZXJ0ZXggPSAwOwotCi0gICAgZm9yICh5ID0geUJlZ2luOyB5IDwgeUVuZDsgKyt5KQotICAgIHsKLSAgICAgICAgZm9yICh4ID0geEJlZ2luOyB4IDwgeEVuZDsgKyt4KQotICAgICAgICB7Ci0gICAgICAgICAgICBHTHVieXRlIGNvbG9yOwotICAgICAgICAgICAgaW50IGksIGE7Ci0gICAgICAgICAgICBjb2xvciA9IChHTHVieXRlKSgocmFuZG9tVUludCgpICYgMHg1ZikgKyA4MSk7ICAvLyAxMDEgMTExMQotICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDQ7IGkgPCAoY3VycmVudFZlcnRleCArIDYpICogNDsgaSArPSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpXSA9IGNvbG9yOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMV0gPSBjb2xvcjsKLSAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDJdID0gY29sb3I7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAzXSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEF4aXMgYml0cyBmb3IgcXVhZCB0cmlhbmdsZXM6Ci0gICAgICAgICAgICAvLyB4OiAwMTExMDAgKDB4MWMpLCB5OiAxMTAwMDEgKDB4MzEpICAoY2xvY2t3aXNlKQotICAgICAgICAgICAgLy8geDogMDAxMTEwICgweDBlKSwgeTogMTAwMDExICgweDIzKSAgKGNvdW50ZXItY2xvY2t3aXNlKQotICAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IDY7ICsrYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgeG0gPSB4ICsgKCgweDFjID4+IGEpICYgMSk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IHltID0geSArICgoMHgzMSA+PiBhKSAmIDEpOwotICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IG0gPSAoZmxvYXQpKGNvcyh4bSAqIDIpICogc2luKHltICogNCkgKiAwLjc1Zik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMl0gPQotICAgICAgICAgICAgICAgICAgICBGSVhFRCh4bSAqIHNjYWxlICsgbSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMiArIDFdID0KLSAgICAgICAgICAgICAgICAgICAgRklYRUQoeW0gKiBzY2FsZSArIG0pOwotICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrY3VycmVudFF1YWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgdm9pZCBkcmF3R3JvdW5kUGxhbmUoKQotewotICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOwotICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgZ2xCbGVuZEZ1bmMoR0xfWkVSTywgR0xfU1JDX0NPTE9SKTsKLSAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOwotCi0gICAgZHJhd0dMT2JqZWN0KHNHcm91bmRQbGFuZSk7Ci0KLSAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7Ci0gICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkcmF3RmFkZVF1YWQoKQotewotICAgIHN0YXRpYyBjb25zdCBHTGZpeGVkIHF1YWRWZXJ0aWNlc1tdID0gewotICAgICAgICAtMHgxMDAwMCwgLTB4MTAwMDAsCi0gICAgICAgICAweDEwMDAwLCAtMHgxMDAwMCwKLSAgICAgICAgLTB4MTAwMDAsICAweDEwMDAwLAotICAgICAgICAgMHgxMDAwMCwgLTB4MTAwMDAsCi0gICAgICAgICAweDEwMDAwLCAgMHgxMDAwMCwKLSAgICAgICAgLTB4MTAwMDAsICAweDEwMDAwCi0gICAgfTsKLQotICAgIGNvbnN0IGludCBiZWdpbkZhZGUgPSBzVGljayAtIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2s7Ci0gICAgY29uc3QgaW50IGVuZEZhZGUgPSBzTmV4dENhbVRyYWNrU3RhcnRUaWNrIC0gc1RpY2s7Ci0gICAgY29uc3QgaW50IG1pbkZhZGUgPSBiZWdpbkZhZGUgPCBlbmRGYWRlID8gYmVnaW5GYWRlIDogZW5kRmFkZTsKLQotICAgIGlmIChtaW5GYWRlIDwgMTAyNCkKLSAgICB7Ci0gICAgICAgIGNvbnN0IEdMZml4ZWQgZmFkZUNvbG9yID0gbWluRmFkZSA8PCA2OwotICAgICAgICBnbENvbG9yNHgoZmFkZUNvbG9yLCBmYWRlQ29sb3IsIGZhZGVDb2xvciwgMCk7Ci0KLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdMX1NSQ19DT0xPUik7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7Ci0KLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0gICAgICAgIGdsTG9hZElkZW50aXR5KCk7Ci0KLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotICAgICAgICBnbExvYWRJZGVudGl0eSgpOwotCi0gICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLSAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKLSAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX0ZJWEVELCAwLCBxdWFkVmVydGljZXMpOwotICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCA2KTsKLQotICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLQotICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLQotICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgIH0KLX0KLQotCi0vLyBDYWxsZWQgZnJvbSB0aGUgYXBwIGZyYW1ld29yay4KLXZvaWQgYXBwSW5pdCgpCi17Ci0gICAgaW50IGE7Ci0KLSAgICBnbEVuYWJsZShHTF9OT1JNQUxJWkUpOwotICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOwotICAgIGdsU2hhZGVNb2RlbChHTF9GTEFUKTsKLQotICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKLSAgICBnbEVuYWJsZShHTF9MSUdIVDApOwotICAgIGdsRW5hYmxlKEdMX0xJR0hUMSk7Ci0gICAgZ2xFbmFibGUoR0xfTElHSFQyKTsKLQotICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKLSAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLQotICAgIHNlZWRSYW5kb20oMTUpOwotCi0gICAgZm9yIChhID0gMDsgYSA8IFNVUEVSU0hBUEVfQ09VTlQ7ICsrYSkKLSAgICB7Ci0gICAgICAgIHNTdXBlclNoYXBlT2JqZWN0c1thXSA9IGNyZWF0ZVN1cGVyU2hhcGUoc1N1cGVyU2hhcGVQYXJhbXNbYV0pOwotICAgICAgICBhc3NlcnQoc1N1cGVyU2hhcGVPYmplY3RzW2FdICE9IE5VTEwpOwotICAgIH0KLSAgICBzR3JvdW5kUGxhbmUgPSBjcmVhdGVHcm91bmRQbGFuZSgpOwotICAgIGFzc2VydChzR3JvdW5kUGxhbmUgIT0gTlVMTCk7Ci19Ci0KLQotLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCi12b2lkIGFwcERlaW5pdCgpCi17Ci0gICAgaW50IGE7Ci0gICAgZm9yIChhID0gMDsgYSA8IFNVUEVSU0hBUEVfQ09VTlQ7ICsrYSkKLSAgICAgICAgZnJlZUdMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1thXSk7Ci0gICAgZnJlZUdMT2JqZWN0KHNHcm91bmRQbGFuZSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgZ2x1UGVyc3BlY3RpdmUoR0xmbG9hdCBmb3Z5LCBHTGZsb2F0IGFzcGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKLXsKLSAgICBHTGZsb2F0IHhtaW4sIHhtYXgsIHltaW4sIHltYXg7Ci0KLSAgICB5bWF4ID0gek5lYXIgKiAoR0xmbG9hdCl0YW4oZm92eSAqIFBJIC8gMzYwKTsKLSAgICB5bWluID0gLXltYXg7Ci0gICAgeG1pbiA9IHltaW4gKiBhc3BlY3Q7Ci0gICAgeG1heCA9IHltYXggKiBhc3BlY3Q7Ci0KLSAgICBnbEZydXN0dW14KChHTGZpeGVkKSh4bWluICogNjU1MzYpLCAoR0xmaXhlZCkoeG1heCAqIDY1NTM2KSwKLSAgICAgICAgICAgICAgIChHTGZpeGVkKSh5bWluICogNjU1MzYpLCAoR0xmaXhlZCkoeW1heCAqIDY1NTM2KSwKLSAgICAgICAgICAgICAgIChHTGZpeGVkKSh6TmVhciAqIDY1NTM2KSwgKEdMZml4ZWQpKHpGYXIgKiA2NTUzNikpOwotfQotCi0KLXN0YXRpYyB2b2lkIHByZXBhcmVGcmFtZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0gICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQotICAgIGdsQ2xlYXJDb2xvcngoKEdMZml4ZWQpKDAuMWYgKiA2NTUzNiksCi0gICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoMC4yZiAqIDY1NTM2KSwKLSAgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgwLjNmICogNjU1MzYpLCAweDEwMDAwKTsKLSAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKLSAgICBnbExvYWRJZGVudGl0eSgpOwotICAgIGdsdVBlcnNwZWN0aXZlKDQ1LCAoZmxvYXQpd2lkdGggLyBoZWlnaHQsIDAuNWYsIDE1MCk7Ci0KLSAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLQotICAgIGdsTG9hZElkZW50aXR5KCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgY29uZmlndXJlTGlnaHRBbmRNYXRlcmlhbCgpCi17Ci0gICAgc3RhdGljIEdMZml4ZWQgbGlnaHQwUG9zaXRpb25bXSA9IHsgLTB4NDAwMDAsIDB4MTAwMDAsIDB4MTAwMDAsIDAgfTsKLSAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDBEaWZmdXNlW10gPSB7IDB4MTAwMDAsIDB4NjY2NiwgMCwgMHgxMDAwMCB9OwotICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MVBvc2l0aW9uW10gPSB7IDB4MTAwMDAsIC0weDIwMDAwLCAtMHgxMDAwMCwgMCB9OwotICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MURpZmZ1c2VbXSA9IHsgMHgxMWViLCAweDIzZDcsIDB4NTk5OSwgMHgxMDAwMCB9OwotICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MlBvc2l0aW9uW10gPSB7IC0weDEwMDAwLCAwLCAtMHg0MDAwMCwgMCB9OwotICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MkRpZmZ1c2VbXSA9IHsgMHgxMWViLCAweDJiODUsIDB4MjNkNywgMHgxMDAwMCB9OwotICAgIHN0YXRpYyBHTGZpeGVkIG1hdGVyaWFsU3BlY3VsYXJbXSA9IHsgMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCB9OwotCi0gICAgZ2xMaWdodHh2KEdMX0xJR0hUMCwgR0xfUE9TSVRJT04sIGxpZ2h0MFBvc2l0aW9uKTsKLSAgICBnbExpZ2h0eHYoR0xfTElHSFQwLCBHTF9ESUZGVVNFLCBsaWdodDBEaWZmdXNlKTsKLSAgICBnbExpZ2h0eHYoR0xfTElHSFQxLCBHTF9QT1NJVElPTiwgbGlnaHQxUG9zaXRpb24pOwotICAgIGdsTGlnaHR4dihHTF9MSUdIVDEsIEdMX0RJRkZVU0UsIGxpZ2h0MURpZmZ1c2UpOwotICAgIGdsTGlnaHR4dihHTF9MSUdIVDIsIEdMX1BPU0lUSU9OLCBsaWdodDJQb3NpdGlvbik7Ci0gICAgZ2xMaWdodHh2KEdMX0xJR0hUMiwgR0xfRElGRlVTRSwgbGlnaHQyRGlmZnVzZSk7Ci0gICAgZ2xNYXRlcmlhbHh2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgbWF0ZXJpYWxTcGVjdWxhcik7Ci0KLSAgICBnbE1hdGVyaWFseChHTF9GUk9OVF9BTkRfQkFDSywgR0xfU0hJTklORVNTLCA2MCA8PCAxNik7Ci0gICAgZ2xFbmFibGUoR0xfQ09MT1JfTUFURVJJQUwpOwotfQotCi0KLXN0YXRpYyB2b2lkIGRyYXdNb2RlbHMoZmxvYXQgelNjYWxlKQotewotICAgIGNvbnN0IGludCB0cmFuc2xhdGlvblNjYWxlID0gOTsKLSAgICBpbnQgeCwgeTsKLQotICAgIHNlZWRSYW5kb20oOSk7Ci0KLSAgICBnbFNjYWxleCgxIDw8IDE2LCAxIDw8IDE2LCAoR0xmaXhlZCkoelNjYWxlICogNjU1MzYpKTsKLQotICAgIGZvciAoeSA9IC01OyB5IDw9IDU7ICsreSkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IC01OyB4IDw9IDU7ICsreCkKLSAgICAgICAgewotICAgICAgICAgICAgZmxvYXQgYnVpbGRpbmdTY2FsZTsKLSAgICAgICAgICAgIEdMZml4ZWQgZml4ZWRTY2FsZTsKLQotICAgICAgICAgICAgaW50IGN1clNoYXBlID0gcmFuZG9tVUludCgpICUgU1VQRVJTSEFQRV9DT1VOVDsKLSAgICAgICAgICAgIGJ1aWxkaW5nU2NhbGUgPSBzU3VwZXJTaGFwZVBhcmFtc1tjdXJTaGFwZV1bU1VQRVJTSEFQRV9QQVJBTVMgLSAxXTsKLSAgICAgICAgICAgIGZpeGVkU2NhbGUgPSAoR0xmaXhlZCkoYnVpbGRpbmdTY2FsZSAqIDY1NTM2KTsKLQotICAgICAgICAgICAgZ2xQdXNoTWF0cml4KCk7Ci0gICAgICAgICAgICBnbFRyYW5zbGF0ZXgoKHggKiB0cmFuc2xhdGlvblNjYWxlKSAqIDY1NTM2LAotICAgICAgICAgICAgICAgICAgICAgICAgICh5ICogdHJhbnNsYXRpb25TY2FsZSkgKiA2NTUzNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgIGdsUm90YXRleCgoR0xmaXhlZCkoKHJhbmRvbVVJbnQoKSAlIDM2MCkgPDwgMTYpLCAwLCAwLCAxIDw8IDE2KTsKLSAgICAgICAgICAgIGdsU2NhbGV4KGZpeGVkU2NhbGUsIGZpeGVkU2NhbGUsIGZpeGVkU2NhbGUpOwotCi0gICAgICAgICAgICBkcmF3R0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW2N1clNoYXBlXSk7Ci0gICAgICAgICAgICBnbFBvcE1hdHJpeCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICh4ID0gLTI7IHggPD0gMjsgKyt4KQotICAgIHsKLSAgICAgICAgY29uc3QgaW50IHNoaXBTY2FsZTEwMCA9IHRyYW5zbGF0aW9uU2NhbGUgKiA1MDA7Ci0gICAgICAgIGNvbnN0IGludCBvZmZzMTAwID0geCAqIHNoaXBTY2FsZTEwMCArIChzVGljayAlIHNoaXBTY2FsZTEwMCk7Ci0gICAgICAgIGZsb2F0IG9mZnMgPSBvZmZzMTAwICogMC4wMWY7Ci0gICAgICAgIEdMZml4ZWQgZml4ZWRPZmZzID0gKEdMZml4ZWQpKG9mZnMgKiA2NTUzNik7Ci0gICAgICAgIGdsUHVzaE1hdHJpeCgpOwotICAgICAgICBnbFRyYW5zbGF0ZXgoZml4ZWRPZmZzLCAtNCAqIDY1NTM2LCAyIDw8IDE2KTsKLSAgICAgICAgZHJhd0dMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1tTVVBFUlNIQVBFX0NPVU5UIC0gMV0pOwotICAgICAgICBnbFBvcE1hdHJpeCgpOwotICAgICAgICBnbFB1c2hNYXRyaXgoKTsKLSAgICAgICAgZ2xUcmFuc2xhdGV4KC00ICogNjU1MzYsIGZpeGVkT2ZmcywgNCA8PCAxNik7Ci0gICAgICAgIGdsUm90YXRleCg5MCA8PCAxNiwgMCwgMCwgMSA8PCAxNik7Ci0gICAgICAgIGRyYXdHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVCAtIDFdKTsKLSAgICAgICAgZ2xQb3BNYXRyaXgoKTsKLSAgICB9Ci19Ci0KLQotLyogRm9sbG93aW5nIGdsdUxvb2tBdCBpbXBsZW1lbnRhdGlvbiBpcyBhZGFwdGVkIGZyb20gdGhlCi0gKiBNZXNhIDNEIEdyYXBoaWNzIGxpYnJhcnkuIGh0dHA6Ly93d3cubWVzYTNkLm9yZwotICovCi1zdGF0aWMgdm9pZCBnbHVMb29rQXQoR0xmbG9hdCBleWV4LCBHTGZsb2F0IGV5ZXksIEdMZmxvYXQgZXlleiwKLQkgICAgICAgICAgICAgIEdMZmxvYXQgY2VudGVyeCwgR0xmbG9hdCBjZW50ZXJ5LCBHTGZsb2F0IGNlbnRlcnosCi0JICAgICAgICAgICAgICBHTGZsb2F0IHVweCwgR0xmbG9hdCB1cHksIEdMZmxvYXQgdXB6KQotewotICAgIEdMZmxvYXQgbVsxNl07Ci0gICAgR0xmbG9hdCB4WzNdLCB5WzNdLCB6WzNdOwotICAgIEdMZmxvYXQgbWFnOwotCi0gICAgLyogTWFrZSByb3RhdGlvbiBtYXRyaXggKi8KLQotICAgIC8qIFogdmVjdG9yICovCi0gICAgelswXSA9IGV5ZXggLSBjZW50ZXJ4OwotICAgIHpbMV0gPSBleWV5IC0gY2VudGVyeTsKLSAgICB6WzJdID0gZXlleiAtIGNlbnRlcno7Ci0gICAgbWFnID0gKGZsb2F0KXNxcnQoelswXSAqIHpbMF0gKyB6WzFdICogelsxXSArIHpbMl0gKiB6WzJdKTsKLSAgICBpZiAobWFnKSB7CQkJLyogbXBpY2hsZXIsIDE5OTUwNTE1ICovCi0gICAgICAgIHpbMF0gLz0gbWFnOwotICAgICAgICB6WzFdIC89IG1hZzsKLSAgICAgICAgelsyXSAvPSBtYWc7Ci0gICAgfQotCi0gICAgLyogWSB2ZWN0b3IgKi8KLSAgICB5WzBdID0gdXB4OwotICAgIHlbMV0gPSB1cHk7Ci0gICAgeVsyXSA9IHVwejsKLQotICAgIC8qIFggdmVjdG9yID0gWSBjcm9zcyBaICovCi0gICAgeFswXSA9IHlbMV0gKiB6WzJdIC0geVsyXSAqIHpbMV07Ci0gICAgeFsxXSA9IC15WzBdICogelsyXSArIHlbMl0gKiB6WzBdOwotICAgIHhbMl0gPSB5WzBdICogelsxXSAtIHlbMV0gKiB6WzBdOwotCi0gICAgLyogUmVjb21wdXRlIFkgPSBaIGNyb3NzIFggKi8KLSAgICB5WzBdID0gelsxXSAqIHhbMl0gLSB6WzJdICogeFsxXTsKLSAgICB5WzFdID0gLXpbMF0gKiB4WzJdICsgelsyXSAqIHhbMF07Ci0gICAgeVsyXSA9IHpbMF0gKiB4WzFdIC0gelsxXSAqIHhbMF07Ci0KLSAgICAvKiBtcGljaGxlciwgMTk5NTA1MTUgKi8KLSAgICAvKiBjcm9zcyBwcm9kdWN0IGdpdmVzIGFyZWEgb2YgcGFyYWxsZWxvZ3JhbSwgd2hpY2ggaXMgPCAxLjAgZm9yCi0gICAgICogbm9uLXBlcnBlbmRpY3VsYXIgdW5pdC1sZW5ndGggdmVjdG9yczsgc28gbm9ybWFsaXplIHgsIHkgaGVyZQotICAgICAqLwotCi0gICAgbWFnID0gKGZsb2F0KXNxcnQoeFswXSAqIHhbMF0gKyB4WzFdICogeFsxXSArIHhbMl0gKiB4WzJdKTsKLSAgICBpZiAobWFnKSB7Ci0gICAgICAgIHhbMF0gLz0gbWFnOwotICAgICAgICB4WzFdIC89IG1hZzsKLSAgICAgICAgeFsyXSAvPSBtYWc7Ci0gICAgfQotCi0gICAgbWFnID0gKGZsb2F0KXNxcnQoeVswXSAqIHlbMF0gKyB5WzFdICogeVsxXSArIHlbMl0gKiB5WzJdKTsKLSAgICBpZiAobWFnKSB7Ci0gICAgICAgIHlbMF0gLz0gbWFnOwotICAgICAgICB5WzFdIC89IG1hZzsKLSAgICAgICAgeVsyXSAvPSBtYWc7Ci0gICAgfQotCi0jZGVmaW5lIE0ocm93LGNvbCkgIG1bY29sKjQrcm93XQotICAgIE0oMCwgMCkgPSB4WzBdOwotICAgIE0oMCwgMSkgPSB4WzFdOwotICAgIE0oMCwgMikgPSB4WzJdOwotICAgIE0oMCwgMykgPSAwLjA7Ci0gICAgTSgxLCAwKSA9IHlbMF07Ci0gICAgTSgxLCAxKSA9IHlbMV07Ci0gICAgTSgxLCAyKSA9IHlbMl07Ci0gICAgTSgxLCAzKSA9IDAuMDsKLSAgICBNKDIsIDApID0gelswXTsKLSAgICBNKDIsIDEpID0gelsxXTsKLSAgICBNKDIsIDIpID0gelsyXTsKLSAgICBNKDIsIDMpID0gMC4wOwotICAgIE0oMywgMCkgPSAwLjA7Ci0gICAgTSgzLCAxKSA9IDAuMDsKLSAgICBNKDMsIDIpID0gMC4wOwotICAgIE0oMywgMykgPSAxLjA7Ci0jdW5kZWYgTQotICAgIHsKLSAgICAgICAgaW50IGE7Ci0gICAgICAgIEdMZml4ZWQgZml4ZWRNWzE2XTsKLSAgICAgICAgZm9yIChhID0gMDsgYSA8IDE2OyArK2EpCi0gICAgICAgICAgICBmaXhlZE1bYV0gPSAoR0xmaXhlZCkobVthXSAqIDY1NTM2KTsKLSAgICAgICAgZ2xNdWx0TWF0cml4eChmaXhlZE0pOwotICAgIH0KLQotICAgIC8qIFRyYW5zbGF0ZSBFeWUgdG8gT3JpZ2luICovCi0gICAgZ2xUcmFuc2xhdGV4KChHTGZpeGVkKSgtZXlleCAqIDY1NTM2KSwKLSAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKC1leWV5ICogNjU1MzYpLAotICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoLWV5ZXogKiA2NTUzNikpOwotfQotCi0KLXN0YXRpYyB2b2lkIGNhbVRyYWNrKCkKLXsKLSAgICBmbG9hdCBsZXJwWzVdOwotICAgIGZsb2F0IGVYLCBlWSwgZVosIGNYLCBjWSwgY1o7Ci0gICAgZmxvYXQgdHJhY2tQb3M7Ci0gICAgQ0FNVFJBQ0sgKmNhbTsKLSAgICBsb25nIGN1cnJlbnRDYW1UaWNrOwotICAgIGludCBhOwotCi0gICAgaWYgKHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgPD0gc1RpY2spCi0gICAgewotICAgICAgICArK3NDdXJyZW50Q2FtVHJhY2s7Ci0gICAgICAgIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2sgPSBzTmV4dENhbVRyYWNrU3RhcnRUaWNrOwotICAgIH0KLSAgICBzTmV4dENhbVRyYWNrU3RhcnRUaWNrID0gc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljayArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDYW1UcmFja3Nbc0N1cnJlbnRDYW1UcmFja10ubGVuICogQ0FNVFJBQ0tfTEVOOwotCi0gICAgY2FtID0gJnNDYW1UcmFja3Nbc0N1cnJlbnRDYW1UcmFja107Ci0gICAgY3VycmVudENhbVRpY2sgPSBzVGljayAtIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2s7Ci0gICAgdHJhY2tQb3MgPSAoZmxvYXQpY3VycmVudENhbVRpY2sgLyAoQ0FNVFJBQ0tfTEVOICogY2FtLT5sZW4pOwotCi0gICAgZm9yIChhID0gMDsgYSA8IDU7ICsrYSkKLSAgICAgICAgbGVycFthXSA9IChjYW0tPnNyY1thXSArIGNhbS0+ZGVzdFthXSAqIHRyYWNrUG9zKSAqIDAuMDFmOwotCi0gICAgaWYgKGNhbS0+ZGlzdCkKLSAgICB7Ci0gICAgICAgIGZsb2F0IGRpc3QgPSBjYW0tPmRpc3QgKiAwLjFmOwotICAgICAgICBjWCA9IGxlcnBbMF07Ci0gICAgICAgIGNZID0gbGVycFsxXTsKLSAgICAgICAgY1ogPSBsZXJwWzJdOwotICAgICAgICBlWCA9IGNYIC0gKGZsb2F0KWNvcyhsZXJwWzNdKSAqIGRpc3Q7Ci0gICAgICAgIGVZID0gY1kgLSAoZmxvYXQpc2luKGxlcnBbM10pICogZGlzdDsKLSAgICAgICAgZVogPSBjWiAtIGxlcnBbNF07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVYID0gbGVycFswXTsKLSAgICAgICAgZVkgPSBsZXJwWzFdOwotICAgICAgICBlWiA9IGxlcnBbMl07Ci0gICAgICAgIGNYID0gZVggKyAoZmxvYXQpY29zKGxlcnBbM10pOwotICAgICAgICBjWSA9IGVZICsgKGZsb2F0KXNpbihsZXJwWzNdKTsKLSAgICAgICAgY1ogPSBlWiArIGxlcnBbNF07Ci0gICAgfQotICAgIGdsdUxvb2tBdChlWCwgZVksIGVaLCBjWCwgY1ksIGNaLCAwLCAwLCAxKTsKLX0KLQotCi0vLyBDYWxsZWQgZnJvbSB0aGUgYXBwIGZyYW1ld29yay4KLS8qIFRoZSB0aWNrIGlzIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMsIHdpZHRoIGFuZCBoZWlnaHQKLSAqIGFyZSB0aGUgaW1hZ2UgZGltZW5zaW9ucyB0byBiZSByZW5kZXJlZC4KLSAqLwotdm9pZCBhcHBSZW5kZXIobG9uZyB0aWNrLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0gICAgaWYgKHNTdGFydFRpY2sgPT0gMCkKLSAgICAgICAgc1N0YXJ0VGljayA9IHRpY2s7Ci0gICAgaWYgKCFnQXBwQWxpdmUpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEFjdHVhbCB0aWNrIHZhbHVlIGlzICJibHVycmVkIiBhIGxpdHRsZSBiaXQuCi0gICAgc1RpY2sgPSAoc1RpY2sgKyB0aWNrIC0gc1N0YXJ0VGljaykgPj4gMTsKLQotICAgIC8vIFRlcm1pbmF0ZSBhcHBsaWNhdGlvbiBhZnRlciBydW5uaW5nIHRocm91Z2ggdGhlIGRlbW9uc3RyYXRpb24gb25jZS4KLSAgICBpZiAoc1RpY2sgPj0gUlVOX0xFTkdUSCkKLSAgICB7Ci0gICAgICAgIGdBcHBBbGl2ZSA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBQcmVwYXJlIE9wZW5HTCBFUyBmb3IgcmVuZGVyaW5nIG9mIHRoZSBmcmFtZS4KLSAgICBwcmVwYXJlRnJhbWUod2lkdGgsIGhlaWdodCk7Ci0KLSAgICAvLyBVcGRhdGUgdGhlIGNhbWVyYSBwb3NpdGlvbiBhbmQgc2V0IHRoZSBsb29rYXQuCi0gICAgY2FtVHJhY2soKTsKLQotICAgIC8vIENvbmZpZ3VyZSBlbnZpcm9ubWVudC4KLSAgICBjb25maWd1cmVMaWdodEFuZE1hdGVyaWFsKCk7Ci0KLSAgICAvLyBEcmF3IHRoZSByZWZsZWN0aW9uIGJ5IGRyYXdpbmcgbW9kZWxzIHdpdGggbmVnYXRlZCBaLWF4aXMuCi0gICAgZ2xQdXNoTWF0cml4KCk7Ci0gICAgZHJhd01vZGVscygtMSk7Ci0gICAgZ2xQb3BNYXRyaXgoKTsKLQotICAgIC8vIEJsZW5kIHRoZSBncm91bmQgcGxhbmUgdG8gdGhlIHdpbmRvdy4KLSAgICBkcmF3R3JvdW5kUGxhbmUoKTsKLQotICAgIC8vIERyYXcgYWxsIHRoZSBtb2RlbHMgbm9ybWFsbHkuCi0gICAgZHJhd01vZGVscygxKTsKLQotICAgIC8vIERyYXcgZmFkZSBxdWFkIG92ZXIgd2hvbGUgd2luZG93ICh3aGVuIGNoYW5naW5nIGNhbWVyYXMpLgotICAgIGRyYXdGYWRlUXVhZCgpOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbC5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGY4NDEwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0jaWZuZGVmIF9fZWdsX2hfCi0jZGVmaW5lIF9fZWdsX2hfCi0KLS8qCi0qKiBMaWNlbnNlIEFwcGxpY2FiaWxpdHkuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUKLSoqIG1hZGUgc3ViamVjdCB0byBhbiBhbHRlcm5hdGl2ZSBsaWNlbnNlIGFzIHBlcm1pdHRlZCBpbiB0aGUgU0dJIEZyZWUKLSoqIFNvZnR3YXJlIExpY2Vuc2UgQiwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpLCB0aGUgY29udGVudHMgb2YgdGhpcwotKiogZmlsZSBhcmUgc3ViamVjdCBvbmx5IHRvIHRoZSBwcm92aXNpb25zIG9mIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UKLSoqIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKLSoqIG9mIHRoZSBMaWNlbnNlIGF0IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIGF0dG46IExlZ2FsIFNlcnZpY2VzLCAxNjAwCi0qKiBBbXBoaXRoZWF0cmUgUGFya3dheSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMtMTM1MSwgb3IgYXQ6Ci0qKgotKiogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCCi0qKgotKiogTm90ZSB0aGF0LCBhcyBwcm92aWRlZCBpbiB0aGUgTGljZW5zZSwgdGhlIFNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qKiAiQVMgSVMiIGJhc2lzLCB3aXRoIEFMTCBFWFBSRVNTIEFORCBJTVBMSUVEIFdBUlJBTlRJRVMgQU5EIENPTkRJVElPTlMKLSoqIERJU0NMQUlNRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIEFORAotKiogQ09ORElUSU9OUyBPRiBNRVJDSEFOVEFCSUxJVFksIFNBVElTRkFDVE9SWSBRVUFMSVRZLCBGSVRORVNTIEZPUiBBCi0qKiBQQVJUSUNVTEFSIFBVUlBPU0UsIEFORCBOT04tSU5GUklOR0VNRU5ULgotKioKLSoqIE9yaWdpbmFsIENvZGUuIFRoZSBPcmlnaW5hbCBDb2RlIGlzOiBPcGVuR0wgU2FtcGxlIEltcGxlbWVudGF0aW9uLAotKiogVmVyc2lvbiAxLjIuMSwgcmVsZWFzZWQgSmFudWFyeSAyNiwgMjAwMCwgZGV2ZWxvcGVkIGJ5IFNpbGljb24gR3JhcGhpY3MsCi0qKiBJbmMuIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoYykgMTk5MS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSoqIENvcHlyaWdodCBpbiBhbnkgcG9ydGlvbnMgY3JlYXRlZCBieSB0aGlyZCBwYXJ0aWVzIGlzIGFzIGluZGljYXRlZAotKiogZWxzZXdoZXJlIGhlcmVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoqCi0qKiBBZGRpdGlvbmFsIE5vdGljZSBQcm92aXNpb25zOiBUaGUgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcwotKiogZXN0YWJsaXNoZWQgYnkgU0dJIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIE9yaWdpbmFsIENvZGUgYXJlIFRoZQotKiogT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbTogQSBTcGVjaWZpY2F0aW9uIChWZXJzaW9uIDEuMi4xKSwgcmVsZWFzZWQKLSoqIEFwcmlsIDEsIDE5OTk7IFRoZSBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtIFV0aWxpdHkgTGlicmFyeSAoVmVyc2lvbgotKiogMS4zKSwgcmVsZWFzZWQgTm92ZW1iZXIgNCwgMTk5ODsgYW5kIE9wZW5HTChSKSBHcmFwaGljcyB3aXRoIHRoZSBYCi0qKiBXaW5kb3cgU3lzdGVtKFIpIChWZXJzaW9uIDEuMyksIHJlbGVhc2VkIE9jdG9iZXIgMTksIDE5OTguIFRoaXMgc29mdHdhcmUKLSoqIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTYW1wbGUgSW1wbGVtZW50YXRpb24KLSoqIHB1Ymxpc2hlZCBieSBTR0ksIGJ1dCBoYXMgbm90IGJlZW4gaW5kZXBlbmRlbnRseSB2ZXJpZmllZCBhcyBiZWluZwotKiogY29tcGxpYW50IHdpdGggdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNwZWNpZmljYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZWdsdHlwZXMuaD4KLQotLyoKLSoqIGVnbHR5cGVzLmggaXMgcGxhdGZvcm0gZGVwZW5kZW50LiBJdCBkZWZpbmVzOgotKioKLSoqICAgICAtIEVHTCB0eXBlcyBhbmQgcmVzb3VyY2VzCi0qKiAgICAgLSBOYXRpdmUgdHlwZXMKLSoqICAgICAtIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKLSoqCi0qKiBFR0wgdHlwZXMgYW5kIHJlc291cmNlcyBhcmUgdG8gYmUgdHlwZWRlZidlZCB3aXRoIGFwcHJvcHJpYXRlIHBsYXRmb3JtCi0qKiBkZXBlbmRlbnQgcmVzb3VyY2UgaGFuZGxlIHR5cGVzLiBFR0xpbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIG9mIGF0IGxlYXN0Ci0qKiAzMi1iaXQuCi0qKgotKiogTmF0aXZlRGlzcGxheVR5cGUsIE5hdGl2ZVdpbmRvd1R5cGUgYW5kIE5hdGl2ZVBpeG1hcFR5cGUgYXJlIHRvIGJlCi0qKiByZXBsYWNlZCB3aXRoIGNvcnJlc3BvbmRpbmcgdHlwZXMgb2YgdGhlIG5hdGl2ZSB3aW5kb3cgc3lzdGVtIGluIGVnbC5oLgotKioKLSoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMgbXVzdCBtYXRjaCB0aGVpciB0eXBlcy4KLSoqCi0qKiBFeGFtcGxlIGVnbHR5cGVzLmg6Ci0qLwotCi0jaWYgMAotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmF0aXZlX3dpbmRvd19zeXN0ZW0uaD4KLQotLyoKLSoqIFR5cGVzIGFuZCByZXNvdXJjZXMKLSovCi10eXBlZGVmIGludCBFR0xCb29sZWFuOwotdHlwZWRlZiBpbnQzMl90IEVHTGludDsKLXR5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKLXR5cGVkZWYgdm9pZCAqRUdMQ29uZmlnOwotdHlwZWRlZiB2b2lkICpFR0xTdXJmYWNlOwotdHlwZWRlZiB2b2lkICpFR0xDb250ZXh0OwotCi0vKgotKiogRUdMIGFuZCBuYXRpdmUgaGFuZGxlIHZhbHVlcwotKi8KLSNkZWZpbmUgRUdMX0RFRkFVTFRfRElTUExBWSAoKE5hdGl2ZURpc3BsYXlUeXBlKTApCi0jZGVmaW5lIEVHTF9OT19DT05URVhUICgoRUdMQ29udGV4dCkwKQotI2RlZmluZSBFR0xfTk9fRElTUExBWSAoKEVHTERpc3BsYXkpMCkKLSNkZWZpbmUgRUdMX05PX1NVUkZBQ0UgKChFR0xTdXJmYWNlKTApCi0KLSNlbmRpZgotCi0vKgotKiogVmVyc2lvbmluZyBhbmQgZXh0ZW5zaW9ucwotKi8KLSNkZWZpbmUgRUdMX1ZFUlNJT05fMV8wCQkgICAgICAgMQotCi0vKgotKiogQm9vbGVhbgotKi8KLSNkZWZpbmUgRUdMX0ZBTFNFCQkgICAgICAgMAotI2RlZmluZSBFR0xfVFJVRQkJICAgICAgIDEKLQotLyoKLSoqIEVycm9ycwotKi8KLSNkZWZpbmUgRUdMX1NVQ0NFU1MJCSAgICAgICAweDMwMDAKLSNkZWZpbmUgRUdMX05PVF9JTklUSUFMSVpFRAkgICAgICAgMHgzMDAxCi0jZGVmaW5lIEVHTF9CQURfQUNDRVNTCQkgICAgICAgMHgzMDAyCi0jZGVmaW5lIEVHTF9CQURfQUxMT0MJCSAgICAgICAweDMwMDMKLSNkZWZpbmUgRUdMX0JBRF9BVFRSSUJVVEUJICAgICAgIDB4MzAwNAotI2RlZmluZSBFR0xfQkFEX0NPTkZJRwkJICAgICAgIDB4MzAwNQotI2RlZmluZSBFR0xfQkFEX0NPTlRFWFQJCSAgICAgICAweDMwMDYKLSNkZWZpbmUgRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0UgICAgICAgIDB4MzAwNwotI2RlZmluZSBFR0xfQkFEX0RJU1BMQVkJCSAgICAgICAweDMwMDgKLSNkZWZpbmUgRUdMX0JBRF9NQVRDSAkJICAgICAgIDB4MzAwOQotI2RlZmluZSBFR0xfQkFEX05BVElWRV9QSVhNQVAJICAgICAgIDB4MzAwQQotI2RlZmluZSBFR0xfQkFEX05BVElWRV9XSU5ET1cJICAgICAgIDB4MzAwQgotI2RlZmluZSBFR0xfQkFEX1BBUkFNRVRFUgkgICAgICAgMHgzMDBDCi0jZGVmaW5lIEVHTF9CQURfU1VSRkFDRQkJICAgICAgIDB4MzAwRAotLyogMHgzMDBFIC0gMHgzMDFGIHJlc2VydmVkIGZvciBhZGRpdGlvbmFsIGVycm9ycy4gKi8KLQotLyoKLSoqIENvbmZpZyBhdHRyaWJ1dGVzCi0qLwotI2RlZmluZSBFR0xfQlVGRkVSX1NJWkUJCSAgICAgICAweDMwMjAKLSNkZWZpbmUgRUdMX0FMUEhBX1NJWkUJCSAgICAgICAweDMwMjEKLSNkZWZpbmUgRUdMX0JMVUVfU0laRQkJICAgICAgIDB4MzAyMgotI2RlZmluZSBFR0xfR1JFRU5fU0laRQkJICAgICAgIDB4MzAyMwotI2RlZmluZSBFR0xfUkVEX1NJWkUJCSAgICAgICAweDMwMjQKLSNkZWZpbmUgRUdMX0RFUFRIX1NJWkUJCSAgICAgICAweDMwMjUKLSNkZWZpbmUgRUdMX1NURU5DSUxfU0laRQkgICAgICAgMHgzMDI2Ci0jZGVmaW5lIEVHTF9DT05GSUdfQ0FWRUFUCSAgICAgICAweDMwMjcKLSNkZWZpbmUgRUdMX0NPTkZJR19JRAkJICAgICAgIDB4MzAyOAotI2RlZmluZSBFR0xfTEVWRUwJCSAgICAgICAweDMwMjkKLSNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX0hFSUdIVAkgICAgICAgMHgzMDJBCi0jZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMJICAgICAgIDB4MzAyQgotI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfV0lEVEgJICAgICAgIDB4MzAyQwotI2RlZmluZSBFR0xfTkFUSVZFX1JFTkRFUkFCTEUJICAgICAgIDB4MzAyRAotI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9JRAkgICAgICAgMHgzMDJFCi0jZGVmaW5lIEVHTF9OQVRJVkVfVklTVUFMX1RZUEUJICAgICAgIDB4MzAyRgotLyojZGVmaW5lIEVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTCSAweDMwMzAqLwotI2RlZmluZSBFR0xfU0FNUExFUwkJICAgICAgIDB4MzAzMQotI2RlZmluZSBFR0xfU0FNUExFX0JVRkZFUlMJICAgICAgIDB4MzAzMgotI2RlZmluZSBFR0xfU1VSRkFDRV9UWVBFCSAgICAgICAweDMwMzMKLSNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1RZUEUJICAgICAgIDB4MzAzNAotI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSAgICAgMHgzMDM1Ci0jZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSAgICAweDMwMzYKLSNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSAgICAgIDB4MzAzNwotCi0vKgotKiogQ29uZmlnIGF0dHJpYnV0ZSBhbmQgdmFsdWUKLSovCi0jZGVmaW5lIEVHTF9OT05FCQkgICAgICAgMHgzMDM4Ci0vKiAweDMwMzkgLSAweDMwNEYgcmVzZXJ2ZWQgZm9yIGFkZGl0aW9uYWwgY29uZmlnIGF0dHJpYnV0ZXMuICovCi0KLS8qCi0qKiBDb25maWcgdmFsdWVzCi0qLwotI2RlZmluZSBFR0xfRE9OVF9DQVJFCQkgICAgICAgKChFR0xpbnQpIC0xKQotI2RlZmluZSBFR0xfUEJVRkZFUl9CSVQJCSAgICAgICAweDAxCi0jZGVmaW5lIEVHTF9QSVhNQVBfQklUCQkgICAgICAgMHgwMgotI2RlZmluZSBFR0xfV0lORE9XX0JJVAkJICAgICAgIDB4MDQKLSNkZWZpbmUgRUdMX1NMT1dfQ09ORklHCQkgICAgICAgMHgzMDUwCi0jZGVmaW5lIEVHTF9OT05fQ09ORk9STUFOVF9DT05GSUcgICAgICAweDMwNTEKLSNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1JHQgkgICAgICAgMHgzMDUyCi0KLS8qCi0qKiBTdHJpbmcgbmFtZXMKLSovCi0jZGVmaW5lIEVHTF9WRU5ET1IJCSAgICAgICAweDMwNTMKLSNkZWZpbmUgRUdMX1ZFUlNJT04JCSAgICAgICAweDMwNTQKLSNkZWZpbmUgRUdMX0VYVEVOU0lPTlMJCSAgICAgICAweDMwNTUKLQotLyoKLSoqIFN1cmZhY2UgYXR0cmlidXRlcwotKi8KLSNkZWZpbmUgRUdMX0hFSUdIVAkJICAgICAgIDB4MzA1NgotI2RlZmluZSBFR0xfV0lEVEgJCSAgICAgICAweDMwNTcKLSNkZWZpbmUgRUdMX0xBUkdFU1RfUEJVRkZFUgkgICAgICAgMHgzMDU4Ci0KLS8qCi0qKiBDdXJyZW50IHN1cmZhY2VzCi0qLwotI2RlZmluZSBFR0xfRFJBVwkJICAgICAgIDB4MzA1OQotI2RlZmluZSBFR0xfUkVBRAkJICAgICAgIDB4MzA1QQotCi0vKgotKiogRW5naW5lcwotKi8KLSNkZWZpbmUgRUdMX0NPUkVfTkFUSVZFX0VOR0lORQkgICAgICAgMHgzMDVCCi0KLS8qIDB4MzA1Qy0weDNGRkZGIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0KLS8qCi0qKiBGdW5jdGlvbnMKLSovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUdMQVBJIEVHTGludCBBUElFTlRSWSBlZ2xHZXRFcnJvciAodm9pZCk7Ci0KLUdMQVBJIEVHTERpc3BsYXkgQVBJRU5UUlkgZWdsR2V0RGlzcGxheSAoTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheSk7Ci1HTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEluaXRpYWxpemUgKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKTsKLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsVGVybWluYXRlIChFR0xEaXNwbGF5IGRweSk7Ci1HTEFQSSBjb25zdCBjaGFyICogQVBJRU5UUlkgZWdsUXVlcnlTdHJpbmcgKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgbmFtZSk7Ci1HTEFQSSB2b2lkICgqIEFQSUVOVFJZIGVnbEdldFByb2NBZGRyZXNzIChjb25zdCBjaGFyICpwcm9jbmFtZSkpKCk7Ci0KLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsR2V0Q29uZmlncyAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpOwotR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xDaG9vc2VDb25maWcgKEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LCBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKTsKLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsR2V0Q29uZmlnQXR0cmliIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7Ci0KLUdMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlV2luZG93U3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLUdMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLUdMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsRGVzdHJveVN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOwotR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xRdWVyeVN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOwotCi1HTEFQSSBFR0xDb250ZXh0IEFQSUVOVFJZIGVnbENyZWF0ZUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBFR0xDb250ZXh0IHNoYXJlX2xpc3QsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwotR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xEZXN0cm95Q29udGV4dCAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4KTsKLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsTWFrZUN1cnJlbnQgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgpOwotR0xBUEkgRUdMQ29udGV4dCBBUElFTlRSWSBlZ2xHZXRDdXJyZW50Q29udGV4dCAodm9pZCk7Ci1HTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbEdldEN1cnJlbnRTdXJmYWNlIChFR0xpbnQgcmVhZGRyYXcpOwotR0xBUEkgRUdMRGlzcGxheSBBUElFTlRSWSBlZ2xHZXRDdXJyZW50RGlzcGxheSAodm9pZCk7Ci1HTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFF1ZXJ5Q29udGV4dCAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKLQotR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xXYWl0R0wgKHZvaWQpOwotR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xXYWl0TmF0aXZlIChFR0xpbnQgZW5naW5lKTsKLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsU3dhcEJ1ZmZlcnMgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcpOwotR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xDb3B5QnVmZmVycyAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19fZWdsX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2x0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGIzNmM5Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2x0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSoqIFR5cGVzIGFuZCByZXNvdXJjZXMKLSovCi10eXBlZGVmIGludCBFR0xCb29sZWFuOwotdHlwZWRlZiBsb25nIEVHTGludDsKLXR5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKLXR5cGVkZWYgdm9pZCAqRUdMQ29uZmlnOwotdHlwZWRlZiB2b2lkICpFR0xTdXJmYWNlOwotdHlwZWRlZiB2b2lkICpFR0xDb250ZXh0OwotdHlwZWRlZiB2b2lkICpOYXRpdmVEaXNwbGF5VHlwZTsKLXR5cGVkZWYgdm9pZCAqTmF0aXZlV2luZG93VHlwZTsKLXR5cGVkZWYgdm9pZCAqTmF0aXZlUGl4bWFwVHlwZTsKLQotLyoKLSoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKLSovCi0jZGVmaW5lIEVHTF9ERUZBVUxUX0RJU1BMQVkgKChOYXRpdmVEaXNwbGF5VHlwZSkwKQotI2RlZmluZSBFR0xfTk9fQ09OVEVYVCAoKEVHTENvbnRleHQpMCkKLSNkZWZpbmUgRUdMX05PX0RJU1BMQVkgKChFR0xEaXNwbGF5KTApCi0jZGVmaW5lIEVHTF9OT19TVVJGQUNFICgoRUdMU3VyZmFjZSkwKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2dsLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1NDgyMi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0jaWZuZGVmIF9fZ2xfaF8KLSNkZWZpbmUgX19nbF9oXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qCi0qKiBMaWNlbnNlIEFwcGxpY2FiaWxpdHkuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUKLSoqIG1hZGUgc3ViamVjdCB0byBhbiBhbHRlcm5hdGl2ZSBsaWNlbnNlIGFzIHBlcm1pdHRlZCBpbiB0aGUgU0dJIEZyZWUKLSoqIFNvZnR3YXJlIExpY2Vuc2UgQiwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpLCB0aGUgY29udGVudHMgb2YgdGhpcwotKiogZmlsZSBhcmUgc3ViamVjdCBvbmx5IHRvIHRoZSBwcm92aXNpb25zIG9mIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UKLSoqIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKLSoqIG9mIHRoZSBMaWNlbnNlIGF0IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIGF0dG46IExlZ2FsIFNlcnZpY2VzLCAxNjAwCi0qKiBBbXBoaXRoZWF0cmUgUGFya3dheSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMtMTM1MSwgb3IgYXQ6Ci0qKiAKLSoqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQgotKiogCi0qKiBOb3RlIHRoYXQsIGFzIHByb3ZpZGVkIGluIHRoZSBMaWNlbnNlLCB0aGUgU29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSoqICJBUyBJUyIgYmFzaXMsIHdpdGggQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUyBBTkQgQ09ORElUSU9OUwotKiogRElTQ0xBSU1FRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgQU5ECi0qKiBDT05ESVRJT05TIE9GIE1FUkNIQU5UQUJJTElUWSwgU0FUSVNGQUNUT1JZIFFVQUxJVFksIEZJVE5FU1MgRk9SIEEKLSoqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCi0qKiAKLSoqIE9yaWdpbmFsIENvZGUuIFRoZSBPcmlnaW5hbCBDb2RlIGlzOiBPcGVuR0wgU2FtcGxlIEltcGxlbWVudGF0aW9uLAotKiogVmVyc2lvbiAxLjIuMSwgcmVsZWFzZWQgSmFudWFyeSAyNiwgMjAwMCwgZGV2ZWxvcGVkIGJ5IFNpbGljb24gR3JhcGhpY3MsCi0qKiBJbmMuIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoYykgMTk5MS0yMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSoqIENvcHlyaWdodCBpbiBhbnkgcG9ydGlvbnMgY3JlYXRlZCBieSB0aGlyZCBwYXJ0aWVzIGlzIGFzIGluZGljYXRlZAotKiogZWxzZXdoZXJlIGhlcmVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoqIAotKiogQWRkaXRpb25hbCBOb3RpY2UgUHJvdmlzaW9uczogVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZXMKLSoqIGVzdGFibGlzaGVkIGJ5IFNHSSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBPcmlnaW5hbCBDb2RlIGFyZSBUaGUKLSoqIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW06IEEgU3BlY2lmaWNhdGlvbiAoVmVyc2lvbiAxLjIuMSksIHJlbGVhc2VkCi0qKiBBcHJpbCAxLCAxOTk5OyBUaGUgT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbSBVdGlsaXR5IExpYnJhcnkgKFZlcnNpb24KLSoqIDEuMyksIHJlbGVhc2VkIE5vdmVtYmVyIDQsIDE5OTg7IGFuZCBPcGVuR0woUikgR3JhcGhpY3Mgd2l0aCB0aGUgWAotKiogV2luZG93IFN5c3RlbShSKSAoVmVyc2lvbiAxLjMpLCByZWxlYXNlZCBPY3RvYmVyIDE5LCAxOTk4LiBUaGlzIHNvZnR3YXJlCi0qKiB3YXMgY3JlYXRlZCB1c2luZyB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU2FtcGxlIEltcGxlbWVudGF0aW9uCi0qKiBwdWJsaXNoZWQgYnkgU0dJLCBidXQgaGFzIG5vdCBiZWVuIGluZGVwZW5kZW50bHkgdmVyaWZpZWQgYXMgYmVpbmcKLSoqIGNvbXBsaWFudCB3aXRoIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTcGVjaWZpY2F0aW9uLgotKi8KLQotI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChBUElFTlRSWSkgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgQVBJRU5UUlkKLSNkZWZpbmUgQVBJRU5UUlkKLSNlbmRpZgotI2lmbmRlZiBHTEFQSQotI2RlZmluZSBHTEFQSSBleHRlcm4KLSNlbmRpZgotCi10eXBlZGVmIHVuc2lnbmVkIGludCBHTGVudW07Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgR0xib29sZWFuOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xiaXRmaWVsZDsKLXR5cGVkZWYgc2lnbmVkIGNoYXIgR0xieXRlOwotdHlwZWRlZiBzaG9ydCBHTHNob3J0OwotdHlwZWRlZiBpbnQgR0xpbnQ7Ci10eXBlZGVmIGludCBHTHNpemVpOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEdMdWJ5dGU7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IEdMdXNob3J0OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgR0x1aW50OwotdHlwZWRlZiBmbG9hdCBHTGZsb2F0OwotdHlwZWRlZiBmbG9hdCBHTGNsYW1wZjsKLXR5cGVkZWYgdm9pZCBHTHZvaWQ7Ci10eXBlZGVmIGludCBHTGludHB0ckFSQjsKLXR5cGVkZWYgaW50IEdMc2l6ZWlwdHJBUkI7Ci10eXBlZGVmIGludCBHTGZpeGVkOwotdHlwZWRlZiBpbnQgR0xjbGFtcHg7Ci0vKiBJbnRlcm5hbCBjb252ZW5pZW5jZSB0eXBlZGVmcyAqLwotdHlwZWRlZiB2b2lkICgqX0dMZnVuY3B0cikoKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgR0xfT0VTX1ZFUlNJT05fMV8wICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgR0xfT0VTX3JlYWRfZm9ybWF0ICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZSAxCi0KLS8qIENsZWFyQnVmZmVyTWFzayAqLwotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotCi0vKiBCb29sZWFuICovCi0jZGVmaW5lIEdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0KLS8qIEJlZ2luTW9kZSAqLwotI2RlZmluZSBHTF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIEdMX0xJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgR0xfTElORV9MT09QICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBHTF9MSU5FX1NUUklQICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCi0jZGVmaW5lIEdMX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgR0xfVFJJQU5HTEVfU1RSSVAgICAgICAgICAgICAgICAgIDB4MDAwNQotI2RlZmluZSBHTF9UUklBTkdMRV9GQU4gICAgICAgICAgICAgICAgICAgMHgwMDA2Ci0KLS8qIEFscGhhRnVuY3Rpb24gKi8KLSNkZWZpbmUgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCi0jZGVmaW5lIEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDIKLSNkZWZpbmUgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMwotI2RlZmluZSBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA0Ci0jZGVmaW5lIEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAweDAyMDUKLSNkZWZpbmUgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNgotI2RlZmluZSBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA3Ci0KLS8qIEJsZW5kaW5nRmFjdG9yRGVzdCAqLwotI2RlZmluZSBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTF9PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwCi0jZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICAgICAgICAweDAzMDEKLSNkZWZpbmUgR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMgotI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgMHgwMzAzCi0jZGVmaW5lIEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDQKLSNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgICAgICAgIDB4MDMwNQotCi0vKiBCbGVuZGluZ0ZhY3RvclNyYyAqLwotLyogICAgICBHTF9aRVJPICovCi0vKiAgICAgIEdMX09ORSAqLwotI2RlZmluZSBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzA2Ci0jZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAweDAzMDcKLSNkZWZpbmUgR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAgICAgICAgICAgIDB4MDMwOAotLyogICAgICBHTF9TUkNfQUxQSEEgKi8KLS8qICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAqLwotLyogICAgICBHTF9EU1RfQUxQSEEgKi8KLS8qICAgICAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAqLwotCi0vKiBDb2xvck1hdGVyaWFsRmFjZSAqLwotLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLwotCi0vKiBDb2xvck1hdGVyaWFsUGFyYW1ldGVyICovCi0vKiAgICAgIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgKi8KLQotLyogQ29sb3JQb2ludGVyVHlwZSAqLwotLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCi0vKiAgICAgIEdMX0ZMT0FUICovCi0vKiAgICAgIEdMX0ZJWEVEICovCi0KLS8qIEN1bGxGYWNlTW9kZSAqLwotI2RlZmluZSBHTF9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA0Ci0jZGVmaW5lIEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDUKLSNkZWZpbmUgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgIDB4MDQwOAotCi0vKiBEZXB0aEZ1bmN0aW9uICovCi0vKiAgICAgIEdMX05FVkVSICovCi0vKiAgICAgIEdMX0xFU1MgKi8KLS8qICAgICAgR0xfRVFVQUwgKi8KLS8qICAgICAgR0xfTEVRVUFMICovCi0vKiAgICAgIEdMX0dSRUFURVIgKi8KLS8qICAgICAgR0xfTk9URVFVQUwgKi8KLS8qICAgICAgR0xfR0VRVUFMICovCi0vKiAgICAgIEdMX0FMV0FZUyAqLwotCi0vKiBFbmFibGVDYXAgKi8KLSNkZWZpbmUgR0xfRk9HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MAotI2RlZmluZSBHTF9MSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgMHgwQjUwCi0jZGVmaW5lIEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAweDBERTEKLSNkZWZpbmUgR0xfQ1VMTF9GQUNFICAgICAgICAgICAgICAgICAgICAgIDB4MEI0NAotI2RlZmluZSBHTF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQkMwCi0jZGVmaW5lIEdMX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRTIKLSNkZWZpbmUgR0xfQ09MT1JfTE9HSUNfT1AgICAgICAgICAgICAgICAgIDB4MEJGMgotI2RlZmluZSBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkQwCi0jZGVmaW5lIEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAweDBCOTAKLSNkZWZpbmUgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEI3MQotLyogICAgICBHTF9MSUdIVDAgKi8KLS8qICAgICAgR0xfTElHSFQxICovCi0vKiAgICAgIEdMX0xJR0hUMiAqLwotLyogICAgICBHTF9MSUdIVDMgKi8KLS8qICAgICAgR0xfTElHSFQ0ICovCi0vKiAgICAgIEdMX0xJR0hUNSAqLwotLyogICAgICBHTF9MSUdIVDYgKi8KLS8qICAgICAgR0xfTElHSFQ3ICovCi0jZGVmaW5lIEdMX1BPSU5UX1NNT09USCAgICAgICAgICAgICAgICAgICAweDBCMTAKLSNkZWZpbmUgR0xfTElORV9TTU9PVEggICAgICAgICAgICAgICAgICAgIDB4MEIyMAotI2RlZmluZSBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQzExCi0jZGVmaW5lIEdMX0NPTE9SX01BVEVSSUFMICAgICAgICAgICAgICAgICAweDBCNTcKLSNkZWZpbmUgR0xfTk9STUFMSVpFICAgICAgICAgICAgICAgICAgICAgIDB4MEJBMQotI2RlZmluZSBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgMHg4MDNBCi0jZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZICAgICAgICAgICAgICAgICAgIDB4ODA3NAotI2RlZmluZSBHTF9OT1JNQUxfQVJSQVkgICAgICAgICAgICAgICAgICAgMHg4MDc1Ci0jZGVmaW5lIEdMX0NPTE9SX0FSUkFZICAgICAgICAgICAgICAgICAgICAweDgwNzYKLSNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAgICAgICAgICAgIDB4ODA3OAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRSAgICAgICAgICAgICAgICAgICAgMHg4MDlECi0jZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAgICAgICAweDgwOUUKLSNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORSAgICAgICAgICAgIDB4ODA5RgotI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgMHg4MEEwCi0KLS8qIEVycm9yQ29kZSAqLwotI2RlZmluZSBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgMHgwNTAwCi0jZGVmaW5lIEdMX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAweDA1MDEKLSNkZWZpbmUgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgIDB4MDUwMgotI2RlZmluZSBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgMHgwNTAzCi0jZGVmaW5lIEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAweDA1MDQKLSNkZWZpbmUgR0xfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgIDB4MDUwNQotCi0vKiBGb2dNb2RlICovCi0vKiAgICAgIEdMX0xJTkVBUiAqLwotI2RlZmluZSBHTF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCi0jZGVmaW5lIEdMX0VYUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEKLQotLyogRm9nUGFyYW1ldGVyICovCi0jZGVmaW5lIEdMX0ZPR19ERU5TSVRZICAgICAgICAgICAgICAgICAgICAweDBCNjIKLSNkZWZpbmUgR0xfRk9HX1NUQVJUICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MwotI2RlZmluZSBHTF9GT0dfRU5EICAgICAgICAgICAgICAgICAgICAgICAgMHgwQjY0Ci0jZGVmaW5lIEdMX0ZPR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDBCNjUKLSNkZWZpbmUgR0xfRk9HX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NgotCi0vKiBGcm9udEZhY2VEaXJlY3Rpb24gKi8KLSNkZWZpbmUgR0xfQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMAotI2RlZmluZSBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAxCi0KLS8qIEdldFBOYW1lICovCi0jZGVmaW5lIEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAweDBCMTIKLSNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgIDB4MEIyMgotI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgMHg4NDZECi0jZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAweDg0NkUKLSNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAweDhCOUEKLSNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTIDB4OEI5QgotI2RlZmluZSBHTF9NQVhfTElHSFRTICAgICAgICAgICAgICAgICAgICAgMHgwRDMxCi0jZGVmaW5lIEdMX01BWF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAweDBEMzMKLSNkZWZpbmUgR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgIDB4MEQzNgotI2RlZmluZSBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgMHgwRDM4Ci0jZGVmaW5lIEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRIICAgICAgICAweDBEMzkKLSNkZWZpbmUgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgIDB4MEQzQQotI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMgICAgICAgICAgMHg4MEU4Ci0jZGVmaW5lIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTICAgICAgICAgICAweDgwRTkKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgIDB4ODRFMgotI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKLSNkZWZpbmUgR0xfU1VCUElYRUxfQklUUyAgICAgICAgICAgICAgICAgIDB4MEQ1MAotI2RlZmluZSBHTF9SRURfQklUUyAgICAgICAgICAgICAgICAgICAgICAgMHgwRDUyCi0jZGVmaW5lIEdMX0dSRUVOX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTMKLSNkZWZpbmUgR0xfQkxVRV9CSVRTICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NAotI2RlZmluZSBHTF9BTFBIQV9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU1Ci0jZGVmaW5lIEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTYKLSNkZWZpbmUgR0xfU1RFTkNJTF9CSVRTICAgICAgICAgICAgICAgICAgIDB4MEQ1NwotCi0vKiBIaW50TW9kZSAqLwotI2RlZmluZSBHTF9ET05UX0NBUkUgICAgICAgICAgICAgICAgICAgICAgMHgxMTAwCi0jZGVmaW5lIEdMX0ZBU1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDExMDEKLSNkZWZpbmUgR0xfTklDRVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMgotCi0vKiBIaW50VGFyZ2V0ICovCi0jZGVmaW5lIEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCAgICAweDBDNTAKLSNkZWZpbmUgR0xfUE9JTlRfU01PT1RIX0hJTlQgICAgICAgICAgICAgIDB4MEM1MQotI2RlZmluZSBHTF9MSU5FX1NNT09USF9ISU5UICAgICAgICAgICAgICAgMHgwQzUyCi0jZGVmaW5lIEdMX1BPTFlHT05fU01PT1RIX0hJTlQgICAgICAgICAgICAweDBDNTMKLSNkZWZpbmUgR0xfRk9HX0hJTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MEM1NAotCi0vKiBMaWdodE1vZGVsUGFyYW1ldGVyICovCi0jZGVmaW5lIEdMX0xJR0hUX01PREVMX0FNQklFTlQgICAgICAgICAgICAweDBCNTMKLSNkZWZpbmUgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgICAgICAgICAgIDB4MEI1MgotCi0vKiBMaWdodFBhcmFtZXRlciAqLwotI2RlZmluZSBHTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAwCi0jZGVmaW5lIEdMX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgICAgICAweDEyMDEKLSNkZWZpbmUgR0xfU1BFQ1VMQVIgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMgotI2RlZmluZSBHTF9QT1NJVElPTiAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAzCi0jZGVmaW5lIEdMX1NQT1RfRElSRUNUSU9OICAgICAgICAgICAgICAgICAweDEyMDQKLSNkZWZpbmUgR0xfU1BPVF9FWFBPTkVOVCAgICAgICAgICAgICAgICAgIDB4MTIwNQotI2RlZmluZSBHTF9TUE9UX0NVVE9GRiAgICAgICAgICAgICAgICAgICAgMHgxMjA2Ci0jZGVmaW5lIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OICAgICAgICAgICAweDEyMDcKLSNkZWZpbmUgR0xfTElORUFSX0FUVEVOVUFUSU9OICAgICAgICAgICAgIDB4MTIwOAotI2RlZmluZSBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gICAgICAgICAgMHgxMjA5Ci0KLS8qIERhdGFUeXBlICovCi0jZGVmaW5lIEdMX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDAKLSNkZWZpbmUgR0xfVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgIDB4MTQwMQotI2RlZmluZSBHTF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAyCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUICAgICAgICAgICAgICAgICAweDE0MDMKLSNkZWZpbmUgR0xfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwNgotI2RlZmluZSBHTF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDBDCi0KLS8qIExvZ2ljT3AgKi8KLSNkZWZpbmUgR0xfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMAotI2RlZmluZSBHTF9BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAxCi0jZGVmaW5lIEdMX0FORF9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAweDE1MDIKLSNkZWZpbmUgR0xfQ09QWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMwotI2RlZmluZSBHTF9BTkRfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgMHgxNTA0Ci0jZGVmaW5lIEdMX05PT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDUKLSNkZWZpbmUgR0xfWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNgotI2RlZmluZSBHTF9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA3Ci0jZGVmaW5lIEdMX05PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDgKLSNkZWZpbmUgR0xfRVFVSVYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwOQotI2RlZmluZSBHTF9JTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBBCi0jZGVmaW5lIEdMX09SX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgICAweDE1MEIKLSNkZWZpbmUgR0xfQ09QWV9JTlZFUlRFRCAgICAgICAgICAgICAgICAgIDB4MTUwQwotI2RlZmluZSBHTF9PUl9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgMHgxNTBECi0jZGVmaW5lIEdMX05BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEUKLSNkZWZpbmUgR0xfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwRgotCi0vKiBNYXRlcmlhbEZhY2UgKi8KLS8qICAgICAgR0xfRlJPTlRfQU5EX0JBQ0sgKi8KLQotLyogTWF0ZXJpYWxQYXJhbWV0ZXIgKi8KLSNkZWZpbmUgR0xfRU1JU1NJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MTYwMAotI2RlZmluZSBHTF9TSElOSU5FU1MgICAgICAgICAgICAgICAgICAgICAgMHgxNjAxCi0jZGVmaW5lIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgICAgICAgICAgICAweDE2MDIKLS8qICAgICAgR0xfQU1CSUVOVCAqLwotLyogICAgICBHTF9ESUZGVVNFICovCi0vKiAgICAgIEdMX1NQRUNVTEFSICovCi0KLS8qIE1hdHJpeE1vZGUgKi8KLSNkZWZpbmUgR0xfTU9ERUxWSUVXICAgICAgICAgICAgICAgICAgICAgIDB4MTcwMAotI2RlZmluZSBHTF9QUk9KRUNUSU9OICAgICAgICAgICAgICAgICAgICAgMHgxNzAxCi0jZGVmaW5lIEdMX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAweDE3MDIKLQotLyogTm9ybWFsUG9pbnRlclR5cGUgKi8KLS8qICAgICAgR0xfQllURSAqLwotLyogICAgICBHTF9TSE9SVCAqLwotLyogICAgICBHTF9GTE9BVCAqLwotLyogICAgICBHTF9GSVhFRCAqLwotCi0vKiBQaXhlbEZvcm1hdCAqLwotI2RlZmluZSBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA2Ci0jZGVmaW5lIEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDcKLSNkZWZpbmUgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOAotI2RlZmluZSBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgMHgxOTA5Ci0jZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgICAweDE5MEEKLQotLyogUGl4ZWxTdG9yZVBhcmFtZXRlciAqLwotI2RlZmluZSBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgMHgwQ0Y1Ci0jZGVmaW5lIEdMX1BBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAweDBEMDUKLQotLyogUGl4ZWxUeXBlICovCi0vKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgIDB4ODAzMwotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgMHg4MDM0Ci0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICAgICAgICAgICAweDgzNjMKLQotLyogU2hhZGluZ01vZGVsICovCi0jZGVmaW5lIEdMX0ZMQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFEMDAKLSNkZWZpbmUgR0xfU01PT1RIICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUQwMQotCi0vKiBTdGVuY2lsRnVuY3Rpb24gKi8KLS8qICAgICAgR0xfTkVWRVIgKi8KLS8qICAgICAgR0xfTEVTUyAqLwotLyogICAgICBHTF9FUVVBTCAqLwotLyogICAgICBHTF9MRVFVQUwgKi8KLS8qICAgICAgR0xfR1JFQVRFUiAqLwotLyogICAgICBHTF9OT1RFUVVBTCAqLwotLyogICAgICBHTF9HRVFVQUwgKi8KLS8qICAgICAgR0xfQUxXQVlTICovCi0KLS8qIFN0ZW5jaWxPcCAqLwotLyogICAgICBHTF9aRVJPICovCi0jZGVmaW5lIEdMX0tFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDAKLSNkZWZpbmUgR0xfUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMQotI2RlZmluZSBHTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAyCi0jZGVmaW5lIEdMX0RFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDMKLS8qICAgICAgR0xfSU5WRVJUICovCi0KLS8qIFN0cmluZ05hbWUgKi8KLSNkZWZpbmUgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMAotI2RlZmluZSBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAxCi0jZGVmaW5lIEdMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAweDFGMDIKLSNkZWZpbmUgR0xfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgIDB4MUYwMwotCi0vKiBUZXhDb29yZFBvaW50ZXJUeXBlICovCi0vKiAgICAgIEdMX1NIT1JUICovCi0vKiAgICAgIEdMX0ZMT0FUICovCi0vKiAgICAgIEdMX0ZJWEVEICovCi0vKiAgICAgIEdMX0JZVEUgKi8KLQotLyogVGV4dHVyZUVudk1vZGUgKi8KLSNkZWZpbmUgR0xfTU9EVUxBVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMAotI2RlZmluZSBHTF9ERUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTAxCi0vKiAgICAgIEdMX0JMRU5EICovCi0jZGVmaW5lIEdMX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDQKLS8qICAgICAgR0xfUkVQTEFDRSAqLwotCi0vKiBUZXh0dXJlRW52UGFyYW1ldGVyICovCi0jZGVmaW5lIEdMX1RFWFRVUkVfRU5WX01PREUgICAgICAgICAgICAgICAweDIyMDAKLSNkZWZpbmUgR0xfVEVYVFVSRV9FTlZfQ09MT1IgICAgICAgICAgICAgIDB4MjIwMQotCi0vKiBUZXh0dXJlRW52VGFyZ2V0ICovCi0jZGVmaW5lIEdMX1RFWFRVUkVfRU5WICAgICAgICAgICAgICAgICAgICAweDIzMDAKLQotLyogVGV4dHVyZU1hZ0ZpbHRlciAqLwotI2RlZmluZSBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAwCi0jZGVmaW5lIEdMX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDEKLQotLyogVGV4dHVyZU1pbkZpbHRlciAqLwotLyogICAgICBHTF9ORUFSRVNUICovCi0vKiAgICAgIEdMX0xJTkVBUiAqLwotI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUICAgICAgICAgMHgyNzAwCi0jZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAweDI3MDEKLSNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICAgICAgICAgIDB4MjcwMgotI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgMHgyNzAzCi0KLS8qIFRleHR1cmVQYXJhbWV0ZXJOYW1lICovCi0jZGVmaW5lIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDAKLSNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fRklMVEVSICAgICAgICAgICAgIDB4MjgwMQotI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUyAgICAgICAgICAgICAgICAgMHgyODAyCi0jZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9UICAgICAgICAgICAgICAgICAweDI4MDMKLQotLyogVGV4dHVyZVRhcmdldCAqLwotLyogICAgICBHTF9URVhUVVJFXzJEICovCi0KLS8qIFRleHR1cmVVbml0ICovCi0jZGVmaW5lIEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAweDg0QzAKLSNkZWZpbmUgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMQotI2RlZmluZSBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMyCi0jZGVmaW5lIEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAweDg0QzMKLSNkZWZpbmUgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNAotI2RlZmluZSBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM1Ci0jZGVmaW5lIEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzYKLSNkZWZpbmUgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNwotI2RlZmluZSBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM4Ci0jZGVmaW5lIEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzkKLSNkZWZpbmUgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQQotI2RlZmluZSBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgMHg4NENCCi0jZGVmaW5lIEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAweDg0Q0MKLSNkZWZpbmUgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRAotI2RlZmluZSBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgMHg4NENFCi0jZGVmaW5lIEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0YKLSNkZWZpbmUgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMAotI2RlZmluZSBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgMHg4NEQxCi0jZGVmaW5lIEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAweDg0RDIKLSNkZWZpbmUgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMwotI2RlZmluZSBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ0Ci0jZGVmaW5lIEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAweDg0RDUKLSNkZWZpbmUgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDB4ODRENgotI2RlZmluZSBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ3Ci0jZGVmaW5lIEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAweDg0RDgKLSNkZWZpbmUgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOQotI2RlZmluZSBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgMHg4NERBCi0jZGVmaW5lIEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAweDg0REIKLSNkZWZpbmUgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQwotI2RlZmluZSBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgMHg4NERECi0jZGVmaW5lIEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAweDg0REUKLSNkZWZpbmUgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDB4ODRERgotCi0vKiBUZXh0dXJlV3JhcE1vZGUgKi8KLSNkZWZpbmUgR0xfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjkwMQotI2RlZmluZSBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgMHg4MTJGCi0KLS8qIFBpeGVsSW50ZXJuYWxGb3JtYXQgKi8KLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCOF9PRVMgICAgICAgICAgICAgIDB4OEI5MAotI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgMHg4QjkxCi0jZGVmaW5lIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAgICAgICAgICAweDhCOTIKLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQTRfT0VTICAgICAgICAgICAgIDB4OEI5MwotI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgMHg4Qjk0Ci0jZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjhfT0VTICAgICAgICAgICAgICAweDhCOTUKLSNkZWZpbmUgR0xfUEFMRVRURThfUkdCQThfT0VTICAgICAgICAgICAgIDB4OEI5NgotI2RlZmluZSBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgICAgICAgICAgMHg4Qjk3Ci0jZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE0X09FUyAgICAgICAgICAgICAweDhCOTgKLSNkZWZpbmUgR0xfUEFMRVRURThfUkdCNV9BMV9PRVMgICAgICAgICAgIDB4OEI5OQotCi0vKiBWZXJ0ZXhQb2ludGVyVHlwZSAqLwotLyogICAgICBHTF9TSE9SVCAqLwotLyogICAgICBHTF9GTE9BVCAqLwotLyogICAgICBHTF9GSVhFRCAqLwotLyogICAgICBHTF9CWVRFICovCi0KLS8qIExpZ2h0TmFtZSAqLwotI2RlZmluZSBHTF9MSUdIVDAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCi0jZGVmaW5lIEdMX0xJR0hUMSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDEKLSNkZWZpbmUgR0xfTElHSFQyICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMgotI2RlZmluZSBHTF9MSUdIVDMgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAzCi0jZGVmaW5lIEdMX0xJR0hUNCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDQKLSNkZWZpbmUgR0xfTElHSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNQotI2RlZmluZSBHTF9MSUdIVDYgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA2Ci0jZGVmaW5lIEdMX0xJR0hUNyAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDcKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBbHBoYUZ1bmMgKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFscGhhRnVuY3ggKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRUZXh0dXJlIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jIChHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyIChHTGJpdGZpZWxkIG1hc2spOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyQ29sb3IgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckNvbG9yeCAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyRGVwdGhmIChHTGNsYW1wZiBkZXB0aCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJEZXB0aHggKEdMY2xhbXB4IGRlcHRoKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhclN0ZW5jaWwgKEdMaW50IHMpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjRmIChHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR4IChHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvck1hc2sgKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDdWxsRmFjZSAoR0xlbnVtIG1vZGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoRnVuYyAoR0xlbnVtIGZ1bmMpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoTWFzayAoR0xib29sZWFuIGZsYWcpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoUmFuZ2VmIChHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhSYW5nZXggKEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlIChHTGVudW0gY2FwKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKEdMZW51bSBhcnJheSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0FycmF5cyAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHMgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGUgKEdMZW51bSBjYXApOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuYWJsZUNsaWVudFN0YXRlIChHTGVudW0gYXJyYXkpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZpbmlzaCAodm9pZCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmx1c2ggKHZvaWQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ2YgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2d4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ3h2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJvbnRGYWNlIChHTGVudW0gbW9kZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJ1c3R1bWYgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZydXN0dW14IChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5UZXh0dXJlcyAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKLUdMQVBJIEdMZW51bSBBUElFTlRSWSBnbEdldEVycm9yICh2b2lkKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnRlZ2VydiAoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLUdMQVBJIGNvbnN0IEdMdWJ5dGUgKiBBUElFTlRSWSBnbEdldFN0cmluZyAoR0xlbnVtIG5hbWUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEhpbnQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVsZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVsZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVseCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVseHYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodGYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodGZ2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodHggKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodHh2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaW5lV2lkdGggKEdMZmxvYXQgd2lkdGgpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpbmVXaWR0aHggKEdMZml4ZWQgd2lkdGgpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRJZGVudGl0eSAodm9pZCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZE1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRNYXRyaXh4IChjb25zdCBHTGZpeGVkICptKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2dpY09wIChHTGVudW0gb3Bjb2RlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbGYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFsZnYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWx4IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbHh2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeE1vZGUgKEdMZW51bSBtb2RlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0TWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqbSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdE1hdHJpeHggKGNvbnN0IEdMZml4ZWQgKm0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHggKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2YgKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbDN4IChHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsT3J0aG9mIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xPcnRob3ggKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsU3RvcmVpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFNpemUgKEdMZmxvYXQgc2l6ZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRTaXpleCAoR0xmaXhlZCBzaXplKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0IChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9seWdvbk9mZnNldHggKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb3BNYXRyaXggKHZvaWQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFB1c2hNYXRyaXggKHZvaWQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlYWRQaXhlbHMgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJvdGF0ZWYgKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJvdGF0ZXggKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdlIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2V4IChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2NhbGVmIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2FsZXggKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjaXNzb3IgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTaGFkZU1vZGVsIChHTGVudW0gbW9kZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbEZ1bmMgKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsTWFzayAoR0x1aW50IG1hc2spOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxPcCAoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52eCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZ4diAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFBhcmFtZXRlcnggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRyYW5zbGF0ZWYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRyYW5zbGF0ZXggKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWaWV3cG9ydCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19nbF9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1CU0QudHh0IGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1CU0QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTI0ZTNjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLVRoaXMgaXMgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvciB0aGUgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIg0KLU9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgc291cmNlIGNvZGUNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi1TYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlDQotQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIEpldHJvIExhdWhhDQotQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0NCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCi1hcmUgbWV0Og0KLQ0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0DQotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluDQotICAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLSAgICAgIGRpc3RyaWJ1dGlvbi4NCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBzb2Z0d2FyZSBwcm9kdWN0J3MgY29weXJpZ2h0IG93bmVyIG5vcg0KLSAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQ0KLSAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbg0KLSAgICAgIHBlcm1pc3Npb24uDQotDQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi1PV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi1TUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQNCi1UTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SDQotUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTDQotU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1MR1BMLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZTNmNWEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1MR1BMLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0JCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQotCi0gQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLVtUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKLSBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQotIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKLXNwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQotY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgotdGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKLXN0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKLW5vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKLXlvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKLWZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKLWl0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZgotaXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCi10aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQotcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCi15b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKLW9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKLXlvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKLWNvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKLWNvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKLWl0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKLWxpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCi1wZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KLQotICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKLXRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKLW1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwotdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCi1hdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKLWludHJvZHVjZWQgYnkgb3RoZXJzLgotDAotICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgotYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAotZWZmZWN0aXZlbHkgcmVzdHJpY3QgdGhlIHVzZXJzIG9mIGEgZnJlZSBwcm9ncmFtIGJ5IG9idGFpbmluZyBhCi1yZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAotYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQotY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIGZyZWVkb20gb2YgdXNlIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBsaWNlbnNlLCB0aGUgR05VIExlc3NlcgotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKLWlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCi10aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlCi1saWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KLQotICBXaGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBhIGxpYnJhcnksIHdoZXRoZXIgc3RhdGljYWxseSBvciB1c2luZwotYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCi1jb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhlcmVmb3JlIHBlcm1pdHMgc3VjaCBsaW5raW5nIG9ubHkgaWYgdGhlCi1lbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKLXRoZSBsaWJyYXJ5LgotCi0gIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSAiTGVzc2VyIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGJlY2F1c2UgaXQKLWRvZXMgTGVzcyB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKLW9mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKLWFyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQotbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgotc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgotCi0gIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCi1lbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQgYmVjb21lcwotYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdCBiZQotYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQotbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCi1jYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKLXNvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0KLSAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCi1wcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKLWZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KLW5vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQotb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKLXN5c3RlbS4KLQotICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQotdXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKLWxpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgotdGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBsYXR0ZXIgbXVzdAotYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCi0MCi0JCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKLXByb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCi1vdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCi1FYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCi1wcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKLSh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCi0KLSAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKLXdoaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCi1jb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQotcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAotc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwotaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKLQotICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwotYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKLWludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgotYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQotc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgotd3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcwotYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCi0gIAotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotDAotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCi0gICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKLSAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCi0gICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQotICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAotICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgotICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCi0gICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgotCi0gICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKLSAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKLSAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAotICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCi0gICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQotaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKLXdpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KLXRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KLXRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLWluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKLXRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KLXRoZXNlIG5vdGljZXMuCi0MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQwKLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKLSAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQotICAgIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLAotICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQotICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKLSAgICB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMKLSAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KLQotICAgIGMpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0Ci0gICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCi0gICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQotICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KLQotICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci0gICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCi0gICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgotCi0gICAgZSkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCi0gICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCi0KLSAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCi1MaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgotcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCi10aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcwotbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQwKLSAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKLWxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgotdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCi1wZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKLSAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5Ci0gICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgU2VjdGlvbnMgYWJvdmUuCi0KLSAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAotICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCi0gICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCi10aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQotYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKLXJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKLW9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQotc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aAotdGhpcyBMaWNlbnNlLgotDAotICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKLXBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKLWFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAotYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCi1zbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKLWV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCi13cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKLXZlcnNpb25zIG9mIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KLVN1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKLWJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCi0iYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCi1saWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQwKLSAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAotd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKLWNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCi1kZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCi1vZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZwotYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCi1XQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgotRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKLU9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCi1LSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCi1MSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQotVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCi1XUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQotQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKLUZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCi1MSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCi1SRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQotRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgotU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKLQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjA4NDFlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQ0KLUNvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGENCi1BbGwgcmlnaHRzIHJlc2VydmVkLg0KLVdlYjogaHR0cDovL2lraS5maS9qZXRyby8NCi0NCi1UaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoNCi0gICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KLSAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0DQotICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3Nlcg0KLSAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUNCi0gICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuDQotICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbg0KLSAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4NCi0NCi1UaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzDQotTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvc2hhcGVzLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9zaGFwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmZmFlOC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9zaGFwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCi0gKgotICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKLSAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgotICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQotICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgotICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgotICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgotICoKLSAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCi0gKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAkSWQ6IHNoYXBlcy5oLHYgMS42IDIwMDUvMDEvMzEgMjI6MTU6MzAgdG9uaWMgRXhwICQKLSAqICRSZXZpc2lvbjogMS42ICQKLSAqLwotCi0jaWZuZGVmIFNIQVBFU19IX0lOQ0xVREVECi0jZGVmaW5lIFNIQVBFU19IX0lOQ0xVREVECi0KLQotI2RlZmluZSBTVVBFUlNIQVBFX1BBUkFNUyAxNQotCi1zdGF0aWMgY29uc3QgZmxvYXQgc1N1cGVyU2hhcGVQYXJhbXNbXVtTVVBFUlNIQVBFX1BBUkFNU10gPQotewotICAgIC8vIG0gIGEgICAgIGIgICAgIG4xICAgICAgbjIgICAgIG4zICAgICBtICAgICBhICAgICBiICAgICBuMSAgICAgbjIgICAgICBuMyAgIHJlczEgcmVzMiBzY2FsZSAgKG9yZy5yZXMxLHJlczIpCi0gICAgeyAxMCwgMSwgICAgMiwgICAgOTAsICAgICAgMSwgICAtNDUsICAgIDgsICAgIDEsICAgIDEsICAgIC0xLCAgICAgMSwgIC0wLjRmLCAgIDIwLCAgMzAsIDIgfSwgLy8gNDAsIDYwCi0gICAgeyAxMCwgMSwgICAgMiwgICAgOTAsICAgICAgMSwgICAtNDUsICAgIDQsICAgIDEsICAgIDEsICAgIDEwLCAgICAgMSwgIC0wLjRmLCAgIDIwLCAgMjAsIDQgfSwgLy8gNDAsIDQwCi0gICAgeyAxMCwgMSwgICAgMiwgICAgNjAsICAgICAgMSwgICAtMTAsICAgIDQsICAgIDEsICAgIDEsICAgIC0xLCAgICAtMiwgIC0wLjRmLCAgIDQxLCAgNDEsIDEgfSwgLy8gODIsIDgyCi0gICAgeyAgNiwgMSwgICAgMSwgICAgNjAsICAgICAgMSwgICAtNzAsICAgIDgsICAgIDEsICAgIDEsICAwLjRmLCAgICAgMywgIDAuMjVmLCAgIDIwLCAgMjAsIDEgfSwgLy8gNDAsIDQwCi0gICAgeyAgNCwgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgMjAsICAgMTIsICAgIDEsICAgIDEsICAwLjRmLCAgICAgMywgIDAuMjVmLCAgIDEwLCAgMzAsIDEgfSwgLy8gMjAsIDYwCi0gICAgeyAgOCwgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgLTQsICAgIDgsICAgIDIsICAgIDEsICAgIC0xLCAgICAgNSwgICAwLjVmLCAgIDI1LCAgMjYsIDEgfSwgLy8gNjAsIDYwCi0gICAgeyAxMywgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgLTQsICAgMTMsICAgIDEsICAgIDEsICAgICAxLCAgICAgNSwgICAgICAxLCAgIDMwLCAgMzAsIDYgfSwgLy8gNjAsIDYwCi0gICAgeyAxMCwgMSwgMS4xZiwgLTAuNWYsICAgMC4xZiwgICAgNzAsICAgNjAsICAgIDEsICAgIDEsICAgLTkwLCAgICAgMCwgLTAuMjVmLCAgIDIwLCAgNjAsIDggfSwgLy8gNjAsIDE4MAotICAgIHsgIDcsIDEsICAgIDEsICAgIDIwLCAgLTAuM2YsIC0zLjVmLCAgICA2LCAgICAxLCAgICAxLCAgICAtMSwgIDQuNWYsICAgMC41ZiwgICAxMCwgIDIwLCA0IH0sIC8vIDYwLCA4MAotICAgIHsgIDQsIDEsICAgIDEsICAgIDEwLCAgICAgMTAsICAgIDEwLCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAxMCwgIDIwLCAxIH0sIC8vIDIwLCA0MAotICAgIHsgIDQsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICA0LCAgICAxLCAgICAxLCAgICAgMSwgICAgIDEsICAgICAgMSwgICAxMCwgIDEwLCAyIH0sIC8vIDEwLCAxMAotICAgIHsgIDEsIDEsICAgIDEsICAgIDM4LCAtMC4yNWYsICAgIDE5LCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAxMCwgIDE1LCAyIH0sIC8vIDIwLCA0MAotICAgIHsgIDIsIDEsICAgIDEsICAwLjdmLCAgIDAuM2YsICAwLjJmLCAgICAzLCAgICAxLCAgICAxLCAgIDEwMCwgICAxMDAsICAgIDEwMCwgICAxMCwgIDI1LCAyIH0sIC8vIDIwLCA1MAotICAgIHsgIDYsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICAzLCAgICAxLCAgICAxLCAgICAgMSwgICAgIDEsICAgICAgMSwgICAzMCwgIDMwLCAyIH0sIC8vIDYwLCA2MAotICAgIHsgIDMsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICA2LCAgICAxLCAgICAxLCAgICAgMiwgICAgIDEsICAgICAgMSwgICAxMCwgIDIwLCAyIH0sIC8vIDIwLCA0MAotICAgIHsgIDYsIDEsICAgIDEsICAgICA2LCAgIDUuNWYsICAgMTAwLCAgICA2LCAgICAxLCAgICAxLCAgICAyNSwgICAgMTAsICAgICAxMCwgICAzMCwgIDIwLCAyIH0sIC8vIDYwLCA0MAotICAgIHsgIDMsIDEsICAgIDEsICAwLjVmLCAgIDEuN2YsICAxLjdmLCAgICAyLCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAyMCwgIDIwLCAyIH0sIC8vIDQwLCA0MAotICAgIHsgIDUsIDEsICAgIDEsICAwLjFmLCAgIDEuN2YsICAxLjdmLCAgICAxLCAgICAxLCAgICAxLCAgMC4zZiwgIDAuNWYsICAgMC41ZiwgICAyMCwgIDIwLCA0IH0sIC8vIDQwLCA0MAotICAgIHsgIDIsIDEsICAgIDEsICAgICA2LCAgIDUuNWYsICAgMTAwLCAgICA2LCAgICAxLCAgICAxLCAgICAgNCwgICAgMTAsICAgICAxMCwgICAxMCwgIDIyLCAxIH0sIC8vIDQwLCA0MAotICAgIHsgIDYsIDEsICAgIDEsICAgIC0xLCAgICAgNzAsICAwLjFmLCAgICA5LCAgICAxLCAwLjVmLCAgIC05OCwgMC4wNWYsICAgIC00NSwgICAyMCwgIDMwLCA0IH0sIC8vIDYwLCA5MQotICAgIHsgIDYsIDEsICAgIDEsICAgIC0xLCAgICAgOTAsIC0wLjFmLCAgICA3LCAgICAxLCAgICAxLCAgICA5MCwgIDEuM2YsICAgICAzNCwgICAxMywgIDE2LCAxIH0sIC8vIDMyLCA2MAotfTsKLSNkZWZpbmUgU1VQRVJTSEFQRV9DT1VOVCAoc2l6ZW9mKHNTdXBlclNoYXBlUGFyYW1zKSAvIHNpemVvZihzU3VwZXJTaGFwZVBhcmFtc1swXSkpCi0KLQotI2VuZGlmIC8vICFTSEFQRVNfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2NvbmZpZ2R1bXAvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9jb25maWdkdW1wL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmN2M5MTUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2NvbmZpZ2R1bXAvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQljb25maWdkdW1wLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YxX0NNCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWNvbmZpZ2R1bXAKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvY29uZmlnZHVtcC9jb25maWdkdW1wLmNwcCBiL29wZW5nbC90ZXN0cy9jb25maWdkdW1wL2NvbmZpZ2R1bXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWI5ZWI2Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9jb25maWdkdW1wL2NvbmZpZ2R1bXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLQotI2RlZmluZSBBVFRSSUJVVEUoX2F0dHIpIHsgX2F0dHIsICNfYXR0ciB9Ci0KLXN0cnVjdCBBdHRyaWJ1dGUgewotICAgIEVHTGludCBhdHRyaWJ1dGU7Ci0gICAgY2hhciBjb25zdCogbmFtZTsKLX07Ci0KLUF0dHJpYnV0ZSBhdHRyaWJ1dGVzW10gPSB7Ci0gICAgICAgIEFUVFJJQlVURSggRUdMX0JVRkZFUl9TSVpFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0FMUEhBX1NJWkUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfQkxVRV9TSVpFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0dSRUVOX1NJWkUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfUkVEX1NJWkUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfREVQVEhfU0laRSApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9TVEVOQ0lMX1NJWkUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfQ09ORklHX0NBVkVBVCApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9DT05GSUdfSUQgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfTEVWRUwgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfTUFYX1BCVUZGRVJfSEVJR0hUICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX01BWF9QQlVGRkVSX1dJRFRIICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX01BWF9QQlVGRkVSX1BJWEVMUyApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9OQVRJVkVfUkVOREVSQUJMRSApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9OQVRJVkVfVklTVUFMX0lEICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX05BVElWRV9WSVNVQUxfVFlQRSApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9TQU1QTEVTICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX1NBTVBMRV9CVUZGRVJTICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX1NVUkZBQ0VfVFlQRSApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9UUkFOU1BBUkVOVF9UWVBFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfQklORF9UT19URVhUVVJFX1JHQkEgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfTUlOX1NXQVBfSU5URVJWQUwgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfTUFYX1NXQVBfSU5URVJWQUwgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfTFVNSU5BTkNFX1NJWkUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfQUxQSEFfTUFTS19TSVpFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0NPTE9SX0JVRkZFUl9UWVBFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX1JFTkRFUkFCTEVfVFlQRSApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9NQVRDSF9OQVRJVkVfUElYTUFQICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0NPTkZPUk1BTlQgKSwKLX07Ci0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIEVHTENvbmZpZyogY29uZmlnczsKLSAgICBFR0xpbnQgbjsKLQotICAgIEVHTERpc3BsYXkgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICBlZ2xJbml0aWFsaXplKGRweSwgMCwgMCk7Ci0gICAgZWdsR2V0Q29uZmlncyhkcHksIE5VTEwsIDAsICZuKTsKLSAgICBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tuXTsKLSAgICBlZ2xHZXRDb25maWdzKGRweSwgY29uZmlncywgbiwgJm4pOwotCi0gICAgZm9yIChFR0xpbnQgaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgIHByaW50ZigiRUdMQ29uZmlnWyVkXVxuIiwgaSk7Ci0gICAgICAgIGZvciAoaW50IGF0dHIgPSAwIDsgYXR0cjxzaXplb2YoYXR0cmlidXRlcykvc2l6ZW9mKEF0dHJpYnV0ZSkgOyBhdHRyKyspIHsKLSAgICAgICAgICAgIEVHTGludCB2YWx1ZTsKLSAgICAgICAgICAgIGVnbEdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZ3NbaV0sIGF0dHJpYnV0ZXNbYXR0cl0uYXR0cmlidXRlLCAmdmFsdWUpOwotICAgICAgICAgICAgcHJpbnRmKCJcdCUtMzJzOiAlMTBkICgweCUwOHgpXG4iLCBhdHRyaWJ1dGVzW2F0dHJdLm5hbWUsIHZhbHVlLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWxldGUgW10gY29uZmlnczsKLSAgICBlZ2xUZXJtaW5hdGUoZHB5KTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maWxscmF0ZS9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2ZpbGxyYXRlL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYWRlMjEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2ZpbGxyYXRlL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JZmlsbHJhdGUuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0JbGlidXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YxX0NNIFwKLSAgICBsaWJ1aQotCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBvcGVuZ2wtdGVzdHMtaW5jbHVkZXMpCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWZpbGxyYXRlCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbGxyYXRlL2ZpbGxyYXRlLmNwcCBiL29wZW5nbC90ZXN0cy9maWxscmF0ZS9maWxscmF0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MDg2NDcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2ZpbGxyYXRlL2ZpbGxyYXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNkZWZpbmUgTE9HX1RBRyAiZmlsbHJhdGUiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdG9wV2F0Y2guaD4KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgIkVHTFV0aWxzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCi17Ci0gICAgRUdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAwLAotICAgICAgICAgRUdMX05PTkUKLSAgICAgfTsKLSAgICAgCi0gICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgIEVHTENvbnRleHQgY29udGV4dDsKLSAgICAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgICAgRUdMU3VyZmFjZSBzdXJmYWNlOwotICAgICBFR0xpbnQgdywgaDsKLSAgICAgRUdMRGlzcGxheSBkcHk7Ci0KLSAgICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7Ci0gICAgIAotICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgICAgICAgCi0gICAgIHN0YXR1c190IGVyciA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coCi0gICAgICAgICAgICAgZHB5LCBjb25maWdBdHRyaWJzLCB3aW5kb3csICZjb25maWcpOwotICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGZpbmQgYW4gRUdMQ29uZmlnIG1hdGNoaW5nIHRoZSBzY3JlZW4gZm9ybWF0XG4iKTsKLSAgICAgICAgIHJldHVybiAwOwotICAgICB9Ci0KLSAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsIHdpbmRvdywgTlVMTCk7Ci0gICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKLSAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKLSAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7Ci0gICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKLSAgICAgCi0gICAgIHByaW50Zigidz0lZCwgaD0lZFxuIiwgdywgaCk7Ci0gICAgIAotICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOwotICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7Ci0gICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKLSAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICAgZ2xCbGVuZEZ1bmMoR0xfU1JDX0FMUEhBLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLSAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKLQotICAgICB1aW50MzJfdCogdDMyID0gKHVpbnQzMl90KiltYWxsb2MoNTEyKjUxMio0KTsgCi0gICAgIGZvciAoaW50IHk9MCA7IHk8NTEyIDsgeSsrKSB7Ci0gICAgICAgICBmb3IgKGludCB4PTAgOyB4PDUxMiA7IHgrKykgewotICAgICAgICAgICAgIGludCB1ID0geC0yNTY7Ci0gICAgICAgICAgICAgaW50IHYgPSB5LTI1NjsKLSAgICAgICAgICAgICBpZiAodSp1K3YqdiA8IDI1NioyNTYpIHsKLSAgICAgICAgICAgICAgICAgdDMyW3greSo1MTJdID0gMHgxMEZGRkZGRjsKLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICB0MzJbeCt5KjUxMl0gPSAweDIwRkYwMDAwOwotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgfQotCi0gICAgIGNvbnN0IEdMZmxvYXQgdmVydGljZXNbNF1bMl0gPSB7Ci0gICAgICAgICAgICAgeyAwLCAgMCB9LAotICAgICAgICAgICAgIHsgMCwgIGggfSwKLSAgICAgICAgICAgICB7IHcsICBoIH0sCi0gICAgICAgICAgICAgeyB3LCAgMCB9Ci0gICAgIH07Ci0KLSAgICAgY29uc3QgR0xmbG9hdCB0ZXhDb29yZHNbNF1bMl0gPSB7Ci0gICAgICAgICAgICAgeyAwLCAgMCB9LAotICAgICAgICAgICAgIHsgMCwgIDEgfSwKLSAgICAgICAgICAgICB7IDEsICAxIH0sCi0gICAgICAgICAgICAgeyAxLCAgMCB9Ci0gICAgIH07Ci0KLSAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDUxMiwgNTEyLCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCB0MzIpOwotCi0gICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0gICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKLSAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgZ2xPcnRob2YoMCwgdywgMCwgaCwgMCwgMSk7Ci0KLSAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwotICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgICBnbFZlcnRleFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIHZlcnRpY2VzKTsKLSAgICAgZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIHRleENvb3Jkcyk7Ci0KLSAgICAgZWdsU3dhcEludGVydmFsKGRweSwgMSk7Ci0KLSAgICAgZ2xDbGVhckNvbG9yKDEsMCwwLDApOwotICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsgCi0gICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgIAotCi0gICAgIG5zZWNzX3QgdGltZXNbMzJdOwotCi0gICAgIGZvciAoaW50IGM9MSA7IGM8MzIgOyBjKyspIHsKLSAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgICBmb3IgKGludCBpPTAgOyBpPGMgOyBpKyspIHsKLSAgICAgICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsgCi0gICAgICAgICB9Ci0gICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICB9Ci0KLQotICAgICAvLyAgICAgZm9yIChpbnQgYz0zMSA7IGM+PTEgOyBjLS0pIHsKLSAgICAgaW50IGo9MDsKLSAgICAgZm9yIChpbnQgYz0xIDsgYzwzMiA7IGMrKykgewotICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxjIDsgaSsrKSB7Ci0gICAgICAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7IAotICAgICAgICAgfQotICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgICAgIG5zZWNzX3QgdCA9IHN5c3RlbVRpbWUoKSAtIG5vdzsKLSAgICAgICAgIHRpbWVzW2orK10gPSB0OwotICAgICB9Ci0KLSAgICAgZm9yIChpbnQgYz0xLCBqPTAgOyBjPDMyIDsgYysrLCBqKyspIHsKLSAgICAgICAgIG5zZWNzX3QgdCA9IHRpbWVzW2pdOwotICAgICAgICAgcHJpbnRmKCIlbGxkXHQlZFx0JWZcbiIsIHQsIGMsIChkb3VibGUodCkvYykvMTAwMDAwMC4wKTsKLSAgICAgfQotCi0KLSAgICAgICAKLSAgICAgZWdsVGVybWluYXRlKGRweSk7Ci0gICAgIAotICAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maWx0ZXIvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9maWx0ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlNGQzOC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZmlsdGVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JZmlsdGVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YxX0NNIFwKLSAgICBsaWJ1aQotCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBvcGVuZ2wtdGVzdHMtaW5jbHVkZXMpCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWZpbHRlcgotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbHRlci9maWx0ZXIuY3BwIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9maWx0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY3MzI3Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9maWx0ZXIvZmlsdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotI2RlZmluZSBVU0VfRFJBV19URVhUVVJFIDEKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIGlmIChhcmdjIT0yICYmIGFyZ2MhPTMpIHsKLSAgICAgICAgcHJpbnRmKCJ1c2FnZTogJXMgPDAtNj4gW3BidWZmZXJdXG4iLCBhcmd2WzBdKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIGNvbnN0IGludCB0ZXN0ID0gYXRvaShhcmd2WzFdKTsKLSAgICBpbnQgdXNlUGJ1ZmZlciA9IGFyZ2M9PTMgJiYgIXN0cmNtcChhcmd2WzJdLCAicGJ1ZmZlciIpOwotICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9QQlVGRkVSX0JJVHxFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKLSAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKLSAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKLSAgICAgICAgIEVHTF9OT05FCi0gICAgIH07Ci0gICAgIAotICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOwotICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgICBFR0xDb25maWcgY29uZmlnOwotICAgICBFR0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICAgRUdMaW50IHcsIGg7Ci0gICAgIAotICAgICBFR0xEaXNwbGF5IGRweTsKLQotICAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyA9IDA7Ci0gICAgIGlmICghdXNlUGJ1ZmZlcikgewotICAgICAgICAgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOwotICAgICB9Ci0gICAgIAotICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgIGlmICghdXNlUGJ1ZmZlcikgewotICAgICAgICAgRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdygKLSAgICAgICAgICAgICAgICAgZHB5LCBzX2NvbmZpZ0F0dHJpYnMsIHdpbmRvdywgJmNvbmZpZyk7Ci0gICAgICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywgd2luZG93LCBOVUxMKTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgIHByaW50ZigidXNpbmcgcGJ1ZmZlclxuIik7Ci0gICAgICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKLSAgICAgICAgIEVHTGludCBhdHRyaWJzW10gPSB7IEVHTF9XSURUSCwgMzIwLCBFR0xfSEVJR0hULCA0ODAsIEVHTF9OT05FIH07Ci0gICAgICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoZHB5LCBjb25maWcsIGF0dHJpYnMpOwotICAgICAgICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgICAgICBwcmludGYoImVnbENyZWF0ZVBidWZmZXJTdXJmYWNlIGVycm9yICV4XG4iLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgIH0KLSAgICAgfQotICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7Ci0gICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCi0gICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOwotICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0gICAgIEdMaW50IGRpbSA9IHc8aCA/IHcgOiBoOwotCi0gICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0gICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKLSAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgZ2xPcnRob2YoMCwgdywgMCwgaCwgMCwgMSk7Ci0KLSAgICAgZ2xDbGVhckNvbG9yKDAsMCwwLDApOwotICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDQsIDQsIC00IH07Ci0gICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7Ci0gICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKLQotICAgICAvLyBwYWNraW5nIGlzIGFsd2F5cyA0Ci0gICAgIHVpbnQ4X3QgdDhbXSAgPSB7IAotICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAotICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYsCi0gICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCi0gICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiAgfTsKLQotICAgICB1aW50MTZfdCB0MTZbXSAgPSB7IAotICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCi0gICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGLAotICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCi0gICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGICB9OwotCi0gICAgIHVpbnQxNl90IHQ1NTUxW10gID0geyAKLSAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAotICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwKLSAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAotICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCAgfTsKLQotICAgICB1aW50MzJfdCB0MzJbXSAgPSB7IAotICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIAotICAgICAgICAgICAgIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIAotICAgICAgICAgICAgIDB4RkYwMEZGRkYsIDB4RkYwMEZGMDAsIDB4MDBGRjAwRkYsIDB4RkZGRkZGMDAsIAotICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkZGRjAwRkYsIDB4RkYwMEZGRkYsIDB4RkZGRkZGRkYKLSAgICAgfTsKLQotICAgICBzd2l0Y2godGVzdCkgCi0gICAgIHsKLSAgICAgY2FzZSAxOgotICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0xVTUlOQU5DRSwKLSAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfTFVNSU5BTkNFLCBHTF9VTlNJR05FRF9CWVRFLCB0OCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgY2FzZSAyOgotICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKLSAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdDE2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIDM6Ci0gICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKLSAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgdDE2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIDQ6Ci0gICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfTFVNSU5BTkNFX0FMUEhBLAotICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9MVU1JTkFOQ0VfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIHQxNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgY2FzZSA1OgotICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCi0gICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEsIHQ1NTUxKTsKLSAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIDY6Ci0gICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKLSAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgdDMyKTsKLSAgICAgICAgIGJyZWFrOwotICAgICB9Ci0KLSAgICAgLy9nbERyYXdUZXhpT0VTKDAsIDAsIDAsIGRpbSwgZGltKTsKLSAgICAgCi0gICAgIGNvbnN0IEdMZmxvYXQgdmVydGljZXNbNF1bMl0gPSB7Ci0gICAgICAgICAgICAgeyAwLCAgICAwICAgfSwKLSAgICAgICAgICAgICB7IDAsICAgIGRpbSB9LAotICAgICAgICAgICAgIHsgZGltLCAgZGltIH0sCi0gICAgICAgICAgICAgeyBkaW0sICAwICAgfQotICAgICB9OwotCi0gICAgIGNvbnN0IEdMZmxvYXQgdGV4Q29vcmRzWzRdWzJdID0gewotICAgICAgICAgICAgIHsgMCwgIDAgfSwKLSAgICAgICAgICAgICB7IDAsICAxIH0sCi0gICAgICAgICAgICAgeyAxLCAgMSB9LAotICAgICAgICAgICAgIHsgMSwgIDAgfQotICAgICB9OwotICAgICAKLSAgICAgaWYgKCF1c2VQYnVmZmVyKSB7Ci0gICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICB9Ci0gICAgIAotICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLSAgICAgZ2xTY2lzc29yKDAsZGltLGRpbSxoLWRpbSk7Ci0gICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgICAKLSAgICAgZm9yIChpbnQgeT0wIDsgeTxkaW0gOyB5KyspIHsKLSAgICAgICAgIC8vZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgICAgICAvL2dsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0KLSNpZiBVU0VfRFJBV19URVhUVVJFICYmIEdMX09FU19kcmF3X3RleHR1cmUKLSAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgeSwgMSwgZGltLCBkaW0pOwotI2Vsc2UKLSAgICAgICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgICAgICBnbFRyYW5zbGF0ZWYoMCwgeSwgMCk7Ci0gICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7Ci0gICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX0ZMT0FULCAwLCB2ZXJ0aWNlcyk7Ci0gICAgICAgICBnbFRleENvb3JkUG9pbnRlcigyLCBHTF9GTE9BVCwgMCwgdGV4Q29vcmRzKTsKLSAgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotI2VuZGlmCi0KLSAgICAgICAgIGlmICghdXNlUGJ1ZmZlcikgewotICAgICAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGdsRmluaXNoKCk7Ci0gICAgICAgICB9Ci0gICAgIH0KLQotICAgICBlZ2xUZXJtaW5hdGUoZHB5KTsKLSAgICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmluaXNoL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOGFkY2EuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWZpbmlzaC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLQlsaWJ1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjFfQ00gXAotICAgIGxpYnVpCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZmluaXNoCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX0NGTEFHUyA6PSAtREdMX0dMRVhUX1BST1RPVFlQRVMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmluaXNoL2ZpbmlzaC5jcHAgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL2ZpbmlzaC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjBjMjIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9maW5pc2guY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgIkVHTFV0aWxzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCi17Ci0gICAgRUdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAwLAotICAgICAgICAgRUdMX05PTkUKLSAgICAgfTsKLSAgICAgCi0gICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgIEVHTENvbnRleHQgY29udGV4dDsKLSAgICAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgICAgRUdMU3VyZmFjZSBzdXJmYWNlOwotICAgICBFR0xpbnQgdywgaDsKLSAgICAgRUdMRGlzcGxheSBkcHk7Ci0KLSAgICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7Ci0gICAgIAotICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgICAgICAgCi0gICAgIHN0YXR1c190IGVyciA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coCi0gICAgICAgICAgICAgZHB5LCBjb25maWdBdHRyaWJzLCB3aW5kb3csICZjb25maWcpOwotICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGZpbmQgYW4gRUdMQ29uZmlnIG1hdGNoaW5nIHRoZSBzY3JlZW4gZm9ybWF0XG4iKTsKLSAgICAgICAgIHJldHVybiAwOwotICAgICB9Ci0KLSAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsIHdpbmRvdywgTlVMTCk7Ci0gICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKLSAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKLSAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7Ci0gICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKLSAgICAgR0xpbnQgZGltID0gdzxoID8gdyA6IGg7Ci0KLSAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwotICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwotICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOwotICAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKLSAgICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOwotCi0gICAgIGxvbmcgbG9uZyBub3csIHQ7Ci0gICAgIGludCBpOwotCi0gICAgIGNoYXIqIHRleGVscyA9IChjaGFyKiltYWxsb2MoNTEyKjUxMioyKTsKLSAgICAgbWVtc2V0KHRleGVscywweEZGLDUxMio1MTIqMik7Ci0gICAgIAotICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLAotICAgICAgICAgICAgIDUxMiwgNTEyLCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCB0ZXhlbHMpOwotCi0gICAgIGNoYXIqIGRzdCA9IChjaGFyKiltYWxsb2MoMzIwKjQ4MCoyKTsKLSAgICAgbWVtc2V0KGRzdCwgMCwgMzIwKjQ4MCoyKTsKLSAgICAgcHJpbnRmKCIzMDcyMDAgYnl0ZXMgbWVtY3B5XG4iKTsKLSAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKLSAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIG1lbWNweShkc3QsIHRleGVscywgMzIwKjQ4MCoyKTsKLSAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBwcmludGYoIm1lbWNweSgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOwotICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgIH0KLSAgICAgZnJlZShkc3QpOwotCi0gICAgIGZyZWUodGV4ZWxzKTsKLQotICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIC0yMCk7Ci0gICAgIAotICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCA1MTJ4NTEyIGJsaXQ6XG4iKTsKLSAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKLSAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07Ci0gICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7Ci0gICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKLSAgICAgICAgIGdsRmluaXNoKCk7Ci0gICAgICAgICB0ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOwotICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICB9Ci0gICAgIAotICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCAxeDEgYmxpdDpcbiIpOwotICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgewotICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKLSAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKLSAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7Ci0gICAgICAgICBnbEZpbmlzaCgpOwotICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKLSAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgfQotICAgICAKLSAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0ICh4Mik6XG4iKTsKLSAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKLSAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07Ci0gICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7Ci0gICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKLSAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgNTEyLCA1MTIpOwotICAgICAgICAgZ2xGaW5pc2goKTsKLSAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7Ci0gICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgIH0KLQotICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCAxeDEgYmxpdCAoeDIpOlxuIik7Ci0gICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7Ci0gICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OwotICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOwotICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKLSAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7Ci0gICAgICAgICBnbEZpbmlzaCgpOwotICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKLSAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgfQotCi0gICAgIAotICAgICBwcmludGYoIjUxMng1MTIgKDF4MSB0ZXhlbCBNT0RJRklFRCB0ZXh0dXJlKSwgNTEyeDUxMiBibGl0OlxuIik7Ci0gICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7Ci0gICAgICAgICB1aW50MTZfdCBncmVlbiA9IDB4N0UwOwotICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNTEyLCA1MTIsIC01MTIgfTsKLSAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKLSAgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCAxLCAxLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmZ3JlZW4pOwotICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7Ci0gICAgICAgICBnbEZpbmlzaCgpOwotICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKLSAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgfQotCi0KLSAgICAgaW50MTZfdCB0ZXhlbCA9IDB4RjgwMDsKLSAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKLSAgICAgICAgICAgICAxLCAxLCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmdGV4ZWwpOwotCi0gICAgIHByaW50ZigiMXgxIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQ6XG4iKTsKLSAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKLSAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07Ci0gICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7Ci0gICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOwotICAgICAgICAgZ2xGaW5pc2goKTsKLSAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7Ci0gICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICB9Ci0KLSAgICAgcHJpbnRmKCIxeDEgdW5tb2RpZmllZCB0ZXh0dXJlLCA1MTJ4NTEyIGJsaXQ6XG4iKTsKLSAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKLSAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07Ci0gICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7Ci0gICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKLSAgICAgICAgIGdsRmluaXNoKCk7Ci0gICAgICAgICB0ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOwotICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICB9Ci0KLSAgICAgcHJpbnRmKCIxeDEgKDF4MSB0ZXhlbCBNT0RJRklFRCB0ZXh0dXJlKSwgNTEyeDUxMiBibGl0OlxuIik7Ci0gICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7Ci0gICAgICAgICB1aW50MTZfdCBncmVlbiA9IDB4N0UwOwotICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKLSAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKLSAgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCAxLCAxLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmZ3JlZW4pOwotICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKLSAgICAgICAgIGdsRmluaXNoKCk7Ci0gICAgICAgICB0ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOwotICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICB9Ci0KLSAgICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2Jhc2ljL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2wyX2Jhc2ljL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ODE5YTEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsMl9iYXNpYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWdsMl9iYXNpYy5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLSAgICBsaWJFR0wgXAotICAgIGxpYkdMRVN2MiBcCi0gICAgbGlidWkKLQotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1nbDJfYmFzaWMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfYmFzaWMvZ2wyX2Jhc2ljLmNwcCBiL29wZW5nbC90ZXN0cy9nbDJfYmFzaWMvZ2wyX2Jhc2ljLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAwNzg3MS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2Jhc2ljL2dsMl9iYXNpYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgIkVHTFV0aWxzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1zdGF0aWMgdm9pZCBwcmludEdMU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEdMZW51bSBzKSB7Ci0gICAgLy8gZnByaW50ZihzdGRlcnIsICJwcmludEdMU3RyaW5nICVzLCAlZFxuIiwgbmFtZSwgcyk7Ci0gICAgY29uc3QgY2hhciAqdiA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKHMpOwotICAgIC8vIGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsKLSAgICAvLyBmcHJpbnRmKHN0ZGVyciwgImdsR2V0RXJyb3IoKSA9ICVkLCByZXN1bHQgb2YgZ2xHZXRTdHJpbmcgPSAleFxuIiwgZXJyb3IsCi0gICAgLy8gICAgICAgICh1bnNpZ25lZCBpbnQpIHYpOwotICAgIC8vIGlmICgodiA8IChjb25zdCBjaGFyKikgMCkgfHwgKHYgPiAoY29uc3QgY2hhciopIDB4MTAwMDApKQotICAgIC8vICAgIGZwcmludGYoc3RkZXJyLCAiR0wgJXMgPSAlc1xuIiwgbmFtZSwgdik7Ci0gICAgLy8gZWxzZQotICAgIC8vICAgIGZwcmludGYoc3RkZXJyLCAiR0wgJXMgPSAobnVsbCkgMHglMDh4XG4iLCBuYW1lLCAodW5zaWduZWQgaW50KSB2KTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkdMICVzID0gJXNcbiIsIG5hbWUsIHYpOwotfQotCi1zdGF0aWMgdm9pZCBjaGVja0VnbEVycm9yKGNvbnN0IGNoYXIqIG9wLCBFR0xCb29sZWFuIHJldHVyblZhbCA9IEVHTF9UUlVFKSB7Ci0gICAgaWYgKHJldHVyblZhbCAhPSBFR0xfVFJVRSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCkgcmV0dXJuZWQgJWRcbiIsIG9wLCByZXR1cm5WYWwpOwotICAgIH0KLQotICAgIGZvciAoRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsgZXJyb3IgIT0gRUdMX1NVQ0NFU1M7IGVycm9yCi0gICAgICAgICAgICA9IGVnbEdldEVycm9yKCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGVnbEVycm9yICVzICgweCV4KVxuIiwgb3AsIEVHTFV0aWxzOjpzdHJlcnJvcihlcnJvciksCi0gICAgICAgICAgICAgICAgZXJyb3IpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKSB7Ci0gICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCi0gICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZ2xFcnJvciAoMHgleClcbiIsIG9wLCBlcnJvcik7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciBnVmVydGV4U2hhZGVyW10gPSAiYXR0cmlidXRlIHZlYzQgdlBvc2l0aW9uO1xuIgotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgZ2xfUG9zaXRpb24gPSB2UG9zaXRpb247XG4iCi0gICAgIn1cbiI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGdGcmFnbWVudFNoYWRlcltdID0gInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDEuMCwgMC4wLCAxLjApO1xuIgotICAgICJ9XG4iOwotCi1HTHVpbnQgbG9hZFNoYWRlcihHTGVudW0gc2hhZGVyVHlwZSwgY29uc3QgY2hhciogcFNvdXJjZSkgewotICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKLSAgICBpZiAoc2hhZGVyKSB7Ci0gICAgICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgJnBTb3VyY2UsIE5VTEwpOwotICAgICAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgR0xpbnQgY29tcGlsZWQgPSAwOwotICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlZCk7Ci0gICAgICAgIGlmICghY29tcGlsZWQpIHsKLSAgICAgICAgICAgIEdMaW50IGluZm9MZW4gPSAwOwotICAgICAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOwotICAgICAgICAgICAgaWYgKGluZm9MZW4pIHsKLSAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIGluZm9MZW4sIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyICVkOlxuJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyVHlwZSwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNoYWRlcjsKLX0KLQotR0x1aW50IGNyZWF0ZVByb2dyYW0oY29uc3QgY2hhciogcFZlcnRleFNvdXJjZSwgY29uc3QgY2hhciogcEZyYWdtZW50U291cmNlKSB7Ci0gICAgR0x1aW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgcFZlcnRleFNvdXJjZSk7Ci0gICAgaWYgKCF2ZXJ0ZXhTaGFkZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgR0x1aW50IHBpeGVsU2hhZGVyID0gbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIHBGcmFnbWVudFNvdXJjZSk7Ci0gICAgaWYgKCFwaXhlbFNoYWRlcikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtKSB7Ci0gICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIiKTsKLSAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgcGl4ZWxTaGFkZXIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIik7Ci0gICAgICAgIGdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgIEdMaW50IGxpbmtTdGF0dXMgPSBHTF9GQUxTRTsKLSAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZsaW5rU3RhdHVzKTsKLSAgICAgICAgaWYgKGxpbmtTdGF0dXMgIT0gR0xfVFJVRSkgewotICAgICAgICAgICAgR0xpbnQgYnVmTGVuZ3RoID0gMDsKLSAgICAgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwgJmJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoYnVmTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoYnVmTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSwgYnVmTGVuZ3RoLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBsaW5rIHByb2dyYW06XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgIHByb2dyYW0gPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm9ncmFtOwotfQotCi1HTHVpbnQgZ1Byb2dyYW07Ci1HTHVpbnQgZ3ZQb3NpdGlvbkhhbmRsZTsKLQotYm9vbCBzZXR1cEdyYXBoaWNzKGludCB3LCBpbnQgaCkgewotICAgIGdQcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnVmVydGV4U2hhZGVyLCBnRnJhZ21lbnRTaGFkZXIpOwotICAgIGlmICghZ1Byb2dyYW0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBndlBvc2l0aW9uSGFuZGxlID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihnUHJvZ3JhbSwgInZQb3NpdGlvbiIpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZ2xHZXRBdHRyaWJMb2NhdGlvbihcInZQb3NpdGlvblwiKSA9ICVkXG4iLAotICAgICAgICAgICAgZ3ZQb3NpdGlvbkhhbmRsZSk7Ci0KLSAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xWaWV3cG9ydCIpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBHTGZsb2F0IGdUcmlhbmdsZVZlcnRpY2VzW10gPSB7IDAuMGYsIDAuNWYsIC0wLjVmLCAtMC41ZiwKLSAgICAgICAgMC41ZiwgLTAuNWYgfTsKLQotdm9pZCByZW5kZXJGcmFtZSgpIHsKLSAgICBnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMS4wZiwgMS4wZik7Ci0gICAgY2hlY2tHbEVycm9yKCJnbENsZWFyQ29sb3IiKTsKLSAgICBnbENsZWFyKCBHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbENsZWFyIik7Ci0KLSAgICBnbFVzZVByb2dyYW0oZ1Byb2dyYW0pOwotICAgIGNoZWNrR2xFcnJvcigiZ2xVc2VQcm9ncmFtIik7Ci0KLSAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoZ3ZQb3NpdGlvbkhhbmRsZSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCBnVHJpYW5nbGVWZXJ0aWNlcyk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFZlcnRleEF0dHJpYlBvaW50ZXIiKTsKLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGd2UG9zaXRpb25IYW5kbGUpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSIpOwotICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIDMpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xEcmF3QXJyYXlzIik7Ci19Ci0KLXZvaWQgcHJpbnRFR0xDb25maWd1cmF0aW9uKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnKSB7Ci0KLSNkZWZpbmUgWChWQUwpIHtWQUwsICNWQUx9Ci0gICAgc3RydWN0IHtFR0xpbnQgYXR0cmlidXRlOyBjb25zdCBjaGFyKiBuYW1lO30gbmFtZXNbXSA9IHsKLSAgICBYKEVHTF9CVUZGRVJfU0laRSksCi0gICAgWChFR0xfQUxQSEFfU0laRSksCi0gICAgWChFR0xfQkxVRV9TSVpFKSwKLSAgICBYKEVHTF9HUkVFTl9TSVpFKSwKLSAgICBYKEVHTF9SRURfU0laRSksCi0gICAgWChFR0xfREVQVEhfU0laRSksCi0gICAgWChFR0xfU1RFTkNJTF9TSVpFKSwKLSAgICBYKEVHTF9DT05GSUdfQ0FWRUFUKSwKLSAgICBYKEVHTF9DT05GSUdfSUQpLAotICAgIFgoRUdMX0xFVkVMKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1BJWEVMUyksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfV0lEVEgpLAotICAgIFgoRUdMX05BVElWRV9SRU5ERVJBQkxFKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX0lEKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX1RZUEUpLAotICAgIFgoRUdMX1NBTVBMRVMpLAotICAgIFgoRUdMX1NBTVBMRV9CVUZGRVJTKSwKLSAgICBYKEVHTF9TVVJGQUNFX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSksCi0gICAgWChFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBKSwKLSAgICBYKEVHTF9NSU5fU1dBUF9JTlRFUlZBTCksCi0gICAgWChFR0xfTUFYX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX0xVTUlOQU5DRV9TSVpFKSwKLSAgICBYKEVHTF9BTFBIQV9NQVNLX1NJWkUpLAotICAgIFgoRUdMX0NPTE9SX0JVRkZFUl9UWVBFKSwKLSAgICBYKEVHTF9SRU5ERVJBQkxFX1RZUEUpLAotICAgIFgoRUdMX0NPTkZPUk1BTlQpLAotICAgfTsKLSN1bmRlZiBYCi0KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihuYW1lcykgLyBzaXplb2YobmFtZXNbMF0pOyBqKyspIHsKLSAgICAgICAgRUdMaW50IHZhbHVlID0gLTE7Ci0gICAgICAgIEVHTGludCByZXR1cm5WYWwgPSBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIG5hbWVzW2pdLmF0dHJpYnV0ZSwgJnZhbHVlKTsKLSAgICAgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKHJldHVyblZhbCAmJiBlcnJvciA9PSBFR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgcHJpbnRmKCIgJXM6ICIsIG5hbWVzW2pdLm5hbWUpOwotICAgICAgICAgICAgcHJpbnRmKCIlZCAoMHgleCkiLCB2YWx1ZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotaW50IHByaW50RUdMQ29uZmlndXJhdGlvbnMoRUdMRGlzcGxheSBkcHkpIHsKLSAgICBFR0xpbnQgbnVtQ29uZmlnID0gMDsKLSAgICBFR0xpbnQgcmV0dXJuVmFsID0gZWdsR2V0Q29uZmlncyhkcHksIE5VTEwsIDAsICZudW1Db25maWcpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldENvbmZpZ3MiLCByZXR1cm5WYWwpOwotICAgIGlmICghcmV0dXJuVmFsKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcmludGYoIk51bWJlciBvZiBFR0wgY29uZmlndXJhdGlvbjogJWRcbiIsIG51bUNvbmZpZyk7Ci0KLSAgICBFR0xDb25maWcqIGNvbmZpZ3MgPSAoRUdMQ29uZmlnKikgbWFsbG9jKHNpemVvZihFR0xDb25maWcpICogbnVtQ29uZmlnKTsKLSAgICBpZiAoISBjb25maWdzKSB7Ci0gICAgICAgIHByaW50ZigiQ291bGQgbm90IGFsbG9jYXRlIGNvbmZpZ3MuXG4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVyblZhbCA9IGVnbEdldENvbmZpZ3MoZHB5LCBjb25maWdzLCBudW1Db25maWcsICZudW1Db25maWcpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldENvbmZpZ3MiLCByZXR1cm5WYWwpOwotICAgIGlmICghcmV0dXJuVmFsKSB7Ci0gICAgICAgIGZyZWUoY29uZmlncyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnOyBpKyspIHsKLSAgICAgICAgcHJpbnRmKCJDb25maWd1cmF0aW9uICVkXG4iLCBpKTsKLSAgICAgICAgcHJpbnRFR0xDb25maWd1cmF0aW9uKGRweSwgY29uZmlnc1tpXSk7Ci0gICAgfQotCi0gICAgZnJlZShjb25maWdzKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAgRUdMQm9vbGVhbiByZXR1cm5WYWx1ZTsKLSAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07Ci0KLSAgICBFR0xpbnQgY29udGV4dF9hdHRyaWJzW10gPSB7IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0xfTk9ORSB9OwotICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAotICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICAgICAgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgRUdMQ29udGV4dCBjb250ZXh0OwotICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICBFR0xpbnQgdywgaDsKLQotICAgIEVHTERpc3BsYXkgZHB5OwotCi0gICAgY2hlY2tFZ2xFcnJvcigiPGluaXQ+Iik7Ci0gICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXREaXNwbGF5Iik7Ci0gICAgaWYgKGRweSA9PSBFR0xfTk9fRElTUExBWSkgewotICAgICAgICBwcmludGYoImVnbEdldERpc3BsYXkgcmV0dXJuZWQgRUdMX05PX0RJU1BMQVkuXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuVmFsdWUgPSBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsSW5pdGlhbGl6ZSIsIHJldHVyblZhbHVlKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVHTCB2ZXJzaW9uICVkLiVkXG4iLCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbik7Ci0gICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHByaW50ZigiZWdsSW5pdGlhbGl6ZSBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoIXByaW50RUdMQ29uZmlndXJhdGlvbnMoZHB5KSkgewotICAgICAgICBwcmludGYoInByaW50RUdMQ29uZmlndXJhdGlvbnMgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY2hlY2tFZ2xFcnJvcigicHJpbnRFR0xDb25maWd1cmF0aW9ucyIpOwotCi0gICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7DQotICAgIHJldHVyblZhbHVlID0gRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyhkcHksIHNfY29uZmlnQXR0cmlicywgd2luZG93LCAmbXlDb25maWcpOwotICAgIGlmIChyZXR1cm5WYWx1ZSkgewotICAgICAgICBwcmludGYoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coKSByZXR1cm5lZCAlZCIsIHJldHVyblZhbHVlKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY2hlY2tFZ2xFcnJvcigiRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyIpOwotCi0gICAgcHJpbnRmKCJDaG9zZSB0aGlzIGNvbmZpZ3VyYXRpb246XG4iKTsKLSAgICBwcmludEVHTENvbmZpZ3VyYXRpb24oZHB5LCBteUNvbmZpZyk7Ci0KLSAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIG15Q29uZmlnLCB3aW5kb3csIE5VTEwpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZVdpbmRvd1N1cmZhY2UiKTsKLSAgICBpZiAoc3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICBwcmludGYoImdlbENyZWF0ZVdpbmRvd1N1cmZhY2UgZmFpbGVkLlxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgbXlDb25maWcsIEVHTF9OT19DT05URVhULCBjb250ZXh0X2F0dHJpYnMpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZUNvbnRleHQiKTsKLSAgICBpZiAoY29udGV4dCA9PSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICBwcmludGYoImVnbENyZWF0ZUNvbnRleHQgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVyblZhbHVlID0gZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xNYWtlQ3VycmVudCIsIHJldHVyblZhbHVlKTsKLSAgICBpZiAocmV0dXJuVmFsdWUgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOwotICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKLSAgICBHTGludCBkaW0gPSB3IDwgaCA/IHcgOiBoOwotCi0gICAgZnByaW50ZihzdGRlcnIsICJXaW5kb3cgZGltZW5zaW9uczogJWQgeCAlZFxuIiwgdywgaCk7Ci0KLSAgICBwcmludEdMU3RyaW5nKCJWZXJzaW9uIiwgR0xfVkVSU0lPTik7Ci0gICAgcHJpbnRHTFN0cmluZygiVmVuZG9yIiwgR0xfVkVORE9SKTsKLSAgICBwcmludEdMU3RyaW5nKCJSZW5kZXJlciIsIEdMX1JFTkRFUkVSKTsKLSAgICBwcmludEdMU3RyaW5nKCJFeHRlbnNpb25zIiwgR0xfRVhURU5TSU9OUyk7Ci0KLSAgICBpZighc2V0dXBHcmFwaGljcyh3LCBoKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBzZXQgdXAgZ3JhcGhpY3MuXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgZm9yICg7OykgewotICAgICAgICByZW5kZXJGcmFtZSgpOwotICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xTd2FwQnVmZmVycyIpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9jYW1lcmFleWUvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbDJfY2FtZXJhZXllL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNDNhOWUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsMl9jYW1lcmFleWUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLSMgT25seSBjb21waWxlIHNvdXJjZSBqYXZhIGZpbGVzIGluIHRoaXMgYXBrLgotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gR0wyQ2FtZXJhRXllCi0KLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCi0KLSMgVXNlIHRoZSBmb2xsb3dpbmcgaW5jbHVkZSB0byBtYWtlIG91ciB0ZXN0IGFway4KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfY2FtZXJhZXllL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvZ2wyX2NhbWVyYWV5ZS9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTNmN2JlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfY2FtZXJhZXllL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBEZWNsYXJlIHRoZSBjb250ZW50cyBvZiB0aGlzIEFuZHJvaWQgYXBwbGljYXRpb24uICBUaGUgbmFtZXNwYWNlCi0gICAgIGF0dHJpYnV0ZSBicmluZ3MgaW4gdGhlIEFuZHJvaWQgcGxhdGZvcm0gbmFtZXNwYWNlLCBhbmQgdGhlIHBhY2thZ2UKLSAgICAgc3VwcGxpZXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiAgV2hlbiB3cml0aW5nIHlvdXIKLSAgICAgb3duIGFwcGxpY2F0aW9uLCB0aGUgcGFja2FnZSBuYW1lIG11c3QgYmUgY2hhbmdlZCBmcm9tICJjb20uZXhhbXBsZS4qIgotICAgICB0byBjb21lIGZyb20gYSBkb21haW4gdGhhdCB5b3Ugb3duIG9yIGhhdmUgY29udHJvbCBvdmVyLiAtLT4KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZ2wyY2FtZXJhZXllIj4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQSIgLz4KLSAgICA8dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEiIC8+Ci0gICAgPHVzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmF1dG9mb2N1cyIgLz4KLSAgICA8dXNlcy1mZWF0dXJlIGFuZHJvaWQ6Z2xFc1ZlcnNpb249IjB4MDAwMjAwMDAiIC8+Ci0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZ2wyY2FtZXJhZXllX25hbWUiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJHTDJDYW1lcmFFeWUiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfY2FtZXJhZXllL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9vcGVuZ2wvdGVzdHMvZ2wyX2NhbWVyYWV5ZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODZiOTMwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfY2FtZXJhZXllL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLQotICAgIDxzdHJpbmcgbmFtZT0iZ2wyY2FtZXJhZXllX25hbWUiPkdMMkNhbWVyYUV5ZTwvc3RyaW5nPgotCi08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfY2FtZXJhZXllL3NyYy9jb20vYW5kcm9pZC9nbDJjYW1lcmFleWUvR0wyQ2FtZXJhRXllLmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2wyX2NhbWVyYWV5ZS9zcmMvY29tL2FuZHJvaWQvZ2wyY2FtZXJhZXllL0dMMkNhbWVyYUV5ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjFlNGM1Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfY2FtZXJhZXllL3NyYy9jb20vYW5kcm9pZC9nbDJjYW1lcmFleWUvR0wyQ2FtZXJhRXllLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZ2wyY2FtZXJhZXllOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLWltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKLQotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTEVTMjA7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFV0aWxzOwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLk1hdHJpeDsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3VyZmFjZVRleHR1cmU7Ci0KLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYTsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudDsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3I7Ci0KLXB1YmxpYyBjbGFzcyBHTDJDYW1lcmFFeWUgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBtR0xWaWV3ID0gbmV3IENhbUdMU3VyZmFjZVZpZXcodGhpcyk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KG1HTFZpZXcpOwotICAgICAgICBzZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbiAoQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICAgICAgbUdMVmlldy5vblBhdXNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIG1HTFZpZXcub25SZXN1bWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEdMU3VyZmFjZVZpZXcgbUdMVmlldzsKLX0KLQotY2xhc3MgQ2FtR0xTdXJmYWNlVmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgaW1wbGVtZW50cyBTZW5zb3JFdmVudExpc3RlbmVyIHsKLSAgICBwdWJsaWMgQ2FtR0xTdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIHNldEVHTENvbnRleHRDbGllbnRWZXJzaW9uKDIpOwotICAgICAgICBtUmVuZGVyZXIgPSBuZXcgQ2FtUmVuZGVyZXIoY29udGV4dCk7Ci0gICAgICAgIHNldFJlbmRlcmVyKG1SZW5kZXJlcik7Ci0KLSAgICAgICAgbVNlbnNvck1hbmFnZXIgPSAoU2Vuc29yTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5TRU5TT1JfU0VSVklDRSk7Ci0gICAgICAgIG1BY2NlbGVyYXRpb24gPSBtU2Vuc29yTWFuYWdlci5nZXREZWZhdWx0U2Vuc29yKFNlbnNvci5UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChmaW5hbCBNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBxdWV1ZUV2ZW50KG5ldyBSdW5uYWJsZSgpewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtUmVuZGVyZXIuc2V0UG9zaXRpb24oZXZlbnQuZ2V0WCgpIC8gZ2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0WSgpIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgfX0pOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIG1DYW1lcmEuc3RvcFByZXZpZXcoKTsKLSAgICAgICAgbUNhbWVyYS5yZWxlYXNlKCk7Ci0KLSAgICAgICAgbVNlbnNvck1hbmFnZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBtQ2FtZXJhID0gQ2FtZXJhLm9wZW4oKTsKLSAgICAgICAgQ2FtZXJhLlBhcmFtZXRlcnMgcCA9IG1DYW1lcmEuZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAvLyBObyBjaGFuZ2VzIHRvIGRlZmF1bHQgY2FtZXJhIHBhcmFtZXRlcnMKLSAgICAgICAgbUNhbWVyYS5zZXRQYXJhbWV0ZXJzKHApOwotCi0gICAgICAgIHF1ZXVlRXZlbnQobmV3IFJ1bm5hYmxlKCl7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXIuc2V0Q2FtZXJhKG1DYW1lcmEpOwotICAgICAgICAgICAgICAgIH19KTsKLQotICAgICAgICBtU2Vuc29yTWFuYWdlci5yZWdpc3Rlckxpc3RlbmVyKHRoaXMsIG1BY2NlbGVyYXRpb24sIFNlbnNvck1hbmFnZXIuU0VOU09SX0RFTEFZX0dBTUUpOwotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU2Vuc29yQ2hhbmdlZChTZW5zb3JFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuc2Vuc29yLmdldFR5cGUoKSA9PSBTZW5zb3IuVFlQRV9MSU5FQVJfQUNDRUxFUkFUSU9OKSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdFtdIGFjY2VsZXJhdGlvblZlY3RvciA9IGV2ZW50LnZhbHVlczsKLSAgICAgICAgICAgIHF1ZXVlRXZlbnQobmV3IFJ1bm5hYmxlKCl7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci5zZXRBY2NlbGVyYXRpb24oYWNjZWxlcmF0aW9uVmVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfX0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25BY2N1cmFjeUNoYW5nZWQoU2Vuc29yIHNlbnNvciwgaW50IGFjY3VyYWN5KSB7Ci0gICAgICAgIC8vIElnbm9yaW5nIHNlbnNvciBhY2N1cmFjeSBjaGFuZ2VzLgotICAgIH0KLQotICAgIENhbVJlbmRlcmVyIG1SZW5kZXJlcjsKLSAgICBDYW1lcmEgbUNhbWVyYTsKLQotICAgIFNlbnNvck1hbmFnZXIgbVNlbnNvck1hbmFnZXI7Ci0gICAgU2Vuc29yIG1BY2NlbGVyYXRpb247Ci19Ci0KLWNsYXNzIENhbVJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciwgU3VyZmFjZVRleHR1cmUuT25GcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKLQotICAgIHB1YmxpYyBDYW1SZW5kZXJlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotCi0gICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChtVHJpYW5nbGVWZXJ0aWNlc0RhdGEubGVuZ3RoCi0gICAgICAgICAgICAgICAgKiBGTE9BVF9TSVpFX0JZVEVTKS5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSkuYXNGbG9hdEJ1ZmZlcigpOwotICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlcy5wdXQobVRyaWFuZ2xlVmVydGljZXNEYXRhKS5wb3NpdGlvbigwKTsKLQotICAgICAgICBNYXRyaXguc2V0SWRlbnRpdHlNKG1TVE1hdHJpeCwgMCk7Ci0gICAgICAgIE1hdHJpeC5zZXRJZGVudGl0eU0obU1NYXRyaXgsIDApOwotCi0gICAgICAgIGZsb2F0W10gZGVmYXVsdEFjY2VsZXJhdGlvbiA9IHswLmYsMC5mLDAuZn07Ci0gICAgICAgIHNldEFjY2VsZXJhdGlvbihkZWZhdWx0QWNjZWxlcmF0aW9uKTsKLSAgICAgICAgbVBvc1swXSA9IDAuZjsKLSAgICAgICAgbVBvc1sxXSA9IDAuZjsKLSAgICAgICAgbVBvc1syXSA9IDAuZjsKLSAgICAgICAgbVZlbFswXSA9IDAuZjsKLSAgICAgICAgbVZlbFsxXSA9IDAuZjsKLSAgICAgICAgbVZlbFsyXSA9IDAuZjsKLQotICAgIH0KLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgc2V0IG1ldGhvZHMgYXJlIG5vdCBzeW5jaHJvbml6ZWQsIHNvIHNob3VsZCBvbmx5Ci0gICAgICogYmUgY2FsbGVkIHdpdGhpbiB0aGUgcmVuZGVyaW5nIHRocmVhZCBjb250ZXh0LiBVc2UgR0xTdXJmYWNlVmlldy5xdWV1ZUV2ZW50IGZvciBzYWZlIGFjY2Vzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gICAgICAgIC8qIE1hcCBmcm9tIHNjcmVlbiAoMCwwKS0oMSwxKSB0byBzY2VuZSBjb29yZGluYXRlcyAqLwotICAgICAgICBtUG9zWzBdID0gKHgqMi0xKSptUmF0aW87Ci0gICAgICAgIG1Qb3NbMV0gPSAoLXkpKjIrMTsKLSAgICAgICAgbVBvc1syXSA9IDAuZjsKLSAgICAgICAgbVZlbFswXSA9IDA7Ci0gICAgICAgIG1WZWxbMV0gPSAwOwotICAgICAgICBtVmVsWzJdID0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW1lcmEoQ2FtZXJhIGNhbWVyYSkgewotICAgICAgICBtQ2FtZXJhID0gY2FtZXJhOwotICAgICAgICBDYW1lcmEuU2l6ZSBwcmV2aWV3U2l6ZSA9IGNhbWVyYS5nZXRQYXJhbWV0ZXJzKCkuZ2V0UHJldmlld1NpemUoKTsKLSAgICAgICAgbUNhbWVyYVJhdGlvID0gKGZsb2F0KXByZXZpZXdTaXplLndpZHRoL3ByZXZpZXdTaXplLmhlaWdodDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2NlbGVyYXRpb24oZmxvYXRbXSBhY2NlbGVyYXRpb25WZWN0b3IpIHsKLSAgICAgICAgbUdGb3JjZVswXSA9IGFjY2VsZXJhdGlvblZlY3RvclswXTsKLSAgICAgICAgbUdGb3JjZVsxXSA9IGFjY2VsZXJhdGlvblZlY3RvclsxXTsKLSAgICAgICAgbUdGb3JjZVsyXSA9IGFjY2VsZXJhdGlvblZlY3RvclsyXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsVW51c2VkKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAodXBkYXRlU3VyZmFjZSkgewotICAgICAgICAgICAgICAgIG1TdXJmYWNlLnVwZGF0ZVRleEltYWdlKCk7Ci0KLSAgICAgICAgICAgICAgICBtU3VyZmFjZS5nZXRUcmFuc2Zvcm1NYXRyaXgobVNUTWF0cml4KTsKLSAgICAgICAgICAgICAgICBsb25nIHRpbWVzdGFtcCA9IG1TdXJmYWNlLmdldFRpbWVzdGFtcCgpOwotICAgICAgICAgICAgICAgIGRvUGh5c2ljcyh0aW1lc3RhbXApOwotCi0gICAgICAgICAgICAgICAgdXBkYXRlU3VyZmFjZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWdub3JlIHRoZSBwYXNzZWQtaW4gR0wxMCBpbnRlcmZhY2UsIGFuZCB1c2UgdGhlIEdMRVMyMAotICAgICAgICAvLyBjbGFzcydzIHN0YXRpYyBtZXRob2RzIGluc3RlYWQuCi0gICAgICAgIEdMRVMyMC5nbENsZWFyKCBHTEVTMjAuR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMRVMyMC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgR0xFUzIwLmdsVXNlUHJvZ3JhbShtUHJvZ3JhbSk7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xVc2VQcm9ncmFtIik7Ci0KLSAgICAgICAgR0xFUzIwLmdsQWN0aXZlVGV4dHVyZShHTEVTMjAuR0xfVEVYVFVSRTApOwotICAgICAgICBHTEVTMjAuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgbVRleHR1cmVJRCk7Ci0KLSAgICAgICAgbVRyaWFuZ2xlVmVydGljZXMucG9zaXRpb24oVFJJQU5HTEVfVkVSVElDRVNfREFUQV9QT1NfT0ZGU0VUKTsKLSAgICAgICAgR0xFUzIwLmdsVmVydGV4QXR0cmliUG9pbnRlcihtYVBvc2l0aW9uSGFuZGxlLCAzLCBHTEVTMjAuR0xfRkxPQVQsIGZhbHNlLAotICAgICAgICAgICAgICAgIFRSSUFOR0xFX1ZFUlRJQ0VTX0RBVEFfU1RSSURFX0JZVEVTLCBtVHJpYW5nbGVWZXJ0aWNlcyk7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyIG1hUG9zaXRpb24iKTsKLSAgICAgICAgR0xFUzIwLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobWFQb3NpdGlvbkhhbmRsZSk7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSBtYVBvc2l0aW9uSGFuZGxlIik7Ci0KLSAgICAgICAgbVRyaWFuZ2xlVmVydGljZXMucG9zaXRpb24oVFJJQU5HTEVfVkVSVElDRVNfREFUQV9VVl9PRkZTRVQpOwotICAgICAgICBHTEVTMjAuZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1hVGV4dHVyZUhhbmRsZSwgMywgR0xFUzIwLkdMX0ZMT0FULCBmYWxzZSwKLSAgICAgICAgICAgICAgICBUUklBTkdMRV9WRVJUSUNFU19EQVRBX1NUUklERV9CWVRFUywgbVRyaWFuZ2xlVmVydGljZXMpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsVmVydGV4QXR0cmliUG9pbnRlciBtYVRleHR1cmVIYW5kbGUiKTsKLSAgICAgICAgR0xFUzIwLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobWFUZXh0dXJlSGFuZGxlKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5IG1hVGV4dHVyZUhhbmRsZSIpOwotCi0gICAgICAgIE1hdHJpeC5tdWx0aXBseU1NKG1NVlBNYXRyaXgsIDAsIG1WTWF0cml4LCAwLCBtTU1hdHJpeCwgMCk7Ci0gICAgICAgIE1hdHJpeC5tdWx0aXBseU1NKG1NVlBNYXRyaXgsIDAsIG1Qcm9qTWF0cml4LCAwLCBtTVZQTWF0cml4LCAwKTsKLQotICAgICAgICBHTEVTMjAuZ2xVbmlmb3JtTWF0cml4NGZ2KG11TVZQTWF0cml4SGFuZGxlLCAxLCBmYWxzZSwgbU1WUE1hdHJpeCwgMCk7Ci0gICAgICAgIEdMRVMyMC5nbFVuaWZvcm1NYXRyaXg0ZnYobXVTVE1hdHJpeEhhbmRsZSwgMSwgZmFsc2UsIG1TVE1hdHJpeCwgMCk7Ci0gICAgICAgIEdMRVMyMC5nbFVuaWZvcm0xZihtdUNSYXRpb0hhbmRsZSwgbUNhbWVyYVJhdGlvKTsKLQotICAgICAgICBHTEVTMjAuZ2xEcmF3QXJyYXlzKEdMRVMyMC5HTF9UUklBTkdMRV9TVFJJUCwgMCwgNCk7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xEcmF3QXJyYXlzIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsVW51c2VkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy8gSWdub3JlIHRoZSBwYXNzZWQtaW4gR0wxMCBpbnRlcmZhY2UsIGFuZCB1c2UgdGhlIEdMRVMyMAotICAgICAgICAvLyBjbGFzcydzIHN0YXRpYyBtZXRob2RzIGluc3RlYWQuCi0gICAgICAgIEdMRVMyMC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBtUmF0aW8gPSAoZmxvYXQpIHdpZHRoIC8gaGVpZ2h0OwotICAgICAgICBNYXRyaXguZnJ1c3R1bU0obVByb2pNYXRyaXgsIDAsIC1tUmF0aW8sIG1SYXRpbywgLTEsIDEsIDMsIDcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbFVudXNlZCwgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAvLyBJZ25vcmUgdGhlIHBhc3NlZC1pbiBHTDEwIGludGVyZmFjZSwgYW5kIHVzZSB0aGUgR0xFUzIwCi0gICAgICAgIC8vIGNsYXNzJ3Mgc3RhdGljIG1ldGhvZHMgaW5zdGVhZC4KLQotICAgICAgICAvKiBTZXQgdXAgYWxwaGEgYmxlbmRpbmcgYW5kIGFuIEFuZHJvaWQgYmFja2dyb3VuZCBjb2xvciAqLwotICAgICAgICBHTEVTMjAuZ2xFbmFibGUoR0xFUzIwLkdMX0JMRU5EKTsKLSAgICAgICAgR0xFUzIwLmdsQmxlbmRGdW5jKEdMRVMyMC5HTF9TUkNfQUxQSEEsIEdMRVMyMC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLSAgICAgICAgR0xFUzIwLmdsQ2xlYXJDb2xvcigwLjY0M2YsIDAuNzc2ZiwgMC4yMjNmLCAxLjBmKTsKLQotICAgICAgICAvKiBTZXQgdXAgc2hhZGVycyBhbmQgaGFuZGxlcyB0byB0aGVpciB2YXJpYWJsZXMgKi8KLSAgICAgICAgbVByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKG1WZXJ0ZXhTaGFkZXIsIG1GcmFnbWVudFNoYWRlcik7Ci0gICAgICAgIGlmIChtUHJvZ3JhbSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbWFQb3NpdGlvbkhhbmRsZSA9IEdMRVMyMC5nbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCAiYVBvc2l0aW9uIik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiBhUG9zaXRpb24iKTsKLSAgICAgICAgaWYgKG1hUG9zaXRpb25IYW5kbGUgPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IGF0dHJpYiBsb2NhdGlvbiBmb3IgYVBvc2l0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgbWFUZXh0dXJlSGFuZGxlID0gR0xFUzIwLmdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW0sICJhVGV4dHVyZUNvb3JkIik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiBhVGV4dHVyZUNvb3JkIik7Ci0gICAgICAgIGlmIChtYVRleHR1cmVIYW5kbGUgPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IGF0dHJpYiBsb2NhdGlvbiBmb3IgYVRleHR1cmVDb29yZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXVNVlBNYXRyaXhIYW5kbGUgPSBHTEVTMjAuZ2xHZXRVbmlmb3JtTG9jYXRpb24obVByb2dyYW0sICJ1TVZQTWF0cml4Iik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRVbmlmb3JtTG9jYXRpb24gdU1WUE1hdHJpeCIpOwotICAgICAgICBpZiAobXVNVlBNYXRyaXhIYW5kbGUgPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IGF0dHJpYiBsb2NhdGlvbiBmb3IgdU1WUE1hdHJpeCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXVTVE1hdHJpeEhhbmRsZSA9IEdMRVMyMC5nbEdldFVuaWZvcm1Mb2NhdGlvbihtUHJvZ3JhbSwgInVTVE1hdHJpeCIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsR2V0VW5pZm9ybUxvY2F0aW9uIHVTVE1hdHJpeCIpOwotICAgICAgICBpZiAobXVNVlBNYXRyaXhIYW5kbGUgPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IGF0dHJpYiBsb2NhdGlvbiBmb3IgdVNUTWF0cml4Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBtdUNSYXRpb0hhbmRsZSA9IEdMRVMyMC5nbEdldFVuaWZvcm1Mb2NhdGlvbihtUHJvZ3JhbSwgInVDUmF0aW8iKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbEdldFVuaWZvcm1Mb2NhdGlvbiB1Q1JhdGlvIik7Ci0gICAgICAgIGlmIChtdU1WUE1hdHJpeEhhbmRsZSA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgYXR0cmliIGxvY2F0aW9uIGZvciB1Q1JhdGlvIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBDcmVhdGUgb3VyIHRleHR1cmUuIFRoaXMgaGFzIHRvIGJlIGRvbmUgZWFjaCB0aW1lIHRoZQotICAgICAgICAgKiBzdXJmYWNlIGlzIGNyZWF0ZWQuCi0gICAgICAgICAqLwotCi0gICAgICAgIGludFtdIHRleHR1cmVzID0gbmV3IGludFsxXTsKLSAgICAgICAgR0xFUzIwLmdsR2VuVGV4dHVyZXMoMSwgdGV4dHVyZXMsIDApOwotCi0gICAgICAgIG1UZXh0dXJlSUQgPSB0ZXh0dXJlc1swXTsKLSAgICAgICAgR0xFUzIwLmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIG1UZXh0dXJlSUQpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsQmluZFRleHR1cmUgbVRleHR1cmVJRCIpOwotCi0gICAgICAgIC8vIENhbid0IGRvIG1pcG1hcHBpbmcgd2l0aCBjYW1lcmEgc291cmNlCi0gICAgICAgIEdMRVMyMC5nbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMRVMyMC5HTF9URVhUVVJFX01JTl9GSUxURVIsCi0gICAgICAgICAgICAgICAgR0xFUzIwLkdMX05FQVJFU1QpOwotICAgICAgICBHTEVTMjAuZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTEVTMjAuR0xfVEVYVFVSRV9NQUdfRklMVEVSLAotICAgICAgICAgICAgICAgIEdMRVMyMC5HTF9MSU5FQVIpOwotICAgICAgICAvLyBDbGFtcCB0byBlZGdlIGlzIHRoZSBvbmx5IG9wdGlvbgotICAgICAgICBHTEVTMjAuZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTEVTMjAuR0xfVEVYVFVSRV9XUkFQX1MsCi0gICAgICAgICAgICAgICAgR0xFUzIwLkdMX0NMQU1QX1RPX0VER0UpOwotICAgICAgICBHTEVTMjAuZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTEVTMjAuR0xfVEVYVFVSRV9XUkFQX1QsCi0gICAgICAgICAgICAgICAgR0xFUzIwLkdMX0NMQU1QX1RPX0VER0UpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsVGV4UGFyYW1ldGVyaSBtVGV4dHVyZUlEIik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlIHRoZSBTdXJmYWNlVGV4dHVyZSB0aGF0IHdpbGwgZmVlZCB0aGlzIHRleHR1cmVJRCwgYW5kIHBhc3MgaXQgdG8gdGhlIGNhbWVyYQotICAgICAgICAgKi8KLQotICAgICAgICBtU3VyZmFjZSA9IG5ldyBTdXJmYWNlVGV4dHVyZShtVGV4dHVyZUlEKTsKLSAgICAgICAgbVN1cmZhY2Uuc2V0T25GcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbUNhbWVyYS5zZXRQcmV2aWV3VGV4dHVyZShtU3VyZmFjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHQpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBzZXQgcHJldmlldyB0ZXh0dXJlIHRhcmdldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFN0YXJ0IHRoZSBjYW1lcmEgKi8KLSAgICAgICAgbUNhbWVyYS5zdGFydFByZXZpZXcoKTsKLQotICAgICAgICBNYXRyaXguc2V0TG9va0F0TShtVk1hdHJpeCwgMCwgMCwgMCwgNWYsIDBmLCAwZiwgMGYsIDBmLCAxLjBmLCAwLjBmKTsKLQotICAgICAgICBtTGFzdFRpbWUgPSAwOwotCi0gICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICB1cGRhdGVTdXJmYWNlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgb25GcmFtZUF2YWlsYWJsZShTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKSB7Ci0gICAgICAgIC8qIEZvciBzaW1wbGljaXR5LCBTdXJmYWNlVGV4dHVyZSBjYWxscyBoZXJlIHdoZW4gaXQgaGFzIG5ldwotICAgICAgICAgKiBkYXRhIGF2YWlsYWJsZS4gIENhbGwgbWF5IGNvbWUgaW4gZnJvbSBzb21lIHJhbmRvbSB0aHJlYWQsCi0gICAgICAgICAqIHNvIGxldCdzIGJlIHNhZmUgYW5kIHVzZSBzeW5jaHJvbml6ZS4gTm8gT3BlbkdMIGNhbGxzIGNhbiBiZSBkb25lIGhlcmUuCi0gICAgICAgICAqLwotICAgICAgICB1cGRhdGVTdXJmYWNlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9QaHlzaWNzKGxvbmcgdGltZXN0YW1wKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIE1vdmUgdGhlIGNhbWVyYSBzdXJmYWNlIGFyb3VuZCBiYXNlZCBvbiBzb21lIHNpbXBsZSBzcHJpbmcgcGh5c2ljcyB3aXRoIGRyYWcKLSAgICAgICAgICovCi0KLSAgICAgICAgaWYgKG1MYXN0VGltZSA9PSAwKQotICAgICAgICAgICAgbUxhc3RUaW1lID0gdGltZXN0YW1wOwotCi0gICAgICAgIGZsb2F0IGRlbHRhVCA9ICh0aW1lc3RhbXAgLSBtTGFzdFRpbWUpLzEwMDAwMDAwMDAuZjsgLy8gVG8gc2Vjb25kcwotCi0gICAgICAgIGZsb2F0IHNwcmluZ1N0cmVuZ3RoID0gMjAuZjsKLSAgICAgICAgZmxvYXQgZnJpY3Rpb25Db2VmZiA9IDEwLmY7Ci0gICAgICAgIGZsb2F0IG1hc3MgPSAxMC5mOwotICAgICAgICBmbG9hdCBnTXVsdGlwbGllciA9IDQuZjsKLSAgICAgICAgLyogT25seSB1cGRhdGUgcGh5c2ljcyBldmVyeSAzMCBtcyAqLwotICAgICAgICBpZiAoZGVsdGFUID4gMC4wMzBmKSB7Ci0gICAgICAgICAgICBtTGFzdFRpbWUgPSB0aW1lc3RhbXA7Ci0KLSAgICAgICAgICAgIGZsb2F0W10gdG90YWxGb3JjZSA9IG5ldyBmbG9hdFszXTsKLSAgICAgICAgICAgIHRvdGFsRm9yY2VbMF0gPSAtbVBvc1swXSAqIHNwcmluZ1N0cmVuZ3RoIC0gbVZlbFswXSpmcmljdGlvbkNvZWZmICsgZ011bHRpcGxpZXIqbUdGb3JjZVswXSptYXNzOwotICAgICAgICAgICAgdG90YWxGb3JjZVsxXSA9IC1tUG9zWzFdICogc3ByaW5nU3RyZW5ndGggLSBtVmVsWzFdKmZyaWN0aW9uQ29lZmYgKyBnTXVsdGlwbGllciptR0ZvcmNlWzFdKm1hc3M7Ci0gICAgICAgICAgICB0b3RhbEZvcmNlWzJdID0gLW1Qb3NbMl0gKiBzcHJpbmdTdHJlbmd0aCAtIG1WZWxbMl0qZnJpY3Rpb25Db2VmZiArIGdNdWx0aXBsaWVyKm1HRm9yY2VbMl0qbWFzczsKLQotICAgICAgICAgICAgZmxvYXRbXSBhY2NlbCA9IG5ldyBmbG9hdFszXTsKLSAgICAgICAgICAgIGFjY2VsWzBdID0gdG90YWxGb3JjZVswXS9tYXNzOwotICAgICAgICAgICAgYWNjZWxbMV0gPSB0b3RhbEZvcmNlWzFdL21hc3M7Ci0gICAgICAgICAgICBhY2NlbFsyXSA9IHRvdGFsRm9yY2VbMl0vbWFzczsKLQotICAgICAgICAgICAgLyogTm90IGEgdmVyeSBhY2N1cmF0ZSBpbnRlZ3JhdG9yICovCi0gICAgICAgICAgICBtVmVsWzBdID0gbVZlbFswXSArIGFjY2VsWzBdKmRlbHRhVDsKLSAgICAgICAgICAgIG1WZWxbMV0gPSBtVmVsWzFdICsgYWNjZWxbMV0qZGVsdGFUOwotICAgICAgICAgICAgbVZlbFsyXSA9IG1WZWxbMl0gKyBhY2NlbFsyXSpkZWx0YVQ7Ci0KLSAgICAgICAgICAgIG1Qb3NbMF0gPSBtUG9zWzBdICsgbVZlbFswXSpkZWx0YVQ7Ci0gICAgICAgICAgICBtUG9zWzFdID0gbVBvc1sxXSArIG1WZWxbMV0qZGVsdGFUOwotICAgICAgICAgICAgbVBvc1syXSA9IG1Qb3NbMl0gKyBtVmVsWzJdKmRlbHRhVDsKLQotICAgICAgICAgICAgTWF0cml4LnNldElkZW50aXR5TShtTU1hdHJpeCwgMCk7Ci0gICAgICAgICAgICBNYXRyaXgudHJhbnNsYXRlTShtTU1hdHJpeCwgMCwgbVBvc1swXSwgbVBvc1sxXSwgbVBvc1syXSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGxvYWRTaGFkZXIoaW50IHNoYWRlclR5cGUsIFN0cmluZyBzb3VyY2UpIHsKLSAgICAgICAgaW50IHNoYWRlciA9IEdMRVMyMC5nbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKLSAgICAgICAgaWYgKHNoYWRlciAhPSAwKSB7Ci0gICAgICAgICAgICBHTEVTMjAuZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2UpOwotICAgICAgICAgICAgR0xFUzIwLmdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgaW50W10gY29tcGlsZWQgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgR0xFUzIwLmdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTEVTMjAuR0xfQ09NUElMRV9TVEFUVVMsIGNvbXBpbGVkLCAwKTsKLSAgICAgICAgICAgIGlmIChjb21waWxlZFswXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyICIgKyBzaGFkZXJUeXBlICsgIjoiKTsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsIEdMRVMyMC5nbEdldFNoYWRlckluZm9Mb2coc2hhZGVyKSk7Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgICAgICAgICAgc2hhZGVyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2hhZGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNyZWF0ZVByb2dyYW0oU3RyaW5nIHZlcnRleFNvdXJjZSwgU3RyaW5nIGZyYWdtZW50U291cmNlKSB7Ci0gICAgICAgIGludCB2ZXJ0ZXhTaGFkZXIgPSBsb2FkU2hhZGVyKEdMRVMyMC5HTF9WRVJURVhfU0hBREVSLCB2ZXJ0ZXhTb3VyY2UpOwotICAgICAgICBpZiAodmVydGV4U2hhZGVyID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGludCBwaXhlbFNoYWRlciA9IGxvYWRTaGFkZXIoR0xFUzIwLkdMX0ZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTb3VyY2UpOwotICAgICAgICBpZiAocGl4ZWxTaGFkZXIgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcHJvZ3JhbSA9IEdMRVMyMC5nbENyZWF0ZVByb2dyYW0oKTsKLSAgICAgICAgaWYgKHByb2dyYW0gIT0gMCkgewotICAgICAgICAgICAgR0xFUzIwLmdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIik7Ci0gICAgICAgICAgICBHTEVTMjAuZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgcGl4ZWxTaGFkZXIpOwotICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciIpOwotICAgICAgICAgICAgR0xFUzIwLmdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgICAgICBpbnRbXSBsaW5rU3RhdHVzID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIEdMRVMyMC5nbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTEVTMjAuR0xfTElOS19TVEFUVVMsIGxpbmtTdGF0dXMsIDApOwotICAgICAgICAgICAgaWYgKGxpbmtTdGF0dXNbMF0gIT0gR0xFUzIwLkdMX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgbGluayBwcm9ncmFtOiAiKTsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsIEdMRVMyMC5nbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pKTsKLSAgICAgICAgICAgICAgICBHTEVTMjAuZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICAgICAgICAgIHByb2dyYW0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9ncmFtOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0dsRXJyb3IoU3RyaW5nIG9wKSB7Ci0gICAgICAgIGludCBlcnJvcjsKLSAgICAgICAgd2hpbGUgKChlcnJvciA9IEdMRVMyMC5nbEdldEVycm9yKCkpICE9IEdMRVMyMC5HTF9OT19FUlJPUikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCBvcCArICI6IGdsRXJyb3IgIiArIGVycm9yKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG9wICsgIjogZ2xFcnJvciAiICsgZXJyb3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMT0FUX1NJWkVfQllURVMgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUklBTkdMRV9WRVJUSUNFU19EQVRBX1NUUklERV9CWVRFUyA9IDUgKiBGTE9BVF9TSVpFX0JZVEVTOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUklBTkdMRV9WRVJUSUNFU19EQVRBX1BPU19PRkZTRVQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUklBTkdMRV9WRVJUSUNFU19EQVRBX1VWX09GRlNFVCA9IDM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1UcmlhbmdsZVZlcnRpY2VzRGF0YSA9IHsKLSAgICAgICAgLy8gWCwgWSwgWiwgVSwgVgotICAgICAgICAtMS4wZiwgLTEuMGYsIDAsIDAuZiwgMC5mLAotICAgICAgICAxLjBmLCAtMS4wZiwgMCwgMS5mLCAwLmYsCi0gICAgICAgIC0xLjBmLCAgMS4wZiwgMCwgMC5mLCAxLmYsCi0gICAgICAgIDEuMGYsICAgMS4wZiwgMCwgMS5mLCAxLmYsCi0gICAgfTsKLQotICAgIHByaXZhdGUgRmxvYXRCdWZmZXIgbVRyaWFuZ2xlVmVydGljZXM7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVmVydGV4U2hhZGVyID0KLSAgICAgICAgInVuaWZvcm0gbWF0NCB1TVZQTWF0cml4O1xuIiArCi0gICAgICAgICJ1bmlmb3JtIG1hdDQgdVNUTWF0cml4O1xuIiArCi0gICAgICAgICJ1bmlmb3JtIGZsb2F0IHVDUmF0aW87XG4iICsKLSAgICAgICAgImF0dHJpYnV0ZSB2ZWM0IGFQb3NpdGlvbjtcbiIgKwotICAgICAgICAiYXR0cmlidXRlIHZlYzQgYVRleHR1cmVDb29yZDtcbiIgKwotICAgICAgICAidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XG4iICsKLSAgICAgICAgInZhcnlpbmcgdmVjMiB2VGV4dHVyZU5vcm1Db29yZDtcbiIgKwotICAgICAgICAidm9pZCBtYWluKCkge1xuIiArCi0gICAgICAgICIgIHZlYzQgc2NhbGVkUG9zID0gYVBvc2l0aW9uO1xuIiArCi0gICAgICAgICIgIHNjYWxlZFBvcy54ID0gc2NhbGVkUG9zLnggKiB1Q1JhdGlvO1xuIiArCi0gICAgICAgICIgIGdsX1Bvc2l0aW9uID0gdU1WUE1hdHJpeCAqIHNjYWxlZFBvcztcbiIgKwotICAgICAgICAiICB2VGV4dHVyZUNvb3JkID0gKHVTVE1hdHJpeCAqIGFUZXh0dXJlQ29vcmQpLnh5O1xuIiArCi0gICAgICAgICIgIHZUZXh0dXJlTm9ybUNvb3JkID0gYVRleHR1cmVDb29yZC54eTtcbiIgKwotICAgICAgICAifVxuIjsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1GcmFnbWVudFNoYWRlciA9Ci0gICAgICAgICIjZXh0ZW5zaW9uIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgOiByZXF1aXJlXG4iICsKLSAgICAgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIiArCi0gICAgICAgICJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcbiIgKwotICAgICAgICAidmFyeWluZyB2ZWMyIHZUZXh0dXJlTm9ybUNvb3JkO1xuIiArCi0gICAgICAgICJ1bmlmb3JtIHNhbXBsZXJFeHRlcm5hbE9FUyBzVGV4dHVyZTtcbiIgKwotICAgICAgICAidm9pZCBtYWluKCkge1xuIiArCi0gICAgICAgICIgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRChzVGV4dHVyZSwgdlRleHR1cmVDb29yZCk7XG4iICsKLSAgICAgICAgIiAgZ2xfRnJhZ0NvbG9yLmEgPSAxLjAtbWluKGxlbmd0aCh2VGV4dHVyZU5vcm1Db29yZC0wLjUpKjIuMCwxLjApO1xuIiArCi0gICAgICAgICJ9XG4iOwotCi0gICAgcHJpdmF0ZSBmbG9hdFtdIG1NVlBNYXRyaXggPSBuZXcgZmxvYXRbMTZdOwotICAgIHByaXZhdGUgZmxvYXRbXSBtUHJvak1hdHJpeCA9IG5ldyBmbG9hdFsxNl07Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1NTWF0cml4ID0gbmV3IGZsb2F0WzE2XTsKLSAgICBwcml2YXRlIGZsb2F0W10gbVZNYXRyaXggPSBuZXcgZmxvYXRbMTZdOwotICAgIHByaXZhdGUgZmxvYXRbXSBtU1RNYXRyaXggPSBuZXcgZmxvYXRbMTZdOwotCi0gICAgcHJpdmF0ZSBpbnQgbVByb2dyYW07Ci0gICAgcHJpdmF0ZSBpbnQgbVRleHR1cmVJRDsKLSAgICBwcml2YXRlIGludCBtdU1WUE1hdHJpeEhhbmRsZTsKLSAgICBwcml2YXRlIGludCBtdVNUTWF0cml4SGFuZGxlOwotICAgIHByaXZhdGUgaW50IG11Q1JhdGlvSGFuZGxlOwotICAgIHByaXZhdGUgaW50IG1hUG9zaXRpb25IYW5kbGU7Ci0gICAgcHJpdmF0ZSBpbnQgbWFUZXh0dXJlSGFuZGxlOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtUmF0aW8gPSAxLjBmOwotICAgIHByaXZhdGUgZmxvYXQgbUNhbWVyYVJhdGlvID0gMS4wZjsKLSAgICBwcml2YXRlIGZsb2F0W10gbVZlbCA9IG5ldyBmbG9hdFszXTsKLSAgICBwcml2YXRlIGZsb2F0W10gbVBvcyA9IG5ldyBmbG9hdFszXTsKLSAgICBwcml2YXRlIGZsb2F0W10gbUdGb3JjZSA9IG5ldyBmbG9hdFszXTsKLQotICAgIHByaXZhdGUgbG9uZyBtTGFzdFRpbWU7Ci0KLSAgICBwcml2YXRlIFN1cmZhY2VUZXh0dXJlIG1TdXJmYWNlOwotICAgIHByaXZhdGUgQ2FtZXJhIG1DYW1lcmE7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVN1cmZhY2UgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEFHID0gIkNhbVJlbmRlcmVyIjsKLQotICAgIC8vIE1hZ2ljIGtleQotICAgIHByaXZhdGUgc3RhdGljIGludCBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyA9IDB4OEQ2NTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfY29weVRleEltYWdlL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2wyX2NvcHlUZXhJbWFnZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDVjMzgzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfY29weVRleEltYWdlL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JZ2wyX2NvcHlUZXhJbWFnZS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLSAgICBsaWJFR0wgXAotICAgIGxpYkdMRVN2MiBcCi0gICAgbGlidWkKLQotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1nbDJfY29weVRleEltYWdlCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX0NGTEFHUyA6PSAtREdMX0dMRVhUX1BST1RPVFlQRVMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2NvcHlUZXhJbWFnZS9nbDJfY29weVRleEltYWdlLmNwcCBiL29wZW5nbC90ZXN0cy9nbDJfY29weVRleEltYWdlL2dsMl9jb3B5VGV4SW1hZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODhkN2FjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfY29weVRleEltYWdlL2dsMl9jb3B5VGV4SW1hZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotc3RhdGljIHZvaWQgcHJpbnRHTFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBHTGVudW0gcykgewotICAgIC8vIGZwcmludGYoc3RkZXJyLCAicHJpbnRHTFN0cmluZyAlcywgJWRcbiIsIG5hbWUsIHMpOwotICAgIGNvbnN0IGNoYXIgKnYgPSAoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhzKTsKLSAgICAvLyBpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7Ci0gICAgLy8gZnByaW50ZihzdGRlcnIsICJnbEdldEVycm9yKCkgPSAlZCwgcmVzdWx0IG9mIGdsR2V0U3RyaW5nID0gJXhcbiIsIGVycm9yLAotICAgIC8vICAgICAgICAodW5zaWduZWQgaW50KSB2KTsKLSAgICAvLyBpZiAoKHYgPCAoY29uc3QgY2hhciopIDApIHx8ICh2ID4gKGNvbnN0IGNoYXIqKSAweDEwMDAwKSkKLSAgICAvLyAgICBmcHJpbnRmKHN0ZGVyciwgIkdMICVzID0gJXNcbiIsIG5hbWUsIHYpOwotICAgIC8vIGVsc2UKLSAgICAvLyAgICBmcHJpbnRmKHN0ZGVyciwgIkdMICVzID0gKG51bGwpIDB4JTA4eFxuIiwgbmFtZSwgKHVuc2lnbmVkIGludCkgdik7Ci0gICAgZnByaW50ZihzdGRlcnIsICJHTCAlcyA9ICVzXG4iLCBuYW1lLCB2KTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwgPSBFR0xfVFJVRSkgewotICAgIGlmIChyZXR1cm5WYWwgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcygpIHJldHVybmVkICVkXG4iLCBvcCwgcmV0dXJuVmFsKTsKLSAgICB9Ci0KLSAgICBmb3IgKEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7IGVycm9yICE9IEVHTF9TVUNDRVNTOyBlcnJvcgotICAgICAgICAgICAgPSBlZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBlZ2xFcnJvciAlcyAoMHgleClcbiIsIG9wLCBFR0xVdGlsczo6c3RyZXJyb3IoZXJyb3IpLAotICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkgewotICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgotICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgZ1ZlcnRleFNoYWRlcltdID0gImF0dHJpYnV0ZSB2ZWM0IHZQb3NpdGlvbjtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX1Bvc2l0aW9uID0gdlBvc2l0aW9uO1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBnRnJhZ21lbnRTaGFkZXJbXSA9ICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wLCAxLjAsIDAuMCwgMC41KTtcbiIKLSAgICAifVxuIjsKLQotR0x1aW50IGxvYWRTaGFkZXIoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UpIHsKLSAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7Ci0gICAgaWYgKHNoYWRlcikgewotICAgICAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZwU291cmNlLCBOVUxMKTsKLSAgICAgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgIEdMaW50IGNvbXBpbGVkID0gMDsKLSAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZWQpOwotICAgICAgICBpZiAoIWNvbXBpbGVkKSB7Ci0gICAgICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKLSAgICAgICAgICAgIGlmIChpbmZvTGVuKSB7Ci0gICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAlZDpcbiVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclR5cGUsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgICAgICAgICBzaGFkZXIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzaGFkZXI7Ci19Ci0KLUdMdWludCBjcmVhdGVQcm9ncmFtKGNvbnN0IGNoYXIqIHBWZXJ0ZXhTb3VyY2UsIGNvbnN0IGNoYXIqIHBGcmFnbWVudFNvdXJjZSkgewotICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHBWZXJ0ZXhTb3VyY2UpOwotICAgIGlmICghdmVydGV4U2hhZGVyKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEdMdWludCBwaXhlbFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBwRnJhZ21lbnRTb3VyY2UpOwotICAgIGlmICghcGl4ZWxTaGFkZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSkgewotICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIik7Ci0gICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHBpeGVsU2hhZGVyKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciIpOwotICAgICAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICBHTGludCBsaW5rU3RhdHVzID0gR0xfRkFMU0U7Ci0gICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Ci0gICAgICAgIGlmIChsaW5rU3RhdHVzICE9IEdMX1RSVUUpIHsKLSAgICAgICAgICAgIEdMaW50IGJ1Zkxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZidWZMZW5ndGgpOwotICAgICAgICAgICAgaWYgKGJ1Zkxlbmd0aCkgewotICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGJ1Zkxlbmd0aCwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgbGluayBwcm9ncmFtOlxuJXNcbiIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgICAgICBwcm9ncmFtID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJvZ3JhbTsKLX0KLQotR0x1aW50IGdQcm9ncmFtOwotR0x1aW50IGdUZXh0dXJlUHJvZ3JhbTsKLUdMdWludCBndlBvc2l0aW9uSGFuZGxlOwotR0x1aW50IGd2VGV4dHVyZVBvc2l0aW9uSGFuZGxlOwotR0x1aW50IGd2VGV4dHVyZVRleENvb3Jkc0hhbmRsZTsKLUdMdWludCBndlRleHR1cmVTYW1wbGVySGFuZGxlOwotR0x1aW50IGdGYm87Ci1HTHVpbnQgZ1RleHR1cmU7Ci1HTHVpbnQgZ0J1ZmZlclRleHR1cmU7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGdTaW1wbGVWU1tdID0KLSAgICAiYXR0cmlidXRlIHZlYzQgcG9zaXRpb247XG4iCi0gICAgImF0dHJpYnV0ZSB2ZWMyIHRleENvb3JkcztcbiIKLSAgICAidmFyeWluZyB2ZWMyIG91dFRleENvb3JkcztcbiIKLSAgICAiXG52b2lkIG1haW4odm9pZCkge1xuIgotICAgICIgICAgb3V0VGV4Q29vcmRzID0gdGV4Q29vcmRzO1xuIgotICAgICIgICAgZ2xfUG9zaXRpb24gPSBwb3NpdGlvbjtcbiIKLSAgICAifVxuXG4iOwotc3RhdGljIGNvbnN0IGNoYXIgZ1NpbXBsZUZTW10gPQotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxuIgotICAgICJ2YXJ5aW5nIHZlYzIgb3V0VGV4Q29vcmRzO1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xuIgotICAgICJcbnZvaWQgbWFpbih2b2lkKSB7XG4iCi0gICAgIiAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgb3V0VGV4Q29vcmRzKTtcbiIKLSAgICAifVxuXG4iOwotCi1ib29sIHNldHVwR3JhcGhpY3MoaW50IHcsIGludCBoKSB7Ci0gICAgZ1Byb2dyYW0gPSBjcmVhdGVQcm9ncmFtKGdWZXJ0ZXhTaGFkZXIsIGdGcmFnbWVudFNoYWRlcik7Ci0gICAgaWYgKCFnUHJvZ3JhbSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGd2UG9zaXRpb25IYW5kbGUgPSBnbEdldEF0dHJpYkxvY2F0aW9uKGdQcm9ncmFtLCAidlBvc2l0aW9uIik7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEdldEF0dHJpYkxvY2F0aW9uIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICJnbEdldEF0dHJpYkxvY2F0aW9uKFwidlBvc2l0aW9uXCIpID0gJWRcbiIsIGd2UG9zaXRpb25IYW5kbGUpOwotCi0gICAgZ1RleHR1cmVQcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnU2ltcGxlVlMsIGdTaW1wbGVGUyk7Ci0gICAgaWYgKCFnVGV4dHVyZVByb2dyYW0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBndlRleHR1cmVQb3NpdGlvbkhhbmRsZSA9IGdsR2V0QXR0cmliTG9jYXRpb24oZ1RleHR1cmVQcm9ncmFtLCAicG9zaXRpb24iKTsKLSAgICBjaGVja0dsRXJyb3IoImdsR2V0QXR0cmliTG9jYXRpb24iKTsKLSAgICBndlRleHR1cmVUZXhDb29yZHNIYW5kbGUgPSBnbEdldEF0dHJpYkxvY2F0aW9uKGdUZXh0dXJlUHJvZ3JhbSwgInRleENvb3JkcyIpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOwotICAgIGd2VGV4dHVyZVNhbXBsZXJIYW5kbGUgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihnVGV4dHVyZVByb2dyYW0sICJ0ZXh0dXJlIik7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEdldEF0dHJpYkxvY2F0aW9uIik7Ci0KLSAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwotCi0gICAgZ2xHZW5UZXh0dXJlcygxLCAmZ1RleHR1cmUpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgZ1RleHR1cmUpOwotICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCB3LCBoLCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBOVUxMKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOwotCi0gICAgZ2xHZW5UZXh0dXJlcygxLCAmZ0J1ZmZlclRleHR1cmUpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgZ0J1ZmZlclRleHR1cmUpOwotICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCB3LCBoLCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBOVUxMKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOwotCi0gICAgZ2xHZW5GcmFtZWJ1ZmZlcnMoMSwgJmdGYm8pOwotICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBnRmJvKTsKLSAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCwgR0xfVEVYVFVSRV8yRCwgZ1RleHR1cmUsIDApOwotCi0gICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIDApOwotCi0gICAgZ2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVmlld3BvcnQiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgR0xmbG9hdCBnVHJpYW5nbGVWZXJ0aWNlc1tdID0geyAwLjBmLCAwLjVmLCAtMC41ZiwgLTAuNWYsCi0gICAgICAgIDAuNWYsIC0wLjVmIH07Ci0KLWNvbnN0IEdMaW50IEZMT0FUX1NJWkVfQllURVMgPSA0OwotY29uc3QgR0xpbnQgVFJJQU5HTEVfVkVSVElDRVNfREFUQV9TVFJJREVfQllURVMgPSA1ICogRkxPQVRfU0laRV9CWVRFUzsKLWNvbnN0IEdMZmxvYXQgZ1RyaWFuZ2xlVmVydGljZXNEYXRhW10gPSB7Ci0gICAgLy8gWCwgWSwgWiwgVSwgVgotICAgIC0xLjBmLCAtMS4wZiwgMCwgMC5mLCAwLmYsCi0gICAgMS4wZiwgLTEuMGYsIDAsIDEuZiwgMC5mLAotICAgIC0xLjBmLCAgMS4wZiwgMCwgMC5mLCAxLmYsCi0gICAgMS4wZiwgICAxLjBmLCAwLCAxLmYsIDEuZiwKLX07Ci0KLXZvaWQgcmVuZGVyRnJhbWUoR0xpbnQgdywgR0xpbnQgaCkgewotICAgIGdsQ2xlYXJDb2xvcigxLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKLSAgICBjaGVja0dsRXJyb3IoImdsQ2xlYXJDb2xvciIpOwotICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhciIpOwotCi0gICAgLy8gQmluZCBGQk8gYW5kIGRyYXcgaW50byBpdAotICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBnRmJvKTsKLSAgICBjaGVja0dsRXJyb3IoImdsQmluZEZyYW1lYnVmZmVyIik7Ci0KLSAgICBnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7Ci0gICAgY2hlY2tHbEVycm9yKCJnbENsZWFyQ29sb3IiKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhciIpOwotCi0gICAgZ2xVc2VQcm9ncmFtKGdQcm9ncmFtKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVXNlUHJvZ3JhbSIpOwotCi0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGd2UG9zaXRpb25IYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgZ1RyaWFuZ2xlVmVydGljZXMpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyIik7Ci0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShndlBvc2l0aW9uSGFuZGxlKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkiKTsKLSAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCAzKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRHJhd0FycmF5cyIpOwotCi0gICAgLy8gQ29weSBjb250ZW50IG9mIEZCTyBpbnRvIGEgdGV4dHVyZQotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgZ0J1ZmZlclRleHR1cmUpOwotICAgIGdsQ29weVRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMCwgMCwgdyAvIDIsIGggLyAyKTsKLSAgICBjaGVja0dsRXJyb3IoImdsQ29weVRleFN1YkltYWdlMkQiKTsKLQotICAgIC8vIEJhY2sgdG8gdGhlIGRpc3BsYXkKLSAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgMCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEJpbmRGcmFtZWJ1ZmZlciIpOwotCi0gICAgLy8gRHJhdyBjb3BpZWQgY29udGVudCBvbiB0aGUgc2NyZWVuCi0gICAgZ2xVc2VQcm9ncmFtKGdUZXh0dXJlUHJvZ3JhbSk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFVzZVByb2dyYW0iKTsKLQotICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCi0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGd2VGV4dHVyZVBvc2l0aW9uSGFuZGxlLCAzLCBHTF9GTE9BVCwgR0xfRkFMU0UsCi0gICAgICAgICAgICBUUklBTkdMRV9WRVJUSUNFU19EQVRBX1NUUklERV9CWVRFUywgZ1RyaWFuZ2xlVmVydGljZXNEYXRhKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVmVydGV4QXR0cmliUG9pbnRlciIpOwotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihndlRleHR1cmVUZXhDb29yZHNIYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKLSAgICAgICAgICAgIFRSSUFOR0xFX1ZFUlRJQ0VTX0RBVEFfU1RSSURFX0JZVEVTLCAmZ1RyaWFuZ2xlVmVydGljZXNEYXRhWzNdKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVmVydGV4QXR0cmliUG9pbnRlciIpOwotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZ3ZUZXh0dXJlUG9zaXRpb25IYW5kbGUpOwotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZ3ZUZXh0dXJlVGV4Q29vcmRzSGFuZGxlKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkiKTsKLSAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xEcmF3QXJyYXlzIik7Ci19Ci0KLXZvaWQgcHJpbnRFR0xDb25maWd1cmF0aW9uKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnKSB7Ci0KLSNkZWZpbmUgWChWQUwpIHtWQUwsICNWQUx9Ci0gICAgc3RydWN0IHtFR0xpbnQgYXR0cmlidXRlOyBjb25zdCBjaGFyKiBuYW1lO30gbmFtZXNbXSA9IHsKLSAgICBYKEVHTF9CVUZGRVJfU0laRSksCi0gICAgWChFR0xfQUxQSEFfU0laRSksCi0gICAgWChFR0xfQkxVRV9TSVpFKSwKLSAgICBYKEVHTF9HUkVFTl9TSVpFKSwKLSAgICBYKEVHTF9SRURfU0laRSksCi0gICAgWChFR0xfREVQVEhfU0laRSksCi0gICAgWChFR0xfU1RFTkNJTF9TSVpFKSwKLSAgICBYKEVHTF9DT05GSUdfQ0FWRUFUKSwKLSAgICBYKEVHTF9DT05GSUdfSUQpLAotICAgIFgoRUdMX0xFVkVMKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1BJWEVMUyksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfV0lEVEgpLAotICAgIFgoRUdMX05BVElWRV9SRU5ERVJBQkxFKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX0lEKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX1RZUEUpLAotICAgIFgoRUdMX1NBTVBMRVMpLAotICAgIFgoRUdMX1NBTVBMRV9CVUZGRVJTKSwKLSAgICBYKEVHTF9TVVJGQUNFX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSksCi0gICAgWChFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBKSwKLSAgICBYKEVHTF9NSU5fU1dBUF9JTlRFUlZBTCksCi0gICAgWChFR0xfTUFYX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX0xVTUlOQU5DRV9TSVpFKSwKLSAgICBYKEVHTF9BTFBIQV9NQVNLX1NJWkUpLAotICAgIFgoRUdMX0NPTE9SX0JVRkZFUl9UWVBFKSwKLSAgICBYKEVHTF9SRU5ERVJBQkxFX1RZUEUpLAotICAgIFgoRUdMX0NPTkZPUk1BTlQpLAotICAgfTsKLSN1bmRlZiBYCi0KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihuYW1lcykgLyBzaXplb2YobmFtZXNbMF0pOyBqKyspIHsKLSAgICAgICAgRUdMaW50IHZhbHVlID0gLTE7Ci0gICAgICAgIEVHTGludCByZXR1cm5WYWwgPSBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIG5hbWVzW2pdLmF0dHJpYnV0ZSwgJnZhbHVlKTsKLSAgICAgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKHJldHVyblZhbCAmJiBlcnJvciA9PSBFR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgcHJpbnRmKCIgJXM6ICIsIG5hbWVzW2pdLm5hbWUpOwotICAgICAgICAgICAgcHJpbnRmKCIlZCAoMHgleCkiLCB2YWx1ZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotaW50IHByaW50RUdMQ29uZmlndXJhdGlvbnMoRUdMRGlzcGxheSBkcHkpIHsKLSAgICBFR0xpbnQgbnVtQ29uZmlnID0gMDsKLSAgICBFR0xpbnQgcmV0dXJuVmFsID0gZWdsR2V0Q29uZmlncyhkcHksIE5VTEwsIDAsICZudW1Db25maWcpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldENvbmZpZ3MiLCByZXR1cm5WYWwpOwotICAgIGlmICghcmV0dXJuVmFsKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcmludGYoIk51bWJlciBvZiBFR0wgY29uZmlndXJhdGlvbjogJWRcbiIsIG51bUNvbmZpZyk7Ci0KLSAgICBFR0xDb25maWcqIGNvbmZpZ3MgPSAoRUdMQ29uZmlnKikgbWFsbG9jKHNpemVvZihFR0xDb25maWcpICogbnVtQ29uZmlnKTsKLSAgICBpZiAoISBjb25maWdzKSB7Ci0gICAgICAgIHByaW50ZigiQ291bGQgbm90IGFsbG9jYXRlIGNvbmZpZ3MuXG4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVyblZhbCA9IGVnbEdldENvbmZpZ3MoZHB5LCBjb25maWdzLCBudW1Db25maWcsICZudW1Db25maWcpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldENvbmZpZ3MiLCByZXR1cm5WYWwpOwotICAgIGlmICghcmV0dXJuVmFsKSB7Ci0gICAgICAgIGZyZWUoY29uZmlncyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnOyBpKyspIHsKLSAgICAgICAgcHJpbnRmKCJDb25maWd1cmF0aW9uICVkXG4iLCBpKTsKLSAgICAgICAgcHJpbnRFR0xDb25maWd1cmF0aW9uKGRweSwgY29uZmlnc1tpXSk7Ci0gICAgfQotCi0gICAgZnJlZShjb25maWdzKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAgRUdMQm9vbGVhbiByZXR1cm5WYWx1ZTsKLSAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07Ci0KLSAgICBFR0xpbnQgY29udGV4dF9hdHRyaWJzW10gPSB7IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0xfTk9ORSB9OwotICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAotICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICAgICAgRUdMX1JFRF9TSVpFLCA4LAotICAgICAgICAgICAgRUdMX0dSRUVOX1NJWkUsIDgsCi0gICAgICAgICAgICBFR0xfQkxVRV9TSVpFLCA4LAotICAgICAgICAgICAgRUdMX0FMUEhBX1NJWkUsIDgsCi0gICAgICAgICAgICBFR0xfTk9ORSB9OwotICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKLSAgICBFR0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgRUdMU3VyZmFjZSBzdXJmYWNlOwotICAgIEVHTGludCB3LCBoOwotCi0gICAgRUdMRGlzcGxheSBkcHk7Ci0KLSAgICBjaGVja0VnbEVycm9yKCI8aW5pdD4iKTsKLSAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldERpc3BsYXkiKTsKLSAgICBpZiAoZHB5ID09IEVHTF9OT19ESVNQTEFZKSB7Ci0gICAgICAgIHByaW50ZigiZWdsR2V0RGlzcGxheSByZXR1cm5lZCBFR0xfTk9fRElTUExBWS5cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm5WYWx1ZSA9IGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xJbml0aWFsaXplIiwgcmV0dXJuVmFsdWUpOwotICAgIGZwcmludGYoc3RkZXJyLCAiRUdMIHZlcnNpb24gJWQuJWRcbiIsIG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uKTsKLSAgICBpZiAocmV0dXJuVmFsdWUgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xJbml0aWFsaXplIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICghcHJpbnRFR0xDb25maWd1cmF0aW9ucyhkcHkpKSB7Ci0gICAgICAgIHByaW50ZigicHJpbnRFR0xDb25maWd1cmF0aW9ucyBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBjaGVja0VnbEVycm9yKCJwcmludEVHTENvbmZpZ3VyYXRpb25zIik7Ci0KLSAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyA9IGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsKLSAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xLCBuID0gMDsKLSAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsIDAsIDAsICZudW1Db25maWdzKTsKLSAgICBpZiAobnVtQ29uZmlncykgewotICAgICAgICBFR0xDb25maWcqIGNvbnN0IGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnW251bUNvbmZpZ3NdOwotICAgICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsIGNvbmZpZ3MsIG51bUNvbmZpZ3MsICZuKTsKLSAgICAgICAgbXlDb25maWcgPSBjb25maWdzWzBdOwotICAgICAgICBkZWxldGVbXSBjb25maWdzOwotICAgIH0KLQotICAgIGNoZWNrRWdsRXJyb3IoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3ciKTsKLQotICAgIHByaW50ZigiQ2hvc2UgdGhpcyBjb25maWd1cmF0aW9uOlxuIik7Ci0gICAgcHJpbnRFR0xDb25maWd1cmF0aW9uKGRweSwgbXlDb25maWcpOwotCi0gICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBteUNvbmZpZywgd2luZG93LCBOVUxMKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIik7Ci0gICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgcHJpbnRmKCJnZWxDcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZC5cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIG15Q29uZmlnLCBFR0xfTk9fQ09OVEVYVCwgY29udGV4dF9hdHRyaWJzKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVDb250ZXh0Iik7Ci0gICAgaWYgKGNvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm5WYWx1ZSA9IGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsTWFrZUN1cnJlbnQiLCByZXR1cm5WYWx1ZSk7Ci0gICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7Ci0gICAgR0xpbnQgZGltID0gdyA8IGggPyB3IDogaDsKLQotICAgIGZwcmludGYoc3RkZXJyLCAiV2luZG93IGRpbWVuc2lvbnM6ICVkIHggJWRcbiIsIHcsIGgpOwotCi0gICAgcHJpbnRHTFN0cmluZygiVmVyc2lvbiIsIEdMX1ZFUlNJT04pOwotICAgIHByaW50R0xTdHJpbmcoIlZlbmRvciIsIEdMX1ZFTkRPUik7Ci0gICAgcHJpbnRHTFN0cmluZygiUmVuZGVyZXIiLCBHTF9SRU5ERVJFUik7Ci0gICAgcHJpbnRHTFN0cmluZygiRXh0ZW5zaW9ucyIsIEdMX0VYVEVOU0lPTlMpOwotCi0gICAgaWYoIXNldHVwR3JhcGhpY3ModywgaCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgc2V0IHVwIGdyYXBoaWNzLlxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgcmVuZGVyRnJhbWUodywgaCk7Ci0gICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbFN3YXBCdWZmZXJzIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbDJfamF2YS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY0YWVlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfamF2YS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBPcGVuR0wgRVMgMi4wIEphdmEgc2FtcGxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBCdWlsZCBhY3Rpdml0eQotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEdMMkphdmEKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy9nbDJfamF2YS9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmI2ODQwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfamF2YS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5nbDJqYXZhIj4KLSAgICA8dXNlcy1mZWF0dXJlIGFuZHJvaWQ6Z2xFc1ZlcnNpb249IjB4MDAwMjAwMDAiIC8+Ci0gICAgPGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2dsMmphdmFfYWN0aXZpdHkiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJHTDJKYXZhQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgotICAgICAgICAgICAgCWFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKLSAgICAgICAgICAgIAlhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfamF2YS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL2dsMl9qYXZhL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YmQyM2MuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsMl9qYXZhL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCi0gICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImdsMmphdmFfYWN0aXZpdHkiPkdMMkphdmE8L3N0cmluZz4KLQotPC9yZXNvdXJjZXM+Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfamF2YS9zcmMvY29tL2FuZHJvaWQvZ2wyamF2YS9HTDJKYXZhQWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy9nbDJfamF2YS9zcmMvY29tL2FuZHJvaWQvZ2wyamF2YS9HTDJKYXZhQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2NTRmYi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvc3JjL2NvbS9hbmRyb2lkL2dsMmphdmEvR0wySmF2YUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbDJqYXZhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotCi1wdWJsaWMgY2xhc3MgR0wySmF2YUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgR0wySmF2YVZpZXcgbVZpZXc7Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotICAgICAgICBtVmlldyA9IG5ldyBHTDJKYXZhVmlldyhnZXRBcHBsaWNhdGlvbigpKTsKLQlzZXRDb250ZW50VmlldyhtVmlldyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICAgICAgbVZpZXcub25QYXVzZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvc3JjL2NvbS9hbmRyb2lkL2dsMmphdmEvR0wySmF2YVZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy9nbDJfamF2YS9zcmMvY29tL2FuZHJvaWQvZ2wyamF2YS9HTDJKYXZhVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjJiZmQzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfamF2YS9zcmMvY29tL2FuZHJvaWQvZ2wyamF2YS9HTDJKYXZhVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdsMmphdmE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7Ci1pbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7Ci0KLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOwotCi1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xFUzIwOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFN1cmZhY2VWaWV3IHRoYXQgdXNlcyB0aGUgZGVkaWNhdGVkIHN1cmZhY2UgZm9yCi0gKiBkaXNwbGF5aW5nIGFuIE9wZW5HTCBhbmltYXRpb24uICBUaGlzIGFsbG93cyB0aGUgYW5pbWF0aW9uIHRvIHJ1biBpbiBhCi0gKiBzZXBhcmF0ZSB0aHJlYWQsIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgaXQgYmUgZHJpdmVuIGJ5IHRoZSB1cGRhdGUgbWVjaGFuaXNtCi0gKiBvZiB0aGUgdmlldyBoaWVyYXJjaHkuCi0gKgotICogVGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlbmRlcmluZyBjb2RlIGlzIGRlbGVnYXRlZCB0byBhIEdMVmlldy5SZW5kZXJlcgotICogaW5zdGFuY2UuCi0gKi8KLWNsYXNzIEdMMkphdmFWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBRyA9ICJHTDJKYXZhVmlldyI7Ci0KLSAgICBwdWJsaWMgR0wySmF2YVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBzZXRFR0xDb250ZXh0Q2xpZW50VmVyc2lvbigyKTsKLSAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7Ci0KLSAgICAgICAgcHVibGljIFJlbmRlcmVyKCkgewotICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXMgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KG1UcmlhbmdsZVZlcnRpY2VzRGF0YS5sZW5ndGggKiA0KQotICAgICAgICAgICAgICAgIC5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSkuYXNGbG9hdEJ1ZmZlcigpOwotICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXMucHV0KG1UcmlhbmdsZVZlcnRpY2VzRGF0YSkucG9zaXRpb24oMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7Ci0gICAgICAgICAgICBHTEVTMjAuZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOwotICAgICAgICAgICAgR0xFUzIwLmdsQ2xlYXIoIEdMRVMyMC5HTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xFUzIwLkdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgICAgR0xFUzIwLmdsVXNlUHJvZ3JhbShtUHJvZ3JhbSk7Ci0gICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsVXNlUHJvZ3JhbSIpOwotCi0gICAgICAgICAgICBHTEVTMjAuZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG12UG9zaXRpb25IYW5kbGUsIDIsIEdMRVMyMC5HTF9GTE9BVCwgZmFsc2UsIDAsIG1UcmlhbmdsZVZlcnRpY2VzKTsKLSAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyIik7Ci0gICAgICAgICAgICBHTEVTMjAuZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtdlBvc2l0aW9uSGFuZGxlKTsKLSAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSIpOwotICAgICAgICAgICAgR0xFUzIwLmdsRHJhd0FycmF5cyhHTEVTMjAuR0xfVFJJQU5HTEVTLCAwLCAzKTsKLSAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xEcmF3QXJyYXlzIik7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBHTEVTMjAuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAgICAgbVByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKG1WZXJ0ZXhTaGFkZXIsIG1GcmFnbWVudFNoYWRlcik7Ci0gICAgICAgICAgICBpZiAobVByb2dyYW0gPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG12UG9zaXRpb25IYW5kbGUgPSBHTEVTMjAuZ2xHZXRBdHRyaWJMb2NhdGlvbihtUHJvZ3JhbSwgInZQb3NpdGlvbiIpOwotICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbEdldEF0dHJpYkxvY2F0aW9uIik7Ci0gICAgICAgICAgICBpZiAobXZQb3NpdGlvbkhhbmRsZSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IGF0dHJpYiBsb2NhdGlvbiBmb3IgdlBvc2l0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBsb2FkU2hhZGVyKGludCBzaGFkZXJUeXBlLCBTdHJpbmcgc291cmNlKSB7Ci0gICAgICAgICAgICBpbnQgc2hhZGVyID0gR0xFUzIwLmdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwotICAgICAgICAgICAgaWYgKHNoYWRlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsU2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKTsKLSAgICAgICAgICAgICAgICBHTEVTMjAuZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgICAgICAgICAgaW50W10gY29tcGlsZWQgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgICAgIEdMRVMyMC5nbEdldFNoYWRlcml2KHNoYWRlciwgR0xFUzIwLkdMX0NPTVBJTEVfU1RBVFVTLCBjb21waWxlZCwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVkWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyICIgKyBzaGFkZXJUeXBlICsgIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBHTEVTMjAuZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikpOwotICAgICAgICAgICAgICAgICAgICBHTEVTMjAuZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgc2hhZGVyID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2hhZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgY3JlYXRlUHJvZ3JhbShTdHJpbmcgdmVydGV4U291cmNlLCBTdHJpbmcgZnJhZ21lbnRTb3VyY2UpIHsKLSAgICAgICAgICAgIGludCB2ZXJ0ZXhTaGFkZXIgPSBsb2FkU2hhZGVyKEdMRVMyMC5HTF9WRVJURVhfU0hBREVSLCB2ZXJ0ZXhTb3VyY2UpOwotICAgICAgICAgICAgaWYgKHZlcnRleFNoYWRlciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBwaXhlbFNoYWRlciA9IGxvYWRTaGFkZXIoR0xFUzIwLkdMX0ZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTb3VyY2UpOwotICAgICAgICAgICAgaWYgKHBpeGVsU2hhZGVyID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHByb2dyYW0gPSBHTEVTMjAuZ2xDcmVhdGVQcm9ncmFtKCk7Ci0gICAgICAgICAgICBpZiAocHJvZ3JhbSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciIpOwotICAgICAgICAgICAgICAgIEdMRVMyMC5nbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBwaXhlbFNoYWRlcik7Ci0gICAgICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciIpOwotICAgICAgICAgICAgICAgIEdMRVMyMC5nbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICAgICAgICAgIGludFtdIGxpbmtTdGF0dXMgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgICAgIEdMRVMyMC5nbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTEVTMjAuR0xfTElOS19TVEFUVVMsIGxpbmtTdGF0dXMsIDApOwotICAgICAgICAgICAgICAgIGlmIChsaW5rU3RhdHVzWzBdICE9IEdMRVMyMC5HTF9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBsaW5rIHByb2dyYW06ICIpOwotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIEdMRVMyMC5nbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pKTsKLSAgICAgICAgICAgICAgICAgICAgR0xFUzIwLmdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHByb2dyYW07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tHbEVycm9yKFN0cmluZyBvcCkgewotICAgICAgICAgICAgaW50IGVycm9yOwotICAgICAgICAgICAgd2hpbGUgKChlcnJvciA9IEdMRVMyMC5nbEdldEVycm9yKCkpICE9IEdMRVMyMC5HTF9OT19FUlJPUikgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgb3AgKyAiOiBnbEVycm9yICIgKyBlcnJvcik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24ob3AgKyAiOiBnbEVycm9yICIgKyBlcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbVRyaWFuZ2xlVmVydGljZXNEYXRhID0geyAwLjBmLCAwLjVmLCAtMC41ZiwgLTAuNWYsCi0gICAgICAgICAgICAgICAgMC41ZiwgLTAuNWYgfTsKLQotICAgICAgICBwcml2YXRlIEZsb2F0QnVmZmVyIG1UcmlhbmdsZVZlcnRpY2VzOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WZXJ0ZXhTaGFkZXIgPSAiYXR0cmlidXRlIHZlYzQgdlBvc2l0aW9uO1xuIgotICAgICAgICAgICAgKyAidm9pZCBtYWluKCkge1xuIgotICAgICAgICAgICAgKyAiICBnbF9Qb3NpdGlvbiA9IHZQb3NpdGlvbjtcbiIKLSAgICAgICAgICAgICsgIn1cbiI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUZyYWdtZW50U2hhZGVyID0gInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICAgICAgICAgKyAidm9pZCBtYWluKCkge1xuIgotICAgICAgICAgICAgKyAiICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMS4wLCAwLjAsIDEuMCk7XG4iCi0gICAgICAgICAgICArICJ9XG4iOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1Qcm9ncmFtOwotICAgICAgICBwcml2YXRlIGludCBtdlBvc2l0aW9uSGFuZGxlOwotCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5MGZmNi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBPcGVuR0wgRVMgSk5JIHNhbXBsZQotIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGFuIGFjdGl2aXR5IGFuZCBhIHNoYXJlZCBsaWJyYXJ5LgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIEJ1aWxkIGFjdGl2aXR5Ci0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gR0wySk5JCi0KLUxPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmdsMmpuaQotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCdWlsZCBKTkkgU2hhcmVkIExpYnJhcnkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTE9DQUxfUEFUSDo9ICQoTE9DQUxfUEFUSCkvam5pCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIE9wdGlvbmFsIHRhZyB3b3VsZCBtZWFuIGl0IGRvZXNuJ3QgZ2V0IGluc3RhbGxlZCBieSBkZWZhdWx0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvcgotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gIGdsX2NvZGUuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYnV0aWxzIFwKLQlsaWJFR0wgXAotCWxpYkdMRVN2MgotCi1MT0NBTF9NT0RVTEUgOj0gbGliZ2wyam5pCi0KLQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyN2U1Zi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5nbDJqbmkiPgotICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9nbDJqbmlfYWN0aXZpdHkiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJHTDJKTklBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCi0gICAgICAgICAgICAJYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIgotICAgICAgICAgICAgCWFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvam5pL2dsX2NvZGUuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvam5pL2dsX2NvZGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTZiZDkzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfam5pL2puaS9nbF9jb2RlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLyBPcGVuR0wgRVMgMi4wIGNvZGUKLQotI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9qbmkuaD4KLSNkZWZpbmUgTE9HX1RBRyAiR0wySk5JIGdsX2NvZGUuY3BwIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLXN0YXRpYyB2b2lkIHByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpIHsKLSAgICBjb25zdCBjaGFyICp2ID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcocyk7Ci0gICAgQUxPR0koIkdMICVzID0gJXNcbiIsIG5hbWUsIHYpOwotfQotCi1zdGF0aWMgdm9pZCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApIHsKLSAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKLSAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIEFMT0dJKCJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgZ1ZlcnRleFNoYWRlcltdID0gImF0dHJpYnV0ZSB2ZWM0IHZQb3NpdGlvbjtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX1Bvc2l0aW9uID0gdlBvc2l0aW9uO1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBnRnJhZ21lbnRTaGFkZXJbXSA9ICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wLCAxLjAsIDAuMCwgMS4wKTtcbiIKLSAgICAifVxuIjsKLQotR0x1aW50IGxvYWRTaGFkZXIoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UpIHsKLSAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7Ci0gICAgaWYgKHNoYWRlcikgewotICAgICAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZwU291cmNlLCBOVUxMKTsKLSAgICAgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgIEdMaW50IGNvbXBpbGVkID0gMDsKLSAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZWQpOwotICAgICAgICBpZiAoIWNvbXBpbGVkKSB7Ci0gICAgICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKLSAgICAgICAgICAgIGlmIChpbmZvTGVuKSB7Ci0gICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyICVkOlxuJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyVHlwZSwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNoYWRlcjsKLX0KLQotR0x1aW50IGNyZWF0ZVByb2dyYW0oY29uc3QgY2hhciogcFZlcnRleFNvdXJjZSwgY29uc3QgY2hhciogcEZyYWdtZW50U291cmNlKSB7Ci0gICAgR0x1aW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgcFZlcnRleFNvdXJjZSk7Ci0gICAgaWYgKCF2ZXJ0ZXhTaGFkZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgR0x1aW50IHBpeGVsU2hhZGVyID0gbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIHBGcmFnbWVudFNvdXJjZSk7Ci0gICAgaWYgKCFwaXhlbFNoYWRlcikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtKSB7Ci0gICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIiKTsKLSAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgcGl4ZWxTaGFkZXIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIik7Ci0gICAgICAgIGdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgIEdMaW50IGxpbmtTdGF0dXMgPSBHTF9GQUxTRTsKLSAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZsaW5rU3RhdHVzKTsKLSAgICAgICAgaWYgKGxpbmtTdGF0dXMgIT0gR0xfVFJVRSkgewotICAgICAgICAgICAgR0xpbnQgYnVmTGVuZ3RoID0gMDsKLSAgICAgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwgJmJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoYnVmTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoYnVmTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSwgYnVmTGVuZ3RoLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGxpbmsgcHJvZ3JhbTpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICAgICAgcHJvZ3JhbSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByb2dyYW07Ci19Ci0KLUdMdWludCBnUHJvZ3JhbTsKLUdMdWludCBndlBvc2l0aW9uSGFuZGxlOwotCi1ib29sIHNldHVwR3JhcGhpY3MoaW50IHcsIGludCBoKSB7Ci0gICAgcHJpbnRHTFN0cmluZygiVmVyc2lvbiIsIEdMX1ZFUlNJT04pOwotICAgIHByaW50R0xTdHJpbmcoIlZlbmRvciIsIEdMX1ZFTkRPUik7Ci0gICAgcHJpbnRHTFN0cmluZygiUmVuZGVyZXIiLCBHTF9SRU5ERVJFUik7Ci0gICAgcHJpbnRHTFN0cmluZygiRXh0ZW5zaW9ucyIsIEdMX0VYVEVOU0lPTlMpOwotCi0gICAgQUxPR0koInNldHVwR3JhcGhpY3MoJWQsICVkKSIsIHcsIGgpOwotICAgIGdQcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnVmVydGV4U2hhZGVyLCBnRnJhZ21lbnRTaGFkZXIpOwotICAgIGlmICghZ1Byb2dyYW0pIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBjcmVhdGUgcHJvZ3JhbS4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBndlBvc2l0aW9uSGFuZGxlID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihnUHJvZ3JhbSwgInZQb3NpdGlvbiIpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOwotICAgIEFMT0dJKCJnbEdldEF0dHJpYkxvY2F0aW9uKFwidlBvc2l0aW9uXCIpID0gJWRcbiIsCi0gICAgICAgICAgICBndlBvc2l0aW9uSGFuZGxlKTsKLQotICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFZpZXdwb3J0Iik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEdMZmxvYXQgZ1RyaWFuZ2xlVmVydGljZXNbXSA9IHsgMC4wZiwgMC41ZiwgLTAuNWYsIC0wLjVmLAotICAgICAgICAwLjVmLCAtMC41ZiB9OwotCi12b2lkIHJlbmRlckZyYW1lKCkgewotICAgIHN0YXRpYyBmbG9hdCBncmV5OwotICAgIGdyZXkgKz0gMC4wMWY7Ci0gICAgaWYgKGdyZXkgPiAxLjBmKSB7Ci0gICAgICAgIGdyZXkgPSAwLjBmOwotICAgIH0KLSAgICBnbENsZWFyQ29sb3IoZ3JleSwgZ3JleSwgZ3JleSwgMS4wZik7Ci0gICAgY2hlY2tHbEVycm9yKCJnbENsZWFyQ29sb3IiKTsKLSAgICBnbENsZWFyKCBHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbENsZWFyIik7Ci0KLSAgICBnbFVzZVByb2dyYW0oZ1Byb2dyYW0pOwotICAgIGNoZWNrR2xFcnJvcigiZ2xVc2VQcm9ncmFtIik7Ci0KLSAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoZ3ZQb3NpdGlvbkhhbmRsZSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCBnVHJpYW5nbGVWZXJ0aWNlcyk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFZlcnRleEF0dHJpYlBvaW50ZXIiKTsKLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGd2UG9zaXRpb25IYW5kbGUpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSIpOwotICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIDMpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xEcmF3QXJyYXlzIik7Ci19Ci0KLWV4dGVybiAiQyIgewotICAgIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbDJqbmlfR0wySk5JTGliX2luaXQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KTsKLSAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2wyam5pX0dMMkpOSUxpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopOwotfTsKLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dsMmpuaV9HTDJKTklMaWJfaW5pdChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqLCAgamludCB3aWR0aCwgamludCBoZWlnaHQpDQotewotICAgIHNldHVwR3JhcGhpY3Mod2lkdGgsIGhlaWdodCk7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbDJqbmlfR0wySk5JTGliX3N0ZXAoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaikKLXsKLSAgICByZW5kZXJGcmFtZSgpOwotfQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5Yzc0Yi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZwotICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJnbDJqbmlfYWN0aXZpdHkiPkdMMkpOSTwvc3RyaW5nPgotCi08L3Jlc291cmNlcz4KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsMmpuaS9HTDJKTklBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsMmpuaS9HTDJKTklBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzY2YTJjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfam5pL3NyYy9jb20vYW5kcm9pZC9nbDJqbmkvR0wySk5JQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdsMmpuaTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLQotcHVibGljIGNsYXNzIEdMMkpOSUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgR0wySk5JVmlldyBtVmlldzsKLQotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0gICAgICAgIG1WaWV3ID0gbmV3IEdMMkpOSVZpZXcoZ2V0QXBwbGljYXRpb24oKSk7Ci0Jc2V0Q29udGVudFZpZXcobVZpZXcpOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsMmpuaS9HTDJKTklMaWIuamF2YSBiL29wZW5nbC90ZXN0cy9nbDJfam5pL3NyYy9jb20vYW5kcm9pZC9nbDJqbmkvR0wySk5JTGliLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MGE5ODQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsMmpuaS9HTDJKTklMaWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdsMmpuaTsKLQotLy8gV3JhcHBlciBmb3IgbmF0aXZlIGxpYnJhcnkKLQotcHVibGljIGNsYXNzIEdMMkpOSUxpYiB7Ci0KLSAgICAgc3RhdGljIHsKLSAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiZ2wyam5pIik7Ci0gICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgY3VycmVudCB2aWV3IHdpZHRoCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgY3VycmVudCB2aWV3IGhlaWdodAotICAgICAqLwotICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGVwKCk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9zcmMvY29tL2FuZHJvaWQvZ2wyam5pL0dMMkpOSVZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy9nbDJfam5pL3NyYy9jb20vYW5kcm9pZC9nbDJqbmkvR0wySk5JVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmIxZGZiLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfam5pL3NyYy9jb20vYW5kcm9pZC9nbDJqbmkvR0wySk5JVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdsMmpuaTsKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQ7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXk7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgotICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQotICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQotICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgotICoKLSAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKLSAqIGluc3RhbmNlLgotICovCi1jbGFzcyBHTDJKTklWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBRyA9ICJHTDJKTklWaWV3IjsKLQotICAgIHB1YmxpYyBHTDJKTklWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgaW5pdChmYWxzZSwgMCwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIEdMMkpOSVZpZXcoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHRyYW5zbHVjZW50LCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBpbml0KHRyYW5zbHVjZW50LCBkZXB0aCwgc3RlbmNpbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoYm9vbGVhbiB0cmFuc2x1Y2VudCwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgewotICAgICAgICBzZXRFR0xDb250ZXh0RmFjdG9yeShuZXcgQ29udGV4dEZhY3RvcnkoKSk7Ci0gICAgICAgIHNldEVHTENvbmZpZ0Nob29zZXIoIHRyYW5zbHVjZW50ID8KLSAgICAgICAgICAgICAgbmV3IENvbmZpZ0Nob29zZXIoOCw4LDgsOCwgZGVwdGgsIHN0ZW5jaWwpIDoKLSAgICAgICAgICAgICAgbmV3IENvbmZpZ0Nob29zZXIoNSw2LDUsMCwgZGVwdGgsIHN0ZW5jaWwpKTsKLSAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRleHRGYWN0b3J5IGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5FR0xDb250ZXh0RmFjdG9yeSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiA9IDB4MzA5ODsKLSAgICAgICAgcHVibGljIEVHTENvbnRleHQgY3JlYXRlQ29udGV4dChFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGVnbENvbmZpZykgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiY3JlYXRpbmcgT3BlbkdMIEVTIDIuMCBjb250ZXh0Iik7Ci0gICAgICAgICAgICBjaGVja0VnbEVycm9yKCJCZWZvcmUgZWdsQ3JlYXRlQ29udGV4dCIsIGVnbCk7Ci0gICAgICAgICAgICBpbnRbXSBhdHRyaWJfbGlzdCA9IHtFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMMTAuRUdMX05PTkUgfTsKLSAgICAgICAgICAgIEVHTENvbnRleHQgY29udGV4dCA9IGVnbC5lZ2xDcmVhdGVDb250ZXh0KGRpc3BsYXksIGVnbENvbmZpZywgRUdMMTAuRUdMX05PX0NPTlRFWFQsIGF0dHJpYl9saXN0KTsKLSAgICAgICAgICAgIGNoZWNrRWdsRXJyb3IoIkFmdGVyIGVnbENyZWF0ZUNvbnRleHQiLCBlZ2wpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95Q29udGV4dChFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBlZ2wuZWdsRGVzdHJveUNvbnRleHQoZGlzcGxheSwgY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRWdsRXJyb3IoU3RyaW5nIHByb21wdCwgRUdMMTAgZWdsKSB7Ci0gICAgICAgIGludCBlcnJvcjsKLSAgICAgICAgd2hpbGUgKChlcnJvciA9IGVnbC5lZ2xHZXRFcnJvcigpKSAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgTG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KCIlczogRUdMIGVycm9yOiAweCV4IiwgcHJvbXB0LCBlcnJvcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29uZmlnQ2hvb3NlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuRUdMQ29uZmlnQ2hvb3NlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBFR0xfT1BFTkdMX0VTMl9CSVQgPSA0OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBzX2NvbmZpZ0F0dHJpYnMyID0KLSAgICAgICAgewotICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCA0LAotICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDQsCi0gICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCA0LAotICAgICAgICAgICAgRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUKLSAgICAgICAgfTsKLQotICAgICAgICBwdWJsaWMgQ29uZmlnQ2hvb3NlcihpbnQgciwgaW50IGcsIGludCBiLCBpbnQgYSwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgewotICAgICAgICAgICAgbVJlZFNpemUgPSByOwotICAgICAgICAgICAgbUdyZWVuU2l6ZSA9IGc7Ci0gICAgICAgICAgICBtQmx1ZVNpemUgPSBiOwotICAgICAgICAgICAgbUFscGhhU2l6ZSA9IGE7Ci0gICAgICAgICAgICBtRGVwdGhTaXplID0gZGVwdGg7Ci0gICAgICAgICAgICBtU3RlbmNpbFNpemUgPSBzdGVuY2lsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXkpIHsKLQotICAgICAgICAgICAgaW50W10gbnVtX2NvbmZpZyA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICBlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIHNfY29uZmlnQXR0cmliczIsIG51bGwsIDAsIG51bV9jb25maWcpOwotCi0gICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IG51bV9jb25maWdbMF07Ci0KLSAgICAgICAgICAgIGlmIChudW1Db25maWdzIDw9IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb25maWdzIG1hdGNoIGNvbmZpZ1NwZWMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnW251bUNvbmZpZ3NdOwotICAgICAgICAgICAgZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBzX2NvbmZpZ0F0dHJpYnMyLCBjb25maWdzLCBudW1Db25maWdzLCBudW1fY29uZmlnKTsKLSAgICAgICAgICAgIC8vIHByaW50Q29uZmlncyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOwotICAgICAgICAgICAgcmV0dXJuIGNob29zZUNvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncykgewotICAgICAgICAgICAgRUdMQ29uZmlnIGNsb3Nlc3RDb25maWcgPSBudWxsOwotICAgICAgICAgICAgaW50IGNsb3Nlc3REaXN0YW5jZSA9IDEwMDA7Ci0gICAgICAgICAgICBmb3IoRUdMQ29uZmlnIGNvbmZpZyA6IGNvbmZpZ3MpIHsKLSAgICAgICAgICAgICAgICBpbnQgZCA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgaW50IHMgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGQgPj0gbURlcHRoU2l6ZSAmJiBzPj0gbVN0ZW5jaWxTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIDApOwotICAgICAgICAgICAgICAgICAgICBpbnQgZyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBkaXN0YW5jZSA9IE1hdGguYWJzKHIgLSBtUmVkU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhnIC0gbUdyZWVuU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhiIC0gbUJsdWVTaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGEgLSBtQWxwaGFTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgY2xvc2VzdERpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RDb25maWcgPSBjb25maWc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2xvc2VzdENvbmZpZzsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRDb25maWdBdHRyaWIoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgaW50IGF0dHJpYnV0ZSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCi0gICAgICAgICAgICBpZiAoZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwgbVZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtVmFsdWVbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByaW50Q29uZmlncyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKLSAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKLSAgICAgICAgICAgIGludCBudW1Db25maWdzID0gY29uZmlncy5sZW5ndGg7Ci0gICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiVkIGNvbmZpZ3VyYXRpb25zIiwgbnVtQ29uZmlncykpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIkNvbmZpZ3VyYXRpb24gJWQ6XG4iLCBpKSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcmludENvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKLSAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnKSB7Ci0gICAgICAgICAgICBpbnRbXSBhdHRyaWJ1dGVzID0gewotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQlVGRkVSX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTkZJR19DQVZFQVQsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT05GSUdfSUQsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9MRVZFTCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX0hFSUdIVCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX1BJWEVMUywKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1JFTkRFUkFCTEUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfVklTVUFMX0lELAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1ZJU1VBTF9UWVBFLAotICAgICAgICAgICAgICAgICAgICAweDMwMzAsIC8vIEVHTDEwLkVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU0FNUExFUywKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NBTVBMRV9CVUZGRVJTLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1VSRkFDRV9UWVBFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDM5LCAvLyBFR0wxMC5FR0xfQklORF9UT19URVhUVVJFX1JHQiwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDNBLCAvLyBFR0wxMC5FR0xfQklORF9UT19URVhUVVJFX1JHQkEsCi0gICAgICAgICAgICAgICAgICAgIDB4MzAzQiwgLy8gRUdMMTAuRUdMX01JTl9TV0FQX0lOVEVSVkFMLAotICAgICAgICAgICAgICAgICAgICAweDMwM0MsIC8vIEVHTDEwLkVHTF9NQVhfU1dBUF9JTlRFUlZBTCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0xVTUlOQU5DRV9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfTUFTS19TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09MT1JfQlVGRkVSX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIDB4MzA0MiAvLyBFR0wxMC5FR0xfQ09ORk9STUFOVAotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gewotICAgICAgICAgICAgICAgICAgICAiRUdMX0JVRkZFUl9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9BTFBIQV9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9CTFVFX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0dSRUVOX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1JFRF9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9ERVBUSF9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9TVEVOQ0lMX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZJR19DQVZFQVQiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZJR19JRCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTEVWRUwiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX0hFSUdIVCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfUElYRUxTIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9XSURUSCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1JFTkRFUkFCTEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9WSVNVQUxfSUQiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9WSVNVQUxfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfUFJFU0VSVkVEX1JFU09VUkNFUyIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfU0FNUExFUyIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfU0FNUExFX0JVRkZFUlMiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1NVUkZBQ0VfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQklORF9UT19URVhUVVJFX1JHQiIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQklORF9UT19URVhUVVJFX1JHQkEiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX01JTl9TV0FQX0lOVEVSVkFMIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfU1dBUF9JTlRFUlZBTCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTFVNSU5BTkNFX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0FMUEhBX01BU0tfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQ09MT1JfQlVGRkVSX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1JFTkRFUkFCTEVfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORk9STUFOVCIKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBpbnRbXSB2YWx1ZSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgYXR0cmlidXRlID0gYXR0cmlidXRlc1tpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotICAgICAgICAgICAgICAgIGlmICggZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwgdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiICAlczogJWRcbiIsIG5hbWUsIHZhbHVlWzBdKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIgICVzOiBmYWlsZWRcbiIsIG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVnbC5lZ2xHZXRFcnJvcigpICE9IEVHTDEwLkVHTF9TVUNDRVNTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdWJjbGFzc2VzIGNhbiBhZGp1c3QgdGhlc2UgdmFsdWVzOgotICAgICAgICBwcm90ZWN0ZWQgaW50IG1SZWRTaXplOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1HcmVlblNpemU7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgbUJsdWVTaXplOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1BbHBoYVNpemU7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgbURlcHRoU2l6ZTsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtU3RlbmNpbFNpemU7Ci0gICAgICAgIHByaXZhdGUgaW50W10gbVZhbHVlID0gbmV3IGludFsxXTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7Ci0gICAgICAgICAgICBHTDJKTklMaWIuc3RlcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgIEdMMkpOSUxpYi5pbml0KHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX3l1dnRleC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsMl95dXZ0ZXgvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0Mzc1OS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX3l1dnRleC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWdsMl95dXZ0ZXguY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjIgXAotICAgIGxpYnVpCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZ2wyX3l1dnRleAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl95dXZ0ZXgvZ2wyX3l1dnRleC5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2wyX3l1dnRleC9nbDJfeXV2dGV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlNDkzMi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX3l1dnRleC9nbDJfeXV2dGV4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotc3RhdGljIHZvaWQgcHJpbnRHTFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBHTGVudW0gcykgewotICAgIC8vIGZwcmludGYoc3RkZXJyLCAicHJpbnRHTFN0cmluZyAlcywgJWRcbiIsIG5hbWUsIHMpOwotICAgIGNvbnN0IGNoYXIgKnYgPSAoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhzKTsKLSAgICAvLyBpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7Ci0gICAgLy8gZnByaW50ZihzdGRlcnIsICJnbEdldEVycm9yKCkgPSAlZCwgcmVzdWx0IG9mIGdsR2V0U3RyaW5nID0gJXhcbiIsIGVycm9yLAotICAgIC8vICAgICAgICAodW5zaWduZWQgaW50KSB2KTsKLSAgICAvLyBpZiAoKHYgPCAoY29uc3QgY2hhciopIDApIHx8ICh2ID4gKGNvbnN0IGNoYXIqKSAweDEwMDAwKSkKLSAgICAvLyAgICBmcHJpbnRmKHN0ZGVyciwgIkdMICVzID0gJXNcbiIsIG5hbWUsIHYpOwotICAgIC8vIGVsc2UKLSAgICAvLyAgICBmcHJpbnRmKHN0ZGVyciwgIkdMICVzID0gKG51bGwpIDB4JTA4eFxuIiwgbmFtZSwgKHVuc2lnbmVkIGludCkgdik7Ci0gICAgZnByaW50ZihzdGRlcnIsICJHTCAlcyA9ICVzXG4iLCBuYW1lLCB2KTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwgPSBFR0xfVFJVRSkgewotICAgIGlmIChyZXR1cm5WYWwgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcygpIHJldHVybmVkICVkXG4iLCBvcCwgcmV0dXJuVmFsKTsKLSAgICB9Ci0KLSAgICBmb3IgKEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7IGVycm9yICE9IEVHTF9TVUNDRVNTOyBlcnJvcgotICAgICAgICAgICAgPSBlZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBlZ2xFcnJvciAlcyAoMHgleClcbiIsIG9wLCBFR0xVdGlsczo6c3RyZXJyb3IoZXJyb3IpLAotICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkgewotICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgotICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgZ1ZlcnRleFNoYWRlcltdID0gImF0dHJpYnV0ZSB2ZWM0IHZQb3NpdGlvbjtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHl1dlRleENvb3JkcztcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIHl1dlRleENvb3JkcyA9IHZQb3NpdGlvbi54eSArIHZlYzIoMC41LCAwLjUpO1xuIgotICAgICIgIGdsX1Bvc2l0aW9uID0gdlBvc2l0aW9uO1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBnRnJhZ21lbnRTaGFkZXJbXSA9ICIjZXh0ZW5zaW9uIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgOiByZXF1aXJlXG4iCi0gICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXJFeHRlcm5hbE9FUyB5dXZUZXhTYW1wbGVyO1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgeXV2VGV4Q29vcmRzO1xuIgotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHl1dlRleFNhbXBsZXIsIHl1dlRleENvb3Jkcyk7XG4iCi0gICAgIn1cbiI7Ci0KLUdMdWludCBsb2FkU2hhZGVyKEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyKiBwU291cmNlKSB7Ci0gICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwotICAgIGlmIChzaGFkZXIpIHsKLSAgICAgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7Ci0gICAgICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgICAgICBHTGludCBjb21waWxlZCA9IDA7Ci0gICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKLSAgICAgICAgaWYgKCFjb21waWxlZCkgewotICAgICAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7Ci0gICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgICAgICBpZiAoaW5mb0xlbikgewotICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOwotICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgY29tcGlsZSBzaGFkZXIgJWQ6XG4lc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJUeXBlLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkd1ZXNzaW5nIGF0IEdMX0lORk9fTE9HX0xFTkdUSCBzaXplXG4iKTsKLSAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYygweDEwMDApOwotICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgMHgxMDAwLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAlZDpcbiVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclR5cGUsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgc2hhZGVyID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2hhZGVyOwotfQotCi1HTHVpbnQgY3JlYXRlUHJvZ3JhbShjb25zdCBjaGFyKiBwVmVydGV4U291cmNlLCBjb25zdCBjaGFyKiBwRnJhZ21lbnRTb3VyY2UpIHsKLSAgICBHTHVpbnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCBwVmVydGV4U291cmNlKTsKLSAgICBpZiAoIXZlcnRleFNoYWRlcikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBHTHVpbnQgcGl4ZWxTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUiwgcEZyYWdtZW50U291cmNlKTsKLSAgICBpZiAoIXBpeGVsU2hhZGVyKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEdMdWludCBwcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7Ci0gICAgaWYgKHByb2dyYW0pIHsKLSAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciIpOwotICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBwaXhlbFNoYWRlcik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIiKTsKLSAgICAgICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgR0xpbnQgbGlua1N0YXR1cyA9IEdMX0ZBTFNFOwotICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJmxpbmtTdGF0dXMpOwotICAgICAgICBpZiAobGlua1N0YXR1cyAhPSBHTF9UUlVFKSB7Ci0gICAgICAgICAgICBHTGludCBidWZMZW5ndGggPSAwOwotICAgICAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmYnVmTGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChidWZMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhidWZMZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtLCBidWZMZW5ndGgsIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGxpbmsgcHJvZ3JhbTpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICAgICAgcHJvZ3JhbSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByb2dyYW07Ci19Ci0KLUdMdWludCBnUHJvZ3JhbTsKLUdMaW50IGd2UG9zaXRpb25IYW5kbGU7Ci1HTGludCBnWXV2VGV4U2FtcGxlckhhbmRsZTsKLQotYm9vbCBzZXR1cEdyYXBoaWNzKGludCB3LCBpbnQgaCkgewotICAgIGdQcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnVmVydGV4U2hhZGVyLCBnRnJhZ21lbnRTaGFkZXIpOwotICAgIGlmICghZ1Byb2dyYW0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBndlBvc2l0aW9uSGFuZGxlID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihnUHJvZ3JhbSwgInZQb3NpdGlvbiIpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZ2xHZXRBdHRyaWJMb2NhdGlvbihcInZQb3NpdGlvblwiKSA9ICVkXG4iLAotICAgICAgICAgICAgZ3ZQb3NpdGlvbkhhbmRsZSk7Ci0gICAgZ1l1dlRleFNhbXBsZXJIYW5kbGUgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihnUHJvZ3JhbSwgInl1dlRleFNhbXBsZXIiKTsKLSAgICBjaGVja0dsRXJyb3IoImdsR2V0VW5pZm9ybUxvY2F0aW9uIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICJnbEdldFVuaWZvcm1Mb2NhdGlvbihcInl1dlRleFNhbXBsZXJcIikgPSAlZFxuIiwKLSAgICAgICAgICAgIGdZdXZUZXhTYW1wbGVySGFuZGxlKTsKLQotICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFZpZXdwb3J0Iik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBhbGlnbihpbnQgeCwgaW50IGEpIHsKLSAgICByZXR1cm4gKHggKyAoYS0xKSkgJiAofihhLTEpKTsKLX0KLQotY29uc3QgaW50IHl1dlRleFdpZHRoID0gNjA4OwotY29uc3QgaW50IHl1dlRleEhlaWdodCA9IDQ4MDsKLWNvbnN0IGludCB5dXZUZXhVc2FnZSA9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX1RFWFRVUkUgfAotICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19XUklURV9SQVJFTFk7Ci1jb25zdCBpbnQgeXV2VGV4Rm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwotY29uc3QgaW50IHl1dlRleE9mZnNldFkgPSAwOwotY29uc3QgYm9vbCB5dXZUZXhTYW1lVVYgPSBmYWxzZTsKLXN0YXRpYyBzcDxHcmFwaGljQnVmZmVyPiB5dXZUZXhCdWZmZXI7Ci1zdGF0aWMgR0x1aW50IHl1dlRleDsKLQotYm9vbCBzZXR1cFl1dlRleFN1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY29udGV4dCkgewotICAgIGludCBibG9ja1dpZHRoID0geXV2VGV4V2lkdGggPiAxNiA/IHl1dlRleFdpZHRoIC8gMTYgOiAxOwotICAgIGludCBibG9ja0hlaWdodCA9IHl1dlRleEhlaWdodCA+IDE2ID8geXV2VGV4SGVpZ2h0IC8gMTYgOiAxOwotICAgIHl1dlRleEJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKHl1dlRleFdpZHRoLCB5dXZUZXhIZWlnaHQsIHl1dlRleEZvcm1hdCwKLSAgICAgICAgICAgIHl1dlRleFVzYWdlKTsKLSAgICBpbnQgeXV2VGV4U3RyaWRlWSA9IHl1dlRleEJ1ZmZlci0+Z2V0U3RyaWRlKCk7Ci0gICAgaW50IHl1dlRleE9mZnNldFYgPSB5dXZUZXhTdHJpZGVZICogeXV2VGV4SGVpZ2h0OwotICAgIGludCB5dXZUZXhTdHJpZGVWID0gKHl1dlRleFN0cmlkZVkvMiArIDB4ZikgJiB+MHhmOwotICAgIGludCB5dXZUZXhPZmZzZXRVID0geXV2VGV4T2Zmc2V0ViArIHl1dlRleFN0cmlkZVYgKiB5dXZUZXhIZWlnaHQvMjsKLSAgICBpbnQgeXV2VGV4U3RyaWRlVSA9IHl1dlRleFN0cmlkZVY7Ci0gICAgY2hhciogYnVmID0gTlVMTDsKLSAgICBzdGF0dXNfdCBlcnIgPSB5dXZUZXhCdWZmZXItPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmJ1ZikpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInl1dlRleEJ1ZmZlci0+bG9jayguLi4pIGZhaWxlZDogJWRcbiIsIGVycik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB5dXZUZXhXaWR0aDsgeCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgeXV2VGV4SGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgIGludCBwYXJpdHlYID0gKHggLyBibG9ja1dpZHRoKSAmIDE7Ci0gICAgICAgICAgICBpbnQgcGFyaXR5WSA9ICh5IC8gYmxvY2tIZWlnaHQpICYgMTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW50ZW5zaXR5ID0gKHBhcml0eVggXiBwYXJpdHlZKSA/IDYzIDogMTkxOwotICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFkgKyAoeSAqIHl1dlRleFN0cmlkZVkpICsgeF0gPSBpbnRlbnNpdHk7Ci0gICAgICAgICAgICBpZiAoeCA8IHl1dlRleFdpZHRoIC8gMiAmJiB5IDwgeXV2VGV4SGVpZ2h0IC8gMikgewotICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRVICsgKHkgKiB5dXZUZXhTdHJpZGVVKSArIHhdID0gaW50ZW5zaXR5OwotICAgICAgICAgICAgICAgIGlmICh5dXZUZXhTYW1lVVYpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoeSAqIHl1dlRleFN0cmlkZVYpICsgeF0gPSBpbnRlbnNpdHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4IDwgeXV2VGV4V2lkdGggLyA0ICYmIHkgPCB5dXZUZXhIZWlnaHQgLyA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkqMiAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMF0gPQotICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICh5KjIgKiB5dXZUZXhTdHJpZGVWKSArIHgqMiArIDFdID0KLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoKHkqMisxKSAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMF0gPQotICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICgoeSoyKzEpICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAxXSA9IGludGVuc2l0eTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSB5dXZUZXhCdWZmZXItPnVubG9jaygpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInl1dlRleEJ1ZmZlci0+dW5sb2NrKCkgZmFpbGVkOiAlZFxuIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEVHTENsaWVudEJ1ZmZlciBjbGllbnRCdWZmZXIgPSAoRUdMQ2xpZW50QnVmZmVyKXl1dlRleEJ1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCk7Ci0gICAgRUdMSW1hZ2VLSFIgaW1nID0gZWdsQ3JlYXRlSW1hZ2VLSFIoZHB5LCBFR0xfTk9fQ09OVEVYVCwgRUdMX05BVElWRV9CVUZGRVJfQU5EUk9JRCwKLSAgICAgICAgICAgIGNsaWVudEJ1ZmZlciwgMCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlSW1hZ2VLSFIiKTsKLSAgICBpZiAoaW1nID09IEVHTF9OT19JTUFHRV9LSFIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGdsR2VuVGV4dHVyZXMoMSwgJnl1dlRleCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEdlblRleHR1cmVzIik7Ci0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgeXV2VGV4KTsKLSAgICBjaGVja0dsRXJyb3IoImdsQmluZFRleHR1cmUiKTsKLSAgICBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCAoR0xlZ2xJbWFnZU9FUylpbWcpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyIpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEdMZmxvYXQgZ1RyaWFuZ2xlVmVydGljZXNbXSA9IHsKLSAgICAtMC41ZiwgMC41ZiwKLSAgICAtMC41ZiwgLTAuNWYsCi0gICAgMC41ZiwgLTAuNWYsCi0gICAgMC41ZiwgMC41ZiwKLX07Ci0KLXZvaWQgcmVuZGVyRnJhbWUoKSB7Ci0gICAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhckNvbG9yIik7Ci0gICAgZ2xDbGVhciggR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhciIpOwotCi0gICAgZ2xVc2VQcm9ncmFtKGdQcm9ncmFtKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVXNlUHJvZ3JhbSIpOwotCi0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGd2UG9zaXRpb25IYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgZ1RyaWFuZ2xlVmVydGljZXMpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyIik7Ci0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShndlBvc2l0aW9uSGFuZGxlKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkiKTsKLQotICAgIGdsVW5pZm9ybTFpKGdZdXZUZXhTYW1wbGVySGFuZGxlLCAwKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVW5pZm9ybTFpIik7Ci0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgeXV2VGV4KTsKLSAgICBjaGVja0dsRXJyb3IoImdsQmluZFRleHR1cmUiKTsKLQotICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xEcmF3QXJyYXlzIik7Ci19Ci0KLXZvaWQgcHJpbnRFR0xDb25maWd1cmF0aW9uKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnKSB7Ci0KLSNkZWZpbmUgWChWQUwpIHtWQUwsICNWQUx9Ci0gICAgc3RydWN0IHtFR0xpbnQgYXR0cmlidXRlOyBjb25zdCBjaGFyKiBuYW1lO30gbmFtZXNbXSA9IHsKLSAgICBYKEVHTF9CVUZGRVJfU0laRSksCi0gICAgWChFR0xfQUxQSEFfU0laRSksCi0gICAgWChFR0xfQkxVRV9TSVpFKSwKLSAgICBYKEVHTF9HUkVFTl9TSVpFKSwKLSAgICBYKEVHTF9SRURfU0laRSksCi0gICAgWChFR0xfREVQVEhfU0laRSksCi0gICAgWChFR0xfU1RFTkNJTF9TSVpFKSwKLSAgICBYKEVHTF9DT05GSUdfQ0FWRUFUKSwKLSAgICBYKEVHTF9DT05GSUdfSUQpLAotICAgIFgoRUdMX0xFVkVMKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1BJWEVMUyksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfV0lEVEgpLAotICAgIFgoRUdMX05BVElWRV9SRU5ERVJBQkxFKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX0lEKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX1RZUEUpLAotICAgIFgoRUdMX1NBTVBMRVMpLAotICAgIFgoRUdMX1NBTVBMRV9CVUZGRVJTKSwKLSAgICBYKEVHTF9TVVJGQUNFX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSksCi0gICAgWChFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBKSwKLSAgICBYKEVHTF9NSU5fU1dBUF9JTlRFUlZBTCksCi0gICAgWChFR0xfTUFYX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX0xVTUlOQU5DRV9TSVpFKSwKLSAgICBYKEVHTF9BTFBIQV9NQVNLX1NJWkUpLAotICAgIFgoRUdMX0NPTE9SX0JVRkZFUl9UWVBFKSwKLSAgICBYKEVHTF9SRU5ERVJBQkxFX1RZUEUpLAotICAgIFgoRUdMX0NPTkZPUk1BTlQpLAotICAgfTsKLSN1bmRlZiBYCi0KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihuYW1lcykgLyBzaXplb2YobmFtZXNbMF0pOyBqKyspIHsKLSAgICAgICAgRUdMaW50IHZhbHVlID0gLTE7Ci0gICAgICAgIEVHTGludCByZXR1cm5WYWwgPSBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIG5hbWVzW2pdLmF0dHJpYnV0ZSwgJnZhbHVlKTsKLSAgICAgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKHJldHVyblZhbCAmJiBlcnJvciA9PSBFR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgcHJpbnRmKCIgJXM6ICIsIG5hbWVzW2pdLm5hbWUpOwotICAgICAgICAgICAgcHJpbnRmKCIlZCAoMHgleCkiLCB2YWx1ZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAgRUdMQm9vbGVhbiByZXR1cm5WYWx1ZTsKLSAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07Ci0KLSAgICBFR0xpbnQgY29udGV4dF9hdHRyaWJzW10gPSB7IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0xfTk9ORSB9OwotICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAotICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICAgICAgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgRUdMQ29udGV4dCBjb250ZXh0OwotICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICBFR0xpbnQgdywgaDsKLQotICAgIEVHTERpc3BsYXkgZHB5OwotCi0gICAgY2hlY2tFZ2xFcnJvcigiPGluaXQ+Iik7Ci0gICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXREaXNwbGF5Iik7Ci0gICAgaWYgKGRweSA9PSBFR0xfTk9fRElTUExBWSkgewotICAgICAgICBwcmludGYoImVnbEdldERpc3BsYXkgcmV0dXJuZWQgRUdMX05PX0RJU1BMQVkuXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuVmFsdWUgPSBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsSW5pdGlhbGl6ZSIsIHJldHVyblZhbHVlKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVHTCB2ZXJzaW9uICVkLiVkXG4iLCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbik7Ci0gICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHByaW50ZigiZWdsSW5pdGlhbGl6ZSBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyA9IGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsKLSAgICByZXR1cm5WYWx1ZSA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coZHB5LCBzX2NvbmZpZ0F0dHJpYnMsIHdpbmRvdywgJm15Q29uZmlnKTsKLSAgICBpZiAocmV0dXJuVmFsdWUpIHsKLSAgICAgICAgcHJpbnRmKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KCkgcmV0dXJuZWQgJWQiLCByZXR1cm5WYWx1ZSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGNoZWNrRWdsRXJyb3IoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3ciKTsKLQotICAgIHByaW50ZigiQ2hvc2UgdGhpcyBjb25maWd1cmF0aW9uOlxuIik7Ci0gICAgcHJpbnRFR0xDb25maWd1cmF0aW9uKGRweSwgbXlDb25maWcpOwotCi0gICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBteUNvbmZpZywgd2luZG93LCBOVUxMKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIik7Ci0gICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgcHJpbnRmKCJnZWxDcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZC5cbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIG15Q29uZmlnLCBFR0xfTk9fQ09OVEVYVCwgY29udGV4dF9hdHRyaWJzKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVDb250ZXh0Iik7Ci0gICAgaWYgKGNvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm5WYWx1ZSA9IGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsTWFrZUN1cnJlbnQiLCByZXR1cm5WYWx1ZSk7Ci0gICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7Ci0gICAgR0xpbnQgZGltID0gdyA8IGggPyB3IDogaDsKLQotICAgIGZwcmludGYoc3RkZXJyLCAiV2luZG93IGRpbWVuc2lvbnM6ICVkIHggJWRcbiIsIHcsIGgpOwotCi0gICAgcHJpbnRHTFN0cmluZygiVmVyc2lvbiIsIEdMX1ZFUlNJT04pOwotICAgIHByaW50R0xTdHJpbmcoIlZlbmRvciIsIEdMX1ZFTkRPUik7Ci0gICAgcHJpbnRHTFN0cmluZygiUmVuZGVyZXIiLCBHTF9SRU5ERVJFUik7Ci0gICAgcHJpbnRHTFN0cmluZygiRXh0ZW5zaW9ucyIsIEdMX0VYVEVOU0lPTlMpOwotCi0gICAgaWYoIXNldHVwWXV2VGV4U3VyZmFjZShkcHksIGNvbnRleHQpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHNldCB1cCB0ZXh0dXJlIHN1cmZhY2UuXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYoIXNldHVwR3JhcGhpY3ModywgaCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgc2V0IHVwIGdyYXBoaWNzLlxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgcmVuZGVyRnJhbWUoKTsKLSAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgICAgY2hlY2tFZ2xFcnJvcigiZWdsU3dhcEJ1ZmZlcnMiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9iYXNpYy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsX2Jhc2ljL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YmNjNjAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX2Jhc2ljL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JZ2xfYmFzaWMuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjFfQ00gXAotICAgIGxpYnVpCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZ2xfYmFzaWMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfYmFzaWMvZ2xfYmFzaWMuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX2Jhc2ljL2dsX2Jhc2ljLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjZTkzNC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfYmFzaWMvZ2xfYmFzaWMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8vIFNpbXBsZSBPcGVuR0wgRVMgMS54IGFwcGxpY2F0aW9uIHNob3dpbmcgaG93IHRvIGluaXRpYWxpemUgYW5kIGRyYXcgc29tZXRoaW5nLgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0jaW5jbHVkZSAiRUdMVXRpbHMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1FR0xEaXNwbGF5IGVnbERpc3BsYXk7Ci1FR0xTdXJmYWNlIGVnbFN1cmZhY2U7Ci1FR0xDb250ZXh0IGVnbENvbnRleHQ7Ci1HTHVpbnQgdGV4dHVyZTsKLQotI2RlZmluZSBGSVhFRF9PTkUgMHgxMDAwMAotI2RlZmluZSBJVEVSQVRJT05TIDUwCi0KLWludCBpbml0X2dsX3N1cmZhY2Uodm9pZCk7Ci12b2lkIGZyZWVfZ2xfc3VyZmFjZSh2b2lkKTsKLXZvaWQgaW5pdF9zY2VuZSh2b2lkKTsKLXZvaWQgcmVuZGVyKCk7Ci12b2lkIGNyZWF0ZV90ZXh0dXJlKHZvaWQpOwotaW50IHJlYWRUaW1lcih2b2lkKTsKLQotc3RhdGljIHZvaWQgcHJpbnRHTFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBHTGVudW0gcykgewotICAgIGNvbnN0IGNoYXIgKnYgPSAoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhzKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkdMICVzID0gJXNcbiIsIG5hbWUsIHYpOwotfQotCi1zdGF0aWMgdm9pZCBnbHVMb29rQXQoZmxvYXQgZXllWCwgZmxvYXQgZXllWSwgZmxvYXQgZXllWiwKLSAgICAgICAgZmxvYXQgY2VudGVyWCwgZmxvYXQgY2VudGVyWSwgZmxvYXQgY2VudGVyWiwgZmxvYXQgdXBYLCBmbG9hdCB1cFksCi0gICAgICAgIGZsb2F0IHVwWikKLXsKLSAgICAvLyBTZWUgdGhlIE9wZW5HTCBHTFVUIGRvY3VtZW50YXRpb24gZm9yIGdsdUxvb2tBdCBmb3IgYSBkZXNjcmlwdGlvbgotICAgIC8vIG9mIHRoZSBhbGdvcml0aG0uIFdlIGltcGxlbWVudCBpdCBpbiBhIHN0cmFpZ2h0Zm9yd2FyZCB3YXk6Ci0KLSAgICBmbG9hdCBmeCA9IGNlbnRlclggLSBleWVYOwotICAgIGZsb2F0IGZ5ID0gY2VudGVyWSAtIGV5ZVk7Ci0gICAgZmxvYXQgZnogPSBjZW50ZXJaIC0gZXllWjsKLQotICAgIC8vIE5vcm1hbGl6ZSBmCi0gICAgZmxvYXQgcmxmID0gMS4wZiAvIHNxcnRmKGZ4KmZ4ICsgZnkqZnkgKyBmeipmeik7Ci0gICAgZnggKj0gcmxmOwotICAgIGZ5ICo9IHJsZjsKLSAgICBmeiAqPSBybGY7Ci0KLSAgICAvLyBOb3JtYWxpemUgdXAKLSAgICBmbG9hdCBybHVwID0gMS4wZiAvIHNxcnRmKHVwWCp1cFggKyB1cFkqdXBZICsgdXBaKnVwWik7Ci0gICAgdXBYICo9IHJsdXA7Ci0gICAgdXBZICo9IHJsdXA7Ci0gICAgdXBaICo9IHJsdXA7Ci0KLSAgICAvLyBjb21wdXRlIHMgPSBmIHggdXAgKHggbWVhbnMgImNyb3NzIHByb2R1Y3QiKQotCi0gICAgZmxvYXQgc3ggPSBmeSAqIHVwWiAtIGZ6ICogdXBZOwotICAgIGZsb2F0IHN5ID0gZnogKiB1cFggLSBmeCAqIHVwWjsKLSAgICBmbG9hdCBzeiA9IGZ4ICogdXBZIC0gZnkgKiB1cFg7Ci0KLSAgICAvLyBjb21wdXRlIHUgPSBzIHggZgotICAgIGZsb2F0IHV4ID0gc3kgKiBmeiAtIHN6ICogZnk7Ci0gICAgZmxvYXQgdXkgPSBzeiAqIGZ4IC0gc3ggKiBmejsKLSAgICBmbG9hdCB1eiA9IHN4ICogZnkgLSBzeSAqIGZ4OwotCi0gICAgZmxvYXQgbVsxNl0gOwotICAgIG1bMF0gPSBzeDsKLSAgICBtWzFdID0gdXg7Ci0gICAgbVsyXSA9IC1meDsKLSAgICBtWzNdID0gMC4wZjsKLQotICAgIG1bNF0gPSBzeTsKLSAgICBtWzVdID0gdXk7Ci0gICAgbVs2XSA9IC1meTsKLSAgICBtWzddID0gMC4wZjsKLQotICAgIG1bOF0gPSBzejsKLSAgICBtWzldID0gdXo7Ci0gICAgbVsxMF0gPSAtZno7Ci0gICAgbVsxMV0gPSAwLjBmOwotCi0gICAgbVsxMl0gPSAwLjBmOwotICAgIG1bMTNdID0gMC4wZjsKLSAgICBtWzE0XSA9IDAuMGY7Ci0gICAgbVsxNV0gPSAxLjBmOwotCi0gICAgZ2xNdWx0TWF0cml4ZihtKTsKLSAgICBnbFRyYW5zbGF0ZWYoLWV5ZVgsIC1leWVZLCAtZXllWik7Ci19Ci0KLXZvaWQgcHJpbnRFR0xDb25maWd1cmF0aW9uKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnKSB7Ci0KLSNkZWZpbmUgWChWQUwpIHtWQUwsICNWQUx9Ci0gICAgc3RydWN0IHtFR0xpbnQgYXR0cmlidXRlOyBjb25zdCBjaGFyKiBuYW1lO30gbmFtZXNbXSA9IHsKLSAgICBYKEVHTF9CVUZGRVJfU0laRSksCi0gICAgWChFR0xfQUxQSEFfU0laRSksCi0gICAgWChFR0xfQkxVRV9TSVpFKSwKLSAgICBYKEVHTF9HUkVFTl9TSVpFKSwKLSAgICBYKEVHTF9SRURfU0laRSksCi0gICAgWChFR0xfREVQVEhfU0laRSksCi0gICAgWChFR0xfU1RFTkNJTF9TSVpFKSwKLSAgICBYKEVHTF9DT05GSUdfQ0FWRUFUKSwKLSAgICBYKEVHTF9DT05GSUdfSUQpLAotICAgIFgoRUdMX0xFVkVMKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1BJWEVMUyksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfV0lEVEgpLAotICAgIFgoRUdMX05BVElWRV9SRU5ERVJBQkxFKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX0lEKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX1RZUEUpLAotICAgIFgoRUdMX1NBTVBMRVMpLAotICAgIFgoRUdMX1NBTVBMRV9CVUZGRVJTKSwKLSAgICBYKEVHTF9TVVJGQUNFX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSksCi0gICAgWChFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBKSwKLSAgICBYKEVHTF9NSU5fU1dBUF9JTlRFUlZBTCksCi0gICAgWChFR0xfTUFYX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX0xVTUlOQU5DRV9TSVpFKSwKLSAgICBYKEVHTF9BTFBIQV9NQVNLX1NJWkUpLAotICAgIFgoRUdMX0NPTE9SX0JVRkZFUl9UWVBFKSwKLSAgICBYKEVHTF9SRU5ERVJBQkxFX1RZUEUpLAotICAgIFgoRUdMX0NPTkZPUk1BTlQpLAotICAgfTsKLSN1bmRlZiBYCi0KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihuYW1lcykgLyBzaXplb2YobmFtZXNbMF0pOyBqKyspIHsKLSAgICAgICAgRUdMaW50IHZhbHVlID0gLTE7Ci0gICAgICAgIEVHTGludCByZXR1cm5WYWwgPSBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIG5hbWVzW2pdLmF0dHJpYnV0ZSwgJnZhbHVlKTsKLSAgICAgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKHJldHVyblZhbCAmJiBlcnJvciA9PSBFR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgcHJpbnRmKCIgJXM6ICIsIG5hbWVzW2pdLm5hbWUpOwotICAgICAgICAgICAgcHJpbnRmKCIlZCAoMHgleCkiLCB2YWx1ZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwgPSBFR0xfVFJVRSkgewotICAgIGlmIChyZXR1cm5WYWwgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcygpIHJldHVybmVkICVkXG4iLCBvcCwgcmV0dXJuVmFsKTsKLSAgICB9Ci0KLSAgICBmb3IgKEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7IGVycm9yICE9IEVHTF9TVUNDRVNTOyBlcnJvcgotICAgICAgICAgICAgPSBlZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBlZ2xFcnJvciAlcyAoMHgleClcbiIsIG9wLCBFR0xVdGlsczo6c3RyZXJyb3IoZXJyb3IpLAotICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICB9Ci19Ci0KLWludCBwcmludEVHTENvbmZpZ3VyYXRpb25zKEVHTERpc3BsYXkgZHB5KSB7Ci0gICAgRUdMaW50IG51bUNvbmZpZyA9IDA7Ci0gICAgRUdMaW50IHJldHVyblZhbCA9IGVnbEdldENvbmZpZ3MoZHB5LCBOVUxMLCAwLCAmbnVtQ29uZmlnKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXRDb25maWdzIiwgcmV0dXJuVmFsKTsKLSAgICBpZiAoIXJldHVyblZhbCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpbnRmKCJOdW1iZXIgb2YgRUdMIGNvbmZpZ3VyYXRpb25zOiAlZFxuIiwgbnVtQ29uZmlnKTsKLQotICAgIEVHTENvbmZpZyogY29uZmlncyA9IChFR0xDb25maWcqKSBtYWxsb2Moc2l6ZW9mKEVHTENvbmZpZykgKiBudW1Db25maWcpOwotICAgIGlmICghIGNvbmZpZ3MpIHsKLSAgICAgICAgcHJpbnRmKCJDb3VsZCBub3QgYWxsb2NhdGUgY29uZmlncy5cbiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuVmFsID0gZWdsR2V0Q29uZmlncyhkcHksIGNvbmZpZ3MsIG51bUNvbmZpZywgJm51bUNvbmZpZyk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsR2V0Q29uZmlncyIsIHJldHVyblZhbCk7Ci0gICAgaWYgKCFyZXR1cm5WYWwpIHsKLSAgICAgICAgZnJlZShjb25maWdzKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1Db25maWc7IGkrKykgewotICAgICAgICBwcmludGYoIkNvbmZpZ3VyYXRpb24gJWRcbiIsIGkpOwotICAgICAgICBwcmludEVHTENvbmZpZ3VyYXRpb24oZHB5LCBjb25maWdzW2ldKTsKLSAgICB9Ci0KLSAgICBmcmVlKGNvbmZpZ3MpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IHE7Ci0gICAgaW50IHN0YXJ0LCBlbmQ7Ci0gICAgcHJpbnRmKCJJbml0aWFsaXppbmcgRUdMLi4uXG4iKTsKLSAgICBpZighaW5pdF9nbF9zdXJmYWNlKCkpCi0gICAgewotICAgICAgICBwcmludGYoIkdMIGluaXRpYWxpc2F0aW9uIGZhaWxlZCAtIGV4aXRpbmdcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW5pdF9zY2VuZSgpOwotICAgIGNyZWF0ZV90ZXh0dXJlKCk7Ci0gICAgcHJpbnRmKCJSdW5uaW5nLi4uXG4iKTsKLSAgICB3aGlsZSh0cnVlKSB7Ci0gICAgICAgIHJlbmRlcigpOwotICAgIH0KLSAgICBmcmVlX2dsX3N1cmZhY2UoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGluaXRfZ2xfc3VyZmFjZSh2b2lkKQotewotICAgIEVHTGludCBudW1Db25maWdzID0gMTsKLSAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07Ci0gICAgRUdMaW50IGF0dHJpYltdID0KLSAgICB7Ci0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9OT05FCi0gICAgfTsKLQotICAgIGlmICggKGVnbERpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpKSA9PSBFR0xfTk9fRElTUExBWSApCi0gICAgewotICAgICAgICBwcmludGYoImVnbEdldERpc3BsYXkgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIGlmICggZWdsSW5pdGlhbGl6ZShlZ2xEaXNwbGF5LCBOVUxMLCBOVUxMKSAhPSBFR0xfVFJVRSApCi0gICAgewotICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCEgcHJpbnRFR0xDb25maWd1cmF0aW9ucyhlZ2xEaXNwbGF5KSkgewotICAgICAgICBwcmludGYoInByaW50RUdMQ29uZmlndXJhdGlvbnMgZmFpbGVkLlxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOwotICAgIEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coZWdsRGlzcGxheSwgYXR0cmliLCB3aW5kb3csICZteUNvbmZpZyk7Ci0KLSAgICBpZiAoIChlZ2xTdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShlZ2xEaXNwbGF5LCBteUNvbmZpZywKLSAgICAgICAgICAgIHdpbmRvdywgMCkpID09IEVHTF9OT19TVVJGQUNFICkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoIChlZ2xDb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChlZ2xEaXNwbGF5LCBteUNvbmZpZywgMCwgMCkpID09IEVHTF9OT19DT05URVhUICkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoIGVnbE1ha2VDdXJyZW50KGVnbERpc3BsYXksIGVnbFN1cmZhY2UsIGVnbFN1cmZhY2UsIGVnbENvbnRleHQpICE9IEVHTF9UUlVFICkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIGludCB3LCBoOwotCi0gICAgZWdsUXVlcnlTdXJmYWNlKGVnbERpc3BsYXksIGVnbFN1cmZhY2UsIEVHTF9XSURUSCwgJncpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOwotICAgIGVnbFF1ZXJ5U3VyZmFjZShlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7Ci0gICAgR0xpbnQgZGltID0gdyA8IGggPyB3IDogaDsKLSAgICAKLSAgICBmcHJpbnRmKHN0ZGVyciwgIldpbmRvdyBkaW1lbnNpb25zOiAlZCB4ICVkXG4iLCB3LCBoKTsKLQotICAgIHByaW50R0xTdHJpbmcoIlZlcnNpb24iLCBHTF9WRVJTSU9OKTsKLSAgICBwcmludEdMU3RyaW5nKCJWZW5kb3IiLCBHTF9WRU5ET1IpOwotICAgIHByaW50R0xTdHJpbmcoIlJlbmRlcmVyIiwgR0xfUkVOREVSRVIpOwotICAgIHByaW50R0xTdHJpbmcoIkV4dGVuc2lvbnMiLCBHTF9FWFRFTlNJT05TKTsKLQotICAgIHJldHVybiAxOwotfQotCi12b2lkIGZyZWVfZ2xfc3VyZmFjZSh2b2lkKQotewotICAgIGlmIChlZ2xEaXNwbGF5ICE9IEVHTF9OT19ESVNQTEFZKQotICAgIHsKLSAgICAgICAgZWdsTWFrZUN1cnJlbnQoIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1VSRkFDRSwKLSAgICAgICAgICAgICAgICBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQgKTsKLSAgICAgICAgZWdsRGVzdHJveUNvbnRleHQoIGVnbERpc3BsYXksIGVnbENvbnRleHQgKTsKLSAgICAgICAgZWdsRGVzdHJveVN1cmZhY2UoIGVnbERpc3BsYXksIGVnbFN1cmZhY2UgKTsKLSAgICAgICAgZWdsVGVybWluYXRlKCBlZ2xEaXNwbGF5ICk7Ci0gICAgICAgIGVnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsKLSAgICB9Ci19Ci0KLXZvaWQgaW5pdF9zY2VuZSh2b2lkKQotewotICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOwotICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7Ci0gICAgZmxvYXQgcmF0aW8gPSAzMjAuMGYgLyA0ODAuMGY7Ci0gICAgZ2xWaWV3cG9ydCgwLCAwLCAzMjAsIDQ4MCk7Ci0gICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgZ2xGcnVzdHVtZigtcmF0aW8sIHJhdGlvLCAtMSwgMSwgMSwgMTApOwotICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgZ2x1TG9va0F0KAotICAgICAgICAgICAgMCwgMCwgMywgIC8vIGV5ZQotICAgICAgICAgICAgMCwgMCwgMCwgIC8vIGNlbnRlcgotICAgICAgICAgICAgMCwgMSwgMCk7IC8vIHVwCi0gICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwotICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci19Ci0KLXZvaWQgY3JlYXRlX3RleHR1cmUodm9pZCkKLXsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgb24gPSAweGZmMDAwMGZmOwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBvZmYgPSAweGZmZmZmZmZmOwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBwaXhlbHNbXSA9Ci0gICAgewotICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKLSAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCi0gICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAotICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKLSAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCi0gICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAotICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKLSAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCi0gICAgfTsKLQotICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7Ci0gICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDgsIDgsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLX0KLQotdm9pZCByZW5kZXIoKQotewotICAgIGludCBpLCBqOwotICAgIGludCBxdWFkcyA9IDE7Ci0KLSAgICBjb25zdCBHTGZsb2F0IHZlcnRpY2VzW10gPSB7Ci0gICAgICAgICAgICAtMSwgIC0xLCAgMCwKLSAgICAgICAgICAgICAxLCAgLTEsICAwLAotICAgICAgICAgICAgIDEsICAgMSwgIDAsCi0gICAgICAgICAgICAtMSwgICAxLCAgMAotICAgIH07Ci0KLSAgICBjb25zdCBHTGZpeGVkIHRleENvb3Jkc1tdID0gewotICAgICAgICAgICAgMCwgICAgICAgICAgICAwLAotICAgICAgICAgICAgRklYRURfT05FLCAgICAwLAotICAgICAgICAgICAgRklYRURfT05FLCAgICBGSVhFRF9PTkUsCi0gICAgICAgICAgICAwLCAgICAgICAgICAgIEZJWEVEX09ORQotICAgIH07Ci0KLSAgICBjb25zdCBHTHVzaG9ydCBpbmRpY2VzW10gPSB7IDAsIDEsIDIsICAwLCAyLCAzIH07Ci0KLSAgICBnbFZlcnRleFBvaW50ZXIoMywgR0xfRkxPQVQsIDAsIHZlcnRpY2VzKTsKLSAgICBnbFRleENvb3JkUG9pbnRlcigyLCBHTF9GSVhFRCwgMCwgdGV4Q29vcmRzKTsKLSAgICBnbENsZWFyQ29sb3IoMS4wLCAxLjAsIDEuMCwgMS4wKTsKLSAgICBpbnQgbmVsZW0gPSBzaXplb2YoaW5kaWNlcykvc2l6ZW9mKGluZGljZXNbMF0pOwotICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbmVsZW0sIEdMX1VOU0lHTkVEX1NIT1JULCBpbmRpY2VzKTsKLSAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9qbmkvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbF9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyMGU3Mi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE9wZW5HTCBFUyBKTkkgc2FtcGxlCi0jIFRoaXMgbWFrZWZpbGUgYnVpbGRzIGJvdGggYW4gYWN0aXZpdHkgYW5kIGEgc2hhcmVkIGxpYnJhcnkuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgQnVpbGQgYWN0aXZpdHkKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBHTEpOSQotCi1MT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJnbGpuaQotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCdWlsZCBKTkkgU2hhcmVkIExpYnJhcnkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTE9DQUxfUEFUSDo9ICQoTE9DQUxfUEFUSCkvam5pCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIE9wdGlvbmFsIHRhZyB3b3VsZCBtZWFuIGl0IGRvZXNuJ3QgZ2V0IGluc3RhbGxlZCBieSBkZWZhdWx0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvcgotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gIGdsX2NvZGUuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYnV0aWxzIFwKLQlsaWJFR0wgXAotCWxpYkdMRVN2MV9DTQotCi1MT0NBTF9NT0RVTEUgOj0gbGliZ2xqbmkKLQotTE9DQUxfQVJNX01PREUgOj0gYXJtCi0KLQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvZ2xfam5pL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMGVjOTYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX2puaS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5nbGpuaSI+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+Ci0gICAgPGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2dsam5pX2FjdGl2aXR5Ij4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iR0xKTklBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCi0gICAgICAgICAgICAJYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIgotICAgICAgICAgICAgCWFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxhbmRzY2FwZSIKLSAgICAgICAgICAgIAlhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9qbmkvam5pL2dsX2NvZGUuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX2puaS9qbmkvZ2xfY29kZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmODYwMjAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX2puaS9qbmkvZ2xfY29kZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8gT3BlbkdMIEVTIDEuMCBjb2RlCi0KLSNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvam5pLmg+Ci0jZGVmaW5lIExPR19UQUcgIkdMSk5JIGdsX2NvZGUuY3BwIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPG1hdGguaD4KLQotR0x1aW50IHRleHR1cmU7Ci1HTGZsb2F0IGJhY2tncm91bmQ7Ci0KLSNkZWZpbmUgRklYRURfT05FIDB4MTAwMDAKLQotc3RhdGljIHZvaWQgcHJpbnRHTFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBHTGVudW0gcykgewotICAgIGNvbnN0IGNoYXIgKnYgPSAoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhzKTsKLSAgICBBTE9HSSgiR0wgJXMgPSAlc1xuIiwgbmFtZSwgdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGdsdUxvb2tBdChmbG9hdCBleWVYLCBmbG9hdCBleWVZLCBmbG9hdCBleWVaLAotICAgICAgICBmbG9hdCBjZW50ZXJYLCBmbG9hdCBjZW50ZXJZLCBmbG9hdCBjZW50ZXJaLCBmbG9hdCB1cFgsIGZsb2F0IHVwWSwKLSAgICAgICAgZmxvYXQgdXBaKQotewotICAgIC8vIFNlZSB0aGUgT3BlbkdMIEdMVVQgZG9jdW1lbnRhdGlvbiBmb3IgZ2x1TG9va0F0IGZvciBhIGRlc2NyaXB0aW9uCi0gICAgLy8gb2YgdGhlIGFsZ29yaXRobS4gV2UgaW1wbGVtZW50IGl0IGluIGEgc3RyYWlnaHRmb3J3YXJkIHdheToKLQotICAgIGZsb2F0IGZ4ID0gY2VudGVyWCAtIGV5ZVg7Ci0gICAgZmxvYXQgZnkgPSBjZW50ZXJZIC0gZXllWTsKLSAgICBmbG9hdCBmeiA9IGNlbnRlclogLSBleWVaOwotCi0gICAgLy8gTm9ybWFsaXplIGYKLSAgICBmbG9hdCBybGYgPSAxLjBmIC8gc3FydGYoZngqZnggKyBmeSpmeSArIGZ6KmZ6KTsKLSAgICBmeCAqPSBybGY7Ci0gICAgZnkgKj0gcmxmOwotICAgIGZ6ICo9IHJsZjsKLQotICAgIC8vIE5vcm1hbGl6ZSB1cAotICAgIGZsb2F0IHJsdXAgPSAxLjBmIC8gc3FydGYodXBYKnVwWCArIHVwWSp1cFkgKyB1cFoqdXBaKTsKLSAgICB1cFggKj0gcmx1cDsKLSAgICB1cFkgKj0gcmx1cDsKLSAgICB1cFogKj0gcmx1cDsKLQotICAgIC8vIGNvbXB1dGUgcyA9IGYgeCB1cCAoeCBtZWFucyAiY3Jvc3MgcHJvZHVjdCIpCi0KLSAgICBmbG9hdCBzeCA9IGZ5ICogdXBaIC0gZnogKiB1cFk7Ci0gICAgZmxvYXQgc3kgPSBmeiAqIHVwWCAtIGZ4ICogdXBaOwotICAgIGZsb2F0IHN6ID0gZnggKiB1cFkgLSBmeSAqIHVwWDsKLQotICAgIC8vIGNvbXB1dGUgdSA9IHMgeCBmCi0gICAgZmxvYXQgdXggPSBzeSAqIGZ6IC0gc3ogKiBmeTsKLSAgICBmbG9hdCB1eSA9IHN6ICogZnggLSBzeCAqIGZ6OwotICAgIGZsb2F0IHV6ID0gc3ggKiBmeSAtIHN5ICogZng7Ci0KLSAgICBmbG9hdCBtWzE2XSA7Ci0gICAgbVswXSA9IHN4OwotICAgIG1bMV0gPSB1eDsKLSAgICBtWzJdID0gLWZ4OwotICAgIG1bM10gPSAwLjBmOwotCi0gICAgbVs0XSA9IHN5OwotICAgIG1bNV0gPSB1eTsKLSAgICBtWzZdID0gLWZ5OwotICAgIG1bN10gPSAwLjBmOwotCi0gICAgbVs4XSA9IHN6OwotICAgIG1bOV0gPSB1ejsKLSAgICBtWzEwXSA9IC1mejsKLSAgICBtWzExXSA9IDAuMGY7Ci0KLSAgICBtWzEyXSA9IDAuMGY7Ci0gICAgbVsxM10gPSAwLjBmOwotICAgIG1bMTRdID0gMC4wZjsKLSAgICBtWzE1XSA9IDEuMGY7Ci0KLSAgICBnbE11bHRNYXRyaXhmKG0pOwotICAgIGdsVHJhbnNsYXRlZigtZXllWCwgLWV5ZVksIC1leWVaKTsKLX0KLQotdm9pZCBpbml0X3NjZW5lKGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLSAgICBwcmludEdMU3RyaW5nKCJWZXJzaW9uIiwgR0xfVkVSU0lPTik7Ci0gICAgcHJpbnRHTFN0cmluZygiVmVuZG9yIiwgR0xfVkVORE9SKTsKLSAgICBwcmludEdMU3RyaW5nKCJSZW5kZXJlciIsIEdMX1JFTkRFUkVSKTsKLSAgICBwcmludEdMU3RyaW5nKCJFeHRlbnNpb25zIiwgR0xfRVhURU5TSU9OUyk7Ci0KLSAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKLSAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOwotCi0gICAgZmxvYXQgcmF0aW8gPSB3aWR0aCAvIGhlaWdodDsKLSAgICBnbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgZ2xGcnVzdHVtZigtcmF0aW8sIHJhdGlvLCAtMSwgMSwgMSwgMTApOwotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0KLSAgICBnbExvYWRJZGVudGl0eSgpOwotICAgIGdsdUxvb2tBdCgKLSAgICAgICAgICAgIDAsIDAsIDMsICAvLyBleWUKLSAgICAgICAgICAgIDAsIDAsIDAsICAvLyBjZW50ZXIKLSAgICAgICAgICAgIDAsIDEsIDApOyAvLyB1cAotCi0gICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwotICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci19Ci0KLXZvaWQgY3JlYXRlX3RleHR1cmUoKQotewotICAgIGNvbnN0IHVuc2lnbmVkIGludCBvbiA9IDB4ZmYwMDAwZmY7Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IG9mZiA9IDB4ZmZmZmZmZmY7Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IHBpeGVsc1tdID0KLSAgICB7Ci0gICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAotICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKLSAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCi0gICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAotICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKLSAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCi0gICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAotICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKLSAgICB9OwotCi0gICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZSk7Ci0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKLSAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgOCwgOCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgcGl4ZWxzKTsKLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKLSAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwotfQotCi1leHRlcm4gIkMiIHsKLSAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xqbmlfR0xKTklMaWJfaW5pdChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqLCAgamludCB3aWR0aCwgamludCBoZWlnaHQpOwotICAgIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbGpuaV9HTEpOSUxpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopOwotICAgIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbGpuaV9HTEpOSUxpYl9jaGFuZ2VCYWNrZ3JvdW5kKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopOwotfTsKLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dsam5pX0dMSk5JTGliX2luaXQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KQotewotICAgIGluaXRfc2NlbmUod2lkdGgsIGhlaWdodCk7Ci0gICAgY3JlYXRlX3RleHR1cmUoKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dsam5pX0dMSk5JTGliX3N0ZXAoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaikKLXsKLSAgICBjb25zdCBHTGZsb2F0IHZlcnRpY2VzW10gPSB7Ci0gICAgICAgICAgICAtMSwgIC0xLCAgMCwKLSAgICAgICAgICAgICAxLCAgLTEsICAwLAotICAgICAgICAgICAgIDEsICAgMSwgIDAsCi0gICAgICAgICAgICAtMSwgICAxLCAgMAotICAgIH07Ci0KLSAgICBjb25zdCBHTGZpeGVkIHRleENvb3Jkc1tdID0gewotICAgICAgICAgICAgMCwgICAgICAgICAgICAwLAotICAgICAgICAgICAgRklYRURfT05FLCAgICAwLAotICAgICAgICAgICAgRklYRURfT05FLCAgICBGSVhFRF9PTkUsCi0gICAgICAgICAgICAwLCAgICAgICAgICAgIEZJWEVEX09ORQotICAgIH07Ci0KLSAgICBjb25zdCBHTHVzaG9ydCBxdWFkSW5kaWNlc1tdID0geyAwLCAxLCAyLCAgMCwgMiwgMyB9OwotICAgIGdsVmVydGV4UG9pbnRlcigzLCBHTF9GTE9BVCwgMCwgdmVydGljZXMpOwotICAgIGdsVGV4Q29vcmRQb2ludGVyKDIsIEdMX0ZJWEVELCAwLCB0ZXhDb29yZHMpOwotCi0gICAgaW50IG5lbGVtID0gc2l6ZW9mKHF1YWRJbmRpY2VzKS9zaXplb2YocXVhZEluZGljZXNbMF0pOwotICAgIHN0YXRpYyBmbG9hdCBncmV5OwotICAgIGdyZXkgKz0gMC4wMWY7Ci0gICAgaWYgKGdyZXkgPiAxLjBmKSB7Ci0gICAgICAgIGdyZXkgPSAwLjBmOwotICAgIH0KLSAgICBnbENsZWFyQ29sb3IoYmFja2dyb3VuZCwgZ3JleSwgZ3JleSwgMS4wZik7Ci0gICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBuZWxlbSwgR0xfVU5TSUdORURfU0hPUlQsIHF1YWRJbmRpY2VzKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dsam5pX0dMSk5JTGliX2NoYW5nZUJhY2tncm91bmQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaikKLXsKLSAgICBiYWNrZ3JvdW5kID0gMS4wZiAtIGJhY2tncm91bmQ7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9vcGVuZ2wvdGVzdHMvZ2xfam5pL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZTlmYTAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX2puaS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZwotICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJnbGpuaV9hY3Rpdml0eSI+R0xKTkk8L3N0cmluZz4KLQotPC9yZXNvdXJjZXM+Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsam5pL0dMSk5JQWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsam5pL0dMSk5JQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmNTMxMy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL3NyYy9jb20vYW5kcm9pZC9nbGpuaS9HTEpOSUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbGpuaTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgR0xKTklBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEdMSk5JVmlldyBtVmlldzsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLSAgICAgICAgbVZpZXcgPSBuZXcgR0xKTklWaWV3KGdldEFwcGxpY2F0aW9uKCkpOwotCSAgICBtVmlldy5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKLQkgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICAgICAgbVZpZXcub25QYXVzZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtVmlldy5vblJlc3VtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsam5pL0dMSk5JTGliLmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfam5pL3NyYy9jb20vYW5kcm9pZC9nbGpuaS9HTEpOSUxpYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTZkMmFmLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsam5pL0dMSk5JTGliLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbGpuaTsKLQotLy8gV3JhcHBlciBmb3IgbmF0aXZlIGxpYnJhcnkKLQotcHVibGljIGNsYXNzIEdMSk5JTGliIHsKLQotICAgICBzdGF0aWMgewotICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJnbGpuaSIpOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIGN1cnJlbnQgdmlldyB3aWR0aAotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGN1cnJlbnQgdmlldyBoZWlnaHQKLSAgICAgKi8KLSAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBpbml0KGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RlcCgpOwotICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGNoYW5nZUJhY2tncm91bmQoKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsam5pL0dMSk5JVmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsX2puaS9zcmMvY29tL2FuZHJvaWQvZ2xqbmkvR0xKTklWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMmM4YzQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX2puaS9zcmMvY29tL2FuZHJvaWQvZ2xqbmkvR0xKTklWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbGpuaTsKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgU3VyZmFjZVZpZXcgdGhhdCB1c2VzIHRoZSBkZWRpY2F0ZWQgc3VyZmFjZSBmb3IKLSAqIGRpc3BsYXlpbmcgYW4gT3BlbkdMIGFuaW1hdGlvbi4gIFRoaXMgYWxsb3dzIHRoZSBhbmltYXRpb24gdG8gcnVuIGluIGEKLSAqIHNlcGFyYXRlIHRocmVhZCwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCBpdCBiZSBkcml2ZW4gYnkgdGhlIHVwZGF0ZSBtZWNoYW5pc20KLSAqIG9mIHRoZSB2aWV3IGhpZXJhcmNoeS4KLSAqCi0gKiBUaGUgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVuZGVyaW5nIGNvZGUgaXMgZGVsZWdhdGVkIHRvIGEgR0xWaWV3LlJlbmRlcmVyCi0gKiBpbnN0YW5jZS4KLSAqLwotY2xhc3MgR0xKTklWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7Ci0gICAgR0xKTklWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBHTEpOSVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVuZGVyZXIiOwotICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7Ci0gICAgICAgICAgICBHTEpOSUxpYi5zdGVwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAgICAgR0xKTklMaWIuaW5pdCh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIEdMSk5JTGliLmNoYW5nZUJhY2tncm91bmQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZjYTA4OS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWdsMl9wZXJmLmNwcCBcCi0JZmlsbHRlc3QuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjIgXAotICAgIGxpYnVpCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZ2wyX3BlcmYKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5MzgxZi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJmcmFnbWVudF9zaGFkZXJzLmNwcCIKLQotRklMRSAqIGZPdXQgPSBOVUxMOwotdm9pZCBwdFN3YXAoKTsKLQotc3RhdGljIGNoYXIgZ0N1cnJlbnRUZXN0TmFtZVsxMDI0XTsKLXN0YXRpYyB1aW50MzJfdCBnV2lkdGggPSAwOwotc3RhdGljIHVpbnQzMl90IGdIZWlnaHQgPSAwOwotCi1zdGF0aWMgdm9pZCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApIHsKLSAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKLSAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIEFMT0dFKCJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOwotICAgIH0KLX0KLQotR0x1aW50IGxvYWRTaGFkZXIoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UpIHsKLSAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7Ci0gICAgaWYgKHNoYWRlcikgewotICAgICAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZwU291cmNlLCBOVUxMKTsKLSAgICAgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgIEdMaW50IGNvbXBpbGVkID0gMDsKLSAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZWQpOwotICAgICAgICBpZiAoIWNvbXBpbGVkKSB7Ci0gICAgICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKLSAgICAgICAgICAgIGlmIChpbmZvTGVuKSB7Ci0gICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyICVkOlxuJXNcbiIsIHNoYWRlclR5cGUsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgICAgICAgICBzaGFkZXIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzaGFkZXI7Ci19Ci0KLWVudW0gewotICAgIEFfUE9TLAotICAgIEFfQ09MT1IsCi0gICAgQV9URVgwLAotICAgIEFfVEVYMQotfTsKLQotR0x1aW50IGNyZWF0ZVByb2dyYW0oY29uc3QgY2hhciogcFZlcnRleFNvdXJjZSwgY29uc3QgY2hhciogcEZyYWdtZW50U291cmNlKSB7Ci0gICAgR0x1aW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgcFZlcnRleFNvdXJjZSk7Ci0gICAgaWYgKCF2ZXJ0ZXhTaGFkZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgR0x1aW50IHBpeGVsU2hhZGVyID0gbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIHBGcmFnbWVudFNvdXJjZSk7Ci0gICAgaWYgKCFwaXhlbFNoYWRlcikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtKSB7Ci0gICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIgdiIpOwotICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBwaXhlbFNoYWRlcik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIgcCIpOwotCi0gICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfUE9TLCAiYV9wb3MiKTsKLSAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9DT0xPUiwgImFfY29sb3IiKTsKLSAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9URVgwLCAiYV90ZXgwIik7Ci0gICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfVEVYMSwgImFfdGV4MSIpOwotICAgICAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICBHTGludCBsaW5rU3RhdHVzID0gR0xfRkFMU0U7Ci0gICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Ci0gICAgICAgIGlmIChsaW5rU3RhdHVzICE9IEdMX1RSVUUpIHsKLSAgICAgICAgICAgIEdMaW50IGJ1Zkxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZidWZMZW5ndGgpOwotICAgICAgICAgICAgaWYgKGJ1Zkxlbmd0aCkgewotICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGJ1Zkxlbmd0aCwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBsaW5rIHByb2dyYW06XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgIHByb2dyYW0gPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGNoZWNrR2xFcnJvcigiY3JlYXRlUHJvZ3JhbSIpOwotICAgIGdsVXNlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICByZXR1cm4gcHJvZ3JhbTsKLX0KLQotdWludDY0X3QgZ2V0VGltZSgpIHsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgdDsKLSAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnQpOwotICAgIHJldHVybiB0LnR2X25zZWMgKyAoKHVpbnQ2NF90KXQudHZfc2VjICogMTAwMCAqIDEwMDAgKiAxMDAwKTsKLX0KLQotdWludDY0X3QgZ1RpbWU7Ci12b2lkIHN0YXJ0VGltZXIoKSB7Ci0gICAgZ1RpbWUgPSBnZXRUaW1lKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgZW5kVGltZXIoaW50IGNvdW50KSB7Ci0gICAgdWludDY0X3QgdDIgPSBnZXRUaW1lKCk7Ci0gICAgZG91YmxlIGRlbHRhID0gKChkb3VibGUpKHQyIC0gZ1RpbWUpKSAvIDEwMDAwMDAwMDA7Ci0gICAgZG91YmxlIHBpeGVscyA9IChnV2lkdGggKiBnSGVpZ2h0KSAqIGNvdW50OwotICAgIGRvdWJsZSBtcHBzID0gcGl4ZWxzIC8gZGVsdGEgLyAxMDAwMDAwOwotICAgIGRvdWJsZSBkYzYwID0gKChkb3VibGUpY291bnQpIC8gZGVsdGEgLyA2MDsKLQotICAgIGlmIChmT3V0KSB7Ci0gICAgICAgIGZwcmludGYoZk91dCwgIiVzLCAlZiwgJWZcclxuIiwgZ0N1cnJlbnRUZXN0TmFtZSwgbXBwcywgZGM2MCk7Ci0gICAgICAgIGZmbHVzaChmT3V0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiVzLCAlZiwgJWZcbiIsIGdDdXJyZW50VGVzdE5hbWUsIG1wcHMsIGRjNjApOwotICAgIH0KLSAgICBBTE9HSSgiJXMsICVmLCAlZlxyXG4iLCBnQ3VycmVudFRlc3ROYW1lLCBtcHBzLCBkYzYwKTsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciBnVmVydGV4U2hhZGVyW10gPQotICAgICJhdHRyaWJ1dGUgdmVjNCBhX3BvcztcbiIKLSAgICAiYXR0cmlidXRlIHZlYzQgYV9jb2xvcjtcbiIKLSAgICAiYXR0cmlidXRlIHZlYzIgYV90ZXgwO1xuIgotICAgICJhdHRyaWJ1dGUgdmVjMiBhX3RleDE7XG4iCi0gICAgInZhcnlpbmcgdmVjNCB2X2NvbG9yO1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgxO1xuIgotICAgICJ1bmlmb3JtIHZlYzIgdV90ZXhPZmY7XG4iCi0KLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgICAgdl9jb2xvciA9IGFfY29sb3I7XG4iCi0gICAgIiAgICB2X3RleDAgPSBhX3RleDA7XG4iCi0gICAgIiAgICB2X3RleDEgPSBhX3RleDE7XG4iCi0gICAgIiAgICB2X3RleDAueCArPSB1X3RleE9mZi54O1xuIgotICAgICIgICAgdl90ZXgxLnkgKz0gdV90ZXhPZmYueTtcbiIKLSAgICAiICAgIGdsX1Bvc2l0aW9uID0gYV9wb3M7XG4iCi0gICAgIn1cbiI7Ci0KLXN0YXRpYyB2b2lkIHNldHVwVkEoKSB7Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IHZ0eFtdID0gewotICAgICAgICAtMS4wZiwtMS4wZiwKLSAgICAgICAgIDEuMGYsLTEuMGYsCi0gICAgICAgIC0xLjBmLCAxLjBmLAotICAgICAgICAgMS4wZiwgMS4wZiB9OwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBjb2xvcltdID0gewotICAgICAgICAxLjBmLDAuMGYsMS4wZiwxLjBmLAotICAgICAgICAwLjBmLDAuMGYsMS4wZiwxLjBmLAotICAgICAgICAxLjBmLDEuMGYsMC4wZiwxLjBmLAotICAgICAgICAxLjBmLDEuMGYsMS4wZiwxLjBmIH07Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IHRleDBbXSA9IHsKLSAgICAgICAgMC4wZiwwLjBmLAotICAgICAgICAxLjBmLDAuMGYsCi0gICAgICAgIDAuMGYsMS4wZiwKLSAgICAgICAgMS4wZiwxLjBmIH07Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IHRleDFbXSA9IHsKLSAgICAgICAgMS4wZiwwLjBmLAotICAgICAgICAxLjBmLDEuMGYsCi0gICAgICAgIDAuMGYsMS4wZiwKLSAgICAgICAgMC4wZiwwLjBmIH07Ci0KLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfUE9TKTsKLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfQ09MT1IpOwotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoQV9URVgwKTsKLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfVEVYMSk7Ci0KLSAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9QT1MsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdnR4KTsKLSAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9DT0xPUiwgNCwgR0xfRkxPQVQsIGZhbHNlLCAxNiwgY29sb3IpOwotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX1RFWDAsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdGV4MCk7Ci0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfVEVYMSwgMiwgR0xfRkxPQVQsIGZhbHNlLCA4LCB0ZXgxKTsKLX0KLQotc3RhdGljIHZvaWQgcmFuZFVuaWZvcm0oaW50IHBnbSwgY29uc3QgY2hhciAqdmFyKSB7Ci0gICAgaW50IGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHBnbSwgdmFyKTsKLSAgICBpZiAobG9jID49IDApIHsKLSAgICAgICAgZmxvYXQgeCA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOwotICAgICAgICBmbG9hdCB5ID0gKChmbG9hdClyYW5kKCkpIC8gUkFORF9NQVg7Ci0gICAgICAgIGZsb2F0IHogPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKLSAgICAgICAgZmxvYXQgdyA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOwotICAgICAgICBnbFVuaWZvcm00Zihsb2MsIHgsIHksIHosIHcpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZG9Mb29wKGJvb2wgd2FybXVwLCBpbnQgcGdtLCB1aW50MzJfdCBwYXNzQ291bnQpIHsKLSAgICBpZiAod2FybXVwKSB7Ci0gICAgICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwotICAgICAgICBwdFN3YXAoKTsKLSAgICAgICAgZ2xGaW5pc2goKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0YXJ0VGltZXIoKTsKLSAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgcGFzc0NvdW50OyBjdCsrKSB7Ci0gICAgICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1X3RleE9mZiIpOwotICAgICAgICBnbFVuaWZvcm0yZihsb2MsICgoZmxvYXQpY3QpIC8gcGFzc0NvdW50LCAoKGZsb2F0KWN0KSAvIDIuZiAvIHBhc3NDb3VudCk7Ci0KLSAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV9jb2xvciIpOwotICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzAiKTsKLSAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8xIik7Ci0gICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfMiIpOwotICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzMiKTsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCA0KTsKLSAgICB9Ci0gICAgcHRTd2FwKCk7Ci0gICAgZ2xGaW5pc2goKTsKLSAgICBlbmRUaW1lcihwYXNzQ291bnQpOwotfQotCi0KLXN0YXRpYyB1aW50MzJfdCByZ2IodWludDMyX3QgciwgdWludDMyX3QgZywgdWludDMyX3QgYikKLXsKLSAgICB1aW50MzJfdCByZXQgPSAweGZmMDAwMDAwOwotICAgIHJldCB8PSByICYgMHhmZjsKLSAgICByZXQgfD0gKGcgJiAweGZmKSA8PCA4OwotICAgIHJldCB8PSAoYiAmIDB4ZmYpIDw8IDE2OwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgZ2VuVGV4dHVyZXMoKSB7Ci0gICAgdWludDMyX3QgKm0gPSAodWludDMyX3QgKiltYWxsb2MoMTAyNCoxMDI0KjQpOwotICAgIGZvciAoaW50IHk9MDsgeSA8IDEwMjQ7IHkrKyl7Ci0gICAgICAgIGZvciAoaW50IHg9MDsgeCA8IDEwMjQ7IHgrKyl7Ci0gICAgICAgICAgICBtW3kqMTAyNCArIHhdID0gcmdiKHgsICgoKHgreSkgJiAweGZmKSA9PSAweDdmKSAqIDB4ZmYsIHkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMSk7Ci0gICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDEwMjQsIDEwMjQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIG0pOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOwotCi0gICAgZm9yIChpbnQgeT0wOyB5IDwgMTY7IHkrKyl7Ci0gICAgICAgIGZvciAoaW50IHg9MDsgeCA8IDE2OyB4KyspewotICAgICAgICAgICAgbVt5KjE2ICsgeF0gPSByZ2IoeCA8PCA0LCAoKCh4K3kpICYgMHhmKSA9PSAweDcpICogMHhmZiwgeSA8PCA0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDIpOwotICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCAxNiwgMTYsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIG0pOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOwotICAgIGZyZWUobSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvU2luZ2xlVGVzdCh1aW50MzJfdCBwZ21OdW0sIGludCB0ZXgpIHsKLSAgICBjb25zdCBjaGFyICpwZ21UeHQgPSBnRnJhZ21lbnRUZXN0c1twZ21OdW1dLT50eHQ7Ci0gICAgaW50IHBnbSA9IGNyZWF0ZVByb2dyYW0oZ1ZlcnRleFNoYWRlciwgcGdtVHh0KTsKLSAgICBpZiAoIXBnbSkgewotICAgICAgICBwcmludGYoImVycm9yIHJ1bm5pbmcgdGVzdFxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHBnbSwgInVfdGV4MCIpOwotICAgIGlmIChsb2MgPj0gMCkgZ2xVbmlmb3JtMWkobG9jLCAwKTsKLSAgICBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1X3RleDEiKTsKLSAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTFpKGxvYywgMSk7Ci0KLQotICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7Ci0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXgpOwotICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMSk7Ci0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXgpOwotICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7Ci0KLSAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORSk7Ci0gICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICAvL3NwcmludGYoc3RyMiwgIiVpLCAlaSwgJWksICVpLCAlaSwgMCIsCi0gICAgICAgICAgICAvL3VzZVZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGVGaXJzdFRleCwgZXh0cmFNYXRoLCB0ZXgwKTsKLSAgICAvL2RvTG9vcCh0cnVlLCBwZ20sIHcsIGgsIHN0cjIpOwotICAgIC8vZG9Mb29wKGZhbHNlLCBwZ20sIHcsIGgsIHN0cjIpOwotCi0gICAgZ2xFbmFibGUoR0xfQkxFTkQpOwotICAgIHNwcmludGYoZ0N1cnJlbnRUZXN0TmFtZSwgIiVzLCAlaSwgJWksIDEiLCBnRnJhZ21lbnRUZXN0c1twZ21OdW1dLT5uYW1lLCBwZ21OdW0sIHRleCk7Ci0gICAgZG9Mb29wKHRydWUsIHBnbSwgMTAwKTsKLSAgICBkb0xvb3AoZmFsc2UsIHBnbSwgMTAwKTsKLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbHRlc3QuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjhmYWNhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGx0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotCi0jaW5jbHVkZSAiZmlsbF9jb21tb24uY3BwIgotCi0KLWJvb2wgZG9UZXN0KHVpbnQzMl90IHcsIHVpbnQzMl90IGgpIHsKLSAgICBnV2lkdGggPSB3OwotICAgIGdIZWlnaHQgPSBoOwotICAgIHNldHVwVkEoKTsKLSAgICBnZW5UZXh0dXJlcygpOwotCi0gICAgcHJpbnRmKCJcbnZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGUsIGV4dHJhTWF0aCwgdGV4U2l6ZSwgYmxlbmQsIE1wcHMsIERDNjBcbiIpOwotCi0gICAgZm9yICh1aW50MzJfdCBudW0gPSAwOyBudW0gPCBnRnJhZ21lbnRUZXN0Q291bnQ7IG51bSsrKSB7Ci0gICAgICAgIGRvU2luZ2xlVGVzdChudW0sIDIpOwotICAgICAgICBpZiAoZ0ZyYWdtZW50VGVzdHNbbnVtXS0+dGV4Q291bnQpIHsKLSAgICAgICAgICAgIGRvU2luZ2xlVGVzdChudW0sIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXhpdCgwKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZyYWdtZW50X3NoYWRlcnMuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZnJhZ21lbnRfc2hhZGVycy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDVlYWQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZnJhZ21lbnRfc2hhZGVycy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotCi10eXBlZGVmIHN0cnVjdCBGcmFnbWVudFRlc3RSZWMgewotCWNvbnN0IGNoYXIgKiBuYW1lOwotCXVpbnQzMl90IHRleENvdW50OwotCWNvbnN0IGNoYXIgKiB0eHQ7Ci19IEZyYWdtZW50VGVzdDsKLQotc3RhdGljIEZyYWdtZW50VGVzdCBmcEZpbGwgPSB7Ci0JIlNvbGlkIGNvbG9yIiwgMCwKLQotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidW5pZm9ybSB2ZWM0IHVfY29sb3I7XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB1X2NvbG9yO1xuIgotICAgICJ9XG4iCi19OwotCi1zdGF0aWMgRnJhZ21lbnRUZXN0IGZwR3JhZGllbnQgPSB7Ci0JIlNvbGlkIGdyYWRpZW50IiwgMCwKLQotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidmFyeWluZyBsb3dwIHZlYzQgdl9jb2xvcjtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHZfY29sb3I7XG4iCi0gICAgIn1cbiIKLX07Ci0KLXN0YXRpYyBGcmFnbWVudFRlc3QgZnBDb3B5VGV4ID0gewotCSJUZXh0dXJlIGNvcHkiLCAxLAotCi0gICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgotICAgICJ9XG4iCi19OwotCi1zdGF0aWMgRnJhZ21lbnRUZXN0IGZwQ29weVRleEdhbW1hID0gewotCSJUZXh0dXJlIGNvcHkgd2l0aCBnYW1tYSIsIDEsCi0KLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIHZlYzQgdCA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCi0gICAgIiAgdC5yZ2IgPSBwb3codC5yZ2IsIHZlYzMoMS40LCAxLjQsIDEuNCkpO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHQ7XG4iCi0gICAgIn1cbiIKLX07Ci0KLXN0YXRpYyBGcmFnbWVudFRlc3QgZnBUZXhTcGVjID0gewotCSJUZXh0dXJlIHNwZWMiLCAxLAotCi0gICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICB2ZWM0IHQgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgotICAgICIgIGZsb2F0IHNpbVNwZWMgPSBkb3QoZ2xfRnJhZ0Nvb3JkLnh5eiwgZ2xfRnJhZ0Nvb3JkLnh5eik7XG4iCi0gICAgIiAgc2ltU3BlYyA9IHBvdyhjbGFtcChzaW1TcGVjLCAwLjEsIDEuMCksIDQwLjApO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHQgKyB2ZWM0KHNpbVNwZWMsIHNpbVNwZWMsIHNpbVNwZWMsIHNpbVNwZWMpO1xuIgotICAgICJ9XG4iCi19OwotCi1zdGF0aWMgRnJhZ21lbnRUZXN0IGZwRGVwVGV4ID0gewotCSJEZXBlbmRlbnQgTG9va3VwIiwgMSwKLQotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgdmVjNCB0ID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKLSAgICAiICB0ICs9IHRleHR1cmUyRCh1X3RleDAsIHQueHkpO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHQ7XG4iCi0gICAgIn1cbiIKLX07Ci0KLXN0YXRpYyBGcmFnbWVudFRlc3QgZnBNb2R1bGF0ZUNvbnN0YW50VGV4ID0gewotCSJUZXh0dXJlIG1vZHVsYXRlIGNvbnN0YW50IiwgMSwKLQotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgotICAgICJ1bmlmb3JtIHZlYzQgdV9jb2xvcjtcbiIKLQotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgbG93cCB2ZWM0IGMgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgotCSIgIGMgKj0gdV9jb2xvcjtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSBjO1xuIgotICAgICJ9XG4iCi19OwotCi1zdGF0aWMgRnJhZ21lbnRUZXN0IGZwTW9kdWxhdGVWYXJ5aW5nVGV4ID0gewotCSJUZXh0dXJlIG1vZHVsYXRlIGdyYWRpZW50IiwgMSwKLQotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKLSAgICAidmFyeWluZyBsb3dwIHZlYzQgdl9jb2xvcjtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgotCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBsb3dwIHZlYzQgYyA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCi0JIiAgYyAqPSB2X2NvbG9yO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IGM7XG4iCi0gICAgIn1cbiIKLX07Ci0KLXN0YXRpYyBGcmFnbWVudFRlc3QgZnBNb2R1bGF0ZVZhcnlpbmdDb25zdGFudFRleCA9IHsKLQkiVGV4dHVyZSBtb2R1bGF0ZSBncmFkaWVudCBjb25zdGFudCIsIDEsCi0KLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCi0gICAgInZhcnlpbmcgbG93cCB2ZWM0IHZfY29sb3I7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKLSAgICAidW5pZm9ybSB2ZWM0IHVfY29sb3I7XG4iCi0KLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGxvd3AgdmVjNCBjID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKLQkiICBjICo9IHZfY29sb3I7XG4iCi0JIiAgYyAqPSB1X2NvbG9yO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IGM7XG4iCi0gICAgIn1cbiIKLX07Ci0KLXN0YXRpYyBGcmFnbWVudFRlc3QgKmdGcmFnbWVudFRlc3RzW10gPSB7Ci0JJmZwRmlsbCwKLQkmZnBHcmFkaWVudCwKLQkmZnBDb3B5VGV4LAotCSZmcENvcHlUZXhHYW1tYSwKLSAgICZmcFRleFNwZWMsCi0gICAmZnBEZXBUZXgsCi0JJmZwTW9kdWxhdGVDb25zdGFudFRleCwKLQkmZnBNb2R1bGF0ZVZhcnlpbmdUZXgsCi0JJmZwTW9kdWxhdGVWYXJ5aW5nQ29uc3RhbnRUZXgsCi0KLX07Ci0KLXN0YXRpYyBjb25zdCBzaXplX3QgZ0ZyYWdtZW50VGVzdENvdW50ID0gc2l6ZW9mKGdGcmFnbWVudFRlc3RzKSAvIHNpemVvZihnRnJhZ21lbnRUZXN0c1swXSk7CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9nbDJfcGVyZi5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9nbDJfcGVyZi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGFjYWYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotCi1zdGF0aWMgdm9pZCBjaGVja0VnbEVycm9yKGNvbnN0IGNoYXIqIG9wLCBFR0xCb29sZWFuIHJldHVyblZhbCA9IEVHTF9UUlVFKSB7Ci0gICAgaWYgKHJldHVyblZhbCAhPSBFR0xfVFJVRSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCkgcmV0dXJuZWQgJWRcbiIsIG9wLCByZXR1cm5WYWwpOwotICAgIH0KLQotICAgIGZvciAoRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsgZXJyb3IgIT0gRUdMX1NVQ0NFU1M7IGVycm9yCi0gICAgICAgICAgICA9IGVnbEdldEVycm9yKCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGVnbEVycm9yICVzICgweCV4KVxuIiwgb3AsIEVHTFV0aWxzOjpzdHJlcnJvcihlcnJvciksCi0gICAgICAgICAgICAgICAgZXJyb3IpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKSB7Ci0gICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCi0gICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZ2xFcnJvciAoMHgleClcbiIsIG9wLCBlcnJvcik7Ci0gICAgfQotfQotCi1ib29sIGRvVGVzdCh1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKLQotc3RhdGljIEVHTERpc3BsYXkgZHB5Owotc3RhdGljIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAgRUdMQm9vbGVhbiByZXR1cm5WYWx1ZTsKLSAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07Ci0KLSAgICBFR0xpbnQgY29udGV4dF9hdHRyaWJzW10gPSB7IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0xfTk9ORSB9OwotICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAotICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICAgICAgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgRUdMQ29udGV4dCBjb250ZXh0OwotICAgIEVHTGludCB3LCBoOwotCi0KLSAgICBjaGVja0VnbEVycm9yKCI8aW5pdD4iKTsKLSAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldERpc3BsYXkiKTsKLSAgICBpZiAoZHB5ID09IEVHTF9OT19ESVNQTEFZKSB7Ci0gICAgICAgIHByaW50ZigiZWdsR2V0RGlzcGxheSByZXR1cm5lZCBFR0xfTk9fRElTUExBWS5cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm5WYWx1ZSA9IGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xJbml0aWFsaXplIiwgcmV0dXJuVmFsdWUpOwotICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgewotICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7DQotICAgIHJldHVyblZhbHVlID0gRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyhkcHksIHNfY29uZmlnQXR0cmlicywgd2luZG93LCAmbXlDb25maWcpOwotICAgIGlmIChyZXR1cm5WYWx1ZSkgewotICAgICAgICBwcmludGYoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coKSByZXR1cm5lZCAlZCIsIHJldHVyblZhbHVlKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY2hlY2tFZ2xFcnJvcigiRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyIpOwotCi0gICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBteUNvbmZpZywgd2luZG93LCBOVUxMKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIik7Ci0gICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgcHJpbnRmKCJnZWxDcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZC5cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIG15Q29uZmlnLCBFR0xfTk9fQ09OVEVYVCwgY29udGV4dF9hdHRyaWJzKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVDb250ZXh0Iik7Ci0gICAgaWYgKGNvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm5WYWx1ZSA9IGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsTWFrZUN1cnJlbnQiLCByZXR1cm5WYWx1ZSk7Ci0gICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7Ci0gICAgR0xpbnQgZGltID0gdyA8IGggPyB3IDogaDsKLQotICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGRvVGVzdCh3LCBoKTsKLSAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgICAgY2hlY2tFZ2xFcnJvcigiZWdsU3dhcEJ1ZmZlcnMiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBwdFN3YXAoKSB7Ci0gICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTUwZTkuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgT3BlbkdMIEVTIFBlcmYgQXBwCi0jIFRoaXMgbWFrZWZpbGUgYnVpbGRzIGJvdGggYW4gYWN0aXZpdHkgYW5kIGEgc2hhcmVkIGxpYnJhcnkuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgQnVpbGQgYWN0aXZpdHkKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBHTFBlcmYKLQotTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZ2xwZXJmCi0KLSMgUnVuIG9uIEVjbGFpcgotTE9DQUxfU0RLX1ZFUlNJT04gOj0gNwotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCdWlsZCBKTkkgU2hhcmVkIExpYnJhcnkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTE9DQUxfUEFUSDo9ICQoTE9DQUxfUEFUSCkvam5pCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIE9wdGlvbmFsIHRhZyB3b3VsZCBtZWFuIGl0IGRvZXNuJ3QgZ2V0IGluc3RhbGxlZCBieSBkZWZhdWx0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvcgotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gIGdsX2NvZGUuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYnV0aWxzIFwKLQlsaWJFR0wgXAotCWxpYkdMRVN2MgotCi1MT0NBTF9NT0RVTEUgOj0gbGliZ2xwZXJmCi0KLQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0YmQ5OC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5nbHBlcmYiCi0gICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wLjAiIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEwMDAwIiA+Ci0gICAgPHVzZXMtc2RrIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iNyIgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSI3IiAvPgotICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KLSAgICA8YXBwbGljYXRpb24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZ2xwZXJmX2FjdGl2aXR5Ij4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iR0xQZXJmQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgotICAgICAgICAgICAgCWFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKLSAgICAgICAgICAgIAlhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL2puaS9nbF9jb2RlLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL2puaS9nbF9jb2RlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwNDE4My4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9qbmkvZ2xfY29kZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8gT3BlbkdMIEVTIDIuMCBjb2RlCi0KLSNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvam5pLmg+Ci0jZGVmaW5lIExPR19UQUcgIkdMUGVyZiBnbF9jb2RlLmNwcCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSAiLi4vLi4vZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAiCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8gV2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2NyZWVuCi0KLXVpbnQzMl90IHc7Ci11aW50MzJfdCBoOwotCi0vLyBUaGUgc3RhdGVDbG9jayBzdGFydHMgYXQgemVybyBhbmQgaW5jcmVtZW50cyBieSAxIGV2ZXJ5IHRpbWUgd2UgZHJhdyBhIGZyYW1lLiBJdCBpcyB1c2VkIHRvIGNvbnRyb2wgd2hpY2ggcGhhc2Ugb2YgdGhlIHRlc3Qgd2UgYXJlIGluLgotCi1pbnQgc3RhdGVDbG9jazsKLWNvbnN0IGludCBkb0xvb3BTdGF0ZXMgPSAyOwotY29uc3QgaW50IGRvU2luZ2xlVGVzdFN0YXRlcyA9IDI7Ci1ib29sIGRvbmU7Ci0KLS8vIFNhdmVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSB0ZXN0IChzbyB3ZSBjYW4gcHJpbnQgdGhlbSBvdXQgd2hlbiB3ZSBmaW5pc2ggdGhlIHRpbWluZy4pCi0KLQotaW50IHBnbTsKLQotdm9pZCBwdFN3YXAoKSB7Ci19Ci0KLXZvaWQgZG9UZXN0KCkgewotICAgIHVpbnQzMl90IHRlc3ROdW0gPSBzdGF0ZUNsb2NrID4+IDI7Ci0gICAgaW50IHRleFNpemUgPSAoKHN0YXRlQ2xvY2sgPj4gMSkgJiAweDEpICsgMTsKLQotICAgIGlmICh0ZXN0TnVtID49IGdGcmFnbWVudFRlc3RDb3VudCkgewotICAgICAgIEFMT0dJKCJkb25lXG4iKTsKLSAgICAgICBpZiAoZk91dCkgewotICAgICAgICAgICBmY2xvc2UoZk91dCk7Ci0gICAgICAgICAgIGZPdXQgPSBOVUxMOwotICAgICAgIH0KLSAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQUxPR0koImRvVGVzdCAlZCAlZCAlZFxuIiwgdGV4Q291bnQsIGV4dHJhTWF0aCwgdGVzdFN1YlN0YXRlKTsKLQotLy8gICAgICAgIGZvciAodWludDMyX3QgbnVtID0gMDsgbnVtIDwgZ0ZyYWdtZW50VGVzdENvdW50OyBudW0rKykgewotICAgIGRvU2luZ2xlVGVzdCh0ZXN0TnVtLCB0ZXhTaXplKTsKLX0KLQotZXh0ZXJuICJDIiB7Ci0gICAgSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfaW5pdChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqLCAgamludCB3aWR0aCwgamludCBoZWlnaHQpOwotICAgIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbHBlcmZfR0xQZXJmTGliX3N0ZXAoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaik7Ci19OwotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9pbml0KEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosICBqaW50IHdpZHRoLCBqaW50IGhlaWdodCkKLXsKLSAgICBnV2lkdGggPSB3aWR0aDsKLSAgICBnSGVpZ2h0ID0gaGVpZ2h0OwotICAgIGlmICghZG9uZSkgewotICAgICAgICAgICAgc3RhdGVDbG9jayA9IDA7Ci0gICAgICAgICAgICBkb25lID0gZmFsc2U7Ci0gICAgICAgICAgICBzZXR1cFZBKCk7Ci0gICAgICAgICAgICBnZW5UZXh0dXJlcygpOwotICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZU5hbWUgPSAiL3NkY2FyZC9nbHBlcmYuY3N2IjsKLSAgICAgICAgICAgIGlmIChmT3V0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgQUxPR0koIkNsb3NpbmcgcGFydGlhbGx5IHdyaXR0ZW4gb3V0cHV0Lm4iKTsKLSAgICAgICAgICAgICAgICAgZmNsb3NlKGZPdXQpOwotICAgICAgICAgICAgICAgICBmT3V0ID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dJKCJXcml0aW5nIHRvOiAlc1xuIixmaWxlTmFtZSk7Ci0gICAgICAgICAgICBmT3V0ID0gZm9wZW4oZmlsZU5hbWUsICJ3Iik7Ci0gICAgICAgICAgICBpZiAoZk91dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBvcGVuOiAlc1xuIiwgZmlsZU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HSSgiXG52YXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlLCBleHRyYU1hdGgsIHRleFNpemUsIGJsZW5kLCBNcHBzLCBEQzYwXG4iKTsKLSAgICAgICAgICAgIGlmIChmT3V0KSBmcHJpbnRmKGZPdXQsInZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGUsIGV4dHJhTWF0aCwgdGV4U2l6ZSwgYmxlbmQsIE1wcHMsIERDNjBcclxuIik7Ci0gICAgfQotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopCi17Ci0gICAgaWYgKCEgZG9uZSkgewotICAgICAgICBpZiAoc3RhdGVDbG9jayA+IDAgJiYgKChzdGF0ZUNsb2NrICYgMSkgPT0gMCkpIHsKLSAgICAgICAgICAgIC8vZW5kVGltZXIoMTAwKTsKLSAgICAgICAgfQotICAgICAgICBkb1Rlc3QoKTsKLSAgICAgICAgc3RhdGVDbG9jaysrOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjZDk2MS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZwotICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJnbHBlcmZfYWN0aXZpdHkiPkdMUGVyZjwvc3RyaW5nPgotCi08L3Jlc291cmNlcz4KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2YzYWJmLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdscGVyZjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLQotcHVibGljIGNsYXNzIEdMUGVyZkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgR0xQZXJmVmlldyBtVmlldzsKLQotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0JZ2V0V2luZG93KCkuc2V0RmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTiwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTik7Ci0gICAgICAgIG1WaWV3ID0gbmV3IEdMUGVyZlZpZXcoZ2V0QXBwbGljYXRpb24oKSk7Ci0Jc2V0Q29udGVudFZpZXcobVZpZXcpOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZMaWIuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmTGliLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTBlNTQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZMaWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdscGVyZjsKLQotLy8gV3JhcHBlciBmb3IgbmF0aXZlIGxpYnJhcnkKLQotcHVibGljIGNsYXNzIEdMUGVyZkxpYiB7Ci0KLSAgICAgc3RhdGljIHsKLSAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiZ2xwZXJmIik7Ci0gICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgY3VycmVudCB2aWV3IHdpZHRoCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgY3VycmVudCB2aWV3IGhlaWdodAotICAgICAqLwotICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGVwKCk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZlZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2U0YTRkLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdscGVyZjsKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQ7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXk7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgotICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQotICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQotICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgotICoKLSAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKLSAqIGluc3RhbmNlLgotICovCi1jbGFzcyBHTFBlcmZWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBRyA9ICJHTFBlcmZWaWV3IjsKLQotICAgIHB1YmxpYyBHTFBlcmZWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgaW5pdChmYWxzZSwgMCwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIEdMUGVyZlZpZXcoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHRyYW5zbHVjZW50LCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBpbml0KHRyYW5zbHVjZW50LCBkZXB0aCwgc3RlbmNpbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoYm9vbGVhbiB0cmFuc2x1Y2VudCwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgewotICAgICAgICBzZXRFR0xDb250ZXh0RmFjdG9yeShuZXcgQ29udGV4dEZhY3RvcnkoKSk7Ci0gICAgICAgIHNldEVHTENvbmZpZ0Nob29zZXIoIHRyYW5zbHVjZW50ID8KLSAgICAgICAgICAgICAgbmV3IENvbmZpZ0Nob29zZXIoOCw4LDgsOCwgZGVwdGgsIHN0ZW5jaWwpIDoKLSAgICAgICAgICAgICAgbmV3IENvbmZpZ0Nob29zZXIoNSw2LDUsMCwgZGVwdGgsIHN0ZW5jaWwpKTsKLSAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRleHRGYWN0b3J5IGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5FR0xDb250ZXh0RmFjdG9yeSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiA9IDB4MzA5ODsKLSAgICAgICAgcHVibGljIEVHTENvbnRleHQgY3JlYXRlQ29udGV4dChFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGVnbENvbmZpZykgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiY3JlYXRpbmcgT3BlbkdMIEVTIDIuMCBjb250ZXh0Iik7Ci0gICAgICAgICAgICBjaGVja0VnbEVycm9yKCJCZWZvcmUgZWdsQ3JlYXRlQ29udGV4dCIsIGVnbCk7Ci0gICAgICAgICAgICBpbnRbXSBhdHRyaWJfbGlzdCA9IHtFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMMTAuRUdMX05PTkUgfTsKLSAgICAgICAgICAgIEVHTENvbnRleHQgY29udGV4dCA9IGVnbC5lZ2xDcmVhdGVDb250ZXh0KGRpc3BsYXksIGVnbENvbmZpZywgRUdMMTAuRUdMX05PX0NPTlRFWFQsIGF0dHJpYl9saXN0KTsKLSAgICAgICAgICAgIGNoZWNrRWdsRXJyb3IoIkFmdGVyIGVnbENyZWF0ZUNvbnRleHQiLCBlZ2wpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95Q29udGV4dChFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBlZ2wuZWdsRGVzdHJveUNvbnRleHQoZGlzcGxheSwgY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRWdsRXJyb3IoU3RyaW5nIHByb21wdCwgRUdMMTAgZWdsKSB7Ci0gICAgICAgIGludCBlcnJvcjsKLSAgICAgICAgd2hpbGUgKChlcnJvciA9IGVnbC5lZ2xHZXRFcnJvcigpKSAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgTG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KCIlczogRUdMIGVycm9yOiAweCV4IiwgcHJvbXB0LCBlcnJvcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29uZmlnQ2hvb3NlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuRUdMQ29uZmlnQ2hvb3NlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBFR0xfT1BFTkdMX0VTMl9CSVQgPSA0OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBzX2NvbmZpZ0F0dHJpYnMyID0KLSAgICAgICAgewotICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCA0LAotICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDQsCi0gICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCA0LAotICAgICAgICAgICAgRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUKLSAgICAgICAgfTsKLQotICAgICAgICBwdWJsaWMgQ29uZmlnQ2hvb3NlcihpbnQgciwgaW50IGcsIGludCBiLCBpbnQgYSwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgewotICAgICAgICAgICAgbVJlZFNpemUgPSByOwotICAgICAgICAgICAgbUdyZWVuU2l6ZSA9IGc7Ci0gICAgICAgICAgICBtQmx1ZVNpemUgPSBiOwotICAgICAgICAgICAgbUFscGhhU2l6ZSA9IGE7Ci0gICAgICAgICAgICBtRGVwdGhTaXplID0gZGVwdGg7Ci0gICAgICAgICAgICBtU3RlbmNpbFNpemUgPSBzdGVuY2lsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXkpIHsKLQotICAgICAgICAgICAgaW50W10gbnVtX2NvbmZpZyA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICBlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIHNfY29uZmlnQXR0cmliczIsIG51bGwsIDAsIG51bV9jb25maWcpOwotCi0gICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IG51bV9jb25maWdbMF07Ci0KLSAgICAgICAgICAgIGlmIChudW1Db25maWdzIDw9IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb25maWdzIG1hdGNoIGNvbmZpZ1NwZWMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnW251bUNvbmZpZ3NdOwotICAgICAgICAgICAgZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBzX2NvbmZpZ0F0dHJpYnMyLCBjb25maWdzLCBudW1Db25maWdzLCBudW1fY29uZmlnKTsKLSAgICAgICAgICAgIC8vIHByaW50Q29uZmlncyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOwotICAgICAgICAgICAgcmV0dXJuIGNob29zZUNvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncykgewotICAgICAgICAgICAgRUdMQ29uZmlnIGNsb3Nlc3RDb25maWcgPSBudWxsOwotICAgICAgICAgICAgaW50IGNsb3Nlc3REaXN0YW5jZSA9IDEwMDA7Ci0gICAgICAgICAgICBmb3IoRUdMQ29uZmlnIGNvbmZpZyA6IGNvbmZpZ3MpIHsKLSAgICAgICAgICAgICAgICBpbnQgZCA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgaW50IHMgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGQgPj0gbURlcHRoU2l6ZSAmJiBzPj0gbVN0ZW5jaWxTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIDApOwotICAgICAgICAgICAgICAgICAgICBpbnQgZyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBkaXN0YW5jZSA9IE1hdGguYWJzKHIgLSBtUmVkU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhnIC0gbUdyZWVuU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhiIC0gbUJsdWVTaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGEgLSBtQWxwaGFTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgY2xvc2VzdERpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RDb25maWcgPSBjb25maWc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2xvc2VzdENvbmZpZzsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRDb25maWdBdHRyaWIoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgaW50IGF0dHJpYnV0ZSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCi0gICAgICAgICAgICBpZiAoZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwgbVZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtVmFsdWVbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByaW50Q29uZmlncyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKLSAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKLSAgICAgICAgICAgIGludCBudW1Db25maWdzID0gY29uZmlncy5sZW5ndGg7Ci0gICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiVkIGNvbmZpZ3VyYXRpb25zIiwgbnVtQ29uZmlncykpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIkNvbmZpZ3VyYXRpb24gJWQ6XG4iLCBpKSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcmludENvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKLSAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnKSB7Ci0gICAgICAgICAgICBpbnRbXSBhdHRyaWJ1dGVzID0gewotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQlVGRkVSX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTkZJR19DQVZFQVQsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT05GSUdfSUQsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9MRVZFTCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX0hFSUdIVCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX1BJWEVMUywKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1JFTkRFUkFCTEUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfVklTVUFMX0lELAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1ZJU1VBTF9UWVBFLAotICAgICAgICAgICAgICAgICAgICAweDMwMzAsIC8vIEVHTDEwLkVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU0FNUExFUywKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NBTVBMRV9CVUZGRVJTLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1VSRkFDRV9UWVBFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDM5LCAvLyBFR0wxMC5FR0xfQklORF9UT19URVhUVVJFX1JHQiwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDNBLCAvLyBFR0wxMC5FR0xfQklORF9UT19URVhUVVJFX1JHQkEsCi0gICAgICAgICAgICAgICAgICAgIDB4MzAzQiwgLy8gRUdMMTAuRUdMX01JTl9TV0FQX0lOVEVSVkFMLAotICAgICAgICAgICAgICAgICAgICAweDMwM0MsIC8vIEVHTDEwLkVHTF9NQVhfU1dBUF9JTlRFUlZBTCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0xVTUlOQU5DRV9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfTUFTS19TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09MT1JfQlVGRkVSX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIDB4MzA0MiAvLyBFR0wxMC5FR0xfQ09ORk9STUFOVAotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gewotICAgICAgICAgICAgICAgICAgICAiRUdMX0JVRkZFUl9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9BTFBIQV9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9CTFVFX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0dSRUVOX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1JFRF9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9ERVBUSF9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9TVEVOQ0lMX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZJR19DQVZFQVQiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZJR19JRCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTEVWRUwiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX0hFSUdIVCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfUElYRUxTIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9XSURUSCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1JFTkRFUkFCTEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9WSVNVQUxfSUQiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9WSVNVQUxfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfUFJFU0VSVkVEX1JFU09VUkNFUyIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfU0FNUExFUyIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfU0FNUExFX0JVRkZFUlMiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1NVUkZBQ0VfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQklORF9UT19URVhUVVJFX1JHQiIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQklORF9UT19URVhUVVJFX1JHQkEiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX01JTl9TV0FQX0lOVEVSVkFMIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfU1dBUF9JTlRFUlZBTCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTFVNSU5BTkNFX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0FMUEhBX01BU0tfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQ09MT1JfQlVGRkVSX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1JFTkRFUkFCTEVfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORk9STUFOVCIKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBpbnRbXSB2YWx1ZSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgYXR0cmlidXRlID0gYXR0cmlidXRlc1tpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotICAgICAgICAgICAgICAgIGlmICggZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwgdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiICAlczogJWRcbiIsIG5hbWUsIHZhbHVlWzBdKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIgICVzOiBmYWlsZWRcbiIsIG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVnbC5lZ2xHZXRFcnJvcigpICE9IEVHTDEwLkVHTF9TVUNDRVNTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdWJjbGFzc2VzIGNhbiBhZGp1c3QgdGhlc2UgdmFsdWVzOgotICAgICAgICBwcm90ZWN0ZWQgaW50IG1SZWRTaXplOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1HcmVlblNpemU7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgbUJsdWVTaXplOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1BbHBoYVNpemU7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgbURlcHRoU2l6ZTsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtU3RlbmNpbFNpemU7Ci0gICAgICAgIHByaXZhdGUgaW50W10gbVZhbHVlID0gbmV3IGludFsxXTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7Ci0gICAgICAgICAgICBHTFBlcmZMaWIuc3RlcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgIEdMUGVyZkxpYi5pbml0KHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfeXV2dGV4L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2xfeXV2dGV4L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNWRiYTAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX3l1dnRleC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWdsX3l1dnRleC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLSAgICBsaWJFR0wgXAotICAgIGxpYkdMRVN2MV9DTSBcCi0gICAgbGlidWkKLQotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1nbF95dXZ0ZXgKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF95dXZ0ZXgvZ2xfeXV2dGV4LmNwcCBiL29wZW5nbC90ZXN0cy9nbF95dXZ0ZXgvZ2xfeXV2dGV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwMGY3Ni4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfeXV2dGV4L2dsX3l1dnRleC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotc3RhdGljIHZvaWQgcHJpbnRHTFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBHTGVudW0gcykgewotICAgIC8vIGZwcmludGYoc3RkZXJyLCAicHJpbnRHTFN0cmluZyAlcywgJWRcbiIsIG5hbWUsIHMpOwotICAgIGNvbnN0IGNoYXIgKnYgPSAoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhzKTsKLSAgICAvLyBpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7Ci0gICAgLy8gZnByaW50ZihzdGRlcnIsICJnbEdldEVycm9yKCkgPSAlZCwgcmVzdWx0IG9mIGdsR2V0U3RyaW5nID0gJXhcbiIsIGVycm9yLAotICAgIC8vICAgICAgICAodW5zaWduZWQgaW50KSB2KTsKLSAgICAvLyBpZiAoKHYgPCAoY29uc3QgY2hhciopIDApIHx8ICh2ID4gKGNvbnN0IGNoYXIqKSAweDEwMDAwKSkKLSAgICAvLyAgICBmcHJpbnRmKHN0ZGVyciwgIkdMICVzID0gJXNcbiIsIG5hbWUsIHYpOwotICAgIC8vIGVsc2UKLSAgICAvLyAgICBmcHJpbnRmKHN0ZGVyciwgIkdMICVzID0gKG51bGwpIDB4JTA4eFxuIiwgbmFtZSwgKHVuc2lnbmVkIGludCkgdik7Ci0gICAgZnByaW50ZihzdGRlcnIsICJHTCAlcyA9ICVzXG4iLCBuYW1lLCB2KTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwgPSBFR0xfVFJVRSkgewotICAgIGlmIChyZXR1cm5WYWwgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcygpIHJldHVybmVkICVkXG4iLCBvcCwgcmV0dXJuVmFsKTsKLSAgICB9Ci0KLSAgICBmb3IgKEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7IGVycm9yICE9IEVHTF9TVUNDRVNTOyBlcnJvcgotICAgICAgICAgICAgPSBlZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBlZ2xFcnJvciAlcyAoMHgleClcbiIsIG9wLCBFR0xVdGlsczo6c3RyZXJyb3IoZXJyb3IpLAotICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkgewotICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgotICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOwotICAgIH0KLX0KLQotYm9vbCBzZXR1cEdyYXBoaWNzKGludCB3LCBpbnQgaCkgewotICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFZpZXdwb3J0Iik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBhbGlnbihpbnQgeCwgaW50IGEpIHsKLSAgICByZXR1cm4gKHggKyAoYS0xKSkgJiAofihhLTEpKTsKLX0KLQotY29uc3QgaW50IHl1dlRleFdpZHRoID0gNjAwOwotY29uc3QgaW50IHl1dlRleEhlaWdodCA9IDQ4MDsKLWNvbnN0IGludCB5dXZUZXhVc2FnZSA9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX1RFWFRVUkUgfAotICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19XUklURV9SQVJFTFk7Ci1jb25zdCBpbnQgeXV2VGV4Rm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwotY29uc3QgaW50IHl1dlRleE9mZnNldFkgPSAwOwotY29uc3QgaW50IHl1dlRleFN0cmlkZVkgPSAoeXV2VGV4V2lkdGggKyAweGYpICYgfjB4ZjsKLWNvbnN0IGludCB5dXZUZXhPZmZzZXRWID0geXV2VGV4U3RyaWRlWSAqIHl1dlRleEhlaWdodDsKLWNvbnN0IGludCB5dXZUZXhTdHJpZGVWID0gKHl1dlRleFN0cmlkZVkvMiArIDB4ZikgJiB+MHhmOyAKLWNvbnN0IGludCB5dXZUZXhPZmZzZXRVID0geXV2VGV4T2Zmc2V0ViArIHl1dlRleFN0cmlkZVYgKiB5dXZUZXhIZWlnaHQvMjsKLWNvbnN0IGludCB5dXZUZXhTdHJpZGVVID0geXV2VGV4U3RyaWRlVjsKLWNvbnN0IGJvb2wgeXV2VGV4U2FtZVVWID0gZmFsc2U7Ci1zdGF0aWMgc3A8R3JhcGhpY0J1ZmZlcj4geXV2VGV4QnVmZmVyOwotc3RhdGljIEdMdWludCB5dXZUZXg7Ci0KLWJvb2wgc2V0dXBZdXZUZXhTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGNvbnRleHQpIHsKLSAgICBpbnQgYmxvY2tXaWR0aCA9IHl1dlRleFdpZHRoID4gMTYgPyB5dXZUZXhXaWR0aCAvIDE2IDogMTsKLSAgICBpbnQgYmxvY2tIZWlnaHQgPSB5dXZUZXhIZWlnaHQgPiAxNiA/IHl1dlRleEhlaWdodCAvIDE2IDogMTsKLSAgICB5dXZUZXhCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcih5dXZUZXhXaWR0aCwgeXV2VGV4SGVpZ2h0LCB5dXZUZXhGb3JtYXQsCi0gICAgICAgICAgICB5dXZUZXhVc2FnZSk7Ci0gICAgY2hhciogYnVmID0gTlVMTDsKLSAgICBzdGF0dXNfdCBlcnIgPSB5dXZUZXhCdWZmZXItPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmJ1ZikpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInl1dlRleEJ1ZmZlci0+bG9jayguLi4pIGZhaWxlZDogJWRcbiIsIGVycik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB5dXZUZXhXaWR0aDsgeCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgeXV2VGV4SGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgIGludCBwYXJpdHlYID0gKHggLyBibG9ja1dpZHRoKSAmIDE7Ci0gICAgICAgICAgICBpbnQgcGFyaXR5WSA9ICh5IC8gYmxvY2tIZWlnaHQpICYgMTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW50ZW5zaXR5ID0gKHBhcml0eVggXiBwYXJpdHlZKSA/IDYzIDogMTkxOwotICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFkgKyAoeSAqIHl1dlRleFN0cmlkZVkpICsgeF0gPSBpbnRlbnNpdHk7Ci0gICAgICAgICAgICBpZiAoeCA8IHl1dlRleFdpZHRoIC8gMiAmJiB5IDwgeXV2VGV4SGVpZ2h0IC8gMikgewotICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRVICsgKHkgKiB5dXZUZXhTdHJpZGVVKSArIHhdID0gaW50ZW5zaXR5OwotICAgICAgICAgICAgICAgIGlmICh5dXZUZXhTYW1lVVYpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoeSAqIHl1dlRleFN0cmlkZVYpICsgeF0gPSBpbnRlbnNpdHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4IDwgeXV2VGV4V2lkdGggLyA0ICYmIHkgPCB5dXZUZXhIZWlnaHQgLyA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkqMiAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMF0gPQotICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICh5KjIgKiB5dXZUZXhTdHJpZGVWKSArIHgqMiArIDFdID0KLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoKHkqMisxKSAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMF0gPQotICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICgoeSoyKzEpICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAxXSA9IGludGVuc2l0eTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSB5dXZUZXhCdWZmZXItPnVubG9jaygpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInl1dlRleEJ1ZmZlci0+dW5sb2NrKCkgZmFpbGVkOiAlZFxuIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEVHTENsaWVudEJ1ZmZlciBjbGllbnRCdWZmZXIgPSAoRUdMQ2xpZW50QnVmZmVyKXl1dlRleEJ1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCk7Ci0gICAgRUdMSW1hZ2VLSFIgaW1nID0gZWdsQ3JlYXRlSW1hZ2VLSFIoZHB5LCBFR0xfTk9fQ09OVEVYVCwgRUdMX05BVElWRV9CVUZGRVJfQU5EUk9JRCwKLSAgICAgICAgICAgIGNsaWVudEJ1ZmZlciwgMCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlSW1hZ2VLSFIiKTsKLSAgICBpZiAoaW1nID09IEVHTF9OT19JTUFHRV9LSFIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGdsR2VuVGV4dHVyZXMoMSwgJnl1dlRleCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEdlblRleHR1cmVzIik7Ci0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgeXV2VGV4KTsKLSAgICBjaGVja0dsRXJyb3IoImdsQmluZFRleHR1cmUiKTsKLSAgICBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCAoR0xlZ2xJbWFnZU9FUylpbWcpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyIpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVGV4UGFyYW1ldGVyaSIpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVGV4UGFyYW1ldGVyaSIpOwotICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFRleEVudngiKTsKLQotICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDAsIHl1dlRleFdpZHRoLCB5dXZUZXhIZWlnaHQgfTsKLSAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOwotICAgIGNoZWNrR2xFcnJvcigiZ2xUZXhQYXJhbWV0ZXJpdiIpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgcmVuZGVyRnJhbWUoaW50IHcsIGludCBoKSB7Ci0gICAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhckNvbG9yIik7Ci0gICAgZ2xDbGVhciggR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhciIpOwotICAgIAotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIHl1dlRleCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEJpbmRUZXh0dXJlIik7Ci0gICAgZ2xFbmFibGUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xFbmFibGUiKTsKLQotICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgdywgaCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbERyYXdUZXhpT0VTIik7Ci19Ci0KLXZvaWQgcHJpbnRFR0xDb25maWd1cmF0aW9uKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnKSB7Ci0KLSNkZWZpbmUgWChWQUwpIHtWQUwsICNWQUx9Ci0gICAgc3RydWN0IHtFR0xpbnQgYXR0cmlidXRlOyBjb25zdCBjaGFyKiBuYW1lO30gbmFtZXNbXSA9IHsKLSAgICBYKEVHTF9CVUZGRVJfU0laRSksCi0gICAgWChFR0xfQUxQSEFfU0laRSksCi0gICAgWChFR0xfQkxVRV9TSVpFKSwKLSAgICBYKEVHTF9HUkVFTl9TSVpFKSwKLSAgICBYKEVHTF9SRURfU0laRSksCi0gICAgWChFR0xfREVQVEhfU0laRSksCi0gICAgWChFR0xfU1RFTkNJTF9TSVpFKSwKLSAgICBYKEVHTF9DT05GSUdfQ0FWRUFUKSwKLSAgICBYKEVHTF9DT05GSUdfSUQpLAotICAgIFgoRUdMX0xFVkVMKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1BJWEVMUyksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfV0lEVEgpLAotICAgIFgoRUdMX05BVElWRV9SRU5ERVJBQkxFKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX0lEKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX1RZUEUpLAotICAgIFgoRUdMX1NBTVBMRVMpLAotICAgIFgoRUdMX1NBTVBMRV9CVUZGRVJTKSwKLSAgICBYKEVHTF9TVVJGQUNFX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSksCi0gICAgWChFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBKSwKLSAgICBYKEVHTF9NSU5fU1dBUF9JTlRFUlZBTCksCi0gICAgWChFR0xfTUFYX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX0xVTUlOQU5DRV9TSVpFKSwKLSAgICBYKEVHTF9BTFBIQV9NQVNLX1NJWkUpLAotICAgIFgoRUdMX0NPTE9SX0JVRkZFUl9UWVBFKSwKLSAgICBYKEVHTF9SRU5ERVJBQkxFX1RZUEUpLAotICAgIFgoRUdMX0NPTkZPUk1BTlQpLAotICAgfTsKLSN1bmRlZiBYCi0KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihuYW1lcykgLyBzaXplb2YobmFtZXNbMF0pOyBqKyspIHsKLSAgICAgICAgRUdMaW50IHZhbHVlID0gLTE7Ci0gICAgICAgIEVHTGludCByZXR1cm5WYWwgPSBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIG5hbWVzW2pdLmF0dHJpYnV0ZSwgJnZhbHVlKTsKLSAgICAgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKHJldHVyblZhbCAmJiBlcnJvciA9PSBFR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgcHJpbnRmKCIgJXM6ICIsIG5hbWVzW2pdLm5hbWUpOwotICAgICAgICAgICAgcHJpbnRmKCIlZCAoMHgleCkiLCB2YWx1ZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAgRUdMQm9vbGVhbiByZXR1cm5WYWx1ZTsKLSAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07Ci0KLSAgICBFR0xpbnQgY29udGV4dF9hdHRyaWJzW10gPSB7IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAxLCBFR0xfTk9ORSB9OwotICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAotICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FU19CSVQsCi0gICAgICAgICAgICBFR0xfTk9ORSB9OwotICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKLSAgICBFR0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgRUdMU3VyZmFjZSBzdXJmYWNlOwotICAgIEVHTGludCB3LCBoOwotCi0gICAgRUdMRGlzcGxheSBkcHk7Ci0KLSAgICBjaGVja0VnbEVycm9yKCI8aW5pdD4iKTsKLSAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldERpc3BsYXkiKTsKLSAgICBpZiAoZHB5ID09IEVHTF9OT19ESVNQTEFZKSB7Ci0gICAgICAgIHByaW50ZigiZWdsR2V0RGlzcGxheSByZXR1cm5lZCBFR0xfTk9fRElTUExBWS5cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm5WYWx1ZSA9IGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xJbml0aWFsaXplIiwgcmV0dXJuVmFsdWUpOwotICAgIGZwcmludGYoc3RkZXJyLCAiRUdMIHZlcnNpb24gJWQuJWRcbiIsIG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uKTsKLSAgICBpZiAocmV0dXJuVmFsdWUgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xJbml0aWFsaXplIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOwotICAgIHJldHVyblZhbHVlID0gRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyhkcHksIHNfY29uZmlnQXR0cmlicywgd2luZG93LCAmbXlDb25maWcpOwotICAgIGlmIChyZXR1cm5WYWx1ZSkgewotICAgICAgICBwcmludGYoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coKSByZXR1cm5lZCAlZCIsIHJldHVyblZhbHVlKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgY2hlY2tFZ2xFcnJvcigiRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyIpOwotCi0gICAgcHJpbnRmKCJDaG9zZSB0aGlzIGNvbmZpZ3VyYXRpb246XG4iKTsKLSAgICBwcmludEVHTENvbmZpZ3VyYXRpb24oZHB5LCBteUNvbmZpZyk7Ci0KLSAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIG15Q29uZmlnLCB3aW5kb3csIE5VTEwpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZVdpbmRvd1N1cmZhY2UiKTsKLSAgICBpZiAoc3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICBwcmludGYoImdlbENyZWF0ZVdpbmRvd1N1cmZhY2UgZmFpbGVkLlxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgbXlDb25maWcsIEVHTF9OT19DT05URVhULCBjb250ZXh0X2F0dHJpYnMpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZUNvbnRleHQiKTsKLSAgICBpZiAoY29udGV4dCA9PSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICBwcmludGYoImVnbENyZWF0ZUNvbnRleHQgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVyblZhbHVlID0gZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xNYWtlQ3VycmVudCIsIHJldHVyblZhbHVlKTsKLSAgICBpZiAocmV0dXJuVmFsdWUgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOwotICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKLSAgICBHTGludCBkaW0gPSB3IDwgaCA/IHcgOiBoOwotCi0gICAgZnByaW50ZihzdGRlcnIsICJXaW5kb3cgZGltZW5zaW9uczogJWQgeCAlZFxuIiwgdywgaCk7Ci0KLSAgICBwcmludEdMU3RyaW5nKCJWZXJzaW9uIiwgR0xfVkVSU0lPTik7Ci0gICAgcHJpbnRHTFN0cmluZygiVmVuZG9yIiwgR0xfVkVORE9SKTsKLSAgICBwcmludEdMU3RyaW5nKCJSZW5kZXJlciIsIEdMX1JFTkRFUkVSKTsKLSAgICBwcmludEdMU3RyaW5nKCJFeHRlbnNpb25zIiwgR0xfRVhURU5TSU9OUyk7Ci0KLSAgICBpZighc2V0dXBZdXZUZXhTdXJmYWNlKGRweSwgY29udGV4dCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgc2V0IHVwIHRleHR1cmUgc3VyZmFjZS5cbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBpZighc2V0dXBHcmFwaGljcyh3LCBoKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBzZXQgdXAgZ3JhcGhpY3MuXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgZm9yICg7OykgewotICAgICAgICBzdGF0aWMgaW50IGRpciA9IC0xOwotCi0gICAgICAgIHJlbmRlckZyYW1lKHcsIGgpOwotICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xTd2FwQnVmZmVycyIpOwotCi0gICAgICAgIGlmICh3IDw9IDEwIHx8IGggPD0gMTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpciA9IC1kaXI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodyA+PSAxMzAwIHx8IGggPj0gOTAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXIgPSAtZGlyOwotICAgICAgICB9Ci0KLQotICAgICAgICB3ICs9IGRpcjsKLSAgICAgICAgaCArPSBkaXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xkdWFsL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2xkdWFsL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YjM3OGUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBPcGVuR0wgRVMgSk5JIHNhbXBsZQotIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGFuIGFjdGl2aXR5IGFuZCBhIHNoYXJlZCBsaWJyYXJ5LgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIEJ1aWxkIGFjdGl2aXR5Ci0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gR0xEdWFsCi0KLUxPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmdsZHVhbGpuaQotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCdWlsZCBKTkkgU2hhcmVkIExpYnJhcnkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTE9DQUxfUEFUSDo9ICQoTE9DQUxfUEFUSCkvam5pCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIE9wdGlvbmFsIHRhZyB3b3VsZCBtZWFuIGl0IGRvZXNuJ3QgZ2V0IGluc3RhbGxlZCBieSBkZWZhdWx0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvcgotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gIGdsX2NvZGUuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYnV0aWxzIFwKLQlsaWJFR0wgXAotCWxpYkdMRVN2MgotCi1MT0NBTF9NT0RVTEUgOj0gbGliZ2xkdWFsam5pCi0KLQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xkdWFsL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvZ2xkdWFsL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNmY0ZjcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5nbGR1YWwiPgotICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9nbGR1YWxfYWN0aXZpdHkiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJHTER1YWxBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCi0gICAgICAgICAgICAJYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIgotICAgICAgICAgICAgCWFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9qbmkvZ2xfY29kZS5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xkdWFsL2puaS9nbF9jb2RlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4NjdlZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xkdWFsL2puaS9nbF9jb2RlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLyBPcGVuR0wgRVMgMi4wIGNvZGUKLQotI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9qbmkuaD4KLSNkZWZpbmUgTE9HX1RBRyAiR0wySk5JIGdsX2NvZGUuY3BwIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLXN0YXRpYyB2b2lkIHByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpIHsKLSAgICBjb25zdCBjaGFyICp2ID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcocyk7Ci0gICAgQUxPR0koIkdMICVzID0gJXNcbiIsIG5hbWUsIHYpOwotfQotCi1zdGF0aWMgdm9pZCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApIHsKLSAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKLSAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIEFMT0dJKCJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgZ1ZlcnRleFNoYWRlcltdID0gImF0dHJpYnV0ZSB2ZWM0IHZQb3NpdGlvbjtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX1Bvc2l0aW9uID0gdlBvc2l0aW9uO1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBnRnJhZ21lbnRTaGFkZXJbXSA9ICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wLCAxLjAsIDAuMCwgMS4wKTtcbiIKLSAgICAifVxuIjsKLQotR0x1aW50IGxvYWRTaGFkZXIoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UpIHsKLSAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7Ci0gICAgaWYgKHNoYWRlcikgewotICAgICAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZwU291cmNlLCBOVUxMKTsKLSAgICAgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgIEdMaW50IGNvbXBpbGVkID0gMDsKLSAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZWQpOwotICAgICAgICBpZiAoIWNvbXBpbGVkKSB7Ci0gICAgICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKLSAgICAgICAgICAgIGlmIChpbmZvTGVuKSB7Ci0gICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyICVkOlxuJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyVHlwZSwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNoYWRlcjsKLX0KLQotR0x1aW50IGNyZWF0ZVByb2dyYW0oY29uc3QgY2hhciogcFZlcnRleFNvdXJjZSwgY29uc3QgY2hhciogcEZyYWdtZW50U291cmNlKSB7Ci0gICAgR0x1aW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgcFZlcnRleFNvdXJjZSk7Ci0gICAgaWYgKCF2ZXJ0ZXhTaGFkZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgR0x1aW50IHBpeGVsU2hhZGVyID0gbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIHBGcmFnbWVudFNvdXJjZSk7Ci0gICAgaWYgKCFwaXhlbFNoYWRlcikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtKSB7Ci0gICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIiKTsKLSAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgcGl4ZWxTaGFkZXIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIik7Ci0gICAgICAgIGdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgIEdMaW50IGxpbmtTdGF0dXMgPSBHTF9GQUxTRTsKLSAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZsaW5rU3RhdHVzKTsKLSAgICAgICAgaWYgKGxpbmtTdGF0dXMgIT0gR0xfVFJVRSkgewotICAgICAgICAgICAgR0xpbnQgYnVmTGVuZ3RoID0gMDsKLSAgICAgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwgJmJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoYnVmTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoYnVmTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSwgYnVmTGVuZ3RoLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGxpbmsgcHJvZ3JhbTpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICAgICAgcHJvZ3JhbSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByb2dyYW07Ci19Ci0KLUdMdWludCBnUHJvZ3JhbTsKLUdMdWludCBndlBvc2l0aW9uSGFuZGxlOwotCi1ib29sIHNldHVwR3JhcGhpY3MoaW50IHcsIGludCBoKSB7Ci0gICAgcHJpbnRHTFN0cmluZygiVmVyc2lvbiIsIEdMX1ZFUlNJT04pOwotICAgIHByaW50R0xTdHJpbmcoIlZlbmRvciIsIEdMX1ZFTkRPUik7Ci0gICAgcHJpbnRHTFN0cmluZygiUmVuZGVyZXIiLCBHTF9SRU5ERVJFUik7Ci0gICAgcHJpbnRHTFN0cmluZygiRXh0ZW5zaW9ucyIsIEdMX0VYVEVOU0lPTlMpOwotCi0gICAgQUxPR0koInNldHVwR3JhcGhpY3MoJWQsICVkKSIsIHcsIGgpOwotICAgIGdQcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnVmVydGV4U2hhZGVyLCBnRnJhZ21lbnRTaGFkZXIpOwotICAgIGlmICghZ1Byb2dyYW0pIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBjcmVhdGUgcHJvZ3JhbS4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBndlBvc2l0aW9uSGFuZGxlID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihnUHJvZ3JhbSwgInZQb3NpdGlvbiIpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOwotICAgIEFMT0dJKCJnbEdldEF0dHJpYkxvY2F0aW9uKFwidlBvc2l0aW9uXCIpID0gJWRcbiIsCi0gICAgICAgICAgICBndlBvc2l0aW9uSGFuZGxlKTsKLQotICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFZpZXdwb3J0Iik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEdMZmxvYXQgZ1RyaWFuZ2xlVmVydGljZXNbXSA9IHsgMC4wZiwgMC41ZiwgLTAuNWYsIC0wLjVmLAotICAgICAgICAwLjVmLCAtMC41ZiB9OwotCi12b2lkIHJlbmRlckZyYW1lKCkgewotICAgIHN0YXRpYyBmbG9hdCBncmV5OwotICAgIGdyZXkgKz0gMC4wMWY7Ci0gICAgaWYgKGdyZXkgPiAxLjBmKSB7Ci0gICAgICAgIGdyZXkgPSAwLjBmOwotICAgIH0KLSAgICBnbENsZWFyQ29sb3IoZ3JleSwgZ3JleSwgZ3JleSwgMS4wZik7Ci0gICAgY2hlY2tHbEVycm9yKCJnbENsZWFyQ29sb3IiKTsKLSAgICBnbENsZWFyKCBHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbENsZWFyIik7Ci0KLSAgICBnbFVzZVByb2dyYW0oZ1Byb2dyYW0pOwotICAgIGNoZWNrR2xFcnJvcigiZ2xVc2VQcm9ncmFtIik7Ci0KLSAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoZ3ZQb3NpdGlvbkhhbmRsZSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCBnVHJpYW5nbGVWZXJ0aWNlcyk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFZlcnRleEF0dHJpYlBvaW50ZXIiKTsKLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGd2UG9zaXRpb25IYW5kbGUpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSIpOwotICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIDMpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xEcmF3QXJyYXlzIik7Ci19Ci0KLWV4dGVybiAiQyIgewotICAgIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbGR1YWxfR0xEdWFsTGliX2luaXQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwgamludCB3aWR0aCwgamludCBoZWlnaHQpOwotICAgIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbGR1YWxfR0xEdWFsTGliX3N0ZXAoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaik7Ci19OwotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xkdWFsX0dMRHVhbExpYl9pbml0KEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KQ0KLXsKLSAgICBzZXR1cEdyYXBoaWNzKHdpZHRoLCBoZWlnaHQpOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xkdWFsX0dMRHVhbExpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopCi17Ci0gICAgcmVuZGVyRnJhbWUoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9yZXMvbGF5b3V0L2dsZHVhbF9hY3Rpdml0eS54bWwgYi9vcGVuZ2wvdGVzdHMvZ2xkdWFsL3Jlcy9sYXlvdXQvZ2xkdWFsX2FjdGl2aXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1YWNiYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xkdWFsL3Jlcy9sYXlvdXQvZ2xkdWFsX2FjdGl2aXR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+Ci0gIDxhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZ2wxIgotCWFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0JICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKLQkgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiAvPgotICA8Y29tLmFuZHJvaWQuZ2xkdWFsLkdMRHVhbEdMMlZpZXcgYW5kcm9pZDppZD0iQCtpZC9nbDIiCi0JYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgLz4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL2dsZHVhbC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWY1MzVkLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbGR1YWwvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIHJlc291cmNlIGRlZmluaXRpb25zIGZvciBkaXNwbGF5ZWQgc3RyaW5ncywgYWxsb3dpbmcKLSAgICAgdGhlbSB0byBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBsb2NhbGUgYW5kIG9wdGlvbnMuIC0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gU2ltcGxlIHN0cmluZ3MuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iZ2xkdWFsX2FjdGl2aXR5Ij5HTER1YWw8L3N0cmluZz4KLQotPC9yZXNvdXJjZXM+Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbGR1YWwvc3JjL2NvbS9hbmRyb2lkL2dsZHVhbC9HTER1YWxBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsZHVhbC9zcmMvY29tL2FuZHJvaWQvZ2xkdWFsL0dMRHVhbEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODhmNjQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9zcmMvY29tL2FuZHJvaWQvZ2xkdWFsL0dMRHVhbEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbGR1YWw7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLQotCi1wdWJsaWMgY2xhc3MgR0xEdWFsQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICBHTFN1cmZhY2VWaWV3IG1HTFZpZXc7Ci0gICAgR0xEdWFsR0wyVmlldyBtR0wyVmlldzsKLQotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0gICAgICAgIFZpZXcgcm9vdCA9IGdldExheW91dEluZmxhdGVyKCkuaW5mbGF0ZShSLmxheW91dC5nbGR1YWxfYWN0aXZpdHksIG51bGwpOwotICAgICAgICBtR0xWaWV3ID0gKEdMU3VyZmFjZVZpZXcpIHJvb3QuZmluZFZpZXdCeUlkKFIuaWQuZ2wxKTsKLSAgICAgICAgbUdMVmlldy5zZXRFR0xDb25maWdDaG9vc2VyKDUsNiw1LDAsMCwwKTsKLSAgICAgICAgbUdMVmlldy5zZXRSZW5kZXJlcihuZXcgVHJpYW5nbGVSZW5kZXJlcigpKTsKLSAgICAgICAgbUdMMlZpZXcgPSAoR0xEdWFsR0wyVmlldykgcm9vdC5maW5kVmlld0J5SWQoUi5pZC5nbDIpOwotICAgICAgICBzZXRDb250ZW50Vmlldyhyb290KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICBtR0xWaWV3Lm9uUGF1c2UoKTsKLSAgICAgICAgbUdMMlZpZXcub25QYXVzZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgbUdMVmlldy5vblJlc3VtZSgpOwotICAgICAgICBtR0wyVmlldy5vblJlc3VtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbGR1YWwvc3JjL2NvbS9hbmRyb2lkL2dsZHVhbC9HTER1YWxHTDJWaWV3LmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xkdWFsL3NyYy9jb20vYW5kcm9pZC9nbGR1YWwvR0xEdWFsR0wyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjVlMzQ3Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbGR1YWwvc3JjL2NvbS9hbmRyb2lkL2dsZHVhbC9HTER1YWxHTDJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZ2xkdWFsOwotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0OwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgotICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQotICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQotICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgotICoKLSAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKLSAqIGluc3RhbmNlLgotICovCi1jbGFzcyBHTER1YWxHTDJWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBRyA9ICJHTER1YWxHTDJWaWV3IjsKLQotICAgIHB1YmxpYyBHTER1YWxHTDJWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgaW5pdChmYWxzZSwgMCwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIEdMRHVhbEdMMlZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgc2V0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIHNldCk7Ci0gICAgICAgIGluaXQoZmFsc2UsIDAsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBHTER1YWxHTDJWaWV3KENvbnRleHQgY29udGV4dCwgYm9vbGVhbiB0cmFuc2x1Y2VudCwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgaW5pdCh0cmFuc2x1Y2VudCwgZGVwdGgsIHN0ZW5jaWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KGJvb2xlYW4gdHJhbnNsdWNlbnQsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKLSAgICAgICAgc2V0RUdMQ29udGV4dEZhY3RvcnkobmV3IENvbnRleHRGYWN0b3J5KCkpOwotICAgICAgICBzZXRFR0xDb25maWdDaG9vc2VyKCB0cmFuc2x1Y2VudCA/Ci0gICAgICAgICAgICAgIG5ldyBDb25maWdDaG9vc2VyKDgsOCw4LDgsIGRlcHRoLCBzdGVuY2lsKSA6Ci0gICAgICAgICAgICAgIG5ldyBDb25maWdDaG9vc2VyKDUsNiw1LDAsIGRlcHRoLCBzdGVuY2lsKSk7Ci0gICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuRUdMQ29udGV4dEZhY3RvcnkgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04gPSAweDMwOTg7Ci0gICAgICAgIHB1YmxpYyBFR0xDb250ZXh0IGNyZWF0ZUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBlZ2xDb25maWcpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImNyZWF0aW5nIE9wZW5HTCBFUyAyLjAgY29udGV4dCIpOwotICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcigiQmVmb3JlIGVnbENyZWF0ZUNvbnRleHQiLCBlZ2wpOwotICAgICAgICAgICAgaW50W10gYXR0cmliX2xpc3QgPSB7RUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTDEwLkVHTF9OT05FIH07Ci0gICAgICAgICAgICBFR0xDb250ZXh0IGNvbnRleHQgPSBlZ2wuZWdsQ3JlYXRlQ29udGV4dChkaXNwbGF5LCBlZ2xDb25maWcsIEVHTDEwLkVHTF9OT19DT05URVhULCBhdHRyaWJfbGlzdCk7Ci0gICAgICAgICAgICBjaGVja0VnbEVycm9yKCJBZnRlciBlZ2xDcmVhdGVDb250ZXh0IiwgZWdsKTsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgZWdsLmVnbERlc3Ryb3lDb250ZXh0KGRpc3BsYXksIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0VnbEVycm9yKFN0cmluZyBwcm9tcHQsIEVHTDEwIGVnbCkgewotICAgICAgICBpbnQgZXJyb3I7Ci0gICAgICAgIHdoaWxlICgoZXJyb3IgPSBlZ2wuZWdsR2V0RXJyb3IoKSkgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgU3RyaW5nLmZvcm1hdCgiJXM6IEVHTCBlcnJvcjogMHgleCIsIHByb21wdCwgZXJyb3IpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbmZpZ0Nob29zZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LkVHTENvbmZpZ0Nob29zZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRUdMX09QRU5HTF9FUzJfQklUID0gNDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gc19jb25maWdBdHRyaWJzMiA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgNCwKLSAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCA0LAotICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgNCwKLSAgICAgICAgICAgIEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgIEVHTDEwLkVHTF9OT05FCi0gICAgICAgIH07Ci0KLSAgICAgICAgcHVibGljIENvbmZpZ0Nob29zZXIoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKLSAgICAgICAgICAgIG1SZWRTaXplID0gcjsKLSAgICAgICAgICAgIG1HcmVlblNpemUgPSBnOwotICAgICAgICAgICAgbUJsdWVTaXplID0gYjsKLSAgICAgICAgICAgIG1BbHBoYVNpemUgPSBhOwotICAgICAgICAgICAgbURlcHRoU2l6ZSA9IGRlcHRoOwotICAgICAgICAgICAgbVN0ZW5jaWxTaXplID0gc3RlbmNpbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5KSB7Ci0KLSAgICAgICAgICAgIGludFtdIG51bV9jb25maWcgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBzX2NvbmZpZ0F0dHJpYnMyLCBudWxsLCAwLCBudW1fY29uZmlnKTsKLQotICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBudW1fY29uZmlnWzBdOwotCi0gICAgICAgICAgICBpZiAobnVtQ29uZmlncyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29uZmlncyBtYXRjaCBjb25maWdTcGVjIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tudW1Db25maWdzXTsKLSAgICAgICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgc19jb25maWdBdHRyaWJzMiwgY29uZmlncywgbnVtQ29uZmlncywgbnVtX2NvbmZpZyk7Ci0gICAgICAgICAgICAvLyBwcmludENvbmZpZ3MoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKLSAgICAgICAgICAgIHJldHVybiBjaG9vc2VDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAotICAgICAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKLSAgICAgICAgICAgIEVHTENvbmZpZyBjbG9zZXN0Q29uZmlnID0gbnVsbDsKLSAgICAgICAgICAgIGludCBjbG9zZXN0RGlzdGFuY2UgPSAxMDAwOwotICAgICAgICAgICAgZm9yKEVHTENvbmZpZyBjb25maWcgOiBjb25maWdzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGQgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIDApOwotICAgICAgICAgICAgICAgIGludCBzID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIDApOwotICAgICAgICAgICAgICAgIGlmIChkID49IG1EZXB0aFNpemUgJiYgcz49IG1TdGVuY2lsU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgciA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDApOwotICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsIDApOwotICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdGFuY2UgPSBNYXRoLmFicyhyIC0gbVJlZFNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoZyAtIG1HcmVlblNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoYiAtIG1CbHVlU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhhIC0gbUFscGhhU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IGNsb3Nlc3REaXN0YW5jZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0Q29uZmlnID0gY29uZmlnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNsb3Nlc3RDb25maWc7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kQ29uZmlnQXR0cmliKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAotICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsIGludCBhdHRyaWJ1dGUsIGludCBkZWZhdWx0VmFsdWUpIHsKLQotICAgICAgICAgICAgaWYgKGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIG1WYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVZhbHVlWzBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcmludENvbmZpZ3MoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzKSB7Ci0gICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IGNvbmZpZ3MubGVuZ3RoOwotICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIlZCBjb25maWd1cmF0aW9ucyIsIG51bUNvbmZpZ3MpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCJDb25maWd1cmF0aW9uICVkOlxuIiwgaSkpOwotICAgICAgICAgICAgICAgIHByaW50Q29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlnc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJpbnRDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAgICAgaW50W10gYXR0cmlidXRlcyA9IHsKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JVRkZFUl9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT05GSUdfQ0FWRUFULAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09ORklHX0lELAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTEVWRUwsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9IRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9QSVhFTFMsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9SRU5ERVJBQkxFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1ZJU1VBTF9JRCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9WSVNVQUxfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDMwLCAvLyBFR0wxMC5FR0xfUFJFU0VSVkVEX1JFU09VUkNFUywKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NBTVBMRVMsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TQU1QTEVfQlVGRkVSUywKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NVUkZBQ0VfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgIDB4MzAzOSwgLy8gRUdMMTAuRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IsCi0gICAgICAgICAgICAgICAgICAgIDB4MzAzQSwgLy8gRUdMMTAuRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBLAotICAgICAgICAgICAgICAgICAgICAweDMwM0IsIC8vIEVHTDEwLkVHTF9NSU5fU1dBUF9JTlRFUlZBTCwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDNDLCAvLyBFR0wxMC5FR0xfTUFYX1NXQVBfSU5URVJWQUwsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9MVU1JTkFOQ0VfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX01BU0tfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTE9SX0JVRkZFUl9UWVBFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAweDMwNDIgLy8gRUdMMTAuRUdMX0NPTkZPUk1BTlQKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHsKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9CVUZGRVJfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQUxQSEFfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQkxVRV9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9HUkVFTl9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9SRURfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfREVQVEhfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfU1RFTkNJTF9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GSUdfQ0FWRUFUIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GSUdfSUQiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0xFVkVMIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9IRUlHSFQiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX1BJWEVMUyIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfV0lEVEgiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9SRU5ERVJBQkxFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfVklTVUFMX0lEIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfVklTVUFMX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1BSRVNFUlZFRF9SRVNPVVJDRVMiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1NBTVBMRVMiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1NBTVBMRV9CVUZGRVJTIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9TVVJGQUNFX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9NSU5fU1dBUF9JTlRFUlZBTCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1NXQVBfSU5URVJWQUwiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0xVTUlOQU5DRV9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9BTFBIQV9NQVNLX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTE9SX0JVRkZFUl9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9SRU5ERVJBQkxFX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZPUk1BTlQiCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgaW50W10gdmFsdWUgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoIGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiAgJXM6ICVkXG4iLCBuYW1lLCB2YWx1ZVswXSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiICAlczogZmFpbGVkXG4iLCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChlZ2wuZWdsR2V0RXJyb3IoKSAhPSBFR0wxMC5FR0xfU1VDQ0VTUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3ViY2xhc3NlcyBjYW4gYWRqdXN0IHRoZXNlIHZhbHVlczoKLSAgICAgICAgcHJvdGVjdGVkIGludCBtUmVkU2l6ZTsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtR3JlZW5TaXplOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1CbHVlU2l6ZTsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtQWxwaGFTaXplOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1EZXB0aFNpemU7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgbVN0ZW5jaWxTaXplOwotICAgICAgICBwcml2YXRlIGludFtdIG1WYWx1ZSA9IG5ldyBpbnRbMV07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgewotICAgICAgICAgICAgR0xEdWFsTGliLnN0ZXAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBHTER1YWxMaWIuaW5pdCh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9zcmMvY29tL2FuZHJvaWQvZ2xkdWFsL0dMRHVhbExpYi5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsZHVhbC9zcmMvY29tL2FuZHJvaWQvZ2xkdWFsL0dMRHVhbExpYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGY3NjVlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbGR1YWwvc3JjL2NvbS9hbmRyb2lkL2dsZHVhbC9HTER1YWxMaWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdsZHVhbDsKLQotLy8gV3JhcHBlciBmb3IgbmF0aXZlIGxpYnJhcnkKLQotcHVibGljIGNsYXNzIEdMRHVhbExpYiB7Ci0KLSAgICAgc3RhdGljIHsKLSAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiZ2xkdWFsam5pIik7Ci0gICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgY3VycmVudCB2aWV3IHdpZHRoCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgY3VycmVudCB2aWV3IGhlaWdodAotICAgICAqLwotICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGVwKCk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xkdWFsL3NyYy9jb20vYW5kcm9pZC9nbGR1YWwvVHJpYW5nbGVSZW5kZXJlci5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsZHVhbC9zcmMvY29tL2FuZHJvaWQvZ2xkdWFsL1RyaWFuZ2xlUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4MmQ0Ny4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xkdWFsL3NyYy9jb20vYW5kcm9pZC9nbGR1YWwvVHJpYW5nbGVSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdsZHVhbDsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOwotaW1wb3J0IGphdmEubmlvLlNob3J0QnVmZmVyOwotCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOwotCi1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLQotcHVibGljIGNsYXNzIFRyaWFuZ2xlUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyewotCi0gICAgcHVibGljIFRyaWFuZ2xlUmVuZGVyZXIoKSB7Ci0gICAgICAgIG1UcmlhbmdsZSA9IG5ldyBUcmlhbmdsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAvKgotICAgICAgICAgKiBCeSBkZWZhdWx0LCBPcGVuR0wgZW5hYmxlcyBmZWF0dXJlcyB0aGF0IGltcHJvdmUgcXVhbGl0eQotICAgICAgICAgKiBidXQgcmVkdWNlIHBlcmZvcm1hbmNlLiBPbmUgbWlnaHQgd2FudCB0byB0d2VhayB0aGF0Ci0gICAgICAgICAqIGVzcGVjaWFsbHkgb24gc29mdHdhcmUgcmVuZGVyZXIuCi0gICAgICAgICAqLwotICAgICAgICBnbC5nbERpc2FibGUoR0wxMC5HTF9ESVRIRVIpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNvbWUgb25lLXRpbWUgT3BlbkdMIGluaXRpYWxpemF0aW9uIGNhbiBiZSBtYWRlIGhlcmUKLSAgICAgICAgICogcHJvYmFibHkgYmFzZWQgb24gZmVhdHVyZXMgb2YgdGhpcyBwYXJ0aWN1bGFyIGNvbnRleHQKLSAgICAgICAgICovCi0gICAgICAgIGdsLmdsSGludChHTDEwLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwKLSAgICAgICAgICAgICAgICBHTDEwLkdMX0ZBU1RFU1QpOwotCi0gICAgICAgIGdsLmdsQ2xlYXJDb2xvciguNWYsIC41ZiwgLjVmLCAxKTsKLSAgICAgICAgZ2wuZ2xTaGFkZU1vZGVsKEdMMTAuR0xfU01PT1RIKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEJ5IGRlZmF1bHQsIE9wZW5HTCBlbmFibGVzIGZlYXR1cmVzIHRoYXQgaW1wcm92ZSBxdWFsaXR5Ci0gICAgICAgICAqIGJ1dCByZWR1Y2UgcGVyZm9ybWFuY2UuIE9uZSBtaWdodCB3YW50IHRvIHR3ZWFrIHRoYXQKLSAgICAgICAgICogZXNwZWNpYWxseSBvbiBzb2Z0d2FyZSByZW5kZXJlci4KLSAgICAgICAgICovCi0gICAgICAgIGdsLmdsRGlzYWJsZShHTDEwLkdMX0RJVEhFUik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVXN1YWxseSwgdGhlIGZpcnN0IHRoaW5nIG9uZSBtaWdodCB3YW50IHRvIGRvIGlzIHRvIGNsZWFyCi0gICAgICAgICAqIHRoZSBzY3JlZW4uIFRoZSBtb3N0IGVmZmljaWVudCB3YXkgb2YgZG9pbmcgdGhpcyBpcyB0byB1c2UKLSAgICAgICAgICogZ2xDbGVhcigpLgotICAgICAgICAgKi8KLQotICAgICAgICBnbC5nbENsZWFyKEdMMTAuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMMTAuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTm93IHdlJ3JlIHJlYWR5IHRvIGRyYXcgc29tZSAzRCBvYmplY3RzCi0gICAgICAgICAqLwotCi0gICAgICAgIGdsLmdsTWF0cml4TW9kZShHTDEwLkdMX01PREVMVklFVyk7Ci0gICAgICAgIGdsLmdsTG9hZElkZW50aXR5KCk7Ci0KLSAgICAgICAgR0xVLmdsdUxvb2tBdChnbCwgMCwgMCwgLTUsIDBmLCAwZiwgMGYsIDBmLCAxLjBmLCAwLjBmKTsKLQotICAgICAgICBnbC5nbEVuYWJsZUNsaWVudFN0YXRlKEdMMTAuR0xfVkVSVEVYX0FSUkFZKTsKLQotICAgICAgICBsb25nIHRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAlIDQwMDBMOwotICAgICAgICBmbG9hdCBhbmdsZSA9IDAuMDkwZiAqICgoaW50KSB0aW1lKTsKLQotICAgICAgICBnbC5nbFJvdGF0ZWYoYW5nbGUsIDAsIDAsIDEuMGYpOwotCi0gICAgICAgIG1UcmlhbmdsZS5kcmF3KGdsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3LCBpbnQgaCkgewotICAgICAgICBnbC5nbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotCi0gICAgICAgIC8qCi0gICAgICAgICogU2V0IG91ciBwcm9qZWN0aW9uIG1hdHJpeC4gVGhpcyBkb2Vzbid0IGhhdmUgdG8gYmUgZG9uZQotICAgICAgICAqIGVhY2ggdGltZSB3ZSBkcmF3LCBidXQgdXN1YWxseSBhIG5ldyBwcm9qZWN0aW9uIG5lZWRzIHRvCi0gICAgICAgICogYmUgc2V0IHdoZW4gdGhlIHZpZXdwb3J0IGlzIHJlc2l6ZWQuCi0gICAgICAgICovCi0KLSAgICAgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpIHcgLyBoOwotICAgICAgICBnbC5nbE1hdHJpeE1vZGUoR0wxMC5HTF9QUk9KRUNUSU9OKTsKLSAgICAgICAgZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgICAgZ2wuZ2xGcnVzdHVtZigtcmF0aW8sIHJhdGlvLCAtMSwgMSwgMywgNyk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyaWFuZ2xlIG1UcmlhbmdsZTsKLX0KLQotY2xhc3MgVHJpYW5nbGUgewotICAgIHB1YmxpYyBUcmlhbmdsZSgpIHsKLQotICAgICAgICAvLyBCdWZmZXJzIHRvIGJlIHBhc3NlZCB0byBnbCpQb2ludGVyKCkgZnVuY3Rpb25zCi0gICAgICAgIC8vIG11c3QgYmUgZGlyZWN0LCBpLmUuLCB0aGV5IG11c3QgYmUgcGxhY2VkIG9uIHRoZQotICAgICAgICAvLyBuYXRpdmUgaGVhcCB3aGVyZSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgY2Fubm90Ci0gICAgICAgIC8vIG1vdmUgdGhlbS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQnVmZmVycyB3aXRoIG11bHRpLWJ5dGUgZGF0YXR5cGVzIChlLmcuLCBzaG9ydCwgaW50LCBmbG9hdCkKLSAgICAgICAgLy8gbXVzdCBoYXZlIHRoZWlyIGJ5dGUgb3JkZXIgc2V0IHRvIG5hdGl2ZSBvcmRlcgotCi0gICAgICAgIEJ5dGVCdWZmZXIgdmJiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChWRVJUUyAqIDMgKiA0KTsKLSAgICAgICAgdmJiLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKLSAgICAgICAgbUZWZXJ0ZXhCdWZmZXIgPSB2YmIuYXNGbG9hdEJ1ZmZlcigpOwotCi0gICAgICAgIEJ5dGVCdWZmZXIgdGJiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChWRVJUUyAqIDIgKiA0KTsKLSAgICAgICAgdGJiLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKLQotICAgICAgICBCeXRlQnVmZmVyIGliYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoVkVSVFMgKiAyKTsKLSAgICAgICAgaWJiLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKLSAgICAgICAgbUluZGV4QnVmZmVyID0gaWJiLmFzU2hvcnRCdWZmZXIoKTsKLQotICAgICAgICAvLyBBIHVuaXQtc2lkZWQgZXF1YWxhdGVyYWwgdHJpYW5nbGUgY2VudGVyZWQgb24gdGhlIG9yaWdpbi4KLSAgICAgICAgZmxvYXRbXSBjb29yZHMgPSB7Ci0gICAgICAgICAgICAgICAgLy8gWCwgWSwgWgotICAgICAgICAgICAgICAgIC0wLjVmLCAtMC4yNWYsIDAsCi0gICAgICAgICAgICAgICAgIDAuNWYsIC0wLjI1ZiwgMCwKLSAgICAgICAgICAgICAgICAgMC4wZiwgIDAuNTU5MDE2OTk0ZiwgMAotICAgICAgICB9OwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkVSVFM7IGkrKykgewotICAgICAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IDM7IGorKykgewotICAgICAgICAgICAgICAgIG1GVmVydGV4QnVmZmVyLnB1dChjb29yZHNbaSozK2pdICogMi4wZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgVkVSVFM7IGkrKykgewotICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dCgoc2hvcnQpIGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUZWZXJ0ZXhCdWZmZXIucG9zaXRpb24oMCk7Ci0gICAgICAgIG1JbmRleEJ1ZmZlci5wb3NpdGlvbigwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkcmF3KEdMMTAgZ2wpIHsKLSAgICAgICAgZ2wuZ2xGcm9udEZhY2UoR0wxMC5HTF9DQ1cpOwotICAgICAgICBnbC5nbFZlcnRleFBvaW50ZXIoMywgR0wxMC5HTF9GTE9BVCwgMCwgbUZWZXJ0ZXhCdWZmZXIpOwotICAgICAgICBnbC5nbERyYXdFbGVtZW50cyhHTDEwLkdMX1RSSUFOR0xFX1NUUklQLCBWRVJUUywKLSAgICAgICAgICAgICAgICBHTDEwLkdMX1VOU0lHTkVEX1NIT1JULCBtSW5kZXhCdWZmZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBWRVJUUyA9IDM7Ci0KLSAgICBwcml2YXRlIEZsb2F0QnVmZmVyIG1GVmVydGV4QnVmZmVyOwotICAgIHByaXZhdGUgU2hvcnRCdWZmZXIgbUluZGV4QnVmZmVyOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dyYWxsb2MvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9ncmFsbG9jL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0M2MzOWEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dyYWxsb2MvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBncmFsbG9jLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJ1aQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1ncmFsbG9jCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dyYWxsb2MvZ3JhbGxvYy5jcHAgYi9vcGVuZ2wvdGVzdHMvZ3JhbGxvYy9ncmFsbG9jLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4NzA0MC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ3JhbGxvYy9ncmFsbG9jLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICoqCi0gKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0b3BXYXRjaCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RvcFdhdGNoLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotdm9pZCogbGFtZWNweSh2b2lkKiBkLCB2b2lkIGNvbnN0KiBzLCBzaXplX3Qgc2l6ZSkgewotICAgIGNoYXIqIGRzdCA9IChjaGFyKilkOwotICAgIGNoYXIgY29uc3QqIHNyYyA9IChjaGFyIGNvbnN0KilzOwotICAgIHdoaWxlIChzaXplKSB7Ci0gICAgICAgICpkc3QrKyA9ICpzcmMrKzsKLSAgICAgICAgc2l6ZS0tOwotICAgIH0KLSAgICByZXR1cm4gZDsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIHNpemVfdCBzaXplID0gMTI4KjI1Nio0OwotICAgIHZvaWQqIHRlbXAgPSBtYWxsb2Moc2l6ZSk7Ci0gICAgdm9pZCogdGVtcDIgPSBtYWxsb2Moc2l6ZSk7Ci0gICAgbWVtc2V0KHRlbXAsIDAsIHNpemUpOwotICAgIG1lbXNldCh0ZW1wMiwgMCwgc2l6ZSk7Ci0KLQotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKDEyOCwgMjU2LCBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8Ci0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKTsKLQotICAgIHN0YXR1c190IGVyciA9IGJ1ZmZlci0+aW5pdENoZWNrKCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBwcmludGYoIiVzXG4iLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZvaWQqIHZhZGRyOwotICAgIGJ1ZmZlci0+bG9jaygKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCi0gICAgICAgICAgICAmdmFkZHIpOwotCi0gICAgewotICAgICAgICBTdG9wV2F0Y2ggd2F0Y2goIm1lbXNldCIpOwotICAgICAgICBmb3IgKGludCBpPTAgOyBpPDEwIDsgaSsrKQotICAgICAgICAgICAgbWVtc2V0KHZhZGRyLCAwLCBzaXplKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIFN0b3BXYXRjaCB3YXRjaCgibWVtY3B5IGJhc2VsaW5lIik7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8MTAgOyBpKyspCi0gICAgICAgICAgICBtZW1jcHkodGVtcCwgdGVtcDIsIHNpemUpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgU3RvcFdhdGNoIHdhdGNoKCJtZW1jcHkgZnJvbSBncmFsbG9jIik7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8MTAgOyBpKyspCi0gICAgICAgICAgICBtZW1jcHkodGVtcCwgdmFkZHIsIHNpemUpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgU3RvcFdhdGNoIHdhdGNoKCJtZW1jcHkgaW50byBncmFsbG9jIik7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8MTAgOyBpKyspCi0gICAgICAgICAgICBtZW1jcHkodmFkZHIsIHRlbXAsIHNpemUpOwotICAgIH0KLQotCi0gICAgewotICAgICAgICBTdG9wV2F0Y2ggd2F0Y2goImxhbWVjcHkgYmFzZWxpbmUiKTsKLSAgICAgICAgZm9yIChpbnQgaT0wIDsgaTwxMCA7IGkrKykKLSAgICAgICAgICAgIGxhbWVjcHkodGVtcCwgdGVtcDIsIHNpemUpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgU3RvcFdhdGNoIHdhdGNoKCJsYW1lY3B5IGZyb20gZ3JhbGxvYyIpOwotICAgICAgICBmb3IgKGludCBpPTAgOyBpPDEwIDsgaSsrKQotICAgICAgICAgICAgbGFtZWNweSh0ZW1wLCB2YWRkciwgc2l6ZSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBTdG9wV2F0Y2ggd2F0Y2goImxhbWVjcHkgaW50byBncmFsbG9jIik7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8MTAgOyBpKyspCi0gICAgICAgICAgICBsYW1lY3B5KHZhZGRyLCB0ZW1wLCBzaXplKTsKLSAgICB9Ci0KLSAgICBidWZmZXItPnVubG9jaygpOwotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvaHdjL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvaHdjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjU4YjEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2h3Yy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9NT0RVTEU6PSBsaWJod2NUZXN0Ci1MT0NBTF9TUkNfRklMRVM6PSBod2NUZXN0TGliLmNwcAotTE9DQUxfQ19JTkNMVURFUyArPSBzeXN0ZW0vZXh0cmFzL3Rlc3RzL2luY2x1ZGUgXAotICAgIGJpb25pYyBcCi0gICAgYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBvcGVuZ2wtdGVzdHMtaW5jbHVkZXMpCi0KLUxPQ0FMX0NGTEFHUyA6PSAtREdMX0dMRVhUX1BST1RPVFlQRVMgLURFR0xfRUdMRVhUX1BST1RPVFlQRVMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGlidXRpbHMgbGlic3RscG9ydAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJnbFRlc3QKLQotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTOj0gaHdjU3RyZXNzLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YyIFwKLSAgICBsaWJ1aSBcCi0gICAgbGliaGFyZHdhcmUgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJ0ZXN0VXRpbCBcCi0gICAgbGliZ2xUZXN0IFwKLSAgICBsaWJod2NUZXN0IFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgc3lzdGVtL2V4dHJhcy90ZXN0cy9pbmNsdWRlIFwKLSAgICBoYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlIFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCi0KLUxPQ0FMX01PRFVMRTo9IGh3Y1N0cmVzcwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEEpL25hdGl2ZXN0cmVzc3Rlc3QKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTOj0gaHdjUmVjdHMuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjIgXAotICAgIGxpYnVpIFwKLSAgICBsaWJoYXJkd2FyZSBcCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYnRlc3RVdGlsIFwKLSAgICBsaWJnbFRlc3QgXAotICAgIGxpYmh3Y1Rlc3QgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBzeXN0ZW0vZXh0cmFzL3Rlc3RzL2luY2x1ZGUgXAotICAgIGhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUgXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBvcGVuZ2wtdGVzdHMtaW5jbHVkZXMpCi0KLUxPQ0FMX01PRFVMRTo9IGh3Y1JlY3RzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQSkvbmF0aXZldXRpbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCi0KLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVM6PSBod2NDb2xvckVxdWl2LmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YyIFwKLSAgICBsaWJ1aSBcCi0gICAgbGliaGFyZHdhcmUgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJ0ZXN0VXRpbCBcCi0gICAgbGliZ2xUZXN0IFwKLSAgICBsaWJod2NUZXN0IFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgc3lzdGVtL2V4dHJhcy90ZXN0cy9pbmNsdWRlIFwKLSAgICBoYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlIFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9NT0RVTEU6PSBod2NDb2xvckVxdWl2Ci1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfREFUQSkvbmF0aXZldXRpbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCi0KLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVM6PSBod2NDb21taXQuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjIgXAotICAgIGxpYnVpIFwKLSAgICBsaWJoYXJkd2FyZSBcCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYnRlc3RVdGlsIFwKLSAgICBsaWJnbFRlc3QgXAotICAgIGxpYmh3Y1Rlc3QgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBzeXN0ZW0vZXh0cmFzL3Rlc3RzL2luY2x1ZGUgXAotICAgIGhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUgXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBvcGVuZ2wtdGVzdHMtaW5jbHVkZXMpCi0KLUxPQ0FMX01PRFVMRTo9IGh3Y0NvbW1pdAotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEEpL25hdGl2ZWJlbmNobWFyawotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCi0KLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9od2MvaHdjQ29sb3JFcXVpdi5jcHAgYi9vcGVuZ2wvdGVzdHMvaHdjL2h3Y0NvbG9yRXF1aXYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjMwNWRjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9od2MvaHdjQ29sb3JFcXVpdi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKgotICogSGFyZHdhcmUgQ29tcG9zZXIgQ29sb3IgRXF1aXZhbGVuY2UKLSAqCi0gKiBTeW5vcHNpcwotICogICBod2NfY29sb3JlcXVpdiBbb3B0aW9uc10gZUZtdAotICoKLSAqICAgICBvcHRpb25zOgotICAgICAgICAgLXYgLSB2ZXJib3NlCi0gKiAgICAgICAtcyA8MC4jIywgMC4jIywgMC4jIz4gLSBTdGFydCBjb2xvciAoZGVmYXVsdDogPDAuMCwgMC4wLCAwLjA+Ci0gKiAgICAgICAtZSA8MC4jIywgMC4jIywgMC4jIz4gLSBFbmRpbmcgY29sb3IgKGRlZmF1bHQ6IDwxLjAsIDEuMCwgMS4wPgotICogICAgICAgLXIgZm10IC0gcmVmZXJlbmNlIGdyYXBoaWMgZm9ybWF0Ci0gKiAgICAgICAtRCAjLiMjIC0gRW5kIG9mIHRlc3QgZGVsYXkKLSAqCi0gKiAgICAgZ3JhcGhpYyBmb3JtYXRzOgotICogICAgICAgUkdCQTg4ODggKHJlZmVyZW5jZSBmcmFtZSBkZWZhdWx0KQotICogICAgICAgUkdCWDg4ODgKLSAqICAgICAgIFJHQjg4OAotICogICAgICAgUkdCNTY1Ci0gKiAgICAgICBCR1JBODg4OAotICogICAgICAgUkdCQTU1NTEKLSAqICAgICAgIFJHQkE0NDQ0Ci0gKiAgICAgICBZVjEyCi0gKgotICogRGVzY3JpcHRpb24KLSAqICAgUmVuZGVycyBhIGhvcml6b250YWwgYmxlbmQgaW4gdHdvIGZyYW1lcy4gIFRoZSBmaXJzdCBmcmFtZSBpcyByZW5kZXJlZAotICogICBpbiB0aGUgdXBwZXIgdGhpcmQgb2YgdGhlIGRpc3BsYXkgYW5kIGlzIGNhbGxlZCB0aGUgcmVmZXJlbmNlIGZyYW1lLgotICogICBUaGUgc2Vjb25kIGZyYW1lIGlzIGRpc3BsYXllZCBpbiB0aGUgbWlkZGxlIHRoaXJkIGFuZCBpcyBjYWxsZWQgdGhlCi0gKiAgIGVxdWl2YWxlbmNlIGZyYW1lLiAgVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIHV0aWxpdHkgaXMgdG8gdmVyaWZ5Ci0gKiAgIHRoYXQgdGhlIGNvbG9ycyBwcm9kdWNlZCBpbiB0aGUgcmVmZXJlbmNlIGFuZCBlcXVpdmFsZW5jZSBmcmFtZXMgYXJlCi0gKiAgIHRoZSBzYW1lLiAgVGhlIGNvbG9ycyBhcmUgdGhlIHNhbWUgd2hlbiB0aGUgY29sb3JzIGFyZSB0aGUgc2FtZQotICogICB2ZXJ0aWNhbGx5IGJldHdlZW4gdGhlIHJlZmVyZW5jZSBhbmQgZXF1aXZhbGVuY2UgZnJhbWVzLgotICoKLSAqICAgQnkgZGVmYXVsdCB0aGUgcmVmZXJlbmNlIGZyYW1lIGlzIHJlbmRlcmVkIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUKLSAqICAgUkdCQTg4ODggZ3JhcGhpYyBmb3JtYXQuICBUaGUgLXIgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYQotICogICBub24tZGVmYXVsdCByZWZlcmVuY2UgZnJhbWUgZ3JhcGhpYyBmb3JtYXQuICBUaGUgZ3JhcGhpYyBmb3JtYXQgb2YKLSAqICAgdGhlIGVxdWl2YWxlbmNlIGZyYW1lIGlzIGRldGVybWluZWQgYnkgYSBzaW5nbGUgcmVxdWlyZWQgcG9zaXRpb25hbAotICogICBwYXJhbWV0ZXIuICBJbnRlbnRpb25hbGx5IHRoZXJlIGlzIG5vIGRlZmF1bHQgZm9yIHRoZSBncmFwaGljIGZvcm1hdAotICogICBvZiB0aGUgZXF1aXZhbGVuY2UgZnJhbWUuCi0gKgotICogICBUaGUgaG9yaXpvbnRhbCBibGVuZCBpbiB0aGUgcmVmZXJlbmNlIGZyYW1lIGlzIHByb2R1Y2VkIGZyb20gYSBsaW5lYXIKLSAqICAgaW50ZXJwb2xhdGlvbiBmcm9tIGEgc3RhcnQgY29sb3IgKGRlZmF1bHQ6IDwwLjAsIDAuMCwgMC4wPiBvbiB0aGUgbGVmdAotICogICBzaWRlIHRvIGFuIGVuZCBjb2xvciAoZGVmYXVsdCA8MS4wLCAxLjAsIDEuMD4gb24gdGhlIHJpZ2h0IHNpZGUuICBXaGVyZQotICogICBwb3NzaWJsZSB0aGUgZXF1aXZhbGVuY2UgZnJhbWUgaXMgcmVuZGVyZWQgd2l0aCB0aGUgZXF1aXZhbGVudCBjb2xvcgotICogICBmcm9tIHRoZSByZWZlcmVuY2UgZnJhbWUuICBBIGNvbG9yIG9mIGJsYWNrIGlzIHVzZWQgaW4gdGhlIGVxdWl2YWxlbmNlCi0gKiAgIGZyYW1lIGZvciBjYXNlcyB3aGVyZSBhbiBlcXVpdmFsZW50IGNvbG9yIGRvZXMgbm90IGV4aXN0LgotICovCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y2Vycm5vPgotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3RpbWU+Ci0jaW5jbHVkZSA8bGliZ2VuLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLQotI2RlZmluZSBMT0dfVEFHICJod2NDb2xvckVxdWl2VGVzdCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx0ZXN0VXRpbC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvaHdjb21wb3Nlci5oPgotCi0jaW5jbHVkZSAiaHdjVGVzdExpYi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLS8vIERlZmF1bHRzIGZvciBjb21tYW5kLWxpbmUgb3B0aW9ucwotY29uc3QgYm9vbCBkZWZhdWx0VmVyYm9zZSA9IGZhbHNlOwotY29uc3QgQ29sb3JGcmFjdCBkZWZhdWx0U3RhcnRDb2xvcigwLjAsIDAuMCwgMC4wKTsKLWNvbnN0IENvbG9yRnJhY3QgZGVmYXVsdEVuZENvbG9yKDEuMCwgMS4wLCAxLjApOwotY29uc3QgY2hhciAqZGVmYXVsdFJlZkZvcm1hdCA9ICJSR0JBODg4OCI7Ci1jb25zdCBmbG9hdCBkZWZhdWx0RW5kRGVsYXkgPSAyLjA7IC8vIERlZmF1bHQgZGVsYXkgYWZ0ZXIgcmVuZGVyaW5nIGdyYXBoaWNzCi0KLS8vIERlZmluZXMKLSNkZWZpbmUgTUFYU1RSICAgICAgICAgICAgICAgMTAwCi0jZGVmaW5lIE1BWENNRCAgICAgICAgICAgICAgIDIwMAotI2RlZmluZSBCSVRTUEVSQllURSAgICAgICAgICAgIDggLy8gVE9ETzogT2J0YWluIGZyb20gPHZhbHVlcy5oPiwgb25jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgaGFzIGJlZW4gYWRkZWQKLQotI2RlZmluZSBDTURfU1RPUF9GUkFNRVdPUksgICAic3RvcCAyPiYxIgotI2RlZmluZSBDTURfU1RBUlRfRlJBTUVXT1JLICAic3RhcnQgMj4mMSIKLQotLy8gTWFjcm9zCi0jZGVmaW5lIE5VTUEoYSkgKHNpemVvZihhKSAvIHNpemVvZihhIFswXSkpIC8vIE51bSBlbGVtZW50cyBpbiBhbiBhcnJheQotI2RlZmluZSBNRU1DTFIoYWRkciwgc2l6ZSkgZG8geyBcCi0gICAgICAgIG1lbXNldCgoYWRkciksIDAsIChzaXplKSk7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vLyBHbG9iYWxzCi1zdGF0aWMgY29uc3QgaW50IHRleFVzYWdlID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSB8Ci0gICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1dSSVRFX1JBUkVMWTsKLXN0YXRpYyBod2NfY29tcG9zZXJfZGV2aWNlX3QgKmh3Y0RldmljZTsKLXN0YXRpYyBFR0xEaXNwbGF5IGRweTsKLXN0YXRpYyBFR0xTdXJmYWNlIHN1cmZhY2U7Ci1zdGF0aWMgRUdMaW50IHdpZHRoLCBoZWlnaHQ7Ci0KLS8vIEZ1bmN0aW9ucyBwcm90b3R5cGVzCi12b2lkIGluaXQodm9pZCk7Ci12b2lkIHByaW50U3ludGF4KGNvbnN0IGNoYXIgKmNtZCk7Ci0KLS8vIENvbW1hbmQtbGluZSBvcHRpb24gc2V0dGluZ3MKLXN0YXRpYyBib29sIHZlcmJvc2UgPSBkZWZhdWx0VmVyYm9zZTsKLXN0YXRpYyBDb2xvckZyYWN0IHN0YXJ0UmVmQ29sb3IgPSBkZWZhdWx0U3RhcnRDb2xvcjsKLXN0YXRpYyBDb2xvckZyYWN0IGVuZFJlZkNvbG9yID0gZGVmYXVsdEVuZENvbG9yOwotc3RhdGljIGZsb2F0IGVuZERlbGF5ID0gZGVmYXVsdEVuZERlbGF5Owotc3RhdGljIGNvbnN0IHN0cnVjdCBod2NUZXN0R3JhcGhpY0Zvcm1hdCAqcmVmRm9ybWF0Ci0gICAgPSBod2NUZXN0R3JhcGhpY0Zvcm1hdExvb2t1cChkZWZhdWx0UmVmRm9ybWF0KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHdjVGVzdEdyYXBoaWNGb3JtYXQgKmVxdWl2Rm9ybWF0OwotCi0vKgotICogTWFpbgotICoKLSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgaGlnaC1sZXZlbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zOgotICoKLSAqICAgMS4gQ29tbWFuZC1saW5lIHBhcnNpbmcKLSAqCi0gKiAgIDIuIFN0b3AgZnJhbWV3b3JrCi0gKgotICogICAzLiBJbml0aWFsaXphdGlvbgotICoKLSAqICAgNC4gQ3JlYXRlIEhhcmR3YXJlIENvbXBvc2VyIGRlc2NyaXB0aW9uIG9mIHJlZmVyZW5jZSBhbmQgZXF1aXZhbGVuY2UgZnJhbWVzCi0gKgotICogICA1LiBIYXZlIEhhcmR3YXJlIENvbXBvc2VyIHJlbmRlciB0aGUgcmVmZXJlbmNlIGFuZCBlcXVpdmFsZW5jZSBmcmFtZXMKLSAqCi0gKiAgIDYuIERlbGF5IGZvciBhbW91bnQgb2YgdGltZSBnaXZlbiBieSBlbmREZWxheQotICoKLSAqICAgNy4gU3RhcnQgZnJhbWV3b3JrCi0gKi8KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIGludCBydiwgb3B0OwotICAgIGJvb2wgZXJyb3I7Ci0gICAgY2hhciAqY2hwdHI7Ci0gICAgdW5zaWduZWQgaW50IHBhc3M7Ci0gICAgY2hhciBjbWRbTUFYQ01EXTsKLSAgICBzdHJpbmcgc3RyOwotCi0gICAgdGVzdFNldExvZ0NhdFRhZyhMT0dfVEFHKTsKLQotICAgIGFzc2VydChyZWZGb3JtYXQgIT0gTlVMTCk7Ci0KLSAgICB0ZXN0U2V0TG9nQ2F0VGFnKExPR19UQUcpOwotCi0gICAgLy8gUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotICAgIHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ2czplOnI6RDo/aCIpKSAhPSAtMSkgewotICAgICAgICBzd2l0Y2ggKG9wdCkgewotICAgICAgICAgIGNhc2UgJ0QnOiAvLyBFbmQgb2YgdGVzdCBkZWxheQotICAgICAgICAgICAgICAgICAgICAvLyBEZWxheSBiZXR3ZWVuIGNvbXBsZXRpb24gb2YgZmluYWwgcGFzcyBhbmQgcmVzdGFydAotICAgICAgICAgICAgICAgICAgICAvLyBvZiBmcmFtZXdvcmsKLSAgICAgICAgICAgIGVuZERlbGF5ID0gc3RydG9kKG9wdGFyZywgJmNocHRyKTsKLSAgICAgICAgICAgIGlmICgoKmNocHRyICE9ICdcMCcpIHx8IChlbmREZWxheSA8IDAuMCkpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJJbnZhbGlkIGNvbW1hbmQtbGluZSBzcGVjaWZpZWQgZW5kIG9mIHRlc3QgZGVsYXkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mOiAlcyIsIG9wdGFyZyk7Ci0gICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAncyc6IC8vIFN0YXJ0aW5nIHJlZmVyZW5jZSBjb2xvcgotICAgICAgICAgICAgc3RyID0gb3B0YXJnOwotICAgICAgICAgICAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpIHsKLSAgICAgICAgICAgICAgICBpZiAoKmFyZ3Zbb3B0aW5kXSA9PSAnLScpIHsgYnJlYWs7IH0KLSAgICAgICAgICAgICAgICBjaGFyIGVuZENoYXIgPSAoc3RyLmxlbmd0aCgpID4gMSkgPyBzdHJbc3RyLmxlbmd0aCgpIC0gMV0gOiAwOwotICAgICAgICAgICAgICAgIGlmICgoZW5kQ2hhciA9PSAnPicpIHx8IChlbmRDaGFyID09ICddJykpIHsgYnJlYWs7IH0KLSAgICAgICAgICAgICAgICBzdHIgKz0gIiAiICsgc3RyaW5nKGFyZ3Zbb3B0aW5kKytdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpc3RyaW5nc3RyZWFtIGluKHN0cik7Ci0gICAgICAgICAgICAgICAgc3RhcnRSZWZDb2xvciA9IGh3Y1Rlc3RQYXJzZUNvbG9yKGluLCBlcnJvcik7Ci0gICAgICAgICAgICAgICAgLy8gQW55IHBhcnNlIGVycm9yIG9yIGNoYXJhY3RlcnMgbm90IHVzZWQgYnkgcGFyc2VyCi0gICAgICAgICAgICAgICAgaWYgKGVycm9yCi0gICAgICAgICAgICAgICAgICAgIHx8ICgoKHVuc2lnbmVkIGludCkgaW4udGVsbGcoKSAhPSBpbi5zdHIoKS5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChpbi50ZWxsZygpICE9IChzdHJlYW1wb3MpIC0xKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIHN0YXJ0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlIGNvbG9yIG9mOiAlcyIsIHN0ci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhpdCgyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ2UnOiAvLyBFbmRpbmcgcmVmZXJlbmNlIGNvbG9yCi0gICAgICAgICAgICBzdHIgPSBvcHRhcmc7Ci0gICAgICAgICAgICB3aGlsZSAob3B0aW5kIDwgYXJnYykgewotICAgICAgICAgICAgICAgIGlmICgqYXJndltvcHRpbmRdID09ICctJykgeyBicmVhazsgfQotICAgICAgICAgICAgICAgIGNoYXIgZW5kQ2hhciA9IChzdHIubGVuZ3RoKCkgPiAxKSA/IHN0cltzdHIubGVuZ3RoKCkgLSAxXSA6IDA7Ci0gICAgICAgICAgICAgICAgaWYgKChlbmRDaGFyID09ICc+JykgfHwgKGVuZENoYXIgPT0gJ10nKSkgeyBicmVhazsgfQotICAgICAgICAgICAgICAgIHN0ciArPSAiICIgKyBzdHJpbmcoYXJndltvcHRpbmQrK10pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlzdHJpbmdzdHJlYW0gaW4oc3RyKTsKLSAgICAgICAgICAgICAgICBlbmRSZWZDb2xvciA9IGh3Y1Rlc3RQYXJzZUNvbG9yKGluLCBlcnJvcik7Ci0gICAgICAgICAgICAgICAgLy8gQW55IHBhcnNlIGVycm9yIG9yIGNoYXJhY3RlcnMgbm90IHVzZWQgYnkgcGFyc2VyCi0gICAgICAgICAgICAgICAgaWYgKGVycm9yCi0gICAgICAgICAgICAgICAgICAgIHx8ICgoKHVuc2lnbmVkIGludCkgaW4udGVsbGcoKSAhPSBpbi5zdHIoKS5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChpbi50ZWxsZygpICE9IChzdHJlYW1wb3MpIC0xKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIGVuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSBjb2xvciBvZjogJXMiLCBzdHIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXQoMyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICdyJzogLy8gUmVmZXJlbmNlIGdyYXBoaWMgZm9ybWF0Ci0gICAgICAgICAgICByZWZGb3JtYXQgPSBod2NUZXN0R3JhcGhpY0Zvcm1hdExvb2t1cChvcHRhcmcpOwotICAgICAgICAgICAgaWYgKHJlZkZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiVW5rb3duIGNvbW1hbmQtbGluZSBzcGVjaWZpZWQgcmVmZXJlbmNlIGdyYXBoaWMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCBvZjogJXMiLCBvcHRhcmcpOwotICAgICAgICAgICAgICAgIHByaW50U3ludGF4KGJhc2VuYW1lKGFyZ3ZbMF0pKTsKLSAgICAgICAgICAgICAgICBleGl0KDQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICd2JzogLy8gVmVyYm9zZQotICAgICAgICAgICAgdmVyYm9zZSA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ2gnOiAvLyBIZWxwCi0gICAgICAgICAgY2FzZSAnPyc6Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHByaW50U3ludGF4KGJhc2VuYW1lKGFyZ3ZbMF0pKTsKLSAgICAgICAgICAgIGV4aXQoKChvcHRvcHQgPT0gMCkgfHwgKG9wdG9wdCA9PSAnPycpKSA/IDAgOiA1KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEV4cGVjdCBhIHNpbmdsZSBwb3NpdGlvbmFsIHBhcmFtZXRlciwgd2hpY2ggc3BlY2lmaWVzIHRoZQotICAgIC8vIGVxdWl2YWxlbmNlIGdyYXBoaWMgZm9ybWF0LgotICAgIGlmIChhcmdjICE9IChvcHRpbmQgKyAxKSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJFeHBlY3RlZCBhIHNpbmdsZSBjb21tYW5kLWxpbmUgcG9zdGlvbmFsIHBhcmFtZXRlciIpOwotICAgICAgICBwcmludFN5bnRheChiYXNlbmFtZShhcmd2WzBdKSk7Ci0gICAgICAgIGV4aXQoNik7Ci0gICAgfQotICAgIGVxdWl2Rm9ybWF0ID0gaHdjVGVzdEdyYXBoaWNGb3JtYXRMb29rdXAoYXJndltvcHRpbmRdKTsKLSAgICBpZiAoZXF1aXZGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJVbmtvd24gY29tbWFuZC1saW5lIHNwZWNpZmllZCBlcXVpdmFsZW5jZSBncmFwaGljICIKLSAgICAgICAgICAgICAgICAgICAiZm9ybWF0IG9mOiAlcyIsIGFyZ3Zbb3B0aW5kXSk7Ci0gICAgICAgIHByaW50U3ludGF4KGJhc2VuYW1lKGFyZ3ZbMF0pKTsKLSAgICAgICAgZXhpdCg3KTsKLSAgICB9Ci0KLSAgICB0ZXN0UHJpbnRJKCJyZWZGb3JtYXQ6ICV1ICVzIiwgcmVmRm9ybWF0LT5mb3JtYXQsIHJlZkZvcm1hdC0+ZGVzYyk7Ci0gICAgdGVzdFByaW50SSgiZXF1aXZGb3JtYXQ6ICV1ICVzIiwgZXF1aXZGb3JtYXQtPmZvcm1hdCwgZXF1aXZGb3JtYXQtPmRlc2MpOwotICAgIHRlc3RQcmludEkoInN0YXJ0UmVmQ29sb3I6ICVzIiwgKChzdHJpbmcpIHN0YXJ0UmVmQ29sb3IpLmNfc3RyKCkpOwotICAgIHRlc3RQcmludEkoImVuZFJlZkNvbG9yOiAlcyIsICgoc3RyaW5nKSBlbmRSZWZDb2xvcikuY19zdHIoKSk7Ci0gICAgdGVzdFByaW50SSgiZW5kRGVsYXk6ICVmIiwgZW5kRGVsYXkpOwotCi0gICAgLy8gU3RvcCBmcmFtZXdvcmsKLSAgICBydiA9IHNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksICIlcyIsIENNRF9TVE9QX0ZSQU1FV09SSyk7Ci0gICAgaWYgKHJ2ID49IChzaWduZWQpIHNpemVvZihjbWQpIC0gMSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJDb21tYW5kIHRvbyBsb25nIGZvcjogJXMiLCBDTURfU1RPUF9GUkFNRVdPUkspOwotICAgICAgICBleGl0KDgpOwotICAgIH0KLSAgICB0ZXN0RXhlY0NtZChjbWQpOwotICAgIHRlc3REZWxheSgxLjApOyAvLyBUT0RPIC0gbmVlZHMgbWVhbnMgdG8gcXVlcnkgd2hldGhlciBhc3luY2hyb25vdXMgc3RvcAotICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXdvcmsgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuICBGb3Igbm93LCBqdXN0IHdhaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gYSBsb25nIHRpbWUuCi0KLSAgICBpbml0KCk7Ci0KLSAgICAvLyBVc2UgdGhlIHVwcGVyIHRoaXJkIG9mIHRoZSBkaXNwbGF5IGZvciB0aGUgcmVmZXJlbmNlIGZyYW1lIGFuZAotICAgIC8vIHRoZSBtaWRkbGUgdGhpcmQgZm9yIHRoZSBlcXVpdmFsZW5jZSBmcmFtZS4KLSAgICB1bnNpZ25lZCBpbnQgcmVmSGVpZ2h0ID0gaGVpZ2h0IC8gMzsKLSAgICB1bnNpZ25lZCBpbnQgcmVmUG9zWSA9IDA7IC8vIFJlZmVyZW5jZSBmcmFtZSBZIHBvc2l0aW9uCi0gICAgdW5zaWduZWQgaW50IHJlZlBvc1ggPSAwOyAvLyBSZWZlcmVuY2UgZnJhbWUgWCBwb3NpdGlvbgotICAgIHVuc2lnbmVkIGludCByZWZXaWR0aCA9IHdpZHRoIC0gcmVmUG9zWDsKLSAgICBpZiAoKHJlZldpZHRoICYgcmVmRm9ybWF0LT53TW9kKSAhPSAwKSB7Ci0gICAgICAgIHJlZldpZHRoICs9IHJlZkZvcm1hdC0+d01vZCAtIChyZWZXaWR0aCAlIHJlZkZvcm1hdC0+d01vZCk7Ci0gICAgfQotICAgIHVuc2lnbmVkIGludCBlcXVpdkhlaWdodCA9IGhlaWdodCAvIDM7Ci0gICAgdW5zaWduZWQgaW50IGVxdWl2UG9zWSA9IHJlZkhlaWdodDsgLy8gRXF1aXZhbGVuY2UgZnJhbWUgWSBwb3NpdGlvbgotICAgIHVuc2lnbmVkIGludCBlcXVpdlBvc1ggPSAwOyAgICAgICAgIC8vIEVxdWl2YWxlbmNlIGZyYW1lIFggcG9zaXRpb24KLSAgICB1bnNpZ25lZCBpbnQgZXF1aXZXaWR0aCA9IHdpZHRoIC0gZXF1aXZQb3NYOwotICAgIGlmICgoZXF1aXZXaWR0aCAmIGVxdWl2Rm9ybWF0LT53TW9kKSAhPSAwKSB7Ci0gICAgICAgIGVxdWl2V2lkdGggKz0gZXF1aXZGb3JtYXQtPndNb2QgLSAoZXF1aXZXaWR0aCAlIGVxdWl2Rm9ybWF0LT53TW9kKTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgcmVmZXJlbmNlIGFuZCBlcXVpdmFsZW5jZSBncmFwaGljIGJ1ZmZlcnMKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgbnVtRnJhbWVzID0gMjsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiByZWZGcmFtZTsKLSAgICByZWZGcmFtZSA9IG5ldyBHcmFwaGljQnVmZmVyKHJlZldpZHRoLCByZWZIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZGb3JtYXQtPmZvcm1hdCwgdGV4VXNhZ2UpOwotICAgIGlmICgocnYgPSByZWZGcmFtZS0+aW5pdENoZWNrKCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHRlc3RQcmludEUoInJlZkZyYW1lIGluaXRDaGVjayBmYWlsZWQsIHJ2OiAlaSIsIHJ2KTsKLSAgICAgICAgdGVzdFByaW50RSgiICB3aWR0aCAldSBoZWlnaHQ6ICV1IGZvcm1hdDogJXUgJXMiLCByZWZXaWR0aCwgcmVmSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIHJlZkZvcm1hdC0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgIGh3Y1Rlc3RHcmFwaGljRm9ybWF0MnN0cihyZWZGb3JtYXQtPmZvcm1hdCkpOwotICAgICAgICBleGl0KDkpOwotICAgIH0KLSAgICB0ZXN0UHJpbnRJKCJyZWZGcmFtZSB3aWR0aDogJXUgaGVpZ2h0OiAldSBmb3JtYXQ6ICV1ICVzIiwKLSAgICAgICAgICAgICAgIHJlZldpZHRoLCByZWZIZWlnaHQsIHJlZkZvcm1hdC0+Zm9ybWF0LAotICAgICAgICAgICAgICAgaHdjVGVzdEdyYXBoaWNGb3JtYXQyc3RyKHJlZkZvcm1hdC0+Zm9ybWF0KSk7Ci0KLSAgICBzcDxHcmFwaGljQnVmZmVyPiBlcXVpdkZyYW1lOwotICAgIGVxdWl2RnJhbWUgPSBuZXcgR3JhcGhpY0J1ZmZlcihlcXVpdldpZHRoLCBlcXVpdkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1aXZGb3JtYXQtPmZvcm1hdCwgdGV4VXNhZ2UpOwotICAgIGlmICgocnYgPSByZWZGcmFtZS0+aW5pdENoZWNrKCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHRlc3RQcmludEUoInJlZkZyYW1lIGluaXRDaGVjayBmYWlsZWQsIHJ2OiAlaSIsIHJ2KTsKLSAgICAgICAgdGVzdFByaW50RSgiICB3aWR0aCAldSBoZWlnaHQ6ICV1IGZvcm1hdDogJXUgJXMiLCByZWZXaWR0aCwgcmVmSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIHJlZkZvcm1hdC0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgIGh3Y1Rlc3RHcmFwaGljRm9ybWF0MnN0cihyZWZGb3JtYXQtPmZvcm1hdCkpOwotICAgICAgICBleGl0KDEwKTsKLSAgICB9Ci0gICAgdGVzdFByaW50SSgiZXF1aXZGcmFtZSB3aWR0aDogJXUgaGVpZ2h0OiAldSBmb3JtYXQ6ICV1ICVzIiwKLSAgICAgICAgICAgICAgIGVxdWl2V2lkdGgsIGVxdWl2SGVpZ2h0LCBlcXVpdkZvcm1hdC0+Zm9ybWF0LAotICAgICAgICAgICAgICAgaHdjVGVzdEdyYXBoaWNGb3JtYXQyc3RyKGVxdWl2Rm9ybWF0LT5mb3JtYXQpKTsKLQotICAgIC8vIEZpbGwgdGhlIGZyYW1lcyB3aXRoIGEgaG9yaXpvbnRhbCBibGVuZAotICAgIGh3Y1Rlc3RGaWxsQ29sb3JIQmxlbmQocmVmRnJhbWUuZ2V0KCksIHJlZkZvcm1hdC0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRSZWZDb2xvciwgZW5kUmVmQ29sb3IpOwotICAgIGh3Y1Rlc3RGaWxsQ29sb3JIQmxlbmQoZXF1aXZGcmFtZS5nZXQoKSwgcmVmRm9ybWF0LT5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFJlZkNvbG9yLCBlbmRSZWZDb2xvcik7Ci0KLSAgICBod2NfbGF5ZXJfbGlzdF90ICpsaXN0OwotICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKGh3Y19sYXllcl9saXN0KSArIG51bUZyYW1lcyAqIHNpemVvZihod2NfbGF5ZXJfdCk7Ci0gICAgaWYgKChsaXN0ID0gKGh3Y19sYXllcl9saXN0X3QgKikgY2FsbG9jKDEsIHNpemUpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkFsbG9jYXRlIGxpc3QgZmFpbGVkIik7Ci0gICAgICAgIGV4aXQoMTEpOwotICAgIH0KLSAgICBsaXN0LT5mbGFncyA9IEhXQ19HRU9NRVRSWV9DSEFOR0VEOwotICAgIGxpc3QtPm51bUh3TGF5ZXJzID0gbnVtRnJhbWVzOwotCi0gICAgaHdjX2xheWVyX3QgKmxheWVyID0gJmxpc3QtPmh3TGF5ZXJzWzBdOwotICAgIGxheWVyLT5oYW5kbGUgPSByZWZGcmFtZS0+aGFuZGxlOwotICAgIGxheWVyLT5ibGVuZGluZyA9IEhXQ19CTEVORElOR19OT05FOwotICAgIGxheWVyLT5zb3VyY2VDcm9wLmxlZnQgPSAwOwotICAgIGxheWVyLT5zb3VyY2VDcm9wLnRvcCA9IDA7Ci0gICAgbGF5ZXItPnNvdXJjZUNyb3AucmlnaHQgPSB3aWR0aDsKLSAgICBsYXllci0+c291cmNlQ3JvcC5ib3R0b20gPSByZWZIZWlnaHQ7Ci0gICAgbGF5ZXItPmRpc3BsYXlGcmFtZS5sZWZ0ID0gMDsKLSAgICBsYXllci0+ZGlzcGxheUZyYW1lLnRvcCA9IDA7Ci0gICAgbGF5ZXItPmRpc3BsYXlGcmFtZS5yaWdodCA9IHdpZHRoOwotICAgIGxheWVyLT5kaXNwbGF5RnJhbWUuYm90dG9tID0gcmVmSGVpZ2h0OwotICAgIGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuLm51bVJlY3RzID0gMTsKLSAgICBsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbi5yZWN0cyA9ICZsYXllci0+ZGlzcGxheUZyYW1lOwotCi0gICAgbGF5ZXIrKzsKLSAgICBsYXllci0+aGFuZGxlID0gZXF1aXZGcmFtZS0+aGFuZGxlOwotICAgIGxheWVyLT5ibGVuZGluZyA9IEhXQ19CTEVORElOR19OT05FOwotICAgIGxheWVyLT5zb3VyY2VDcm9wLmxlZnQgPSAwOwotICAgIGxheWVyLT5zb3VyY2VDcm9wLnRvcCA9IDA7Ci0gICAgbGF5ZXItPnNvdXJjZUNyb3AucmlnaHQgPSB3aWR0aDsKLSAgICBsYXllci0+c291cmNlQ3JvcC5ib3R0b20gPSBlcXVpdkhlaWdodDsKLSAgICBsYXllci0+ZGlzcGxheUZyYW1lLmxlZnQgPSAwOwotICAgIGxheWVyLT5kaXNwbGF5RnJhbWUudG9wID0gcmVmSGVpZ2h0OwotICAgIGxheWVyLT5kaXNwbGF5RnJhbWUucmlnaHQgPSB3aWR0aDsKLSAgICBsYXllci0+ZGlzcGxheUZyYW1lLmJvdHRvbSA9IGxheWVyLT5kaXNwbGF5RnJhbWUudG9wICsgZXF1aXZIZWlnaHQ7Ci0gICAgbGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4ubnVtUmVjdHMgPSAxOwotICAgIGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuLnJlY3RzID0gJmxheWVyLT5kaXNwbGF5RnJhbWU7Ci0KLSAgICAvLyBQZXJmb3JtIHByZXBhcmUgb3BlcmF0aW9uCi0gICAgaWYgKHZlcmJvc2UpIHsgdGVzdFByaW50SSgiUHJlcGFyZToiKTsgaHdjVGVzdERpc3BsYXlMaXN0KGxpc3QpOyB9Ci0gICAgaHdjRGV2aWNlLT5wcmVwYXJlKGh3Y0RldmljZSwgbGlzdCk7Ci0gICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgdGVzdFByaW50SSgiUG9zdCBQcmVwYXJlOiIpOwotICAgICAgICBod2NUZXN0RGlzcGxheUxpc3RQcmVwYXJlTW9kaWZpYWJsZShsaXN0KTsKLSAgICB9Ci0KLSAgICAvLyBUdXJuIG9mZiB0aGUgZ2VvbWV0cnkgY2hhbmdlZCBmbGFnCi0gICAgbGlzdC0+ZmxhZ3MgJj0gfkhXQ19HRU9NRVRSWV9DSEFOR0VEOwotCi0gICAgaWYgKHZlcmJvc2UpIHtod2NUZXN0RGlzcGxheUxpc3RIYW5kbGVzKGxpc3QpOyB9Ci0gICAgaHdjRGV2aWNlLT5zZXQoaHdjRGV2aWNlLCBkcHksIHN1cmZhY2UsIGxpc3QpOwotCi0gICAgdGVzdERlbGF5KGVuZERlbGF5KTsKLQotICAgIC8vIFN0YXJ0IGZyYW1ld29yawotICAgIHJ2ID0gc25wcmludGYoY21kLCBzaXplb2YoY21kKSwgIiVzIiwgQ01EX1NUQVJUX0ZSQU1FV09SSyk7Ci0gICAgaWYgKHJ2ID49IChzaWduZWQpIHNpemVvZihjbWQpIC0gMSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJDb21tYW5kIHRvbyBsb25nIGZvcjogJXMiLCBDTURfU1RBUlRfRlJBTUVXT1JLKTsKLSAgICAgICAgZXhpdCgxMik7Ci0gICAgfQotICAgIHRlc3RFeGVjQ21kKGNtZCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBpbml0KHZvaWQpCi17Ci0gICAgLy8gU2VlZCBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKLSAgICAvLyBTZWVkaW5nIGNhdXNlcyBmaWxsIGhvcml6b250YWwgYmxlbmQgdG8gZmlsbCB0aGUgcGFkIGFyZWEgd2l0aAotICAgIC8vIGEgZGV0ZXJtaW5pc3RpYyBzZXQgb2YgdmFsdWVzLgotICAgIHNyYW5kNDgoMCk7Ci0KLSAgICBod2NUZXN0SW5pdERpc3BsYXkodmVyYm9zZSwgJmRweSwgJnN1cmZhY2UsICZ3aWR0aCwgJmhlaWdodCk7Ci0KLSAgICBod2NUZXN0T3Blbkh3YygmaHdjRGV2aWNlKTsKLX0KLQotdm9pZCBwcmludFN5bnRheChjb25zdCBjaGFyICpjbWQpCi17Ci0gICAgdGVzdFByaW50RSgiICAlcyBbb3B0aW9uc10gZ3JhcGhpY0Zvcm1hdCIsIGNtZCk7Ci0gICAgdGVzdFByaW50RSgiICAgIG9wdGlvbnM6Iik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgLXMgPDAuIyMsIDAuIyMsIDAuIyM+IC0gU3RhcnRpbmcgcmVmZXJlbmNlIGNvbG9yIik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgLWUgPDAuIyMsIDAuIyMsIDAuIyM+IC0gRW5kaW5nIHJlZmVyZW5jZSBjb2xvciIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIC1yIGZvcm1hdCAtIFJlZmVyZW5jZSBncmFwaGljIGZvcm1hdCIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIC1EICMuIyMgLSBFbmQgb2YgdGVzdCBkZWxheSIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIC12IFZlcmJvc2UiKTsKLSAgICB0ZXN0UHJpbnRFKCIiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgZ3JhcGhpYyBmb3JtYXRzOiIpOwotICAgIGZvciAodW5zaWduZWQgaW50IG4xID0gMDsgbjEgPCBOVU1BKGh3Y1Rlc3RHcmFwaGljRm9ybWF0KTsgbjErKykgewotICAgICAgICB0ZXN0UHJpbnRFKCIgICAgICAlcyIsIGh3Y1Rlc3RHcmFwaGljRm9ybWF0W24xXS5kZXNjKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvaHdjL2h3Y0NvbW1pdC5jcHAgYi9vcGVuZ2wvdGVzdHMvaHdjL2h3Y0NvbW1pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTY0NmMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2h3Yy9od2NDb21taXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qCi0gKiBIYXJkd2FyZSBDb21wb3NlciBDb21taXQgUG9pbnRzCi0gKgotICogU3lub3BzaXMKLSAqICAgaHdjQ29tbWl0IFtvcHRpb25zXSBncmFwaGljRm9ybWF0IC4uLgotICogICAgIG9wdGlvbnM6Ci0gKiAgICAgICAtcyBbd2lkdGgsIGhlaWdodF0gLSBTdGFydGluZyBkaW1lbnNpb24KLSAqICAgICAgIC12IC0gVmVyYm9zZQotICoKLSAqICAgICAgZ3JhcGhpYyBmb3JtYXRzOgotICogICAgICAgIFJHQkE4ODg4IChyZWZlcmVuY2UgZnJhbWUgZGVmYXVsdCkKLSAqICAgICAgICBSR0JYODg4OAotICogICAgICAgIFJHQjg4OAotICogICAgICAgIFJHQjU2NQotICogICAgICAgIEJHUkE4ODg4Ci0gKiAgICAgICAgUkdCQTU1NTEKLSAqICAgICAgICBSR0JBNDQ0NAotICogICAgICAgIFlWMTIKLSAqCi0gKiBEZXNjcmlwdGlvbgotICogICBUaGUgSGFyZHdhcmUgQ29tcG9zZXIgKEhXQykgQ29tbWl0IHRlc3QgaXMgYSBiZW5jaG1hcmsgdGhhdAotICogICBkaXNjb3ZlcnMgdGhlIHBvaW50cyBhdCB3aGljaCB0aGUgSFdDIHdpbGwgY29tbWl0IHRvIHJlbmRlcmluZyBhbgotICogICBvdmVybGF5KHMpLiAgQmVmb3JlIHJlbmRlcmluZyBhIHNldCBvZiBvdmVybGF5cywgdGhlIEhXQyBpcyBzaG93bgotICogICB0aGUgbGlzdCB0aHJvdWdoIGEgcHJlcGFyZSBjYWxsLiAgRHVyaW5nIHRoZSBwcmVwYXJlIGNhbGwgdGhlIEhXQwotICogICBpcyBhYmxlIHRvIGV4YW1pbmUgdGhlIGxpc3QgYW5kIHNwZWNpZnkgd2hpY2ggb3ZlcmxheXMgaXQgaXMgYWJsZQotICogICB0byBoYW5kbGUuICBUaGUgb3ZlcmxheXMgdGhhdCBpdCBjYW4ndCBoYW5kbGUgYXJlIHR5cGljYWxseSBjb21wb3NpdGVkCi0gKiAgIGJ5IGEgaGlnaGVyIGxldmVsIChlLmcuIFN1cmZhY2UgRmxpbmdlcikgYW5kIHRoZW4gdGhlIG9yaWdpbmFsIGxpc3QKLSAqICAgcGx1cyBhIGNvbXBvc2l0IG9mIHdoYXQgSFdDIHBhc3NlZCBvbiBhcmUgcHJvdmlkZWQgYmFjayB0byB0aGUgSFdDCi0gKiAgIGZvciByZW5kZXJpbmcuCi0gKgotICogICBPbmNlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBIV0MgaGFzIGJlZW4gc2hpcHBlZCwgYSByZWdyZXNzaW9uIHdvdWxkCi0gKiAgIGxpa2VseSBvY2N1ciBpZiBhIGxhdHRlciBpbXBsZW1lbnRhdGlvbiBzdGFydGVkIHBhc3Npbmcgb24gY29uZGl0aW9ucwotICogICB0aGF0IGl0IHVzZWQgdG8gY29tbWl0IHRvLiAgVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIGJlbmNobWFyawotICogICBpcyB0aGUgYXV0b21hdGVkIGRpc2NvdmVyeSBvZiB0aGUgY29tbWl0IHBvaW50cywgd2hlcmUgYW4gaW1wbGVtZW50YXRpb24KLSAqICAgaXMgb24gdGhlIGVkZ2UgYmV0d2VlbiBjb21taXR0aW5nIGFuZCBub3QgY29tbWl0dGluZy4gIFRoZXNlIGFyZSBjb21tb25seQotICogICByZWZlcnJlZCB0byBhcyBjb21taXQgcG9pbnRzLiAgQmV0d2VlbiBpbXBsZW1lbnRhdGlvbnMgY2hhbmdlcyB0byB0aGUKLSAqICAgY29tbWl0IHBvaW50cyBhcmUgYWxsb3dlZCwgYXMgbG9uZyBhcyB0aGV5IGltcHJvdmUgd2hhdCB0aGUgSFdDIGNvbW1pdHMKLSAqICAgdG8uICBPbmNlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBIV0MgaXMgc2hpcHBlZCwgdGhlIGNvbW1pdCBwb2ludHMgYXJlCi0gKiAgIG5vdCBhbGxvd2VkIHRvIHJlZ3Jlc3MgaW4gZnV0dXJlIGltcGxlbWVudGF0aW9ucy4KLSAqCi0gKiAgIFRoaXMgYmVuY2htYXJrIHRha2VzIGEgc2FtcGxpbmcgYW5kIHRoZW4gYWRqdXN0cyB1bnRpbCBpdCBmaW5kcyBhCi0gKiAgIGNvbW1pdCBwb2ludC4gIEl0IGRvZXNuJ3QgZXhoYXVzdGl2ZWx5IGNoZWNrIGFsbCBwb3NzaWJsZSBjb25kaXRpb25zLAotICogICB3aGljaCBkbyB0byB0aGUgbnVtYmVyIG9mIGNvbWJpbmF0aW9ucyB3b3VsZCBiZSBpbXBvc3NpYmxlLiAgSW5zdGVhZAotICogICBpdCBzdGFydHMgaXRzIHNlYXJjaCBmcm9tIGEgc3RhcnRpbmcgZGltZW5zaW9uLCB0aGF0IGNhbiBiZSBjaGFuZ2VkCi0gKiAgIHZpYSB0aGUgLXMgb3B0aW9uLiAgVGhlIHNlYXJjaCBpcyBhbHNvIGJvdW5kZWQgYnkgYSBzZXQgb2Ygc2VhcmNoCi0gKiAgIGxpbWl0cywgdGhhdCBhcmUgaGFyZC1jb2RlZCBpbnRvIGEgc3RydWN0dXJlIG9mIGNvbnN0YW50cyBuYW1lZAotICogICBzZWFyY2hMaW1pdHMuICBSZXN1bHRzIHRoYXQgaGFwcGVuIHRvIHJlYWNoIGEgc2VhcmNoTGltaXQgYXJlIHByZWZpeGVkCi0gKiAgIHdpdGggPj0sIHNvIHRoYXQgaXQgaXMga25vd24gdGhhdCB0aGUgdmFsdWUgY291bGQgcG9zc2libHkgYmUgbGFyZ2VyLgotICoKLSAqICAgTWVhc3VyZW1lbnRzIGFyZSBtYWRlIGZvciBlYWNoIG9mIHRoZSBncmFwaGljIGZvcm1hdHMgc3BlY2lmaWVkIGFzCi0gKiAgIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBvbiB0aGUgY29tbWFuZC1saW5lLiAgSWYgbm8gZ3JhcGhpYyBmb3JtYXRzCi0gKiAgIGFyZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlbiBieSBkZWZhdWx0IG1lYXN1cmVtZW50cyBhcmUKLSAqICAgbWFkZSBhbmQgcmVwb3J0ZWQgZm9yIGVhY2ggb2YgdGhlIGtub3duIGdyYXBoaWMgZm9ybWF0LgotICovCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y2Vycm5vPgotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3RpbWU+Ci0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxpc3RyZWFtPgotI2luY2x1ZGUgPGxpYmdlbi5oPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLQotI2RlZmluZSBMT0dfVEFHICJod2NDb21taXRUZXN0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHRlc3RVdGlsLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9od2NvbXBvc2VyLmg+Ci0KLSNpbmNsdWRlIDxnbFRlc3RMaWIuaD4KLSNpbmNsdWRlICJod2NUZXN0TGliLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotLy8gRGVmYXVsdHMKLWNvbnN0IEh3Y1Rlc3REaW0gZGVmYXVsdFN0YXJ0RGltID0gSHdjVGVzdERpbSgxMDAsIDEwMCk7Ci1jb25zdCBib29sIGRlZmF1bHRWZXJib3NlID0gZmFsc2U7Ci0KLWNvbnN0IHVpbnQzMl90ICAgZGVmYXVsdEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OwotY29uc3QgaW50MzJfdCAgICBkZWZhdWx0VHJhbnNmb3JtID0gMDsKLWNvbnN0IHVpbnQzMl90ICAgZGVmYXVsdEJsZW5kID0gSFdDX0JMRU5ESU5HX05PTkU7Ci1jb25zdCBDb2xvckZyYWN0IGRlZmF1bHRDb2xvcigwLjUsIDAuNSwgMC41KTsKLWNvbnN0IGZsb2F0ICAgICAgZGVmYXVsdEFscGhhID0gMS4wOyAvLyBPcGFxdWUKLWNvbnN0IEh3Y1Rlc3REaW0gZGVmYXVsdFNvdXJjZURpbSgxLCAxKTsKLWNvbnN0IHN0cnVjdCBod2NfcmVjdCBkZWZhdWx0U291cmNlQ3JvcCA9IHswLCAwLCAxLCAxfTsKLWNvbnN0IHN0cnVjdCBod2NfcmVjdCBkZWZhdWx0RGlzcGxheUZyYW1lID0gezAsIDAsIDEwMCwgMTAwfTsKLQotLy8gR2xvYmFsIENvbnN0YW50cwotY29uc3QgdWludDMyX3QgcHJpbnRGaWVsZFdpZHRoID0gMjsKLWNvbnN0IHN0cnVjdCBzZWFyY2hMaW1pdHMgewotICAgIHVpbnQzMl90ICAgbnVtT3ZlcmxheXM7Ci0gICAgSHdjVGVzdERpbSBzb3VyY2VDcm9wOwotfSBzZWFyY2hMaW1pdHMgPSB7Ci0gICAgMTAsCi0gICAgSHdjVGVzdERpbSgzMDAwLCAyMDAwKSwKLX07Ci1jb25zdCBzdHJ1Y3QgdHJhbnNmb3JtVHlwZSB7Ci0gICAgY29uc3QgY2hhciAqZGVzYzsKLSAgICB1aW50MzJfdCBpZDsKLX0gdHJhbnNmb3JtVHlwZVtdID0gewotICAgIHsiZmxpcGgiLCAgSFdDX1RSQU5TRk9STV9GTElQX0h9LAotICAgIHsiZmxpcHYiLCAgSFdDX1RSQU5TRk9STV9GTElQX1Z9LAotICAgIHsicm90OTAiLCAgSFdDX1RSQU5TRk9STV9ST1RfOTB9LAotICAgIHsicm90MTgwIiwgSFdDX1RSQU5TRk9STV9ST1RfMTgwfSwKLSAgICB7InJvdDI3MCIsIEhXQ19UUkFOU0ZPUk1fUk9UXzI3MH0sCi19OwotY29uc3Qgc3RydWN0IGJsZW5kVHlwZSB7Ci0gICAgY29uc3QgY2hhciAqZGVzYzsKLSAgICB1aW50MzJfdCBpZDsKLX0gYmxlbmRUeXBlW10gPSB7Ci0gICAgeyJub25lIiwgSFdDX0JMRU5ESU5HX05PTkV9LAotICAgIHsicHJlbXVsdCIsIEhXQ19CTEVORElOR19QUkVNVUxUfSwKLSAgICB7ImNvdmVyYWdlIiwgSFdDX0JMRU5ESU5HX0NPVkVSQUdFfSwKLX07Ci0KLS8vIERlZmluZXMKLSNkZWZpbmUgTUFYQ01EICAgICAgICAgICAgICAgMjAwCi0jZGVmaW5lIENNRF9TVE9QX0ZSQU1FV09SSyAgICJzdG9wIDI+JjEiCi0jZGVmaW5lIENNRF9TVEFSVF9GUkFNRVdPUksgICJzdGFydCAyPiYxIgotCi0vLyBNYWNyb3MKLSNkZWZpbmUgTlVNQShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKGEgWzBdKSkgLy8gTnVtIGVsZW1lbnRzIGluIGFuIGFycmF5Ci0KLS8vIExvY2FsIHR5cGVzCi1jbGFzcyBSZWN0YW5nbGUgewotcHVibGljOgotICAgIFJlY3RhbmdsZSh1aW50MzJfdCBncmFwaGljRm9ybWF0ID0gZGVmYXVsdEZvcm1hdCwKLSAgICAgICAgICAgICAgSHdjVGVzdERpbSBkZkRpbSA9IEh3Y1Rlc3REaW0oMSwgMSksCi0gICAgICAgICAgICAgIEh3Y1Rlc3REaW0gc0RpbSA9IEh3Y1Rlc3REaW0oMSwgMSkpOwotICAgIHZvaWQgc2V0U291cmNlRGltKEh3Y1Rlc3REaW0gZGltKTsKLQotICAgIHVpbnQzMl90ICAgICBmb3JtYXQ7Ci0gICAgdWludDMyX3QgICAgIHRyYW5zZm9ybTsKLSAgICBpbnQzMl90ICAgICAgYmxlbmQ7Ci0gICAgQ29sb3JGcmFjdCAgIGNvbG9yOwotICAgIGZsb2F0ICAgICAgICBhbHBoYTsKLSAgICBId2NUZXN0RGltICAgc291cmNlRGltOwotICAgIHN0cnVjdCBod2NfcmVjdCAgIHNvdXJjZUNyb3A7Ci0gICAgc3RydWN0IGh3Y19yZWN0ICAgZGlzcGxheUZyYW1lOwotfTsKLQotY2xhc3MgUmFuZ2UgewotcHVibGljOgotICAgIFJhbmdlKHZvaWQpIDogX2woMCksIF91KDApIHt9Ci0gICAgUmFuZ2UodWludDMyX3QgbG93ZXIsIHVpbnQzMl90IHVwcGVyKSA6IF9sKGxvd2VyKSwgX3UodXBwZXIpIHt9Ci0gICAgdWludDMyX3QgbG93ZXIodm9pZCkgeyByZXR1cm4gX2w7IH0KLSAgICB1aW50MzJfdCB1cHBlcih2b2lkKSB7IHJldHVybiBfdTsgfQotCi0gICAgb3BlcmF0b3Igc3RyaW5nKCk7Ci0KLXByaXZhdGU6Ci0gICAgdWludDMyX3QgX2w7IC8vIGxvd2VyCi0gICAgdWludDMyX3QgX3U7IC8vIHVwcGVyCi19OwotCi1SYW5nZTo6b3BlcmF0b3Igc3RyaW5nKCkKLXsKLSAgICBvc3RyaW5nc3RyZWFtIG91dDsKLQotICAgIG91dCA8PCAnWycgPDwgX2wgPDwgIiwgIiA8PCBfdSA8PCAnXSc7Ci0KLSAgICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1jbGFzcyBSYXRpb25hbCB7Ci1wdWJsaWM6Ci0gICAgUmF0aW9uYWwodm9pZCkgOiBfbigwKSwgX2QoMSkge30KLSAgICBSYXRpb25hbCh1aW50MzJfdCBuLCB1aW50MzJfdCBkKSA6IF9uKG4pLCBfZChkKSB7fQotICAgIHVpbnQzMl90IG51bWVyYXRvcih2b2lkKSB7IHJldHVybiBfbjsgfQotICAgIHVpbnQzMl90IGRlbm9taW5hdG9yKHZvaWQpIHsgcmV0dXJuIF9kOyB9Ci0gICAgdm9pZCBzZXROdW1lcmF0b3IodWludDMyX3QgbnVtZXJhdG9yKSB7IF9uID0gbnVtZXJhdG9yOyB9Ci0KLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmF0aW9uYWwmIG90aGVyKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgUmF0aW9uYWwmIG90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfQotICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJhdGlvbmFsJiBvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvcj4oY29uc3QgUmF0aW9uYWwmIG90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAoISgqdGhpcyA9PSBvdGhlcikgJiYgISgqdGhpcyA8IG90aGVyKSk7Ci0gICAgfQotICAgIHN0YXRpYyB2b2lkIGRvdWJsZTJSYXRpb25hbChkb3VibGUgZiwgUmFuZ2UgblJhbmdlLCBSYW5nZSBkUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF0aW9uYWwmIGxvd2VyLCBSYXRpb25hbCYgdXBwZXIpOwotICAgICAgICAKLSAgICBvcGVyYXRvciBzdHJpbmcoKSBjb25zdDsKLSAgICBvcGVyYXRvciBkb3VibGUoKSBjb25zdCB7IHJldHVybiAoZG91YmxlKSBfbiAvIChkb3VibGUpIF9kOyB9Ci0KLQotcHJpdmF0ZToKLSAgICB1aW50MzJfdCBfbjsKLSAgICB1aW50MzJfdCBfZDsKLX07Ci0KLS8vIEdsb2JhbHMKLXN0YXRpYyBjb25zdCBpbnQgdGV4VXNhZ2UgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFIHwKLSAgICAgICAgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfV1JJVEVfUkFSRUxZOwotc3RhdGljIGh3Y19jb21wb3Nlcl9kZXZpY2VfdCAqaHdjRGV2aWNlOwotc3RhdGljIEVHTERpc3BsYXkgZHB5Owotc3RhdGljIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLXN0YXRpYyBFR0xpbnQgd2lkdGgsIGhlaWdodDsKLXN0YXRpYyBzaXplX3QgbWF4SGVhZGluZ0xlbjsKLXN0YXRpYyB2ZWN0b3I8c3RyaW5nPiBmb3JtYXRzOwotCi0vLyBNZWFzdXJlbWVudHMKLXN0cnVjdCBtZWFzIHsKLSAgICB1aW50MzJfdCBmb3JtYXQ7Ci0gICAgdWludDMyX3Qgc3RhcnREaW1PdmVybGF5czsKLSAgICB1aW50MzJfdCBtYXhOb25PdmVybGFwcGluZzsKLSAgICB1aW50MzJfdCBtYXhPdmVybGFwcGluZzsKLSAgICBsaXN0PHVpbnQzMl90PiB0cmFuc2Zvcm1zOwotICAgIGxpc3Q8dWludDMyX3Q+IGJsZW5kczsKLSAgICBzdHJ1Y3QgZGlzcGxheUZyYW1lIHsKLSAgICAgICAgdWludDMyX3QgbWluV2lkdGg7Ci0gICAgICAgIHVpbnQzMl90IG1pbkhlaWdodDsKLSAgICAgICAgSHdjVGVzdERpbSBtaW5EaW07Ci0gICAgICAgIHVpbnQzMl90IG1heFdpZHRoOwotICAgICAgICB1aW50MzJfdCBtYXhIZWlnaHQ7Ci0gICAgICAgIEh3Y1Rlc3REaW0gbWF4RGltOwotICAgIH0gZGY7Ci0gICAgc3RydWN0IHNvdXJjZUNyb3AgewotICAgICAgICB1aW50MzJfdCBtaW5XaWR0aDsKLSAgICAgICAgdWludDMyX3QgbWluSGVpZ2h0OwotICAgICAgICBId2NUZXN0RGltIG1pbkRpbTsKLSAgICAgICAgdWludDMyX3QgbWF4V2lkdGg7Ci0gICAgICAgIHVpbnQzMl90IG1heEhlaWdodDsKLSAgICAgICAgSHdjVGVzdERpbSBtYXhEaW07Ci0gICAgICAgIFJhdGlvbmFsIGhTY2FsZTsKLSAgICAgICAgSHdjVGVzdERpbSBoU2NhbGVCZXN0RGY7Ci0gICAgICAgIEh3Y1Rlc3REaW0gaFNjYWxlQmVzdFNjOwotICAgICAgICBSYXRpb25hbCB2U2NhbGU7Ci0gICAgICAgIEh3Y1Rlc3REaW0gdlNjYWxlQmVzdERmOwotICAgICAgICBId2NUZXN0RGltIHZTY2FsZUJlc3RTYzsKLSAgICB9IHNjOwotICAgIHZlY3Rvcjx1aW50MzJfdD4gb3ZlcmxhcEJsZW5kTm9uZTsKLSAgICB2ZWN0b3I8dWludDMyX3Q+IG92ZXJsYXBCbGVuZFByZW11bHQ7Ci0gICAgdmVjdG9yPHVpbnQzMl90PiBvdmVybGFwQmxlbmRDb3ZlcmFnZTsKLX07Ci12ZWN0b3I8bWVhcz4gbWVhc3VyZW1lbnRzOwotCi0vLyBGdW5jdGlvbiBwcm90b3R5cGVzCi11aW50MzJfdCBudW1PdmVybGF5cyhsaXN0PFJlY3RhbmdsZT4mIHJlY3RMaXN0KTsKLXVpbnQzMl90IG1heE92ZXJsYXlzKHVpbnQzMl90IGZvcm1hdCwgYm9vbCBhbGxvd092ZXJsYXApOwotbGlzdDx1aW50MzJfdD4gc3VwcG9ydGVkVHJhbnNmb3Jtcyh1aW50MzJfdCBmb3JtYXQpOwotbGlzdDx1aW50MzJfdD4gc3VwcG9ydGVkQmxlbmRzKHVpbnQzMl90IGZvcm1hdCk7Ci11aW50MzJfdCBkZk1pbldpZHRoKHVpbnQzMl90IGZvcm1hdCk7Ci11aW50MzJfdCBkZk1pbkhlaWdodCh1aW50MzJfdCBmb3JtYXQpOwotdWludDMyX3QgZGZNYXhXaWR0aCh1aW50MzJfdCBmb3JtYXQpOwotdWludDMyX3QgZGZNYXhIZWlnaHQodWludDMyX3QgZm9ybWF0KTsKLUh3Y1Rlc3REaW0gZGZNaW5EaW0odWludDMyX3QgZm9ybWF0KTsKLUh3Y1Rlc3REaW0gZGZNYXhEaW0odWludDMyX3QgZm9ybWF0KTsKLXVpbnQzMl90IHNjTWluV2lkdGgodWludDMyX3QgZm9ybWF0LCBjb25zdCBId2NUZXN0RGltJiBkZkRpbSk7Ci11aW50MzJfdCBzY01pbkhlaWdodCh1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEh3Y1Rlc3REaW0mIGRmRGltKTsKLXVpbnQzMl90IHNjTWF4V2lkdGgodWludDMyX3QgZm9ybWF0LCBjb25zdCBId2NUZXN0RGltJiBkZkRpbSk7Ci11aW50MzJfdCBzY01heEhlaWdodCh1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEh3Y1Rlc3REaW0mIGRmRGltKTsKLUh3Y1Rlc3REaW0gc2NNaW5EaW0odWludDMyX3QgZm9ybWF0LCBjb25zdCBId2NUZXN0RGltJiBkZkRpbSk7Ci1Id2NUZXN0RGltIHNjTWF4RGltKHVpbnQzMl90IGZvcm1hdCwgY29uc3QgSHdjVGVzdERpbSYgZGZEaW0pOwotUmF0aW9uYWwgc2NIU2NhbGUodWludDMyX3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY29uc3QgSHdjVGVzdERpbSYgZGZNaW4sIGNvbnN0IEh3Y1Rlc3REaW0mIGRmTWF4LAotICAgICAgICAgICAgICAgICAgY29uc3QgSHdjVGVzdERpbSYgc2NNaW4sIGNvbnN0IEh3Y1Rlc3REaW0mIHNjTWF4LAotICAgICAgICAgICAgICAgICAgSHdjVGVzdERpbSYgb3V0QmVzdERmLCBId2NUZXN0RGltJiBvdXRCZXN0U2MpOwotUmF0aW9uYWwgc2NWU2NhbGUodWludDMyX3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY29uc3QgSHdjVGVzdERpbSYgZGZNaW4sIGNvbnN0IEh3Y1Rlc3REaW0mIGRmTWF4LAotICAgICAgICAgICAgICAgICAgY29uc3QgSHdjVGVzdERpbSYgc2NNaW4sIGNvbnN0IEh3Y1Rlc3REaW0mIHNjTWF4LAotICAgICAgICAgICAgICAgICAgSHdjVGVzdERpbSYgb3V0QmVzdERmLCBId2NUZXN0RGltJiBvdXRCZXN0U2MpOwotdWludDMyX3QgbnVtT3ZlcmxhcHBpbmcodWludDMyX3QgYmFja2dyb3VuZEZvcm1hdCwgdWludDMyX3QgZm9yZWdyb3VuZEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhY2tncm91bmRCbGVuZCwgdWludDMyX3QgZm9yZWdyb3VuZEJsZW5kKTsKLXN0cmluZyB0cmFuc2Zvcm1MaXN0MnN0cihjb25zdCBsaXN0PHVpbnQzMl90PiYgdHJhbnNmb3JtTGlzdCk7Ci1zdHJpbmcgYmxlbmRMaXN0MnN0cihjb25zdCBsaXN0PHVpbnQzMl90PiYgYmxlbmRMaXN0KTsKLXZvaWQgaW5pdCh2b2lkKTsKLXZvaWQgcHJpbnRGb3JtYXRIZWFkaW5ncyhzaXplX3QgaW5kZW50KTsKLXZvaWQgcHJpbnRPdmVybGFwTGluZShzaXplX3QgaW5kZW50LCBjb25zdCBzdHJpbmcgZm9ybWF0U3RyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx1aW50MzJfdD4mIHJlc3VsdHMpOwotdm9pZCBwcmludFN5bnRheChjb25zdCBjaGFyICpjbWQpOwotCi0vLyBDb21tYW5kLWxpbmUgb3B0aW9uIHNldHRpbmdzCi1zdGF0aWMgYm9vbCB2ZXJib3NlID0gZGVmYXVsdFZlcmJvc2U7Ci1zdGF0aWMgSHdjVGVzdERpbSBzdGFydERpbSA9IGRlZmF1bHRTdGFydERpbTsKLQotLyoKLSAqIE1haW4KLSAqCi0gKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGhpZ2gtbGV2ZWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9uczoKLSAqCi0gKiAgIDEuIENvbW1hbmQtbGluZSBwYXJzaW5nCi0gKgotICogICAyLiBGb3JtIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIGdyYXBoaWMgZm9ybWF0cy4gIElmCi0gKiAgICAgIG5vIGZvcm1hdHMgYXJlIHNwZWNpZmllZCwgdGhlbiBmb3JtIGEgbGlzdCBvZiBhbGwga25vd24gZm9ybWF0cy4KLSAqCi0gKiAgIDMuIFN0b3AgZnJhbWV3b3JrCi0gKiAgICAgIE9ubHkgb25lIHVzZXIgYXQgYSB0aW1lIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBIV0MuICBTdXJmYWNlCi0gKiAgICAgIEZsaW5nZXIgdXNlcyB0aGUgSFdDIGFuZCBpcyBwYXJ0IG9mIHRoZSBmcmFtZXdvcmsuICBOZWVkIHRvCi0gKiAgICAgIHN0b3AgdGhlIGZyYW1ld29yayBzbyB0aGF0IFN1cmZhY2UgRmxpbmdlciB3aWxsIHN0b3AgdXNpbmcKLSAqICAgICAgdGhlIEhXQy4KLSAqICAgCi0gKiAgIDQuIEluaXRpYWxpemF0aW9uCi0gKgotICogICA1LiBGb3IgZWFjaCBncmFwaGljIGZvcm1hdCBpbiB0aGUgcHJldmlvdXNseSBmb3JtZWQgbGlzdCBwZXJmb3JtCi0gKiAgICAgIG1lYXN1cmVtZW50cyBvbiB0aGF0IGZvcm1hdCBhbmQgcmVwb3J0IHRoZSByZXN1bHRzLgotICoKLSAqICAgNi4gU3RhcnQgZnJhbWV3b3JrCi0gKi8KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIGludCAgICAgcnYsIG9wdDsKLSAgICBjaGFyICAgKmNocHRyOwotICAgIGJvb2wgICAgZXJyb3I7Ci0gICAgc3RyaW5nICBzdHI7Ci0gICAgY2hhciBjbWRbTUFYQ01EXTsKLSAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0KLSAgICB0ZXN0U2V0TG9nQ2F0VGFnKExPR19UQUcpOwotCi0gICAgLy8gUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotICAgIHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJzOnY/aCIpKSAhPSAtMSkgewotICAgICAgICBzd2l0Y2ggKG9wdCkgewotCi0gICAgICAgICAgY2FzZSAncyc6IC8vIFN0YXJ0IERpbWVuc2lvbgotICAgICAgICAgICAgLy8gVXNlIGFyZ3VtZW50cyB1bnRpbCBuZXh0IHN0YXJ0cyB3aXRoIGEgZGFzaAotICAgICAgICAgICAgLy8gb3IgY3VycmVudCBlbmRzIHdpdGggYSA+IG9yIF0KLSAgICAgICAgICAgIHN0ciA9IG9wdGFyZzsKLSAgICAgICAgICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCphcmd2W29wdGluZF0gPT0gJy0nKSB7IGJyZWFrOyB9Ci0gICAgICAgICAgICAgICAgY2hhciBlbmRDaGFyID0gKHN0ci5sZW5ndGgoKSA+IDEpID8gc3RyW3N0ci5sZW5ndGgoKSAtIDFdIDogMDsKLSAgICAgICAgICAgICAgICBpZiAoKGVuZENoYXIgPT0gJz4nKSB8fCAoZW5kQ2hhciA9PSAnXScpKSB7IGJyZWFrOyB9Ci0gICAgICAgICAgICAgICAgc3RyICs9ICIgIiArIHN0cmluZyhhcmd2W29wdGluZCsrXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXN0cmluZ3N0cmVhbSBpbihzdHIpOwotICAgICAgICAgICAgICAgIHN0YXJ0RGltID0gaHdjVGVzdFBhcnNlRGltKGluLCBlcnJvcik7Ci0gICAgICAgICAgICAgICAgLy8gQW55IHBhcnNlIGVycm9yIG9yIGNoYXJhY3RlcnMgbm90IHVzZWQgYnkgcGFyc2VyCi0gICAgICAgICAgICAgICAgaWYgKGVycm9yCi0gICAgICAgICAgICAgICAgICAgIHx8ICgoKHVuc2lnbmVkIGludCkgaW4udGVsbGcoKSAhPSBpbi5zdHIoKS5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChpbi50ZWxsZygpICE9IChzdHJlYW1wb3MpIC0xKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIHN0YXJ0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGltZW5zaW9uIG9mOiAlcyIsIHN0ci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhpdCg4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ3YnOiAvLyBWZXJib3NlCi0gICAgICAgICAgICB2ZXJib3NlID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAnaCc6IC8vIEhlbHAKLSAgICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcHJpbnRTeW50YXgoYmFzZW5hbWUoYXJndlswXSkpOwotICAgICAgICAgICAgZXhpdCgoKG9wdG9wdCA9PSAwKSB8fCAob3B0b3B0ID09ICc/JykpID8gMCA6IDExKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFBvc2l0aW9uYWwgcGFyYW1ldGVycwotICAgIC8vIFBvc2l0aW9uYWwgcGFyYW1ldGVycyBwcm92aWRlIHRoZSBuYW1lcyBvZiBncmFwaGljIGZvcm1hdHMgdGhhdAotICAgIC8vIG1lYXN1cmVtZW50cyBhcmUgdG8gYmUgbWFkZSBvbi4gIE1lYXN1cmVtZW50cyBhcmUgbWFkZSBvbiBhbGwKLSAgICAvLyBrbm93biBncmFwaGljIGZvcm1hdHMgd2hlbiBubyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLgotICAgIGlmIChvcHRpbmQgPT0gYXJnYykgewotICAgICAgICAvLyBObyBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIGdyYXBoaWMgZm9ybWF0cwotICAgICAgICAvLyBBZGQgYWxsIGdyYXBoaWMgZm9ybWF0cyB0byB0aGUgbGlzdCBvZiBmb3JtYXRzIHRvIGJlIG1lYXN1cmVkCi0gICAgICAgIGZvciAodW5zaWduZWQgaW50IG4xID0gMDsgbjEgPCBOVU1BKGh3Y1Rlc3RHcmFwaGljRm9ybWF0KTsgbjErKykgewotICAgICAgICAgICAgZm9ybWF0cy5wdXNoX2JhY2soaHdjVGVzdEdyYXBoaWNGb3JtYXRbbjFdLmRlc2MpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQWRkIG5hbWVzIG9mIGNvbW1hbmQtbGluZSBzcGVjaWZpZWQgZ3JhcGhpYyBmb3JtYXRzIHRvIHRoZQotICAgICAgICAvLyBsaXN0IG9mIGZvcm1hdHMgdG8gYmUgdGVzdGVkCi0gICAgICAgIGZvciAoOyBhcmd2W29wdGluZF0gIT0gTlVMTDsgb3B0aW5kKyspIHsKLSAgICAgICAgICAgIGZvcm1hdHMucHVzaF9iYWNrKGFyZ3Zbb3B0aW5kXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBEZXRlcm1pbmUgbGVuZ3RoIG9mIGxvbmdlc3Qgc3BlY2lmaWVkIGdyYXBoaWMgZm9ybWF0LgotICAgIC8vIFRoaXMgdmFsdWUgaXMgdXNlZCBmb3Igb3V0cHV0IGZvcm1hdGluZwotICAgIGZvciAodmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gZm9ybWF0cy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gZm9ybWF0cy5lbmQoKTsgKytpdCkgewotICAgICAgICAgbWF4SGVhZGluZ0xlbiA9IG1heChtYXhIZWFkaW5nTGVuLCBpdC0+bGVuZ3RoKCkpOwotICAgIH0KLQotICAgIC8vIFN0b3AgZnJhbWV3b3JrCi0gICAgcnYgPSBzbnByaW50ZihjbWQsIHNpemVvZihjbWQpLCAiJXMiLCBDTURfU1RPUF9GUkFNRVdPUkspOwotICAgIGlmIChydiA+PSAoc2lnbmVkKSBzaXplb2YoY21kKSAtIDEpIHsKLSAgICAgICAgdGVzdFByaW50RSgiQ29tbWFuZCB0b28gbG9uZyBmb3I6ICVzIiwgQ01EX1NUT1BfRlJBTUVXT1JLKTsKLSAgICAgICAgZXhpdCgxNCk7Ci0gICAgfQotICAgIHRlc3RFeGVjQ21kKGNtZCk7Ci0gICAgdGVzdERlbGF5KDEuMCk7IC8vIFRPRE8gLSBuZWVkcyBtZWFucyB0byBxdWVyeSB3aGV0aGVyIGFzeW5jaHJvbm91cyBzdG9wCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyYW1ld29yayBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4gIEZvciBub3csIGp1c3Qgd2FpdAotICAgICAgICAgICAgICAgICAgICAvLyBhIGxvbmcgdGltZS4KLQotICAgIHRlc3RQcmludEkoInN0YXJ0RGltOiAlcyIsICgoc3RyaW5nKSBzdGFydERpbSkuY19zdHIoKSk7Ci0KLSAgICBpbml0KCk7Ci0KLSAgICAvLyBGb3IgZWFjaCBvZiB0aGUgZ3JhcGhpYyBmb3JtYXRzCi0gICAgZm9yICh2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXRGb3JtYXQgPSBmb3JtYXRzLmJlZ2luKCk7Ci0gICAgICAgICBpdEZvcm1hdCAhPSBmb3JtYXRzLmVuZCgpOyArK2l0Rm9ybWF0KSB7Ci0KLSAgICAgICAgLy8gTG9jYXRlIGh3Y1Rlc3RMaWIgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIHRoaXMgZm9ybWF0Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBod2NUZXN0R3JhcGhpY0Zvcm1hdCAqZm9ybWF0OwotICAgICAgICBmb3JtYXQgPSBod2NUZXN0R3JhcGhpY0Zvcm1hdExvb2t1cCgoKml0Rm9ybWF0KS5jX3N0cigpKTsKLSAgICAgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRFKCJVbmtub3duIGdyYXBoaWMgZm9ybWF0IG9mOiAlcyIsICgqaXRGb3JtYXQpLmNfc3RyKCkpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERpc3BsYXkgZm9ybWF0IGhlYWRlcgotICAgICAgICB0ZXN0UHJpbnRJKCJmb3JtYXQ6ICVzIiwgZm9ybWF0LT5kZXNjKTsKLQotICAgICAgICAvLyBDcmVhdGUgYXJlYSB0byBob2xkIHRoZSBtZWFzdXJlbWVudHMKLSAgICAgICAgc3RydWN0IG1lYXMgbWVhczsKLSAgICAgICAgc3RydWN0IG1lYXMgKm1lYXNQdHI7Ci0gICAgICAgIG1lYXMuZm9ybWF0ID0gZm9ybWF0LT5mb3JtYXQ7Ci0gICAgICAgIG1lYXN1cmVtZW50cy5wdXNoX2JhY2sobWVhcyk7Ci0gICAgICAgIG1lYXNQdHIgPSAmbWVhc3VyZW1lbnRzW21lYXN1cmVtZW50cy5zaXplKCkgLSAxXTsKLQotICAgICAgICAvLyBTdGFydCBkaW1lbnNpb24gbnVtIG92ZXJsYXlzCi0gICAgICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdC0+Zm9ybWF0LCBzdGFydERpbSk7Ci0gICAgICAgIHJlY3RMaXN0LmNsZWFyKCk7Ci0gICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgbWVhc1B0ci0+c3RhcnREaW1PdmVybGF5cyA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLSAgICAgICAgdGVzdFByaW50SSgiICBzdGFydERpbU92ZXJsYXlzOiAldSIsIG1lYXNQdHItPnN0YXJ0RGltT3ZlcmxheXMpOwotCi0gICAgICAgIC8vIFNraXAgdGhlIHJlc3Qgb2YgdGhlIG1lYXN1cmVtZW50cywgd2hlbiB0aGUgc3RhcnQgZGltZW5zaW9uCi0gICAgICAgIC8vIGRvZXNuJ3QgcHJvZHVjZSBhbiBvdmVybGF5Ci0gICAgICAgIGlmIChtZWFzUHRyLT5zdGFydERpbU92ZXJsYXlzID09IDApIHsgY29udGludWU7IH0KLQotICAgICAgICAvLyBNYXggT3ZlcmxheXMKLSAgICAgICAgbWVhc1B0ci0+bWF4Tm9uT3ZlcmxhcHBpbmcgPSBtYXhPdmVybGF5cyhmb3JtYXQtPmZvcm1hdCwgZmFsc2UpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIG1heCBub25PdmVybGFwcGluZyBvdmVybGF5czogJXMldSIsCi0gICAgICAgICAgICAgICAgICAgKG1lYXNQdHItPm1heE5vbk92ZXJsYXBwaW5nID09IHNlYXJjaExpbWl0cy5udW1PdmVybGF5cykKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiPj0gIiA6ICIiLAotICAgICAgICAgICAgICAgICAgIG1lYXNQdHItPm1heE5vbk92ZXJsYXBwaW5nKTsKLSAgICAgICAgbWVhc1B0ci0+bWF4T3ZlcmxhcHBpbmcgPSBtYXhPdmVybGF5cyhmb3JtYXQtPmZvcm1hdCwgdHJ1ZSk7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgbWF4IE92ZXJsYXBwaW5nIG92ZXJsYXlzOiAlcyV1IiwKLSAgICAgICAgICAgICAgICAgICAobWVhc1B0ci0+bWF4T3ZlcmxhcHBpbmcgPT0gc2VhcmNoTGltaXRzLm51bU92ZXJsYXlzKQotICAgICAgICAgICAgICAgICAgICAgICA/ICI+PSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgbWVhc1B0ci0+bWF4T3ZlcmxhcHBpbmcpOwotCi0gICAgICAgIC8vIFRyYW5zZm9ybXMgYW5kIGJsZW5kcwotICAgICAgICBtZWFzUHRyLT50cmFuc2Zvcm1zID0gc3VwcG9ydGVkVHJhbnNmb3Jtcyhmb3JtYXQtPmZvcm1hdCk7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgdHJhbnNmb3JtczogJXMiLAotICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybUxpc3Qyc3RyKG1lYXNQdHItPnRyYW5zZm9ybXMpLmNfc3RyKCkpOwotICAgICAgICBtZWFzUHRyLT5ibGVuZHMgPSBzdXBwb3J0ZWRCbGVuZHMoZm9ybWF0LT5mb3JtYXQpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIGJsZW5kczogJXMiLAotICAgICAgICAgICAgICAgICAgIGJsZW5kTGlzdDJzdHIobWVhc1B0ci0+YmxlbmRzKS5jX3N0cigpKTsKLQotICAgICAgICAvLyBEaXNwbGF5IGZyYW1lIG1lYXN1cmVtZW50cwotICAgICAgICBtZWFzUHRyLT5kZi5taW5XaWR0aCA9IGRmTWluV2lkdGgoZm9ybWF0LT5mb3JtYXQpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIGRmTWluV2lkdGg6ICV1IiwgbWVhc1B0ci0+ZGYubWluV2lkdGgpOwotCi0gICAgICAgIG1lYXNQdHItPmRmLm1pbkhlaWdodCA9IGRmTWluSGVpZ2h0KGZvcm1hdC0+Zm9ybWF0KTsKLSAgICAgICAgdGVzdFByaW50SSgiICBkZk1pbkhlaWdodDogJXUiLCBtZWFzUHRyLT5kZi5taW5IZWlnaHQpOwotCi0gICAgICAgIG1lYXNQdHItPmRmLm1heFdpZHRoID0gZGZNYXhXaWR0aChmb3JtYXQtPmZvcm1hdCk7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgZGZNYXhXaWR0aDogJXUiLCBtZWFzUHRyLT5kZi5tYXhXaWR0aCk7Ci0KLSAgICAgICAgbWVhc1B0ci0+ZGYubWF4SGVpZ2h0ID0gZGZNYXhIZWlnaHQoZm9ybWF0LT5mb3JtYXQpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIGRmTWF4SGVpZ2h0OiAldSIsIG1lYXNQdHItPmRmLm1heEhlaWdodCk7Ci0KLSAgICAgICAgbWVhc1B0ci0+ZGYubWluRGltID0gZGZNaW5EaW0oZm9ybWF0LT5mb3JtYXQpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIGRmTWluRGltOiAlcyIsICgoc3RyaW5nKSBtZWFzUHRyLT5kZi5taW5EaW0pLmNfc3RyKCkpOwotCi0gICAgICAgIG1lYXNQdHItPmRmLm1heERpbSA9IGRmTWF4RGltKGZvcm1hdC0+Zm9ybWF0KTsKLSAgICAgICAgdGVzdFByaW50SSgiICBkZk1heERpbTogJXMiLCAoKHN0cmluZykgbWVhc1B0ci0+ZGYubWF4RGltKS5jX3N0cigpKTsKLQotICAgICAgICAvLyBTb3VyY2UgY3JvcCBtZWFzdXJlbWVudHMKLSAgICAgICAgbWVhc1B0ci0+c2MubWluV2lkdGggPSBzY01pbldpZHRoKGZvcm1hdC0+Zm9ybWF0LCBtZWFzUHRyLT5kZi5taW5EaW0pOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIHNjTWluV2lkdGg6ICV1IiwgbWVhc1B0ci0+c2MubWluV2lkdGgpOwotCi0gICAgICAgIG1lYXNQdHItPnNjLm1pbkhlaWdodCA9IHNjTWluSGVpZ2h0KGZvcm1hdC0+Zm9ybWF0LCBtZWFzUHRyLT5kZi5taW5EaW0pOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIHNjTWluSGVpZ2h0OiAldSIsIG1lYXNQdHItPnNjLm1pbkhlaWdodCk7Ci0KLSAgICAgICAgbWVhc1B0ci0+c2MubWF4V2lkdGggPSBzY01heFdpZHRoKGZvcm1hdC0+Zm9ybWF0LCBtZWFzUHRyLT5kZi5tYXhEaW0pOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIHNjTWF4V2lkdGg6ICVzJXUiLCAobWVhc1B0ci0+c2MubWF4V2lkdGgKLSAgICAgICAgICAgICAgICAgICA9PSBzZWFyY2hMaW1pdHMuc291cmNlQ3JvcC53aWR0aCgpKSA/ICI+PSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgbWVhc1B0ci0+c2MubWF4V2lkdGgpOwotCi0gICAgICAgIG1lYXNQdHItPnNjLm1heEhlaWdodCA9IHNjTWF4SGVpZ2h0KGZvcm1hdC0+Zm9ybWF0LCBtZWFzUHRyLT5kZi5tYXhEaW0pOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIHNjTWF4SGVpZ2h0OiAlcyV1IiwgKG1lYXNQdHItPnNjLm1heEhlaWdodAotICAgICAgICAgICAgICAgICAgID09IHNlYXJjaExpbWl0cy5zb3VyY2VDcm9wLmhlaWdodCgpKSA/ICI+PSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgbWVhc1B0ci0+c2MubWF4SGVpZ2h0KTsKLQotICAgICAgICBtZWFzUHRyLT5zYy5taW5EaW0gPSBzY01pbkRpbShmb3JtYXQtPmZvcm1hdCwgbWVhc1B0ci0+ZGYubWluRGltKTsKLSAgICAgICAgdGVzdFByaW50SSgiICBzY01pbkRpbTogJXMiLCAoKHN0cmluZykgbWVhc1B0ci0+c2MubWluRGltKS5jX3N0cigpKTsKLQotICAgICAgICBtZWFzUHRyLT5zYy5tYXhEaW0gPSBzY01heERpbShmb3JtYXQtPmZvcm1hdCwgbWVhc1B0ci0+ZGYubWF4RGltKTsKLSAgICAgICAgdGVzdFByaW50SSgiICBzY01heERpbTogJXMlcyIsICgobWVhc1B0ci0+c2MubWF4RGltLndpZHRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICA+PSBzZWFyY2hMaW1pdHMuc291cmNlQ3JvcC53aWR0aCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChtZWFzUHRyLT5zYy5tYXhEaW0ud2lkdGgoKSA+PQotICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaExpbWl0cy5zb3VyY2VDcm9wLmhlaWdodCgpKSkgPyAiPj0gIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICgoc3RyaW5nKSBtZWFzUHRyLT5zYy5tYXhEaW0pLmNfc3RyKCkpOwotCi0gICAgICAgIG1lYXNQdHItPnNjLmhTY2FsZSA9IHNjSFNjYWxlKGZvcm1hdC0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzUHRyLT5kZi5taW5EaW0sIG1lYXNQdHItPmRmLm1heERpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc1B0ci0+c2MubWluRGltLCBtZWFzUHRyLT5zYy5tYXhEaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXNQdHItPnNjLmhTY2FsZUJlc3REZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc1B0ci0+c2MuaFNjYWxlQmVzdFNjKTsKLSAgICAgICAgdGVzdFByaW50SSgiICBzY0hTY2FsZTogJXMlZiIsCi0gICAgICAgICAgICAgICAgICAgKG1lYXNQdHItPnNjLmhTY2FsZQotICAgICAgICAgICAgICAgICAgICAgICA+PSBSYXRpb25hbChzZWFyY2hMaW1pdHMuc291cmNlQ3JvcC53aWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzUHRyLT5kZi5taW5EaW0ud2lkdGgoKSkpID8gIj49ICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBtZWFzUHRyLT5zYy5oU2NhbGUpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgSFNjYWxlIEJlc3QgRGlzcGxheSBGcmFtZTogJXMiLAotICAgICAgICAgICAgICAgICAgICgoc3RyaW5nKSBtZWFzUHRyLT5zYy5oU2NhbGVCZXN0RGYpLmNfc3RyKCkpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgSFNjYWxlIEJlc3QgU291cmNlIENyb3A6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAoKHN0cmluZykgbWVhc1B0ci0+c2MuaFNjYWxlQmVzdFNjKS5jX3N0cigpKTsKLQotICAgICAgICBtZWFzUHRyLT5zYy52U2NhbGUgPSBzY1ZTY2FsZShmb3JtYXQtPmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc1B0ci0+ZGYubWluRGltLCBtZWFzUHRyLT5kZi5tYXhEaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXNQdHItPnNjLm1pbkRpbSwgbWVhc1B0ci0+c2MubWF4RGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzUHRyLT5zYy52U2NhbGVCZXN0RGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXNQdHItPnNjLnZTY2FsZUJlc3RTYyk7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgc2NWU2NhbGU6ICVzJWYiLAotICAgICAgICAgICAgICAgICAgIChtZWFzUHRyLT5zYy52U2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgPj0gUmF0aW9uYWwoc2VhcmNoTGltaXRzLnNvdXJjZUNyb3AuaGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXNQdHItPmRmLm1pbkRpbS5oZWlnaHQoKSkpID8gIj49ICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBtZWFzUHRyLT5zYy52U2NhbGUpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgVlNjYWxlIEJlc3QgRGlzcGxheSBGcmFtZTogJXMiLAotICAgICAgICAgICAgICAgICAgICgoc3RyaW5nKSBtZWFzUHRyLT5zYy52U2NhbGVCZXN0RGYpLmNfc3RyKCkpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgVlNjYWxlIEJlc3QgU291cmNlIENyb3A6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAoKHN0cmluZykgbWVhc1B0ci0+c2MudlNjYWxlQmVzdFNjKS5jX3N0cigpKTsKLQotICAgICAgICAvLyBPdmVybGFwIHR3byBncmFwaGljIGZvcm1hdHMgYW5kIGRpZmZlcmVudCBibGVuZHMKLSAgICAgICAgLy8gUmVzdWx0cyBkaXNwbGF5ZWQgYWZ0ZXIgYWxsIG92ZXJsYXAgbWVhc3VybWVudHMgd2l0aAotICAgICAgICAvLyBjdXJyZW50IGZvcm1hdCBpbiB0aGUgZm9yZWdyb3VuZAotICAgICAgICAvLyBUT0RPOiBtYWtlIG1lYXN1cm1lbnRzIHdpdGggYmFja2dyb3VuZCBibGVuZCBvdGhlciB0aGFuCi0gICAgICAgIC8vICAgICAgIG5vbmUuICBBbGwgb2YgdGhlc2UgbWVhc3VyZW1lbnRzIGFyZSBkb25lIHdpdGggYQotICAgICAgICAvLyAgICAgICBiYWNrZ3JvdW5kIGJsZW5kIG9mIEhXQ19CTEVORElOR19OT05FLCB3aXRoIHRoZQotICAgICAgICAvLyAgICAgICBibGVuZCB0eXBlIG9mIHRoZSBmb3JlZ291bmQgYmVpbmcgdmFyaWVkLgotICAgICAgICB1aW50MzJfdCBmb3JlZ3JvdW5kRm9ybWF0ID0gZm9ybWF0LT5mb3JtYXQ7Ci0gICAgICAgIGZvciAodmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gZm9ybWF0cy5iZWdpbigpOwotICAgICAgICAgICAgIGl0ICE9IGZvcm1hdHMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG51bTsKLQotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGh3Y1Rlc3RHcmFwaGljRm9ybWF0ICpiYWNrZ3JvdW5kRm9ybWF0UHRyCi0gICAgICAgICAgICAgICAgPSBod2NUZXN0R3JhcGhpY0Zvcm1hdExvb2t1cCgoKml0KS5jX3N0cigpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGJhY2tncm91bmRGb3JtYXQgPSBiYWNrZ3JvdW5kRm9ybWF0UHRyLT5mb3JtYXQ7Ci0KLSAgICAgICAgICAgIG51bSA9IG51bU92ZXJsYXBwaW5nKGJhY2tncm91bmRGb3JtYXQsIGZvcmVncm91bmRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0NfQkxFTkRJTkdfTk9ORSwgSFdDX0JMRU5ESU5HX05PTkUpOwotICAgICAgICAgICAgbWVhc1B0ci0+b3ZlcmxhcEJsZW5kTm9uZS5wdXNoX2JhY2sobnVtKTsKLQotICAgICAgICAgICAgbnVtID0gbnVtT3ZlcmxhcHBpbmcoYmFja2dyb3VuZEZvcm1hdCwgZm9yZWdyb3VuZEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXQ19CTEVORElOR19OT05FLCBIV0NfQkxFTkRJTkdfUFJFTVVMVCk7Ci0gICAgICAgICAgICBtZWFzUHRyLT5vdmVybGFwQmxlbmRQcmVtdWx0LnB1c2hfYmFjayhudW0pOwotCi0gICAgICAgICAgICBudW0gPSBudW1PdmVybGFwcGluZyhiYWNrZ3JvdW5kRm9ybWF0LCBmb3JlZ3JvdW5kRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdDX0JMRU5ESU5HX05PTkUsIEhXQ19CTEVORElOR19DT1ZFUkFHRSk7Ci0gICAgICAgICAgICBtZWFzUHRyLT5vdmVybGFwQmxlbmRDb3ZlcmFnZS5wdXNoX2JhY2sobnVtKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLy8gRGlzcGxheSBvdmVybGFwIHJlc3VsdHMKLSAgICBzaXplX3QgaW5kZW50ID0gMjsKLSAgICB0ZXN0UHJpbnRJKCJvdmVybGFwcGluZyBibGVuZDogbm9uZSIpOwotICAgIHByaW50Rm9ybWF0SGVhZGluZ3MoaW5kZW50KTsKLSAgICBmb3IgKHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdCA9IGZvcm1hdHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGZvcm1hdHMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgcHJpbnRPdmVybGFwTGluZShpbmRlbnQsICppdCwgbWVhc3VyZW1lbnRzW2l0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLSBmb3JtYXRzLmJlZ2luKCldLm92ZXJsYXBCbGVuZE5vbmUpOwotICAgIH0KLSAgICB0ZXN0UHJpbnRJKCIiKTsKLQotICAgIHRlc3RQcmludEkoIm92ZXJsYXBwaW5nIGJsZW5kOiBwcmVtdWx0Iik7Ci0gICAgcHJpbnRGb3JtYXRIZWFkaW5ncyhpbmRlbnQpOwotICAgIGZvciAodmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gZm9ybWF0cy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gZm9ybWF0cy5lbmQoKTsgKytpdCkgewotICAgICAgICBwcmludE92ZXJsYXBMaW5lKGluZGVudCwgKml0LCBtZWFzdXJlbWVudHNbaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAtIGZvcm1hdHMuYmVnaW4oKV0ub3ZlcmxhcEJsZW5kUHJlbXVsdCk7Ci0gICAgfQotICAgIHRlc3RQcmludEkoIiIpOwotCi0gICAgdGVzdFByaW50SSgib3ZlcmxhcHBpbmcgYmxlbmQ6IGNvdmVyYWdlIik7Ci0gICAgcHJpbnRGb3JtYXRIZWFkaW5ncyhpbmRlbnQpOwotICAgIGZvciAodmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gZm9ybWF0cy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gZm9ybWF0cy5lbmQoKTsgKytpdCkgewotICAgICAgICBwcmludE92ZXJsYXBMaW5lKGluZGVudCwgKml0LCBtZWFzdXJlbWVudHNbaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAtIGZvcm1hdHMuYmVnaW4oKV0ub3ZlcmxhcEJsZW5kQ292ZXJhZ2UpOwotICAgIH0KLSAgICB0ZXN0UHJpbnRJKCIiKTsKLQotICAgIC8vIFN0YXJ0IGZyYW1ld29yawotICAgIHJ2ID0gc25wcmludGYoY21kLCBzaXplb2YoY21kKSwgIiVzIiwgQ01EX1NUQVJUX0ZSQU1FV09SSyk7Ci0gICAgaWYgKHJ2ID49IChzaWduZWQpIHNpemVvZihjbWQpIC0gMSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJDb21tYW5kIHRvbyBsb25nIGZvcjogJXMiLCBDTURfU1RBUlRfRlJBTUVXT1JLKTsKLSAgICAgICAgZXhpdCgyMSk7Ci0gICAgfQotICAgIHRlc3RFeGVjQ21kKGNtZCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLy8gRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdmVybGF5cyB0aGF0IGFyZSBhbGwgb2YgdGhlIHNhbWUgZm9ybWF0Ci0vLyB0aGF0IHRoZSBIV0Mgd2lsbCBjb21taXQgdG8uICBJZiBhbGxvd092ZXJsYXAgaXMgdHJ1ZSwgdGhlbiB0aGUgcmVjdGFuZ2xlcwotLy8gYXJlIGxhaWQgb3V0IG9uIGEgZGlhZ29uYWwgc3RhcnRpbmcgZnJvbSB0aGUgdXBwZXIgbGVmdCBjb3JuZXIuICBXaXRoCi0vLyBlYWNoIHJlY3RhbmdsZSBhZGp1c3Qgb25lIHBpeGVsIHRvIHRoZSByaWdodCBhbmQgb25lIHBpeGVsIGRvd24uCi0vLyBXaGVuIGFsbG93T3ZlcmxhcCBpcyBmYWxzZSwgdGhlIHJlY3RhbmdsZXMgYXJlIHRpbGVkIGluIGNvbHVtbiBtYWpvcgotLy8gb3JkZXIuICBOb3RlLCBjb2x1bW4gbWFqb3Igb3JkZXJpbmcgaXMgdXNlZCBzbyB0aGF0IHRoZSBpbml0aWFsIHJlY3RhbmdsZXMKLS8vIGFyZSBhbGwgb24gZGlmZmVyZW50IGhvcml6b250YWwgc2NhbiByb3dzLiAgSXQgaXMgY29tbW9uIHRoYXQgaGFyZHdhcmUKLS8vIGhhcyBsaW1pdHMgb24gdGhlIG51bWJlciBvZiBvYmplY3RzIGl0IGNhbiBoYW5kbGUgb24gYW55IHNpbmdsZSByb3cuCi11aW50MzJfdCBtYXhPdmVybGF5cyh1aW50MzJfdCBmb3JtYXQsIGJvb2wgYWxsb3dPdmVybGFwKQotewotICAgIHVuc2lnbmVkIGludCBtYXggPSAwOwotCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgbnVtUmVjdHMgPSAxOyBudW1SZWN0cyA8PSBzZWFyY2hMaW1pdHMubnVtT3ZlcmxheXM7Ci0gICAgICAgICBudW1SZWN0cysrKSB7Ci0gICAgICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLQotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCB4ID0gMDsKLSAgICAgICAgICAgICAoeCArIHN0YXJ0RGltLndpZHRoKCkpIDwgKHVuc2lnbmVkIGludCkgd2lkdGg7Ci0gICAgICAgICAgICAgeCArPSAoYWxsb3dPdmVybGFwKSA/IDEgOiBzdGFydERpbS53aWR0aCgpKSB7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCB5ID0gMDsKLSAgICAgICAgICAgICAgICAgKHkgKyBzdGFydERpbS5oZWlnaHQoKSkgPCAodW5zaWduZWQgaW50KSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgIHkgKz0gKGFsbG93T3ZlcmxhcCkgPyAxIDogc3RhcnREaW0uaGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgcmVjdChmb3JtYXQsIHN0YXJ0RGltLCBzdGFydERpbSk7Ci0gICAgICAgICAgICAgICAgcmVjdC5kaXNwbGF5RnJhbWUubGVmdCA9IHg7Ci0gICAgICAgICAgICAgICAgcmVjdC5kaXNwbGF5RnJhbWUudG9wID0geTsKLSAgICAgICAgICAgICAgICByZWN0LmRpc3BsYXlGcmFtZS5yaWdodCA9IHggKyBzdGFydERpbS53aWR0aCgpOwotICAgICAgICAgICAgICAgIHJlY3QuZGlzcGxheUZyYW1lLmJvdHRvbSA9IHkgKyBzdGFydERpbS5oZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLQotICAgICAgICAgICAgICAgIGlmIChyZWN0TGlzdC5zaXplKCkgPj0gbnVtUmVjdHMpIHsgYnJlYWs7IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWN0TGlzdC5zaXplKCkgPj0gbnVtUmVjdHMpIHsgYnJlYWs7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLSAgICAgICAgaWYgKG51bSA+IG1heCkgeyBtYXggPSBudW07IH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWF4OwotfQotCi0vLyBNZWFzdXJlcyB3aGF0IHRyYW5zZm9ybXMgKGkuZS4gZmxpcCBob3Jpem9udGFsLCByb3RhdGUgMTgwKSBhcmUKLS8vIHN1cHBvcnRlZCBieSB0aGUgc3BlY2lmaWVkIGZvcm1hdAotbGlzdDx1aW50MzJfdD4gc3VwcG9ydGVkVHJhbnNmb3Jtcyh1aW50MzJfdCBmb3JtYXQpCi17Ci0gICAgbGlzdDx1aW50MzJfdD4gcnY7Ci0gICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgc3RhcnREaW0pOwotCi0gICAgLy8gRm9yIGVhY2ggb2YgdGhlIHRyYW5zZm9ybSB0eXBlcwotICAgIGZvciAodW5zaWduZWQgaW50IGlkeCA9IDA7IGlkeCA8IE5VTUEodHJhbnNmb3JtVHlwZSk7IGlkeCsrKSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBpZCA9IHRyYW5zZm9ybVR5cGVbaWR4XS5pZDsKLQotICAgICAgICByZWN0LnRyYW5zZm9ybSA9IGlkOwotICAgICAgICByZWN0TGlzdC5jbGVhcigpOwotICAgICAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLQotICAgICAgICBpZiAobnVtID09IDEpIHsKLSAgICAgICAgICAgIHJ2LnB1c2hfYmFjayhpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLS8vIERldGVybWluZXMgd2hpY2ggdHlwZXMgb2YgYmxlbmRzIChpLmUuIG5vbmUsIHByZW11bHQsIGNvdmVyYWdlKSBhcmUKLS8vIHN1cHBvcnRlZCBieSB0aGUgc3BlY2lmaWVkIGZvcm1hdAotbGlzdDx1aW50MzJfdD4gc3VwcG9ydGVkQmxlbmRzKHVpbnQzMl90IGZvcm1hdCkKLXsKLSAgICBsaXN0PHVpbnQzMl90PiBydjsKLSAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0gICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBzdGFydERpbSk7Ci0KLSAgICAvLyBGb3IgZWFjaCBvZiB0aGUgYmxlbmQgdHlwZXMKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpZHggPSAwOyBpZHggPCBOVU1BKGJsZW5kVHlwZSk7IGlkeCsrKSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBpZCA9IGJsZW5kVHlwZVtpZHhdLmlkOwotCi0gICAgICAgIHJlY3QuYmxlbmQgPSBpZDsKLSAgICAgICAgcmVjdExpc3QuY2xlYXIoKTsKLSAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0KLSAgICAgICAgaWYgKG51bSA9PSAxKSB7Ci0gICAgICAgICAgICBydi5wdXNoX2JhY2soaWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJ2OwotfQotCi0vLyBEZXRlcm1pbmVzIHRoZSBtaW5pbXVtIHdpZHRoIG9mIGFueSBkaXNwbGF5IGZyYW1lIG9mIHRoZSBnaXZlbiBmb3JtYXQKLS8vIHRoYXQgdGhlIEhXQyB3aWxsIGNvbW1pdCB0by4KLXVpbnQzMl90IGRmTWluV2lkdGgodWludDMyX3QgZm9ybWF0KQotewotICAgIHVpbnQzMl90IHc7Ci0gICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotCi0gICAgZm9yICh3ID0gMTsgdyA8PSBzdGFydERpbS53aWR0aCgpOyB3KyspIHsKLSAgICAgICAgSHdjVGVzdERpbSBkaW0odywgc3RhcnREaW0uaGVpZ2h0KCkpOwotICAgICAgICBSZWN0YW5nbGUgcmVjdChmb3JtYXQsIGRpbSk7Ci0gICAgICAgIHJlY3RMaXN0LmNsZWFyKCk7Ci0gICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotICAgICAgICBpZiAobnVtID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHcgPiBzdGFydERpbS53aWR0aCgpKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkZhaWxlZCB0byBsb2NhdGUgZGlzcGxheSBmcmFtZSBtaW4gd2lkdGgiKTsKLSAgICAgICAgZXhpdCgzMyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHc7Ci19Ci0KLS8vIERpc3BsYXkgZnJhbWUgbWluaW11bSBoZWlnaHQKLXVpbnQzMl90IGRmTWluSGVpZ2h0KHVpbnQzMl90IGZvcm1hdCkKLXsKLSAgICB1aW50MzJfdCBoOwotICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLQotICAgIGZvciAoaCA9IDE7IGggPD0gc3RhcnREaW0uaGVpZ2h0KCk7IGgrKykgewotICAgICAgICBId2NUZXN0RGltIGRpbShzdGFydERpbS53aWR0aCgpLCBoKTsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkaW0pOwotICAgICAgICByZWN0TGlzdC5jbGVhcigpOwotICAgICAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLSAgICAgICAgaWYgKG51bSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChoID4gc3RhcnREaW0uaGVpZ2h0KCkpIHsKLSAgICAgICAgdGVzdFByaW50RSgiRmFpbGVkIHRvIGxvY2F0ZSBkaXNwbGF5IGZyYW1lIG1pbiBoZWlnaHQiKTsKLSAgICAgICAgZXhpdCgzNCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGg7Ci19Ci0KLS8vIERpc3BsYXkgZnJhbWUgbWF4aW11bSB3aWR0aAotdWludDMyX3QgZGZNYXhXaWR0aCh1aW50MzJfdCBmb3JtYXQpCi17Ci0gICAgdWludDMyX3QgdzsKLSAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0KLSAgICBmb3IgKHcgPSB3aWR0aDsgdyA+PSBzdGFydERpbS53aWR0aCgpOyB3LS0pIHsKLSAgICAgICAgSHdjVGVzdERpbSBkaW0odywgc3RhcnREaW0uaGVpZ2h0KCkpOwotICAgICAgICBSZWN0YW5nbGUgcmVjdChmb3JtYXQsIGRpbSk7Ci0gICAgICAgIHJlY3RMaXN0LmNsZWFyKCk7Ci0gICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotICAgICAgICBpZiAobnVtID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHcgPCBzdGFydERpbS53aWR0aCgpKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkZhaWxlZCB0byBsb2NhdGUgZGlzcGxheSBmcmFtZSBtYXggd2lkdGgiKTsKLSAgICAgICAgZXhpdCgzNSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHc7Ci19Ci0KLS8vIERpc3BsYXkgZnJhbWUgbWF4aW11bSBoZWlnaHQKLXVpbnQzMl90IGRmTWF4SGVpZ2h0KHVpbnQzMl90IGZvcm1hdCkKLXsKLSAgICB1aW50MzJfdCBoOwotCi0gICAgZm9yIChoID0gaGVpZ2h0OyBoID49IHN0YXJ0RGltLmhlaWdodCgpOyBoLS0pIHsKLSAgICAgICAgSHdjVGVzdERpbSBkaW0oc3RhcnREaW0ud2lkdGgoKSwgaCk7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgZGltKTsKLSAgICAgICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotICAgICAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLSAgICAgICAgaWYgKG51bSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChoIDwgc3RhcnREaW0uaGVpZ2h0KCkpIHsKLSAgICAgICAgdGVzdFByaW50RSgiRmFpbGVkIHRvIGxvY2F0ZSBkaXNwbGF5IGZyYW1lIG1heCBoZWlnaHQiKTsKLSAgICAgICAgZXhpdCgzNik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGg7Ci19Ci0KLS8vIERldGVybWluZSB0aGUgbWluaW11bSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgdGhlIEhXQyB3aWxsIGV2ZXIgY29tbWl0IHRvLgotLy8gTm90ZSwgdGhpcyBtaWdodCBiZSBkaWZmZXJlbnQgdGhhdCBkZk1pbldpZHRoICogZGZNaW5IZWlnaHQsIGluIHRoYXQgdGhpcwotLy8gZnVuY3Rpb24gYWRqdXN0cyBib3RoIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gdGhlIHN0YXJ0aW5nIGRpbWVuc2lvbi4KLUh3Y1Rlc3REaW0gZGZNaW5EaW0odWludDMyX3QgZm9ybWF0KQotewotICAgIHVpbnQ2NF90IGJlc3RNaW5QaXhlbHMgPSAwOwotICAgIEh3Y1Rlc3REaW0gYmVzdERpbTsKLSAgICBib29sIGJlc3RTZXQgPSBmYWxzZTsgLy8gVHJ1ZSB3aGVuIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlc3RNaW5QaXhlbHMgYW5kIGJlc3REaW0KLQotICAgIGJvb2wgb3JpZ1ZlcmJvc2UgPSB2ZXJib3NlOyAgLy8gVGVtcG9yYXJpbHkgdHVybiBvZmYgdmVyYm9zZQotICAgIHZlcmJvc2UgPSBmYWxzZTsKLSAgICBmb3IgKHVpbnQzMl90IHcgPSAxOyB3IDw9IHN0YXJ0RGltLndpZHRoKCk7IHcrKykgewotICAgICAgICBmb3IgKHVpbnQzMl90IGggPSAxOyBoIDw9IHN0YXJ0RGltLmhlaWdodCgpOyBoKyspIHsKLSAgICAgICAgICAgIGlmIChiZXN0U2V0ICYmICgodyA+IGJlc3RNaW5QaXhlbHMpIHx8IChoID4gYmVzdE1pblBpeGVscykpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEh3Y1Rlc3REaW0gZGltKHcsIGgpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkaW0pOwotICAgICAgICAgICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotICAgICAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotICAgICAgICAgICAgaWYgKG51bSA+IDApIHsKLSAgICAgICAgICAgICAgICB1aW50NjRfdCBwaXhlbHMgPSBkaW0ud2lkdGgoKSAqIGRpbS5oZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWJlc3RTZXQgfHwgKHBpeGVscyA8IGJlc3RNaW5QaXhlbHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RNaW5QaXhlbHMgPSBwaXhlbHM7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3REaW0gPSBkaW07Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB2ZXJib3NlID0gb3JpZ1ZlcmJvc2U7Ci0KLSAgICBpZiAoIWJlc3RTZXQpIHsKLSAgICAgICAgdGVzdFByaW50RSgiVW5hYmxlIHRvIGxvY2F0ZSBkaXNwbGF5IGZyYW1lIG1pbiBkaW1lbnNpb24iKTsKLSAgICAgICAgZXhpdCgyMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJlc3REaW07Ci19Ci0KLS8vIERpc3BsYXkgZnJhbWUgbWF4aW11bSBkaW1lbnNpb24KLUh3Y1Rlc3REaW0gZGZNYXhEaW0odWludDMyX3QgZm9ybWF0KQotewotICAgIHVpbnQ2NF90IGJlc3RNYXhQaXhlbHMgPSAwOwotICAgIEh3Y1Rlc3REaW0gYmVzdERpbTsKLSAgICBib29sIGJlc3RTZXQgPSBmYWxzZTsgLy8gVHJ1ZSB3aGVuIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlc3RNYXhQaXhlbHMgYW5kIGJlc3REaW07Ci0KLSAgICAvLyBQb3RlbnRpYWxseSBpbmNyZWFzZSBiZW5jaG1hcmsgcGVyZm9ybWFuY2UgYnkgZmlyc3QgY2hlY2tpbmcKLSAgICAvLyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIHN1cHBvcnRpbmcgYSBmdWxsIGRpc3BsYXkgZnJhbWUuCi0gICAgSHdjVGVzdERpbSBkaW0od2lkdGgsIGhlaWdodCk7Ci0gICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkaW0pOwotICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLSAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotICAgIGlmIChudW0gPT0gMSkgeyByZXR1cm4gZGltOyB9Ci0KLSAgICAvLyBUT0RPOiBVc2UgYSBiaW5hcnkgc2VhcmNoCi0gICAgYm9vbCBvcmlnVmVyYm9zZSA9IHZlcmJvc2U7ICAvLyBUZW1wb3JhcmlseSB0dXJuIG9mZiB2ZXJib3NlCi0gICAgdmVyYm9zZSA9IGZhbHNlOwotICAgIGZvciAodWludDMyX3QgdyA9IHN0YXJ0RGltLndpZHRoKCk7IHcgPD0gKHVpbnQzMl90KSB3aWR0aDsgdysrKSB7Ci0gICAgICAgIGZvciAodWludDMyX3QgaCA9IHN0YXJ0RGltLmhlaWdodCgpOyBoIDw9ICh1aW50MzJfdCkgaGVpZ2h0OyBoKyspIHsKLSAgICAgICAgICAgIGlmIChiZXN0U2V0ICYmICgodyAqIGgpIDw9IGJlc3RNYXhQaXhlbHMpKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgICAgICAgIEh3Y1Rlc3REaW0gZGltKHcsIGgpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkaW0pOwotICAgICAgICAgICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotICAgICAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotICAgICAgICAgICAgaWYgKG51bSA+IDApIHsKLSAgICAgICAgICAgICAgICB1aW50NjRfdCBwaXhlbHMgPSBkaW0ud2lkdGgoKSAqIGRpbS5oZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWJlc3RTZXQgfHwgKHBpeGVscyA+IGJlc3RNYXhQaXhlbHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RNYXhQaXhlbHMgPSBwaXhlbHM7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3REaW0gPSBkaW07Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB2ZXJib3NlID0gb3JpZ1ZlcmJvc2U7Ci0KLSAgICBpZiAoIWJlc3RTZXQpIHsKLSAgICAgICAgdGVzdFByaW50RSgiVW5hYmxlIHRvIGxvY2F0ZSBkaXNwbGF5IGZyYW1lIG1heCBkaW1lbnNpb24iKTsKLSAgICAgICAgZXhpdCgyMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJlc3REaW07Ci19Ci0KLS8vIFNvdXJjZSBjcm9wIG1pbmltdW0gd2lkdGgKLXVpbnQzMl90IHNjTWluV2lkdGgodWludDMyX3QgZm9ybWF0LCBjb25zdCBId2NUZXN0RGltJiBkZkRpbSkKLXsKLSAgICB1aW50MzJfdCB3OwotICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLQotICAgIC8vIFNvdXJjZSBjcm9wIGZyYW1lIG1pbiB3aWR0aAotICAgIGZvciAodyA9IDE7IHcgPD0gZGZEaW0ud2lkdGgoKTsgdysrKSB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgZGZEaW0sIEh3Y1Rlc3REaW0odywgZGZEaW0uaGVpZ2h0KCkpKTsKLSAgICAgICAgcmVjdExpc3QuY2xlYXIoKTsKLSAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0gICAgICAgIGlmIChudW0gPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdzsKLSAgICAgICAgfQotICAgIH0KLSAgICB0ZXN0UHJpbnRFKCJGYWlsZWQgdG8gbG9jYXRlIHNvdXJjZSBjcm9wIG1pbiB3aWR0aCIpOwotICAgIGV4aXQoMzUpOwotfQotCi0vLyBTb3VyY2UgY3JvcCBtaW5pbXVtIGhlaWdodAotdWludDMyX3Qgc2NNaW5IZWlnaHQodWludDMyX3QgZm9ybWF0LCBjb25zdCBId2NUZXN0RGltJiBkZkRpbSkKLXsKLSAgICB1aW50MzJfdCBoOwotICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLQotICAgIGZvciAoaCA9IDE7IGggPD0gZGZEaW0uaGVpZ2h0KCk7IGgrKykgewotICAgICAgICBSZWN0YW5nbGUgcmVjdChmb3JtYXQsIGRmRGltLCBId2NUZXN0RGltKGRmRGltLndpZHRoKCksIGgpKTsKLSAgICAgICAgcmVjdExpc3QuY2xlYXIoKTsKLSAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0gICAgICAgIGlmIChudW0gPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgfQotICAgIH0KLSAgICB0ZXN0UHJpbnRFKCJGYWlsZWQgdG8gbG9jYXRlIHNvdXJjZSBjcm9wIG1pbiBoZWlnaHQiKTsKLSAgICBleGl0KDM2KTsKLX0KLQotLy8gU291cmNlIGNyb3AgbWF4aW11bSB3aWR0aAotdWludDMyX3Qgc2NNYXhXaWR0aCh1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEh3Y1Rlc3REaW0mIGRmRGltKQotewotICAgIHVpbnQzMl90IHc7Ci0gICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotCi0gICAgZm9yICh3ID0gc2VhcmNoTGltaXRzLnNvdXJjZUNyb3Aud2lkdGgoKTsgdyA+PSBkZkRpbS53aWR0aCgpOyB3LS0pIHsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkZkRpbSwgSHdjVGVzdERpbSh3LCBkZkRpbS5oZWlnaHQoKSkpOwotICAgICAgICByZWN0TGlzdC5jbGVhcigpOwotICAgICAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLSAgICAgICAgaWYgKG51bSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiB3OwotICAgICAgICB9Ci0gICAgfQotICAgIHRlc3RQcmludEUoIkZhaWxlZCB0byBsb2NhdGUgc291cmNlIGNyb3AgbWF4IHdpZHRoIik7Ci0gICAgZXhpdCgzNSk7Ci19Ci0KLS8vIFNvdXJjZSBjcm9wIG1heGltdW0gaGVpZ2h0Ci11aW50MzJfdCBzY01heEhlaWdodCh1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEh3Y1Rlc3REaW0mIGRmRGltKQotewotICAgIHVpbnQzMl90IGg7Ci0gICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotCi0gICAgZm9yIChoID0gc2VhcmNoTGltaXRzLnNvdXJjZUNyb3AuaGVpZ2h0KCk7IGggPj0gZGZEaW0uaGVpZ2h0KCk7IGgtLSkgewotICAgICAgICBSZWN0YW5nbGUgcmVjdChmb3JtYXQsIGRmRGltLCBId2NUZXN0RGltKGRmRGltLndpZHRoKCksIGgpKTsKLSAgICAgICAgcmVjdExpc3QuY2xlYXIoKTsKLSAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0gICAgICAgIGlmIChudW0gPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgfQotICAgIH0KLSAgICB0ZXN0UHJpbnRFKCJGYWlsZWQgdG8gbG9jYXRlIHNvdXJjZSBjcm9wIG1heCBoZWlnaHQiKTsKLSAgICBleGl0KDM2KTsKLX0KLQotLy8gU291cmNlIGNyb3AgbWluaW11bSBkaW1lbnNpb24KLS8vIERpc2NvdmVycyB0aGUgc291cmNlIGNyb3Agd2l0aCB0aGUgbGVhc3QgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHRoZQotLy8gSFdDIHdpbGwgY29tbWl0IHRvLiAgTm90ZSwgdGhpcyBtYXkgYmUgZGlmZmVyZW50IGZyb20gc2NNaW5XaWR0aAotLy8gKiBzY01pbkhlaWdodCwgaW4gdGhhdCB0aGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhIGNvbWJpbmF0aW9uIG9mCi0vLyB3aWR0aCBhbmQgaGVpZ2h0LiAgV2hpbGUgdGhlIG90aGVyIHJvdXRpbmVzIGFsd2F5cyBrZWVwIG9uZSBvZiB0aGUKLS8vIGRpbWVuc2lvbnMgZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RhcnQgZGltZW5zaW9uLgotSHdjVGVzdERpbSBzY01pbkRpbSh1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEh3Y1Rlc3REaW0mIGRmRGltKQotewotICAgIHVpbnQ2NF90IGJlc3RNaW5QaXhlbHMgPSAwOwotICAgIEh3Y1Rlc3REaW0gYmVzdERpbTsKLSAgICBib29sIGJlc3RTZXQgPSBmYWxzZTsgLy8gVHJ1ZSB3aGVuIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlc3RNaW5QaXhlbHMgYW5kIGJlc3REaW0KLQotICAgIGJvb2wgb3JpZ1ZlcmJvc2UgPSB2ZXJib3NlOyAgLy8gVGVtcG9yYXJpbHkgdHVybiBvZmYgdmVyYm9zZQotICAgIHZlcmJvc2UgPSBmYWxzZTsKLSAgICBmb3IgKHVpbnQzMl90IHcgPSAxOyB3IDw9IGRmRGltLndpZHRoKCk7IHcrKykgewotICAgICAgICBmb3IgKHVpbnQzMl90IGggPSAxOyBoIDw9IGRmRGltLmhlaWdodCgpOyBoKyspIHsKLSAgICAgICAgICAgIGlmIChiZXN0U2V0ICYmICgodyA+IGJlc3RNaW5QaXhlbHMpIHx8IChoID4gYmVzdE1pblBpeGVscykpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEh3Y1Rlc3REaW0gZGltKHcsIGgpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkZkRpbSwgSHdjVGVzdERpbSh3LCBoKSk7Ci0gICAgICAgICAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0gICAgICAgICAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0gICAgICAgICAgICBpZiAobnVtID4gMCkgewotICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBpeGVscyA9IGRpbS53aWR0aCgpICogZGltLmhlaWdodCgpOwotICAgICAgICAgICAgICAgIGlmICghYmVzdFNldCB8fCAocGl4ZWxzIDwgYmVzdE1pblBpeGVscykpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdE1pblBpeGVscyA9IHBpeGVsczsKLSAgICAgICAgICAgICAgICAgICAgYmVzdERpbSA9IGRpbTsKLSAgICAgICAgICAgICAgICAgICAgYmVzdFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHZlcmJvc2UgPSBvcmlnVmVyYm9zZTsKLQotICAgIGlmICghYmVzdFNldCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJVbmFibGUgdG8gbG9jYXRlIHNvdXJjZSBjcm9wIG1pbiBkaW1lbnNpb24iKTsKLSAgICAgICAgZXhpdCgyMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJlc3REaW07Ci19Ci0KLS8vIFNvdXJjZSBjcm9wIG1heGltdW0gZGltZW5zaW9uCi1Id2NUZXN0RGltIHNjTWF4RGltKHVpbnQzMl90IGZvcm1hdCwgY29uc3QgSHdjVGVzdERpbSYgZGZEaW0pCi17Ci0gICAgdWludDY0X3QgYmVzdE1heFBpeGVscyA9IDA7Ci0gICAgSHdjVGVzdERpbSBiZXN0RGltOwotICAgIGJvb2wgYmVzdFNldCA9IGZhbHNlOyAvLyBUcnVlIHdoZW4gdmFsdWUgaGFzIGJlZW4gYXNzaWduZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVzdE1heFBpeGVscyBhbmQgYmVzdERpbTsKLQotICAgIC8vIFBvdGVudGlhbGx5IGluY3JlYXNlIGJlbmNobWFyayBwZXJmb3JtYW5jZSBieSBmaXJzdCBjaGVja2luZwotICAgIC8vIGZvciB0aGUgY29tbW9uIGNhc2Ugb2Ygc3VwcG9ydGluZyB0aGUgbWF4aW11bSBjaGVja2VkIHNvdXJjZSBzaXplCi0gICAgSHdjVGVzdERpbSBkaW0gPSBzZWFyY2hMaW1pdHMuc291cmNlQ3JvcDsKLSAgICBSZWN0YW5nbGUgcmVjdChmb3JtYXQsIGRmRGltLCBzZWFyY2hMaW1pdHMuc291cmNlQ3JvcCk7Ci0gICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0gICAgaWYgKG51bSA9PSAxKSB7IHJldHVybiBkaW07IH0KLQotICAgIC8vIFRPRE86IFVzZSBhIGJpbmFyeSBzZWFyY2gKLSAgICBib29sIG9yaWdWZXJib3NlID0gdmVyYm9zZTsgIC8vIFRlbXBvcmFyaWx5IHR1cm4gb2ZmIHZlcmJvc2UKLSAgICB2ZXJib3NlID0gZmFsc2U7Ci0gICAgZm9yICh1aW50MzJfdCB3ID0gZGZEaW0ud2lkdGgoKTsKLSAgICAgICAgIHcgPD0gc2VhcmNoTGltaXRzLnNvdXJjZUNyb3Aud2lkdGgoKTsgdysrKSB7Ci0gICAgICAgIGZvciAodWludDMyX3QgaCA9IGRmRGltLmhlaWdodCgpOwotICAgICAgICAgICAgIGggPD0gc2VhcmNoTGltaXRzLnNvdXJjZUNyb3AuaGVpZ2h0KCk7IGgrKykgewotICAgICAgICAgICAgaWYgKGJlc3RTZXQgJiYgKCh3ICogaCkgPD0gYmVzdE1heFBpeGVscykpIHsgY29udGludWU7IH0KLQotICAgICAgICAgICAgSHdjVGVzdERpbSBkaW0odywgaCk7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgcmVjdChmb3JtYXQsIGRmRGltLCBkaW0pOwotICAgICAgICAgICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotICAgICAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotICAgICAgICAgICAgaWYgKG51bSA+IDApIHsKLSAgICAgICAgICAgICAgICB1aW50NjRfdCBwaXhlbHMgPSBkaW0ud2lkdGgoKSAqIGRpbS5oZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWJlc3RTZXQgfHwgKHBpeGVscyA+IGJlc3RNYXhQaXhlbHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RNYXhQaXhlbHMgPSBwaXhlbHM7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3REaW0gPSBkaW07Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB2ZXJib3NlID0gb3JpZ1ZlcmJvc2U7Ci0KLSAgICBpZiAoIWJlc3RTZXQpIHsKLSAgICAgICAgdGVzdFByaW50RSgiVW5hYmxlIHRvIGxvY2F0ZSBzb3VyY2UgY3JvcCBtYXggZGltZW5zaW9uIik7Ci0gICAgICAgIGV4aXQoMjEpOwotICAgIH0KLQotICAgIHJldHVybiBiZXN0RGltOwotfQotCi0vLyBTb3VyY2UgY3JvcCBob3Jpem9udGFsIHNjYWxlCi0vLyBEZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGZhY3RvciBieSB3aGljaCB0aGUgc291cmNlIGNyb3AgY2FuIGJlIGxhcmdlcgotLy8gdGhhdCB0aGUgZGlzcGxheSBmcmFtZS4gIFRoZSBjb21taXQgcG9pbnQgaXMgZGlzY292ZXJlZCB0aHJvdWdoIGEKLS8vIGJpbmFyeSBzZWFyY2ggb2YgcmF0aW9uYWwgbnVtYmVycy4gIFRoZSBudW1lcmF0b3IgaW4gZWFjaCBvZiB0aGUKLS8vIHJhdGlvbmFsIG51bWJlcnMgY29udGFpbnMgdGhlIGRpbWVuc2lvbiBmb3IgdGhlIHNvdXJjZSBjcm9wLCB3aGlsZQotLy8gdGhlIGRlbm9taW5hdG9yIHNwZWNpZmllcyB0aGUgZGltZW5zaW9uIGZvciB0aGUgZGlzcGxheSBmcmFtZS4gIE9uCi0vLyBlYWNoIHBhc3Mgb2YgdGhlIGJpbmFyeSBzZWFyY2ggdGhlIG1pZC1wb2ludCBiZXR3ZWVuIHRoZSBncmVhdGVzdAotLy8gcG9pbnQgY29tbWl0dGVkIHRvIChiZXN0KSBhbmQgdGhlIHNtYWxsZXN0IHBvaW50IGluIHdoaWNoIGEgY29tbWl0Ci0vLyBoYXMgZmFpbGVkIGlzIGNhbGN1bGF0ZWQuICBUaGlzIG1pZC1wb2ludCBpcyB0aGVuIHBhc3NlZCB0byBhIGZ1bmN0aW9uCi0vLyBuYW1lZCBkb3VibGUyUmF0aW9uYWwsIHdoaWNoIGRldGVybWluZXMgdGhlIGNsb3Nlc3QgcmF0aW9uYWwgbnVtYmVycwotLy8ganVzdCBiZWxvdyBhbmQgYWJvdmUgdGhlIG1pZC1wb2ludC4gIEJ5IGRlZmF1bHQgdGhlIGxvd2VyIHJhdGlvbmFsCi0vLyBudW1iZXIgaXMgdXNlZCBmb3IgdGhlIHNjYWxlIGZhY3RvciBvbiB0aGUgbmV4dCBwYXNzIG9mIHRoZSBiaW5hcnkKLS8vIHNlYXJjaC4gIFRoZSB1cHBlciB2YWx1ZSBpcyBvbmx5IHVzZWQgd2hlbiBiZXN0IGlzIGFscmVhZHkgZXF1YWwKLS8vIHRvIHRoZSBsb3dlciB2YWx1ZS4gIFRoaXMgb25seSBvY2N1cnMgd2hlbiB0aGUgbG93ZXIgdmFsdWUgaGFzIGFscmVhZHkKLS8vIGJlZW4gdHJpZWQuCi1SYXRpb25hbCBzY0hTY2FsZSh1aW50MzJfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHdjVGVzdERpbSYgZGZNaW4sIGNvbnN0IEh3Y1Rlc3REaW0mIGRmTWF4LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh3Y1Rlc3REaW0mIHNjTWluLCBjb25zdCBId2NUZXN0RGltJiBzY01heCwKLSAgICAgICAgICAgICAgICAgICAgICBId2NUZXN0RGltJiBvdXRCZXN0RGYsIEh3Y1Rlc3REaW0mIG91dEJlc3RTYykKLXsKLSAgICBId2NUZXN0RGltIHNjRGltLCBkZkRpbTsgLy8gU291cmNlIGNyb3AgYW5kIGRpc3BsYXkgZnJhbWUgZGltZW5zaW9uCi0gICAgUmF0aW9uYWwgYmVzdCgwLCAxKSwgbWluQmFkOyAgLy8gQ3VycmVudCBib3VuZHMgZm9yIGEgYmluYXJ5IHNlYXJjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pbkdvb2QgaXMgc2V0IGJlbG93IHRoZSBsb3dlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBzY2FsZS4gIFRoZSB2YWx1ZSBvZiBtaW5CYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBzZXQgYnkgdGhlIGZpcnN0IHBhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgYmluYXJ5IHNlYXJjaC4KLQotICAgIC8vIFBlcmZvcm0gdGhlIHBhc3NlcyBvZiB0aGUgYmluYXJ5IHNlYXJjaAotICAgIGJvb2wgZmlyc3RQYXNzID0gdHJ1ZTsKLSAgICBkbyB7Ci0gICAgICAgIC8vIE9uIGZpcnN0IHBhc3MgdHJ5IHRoZSBtYXhpbXVtIHNjYWxlIHdpdGhpbiB0aGUgc2VhcmNoIGxpbWl0cwotICAgICAgICBpZiAoZmlyc3RQYXNzKSB7Ci0gICAgICAgICAgICAvLyBUcnkgdGhlIG1heGltdW0gcG9zc2libGUgc2NhbGUsIHdpdGhpbiB0aGUgc2VhcmNoIGxpbWl0cwotICAgICAgICAgICAgc2NEaW0gPSBId2NUZXN0RGltKHNlYXJjaExpbWl0cy5zb3VyY2VDcm9wLndpZHRoKCksIHNjTWluLmhlaWdodCgpKTsKLSAgICAgICAgICAgIGRmRGltID0gZGZNaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTdWJzZXF1ZW50IHBhc3MKLSAgICAgICAgICAgIC8vIEhhbHZlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYmVzdCBhbmQgbWluQmFkLgotICAgICAgICAgICAgUmF0aW9uYWwgbG93ZXIsIHVwcGVyLCBzZWxlY3RlZDsKLQotICAgICAgICAgICAgLy8gVHJ5IHRoZSBjbG9zZXN0IHJhdGlvIGhhbGZ3YXkgYmV0d2VlbiBtaW5Cb29kIGFuZCBtaW5CYWQ7Ci0gICAgICAgICAgICAvLyBUT0RPOiBBdm9pZCByb3VuZGluZyBpc3N1ZSBieSB1c2luZyBSYXRpb25hbCB0eXBlIGZvcgotICAgICAgICAgICAgLy8gICAgICAgbWlkcG9pbnQuICBGb3Igbm93IHdpbGwgdXNlIGRvdWJsZSwgd2hpY2ggc2hvdWxkCi0gICAgICAgICAgICAvLyAgICAgICBoYXZlIG1vcmUgdGhhbiBzdWZmaWNpZW50IHJlc29sdXRpb24uCi0gICAgICAgICAgICBkb3VibGUgbWlkID0gKGRvdWJsZSkgYmVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICsgKChkb3VibGUpIG1pbkJhZCAtIChkb3VibGUpIGJlc3QpIC8gMi4wOwotICAgICAgICAgICAgUmF0aW9uYWw6OmRvdWJsZTJSYXRpb25hbChtaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2Uoc2NNaW4ud2lkdGgoKSwgc2NNYXgud2lkdGgoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2UoZGZNaW4ud2lkdGgoKSwgZGZNYXgud2lkdGgoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIsIHVwcGVyKTsKLSAgICAgICAgICAgIGlmICgoKGxvd2VyID09IGJlc3QpICYmICh1cHBlciA9PSBtaW5CYWQpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVc2UgbG93ZXIgdmFsdWUgdW5sZXNzIGl0cyBhbHJlYWR5IGJlZW4gdHJpZWQKLSAgICAgICAgICAgIHNlbGVjdGVkID0gKGxvd2VyICE9IGJlc3QpID8gbG93ZXIgOiB1cHBlcjsKLQotICAgICAgICAgICAgLy8gQXNzaWduIHRoZSBzaXplIG9mIHRoZSBzb3VyY2UgY3JvcCBhbmQgZGlzcGxheSBmcmFtZQotICAgICAgICAgICAgLy8gZnJvbSB0aGUgc2VsZWN0ZWQgcmF0aW8gb2Ygc291cmNlIGNyb3AgdG8gZGlzcGxheSBmcmFtZS4KLSAgICAgICAgICAgIHNjRGltID0gSHdjVGVzdERpbShzZWxlY3RlZC5udW1lcmF0b3IoKSwgc2NNaW4uaGVpZ2h0KCkpOwotICAgICAgICAgICAgZGZEaW0gPSBId2NUZXN0RGltKHNlbGVjdGVkLmRlbm9taW5hdG9yKCksIGRmTWluLmhlaWdodCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlZSBpZiB0aGUgSFdDIHdpbGwgY29tbWl0IHRvIHRoaXMgY29tYmluYXRpb24KLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkZkRpbSwgc2NEaW0pOwotICAgICAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0gICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotCi0gICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRJKCIgIHNjSHNjYWxlIG51bTogJXUgc2NhbGU6ICVmIGRmRGltOiAlcyBzY0RpbTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBudW0sIChmbG9hdCkgUmF0aW9uYWwoc2NEaW0ud2lkdGgoKSwgZGZEaW0ud2lkdGgoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICgoc3RyaW5nKSBkZkRpbSkuY19zdHIoKSwgKChzdHJpbmcpIHNjRGltKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVtID09IDEpIHsKLSAgICAgICAgICAgIC8vIEhXQyBjb21taXR0ZWQgdG8gdGhlIGNvbWJpbmF0aW9uCi0gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBiZXN0IHNjYWxlIGZhY3RvciBzZWVuIHNvIGZhci4gIFJlcG9ydCB0aGUKLSAgICAgICAgICAgIC8vIGRpbWVuc2lvbnMgdG8gdGhlIGNhbGxlciwgaW4gY2FzZSBub3RoaW5nIGJldHRlciBpcyBzZWVuLgotICAgICAgICAgICAgb3V0QmVzdERmID0gZGZEaW07Ci0gICAgICAgICAgICBvdXRCZXN0U2MgPSBzY0RpbTsKLQotICAgICAgICAgICAgLy8gU3VjY2VzcyBvbiB0aGUgZmlyc3QgcGFzcyBtZWFucyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBzY2FsZQotICAgICAgICAgICAgLy8gaXMgc3VwcG9ydGVkLCBpbiB3aGljaCBjYXNlIG5vIG5lZWQgdG8gc2VhcmNoIGFueSBmdXJ0aGVyLgotICAgICAgICAgICAgaWYgKGZpcnN0UGFzcykgeyByZXR1cm4gUmF0aW9uYWwoc2NEaW0ud2lkdGgoKSwgZGZEaW0ud2lkdGgoKSk7IH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgYmluYXJ5IHNlYXJjaAotICAgICAgICAgICAgYmVzdCA9IFJhdGlvbmFsKHNjRGltLndpZHRoKCksIGRmRGltLndpZHRoKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSFdDIGRpZG4ndCBjb21taXQgdG8gdGhpcyBjb21iaW5hdGlvbiwgc28gdXBkYXRlIHRoZQotICAgICAgICAgICAgLy8gdXBwZXIgYm91bmQgb2YgdGhlIGJpbmFyeSBzZWFyY2guCi0gICAgICAgICAgICBtaW5CYWQgPSBSYXRpb25hbChzY0RpbS53aWR0aCgpLCBkZkRpbS53aWR0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpcnN0UGFzcyA9IGZhbHNlOwotICAgIH0gd2hpbGUgKGJlc3QgIT0gbWluQmFkKTsKLQotICAgIHJldHVybiBiZXN0OwotfQotCi0vLyBTb3VyY2UgY3JvcCB2ZXJ0aWNhbCBzY2FsZQotLy8gRGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBmYWN0b3IgYnkgd2hpY2ggdGhlIHNvdXJjZSBjcm9wIGNhbiBiZSBsYXJnZXIKLS8vIHRoYXQgdGhlIGRpc3BsYXkgZnJhbWUuICBUaGUgY29tbWl0IHBvaW50IGlzIGRpc2NvdmVyZWQgdGhyb3VnaCBhCi0vLyBiaW5hcnkgc2VhcmNoIG9mIHJhdGlvbmFsIG51bWJlcnMuICBUaGUgbnVtZXJhdG9yIGluIGVhY2ggb2YgdGhlCi0vLyByYXRpb25hbCBudW1iZXJzIGNvbnRhaW5zIHRoZSBkaW1lbnNpb24gZm9yIHRoZSBzb3VyY2UgY3JvcCwgd2hpbGUKLS8vIHRoZSBkZW5vbWluYXRvciBzcGVjaWZpZXMgdGhlIGRpbWVuc2lvbiBmb3IgdGhlIGRpc3BsYXkgZnJhbWUuICBPbgotLy8gZWFjaCBwYXNzIG9mIHRoZSBiaW5hcnkgc2VhcmNoIHRoZSBtaWQtcG9pbnQgYmV0d2VlbiB0aGUgZ3JlYXRlc3QKLS8vIHBvaW50IGNvbW1pdHRlZCB0byAoYmVzdCkgYW5kIHRoZSBzbWFsbGVzdCBwb2ludCBpbiB3aGljaCBhIGNvbW1pdAotLy8gaGFzIGZhaWxlZCBpcyBjYWxjdWxhdGVkLiAgVGhpcyBtaWQtcG9pbnQgaXMgdGhlbiBwYXNzZWQgdG8gYSBmdW5jdGlvbgotLy8gbmFtZWQgZG91YmxlMlJhdGlvbmFsLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBjbG9zZXN0IHJhdGlvbmFsIG51bWJlcnMKLS8vIGp1c3QgYmVsb3cgYW5kIGFib3ZlIHRoZSBtaWQtcG9pbnQuICBCeSBkZWZhdWx0IHRoZSBsb3dlciByYXRpb25hbAotLy8gbnVtYmVyIGlzIHVzZWQgZm9yIHRoZSBzY2FsZSBmYWN0b3Igb24gdGhlIG5leHQgcGFzcyBvZiB0aGUgYmluYXJ5Ci0vLyBzZWFyY2guICBUaGUgdXBwZXIgdmFsdWUgaXMgb25seSB1c2VkIHdoZW4gYmVzdCBpcyBhbHJlYWR5IGVxdWFsCi0vLyB0byB0aGUgbG93ZXIgdmFsdWUuICBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gdGhlIGxvd2VyIHZhbHVlIGhhcyBhbHJlYWR5Ci0vLyBiZWVuIHRyaWVkLgotUmF0aW9uYWwgc2NWU2NhbGUodWludDMyX3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh3Y1Rlc3REaW0mIGRmTWluLCBjb25zdCBId2NUZXN0RGltJiBkZk1heCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBId2NUZXN0RGltJiBzY01pbiwgY29uc3QgSHdjVGVzdERpbSYgc2NNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgSHdjVGVzdERpbSYgb3V0QmVzdERmLCBId2NUZXN0RGltJiBvdXRCZXN0U2MpCi17Ci0gICAgSHdjVGVzdERpbSBzY0RpbSwgZGZEaW07IC8vIFNvdXJjZSBjcm9wIGFuZCBkaXNwbGF5IGZyYW1lIGRpbWVuc2lvbgotICAgIFJhdGlvbmFsIGJlc3QoMCwgMSksIG1pbkJhZDsgIC8vIEN1cnJlbnQgYm91bmRzIGZvciBhIGJpbmFyeSBzZWFyY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaW5Hb29kIGlzIHNldCBiZWxvdyB0aGUgbG93ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgc2NhbGUuICBUaGUgdmFsdWUgb2YgbWluQmFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgc2V0IGJ5IHRoZSBmaXJzdCBwYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGJpbmFyeSBzZWFyY2guCi0KLSAgICAvLyBQZXJmb3JtIHRoZSBwYXNzZXMgb2YgdGhlIGJpbmFyeSBzZWFyY2gKLSAgICBib29sIGZpcnN0UGFzcyA9IHRydWU7Ci0gICAgZG8gewotICAgICAgICAvLyBPbiBmaXJzdCBwYXNzIHRyeSB0aGUgbWF4aW11bSBzY2FsZSB3aXRoaW4gdGhlIHNlYXJjaCBsaW1pdHMKLSAgICAgICAgaWYgKGZpcnN0UGFzcykgewotICAgICAgICAgICAgLy8gVHJ5IHRoZSBtYXhpbXVtIHBvc3NpYmxlIHNjYWxlLCB3aXRoaW4gdGhlIHNlYXJjaCBsaW1pdHMKLSAgICAgICAgICAgIHNjRGltID0gSHdjVGVzdERpbShzY01pbi53aWR0aCgpLCBzZWFyY2hMaW1pdHMuc291cmNlQ3JvcC5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBkZkRpbSA9IGRmTWluOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU3Vic2VxdWVudCBwYXNzCi0gICAgICAgICAgICAvLyBIYWx2ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGJlc3QgYW5kIG1pbkJhZC4KLSAgICAgICAgICAgIFJhdGlvbmFsIGxvd2VyLCB1cHBlciwgc2VsZWN0ZWQ7Ci0KLSAgICAgICAgICAgIC8vIFRyeSB0aGUgY2xvc2VzdCByYXRpbyBoYWxmd2F5IGJldHdlZW4gbWluQm9vZCBhbmQgbWluQmFkOwotICAgICAgICAgICAgLy8gVE9ETzogQXZvaWQgcm91bmRpbmcgaXNzdWUgYnkgdXNpbmcgUmF0aW9uYWwgdHlwZSBmb3IKLSAgICAgICAgICAgIC8vICAgICAgIG1pZHBvaW50LiAgRm9yIG5vdyB3aWxsIHVzZSBkb3VibGUsIHdoaWNoIHNob3VsZAotICAgICAgICAgICAgLy8gICAgICAgaGF2ZSBtb3JlIHRoYW4gc3VmZmljaWVudCByZXNvbHV0aW9uLgotICAgICAgICAgICAgZG91YmxlIG1pZCA9IChkb3VibGUpIGJlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICArICgoZG91YmxlKSBtaW5CYWQgLSAoZG91YmxlKSBiZXN0KSAvIDIuMDsKLSAgICAgICAgICAgIFJhdGlvbmFsOjpkb3VibGUyUmF0aW9uYWwobWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlKHNjTWluLmhlaWdodCgpLCBzY01heC5oZWlnaHQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2UoZGZNaW4uaGVpZ2h0KCksIGRmTWF4LmhlaWdodCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciwgdXBwZXIpOwotICAgICAgICAgICAgaWYgKCgobG93ZXIgPT0gYmVzdCkgJiYgKHVwcGVyID09IG1pbkJhZCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVzZSBsb3dlciB2YWx1ZSB1bmxlc3MgaXRzIGFscmVhZHkgYmVlbiB0cmllZAotICAgICAgICAgICAgc2VsZWN0ZWQgPSAobG93ZXIgIT0gYmVzdCkgPyBsb3dlciA6IHVwcGVyOwotCi0gICAgICAgICAgICAvLyBBc3NpZ24gdGhlIHNpemUgb2YgdGhlIHNvdXJjZSBjcm9wIGFuZCBkaXNwbGF5IGZyYW1lCi0gICAgICAgICAgICAvLyBmcm9tIHRoZSBzZWxlY3RlZCByYXRpbyBvZiBzb3VyY2UgY3JvcCB0byBkaXNwbGF5IGZyYW1lLgotICAgICAgICAgICAgc2NEaW0gPSBId2NUZXN0RGltKHNjTWluLndpZHRoKCksIHNlbGVjdGVkLm51bWVyYXRvcigpKTsKLSAgICAgICAgICAgIGRmRGltID0gSHdjVGVzdERpbShkZk1pbi53aWR0aCgpLCBzZWxlY3RlZC5kZW5vbWluYXRvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlZSBpZiB0aGUgSFdDIHdpbGwgY29tbWl0IHRvIHRoaXMgY29tYmluYXRpb24KLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkZkRpbSwgc2NEaW0pOwotICAgICAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0gICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotCi0gICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRJKCIgIHNjSHNjYWxlIG51bTogJXUgc2NhbGU6ICVmIGRmRGltOiAlcyBzY0RpbTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBudW0sIChmbG9hdCkgUmF0aW9uYWwoc2NEaW0uaGVpZ2h0KCksIGRmRGltLmhlaWdodCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKChzdHJpbmcpIGRmRGltKS5jX3N0cigpLCAoKHN0cmluZykgc2NEaW0pLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChudW0gPT0gMSkgewotICAgICAgICAgICAgLy8gSFdDIGNvbW1pdHRlZCB0byB0aGUgY29tYmluYXRpb24KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGJlc3Qgc2NhbGUgZmFjdG9yIHNlZW4gc28gZmFyLiAgUmVwb3J0IHRoZQotICAgICAgICAgICAgLy8gZGltZW5zaW9ucyB0byB0aGUgY2FsbGVyLCBpbiBjYXNlIG5vdGhpbmcgYmV0dGVyIGlzIHNlZW4uCi0gICAgICAgICAgICBvdXRCZXN0RGYgPSBkZkRpbTsKLSAgICAgICAgICAgIG91dEJlc3RTYyA9IHNjRGltOwotCi0gICAgICAgICAgICAvLyBTdWNjZXNzIG9uIHRoZSBmaXJzdCBwYXNzIG1lYW5zIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHNjYWxlCi0gICAgICAgICAgICAvLyBpcyBzdXBwb3J0ZWQsIGluIHdoaWNoIGNhc2Ugbm8gbmVlZCB0byBzZWFyY2ggYW55IGZ1cnRoZXIuCi0gICAgICAgICAgICBpZiAoZmlyc3RQYXNzKSB7IHJldHVybiBSYXRpb25hbChzY0RpbS5oZWlnaHQoKSwgZGZEaW0uaGVpZ2h0KCkpOyB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGJpbmFyeSBzZWFyY2gKLSAgICAgICAgICAgIGJlc3QgPSBSYXRpb25hbChzY0RpbS5oZWlnaHQoKSwgZGZEaW0uaGVpZ2h0KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSFdDIGRpZG4ndCBjb21taXQgdG8gdGhpcyBjb21iaW5hdGlvbiwgc28gdXBkYXRlIHRoZQotICAgICAgICAgICAgLy8gdXBwZXIgYm91bmQgb2YgdGhlIGJpbmFyeSBzZWFyY2guCi0gICAgICAgICAgICBtaW5CYWQgPSBSYXRpb25hbChzY0RpbS5oZWlnaHQoKSwgZGZEaW0uaGVpZ2h0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlyc3RQYXNzID0gZmFsc2U7Ci0gICAgfSB3aGlsZSAoYmVzdCAhPSBtaW5CYWQpOwotCi0gICAgcmV0dXJuIGJlc3Q7Ci19Ci0KLXVpbnQzMl90IG51bU92ZXJsYXBwaW5nKHVpbnQzMl90IGJhY2tncm91bmRGb3JtYXQsIHVpbnQzMl90IGZvcmVncm91bmRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYWNrZ3JvdW5kQmxlbmQsIHVpbnQzMl90IGZvcmVncm91bmRCbGVuZCkKLXsKLSAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0KLSAgICBSZWN0YW5nbGUgYmFja2dyb3VuZChiYWNrZ3JvdW5kRm9ybWF0LCBzdGFydERpbSwgc3RhcnREaW0pOwotICAgIGJhY2tncm91bmQuYmxlbmQgPSBiYWNrZ3JvdW5kQmxlbmQ7Ci0gICAgcmVjdExpc3QucHVzaF9iYWNrKGJhY2tncm91bmQpOwotCi0gICAgLy8gVE9ETzogSGFuZGxlIGNhc2VzIHdoZXJlIHN0YXJ0RGltIGlzIHNvIHNtYWxsIHRoYXQgYWRkaW5nIDUKLSAgICAvLyAgICAgICBjYXVzZXMgZnJhbWVzIG5vdCB0byBvdmVybGFwLgotICAgIC8vIFRPRE86IEhhbmRsZSBjYXNlcyB3aGVyZSBzdGFydERpbSBpcyBzbyBsYXJnZSB0aGF0IGFkZGluZyA1Ci0gICAgLy8gICAgICAgY2F1c2UgYSBwb3J0aW9uIG9yIGFsbCBvZiB0aGUgZm9yZWdyb3VuZCBkaXNwbGF5RnJhbWUKLSAgICAvLyAgICAgICB0byBiZSBvZmYgdGhlIGRpc3BsYXkuCi0gICAgUmVjdGFuZ2xlIGZvcmVncm91bmQoZm9yZWdyb3VuZEZvcm1hdCwgc3RhcnREaW0sIHN0YXJ0RGltKTsKLSAgICBmb3JlZ3JvdW5kLmRpc3BsYXlGcmFtZS5sZWZ0ICs9IDU7Ci0gICAgZm9yZWdyb3VuZC5kaXNwbGF5RnJhbWUudG9wICs9IDU7Ci0gICAgZm9yZWdyb3VuZC5kaXNwbGF5RnJhbWUucmlnaHQgKz0gNTsKLSAgICBmb3JlZ3JvdW5kLmRpc3BsYXlGcmFtZS5ib3R0b20gKz0gNTsKLSAgICBiYWNrZ3JvdW5kLmJsZW5kID0gZm9yZWdyb3VuZEJsZW5kOwotICAgIHJlY3RMaXN0LnB1c2hfYmFjayhmb3JlZ3JvdW5kKTsKLQotICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLQotICAgIHJldHVybiBudW07Ci19Ci0KLVJlY3RhbmdsZTo6UmVjdGFuZ2xlKHVpbnQzMl90IGdyYXBoaWNGb3JtYXQsIEh3Y1Rlc3REaW0gZGZEaW0sCi0gICAgICAgICAgICAgICAgICAgICBId2NUZXN0RGltIHNEaW0pIDoKLSAgICBmb3JtYXQoZ3JhcGhpY0Zvcm1hdCksIHRyYW5zZm9ybShkZWZhdWx0VHJhbnNmb3JtKSwKLSAgICBibGVuZChkZWZhdWx0QmxlbmQpLCBjb2xvcihkZWZhdWx0Q29sb3IpLCBhbHBoYShkZWZhdWx0QWxwaGEpLAotICAgIHNvdXJjZUNyb3Aoc0RpbSksIGRpc3BsYXlGcmFtZShkZkRpbSkKLXsKLSAgICAvLyBTZXQgc291cmNlIGRpbWVuc2lvbgotICAgIC8vIENhbid0IHVzZSBhIGJhc2UgaW5pdGlhbGl6ZXIsIGJlY2F1c2UgdGhlIHNldHRpbmcgb2YgZm9ybWF0Ci0gICAgLy8gbXVzdCBiZSBkb25lIGJlZm9yZSBzZXR0aW5nIHRoZSBzb3VyY2VEaW1lbnNpb24uCi0gICAgc2V0U291cmNlRGltKHNEaW0pOwotfQotCi12b2lkIFJlY3RhbmdsZTo6c2V0U291cmNlRGltKEh3Y1Rlc3REaW0gZGltKQotewotICAgIHRoaXMtPnNvdXJjZURpbSA9IGRpbTsKLQotICAgIGNvbnN0IHN0cnVjdCBod2NUZXN0R3JhcGhpY0Zvcm1hdCAqYXR0cmliOwotICAgIGF0dHJpYiA9IGh3Y1Rlc3RHcmFwaGljRm9ybWF0TG9va3VwKHRoaXMtPmZvcm1hdCk7Ci0gICAgaWYgKGF0dHJpYiAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzb3VyY2VEaW0ud2lkdGgoKSAlIGF0dHJpYi0+d01vZCkgewotICAgICAgICAgICAgc291cmNlRGltLnNldFdpZHRoKHNvdXJjZURpbS53aWR0aCgpICsgYXR0cmliLT53TW9kCi0gICAgICAgICAgICAtIChzb3VyY2VEaW0ud2lkdGgoKSAlIGF0dHJpYi0+d01vZCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzb3VyY2VEaW0uaGVpZ2h0KCkgJSBhdHRyaWItPmhNb2QpIHsKLSAgICAgICAgICAgIHNvdXJjZURpbS5zZXRIZWlnaHQoc291cmNlRGltLmhlaWdodCgpICsgYXR0cmliLT5oTW9kCi0gICAgICAgICAgICAtIChzb3VyY2VEaW0uaGVpZ2h0KCkgJSBhdHRyaWItPmhNb2QpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gUmF0aW9uYWwgbWVtYmVyIGZ1bmN0aW9ucwotYm9vbCBSYXRpb25hbDo6b3BlcmF0b3I9PShjb25zdCBSYXRpb25hbCYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKCgodWludDY0X3QpIF9uICogb3RoZXIuX2QpCi0gICAgICAgID09ICgodWludDY0X3QpIF9kICogb3RoZXIuX24pKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmF0aW9uYWw6Om9wZXJhdG9yPChjb25zdCBSYXRpb25hbCYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKCgodWludDY0X3QpIF9uICogb3RoZXIuX2QpCi0gICAgICAgIDwgKCh1aW50NjRfdCkgX2QgKiBvdGhlci5fbikpIHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotUmF0aW9uYWw6Om9wZXJhdG9yIHN0cmluZygpIGNvbnN0Ci17Ci0gICAgb3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgICBvdXQgPDwgX24gPDwgJy8nIDw8IF9kOwotCi0gICAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotdm9pZCBSYXRpb25hbDo6ZG91YmxlMlJhdGlvbmFsKGRvdWJsZSBmLCBSYW5nZSBuUmFuZ2UsIFJhbmdlIGRSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgUmF0aW9uYWwmIGxvd2VyLCBSYXRpb25hbCYgdXBwZXIpCi17Ci0gICAgUmF0aW9uYWwgYmVzdExvd2VyKG5SYW5nZS5sb3dlcigpLCBkUmFuZ2UudXBwZXIoKSk7Ci0gICAgUmF0aW9uYWwgYmVzdFVwcGVyKG5SYW5nZS51cHBlcigpLCBkUmFuZ2UubG93ZXIoKSk7Ci0KLSAgICAvLyBTZWFyY2ggZm9yIGEgYmV0dGVyIHNvbHV0aW9uCi0gICAgZm9yICh1aW50MzJfdCBkID0gZFJhbmdlLmxvd2VyKCk7IGQgPD0gZFJhbmdlLnVwcGVyKCk7IGQrKykgewotICAgICAgICBSYXRpb25hbCB2YWwoZCAqIGYsIGQpOyAgLy8gTG93ZXIsIGJlY2F1c2UgZG91YmxlIHRvIGludCBjYXN0IHRydW5jYXRlcwotCi0gICAgICAgIGlmICgodmFsLm51bWVyYXRvcigpIDwgblJhbmdlLmxvd2VyKCkpCi0gICAgICAgICAgICB8fCAodmFsLm51bWVyYXRvcigpID4gblJhbmdlLnVwcGVyKCkpKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgICAgaWYgKCgoZG91YmxlKSB2YWwgPiAoZG91YmxlKSBiZXN0TG93ZXIpICYmICgoZG91YmxlKSB2YWwgPD0gZikpIHsKLSAgICAgICAgICAgIGJlc3RMb3dlciA9IHZhbDsKLSAgICAgICAgfSAKLQotICAgICAgICB2YWwuc2V0TnVtZXJhdG9yKHZhbC5udW1lcmF0b3IoKSArIDEpOwotICAgICAgICBpZiAodmFsLm51bWVyYXRvcigpID4gblJhbmdlLnVwcGVyKCkpIHsgY29udGludWU7IH0KLQotICAgICAgICBpZiAoKChkb3VibGUpIHZhbCA8IChkb3VibGUpIGJlc3RVcHBlcikgJiYgKChkb3VibGUpIHZhbCA+PSBmKSkgewotICAgICAgICAgICAgYmVzdFVwcGVyID0gdmFsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbG93ZXIgPSBiZXN0TG93ZXI7Ci0gICAgdXBwZXIgPSBiZXN0VXBwZXI7Ci19Ci0KLS8vIExvY2FsIGZ1bmN0aW9ucwotCi0vLyBOdW0gT3ZlcmxheXMKLS8vIEdpdmVuIGEgbGlzdCBvZiByZWN0YW5nbGVzLCBkZXRlcm1pbmUgaG93IG1hbnkgSFdDIHdpbGwgY29tbWl0IHRvIHJlbmRlcgotdWludDMyX3QgbnVtT3ZlcmxheXMobGlzdDxSZWN0YW5nbGU+JiByZWN0TGlzdCkKLXsKLSAgICBod2NfbGF5ZXJfbGlzdF90ICpod2NMaXN0OwotICAgIGxpc3Q8c3A8R3JhcGhpY0J1ZmZlcj4gPiBidWZmZXJzOwotCi0gICAgaHdjTGlzdCA9IGh3Y1Rlc3RDcmVhdGVMYXllckxpc3QocmVjdExpc3Quc2l6ZSgpKTsKLSAgICBpZiAoaHdjTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIm51bU92ZXJsYXlzIGNyZWF0ZSBod2NMaXN0IGZhaWxlZCIpOwotICAgICAgICBleGl0KDMwKTsKLSAgICB9Ci0KLSAgICBod2NfbGF5ZXJfdCAqbGF5ZXIgPSAmaHdjTGlzdC0+aHdMYXllcnNbMF07Ci0gICAgZm9yIChzdGQ6Omxpc3Q8UmVjdGFuZ2xlPjo6aXRlcmF0b3IgaXQgPSByZWN0TGlzdC5iZWdpbigpOwotICAgICAgICAgaXQgIT0gcmVjdExpc3QuZW5kKCk7ICsraXQsICsrbGF5ZXIpIHsKLSAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHRleHR1cmUgZm9yIHRoZSBzb3VyY2UgZnJhbWUKLSAgICAgICAgLy8gYW5kIHB1c2ggaXQgb250byB0aGUgYnVmZmVycyBsaXN0LCBzbyB0aGF0IGl0Ci0gICAgICAgIC8vIHN0YXlzIGluIHNjb3BlIHVudGlsIGEgcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbi4KLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gdGV4dHVyZTsKLSAgICAgICAgdGV4dHVyZSAgPSBuZXcgR3JhcGhpY0J1ZmZlcihpdC0+c291cmNlRGltLndpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNvdXJjZURpbS5oZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+Zm9ybWF0LCB0ZXhVc2FnZSk7Ci0gICAgICAgIGJ1ZmZlcnMucHVzaF9iYWNrKHRleHR1cmUpOwotCi0gICAgICAgIGxheWVyLT5oYW5kbGUgPSB0ZXh0dXJlLT5oYW5kbGU7Ci0gICAgICAgIGxheWVyLT5ibGVuZGluZyA9IGl0LT5ibGVuZDsKLSAgICAgICAgbGF5ZXItPnRyYW5zZm9ybSA9IGl0LT50cmFuc2Zvcm07Ci0gICAgICAgIGxheWVyLT5zb3VyY2VDcm9wID0gaXQtPnNvdXJjZUNyb3A7Ci0gICAgICAgIGxheWVyLT5kaXNwbGF5RnJhbWUgPSBpdC0+ZGlzcGxheUZyYW1lOwotCi0gICAgICAgIGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuLm51bVJlY3RzID0gMTsKLSAgICAgICAgbGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4ucmVjdHMgPSAmbGF5ZXItPmRpc3BsYXlGcmFtZTsKLSAgICB9Ci0KLSAgICAvLyBQZXJmb3JtIHByZXBhcmUgb3BlcmF0aW9uCi0gICAgaWYgKHZlcmJvc2UpIHsgdGVzdFByaW50SSgiUHJlcGFyZToiKTsgaHdjVGVzdERpc3BsYXlMaXN0KGh3Y0xpc3QpOyB9Ci0gICAgaHdjRGV2aWNlLT5wcmVwYXJlKGh3Y0RldmljZSwgaHdjTGlzdCk7Ci0gICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgdGVzdFByaW50SSgiUG9zdCBQcmVwYXJlOiIpOwotICAgICAgICBod2NUZXN0RGlzcGxheUxpc3RQcmVwYXJlTW9kaWZpYWJsZShod2NMaXN0KTsKLSAgICB9Ci0KLSAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIG92ZXJsYXlzCi0gICAgdWludDMyX3QgdG90YWwgPSAwOwotICAgIGZvciAodW5zaWduZWQgaW50IG4xID0gMDsgbjEgPCBod2NMaXN0LT5udW1Id0xheWVyczsgbjErKykgewotICAgICAgICBpZiAoaHdjTGlzdC0+aHdMYXllcnNbbjFdLmNvbXBvc2l0aW9uVHlwZSA9PSBIV0NfT1ZFUkxBWSkgewotICAgICAgICAgICAgdG90YWwrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEZyZWUgdGhlIGxheWVyIGxpc3QgYW5kIGdyYXBoaWMgYnVmZmVycwotICAgIGh3Y1Rlc3RGcmVlTGF5ZXJMaXN0KGh3Y0xpc3QpOwotCi0gICAgcmV0dXJuIHRvdGFsOwotfQotCi1zdHJpbmcgdHJhbnNmb3JtTGlzdDJzdHIoY29uc3QgbGlzdDx1aW50MzJfdD4mIHRyYW5zZm9ybUxpc3QpCi17Ci0gICAgb3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgICBmb3IgKGxpc3Q8dWludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHRyYW5zZm9ybUxpc3QuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHRyYW5zZm9ybUxpc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgdWludDMyX3QgaWQgPSAqaXQ7Ci0KLSAgICAgICAgaWYgKGl0ICE9IHRyYW5zZm9ybUxpc3QuYmVnaW4oKSkgewotICAgICAgICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IGlkOwotCi0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGlkeCA9IDA7IGlkeCA8IE5VTUEodHJhbnNmb3JtVHlwZSk7IGlkeCsrKSB7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gdHJhbnNmb3JtVHlwZVtpZHhdLmlkKSB7Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICIgKCIgPDwgdHJhbnNmb3JtVHlwZVtpZHhdLmRlc2MgPDwgJyknOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIGJsZW5kTGlzdDJzdHIoY29uc3QgbGlzdDx1aW50MzJfdD4mIGJsZW5kTGlzdCkKLXsKLSAgICBvc3RyaW5nc3RyZWFtIG91dDsKLQotICAgIGZvciAobGlzdDx1aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmxlbmRMaXN0LmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBibGVuZExpc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgdWludDMyX3QgaWQgPSAqaXQ7Ci0KLSAgICAgICAgaWYgKGl0ICE9IGJsZW5kTGlzdC5iZWdpbigpKSB7Ci0gICAgICAgICAgICBvdXQgPDwgIiwgIjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgaWQ7Ci0KLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaWR4ID0gMDsgaWR4IDwgTlVNQShibGVuZFR5cGUpOyBpZHgrKykgewotICAgICAgICAgICAgaWYgKGlkID09IGJsZW5kVHlwZVtpZHhdLmlkKSB7Ci0gICAgICAgICAgICAgICAgb3V0IDw8ICIgKCIgPDwgYmxlbmRUeXBlW2lkeF0uZGVzYyA8PCAnKSc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gb3V0LnN0cigpOwotfQotCi12b2lkIGluaXQodm9pZCkKLXsKLSAgICBzcmFuZDQ4KDApOwotCi0gICAgaHdjVGVzdEluaXREaXNwbGF5KHZlcmJvc2UsICZkcHksICZzdXJmYWNlLCAmd2lkdGgsICZoZWlnaHQpOwotCi0gICAgaHdjVGVzdE9wZW5Id2MoJmh3Y0RldmljZSk7Ci19Ci0KLXZvaWQgcHJpbnRGb3JtYXRIZWFkaW5ncyhzaXplX3QgaW5kZW50KQotewotICAgIGZvciAoc2l6ZV90IHJvdyA9IDA7IHJvdyA8PSBtYXhIZWFkaW5nTGVuOyByb3crKykgewotICAgICAgICBvc3RyaW5nc3RyZWFtIGxpbmU7Ci0gICAgICAgIGZvcih2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBmb3JtYXRzLmJlZ2luKCk7Ci0gICAgICAgICAgICBpdCAhPSBmb3JtYXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICBpZiAoKG1heEhlYWRpbmdMZW4gLSByb3cpIDw9IGl0LT5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIGlmIChyb3cgIT0gbWF4SGVhZGluZ0xlbikgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gKCppdClbaXQtPmxlbmd0aCgpIC0gKG1heEhlYWRpbmdMZW4gLSByb3cpXTsKLSAgICAgICAgICAgICAgICAgICAgbGluZSA8PCAnICcgPDwgc2V0dyhwcmludEZpZWxkV2lkdGgpIDw8IGNoOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPDwgJyAnIDw8IHN0cmluZyhwcmludEZpZWxkV2lkdGgsICctJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIGxpbmUgPDwgJyAnIDw8IHNldHcocHJpbnRGaWVsZFdpZHRoKSA8PCAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0ZXN0UHJpbnRJKCIlKnMlcyIsIGluZGVudCArIG1heEhlYWRpbmdMZW4sICIiLAotICAgICAgICAgICAgICAgICAgIGxpbmUuc3RyKCkuY19zdHIoKSk7Ci0gICAgfQotfQotCi12b2lkIHByaW50T3ZlcmxhcExpbmUoc2l6ZV90IGluZGVudCwgY29uc3Qgc3RyaW5nIGZvcm1hdFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx1aW50MzJfdD4mIHJlc3VsdHMpCi17Ci0gICAgb3N0cmluZ3N0cmVhbSBsaW5lOwotCi0gICAgbGluZSA8PCBzZXR3KGluZGVudCArIG1heEhlYWRpbmdMZW4gLSBmb3JtYXRTdHIubGVuZ3RoKCkpIDw8ICIiOwotCi0gICAgbGluZSA8PCBmb3JtYXRTdHI7Ci0KLSAgICBmb3IgKHZlY3Rvcjx1aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVzdWx0cy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gcmVzdWx0cy5lbmQoKTsgKytpdCkgewotICAgICAgICBsaW5lIDw8ICcgJyA8PCBzZXR3KHByaW50RmllbGRXaWR0aCkgPDwgKml0OwotICAgIH0KLQotICAgIHRlc3RQcmludEkoIiVzIiwgbGluZS5zdHIoKS5jX3N0cigpKTsKLX0KLQotdm9pZCBwcmludFN5bnRheChjb25zdCBjaGFyICpjbWQpCi17Ci0gICAgdGVzdFByaW50RSgiICAlcyBbb3B0aW9uc10gW2dyYXBoaWNGb3JtYXRdIC4uLiIsCi0gICAgICAgICAgICAgICBjbWQpOwotICAgIHRlc3RQcmludEUoIiAgICBvcHRpb25zOiIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIC1zIFt3aWR0aCwgaGVpZ2h0XSAtIHN0YXJ0IGRpbWVuc2lvbiIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIC12IC0gVmVyYm9zZSIpOwotICAgIHRlc3RQcmludEUoIiIpOwotICAgIHRlc3RQcmludEUoIiAgICBncmFwaGljIGZvcm1hdHM6Iik7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgbjEgPSAwOyBuMSA8IE5VTUEoaHdjVGVzdEdyYXBoaWNGb3JtYXQpOyBuMSsrKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIiAgICAgICVzIiwgaHdjVGVzdEdyYXBoaWNGb3JtYXRbbjFdLmRlc2MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9od2MvaHdjUmVjdHMuY3BwIGIvb3BlbmdsL3Rlc3RzL2h3Yy9od2NSZWN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNmMxNjkuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2h3Yy9od2NSZWN0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBIYXJkd2FyZSBDb21wb3NlciBSZWN0YW5nbGVzCi0gKgotICogU3lub3BzaXMKLSAqICAgaHdjUmVjdHMgW29wdGlvbnNdIChncmFwaGljRm9ybWF0IGRpc3BsYXlGcmFtZSBbYXR0cmlidXRlc10sKS4uLgotICogICAgIG9wdGlvbnM6Ci0gKiAgICAgICAtRCAjLiMjIC0gRW5kIG9mIHRlc3QgZGVsYXkKLSAqICAgICAgIC12IC0gVmVyYm9zZQotICoKLSAqICAgICAgZ3JhcGhpYyBmb3JtYXRzOgotICogICAgICAgIFJHQkE4ODg4IChyZWZlcmVuY2UgZnJhbWUgZGVmYXVsdCkKLSAqICAgICAgICBSR0JYODg4OAotICogICAgICAgIFJHQjg4OAotICogICAgICAgIFJHQjU2NQotICogICAgICAgIEJHUkE4ODg4Ci0gKiAgICAgICAgUkdCQTU1NTEKLSAqICAgICAgICBSR0JBNDQ0NAotICogICAgICAgIFlWMTIKLSAqCi0gKiAgICAgIGRpc3BsYXlGcmFtZQotICogICAgICAgIFtsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b21dCi0gKgotICogICAgICBhdHRyaWJ1dGVzOgotICogICAgICAgIHRyYW5zZm9ybTogbm9uZSB8IGZsaXBoIHwgZmxpcHYgfCByb3Q5MCB8IHJvdDE4MCB8IHJvdDI3MAotICogICAgICAgIGJsZW5kOiBub25lIHwgcHJlbXVsdCB8IGNvdmVyYWdlCi0gKiAgICAgICAgY29sb3I6IFswLiMjLCAwLiMjLCAwLiMjXQotICogICAgICAgIGFscGhhOiAwLiMjCi0gKiAgICAgICAgc291cmNlRGltOiBbd2lkdGgsIGhlaWdodF0KLSAqICAgICAgICBzb3VyY2VDcm9wOiBbbGVmdCwgdG9wLCByaWdodCwgYm90dG9tXQotICoKLSAqICAgICAgRXhhbXBsZToKLSAqICAgICAgICAjIFdoaXRlIFlWMTIgcmVjdGFuZ2xlLCB3aXRoIG92ZXJsYXBwaW5nIHR1cnF1b2lzZQotICogICAgICAgICMgIFJHQkE4ODg4IHJlY3RhbmdsZSBhdCAzMCUlIChhbHBoYTogMC43KSB0cmFuc3BhcmVuY3kKLSAqICAgICAgICBod2NSZWN0cyAtdiAtRCAzMC4wIFwKLSAqICAgICAgICAgIFlWMTIgWzUwLCA4MCwgMjAwLCAzMDBdIHRyYW5zZm9ybTogbm9uZSBcCi0gKiAgICAgICAgICAgIGNvbG9yOiBbMS4wLCAwLjUsIDAuNV0sIFwKLSAqICAgICAgICAgIFJHQkE4ODg4IFsxMDAsIDE1MCwgMzAwLCA0MDBdIGJsZW5kOiBjb3ZlcmFnZSBcCi0gKiAgICAgICAgICAgIGNvbG9yOiBbMC4yNTEsIDAuODc4LCAwLjgxNl0gYWxwaGE6IDAuNyBcCi0gKiAgICAgICAgICAgIHNvdXJjZURpbTogWzUwLCA2MF0gc291cmNlQ3JvcDogWzUsIDgsIDEyLCAxNV0KLSAqCi0gKiBEZXNjcmlwdGlvbgotICogICBDb25zdHJ1Y3RzIGEgSGFyZHdhcmUgQ29tcG9zZXIgKEhXQykgbGlzdCBvZiBmcmFtZXMgZnJvbQotICogICBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuICBUaGVuIHNlbmRzIGl0IHRvIHRoZSBIV0MKLSAqICAgYmUgcmVuZGVyZWQuICBUaGUgaW50ZW5kZWQgcHVycG9zZSBvZiB0aGlzIHRvb2wgaXMgYXMgYSBtZWFucyB0bwotICogICByZXByb2R1Y2UgYW5kIHN1Y2NpbmN0bHkgc3BlY2lmeSBhbiBvYnNlcnZlZCBIV0Mgb3BlcmF0aW9uLCB3aXRoCi0gKiAgIG5vIG5lZWQgdG8gbW9kaWZ5L2NvbXBpbGUgYSBwcm9ncmFtLgotICoKLSAqICAgVGhlIGNvbW1hbmQtbGluZSBzeW50YXggY29uc2lzdHMgb2YgYSBmZXcgc3RhbmRhcmQgY29tbWFuZC1saW5lCi0gKiAgIG9wdGlvbnMgYW5kIHRoZW4gYSBkZXNjcmlwdGlvbiBvZiBvbmUgb3IgbW9yZSBmcmFtZXMuICBUaGUgZnJhbWUKLSAqICAgZGVzY3JpcHRpb25zIGFyZSBzZXBhcmF0ZWQgZnJvbSBvbmUgYW5vdGhlciB2aWEgYSBjb21tYS4gIFRoZQotICogICBiZWdpbm5pbmcgb2YgYSBmcmFtZSBkZXNjcmlwdGlvbiByZXF1aXJlcyB0aGUgc3BlY2lmaWNhdGlvbgotICogICBvZiB0aGUgZ3JhcGhpYyBmb3JtYXQgYW5kIHRoZW4gdGhlIGRpc3BsYXkgZnJhbWUgcmVjdGFuZ2xlIHdoZXJlCi0gKiAgIHRoZSBmcmFtZSB3aWxsIGJlIGRpc3BsYXllZC4gIFRoZSBkaXNwbGF5IGZyYW1lIHJlY3RhbmdsZSBpcwotICogICBzcGVjaWZpZWQgYXMgZm9sbG93cywgd2l0aCB0aGUgcmlnaHQgYW5kIGJvdHRvbSBjb29yZGluYXRlcyBiZWluZwotICogICBleGNsdXNpdmUgdmFsdWVzOgotICoKLSAqICAgICBbbGVmdCwgdG9wLCByaWdodCwgYm90dG9tXQotICogICAgCi0gKiAgIEFmdGVyIHRoZXNlIHR3byByZXF1aXJlZCBwYXJhbWV0ZXJzIGVhY2ggZnJhbWUgZGVzY3JpcHRpb24gY2FuCi0gKiAgIHNwZWNpZnkgMSBvciBtb3JlIG9wdGlvbmFsIGF0dHJpYnV0ZXMuICBUaGUgbmFtZSBvZiBlYWNoIG9wdGlvbmFsCi0gKiAgIGF0dHJpYnV0ZSBpcyBwcmVjZWRlZCBieSBhIGNvbG9uLiAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KLSAqICAgdGhlbiByZXF1aXJlcyB3aGl0ZSBzcGFjZSBhZnRlciB0aGUgY29sb24gYW5kIHRoZW4gdGhlIHZhbHVlIG9mCi0gKiAgIHRoZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLiAgU2VlIHRoZSBzeW5vcHNpcyBzZWN0aW9uIGFib3ZlIGZvcgotICogICBhIGxpc3Qgb2YgYXR0cmlidXRlcyBhbmQgdGhlIGZvcm1hdCBvZiB0aGVpciBleHBlY3RlZCB2YWx1ZS4KLSAqLwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGN0aW1lPgotI2luY2x1ZGUgPGlzdHJlYW0+Ci0jaW5jbHVkZSA8bGliZ2VuLmg+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiaHdjUmVjdHNUZXN0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHRlc3RVdGlsLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9od2NvbXBvc2VyLmg+Ci0KLSNpbmNsdWRlIDxnbFRlc3RMaWIuaD4KLSNpbmNsdWRlICJod2NUZXN0TGliLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotLy8gRGVmYXVsdHMKLWNvbnN0IGJvb2wgZGVmYXVsdFZlcmJvc2UgPSBmYWxzZTsKLWNvbnN0IGZsb2F0IGRlZmF1bHRFbmREZWxheSA9IDIuMDsgLy8gRGVmYXVsdCBkZWxheSBhZnRlciByZW5kZXJpbmcgZ3JhcGhpY3MKLQotY29uc3QgdWludDMyX3QgICBkZWZhdWx0Rm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7Ci1jb25zdCBpbnQzMl90ICAgIGRlZmF1bHRUcmFuc2Zvcm0gPSAwOwotY29uc3QgdWludDMyX3QgICBkZWZhdWx0QmxlbmQgPSBIV0NfQkxFTkRJTkdfTk9ORTsKLWNvbnN0IENvbG9yRnJhY3QgZGVmYXVsdENvbG9yKDAuNSwgMC41LCAwLjUpOwotY29uc3QgZmxvYXQgICAgICBkZWZhdWx0QWxwaGEgPSAxLjA7IC8vIE9wYXF1ZQotY29uc3QgSHdjVGVzdERpbSBkZWZhdWx0U291cmNlRGltKDEsIDEpOwotY29uc3Qgc3RydWN0IGh3Y19yZWN0IGRlZmF1bHRTb3VyY2VDcm9wID0gezAsIDAsIDEsIDF9OwotY29uc3Qgc3RydWN0IGh3Y19yZWN0IGRlZmF1bHREaXNwbGF5RnJhbWUgPSB7MCwgMCwgMTAwLCAxMDB9OwotCi0vLyBEZWZpbmVzCi0jZGVmaW5lIE1BWENNRCAgICAgICAgICAgICAgIDIwMAotI2RlZmluZSBDTURfU1RPUF9GUkFNRVdPUksgICAic3RvcCAyPiYxIgotI2RlZmluZSBDTURfU1RBUlRfRlJBTUVXT1JLICAic3RhcnQgMj4mMSIKLQotLy8gTWFjcm9zCi0jZGVmaW5lIE5VTUEoYSkgKHNpemVvZihhKSAvIHNpemVvZihhIFswXSkpIC8vIE51bSBlbGVtZW50cyBpbiBhbiBhcnJheQotCi0vLyBMb2NhbCB0eXBlcwotY2xhc3MgUmVjdGFuZ2xlIHsKLXB1YmxpYzoKLSAgICBSZWN0YW5nbGUoKSA6IGZvcm1hdChkZWZhdWx0Rm9ybWF0KSwgdHJhbnNmb3JtKGRlZmF1bHRUcmFuc2Zvcm0pLAotICAgICAgICAgICAgICAgICAgYmxlbmQoZGVmYXVsdEJsZW5kKSwgY29sb3IoZGVmYXVsdENvbG9yKSwKLSAgICAgICAgICAgICAgICAgIGFscGhhKGRlZmF1bHRBbHBoYSksIHNvdXJjZURpbShkZWZhdWx0U291cmNlRGltKSwKLSAgICAgICAgICAgICAgICAgIHNvdXJjZUNyb3AoZGVmYXVsdFNvdXJjZUNyb3ApLAotICAgICAgICAgICAgICAgICAgZGlzcGxheUZyYW1lKGRlZmF1bHREaXNwbGF5RnJhbWUpIHt9OwotCi0gICAgdWludDMyX3QgICAgIGZvcm1hdDsKLSAgICB1aW50MzJfdCAgICAgdHJhbnNmb3JtOwotICAgIGludDMyX3QgICAgICBibGVuZDsKLSAgICBDb2xvckZyYWN0ICAgY29sb3I7Ci0gICAgZmxvYXQgICAgICAgIGFscGhhOwotICAgIEh3Y1Rlc3REaW0gICBzb3VyY2VEaW07Ci0gICAgc3RydWN0IGh3Y19yZWN0ICAgc291cmNlQ3JvcDsKLSAgICBzdHJ1Y3QgaHdjX3JlY3QgICBkaXNwbGF5RnJhbWU7Ci0KLSAgICBzcDxHcmFwaGljQnVmZmVyPiB0ZXh0dXJlOwotfTsKLQotLy8gR2xvYmFscwotbGlzdDxSZWN0YW5nbGU+IHJlY3RhbmdsZTsKLXN0YXRpYyBjb25zdCBpbnQgdGV4VXNhZ2UgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFIHwKLSAgICAgICAgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfV1JJVEVfUkFSRUxZOwotc3RhdGljIGh3Y19jb21wb3Nlcl9kZXZpY2VfdCAqaHdjRGV2aWNlOwotc3RhdGljIEVHTERpc3BsYXkgZHB5Owotc3RhdGljIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLXN0YXRpYyBFR0xpbnQgd2lkdGgsIGhlaWdodDsKLQotLy8gRnVuY3Rpb24gcHJvdG90eXBlcwotc3RhdGljIFJlY3RhbmdsZSBwYXJzZVJlY3Qoc3RyaW5nIHJlY3RTdHIpOwotdm9pZCBpbml0KHZvaWQpOwotdm9pZCBwcmludFN5bnRheChjb25zdCBjaGFyICpjbWQpOwotCi0vLyBDb21tYW5kLWxpbmUgb3B0aW9uIHNldHRpbmdzCi1zdGF0aWMgYm9vbCB2ZXJib3NlID0gZGVmYXVsdFZlcmJvc2U7Ci1zdGF0aWMgZmxvYXQgZW5kRGVsYXkgPSBkZWZhdWx0RW5kRGVsYXk7Ci0KLS8qCi0gKiBNYWluCi0gKgotICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyBoaWdoLWxldmVsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnM6Ci0gKgotICogICAxLiBQYXJzZSBjb21tYW5kLWxpbmUgb3B0aW9ucwotICoKLSAqICAgMi4gU3RvcCBmcmFtZXdvcmsKLSAqCi0gKiAgIDMuIEluaXRpYWxpemF0aW9uCi0gKgotICogICA0LiBQYXJzZSBmcmFtZSBkZXNjcmlwdGlvbnMKLSAqCi0gKiAgIDUuIENyZWF0ZSBIV0MgbGlzdCBmcm9tIGZyYW1lIGRlc2NyaXB0aW9ucwotICoKLSAqICAgNi4gSGF2ZSBIV0MgcmVuZGVyIHRoZSBsaXN0IGRlc2NyaXB0aW9uIG9mIHRoZSBmcmFtZXMKLSAqCi0gKiAgIDcuIERlbGF5IGZvciBhbW91bnQgb2YgdGltZSBnaXZlbiBieSBlbmREZWxheQotICoKLSAqICAgOC4gU3RhcnQgZnJhbWV3b3JrCi0gKi8KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIGludCAgICAgcnYsIG9wdDsKLSAgICBjaGFyICAgKmNocHRyOwotICAgIGJvb2wgICAgZXJyb3I7Ci0gICAgc3RyaW5nICBzdHI7Ci0gICAgY2hhciBjbWRbTUFYQ01EXTsKLQotICAgIHRlc3RTZXRMb2dDYXRUYWcoTE9HX1RBRyk7Ci0KLSAgICAvLyBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgIkQ6dj9oIikpICE9IC0xKSB7Ci0gICAgICAgIHN3aXRjaCAob3B0KSB7Ci0gICAgICAgICAgY2FzZSAnRCc6IC8vIEVuZCBvZiB0ZXN0IGRlbGF5Ci0gICAgICAgICAgICBlbmREZWxheSA9IHN0cnRvZChvcHRhcmcsICZjaHB0cik7Ci0gICAgICAgICAgICBpZiAoKCpjaHB0ciAhPSAnXDAnKSB8fCAoZW5kRGVsYXkgPCAwLjApKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIGVuZCBvZiB0ZXN0IGRlbGF5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZjogJXMiLCBvcHRhcmcpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ3YnOiAvLyBWZXJib3NlCi0gICAgICAgICAgICB2ZXJib3NlID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAnaCc6IC8vIEhlbHAKLSAgICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcHJpbnRTeW50YXgoYmFzZW5hbWUoYXJndlswXSkpOwotICAgICAgICAgICAgZXhpdCgoKG9wdG9wdCA9PSAwKSB8fCAob3B0b3B0ID09ICc/JykpID8gMCA6IDIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU3RvcCBmcmFtZXdvcmsKLSAgICBydiA9IHNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksICIlcyIsIENNRF9TVE9QX0ZSQU1FV09SSyk7Ci0gICAgaWYgKHJ2ID49IChzaWduZWQpIHNpemVvZihjbWQpIC0gMSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJDb21tYW5kIHRvbyBsb25nIGZvcjogJXMiLCBDTURfU1RPUF9GUkFNRVdPUkspOwotICAgICAgICBleGl0KDMpOwotICAgIH0KLSAgICB0ZXN0RXhlY0NtZChjbWQpOwotICAgIHRlc3REZWxheSgxLjApOyAvLyBUT0RPIC0gbmVlZHMgbWVhbnMgdG8gcXVlcnkgd2hldGhlciBhc3luY3Jvbm91cyBzdG9wCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyYW1ld29yayBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4gIEZvciBub3csIGp1c3Qgd2FpdAotICAgICAgICAgICAgICAgICAgICAvLyBhIGxvbmcgdGltZS4KLQotICAgIGluaXQoKTsKLQotICAgIC8vIFBhcnNlIHJlY3RhbmdsZSBkZXNjcmlwdGlvbnMKLSAgICBpbnQgbnVtT3BlbiA9IDA7IC8vIEN1cnJlbnQgbnVtYmVyIG9mIHVubWF0Y2hlZCA8WwotICAgIHN0cmluZyByZWN0RGVzYygiIik7IC8vIFN0cmluZyBkZXNjcmlwdGlvbiBvZiBhIHNpbmdsZSByZWN0YW5nbGUKLSAgICB3aGlsZSAob3B0aW5kIDwgYXJnYykgewotICAgICAgICBzdHJpbmcgYXJnTmV4dCA9IHN0cmluZyhhcmd2W29wdGluZCsrXSk7Ci0KLSAgICAgICAgaWYgKHJlY3REZXNjLmxlbmd0aCgpKSB7IHJlY3REZXNjICs9ICcgJzsgfQotICAgICAgICByZWN0RGVzYyArPSBhcmdOZXh0OwotCi0gICAgICAgIC8vIENvdW50IG51bWJlciBvZiBvcGVuaW5nIDxbIGFuZCBtYXRjaGluZyA+XQotICAgICAgICAvLyBBdCB0aGlzIHBvaW50IG5vdCB3b3JyaWVkIGFib3V0IGFuIG9wZW5pbmcgY2hhcmFjdGVyIGJlaW5nCi0gICAgICAgIC8vIG1hdGNoZWQgYnkgaXQncyBjb3JyZXNwb25kaW5nIGNsb3NpbmcgY2hhcmFjdGVyLiAgRm9yIGV4YW1wbGUsCi0gICAgICAgIC8vICI8MS4wLCAyLjBdIiBpcyBpbmNvcnJlY3QgYmVjYXVzZSB0aGUgb3BlbmluZyA8IHNob3VsZCBiZSBtYXRjaGVkCi0gICAgICAgIC8vIHdpdGggYSBjbG9zaW5nID4sIGluc3RlYWQgb2YgdGhlIGNsb3NpbmcgXS4gIFN1Y2ggZXJyb3JzIGFyZQotICAgICAgICAvLyBkZXRlY3RlZCB3aGVuIHRoZSBhY3R1YWwgdmFsdWUgaXMgcGFyc2VkLgotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBuMSA9IDA7IG4xIDwgYXJnTmV4dC5sZW5ndGgoKTsgbjErKykgewotICAgICAgICAgICAgc3dpdGNoKGFyZ05leHRbbjFdKSB7Ci0gICAgICAgICAgICAgIGNhc2UgJ1snOgotICAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICBudW1PcGVuKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSAnXSc6Ci0gICAgICAgICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgICAgICAgIG51bU9wZW4tLTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRXJyb3IgYW55dGltZSB0aGVyZSBpcyBtb3JlIGNsb3NpbmcgdGhlbiBvcGVuaW5nIGNoYXJhY3RlcnMKLSAgICAgICAgICAgIGlmIChudW1PcGVuIDwgMCkgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEkoIk1pc21hdGNoZWQgbnVtYmVyIG9mIG9wZW5pbmcgPFsgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xvc2luZyA+XSBpbjogJXMiLCByZWN0RGVzYy5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBleGl0KDQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGVzY3JpcHRpb24gb2YgYSByZWN0YW5nbGUgaXMgY29tcGxldGUgd2hlbiBhbGwgb3BlbmluZwotICAgICAgICAvLyA8WyBhcmUgY2xvc2VkIHdpdGggPl0gYW5kIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGEgY29tbWEgb3IKLSAgICAgICAgLy8gdGhlcmUgYXJlIG5vIG1vcmUgYXJncy4KLSAgICAgICAgaWYgKChudW1PcGVuID09IDApICYmIHJlY3REZXNjLmxlbmd0aCgpCi0gICAgICAgICAgICAmJiAoKHJlY3REZXNjW3JlY3REZXNjLmxlbmd0aCgpIC0gMV0gPT0gJywnKQotICAgICAgICAgICAgICAgIHx8IChvcHRpbmQgPT0gYXJnYykpKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmUgdHJhaWxpbmcgY29tbWEgaWYgaXQgaXMgcHJlc2VudAotICAgICAgICAgICAgaWYgKHJlY3REZXNjW3JlY3REZXNjLmxlbmd0aCgpIC0gMV0gPT0gJywnKSB7Ci0gICAgICAgICAgICAgICAgcmVjdERlc2MuZXJhc2UocmVjdERlc2MubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUGFyc2Ugc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHJlY3RhbmdsZQotICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBwYXJzZVJlY3QocmVjdERlc2MpOwotCi0gICAgICAgICAgICAvLyBBZGQgdG8gdGhlIGxpc3Qgb2YgcmVjdGFuZ2xlcwotICAgICAgICAgICAgcmVjdGFuZ2xlLnB1c2hfYmFjayhyZWN0KTsKLQotICAgICAgICAgICAgLy8gUHJlcGFyZSBmb3IgZGVzY3JpcHRpb24gb2YgYW5vdGhlciByZWN0YW5nbGUKLSAgICAgICAgICAgIHJlY3REZXNjID0gc3RyaW5nKCIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENyZWF0ZSBsaXN0IG9mIGZyYW1lcwotICAgIGh3Y19sYXllcl9saXN0X3QgKmxpc3Q7Ci0gICAgbGlzdCA9IGh3Y1Rlc3RDcmVhdGVMYXllckxpc3QocmVjdGFuZ2xlLnNpemUoKSk7Ci0gICAgaWYgKGxpc3QgPT0gTlVMTCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJod2NUZXN0Q3JlYXRlTGF5ZXJMaXN0IGZhaWxlZCIpOwotICAgICAgICBleGl0KDUpOwotICAgIH0KLQotICAgIGh3Y19sYXllcl90ICpsYXllciA9ICZsaXN0LT5od0xheWVyc1swXTsKLSAgICBmb3IgKHN0ZDo6bGlzdDxSZWN0YW5nbGU+OjppdGVyYXRvciBpdCA9IHJlY3RhbmdsZS5iZWdpbigpOwotICAgICAgICAgaXQgIT0gcmVjdGFuZ2xlLmVuZCgpOyArK2l0LCArK2xheWVyKSB7Ci0gICAgICAgIGxheWVyLT5oYW5kbGUgPSBpdC0+dGV4dHVyZS0+aGFuZGxlOwotICAgICAgICBsYXllci0+YmxlbmRpbmcgPSBpdC0+YmxlbmQ7Ci0gICAgICAgIGxheWVyLT50cmFuc2Zvcm0gPSBpdC0+dHJhbnNmb3JtOwotICAgICAgICBsYXllci0+c291cmNlQ3JvcCA9IGl0LT5zb3VyY2VDcm9wOwotICAgICAgICBsYXllci0+ZGlzcGxheUZyYW1lID0gaXQtPmRpc3BsYXlGcmFtZTsKLQotICAgICAgICBsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbi5udW1SZWN0cyA9IDE7Ci0gICAgICAgIGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuLnJlY3RzID0gJmxheWVyLT5kaXNwbGF5RnJhbWU7Ci0gICAgfQotCi0gICAgLy8gUGVyZm9ybSBwcmVwYXJlIG9wZXJhdGlvbgotICAgIGlmICh2ZXJib3NlKSB7IHRlc3RQcmludEkoIlByZXBhcmU6Iik7IGh3Y1Rlc3REaXNwbGF5TGlzdChsaXN0KTsgfQotICAgIGh3Y0RldmljZS0+cHJlcGFyZShod2NEZXZpY2UsIGxpc3QpOwotICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgIHRlc3RQcmludEkoIlBvc3QgUHJlcGFyZToiKTsKLSAgICAgICAgaHdjVGVzdERpc3BsYXlMaXN0UHJlcGFyZU1vZGlmaWFibGUobGlzdCk7Ci0gICAgfQotCi0gICAgLy8gVHVybiBvZmYgdGhlIGdlb21ldHJ5IGNoYW5nZWQgZmxhZwotICAgIGxpc3QtPmZsYWdzICY9IH5IV0NfR0VPTUVUUllfQ0hBTkdFRDsKLQotICAgIC8vIFBlcmZvcm0gdGhlIHNldCBvcGVyYXRpb24ocykKLSAgICBpZiAodmVyYm9zZSkge3Rlc3RQcmludEkoIlNldDoiKTsgfQotICAgIGlmICh2ZXJib3NlKSB7IGh3Y1Rlc3REaXNwbGF5TGlzdEhhbmRsZXMobGlzdCk7IH0KLSAgICBod2NEZXZpY2UtPnNldChod2NEZXZpY2UsIGRweSwgc3VyZmFjZSwgbGlzdCk7Ci0KLSAgICB0ZXN0RGVsYXkoZW5kRGVsYXkpOwotCi0gICAgLy8gU3RhcnQgZnJhbWV3b3JrCi0gICAgcnYgPSBzbnByaW50ZihjbWQsIHNpemVvZihjbWQpLCAiJXMiLCBDTURfU1RBUlRfRlJBTUVXT1JLKTsKLSAgICBpZiAocnYgPj0gKHNpZ25lZCkgc2l6ZW9mKGNtZCkgLSAxKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkNvbW1hbmQgdG9vIGxvbmcgZm9yOiAlcyIsIENNRF9TVEFSVF9GUkFNRVdPUkspOwotICAgICAgICBleGl0KDYpOwotICAgIH0KLSAgICB0ZXN0RXhlY0NtZChjbWQpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIFBhcnNlIHN0cmluZyBkZXNjcmlwdGlvbiBvZiByZWN0YW5nbGUgYW5kIGFkZCBpdCB0byBsaXN0IG9mIHJlY3RhbmdsZXMKLS8vIHRvIGJlIHJlbmRlcmVkLgotc3RhdGljIFJlY3RhbmdsZSBwYXJzZVJlY3Qoc3RyaW5nIHJlY3RTdHIpCi17Ci0gICAgaW50IHJ2OwotICAgIHN0cmluZyBzdHI7Ci0gICAgYm9vbCAgIGVycm9yOwotICAgIGlzdHJpbmdzdHJlYW0gaW4ocmVjdFN0cik7Ci0gICAgY29uc3Qgc3RydWN0IGh3Y1Rlc3RHcmFwaGljRm9ybWF0ICpmb3JtYXQ7Ci0gICAgUmVjdGFuZ2xlIHJlY3Q7Ci0gICAgc3RydWN0IGh3Y19yZWN0IGh3Y1JlY3Q7Ci0KLSAgICAvLyBHcmFwaGljIEZvcm1hdAotICAgIGluID4+IHN0cjsKLSAgICBpZiAoIWluKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkVycm9yIHBhcnNpbmcgZm9ybWF0IGZyb206ICVzIiwgcmVjdFN0ci5jX3N0cigpKTsKLSAgICAgICAgZXhpdCgyMCk7Ci0gICAgfQotICAgIGZvcm1hdCA9IGh3Y1Rlc3RHcmFwaGljRm9ybWF0TG9va3VwKHN0ci5jX3N0cigpKTsKLSAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgdGVzdFByaW50RSgiVW5rbm93biBncmFwaGljIGZvcm1hdCBpbjogJXMiLCByZWN0U3RyLmNfc3RyKCkpOwotICAgICAgICBleGl0KDIxKTsKLSAgICB9Ci0gICAgcmVjdC5mb3JtYXQgPSBmb3JtYXQtPmZvcm1hdDsKLQotICAgIC8vIERpc3BsYXkgRnJhbWUKLSAgICByZWN0LmRpc3BsYXlGcmFtZSA9IGh3Y1Rlc3RQYXJzZUh3Y1JlY3QoaW4sIGVycm9yKTsKLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBkaXNwbGF5IGZyYW1lIGluOiAlcyIsIHJlY3RTdHIuY19zdHIoKSk7Ci0gICAgICAgIGV4aXQoMjIpOwotICAgIH0KLQotICAgIC8vIFNldCBkZWZhdWx0IHNvdXJjZURpbSBhbmQgc291cmNlQ3JvcCBiYXNlZCBvbiBzaXplIG9mIGRpc3BsYXkgZnJhbWUuCi0gICAgLy8gRGVmYXVsdCBpcyBzb3VyY2Ugc2l6ZSBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgZGlzcGxheSBmcmFtZSwgd2l0aAotICAgIC8vIHRoZSBzb3VyY2UgY3JvcCBiZWluZyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNvdXJjZSBmcmFtZS4KLSAgICByZWN0LnNvdXJjZURpbSA9IEh3Y1Rlc3REaW0ocmVjdC5kaXNwbGF5RnJhbWUucmlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHJlY3QuZGlzcGxheUZyYW1lLmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmRpc3BsYXlGcmFtZS5ib3R0b20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHJlY3QuZGlzcGxheUZyYW1lLnRvcCk7Ci0gICAgcmVjdC5zb3VyY2VDcm9wLmxlZnQgPSAwOwotICAgIHJlY3Quc291cmNlQ3JvcC50b3AgPSAwOwotICAgIHJlY3Quc291cmNlQ3JvcC5yaWdodCA9IHJlY3Quc291cmNlRGltLndpZHRoKCk7Ci0gICAgcmVjdC5zb3VyY2VDcm9wLmJvdHRvbSA9IHJlY3Quc291cmNlRGltLmhlaWdodCgpOwotCi0gICAgLy8gT3B0aW9uYWwgc2V0dGluZ3MKLSAgICB3aGlsZSAoKGluLnRlbGxnKCkgPCAoc3RyZWFtcG9zKSBpbi5zdHIoKS5sZW5ndGgoKSkKLSAgICAgICAgICAgJiYgKGluLnRlbGxnKCkgIT0gKHN0cmVhbXBvcykgLTEpKSB7Ci0gICAgICAgIHN0cmluZyBhdHRyTmFtZTsKLQotICAgICAgICBpbiA+PiBhdHRyTmFtZTsKLSAgICAgICAgaWYgKGluLmVvZigpKSB7IGJyZWFrOyB9Ci0gICAgICAgIGlmICghaW4pIHsKLSAgICAgICAgICAgIHRlc3RQcmludEUoIkVycm9yIHJlYWRpbmcgYXR0cmlidXRlIG5hbWUgaW46ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVjdFN0ci5jX3N0cigpKTsKLSAgICAgICAgICAgIGV4aXQoMjMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVHJhbnNmb3JtCi0gICAgICAgIGlmIChhdHRyTmFtZSA9PSAidHJhbnNmb3JtOiIpIHsgLy8gVHJhbnNmb3JtCi0gICAgICAgICAgICBzdHJpbmcgc3RyOwotCi0gICAgICAgICAgICBpbiA+PiBzdHI7Ci0gICAgICAgICAgICBpZiAoc3RyID09ICJub25lIikgewotICAgICAgICAgICAgICAgIHJlY3QudHJhbnNmb3JtID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyID09ICJmbGlwaCIpIHsKLSAgICAgICAgICAgICAgICByZWN0LnRyYW5zZm9ybSA9IEhXQ19UUkFOU0ZPUk1fRkxJUF9IOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHIgPT0gImZsaXB2IikgewotICAgICAgICAgICAgICAgIHJlY3QudHJhbnNmb3JtID0gSFdDX1RSQU5TRk9STV9GTElQX1Y7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSAicm90OTAiKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC50cmFuc2Zvcm0gPSBIV0NfVFJBTlNGT1JNX1JPVF85MDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyID09ICJyb3QxODAiKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC50cmFuc2Zvcm0gPSBIV0NfVFJBTlNGT1JNX1JPVF8xODA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSAicm90MjcwIikgewotICAgICAgICAgICAgICAgIHJlY3QudHJhbnNmb3JtID0gSFdDX1RSQU5TRk9STV9ST1RfMjcwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJVbmtub3duIHRyYW5zZm9ybSBvZiBcIiVzXCIgaW46ICVzIiwgc3RyLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0U3RyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIGV4aXQoMjQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF0dHJOYW1lID09ICJibGVuZDoiKSB7IC8vIEJsZW5kCi0gICAgICAgICAgICBzdHJpbmcgc3RyOwotCi0gICAgICAgICAgICBpbiA+PiBzdHI7Ci0gICAgICAgICAgICBpZiAoc3RyID09IHN0cmluZygibm9uZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5ibGVuZCA9IEhXQ19CTEVORElOR19OT05FOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHIgPT0gInByZW11bHQiKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5ibGVuZCA9IEhXQ19CTEVORElOR19QUkVNVUxUOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHIgPT0gImNvdmVyYWdlIikgewotICAgICAgICAgICAgICAgIHJlY3QuYmxlbmQgPSBIV0NfQkxFTkRJTkdfQ09WRVJBR0U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIlVua25vd24gYmxlbmQgb2YgXCIlc1wiIGluOiAlcyIsIHN0ci5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdFN0ci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBleGl0KDI1KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChhdHRyTmFtZSA9PSAiY29sb3I6IikgeyAvLyBDb2xvcgotICAgICAgICAgICAgcmVjdC5jb2xvciA9IGh3Y1Rlc3RQYXJzZUNvbG9yKGluLCBlcnJvcik7Ci0gICAgICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJFcnJvciBwYXJzaW5nIGNvbG9yIGluOiAlcyIsIHJlY3RTdHIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgZXhpdCgyNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYXR0ck5hbWUgPT0gImFscGhhOiIpIHsgLy8gQWxwaGEKLSAgICAgICAgICAgIGluID4+IHJlY3QuYWxwaGE7Ci0gICAgICAgICAgICBpZiAoIWluKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiRXJyb3IgcGFyc2luZyB2YWx1ZSBmb3IgYWxwaGEgYXR0cmlidXRlIGluOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0U3RyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIGV4aXQoMjcpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF0dHJOYW1lID09ICJzb3VyY2VEaW06IikgeyAvLyBTb3VyY2UgRGltZW5zaW9uCi0gICAgICAgICAgIHJlY3Quc291cmNlRGltID0gaHdjVGVzdFBhcnNlRGltKGluLCBlcnJvcik7Ci0gICAgICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJFcnJvciBwYXJzaW5nIHNvdXJjZSBkaW1lbmlzaW9uIGluOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0U3RyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIGV4aXQoMjgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF0dHJOYW1lID09ICJzb3VyY2VDcm9wOiIpIHsgLy8gU291cmNlIENyb3AKLSAgICAgICAgICAgIHJlY3Quc291cmNlQ3JvcCA9IGh3Y1Rlc3RQYXJzZUh3Y1JlY3QoaW4sIGVycm9yKTsKLSAgICAgICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkVycm9yIHBhcnNpbmcgc291cmNlIGNyb3AgaW46ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RTdHIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgZXhpdCgyOSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7IC8vIFVua25vd24gYXR0cmlidXRlCi0gICAgICAgICAgICB0ZXN0UHJpbnRFKCJVbmtub3duIGF0dHJpYnV0ZSBvZiBcIiVzXCIgaW46ICVzIiwgYXR0ck5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVjdFN0ci5jX3N0cigpKTsKLSAgICAgICAgICAgIGV4aXQoMzApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVmFsaWRhdGUKLSAgICBpZiAoKCh1aW50MzJfdCkgcmVjdC5zb3VyY2VDcm9wLmxlZnQgPj0gcmVjdC5zb3VyY2VEaW0ud2lkdGgoKSkKLSAgICAgICAgfHwgKCh1aW50MzJfdCkgcmVjdC5zb3VyY2VDcm9wLnJpZ2h0ID4gcmVjdC5zb3VyY2VEaW0ud2lkdGgoKSkKLSAgICAgICAgfHwgKCh1aW50MzJfdCkgcmVjdC5zb3VyY2VDcm9wLnRvcCA+PSByZWN0LnNvdXJjZURpbS5oZWlnaHQoKSkKLSAgICAgICAgfHwgKCh1aW50MzJfdCkgcmVjdC5zb3VyY2VDcm9wLmJvdHRvbSA+IHJlY3Quc291cmNlRGltLmhlaWdodCgpKSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJJbnZhbGlkIHNvdXJjZSBjcm9wIGluOiAlcyIsIHJlY3RTdHIuY19zdHIoKSk7Ci0gICAgICAgIGV4aXQoMzEpOwotICAgIH0KLSAgICBpZiAoKHJlY3QuZGlzcGxheUZyYW1lLmxlZnQgPj0gd2lkdGgpCi0gICAgICAgIHx8IChyZWN0LmRpc3BsYXlGcmFtZS5yaWdodCA+IHdpZHRoKQotICAgICAgICB8fCAocmVjdC5kaXNwbGF5RnJhbWUudG9wID49IGhlaWdodCkKLSAgICAgICAgfHwgKHJlY3QuZGlzcGxheUZyYW1lLmJvdHRvbSA+IGhlaWdodCkpIHsKLSAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBkaXNwbGF5IGZyYW1lIGluOiAlcyIsIHJlY3RTdHIuY19zdHIoKSk7Ci0gICAgICAgIGV4aXQoMzIpOwotICAgIH0KLSAgICBpZiAoKHJlY3QuYWxwaGEgPCAwLjApIHx8IChyZWN0LmFscGhhID4gMS4wKSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJJbnZhbGlkIGFscGhhIGluOiAlcyIsIHJlY3RTdHIuY19zdHIoKSk7Ci0gICAgICAgIGV4aXQoMzMpOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSBzb3VyY2UgdGV4dHVyZQotICAgIHJlY3QudGV4dHVyZSA9IG5ldyBHcmFwaGljQnVmZmVyKHJlY3Quc291cmNlRGltLndpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5zb3VyY2VEaW0uaGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5mb3JtYXQsIHRleFVzYWdlKTsKLSAgICBpZiAoKHJ2ID0gcmVjdC50ZXh0dXJlLT5pbml0Q2hlY2soKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgdGVzdFByaW50RSgic291cmNlIHRleHR1cmUgaW5pdENoZWNrIGZhaWxlZCwgcnY6ICVpIiwgcnYpOwotICAgICAgICB0ZXN0UHJpbnRFKCIgICVzIiwgcmVjdFN0ci5jX3N0cigpKTsKLQotICAgIH0KLQotICAgIC8vIEZpbGwgd2l0aCB1bmlmb3JtIGNvbG9yCi0gICAgaHdjVGVzdEZpbGxDb2xvcihyZWN0LnRleHR1cmUuZ2V0KCksIHJlY3QuY29sb3IsIHJlY3QuYWxwaGEpOwotICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgICBidWY6ICVwIGhhbmRsZTogJXAgZm9ybWF0OiAlcyB3aWR0aDogJXUgaGVpZ2h0OiAldSAiCi0gICAgICAgICAgICAgICAgICAgImNvbG9yOiAlcyBhbHBoYTogJWYiLAotICAgICAgICAgICAgICAgICAgIHJlY3QudGV4dHVyZS5nZXQoKSwgcmVjdC50ZXh0dXJlLT5oYW5kbGUsIGZvcm1hdC0+ZGVzYywKLSAgICAgICAgICAgICAgICAgICByZWN0LnNvdXJjZURpbS53aWR0aCgpLCByZWN0LnNvdXJjZURpbS5oZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICBzdHJpbmcocmVjdC5jb2xvcikuY19zdHIoKSwgcmVjdC5hbHBoYSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlY3Q7Ci19Ci0KLXZvaWQgaW5pdCh2b2lkKQotewotICAgIC8vIFNlZWQgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCi0gICAgLy8gTmVlZGVkIHNvIHRoYXQgdGhlIHBhZCBhcmVhcyBvZiBmcmFtZXMgYXJlIGZpbGxlZCB3aXRoIGEgZGV0ZXJtaW5pc3RpYwotICAgIC8vIHBzZXVkbyByYW5kb20gdmFsdWUuCi0gICAgc3JhbmQ0OCgwKTsKLQotICAgIGh3Y1Rlc3RJbml0RGlzcGxheSh2ZXJib3NlLCAmZHB5LCAmc3VyZmFjZSwgJndpZHRoLCAmaGVpZ2h0KTsKLQotICAgIGh3Y1Rlc3RPcGVuSHdjKCZod2NEZXZpY2UpOwotfQotCi12b2lkIHByaW50U3ludGF4KGNvbnN0IGNoYXIgKmNtZCkKLXsKLSAgICB0ZXN0UHJpbnRFKCIgICVzIFtvcHRpb25zXSAoZ3JhcGhpY0Zvcm1hdCBkaXNwbGF5RnJhbWUgW2F0dHJpYnV0ZXNdLCkuLi4iLAotICAgICAgICAgICAgICAgY21kKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgb3B0aW9uczoiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAtRCBFbmQgb2YgdGVzdCBkZWxheSIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIC12IFZlcmJvc2UiKTsKLSAgICB0ZXN0UHJpbnRFKCIiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgZ3JhcGhpYyBmb3JtYXRzOiIpOwotICAgIGZvciAodW5zaWduZWQgaW50IG4xID0gMDsgbjEgPCBOVU1BKGh3Y1Rlc3RHcmFwaGljRm9ybWF0KTsgbjErKykgewotICAgICAgICB0ZXN0UHJpbnRFKCIgICAgICAlcyIsIGh3Y1Rlc3RHcmFwaGljRm9ybWF0W24xXS5kZXNjKTsKLSAgICB9Ci0gICAgdGVzdFByaW50RSgiIik7Ci0gICAgdGVzdFByaW50RSgiICAgIGRpc3BsYXlGcmFtZSIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIFtsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b21dIik7Ci0gICAgdGVzdFByaW50RSgiIik7Ci0gICAgdGVzdFByaW50RSgiICAgIGF0dHJpYnV0ZXM6Iik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgdHJhbnNmb3JtOiBub25lIHwgZmxpcGggfCBmbGlwdiB8IHJvdDkwIHwgcm90MTgwICIKLSAgICAgICAgICAgICAgICIgfCByb3QyNzAiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICBibGVuZDogbm9uZSB8IHByZW11bHQgfCBjb3ZlcmFnZSIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIGNvbG9yOiBbMC4jIywgMC4jIywgMC4jI10iKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICBhbHBoYTogMC4jIyIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIHNvdXJjZURpbTogW3dpZHRoLCBoZWlnaHRdIik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgc291cmNlQ3JvcDogW2xlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbV0iKTsKLSAgICB0ZXN0UHJpbnRFKCIiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgRXhhbXBsZToiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAjIFdoaXRlIFlWMTIgcmVjdGFuZ2xlLCB3aXRoIG92ZXJsYXBwaW5nIHR1cnF1b2lzZSAiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAjICBSR0JBODg4OCByZWN0YW5nbGUgYXQgMzAlJSAoYWxwaGE6IDAuNykgdHJhbnNwYXJlbmN5Iik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgJXMgLXYgLUQgMzAuMCBcXCIsIGNtZCk7Ci0gICAgdGVzdFByaW50RSgiICAgICAgICBZVjEyIFs1MCwgODAsIDIwMCwgMzAwXSB0cmFuc2Zvcm06IG5vbmUgXFwiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAgICAgY29sb3I6IFsxLjAsIDAuNSwgMC41XSwgXFwiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAgIFJHQkE4ODg4IFsxMDAsIDE1MCwgMzAwLCA0MDBdIGJsZW5kOiBjb3ZlcmFnZSBcXCIpOwotICAgIHRlc3RQcmludEUoIiAgICAgICAgICBjb2xvcjogWzAuMjUxLCAwLjg3OCwgMC44MTZdIGFscGhhOiAwLjcgXFwiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAgICAgc291cmNlRGltOiBbNTAsIDYwXSBzb3VyY2VDcm9wOiBbNSwgOCwgMTIsIDE1XSIpOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2h3Yy9od2NTdHJlc3MuY3BwIGIvb3BlbmdsL3Rlc3RzL2h3Yy9od2NTdHJlc3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDJhNDI0Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9od2MvaHdjU3RyZXNzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qCi0gKiBIYXJkd2FyZSBDb21wb3NlciBzdHJlc3MgdGVzdAotICoKLSAqIFBlcmZvcm1zIGEgcHNldWRvLXJhbmRvbSAocHJhbmRvbSkgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyB0byB0aGUKLSAqIEhhcmR3YXJlIENvbXBvc2VyIChIV0MpLCBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIHBhc3NlcyBvciBmb3IKLSAqIGEgc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lLiAgQnkgZGVmYXVsdCB0aGUgcGVyaW9kIG9mIHRpbWUgaXMgRkxUX01BWCwKLSAqIHNvIHRoYXQgdGhlIG51bWJlciBvZiBwYXNzZXMgd2lsbCB0YWtlIHByZWNlZGVuY2UuCi0gKgotICogVGhlIHBhc3NlcyBhcmUgZ3JvdXBlZCB0b2dldGhlciwgd2hlcmUgKHBhc3MgLyBwYXNzZXNQZXJHcm91cCkgc3BlY2lmaWVzCi0gKiB3aGljaCBncm91cCBhIHBhcnRpY3VsYXIgcGFzcyBpcyBpbi4gIFRoaXMgY2F1c2VzIGV2ZXJ5IHBhc3Nlc1Blckdyb3VwCi0gKiB3b3J0aCBvZiBzZXF1ZW50aWFsIHBhc3NlcyB0byBiZSB3aXRoaW4gdGhlIHNhbWUgZ3JvdXAuICBDb21wdXRhdGlvbmFsbHkKLSAqIGludGVuc2l2ZSBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQganVzdCBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBncm91cAotICogb2YgcGFzc2VzIGFuZCB0aGVuIHVzZWQgYnkgYWxsIHRoZSBwYXNzZXMgaW4gdGhhdCBncm91cC4gIFRoaXMgaXMgZG9uZQotICogc28gYXMgdG8gaW5jcmVhc2UgYm90aCB0aGUgYXZlcmFnZSBhbmQgcGVhayByYXRlIG9mIGdyYXBoaWMgb3BlcmF0aW9ucywKLSAqIGJ5IG1vdmluZyBjb21wdXRhdGlvbmFsbHkgaW50ZW5zaXZlIG9wZXJhdGlvbnMgdG8gdGhlIGJlZ2lubmluZyBvZiBhIGdyb3VwLgotICogSW4gcGFydGljdWxhciwgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggZ3JvdXAgb2YgcGFzc2VzIGEgc2V0IG9mCi0gKiBncmFwaGljIGJ1ZmZlcnMgYXJlIGNyZWF0ZWQsIHRoZW4gdXNlZCBieSB0aGUgZmlyc3QgYW5kIHJlbWFpbmluZwotICogcGFzc2VzIG9mIHRoYXQgZ3JvdXAgb2YgcGFzc2VzLgotICoKLSAqIFRoZSBwZXItZ3JvdXAgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGdyYXBoaWMgYnVmZmVycyBpcyBwZXJmb3JtZWQKLSAqIGJ5IGEgZnVuY3Rpb24gY2FsbGVkIGluaXRGcmFtZXMuICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gYXJyYXkKLSAqIG9mIHNtYXJ0IHBvaW50ZXJzIHRvIHRoZSBncmFwaGljIGJ1ZmZlcnMsIGluIHRoZSBmb3JtIG9mIGEgdmVjdG9yCi0gKiBvZiB2ZWN0b3JzLiAgVGhlIGFycmF5IGlzIGFjY2Vzc2VkIGluIHJvdyBtYWpvciBvcmRlciwgc28gZWFjaAotICogcm93IGlzIGEgdmVjdG9yIG9mIHNtYXJ0IHBvaW50ZXJzLiAgQWxsIHRoZSBwb2ludGVycyBvZiBhIHNpbmdsZQotICogcm93IHBvaW50IHRvIGdyYXBoaWMgYnVmZmVycyB3aGljaCB1c2UgdGhlIHNhbWUgcGl4ZWwgZm9ybWF0IGFuZAotICogaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24sIGFsdGhvdWdoIGl0IGlzIGxpa2VseSB0aGF0IGVhY2ggb25lIGlzCi0gKiBmaWxsZWQgd2l0aCBhIGRpZmZlcmVudCBjb2xvci4gIFRoaXMgaXMgZG9uZSBzbyB0aGF0IGFmdGVyIGRvaW5nCi0gKiB0aGUgZmlyc3QgSFdDIHByZXBhcmUgdGhlbiBzZXQgY2FsbCwgc3Vic2VxdWVudCBzZXQgY2FsbHMgY2FuCi0gKiBiZSBtYWRlIHdpdGggZWFjaCBvZiB0aGUgbGF5ZXIgaGFuZGxlcyBjaGFuZ2VkIHRvIGEgZGlmZmVyZW50Ci0gKiBncmFwaGljIGJ1ZmZlciB3aXRoaW4gdGhlIHNhbWUgcm93LiAgU2luY2UgdGhlIGdyYXBoaWMgYnVmZmVycwotICogaW4gYSBwYXJ0aWN1bGFyIHJvdyBoYXZlIHRoZSBzYW1lIHBpeGVsIGZvcm1hdCBhbmQgZGltZW5zaW9uLAotICogYWRkaXRpb25hbCBIV0Mgc2V0IGNhbGxzIGNhbiBiZSBtYWRlLCB3aXRob3V0IGhhdmluZyB0byBwZXJmb3JtCi0gKiBhbiBIV0MgcHJlcGFyZSBjYWxsLgotICoKLSAqIFRoaXMgdGVzdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbW1hbmQtbGluZSBvcHRpb25zOgotICoKLSAqICAgLXYgICAgICAgIFZlcmJvc2UKLSAqICAgLXMgbnVtICAgIFN0YXJ0aW5nIHBhc3MKLSAqICAgLWUgbnVtICAgIEVuZGluZyBwYXNzCi0gKiAgIC1wIG51bSAgICBFeGVjdXRlIHRoZSBzaW5nbGUgcGFzcyBzcGVjaWZpZWQgYnkgbnVtCi0gKiAgIC1uIG51bSAgICBOdW1iZXIgb2Ygc2V0IG9wZXJhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBlYWNoIHByZXBhcmUgb3BlcmF0aW9uCi0gKiAgIC10IGZsb2F0ICBNYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0byBleGVjdXRlIHRoZSB0ZXN0Ci0gKiAgIC1kIGZsb2F0ICBEZWxheSBpbiBzZWNvbmRzIHBlcmZvcm1lZCBhZnRlciBlYWNoIHNldCBvcGVyYXRpb24KLSAqICAgLUQgZmxvYXQgIERlbGF5IGluIHNlY29uZHMgcGVyZm9ybWVkIGFmdGVyIHRoZSBsYXN0IHBhc3MgaXMgZXhlY3V0ZWQKLSAqCi0gKiBUeXBpY2FsbHkgdGhlIHRlc3QgaXMgZXhlY3V0ZWQgZm9yIGEgbGFyZ2UgcmFuZ2Ugb2YgcGFzc2VzLiAgQnkgZGVmYXVsdAotICogcGFzc2VzIDAgdGhyb3VnaCA5OTk5OSAoMTAwLDAwMCBwYXNzZXMpIGFyZSBleGVjdXRlZC4gIEFsdGhvdWdoIHRoaXMgdGVzdAotICogZG9lcyBub3QgdmFsaWRhdGUgdGhlIGdlbmVyYXRlZCBpbWFnZSwgYXQgdGltZXMgaXQgaXMgdXNlZnVsIHRvIHJlZXhlY3V0ZQotICogYSBwYXJ0aWN1bGFyIHBhc3MgYW5kIGxlYXZlIHRoZSBkaXNwbGF5ZWQgaW1hZ2Ugb24gdGhlIHNjcmVlbiBmb3IgYW4KLSAqIGV4dGVuZGVkIHBlcmlvZCBvZiB0aW1lLiAgVGhpcyBjYW4gYmUgZG9uZSBlaXRoZXIgYnkgc2V0dGluZyB0aGUgLXMKLSAqIGFuZCAtZSBvcHRpb25zIHRvIHRoZSBkZXNpcmVkIHBhc3MsIGFsb25nIHdpdGggYSBsYXJnZSB2YWx1ZSBmb3IgLUQuCi0gKiBUaGlzIGNhbiBhbHNvIGJlIGRvbmUgdmlhIHRoZSAtcCBvcHRpb24sIGFnYWluIHdpdGggYSBsYXJnZSB2YWx1ZSBmb3IKLSAqIHRoZSAtRCBvcHRpb25zLgotICoKLSAqIFNvIGZhciB0aGlzIHRlc3Qgb25seSBjb250YWlucyBjb2RlIHRvIGNyZWF0ZSBncmFwaGljIGJ1ZmZlcnMgd2l0aAotICogYSBjb250aW51b3VzIHNvbGlkIGNvbG9yLiAgQWx0aG91Z2ggdGhpcyB0ZXN0IGlzIHVuYWJsZSB0byB2YWxpZGF0ZSB0aGUKLSAqIGltYWdlIHByb2R1Y2VkLCBhbnkgaW1hZ2UgdGhhdCBjb250YWlucyBvdGhlciB0aGFuIHJlY3RhbmdsZXMgb2YgYSBzb2xpZAotICogY29sb3IgYXJlIGluY29ycmVjdC4gIE5vdGUgdGhhdCB0aGUgcmVjdGFuZ2xlcyBtYXkgdXNlIGEgdHJhbnNwYXJlbnQKLSAqIGNvbG9yIGFuZCBoYXZlIGEgYmxlbmRpbmcgb3BlcmF0aW9uIHRoYXQgY2F1c2VzIHRoZSBjb2xvciBpbiBvdmVybGFwcGluZwotICogcmVjdGFuZ2xlcyB0byBiZSBtaXhlZC4gIEluIHN1Y2ggY2FzZXMgdGhlIG92ZXJsYXBwaW5nIHBvcnRpb25zIG1heSBoYXZlCi0gKiBhIGRpZmZlcmVudCBjb2xvciBmcm9tIHRoZSByZXN0IG9mIHRoZSByZWN0YW5nbGUuCi0gKi8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjdGltZT4KLSNpbmNsdWRlIDxsaWJnZW4uaD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotCi0jZGVmaW5lIExPR19UQUcgImh3Y1N0cmVzc1Rlc3QiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dGVzdFV0aWwuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2h3Y29tcG9zZXIuaD4KLQotI2luY2x1ZGUgPGdsVGVzdExpYi5oPgotI2luY2x1ZGUgImh3Y1Rlc3RMaWIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1jb25zdCBmbG9hdCBtYXhTaXplUmF0aW8gPSAxLjM7ICAvLyBHcmFwaGljIGJ1ZmZlcnMgY2FuIGJlIHVwdG8gdGhpcyBtdW5jaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFyZ2VyIHRoYW4gdGhlIGRlZmF1bHQgc2NyZWVuIHNpemUKLWNvbnN0IHVuc2lnbmVkIGludCBwYXNzZXNQZXJHcm91cCA9IDEwOyAvLyBBIGdyb3VwIG9mIHBhc3NlcyBhbGwgdXNlIHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JhcGhpYyBidWZmZXJzCi0KLS8vIFJhdGlvcyBhdCB3aGljaCByYXJlIGFuZCBmcmVxdWVudCBjb25kaXRpb25zIHNob3VsZCBiZSBwcm9kdWNlZAotY29uc3QgZmxvYXQgcmFyZVJhdGlvID0gMC4xOwotY29uc3QgZmxvYXQgZnJlcVJhdGlvID0gMC45OwotCi0vLyBEZWZhdWx0cyBmb3IgY29tbWFuZC1saW5lIG9wdGlvbnMKLWNvbnN0IGJvb2wgZGVmYXVsdFZlcmJvc2UgPSBmYWxzZTsKLWNvbnN0IHVuc2lnbmVkIGludCBkZWZhdWx0U3RhcnRQYXNzID0gMDsKLWNvbnN0IHVuc2lnbmVkIGludCBkZWZhdWx0RW5kUGFzcyA9IDk5OTk5OwotY29uc3QgdW5zaWduZWQgaW50IGRlZmF1bHRQZXJQYXNzTnVtU2V0ID0gMTA7Ci1jb25zdCBmbG9hdCBkZWZhdWx0UGVyU2V0RGVsYXkgPSAwLjA7IC8vIERlZmF1bHQgZGVsYXkgYWZ0ZXIgZWFjaCBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0aW9uLiAgRGVmYXVsdCBkZWxheSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIHVzZWQgc28gYXMgdG8gcGVyZm9ybSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNldCBvcGVyYXRpb25zIGFzIHF1aWNrbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgcG9zc2libGUuCi1jb25zdCBmbG9hdCBkZWZhdWx0RW5kRGVsYXkgPSAyLjA7IC8vIERlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsIHBhc3MgYW5kIHJlc3RhcnQgb2YgZnJhbWV3b3JrCi1jb25zdCBmbG9hdCBkZWZhdWx0RHVyYXRpb24gPSBGTFRfTUFYOyAvLyBBIGZhaXJseSBsb25nIHRpbWUsIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhbmdlIG9mIHBhc3NlcyB3aWxsIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWNlZGVuY2UKLQotLy8gQ29tbWFuZC1saW5lIG9wdGlvbiBzZXR0aW5ncwotc3RhdGljIGJvb2wgdmVyYm9zZSA9IGRlZmF1bHRWZXJib3NlOwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydFBhc3MgPSBkZWZhdWx0U3RhcnRQYXNzOwotc3RhdGljIHVuc2lnbmVkIGludCBlbmRQYXNzID0gZGVmYXVsdEVuZFBhc3M7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG51bVNldCA9IGRlZmF1bHRQZXJQYXNzTnVtU2V0Owotc3RhdGljIGZsb2F0IHBlclNldERlbGF5ID0gZGVmYXVsdFBlclNldERlbGF5Owotc3RhdGljIGZsb2F0IGVuZERlbGF5ID0gZGVmYXVsdEVuZERlbGF5Owotc3RhdGljIGZsb2F0IGR1cmF0aW9uID0gZGVmYXVsdER1cmF0aW9uOwotCi0vLyBDb21tYW5kLWxpbmUgbXV0dWFsIGV4Y2x1c2lvbiBkZXRlY3Rpb24gZmxhZ3MuCi0vLyBDb3JyZXNwb25kaW5nIGZsYWcgc2V0IHRydWUgb25jZSBhbiBvcHRpb24gaXMgdXNlZC4KLWJvb2wgZUZsYWcsIHNGbGFnLCBwRmxhZzsKLQotI2RlZmluZSBNQVhTVFIgICAgICAgICAgICAgICAxMDAKLSNkZWZpbmUgTUFYQ01EICAgICAgICAgICAgICAgMjAwCi0jZGVmaW5lIEJJVFNQRVJCWVRFICAgICAgICAgICAgOCAvLyBUT0RPOiBPYnRhaW4gZnJvbSA8dmFsdWVzLmg+LCBvbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBoYXMgYmVlbiBhZGRlZAotCi0jZGVmaW5lIENNRF9TVE9QX0ZSQU1FV09SSyAgICJzdG9wIDI+JjEiCi0jZGVmaW5lIENNRF9TVEFSVF9GUkFNRVdPUksgICJzdGFydCAyPiYxIgotCi0jZGVmaW5lIE5VTUEoYSkgKHNpemVvZihhKSAvIHNpemVvZihhIFswXSkpCi0jZGVmaW5lIE1FTUNMUihhZGRyLCBzaXplKSBkbyB7IFwKLSAgICAgICAgbWVtc2V0KChhZGRyKSwgMCwgKHNpemUpKTsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8vIEZpbGUgc2NvcGUgY29uc3RhbnRzCi1jb25zdCB1bnNpZ25lZCBpbnQgYmxlbmRpbmdPcHNbXSA9IHsKLSAgICBIV0NfQkxFTkRJTkdfTk9ORSwKLSAgICBIV0NfQkxFTkRJTkdfUFJFTVVMVCwKLSAgICBIV0NfQkxFTkRJTkdfQ09WRVJBR0UsCi19OwotY29uc3QgdW5zaWduZWQgaW50IGxheWVyRmxhZ3NbXSA9IHsKLSAgICBIV0NfU0tJUF9MQVlFUiwKLX07Ci1jb25zdCB2ZWN0b3I8dW5zaWduZWQgaW50PiB2ZWNMYXllckZsYWdzKGxheWVyRmxhZ3MsCi0gICAgbGF5ZXJGbGFncyArIE5VTUEobGF5ZXJGbGFncykpOwotCi1jb25zdCB1bnNpZ25lZCBpbnQgdHJhbnNmb3JtRmxhZ3NbXSA9IHsKLSAgICBIV0NfVFJBTlNGT1JNX0ZMSVBfSCwKLSAgICBIV0NfVFJBTlNGT1JNX0ZMSVBfViwKLSAgICBIV0NfVFJBTlNGT1JNX1JPVF85MCwKLSAgICAvLyBST1RfMTgwICYgUk9UXzI3MCBpbnRlbnRpb25hbGx5IG5vdCBsaXN0ZWQsIGJlY2F1c2UgdGhleQotICAgIC8vIHRoZXkgYXJlIGZvcm1lZCBmcm9tIGNvbWJpbmF0aW9ucyBvZiB0aGUgZmxhZ3MgYWxyZWFkeSBsaXN0ZWQuCi19OwotY29uc3QgdmVjdG9yPHVuc2lnbmVkIGludD4gdmVjVHJhbnNmb3JtRmxhZ3ModHJhbnNmb3JtRmxhZ3MsCi0gICAgdHJhbnNmb3JtRmxhZ3MgKyBOVU1BKHRyYW5zZm9ybUZsYWdzKSk7Ci0KLS8vIEZpbGUgc2NvcGUgZ2xvYmFscwotc3RhdGljIGNvbnN0IGludCB0ZXhVc2FnZSA9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX1RFWFRVUkUgfAotICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19XUklURV9SQVJFTFk7Ci1zdGF0aWMgaHdjX2NvbXBvc2VyX2RldmljZV90ICpod2NEZXZpY2U7Ci1zdGF0aWMgRUdMRGlzcGxheSBkcHk7Ci1zdGF0aWMgRUdMU3VyZmFjZSBzdXJmYWNlOwotc3RhdGljIEVHTGludCB3aWR0aCwgaGVpZ2h0Owotc3RhdGljIHZlY3RvciA8dmVjdG9yIDxzcDxHcmFwaGljQnVmZmVyPiA+ID4gZnJhbWVzOwotCi0vLyBGaWxlIHNjb3BlIHByb3RvdHlwZXMKLXZvaWQgaW5pdCh2b2lkKTsKLXZvaWQgaW5pdEZyYW1lcyh1bnNpZ25lZCBpbnQgc2VlZCk7Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4gdmVjdG9yPFQ+IHZlY3RvclJhbmRTZWxlY3QoY29uc3QgdmVjdG9yPFQ+JiB2ZWMsIHNpemVfdCBudW0pOwotdGVtcGxhdGUgPGNsYXNzIFQ+IFQgdmVjdG9yT3IoY29uc3QgdmVjdG9yPFQ+JiB2ZWMpOwotCi0vKgotICogTWFpbgotICoKLSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgaGlnaC1sZXZlbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zOgotICoKLSAqICAgMS4gQ29tbWFuZC1saW5lIHBhcnNpbmcKLSAqCi0gKiAgIDIuIEluaXRpYWxpemF0aW9uCi0gKgotICogICAzLiBGb3IgZWFjaCBwYXNzOgotICoKLSAqICAgICAgICBhLiBJZiBwYXNzIGlzIGZpcnN0IHBhc3Mgb3IgaW4gYSBkaWZmZXJlbnQgZ3JvdXAgZnJvbSB0aGUKLSAqICAgICAgICAgICBwcmV2aW91cyBwYXNzLCBpbml0aWFsaXplIHRoZSBhcnJheSBvZiBncmFwaGljIGJ1ZmZlcnMuCi0gKgotICogICAgICAgIGIuIENyZWF0ZSBhIEhXQyBsaXN0IHdpdGggcm9vbSB0byBzcGVjaWZ5IGEgcHJhbmRvbWx5Ci0gKiAgICAgICAgICAgc2VsZWN0ZWQgbnVtYmVyIG9mIGxheWVycy4KLSAqCi0gKiAgICAgICAgYy4gU2VsZWN0IGEgc3Vic2V0IG9mIHRoZSByb3dzIGZyb20gdGhlIGdyYXBoaWMgYnVmZmVyIGFycmF5LAotICogICAgICAgICAgIHN1Y2ggdGhhdCB0aGVyZSBpcyBhIHVuaXF1ZSByb3cgdG8gYmUgdXNlZCBmb3IgZWFjaAotICogICAgICAgICAgIG9mIHRoZSBsYXllcnMgaW4gdGhlIEhXQyBsaXN0LgotICoKLSAqICAgICAgICBkLiBQcmFuZG9tbHkgZmlsbCBpbiB0aGUgSFdDIGxpc3Qgd2l0aCBoYW5kbGVzCi0gKiAgICAgICAgICAgc2VsZWN0ZWQgZnJvbSBhbnkgb2YgdGhlIGNvbHVtbnMgb2YgdGhlIHNlbGVjdGVkIHJvdy4KLSAqCi0gKiAgICAgICAgZS4gUGFzcyB0aGUgcG9wdWxhdGVkIGxpc3QgdG8gdGhlIEhXQyBwcmVwYXJlIGNhbGwuCi0gKgotICogICAgICAgIGYuIFBhc3MgdGhlIHBvcHVsYXRlZCBsaXN0IHRvIHRoZSBIV0Mgc2V0IGNhbGwuCi0gKgotICogICAgICAgIGcuIElmIGFkZGl0aW9uYWwgc2V0IGNhbGxzIGFyZSB0byBiZSBtYWRlLCB0aGVuIGZvciBlYWNoCi0gKiAgICAgICAgICAgYWRkaXRpb25hbCBzZXQgY2FsbCwgc2VsZWN0IGEgbmV3IHNldCBvZiBoYW5kbGVzIGFuZAotICogICAgICAgICAgIHBlcmZvcm0gdGhlIHNldCBjYWxsLgotICovCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBpbnQgcnYsIG9wdDsKLSAgICBjaGFyICpjaHB0cjsKLSAgICB1bnNpZ25lZCBpbnQgcGFzczsKLSAgICBjaGFyIGNtZFtNQVhDTURdOwotICAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0VGltZSwgY3VycmVudFRpbWUsIGRlbHRhOwotCi0gICAgdGVzdFNldExvZ0NhdFRhZyhMT0dfVEFHKTsKLQotICAgIC8vIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSAgICB3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAidnA6ZDpEOm46czplOnQ6P2giKSkgIT0gLTEpIHsKLSAgICAgICAgc3dpdGNoIChvcHQpIHsKLSAgICAgICAgICBjYXNlICdkJzogLy8gRGVsYXkgYWZ0ZXIgZWFjaCBzZXQgb3BlcmF0aW9uCi0gICAgICAgICAgICBwZXJTZXREZWxheSA9IHN0cnRvZChvcHRhcmcsICZjaHB0cik7Ci0gICAgICAgICAgICBpZiAoKCpjaHB0ciAhPSAnXDAnKSB8fCAocGVyU2V0RGVsYXkgPCAwLjApKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIHBlciBwYXNzIGRlbGF5IG9mOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMiLCBvcHRhcmcpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ0QnOiAvLyBFbmQgb2YgdGVzdCBkZWxheQotICAgICAgICAgICAgICAgICAgICAvLyBEZWxheSBiZXR3ZWVuIGNvbXBsZXRpb24gb2YgZmluYWwgcGFzcyBhbmQgcmVzdGFydAotICAgICAgICAgICAgICAgICAgICAvLyBvZiBmcmFtZXdvcmsKLSAgICAgICAgICAgIGVuZERlbGF5ID0gc3RydG9kKG9wdGFyZywgJmNocHRyKTsKLSAgICAgICAgICAgIGlmICgoKmNocHRyICE9ICdcMCcpIHx8IChlbmREZWxheSA8IDAuMCkpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJJbnZhbGlkIGNvbW1hbmQtbGluZSBzcGVjaWZpZWQgZW5kIG9mIHRlc3QgZGVsYXkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mOiAlcyIsIG9wdGFyZyk7Ci0gICAgICAgICAgICAgICAgZXhpdCgyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAndCc6IC8vIER1cmF0aW9uCi0gICAgICAgICAgICBkdXJhdGlvbiA9IHN0cnRvZChvcHRhcmcsICZjaHB0cik7Ci0gICAgICAgICAgICBpZiAoKCpjaHB0ciAhPSAnXDAnKSB8fCAoZHVyYXRpb24gPCAwLjApKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIGR1cmF0aW9uIG9mOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRhcmcpOwotICAgICAgICAgICAgICAgIGV4aXQoMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ24nOiAvLyBOdW0gc2V0IG9wZXJhdGlvbnMgcGVyIHBhc3MKLSAgICAgICAgICAgIG51bVNldCA9IHN0cnRvdWwob3B0YXJnLCAmY2hwdHIsIDEwKTsKLSAgICAgICAgICAgIGlmICgqY2hwdHIgIT0gJ1wwJykgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgY29tbWFuZC1saW5lIHNwZWNpZmllZCBudW0gc2V0IHBlciBwYXNzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZjogJXMiLCBvcHRhcmcpOwotICAgICAgICAgICAgICAgIGV4aXQoNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ3MnOiAvLyBTdGFydGluZyBQYXNzCi0gICAgICAgICAgICBzRmxhZyA9IHRydWU7Ci0gICAgICAgICAgICBpZiAocEZsYWcpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJJbnZhbGlkIGNvbWJpbmF0aW9uIG9mIGNvbW1hbmQtbGluZSBvcHRpb25zLiIpOwotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIiAgVGhlIC1wIG9wdGlvbiBpcyBtdXR1YWxseSBleGNsdXNpdmUgZnJvbSB0aGUiKTsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCIgIC1zIGFuZCAtZSBvcHRpb25zLiIpOwotICAgICAgICAgICAgICAgIGV4aXQoNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydFBhc3MgPSBzdHJ0b3VsKG9wdGFyZywgJmNocHRyLCAxMCk7Ci0gICAgICAgICAgICBpZiAoKmNocHRyICE9ICdcMCcpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJJbnZhbGlkIGNvbW1hbmQtbGluZSBzcGVjaWZpZWQgc3RhcnRpbmcgcGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAib2Y6ICVzIiwgb3B0YXJnKTsKLSAgICAgICAgICAgICAgICBleGl0KDYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICdlJzogLy8gRW5kaW5nIFBhc3MKLSAgICAgICAgICAgIGVGbGFnID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChwRmxhZykgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgY29tYmluYXRpb24gb2YgY29tbWFuZC1saW5lIG9wdGlvbnMuIik7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiICBUaGUgLXAgb3B0aW9uIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSBmcm9tIHRoZSIpOwotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIiAgLXMgYW5kIC1lIG9wdGlvbnMuIik7Ci0gICAgICAgICAgICAgICAgZXhpdCg3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVuZFBhc3MgPSBzdHJ0b3VsKG9wdGFyZywgJmNocHRyLCAxMCk7Ci0gICAgICAgICAgICBpZiAoKmNocHRyICE9ICdcMCcpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJJbnZhbGlkIGNvbW1hbmQtbGluZSBzcGVjaWZpZWQgZW5kaW5nIHBhc3MgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mOiAlcyIsIG9wdGFyZyk7Ci0gICAgICAgICAgICAgICAgZXhpdCg4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAncCc6IC8vIFJ1biBhIHNpbmdsZSBzcGVjaWZpZWQgcGFzcwotICAgICAgICAgICAgcEZsYWcgPSB0cnVlOwotICAgICAgICAgICAgaWYgKHNGbGFnIHx8IGVGbGFnKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21iaW5hdGlvbiBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucy4iKTsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCIgIFRoZSAtcCBvcHRpb24gaXMgbXV0dWFsbHkgZXhjbHVzaXZlIGZyb20gdGhlIik7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiICAtcyBhbmQgLWUgb3B0aW9ucy4iKTsKLSAgICAgICAgICAgICAgICBleGl0KDkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhcnRQYXNzID0gZW5kUGFzcyA9IHN0cnRvdWwob3B0YXJnLCAmY2hwdHIsIDEwKTsKLSAgICAgICAgICAgIGlmICgqY2hwdHIgIT0gJ1wwJykgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgY29tbWFuZC1saW5lIHNwZWNpZmllZCBwYXNzIG9mOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRhcmcpOwotICAgICAgICAgICAgICAgIGV4aXQoMTApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICd2JzogLy8gVmVyYm9zZQotICAgICAgICAgICAgdmVyYm9zZSA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ2gnOiAvLyBIZWxwCi0gICAgICAgICAgY2FzZSAnPyc6Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRlc3RQcmludEUoIiAgJXMgW29wdGlvbnNdIiwgYmFzZW5hbWUoYXJndlswXSkpOwotICAgICAgICAgICAgdGVzdFByaW50RSgiICAgIG9wdGlvbnM6Iik7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRFKCIgICAgICAtcCBFeGVjdXRlIHNwZWNpZmllZCBwYXNzIik7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRFKCIgICAgICAtcyBTdGFydGluZyBwYXNzIik7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRFKCIgICAgICAtZSBFbmRpbmcgcGFzcyIpOwotICAgICAgICAgICAgdGVzdFByaW50RSgiICAgICAgLXQgRHVyYXRpb24iKTsKLSAgICAgICAgICAgIHRlc3RQcmludEUoIiAgICAgIC1kIERlbGF5IGFmdGVyIGVhY2ggc2V0IG9wZXJhdGlvbiIpOwotICAgICAgICAgICAgdGVzdFByaW50RSgiICAgICAgLUQgRW5kIG9mIHRlc3QgZGVsYXkiKTsKLSAgICAgICAgICAgIHRlc3RQcmludEUoIiAgICAgIC1uIE51bSBzZXQgb3BlcmF0aW9ucyBwZXIgcGFzcyIpOwotICAgICAgICAgICAgdGVzdFByaW50RSgiICAgICAgLXYgVmVyYm9zZSIpOwotICAgICAgICAgICAgZXhpdCgoKG9wdG9wdCA9PSAwKSB8fCAob3B0b3B0ID09ICc/JykpID8gMCA6IDExKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZW5kUGFzcyA8IHN0YXJ0UGFzcykgewotICAgICAgICB0ZXN0UHJpbnRFKCJVbmV4cGVjdGVkIGVuZGluZyBwYXNzIGJlZm9yZSBzdGFydGluZyBwYXNzIik7Ci0gICAgICAgIHRlc3RQcmludEUoIiAgc3RhcnRQYXNzOiAldSBlbmRQYXNzOiAldSIsIHN0YXJ0UGFzcywgZW5kUGFzcyk7Ci0gICAgICAgIGV4aXQoMTIpOwotICAgIH0KLSAgICBpZiAoYXJnYyAhPSBvcHRpbmQpIHsKLSAgICAgICAgdGVzdFByaW50RSgiVW5leHBlY3RlZCBjb21tYW5kLWxpbmUgcG9zdGlvbmFsIGFyZ3VtZW50Iik7Ci0gICAgICAgIHRlc3RQcmludEUoIiAgJXMgWy1zIHN0YXJ0X3Bhc3NdIFstZSBlbmRfcGFzc10gWy10IGR1cmF0aW9uXSIsCi0gICAgICAgICAgICBiYXNlbmFtZShhcmd2WzBdKSk7Ci0gICAgICAgIGV4aXQoMTMpOwotICAgIH0KLSAgICB0ZXN0UHJpbnRJKCJkdXJhdGlvbjogJWciLCBkdXJhdGlvbik7Ci0gICAgdGVzdFByaW50SSgic3RhcnRQYXNzOiAldSIsIHN0YXJ0UGFzcyk7Ci0gICAgdGVzdFByaW50SSgiZW5kUGFzczogJXUiLCBlbmRQYXNzKTsKLSAgICB0ZXN0UHJpbnRJKCJudW1TZXQ6ICV1IiwgbnVtU2V0KTsKLQotICAgIC8vIFN0b3AgZnJhbWV3b3JrCi0gICAgcnYgPSBzbnByaW50ZihjbWQsIHNpemVvZihjbWQpLCAiJXMiLCBDTURfU1RPUF9GUkFNRVdPUkspOwotICAgIGlmIChydiA+PSAoc2lnbmVkKSBzaXplb2YoY21kKSAtIDEpIHsKLSAgICAgICAgdGVzdFByaW50RSgiQ29tbWFuZCB0b28gbG9uZyBmb3I6ICVzIiwgQ01EX1NUT1BfRlJBTUVXT1JLKTsKLSAgICAgICAgZXhpdCgxNCk7Ci0gICAgfQotICAgIHRlc3RFeGVjQ21kKGNtZCk7Ci0gICAgdGVzdERlbGF5KDEuMCk7IC8vIFRPRE8gLSBuZWVkIG1lYW5zIHRvIHF1ZXJ5IHdoZXRoZXIgYXN5bmNyb25vdXMgc3RvcAotICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXdvcmsgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuICBGb3Igbm93LCBqdXN0IHdhaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gYSBsb25nIHRpbWUuCi0KLSAgICBpbml0KCk7Ci0KLSAgICAvLyBGb3IgZWFjaCBwYXNzCi0gICAgZ2V0dGltZW9mZGF5KCZzdGFydFRpbWUsIE5VTEwpOwotICAgIGZvciAocGFzcyA9IHN0YXJ0UGFzczsgcGFzcyA8PSBlbmRQYXNzOyBwYXNzKyspIHsKLSAgICAgICAgLy8gU3RvcCBpZiBkdXJhdGlvbiBvZiB3b3JrIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkCi0gICAgICAgIGdldHRpbWVvZmRheSgmY3VycmVudFRpbWUsIE5VTEwpOwotICAgICAgICBkZWx0YSA9IHR2RGVsdGEoJnN0YXJ0VGltZSwgJmN1cnJlbnRUaW1lKTsKLSAgICAgICAgaWYgKHR2MmRvdWJsZSgmZGVsdGEpID4gZHVyYXRpb24pIHsgYnJlYWs7IH0KLQotICAgICAgICAvLyBSZWdlbmVyYXRlIGEgbmV3IHNldCBvZiB0ZXN0IGZyYW1lcyB3aGVuIHRoaXMgcGFzcyBpcwotICAgICAgICAvLyBlaXRoZXIgdGhlIGZpcnN0IHBhc3Mgb3IgaXMgaW4gYSBkaWZmZXJlbnQgZ3JvdXAgdGhlbgotICAgICAgICAvLyB0aGUgcHJldmlvdXMgcGFzcy4gIEEgZ3JvdXAgb2YgcGFzc2VzIGFyZSBwYXNzZXMgdGhhdAotICAgICAgICAvLyBhbGwgaGF2ZSB0aGUgc2FtZSBxdW90aWVudCB3aGVuIHRoZWlyIHBhc3MgbnVtYmVyIGlzCi0gICAgICAgIC8vIGRpdmlkZWQgYnkgcGFzc2VzUGVyR3JvdXAuCi0gICAgICAgIGlmICgocGFzcyA9PSBzdGFydFBhc3MpCi0gICAgICAgICAgICB8fCAoKHBhc3MgLyBwYXNzZXNQZXJHcm91cCkgIT0gKChwYXNzIC0gMSkgLyBwYXNzZXNQZXJHcm91cCkpKSB7Ci0gICAgICAgICAgICBpbml0RnJhbWVzKHBhc3MgLyBwYXNzZXNQZXJHcm91cCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0UHJpbnRJKCI9PT09IFN0YXJ0aW5nIHBhc3M6ICV1IiwgcGFzcyk7Ci0KLSAgICAgICAgLy8gQ2F1c2UgZGV0ZXJtaW5pc3RpYyBzZXF1ZW5jZSBvZiBwcmFuZG9tIG51bWJlcnMgdG8gYmUKLSAgICAgICAgLy8gZ2VuZXJhdGVkIGZvciB0aGlzIHBhc3MuCi0gICAgICAgIHNyYW5kNDgocGFzcyk7Ci0KLSAgICAgICAgaHdjX2xheWVyX2xpc3RfdCAqbGlzdDsKLSAgICAgICAgbGlzdCA9IGh3Y1Rlc3RDcmVhdGVMYXllckxpc3QodGVzdFJhbmRNb2QoZnJhbWVzLnNpemUoKSkgKyAxKTsKLSAgICAgICAgaWYgKGxpc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgdGVzdFByaW50RSgiaHdjVGVzdENyZWF0ZUxheWVyTGlzdCBmYWlsZWQiKTsKLSAgICAgICAgICAgIGV4aXQoMjApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUHJhbmRvbWx5IHNlbGVjdCBhIHN1YnNldCBvZiBmcmFtZXMgdG8gYmUgdXNlZCBieSB0aGlzIHBhc3MuCi0gICAgICAgIHZlY3RvciA8dmVjdG9yIDxzcDxHcmFwaGljQnVmZmVyPiA+ID4gc2VsZWN0ZWRGcmFtZXM7Ci0gICAgICAgIHNlbGVjdGVkRnJhbWVzID0gdmVjdG9yUmFuZFNlbGVjdChmcmFtZXMsIGxpc3QtPm51bUh3TGF5ZXJzKTsKLQotICAgICAgICAvLyBBbnkgdHJhbnNmb3JtIHRlbmRzIHRvIGNyZWF0ZSBhIGxheWVyIHRoYXQgdGhlIGhhcmR3YXJlCi0gICAgICAgIC8vIGNvbXBvc2VyIGlzIHVuYWJsZSB0byBzdXBwb3J0IGFuZCB0aHVzIGhhcyB0byBsZWF2ZSBmb3IKLSAgICAgICAgLy8gU3VyZmFjZUZsaW5nZXIuICBQbGFjZSBoZWF2eSBiaWFzIG9uIHNwZWNpZnlpbmcgbm8gdHJhbnNmb3Jtcy4KLSAgICAgICAgYm9vbCBub1RyYW5zZm9ybSA9IHRlc3RSYW5kRnJhY3QoKSA+IHJhcmVSYXRpbzsKLQotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBuMSA9IDA7IG4xIDwgbGlzdC0+bnVtSHdMYXllcnM7IG4xKyspIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZHggPSB0ZXN0UmFuZE1vZChzZWxlY3RlZEZyYW1lc1tuMV0uc2l6ZSgpKTsKLSAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdCdWYgPSBzZWxlY3RlZEZyYW1lc1tuMV1baWR4XTsKLSAgICAgICAgICAgIGh3Y19sYXllcl90ICpsYXllciA9ICZsaXN0LT5od0xheWVyc1tuMV07Ci0gICAgICAgICAgICBsYXllci0+aGFuZGxlID0gZ0J1Zi0+aGFuZGxlOwotCi0gICAgICAgICAgICBsYXllci0+YmxlbmRpbmcgPSBibGVuZGluZ09wc1t0ZXN0UmFuZE1vZChOVU1BKGJsZW5kaW5nT3BzKSldOwotICAgICAgICAgICAgbGF5ZXItPmZsYWdzID0gKHRlc3RSYW5kRnJhY3QoKSA+IHJhcmVSYXRpbykgPyAwCi0gICAgICAgICAgICAgICAgOiB2ZWN0b3JPcih2ZWN0b3JSYW5kU2VsZWN0KHZlY0xheWVyRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UmFuZE1vZCh2ZWNMYXllckZsYWdzLnNpemUoKSArIDEpKSk7Ci0gICAgICAgICAgICBsYXllci0+dHJhbnNmb3JtID0gKG5vVHJhbnNmb3JtIHx8IHRlc3RSYW5kRnJhY3QoKSA+IHJhcmVSYXRpbykgPyAwCi0gICAgICAgICAgICAgICAgOiB2ZWN0b3JPcih2ZWN0b3JSYW5kU2VsZWN0KHZlY1RyYW5zZm9ybUZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJhbmRNb2QodmVjVHJhbnNmb3JtRmxhZ3Muc2l6ZSgpICsgMSkpKTsKLSAgICAgICAgICAgIGxheWVyLT5zb3VyY2VDcm9wLmxlZnQgPSB0ZXN0UmFuZE1vZChnQnVmLT5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgIGxheWVyLT5zb3VyY2VDcm9wLnRvcCA9IHRlc3RSYW5kTW9kKGdCdWYtPmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIGxheWVyLT5zb3VyY2VDcm9wLnJpZ2h0ID0gbGF5ZXItPnNvdXJjZUNyb3AubGVmdAotICAgICAgICAgICAgICAgICsgdGVzdFJhbmRNb2QoZ0J1Zi0+Z2V0V2lkdGgoKSAtIGxheWVyLT5zb3VyY2VDcm9wLmxlZnQpICsgMTsKLSAgICAgICAgICAgIGxheWVyLT5zb3VyY2VDcm9wLmJvdHRvbSA9IGxheWVyLT5zb3VyY2VDcm9wLnRvcAotICAgICAgICAgICAgICAgICsgdGVzdFJhbmRNb2QoZ0J1Zi0+Z2V0SGVpZ2h0KCkgLSBsYXllci0+c291cmNlQ3JvcC50b3ApICsgMTsKLSAgICAgICAgICAgIGxheWVyLT5kaXNwbGF5RnJhbWUubGVmdCA9IHRlc3RSYW5kTW9kKHdpZHRoKTsKLSAgICAgICAgICAgIGxheWVyLT5kaXNwbGF5RnJhbWUudG9wID0gdGVzdFJhbmRNb2QoaGVpZ2h0KTsKLSAgICAgICAgICAgIGxheWVyLT5kaXNwbGF5RnJhbWUucmlnaHQgPSBsYXllci0+ZGlzcGxheUZyYW1lLmxlZnQKLSAgICAgICAgICAgICAgICArIHRlc3RSYW5kTW9kKHdpZHRoIC0gbGF5ZXItPmRpc3BsYXlGcmFtZS5sZWZ0KSArIDE7Ci0gICAgICAgICAgICBsYXllci0+ZGlzcGxheUZyYW1lLmJvdHRvbSA9IGxheWVyLT5kaXNwbGF5RnJhbWUudG9wCi0gICAgICAgICAgICAgICAgKyB0ZXN0UmFuZE1vZChoZWlnaHQgLSBsYXllci0+ZGlzcGxheUZyYW1lLnRvcCkgKyAxOwotCi0gICAgICAgICAgICAvLyBJbmNyZWFzZSB0aGUgZnJlcXVlbmN5IHRoYXQgYSBzY2FsZSBmYWN0b3Igb2YgMS4wIGZyb20KLSAgICAgICAgICAgIC8vIHRoZSBzb3VyY2VDcm9wIHRvIGRpc3BsYXlGcmFtZSBvY2N1cnMuICBUaGlzIGlzIHRoZQotICAgICAgICAgICAgLy8gbW9zdCBjb21tb24gc2NhbGUgZmFjdG9yIHVzZWQgYnkgYXBwbGljYXRpb25zIGFuZCB3b3VsZAotICAgICAgICAgICAgLy8gYmUgcmFyZWx5IHByb2R1Y2VkIGJ5IHRoaXMgc3RyZXNzIHRlc3Qgd2l0aG91dCB0aGlzCi0gICAgICAgICAgICAvLyBsb2dpYy4KLSAgICAgICAgICAgIGlmICh0ZXN0UmFuZEZyYWN0KCkgPD0gZnJlcVJhdGlvKSB7Ci0gICAgICAgICAgICAgICAgLy8gT25seSBjaGFuZ2UgdG8gc2NhbGUgZmFjdG9yIHRvIDEuMCBpZiBib3RoIHRoZQotICAgICAgICAgICAgICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgd2lsbCBmaXQuCi0gICAgICAgICAgICAgICAgaW50IHNvdXJjZVdpZHRoID0gbGF5ZXItPnNvdXJjZUNyb3AucmlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGxheWVyLT5zb3VyY2VDcm9wLmxlZnQ7Ci0gICAgICAgICAgICAgICAgaW50IHNvdXJjZUhlaWdodCA9IGxheWVyLT5zb3VyY2VDcm9wLmJvdHRvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGxheWVyLT5zb3VyY2VDcm9wLnRvcDsKLSAgICAgICAgICAgICAgICBpZiAoKChsYXllci0+ZGlzcGxheUZyYW1lLmxlZnQgKyBzb3VyY2VXaWR0aCkgPD0gd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICYmICgobGF5ZXItPmRpc3BsYXlGcmFtZS50b3AgKyBzb3VyY2VIZWlnaHQpIDw9IGhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRpc3BsYXlGcmFtZS5yaWdodCA9IGxheWVyLT5kaXNwbGF5RnJhbWUubGVmdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzb3VyY2VXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRpc3BsYXlGcmFtZS5ib3R0b20gPSBsYXllci0+ZGlzcGxheUZyYW1lLnRvcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc291cmNlSGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4ubnVtUmVjdHMgPSAxOwotICAgICAgICAgICAgbGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4ucmVjdHMgPSAmbGF5ZXItPmRpc3BsYXlGcmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFBlcmZvcm0gcHJlcGFyZSBvcGVyYXRpb24KLSAgICAgICAgaWYgKHZlcmJvc2UpIHsgdGVzdFByaW50SSgiUHJlcGFyZToiKTsgaHdjVGVzdERpc3BsYXlMaXN0KGxpc3QpOyB9Ci0gICAgICAgIGh3Y0RldmljZS0+cHJlcGFyZShod2NEZXZpY2UsIGxpc3QpOwotICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgdGVzdFByaW50SSgiUG9zdCBQcmVwYXJlOiIpOwotICAgICAgICAgICAgaHdjVGVzdERpc3BsYXlMaXN0UHJlcGFyZU1vZGlmaWFibGUobGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUdXJuIG9mZiB0aGUgZ2VvbWV0cnkgY2hhbmdlZCBmbGFnCi0gICAgICAgIGxpc3QtPmZsYWdzICY9IH5IV0NfR0VPTUVUUllfQ0hBTkdFRDsKLQotICAgICAgICAvLyBQZXJmb3JtIHRoZSBzZXQgb3BlcmF0aW9uKHMpCi0gICAgICAgIGlmICh2ZXJib3NlKSB7dGVzdFByaW50SSgiU2V0OiIpOyB9Ci0gICAgICAgIGZvciAodW5zaWduZWQgaW50IG4xID0gMDsgbjEgPCBudW1TZXQ7IG4xKyspIHsKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7IGh3Y1Rlc3REaXNwbGF5TGlzdEhhbmRsZXMobGlzdCk7IH0KLSAgICAgICAgICAgIGh3Y0RldmljZS0+c2V0KGh3Y0RldmljZSwgZHB5LCBzdXJmYWNlLCBsaXN0KTsKLQotICAgICAgICAgICAgLy8gUHJhbmRvbWx5IHNlbGVjdCBhIG5ldyBzZXQgb2YgaGFuZGxlcwotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgbjEgPSAwOyBuMSA8IGxpc3QtPm51bUh3TGF5ZXJzOyBuMSsrKSB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkeCA9IHRlc3RSYW5kTW9kKHNlbGVjdGVkRnJhbWVzW24xXS5zaXplKCkpOwotICAgICAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdCdWYgPSBzZWxlY3RlZEZyYW1lc1tuMV1baWR4XTsKLSAgICAgICAgICAgICAgICBod2NfbGF5ZXJfdCAqbGF5ZXIgPSAmbGlzdC0+aHdMYXllcnNbbjFdOwotICAgICAgICAgICAgICAgIGxheWVyLT5oYW5kbGUgPSAobmF0aXZlX2hhbmRsZV90ICopIGdCdWYtPmhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVzdERlbGF5KHBlclNldERlbGF5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGh3Y1Rlc3RGcmVlTGF5ZXJMaXN0KGxpc3QpOwotICAgICAgICB0ZXN0UHJpbnRJKCI9PT09IENvbXBsZXRlZCBwYXNzOiAldSIsIHBhc3MpOwotICAgIH0KLQotICAgIHRlc3REZWxheShlbmREZWxheSk7Ci0KLSAgICAvLyBTdGFydCBmcmFtZXdvcmsKLSAgICBydiA9IHNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksICIlcyIsIENNRF9TVEFSVF9GUkFNRVdPUkspOwotICAgIGlmIChydiA+PSAoc2lnbmVkKSBzaXplb2YoY21kKSAtIDEpIHsKLSAgICAgICAgdGVzdFByaW50RSgiQ29tbWFuZCB0b28gbG9uZyBmb3I6ICVzIiwgQ01EX1NUQVJUX0ZSQU1FV09SSyk7Ci0gICAgICAgIGV4aXQoMjEpOwotICAgIH0KLSAgICB0ZXN0RXhlY0NtZChjbWQpOwotCi0gICAgdGVzdFByaW50SSgiU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAldSBwYXNzZXMiLCBwYXNzIC0gc3RhcnRQYXNzKTsKLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIGluaXQodm9pZCkKLXsKLSAgICBzcmFuZDQ4KDApOyAvLyBEZWZlbnNpdmVseSBzZXQgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgotICAgICAgICAgICAgICAgIC8vIFNob3VsZCBub3QgbmVlZCB0byBzZXQgdGhpcywgYmVjYXVzZSBhIHN0cmVzcyB0ZXN0Ci0gICAgICAgICAgICAgICAgLy8gc2V0cyB0aGUgc2VlZCBvbiBlYWNoIHBhc3MuICBEZWZlbnNpdmVseSBzZXQgaXQgaGVyZQotICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgZnV0dXJlIGNvZGUgdGhhdCB1c2VzIHBzZXVkbyByYW5kb20gbnVtYmVycwotICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgZmlyc3QgcGFzcyB3aWxsIGJlIGRldGVybWluaXN0aWMuCi0KLSAgICBod2NUZXN0SW5pdERpc3BsYXkodmVyYm9zZSwgJmRweSwgJnN1cmZhY2UsICZ3aWR0aCwgJmhlaWdodCk7Ci0KLSAgICBod2NUZXN0T3Blbkh3YygmaHdjRGV2aWNlKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgRnJhbWVzCi0gKgotICogQ3JlYXRlcyBhbiBhcnJheSBvZiBncmFwaGljIGJ1ZmZlcnMsIHdpdGhpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlCi0gKiBuYW1lZCBmcmFtZXMuICBUaGUgZ3JhcGhpYyBidWZmZXJzIGFyZSBjb250YWluZWQgd2l0aGluIGEgdmVjdG9yIG9mCi0gKiB2ZWN0b3JzLiAgQWxsIHRoZSBncmFwaGljIGJ1ZmZlcnMgaW4gYSBwYXJ0aWN1bGFyIHJvdyBhcmUgb2YgdGhlIHNhbWUKLSAqIGZvcm1hdCBhbmQgZGltZW5zaW9uLiAgRWFjaCBncmFwaGljIGJ1ZmZlciBpcyB1bmlmb3JtbHkgZmlsbGVkIHdpdGggYQotICogcHJhbmRvbWx5IHNlbGVjdGVkIGNvbG9yLiAgSXQgaXMgbGlrZWx5IHRoYXQgZWFjaCBidWZmZXIsIGV2ZW4KLSAqIGluIHRoZSBzYW1lIHJvdywgd2lsbCBiZSBmaWxsZWQgd2l0aCBhIHVuaXF1ZSBjb2xvci4KLSAqLwotdm9pZCBpbml0RnJhbWVzKHVuc2lnbmVkIGludCBzZWVkKQotewotICAgIGludCBydjsKLSAgICBjb25zdCBzaXplX3QgbWF4Um93cyA9IDU7Ci0gICAgY29uc3Qgc2l6ZV90IG1pbkNvbHMgPSAyOyAgLy8gTmVlZCBhdCBsZWFzdCBkb3VibGUgYnVmZmVyaW5nCi0gICAgY29uc3Qgc2l6ZV90IG1heENvbHMgPSA0OyAgLy8gT25lIG1vcmUgdGhhbiB0cmlwbGUgYnVmZmVyaW5nCi0KLSAgICBpZiAodmVyYm9zZSkgeyB0ZXN0UHJpbnRJKCJpbml0RnJhbWVzIHNlZWQ6ICV1Iiwgc2VlZCk7IH0KLSAgICBzcmFuZDQ4KHNlZWQpOwotICAgIHNpemVfdCByb3dzID0gdGVzdFJhbmRNb2QobWF4Um93cykgKyAxOwotCi0gICAgZnJhbWVzLmNsZWFyKCk7Ci0gICAgZnJhbWVzLnJlc2l6ZShyb3dzKTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7Ci0gICAgICAgIC8vIEFsbCBmcmFtZXMgd2l0aGluIGEgcm93IGhhdmUgdG8gaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYW5kCi0gICAgICAgIC8vIGRpbWVuc2lvbnMuICBXaWR0aCBhbmQgaGVpZ2h0IG5lZWQgdG8gYmUgPj0gMS4KLSAgICAgICAgdW5zaWduZWQgaW50IGZvcm1hdElkeCA9IHRlc3RSYW5kTW9kKE5VTUEoaHdjVGVzdEdyYXBoaWNGb3JtYXQpKTsKLSAgICAgICAgY29uc3Qgc3RydWN0IGh3Y1Rlc3RHcmFwaGljRm9ybWF0ICpmb3JtYXRQdHIKLSAgICAgICAgICAgID0gJmh3Y1Rlc3RHcmFwaGljRm9ybWF0W2Zvcm1hdElkeF07Ci0gICAgICAgIGludCBmb3JtYXQgPSBmb3JtYXRQdHItPmZvcm1hdDsKLQotICAgICAgICAvLyBQaWNrIHdpZHRoIGFuZCBoZWlnaHQsIHdoaWNoIG11c3QgYmUgPj0gMSBhbmQgdGhlIHNpemUKLSAgICAgICAgLy8gbW9kIHRoZSB3TW9kL2hNb2QgdmFsdWUgbXVzdCBiZSBlcXVhbCB0byAwLgotICAgICAgICBzaXplX3QgdyA9ICh3aWR0aCAqIG1heFNpemVSYXRpbykgKiB0ZXN0UmFuZEZyYWN0KCk7Ci0gICAgICAgIHNpemVfdCBoID0gKGhlaWdodCAqIG1heFNpemVSYXRpbykgKiB0ZXN0UmFuZEZyYWN0KCk7Ci0gICAgICAgIHcgPSBtYXgoMXUsIHcpOwotICAgICAgICBoID0gbWF4KDF1LCBoKTsKLSAgICAgICAgaWYgKCh3ICUgZm9ybWF0UHRyLT53TW9kKSAhPSAwKSB7Ci0gICAgICAgICAgICB3ICs9IGZvcm1hdFB0ci0+d01vZCAtICh3ICUgZm9ybWF0UHRyLT53TW9kKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGggJSBmb3JtYXRQdHItPmhNb2QpICE9IDApIHsKLSAgICAgICAgICAgIGggKz0gZm9ybWF0UHRyLT5oTW9kIC0gKGggJSBmb3JtYXRQdHItPmhNb2QpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRJKCIgIGZyYW1lICV1IHdpZHRoOiAldSBoZWlnaHQ6ICV1IGZvcm1hdDogJXUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICByb3csIHcsIGgsIGZvcm1hdCwgaHdjVGVzdEdyYXBoaWNGb3JtYXQyc3RyKGZvcm1hdCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGNvbHMgPSB0ZXN0UmFuZE1vZCgobWF4Q29scyArIDEpIC0gbWluQ29scykgKyBtaW5Db2xzOwotICAgICAgICBmcmFtZXNbcm93XS5yZXNpemUoY29scyk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSB7Ci0gICAgICAgICAgICBDb2xvckZyYWN0IGNvbG9yKHRlc3RSYW5kRnJhY3QoKSwgdGVzdFJhbmRGcmFjdCgpLCB0ZXN0UmFuZEZyYWN0KCkpOwotICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSB0ZXN0UmFuZEZyYWN0KCk7Ci0KLSAgICAgICAgICAgIGZyYW1lc1tyb3ddW2NvbF0gPSBuZXcgR3JhcGhpY0J1ZmZlcih3LCBoLCBmb3JtYXQsIHRleFVzYWdlKTsKLSAgICAgICAgICAgIGlmICgocnYgPSBmcmFtZXNbcm93XVtjb2xdLT5pbml0Q2hlY2soKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJHcmFwaGljQnVmZmVyIGluaXRDaGVjayBmYWlsZWQsIHJ2OiAlaSIsIHJ2KTsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCIgIGZyYW1lICV1IHdpZHRoOiAldSBoZWlnaHQ6ICV1IGZvcm1hdDogJXUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LCB3LCBoLCBmb3JtYXQsIGh3Y1Rlc3RHcmFwaGljRm9ybWF0MnN0cihmb3JtYXQpKTsKLSAgICAgICAgICAgICAgICBleGl0KDgwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaHdjVGVzdEZpbGxDb2xvcihmcmFtZXNbcm93XVtjb2xdLmdldCgpLCBjb2xvciwgYWxwaGEpOwotICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRJKCIgICAgYnVmOiAlcCBoYW5kbGU6ICVwIGNvbG9yOiAlcyBhbHBoYTogJWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzW3Jvd11bY29sXS5nZXQoKSwgZnJhbWVzW3Jvd11bY29sXS0+aGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKGNvbG9yKS5jX3N0cigpLCBhbHBoYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qCi0gKiBWZWN0b3IgUmFuZG9tIFNlbGVjdAotICoKLSAqIFByYW5kb21seSBzZWxlY3RzIGFuZCByZXR1cm5zIG51bSBlbGVtZW50cyBmcm9tIHZlYy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci12ZWN0b3I8VD4gdmVjdG9yUmFuZFNlbGVjdChjb25zdCB2ZWN0b3I8VD4mIHZlYywgc2l6ZV90IG51bSkKLXsKLSAgICB2ZWN0b3I8VD4gcnYgPSB2ZWM7Ci0KLSAgICB3aGlsZSAocnYuc2l6ZSgpID4gbnVtKSB7Ci0gICAgICAgIHJ2LmVyYXNlKHJ2LmJlZ2luKCkgKyB0ZXN0UmFuZE1vZChydi5zaXplKCkpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLS8qCi0gKiBWZWN0b3IgT3IKLSAqCi0gKiBPcidzIHRvZ2V0aGVuIHRoZSB2YWx1ZXMgb2YgZWFjaCBlbGVtZW50IG9mIHZlYyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLVQgdmVjdG9yT3IoY29uc3QgdmVjdG9yPFQ+JiB2ZWMpCi17Ci0gICAgVCBydiA9IDA7Ci0KLSAgICBmb3IgKHNpemVfdCBuMSA9IDA7IG4xIDwgdmVjLnNpemUoKTsgbjErKykgewotICAgICAgICBydiB8PSB2ZWNbbjFdOwotICAgIH0KLQotICAgIHJldHVybiBydjsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9od2MvaHdjVGVzdExpYi5jcHAgYi9vcGVuZ2wvdGVzdHMvaHdjL2h3Y1Rlc3RMaWIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGUwYzNmLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9od2MvaHdjVGVzdExpYi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyoKLSAqIEhhcmR3YXJlIENvbXBvc2VyIFRlc3QgTGlicmFyeQotICogVXRpbGl0eSBsaWJyYXJ5IGZ1bmN0aW9ucyBmb3IgdXNlIGJ5IHRoZSBIYXJkd2FyZSBDb21wb3NlciB0ZXN0IGNhc2VzCi0gKi8KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+IC8vIEZvciBudG9obCgpIGFuZCBodG9ubCgpCi0KLSNpbmNsdWRlICJod2NUZXN0TGliLmgiCi0KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi0vLyBEZWZpbmVzCi0jZGVmaW5lIE5VTUEoYSkgKHNpemVvZihhKSAvIHNpemVvZihhIFswXSkpCi0KLS8vIEZ1bmN0aW9uIFByb3RvdHlwZXMKLXN0YXRpYyB2b2lkIHByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpOwotc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwgPSBFR0xfVFJVRSk7Ci1zdGF0aWMgdm9pZCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApOwotc3RhdGljIHZvaWQgcHJpbnRFR0xDb25maWd1cmF0aW9uKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnKTsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi0KLSNkZWZpbmUgQklUU1BFUkJZVEUgICAgICAgICAgICA4IC8vIFRPRE86IE9idGFpbiBmcm9tIDx2YWx1ZXMuaD4sIG9uY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGhhcyBiZWVuIGFkZGVkCi0KLS8vIEluaXRpYWxpemUgRGlzcGxheQotdm9pZCBod2NUZXN0SW5pdERpc3BsYXkoYm9vbCB2ZXJib3NlLCBFR0xEaXNwbGF5ICpkcHksIEVHTFN1cmZhY2UgKnN1cmZhY2UsCi0gICAgRUdMaW50ICp3aWR0aCwgRUdMaW50ICpoZWlnaHQpCi17Ci0gICAgc3RhdGljIEVHTENvbnRleHQgY29udGV4dDsKLQotICAgIGludCBydjsKLQotICAgIEVHTEJvb2xlYW4gcmV0dXJuVmFsdWU7Ci0gICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9OwotICAgIEVHTGludCBjb250ZXh0QXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgc0NvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1dJTkRPV19CSVQsCi0gICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb247Ci0KLSAgICBjaGVja0VnbEVycm9yKCI8aW5pdD4iKTsKLSAgICAqZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXREaXNwbGF5Iik7Ci0gICAgaWYgKCpkcHkgPT0gRUdMX05PX0RJU1BMQVkpIHsKLSAgICAgICAgdGVzdFByaW50RSgiZWdsR2V0RGlzcGxheSByZXR1cm5lZCBFR0xfTk9fRElTUExBWSIpOwotICAgICAgICBleGl0KDcwKTsKLSAgICB9Ci0KLSAgICByZXR1cm5WYWx1ZSA9IGVnbEluaXRpYWxpemUoKmRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsSW5pdGlhbGl6ZSIsIHJldHVyblZhbHVlKTsKLSAgICBpZiAodmVyYm9zZSkgewotICAgICAgICB0ZXN0UHJpbnRJKCJFR0wgdmVyc2lvbiAlZC4lZCIsIG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uKTsKLSAgICB9Ci0gICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHRlc3RQcmludEUoImVnbEluaXRpYWxpemUgZmFpbGVkIik7Ci0gICAgICAgIGV4aXQoNzEpOwotICAgIH0KLQotICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOwotICAgIGlmICh3aW5kb3cgPT0gTlVMTCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlIGZhaWxlZCIpOwotICAgICAgICBleGl0KDcyKTsKLSAgICB9Ci0gICAgcmV0dXJuVmFsdWUgPSBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KCpkcHksCi0gICAgICAgIHNDb25maWdBdHRyaWJzLCB3aW5kb3csICZteUNvbmZpZyk7Ci0gICAgaWYgKHJldHVyblZhbHVlKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coKSByZXR1cm5lZCAlZCIsCi0gICAgICAgICAgICByZXR1cm5WYWx1ZSk7Ci0gICAgICAgIGV4aXQoNzMpOwotICAgIH0KLSAgICBjaGVja0VnbEVycm9yKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93Iik7Ci0KLSAgICBpZiAodmVyYm9zZSkgewotICAgICAgICB0ZXN0UHJpbnRJKCJDaG9zZSB0aGlzIGNvbmZpZ3VyYXRpb246Iik7Ci0gICAgICAgIHByaW50RUdMQ29uZmlndXJhdGlvbigqZHB5LCBteUNvbmZpZyk7Ci0gICAgfQotCi0gICAgKnN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKCpkcHksIG15Q29uZmlnLCB3aW5kb3csIE5VTEwpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZVdpbmRvd1N1cmZhY2UiKTsKLSAgICBpZiAoKnN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgdGVzdFByaW50RSgiZ2VsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWQuIik7Ci0gICAgICAgIGV4aXQoNzQpOwotICAgIH0KLQotICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KCpkcHksIG15Q29uZmlnLCBFR0xfTk9fQ09OVEVYVCwgY29udGV4dEF0dHJpYnMpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZUNvbnRleHQiKTsKLSAgICBpZiAoY29udGV4dCA9PSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZCIpOwotICAgICAgICBleGl0KDc1KTsKLSAgICB9Ci0gICAgcmV0dXJuVmFsdWUgPSBlZ2xNYWtlQ3VycmVudCgqZHB5LCAqc3VyZmFjZSwgKnN1cmZhY2UsIGNvbnRleHQpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbE1ha2VDdXJyZW50IiwgcmV0dXJuVmFsdWUpOwotICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWQiKTsKLSAgICAgICAgZXhpdCg3Nik7Ci0gICAgfQotICAgIGVnbFF1ZXJ5U3VyZmFjZSgqZHB5LCAqc3VyZmFjZSwgRUdMX1dJRFRILCB3aWR0aCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7Ci0gICAgZWdsUXVlcnlTdXJmYWNlKCpkcHksICpzdXJmYWNlLCBFR0xfSEVJR0hULCBoZWlnaHQpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOwotCi0gICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgdGVzdFByaW50SSgiV2luZG93IGRpbWVuc2lvbnM6ICVkIHggJWQiLCAqd2lkdGgsICpoZWlnaHQpOwotCi0gICAgICAgIHByaW50R0xTdHJpbmcoIlZlcnNpb24iLCBHTF9WRVJTSU9OKTsKLSAgICAgICAgcHJpbnRHTFN0cmluZygiVmVuZG9yIiwgR0xfVkVORE9SKTsKLSAgICAgICAgcHJpbnRHTFN0cmluZygiUmVuZGVyZXIiLCBHTF9SRU5ERVJFUik7Ci0gICAgICAgIHByaW50R0xTdHJpbmcoIkV4dGVuc2lvbnMiLCBHTF9FWFRFTlNJT05TKTsKLSAgICB9Ci19Ci0KLS8vIE9wZW4gSGFyZHdhcmUgQ29tcG9zZXIgRGV2aWNlCi12b2lkIGh3Y1Rlc3RPcGVuSHdjKGh3Y19jb21wb3Nlcl9kZXZpY2VfdCAqKmh3Y0RldmljZVB0cikKLXsKLSAgICBpbnQgcnY7Ci0gICAgaHdfbW9kdWxlX3QgY29uc3QgKmh3Y01vZHVsZTsKLQotICAgIGlmICgocnYgPSBod19nZXRfbW9kdWxlKEhXQ19IQVJEV0FSRV9NT0RVTEVfSUQsICZod2NNb2R1bGUpKSAhPSAwKSB7Ci0gICAgICAgIHRlc3RQcmludEUoImh3X2dldF9tb2R1bGUgZmFpbGVkLCBydjogJWkiLCBydik7Ci0gICAgICAgIGVycm5vID0gLXJ2OwotICAgICAgICBwZXJyb3IoTlVMTCk7Ci0gICAgICAgIGV4aXQoNzcpOwotICAgIH0KLSAgICBpZiAoKHJ2ID0gaHdjX29wZW4oaHdjTW9kdWxlLCBod2NEZXZpY2VQdHIpKSAhPSAwKSB7Ci0gICAgICAgIHRlc3RQcmludEUoImh3Y19vcGVuIGZhaWxlZCwgcnY6ICVpIiwgcnYpOwotICAgICAgICBlcnJubyA9IC1ydjsKLSAgICAgICAgcGVycm9yKE5VTEwpOwotICAgICAgICBleGl0KDc4KTsKLSAgICB9Ci19Ci0KLS8vIENvbG9yIGZyYWN0aW9uIGNsYXNzIHRvIHN0cmluZyBjb252ZXJzaW9uCi1Db2xvckZyYWN0OjpvcGVyYXRvciBzdHJpbmcoKQotewotICAgIG9zdHJpbmdzdHJlYW0gb3V0OwotCi0gICAgb3V0IDw8ICdbJyA8PCB0aGlzLT5jMSgpIDw8ICIsICIKLSAgICAgICAgPDwgdGhpcy0+YzIoKSA8PCAiLCAiCi0gICAgICAgIDw8IHRoaXMtPmMzKCkgPDwgJ10nOwotCi0gICAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLy8gRGltZW5zaW9uIGNsYXNzIHRvIHN0cmluZyBjb252ZXJzaW9uCi1Id2NUZXN0RGltOjpvcGVyYXRvciBzdHJpbmcoKQotewotICAgIG9zdHJpbmdzdHJlYW0gb3V0OwotCi0gICAgb3V0IDw8ICdbJyA8PCB0aGlzLT53aWR0aCgpIDw8ICIsICIKLSAgICAgICAgPDwgdGhpcy0+aGVpZ2h0KCkgPDwgJ10nOwotCi0gICAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLy8gRGltZW5zaW9uIGNsYXNzIHRvIGh3Y19yZWN0IGNvbnZlcnNpb24KLUh3Y1Rlc3REaW06Om9wZXJhdG9yIGh3Y19yZWN0KCkgY29uc3QKLXsKLSAgICBod2NfcmVjdCByZWN0OwotCi0gICAgcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOwotCi0gICAgcmVjdC5yaWdodCA9IHRoaXMtPl93OwotICAgIHJlY3QuYm90dG9tID0gdGhpcy0+X2g7Ci0KLSAgICByZXR1cm4gcmVjdDsKLX0KLQotLy8gSGFyZHdhcmUgQ29tcG9zZXIgcmVjdGFuZ2xlIHRvIHN0cmluZyBjb252ZXJzaW9uCi1zdHJpbmcgaHdjVGVzdFJlY3Qyc3RyKGNvbnN0IHN0cnVjdCBod2NfcmVjdCYgcmVjdCkKLXsKLSAgICBvc3RyaW5nc3RyZWFtIG91dDsKLQotICAgIG91dCA8PCAnWyc7Ci0gICAgb3V0IDw8IHJlY3QubGVmdCA8PCAiLCAiOwotICAgIG91dCA8PCByZWN0LnRvcCA8PCAiLCAiOwotICAgIG91dCA8PCByZWN0LnJpZ2h0IDw8ICIsICI7Ci0gICAgb3V0IDw8IHJlY3QuYm90dG9tOwotICAgIG91dCA8PCAnXSc7Ci0KLSAgICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vLyBQYXJzZSBIV0MgcmVjdGFuZ2xlIGRlc2NyaXB0aW9uIG9mIGZvcm0gW2xlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbV0KLXN0cnVjdCBod2NfcmVjdCBod2NUZXN0UGFyc2VId2NSZWN0KGlzdHJpbmdzdHJlYW0mIGluLCBib29sJiBlcnJvcikKLXsKLSAgICBzdHJ1Y3QgaHdjX3JlY3QgcmVjdDsKLSAgICBjaGFyIGNoU3RhcnQsIGNoOwotCi0gICAgLy8gRGVmZW5zaXZlbHkgc3BlY2lmeSB0aGF0IGFuIGVycm9yIG9jY3VycmVkLiAgV2lsbCBjbGVhcgotICAgIC8vIGVycm9yIGZsYWcgaWYgYWxsIG9mIHBhcnNpbmcgc3VjY2VlZHMuCi0gICAgZXJyb3IgPSB0cnVlOwotCi0gICAgLy8gRmlyc3QgY2hhcmFjdGVyIHNob3VsZCBiZSBhIFsgb3IgPAotICAgIGluID4+IGNoU3RhcnQ7Ci0gICAgaWYgKCFpbiB8fCAoKGNoU3RhcnQgIT0gJzwnKSAmJiAoY2hTdGFydCAhPSAnWycpKSkgeyByZXR1cm4gcmVjdDsgfQotCi0gICAgLy8gTGVmdAotICAgIGluID4+IHJlY3QubGVmdDsKLSAgICBpZiAoIWluKSB7IHJldHVybiByZWN0OyB9Ci0gICAgaW4gPj4gY2g7Ci0gICAgaWYgKCFpbiB8fCAoY2ggIT0gJywnKSkgeyByZXR1cm4gcmVjdDsgfQotCi0gICAgLy8gVG9wCi0gICAgaW4gPj4gcmVjdC50b3A7Ci0gICAgaWYgKCFpbikgeyByZXR1cm4gcmVjdDsgfQotICAgIGluID4+IGNoOwotICAgIGlmICghaW4gfHwgKGNoICE9ICcsJykpIHsgcmV0dXJuIHJlY3Q7IH0KLQotICAgIC8vIFJpZ2h0Ci0gICAgaW4gPj4gcmVjdC5yaWdodDsKLSAgICBpZiAoIWluKSB7IHJldHVybiByZWN0OyB9Ci0gICAgaW4gPj4gY2g7Ci0gICAgaWYgKCFpbiB8fCAoY2ggIT0gJywnKSkgeyByZXR1cm4gcmVjdDsgfQotCi0gICAgLy8gQm90dG9tCi0gICAgaW4gPj4gcmVjdC5ib3R0b207Ci0gICAgaWYgKCFpbikgeyByZXR1cm4gcmVjdDsgfQotCi0gICAgLy8gQ2xvc2luZyA+IG9yIF0KLSAgICBpbiA+PiBjaDsKLSAgICBpZiAoIWluKSB7IHJldHVybiByZWN0OyB9Ci0gICAgaWYgKCgoY2hTdGFydCA9PSAnPCcpICYmIChjaCAhPSAnPicpKQotICAgICAgICB8fCAoKGNoU3RhcnQgPT0gJ1snKSAmJiAoY2ggIT0gJ10nKSkpIHsgcmV0dXJuIHJlY3Q7IH0KLQotICAgIC8vIFZhbGlkYXRlIHJpZ2h0IGFuZCBib3R0b20gYXJlIGdyZWF0ZXIgdGhhbiBsZWZ0IGFuZCB0b3AKLSAgICBpZiAoKHJlY3QucmlnaHQgPD0gcmVjdC5sZWZ0KSB8fCAocmVjdC5ib3R0b20gPD0gcmVjdC50b3ApKSB7IHJldHVybiByZWN0OyB9Ci0KLSAgICAvLyBNYWRlIEl0LCBjbGVhciBlcnJvciBpbmRpY2F0b3IKLSAgICBlcnJvciA9IGZhbHNlOwotCi0gICAgcmV0dXJuIHJlY3Q7Ci19Ci0KLS8vIFBhcnNlIGRpbWVuc2lvbiBvZiBmb3JtIFt3aWR0aCwgaGVpZ2h0XQotSHdjVGVzdERpbSBod2NUZXN0UGFyc2VEaW0oaXN0cmluZ3N0cmVhbSYgaW4sIGJvb2wmIGVycm9yKQotewotICAgIEh3Y1Rlc3REaW0gZGltOwotICAgIGNoYXIgY2hTdGFydCwgY2g7Ci0gICAgdWludDMyX3QgdmFsOwotCi0gICAgLy8gRGVmZW5zaXZlbHkgc3BlY2lmeSB0aGF0IGFuIGVycm9yIG9jY3VycmVkLiAgV2lsbCBjbGVhcgotICAgIC8vIGVycm9yIGZsYWcgaWYgYWxsIG9mIHBhcnNpbmcgc3VjY2VlZHMuCi0gICAgZXJyb3IgPSB0cnVlOwotCi0gICAgLy8gRmlyc3QgY2hhcmFjdGVyIHNob3VsZCBiZSBhIFsgb3IgPAotICAgIGluID4+IGNoU3RhcnQ7Ci0gICAgaWYgKCFpbiB8fCAoKGNoU3RhcnQgIT0gJzwnKSAmJiAoY2hTdGFydCAhPSAnWycpKSkgeyByZXR1cm4gZGltOyB9Ci0KLSAgICAvLyBXaWR0aAotICAgIGluID4+IHZhbDsKLSAgICBpZiAoIWluKSB7IHJldHVybiBkaW07IH0KLSAgICBkaW0uc2V0V2lkdGgodmFsKTsKLSAgICBpbiA+PiBjaDsKLSAgICBpZiAoIWluIHx8IChjaCAhPSAnLCcpKSB7IHJldHVybiBkaW07IH0KLQotICAgIC8vIEhlaWdodAotICAgIGluID4+IHZhbDsKLSAgICBpZiAoIWluKSB7IHJldHVybiBkaW07IH0KLSAgICBkaW0uc2V0SGVpZ2h0KHZhbCk7Ci0KLSAgICAvLyBDbG9zaW5nID4gb3IgXQotICAgIGluID4+IGNoOwotICAgIGlmICghaW4pIHsgcmV0dXJuIGRpbTsgfQotICAgIGlmICgoKGNoU3RhcnQgPT0gJzwnKSAmJiAoY2ggIT0gJz4nKSkKLSAgICAgICAgfHwgKChjaFN0YXJ0ID09ICdbJykgJiYgKGNoICE9ICddJykpKSB7IHJldHVybiBkaW07IH0KLQotICAgIC8vIFZhbGlkYXRlIHdpZHRoIGFuZCBoZWlnaHQgZ3JlYXRlciB0aGFuIDAKLSAgICBpZiAoKGRpbS53aWR0aCgpIDw9IDApIHx8IChkaW0uaGVpZ2h0KCkgPD0gMCkpIHsgcmV0dXJuIGRpbTsgfQotCi0gICAgLy8gTWFkZSBJdCwgY2xlYXIgZXJyb3IgaW5kaWNhdG9yCi0gICAgZXJyb3IgPSBmYWxzZTsKLSAgICByZXR1cm4gZGltOwotfQotCi0vLyBQYXJzZSBmcmFjdGlvbmFsIGNvbG9yIG9mIGZvcm0gWzAuIyMsIDAuIyMsIDAuIyNdCi0vLyBGcmFjdGlvbmFsIHZhbHVlcyBjYW4gYmUgZnJvbSAwLjAgdG8gMS4wIGluY2x1c2l2ZS4gIE5vdGUsIGludGVnZXIKLS8vIHZhbHVlcyBvZiAwLjAgYW5kIDEuMCwgd2hpY2ggYXJlIG5vbi1mcmFjdGlvbmFsLCBhcmUgY29uc2lkZXJlZCB2YWxpZC4KLS8vIFRoZXkgYXJlIGFuIGV4Y2VwdGlvbiwgYWxsIG90aGVyIHZhbGlkIGlucHV0cyBhcmUgZnJhY3Rpb25zLgotQ29sb3JGcmFjdCBod2NUZXN0UGFyc2VDb2xvcihpc3RyaW5nc3RyZWFtJiBpbiwgYm9vbCYgZXJyb3IpCi17Ci0gICAgQ29sb3JGcmFjdCBjb2xvcjsKLSAgICBjaGFyIGNoU3RhcnQsIGNoOwotICAgIGZsb2F0IGMxLCBjMiwgYzM7Ci0KLSAgICAvLyBEZWZlbnNpdmVseSBzcGVjaWZ5IHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQuICBXaWxsIGNsZWFyCi0gICAgLy8gZXJyb3IgZmxhZyBpZiBhbGwgb2YgcGFyc2luZyBzdWNjZWVkcy4KLSAgICBlcnJvciA9IHRydWU7Ci0KLSAgICAvLyBGaXJzdCBjaGFyYWN0ZXIgc2hvdWxkIGJlIGEgWyBvciA8Ci0gICAgaW4gPj4gY2hTdGFydDsKLSAgICBpZiAoIWluIHx8ICgoY2hTdGFydCAhPSAnPCcpICYmIChjaFN0YXJ0ICE9ICdbJykpKSB7IHJldHVybiBjb2xvcjsgfQotCi0gICAgLy8gMXN0IENvbXBvbmVudAotICAgIGluID4+IGMxOwotICAgIGlmICghaW4pIHsgcmV0dXJuIGNvbG9yOyB9Ci0gICAgaWYgKChjMSA8IDAuMCkgfHwgKGMxID4gMS4wKSkgeyByZXR1cm4gY29sb3I7IH0KLSAgICBpbiA+PiBjaDsKLSAgICBpZiAoIWluIHx8IChjaCAhPSAnLCcpKSB7IHJldHVybiBjb2xvcjsgfQotCi0gICAgLy8gMm5kIENvbXBvbmVudAotICAgIGluID4+IGMyOwotICAgIGlmICghaW4pIHsgcmV0dXJuIGNvbG9yOyB9Ci0gICAgaWYgKChjMiA8IDAuMCkgfHwgKGMyID4gMS4wKSkgeyByZXR1cm4gY29sb3I7IH0KLSAgICBpbiA+PiBjaDsKLSAgICBpZiAoIWluIHx8IChjaCAhPSAnLCcpKSB7IHJldHVybiBjb2xvcjsgfQotCi0gICAgLy8gM3JkIENvbXBvbmVudAotICAgIGluID4+IGMzOwotICAgIGlmICghaW4pIHsgcmV0dXJuIGNvbG9yOyB9Ci0gICAgaWYgKChjMyA8IDAuMCkgfHwgKGMzID4gMS4wKSkgeyByZXR1cm4gY29sb3I7IH0KLQotICAgIC8vIENsb3NpbmcgPiBvciBdCi0gICAgaW4gPj4gY2g7Ci0gICAgaWYgKCFpbikgeyByZXR1cm4gY29sb3I7IH0KLSAgICBpZiAoKChjaFN0YXJ0ID09ICc8JykgJiYgKGNoICE9ICc+JykpCi0gICAgICAgIHx8ICgoY2hTdGFydCA9PSAnWycpICYmIChjaCAhPSAnXScpKSkgeyByZXR1cm4gY29sb3I7IH0KLQotICAgIC8vIEFyZSBhbGwgdGhlIGNvbXBvbmVudHMgZnJhY3Rpb25hbAotICAgIGlmICgoYzEgPCAwLjApIHx8IChjMSA+IDEuMCkKLSAgICAgICAgfHwgKGMyIDwgMC4wKSB8fCAoYzIgPiAxLjApCi0gICAgICAgIHx8IChjMyA8IDAuMCkgfHwgKGMzID4gMS4wKSkgeyByZXR1cm4gY29sb3I7IH0KLQotICAgIC8vIE1hZGUgSXQsIGNsZWFyIGVycm9yIGluZGljYXRvcgotICAgIGVycm9yID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gQ29sb3JGcmFjdChjMSwgYzIsIGMzKTsKLX0KLQotLy8gTG9vayB1cCBhbmQgcmV0dXJuIHBvaW50ZXIgdG8gc3RydWN0dXJlIHdpdGggdGhlIGNoYXJhY3RlcmlzdGljcwotLy8gb2YgdGhlIGdyYXBoaWMgZm9ybWF0IG5hbWVkIGJ5IHRoZSBkZXNjIHBhcmFtZXRlci4gIFNlYXJjaCBmYWlsdXJlCi0vLyBpbmRpY2F0ZWQgYnkgdGhlIHJldHVybiBvZiBOVUxMLgotY29uc3Qgc3RydWN0IGh3Y1Rlc3RHcmFwaGljRm9ybWF0ICpod2NUZXN0R3JhcGhpY0Zvcm1hdExvb2t1cChjb25zdCBjaGFyICpkZXNjKQotewotICAgIGZvciAodW5zaWduZWQgaW50IG4xID0gMDsgbjEgPCBOVU1BKGh3Y1Rlc3RHcmFwaGljRm9ybWF0KTsgbjErKykgewotICAgICAgICBpZiAoc3RyaW5nKGRlc2MpID09IHN0cmluZyhod2NUZXN0R3JhcGhpY0Zvcm1hdFtuMV0uZGVzYykpIHsKLSAgICAgICAgICAgIHJldHVybiAmaHdjVGVzdEdyYXBoaWNGb3JtYXRbbjFdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIExvb2sgdXAgYW5kIHJldHVybiBwb2ludGVyIHRvIHN0cnVjdHVyZSB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpY3MKLS8vIG9mIHRoZSBncmFwaGljIGZvcm1hdCBzcGVjaWZpZWQgYnkgdGhlIGlkIHBhcmFtZXRlci4gIFNlYXJjaCBmYWlsdXJlCi0vLyBpbmRpY2F0ZWQgYnkgdGhlIHJldHVybiBvZiBOVUxMLgotY29uc3Qgc3RydWN0IGh3Y1Rlc3RHcmFwaGljRm9ybWF0ICpod2NUZXN0R3JhcGhpY0Zvcm1hdExvb2t1cCh1aW50MzJfdCBpZCkKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBuMSA9IDA7IG4xIDwgTlVNQShod2NUZXN0R3JhcGhpY0Zvcm1hdCk7IG4xKyspIHsKLSAgICAgICAgaWYgKGlkID09IGh3Y1Rlc3RHcmFwaGljRm9ybWF0W24xXS5mb3JtYXQpIHsKLSAgICAgICAgICAgIHJldHVybiAmaHdjVGVzdEdyYXBoaWNGb3JtYXRbbjFdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLy8gR2l2ZW4gdGhlIGludGVnZXIgSUQgb2YgYSBncmFwaGljIGZvcm1hdCwgcmV0dXJuIGEgcG9pbnRlciB0bwotLy8gYSBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIGZvcm1hdC4KLWNvbnN0IGNoYXIgKmh3Y1Rlc3RHcmFwaGljRm9ybWF0MnN0cih1aW50MzJfdCBmb3JtYXQpCi17Ci0gICAgY29uc3Qgc3RhdGljIGNoYXIgKnVua25vd24gPSAidW5rbm93biI7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBuMSA9IDA7IG4xIDwgTlVNQShod2NUZXN0R3JhcGhpY0Zvcm1hdCk7IG4xKyspIHsKLSAgICAgICAgaWYgKGZvcm1hdCA9PSBod2NUZXN0R3JhcGhpY0Zvcm1hdFtuMV0uZm9ybWF0KSB7Ci0gICAgICAgICAgICByZXR1cm4gaHdjVGVzdEdyYXBoaWNGb3JtYXRbbjFdLmRlc2M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdW5rbm93bjsKLX0KLQotLyoKLSAqIGh3Y1Rlc3RDcmVhdGVMYXllckxpc3QKLSAqIER5bmFtaWNhbGx5IGNyZWF0ZXMgbGF5ZXIgbGlzdCB3aXRoIG51bUxheWVycyB3b3J0aAotICogb2YgaHdMYXllcnMgZW50cmllcy4KLSAqLwotaHdjX2xheWVyX2xpc3RfdCAqaHdjVGVzdENyZWF0ZUxheWVyTGlzdChzaXplX3QgbnVtTGF5ZXJzKQotewotICAgIGh3Y19sYXllcl9saXN0X3QgKmxpc3Q7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihod2NfbGF5ZXJfbGlzdCkgKyBudW1MYXllcnMgKiBzaXplb2YoaHdjX2xheWVyX3QpOwotICAgIGlmICgobGlzdCA9IChod2NfbGF5ZXJfbGlzdF90ICopIGNhbGxvYygxLCBzaXplKSkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbGlzdC0+ZmxhZ3MgPSBIV0NfR0VPTUVUUllfQ0hBTkdFRDsKLSAgICBsaXN0LT5udW1Id0xheWVycyA9IG51bUxheWVyczsKLQotICAgIHJldHVybiBsaXN0OwotfQotCi0vKgotICogaHdjVGVzdEZyZWVMYXllckxpc3QKLSAqIEZyZWVzIG1lbW9yeSBwcmV2aW91cyBhbGxvY2F0ZWQgdmlhIGh3Y1Rlc3RDcmVhdGVMYXllckxpc3QoKS4KLSAqLwotdm9pZCBod2NUZXN0RnJlZUxheWVyTGlzdChod2NfbGF5ZXJfbGlzdF90ICpsaXN0KQotewotICAgIGZyZWUobGlzdCk7Ci19Ci0KLS8vIERpc3BsYXkgdGhlIHNldHRpbmdzIG9mIHRoZSBsYXllciBsaXN0IHBvaW50ZWQgdG8gYnkgbGlzdAotdm9pZCBod2NUZXN0RGlzcGxheUxpc3QoaHdjX2xheWVyX2xpc3RfdCAqbGlzdCkKLXsKLSAgICB0ZXN0UHJpbnRJKCIgIGZsYWdzOiAlI3glcyIsIGxpc3QtPmZsYWdzLAotICAgICAgICAgICAgICAgKGxpc3QtPmZsYWdzICYgSFdDX0dFT01FVFJZX0NIQU5HRUQpID8gIiBHRU9NRVRSWV9DSEFOR0VEIiA6ICIiKTsKLSAgICB0ZXN0UHJpbnRJKCIgIG51bUh3TGF5ZXJzOiAldSIsIGxpc3QtPm51bUh3TGF5ZXJzKTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGxheWVyID0gMDsgbGF5ZXIgPCBsaXN0LT5udW1Id0xheWVyczsgbGF5ZXIrKykgewotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgbGF5ZXIgJXUgY29tcG9zaXRpb25UeXBlOiAlI3glcyVzIiwgbGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgbGlzdC0+aHdMYXllcnNbbGF5ZXJdLmNvbXBvc2l0aW9uVHlwZSwKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmNvbXBvc2l0aW9uVHlwZSA9PSBIV0NfRlJBTUVCVUZGRVIpCi0gICAgICAgICAgICAgICAgICAgICAgID8gIiBGUkFNRUJVRkZFUiIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmNvbXBvc2l0aW9uVHlwZSA9PSBIV0NfT1ZFUkxBWSkKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiIE9WRVJMQVkiIDogIiIpOwotCi0gICAgICAgIHRlc3RQcmludEkoIiAgICAgIGhpbnRzOiAlI3giLAotICAgICAgICAgICAgICAgICAgIGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5oaW50cywKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmhpbnRzICYgSFdDX0hJTlRfVFJJUExFX0JVRkZFUikKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiIFRSSVBMRV9CVUZGRVIiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5oaW50cyAmIEhXQ19ISU5UX0NMRUFSX0ZCKQotICAgICAgICAgICAgICAgICAgICAgICA/ICIgQ0xFQVJfRkIiIDogIiIpOwotCi0gICAgICAgIHRlc3RQcmludEkoIiAgICAgIGZsYWdzOiAlI3glcyIsCi0gICAgICAgICAgICAgICAgICAgbGlzdC0+aHdMYXllcnNbbGF5ZXJdLmZsYWdzLAotICAgICAgICAgICAgICAgICAgIChsaXN0LT5od0xheWVyc1tsYXllcl0uZmxhZ3MgJiBIV0NfU0tJUF9MQVlFUikKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiIFNLSVBfTEFZRVIiIDogIiIpOwotCi0gICAgICAgIHRlc3RQcmludEkoIiAgICAgIGhhbmRsZTogJXAiLAotICAgICAgICAgICAgICAgICAgIGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5oYW5kbGUpOwotCi0gICAgICAgIC8vIEludGVudGlvbmFsbHkgc2tpcHBlZCBkaXNwbGF5IG9mIFJPVF8xODAgJiBST1RfMjcwLAotICAgICAgICAvLyB3aGljaCBhcmUgZm9ybWVkIGZyb20gY29tYmluYXRpb25zIG9mIHRoZSBvdGhlciBmbGFncy4KLSAgICAgICAgdGVzdFByaW50SSgiICAgICAgdHJhbnNmb3JtOiAlI3glcyVzJXMiLAotICAgICAgICAgICAgICAgICAgIGxpc3QtPmh3TGF5ZXJzW2xheWVyXS50cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS50cmFuc2Zvcm0gJiBIV0NfVFJBTlNGT1JNX0ZMSVBfSCkKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiIEZMSVBfSCIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLnRyYW5zZm9ybSAmIEhXQ19UUkFOU0ZPUk1fRkxJUF9WKQotICAgICAgICAgICAgICAgICAgICAgICA/ICIgRkxJUF9WIiA6ICIiLAotICAgICAgICAgICAgICAgICAgIChsaXN0LT5od0xheWVyc1tsYXllcl0udHJhbnNmb3JtICYgSFdDX1RSQU5TRk9STV9ST1RfOTApCi0gICAgICAgICAgICAgICAgICAgICAgID8gIiBST1RfOTAiIDogIiIpOwotCi0gICAgICAgIHRlc3RQcmludEkoIiAgICAgIGJsZW5kaW5nOiAlI3glcyVzJXMiLAotICAgICAgICAgICAgICAgICAgIGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5ibGVuZGluZywKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmJsZW5kaW5nID09IEhXQ19CTEVORElOR19OT05FKQotICAgICAgICAgICAgICAgICAgICAgICA/ICIgTk9ORSIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmJsZW5kaW5nID09IEhXQ19CTEVORElOR19QUkVNVUxUKQotICAgICAgICAgICAgICAgICAgICAgICA/ICIgUFJFTVVMVCIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmJsZW5kaW5nID09IEhXQ19CTEVORElOR19DT1ZFUkFHRSkKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiIENPVkVSQUdFIiA6ICIiKTsKLQotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgICBzb3VyY2VDcm9wOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgaHdjVGVzdFJlY3Qyc3RyKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5zb3VyY2VDcm9wKS5jX3N0cigpKTsKLSAgICAgICAgdGVzdFByaW50SSgiICAgICAgZGlzcGxheUZyYW1lOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgaHdjVGVzdFJlY3Qyc3RyKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5kaXNwbGF5RnJhbWUpLmNfc3RyKCkpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgICBzY2FsZUZhY3RvcjogWyVmLCAlZl0iLAotICAgICAgICAgICAgICAgICAgIChmbG9hdCkgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5zb3VyY2VDcm9wLnJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBsaXN0LT5od0xheWVyc1tsYXllcl0uc291cmNlQ3JvcC5sZWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAvIChmbG9hdCkgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5kaXNwbGF5RnJhbWUucmlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5kaXNwbGF5RnJhbWUubGVmdCksCi0gICAgICAgICAgICAgICAgICAgKGZsb2F0KSAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLnNvdXJjZUNyb3AuYm90dG9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBsaXN0LT5od0xheWVyc1tsYXllcl0uc291cmNlQ3JvcC50b3ApCi0gICAgICAgICAgICAgICAgICAgICAgIC8gKGZsb2F0KSAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmRpc3BsYXlGcmFtZS5ib3R0b20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5kaXNwbGF5RnJhbWUudG9wKSk7Ci0gICAgfQotfQotCi0vKgotICogRGlzcGxheSBMaXN0IFByZXBhcmUgTW9kaWZpYWJsZQotICoKLSAqIERpc3BsYXlzIHRoZSBwb3J0aW9ucyBvZiBhIGxpc3QgdGhhdCBhcmUgbWVhbnQgdG8gYmUgbW9kaWZpZWQgYnkKLSAqIGEgcHJlcGFyZSBjYWxsLgotICovCi12b2lkIGh3Y1Rlc3REaXNwbGF5TGlzdFByZXBhcmVNb2RpZmlhYmxlKGh3Y19sYXllcl9saXN0X3QgKmxpc3QpCi17Ci0gICAgdWludDMyX3QgbnVtT3ZlcmxheXMgPSAwOwotICAgIGZvciAodW5zaWduZWQgaW50IGxheWVyID0gMDsgbGF5ZXIgPCBsaXN0LT5udW1Id0xheWVyczsgbGF5ZXIrKykgewotICAgICAgICBpZiAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmNvbXBvc2l0aW9uVHlwZSA9PSBIV0NfT1ZFUkxBWSkgewotICAgICAgICAgICAgbnVtT3ZlcmxheXMrKzsKLSAgICAgICAgfQotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgbGF5ZXIgJXUgY29tcG9zaXRpb25UeXBlOiAlI3glcyVzIiwgbGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgbGlzdC0+aHdMYXllcnNbbGF5ZXJdLmNvbXBvc2l0aW9uVHlwZSwKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmNvbXBvc2l0aW9uVHlwZSA9PSBIV0NfRlJBTUVCVUZGRVIpCi0gICAgICAgICAgICAgICAgICAgICAgID8gIiBGUkFNRUJVRkZFUiIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmNvbXBvc2l0aW9uVHlwZSA9PSBIV0NfT1ZFUkxBWSkKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiIE9WRVJMQVkiIDogIiIpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgICBoaW50czogJSN4JXMlcyIsCi0gICAgICAgICAgICAgICAgICAgbGlzdC0+aHdMYXllcnNbbGF5ZXJdLmhpbnRzLAotICAgICAgICAgICAgICAgICAgIChsaXN0LT5od0xheWVyc1tsYXllcl0uaGludHMgJiBIV0NfSElOVF9UUklQTEVfQlVGRkVSKQotICAgICAgICAgICAgICAgICAgICAgICA/ICIgVFJJUExFX0JVRkZFUiIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmhpbnRzICYgSFdDX0hJTlRfQ0xFQVJfRkIpCi0gICAgICAgICAgICAgICAgICAgICAgID8gIiBDTEVBUl9GQiIgOiAiIik7Ci0gICAgfQotICAgIHRlc3RQcmludEkoIiAgICBudW1PdmVybGF5czogJXUiLCBudW1PdmVybGF5cyk7Ci19Ci0KLS8qCi0gKiBEaXNwbGF5IExpc3QgSGFuZGxlcwotICoKLSAqIERpc3BsYXlzIHRoZSBoYW5kbGVzIG9mIGFsbCB0aGUgZ3JhcGhpYyBidWZmZXJzIGluIHRoZSBsaXN0LgotICovCi12b2lkIGh3Y1Rlc3REaXNwbGF5TGlzdEhhbmRsZXMoaHdjX2xheWVyX2xpc3RfdCAqbGlzdCkKLXsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgbWF4TGF5ZXJzUGVyTGluZSA9IDY7Ci0KLSAgICBvc3RyaW5nc3RyZWFtIHN0cigiICBsYXllcnM6Iik7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgbGF5ZXIgPSAwOyBsYXllciA8IGxpc3QtPm51bUh3TGF5ZXJzOyBsYXllcisrKSB7Ci0gICAgICAgIHN0ciA8PCAnICcgPDwgbGlzdC0+aHdMYXllcnNbbGF5ZXJdLmhhbmRsZTsKLSAgICAgICAgaWYgKCgobGF5ZXIgJSBtYXhMYXllcnNQZXJMaW5lKSA9PSAobWF4TGF5ZXJzUGVyTGluZSAtIDEpKQotICAgICAgICAgICAgJiYgKGxheWVyICE9IGxpc3QtPm51bUh3TGF5ZXJzIC0gMSkpIHsKLSAgICAgICAgICAgIHRlc3RQcmludEkoIiVzIiwgc3RyLnN0cigpLmNfc3RyKCkpOwotICAgICAgICAgICAgc3RyLnN0cigiICAgICIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHRlc3RQcmludEkoIiVzIiwgc3RyLnN0cigpLmNfc3RyKCkpOwotfQotCi0vLyBSZXR1cm5zIGEgdWludDMyX3QgdGhhdCBjb250YWlucyBhIGZvcm1hdCBzcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhCi0vLyBzaW5nbGUgcGl4ZWwgb2YgdGhlIGdpdmVuIGNvbG9yIGFuZCBhbHBoYSB2YWx1ZXMuCi11aW50MzJfdCBod2NUZXN0Q29sb3IyUGl4ZWwodWludDMyX3QgZm9ybWF0LCBDb2xvckZyYWN0IGNvbG9yLCBmbG9hdCBhbHBoYSkKLXsKLSAgICBjb25zdCBzdHJ1Y3QgYXR0cmliIHsKLSAgICAgICAgdWludDMyX3QgZm9ybWF0OwotICAgICAgICBib29sICAgaG9zdEJ5dGVPcmRlcjsKLSAgICAgICAgc2l6ZV90IGJ5dGVzOwotICAgICAgICBzaXplX3QgYzFPZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBjMVNpemU7Ci0gICAgICAgIHNpemVfdCBjMk9mZnNldDsKLSAgICAgICAgc2l6ZV90IGMyU2l6ZTsKLSAgICAgICAgc2l6ZV90IGMzT2Zmc2V0OwotICAgICAgICBzaXplX3QgYzNTaXplOwotICAgICAgICBzaXplX3QgYU9mZnNldDsKLSAgICAgICAgc2l6ZV90IGFTaXplOwotICAgIH0gYXR0cmlidXRlc1tdID0gewotICAgICAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIGZhbHNlLCA0LCAgMCwgOCwgIDgsIDgsIDE2LCA4LCAyNCwgOH0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4OCwgZmFsc2UsIDQsICAwLCA4LCAgOCwgOCwgMTYsIDgsICAwLCAwfSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCwgICBmYWxzZSwgMywgIDAsIDgsICA4LCA4LCAxNiwgOCwgIDAsIDB9LAotICAgICAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LCAgIHRydWUsICAyLCAgMCwgNSwgIDUsIDYsIDExLCA1LCAgMCwgMH0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4OCwgZmFsc2UsIDQsIDE2LCA4LCAgOCwgOCwgIDAsIDgsIDI0LCA4fSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxLCB0cnVlICwgMiwgIDAsIDUsICA1LCA1LCAxMCwgNSwgMTUsIDF9LAotICAgICAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQsIGZhbHNlLCAyLCAxMiwgNCwgIDAsIDQsICA0LCA0LCAgOCwgNH0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1lWMTIsICAgICAgdHJ1ZSwgIDMsIDE2LCA4LCAgOCwgOCwgIDAsIDgsICAwLCAwfSwgIAotICAgIH07Ci0KLSAgICBjb25zdCBzdHJ1Y3QgYXR0cmliICphdHRyaWI7Ci0gICAgZm9yIChhdHRyaWIgPSBhdHRyaWJ1dGVzOyBhdHRyaWIgPCBhdHRyaWJ1dGVzICsgTlVNQShhdHRyaWJ1dGVzKTsKLSAgICAgICAgIGF0dHJpYisrKSB7Ci0gICAgICAgIGlmIChhdHRyaWItPmZvcm1hdCA9PSBmb3JtYXQpIHsgYnJlYWs7IH0KLSAgICB9Ci0gICAgaWYgKGF0dHJpYiA+PSBhdHRyaWJ1dGVzICsgTlVNQShhdHRyaWJ1dGVzKSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJjb2xvckZyYWN0MlBpeGVsIHVuc3VwcG9ydGVkIGZvcm1hdCBvZjogJXUiLCBmb3JtYXQpOwotICAgICAgICBleGl0KDgwKTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBwaXhlbDsKLSAgICBwaXhlbCA9IGh0b25sKCh1aW50MzJfdCkgcm91bmQoKCgoMSA8PCBhdHRyaWItPmMxU2l6ZSkgLSAxKSAqIGNvbG9yLmMxKCkpKQotICAgICAgICAgPDwgKChzaXplb2YocGl4ZWwpICogQklUU1BFUkJZVEUpCi0gICAgICAgICAgICAgLSAoYXR0cmliLT5jMU9mZnNldCArIGF0dHJpYi0+YzFTaXplKSkpOwotICAgIHBpeGVsIHw9IGh0b25sKCh1aW50MzJfdCkgcm91bmQoKCgoMSA8PCBhdHRyaWItPmMyU2l6ZSkgLSAxKSAqIGNvbG9yLmMyKCkpKQotICAgICAgICAgPDwgKChzaXplb2YocGl4ZWwpICogQklUU1BFUkJZVEUpCi0gICAgICAgICAgICAgLSAoYXR0cmliLT5jMk9mZnNldCArIGF0dHJpYi0+YzJTaXplKSkpOwotICAgIHBpeGVsIHw9IGh0b25sKCh1aW50MzJfdCkgcm91bmQoKCgoMSA8PCBhdHRyaWItPmMzU2l6ZSkgLSAxKSAqIGNvbG9yLmMzKCkpKQotICAgICAgICAgPDwgKChzaXplb2YocGl4ZWwpICogQklUU1BFUkJZVEUpCi0gICAgICAgICAgICAgLSAoYXR0cmliLT5jM09mZnNldCArIGF0dHJpYi0+YzNTaXplKSkpOwotICAgIGlmIChhdHRyaWItPmFTaXplKSB7Ci0gICAgICAgIHBpeGVsIHw9IGh0b25sKCh1aW50MzJfdCkgcm91bmQoKCgoMSA8PCBhdHRyaWItPmFTaXplKSAtIDEpICogYWxwaGEpKQotICAgICAgICAgICAgIDw8ICgoc2l6ZW9mKHBpeGVsKSAqIEJJVFNQRVJCWVRFKQotICAgICAgICAgICAgICAgICAtIChhdHRyaWItPmFPZmZzZXQgKyBhdHRyaWItPmFTaXplKSkpOwotICAgIH0KLSAgICBpZiAoYXR0cmliLT5ob3N0Qnl0ZU9yZGVyKSB7Ci0gICAgICAgIHBpeGVsID0gbnRvaGwocGl4ZWwpOwotICAgICAgICBwaXhlbCA+Pj0gc2l6ZW9mKHBpeGVsKSAqIEJJVFNQRVJCWVRFIC0gYXR0cmliLT5ieXRlcyAqIEJJVFNQRVJCWVRFOwotICAgIH0KLQotICAgIHJldHVybiBwaXhlbDsKLX0KLQotLy8gU2V0cyB0aGUgcGl4ZWwgYXQgdGhlIGdpdmVuIHggYW5kIHkgY29vcmRpbmF0ZXMgdG8gdGhlIGNvbG9yIGFuZCBhbHBoYQotLy8gdmFsdWUgZ2l2ZW4gYnkgcGl4ZWwuICBUaGUgY29udGVudHMgb2YgcGl4ZWwgaXMgZm9ybWF0IHNwZWNpZmljLiAgSXQncwotLy8gdmFsdWUgc2hvdWxkIGNvbWUgZnJvbSBhIGNhbGwgdG8gaHdjVGVzdENvbG9yMlBpeGVsKCkuCi12b2lkIGh3Y1Rlc3RTZXRQaXhlbChHcmFwaGljQnVmZmVyICpnQnVmLCB1bnNpZ25lZCBjaGFyICpidWYsCi0gICAgICAgICAgICAgIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHBpeGVsKQotewotCi0gICAgY29uc3Qgc3RydWN0IGF0dHJpYiB7Ci0gICAgICAgIGludCBmb3JtYXQ7Ci0gICAgICAgIHNpemVfdCBieXRlczsKLSAgICB9IGF0dHJpYnV0ZXNbXSA9IHsKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LCAgNH0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4OCwgIDR9LAotICAgICAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JfODg4LCAgICAzfSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwgICAgMn0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4OCwgIDR9LAotICAgICAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTEsICAyfSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0LCAgMn0sCi0gICAgfTsKLQotICAgIGlmIChnQnVmLT5nZXRQaXhlbEZvcm1hdCgpID09IEhBTF9QSVhFTF9GT1JNQVRfWVYxMikgewotICAgICAgICB1aW50MzJfdCB5UGxhbmVPZmZzZXQsIHVQbGFuZU9mZnNldCwgdlBsYW5lT2Zmc2V0OwotICAgICAgICB1aW50MzJfdCB5UGxhbmVTdHJpZGUgPSBnQnVmLT5nZXRTdHJpZGUoKTsKLSAgICAgICAgdWludDMyX3QgdVBsYW5lU3RyaWRlID0gKChnQnVmLT5nZXRTdHJpZGUoKSAvIDIpICsgMHhmKSAmIH4weGY7Ci0gICAgICAgIHVpbnQzMl90IHZQbGFuZVN0cmlkZSA9IHVQbGFuZVN0cmlkZTsKLSAgICAgICAgeVBsYW5lT2Zmc2V0ID0gMDsKLSAgICAgICAgdlBsYW5lT2Zmc2V0ID0geVBsYW5lT2Zmc2V0ICsgeVBsYW5lU3RyaWRlICogZ0J1Zi0+Z2V0SGVpZ2h0KCk7Ci0gICAgICAgIHVQbGFuZU9mZnNldCA9IHZQbGFuZU9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICArIHZQbGFuZVN0cmlkZSAqIChnQnVmLT5nZXRIZWlnaHQoKSAvIDIpOwotICAgICAgICAqKGJ1ZiArIHlQbGFuZU9mZnNldCArIHkgKiB5UGxhbmVTdHJpZGUgKyB4KSA9IHBpeGVsICYgMHhmZjsKLSAgICAgICAgKihidWYgKyB1UGxhbmVPZmZzZXQgKyAoeSAvIDIpICogdVBsYW5lU3RyaWRlICsgKHggLyAyKSkKLSAgICAgICAgICAgID0gKHBpeGVsICYgMHhmZjAwKSA+PiA4OwotICAgICAgICAqKGJ1ZiArIHZQbGFuZU9mZnNldCArICh5IC8gMikgKiB2UGxhbmVTdHJpZGUgKyAoeCAvIDIpKQotICAgICAgICAgICAgPSAocGl4ZWwgJiAweGZmMDAwMCkgPj4gMTY7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IHN0cnVjdCBhdHRyaWIgKmF0dHJpYjsKLSAgICBmb3IgKGF0dHJpYiA9IGF0dHJpYnV0ZXM7IGF0dHJpYiA8IGF0dHJpYnV0ZXMgKyBOVU1BKGF0dHJpYnV0ZXMpOwotICAgICAgICAgYXR0cmliKyspIHsKLSAgICAgICAgaWYgKGF0dHJpYi0+Zm9ybWF0ID09IGdCdWYtPmdldFBpeGVsRm9ybWF0KCkpIHsgYnJlYWs7IH0KLSAgICB9Ci0gICAgaWYgKGF0dHJpYiA+PSBhdHRyaWJ1dGVzICsgTlVNQShhdHRyaWJ1dGVzKSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJzZXRQaXhlbCB1bnN1cHBvcnRlZCBmb3JtYXQgb2Y6ICV1IiwKLSAgICAgICAgICAgICAgICAgICBnQnVmLT5nZXRQaXhlbEZvcm1hdCgpKTsKLSAgICAgICAgZXhpdCg5MCk7Ci0gICAgfQotCi0gICAgbWVtbW92ZShidWYgKyAoKGdCdWYtPmdldFN0cmlkZSgpICogYXR0cmliLT5ieXRlcykgKiB5KQotICAgICAgICAgICAgKyAoYXR0cmliLT5ieXRlcyAqIHgpLCAmcGl4ZWwsIGF0dHJpYi0+Ynl0ZXMpOwotfQotCi0vLyBGaWxsIGEgZ2l2ZW4gZ3JhcGhpYyBidWZmZXIgd2l0aCBhIHVuaWZvcm0gY29sb3IgYW5kIGFscGhhCi12b2lkIGh3Y1Rlc3RGaWxsQ29sb3IoR3JhcGhpY0J1ZmZlciAqZ0J1ZiwgQ29sb3JGcmFjdCBjb2xvciwgZmxvYXQgYWxwaGEpCi17Ci0gICAgdW5zaWduZWQgY2hhciogYnVmID0gTlVMTDsKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgdWludDMyX3QgcGl4ZWw7Ci0KLSAgICBwaXhlbCA9IGh3Y1Rlc3RDb2xvcjJQaXhlbChnQnVmLT5nZXRQaXhlbEZvcm1hdCgpLCBjb2xvciwgYWxwaGEpOwotCi0gICAgZXJyID0gZ0J1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmYnVmKSk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRlc3RQcmludEUoImh3Y1Rlc3RGaWxsQ29sb3IgbG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgZXhpdCgxMDApOwotICAgIH0KLQotICAgIGZvciAodW5zaWduZWQgaW50IHggPSAwOyB4IDwgZ0J1Zi0+Z2V0U3RyaWRlKCk7IHgrKykgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCB5ID0gMDsgeSA8IGdCdWYtPmdldEhlaWdodCgpOyB5KyspIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHZhbCA9IHBpeGVsOwotICAgICAgICAgICAgaHdjVGVzdFNldFBpeGVsKGdCdWYsIGJ1ZiwgeCwgeSwgKHggPCBnQnVmLT5nZXRXaWR0aCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGl4ZWwgOiB0ZXN0UmFuZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IGdCdWYtPnVubG9jaygpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJod2NUZXN0RmlsbENvbG9yIHVubG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgZXhpdCgxMDEpOwotICAgIH0KLX0KLQotLy8gRmlsbCB0aGUgZ2l2ZW4gYnVmZmVyIHdpdGggYSBob3Jpem9udGFsIGJsZW5kIG9mIGNvbG9ycywgd2l0aCB0aGUgbGVmdAotLy8gc2lkZSBjb2xvciBnaXZlbiBieSBzdGFydENvbG9yIGFuZCB0aGUgcmlnaHQgc2lkZSBjb2xvciBnaXZlbiBieQotLy8gZW5kQ29sb3IuICBUaGUgc3RhcnRDb2xvciBhbmQgZW5kQ29sb3IgdmFsdWVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGZvcm1hdAotLy8gZ2l2ZW4gYnkgY29sb3JGb3JtYXQsIHdoaWNoIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBmb3JtYXQgb2YgdGhlCi0vLyBncmFwaGljIGJ1ZmZlci4gIFdoZW4gZGlmZmVyZW50LCBhIGNvbG9yIGNvbnZlcnNpb24gaXMgZG9uZSB3aGVuIHBvc3NpYmxlCi0vLyB0byB0aGUgZ3JhcGhpYyBmb3JtYXQgb2YgdGhlIGdyYXBoaWMgYnVmZmVyLiAgQSBjb2xvciBvZiBibGFjayBpcwotLy8gcHJvZHVjZWQgZm9yIGNhc2VzIHdoZXJlIHRoZSBjb252ZXJzaW9uIGlzIGltcG9zc2libGUgKGUuZy4gb3V0IG9mIGdhbXV0Ci0vLyB2YWx1ZXMpLgotdm9pZCBod2NUZXN0RmlsbENvbG9ySEJsZW5kKEdyYXBoaWNCdWZmZXIgKmdCdWYsIHVpbnQzMl90IGNvbG9yRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yRnJhY3Qgc3RhcnRDb2xvciwgQ29sb3JGcmFjdCBlbmRDb2xvcikKLXsKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgdW5zaWduZWQgY2hhciogYnVmID0gTlVMTDsKLSAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IGdCdWYtPmdldFdpZHRoKCk7Ci0gICAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gZ0J1Zi0+Z2V0SGVpZ2h0KCk7Ci0gICAgY29uc3QgdWludDMyX3Qgc3RyaWRlID0gZ0J1Zi0+Z2V0U3RyaWRlKCk7Ci0KLSAgICBlcnIgPSBnQnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICh2b2lkKiopKCZidWYpKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGVzdFByaW50RSgiaHdjVGVzdEZpbGxDb2xvckhCbGVuZCBsb2NrIGZhaWxlZDogJWQiLCBlcnIpOwotICAgICAgICBleGl0KDExMCk7Ci0gICAgfQotCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgeCA9IDA7IHggPCBzdHJpZGU7IHgrKykgewotICAgICAgICB1aW50MzJfdCBwaXhlbDsKLSAgICAgICAgaWYgKHggPCB3aWR0aCkgewotICAgICAgICAgICAgQ29sb3JGcmFjdCBjb2xvcihzdGFydENvbG9yLmMxKCkgKyAoZW5kQ29sb3IuYzEoKSAtIHN0YXJ0Q29sb3IuYzEoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKChmbG9hdCkgeCAvIChmbG9hdCkgKHdpZHRoIC0gMSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbG9yLmMyKCkgKyAoZW5kQ29sb3IuYzIoKSAtIHN0YXJ0Q29sb3IuYzIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKChmbG9hdCkgeCAvIChmbG9hdCkgKHdpZHRoIC0gMSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbG9yLmMzKCkgKyAoZW5kQ29sb3IuYzMoKSAtIHN0YXJ0Q29sb3IuYzMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKChmbG9hdCkgeCAvIChmbG9hdCkgKHdpZHRoIC0gMSkpKTsKLQotICAgICAgICAgICAgLy8gV2hlbiBmb3JtYXRzIGRpZmZlciwgY29udmVydCBjb2xvcnMuCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgdG8gbm90IGNvbnZlcnQgd2hlbiBmb3JtYXRzIGFyZSB0aGUgc2FtZSwgc2luY2UKLSAgICAgICAgICAgIC8vIG91dCBvZiBnYW11dCBjb2xvcnMgYXJlIGFsd2F5cyBjb252ZXJ0ZWQgdG8gYmxhY2suCi0gICAgICAgICAgICBpZiAoY29sb3JGb3JtYXQgIT0gKHVpbnQzMl90KSBnQnVmLT5nZXRQaXhlbEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICAgICAgaHdjVGVzdENvbG9yQ29udmVydChjb2xvckZvcm1hdCwgZ0J1Zi0+Z2V0UGl4ZWxGb3JtYXQoKSwgY29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGl4ZWwgPSBod2NUZXN0Q29sb3IyUGl4ZWwoZ0J1Zi0+Z2V0UGl4ZWxGb3JtYXQoKSwgY29sb3IsIDEuMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBGaWxsIHBhZCB3aXRoIHJhbmRvbSB2YWx1ZXMKLSAgICAgICAgICAgIHBpeGVsID0gdGVzdFJhbmQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAodW5zaWduZWQgaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgIGh3Y1Rlc3RTZXRQaXhlbChnQnVmLCBidWYsIHgsIHksIHBpeGVsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IGdCdWYtPnVubG9jaygpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJod2NUZXN0RmlsbENvbG9ySEJsZW5kIHVubG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgZXhpdCgxMTEpOwotICAgIH0KLX0KLQotLyoKLSAqIFdoZW4gcG9zc2libGUsIGNvbnZlcnRzIGNvbG9yIHNwZWNpZmllZCBhcyBhIGZ1bGwgcmFuZ2UgdmFsdWUgaW4KLSAqIHRoZSBmcm9tRm9ybWF0LCBpbnRvIGFuIGVxdWl2YWxlbnQgZnVsbCByYW5nZSBjb2xvciBpbiB0aGUgdG9Gb3JtYXQuCi0gKiBXaGVuIGNvbnZlcnNpb24gaXMgaW1wb3NzaWJsZSAoZS5nLiBvdXQgb2YgZ2FtdXQgY29sb3IpIGEgY29sb3IKLSAqIG9yIGJsYWNrIGluIHRoZSBmdWxsIHJhbmdlIG91dHB1dCBmb3JtYXQgaXMgcHJvZHVjZWQuICBUaGUgaW5wdXQKLSAqIGNvbG9yIGlzIGdpdmVuIGFzIGEgZnJhY3Rpb25hbCBjb2xvciBpbiB0aGUgcGFyYW1ldGVyIG5hbWVkIGNvbG9yLgotICogVGhlIHByb2R1Y2VkIGNvbG9yIGlzIHdyaXR0ZW4gb3ZlciB0aGUgc2FtZSBwYXJhbWV0ZXIgdXNlZCB0bwotICogcHJvdmlkZSB0aGUgaW5wdXQgY29sb3IuCi0gKgotICogRWFjaCBncmFwaGljIGZvcm1hdCBoYXMgMyBjb2xvciBjb21wb25lbnRzIGFuZCBlYWNoIG9mIHRoZXNlCi0gKiBjb21wb25lbnRzIGhhcyBib3RoIGEgZnVsbCBhbmQgaW4gZ2FtdXQgcmFuZ2UuICBUaGlzIGZ1bmN0aW9uIHVzZXMKLSAqIGEgdGFibGUgdGhhdCBwcm92aWRlcyB0aGUgZnVsbCBhbmQgaW4gZ2FtdXQgcmFuZ2VzIG9mIGVhY2ggb2YgdGhlCi0gKiBzdXBwb3J0ZWQgZ3JhcGhpYyBmb3JtYXRzLiAgVGhlIGZ1bGwgcmFuZ2UgaXMgZ2l2ZW4gYnkgbWVtYmVycyBuYW1lZAotICogY1sxMjNdTWluIHRvIGNbMTIzXU1heCwgd2hpbGUgdGhlIGluIGdhbXV0IHJhbmdlIGlzIGdpdmVuIGJ5IG1lbWJlcnMKLSAqIG5hbWVkIGNbMTIzXUxvdyB0byBjWzEyM11IaWdoLiAgSW4gbW9zdCBjYXNlcyB0aGUgZnVsbCBhbmQgaW4gZ2FtdXQKLSAqIHJhbmdlcyBhcmUgZXF1aXZhbGVudC4gIFRoaXMgb2NjdXJzIHdoZW4gdGhlIGNbMTIzXU1pbiA9PSBjWzEyM11Mb3cgYW5kCi0gKiBjWzEyM11IaWdoID09IGNbMTIzXU1heC4KLSAqCi0gKiBUaGUgaW5wdXQgYW5kIHByb2R1Y2VkIGNvbG9ycyBhcmUgYm90aCBzcGVjaWZpZWQgYXMgYSBmcmFjdGlvbmFsIGFtb3VudAotICogb2YgdGhlIGZ1bGwgcmFuZ2UuICBUaGUgZGlhZ3JhbSBiZWxvdyBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUKLSAqIGNvbnZlcnNpb24gcHJvY2Vzcy4gIFRoZSBtYWluIHN0ZXBzIGFyZToKLSAqCi0gKiAgIDEuIFByb2R1Y2UgYmxhY2sgaWYgdGhlIGlucHV0IGNvbG9yIGlzIG91dCBvZiBnYW11dC4KLSAqCi0gKiAgIDIuIENvbnZlcnQgdGhlIGluIGdhbXV0IGNvbG9yIGludG8gdGhlIGZyYWN0aW9uIG9mIHRoZSBmcm9tRnJvbWF0Ci0gKiAgICAgIGluIGdhbXV0IHJhbmdlLgotICoKLSAqICAgMy4gQ29udmVydCBmcm9tIHRoZSBmcmFjdGlvbiBvZiB0aGUgaW4gZ2FtdXQgZnJvbSBmb3JtYXQgcmFuZ2UgdG8KLSAqICAgICAgdGhlIGZyYWN0aW9uIG9mIHRoZSBpbiBnYW11dCB0byBmb3JtYXQgcmFuZ2UuICBQcm9kdWNlIGJsYWNrCi0gKiAgICAgIGlmIGFuIGVxdWl2YWxlbnQgY29sb3IgZG9lcyBub3QgZXhpc3RzLgotICoKLSAqICAgNC4gQ292ZXJ0IGZyb20gdGhlIGZyYWN0aW9uIG9mIHRoZSBpbiBnYW11dCB0byBmb3JtYXQgdG8gdGhlCi0gKiAgICAgIGZyYWN0aW9uIG9mIHRoZSBmdWxsIHJhbmdlIHRvIGZvcm1hdC4KLSAqCi0gKiAgICAgICBGcm9tIEZvcm1hdCAgICAgICAgICAgICAgICAgVG8gRm9ybWF0Ci0gKiAgICBtYXggICAgICAgICAgIGhpZ2ggICAgICAgICAgICBoaWdoICAgICAgICBtYXgKLSAqICAgIC0tLS0rICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCi0gKiAgICBoaWdoIFwgICAgICAgICAgICAgICAvICAgICAgICAgICAgIFwgICAgICBoaWdoCi0gKiAgICAtLS0tLS1cLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICArLS0tLS0tLS0+Ci0gKiAgICAgICAgICAgXAotICogICAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICstLS0gYmxhY2sgLS0rCi0gKiAgICAgICAgICAgICBcICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICBcCi0gKiAgICAgICAgICAgICAgXCAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKy0tPgotICogICAgbG93ICAgICAgICBcICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgICBsb3cKLSAqICAgIC0tLS0tLS0tIC0tLSstLSBibGFjayAtLSsKLSAqICAgIG1pbiAgICAgICAgICAgICBsb3cgICAgICAgICAgIGxvdyAgICAgICAgICAgbWluCi0gKiAgICAgXiAgICAgICAgICAgICAgIF4gICAgICBeICAgICAgXiAgICAgICAgICAgICBeCi0gKiAgICAgfCAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgfCAgICAgICAgICAgICB8Ci0gKiAgICAgfCAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgfCAgICAgICAgICAgICArLS0gZnJhY3Rpb24gb2YgZnVsbCByYW5nZQotICogICAgIHwgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgICstLSBmcmFjdGlvbiBvZiB2YWxpZCByYW5nZQotICogICAgIHwgICAgICAgICAgICAgICB8ICAgICAgKy0tIGZyb21Gb3JtYXQgdG8gdG9Gb3JtYXQgY29sb3IgY29udmVyc2lvbgotICogICAgIHwgICAgICAgICAgICAgICArLS0gZnJhY3Rpb24gb2YgdmFsaWQgcmFuZ2UKLSAqICAgICArLS0gZnJhY3Rpb24gb2YgZnVsbCByYW5nZQotICovCi12b2lkIGh3Y1Rlc3RDb2xvckNvbnZlcnQodWludDMyX3QgZnJvbUZvcm1hdCwgdWludDMyX3QgdG9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICBDb2xvckZyYWN0JiBjb2xvcikKLXsKLSAgICBjb25zdCBzdHJ1Y3QgYXR0cmliIHsKLSAgICAgICAgdWludDMyX3QgICAgIGZvcm1hdDsKLSAgICAgICAgYm9vbCAgICAgICAgIHJnYjsKLSAgICAgICAgYm9vbCAgICAgICAgIHl1djsKLSAgICAgICAgaW50ICAgICAgICAgIGMxTWluLCBjMUxvdywgYzFIaWdoLCBjMU1heDsKLSAgICAgICAgaW50ICAgICAgICAgIGMyTWluLCBjMkxvdywgYzJIaWdoLCBjMk1heDsKLSAgICAgICAgaW50ICAgICAgICAgIGMzTWluLCBjM0xvdywgYzNIaWdoLCBjM01heDsKLSAgICB9IGF0dHJpYnV0ZXNbXSA9IHsKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LCB0cnVlLCAgZmFsc2UsCi0gICAgICAgICAwLCAwLCAyNTUsIDI1NSwgMCwgMCwgMjU1LCAyNTUsIDAsIDAsIDI1NSwgMjU1fSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4LCB0cnVlLCAgZmFsc2UsCi0gICAgICAgICAwLCAwLCAyNTUsIDI1NSwgMCwgMCwgMjU1LCAyNTUsIDAsIDAsIDI1NSwgMjU1fSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCwgICB0cnVlLCAgZmFsc2UsCi0gICAgICAgICAwLCAwLCAyNTUsIDI1NSwgMCwgMCwgMjU1LCAyNTUsIDAsIDAsIDI1NSwgMjU1fSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwgICB0cnVlLCAgZmFsc2UsCi0gICAgICAgICAwLCAwLCAzMSwgMzEsIDAsIDAsIDYzLCA2MywgMCwgMCwgMzEsIDMxfSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4LCB0cnVlLCAgZmFsc2UsCi0gICAgICAgICAwLCAwLCAyNTUsIDI1NSwgMCwgMCwgMjU1LCAyNTUsIDAsIDAsIDI1NSwgMjU1fSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxLCB0cnVlLCAgZmFsc2UsCi0gICAgICAgICAwLCAwLCAzMSwgMzEsIDAsIDAsIDMxLCAzMSwgMCwgMCwgMzEsIDMxfSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0LCB0cnVlLCAgZmFsc2UsCi0gICAgICAgICAwLCAwLCAxNSwgMTUsIDAsIDAsIDE1LCAxNSwgMCwgMCwgMTUsIDE1fSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfWVYxMiwgICAgICBmYWxzZSwgdHJ1ZSwKLSAgICAgICAgIDAsIDE2LCAyMzUsIDI1NSwgMCwgMTYsIDI0MCwgMjU1LCAwLCAxNiwgMjQwLCAyNTV9LAotICAgIH07Ci0KLSAgICBjb25zdCBzdHJ1Y3QgYXR0cmliICpmcm9tQXR0cmliOwotICAgIGZvciAoZnJvbUF0dHJpYiA9IGF0dHJpYnV0ZXM7IGZyb21BdHRyaWIgPCBhdHRyaWJ1dGVzICsgTlVNQShhdHRyaWJ1dGVzKTsKLSAgICAgICAgIGZyb21BdHRyaWIrKykgewotICAgICAgICBpZiAoZnJvbUF0dHJpYi0+Zm9ybWF0ID09IGZyb21Gb3JtYXQpIHsgYnJlYWs7IH0KLSAgICB9Ci0gICAgaWYgKGZyb21BdHRyaWIgPj0gYXR0cmlidXRlcyArIE5VTUEoYXR0cmlidXRlcykpIHsKLSAgICAgICAgdGVzdFByaW50RSgiaHdjVGVzdENvbG9yQ29udmVydCB1bnN1cHBvcnRlZCBmcm9tIGZvcm1hdCBvZjogJXUiLAotICAgICAgICAgICAgICAgICAgIGZyb21Gb3JtYXQpOwotICAgICAgICBleGl0KDEyMCk7Ci0gICAgfQotCi0gICAgY29uc3Qgc3RydWN0IGF0dHJpYiAqdG9BdHRyaWI7Ci0gICAgZm9yICh0b0F0dHJpYiA9IGF0dHJpYnV0ZXM7IHRvQXR0cmliIDwgYXR0cmlidXRlcyArIE5VTUEoYXR0cmlidXRlcyk7Ci0gICAgICAgICB0b0F0dHJpYisrKSB7Ci0gICAgICAgIGlmICh0b0F0dHJpYi0+Zm9ybWF0ID09IHRvRm9ybWF0KSB7IGJyZWFrOyB9Ci0gICAgfQotICAgIGlmICh0b0F0dHJpYiA+PSBhdHRyaWJ1dGVzICsgTlVNQShhdHRyaWJ1dGVzKSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJod2NUZXN0Q29sb3JDb252ZXJ0IHVuc3VwcG9ydGVkIHRvIGZvcm1hdCBvZjogJXUiLAotICAgICAgICAgICAgICAgICAgIHRvRm9ybWF0KTsKLSAgICAgICAgZXhpdCgxMjEpOwotICAgIH0KLQotICAgIC8vIFByb2R1Y2UgYmxhY2sgaWYgYW55IG9mIHRoZSBmcm9tIGNvbXBvbmVudHMgYXJlIG91dHNpZGUgdGhlCi0gICAgLy8gdmFsaWQgY29sb3IgcmFuZ2UKLSAgICBmbG9hdCBjMVZhbCA9IGZyb21BdHRyaWItPmMxTWluCi0gICAgICAgICsgKChmbG9hdCkgKGZyb21BdHRyaWItPmMxTWF4IC0gZnJvbUF0dHJpYi0+YzFNaW4pICogY29sb3IuYzEoKSk7Ci0gICAgZmxvYXQgYzJWYWwgPSBmcm9tQXR0cmliLT5jMk1pbgotICAgICAgICArICgoZmxvYXQpIChmcm9tQXR0cmliLT5jMk1heCAtIGZyb21BdHRyaWItPmMyTWluKSAqIGNvbG9yLmMyKCkpOwotICAgIGZsb2F0IGMzVmFsID0gZnJvbUF0dHJpYi0+YzNNaW4KLSAgICAgICAgKyAoKGZsb2F0KSAoZnJvbUF0dHJpYi0+YzNNYXggLSBmcm9tQXR0cmliLT5jM01pbikgKiBjb2xvci5jMygpKTsKLSAgICBpZiAoKGMxVmFsIDwgZnJvbUF0dHJpYi0+YzFMb3cpIHx8IChjMVZhbCA+IGZyb21BdHRyaWItPmMxSGlnaCkKLSAgICAgICAgfHwgKGMyVmFsIDwgZnJvbUF0dHJpYi0+YzJMb3cpIHx8IChjMlZhbCA+IGZyb21BdHRyaWItPmMySGlnaCkKLSAgICAgICAgfHwgKGMzVmFsIDwgZnJvbUF0dHJpYi0+YzNMb3cpIHx8IChjM1ZhbCA+IGZyb21BdHRyaWItPmMzSGlnaCkpIHsKLQotICAgICAgICAvLyBSZXR1cm4gYmxhY2sKLSAgICAgICAgLy8gV2lsbCB1c2UgcmVwcmVzZW50YXRpb24gb2YgYmxhY2sgZnJvbSBSR0JBODg4OCBncmFwaGljIGZvcm1hdAotICAgICAgICAvLyBhbmQgcmVjdXJzaXZlbHkgY29udmVydCBpdCB0byB0aGUgcmVxdWVzdGVkIGdyYXBoaWMgZm9ybWF0LgotICAgICAgICBjb2xvciA9IENvbG9yRnJhY3QoMC4wLCAwLjAsIDAuMCk7Ci0gICAgICAgIGh3Y1Rlc3RDb2xvckNvbnZlcnQoSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIHRvRm9ybWF0LCBjb2xvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBXaXRoaW4gZnJvbSBmb3JtYXQsIGNvbnZlcnQgZnJvbSBmcmFjdGlvbiBvZiBmdWxsIHJhbmdlCi0gICAgLy8gdG8gZnJhY3Rpb24gb2YgdmFsaWQgcmFuZ2UKLSAgICBjb2xvciA9IENvbG9yRnJhY3QoKGMxVmFsIC0gZnJvbUF0dHJpYi0+YzFMb3cpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvIChmcm9tQXR0cmliLT5jMUhpZ2ggLSBmcm9tQXR0cmliLT5jMUxvdyksCi0gICAgICAgICAgICAgICAgICAgICAgIChjMlZhbCAtIGZyb21BdHRyaWItPmMyTG93KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZnJvbUF0dHJpYi0+YzJIaWdoIC0gZnJvbUF0dHJpYi0+YzJMb3cpLAotICAgICAgICAgICAgICAgICAgICAgICAoYzNWYWwgLSBmcm9tQXR0cmliLT5jM0xvdykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKGZyb21BdHRyaWItPmMzSGlnaCAtIGZyb21BdHRyaWItPmMzTG93KSk7Ci0KLSAgICAvLyBJZiBuZWVkZWQgcGVyZm9ybSBSR0IgdG8gWVVWIGNvbnZlcnNpb24KLSAgICBmbG9hdCB3ciA9IDAuMjEyNiwgd2cgPSAwLjcxNTIsIHdiID0gMC4wNzIyOyAvLyBJVFU3MDkgcmVjb21tZW5kZWQgY29uc3RhbnRzCi0gICAgaWYgKGZyb21BdHRyaWItPnJnYiAmJiB0b0F0dHJpYi0+eXV2KSB7Ci0gICAgICAgIGZsb2F0IHIgPSBjb2xvci5jMSgpLCBnID0gY29sb3IuYzIoKSwgYiA9IGNvbG9yLmMzKCk7Ci0gICAgICAgIGZsb2F0IHkgPSB3ciAqIHIgKyB3ZyAqIGcgKyB3YiAqIGI7Ci0gICAgICAgIGZsb2F0IHUgPSAwLjUgKiAoKGIgLSB5KSAvICgxLjAgLSB3YikpICsgMC41OwotICAgICAgICBmbG9hdCB2ID0gMC41ICogKChyIC0geSkgLyAoMS4wIC0gd3IpKSArIDAuNTsKLQotICAgICAgICAvLyBQcm9kdWNlIGJsYWNrIGlmIGNvbG9yIGlzIG91dHNpZGUgdGhlIFlVViBnYW11dAotICAgICAgICBpZiAoKHkgPCAwLjApIHx8ICh5ID4gMS4wKQotICAgICAgICAgICAgfHwgKHUgPCAwLjApIHx8ICh1ID4gMS4wKQotICAgICAgICAgICAgfHwgKHYgPCAwLjApIHx8ICh2ID4gMS4wKSkgewotICAgICAgICAgICAgeSA9IDAuMDsKLSAgICAgICAgICAgIHUgPSB2ID0gMC41OwotICAgICAgICB9Ci0KLSAgICAgICAgY29sb3IgPSBDb2xvckZyYWN0KHksIHUsIHYpOwotICAgIH0KLQotICAgIC8vIElmIG5lZWRlZCBwZXJmb3JtIFlVViB0byBSR0IgY29udmVyc2lvbgotICAgIC8vIEVxdWF0aW9ucyBkZXRlcm1pbmVkIGZyb20gdGhlIElUVTcwOSBlcXVhdGlvbnMgZm9yIFJHQiB0byBZVVYKLSAgICAvLyBjb252ZXJzaW9uLCBwbHVzIHRoZSBmb2xsb3dpbmcgYWxnZWJyYToKLSAgICAvLwotICAgIC8vICAgdSA9IDAuNSAqICgoYiAtIHkpIC8gKDEuMCAtIHdiKSkgKyAwLjUKLSAgICAvLyAgIDAuNSAqICgoYiAtIHkpIC8gKDEuMCAtIHdiKSkgPSB1IC0gMC41Ci0gICAgLy8gICAoYiAtIHkpIC8gKDEuMCAtIHdiKSA9IDIgKiAodSAtIDAuNSkKLSAgICAvLyAgIGIgLSB5ID0gMiAqICh1IC0gMC41KSAqICgxLjAgLSB3YikKLSAgICAvLyAgIGIgPSAyICogKHUgLSAwLjUpICogKDEuMCAtIHdiKSArIHkKLSAgICAvLwotICAgIC8vICAgdiA9IDAuNSAqICgociAteSkgLyAoMS4wIC0gd3IpKSArIDAuNQotICAgIC8vICAgMC41ICogKChyIC0geSkgLyAoMS4wIC0gd3IpKSA9IHYgLSAwLjUKLSAgICAvLyAgIChyIC0geSkgLyAoMS4wIC0gd3IpID0gMiAqICh2IC0gMC41KQotICAgIC8vICAgciAtIHkgPSAyICogKHYgLSAwLjUpICogKDEuMCAtIHdyKQotICAgIC8vICAgciA9IDIgKiAodiAtIDAuNSkgKiAoMS4wIC0gd3IpICsgeQotICAgIC8vCi0gICAgLy8gICB5ID0gd3IgKiByICsgd2cgKiBnICsgd2IgKiBiCi0gICAgLy8gICB3ciAqIHIgKyB3ZyAqIGcgKyB3YiAqIGIgPSB5Ci0gICAgLy8gICB3ZyAqIGcgPSB5IC0gd3IgKiByIC0gd2IgKiBiCi0gICAgLy8gICBnID0gKHkgLSB3ciAqIHIgLSB3YiAqIGIpIC8gd2cKLSAgICBpZiAoZnJvbUF0dHJpYi0+eXV2ICYmIHRvQXR0cmliLT5yZ2IpIHsKLSAgICAgICAgZmxvYXQgeSA9IGNvbG9yLmMxKCksIHUgPSBjb2xvci5jMigpLCB2ID0gY29sb3IuYzMoKTsKLSAgICAgICAgZmxvYXQgciA9IDIuMCAqICh2IC0gMC41KSAqICgxLjAgLSB3cikgKyB5OwotICAgICAgICBmbG9hdCBiID0gMi4wICogKHUgLSAwLjUpICogKDEuMCAtIHdiKSArIHk7Ci0gICAgICAgIGZsb2F0IGcgPSAoeSAtIHdyICogciAtIHdiICogYikgLyB3ZzsKLQotICAgICAgICAvLyBQcm9kdWNlIGJsYWNrIGlmIGNvbG9yIGlzIG91dHNpZGUgdGhlIFJHQiBnYW11dAotICAgICAgICBpZiAoKHIgPCAwLjApIHx8IChyID4gMS4wKQotICAgICAgICAgICAgfHwgKGcgPCAwLjApIHx8IChnID4gMS4wKQotICAgICAgICAgICAgfHwgKGIgPCAwLjApIHx8IChiID4gMS4wKSkgewotICAgICAgICAgICAgciA9IGcgPSBiID0gMC4wOwotICAgICAgICB9Ci0KLSAgICAgICAgY29sb3IgPSBDb2xvckZyYWN0KHIsIGcsIGIpOwotICAgIH0KLQotICAgIC8vIFdpdGhpbiB0byBmb3JtYXQsIGNvbnZlcnQgZnJvbSBmcmFjdGlvbiBvZiB2YWxpZCByYW5nZQotICAgIC8vIHRvIGZyYWN0aW9uIG9mIGZ1bGwgcmFuZ2UKLSAgICBjMVZhbCA9ICh0b0F0dHJpYi0+YzFMb3cKLSAgICAgICAgKyAoZmxvYXQpICh0b0F0dHJpYi0+YzFIaWdoIC0gdG9BdHRyaWItPmMxTG93KSAqIGNvbG9yLmMxKCkpOwotICAgIGMyVmFsID0gKHRvQXR0cmliLT5jMUxvdwotICAgICAgICArIChmbG9hdCkgKHRvQXR0cmliLT5jMkhpZ2ggLSB0b0F0dHJpYi0+YzJMb3cpICogY29sb3IuYzIoKSk7Ci0gICAgYzNWYWwgPSAodG9BdHRyaWItPmMxTG93Ci0gICAgICAgICsgKGZsb2F0KSAodG9BdHRyaWItPmMzSGlnaCAtIHRvQXR0cmliLT5jM0xvdykgKiBjb2xvci5jMygpKTsKLSAgICBjb2xvciA9IENvbG9yRnJhY3QoKGZsb2F0KSAoYzFWYWwgLSB0b0F0dHJpYi0+YzFNaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvIChmbG9hdCkgKHRvQXR0cmliLT5jMU1heCAtIHRvQXR0cmliLT5jMU1pbiksCi0gICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgKGMyVmFsIC0gdG9BdHRyaWItPmMyTWluKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZmxvYXQpICh0b0F0dHJpYi0+YzJNYXggLSB0b0F0dHJpYi0+YzJNaW4pLAotICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIChjM1ZhbCAtIHRvQXR0cmliLT5jM01pbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKGZsb2F0KSAodG9BdHRyaWItPmMzTWF4IC0gdG9BdHRyaWItPmMzTWluKSk7Ci19Ci0KLS8vIFRPRE86IFVzZSBQcmludEdMU3RyaW5nLCBDZWNoY2tHbEVycm9yLCBhbmQgUHJpbnRFR0xDb25maWd1cmF0aW9uCi0vLyAgICAgICBmcm9tIGxpYmdsVGVzdAotc3RhdGljIHZvaWQgcHJpbnRHTFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBHTGVudW0gcykKLXsKLSAgICBjb25zdCBjaGFyICp2ID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcocyk7Ci0KLSAgICBpZiAodiA9PSBOVUxMKSB7Ci0gICAgICAgIHRlc3RQcmludEkoIkdMICVzIHVua25vd24iLCBuYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgICB0ZXN0UHJpbnRJKCJHTCAlcyA9ICVzIiwgbmFtZSwgdik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjaGVja0VnbEVycm9yKGNvbnN0IGNoYXIqIG9wLCBFR0xCb29sZWFuIHJldHVyblZhbCkKLXsKLSAgICBpZiAocmV0dXJuVmFsICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIiVzKCkgcmV0dXJuZWQgJWQiLCBvcCwgcmV0dXJuVmFsKTsKLSAgICB9Ci0KLSAgICBmb3IgKEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7IGVycm9yICE9IEVHTF9TVUNDRVNTOyBlcnJvcgotICAgICAgICAgICAgPSBlZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIHRlc3RQcmludEUoImFmdGVyICVzKCkgZWdsRXJyb3IgJXMgKDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICBvcCwgRUdMVXRpbHM6OnN0cmVycm9yKGVycm9yKSwgZXJyb3IpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKQotewotICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgotICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKLSAgICAgICAgdGVzdFByaW50RSgiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KSIsIG9wLCBlcnJvcik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBwcmludEVHTENvbmZpZ3VyYXRpb24oRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcpCi17Ci0KLSNkZWZpbmUgWChWQUwpIHtWQUwsICNWQUx9Ci0gICAgc3RydWN0IHtFR0xpbnQgYXR0cmlidXRlOyBjb25zdCBjaGFyKiBuYW1lO30gbmFtZXNbXSA9IHsKLSAgICBYKEVHTF9CVUZGRVJfU0laRSksCi0gICAgWChFR0xfQUxQSEFfU0laRSksCi0gICAgWChFR0xfQkxVRV9TSVpFKSwKLSAgICBYKEVHTF9HUkVFTl9TSVpFKSwKLSAgICBYKEVHTF9SRURfU0laRSksCi0gICAgWChFR0xfREVQVEhfU0laRSksCi0gICAgWChFR0xfU1RFTkNJTF9TSVpFKSwKLSAgICBYKEVHTF9DT05GSUdfQ0FWRUFUKSwKLSAgICBYKEVHTF9DT05GSUdfSUQpLAotICAgIFgoRUdMX0xFVkVMKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1BJWEVMUyksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfV0lEVEgpLAotICAgIFgoRUdMX05BVElWRV9SRU5ERVJBQkxFKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX0lEKSwKLSAgICBYKEVHTF9OQVRJVkVfVklTVUFMX1RZUEUpLAotICAgIFgoRUdMX1NBTVBMRVMpLAotICAgIFgoRUdMX1NBTVBMRV9CVUZGRVJTKSwKLSAgICBYKEVHTF9TVVJGQUNFX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1RZUEUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSksCi0gICAgWChFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IpLAotICAgIFgoRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBKSwKLSAgICBYKEVHTF9NSU5fU1dBUF9JTlRFUlZBTCksCi0gICAgWChFR0xfTUFYX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX0xVTUlOQU5DRV9TSVpFKSwKLSAgICBYKEVHTF9BTFBIQV9NQVNLX1NJWkUpLAotICAgIFgoRUdMX0NPTE9SX0JVRkZFUl9UWVBFKSwKLSAgICBYKEVHTF9SRU5ERVJBQkxFX1RZUEUpLAotICAgIFgoRUdMX0NPTkZPUk1BTlQpLAotICAgfTsKLSN1bmRlZiBYCi0KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihuYW1lcykgLyBzaXplb2YobmFtZXNbMF0pOyBqKyspIHsKLSAgICAgICAgRUdMaW50IHZhbHVlID0gLTE7Ci0gICAgICAgIEVHTGludCByZXR1cm5WYWwgPSBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIG5hbWVzW2pdLmF0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOwotICAgICAgICBFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOwotICAgICAgICBpZiAocmV0dXJuVmFsICYmIGVycm9yID09IEVHTF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRJKCIgJXM6ICVkICglI3gpIiwgbmFtZXNbal0ubmFtZSwgdmFsdWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB0ZXN0UHJpbnRJKCIiKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9od2MvaHdjVGVzdExpYi5oIGIvb3BlbmdsL3Rlc3RzL2h3Yy9od2NUZXN0TGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzMwMTIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2h3Yy9od2NUZXN0TGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKgotICogSGFyZHdhcmUgQ29tcG9zZXIgVGVzdCBMaWJyYXJ5IEhlYWRlcgotICovCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHRlc3RVdGlsLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9od2NvbXBvc2VyLmg+Ci0KLS8vIENoYXJhY3RlcmlzdGljcyBvZiBrbm93biBncmFwaGljIGZvcm1hdHMKLWNvbnN0IHN0cnVjdCBod2NUZXN0R3JhcGhpY0Zvcm1hdCB7Ci0gICAgdWludDMyX3QgZm9ybWF0OwotICAgIGNvbnN0IGNoYXIgKmRlc2M7Ci0gICAgdWludDMyX3Qgd01vZCwgaE1vZDsgLy8gV2lkdGgvaGVpZ2h0IG1vZCB0aGlzIHZhbHVlIG11c3QgZXF1YWwgemVybwotfSBod2NUZXN0R3JhcGhpY0Zvcm1hdFtdID0gewotICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCwgIlJHQkE4ODg4IiwgMSwgMX0sCi0gICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4LCAiUkdCWDg4ODgiLCAxLCAxfSwKLSAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JfODg4LCAgICJSR0I4ODgiLCAgIDEsIDF9LAotICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQl81NjUsICAgIlJHQjU2NSIsICAgMSwgMX0sCi0gICAge0hBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4LCAiQkdSQTg4ODgiLCAxLCAxfSwKLSAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTEsICJSR0JBNTU1MSIsIDEsIDF9LAotICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQkFfNDQ0NCwgIlJHQkE0NDQ0IiwgMSwgMX0sCi0gICAge0hBTF9QSVhFTF9GT1JNQVRfWVYxMiwgICAgICAiWVYxMiIsICAgICAyLCAyfSwKLX07Ci0KLS8vIFJlcHJlc2VudCBSR0IgY29sb3IgYXMgZnJhY3Rpb24gb2YgY29sb3IgY29tcG9uZW50cy4KLS8vIEVhY2ggb2YgdGhlIGNvbG9yIGNvbXBvbmVudHMgYXJlIGV4cGVjdGVkIGluIHRoZSByYW5nZSBbMC4wLCAxLjBdCi1jbGFzcyBDb2xvckZyYWN0IHsKLSAgcHVibGljOgotICAgIENvbG9yRnJhY3QoKTogX2MxKDAuMCksIF9jMigwLjApLCBfYzMoMC4wKSB7fTsKLSAgICBDb2xvckZyYWN0KGZsb2F0IGMxLCBmbG9hdCBjMiwgZmxvYXQgYzMpOiBfYzEoYzEpLCBfYzIoYzIpLCBfYzMoYzMpIHt9OwotICAgIGZsb2F0IGMxKHZvaWQpIGNvbnN0IHsgcmV0dXJuIF9jMTsgfQotICAgIGZsb2F0IGMyKHZvaWQpIGNvbnN0IHsgcmV0dXJuIF9jMjsgfQotICAgIGZsb2F0IGMzKHZvaWQpIGNvbnN0IHsgcmV0dXJuIF9jMzsgfQotCi0gICAgb3BlcmF0b3Igc3RkOjpzdHJpbmcoKTsKLQotICBwcml2YXRlOgotICAgIGZsb2F0IF9jMTsKLSAgICBmbG9hdCBfYzI7Ci0gICAgZmxvYXQgX2MzOwotfTsKLQotLy8gUmVwcmVzZW50IFJHQiBjb2xvciBhcyBmcmFjdGlvbiBvZiBjb2xvciBjb21wb25lbnRzLgotLy8gRWFjaCBvZiB0aGUgY29sb3IgY29tcG9uZW50cyBhcmUgZXhwZWN0ZWQgaW4gdGhlIHJhbmdlIFswLjAsIDEuMF0KLWNsYXNzIENvbG9yUkdCIHsKLSAgcHVibGljOgotICAgIENvbG9yUkdCKCk6IF9yKDAuMCksIF9nKDAuMCksIF9iKDAuMCkge307Ci0gICAgQ29sb3JSR0IoZmxvYXQgZik6IF9yKGYpLCBfZyhmKSwgX2IoZikge307IC8vIEdyYXkKLSAgICBDb2xvclJHQihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKTogX3IociksIF9nKGcpLCBfYihiKSB7fTsKLSAgICBmbG9hdCByKHZvaWQpIGNvbnN0IHsgcmV0dXJuIF9yOyB9Ci0gICAgZmxvYXQgZyh2b2lkKSBjb25zdCB7IHJldHVybiBfZzsgfQotICAgIGZsb2F0IGIodm9pZCkgY29uc3QgeyByZXR1cm4gX2I7IH0KLQotICBwcml2YXRlOgotICAgIGZsb2F0IF9yOwotICAgIGZsb2F0IF9nOwotICAgIGZsb2F0IF9iOwotfTsKLQotLy8gRGltZW5zaW9uIC0gd2lkdGggYW5kIGhlaWdodCBvZiBhIHJlY3Rhbmd1bGVyIGFyZWEKLWNsYXNzIEh3Y1Rlc3REaW0gewotICBwdWJsaWM6Ci0gICAgSHdjVGVzdERpbSgpOiBfdygwKSwgX2goMCkge307Ci0gICAgSHdjVGVzdERpbSh1aW50MzJfdCB3LCB1aW50MzJfdCBoKSA6IF93KHcpLCBfaChoKSB7fQotICAgIHVpbnQzMl90IHdpZHRoKHZvaWQpIGNvbnN0IHsgcmV0dXJuIF93OyB9Ci0gICAgdWludDMyX3QgaGVpZ2h0KHZvaWQpIGNvbnN0IHsgcmV0dXJuIF9oOyB9Ci0gICAgdm9pZCBzZXRXaWR0aCh1aW50MzJfdCB3KSB7IF93ID0gdzsgfQotICAgIHZvaWQgc2V0SGVpZ2h0KHVpbnQzMl90IGgpIHsgX2ggPSBoOyB9Ci0KLSAgICBvcGVyYXRvciBzdGQ6OnN0cmluZygpOwotICAgIG9wZXJhdG9yIGh3Y19yZWN0KCkgY29uc3Q7Ci0KLSAgcHJpdmF0ZToKLSAgICB1aW50MzJfdCBfdzsKLSAgICB1aW50MzJfdCBfaDsKLX07Ci0KLS8vIEZ1bmN0aW9uIFByb3RvdHlwZXMKLXZvaWQgaHdjVGVzdEluaXREaXNwbGF5KGJvb2wgdmVyYm9zZSwgRUdMRGlzcGxheSAqZHB5LCBFR0xTdXJmYWNlICpzdXJmYWNlLAotICAgIEVHTGludCAqd2lkdGgsIEVHTGludCAqaGVpZ2h0KTsKLXZvaWQgaHdjVGVzdE9wZW5Id2MoaHdjX2NvbXBvc2VyX2RldmljZV90ICoqaHdjRGV2aWNlUHRyKTsKLWNvbnN0IHN0cnVjdCBod2NUZXN0R3JhcGhpY0Zvcm1hdCAqaHdjVGVzdEdyYXBoaWNGb3JtYXRMb29rdXAoY29uc3QgY2hhciAqZGVzYyk7Ci1jb25zdCBzdHJ1Y3QgaHdjVGVzdEdyYXBoaWNGb3JtYXQgKmh3Y1Rlc3RHcmFwaGljRm9ybWF0TG9va3VwKHVpbnQzMl90IGlkKTsKLWNvbnN0IGNoYXIgKmh3Y1Rlc3RHcmFwaGljRm9ybWF0MnN0cih1aW50MzJfdCBmb3JtYXQpOwotc3RkOjpzdHJpbmcgaHdjVGVzdFJlY3Qyc3RyKGNvbnN0IHN0cnVjdCBod2NfcmVjdCYgcmVjdCk7Ci0KLWh3Y19sYXllcl9saXN0X3QgKmh3Y1Rlc3RDcmVhdGVMYXllckxpc3Qoc2l6ZV90IG51bUxheWVycyk7Ci12b2lkIGh3Y1Rlc3RGcmVlTGF5ZXJMaXN0KGh3Y19sYXllcl9saXN0X3QgKmxpc3QpOwotdm9pZCBod2NUZXN0RGlzcGxheUxpc3QoaHdjX2xheWVyX2xpc3RfdCAqbGlzdCk7Ci12b2lkIGh3Y1Rlc3REaXNwbGF5TGlzdFByZXBhcmVNb2RpZmlhYmxlKGh3Y19sYXllcl9saXN0X3QgKmxpc3QpOwotdm9pZCBod2NUZXN0RGlzcGxheUxpc3RIYW5kbGVzKGh3Y19sYXllcl9saXN0X3QgKmxpc3QpOwotCi11aW50MzJfdCBod2NUZXN0Q29sb3IyUGl4ZWwodWludDMyX3QgZm9ybWF0LCBDb2xvckZyYWN0IGNvbG9yLCBmbG9hdCBhbHBoYSk7Ci12b2lkIGh3Y1Rlc3RDb2xvckNvbnZlcnQodWludDMyX3QgZnJvbUZvcm1hdCwgdWludDMyX3QgdG9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICBDb2xvckZyYWN0JiBjb2xvcik7Ci12b2lkIGh3Y1Rlc3RTZXRQaXhlbChhbmRyb2lkOjpHcmFwaGljQnVmZmVyICpnQnVmLCB1bnNpZ25lZCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCBwaXhlbCk7Ci12b2lkIGh3Y1Rlc3RGaWxsQ29sb3IoYW5kcm9pZDo6R3JhcGhpY0J1ZmZlciAqZ0J1ZiwgQ29sb3JGcmFjdCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSk7Ci12b2lkIGh3Y1Rlc3RGaWxsQ29sb3JIQmxlbmQoYW5kcm9pZDo6R3JhcGhpY0J1ZmZlciAqZ0J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvckZyYWN0IHN0YXJ0Q29sb3IsIENvbG9yRnJhY3QgZW5kQ29sb3IpOwotQ29sb3JGcmFjdCBod2NUZXN0UGFyc2VDb2xvcihzdGQ6OmlzdHJpbmdzdHJlYW0mIGluLCBib29sJiBlcnJvcik7Ci1zdHJ1Y3QgaHdjX3JlY3QgaHdjVGVzdFBhcnNlSHdjUmVjdChzdGQ6OmlzdHJpbmdzdHJlYW0mIGluLCBib29sJiBlcnJvcik7Ci1Id2NUZXN0RGltIGh3Y1Rlc3RQYXJzZURpbShzdGQ6OmlzdHJpbmdzdHJlYW0mIGluLCBib29sJiBlcnJvcik7CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvaW5jbHVkZS9FR0xVdGlscy5oIGIvb3BlbmdsL3Rlc3RzL2luY2x1ZGUvRUdMVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0YzI2MS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvaW5jbHVkZS9FR0xVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgQU5EUk9JRF9VSV9FR0xVVElMU19ICi0jZGVmaW5lIEFORFJPSURfVUlfRUdMVVRJTFNfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8RUdML2VnbC5oPgotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgRUdMVXRpbHMKLXsKLXB1YmxpYzoKLQotICAgIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqc3RyZXJyb3IoRUdMaW50IGVycik7Ci0KLSAgICBzdGF0aWMgaW5saW5lIHN0YXR1c190IHNlbGVjdENvbmZpZ0ZvclBpeGVsRm9ybWF0KAotICAgICAgICAgICAgRUdMRGlzcGxheSBkcHksCi0gICAgICAgICAgICBFR0xpbnQgY29uc3QqIGF0dHJzLAotICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQsCi0gICAgICAgICAgICBFR0xDb25maWcqIG91dENvbmZpZyk7Ci0KLSAgICBzdGF0aWMgaW5saW5lIHN0YXR1c190IHNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdygKLSAgICAgICAgICAgIEVHTERpc3BsYXkgZHB5LAotICAgICAgICAgICAgRUdMaW50IGNvbnN0KiBhdHRycywKLSAgICAgICAgICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAotICAgICAgICAgICAgRUdMQ29uZmlnKiBvdXRDb25maWcpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCBjaGFyICpFR0xVdGlsczo6c3RyZXJyb3IoRUdMaW50IGVycikKLXsKLSAgICBzd2l0Y2ggKGVycil7Ci0gICAgICAgIGNhc2UgRUdMX1NVQ0NFU1M6ICAgICAgICAgICByZXR1cm4gIkVHTF9TVUNDRVNTIjsKLSAgICAgICAgY2FzZSBFR0xfTk9UX0lOSVRJQUxJWkVEOiAgIHJldHVybiAiRUdMX05PVF9JTklUSUFMSVpFRCI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9BQ0NFU1M6ICAgICAgICByZXR1cm4gIkVHTF9CQURfQUNDRVNTIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0FMTE9DOiAgICAgICAgIHJldHVybiAiRUdMX0JBRF9BTExPQyI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9BVFRSSUJVVEU6ICAgICByZXR1cm4gIkVHTF9CQURfQVRUUklCVVRFIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0NPTkZJRzogICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05GSUciOwotICAgICAgICBjYXNlIEVHTF9CQURfQ09OVEVYVDogICAgICAgcmV0dXJuICJFR0xfQkFEX0NPTlRFWFQiOwotICAgICAgICBjYXNlIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFOiByZXR1cm4gIkVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0RJU1BMQVk6ICAgICAgIHJldHVybiAiRUdMX0JBRF9ESVNQTEFZIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX01BVENIOiAgICAgICAgIHJldHVybiAiRUdMX0JBRF9NQVRDSCI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfUElYTUFQOiByZXR1cm4gIkVHTF9CQURfTkFUSVZFX1BJWE1BUCI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfV0lORE9XOiByZXR1cm4gIkVHTF9CQURfTkFUSVZFX1dJTkRPVyI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9QQVJBTUVURVI6ICAgICByZXR1cm4gIkVHTF9CQURfUEFSQU1FVEVSIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX1NVUkZBQ0U6ICAgICAgIHJldHVybiAiRUdMX0JBRF9TVVJGQUNFIjsKLSAgICAgICAgY2FzZSBFR0xfQ09OVEVYVF9MT1NUOiAgICAgIHJldHVybiAiRUdMX0NPTlRFWFRfTE9TVCI7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiAiVU5LTk9XTiI7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yUGl4ZWxGb3JtYXQoCi0gICAgICAgIEVHTERpc3BsYXkgZHB5LAotICAgICAgICBFR0xpbnQgY29uc3QqIGF0dHJzLAotICAgICAgICBpbnQzMl90IGZvcm1hdCwKLSAgICAgICAgRUdMQ29uZmlnKiBvdXRDb25maWcpCi17Ci0gICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMSwgbj0wOwotCi0gICAgaWYgKCFhdHRycykKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIGlmIChvdXRDb25maWcgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIC8vIEdldCBhbGwgdGhlICJwb3RlbnRpYWwgbWF0Y2giIGNvbmZpZ3MuLi4KLSAgICBpZiAoZWdsR2V0Q29uZmlncyhkcHksIE5VTEwsIDAsICZudW1Db25maWdzKSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBFR0xDb25maWcqIGNvbnN0IGNvbmZpZ3MgPSAoRUdMQ29uZmlnKiltYWxsb2Moc2l6ZW9mKEVHTENvbmZpZykqbnVtQ29uZmlncyk7Ci0gICAgaWYgKGVnbENob29zZUNvbmZpZyhkcHksIGF0dHJzLCBjb25maWdzLCBudW1Db25maWdzLCAmbikgPT0gRUdMX0ZBTFNFKSB7Ci0gICAgICAgIGZyZWUoY29uZmlncyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaW50IGk7Ci0gICAgRUdMQ29uZmlnIGNvbmZpZyA9IE5VTEw7Ci0gICAgZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKLSAgICAgICAgRUdMaW50IG5hdGl2ZVZpc3VhbElkID0gMDsKLSAgICAgICAgZWdsR2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnc1tpXSwgRUdMX05BVElWRV9WSVNVQUxfSUQsICZuYXRpdmVWaXN1YWxJZCk7Ci0gICAgICAgIGlmIChuYXRpdmVWaXN1YWxJZD4wICYmIGZvcm1hdCA9PSBuYXRpdmVWaXN1YWxJZCkgewotICAgICAgICAgICAgY29uZmlnID0gY29uZmlnc1tpXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZnJlZShjb25maWdzKTsKLQotICAgIGlmIChpPG4pIHsKLSAgICAgICAgKm91dENvbmZpZyA9IGNvbmZpZzsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKLX0KLQotc3RhdHVzX3QgRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdygKLSAgICAgICAgRUdMRGlzcGxheSBkcHksCi0gICAgICAgIEVHTGludCBjb25zdCogYXR0cnMsCi0gICAgICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAotICAgICAgICBFR0xDb25maWcqIG91dENvbmZpZykKLXsKLSAgICBpbnQgZXJyOwotICAgIGludCBmb3JtYXQ7Ci0KLSAgICBpZiAoIXdpbmRvdykKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIGlmICgoZXJyID0gd2luZG93LT5xdWVyeSh3aW5kb3csIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNlbGVjdENvbmZpZ0ZvclBpeGVsRm9ybWF0KGRweSwgYXR0cnMsIGZvcm1hdCwgb3V0Q29uZmlnKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8qIEFORFJPSURfVUlfRUdMVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2luY2x1ZGUvZ2xUZXN0TGliLmggYi9vcGVuZ2wvdGVzdHMvaW5jbHVkZS9nbFRlc3RMaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxYzU5NC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvaW5jbHVkZS9nbFRlc3RMaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyoKLSAqIEdyYXBoaWNzIFRlc3QgTGlicmFyeSBIZWFkZXIKLSAqLwotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgIkVHTFV0aWxzLmgiCi0KLXZvaWQgZ2xUZXN0UHJpbnRHTFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBHTGVudW0gcyk7Ci12b2lkIGdsVGVzdENoZWNrRWdsRXJyb3IoY29uc3QgY2hhciogb3AsIEVHTEJvb2xlYW4gcmV0dXJuVmFsID0gRUdMX1RSVUUpOwotdm9pZCBnbFRlc3RDaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApOwotdm9pZCBnbFRlc3RQcmludEVHTENvbmZpZ3VyYXRpb24oRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcpOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2xpYi9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2xpYi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzUyYTM3Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9saWIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9NT0RVTEU6PSBsaWJnbFRlc3QKLUxPQ0FMX1NSQ19GSUxFUzo9IGdsVGVzdExpYi5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gc3lzdGVtL2V4dHJhcy90ZXN0cy9pbmNsdWRlIFwKLSAgICBiaW9uaWMgXAotICAgIGJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCi0gICAgZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYnN0bHBvcnQKLQotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvbGliL2dsVGVzdExpYi5jcHAgYi9vcGVuZ2wvdGVzdHMvbGliL2dsVGVzdExpYi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzRmYzcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2xpYi9nbFRlc3RMaWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyoKLSAqIEdyYXBoaWNzIFRlc3QgTGlicmFyeQotICovCi0KLSNpbmNsdWRlIDxnbFRlc3RMaWIuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dGVzdFV0aWwuaD4KLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi12b2lkIGdsVGVzdFByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpCi17Ci0gICAgY29uc3QgY2hhciAqdiA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKHMpOwotCi0gICAgaWYgKHYgPT0gTlVMTCkgewotICAgICAgICB0ZXN0UHJpbnRJKCJHTCAlcyB1bmtub3duIiwgbmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGVzdFByaW50SSgiR0wgJXMgPSAlcyIsIG5hbWUsIHYpOwotICAgIH0KLX0KLQotdm9pZCBnbFRlc3RDaGVja0VnbEVycm9yKGNvbnN0IGNoYXIqIG9wLCBFR0xCb29sZWFuIHJldHVyblZhbCkKLXsKLSAgICBpZiAocmV0dXJuVmFsICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIiVzKCkgcmV0dXJuZWQgJWQiLCBvcCwgcmV0dXJuVmFsKTsKLSAgICB9Ci0KLSAgICBmb3IgKEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7IGVycm9yICE9IEVHTF9TVUNDRVNTOyBlcnJvcgotICAgICAgICAgICAgPSBlZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIHRlc3RQcmludEUoImFmdGVyICVzKCkgZWdsRXJyb3IgJXMgKDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICBvcCwgRUdMVXRpbHM6OnN0cmVycm9yKGVycm9yKSwgZXJyb3IpOwotICAgIH0KLX0KLQotdm9pZCBnbFRlc3RDaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApCi17Ci0gICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCi0gICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpIiwgb3AsIGVycm9yKTsKLSAgICB9Ci19Ci0KLXZvaWQgZ2xUZXN0UHJpbnRFR0xDb25maWd1cmF0aW9uKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnKQotewotCi0jZGVmaW5lIFgoVkFMKSB7VkFMLCAjVkFMfQotICAgIHN0cnVjdCB7RUdMaW50IGF0dHJpYnV0ZTsgY29uc3QgY2hhciogbmFtZTt9IG5hbWVzW10gPSB7Ci0gICAgWChFR0xfQlVGRkVSX1NJWkUpLAotICAgIFgoRUdMX0FMUEhBX1NJWkUpLAotICAgIFgoRUdMX0JMVUVfU0laRSksCi0gICAgWChFR0xfR1JFRU5fU0laRSksCi0gICAgWChFR0xfUkVEX1NJWkUpLAotICAgIFgoRUdMX0RFUFRIX1NJWkUpLAotICAgIFgoRUdMX1NURU5DSUxfU0laRSksCi0gICAgWChFR0xfQ09ORklHX0NBVkVBVCksCi0gICAgWChFR0xfQ09ORklHX0lEKSwKLSAgICBYKEVHTF9MRVZFTCksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfSEVJR0hUKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1dJRFRIKSwKLSAgICBYKEVHTF9OQVRJVkVfUkVOREVSQUJMRSksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9JRCksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFKSwKLSAgICBYKEVHTF9TQU1QTEVTKSwKLSAgICBYKEVHTF9TQU1QTEVfQlVGRkVSUyksCi0gICAgWChFR0xfU1VSRkFDRV9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSksCi0gICAgWChFR0xfTUlOX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX01BWF9TV0FQX0lOVEVSVkFMKSwKLSAgICBYKEVHTF9MVU1JTkFOQ0VfU0laRSksCi0gICAgWChFR0xfQUxQSEFfTUFTS19TSVpFKSwKLSAgICBYKEVHTF9DT0xPUl9CVUZGRVJfVFlQRSksCi0gICAgWChFR0xfUkVOREVSQUJMRV9UWVBFKSwKLSAgICBYKEVHTF9DT05GT1JNQU5UKSwKLSAgIH07Ci0jdW5kZWYgWAotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2YobmFtZXMpIC8gc2l6ZW9mKG5hbWVzWzBdKTsgaisrKSB7Ci0gICAgICAgIEVHTGludCB2YWx1ZSA9IC0xOwotICAgICAgICBFR0xpbnQgcmV0dXJuVmFsID0gZWdsR2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBuYW1lc1tqXS5hdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgICAgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKHJldHVyblZhbCAmJiBlcnJvciA9PSBFR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgdGVzdFByaW50SSgiICVzOiAlZCAoJSN4KSIsIG5hbWVzW2pdLm5hbWUsIHZhbHVlLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGVzdFByaW50SSgiIik7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvbGlnaHRpbmcxNzA5L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvbGlnaHRpbmcxNzA5L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NjNlNjEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2xpZ2h0aW5nMTcwOS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBMaWdodGluZ1Rlc3QKLUxPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCi0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2xpZ2h0aW5nMTcwOS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL2xpZ2h0aW5nMTcwOS9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzIzZDQyLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9saWdodGluZzE3MDkvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmxpZ2h0aW5ndGVzdCI+Ci0KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkNsZWFyQWN0aXZpdHkiIGFuZHJvaWQ6bGFiZWw9IkxpZ2h0aW5nVGVzdCI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9saWdodGluZzE3MDkvc3JjL2NvbS9hbmRyb2lkL2xpZ2h0aW5ndGVzdC9DbGVhckFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvbGlnaHRpbmcxNzA5L3NyYy9jb20vYW5kcm9pZC9saWdodGluZ3Rlc3QvQ2xlYXJBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWU4YzVjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9saWdodGluZzE3MDkvc3JjL2NvbS9hbmRyb2lkL2xpZ2h0aW5ndGVzdC9DbGVhckFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubGlnaHRpbmd0ZXN0OwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7Ci1pbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7Ci0KLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLQotcHVibGljIGNsYXNzIENsZWFyQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBtR0xWaWV3ID0gbmV3IENsZWFyR0xTdXJmYWNlVmlldyh0aGlzKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcobUdMVmlldyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICBtR0xWaWV3Lm9uUGF1c2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgbUdMVmlldy5vblJlc3VtZSgpOwotICAgIH0KLSAgICBwcml2YXRlIEdMU3VyZmFjZVZpZXcgbUdMVmlldzsKLX0KLQotY2xhc3MgQ2xlYXJHTFN1cmZhY2VWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7Ci0gICAgcHVibGljIENsZWFyR0xTdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIG1SZW5kZXJlciA9IG5ldyBDbGVhclJlbmRlcmVyKCk7Ci0gICAgICAgIHNldFJlbmRlcmVyKG1SZW5kZXJlcik7Ci0gICAgfQotCi0gICAgQ2xlYXJSZW5kZXJlciBtUmVuZGVyZXI7Ci19Ci0KLWNsYXNzIENsZWFyUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKLSAgICBwdWJsaWMgQ2xlYXJSZW5kZXJlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZyBzcGVjaWFsLgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHcsIGludCBoKSB7Ci0gICAgICAgIC8vIENvbXB1dGUgdGhlIHByb2plY3Rpb24gbWF0cml4Ci0gICAgICAgIGdsLmdsTWF0cml4TW9kZShHTDEwLkdMX1BST0pFQ1RJT04pOwotICAgICAgICBnbC5nbExvYWRJZGVudGl0eSgpOwotCi0gICAgICAgIC8vIENvbXB1dGUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGZydXN0dW0KLSAgICAgICAgZmxvYXQgZmwgPSAoZmxvYXQpICgtKHcgLyAyKSkgLyAyODg7Ci0gICAgICAgIGZsb2F0IGZyID0gKGZsb2F0KSAodyAvIDIpIC8gMjg4OwotICAgICAgICBmbG9hdCBmdCA9IChmbG9hdCkgKGggLyAyKSAvIDI4ODsKLSAgICAgICAgZmxvYXQgZmIgPSAoZmxvYXQpICgtKGggLyAyKSkgLyAyODg7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSB2aWV3IGZydXN0dW0KLSAgICAgICAgZ2wuZ2xGcnVzdHVtZihmbCwgZnIsIGZiLCBmdCwgMS4wZiwgMjAwMC4wZik7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSB2aWV3cG9ydCBkaW1lbnNpb25zCi0gICAgICAgIGdsLmdsTWF0cml4TW9kZShHTDEwLkdMX01PREVMVklFVyk7Ci0gICAgICAgIGdsLmdsTG9hZElkZW50aXR5KCk7Ci0gICAgICAgIGdsLmdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgewotICAgICAgICBnbC5nbENsZWFyKEdMMTAuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMMTAuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0KLSAgICAgICAgZmluYWwgZmxvYXQgbGlnaHRPZmZbXSAgICAgICAgPSB7MC4wZiwgMC4wZiwgIDAuMGYsIDEuMGZ9OwotICAgICAgICBmaW5hbCBmbG9hdCBsaWdodEFtYmllbnRbXSAgICA9IHs1LjBmLCAwLjBmLCAgMC4wZiwgMS4wZn07Ci0gICAgICAgIGZpbmFsIGZsb2F0IGxpZ2h0RGlmZnVzZVtdICAgID0gezAuMGYsIDIuMGYsICAwLjBmLCAwLjBmfTsKLSAgICAgICAgZmluYWwgZmxvYXQgbGlnaHRQb3NTcG90W10gICAgPSB7MC4wZiwgMC4wZiwgLTguMGYsIDEuMGZ9OwotCi0gICAgICAgIGZpbmFsIGZsb2F0IHBvc1tdID0gewotICAgICAgICAgICAgICAgICAgICAtNS4wZiwgLTEuNWYsIDAuMGYsCi0gICAgICAgICAgICAgICAgICAgICAwLjBmLCAtMS41ZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgIDUuMGYsIC0xLjVmLCAwLjBmLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBmbG9hdCB2W10gPSBuZXcgZmxvYXRbOV07Ci0gICAgICAgIEJ5dGVCdWZmZXIgdmJiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCh2Lmxlbmd0aCo0KTsKLSAgICAgICAgdmJiLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKLSAgICAgICAgRmxvYXRCdWZmZXIgdmIgPSB2YmIuYXNGbG9hdEJ1ZmZlcigpOwotCi0gICAgICAgIGdsLmdsRGlzYWJsZShHTDEwLkdMX0RJVEhFUik7Ci0KLSAgICAgICAgZ2wuZ2xMaWdodGZ2KEdMMTAuR0xfTElHSFQwLCBHTDEwLkdMX0FNQklFTlQsIGxpZ2h0QW1iaWVudCwgMCk7Ci0gICAgICAgIGdsLmdsTGlnaHRmdihHTDEwLkdMX0xJR0hUMCwgR0wxMC5HTF9ESUZGVVNFLCBsaWdodERpZmZ1c2UsIDApOwotICAgICAgICBnbC5nbExpZ2h0ZnYoR0wxMC5HTF9MSUdIVDAsIEdMMTAuR0xfU1BFQ1VMQVIsIGxpZ2h0T2ZmLCAwKTsKLSAgICAgICAgZ2wuZ2xMaWdodGZ2KEdMMTAuR0xfTElHSFQwLCBHTDEwLkdMX1BPU0lUSU9OLCBsaWdodFBvc1Nwb3QsIDApOwotICAgICAgICBnbC5nbEVuYWJsZShHTDEwLkdMX0xJR0hUMCk7Ci0gICAgICAgIAotICAgICAgICBnbC5nbEVuYWJsZShHTDEwLkdMX0xJR0hUSU5HKTsKLQotCi0gICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoR0wxMC5HTF9WRVJURVhfQVJSQVkpOwotICAgICAgICBnbC5nbE5vcm1hbDNmKDAsIDAsIDEpOwotICAgICAgICAKLQotICAgICAgICAvLyBkcmF3IGZpcnN0IDMgdHJpYW5nbGVzLCB3aXRob3V0IHVzaW5nIHRyYW5zZm9ybXMKLSAgICAgICAgZm9yIChpbnQgaT0wIDsgaTwzIDsgaSsrKSB7Ci0gICAgICAgICAgICB2WzBdID0gLTE7IHZbMV0gPS0xOyB2WzJdID0gLTEwOwotICAgICAgICAgICAgdlszXSA9ICAwOyB2WzRdID0gMTsgdls1XSA9IC0xMDsKLSAgICAgICAgICAgIHZbNl0gPSAgMTsgdls3XSA9LTE7IHZbOF0gPSAtMTA7Ci0gICAgICAgICAgICBmb3IgKGludCBqPTAgOyBqPDMgOyBqKyspIHsKLSAgICAgICAgICAgICAgICB2W2oqMyswXSAtPSBwb3NbaSozKzBdOwotICAgICAgICAgICAgICAgIHZbaiozKzFdIC09IHBvc1tpKjMrMV07Ci0gICAgICAgICAgICAgICAgdltqKjMrMl0gLT0gcG9zW2kqMysyXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZiLnB1dCh2KS5wb3NpdGlvbigwKTsKLSAgICAgICAgICAgIGdsLmdsVmVydGV4UG9pbnRlcigzLCBHTDEwLkdMX0ZMT0FULCAwLCB2Yik7Ci0gICAgICAgICAgICBnbC5nbERyYXdBcnJheXMoR0wxMC5HTF9UUklBTkdMRV9TVFJJUCwgMCwgMyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGRyYXcgdGhlIDJuZCBiYXRjaCB0aGlzIHRpbWUgd2l0aCB0cmFuc2Zvcm1zCi0gICAgICAgIHZbMF0gPSAtMTsgdlsxXSA9LTE7IHZbMl0gPSAtMTA7Ci0gICAgICAgIHZbM10gPSAgMDsgdls0XSA9IDE7IHZbNV0gPSAtMTA7Ci0gICAgICAgIHZbNl0gPSAgMTsgdls3XSA9LTE7IHZbOF0gPSAtMTA7Ci0gICAgICAgIHZiLnB1dCh2KS5wb3NpdGlvbigwKTsKLSAgICAgICAgZ2wuZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMMTAuR0xfRkxPQVQsIDAsIHZiKTsKLQotICAgICAgICAvLyBkcmF3IGxvd2VyIGxlZnQgdHJpYW5nbGUKLSAgICAgICAgZ2wuZ2xQdXNoTWF0cml4KCk7Ci0gICAgICAgIGdsLmdsVHJhbnNsYXRlZihwb3NbMF0sIHBvc1sxXSwgcG9zWzJdKTsKLSAgICAgICAgZ2wuZ2xEcmF3QXJyYXlzKEdMMTAuR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDMpOwotICAgICAgICBnbC5nbFBvcE1hdHJpeCgpOwotCi0gICAgICAgIC8vIGRyYXcgbG93ZXIgbWlkZGxlIHRyaWFuZ2xlCi0gICAgICAgIGdsLmdsUHVzaE1hdHJpeCgpOwotICAgICAgICBnbC5nbFRyYW5zbGF0ZWYocG9zWzNdLCBwb3NbNF0sIHBvc1s1XSk7Ci0gICAgICAgIGdsLmdsRHJhd0FycmF5cyhHTDEwLkdMX1RSSUFOR0xFX1NUUklQLCAwLCAzKTsKLSAgICAgICAgZ2wuZ2xQb3BNYXRyaXgoKTsKLQotICAgICAgICAvLyBkcmF3IGxvd2VyIHJpZ2h0IHRyaWFuZ2xlCi0gICAgICAgIGdsLmdsUHVzaE1hdHJpeCgpOwotICAgICAgICBnbC5nbFRyYW5zbGF0ZWYocG9zWzZdLCBwb3NbN10sIHBvc1s4XSk7Ci0gICAgICAgIGdsLmdsRHJhd0FycmF5cyhHTDEwLkdMX1RSSUFOR0xFX1NUUklQLCAwLCAzKTsKLSAgICAgICAgZ2wuZ2xQb3BNYXRyaXgoKTsgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50W10gZ2V0Q29uZmlnU3BlYygpIHsKLSAgICAgICAgaW50W10gY29uZmlnU3BlYyA9IHsgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIDE2LCBFR0wxMC5FR0xfTk9ORSB9OwotICAgICAgICByZXR1cm4gY29uZmlnU3BlYzsgICAgICAKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9saW5ldGV4L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvbGluZXRleC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjYzODRlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9saW5ldGV4L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JbGluZXRleC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLSAgICBsaWJFR0wgXAotICAgIGxpYkdMRVN2MV9DTSBcCi0gICAgbGlidWkKLQotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1saW5ldGV4Ci0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2xpbmV0ZXgvbGluZXRleC5jcHAgYi9vcGVuZ2wvdGVzdHMvbGluZXRleC9saW5ldGV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2OTQ5Mi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvbGluZXRleC9saW5ldGV4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNkZWZpbmUgTE9HX1RBRyAiZmlsbHJhdGUiCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdG9wV2F0Y2guaD4KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgIkVHTFV0aWxzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCi17Ci0gICAgRUdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAwLAotICAgICAgICAgRUdMX05PTkUKLSAgICAgfTsKLSAgICAgCi0gICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgIEVHTENvbnRleHQgY29udGV4dDsKLSAgICAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgICAgRUdMU3VyZmFjZSBzdXJmYWNlOwotICAgICBFR0xpbnQgdywgaDsKLSAgICAgRUdMRGlzcGxheSBkcHk7Ci0KLSAgICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7Ci0gICAgIAotICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgICAgICAgCi0gICAgIHN0YXR1c190IGVyciA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coCi0gICAgICAgICAgICAgZHB5LCBjb25maWdBdHRyaWJzLCB3aW5kb3csICZjb25maWcpOwotICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGZpbmQgYW4gRUdMQ29uZmlnIG1hdGNoaW5nIHRoZSBzY3JlZW4gZm9ybWF0XG4iKTsKLSAgICAgICAgIHJldHVybiAwOwotICAgICB9Ci0KLSAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsIHdpbmRvdywgTlVMTCk7Ci0gICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKLSAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKLSAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7Ci0gICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKLSAgICAgCi0gICAgIHByaW50Zigidz0lZCwgaD0lZFxuIiwgdywgaCk7Ci0gICAgIAotICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOwotICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOwotICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwotICAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKLSAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKLQotCi0gICAgIC8vIGRlZmF1bHQgcGFjay1hbGlnbm1lbnQgaXMgNAotICAgICBjb25zdCB1aW50MTZfdCB0MTZbNjRdID0geyAweEZGRkYsIDAsIDB4RjgwMCwgMCwgMHgwN0UwLCAwLCAweDAwMUYsIDAgfTsKLQotICAgICBjb25zdCBHTGZsb2F0IHZlcnRpY2VzWzRdWzJdID0gewotICAgICAgICAgICAgIHsgdy8yLCAgMCB9LAotICAgICAgICAgICAgIHsgdy8yLCAgaCB9Ci0gICAgIH07Ci0KLSAgICAgY29uc3QgR0xmbG9hdCB0ZXhDb29yZHNbNF1bMl0gPSB7Ci0gICAgICAgICAgICAgeyAwLCAgMCB9LAotICAgICAgICAgICAgIHsgMSwgIDEgfQotICAgICB9OwotCi0gICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsIDEsIDQsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHQxNik7Ci0KLSAgICAgZ2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsKLSAgICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotICAgICBnbExvYWRJZGVudGl0eSgpOwotICAgICBnbE9ydGhvZigwLCB3LCAwLCBoLCAwLCAxKTsKLQotICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7Ci0gICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9GTE9BVCwgMCwgdmVydGljZXMpOwotICAgICBnbFRleENvb3JkUG9pbnRlcigyLCBHTF9GTE9BVCwgMCwgdGV4Q29vcmRzKTsKLQotICAgICBnbENsZWFyQ29sb3IoMCwwLDAsMCk7Ci0gICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgIGdsRHJhd0FycmF5cyhHTF9MSU5FUywgMCwgMik7Ci0gICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0KLSAgICAgdXNsZWVwKDUqMTAwMDAwMCk7Ci0KLSAgICAgZWdsVGVybWluYXRlKGRweSk7Ci0gICAgIAotICAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9zd2FwaW50ZXJ2YWwvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9zd2FwaW50ZXJ2YWwvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUxN2Y2MC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvc3dhcGludGVydmFsL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0Jc3dhcGludGVydmFsLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYnV0aWxzIFwKLSAgICBsaWJFR0wgXAotICAgIGxpYkdMRVN2MV9DTSBcCi0gICAgbGlidWkKLQotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1zd2FwaW50ZXJ2YWwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvc3dhcGludGVydmFsL3N3YXBpbnRlcnZhbC5jcHAgYi9vcGVuZ2wvdGVzdHMvc3dhcGludGVydmFsL3N3YXBpbnRlcnZhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjRiYzQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3N3YXBpbnRlcnZhbC9zd2FwaW50ZXJ2YWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKioKLSAqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0b3BXYXRjaC5oPgotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0jaW5jbHVkZSAiRUdMVXRpbHMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKLXsKLSAgICBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0gewotICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgICBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9OT05FCi0gICAgfTsKLQotICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKLSAgICBFR0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgICBFR0xpbnQgbnVtQ29uZmlncz0wOwotICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICBFR0xpbnQgdywgaDsKLSAgICBFR0xEaXNwbGF5IGRweTsKLQotICAgIAotICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOwotCi0gICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgZWdsR2V0Q29uZmlncyhkcHksIE5VTEwsIDAsICZudW1Db25maWdzKTsKLSAgICBwcmludGYoIiMgY29uZmlncyA9ICVkXG4iLCBudW1Db25maWdzKTsKLQotICAgIHN0YXR1c190IGVyciA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coCi0gICAgICAgICAgICBkcHksIGNvbmZpZ0F0dHJpYnMsIHdpbmRvdywgJmNvbmZpZyk7Ci0gICAgaWYgKGVycikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiAlcyIsIEVHTFV0aWxzOjpzdHJlcnJvcihlZ2xHZXRFcnJvcigpKSk7Ci0gICAgICAgIGVnbFRlcm1pbmF0ZShkcHkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBFR0xpbnQgcixnLGIsYSwgdmlkOwotICAgIGVnbEdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZywgRUdMX1JFRF9TSVpFLCAgICZyKTsKLSAgICBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIEVHTF9HUkVFTl9TSVpFLCAmZyk7Ci0gICAgZWdsR2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfQkxVRV9TSVpFLCAgJmIpOwotICAgIGVnbEdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZywgRUdMX0FMUEhBX1NJWkUsICZhKTsKLSAgICBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIEVHTF9OQVRJVkVfVklTVUFMX0lELCAmdmlkKTsKLQotICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLCB3aW5kb3csIE5VTEwpOwotICAgIGlmIChzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgIEVHTGludCBlcnIgPSBlZ2xHZXRFcnJvcigpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiAlcywgY29uZmlnPSVwLCBmb3JtYXQgPSAlZC0lZC0lZC0lZCwgdmlzdWFsLWlkID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgRUdMVXRpbHM6OnN0cmVycm9yKGVyciksIGNvbmZpZywgcixnLGIsYSwgdmlkKTsKLSAgICAgICAgZWdsVGVybWluYXRlKGRweSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiY29uZmlnPSVwLCBmb3JtYXQgPSAlZC0lZC0lZC0lZCwgdmlzdWFsLWlkID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgY29uZmlnLCByLGcsYixhLCB2aWQpOwotICAgIH0KLQotICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKLSAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAotICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOwotICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKLQotICAgIHByaW50Zigidz0lZCwgaD0lZFxuIiwgdywgaCk7Ci0KLSAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKLSAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0KLSAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotICAgIGdsT3J0aG9mKDAsIHcsIDAsIGgsIDAsIDEpOwotCi0gICAgZWdsU3dhcEludGVydmFsKGRweSwgMSk7Ci0KLSAgICBnbENsZWFyQ29sb3IoMSwwLDAsMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotCi0KLSAgICBpbnQgdGltZSA9IDEwOwotICAgIHByaW50Zigic2NyZWVuIHNob3VsZCBmbGFzaCByZWQvZ3JlZW4gcXVpY2tseSBmb3IgJWQgcy4uLlxuIiwgdGltZSk7Ci0KLSAgICBpbnQgYyA9IDA7Ci0gICAgbnNlY3NfdCBzdGFydCA9IHN5c3RlbVRpbWUoKTsKLSAgICBuc2Vjc190IHQ7Ci0gICAgZG8gewotICAgICAgICBnbENsZWFyQ29sb3IoMSwwLDAsMCk7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgICAgIGdsQ2xlYXJDb2xvcigwLDEsMCwwKTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgICAgdCA9IHN5c3RlbVRpbWUoKSAtIHN0YXJ0OwotICAgICAgICBjICs9IDI7Ci0gICAgfSB3aGlsZSAoaW50KG5zMnModCkpPD10aW1lKTsKLQotICAgIGRvdWJsZSBwID0gIChkb3VibGUodCkgLyBjKSAvIDEwMDAwMDAwMDAuMDsKLSAgICBwcmludGYoInJlZnJlc2gtcmF0ZSBpcyAlZiBmcHMgKCVmIG1zKVxuIiwgMS4wZi9wLCBwKjEwMDAuMCk7Ci0KLSAgICBlZ2xUZXJtaW5hdGUoZHB5KTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMGFiZjMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGVzdCBmcmFtZXJhdGUgYW5kIGxvb2sgZm9yIGhpY2N1cHMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIEJ1aWxkIGFjdGl2aXR5Ci0KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXN0RnJhbWVyYXRlCi0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjE3ZjQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdGZyYW1lcmF0ZSI+Ci0gICAgPHVzZXMtc2RrIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iOCIgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSI4IiAvPgotCi0gICAgPGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Rlc3RGcmFtZXJhdGVfYWN0aXZpdHkiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0RnJhbWVyYXRlQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWFkZjBlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCi0gICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InRlc3RGcmFtZXJhdGVfYWN0aXZpdHkiPlRlc3RGcmFtZXJhdGU8L3N0cmluZz4KLQotPC9yZXNvdXJjZXM+Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3NyYy9jb20vYW5kcm9pZC90ZXN0ZnJhbWVyYXRlL1Rlc3RGcmFtZXJhdGVBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvc3JjL2NvbS9hbmRyb2lkL3Rlc3RmcmFtZXJhdGUvVGVzdEZyYW1lcmF0ZUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTI3OWIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvc3JjL2NvbS9hbmRyb2lkL3Rlc3RmcmFtZXJhdGUvVGVzdEZyYW1lcmF0ZUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0ZnJhbWVyYXRlOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEZyYW1lcmF0ZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgVGVzdEZyYW1lcmF0ZVZpZXcgbVZpZXc7Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotICAgICAgICBtVmlldyA9IG5ldyBUZXN0RnJhbWVyYXRlVmlldyhnZXRBcHBsaWNhdGlvbigpKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOwotICAgICAgICBtVmlldy5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICBtVmlldy5vblBhdXNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtVmlldy5vblJlc3VtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3NyYy9jb20vYW5kcm9pZC90ZXN0ZnJhbWVyYXRlL1Rlc3RGcmFtZXJhdGVWaWV3LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9zcmMvY29tL2FuZHJvaWQvdGVzdGZyYW1lcmF0ZS9UZXN0RnJhbWVyYXRlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2ZiNWRlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3NyYy9jb20vYW5kcm9pZC90ZXN0ZnJhbWVyYXRlL1Rlc3RGcmFtZXJhdGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0ZnJhbWVyYXRlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci0KLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLWltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKLQotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0OwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7Ci0KLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTEVTMjA7Ci0KLWNsYXNzIFRlc3RGcmFtZXJhdGVWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBRyA9ICJUZXN0RnJhbWVyYXRlVmlldyI7Ci0KLSAgICBwdWJsaWMgVGVzdEZyYW1lcmF0ZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBzZXRFR0xDb250ZXh0Q2xpZW50VmVyc2lvbigyKTsKLSAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgbG9uZyBtTGFzdFRpbWVfdXMgPSAwOwotICAgIHByaXZhdGUgbG9uZyBtTnVtU2hvcnRGcmFtZXNFbGFwc2VkID0gMDsKLSAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJUaW1lKGxvbmcgbm93X3VzKSB7Ci0gICAgICAgIGxvbmcgbG9uZ0ZyYW1lVGltZV9tcyA9IEludGVnZXIucGFyc2VJbnQoU3lzdGVtUHJvcGVydGllcy5nZXQoImRlYnVnLmxvbmdmcmFtZV9tcyIsICIxNiIpKTsKLSAgICAgICAgbG9uZyBlbGFwc2VkVGltZV91cyA9IG5vd191cyAtIG1MYXN0VGltZV91czsKLSAgICAgICAgZmxvYXQgZnBzID0gMTAwMDAwMC5mIC8gZWxhcHNlZFRpbWVfdXM7Ci0gICAgICAgIGlmIChtTGFzdFRpbWVfdXMgPiAwICYmIGVsYXBzZWRUaW1lX3VzID4gbG9uZ0ZyYW1lVGltZV9tcyoxMDAwKSB7Ci0gICAgICAgICAgTG9nLnYoVEFHLCAiTG9uZyBmcmFtZTogIiArIGVsYXBzZWRUaW1lX3VzLzEwMDAuZiArICIgbXMgKCIgKyBmcHMgKyAiIGZwcykiKTsKLSAgICAgICAgICBpZiAobU51bVNob3J0RnJhbWVzRWxhcHNlZCA+IDApIHsKLSAgICAgICAgICAgIExvZy52KFRBRywgIiAgU2hvcnQgZnJhbWVzIHNpbmNlIGxhc3QgbG9uZyBmcmFtZTogIiArIG1OdW1TaG9ydEZyYW1lc0VsYXBzZWQpOwotICAgICAgICAgICAgbU51bVNob3J0RnJhbWVzRWxhcHNlZCA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKyttTnVtU2hvcnRGcmFtZXNFbGFwc2VkOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxhc3RUaW1lX3VzID0gbm93X3VzOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKLSAgICAgICAgcHVibGljIFJlbmRlcmVyKCkgewotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7Ci0gICAgICAgICAgICBsb25nIG5vd191cyA9IFN5c3RlbS5uYW5vVGltZSgpIC8gMTAwMDsKLSAgICAgICAgICAgIHJlZ2lzdGVyVGltZShub3dfdXMpOwotCi0gICAgICAgICAgICBmbG9hdCByZWQgPSAobm93X3VzICUgMTAwMDAwMCkgLyAxMDAwMDAwLmY7Ci0gICAgICAgICAgICBmbG9hdCBncmVlbiA9IChub3dfdXMgJSAyMDAwMDAwKSAvIDIwMDAwMDAuZjsKLSAgICAgICAgICAgIGZsb2F0IGJsdWUgPSAobm93X3VzICUgMzAwMDAwMCkgLyAzMDAwMDAwLmY7Ci0gICAgICAgICAgICBHTEVTMjAuZ2xDbGVhckNvbG9yKHJlZCwgZ3JlZW4sIGJsdWUsIDEuMGYpOwotICAgICAgICAgICAgR0xFUzIwLmdsQ2xlYXIoR0xFUzIwLkdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgIEdMRVMyMC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDE3YzcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRlc3QgZW5kLXRvLWVuZCBsYXRlbmN5LgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1UT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgQnVpbGQgYWN0aXZpdHkKLQotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TREtfVkVSU0lPTiA6PSA4Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFRlc3RMYXRlbmN5Ci0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmMjY0My4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdGxhdGVuY3kiPgotICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjgiIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iOCIgLz4KLQotICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy90ZXN0TGF0ZW5jeV9hY3Rpdml0eSI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RMYXRlbmN5QWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MGI3N2MuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCi0gICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InRlc3RMYXRlbmN5X2FjdGl2aXR5Ij5UZXN0TGF0ZW5jeTwvc3RyaW5nPgotCi08L3Jlc291cmNlcz4KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3NyYy9jb20vYW5kcm9pZC90ZXN0bGF0ZW5jeS9UZXN0TGF0ZW5jeUFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvc3JjL2NvbS9hbmRyb2lkL3Rlc3RsYXRlbmN5L1Rlc3RMYXRlbmN5QWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5OTNjYi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvc3JjL2NvbS9hbmRyb2lkL3Rlc3RsYXRlbmN5L1Rlc3RMYXRlbmN5QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RsYXRlbmN5OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdExhdGVuY3lBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIFRlc3RMYXRlbmN5VmlldyBtVmlldzsKLQotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0gICAgICAgIG1WaWV3ID0gbmV3IFRlc3RMYXRlbmN5VmlldyhnZXRBcHBsaWNhdGlvbigpKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOwotICAgICAgICBtVmlldy5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICBtVmlldy5vblBhdXNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtVmlldy5vblJlc3VtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9zcmMvY29tL2FuZHJvaWQvdGVzdGxhdGVuY3kvVGVzdExhdGVuY3lWaWV3LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvc3JjL2NvbS9hbmRyb2lkL3Rlc3RsYXRlbmN5L1Rlc3RMYXRlbmN5Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjJiZjE3Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9zcmMvY29tL2FuZHJvaWQvdGVzdGxhdGVuY3kvVGVzdExhdGVuY3lWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQudGVzdGxhdGVuY3k7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7Ci1pbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7Ci0KLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOwotCi1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xFUzIwOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFN1cmZhY2VWaWV3IHRoYXQgdXNlcyB0aGUgZGVkaWNhdGVkIHN1cmZhY2UgZm9yCi0gKiBkaXNwbGF5aW5nIGFuIE9wZW5HTCBhbmltYXRpb24uICBUaGlzIGFsbG93cyB0aGUgYW5pbWF0aW9uIHRvIHJ1biBpbiBhCi0gKiBzZXBhcmF0ZSB0aHJlYWQsIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgaXQgYmUgZHJpdmVuIGJ5IHRoZSB1cGRhdGUgbWVjaGFuaXNtCi0gKiBvZiB0aGUgdmlldyBoaWVyYXJjaHkuCi0gKgotICogVGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlbmRlcmluZyBjb2RlIGlzIGRlbGVnYXRlZCB0byBhIEdMVmlldy5SZW5kZXJlcgotICogaW5zdGFuY2UuCi0gKi8KLWNsYXNzIFRlc3RMYXRlbmN5VmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiVGVzdExhdGVuY3lpZXciOwotICAgIHByaXZhdGUgZmxvYXQgbVg7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtWTsKLSAgICBwcml2YXRlIGZsb2F0IG1EWDsKLSAgICBwcml2YXRlIGZsb2F0IG1EWTsKLSAgICBwcml2YXRlIGxvbmcgIG1UOwotICAgIHByaXZhdGUgbG9uZyAgbURUOwotCi0gICAgcHVibGljIFRlc3RMYXRlbmN5VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIHNldEVHTENvbnRleHRDbGllbnRWZXJzaW9uKDIpOwotICAgICAgICBzZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uKCkpIHsKLSAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRToKLSAgICAgICAgICAgIGZsb2F0IHggPSBldmVudC5nZXRYKCk7Ci0gICAgICAgICAgICBmbG9hdCB5ID0gZXZlbnQuZ2V0WSgpOwotICAgICAgICAgICAgbG9uZyAgdCA9IGV2ZW50LmdldEV2ZW50VGltZSgpOwotICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBtRFQgPSB0IC0gbVQ7Ci0gICAgICAgICAgICAgICAgbVQgPSB0OwotICAgICAgICAgICAgICAgIG1EWCA9IHggLSBtWDsKLSAgICAgICAgICAgICAgICBtWCA9IHg7Ci0gICAgICAgICAgICAgICAgbURZID0geSAtIG1ZOwotICAgICAgICAgICAgICAgIG1ZID0geTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgewotICAgICAgICBwcml2YXRlIGZsb2F0IG1TY2FsZVgsIG1TY2FsZVksIG1PZmZzZXRYLCBtT2Zmc2V0WTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBNU19QRVJfRlJBTUUgPSAxMDAwIC8gNjA7Ci0gICAgICAgIHB1YmxpYyBSZW5kZXJlcigpIHsKLSAgICAgICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChtVHJpYW5nbGVWZXJ0aWNlc0RhdGEubGVuZ3RoICogNCkKLSAgICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpLmFzRmxvYXRCdWZmZXIoKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgewotICAgICAgICAgICAgR0xFUzIwLmdsQ2xlYXJDb2xvcigwLjRmLCAwLjRmLCAwLjRmLCAxLjBmKTsKLSAgICAgICAgICAgIEdMRVMyMC5nbENsZWFyKCBHTEVTMjAuR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMRVMyMC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgICAgIEdMRVMyMC5nbFVzZVByb2dyYW0obVByb2dyYW0pOwotICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbFVzZVByb2dyYW0iKTsKLQotICAgICAgICAgICAgZmxvYXQgeCwgeSwgZHgsIGR5OwotICAgICAgICAgICAgbG9uZyB0LCBkdDsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZChUZXN0TGF0ZW5jeVZpZXcudGhpcykgewotICAgICAgICAgICAgICAgIHggPSBtWDsKLSAgICAgICAgICAgICAgICB5ID0gbVk7Ci0gICAgICAgICAgICAgICAgZHggPSBtRFg7Ci0gICAgICAgICAgICAgICAgZHkgPSBtRFk7Ci0gICAgICAgICAgICAgICAgZHQgPSBtRFQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkdCA+IDApIHsKLSAgICAgICAgICAgICAgICBkeCA9IGR4ICogTVNfUEVSX0ZSQU1FIC8gZHQ7Ci0gICAgICAgICAgICAgICAgZHkgPSBkeSAqIE1TX1BFUl9GUkFNRSAvIGR0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBHTEVTMjAuZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtdlBvc2l0aW9uSGFuZGxlKTsKLSAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSIpOwotICAgICAgICAgICAgR0xFUzIwLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobXZDb2xvckhhbmRsZSk7Ci0gICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkiKTsKLSAgICAgICAgICAgIGZvcihpbnQgc3RlcCA9IDA7IHN0ZXAgPCA4OyBzdGVwKyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCBzeCA9ICh4ICsgZHggKiBzdGVwKSAqIG1TY2FsZVggKyBtT2Zmc2V0WDsKLSAgICAgICAgICAgICAgICBmbG9hdCBzeSA9ICh5ICsgZHkgKiBzdGVwKSAqIG1TY2FsZVkgKyBtT2Zmc2V0WTsKLSAgICAgICAgICAgICAgICBpbnQgY2Jhc2UgPSBzdGVwICogNDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVRyaWFuZ2xlVmVydGljZXNEYXRhLmxlbmd0aDsgaSArPSA2KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzRGF0YTJbaV0gPSBzeCArIG1UcmlhbmdsZVZlcnRpY2VzRGF0YVtpXTsKLSAgICAgICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXNEYXRhMltpKzFdID0gLXN5ICsgbVRyaWFuZ2xlVmVydGljZXNEYXRhW2krMV07Ci0gICAgICAgICAgICAgICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzRGF0YTJbaSsyXSA9IG1Db2xvcnNbY2Jhc2VdOwotICAgICAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyW2krM10gPSBtQ29sb3JzW2NiYXNlKzFdOwotICAgICAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyW2krNF0gPSBtQ29sb3JzW2NiYXNlKzJdOwotICAgICAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyW2krNV0gPSBtQ29sb3JzW2NiYXNlKzNdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlcy5wb3NpdGlvbigwKTsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlcy5wdXQobVRyaWFuZ2xlVmVydGljZXNEYXRhMikucG9zaXRpb24oMCk7Ci0KLSAgICAgICAgICAgICAgICBHTEVTMjAuZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG12UG9zaXRpb25IYW5kbGUsIDIsIEdMRVMyMC5HTF9GTE9BVCwgZmFsc2UsIDYqNCwgbVRyaWFuZ2xlVmVydGljZXMpOwotICAgICAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyIG12UG9zaXRpb24iKTsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlcy5wdXQobVRyaWFuZ2xlVmVydGljZXNEYXRhMikucG9zaXRpb24oMik7Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsVmVydGV4QXR0cmliUG9pbnRlcihtdkNvbG9ySGFuZGxlLCA0LCBHTEVTMjAuR0xfRkxPQVQsIGZhbHNlLCA2KjQsIG1UcmlhbmdsZVZlcnRpY2VzKTsKLSAgICAgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsVmVydGV4QXR0cmliUG9pbnRlciBtdkNvbG9yIik7Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsRHJhd0FycmF5cyhHTEVTMjAuR0xfVFJJQU5HTEVTLCAwLCAzKTsKLSAgICAgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsRHJhd0FycmF5cyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgIEdMRVMyMC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgbVNjYWxlWCA9IDIuMGYgLyB3aWR0aDsKLSAgICAgICAgICAgIG1TY2FsZVkgPSAyLjBmIC8gaGVpZ2h0OwotICAgICAgICAgICAgbU9mZnNldFggPSAtMWY7Ci0gICAgICAgICAgICBtT2Zmc2V0WSA9IC0xZjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAgICAgbVByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKG1WZXJ0ZXhTaGFkZXIsIG1GcmFnbWVudFNoYWRlcik7Ci0gICAgICAgICAgICBpZiAobVByb2dyYW0gPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG12UG9zaXRpb25IYW5kbGUgPSBHTEVTMjAuZ2xHZXRBdHRyaWJMb2NhdGlvbihtUHJvZ3JhbSwgImFQb3NpdGlvbiIpOwotICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbEdldEF0dHJpYkxvY2F0aW9uIik7Ci0gICAgICAgICAgICBpZiAobXZQb3NpdGlvbkhhbmRsZSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IGF0dHJpYiBsb2NhdGlvbiBmb3IgdlBvc2l0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtdkNvbG9ySGFuZGxlID0gR0xFUzIwLmdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW0sICJhQ29sb3IiKTsKLSAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOwotICAgICAgICAgICAgaWYgKG12Q29sb3JIYW5kbGUgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCBhdHRyaWIgbG9jYXRpb24gZm9yIHZDb2xvciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbG9hZFNoYWRlcihpbnQgc2hhZGVyVHlwZSwgU3RyaW5nIHNvdXJjZSkgewotICAgICAgICAgICAgaW50IHNoYWRlciA9IEdMRVMyMC5nbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKLSAgICAgICAgICAgIGlmIChzaGFkZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIEdMRVMyMC5nbFNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgICAgIGludFtdIGNvbXBpbGVkID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgICAgICBHTEVTMjAuZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMRVMyMC5HTF9DT01QSUxFX1NUQVRVUywgY29tcGlsZWQsIDApOwotICAgICAgICAgICAgICAgIGlmIChjb21waWxlZFswXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAiICsgc2hhZGVyVHlwZSArICI6Iik7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgR0xFUzIwLmdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgR0xFUzIwLmdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNoYWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGNyZWF0ZVByb2dyYW0oU3RyaW5nIHZlcnRleFNvdXJjZSwgU3RyaW5nIGZyYWdtZW50U291cmNlKSB7Ci0gICAgICAgICAgICBpbnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTEVTMjAuR0xfVkVSVEVYX1NIQURFUiwgdmVydGV4U291cmNlKTsKLSAgICAgICAgICAgIGlmICh2ZXJ0ZXhTaGFkZXIgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcGl4ZWxTaGFkZXIgPSBsb2FkU2hhZGVyKEdMRVMyMC5HTF9GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U291cmNlKTsKLSAgICAgICAgICAgIGlmIChwaXhlbFNoYWRlciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBwcm9ncmFtID0gR0xFUzIwLmdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgICAgICAgICAgaWYgKHByb2dyYW0gIT0gMCkgewotICAgICAgICAgICAgICAgIEdMRVMyMC5nbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwotICAgICAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIgdmVydGV4U2hhZGVyIik7Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHBpeGVsU2hhZGVyKTsKLSAgICAgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIHBpeGVsU2hhZGVyIik7Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgICAgICAgICAgaW50W10gbGlua1N0YXR1cyA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMRVMyMC5HTF9MSU5LX1NUQVRVUywgbGlua1N0YXR1cywgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmtTdGF0dXNbMF0gIT0gR0xFUzIwLkdMX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGxpbmsgcHJvZ3JhbTogIik7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgR0xFUzIwLmdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpOwotICAgICAgICAgICAgICAgICAgICBHTEVTMjAuZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICAgICAgICAgICAgICBwcm9ncmFtID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvZ3JhbTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0dsRXJyb3IoU3RyaW5nIG9wKSB7Ci0gICAgICAgICAgICBpbnQgZXJyb3I7Ci0gICAgICAgICAgICB3aGlsZSAoKGVycm9yID0gR0xFUzIwLmdsR2V0RXJyb3IoKSkgIT0gR0xFUzIwLkdMX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBvcCArICI6IGdsRXJyb3IgIiArIGVycm9yKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihvcCArICI6IGdsRXJyb3IgIiArIGVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFgsIFksIFIgRyBCIEEKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1UcmlhbmdsZVZlcnRpY2VzRGF0YSA9IHsKLSAgICAgICAgICAgICAgICAtMC4wMjVmLCAwLjNmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLAotICAgICAgICAgICAgICAgICAwLjBmICAsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsCi0gICAgICAgICAgICAgICAgIDAuMDI1ZiwgMC4zZiwgMS4wZiwgMS4wZiwgMjU1LjBmLCAxLjBmCi0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAvLyBDb2xvciBjYXNjYWRlOgotICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbUNvbG9ycyA9IHsKLSAgICAgICAgICAgICAgICAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmLAotICAgICAgICAgICAgICAgIDAuNWYsIDAuMGYsIDAuMGYsIDEuMGYsCi0gICAgICAgICAgICAgICAgMC4wZiwgMC41ZiwgMC4wZiwgMS4wZiwKLSAgICAgICAgICAgICAgICAwLjVmLCAwLjVmLCAwLjBmLCAxLjBmLAotCi0gICAgICAgICAgICAgICAgMC4wZiwgMC4wZiwgMC41ZiwgMS4wZiwKLSAgICAgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLAotICAgICAgICAgICAgICAgIDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYsCi0gICAgICAgICAgICAgICAgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZgotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgZmxvYXRbXSBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyID0gbmV3IGZsb2F0W21UcmlhbmdsZVZlcnRpY2VzRGF0YS5sZW5ndGhdOwotICAgICAgICBwcml2YXRlIEZsb2F0QnVmZmVyIG1UcmlhbmdsZVZlcnRpY2VzOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WZXJ0ZXhTaGFkZXIgPSAiYXR0cmlidXRlIHZlYzQgYVBvc2l0aW9uO1xuIgotICAgICAgICAgICAgKyAiYXR0cmlidXRlIHZlYzQgYUNvbG9yO1xuIgotICAgICAgICAgICAgKyAidmFyeWluZyB2ZWM0IHZDb2xvcjtcbiIKLSAgICAgICAgICAgICsgInZvaWQgbWFpbigpIHtcbiIKLSAgICAgICAgICAgICsgIiAgZ2xfUG9zaXRpb24gPSBhUG9zaXRpb247XG4iCi0gICAgICAgICAgICArICIgIHZDb2xvciA9IGFDb2xvcjtcbiIKLSAgICAgICAgICAgICsgIn1cbiI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUZyYWdtZW50U2hhZGVyID0gInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICAgICAgICAgKyAidmFyeWluZyB2ZWM0IHZDb2xvcjtcbiIKLSAgICAgICAgICAgICsgInZvaWQgbWFpbigpIHtcbiIKLSAgICAgICAgICAgICsgIiAgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yO1xuIgotICAgICAgICAgICAgKyAifVxuIjsKLQotICAgICAgICBwcml2YXRlIGludCBtUHJvZ3JhbTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbXZQb3NpdGlvbkhhbmRsZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbXZDb2xvckhhbmRsZTsKLQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhiZGMzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgT3BlbkdMIEVTIEpOSSBzYW1wbGUKLSMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBhbiBhY3Rpdml0eSBhbmQgYSBzaGFyZWQgbGlicmFyeS4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBCdWlsZCBhY3Rpdml0eQotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFRlc3RFR0wKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFBhdXNlUmVzdW1lL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvdGVzdFBhdXNlUmVzdW1lL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzliYzMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0Ij4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgotICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KLSAgICA8YXBwbGljYXRpb24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvdGVzdF9hY3Rpdml0eSI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCi0gICAgICAgICAgICAJYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIgotICAgICAgICAgICAgCWFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxhbmRzY2FwZSIKLSAgICAgICAgICAgIAlhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvUkVBRE1FIGIvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZGI3NGEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1SZXBybyBzdGVwczoKLQotYnVpbGQsIGluc3RhbGwgYW5kIHJ1biB0aGUgYXR0YWNoZWQgdGVzdCBwcm9ncmFtIFRlc3RFZ2wuYXBrCi0KLVRoZSBwcm9ncmFtIGRvZXMgbm90IGRyYXcgYW55dGhpbmcgdG8gdGhlIHNjcmVlbiwgaXQganVzdCBwcmludHMgdG8gdGhlIGxvZywgc28gdXNlIGFkYiBsb2djYXQgdG8gd2F0Y2ggdGhlIG91dHB1dC4KLQotRXhwZWN0ZWQgYmVoYXZpb3I6Ci0KLWNvbnN0YW50bHkgaW5jcmVhc2luZyAic3RlcCIgY291bnQ6Ci0KLQotVy9UZXN0QWN0aXZpdHkoIDE4ODUpOiAqKioqKiogc3RlcCAyMzUgcmVzdW1lCi1XL1Rlc3RBY3Rpdml0eSggMTg4NSk6IHN0ZXAgMjM2IHBhdXNlCi1XL1Rlc3RBY3Rpdml0eSggMTg4NSk6ICoqKioqKiBzdGVwIDIzNiByZXN1bWUKLQotYW5kIHNvIG9uLgotCi1BY3R1YWwgYmVoYXZpb3I6Ci0KLVcvVGVzdEFjdGl2aXR5KCAxNDY2KTogKioqKioqIHN0ZXAgMjUgcmVzdW1lCi1XL1Rlc3RBY3Rpdml0eSggMTQ2Nik6IHN0ZXAgMjYgcGF1c2UKLVcvVGVzdEFjdGl2aXR5KCAxNDY2KTogKioqKioqIHN0ZXAgMjYgcmVzdW1lCi1XL2RhbHZpa3ZtKCAxNDY2KTogdGhyZWFkaWQ9ODogdGhyZWFkIGV4aXRpbmcgd2l0aCB1bmNhdWdodCBleGNlcHRpb24gKGdyb3VwPTB4NDAwMWQ3ZjApCi1FL0FuZHJvaWRSdW50aW1lKCAxNDY2KTogRkFUQUwgRVhDRVBUSU9OOiBHTFRocmVhZCA5Ci1FL0FuZHJvaWRSdW50aW1lKCAxNDY2KTogamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IGNyZWF0ZUNvbnRleHQgZmFpbGVkOiBFR0xfQkFEX0FMTE9DCi1FL0FuZHJvaWRSdW50aW1lKCAxNDY2KTogICAgICAgIGF0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXckRWdsSGVscGVyLnRocm93RWdsRXhjZXB0aW9uKEdMU3VyZmFjZVZpZXcuamF2YToxMDY3KQotRS9BbmRyb2lkUnVudGltZSggMTQ2Nik6ICAgICAgICBhdCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3JEVnbEhlbHBlci50aHJvd0VnbEV4Y2VwdGlvbihHTFN1cmZhY2VWaWV3LmphdmE6MTA1OSkKLUUvQW5kcm9pZFJ1bnRpbWUoIDE0NjYpOiAgICAgICAgYXQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldyRFZ2xIZWxwZXIuc3RhcnQoR0xTdXJmYWNlVmlldy5qYXZhOjkyNSkKLUUvQW5kcm9pZFJ1bnRpbWUoIDE0NjYpOiAgICAgICAgYXQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldyRHTFRocmVhZC5ndWFyZGVkUnVuKEdMU3VyZmFjZVZpZXcuamF2YToxMjM2KQotRS9BbmRyb2lkUnVudGltZSggMTQ2Nik6ICAgICAgICBhdCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3JEdMVGhyZWFkLnJ1bihHTFN1cmZhY2VWaWV3LmphdmE6MTEwNikKLVcvVGVzdEFjdGl2aXR5KCAxNDY2KTogc3RlcCAyNyBwYXVzZQotVy9UZXN0QWN0aXZpdHkoIDE0NjYpOiAqKioqKiogc3RlcCAyNyByZXN1bWUKLVcvVGVzdEFjdGl2aXR5KCAxNDY2KTogc3RlcCAyOCBwYXVzZQotVy9UZXN0QWN0aXZpdHkoIDE0NjYpOiAqKioqKiogc3RlcCAyOCByZXN1bWUKLQotCi1TZWUgaHR0cDovL2IvaXNzdWU/aWQ9MjU1MDc0NSBmb3IgZnVydGhlciBkZXRhaWxzLgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGM5OGZlMi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdFBhdXNlUmVzdW1lL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCi0gICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InRlc3RfYWN0aXZpdHkiPlRlc3QgRWdsPC9zdHJpbmc+Ci0KLTwvcmVzb3VyY2VzPgotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFBhdXNlUmVzdW1lL3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjNzEzMjEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1wdWJsaWMgY2xhc3MgVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiVGVzdEFjdGl2aXR5IjsKLSAgICBUZXN0VmlldyBtVmlldzsKLSAgICBib29sZWFuIG1Ub2dnbGU7Ci0gICAgaW50IG1Db3VudDsKLSAgICBmaW5hbCBzdGF0aWMgaW50IFBBVVNFX0RFTEFZID0gMTAwOwotICAgIFJ1bm5hYmxlIG1SdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBpZiAobVRvZ2dsZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiKioqKioqIHN0ZXAgIiArIG1Db3VudCArICIgcmVzdW1lIik7Ci0gICAgICAgICAgICBtQ291bnQrKzsKLSAgICAgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJzdGVwICIgKyBtQ291bnQgKyAiIHBhdXNlIik7Ci0gICAgICAgICAgICBtVmlldy5vblBhdXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRvZ2dsZSA9ICEgbVRvZ2dsZTsKLSAgICAgICAgbVZpZXcucG9zdERlbGF5ZWQobVJ1bm5hYmxlLCBQQVVTRV9ERUxBWSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotICAgICAgICBtVmlldyA9IG5ldyBUZXN0VmlldyhnZXRBcHBsaWNhdGlvbigpKTsKLQkgICAgbVZpZXcuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7Ci0JICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKLSAgICAgICAgbVZpZXcucG9zdERlbGF5ZWQobVJ1bm5hYmxlLCBQQVVTRV9ERUxBWSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICBtVmlldy5vblBhdXNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzI4ZjEzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3Q7Ci0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLQotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7Ci0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFN1cmZhY2VWaWV3IHRoYXQgdXNlcyB0aGUgZGVkaWNhdGVkIHN1cmZhY2UgZm9yCi0gKiBkaXNwbGF5aW5nIGFuIE9wZW5HTCBhbmltYXRpb24uICBUaGlzIGFsbG93cyB0aGUgYW5pbWF0aW9uIHRvIHJ1biBpbiBhCi0gKiBzZXBhcmF0ZSB0aHJlYWQsIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgaXQgYmUgZHJpdmVuIGJ5IHRoZSB1cGRhdGUgbWVjaGFuaXNtCi0gKiBvZiB0aGUgdmlldyBoaWVyYXJjaHkuCi0gKgotICogVGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlbmRlcmluZyBjb2RlIGlzIGRlbGVnYXRlZCB0byBhIEdMVmlldy5SZW5kZXJlcgotICogaW5zdGFuY2UuCi0gKi8KLWNsYXNzIFRlc3RWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7Ci0gICAgVGVzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICBzZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbmRlcmVyIjsKLSAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODBlN2QuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBPcGVuR0wgRVMgSk5JIHNhbXBsZQotIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGFuIGFjdGl2aXR5IGFuZCBhIHNoYXJlZCBsaWJyYXJ5LgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIEJ1aWxkIGFjdGl2aXR5Ci0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gVGVzdFZpZXdwb3J0Ci0KLSMgU2V0IGEgc3BlY2lmaWMgU0RLIHZlcnNpb24gc28gd2UgY2FuIHJ1biBvbiBGcm95by4KLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gOAotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExNzhiYi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3QiPgotICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjgiIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iOCIgLz4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgotICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KLSAgICA8YXBwbGljYXRpb24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvdGVzdF9hY3Rpdml0eSI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCi0gICAgICAgICAgICAJYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRSBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZhYmM5Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotUmVwcm8gc3RlcHM6Ci0KLWJ1aWxkLCBpbnN0YWxsIGFuZCBydW4gdGhlIGF0dGFjaGVkIHRlc3QgcHJvZ3JhbSBUZXN0Vmlld3BvcnQuYXBrCi0KLVJ1biBvbiBTYXBwaGlyZSB3aXRoIEZyb3lvLgotCi1UaGUgcHJvZ3JhbSBjbGVhcnMgdGhlIHNjcmVlbiB0byBibHVlLCB0aGVuIGRyYXdzIGEgZnVsbCBzY3JlZW4gd2hpdGUgcXVhZCB0aGF0Ci1pcyBhbGxpZ25lZCB0byB0aGUgc2NyZWVuLgotKFRoZXJlZm9yZSB0aGUgd2hvbGUgc2NyZWVuIHNob3VsZCBhcHBlYXIgdG8gYmUgd2hpdGUuKQotCi0KLU5vdGUgdGhhdCBzY3JlZW4gaXMgYWxsIHdoaXRlLgotCi1Sb3RhdGUgc2NyZWVuIDkwIGRlZ3JlZXMuCi0KLUV4cGVjdGVkOiBzY3JlZW4gaXMgc3RpbGwgYWxsIHdoaXRlLgotCi1BY3R1YWw6IHNjcmVlbiBpcyBibHVlIHdpdGggb2Zmc2V0IHdoaXRlIHJlY3RhbmdsZS4KLQotVGhpcyBidWcgb25seSBoYXBwZW5zIG9uIFNhcHBoaXJlLCBpdCB3b3JrcyBjb3JyZWN0bHkgb24gUGFzc2lvbi4KLQotV2hhdCBoYXBwZW5zOgotCi1JIHRoaW5rIHRoZSBidWcgaXMgdGhhdCB0aGUgZ2wuZ2xWaWV3cG9ydCgpIGNhbGwgaW4gb25TdXJmYWNlQ2hhbmdlZCgpIGlzCi1iZWluZyBpZ25vcmVkIGJ5IHRoZSBPcGVuR0wgZHJpdmVyLgotCi1OT1RFOiBJZiBhIGdsLmdsVmlld3BvcnQgY2FsbCBpcyBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvbkRyYXdGcmFtZSgpCi1jYWxsICh3aGljaCBtZWFucyBpdCBpcyBjYWxsZWQgYmVmb3JlIGV2ZXJ5IGRyYXcpLCB0aGUgcHJvZ3JhbSBydW5zIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzN2E3Yy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCi0gICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InRlc3RfYWN0aXZpdHkiPlRlc3QgVmlld3BvcnQ8L3N0cmluZz4KLQotPC9yZXNvdXJjZXM+Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdEFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzdlNDUwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotcHVibGljIGNsYXNzIFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRlc3RBY3Rpdml0eSI7Ci0gICAgVGVzdFZpZXcgbVZpZXc7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0gICAgICAgIG1WaWV3ID0gbmV3IFRlc3RWaWV3KGdldEFwcGxpY2F0aW9uKCkpOwotCSAgICBtVmlldy5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKLQkgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICAgICAgbVZpZXcub25QYXVzZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtVmlldy5vblJlc3VtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjYzM3ZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQudGVzdDsKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7Ci1pbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci0KLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTE7Ci0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFN1cmZhY2VWaWV3IHRoYXQgdXNlcyB0aGUgZGVkaWNhdGVkIHN1cmZhY2UgZm9yCi0gKiBkaXNwbGF5aW5nIGFuIE9wZW5HTCBhbmltYXRpb24uICBUaGlzIGFsbG93cyB0aGUgYW5pbWF0aW9uIHRvIHJ1biBpbiBhCi0gKiBzZXBhcmF0ZSB0aHJlYWQsIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgaXQgYmUgZHJpdmVuIGJ5IHRoZSB1cGRhdGUgbWVjaGFuaXNtCi0gKiBvZiB0aGUgdmlldyBoaWVyYXJjaHkuCi0gKgotICogVGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlbmRlcmluZyBjb2RlIGlzIGRlbGVnYXRlZCB0byBhIEdMVmlldy5SZW5kZXJlcgotICogaW5zdGFuY2UuCi0gKi8KLWNsYXNzIFRlc3RWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7Ci0gICAgVGVzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICBzZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7Ci0gICAgICAgIHNldFJlbmRlck1vZGUoUkVOREVSTU9ERV9XSEVOX0RJUlRZKTsKLSAgICB9Ci0gICAgCi0gICAgICAgIC8qKiBBIGdyaWQgaXMgYSB0b3BvbG9naWNhbGx5IHJlY3Rhbmd1bGFyIGFycmF5IG9mIHZlcnRpY2VzLgotICAgICoKLSAgICAqIFRoZSB2ZXJ0ZXggYW5kIGluZGV4IGRhdGEgYXJlIGhlbGQgaW4gVkJPIG9iamVjdHMgYmVjYXVzZSBvbiBtb3N0Ci0gICAgKiBHUFVzIFZCTyBvYmplY3RzIGFyZSB0aGUgZmFzdGVzdCB3YXkgb2YgcmVuZGVyaW5nIHN0YXRpYyB2ZXJ0ZXgKLSAgICAqIGFuZCBpbmRleCBkYXRhLgotICAgICoKLSAgICAqLwotCi0gICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHcmlkIHsKLSAgICAgICAvLyBTaXplIG9mIHZlcnRleCBkYXRhIGVsZW1lbnRzIGluIGJ5dGVzOgotICAgICAgIGZpbmFsIHN0YXRpYyBpbnQgRkxPQVRfU0laRSA9IDQ7Ci0gICAgICAgZmluYWwgc3RhdGljIGludCBDSEFSX1NJWkUgPSAyOwotCi0gICAgICAgLy8gVmVydGV4IHN0cnVjdHVyZToKLSAgICAgICAvLyBmbG9hdCB4LCB5LCB6OwotCi0gICAgICAgZmluYWwgc3RhdGljIGludCBWRVJURVhfU0laRSA9IDMgKiBGTE9BVF9TSVpFOwotCi0gICAgICAgcHJpdmF0ZSBpbnQgbVZlcnRleEJ1ZmZlck9iamVjdElkOwotICAgICAgIHByaXZhdGUgaW50IG1FbGVtZW50QnVmZmVyT2JqZWN0SWQ7Ci0KLSAgICAgICAvLyBUaGVzZSBidWZmZXJzIGFyZSB1c2VkIHRvIGhvbGQgdGhlIHZlcnRleCBhbmQgaW5kZXggZGF0YSB3aGlsZQotICAgICAgIC8vIGNvbnN0cnVjdGluZyB0aGUgZ3JpZC4gT25jZSBjcmVhdGVCdWZmZXJPYmplY3RzKCkgaXMgY2FsbGVkCi0gICAgICAgLy8gdGhlIGJ1ZmZlcnMgYXJlIG51bGxlZCBvdXQgdG8gc2F2ZSBtZW1vcnkuCi0KLSAgICAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbVZlcnRleEJ5dGVCdWZmZXI7Ci0gICAgICAgcHJpdmF0ZSBGbG9hdEJ1ZmZlciBtVmVydGV4QnVmZmVyOwotICAgICAgIHByaXZhdGUgQ2hhckJ1ZmZlciBtSW5kZXhCdWZmZXI7Ci0KLSAgICAgICBwcml2YXRlIGludCBtVzsKLSAgICAgICBwcml2YXRlIGludCBtSDsKLSAgICAgICBwcml2YXRlIGludCBtSW5kZXhDb3VudDsKLQotICAgICAgIHB1YmxpYyBHcmlkKGludCB3LCBpbnQgaCkgewotICAgICAgICAgICBpZiAodyA8IDAgfHwgdyA+PSA2NTUzNikgewotICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidyIpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChoIDwgMCB8fCBoID49IDY1NTM2KSB7Ci0gICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJoIik7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKHcgKiBoID49IDY1NTM2KSB7Ci0gICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3ICogaCA+PSA2NTUzNiIpOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgbVcgPSB3OwotICAgICAgICAgICBtSCA9IGg7Ci0gICAgICAgICAgIGludCBzaXplID0gdyAqIGg7Ci0KLSAgICAgICAgICAgbVZlcnRleEJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KFZFUlRFWF9TSVpFICogc2l6ZSkKLSAgICAgICAgICAgICAgIC5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSk7Ci0gICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIgPSBtVmVydGV4Qnl0ZUJ1ZmZlci5hc0Zsb2F0QnVmZmVyKCk7Ci0KLSAgICAgICAgICAgaW50IHF1YWRXID0gbVcgLSAxOwotICAgICAgICAgICBpbnQgcXVhZEggPSBtSCAtIDE7Ci0gICAgICAgICAgIGludCBxdWFkQ291bnQgPSBxdWFkVyAqIHF1YWRIOwotICAgICAgICAgICBpbnQgaW5kZXhDb3VudCA9IHF1YWRDb3VudCAqIDY7Ci0gICAgICAgICAgIG1JbmRleENvdW50ID0gaW5kZXhDb3VudDsKLSAgICAgICAgICAgbUluZGV4QnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDSEFSX1NJWkUgKiBpbmRleENvdW50KQotICAgICAgICAgICAgICAgLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKS5hc0NoYXJCdWZmZXIoKTsKLQotICAgICAgICAgICAvKgotICAgICAgICAgICAgKiBJbml0aWFsaXplIHRyaWFuZ2xlIGxpc3QgbWVzaC4KLSAgICAgICAgICAgICoKLSAgICAgICAgICAgICogICAgIFswXS0tLS0tWyAgMV0gLi4uCi0gICAgICAgICAgICAqICAgICAgfCAgICAvICAgfAotICAgICAgICAgICAgKiAgICAgIHwgICAvICAgIHwKLSAgICAgICAgICAgICogICAgICB8ICAvICAgICB8Ci0gICAgICAgICAgICAqICAgICBbd10tLS0tLVt3KzFdIC4uLgotICAgICAgICAgICAgKiAgICAgIHwgICAgICAgfAotICAgICAgICAgICAgKgotICAgICAgICAgICAgKi8KLQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IHF1YWRIOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHF1YWRXOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhciBhID0gKGNoYXIpICh5ICogbVcgKyB4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhciBiID0gKGNoYXIpICh5ICogbVcgKyB4ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IChjaGFyKSAoKHkgKyAxKSAqIG1XICsgeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZCA9IChjaGFyKSAoKHkgKyAxKSAqIG1XICsgeCArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGMpOwotICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGIpOwotICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBkKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLQotICAgICAgIH0KLQotICAgICAgIHB1YmxpYyB2b2lkIHNldChpbnQgaSwgaW50IGosIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKLSAgICAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gbVcpIHsKLSAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImkiKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBpZiAoaiA8IDAgfHwgaiA+PSBtSCkgewotICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaiIpOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgaW50IGluZGV4ID0gbVcgKiBqICsgaTsKLQotICAgICAgICAgICBtVmVydGV4QnVmZmVyLnBvc2l0aW9uKGluZGV4ICogVkVSVEVYX1NJWkUgLyBGTE9BVF9TSVpFKTsKLSAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wdXQoeCk7Ci0gICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHkpOwotICAgICAgICAgICBtVmVydGV4QnVmZmVyLnB1dCh6KTsKLSAgICAgICB9Ci0KLSAgICAgICBwdWJsaWMgdm9pZCBjcmVhdGVCdWZmZXJPYmplY3RzKEdMIGdsKSB7Ci0gICAgICAgICAgIC8vIEdlbmVyYXRlIGEgdGhlIHZlcnRleCBhbmQgZWxlbWVudCBidWZmZXIgSURzCi0gICAgICAgICAgIGludFtdIHZib0lkcyA9IG5ldyBpbnRbMl07Ci0gICAgICAgICAgIEdMMTEgZ2wxMSA9IChHTDExKSBnbDsKLSAgICAgICAgICAgZ2wxMS5nbEdlbkJ1ZmZlcnMoMiwgdmJvSWRzLCAwKTsKLSAgICAgICAgICAgbVZlcnRleEJ1ZmZlck9iamVjdElkID0gdmJvSWRzWzBdOwotICAgICAgICAgICBtRWxlbWVudEJ1ZmZlck9iamVjdElkID0gdmJvSWRzWzFdOwotCi0gICAgICAgICAgIC8vIFVwbG9hZCB0aGUgdmVydGV4IGRhdGEKLSAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCdWZmZXJPYmplY3RJZCk7Ci0gICAgICAgICAgIG1WZXJ0ZXhCeXRlQnVmZmVyLnBvc2l0aW9uKDApOwotICAgICAgICAgICBnbDExLmdsQnVmZmVyRGF0YShHTDExLkdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleEJ5dGVCdWZmZXIuY2FwYWNpdHkoKSwgbVZlcnRleEJ5dGVCdWZmZXIsIEdMMTEuR0xfU1RBVElDX0RSQVcpOwotCi0gICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1FbGVtZW50QnVmZmVyT2JqZWN0SWQpOwotICAgICAgICAgICBtSW5kZXhCdWZmZXIucG9zaXRpb24oMCk7Ci0gICAgICAgICAgIGdsMTEuZ2xCdWZmZXJEYXRhKEdMMTEuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlci5jYXBhY2l0eSgpICogQ0hBUl9TSVpFLCBtSW5kZXhCdWZmZXIsIEdMMTEuR0xfU1RBVElDX0RSQVcpOwotCi0gICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdGhlIGluLW1lbW9yeSBkYXRhIGFueSBtb3JlCi0gICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIgPSBudWxsOwotICAgICAgICAgICBtVmVydGV4Qnl0ZUJ1ZmZlciA9IG51bGw7Ci0gICAgICAgICAgIG1JbmRleEJ1ZmZlciA9IG51bGw7Ci0gICAgICAgfQotCi0gICAgICAgcHVibGljIHZvaWQgZHJhdyhHTDEwIGdsKSB7Ci0gICAgICAgICAgIEdMMTEgZ2wxMSA9IChHTDExKSBnbDsKLQotICAgICAgICAgICBnbC5nbEVuYWJsZUNsaWVudFN0YXRlKEdMMTAuR0xfVkVSVEVYX0FSUkFZKTsKLQotICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleEJ1ZmZlck9iamVjdElkKTsKLSAgICAgICAgICAgZ2wxMS5nbFZlcnRleFBvaW50ZXIoMywgR0wxMC5HTF9GTE9BVCwgVkVSVEVYX1NJWkUsIDApOwotICAgICAgICAgICAKLSAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUVsZW1lbnRCdWZmZXJPYmplY3RJZCk7Ci0gICAgICAgICAgIGdsMTEuZ2xEcmF3RWxlbWVudHMoR0wxMC5HTF9UUklBTkdMRVMsIG1JbmRleENvdW50LCBHTDEwLkdMX1VOU0lHTkVEX1NIT1JULCAwKTsKLSAgICAgICAgICAgZ2wuZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0wxMC5HTF9WRVJURVhfQVJSQVkpOwotICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0FSUkFZX0JVRkZFUiwgMCk7Ci0gICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDApOwotICAgICAgIH0KLSAgIH0KLQotCi0gICAgcHJpdmF0ZSBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbmRlcmVyIjsKLSAgICAgICAgcHJpdmF0ZSBHcmlkIG1HcmlkOwotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgewotCQkJZ2wuZ2xDbGVhckNvbG9yKDAsMCwxLDEpOwotCQkJZ2wuZ2xDbGVhcihHTDEwLkdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgICAgbUdyaWQuZHJhdyhnbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAgICAgZ2wuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQkJCWdsLmdsTWF0cml4TW9kZShHTDExLkdMX1BST0pFQ1RJT04pOwotCQkJZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJCWdsLmdsT3J0aG9mKDAsIHdpZHRoLCBoZWlnaHQsIDAsIC0xLCAxKTsKLQkJCWdsLmdsTWF0cml4TW9kZShHTDExLkdMX01PREVMVklFVyk7Ci0gICAgICAgICAgICBjcmVhdGVHcmlkKGdsLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlR3JpZChHTDEwIGdsLCBmbG9hdCB3LCBmbG9hdCBoKSB7Ci0gICAgICAgIG1HcmlkID0gbmV3IEdyaWQoMiwgMik7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQkJCWZsb2F0IHggPSB3ICogaTsKLQkJCQkJZmxvYXQgeSA9IGggKiBqOwotCQkJCQlmbG9hdCB6ID0gMC4wZjsKLQkJCQkJbUdyaWQuc2V0KGksaiwgeCwgeSwgeik7Ci0JCQkJfQotCQkJfQotCQkJbUdyaWQuY3JlYXRlQnVmZmVyT2JqZWN0cyhnbCk7Ci0JCX0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXh0dXJlcy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Njk3ZDcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JdGV4dHVyZXMuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjFfQ00gXAotICAgIGxpYnVpCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtdGV4dHVyZXMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXh0dXJlcy90ZXh0dXJlcy5jcHAgYi9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvdGV4dHVyZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDNkOTRlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXh0dXJlcy90ZXh0dXJlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICBFR0xfREVQVEhfU0laRSwgMCwKLSAgICAgICAgIEVHTF9OT05FCi0gICAgIH07Ci0gICAgIAotICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgICBFR0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgIEVHTENvbmZpZyBjb25maWc7Ci0gICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICAgRUdMaW50IHcsIGg7Ci0gICAgIEVHTERpc3BsYXkgZHB5OwotCi0gICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOwotICAgICAKLSAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgICAgICAgIAotICAgICBzdGF0dXNfdCBlcnIgPSBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KAotICAgICAgICAgICAgIGRweSwgY29uZmlnQXR0cmlicywgd2luZG93LCAmY29uZmlnKTsKLSAgICAgaWYgKGVycikgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBmaW5kIGFuIEVHTENvbmZpZyBtYXRjaGluZyB0aGUgc2NyZWVuIGZvcm1hdFxuIik7Ci0gICAgICAgICByZXR1cm4gMDsKLSAgICAgfQotCi0gICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLCB3aW5kb3csIE5VTEwpOwotICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7Ci0gICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCi0gICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOwotICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0gICAgIEdMaW50IGRpbSA9IHc8aCA/IHcgOiBoOwotCi0KLSAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNCwgNCwgLTQgfTsKLSAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOwotICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwotICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOwotCi0gICAgIC8vIHBhY2tpbmcgaXMgYWx3YXlzIDQKLSAgICAgdWludDhfdCB0OFtdICA9IHsgCi0gICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCi0gICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiwKLSAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKLSAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGICB9OwotCi0gICAgIHVpbnQxNl90IHQxNltdICA9IHsgCi0gICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKLSAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYsCi0gICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKLSAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYgIH07Ci0KLSAgICAgdWludDE2X3QgdDU1NTFbXSAgPSB7IAotICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCi0gICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLAotICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCi0gICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwICB9OwotCi0gICAgIHVpbnQzMl90IHQzMltdICA9IHsgCi0gICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgCi0gICAgICAgICAgICAgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgCi0gICAgICAgICAgICAgMHhGRjAwRkZGRiwgMHhGRjAwRkYwMCwgMHgwMEZGMDBGRiwgMHhGRkZGRkYwMCwgCi0gICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRkZGMDBGRiwgMHhGRjAwRkZGRiwgMHhGRkZGRkZGRgotICAgICB9OwotCi0KLSAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0xVTUlOQU5DRSwgNCwgNCwgMCwgR0xfTFVNSU5BTkNFLCBHTF9VTlNJR05FRF9CWVRFLCB0OCk7Ci0gICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgZGltLzIsIGRpbS8yKTsKLQotICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLCA0LCA0LCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCB0MTYpOwotICAgICBnbERyYXdUZXhpT0VTKGRpbS8yLCAwLCAwLCBkaW0vMiwgZGltLzIpOwotCi0gICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80LCB0MTYpOwotICAgICBnbERyYXdUZXhpT0VTKDAsIGRpbS8yLCAwLCBkaW0vMiwgZGltLzIpOwotCi0gICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCB0MzIpOwotICAgICBnbERyYXdUZXhpT0VTKGRpbS8yLCBkaW0vMiwgMCwgZGltLzIsIGRpbS8yKTsKLQotICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90cml0ZXgvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90cml0ZXgvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmYWE4Ny4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JdHJpdGV4LmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YxX0NNIFwKLSAgICBsaWJ1aQotCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBvcGVuZ2wtdGVzdHMtaW5jbHVkZXMpCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLXRyaXRleAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90cml0ZXgvdHJpdGV4LmNwcCBiL29wZW5nbC90ZXN0cy90cml0ZXgvdHJpdGV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4MzQ4My4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdHJpdGV4L3RyaXRleC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLy8gQ2FsbHMgZ2xEcmF3RWxlbWVudHMoKSB0aGUgbnVtYmVyIG9mIHRpbWVzIHNwZWNpZmllZCBieQotLy8gSVRFUkFUSU9OUy4gU2hvdWxkIGRyYXcgYSBjaGVja2VyYm9hcmQgb24gdGhlIHNjcmVlbiBhZnRlcgotLy8gYSBmZXcgc2Vjb25kcy4KLS8vCi0vLyBQb3J0ZWQgZnJvbSBhIEphdmEgdmVyc2lvbiBieSBHb29nbGUuCi0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+DQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgIkVHTFV0aWxzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPg0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotDQotRUdMRGlzcGxheSBlZ2xEaXNwbGF5Ow0KLUVHTFN1cmZhY2UgZWdsU3VyZmFjZTsNCi1FR0xDb250ZXh0IGVnbENvbnRleHQ7DQotR0x1aW50IHRleHR1cmU7DQotDQotI2RlZmluZSBGSVhFRF9PTkUgMHgxMDAwMAotI2RlZmluZSBJVEVSQVRJT05TIDUwDQotDQotaW50IGluaXRfZ2xfc3VyZmFjZSh2b2lkKTsNCi12b2lkIGZyZWVfZ2xfc3VyZmFjZSh2b2lkKTsNCi12b2lkIGluaXRfc2NlbmUodm9pZCk7DQotdm9pZCByZW5kZXIoaW50IHF1YWRzKTsNCi12b2lkIGNyZWF0ZV90ZXh0dXJlKHZvaWQpOwotaW50IHJlYWRUaW1lcih2b2lkKTsNCi0KLXN0YXRpYyB2b2lkIGdsdUxvb2tBdChmbG9hdCBleWVYLCBmbG9hdCBleWVZLCBmbG9hdCBleWVaLAotICAgICAgICBmbG9hdCBjZW50ZXJYLCBmbG9hdCBjZW50ZXJZLCBmbG9hdCBjZW50ZXJaLCBmbG9hdCB1cFgsIGZsb2F0IHVwWSwKLSAgICAgICAgZmxvYXQgdXBaKQotewotICAgIC8vIFNlZSB0aGUgT3BlbkdMIEdMVVQgZG9jdW1lbnRhdGlvbiBmb3IgZ2x1TG9va0F0IGZvciBhIGRlc2NyaXB0aW9uCi0gICAgLy8gb2YgdGhlIGFsZ29yaXRobS4gV2UgaW1wbGVtZW50IGl0IGluIGEgc3RyYWlnaHRmb3J3YXJkIHdheToKLQotICAgIGZsb2F0IGZ4ID0gY2VudGVyWCAtIGV5ZVg7Ci0gICAgZmxvYXQgZnkgPSBjZW50ZXJZIC0gZXllWTsKLSAgICBmbG9hdCBmeiA9IGNlbnRlclogLSBleWVaOwotCi0gICAgLy8gTm9ybWFsaXplIGYKLSAgICBmbG9hdCBybGYgPSAxLjBmIC8gc3FydGYoZngqZnggKyBmeSpmeSArIGZ6KmZ6KTsKLSAgICBmeCAqPSBybGY7Ci0gICAgZnkgKj0gcmxmOwotICAgIGZ6ICo9IHJsZjsKLQotICAgIC8vIE5vcm1hbGl6ZSB1cAotICAgIGZsb2F0IHJsdXAgPSAxLjBmIC8gc3FydGYodXBYKnVwWCArIHVwWSp1cFkgKyB1cFoqdXBaKTsKLSAgICB1cFggKj0gcmx1cDsKLSAgICB1cFkgKj0gcmx1cDsKLSAgICB1cFogKj0gcmx1cDsKLQotICAgIC8vIGNvbXB1dGUgcyA9IGYgeCB1cCAoeCBtZWFucyAiY3Jvc3MgcHJvZHVjdCIpCi0KLSAgICBmbG9hdCBzeCA9IGZ5ICogdXBaIC0gZnogKiB1cFk7Ci0gICAgZmxvYXQgc3kgPSBmeiAqIHVwWCAtIGZ4ICogdXBaOwotICAgIGZsb2F0IHN6ID0gZnggKiB1cFkgLSBmeSAqIHVwWDsKLQotICAgIC8vIGNvbXB1dGUgdSA9IHMgeCBmCi0gICAgZmxvYXQgdXggPSBzeSAqIGZ6IC0gc3ogKiBmeTsKLSAgICBmbG9hdCB1eSA9IHN6ICogZnggLSBzeCAqIGZ6OwotICAgIGZsb2F0IHV6ID0gc3ggKiBmeSAtIHN5ICogZng7Ci0KLSAgICBmbG9hdCBtWzE2XSA7Ci0gICAgbVswXSA9IHN4OwotICAgIG1bMV0gPSB1eDsKLSAgICBtWzJdID0gLWZ4OwotICAgIG1bM10gPSAwLjBmOwotCi0gICAgbVs0XSA9IHN5OwotICAgIG1bNV0gPSB1eTsKLSAgICBtWzZdID0gLWZ5OwotICAgIG1bN10gPSAwLjBmOwotCi0gICAgbVs4XSA9IHN6OwotICAgIG1bOV0gPSB1ejsKLSAgICBtWzEwXSA9IC1mejsKLSAgICBtWzExXSA9IDAuMGY7Ci0KLSAgICBtWzEyXSA9IDAuMGY7Ci0gICAgbVsxM10gPSAwLjBmOwotICAgIG1bMTRdID0gMC4wZjsKLSAgICBtWzE1XSA9IDEuMGY7Ci0KLSAgICBnbE11bHRNYXRyaXhmKG0pOwotICAgIGdsVHJhbnNsYXRlZigtZXllWCwgLWV5ZVksIC1leWVaKTsKLX0KLQ0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikNCi17DQotICAgIGludCBxOwotICAgIGludCBzdGFydCwgZW5kOw0KLQotICAgIHByaW50ZigiSW5pdGlhbGl6aW5nIEVHTC4uLlxuIik7Ci0NCi0gICAgaWYoIWluaXRfZ2xfc3VyZmFjZSgpKQ0KLSAgICB7DQotICAgICAgICBwcmludGYoIkdMIGluaXRpYWxpc2F0aW9uIGZhaWxlZCAtIGV4aXRpbmdcbiIpOw0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0NCi0gICAgaW5pdF9zY2VuZSgpOw0KLQ0KLSAgICBjcmVhdGVfdGV4dHVyZSgpOw0KLQ0KLSAgICBwcmludGYoIlN0YXJ0IHRlc3QuLi5cbiIpOwotCi0gICAgcmVuZGVyKGFyZ2M9PTIgPyBhdG9pKGFyZ3ZbMV0pIDogSVRFUkFUSU9OUyk7DQotDQotICAgIGZyZWVfZ2xfc3VyZmFjZSgpOw0KLQ0KLSAgICByZXR1cm4gMDsNCi19DQotDQotaW50IGluaXRfZ2xfc3VyZmFjZSh2b2lkKQ0KLXsNCi0gICAgRUdMaW50IG51bUNvbmZpZ3MgPSAxOw0KLSAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07DQotICAgIEVHTGludCBhdHRyaWJbXSA9DQotICAgIHsNCi0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgMTYsDQotICAgICAgICAgICAgRUdMX05PTkUNCi0gICAgfTsNCi0NCi0gICAgaWYgKCAoZWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSkpID09IEVHTF9OT19ESVNQTEFZICkNCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJlZ2xHZXREaXNwbGF5IGZhaWxlZFxuIik7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoIGVnbEluaXRpYWxpemUoZWdsRGlzcGxheSwgTlVMTCwgTlVMTCkgIT0gRUdMX1RSVUUgKQ0KLSAgICB7DQotICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotCi0gICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7DQotICAgIEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coZWdsRGlzcGxheSwgYXR0cmliLCB3aW5kb3csICZteUNvbmZpZyk7DQotDQotICAgIGlmICggKGVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGVnbERpc3BsYXksIG15Q29uZmlnLAotICAgICAgICAgICAgd2luZG93LCAwKSkgPT0gRUdMX05PX1NVUkZBQ0UgKQ0KLSAgICB7DQotICAgICAgICBwcmludGYoImVnbENyZWF0ZVdpbmRvd1N1cmZhY2UgZmFpbGVkXG4iKTsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIGlmICggKGVnbENvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGVnbERpc3BsYXksIG15Q29uZmlnLCAwLCAwKSkgPT0gRUdMX05PX0NPTlRFWFQgKQ0KLSAgICB7DQotICAgICAgICBwcmludGYoImVnbENyZWF0ZUNvbnRleHQgZmFpbGVkXG4iKTsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIGlmICggZWdsTWFrZUN1cnJlbnQoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSwgZWdsU3VyZmFjZSwgZWdsQ29udGV4dCkgIT0gRUdMX1RSVUUgKQ0KLSAgICB7DQotICAgICAgICBwcmludGYoImVnbE1ha2VDdXJyZW50IGZhaWxlZFxuIik7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gMTsNCi19DQotDQotdm9pZCBmcmVlX2dsX3N1cmZhY2Uodm9pZCkNCi17DQotICAgIGlmIChlZ2xEaXNwbGF5ICE9IEVHTF9OT19ESVNQTEFZKQ0KLSAgICB7DQotICAgICAgICBlZ2xNYWtlQ3VycmVudCggRUdMX05PX0RJU1BMQVksIEVHTF9OT19TVVJGQUNFLA0KLSAgICAgICAgICAgICAgICBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQgKTsNCi0gICAgICAgIGVnbERlc3Ryb3lDb250ZXh0KCBlZ2xEaXNwbGF5LCBlZ2xDb250ZXh0ICk7DQotICAgICAgICBlZ2xEZXN0cm95U3VyZmFjZSggZWdsRGlzcGxheSwgZWdsU3VyZmFjZSApOw0KLSAgICAgICAgZWdsVGVybWluYXRlKCBlZ2xEaXNwbGF5ICk7DQotICAgICAgICBlZ2xEaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7DQotICAgIH0NCi19DQotDQotdm9pZCBpbml0X3NjZW5lKHZvaWQpDQotew0KLSAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKLSAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOwotCi0gICAgZmxvYXQgcmF0aW8gPSAzMjAuMGYgLyA0ODAuMGY7Ci0gICAgZ2xWaWV3cG9ydCgwLCAwLCAzMjAsIDQ4MCk7Ci0KLSAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7Ci0gICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBnbEZydXN0dW1mKC1yYXRpbywgcmF0aW8sIC0xLCAxLCAxLCAxMCk7Ci0KLSAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsNCi0gICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBnbHVMb29rQXQoCi0gICAgICAgICAgICAwLCAwLCAzLCAgLy8gZXllCi0gICAgICAgICAgICAwLCAwLCAwLCAgLy8gY2VudGVyCi0gICAgICAgICAgICAwLCAxLCAwKTsgLy8gdXAKLQ0KLSAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsNCi0gICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOw0KLSAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotfQ0KLQ0KLXZvaWQgY3JlYXRlX3RleHR1cmUodm9pZCkNCi17DQotICAgIGNvbnN0IHVuc2lnbmVkIGludCBvbiA9IDB4ZmYwMDAwZmY7Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IG9mZiA9IDB4ZmZmZmZmZmY7Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IHBpeGVsc1tdID0KLSAgICB7Ci0gICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAotICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKLSAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCi0gICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAotICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKLSAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCi0gICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAotICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKLSAgICB9Ow0KLSAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlKTsNCi0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsNCi0gICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDgsIDgsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7DQotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOw0KLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsNCi0gICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsNCi19DQotDQotdm9pZCByZW5kZXIoaW50IHF1YWRzKQ0KLXsNCi0gICAgaW50IGksIGo7DQotDQotICAgIGNvbnN0IEdMZmxvYXQgdmVydGljZXNbXSA9IHsNCi0gICAgICAgICAgICAtMSwgIC0xLCAgMCwNCi0gICAgICAgICAgICAgMSwgIC0xLCAgMCwNCi0gICAgICAgICAgICAgMSwgICAxLCAgMCwNCi0gICAgICAgICAgICAtMSwgICAxLCAgMA0KLSAgICB9Ow0KLQ0KLSAgICBjb25zdCBHTGZpeGVkIHRleENvb3Jkc1tdID0gew0KLSAgICAgICAgICAgIDAsICAgICAgICAgICAgMCwNCi0gICAgICAgICAgICBGSVhFRF9PTkUsICAgIDAsDQotICAgICAgICAgICAgRklYRURfT05FLCAgICBGSVhFRF9PTkUsDQotICAgICAgICAgICAgMCwgICAgICAgICAgICBGSVhFRF9PTkUNCi0gICAgfTsNCi0NCi0gICAgY29uc3QgR0x1c2hvcnQgcXVhZEluZGljZXNbXSA9IHsgMCwgMSwgMiwgIDAsIDIsIDMgfTsKLQotCi0gICAgR0x1c2hvcnQqIGluZGljZXMgPSAoR0x1c2hvcnQqKW1hbGxvYyhxdWFkcypzaXplb2YocXVhZEluZGljZXMpKTsKLSAgICBmb3IgKGk9MCA7IGk8cXVhZHMgOyBpKyspCi0gICAgICAgIG1lbWNweShpbmRpY2VzKyhzaXplb2YocXVhZEluZGljZXMpL3NpemVvZihpbmRpY2VzWzBdKSkqaSwgcXVhZEluZGljZXMsIHNpemVvZihxdWFkSW5kaWNlcykpOwotDQotICAgIGdsVmVydGV4UG9pbnRlcigzLCBHTF9GTE9BVCwgMCwgdmVydGljZXMpOw0KLSAgICBnbFRleENvb3JkUG9pbnRlcigyLCBHTF9GSVhFRCwgMCwgdGV4Q29vcmRzKTsKLQotICAgIC8vIG1ha2Ugc3VyZSB0byBkbyBhIGNvdXBsZSBlZ2xTd2FwQnVmZmVycyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlCi0gICAgLy8gbm8gcHJvYmxlbXMgd2l0aCB0aGUgdmVyeSBmaXJzdCBvbmVzICh3aG8ga25vd3MpCi0gICAgZ2xDbGVhckNvbG9yKDAuNCwgMC40LCAwLjQsIDAuNCk7Ci0gICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgZWdsU3dhcEJ1ZmZlcnMoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSk7Ci0gICAgZ2xDbGVhckNvbG9yKDAuNiwgMC42LCAwLjYsIDAuNik7Ci0gICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgZWdsU3dhcEJ1ZmZlcnMoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSk7Ci0gICAgZ2xDbGVhckNvbG9yKDEuMCwgMS4wLCAxLjAsIDEuMCk7Ci0KLSAgICBmb3IgKGo9MCA7IGo8MTAgOyBqKyspIHsKLSAgICAgICAgcHJpbnRmKCJsb29wICVkIC8gMTAgKCVkIHF1YWRzIC8gbG9vcClcbiIsIGosIHF1YWRzKTsKLQotICAgICAgICBpbnQgbmVsZW0gPSBzaXplb2YocXVhZEluZGljZXMpL3NpemVvZihxdWFkSW5kaWNlc1swXSk7Ci0gICAgICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIG5lbGVtKnF1YWRzLCBHTF9VTlNJR05FRF9TSE9SVCwgaW5kaWNlcyk7Ci0gICAgICAgIGVnbFN3YXBCdWZmZXJzKGVnbERpc3BsYXksIGVnbFN1cmZhY2UpOwotICAgIH0KLQotICAgIGZyZWUoaW5kaWNlcyk7DQotfQ0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuLy5naXRpZ25vcmUgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3ZWM2NS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZ2VuZXJhdGVkCi1vdXQKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9nZW4gYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMWY0MTkwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9nZW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotIyEvYmluL2Jhc2gKLXNldCAtdQotc2V0IC1lCi1ybSAtcmYgb3V0IGdlbmVyYXRlZAotCi1ta2RpciBvdXQKLQotIyBDcmVhdGUgZHVtbXkgSmF2YSBmaWxlcyBmb3IgQW5kcm9pZCBBUElzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGNvZGUgd2UgZ2VuZXJhdGUuCi0jIFRoaXMgYWxsb3dzIHVzIHRvIHRlc3QgdGhlIGdlbmVyYXRlZCBjb2RlIHdpdGhvdXQgYnVpbGRpbmcgdGhlIHJlc3Qgb2YgQW5kcm9pZC4KLQotbWtkaXIgLXAgb3V0L2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzCi1ta2RpciAtcCBvdXQvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pCi1ta2RpciAtcCBvdXQvYW5kcm9pZC9hcHAKLW1rZGlyIC1wIG91dC9hbmRyb2lkL2dyYXBoaWNzCi1ta2RpciAtcCBvdXQvYW5kcm9pZC9vcGVuZ2wKLW1rZGlyIC1wIG91dC9hbmRyb2lkL2NvbnRlbnQKLW1rZGlyIC1wIG91dC9hbmRyb2lkL2NvbnRlbnQvcG0KLW1rZGlyIC1wIG91dC9hbmRyb2lkL29zCi1ta2RpciAtcCBvdXQvYW5kcm9pZC91dGlsCi0KLWVjaG8gInBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsiID4gb3V0L2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKLWVjaG8gInB1YmxpYyBpbnRlcmZhY2UgQ2FudmFzIHt9IiA+PiBvdXQvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQotCi1lY2hvICJwYWNrYWdlIGFuZHJvaWQuYXBwOyBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsgcHVibGljIGNsYXNzIEFwcEdsb2JhbHMgeyBwdWJsaWMgc3RhdGljIElQYWNrYWdlTWFuYWdlciBnZXRQYWNrYWdlTWFuYWdlcigpIHsgcmV0dXJuIG51bGw7fSB9IiA+IG91dC9hbmRyb2lkL2FwcC9BcHBHbG9iYWxzLmphdmEKLSMgZWNobyAicGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7IGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7IHB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dCB7IHB1YmxpYyBQYWNrYWdlTWFuYWdlciBnZXRQYWNrYWdlTWFuYWdlcigpOyB9IiA+IG91dC9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhCi1lY2hvICJwYWNrYWdlIGFuZHJvaWQuY29udGVudC5wbTsgcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uSW5mbyB7cHVibGljIGludCB0YXJnZXRTZGtWZXJzaW9uO30iID4gb3V0L2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YQotZWNobyAicGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucG07IHB1YmxpYyBpbnRlcmZhY2UgSVBhY2thZ2VNYW5hZ2VyIHtBcHBsaWNhdGlvbkluZm8gZ2V0QXBwbGljYXRpb25JbmZvKGphdmEubGFuZy5TdHJpbmcgcGFja2FnZU5hbWUsIGludCBmbGFncykgdGhyb3dzIGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uO30iID4gb3V0L2FuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZU1hbmFnZXIuamF2YQotZWNobyAicGFja2FnZSBhbmRyb2lkLm9zOyBwdWJsaWMgY2xhc3MgQnVpbGQge3B1YmxpYyBzdGF0aWMgY2xhc3MgVkVSU0lPTl9DT0RFUyB7IHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUENBS0UgPSAzO307CX0iID4gb3V0L2FuZHJvaWQvb3MvQnVpbGQuamF2YQotZWNobyAicGFja2FnZSBhbmRyb2lkLm9zOyBwdWJsaWMgY2xhc3MgUmVtb3RlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHt9IiA+IG91dC9hbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbi5qYXZhCi1lY2hvICJwYWNrYWdlIGFuZHJvaWQudXRpbDsgcHVibGljIGNsYXNzIExvZyB7cHVibGljIHN0YXRpYyB2b2lkIHcoU3RyaW5nIGEsIFN0cmluZyBiKSB7fSBwdWJsaWMgc3RhdGljIHZvaWQgZShTdHJpbmcgYSwgU3RyaW5nIGIpIHt9fSIgPiBvdXQvYW5kcm9pZC91dGlsL0xvZy5qYXZhCi0KLUdMRklMRT1vdXQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YQotY3Agc3R1YnMvanNyMjM5L0dMSGVhZGVyLmphdmEtaWYgJEdMRklMRQotCi1HTEdFTl9GSUxFUz0iQ0Z1bmMuamF2YSBDVHlwZS5qYXZhIENvZGVFbWl0dGVyLmphdmEgR2VuZXJhdGVHTC5qYXZhIEdlbmVyYXRlR0xFUy5qYXZhIEdMRVNDb2RlRW1pdHRlci5qYXZhIEpGdW5jLmphdmEgSm5pQ29kZUVtaXR0ZXIuamF2YSBKVHlwZS5qYXZhIEpzcjIzOUNvZGVFbWl0dGVyLmphdmEgUGFyYW1ldGVyQ2hlY2tlci5qYXZhIgotCi1wdXNoZCBzcmMgPiAvZGV2L251bGwKLWphdmFjICR7R0xHRU5fRklMRVN9Ci1KQVZBQ19SRVNVTFQ9JD8KLWlmIFsgJEpBVkFDX1JFU1VMVCAtbmUgMCBdOyB0aGVuCi0gICAgZWNobyAiQ291bGQgbm90IGNvbXBpbGUgZ2xnZW4uIgotICAgIGV4aXQgJEpBVkFDX1JFU1VMVAotZmkKLXBvcGQgPiAvZGV2L251bGwKLQotZWNobyAiR2VuZXJhdGluZyBKU1IyMzktbGlrZSBBUElzIgotamF2YSAtY2xhc3NwYXRoIHNyYyBHZW5lcmF0ZUdMIC1jIHNwZWNzL2pzcjIzOS9nbHNwZWMtMS4wIHNwZWNzL2pzcjIzOS9nbHNwZWMtMS4wZXh0IHNwZWNzL2pzcjIzOS9nbHNwZWMtMS4xIHNwZWNzL2pzcjIzOS9nbHNwZWMtMS4xZXh0IHNwZWNzL2pzcjIzOS9nbHNwZWMtMS4xZXh0cGFjayBzcGVjcy9qc3IyMzkvZ2xzcGVjLWNoZWNrcwotSkFWQV9SRVNVTFQ9JD8KLWlmIFsgJEpBVkFfUkVTVUxUIC1uZSAwIF07IHRoZW4KLSAgICBlY2hvICJDb3VsZCBub3QgcnVuIEdlbmVyYXRlR0wuIgotICAgIGV4aXQgJEpBVkFfUkVTVUxUCi1maQotCi1lY2hvICJHZW5lcmF0aW5nIHN0YXRpYyBPcGVuR0xFUyAxLjEgYmluZGluZ3MiCi1qYXZhIC1jbGFzc3BhdGggc3JjIEdlbmVyYXRlR0xFUwotSkFWQV9SRVNVTFQ9JD8KLWlmIFsgJEpBVkFfUkVTVUxUIC1uZSAwIF07IHRoZW4KLSAgICBlY2hvICJDb3VsZCBub3QgcnVuIEdlbmVyYXRlR0xFUy4iCi0gICAgZXhpdCAkSkFWQV9SRVNVTFQKLWZpCi0KLXJtIHNyYy8qLmNsYXNzCi0KLXB1c2hkIG91dCA+IC9kZXYvbnVsbAotbWtkaXIgY2xhc3NlcwotamF2YWMgLWQgY2xhc3NlcyBjb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTBFeHQuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgYW5kcm9pZC9vcGVuZ2wvR0xFUzEwLmphdmEgYW5kcm9pZC9vcGVuZ2wvR0xFUzEwRXh0LmphdmEgYW5kcm9pZC9vcGVuZ2wvR0xFUzExLmphdmEgYW5kcm9pZC9vcGVuZ2wvR0xFUzExRXh0LmphdmEgYW5kcm9pZC9vcGVuZ2wvR0xFUzIwLmphdmEKLXBvcGQgPiAvZGV2L251bGwKLUpBVkFfUkVTVUxUPSQ/Ci1pZiBbICRKQVZBX1JFU1VMVCAtbmUgMCBdOyB0aGVuCi0gICAgZWNobyAiQ291bGQgbm90IGNvbXBpbGUgZ2VuZXJhdGVkIGNsYXNzZXMuIgotICAgIGV4aXQgJEpBVkFfUkVTVUxUCi1maQotCi1ybSAtcmYgZ2VuZXJhdGVkCi1ta2RpciAtcCBnZW5lcmF0ZWQvQwotY3Agb3V0L2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIGdlbmVyYXRlZC9DCi1jcCAtciBvdXQvY29tIGdlbmVyYXRlZAotY3AgLXIgb3V0L2phdmF4IGdlbmVyYXRlZAotCi1jcCBvdXQvYW5kcm9pZF9vcGVuZ2xfKi5jcHAgZ2VuZXJhdGVkL0MKLW1rZGlyIC1wIGdlbmVyYXRlZC9hbmRyb2lkL29wZW5nbAotY3AgLXIgb3V0L2FuZHJvaWQvb3BlbmdsIGdlbmVyYXRlZC9hbmRyb2lkCi0KLXJtIC1yZiBvdXQKLUtFRVBfR0VORVJBVEVEPTAKLVNBSURfUExFQVNFPTAKLQotIyBjb21wYXJlR2VuZXJhdGVkIGRlc3REaXIgZ2VuZXJhdGVkRGlyIGZpbGUKLWNvbXBhcmVHZW5lcmF0ZWQoKSB7Ci0gICAgaWYgY21wIC1zICQxLyQzICQyLyQzIDsgdGhlbgotICAgICAgICBlY2hvICIjICAgICIgJDMgdW5jaGFuZ2VkCi0gICAgZWxzZQotICAgICAgICBpZiBbICRTQUlEX1BMRUFTRSA9PSAiMCIgXSA7IHRoZW4KLSAgICAgICAgICAgIGVjaG8gUGxlYXNlIGV2YWx1YXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6Ci0gICAgICAgICAgICBlY2hvCi0gICAgICAgICAgICBTQUlEX1BMRUFTRT0xCi0gICAgICAgIGZpCi0gICAgICAgIGVjaG8gIiAgICAiIGNwICQyLyQzICQxCi0gICAgICAgIGVjaG8gIiAgICAiIGdpdCBhZGQgJDEvJDMKLSAgICAgICAgS0VFUF9HRU5FUkFURUQ9MQotICAgIGZpCi19Ci0KLWNvbXBhcmVHZW5lcmF0ZWQgLi4vLi4vLi4vY29yZS9qbmkgZ2VuZXJhdGVkL0MgY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAKLWNvbXBhcmVHZW5lcmF0ZWQgLi4vLi4vamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkgZ2VuZXJhdGVkL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaSBHTEltcGwuamF2YQotCi1mb3IgeCBpbiBHTC5qYXZhIEdMMTAuamF2YSBHTDEwRXh0LmphdmEgR0wxMS5qYXZhIEdMMTFFeHQuamF2YSBHTDExRXh0ZW5zaW9uUGFjay5qYXZhCi1kbwotICAgIGNvbXBhcmVHZW5lcmF0ZWQgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcyBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMgJHgKLWRvbmUKLQotZm9yIHggaW4gR0xFUzEwIEdMRVMxMEV4dCBHTEVTMTEgR0xFUzExRXh0IEdMRVMyMAotZG8KLSAgICBjb21wYXJlR2VuZXJhdGVkIC4uLy4uL2phdmEvYW5kcm9pZC9vcGVuZ2wgZ2VuZXJhdGVkL2FuZHJvaWQvb3BlbmdsICR7eH0uamF2YQotICAgIGNvbXBhcmVHZW5lcmF0ZWQgLi4vLi4vLi4vY29yZS9qbmkgZ2VuZXJhdGVkL0MgYW5kcm9pZF9vcGVuZ2xfJHt4fS5jcHAKLWRvbmUKLQotaWYgWyAkS0VFUF9HRU5FUkFURUQgPT0gIjAiIF0gOyB0aGVuCi0gICAgcm0gLXJmIGdlbmVyYXRlZAotZmkKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9nbGVzMTEvR0xFUzEwLnNwZWMgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMxMC5zcGVjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTExNTJkLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9nbGVzMTEvR0xFUzEwLnNwZWMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotdm9pZCBnbEFjdGl2ZVRleHR1cmUgKCBHTGVudW0gdGV4dHVyZSApCi12b2lkIGdsQWxwaGFGdW5jICggR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZiApCi12b2lkIGdsQWxwaGFGdW5jeCAoIEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYgKQotdm9pZCBnbEJpbmRUZXh0dXJlICggR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUgKQotdm9pZCBnbEJsZW5kRnVuYyAoIEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvciApCi12b2lkIGdsQ2xlYXIgKCBHTGJpdGZpZWxkIG1hc2sgKQotdm9pZCBnbENsZWFyQ29sb3IgKCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSApCi12b2lkIGdsQ2xlYXJDb2xvcnggKCBHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSApCi12b2lkIGdsQ2xlYXJEZXB0aGYgKCBHTGNsYW1wZiBkZXB0aCApCi12b2lkIGdsQ2xlYXJEZXB0aHggKCBHTGNsYW1weCBkZXB0aCApCi12b2lkIGdsQ2xlYXJTdGVuY2lsICggR0xpbnQgcyApCi12b2lkIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSAoIEdMZW51bSB0ZXh0dXJlICkKLXZvaWQgZ2xDb2xvcjRmICggR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSApCi12b2lkIGdsQ29sb3I0eCAoIEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEgKQotdm9pZCBnbENvbG9yTWFzayAoIEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSApCi12b2lkIGdsQ29sb3JQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQotdm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApCi12b2lkIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQotdm9pZCBnbENvcHlUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciApCi12b2lkIGdsQ29weVRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQgKQotdm9pZCBnbEN1bGxGYWNlICggR0xlbnVtIG1vZGUgKQotdm9pZCBnbERlbGV0ZVRleHR1cmVzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzICkKLXZvaWQgZ2xEZXB0aEZ1bmMgKCBHTGVudW0gZnVuYyApCi12b2lkIGdsRGVwdGhNYXNrICggR0xib29sZWFuIGZsYWcgKQotdm9pZCBnbERlcHRoUmFuZ2VmICggR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIgKQotdm9pZCBnbERlcHRoUmFuZ2V4ICggR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIgKQotdm9pZCBnbERpc2FibGUgKCBHTGVudW0gY2FwICkKLXZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQotdm9pZCBnbERyYXdBcnJheXMgKCBHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQgKQotdm9pZCBnbERyYXdFbGVtZW50cyAoIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzICkKLXZvaWQgZ2xFbmFibGUgKCBHTGVudW0gY2FwICkKLXZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZSAoIEdMZW51bSBhcnJheSApCi12b2lkIGdsRmluaXNoICggdm9pZCApCi12b2lkIGdsRmx1c2ggKCB2b2lkICkKLXZvaWQgZ2xGb2dmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKLXZvaWQgZ2xGb2dmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKLXZvaWQgZ2xGb2d4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xGb2d4diAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xGcm9udEZhY2UgKCBHTGVudW0gbW9kZSApCi12b2lkIGdsRnJ1c3R1bWYgKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyICkKLXZvaWQgZ2xGcnVzdHVteCAoIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIgKQotdm9pZCBnbEdlblRleHR1cmVzICggR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzICkKLUdMZW51bSBnbEdldEVycm9yICggdm9pZCApCi12b2lkIGdsR2V0SW50ZWdlcnYgKCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQotY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nICggR0xlbnVtIG5hbWUgKQotdm9pZCBnbEhpbnQgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSApCi12b2lkIGdsTGlnaHRNb2RlbGYgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQotdm9pZCBnbExpZ2h0TW9kZWxmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKLXZvaWQgZ2xMaWdodE1vZGVseCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCi12b2lkIGdsTGlnaHRNb2RlbHh2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbExpZ2h0ZiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKLXZvaWQgZ2xMaWdodGZ2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsTGlnaHR4ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQotdm9pZCBnbExpZ2h0eHYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xMaW5lV2lkdGggKCBHTGZsb2F0IHdpZHRoICkKLXZvaWQgZ2xMaW5lV2lkdGh4ICggR0xmaXhlZCB3aWR0aCApCi12b2lkIGdsTG9hZElkZW50aXR5ICggdm9pZCApCi12b2lkIGdsTG9hZE1hdHJpeGYgKCBjb25zdCBHTGZsb2F0ICptICkKLXZvaWQgZ2xMb2FkTWF0cml4eCAoIGNvbnN0IEdMZml4ZWQgKm0gKQotdm9pZCBnbExvZ2ljT3AgKCBHTGVudW0gb3Bjb2RlICkKLXZvaWQgZ2xNYXRlcmlhbGYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKLXZvaWQgZ2xNYXRlcmlhbGZ2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKLXZvaWQgZ2xNYXRlcmlhbHggKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xNYXRlcmlhbHh2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xNYXRyaXhNb2RlICggR0xlbnVtIG1vZGUgKQotdm9pZCBnbE11bHRNYXRyaXhmICggY29uc3QgR0xmbG9hdCAqbSApCi12b2lkIGdsTXVsdE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkKLXZvaWQgZ2xNdWx0aVRleENvb3JkNGYgKCBHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEgKQotdm9pZCBnbE11bHRpVGV4Q29vcmQ0eCAoIEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSApCi12b2lkIGdsTm9ybWFsM2YgKCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56ICkKLXZvaWQgZ2xOb3JtYWwzeCAoIEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnogKQotdm9pZCBnbE5vcm1hbFBvaW50ZXIgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApCi12b2lkIGdsT3J0aG9mICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApCi12b2lkIGdsT3J0aG94ICggR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciApCi12b2lkIGdsUGl4ZWxTdG9yZWkgKCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICkKLXZvaWQgZ2xQb2ludFNpemUgKCBHTGZsb2F0IHNpemUgKQotdm9pZCBnbFBvaW50U2l6ZXggKCBHTGZpeGVkIHNpemUgKQotdm9pZCBnbFBvbHlnb25PZmZzZXQgKCBHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyApCi12b2lkIGdsUG9seWdvbk9mZnNldHggKCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyApCi12b2lkIGdsUG9wTWF0cml4ICggdm9pZCApCi12b2lkIGdsUHVzaE1hdHJpeCAoIHZvaWQgKQotdm9pZCBnbFJlYWRQaXhlbHMgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzICkKLXZvaWQgZ2xSb3RhdGVmICggR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApCi12b2lkIGdsUm90YXRleCAoIEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQotdm9pZCBnbFNhbXBsZUNvdmVyYWdlICggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKQotdm9pZCBnbFNhbXBsZUNvdmVyYWdleCAoIEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0ICkKLXZvaWQgZ2xTY2FsZWYgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkKLXZvaWQgZ2xTY2FsZXggKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkKLXZvaWQgZ2xTY2lzc29yICggR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQgKQotdm9pZCBnbFNoYWRlTW9kZWwgKCBHTGVudW0gbW9kZSApCi12b2lkIGdsU3RlbmNpbEZ1bmMgKCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayApCi12b2lkIGdsU3RlbmNpbE1hc2sgKCBHTHVpbnQgbWFzayApCi12b2lkIGdsU3RlbmNpbE9wICggR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzICkKLXZvaWQgZ2xUZXhDb29yZFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApCi12b2lkIGdsVGV4RW52ZiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCi12b2lkIGdsVGV4RW52ZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsVGV4RW52eCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCi12b2lkIGdsVGV4RW52eHYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICkKLXZvaWQgZ2xUZXhQYXJhbWV0ZXJmICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKLXZvaWQgZ2xUZXhQYXJhbWV0ZXJ4ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKQotdm9pZCBnbFRyYW5zbGF0ZWYgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkKLXZvaWQgZ2xUcmFuc2xhdGV4ICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApCi12b2lkIGdsVmVydGV4UG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkKLXZvaWQgZ2xWaWV3cG9ydCAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9nbGVzMTEvR0xFUzEwRXh0LnNwZWMgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMxMEV4dC5zcGVjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2Y2YzY1Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9nbGVzMTEvR0xFUzEwRXh0LnNwZWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1HTGJpdGZpZWxkIGdsUXVlcnlNYXRyaXh4T0VTICggR0xmaXhlZCAqbWFudGlzc2EsIEdMaW50ICpleHBvbmVudCApCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMxMS5zcGVjIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2dsZXMxMS9HTEVTMTEuc3BlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyN2MxOC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMxMS5zcGVjCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotdm9pZCBnbEJpbmRCdWZmZXIgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyICkKLXZvaWQgZ2xCdWZmZXJEYXRhICggR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSApCi12b2lkIGdsQnVmZmVyU3ViRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQotdm9pZCBnbENsaXBQbGFuZWYgKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uICkKLXZvaWQgZ2xDbGlwUGxhbmV4ICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbiApCi12b2lkIGdsQ29sb3I0dWIgKCBHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhICkKLXZvaWQgZ2xDb2xvclBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApCi12b2lkIGdsRGVsZXRlQnVmZmVycyAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzICkKLXZvaWQgZ2xEcmF3RWxlbWVudHMgKCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIEdMaW50IG9mZnNldCApCi12b2lkIGdsR2VuQnVmZmVycyAoIEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzICkKLXZvaWQgZ2xHZXRCb29sZWFudiAoIEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMgKQotdm9pZCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRDbGlwUGxhbmVmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICplcW4gKQotdm9pZCBnbEdldENsaXBQbGFuZXggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKmVxbiApCi12b2lkIGdsR2V0Rml4ZWR2ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbEdldEZsb2F0diAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRMaWdodGZ2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsR2V0TGlnaHR4diAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbEdldE1hdGVyaWFsZnYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQotdm9pZCBnbEdldE1hdGVyaWFseHYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQotLy8gdm9pZCBnbEdldFBvaW50ZXJ2ICggR0xlbnVtIHBuYW1lLCB2b2lkICoqcGFyYW1zICkKLXZvaWQgZ2xHZXRUZXhFbnZmdiAoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRUZXhFbnZpdiAoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCi12b2lkIGdsR2V0VGV4RW52eHYgKCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsR2V0VGV4UGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbEdldFRleFBhcmFtZXRlcnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQotR0xib29sZWFuIGdsSXNCdWZmZXIgKCBHTHVpbnQgYnVmZmVyICkKLUdMYm9vbGVhbiBnbElzRW5hYmxlZCAoIEdMZW51bSBjYXAgKQotR0xib29sZWFuIGdsSXNUZXh0dXJlICggR0x1aW50IHRleHR1cmUgKQotdm9pZCBnbE5vcm1hbFBvaW50ZXIgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApCi12b2lkIGdsUG9pbnRQYXJhbWV0ZXJmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKLXZvaWQgZ2xQb2ludFBhcmFtZXRlcmZ2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQotdm9pZCBnbFBvaW50UGFyYW1ldGVyeCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCi12b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4diAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xQb2ludFNpemVQb2ludGVyT0VTICggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQotdm9pZCBnbFRleENvb3JkUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkKLXZvaWQgZ2xUZXhFbnZpICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApCi12b2lkIGdsVGV4RW52aXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbFRleFBhcmFtZXRlcmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQotdm9pZCBnbFRleFBhcmFtZXRlcmkgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICkKLXZvaWQgZ2xUZXhQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApCi12b2lkIGdsVGV4UGFyYW1ldGVyeHYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsVmVydGV4UG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9nbGVzMTEvR0xFUzExRXh0LnNwZWMgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMxMUV4dC5zcGVjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDczMzNhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9nbGVzMTEvR0xFUzExRXh0LnNwZWMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi12b2lkIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTICggR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEgKQotdm9pZCBnbEJsZW5kRnVuY1NlcGFyYXRlT0VTICggR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEgKQotdm9pZCBnbEJsZW5kRXF1YXRpb25PRVMgKCBHTGVudW0gbW9kZSApCi12b2lkIGdsRHJhd1RleHNPRVMgKCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCApCi12b2lkIGdsRHJhd1RleGlPRVMgKCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0ICkKLXZvaWQgZ2xEcmF3VGV4eE9FUyAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0ICkKLXZvaWQgZ2xEcmF3VGV4c3ZPRVMgKCBjb25zdCBHTHNob3J0ICpjb29yZHMgKQotdm9pZCBnbERyYXdUZXhpdk9FUyAoIGNvbnN0IEdMaW50ICpjb29yZHMgKQotdm9pZCBnbERyYXdUZXh4dk9FUyAoIGNvbnN0IEdMZml4ZWQgKmNvb3JkcyApCi12b2lkIGdsRHJhd1RleGZPRVMgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCApCi12b2lkIGdsRHJhd1RleGZ2T0VTICggY29uc3QgR0xmbG9hdCAqY29vcmRzICkKLXZvaWQgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyAoIEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UgKQotdm9pZCBnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyAoIEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UgKQotdm9pZCBnbEFscGhhRnVuY3hPRVMgKCBHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmICkKLXZvaWQgZ2xDbGVhckNvbG9yeE9FUyAoIEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhICkKLXZvaWQgZ2xDbGVhckRlcHRoeE9FUyAoIEdMY2xhbXB4IGRlcHRoICkKLXZvaWQgZ2xDbGlwUGxhbmV4T0VTICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbiApCi12b2lkIGdsQ29sb3I0eE9FUyAoIEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEgKQotdm9pZCBnbERlcHRoUmFuZ2V4T0VTICggR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIgKQotdm9pZCBnbEZvZ3hPRVMgKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQotdm9pZCBnbEZvZ3h2T0VTICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbEZydXN0dW14T0VTICggR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciApCi12b2lkIGdsR2V0Q2xpcFBsYW5leE9FUyAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqZXFuICkKLXZvaWQgZ2xHZXRGaXhlZHZPRVMgKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsR2V0TGlnaHR4dk9FUyAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbEdldE1hdGVyaWFseHZPRVMgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbEdldFRleEVudnh2T0VTICggR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbEdldFRleFBhcmFtZXRlcnh2T0VTICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbExpZ2h0TW9kZWx4T0VTICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xMaWdodE1vZGVseHZPRVMgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsTGlnaHR4T0VTICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQotdm9pZCBnbExpZ2h0eHZPRVMgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xMaW5lV2lkdGh4T0VTICggR0xmaXhlZCB3aWR0aCApCi12b2lkIGdsTG9hZE1hdHJpeHhPRVMgKCBjb25zdCBHTGZpeGVkICptICkKLXZvaWQgZ2xNYXRlcmlhbHhPRVMgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xNYXRlcmlhbHh2T0VTICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xNdWx0TWF0cml4eE9FUyAoIGNvbnN0IEdMZml4ZWQgKm0gKQotdm9pZCBnbE11bHRpVGV4Q29vcmQ0eE9FUyAoIEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSApCi12b2lkIGdsTm9ybWFsM3hPRVMgKCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56ICkKLXZvaWQgZ2xPcnRob3hPRVMgKCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyICkKLXZvaWQgZ2xQb2ludFBhcmFtZXRlcnhPRVMgKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQotdm9pZCBnbFBvaW50UGFyYW1ldGVyeHZPRVMgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsUG9pbnRTaXpleE9FUyAoIEdMZml4ZWQgc2l6ZSApCi12b2lkIGdsUG9seWdvbk9mZnNldHhPRVMgKCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyApCi12b2lkIGdsUm90YXRleE9FUyAoIEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQotdm9pZCBnbFNhbXBsZUNvdmVyYWdleE9FUyAoIEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0ICkKLXZvaWQgZ2xTY2FsZXhPRVMgKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkKLXZvaWQgZ2xUZXhFbnZ4T0VTICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xUZXhFbnZ4dk9FUyAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xUZXhQYXJhbWV0ZXJ4T0VTICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xUZXhQYXJhbWV0ZXJ4dk9FUyAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xUcmFuc2xhdGV4T0VTICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApCi1HTGJvb2xlYW4gZ2xJc1JlbmRlcmJ1ZmZlck9FUyAoIEdMdWludCByZW5kZXJidWZmZXIgKQotdm9pZCBnbEJpbmRSZW5kZXJidWZmZXJPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyICkKLXZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMgKQotdm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMgKCBHTHNpemVpIG4sIEdMdWludCAqcmVuZGVyYnVmZmVycyApCi12b2lkIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQgKQotdm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkKLUdMYm9vbGVhbiBnbElzRnJhbWVidWZmZXJPRVMgKCBHTHVpbnQgZnJhbWVidWZmZXIgKQotdm9pZCBnbEJpbmRGcmFtZWJ1ZmZlck9FUyAoIEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlciApCi12b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZyYW1lYnVmZmVycyApCi12b2lkIGdsR2VuRnJhbWVidWZmZXJzT0VTICggR0xzaXplaSBuLCBHTHVpbnQgKmZyYW1lYnVmZmVycyApCi1HTGVudW0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTICggR0xlbnVtIHRhcmdldCApCi12b2lkIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlciApCi12b2lkIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsICkKLXZvaWQgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbEdlbmVyYXRlTWlwbWFwT0VTICggR0xlbnVtIHRhcmdldCApCi0vLyBIYXJkIHRvIGV4cG9ydCB0byBKYXZhOgotLy8gdm9pZCAqZ2xNYXBCdWZmZXJPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzICkKLS8vIEdMYm9vbGVhbiBnbFVubWFwQnVmZmVyT0VTICggR0xlbnVtIHRhcmdldCApCi0vLyB2b2lkIGdsR2V0QnVmZmVyUG9pbnRlcnZPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIHZvaWQgKipwYXJhbXMgKQotdm9pZCBnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTICggR0x1aW50IG1hdHJpeHBhbGV0dGVpbmRleCApCi12b2lkIGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTICggdm9pZCApCi12b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQotdm9pZCBnbFdlaWdodFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApCi12b2lkIGdsRGVwdGhSYW5nZWZPRVMgKCBHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhciApCi12b2lkIGdsRnJ1c3R1bWZPRVMgKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyICkKLXZvaWQgZ2xPcnRob2ZPRVMgKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyICkKLXZvaWQgZ2xDbGlwUGxhbmVmT0VTICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiApCi12b2lkIGdsR2V0Q2xpcFBsYW5lZk9FUyAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqZXFuICkKLXZvaWQgZ2xDbGVhckRlcHRoZk9FUyAoIEdMY2xhbXBmIGRlcHRoICkKLXZvaWQgZ2xUZXhHZW5mT0VTICggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQotdm9pZCBnbFRleEdlbmZ2T0VTICggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsVGV4R2VuaU9FUyAoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApCi12b2lkIGdsVGV4R2VuaXZPRVMgKCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApCi12b2lkIGdsVGV4R2VueE9FUyAoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xUZXhHZW54dk9FUyAoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbEdldFRleEdlbmZ2T0VTICggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsR2V0VGV4R2VuaXZPRVMgKCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCi12b2lkIGdsR2V0VGV4R2VueHZPRVMgKCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9nbGVzMTEvR0xFUzIwLnNwZWMgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMyMC5zcGVjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg4ZjU5Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9nbGVzMTEvR0xFUzIwLnNwZWMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotdm9pZCBnbEFjdGl2ZVRleHR1cmUgKCBHTGVudW0gdGV4dHVyZSApDQotdm9pZCBnbEF0dGFjaFNoYWRlciAoIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyICkNCi12b2lkIGdsQmluZEF0dHJpYkxvY2F0aW9uICggR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgY2hhciAqbmFtZSApDQotdm9pZCBnbEJpbmRCdWZmZXIgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyICkNCi12b2lkIGdsQmluZEZyYW1lYnVmZmVyICggR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyICkNCi12b2lkIGdsQmluZFJlbmRlcmJ1ZmZlciAoIEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIgKQ0KLXZvaWQgZ2xCaW5kVGV4dHVyZSAoIEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlICkNCi12b2lkIGdsQmxlbmRDb2xvciAoIEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhICkNCi12b2lkIGdsQmxlbmRFcXVhdGlvbiAoIEdMZW51bSBtb2RlICkNCi12b2lkIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlICggR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEgKQ0KLXZvaWQgZ2xCbGVuZEZ1bmMgKCBHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IgKQ0KLXZvaWQgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSAoIEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhICkNCi12b2lkIGdsQnVmZmVyRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UgKQ0KLXZvaWQgZ2xCdWZmZXJTdWJEYXRhICggR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQotR0xlbnVtIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyAoIEdMZW51bSB0YXJnZXQgKQ0KLXZvaWQgZ2xDbGVhciAoIEdMYml0ZmllbGQgbWFzayApDQotdm9pZCBnbENsZWFyQ29sb3IgKCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSApDQotdm9pZCBnbENsZWFyRGVwdGhmICggR0xjbGFtcGYgZGVwdGggKQ0KLXZvaWQgZ2xDbGVhclN0ZW5jaWwgKCBHTGludCBzICkNCi12b2lkIGdsQ29sb3JNYXNrICggR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhICkNCi12b2lkIGdsQ29tcGlsZVNoYWRlciAoIEdMdWludCBzaGFkZXIgKQ0KLXZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KLXZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQotdm9pZCBnbENvcHlUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciApDQotdm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCi1HTHVpbnQgZ2xDcmVhdGVQcm9ncmFtICggdm9pZCApDQotR0x1aW50IGdsQ3JlYXRlU2hhZGVyICggR0xlbnVtIHR5cGUgKQ0KLXZvaWQgZ2xDdWxsRmFjZSAoIEdMZW51bSBtb2RlICkNCi12b2lkIGdsRGVsZXRlQnVmZmVycyAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzICkNCi12b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZyYW1lYnVmZmVycyApDQotdm9pZCBnbERlbGV0ZVByb2dyYW0gKCBHTHVpbnQgcHJvZ3JhbSApDQotdm9pZCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMgKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcmVuZGVyYnVmZmVycyApDQotdm9pZCBnbERlbGV0ZVNoYWRlciAoIEdMdWludCBzaGFkZXIgKQ0KLXZvaWQgZ2xEZWxldGVUZXh0dXJlcyAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyApDQotdm9pZCBnbERlcHRoRnVuYyAoIEdMZW51bSBmdW5jICkNCi12b2lkIGdsRGVwdGhNYXNrICggR0xib29sZWFuIGZsYWcgKQ0KLXZvaWQgZ2xEZXB0aFJhbmdlZiAoIEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyICkNCi12b2lkIGdsRGV0YWNoU2hhZGVyICggR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIgKQ0KLXZvaWQgZ2xEaXNhYmxlICggR0xlbnVtIGNhcCApDQotdm9pZCBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSAoIEdMdWludCBpbmRleCApDQotdm9pZCBnbERyYXdBcnJheXMgKCBHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQgKQ0KLXZvaWQgZ2xEcmF3RWxlbWVudHMgKCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIEdMaW50IG9mZnNldCApDQotdm9pZCBnbERyYXdFbGVtZW50cyAoIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzICkNCi12b2lkIGdsRW5hYmxlICggR0xlbnVtIGNhcCApDQotdm9pZCBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5ICggR0x1aW50IGluZGV4ICkNCi12b2lkIGdsRmluaXNoICggdm9pZCApDQotdm9pZCBnbEZsdXNoICggdm9pZCApDQotdm9pZCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIgKQ0KLXZvaWQgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwgKQ0KLXZvaWQgZ2xGcm9udEZhY2UgKCBHTGVudW0gbW9kZSApDQotdm9pZCBnbEdlbkJ1ZmZlcnMgKCBHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyApDQotdm9pZCBnbEdlbmVyYXRlTWlwbWFwICggR0xlbnVtIHRhcmdldCApDQotdm9pZCBnbEdlbkZyYW1lYnVmZmVycyAoIEdMc2l6ZWkgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMgKQ0KLXZvaWQgZ2xHZW5SZW5kZXJidWZmZXJzICggR0xzaXplaSBuLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMgKQ0KLXZvaWQgZ2xHZW5UZXh0dXJlcyAoIEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyApDQotdm9pZCBnbEdldEFjdGl2ZUF0dHJpYiAoIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBjaGFyICpuYW1lICkNCi12b2lkIGdsR2V0QWN0aXZlVW5pZm9ybSAoIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBjaGFyICpuYW1lICkNCi12b2lkIGdsR2V0QXR0YWNoZWRTaGFkZXJzICggR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkgKmNvdW50LCBHTHVpbnQgKnNoYWRlcnMgKQ0KLWludCBnbEdldEF0dHJpYkxvY2F0aW9uICggR0x1aW50IHByb2dyYW0sIGNvbnN0IGNoYXIgKm5hbWUgKQ0KLXZvaWQgZ2xHZXRCb29sZWFudiAoIEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQotR0xlbnVtIGdsR2V0RXJyb3IgKCB2b2lkICkNCi12b2lkIGdsR2V0RmxvYXR2ICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRJbnRlZ2VydiAoIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQotdm9pZCBnbEdldFByb2dyYW1pdiAoIEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRQcm9ncmFtSW5mb0xvZyAoIEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgY2hhciAqaW5mb2xvZyApDQotdm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCi12b2lkIGdsR2V0U2hhZGVyaXYgKCBHTHVpbnQgc2hhZGVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRTaGFkZXJJbmZvTG9nICggR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIGNoYXIgKmluZm9sb2cgKQ0KLXZvaWQgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgKCBHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHByZWNpc2lvbnR5cGUsIEdMaW50ICpyYW5nZSwgR0xpbnQgKnByZWNpc2lvbiApDQotdm9pZCBnbEdldFNoYWRlclNvdXJjZSAoIEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBjaGFyICpzb3VyY2UgKQ0KLWNvbnN0IEdMdWJ5dGUgKiBnbEdldFN0cmluZyAoIEdMZW51bSBuYW1lICkNCi12b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApDQotdm9pZCBnbEdldFRleFBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCi12b2lkIGdsR2V0VW5pZm9ybWZ2ICggR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRVbmlmb3JtaXYgKCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50ICpwYXJhbXMgKQ0KLWludCBnbEdldFVuaWZvcm1Mb2NhdGlvbiAoIEdMdWludCBwcm9ncmFtLCBjb25zdCBjaGFyICpuYW1lICkNCi12b2lkIGdsR2V0VmVydGV4QXR0cmliZnYgKCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCi12b2lkIGdsR2V0VmVydGV4QXR0cmliaXYgKCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQotLy8gdm9pZCBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2ICggR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIHZvaWQgKipwb2ludGVyICkNCi12b2lkIGdsSGludCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlICkNCi1HTGJvb2xlYW4gZ2xJc0J1ZmZlciAoIEdMdWludCBidWZmZXIgKQ0KLUdMYm9vbGVhbiBnbElzRW5hYmxlZCAoIEdMZW51bSBjYXAgKQ0KLUdMYm9vbGVhbiBnbElzRnJhbWVidWZmZXIgKCBHTHVpbnQgZnJhbWVidWZmZXIgKQ0KLUdMYm9vbGVhbiBnbElzUHJvZ3JhbSAoIEdMdWludCBwcm9ncmFtICkNCi1HTGJvb2xlYW4gZ2xJc1JlbmRlcmJ1ZmZlciAoIEdMdWludCByZW5kZXJidWZmZXIgKQ0KLUdMYm9vbGVhbiBnbElzU2hhZGVyICggR0x1aW50IHNoYWRlciApDQotR0xib29sZWFuIGdsSXNUZXh0dXJlICggR0x1aW50IHRleHR1cmUgKQ0KLXZvaWQgZ2xMaW5lV2lkdGggKCBHTGZsb2F0IHdpZHRoICkNCi12b2lkIGdsTGlua1Byb2dyYW0gKCBHTHVpbnQgcHJvZ3JhbSApDQotdm9pZCBnbFBpeGVsU3RvcmVpICggR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApDQotdm9pZCBnbFBvbHlnb25PZmZzZXQgKCBHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyApDQotdm9pZCBnbFJlYWRQaXhlbHMgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzICkNCi12b2lkIGdsUmVsZWFzZVNoYWRlckNvbXBpbGVyICggdm9pZCApDQotdm9pZCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCi12b2lkIGdsU2FtcGxlQ292ZXJhZ2UgKCBHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCApDQotdm9pZCBnbFNjaXNzb3IgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApDQotdm9pZCBnbFNoYWRlckJpbmFyeSAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpzaGFkZXJzLCBHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCBHTHZvaWQgKmJpbmFyeSwgR0xzaXplaSBsZW5ndGggKQ0KLXZvaWQgZ2xTaGFkZXJTb3VyY2UgKCBHTHVpbnQgc2hhZGVyICkNCi12b2lkIGdsU3RlbmNpbEZ1bmMgKCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayApDQotdm9pZCBnbFN0ZW5jaWxGdW5jU2VwYXJhdGUgKCBHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2sgKQ0KLXZvaWQgZ2xTdGVuY2lsTWFzayAoIEdMdWludCBtYXNrICkNCi12b2lkIGdsU3RlbmNpbE1hc2tTZXBhcmF0ZSAoIEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzayApDQotdm9pZCBnbFN0ZW5jaWxPcCAoIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyApDQotdm9pZCBnbFN0ZW5jaWxPcFNlcGFyYXRlICggR0xlbnVtIGZhY2UsIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyApDQotdm9pZCBnbFRleEltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyApDQotdm9pZCBnbFRleFBhcmFtZXRlcmYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KLXZvaWQgZ2xUZXhQYXJhbWV0ZXJmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCi12b2lkIGdsVGV4UGFyYW1ldGVyaSAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KLXZvaWQgZ2xUZXhQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApDQotdm9pZCBnbFRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyApDQotdm9pZCBnbFVuaWZvcm0xZiAoIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHggKQ0KLXZvaWQgZ2xVbmlmb3JtMWZ2ICggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYgKQ0KLXZvaWQgZ2xVbmlmb3JtMWkgKCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCApDQotdm9pZCBnbFVuaWZvcm0xaXYgKCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnYgKQ0KLXZvaWQgZ2xVbmlmb3JtMmYgKCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHkgKQ0KLXZvaWQgZ2xVbmlmb3JtMmZ2ICggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYgKQ0KLXZvaWQgZ2xVbmlmb3JtMmkgKCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSApDQotdm9pZCBnbFVuaWZvcm0yaXYgKCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnYgKQ0KLXZvaWQgZ2xVbmlmb3JtM2YgKCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApDQotdm9pZCBnbFVuaWZvcm0zZnYgKCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdiApDQotdm9pZCBnbFVuaWZvcm0zaSAoIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6ICkNCi12b2lkIGdsVW5pZm9ybTNpdiAoIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdiApDQotdm9pZCBnbFVuaWZvcm00ZiAoIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcgKQ0KLXZvaWQgZ2xVbmlmb3JtNGZ2ICggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYgKQ0KLXZvaWQgZ2xVbmlmb3JtNGkgKCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyApDQotdm9pZCBnbFVuaWZvcm00aXYgKCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnYgKQ0KLXZvaWQgZ2xVbmlmb3JtTWF0cml4MmZ2ICggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlICkNCi12b2lkIGdsVW5pZm9ybU1hdHJpeDNmdiAoIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSApDQotdm9pZCBnbFVuaWZvcm1NYXRyaXg0ZnYgKCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUgKQ0KLXZvaWQgZ2xVc2VQcm9ncmFtICggR0x1aW50IHByb2dyYW0gKQ0KLXZvaWQgZ2xWYWxpZGF0ZVByb2dyYW0gKCBHTHVpbnQgcHJvZ3JhbSApDQotdm9pZCBnbFZlcnRleEF0dHJpYjFmICggR0x1aW50IGluZHgsIEdMZmxvYXQgeCApDQotdm9pZCBnbFZlcnRleEF0dHJpYjFmdiAoIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0ICp2YWx1ZXMgKQ0KLXZvaWQgZ2xWZXJ0ZXhBdHRyaWIyZiAoIEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSApDQotdm9pZCBnbFZlcnRleEF0dHJpYjJmdiAoIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0ICp2YWx1ZXMgKQ0KLXZvaWQgZ2xWZXJ0ZXhBdHRyaWIzZiAoIEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkNCi12b2lkIGdsVmVydGV4QXR0cmliM2Z2ICggR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQgKnZhbHVlcyApDQotdm9pZCBnbFZlcnRleEF0dHJpYjRmICggR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyApDQotdm9pZCBnbFZlcnRleEF0dHJpYjRmdiAoIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0ICp2YWx1ZXMgKQ0KLXZvaWQgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyICggR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQotdm9pZCBnbFZlcnRleEF0dHJpYlBvaW50ZXIgKCBHTHVpbnQgaW5keCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwdHIgKQ0KLXZvaWQgZ2xWaWV3cG9ydCAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL2NoZWNrcy5zcGVjIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2dsZXMxMS9jaGVja3Muc3BlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3OGEzMi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL2NoZWNrcy5zcGVjCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotZ2xDbGlwUGxhbmVmIGNoZWNrIGVxbiA0Ci1nbENsaXBQbGFuZXggY2hlY2sgZXFuIDQKLWdsR2V0Q2xpcFBsYW5lZk9FUyBjaGVjayBlcW4gNAotZ2xHZXRDbGlwUGxhbmV4T0VTIGNoZWNrIGVxbiA0Ci1nbERlbGV0ZUJ1ZmZlcnMgY2hlY2sgYnVmZmVycyBuCi1nbERlbGV0ZVRleHR1cmVzIGNoZWNrIHRleHR1cmVzIG4KLWdsRHJhd0VsZW1lbnRzIGNoZWNrX0FJT09CRSBpbmRpY2VzIGNvdW50Ci1nbEZvZyBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX0ZPR19NT0RFLEdMX0ZPR19ERU5TSVRZLEdMX0ZPR19TVEFSVCxHTF9GT0dfRU5EIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfRk9HX0NPTE9SCi1nbEdlbkJ1ZmZlcnMgY2hlY2sgYnVmZmVycyBuCi1nbEdlblRleHR1cmVzIGNoZWNrIHRleHR1cmVzIG4KLWdsR2V0Q2xpcFBsYW5lIGNoZWNrIGVxbiA0Ci1nbEdldEludGVnZXJ2IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfQUxQSEFfQklUUyxHTF9BTFBIQV9URVNUX0ZVTkMsR0xfQUxQSEFfVEVTVF9SRUYsR0xfQkxFTkRfRFNULEdMX0JMVUVfQklUUyxHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORyxHTF9DT0xPUl9BUlJBWV9TSVpFLEdMX0NPTE9SX0FSUkFZX1NUUklERSxHTF9DT0xPUl9BUlJBWV9UWVBFLEdMX0NVTExfRkFDRSxHTF9ERVBUSF9CSVRTLEdMX0RFUFRIX0NMRUFSX1ZBTFVFLEdMX0RFUFRIX0ZVTkMsR0xfREVQVEhfV1JJVEVNQVNLLEdMX0ZPR19ERU5TSVRZLEdMX0ZPR19FTkQsR0xfRk9HX01PREUsR0xfRk9HX1NUQVJULEdMX0ZST05UX0ZBQ0UsR0xfR1JFRU5fQklUUyxHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMsR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyxHTF9MSUdIVF9NT0RFTF9DT0xPUl9DT05UUk9MLEdMX0xJR0hUX01PREVMX0xPQ0FMX1ZJRVdFUixHTF9MSUdIVF9NT0RFTF9UV09fU0lERSxHTF9MSU5FX1NNT09USF9ISU5ULEdMX0xJTkVfV0lEVEgsR0xfTE9HSUNfT1BfTU9ERSxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTLEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVMsR0xfTUFUUklYX01PREUsR0xfTUFYX0NMSVBfUExBTkVTLEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTLEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyxHTF9NQVhfTElHSFRTLEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgsR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfT0VTLEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRILEdMX01BWF9URVhUVVJFX1NJWkUsR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEgsR0xfTUFYX1RFWFRVUkVfVU5JVFMsR0xfTUFYX1ZFUlRFWF9VTklUU19PRVMsR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRILEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9OT1JNQUxfQVJSQVlfU1RSSURFLEdMX05PUk1BTF9BUlJBWV9UWVBFLEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyxHTF9QQUNLX0FMSUdOTUVOVCxHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsR0xfUE9JTlRfU0laRSxHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyxHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMsR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUyxHTF9QT0lOVF9TTU9PVEhfSElOVCxHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IsR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMsR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCxHTF9SRURfQklUUyxHTF9TSEFERV9NT0RFTCxHTF9TVEVOQ0lMX0JJVFMsR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSxHTF9TVEVOQ0lMX0ZBSUwsR0xfU1RFTkNJTF9GVU5DLEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMLEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTLEdMX1NURU5DSUxfUkVGLEdMX1NURU5DSUxfVkFMVUVfTUFTSyxHTF9TVEVOQ0lMX1dSSVRFTUFTSyxHTF9TVUJQSVhFTF9CSVRTLEdMX1RFWFRVUkVfQklORElOR18yRCxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HLEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUsR0xfVEVYVFVSRV9TVEFDS19ERVBUSCxHTF9VTlBBQ0tfQUxJR05NRU5ULEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9WRVJURVhfQVJSQVlfU0laRSxHTF9WRVJURVhfQVJSQVlfU1RSSURFLEdMX1ZFUlRFWF9BUlJBWV9UWVBFLEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsR0xfV0VJR0hUX0FSUkFZX1NJWkVfT0VTLEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfT0VTLEdMX1dFSUdIVF9BUlJBWV9UWVBFX09FUyBpZmNoZWNrIHBhcmFtcyAyIHBuYW1lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSxHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UsR0xfREVQVEhfUkFOR0UsR0xfTUFYX1ZJRVdQT1JUX0RJTVMsR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UsR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9DT0xPUl9DTEVBUl9WQUxVRSxHTF9DT0xPUl9XUklURU1BU0ssR0xfRk9HX0NPTE9SLEdMX0xJR0hUX01PREVMX0FNQklFTlQsR0xfU0NJU1NPUl9CT1gsR0xfVklFV1BPUlQgaWZjaGVjayBwYXJhbXMgMTYgcG5hbWUgR0xfTU9ERUxWSUVXX01BVFJJWCxHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyxHTF9QUk9KRUNUSU9OX01BVFJJWCxHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMsR0xfVEVYVFVSRV9NQVRSSVgsR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTIGlmY2hlY2sgcGFyYW1zIGdldE51bUNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpIHBuYW1lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTCi1nbEdldExpZ2h0IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU1BPVF9FWFBPTkVOVCxHTF9TUE9UX0NVVE9GRixHTF9DT05TVEFOVF9BVFRFTlVBVElPTixHTF9MSU5FQVJfQVRURU5VQVRJT04sR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OIGlmY2hlY2sgcGFyYW1zIDMgcG5hbWUgR0xfU1BPVF9ESVJFQ1RJT04gaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04KLWdsR2V0TWF0ZXJpYWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TSElOSU5FU1MgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04sR0xfQU1CSUVOVF9BTkRfRElGRlVTRQotZ2xHZXRUZXhFbnYgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9URVhUVVJFX0VOVl9NT0RFLEdMX0NPTUJJTkVfUkdCLEdMX0NPTUJJTkVfQUxQSEEgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9URVhUVVJFX0VOVl9DT0xPUgotZ2xHZXRUZXhQYXJhbWV0ZXIgY2hlY2sgcGFyYW1zIDEKLWdsTGlnaHRNb2RlbCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX0xJR0hUX01PREVMX1RXT19TSURFIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfTElHSFRfTU9ERUxfQU1CSUVOVAotZ2xMaWdodCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NQT1RfRVhQT05FTlQsR0xfU1BPVF9DVVRPRkYsR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sR0xfTElORUFSX0FUVEVOVUFUSU9OLEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiBpZmNoZWNrIHBhcmFtcyAzIHBuYW1lIEdMX1NQT1RfRElSRUNUSU9OIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9OCi1nbExvYWRNYXRyaXggY2hlY2sgbSAxNgotZ2xNYXRlcmlhbCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NISU5JTkVTUyBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0FNQklFTlQsR0xfRElGRlVTRSxHTF9TUEVDVUxBUixHTF9FTUlTU0lPTixHTF9BTUJJRU5UX0FORF9ESUZGVVNFCi1nbE11bHRNYXRyaXggY2hlY2sgbSAxNgotZ2xQb2ludFBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQotZ2xUZXhFbnYgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9URVhUVVJFX0VOVl9NT0RFLEdMX0NPTUJJTkVfUkdCLEdMX0NPTUJJTkVfQUxQSEEgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9URVhUVVJFX0VOVl9DT0xPUgotZ2xUZXhJbWFnZTJEIG51bGxBbGxvd2VkCi1nbFRleFN1YkltYWdlMkQgbnVsbEFsbG93ZWQKLWdsQnVmZmVyRGF0YSBudWxsQWxsb3dlZCBjaGVjayBkYXRhIHNpemUKLWdsQnVmZmVyU3ViRGF0YSBjaGVjayBkYXRhIHNpemUKLWdsVGV4UGFyYW1ldGVyIGNoZWNrIHBhcmFtcyAxCi1nbFF1ZXJ5TWF0cml4eE9FUyBjaGVjayBtYW50aXNzYSAxNiBjaGVjayBleHBvbmVudCAxNiByZXR1cm4gLTEKLWdsRHJhd1RleGZ2T0VTIGNoZWNrIGNvb3JkcyA1Ci1nbERyYXdUZXhpdk9FUyBjaGVjayBjb29yZHMgNQotZ2xEcmF3VGV4c3ZPRVMgY2hlY2sgY29vcmRzIDUKLWdsRHJhd1RleHh2T0VTIGNoZWNrIGNvb3JkcyA1Ci1nbERlbGV0ZUZyYW1lYnVmZmVyc09FUyBjaGVjayBmcmFtZWJ1ZmZlcnMgbgotZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTIGNoZWNrIHJlbmRlcmJ1ZmZlcnMgbgotZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMgY2hlY2sgZnJhbWVidWZmZXJzIG4KLWdsR2VuUmVuZGVyYnVmZmVyc09FUyBjaGVjayByZW5kZXJidWZmZXJzIG4KLWdsR2V0QnVmZmVyUGFyYW1ldGVyIGNoZWNrIHBhcmFtcyAxCi1nbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTIGNoZWNrIHBhcmFtcyAxCi1nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTIGNoZWNrIHBhcmFtcyAxCi1nbEdldFRleEdlbiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1RFWFRVUkVfR0VOX01PREUgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9PQkpFQ1RfUExBTkUsR0xfRVlFX1BMQU5FCi0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMCBiL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0MjMyMC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvanNyMjM5L2dsc3BlYy0xLjAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotdm9pZCBnbEFjdGl2ZVRleHR1cmUgKCBHTGVudW0gdGV4dHVyZSApDQotdm9pZCBnbEFscGhhRnVuYyAoIEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYgKQ0KLXZvaWQgZ2xBbHBoYUZ1bmN4ICggR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZiApDQotdm9pZCBnbEJpbmRUZXh0dXJlICggR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUgKQ0KLXZvaWQgZ2xCbGVuZEZ1bmMgKCBHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IgKQ0KLXZvaWQgZ2xDbGVhciAoIEdMYml0ZmllbGQgbWFzayApDQotdm9pZCBnbENsZWFyQ29sb3IgKCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSApDQotdm9pZCBnbENsZWFyQ29sb3J4ICggR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEgKQ0KLXZvaWQgZ2xDbGVhckRlcHRoZiAoIEdMY2xhbXBmIGRlcHRoICkNCi12b2lkIGdsQ2xlYXJEZXB0aHggKCBHTGNsYW1weCBkZXB0aCApDQotdm9pZCBnbENsZWFyU3RlbmNpbCAoIEdMaW50IHMgKQ0KLXZvaWQgZ2xDbGllbnRBY3RpdmVUZXh0dXJlICggR0xlbnVtIHRleHR1cmUgKQ0KLXZvaWQgZ2xDb2xvcjRmICggR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSApDQotdm9pZCBnbENvbG9yNHggKCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhICkNCi12b2lkIGdsQ29sb3JNYXNrICggR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhICkNCi12b2lkIGdsQ29sb3JQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KLXZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KLXZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQotdm9pZCBnbENvcHlUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciApDQotdm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCi12b2lkIGdsQ3VsbEZhY2UgKCBHTGVudW0gbW9kZSApDQotdm9pZCBnbERlbGV0ZVRleHR1cmVzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzICkNCi12b2lkIGdsRGVwdGhGdW5jICggR0xlbnVtIGZ1bmMgKQ0KLXZvaWQgZ2xEZXB0aE1hc2sgKCBHTGJvb2xlYW4gZmxhZyApDQotdm9pZCBnbERlcHRoUmFuZ2VmICggR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIgKQ0KLXZvaWQgZ2xEZXB0aFJhbmdleCAoIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyICkNCi12b2lkIGdsRGlzYWJsZSAoIEdMZW51bSBjYXAgKQ0KLXZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KLXZvaWQgZ2xEcmF3QXJyYXlzICggR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50ICkNCi12b2lkIGdsRHJhd0VsZW1lbnRzICggR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMgKQ0KLXZvaWQgZ2xFbmFibGUgKCBHTGVudW0gY2FwICkNCi12b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KLXZvaWQgZ2xGaW5pc2ggKCB2b2lkICkNCi12b2lkIGdsRmx1c2ggKCB2b2lkICkNCi12b2lkIGdsRm9nZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQotdm9pZCBnbEZvZ2Z2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xGb2d4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCi12b2lkIGdsRm9neHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQotdm9pZCBnbEZyb250RmFjZSAoIEdMZW51bSBtb2RlICkNCi12b2lkIGdsRnJ1c3R1bWYgKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyICkNCi12b2lkIGdsRnJ1c3R1bXggKCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyICkNCi12b2lkIGdsR2VuVGV4dHVyZXMgKCBHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMgKQ0KLUdMZW51bSBnbEdldEVycm9yICggdm9pZCApDQotdm9pZCBnbEdldEludGVnZXJ2ICggR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCi1jb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApDQotdm9pZCBnbEhpbnQgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSApDQotdm9pZCBnbExpZ2h0TW9kZWxmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCi12b2lkIGdsTGlnaHRNb2RlbGZ2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xMaWdodE1vZGVseCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQotdm9pZCBnbExpZ2h0TW9kZWx4diAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCi12b2lkIGdsTGlnaHRmICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KLXZvaWQgZ2xMaWdodGZ2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQotdm9pZCBnbExpZ2h0eCAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCi12b2lkIGdsTGlnaHR4diAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KLXZvaWQgZ2xMaW5lV2lkdGggKCBHTGZsb2F0IHdpZHRoICkNCi12b2lkIGdsTGluZVdpZHRoeCAoIEdMZml4ZWQgd2lkdGggKQ0KLXZvaWQgZ2xMb2FkSWRlbnRpdHkgKCB2b2lkICkNCi12b2lkIGdsTG9hZE1hdHJpeGYgKCBjb25zdCBHTGZsb2F0ICptICkNCi12b2lkIGdsTG9hZE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkNCi12b2lkIGdsTG9naWNPcCAoIEdMZW51bSBvcGNvZGUgKQ0KLXZvaWQgZ2xNYXRlcmlhbGYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCi12b2lkIGdsTWF0ZXJpYWxmdiAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQotdm9pZCBnbE1hdGVyaWFseCAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KLXZvaWQgZ2xNYXRlcmlhbHh2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCi12b2lkIGdsTWF0cml4TW9kZSAoIEdMZW51bSBtb2RlICkNCi12b2lkIGdsTXVsdE1hdHJpeGYgKCBjb25zdCBHTGZsb2F0ICptICkNCi12b2lkIGdsTXVsdE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkNCi12b2lkIGdsTXVsdGlUZXhDb29yZDRmICggR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxICkNCi12b2lkIGdsTXVsdGlUZXhDb29yZDR4ICggR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxICkNCi12b2lkIGdsTm9ybWFsM2YgKCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56ICkNCi12b2lkIGdsTm9ybWFsM3ggKCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56ICkNCi12b2lkIGdsTm9ybWFsUG9pbnRlciAoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCi12b2lkIGdsT3J0aG9mICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApDQotdm9pZCBnbE9ydGhveCAoIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIgKQ0KLXZvaWQgZ2xQaXhlbFN0b3JlaSAoIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KLXZvaWQgZ2xQb2ludFNpemUgKCBHTGZsb2F0IHNpemUgKQ0KLXZvaWQgZ2xQb2ludFNpemV4ICggR0xmaXhlZCBzaXplICkNCi12b2lkIGdsUG9seWdvbk9mZnNldCAoIEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzICkNCi12b2lkIGdsUG9seWdvbk9mZnNldHggKCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyApDQotdm9pZCBnbFBvcE1hdHJpeCAoIHZvaWQgKQ0KLXZvaWQgZ2xQdXNoTWF0cml4ICggdm9pZCApDQotdm9pZCBnbFJlYWRQaXhlbHMgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzICkNCi12b2lkIGdsUm90YXRlZiAoIEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KLXZvaWQgZ2xSb3RhdGV4ICggR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApDQotdm9pZCBnbFNhbXBsZUNvdmVyYWdlICggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKQ0KLXZvaWQgZ2xTYW1wbGVDb3ZlcmFnZXggKCBHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCApDQotdm9pZCBnbFNjYWxlZiAoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KLXZvaWQgZ2xTY2FsZXggKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkNCi12b2lkIGdsU2Npc3NvciAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCi12b2lkIGdsU2hhZGVNb2RlbCAoIEdMZW51bSBtb2RlICkNCi12b2lkIGdsU3RlbmNpbEZ1bmMgKCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayApDQotdm9pZCBnbFN0ZW5jaWxNYXNrICggR0x1aW50IG1hc2sgKQ0KLXZvaWQgZ2xTdGVuY2lsT3AgKCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MgKQ0KLXZvaWQgZ2xUZXhDb29yZFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQotdm9pZCBnbFRleEVudmYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KLXZvaWQgZ2xUZXhFbnZmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCi12b2lkIGdsVGV4RW52eCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQotdm9pZCBnbFRleEVudnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KLXZvaWQgZ2xUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKQ0KLXZvaWQgZ2xUZXhQYXJhbWV0ZXJmICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCi12b2lkIGdsVGV4UGFyYW1ldGVyeCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQotdm9pZCBnbFRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyApDQotdm9pZCBnbFRyYW5zbGF0ZWYgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkNCi12b2lkIGdsVHJhbnNsYXRleCAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQ0KLXZvaWQgZ2xWZXJ0ZXhQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KLXZvaWQgZ2xWaWV3cG9ydCAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvanNyMjM5L2dsc3BlYy0xLjBleHQgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvanNyMjM5L2dsc3BlYy0xLjBleHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMTk3NTguLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtMS4wZXh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotR0xiaXRmaWVsZCBnbFF1ZXJ5TWF0cml4eE9FUyAoIEdMZml4ZWQgKm1hbnRpc3NhLCBHTGludCAqZXhwb25lbnQgKQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMSBiL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0OWE3ZjkuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtMS4xCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotdm9pZCBnbEJpbmRCdWZmZXIgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyICkNCi12b2lkIGdsQnVmZmVyRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UgKQ0KLXZvaWQgZ2xCdWZmZXJTdWJEYXRhICggR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQotdm9pZCBnbENsaXBQbGFuZWYgKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uICkNCi12b2lkIGdsQ2xpcFBsYW5leCAoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24gKQ0KLXZvaWQgZ2xDb2xvcjR1YiAoIEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEgKQ0KLXZvaWQgZ2xDb2xvclBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQotdm9pZCBnbERlbGV0ZUJ1ZmZlcnMgKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyApDQotdm9pZCBnbERyYXdFbGVtZW50cyAoIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgR0xpbnQgb2Zmc2V0ICkNCi12b2lkIGdsR2VuQnVmZmVycyAoIEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzICkNCi12b2lkIGdsR2V0Qm9vbGVhbnYgKCBHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zICkNCi12b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRDbGlwUGxhbmVmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICplcW4gKQ0KLXZvaWQgZ2xHZXRDbGlwUGxhbmV4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICplcW4gKQ0KLXZvaWQgZ2xHZXRGaXhlZHYgKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQotdm9pZCBnbEdldEZsb2F0diAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCi12b2lkIGdsR2V0TGlnaHRmdiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRMaWdodHh2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQotdm9pZCBnbEdldE1hdGVyaWFsZnYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRNYXRlcmlhbHh2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkNCi12b2lkIGdsR2V0VGV4RW52aXYgKCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRUZXhFbnZ4diAoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkNCi12b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApDQotdm9pZCBnbEdldFRleFBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCi12b2lkIGdsR2V0VGV4UGFyYW1ldGVyeHYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQotR0xib29sZWFuIGdsSXNCdWZmZXIgKCBHTHVpbnQgYnVmZmVyICkNCi1HTGJvb2xlYW4gZ2xJc0VuYWJsZWQgKCBHTGVudW0gY2FwICkNCi1HTGJvb2xlYW4gZ2xJc1RleHR1cmUgKCBHTHVpbnQgdGV4dHVyZSApDQotdm9pZCBnbE5vcm1hbFBvaW50ZXIgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQotdm9pZCBnbFBvaW50UGFyYW1ldGVyZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQotdm9pZCBnbFBvaW50UGFyYW1ldGVyZnYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQotdm9pZCBnbFBvaW50UGFyYW1ldGVyeCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQotdm9pZCBnbFBvaW50UGFyYW1ldGVyeHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQotdm9pZCBnbFBvaW50U2l6ZVBvaW50ZXJPRVMgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQotdm9pZCBnbFRleENvb3JkUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCi12b2lkIGdsVGV4RW52aSAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KLXZvaWQgZ2xUZXhFbnZpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApDQotdm9pZCBnbFRleFBhcmFtZXRlcmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xUZXhQYXJhbWV0ZXJpICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApDQotdm9pZCBnbFRleFBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICkNCi12b2lkIGdsVGV4UGFyYW1ldGVyeHYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQotdm9pZCBnbFZlcnRleFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtMS4xZXh0IGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtMS4xZXh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzA4YzczNS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvanNyMjM5L2dsc3BlYy0xLjFleHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi12b2lkIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMgKCBHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4ICkNCi12b2lkIGdsRHJhd1RleGZPRVMgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCApDQotdm9pZCBnbERyYXdUZXhmdk9FUyAoIGNvbnN0IEdMZmxvYXQgKmNvb3JkcyApDQotdm9pZCBnbERyYXdUZXhpT0VTICggR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCApDQotdm9pZCBnbERyYXdUZXhpdk9FUyAoIGNvbnN0IEdMaW50ICpjb29yZHMgKQ0KLXZvaWQgZ2xEcmF3VGV4c09FUyAoIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0ICkNCi12b2lkIGdsRHJhd1RleHN2T0VTICggY29uc3QgR0xzaG9ydCAqY29vcmRzICkNCi12b2lkIGdsRHJhd1RleHhPRVMgKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCApDQotdm9pZCBnbERyYXdUZXh4dk9FUyAoIGNvbnN0IEdMZml4ZWQgKmNvb3JkcyApDQotdm9pZCBnbEVuYWJsZSAoIEdMZW51bSBjYXAgKQ0KLXZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZSAoIEdMZW51bSBhcnJheSApDQotdm9pZCBnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyAoIHZvaWQgKQ0KLXZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQotdm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCi12b2lkIGdsV2VpZ2h0UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCi12b2lkIGdsV2VpZ2h0UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvanNyMjM5L2dsc3BlYy0xLjFleHRwYWNrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtMS4xZXh0cGFjawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwMTJkOS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvanNyMjM5L2dsc3BlYy0xLjFleHRwYWNrCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotdm9pZCBnbEJpbmRGcmFtZWJ1ZmZlck9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgZnJhbWVidWZmZXIgKQotdm9pZCBnbEJpbmRSZW5kZXJidWZmZXJPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IHJlbmRlcmJ1ZmZlciApCi12b2lkIGdsQmluZFRleHR1cmUgKCBHTGludCB0YXJnZXQsIEdMaW50IHRleHR1cmUgKQotdm9pZCBnbEJsZW5kRXF1YXRpb24gKCBHTGludCBtb2RlICkKLXZvaWQgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKCBHTGludCBtb2RlUkdCLCBHTGludCBtb2RlQWxwaGEgKQotdm9pZCBnbEJsZW5kRnVuY1NlcGFyYXRlICggR0xpbnQgc3JjUkdCLCBHTGludCBkc3RSR0IsIEdMaW50IHNyY0FscGhhLCBHTGludCBkc3RBbHBoYSApCi1HTGludCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgKCBHTGludCB0YXJnZXQgKQotdm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApCi12b2lkIGdsQ29weVRleEltYWdlMkQgKCBHTGludCB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwgR0xpbnQgYm9yZGVyICkKLXZvaWQgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTHVpbnQgKmZyYW1lYnVmZmVycyApCi12b2lkIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMdWludCAqcmVuZGVyYnVmZmVycyApCi12b2lkIGdsRW5hYmxlICggR0xpbnQgY2FwICkKLXZvaWQgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgcmVuZGVyYnVmZmVydGFyZ2V0LCBHTGludCByZW5kZXJidWZmZXIgKQotdm9pZCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBhdHRhY2htZW50LCBHTGludCB0ZXh0YXJnZXQsIEdMaW50IHRleHR1cmUsIEdMaW50IGxldmVsICkKLXZvaWQgZ2xHZW5lcmF0ZU1pcG1hcE9FUyAoIEdMaW50IHRhcmdldCApCi12b2lkIGdsR2VuRnJhbWVidWZmZXJzT0VTICggR0xpbnQgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMgKQotdm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMgKQotdm9pZCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBhdHRhY2htZW50LCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCi12b2lkIGdsR2V0SW50ZWdlcnYgKCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCi12b2lkIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRUZXhHZW5mdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRUZXhHZW5pdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCi12b2lkIGdsR2V0VGV4R2VueHYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQotR0xib29sZWFuIGdsSXNGcmFtZWJ1ZmZlck9FUyAoIEdMaW50IGZyYW1lYnVmZmVyICkKLUdMYm9vbGVhbiBnbElzUmVuZGVyYnVmZmVyT0VTICggR0xpbnQgcmVuZGVyYnVmZmVyICkKLXZvaWQgZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCApCi12b2lkIGdsU3RlbmNpbE9wICggR0xpbnQgZmFpbCwgR0xpbnQgemZhaWwsIEdMaW50IHpwYXNzICkKLXZvaWQgZ2xUZXhFbnZmICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCi12b2lkIGdsVGV4RW52ZnYgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQotdm9pZCBnbFRleEVudnggKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGludCBwYXJhbSApCi12b2lkIGdsVGV4RW52eHYgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKLXZvaWQgZ2xUZXhHZW5mICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKLXZvaWQgZ2xUZXhHZW5mdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKLXZvaWQgZ2xUZXhHZW5pICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCBwYXJhbSApCi12b2lkIGdsVGV4R2VuaXYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbFRleEdlbnggKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50IHBhcmFtICkKLXZvaWQgZ2xUZXhHZW54diAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCi12b2lkIGdsVGV4UGFyYW1ldGVyZiAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtY2hlY2tzIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtY2hlY2tzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjhhNzkzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLWNoZWNrcworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLWdsQ2xpcFBsYW5lZiBjaGVjayBlcXVhdGlvbiA0Ci1nbENsaXBQbGFuZXggY2hlY2sgZXF1YXRpb24gNAotZ2xEZWxldGVCdWZmZXJzIGNoZWNrIGJ1ZmZlcnMgbgotZ2xEZWxldGVUZXh0dXJlcyBjaGVjayB0ZXh0dXJlcyBuCi1nbERyYXdFbGVtZW50cyBjaGVja19BSU9PQkUgaW5kaWNlcyBjb3VudAotZ2xGb2cgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9GT0dfTU9ERSxHTF9GT0dfREVOU0lUWSxHTF9GT0dfU1RBUlQsR0xfRk9HX0VORCBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0ZPR19DT0xPUgotZ2xHZW5CdWZmZXJzIGNoZWNrIGJ1ZmZlcnMgbgotZ2xHZW5UZXh0dXJlcyBjaGVjayB0ZXh0dXJlcyBuCi1nbEdldENsaXBQbGFuZSBjaGVjayBlcW4gNAotZ2xHZXRJbnRlZ2VydiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX0FMUEhBX0JJVFMsR0xfQUxQSEFfVEVTVF9GVU5DLEdMX0FMUEhBX1RFU1RfUkVGLEdMX0JMRU5EX0RTVCxHTF9CTFVFX0JJVFMsR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfQ09MT1JfQVJSQVlfU0laRSxHTF9DT0xPUl9BUlJBWV9TVFJJREUsR0xfQ09MT1JfQVJSQVlfVFlQRSxHTF9DVUxMX0ZBQ0UsR0xfREVQVEhfQklUUyxHTF9ERVBUSF9DTEVBUl9WQUxVRSxHTF9ERVBUSF9GVU5DLEdMX0RFUFRIX1dSSVRFTUFTSyxHTF9GT0dfREVOU0lUWSxHTF9GT0dfRU5ELEdMX0ZPR19NT0RFLEdMX0ZPR19TVEFSVCxHTF9GUk9OVF9GQUNFLEdMX0dSRUVOX0JJVFMsR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTLEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMsR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTCxHTF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVIsR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsR0xfTElORV9TTU9PVEhfSElOVCxHTF9MSU5FX1dJRFRILEdMX0xPR0lDX09QX01PREUsR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9PRVMsR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9PRVMsR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTLEdMX01BVFJJWF9NT0RFLEdMX01BWF9DTElQX1BMQU5FUyxHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyxHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMsR0xfTUFYX0xJR0hUUyxHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRILEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX09FUyxHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCxHTF9NQVhfVEVYVFVSRV9TSVpFLEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRILEdMX01BWF9URVhUVVJFX1VOSVRTLEdMX01BWF9WRVJURVhfVU5JVFNfT0VTLEdMX01PREVMVklFV19TVEFDS19ERVBUSCxHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfTk9STUFMX0FSUkFZX1NUUklERSxHTF9OT1JNQUxfQVJSQVlfVFlQRSxHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsR0xfUEFDS19BTElHTk1FTlQsR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULEdMX1BPSU5UX1NJWkUsR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsR0xfUE9JTlRfU0laRV9BUlJBWV9TVFJJREVfT0VTLEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMsR0xfUE9JTlRfU01PT1RIX0hJTlQsR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SLEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTLEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgsR0xfUkVEX0JJVFMsR0xfU0hBREVfTU9ERUwsR0xfU1RFTkNJTF9CSVRTLEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUsR0xfU1RFTkNJTF9GQUlMLEdMX1NURU5DSUxfRlVOQyxHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCxHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyxHTF9TVEVOQ0lMX1JFRixHTF9TVEVOQ0lMX1ZBTFVFX01BU0ssR0xfU1RFTkNJTF9XUklURU1BU0ssR0xfU1VCUElYRUxfQklUUyxHTF9URVhUVVJFX0JJTkRJTkdfMkQsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFLEdMX1RFWFRVUkVfU1RBQ0tfREVQVEgsR0xfVU5QQUNLX0FMSUdOTUVOVCxHTF9WRVJURVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfVkVSVEVYX0FSUkFZX1NJWkUsR0xfVkVSVEVYX0FSUkFZX1NUUklERSxHTF9WRVJURVhfQVJSQVlfVFlQRSxHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTLEdMX1dFSUdIVF9BUlJBWV9TSVpFX09FUyxHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUyxHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVMgaWZjaGVjayBwYXJhbXMgMiBwbmFtZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UsR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFLEdMX0RFUFRIX1JBTkdFLEdMX01BWF9WSUVXUE9SVF9ESU1TLEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFLEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQ09MT1JfQ0xFQVJfVkFMVUUsR0xfQ09MT1JfV1JJVEVNQVNLLEdMX0ZPR19DT0xPUixHTF9MSUdIVF9NT0RFTF9BTUJJRU5ULEdMX1NDSVNTT1JfQk9YLEdMX1ZJRVdQT1JUIGlmY2hlY2sgcGFyYW1zIDE2IHBuYW1lIEdMX01PREVMVklFV19NQVRSSVgsR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMsR0xfUFJPSkVDVElPTl9NQVRSSVgsR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTLEdMX1RFWFRVUkVfTUFUUklYLEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyBpZmNoZWNrIHBhcmFtcyBnZXROdW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKSBwbmFtZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUwotZ2xHZXRMaWdodCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NQT1RfRVhQT05FTlQsR0xfU1BPVF9DVVRPRkYsR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sR0xfTElORUFSX0FUVEVOVUFUSU9OLEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiBpZmNoZWNrIHBhcmFtcyAzIHBuYW1lIEdMX1NQT1RfRElSRUNUSU9OIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9OCi1nbEdldE1hdGVyaWFsIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU0hJTklORVNTIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9OLEdMX0FNQklFTlRfQU5EX0RJRkZVU0UKLWdsR2V0VGV4RW52IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfVEVYVFVSRV9FTlZfTU9ERSxHTF9DT01CSU5FX1JHQixHTF9DT01CSU5FX0FMUEhBIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfVEVYVFVSRV9FTlZfQ09MT1IKLWdsR2V0VGV4UGFyYW1ldGVyIGNoZWNrIHBhcmFtcyAxCi1nbExpZ2h0TW9kZWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0xJR0hUX01PREVMX0FNQklFTlQKLWdsTGlnaHQgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TUE9UX0VYUE9ORU5ULEdMX1NQT1RfQ1VUT0ZGLEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OLEdMX0xJTkVBUl9BVFRFTlVBVElPTixHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gaWZjaGVjayBwYXJhbXMgMyBwbmFtZSBHTF9TUE9UX0RJUkVDVElPTiBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0FNQklFTlQsR0xfRElGRlVTRSxHTF9TUEVDVUxBUixHTF9FTUlTU0lPTgotZ2xMb2FkTWF0cml4IGNoZWNrIG0gMTYKLWdsTWF0ZXJpYWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TSElOSU5FU1MgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04sR0xfQU1CSUVOVF9BTkRfRElGRlVTRQotZ2xNdWx0TWF0cml4IGNoZWNrIG0gMTYKLWdsUG9pbnRQYXJhbWV0ZXIgY2hlY2sgcGFyYW1zIDEKLWdsVGV4RW52IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfVEVYVFVSRV9FTlZfTU9ERSxHTF9DT01CSU5FX1JHQixHTF9DT01CSU5FX0FMUEhBIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfVEVYVFVSRV9FTlZfQ09MT1IKLWdsVGV4SW1hZ2UyRCBudWxsQWxsb3dlZAotZ2xUZXhTdWJJbWFnZTJEIG51bGxBbGxvd2VkCi1nbEJ1ZmZlckRhdGEgbnVsbEFsbG93ZWQgY2hlY2sgZGF0YSBzaXplCi1nbEJ1ZmZlclN1YkRhdGEgY2hlY2sgZGF0YSBzaXplCi1nbFRleFBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQotZ2xRdWVyeU1hdHJpeHhPRVMgY2hlY2sgbWFudGlzc2EgMTYgY2hlY2sgZXhwb25lbnQgMTYgcmV0dXJuIC0xCi1nbERyYXdUZXhmdk9FUyBjaGVjayBjb29yZHMgNQotZ2xEcmF3VGV4aXZPRVMgY2hlY2sgY29vcmRzIDUKLWdsRHJhd1RleHN2T0VTIGNoZWNrIGNvb3JkcyA1Ci1nbERyYXdUZXh4dk9FUyBjaGVjayBjb29yZHMgNQotZ2xCaW5kRnJhbWVidWZmZXJPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdAotZ2xCaW5kUmVuZGVyYnVmZmVyT0VTIHJlcXVpcmVzIE9FU19mcmFtZWJ1ZmZlcl9vYmplY3QKLWdsQmxlbmRFcXVhdGlvbiByZXF1aXJlcyBPRVNfYmxlbmRfc3VidHJhY3QKLWdsQmxlbmRFcXVhdGlvblNlcGFyYXRlIHJlcXVpcmVzIE9FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQotZ2xCbGVuZEZ1bmNTZXBhcmF0ZSByZXF1aXJlcyBPRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKLWdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyByZXF1aXJlcyBPRVNfZnJhbWVidWZmZXJfb2JqZWN0IHJldHVybiAwCi1nbERlbGV0ZUZyYW1lYnVmZmVyc09FUyByZXF1aXJlcyBPRVNfZnJhbWVidWZmZXJfb2JqZWN0IGNoZWNrIGZyYW1lYnVmZmVycyBuCi1nbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdCBjaGVjayByZW5kZXJidWZmZXJzIG4KLWdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdAotZ2xGcmFtZWJ1ZmZlclN0b3JhZ2VPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdAotZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyByZXF1aXJlcyBPRVNfZnJhbWVidWZmZXJfb2JqZWN0Ci1nbEdlbkZyYW1lYnVmZmVyc09FUyByZXF1aXJlcyBPRVNfZnJhbWVidWZmZXJfb2JqZWN0IGNoZWNrIGZyYW1lYnVmZmVycyBuCi1nbEdlblJlbmRlcmJ1ZmZlcnNPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdCBjaGVjayByZW5kZXJidWZmZXJzIG4KLWdsR2VuZXJhdGVNaXBtYXBPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdAotZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyByZXF1aXJlcyBPRVNfZnJhbWVidWZmZXJfb2JqZWN0Ci1nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTIHJlcXVpcmVzIE9FU19mcmFtZWJ1ZmZlcl9vYmplY3QKLWdsSXNGcmFtZWJ1ZmZlck9FUyByZXF1aXJlcyBPRVNfZnJhbWVidWZmZXJfb2JqZWN0IHJldHVybiBKTklfRkFMU0UKLWdsSXNSZW5kZXJidWZmZXJPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdCByZXR1cm4gSk5JX0ZBTFNFCi1nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdAotZ2xHZXRUZXhHZW4gcmVxdWlyZXMgT0VTX3RleHR1cmVfY3ViZV9tYXAKLWdsVGV4R2VuIHJlcXVpcmVzIE9FU190ZXh0dXJlX2N1YmVfbWFwCi1nbFRleEdlbmYgcmVxdWlyZXMgT0VTX3RleHR1cmVfY3ViZV9tYXAKLWdsVGV4R2VuaSByZXF1aXJlcyBPRVNfdGV4dHVyZV9jdWJlX21hcAotZ2xUZXhHZW54IHJlcXVpcmVzIE9FU190ZXh0dXJlX2N1YmVfbWFwCi1nbEdldEJ1ZmZlclBhcmFtZXRlciB1bnN1cHBvcnRlZApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy8uZ2l0aWdub3JlIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjQ2OGI2Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSouY2xhc3MKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ0Z1bmMuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ0Z1bmMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0NzY5NC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NGdW5jLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIENGdW5jIHsKLQotICAgIFN0cmluZyBvcmlnaW5hbDsKLQotICAgIENUeXBlIGZ0eXBlOwotICAgIFN0cmluZyBmbmFtZTsKLQotICAgIExpc3Q8U3RyaW5nPiBhcmdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIExpc3Q8Q1R5cGU+IGFyZ1R5cGVzID0gbmV3IEFycmF5TGlzdDxDVHlwZT4oKTsKLQotICAgIGJvb2xlYW4gaGFzUG9pbnRlckFyZyA9IGZhbHNlOwotICAgIGJvb2xlYW4gaGFzVHlwZWRQb2ludGVyQXJnID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgQ0Z1bmMoU3RyaW5nIG9yaWdpbmFsKSB7Ci0gICAgICAgIHRoaXMub3JpZ2luYWwgPSBvcmlnaW5hbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9yaWdpbmFsKCkgewotICAgICAgICByZXR1cm4gb3JpZ2luYWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgZm5hbWUpIHsKLSAgICAgICAgdGhpcy5mbmFtZSA9IGZuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoQ1R5cGUgZnR5cGUpIHsKLSAgICAgICAgdGhpcy5mdHlwZSA9IGZ0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBDVHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gZnR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQXJndW1lbnQoU3RyaW5nIGFyZ05hbWUsIENUeXBlIGFyZ1R5cGUpIHsKLSAgICAgICAgYXJnTmFtZXMuYWRkKGFyZ05hbWUpOwotICAgICAgICBhcmdUeXBlcy5hZGQoYXJnVHlwZSk7Ci0KLSAgICAgICAgaWYgKGFyZ1R5cGUuaXNQb2ludGVyKCkpIHsKLSAgICAgICAgICAgIGhhc1BvaW50ZXJBcmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcmdUeXBlLmlzVHlwZWRQb2ludGVyKCkpIHsKLSAgICAgICAgICAgIGhhc1R5cGVkUG9pbnRlckFyZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE51bUFyZ3MoKSB7Ci0gICAgICAgIHJldHVybiBhcmdOYW1lcy5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBcmdJbmRleChTdHJpbmcgbmFtZSkgewotICAgICAgICBpbnQgbGVuID0gYXJnTmFtZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoYXJnTmFtZXMuZ2V0KGkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFyZ05hbWUoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBhcmdOYW1lcy5nZXQoaW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDVHlwZSBnZXRBcmdUeXBlKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gYXJnVHlwZXMuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQb2ludGVyQXJnKCkgewotICAgICAgICByZXR1cm4gaGFzUG9pbnRlckFyZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUeXBlZFBvaW50ZXJBcmcoKSB7Ci0gICAgICAgIHJldHVybiBoYXNUeXBlZFBvaW50ZXJBcmc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHMgPSAgIkZ1bmN0aW9uICIgKyBmbmFtZSArICIgcmV0dXJucyAiICsgZnR5cGUgKyAiOiAiOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ05hbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBzICs9ICIsICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzICs9IGFyZ1R5cGVzLmdldChpKSArICIgIiArIGFyZ05hbWVzLmdldChpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENGdW5jIHBhcnNlQ0Z1bmMoU3RyaW5nIHMpIHsKLSAgICAgICAgQ0Z1bmMgY2Z1bmMgPSBuZXcgQ0Z1bmMocyk7Ci0gICAgICAgIFN0cmluZ1tdIHRva2VucyA9IHMuc3BsaXQoIlxccyIpOwotCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgQ1R5cGUgZnR5cGUgPSBuZXcgQ1R5cGUoKTsKLSAgICAgICAgU3RyaW5nIGZ0eXBlTmFtZSA9IHRva2Vuc1tpKytdOwotICAgICAgICBpZiAoZnR5cGVOYW1lLmVxdWFscygiY29uc3QiKSkgewotICAgICAgICAgICAgZnR5cGUuc2V0SXNDb25zdCh0cnVlKTsKLSAgICAgICAgICAgIGZ0eXBlTmFtZSA9IHRva2Vuc1tpKytdOwotICAgICAgICB9Ci0gICAgICAgIGZ0eXBlLnNldEJhc2VUeXBlKGZ0eXBlTmFtZSk7Ci0KLSAgICAgICAgU3RyaW5nIGZuYW1lID0gdG9rZW5zW2krK107Ci0gICAgICAgIGlmIChmbmFtZS5lcXVhbHMoIioiKSkgewotICAgICAgICAgICAgZnR5cGUuc2V0SXNQb2ludGVyKHRydWUpOwotICAgICAgICAgICAgZm5hbWUgPSB0b2tlbnNbaSsrXTsKLSAgICAgICAgfQotCi0gICAgICAgIGNmdW5jLnNldE5hbWUoZm5hbWUpOwotICAgICAgICBjZnVuYy5zZXRUeXBlKGZ0eXBlKTsKLQotICAgICAgICB3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLSAgICAgICAgICAgIFN0cmluZyB0b2sgPSB0b2tlbnNbaSsrXTsKLQotICAgICAgICAgICAgaWYgKHRvay5lcXVhbHMoIigiKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRvay5lcXVhbHMoIikiKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDVHlwZSBhcmdUeXBlID0gbmV3IENUeXBlKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBhcmdUeXBlTmFtZSA9IHRvazsKLSAgICAgICAgICAgIFN0cmluZyBhcmdOYW1lID0gIiI7Ci0KLSAgICAgICAgICAgIGlmIChhcmdUeXBlTmFtZS5lcXVhbHMoImNvbnN0IikpIHsKLSAgICAgICAgICAgICAgICBhcmdUeXBlLnNldElzQ29uc3QodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYXJnVHlwZU5hbWUgPSB0b2tlbnNbaSsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ1R5cGUuc2V0QmFzZVR5cGUoYXJnVHlwZU5hbWUpOwotCi0gICAgICAgICAgICBpZiAoYXJnVHlwZU5hbWUuZXF1YWxzKCJ2b2lkIikpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXJnTmFtZSA9IHRva2Vuc1tpKytdOwotICAgICAgICAgICAgaWYgKGFyZ05hbWUuc3RhcnRzV2l0aCgiKiIpKSB7Ci0gICAgICAgICAgICAgICAgYXJnVHlwZS5zZXRJc1BvaW50ZXIodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYXJnTmFtZSA9IGFyZ05hbWUuc3Vic3RyaW5nKDEsIGFyZ05hbWUubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFyZ05hbWUuZW5kc1dpdGgoIiwiKSkgewotICAgICAgICAgICAgICAgIGFyZ05hbWUgPSBhcmdOYW1lLnN1YnN0cmluZygwLCBhcmdOYW1lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNmdW5jLmFkZEFyZ3VtZW50KGFyZ05hbWUsIGFyZ1R5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNmdW5jOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ1R5cGUuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmMGNhNi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXB1YmxpYyBjbGFzcyBDVHlwZSB7Ci0KLSAgICBTdHJpbmcgYmFzZVR5cGU7Ci0gICAgYm9vbGVhbiBpc0NvbnN0OwotICAgIGJvb2xlYW4gaXNQb2ludGVyOwotCi0gICAgcHVibGljIENUeXBlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBDVHlwZShTdHJpbmcgYmFzZVR5cGUpIHsKLSAgICBzZXRCYXNlVHlwZShiYXNlVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENUeXBlKFN0cmluZyBiYXNlVHlwZSwgYm9vbGVhbiBpc0NvbnN0LCBib29sZWFuIGlzUG9pbnRlcikgewotICAgIHNldEJhc2VUeXBlKGJhc2VUeXBlKTsKLSAgICBzZXRJc0NvbnN0KGlzQ29uc3QpOwotICAgIHNldElzUG9pbnRlcihpc1BvaW50ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyYXRpb24oKSB7Ci0gICAgcmV0dXJuIGJhc2VUeXBlICsgKGlzUG9pbnRlciA/ICIgKiIgOiAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNDb25zdChib29sZWFuIGlzQ29uc3QpIHsKLSAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29uc3QoKSB7Ci0gICAgcmV0dXJuIGlzQ29uc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNQb2ludGVyKGJvb2xlYW4gaXNQb2ludGVyKSB7Ci0gICAgdGhpcy5pc1BvaW50ZXIgPSBpc1BvaW50ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQb2ludGVyKCkgewotICAgIHJldHVybiBpc1BvaW50ZXI7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1ZvaWQoKSB7Ci0gICAgU3RyaW5nIGJhc2VUeXBlID0gZ2V0QmFzZVR5cGUoKTsKLSAgICByZXR1cm4gYmFzZVR5cGUuZXF1YWxzKCJHTHZvaWQiKSB8fAotICAgICAgICBiYXNlVHlwZS5lcXVhbHMoInZvaWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN0Q2hhclBvaW50ZXIoKSB7Ci0gICAgICAgIHJldHVybiBpc0NvbnN0ICYmIGlzUG9pbnRlciAmJiBiYXNlVHlwZS5lcXVhbHMoImNoYXIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVkUG9pbnRlcigpIHsKLSAgICByZXR1cm4gaXNQb2ludGVyKCkgJiYgIWlzVm9pZCgpICYmICFpc0NvbnN0Q2hhclBvaW50ZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlVHlwZShTdHJpbmcgYmFzZVR5cGUpIHsKLSAgICB0aGlzLmJhc2VUeXBlID0gYmFzZVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVHlwZSgpIHsKLSAgICByZXR1cm4gYmFzZVR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICBTdHJpbmcgcyA9ICIiOwotICAgIGlmIChpc0NvbnN0KCkpIHsKLSAgICAgICAgcyArPSAiY29uc3QgIjsKLSAgICB9Ci0gICAgcyArPSBiYXNlVHlwZTsKLSAgICBpZiAoaXNQb2ludGVyKCkpIHsKLSAgICAgICAgcyArPSAiKiI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gYmFzZVR5cGUuaGFzaENvZGUoKSBeIChpc1BvaW50ZXIgPyAyIDogMCkgXiAoaXNDb25zdCA/IDEgOiAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICBpZiAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBDVHlwZSkgewotICAgICAgICBDVHlwZSBjID0gKENUeXBlKW87Ci0gICAgICAgIHJldHVybiBiYXNlVHlwZS5lcXVhbHMoYy5iYXNlVHlwZSkgJiYKLSAgICAgICAgaXNQb2ludGVyKCkgPT0gYy5pc1BvaW50ZXIoKSAmJgotICAgICAgICBpc0NvbnN0KCkgPT0gYy5pc0NvbnN0KCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NvZGVFbWl0dGVyLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NvZGVFbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDgzNGUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Db2RlRW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29kZUVtaXR0ZXIgewotCi0gICAgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uLCBib29sZWFuIGV4dCwgYm9vbGVhbiBwYWNrKTsKLSAgICB2b2lkIGVtaXRDb2RlKENGdW5jIGNmdW5jLCBTdHJpbmcgb3JpZ2luYWwpOwotICAgIHZvaWQgYWRkTmF0aXZlUmVnaXN0cmF0aW9uKFN0cmluZyBmbmFtZSk7Ci0gICAgdm9pZCBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0dMRVNDb2RlRW1pdHRlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HTEVTQ29kZUVtaXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzODI1MC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0dMRVNDb2RlRW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi0vKioKLSAqIEVtaXRzIGEgSmF2YSBpbnRlcmZhY2UgYW5kIEphdmEgJiBDIGltcGxlbWVudGF0aW9uIGZvciBhIEMgZnVuY3Rpb24uCi0gKgotICogPHA+IFRoZSBKYXZhIGludGVyZmFjZSB3aWxsIGhhdmUgQnVmZmVyIGFuZCBhcnJheSB2YXJpYW50cyBmb3IgZnVuY3Rpb25zIHRoYXQKLSAqIGhhdmUgYSB0eXBlZCBwb2ludGVyIGFyZ3VtZW50LiAgVGhlIGFycmF5IHZhcmlhbnQgd2lsbCBjb252ZXJ0IGEgc2luZ2xlICI8dHlwZT4gKmRhdGEiCi0gKiBhcmd1bWVudCB0byBhIHBhaXIgb2YgYXJndW1lbnRzICI8dHlwZT5bXSBkYXRhLCBpbnQgb2Zmc2V0Ii4KLSAqLwotcHVibGljIGNsYXNzIEdMRVNDb2RlRW1pdHRlciBleHRlbmRzIEpuaUNvZGVFbWl0dGVyIHsKLQotICAgIFByaW50U3RyZWFtIG1KYXZhSW1wbFN0cmVhbTsKLSAgICBQcmludFN0cmVhbSBtQ1N0cmVhbTsKLQotICAgIFByaW50U3RyZWFtIG1KYXZhSW50ZXJmYWNlU3RyZWFtOwotCi0gICAgLyoqCi0gICAgICAqLwotICAgIHB1YmxpYyBHTEVTQ29kZUVtaXR0ZXIoU3RyaW5nIGNsYXNzUGF0aE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckNoZWNrZXIgY2hlY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YUltcGxTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0pIHsKLSAgICAgICAgbUNsYXNzUGF0aE5hbWUgPSBjbGFzc1BhdGhOYW1lOwotICAgICAgICBtQ2hlY2tlciA9IGNoZWNrZXI7Ci0KLSAgICAgICAgbUphdmFJbXBsU3RyZWFtID0gamF2YUltcGxTdHJlYW07Ci0gICAgICAgIG1DU3RyZWFtID0gY1N0cmVhbTsKLSAgICAgICAgbVVzZUNvbnRleHRQb2ludGVyID0gZmFsc2U7Ci0gICAgICAgIG1Vc2VTdGF0aWNNZXRob2RzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbWl0Q29kZShDRnVuYyBjZnVuYywgU3RyaW5nIG9yaWdpbmFsKSB7Ci0gICAgICAgIGVtaXRDb2RlKGNmdW5jLCBvcmlnaW5hbCwgbnVsbCwgbUphdmFJbXBsU3RyZWFtLAotICAgICAgICAgICAgICAgIG1DU3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKFN0cmluZyBuYXRpdmVSZWdpc3RyYXRpb25OYW1lKSB7Ci0gICAgICAgIGVtaXROYXRpdmVSZWdpc3RyYXRpb24obmF0aXZlUmVnaXN0cmF0aW9uTmFtZSwgbUNTdHJlYW0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTC5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HZW5lcmF0ZUdMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMGNmMGIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HZW5lcmF0ZUdMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEdlbmVyYXRlR0wgewotCi0gICAgc3RhdGljIHZvaWQgY29weShTdHJpbmcgZmlsZW5hbWUsIFByaW50U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZW5hbWUpKTsKLSAgICAgICAgU3RyaW5nIHM7Ci0gICAgICAgIHdoaWxlICgocyA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbWl0KGludCB2ZXJzaW9uLCBib29sZWFuIGV4dCwgYm9vbGVhbiBwYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlRW1pdHRlciBlbWl0dGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBnbFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gZ2xJbXBsU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHMgPSBudWxsOwotICAgICAgICB3aGlsZSAoKHMgPSBzcGVjUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzLnRyaW0oKS5zdGFydHNXaXRoKCIvLyIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENGdW5jIGNmdW5jID0gQ0Z1bmMucGFyc2VDRnVuYyhzKTsKLQotICAgICAgICAgICAgU3RyaW5nIGZuYW1lID0gY2Z1bmMuZ2V0TmFtZSgpOwotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoInN0dWJzL2pzcjIzOS8iICsgZm5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5qYXZhLTEiICsgdmVyc2lvbiArICItaWYiKTsKLSAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTcGVjaWFsLWNhc2luZyBmdW5jdGlvbiAiICsgZm5hbWUpOwotICAgICAgICAgICAgICAgIGNvcHkoInN0dWJzL2pzcjIzOS8iICsgZm5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgIi5qYXZhLTEiICsgdmVyc2lvbiArICItaWYiLCBnbFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgY29weSgic3R1YnMvanNyMjM5LyIgKyBmbmFtZSArICIuamF2YS1pbXBsIiwgZ2xJbXBsU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBjb3B5KCJzdHVicy9qc3IyMzkvIiArIGZuYW1lICsgIi5jcHAiLCBjU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIG5hdGl2ZSBmdW5jdGlvbiBuYW1lcwotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGltcHJvdmVkIHRvIHJlcXVpcmUgZmV3ZXIgZGlzY3JldGUgZmlsZXMKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSAic3R1YnMvanNyMjM5LyIgKyBmbmFtZSArICIubmF0aXZlUmVnIjsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlbmFtZSkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuZnVuYzsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKG5mdW5jID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlbWl0dGVyLmFkZE5hdGl2ZVJlZ2lzdHJhdGlvbihuZnVuYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbWl0dGVyLnNldFZlcnNpb24odmVyc2lvbiwgZXh0LCBwYWNrKTsKLSAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXRDb2RlKGNmdW5jLCBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY2xhc3NQYXRoTmFtZSA9ICJjb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsIjsKLSAgICAgICAgYm9vbGVhbiB1c2VDb250ZXh0UG9pbnRlciA9IHRydWU7Ci0KLSAgICAgICAgaW50IGFpZHggPSAwOwotICAgICAgICB3aGlsZSAoYXJnc1thaWR4XS5jaGFyQXQoMCkgPT0gJy0nKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGFyZ3NbYWlkeF0uY2hhckF0KDEpKSB7Ci0gICAgICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICAgICAgICB1c2VDb250ZXh0UG9pbnRlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5rbm93biBmbGFnOiAiICsgYXJnc1thaWR4XSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFpZHgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidXNlQ29udGV4dFBvaW50ZXIgPSAiICsgdXNlQ29udGV4dFBvaW50ZXIpOwotCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMFJlYWRlciA9Ci0gICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMEV4dFJlYWRlciA9Ci0gICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMVJlYWRlciA9Ci0gICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMUV4dFJlYWRlciA9Ci0gICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMUV4dFBhY2tSZWFkZXIgPQotICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBjaGVja3NSZWFkZXIgPQotICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOwotCi0gICAgICAgIFN0cmluZyBnbDEwRmlsZW5hbWUgPSAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIjsKLSAgICAgICAgU3RyaW5nIGdsMTBFeHRGaWxlbmFtZSA9Ci0gICAgICAgICAgICAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIjsKLSAgICAgICAgU3RyaW5nIGdsMTFGaWxlbmFtZSA9ICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEiOwotICAgICAgICBTdHJpbmcgZ2wxMUV4dEZpbGVuYW1lID0KLSAgICAgICAgICAgICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEiOwotICAgICAgICBTdHJpbmcgZ2wxMUV4dFBhY2tGaWxlbmFtZSA9Ci0gICAgICAgICAgICAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YSI7Ci0gICAgICAgIFN0cmluZyBnbEltcGxGaWxlbmFtZSA9ICJjb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEiOwotICAgICAgICBTdHJpbmcgY0ZpbGVuYW1lID0gImNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIjsKLQotICAgICAgICBQcmludFN0cmVhbSBnbDEwU3RyZWFtID0KLSAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDEwRmlsZW5hbWUpKTsKLSAgICAgICAgUHJpbnRTdHJlYW0gZ2wxMEV4dFN0cmVhbSA9Ci0gICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMEV4dEZpbGVuYW1lKSk7Ci0gICAgICAgIFByaW50U3RyZWFtIGdsMTFTdHJlYW0gPQotICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsMTFGaWxlbmFtZSkpOwotICAgICAgICBQcmludFN0cmVhbSBnbDExRXh0U3RyZWFtID0KLSAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDExRXh0RmlsZW5hbWUpKTsKLSAgICAgICAgUHJpbnRTdHJlYW0gZ2wxMUV4dFBhY2tTdHJlYW0gPQotICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsMTFFeHRQYWNrRmlsZW5hbWUpKTsKLSAgICAgICAgUHJpbnRTdHJlYW0gZ2xJbXBsU3RyZWFtID0KLSAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbEltcGxGaWxlbmFtZSkpOwotICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtID0KLSAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBjRmlsZW5hbWUpKTsKLQotICAgICAgICBQYXJhbWV0ZXJDaGVja2VyIGNoZWNrZXIgPSBuZXcgUGFyYW1ldGVyQ2hlY2tlcihjaGVja3NSZWFkZXIpOwotCi0gICAgICAgIENvZGVFbWl0dGVyIGVtaXR0ZXIgPQotICAgICAgICAgICAgbmV3IEpzcjIzOUNvZGVFbWl0dGVyKGNsYXNzUGF0aE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbDEwU3RyZWFtLCBnbDEwRXh0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsMTFTdHJlYW0sIGdsMTFFeHRTdHJlYW0sIGdsMTFFeHRQYWNrU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VDb250ZXh0UG9pbnRlcik7Ci0KLSAgICAgICAgZ2wxMFN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTBGaWxlbmFtZSk7Ci0gICAgICAgIGdsMTBFeHRTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbDEwRXh0RmlsZW5hbWUpOwotICAgICAgICBnbDExU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2wxMUZpbGVuYW1lKTsKLSAgICAgICAgZ2wxMUV4dFN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTFFeHRGaWxlbmFtZSk7Ci0gICAgICAgIGdsMTFFeHRQYWNrU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsKLSAgICAgICAgICAgIGdsMTFFeHRQYWNrRmlsZW5hbWUpOwotICAgICAgICBnbEltcGxTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbEltcGxGaWxlbmFtZSk7Ci0gICAgICAgIGNTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvbGlicy9hbmRyb2lkX3J1bnRpbWUvIiArIGNGaWxlbmFtZSk7Ci0KLSAgICAgICAgY29weSgic3R1YnMvanNyMjM5L0dMMTBIZWFkZXIuamF2YS1pZiIsIGdsMTBTdHJlYW0pOwotICAgICAgICBjb3B5KCJzdHVicy9qc3IyMzkvR0wxMEV4dEhlYWRlci5qYXZhLWlmIiwgZ2wxMEV4dFN0cmVhbSk7Ci0gICAgICAgIGNvcHkoInN0dWJzL2pzcjIzOS9HTDExSGVhZGVyLmphdmEtaWYiLCBnbDExU3RyZWFtKTsKLSAgICAgICAgY29weSgic3R1YnMvanNyMjM5L0dMMTFFeHRIZWFkZXIuamF2YS1pZiIsIGdsMTFFeHRTdHJlYW0pOwotICAgICAgICBjb3B5KCJzdHVicy9qc3IyMzkvR0wxMUV4dGVuc2lvblBhY2tIZWFkZXIuamF2YS1pZiIsIGdsMTFFeHRQYWNrU3RyZWFtKTsKLSAgICAgICAgY29weSgic3R1YnMvanNyMjM5L0dMSW1wbEhlYWRlci5qYXZhLWltcGwiLCBnbEltcGxTdHJlYW0pOwotICAgICAgICBjb3B5KCJzdHVicy9qc3IyMzkvR0xDSGVhZGVyLmNwcCIsIGNTdHJlYW0pOwotCi0gICAgICAgIGVtaXQoMCwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMFJlYWRlciwgZ2wxMFN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsKLSAgICAgICAgZW1pdCgwLCB0cnVlLCBmYWxzZSwKLSAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTBFeHRSZWFkZXIsIGdsMTBFeHRTdHJlYW0sIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSk7Ci0gICAgICAgIGVtaXQoMSwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMVJlYWRlciwgZ2wxMVN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsKLSAgICAgICAgZW1pdCgxLCB0cnVlLCBmYWxzZSwKLSAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTFFeHRSZWFkZXIsIGdsMTFFeHRTdHJlYW0sIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSk7Ci0gICAgICAgIGVtaXQoMSwgdHJ1ZSwgdHJ1ZSwKLSAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTFFeHRQYWNrUmVhZGVyLCBnbDExRXh0UGFja1N0cmVhbSwgZ2xJbXBsU3RyZWFtLAotICAgICAgICAgICAgIGNTdHJlYW0pOwotCi0gICAgICAgIGVtaXR0ZXIuZW1pdE5hdGl2ZVJlZ2lzdHJhdGlvbigpOwotCi0gICAgICAgIGdsMTBTdHJlYW0ucHJpbnRsbigifSIpOwotICAgICAgICBnbDEwRXh0U3RyZWFtLnByaW50bG4oIn0iKTsKLSAgICAgICAgZ2wxMVN0cmVhbS5wcmludGxuKCJ9Iik7Ci0gICAgICAgIGdsMTFFeHRTdHJlYW0ucHJpbnRsbigifSIpOwotICAgICAgICBnbDExRXh0UGFja1N0cmVhbS5wcmludGxuKCJ9Iik7Ci0gICAgICAgIGdsSW1wbFN0cmVhbS5wcmludGxuKCJ9Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HZW5lcmF0ZUdMRVMuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTEVTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0Njg5NTcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HZW5lcmF0ZUdMRVMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVHTEVTIHsKLQotICAgIHN0YXRpYyB2b2lkIGNvcHkoU3RyaW5nIGZpbGVuYW1lLCBQcmludFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGVuYW1lKSk7Ci0gICAgICAgIFN0cmluZyBzOwotICAgICAgICB3aGlsZSAoKHMgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW1pdChHTEVTQ29kZUVtaXR0ZXIgZW1pdHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlY1JlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gZ2xTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcyA9IG51bGw7Ci0gICAgICAgIHdoaWxlICgocyA9IHNwZWNSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHMudHJpbSgpLnN0YXJ0c1dpdGgoIi8vIikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0Z1bmMgY2Z1bmMgPSBDRnVuYy5wYXJzZUNGdW5jKHMpOwotCi0gICAgICAgICAgICBTdHJpbmcgZm5hbWUgPSBjZnVuYy5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc3R1YlJvb3QgPSAic3R1YnMvZ2xlczExLyIgKyBmbmFtZTsKLSAgICAgICAgICAgIFN0cmluZyBqYXZhUGF0aCA9IHN0dWJSb290ICsgIi5qYXZhIjsKLSAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGphdmFQYXRoKTsKLSAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTcGVjaWFsLWNhc2luZyBmdW5jdGlvbiAiICsgZm5hbWUpOwotICAgICAgICAgICAgICAgIGNvcHkoamF2YVBhdGgsIGdsU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBjb3B5KHN0dWJSb290ICsgIi5jcHAiLCBjU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIG5hdGl2ZSBmdW5jdGlvbiBuYW1lcwotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGltcHJvdmVkIHRvIHJlcXVpcmUgZmV3ZXIgZGlzY3JldGUgZmlsZXMKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBzdHViUm9vdCArICIubmF0aXZlUmVnIjsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlbmFtZSkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuZnVuYzsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKG5mdW5jID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlbWl0dGVyLmFkZE5hdGl2ZVJlZ2lzdHJhdGlvbihuZnVuYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXRDb2RlKGNmdW5jLCBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgYWlkeCA9IDA7Ci0gICAgICAgIHdoaWxlICgoYWlkeCA8IGFyZ3MubGVuZ3RoKSAmJiAoYXJnc1thaWR4XS5jaGFyQXQoMCkgPT0gJy0nKSkgewotICAgICAgICAgICAgc3dpdGNoIChhcmdzW2FpZHhdLmNoYXJBdCgxKSkgewotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVua25vd24gZmxhZzogIiArIGFyZ3NbYWlkeF0pOwotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhaWR4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBCdWZmZXJlZFJlYWRlciBjaGVja3NSZWFkZXIgPQotICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKCJzcGVjcy9nbGVzMTEvY2hlY2tzLnNwZWMiKSk7Ci0gICAgICAgIFBhcmFtZXRlckNoZWNrZXIgY2hlY2tlciA9IG5ldyBQYXJhbWV0ZXJDaGVja2VyKGNoZWNrc1JlYWRlcik7Ci0KLSAgICAgICAgLy8gR2VuZXJhdGUgZmlsZXMKLSAgICAgICAgZm9yKFN0cmluZyBzdWZmaXg6IG5ldyBTdHJpbmdbXSB7IkdMRVMxMCIsICJHTEVTMTBFeHQiLAotICAgICAgICAgICAgICAgICJHTEVTMTEiLCAiR0xFUzExRXh0IiwgIkdMRVMyMCJ9KQotICAgICAgICB7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTFSZWFkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcigic3BlY3MvZ2xlczExLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc3VmZml4ICsgIi5zcGVjIikpOwotICAgICAgICAgICAgU3RyaW5nIGdsMTFGaWxlbmFtZSA9ICJhbmRyb2lkL29wZW5nbC8iICsgc3VmZml4ICsgIi5qYXZhIjsKLSAgICAgICAgICAgIFN0cmluZyBnbDExY0ZpbGVuYW1lID0gImFuZHJvaWRfb3BlbmdsXyIgKyBzdWZmaXggKyAiLmNwcCI7Ci0gICAgICAgICAgICBQcmludFN0cmVhbSBnbDExU3RyZWFtID0KLSAgICAgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMUZpbGVuYW1lKSk7Ci0gICAgICAgICAgICBQcmludFN0cmVhbSBnbDExY1N0cmVhbSA9Ci0gICAgICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsMTFjRmlsZW5hbWUpKTsKLSAgICAgICAgICAgIGdsMTFTdHJlYW0ucHJpbnRsbigiLyoiKTsKLSAgICAgICAgICAgIGdsMTFjU3RyZWFtLnByaW50bG4oIi8qIik7Ci0gICAgICAgICAgICBjb3B5KCJzdHVicy9nbGVzMTEvIiArIHN1ZmZpeCArICJIZWFkZXIuamF2YS1pZiIsIGdsMTFTdHJlYW0pOwotICAgICAgICAgICAgY29weSgic3R1YnMvZ2xlczExLyIgKyBzdWZmaXggKyAiY0hlYWRlci5jcHAiLCBnbDExY1N0cmVhbSk7Ci0gICAgICAgICAgICBHTEVTQ29kZUVtaXR0ZXIgZW1pdHRlciA9IG5ldyBHTEVTQ29kZUVtaXR0ZXIoCi0gICAgICAgICAgICAgICAgICAgICJhbmRyb2lkL29wZW5nbC8iICsgc3VmZml4LAotICAgICAgICAgICAgICAgICAgICBjaGVja2VyLCBnbDExU3RyZWFtLCBnbDExY1N0cmVhbSk7Ci0gICAgICAgICAgICBlbWl0KGVtaXR0ZXIsIHNwZWMxMVJlYWRlciwgZ2wxMVN0cmVhbSwgZ2wxMWNTdHJlYW0pOwotICAgICAgICAgICAgZW1pdHRlci5lbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCJyZWdpc3Rlcl9hbmRyb2lkX29wZW5nbF9qbmlfIgotICAgICAgICAgICAgICAgICAgICArIHN1ZmZpeCk7Ci0gICAgICAgICAgICBnbDExU3RyZWFtLnByaW50bG4oIn0iKTsKLSAgICAgICAgICAgIGdsMTFTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIGdsMTFjU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pGdW5jLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pGdW5jLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZDczYjYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KRnVuYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEpGdW5jIHsKLQotICAgIFN0cmluZyBjbGFzc05hbWUgPSAiY29tLmdvb2dsZS5hbmRyb2lkLmdsZXNfam5pLkdMMTFJbXBsIjsKLQotICAgIENGdW5jIGNmdW5jOwotICAgIEpUeXBlIGZ0eXBlOwotICAgIFN0cmluZyBmbmFtZTsKLQotICAgIExpc3Q8U3RyaW5nPiBhcmdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIExpc3Q8SlR5cGU+IGFyZ1R5cGVzID0gbmV3IEFycmF5TGlzdDxKVHlwZT4oKTsKLSAgICBMaXN0PEludGVnZXI+IGFyZ0NJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotCi0gICAgYm9vbGVhbiBoYXNCdWZmZXJBcmcgPSBmYWxzZTsKLSAgICBib29sZWFuIGhhc1R5cGVkQnVmZmVyQXJnID0gZmFsc2U7Ci0gICAgQXJyYXlMaXN0PFN0cmluZz4gYnVmZmVyQXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgIHB1YmxpYyBKRnVuYyhDRnVuYyBjZnVuYykgewotICAgICAgICB0aGlzLmNmdW5jID0gY2Z1bmM7Ci0gICAgfQotCi0gICAgcHVibGljIENGdW5jIGdldENGdW5jKCkgewotICAgICAgICByZXR1cm4gY2Z1bmM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgZm5hbWUpIHsKLSAgICAgICAgdGhpcy5mbmFtZSA9IGZuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoSlR5cGUgZnR5cGUpIHsKLSAgICAgICAgdGhpcy5mdHlwZSA9IGZ0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBKVHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gZnR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQnVmZmVyQXJnKCkgewotICAgICAgICByZXR1cm4gaGFzQnVmZmVyQXJnOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1R5cGVkQnVmZmVyQXJnKCkgewotICAgICAgICByZXR1cm4gaGFzVHlwZWRCdWZmZXJBcmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCdWZmZXJBcmdOYW1lKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gYnVmZmVyQXJnTmFtZXMuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRBcmd1bWVudChTdHJpbmcgYXJnTmFtZSwgSlR5cGUgYXJnVHlwZSwgaW50IGNpbmRleCkgewotICAgICAgICBhcmdOYW1lcy5hZGQoYXJnTmFtZSk7Ci0gICAgICAgIGFyZ1R5cGVzLmFkZChhcmdUeXBlKTsKLSAgICAgICAgYXJnQ0luZGljZXMuYWRkKG5ldyBJbnRlZ2VyKGNpbmRleCkpOwotCi0gICAgICAgIGlmIChhcmdUeXBlLmlzQnVmZmVyKCkpIHsKLSAgICAgICAgICAgIGhhc0J1ZmZlckFyZyA9IHRydWU7Ci0gICAgICAgICAgICBidWZmZXJBcmdOYW1lcy5hZGQoYXJnTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFyZ1R5cGUuaXNUeXBlZEJ1ZmZlcigpKSB7Ci0gICAgICAgICAgICBoYXNUeXBlZEJ1ZmZlckFyZyA9IHRydWU7Ci0gICAgICAgICAgICBidWZmZXJBcmdOYW1lcy5hZGQoYXJnTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE51bUFyZ3MoKSB7Ci0gICAgICAgIHJldHVybiBhcmdOYW1lcy5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBcmdJbmRleChTdHJpbmcgbmFtZSkgewotICAgICAgICBpbnQgbGVuID0gYXJnTmFtZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoYXJnTmFtZXMuZ2V0KGkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFyZ05hbWUoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBhcmdOYW1lcy5nZXQoaW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBKVHlwZSBnZXRBcmdUeXBlKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gYXJnVHlwZXMuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEFyZ0NJbmRleChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGFyZ0NJbmRpY2VzLmdldChpbmRleCkuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEpGdW5jIGNvbnZlcnQoQ0Z1bmMgY2Z1bmMsIGJvb2xlYW4gdXNlQXJyYXkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpGdW5jIGpmdW5jID0gbmV3IEpGdW5jKGNmdW5jKTsKLSAgICAgICAgICAgIGpmdW5jLnNldE5hbWUoY2Z1bmMuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGpmdW5jLnNldFR5cGUoSlR5cGUuY29udmVydChjZnVuYy5nZXRUeXBlKCksIGZhbHNlKSk7Ci0KLSAgICAgICAgICAgIGludCBudW1BcmdzID0gY2Z1bmMuZ2V0TnVtQXJncygpOwotICAgICAgICAgICAgaW50IG51bU9mZnNldHMgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBDVHlwZSBjQXJnVHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNBcmdUeXBlLmlzVHlwZWRQb2ludGVyKCkgJiYgdXNlQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgKytudW1PZmZzZXRzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY0FyZ05hbWUgPSBjZnVuYy5nZXRBcmdOYW1lKGkpOwotICAgICAgICAgICAgICAgIENUeXBlIGNBcmdUeXBlID0gY2Z1bmMuZ2V0QXJnVHlwZShpKTsKLQotICAgICAgICAgICAgICAgIGpmdW5jLmFkZEFyZ3VtZW50KGNBcmdOYW1lLCBKVHlwZS5jb252ZXJ0KGNBcmdUeXBlLCB1c2VBcnJheSksIGkpOwotICAgICAgICAgICAgICAgIGlmIChjQXJnVHlwZS5pc1R5cGVkUG9pbnRlcigpICYmIHVzZUFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChudW1PZmZzZXRzID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuYWRkQXJndW1lbnQoY0FyZ05hbWUgKyAiT2Zmc2V0IiwgbmV3IEpUeXBlKCJpbnQiKSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5hZGRBcmd1bWVudCgib2Zmc2V0IiwgbmV3IEpUeXBlKCJpbnQiKSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBqZnVuYzsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZhaWxlZCB0byBjb252ZXJ0IGZ1bmN0aW9uICIgKyBjZnVuYyk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHMgPSAgIkZ1bmN0aW9uICIgKyBmbmFtZSArICIgcmV0dXJucyAiICsgZnR5cGUgKyAiOiAiOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ05hbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBzICs9ICIsICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzICs9IGFyZ1R5cGVzLmdldChpKSArICIgIiArIGFyZ05hbWVzLmdldChpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvSlR5cGUuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMmYwMS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIEpUeXBlIHsKLQotICAgIFN0cmluZyBiYXNlVHlwZTsKLSAgICBib29sZWFuIGlzQXJyYXk7Ci0gICAgYm9vbGVhbiBpc0NsYXNzOwotICAgIGJvb2xlYW4gaXNTdHJpbmc7Ci0KLSAgICBzdGF0aWMgSGFzaE1hcDxDVHlwZSxKVHlwZT4gdHlwZU1hcHBpbmcgPSBuZXcgSGFzaE1hcDxDVHlwZSxKVHlwZT4oKTsKLSAgICBzdGF0aWMgSGFzaE1hcDxDVHlwZSxKVHlwZT4gYXJyYXlUeXBlTWFwcGluZyA9IG5ldyBIYXNoTWFwPENUeXBlLEpUeXBlPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAvLyBQcmltaXRpdmUgdHlwZXMKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJpdGZpZWxkIiksIG5ldyBKVHlwZSgiaW50IikpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMYm9vbGVhbiIpLCBuZXcgSlR5cGUoImJvb2xlYW4iKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xjbGFtcGYiKSwgbmV3IEpUeXBlKCJmbG9hdCIpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGNsYW1weCIpLCBuZXcgSlR5cGUoImludCIpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGVudW0iKSwgbmV3IEpUeXBlKCJpbnQiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIpLCBuZXcgSlR5cGUoImZsb2F0IikpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiKSwgbmV3IEpUeXBlKCJpbnQiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiKSwgbmV3IEpUeXBlKCJpbnQiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnRwdHIiKSwgbmV3IEpUeXBlKCJpbnQiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaG9ydCIpLCBuZXcgSlR5cGUoInNob3J0IikpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2l6ZWkiKSwgbmV3IEpUeXBlKCJpbnQiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaXplaXB0ciIpLCBuZXcgSlR5cGUoImludCIpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVieXRlIiksIG5ldyBKVHlwZSgiYnl0ZSIpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiKSwgbmV3IEpUeXBlKCJpbnQiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgidm9pZCIpLCBuZXcgSlR5cGUoInZvaWQiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1Ynl0ZSIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoIlN0cmluZyIsIGZhbHNlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoImNoYXIiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiYnl0ZSIpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJjaGFyIiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiU3RyaW5nIiwgZmFsc2UsIGZhbHNlKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiaW50IiksIG5ldyBKVHlwZSgiaW50IikpOwotCi0gICAgLy8gVW50eXBlZCBwb2ludGVycyBtYXAgdG8gdW50eXBlZCBCdWZmZXJzCi0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x2b2lkIiwgdHJ1ZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x2b2lkIiwgZmFsc2UsIHRydWUpLAotICAgICAgICAgICAgbmV3IEpUeXBlKCJqYXZhLm5pby5CdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoInZvaWQiLCBmYWxzZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xlZ2xJbWFnZU9FUyIsIGZhbHNlLCBmYWxzZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0KLSAgICAvLyBUeXBlZCBwb2ludGVycyBtYXAgdG8gdHlwZWQgQnVmZmVycwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMYm9vbGVhbiIsIGZhbHNlLCB0cnVlKSwKLSAgICAgICAgICAgIG5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGVudW0iLCBmYWxzZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIGZhbHNlLCB0cnVlKSwKLSAgICAgICAgICAgIG5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiwgdHJ1ZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIsIGZhbHNlLCB0cnVlKSwKLSAgICAgICAgICAgIG5ldyBKVHlwZSgiamF2YS5uaW8uRmxvYXRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiLCB0cnVlLCB0cnVlKSwKLSAgICAgICAgICAgIG5ldyBKVHlwZSgiamF2YS5uaW8uRmxvYXRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgZmFsc2UsIHRydWUpLAotICAgICAgICAgICAgbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgdHJ1ZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaXplaSIsIGZhbHNlLCB0cnVlKSwKLSAgICAgICAgICAgIG5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCBmYWxzZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiwgdHJ1ZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaG9ydCIsIHRydWUsIHRydWUpLAotICAgICAgICAgICAgbmV3IEpUeXBlKCJqYXZhLm5pby5TaG9ydEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0KLSAgICAvLyBUeXBlZCBwb2ludGVycyBtYXAgdG8gYXJyYXlzICsgb2Zmc2V0cwotICAgIGFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiY2hhciIsIGZhbHNlLCB0cnVlKSwKLSAgICAgICAgICAgIG5ldyBKVHlwZSgiYnl0ZSIsIGZhbHNlLCB0cnVlKSk7Ci0gICAgYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJvb2xlYW4iLCBmYWxzZSwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgIG5ldyBKVHlwZSgiYm9vbGVhbiIsIGZhbHNlLCB0cnVlKSk7Ci0gICAgYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGVudW0iLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsKLSAgICBhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOwotICAgIGFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIGZhbHNlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOwotICAgIGFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIsIGZhbHNlLCB0cnVlKSwgbmV3IEpUeXBlKCJmbG9hdCIsIGZhbHNlLCB0cnVlKSk7Ci0gICAgYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiZmxvYXQiLCBmYWxzZSwgdHJ1ZSkpOwotICAgIGFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsKLSAgICBhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsKLSAgICBhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2hvcnQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJzaG9ydCIsIGZhbHNlLCB0cnVlKSk7Ci0gICAgYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpIiwgZmFsc2UsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7Ci0gICAgYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpIiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsKLSAgICBhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIsIGZhbHNlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOwotICAgIGFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsKLSAgICBhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50cHRyIiksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsKLSAgICBhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2l6ZWlwdHIiKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBKVHlwZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSlR5cGUoU3RyaW5nIHByaW1pdGl2ZVR5cGVOYW1lKSB7Ci0gICAgdGhpcy5iYXNlVHlwZSA9IHByaW1pdGl2ZVR5cGVOYW1lOwotICAgIHRoaXMuaXNDbGFzcyA9IGZhbHNlOwotICAgIHRoaXMuaXNBcnJheSA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBKVHlwZShTdHJpbmcgcHJpbWl0aXZlVHlwZU5hbWUsIGJvb2xlYW4gaXNDbGFzcywgYm9vbGVhbiBpc0FycmF5KSB7Ci0gICAgdGhpcy5iYXNlVHlwZSA9IHByaW1pdGl2ZVR5cGVOYW1lOwotICAgIHRoaXMuaXNDbGFzcyA9IGlzQ2xhc3M7Ci0gICAgdGhpcy5pc0FycmF5ID0gaXNBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VUeXBlKCkgewotICAgIHJldHVybiBiYXNlVHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiBiYXNlVHlwZSArIChpc0FycmF5ID8gIltdIiA6ICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotICAgIHJldHVybiBpc0FycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2xhc3MoKSB7Ci0gICAgcmV0dXJuIGlzQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBiYXNlVHlwZS5lcXVhbHMoIlN0cmluZyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotICAgIHJldHVybiAhaXNDbGFzcygpICYmICFpc0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWb2lkKCkgewotICAgIHJldHVybiBiYXNlVHlwZS5lcXVhbHMoInZvaWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0J1ZmZlcigpIHsKLSAgICByZXR1cm4gYmFzZVR5cGUuaW5kZXhPZigiQnVmZmVyIikgIT0gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUeXBlZEJ1ZmZlcigpIHsKLSAgICByZXR1cm4gIWJhc2VUeXBlLmVxdWFscygiamF2YS5uaW8uQnVmZmVyIikgJiYKLSAgICAgICAgKGJhc2VUeXBlLmluZGV4T2YoIkJ1ZmZlciIpICE9IC0xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEpUeXBlIGNvbnZlcnQoQ1R5cGUgY3R5cGUsIGJvb2xlYW4gdXNlQXJyYXkpIHsKLSAgICAgSlR5cGUgamF2YVR5cGUgPSBudWxsOwotICAgICBpZiAodXNlQXJyYXkpIHsKLSAgICAgICAgIGphdmFUeXBlID0gYXJyYXlUeXBlTWFwcGluZy5nZXQoY3R5cGUpOwotICAgICB9Ci0gICAgIGlmIChqYXZhVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICBqYXZhVHlwZSA9IHR5cGVNYXBwaW5nLmdldChjdHlwZSk7Ci0gICAgIH0KLSAgICAgaWYgKGphdmFUeXBlID09IG51bGwpIHsKLSAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBDIHR5cGU6ICIgKyBjdHlwZSk7Ci0gICAgIH0KLSAgICAgcmV0dXJuIGphdmFUeXBlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvSm5pQ29kZUVtaXR0ZXIuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSm5pQ29kZUVtaXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZhMmI3NC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0puaUNvZGVFbWl0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEpuaUNvZGVFbWl0dGVyIHsKLQotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIG1Vc2VDUGx1c1BsdXMgPSB0cnVlOwotICAgIHByb3RlY3RlZCBib29sZWFuIG1Vc2VDb250ZXh0UG9pbnRlciA9IHRydWU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbVVzZVN0YXRpY01ldGhvZHMgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1DbGFzc1BhdGhOYW1lOwotICAgIHByb3RlY3RlZCBQYXJhbWV0ZXJDaGVja2VyIG1DaGVja2VyOwotICAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gbmF0aXZlUmVnaXN0cmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIGJvb2xlYW4gbmVlZHNFeGl0OwotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGluZGVudCA9ICIgICAgIjsKLSAgICBIYXNoU2V0PFN0cmluZz4gbUZ1bmN0aW9uc0VtaXR0ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKbmlOYW1lKEpUeXBlIGpUeXBlKSB7Ci0gICAgICAgIFN0cmluZyBqbmlOYW1lID0gIiI7Ci0gICAgICAgIGlmIChqVHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAiTCIgKyBqVHlwZS5nZXRCYXNlVHlwZSgpICsgIjsiOwotICAgICAgICB9IGVsc2UgaWYgKGpUeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgam5pTmFtZSA9ICJbIjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGpUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIGlmIChiYXNlVHlwZS5lcXVhbHMoImludCIpKSB7Ci0gICAgICAgICAgICBqbmlOYW1lICs9ICJJIjsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImZsb2F0IikpIHsKLSAgICAgICAgICAgIGpuaU5hbWUgKz0gIkYiOwotICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygiYm9vbGVhbiIpKSB7Ci0gICAgICAgICAgICBqbmlOYW1lICs9ICJaIjsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoInNob3J0IikpIHsKLSAgICAgICAgICAgIGpuaU5hbWUgKz0gIlMiOwotICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygibG9uZyIpKSB7Ci0gICAgICAgICAgICBqbmlOYW1lICs9ICJMIjsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImJ5dGUiKSkgewotICAgICAgICAgICAgam5pTmFtZSArPSAiQiI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJTdHJpbmciKSkgewotICAgICAgICAgICAgam5pTmFtZSArPSAiTGphdmEvbGFuZy9TdHJpbmc7IjsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoInZvaWQiKSkgewotICAgICAgICAgICAgLy8gbm90aGluZy4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHByaW1pdGl2ZSBiYXNldHlwZSAiICsgYmFzZVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqbmlOYW1lOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgZW1pdENvZGUoQ0Z1bmMgY2Z1bmMsIFN0cmluZyBvcmlnaW5hbCwKLSAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmFJbnRlcmZhY2VTdHJlYW0sCi0gICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhSW1wbFN0cmVhbSwKLSAgICAgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0pIHsKLSAgICAgICAgSkZ1bmMgamZ1bmM7Ci0gICAgICAgIFN0cmluZyBzaWduYXR1cmU7Ci0gICAgICAgIGJvb2xlYW4gZHVwbGljYXRlOwotCi0gICAgICAgIGlmIChjZnVuYy5oYXNUeXBlZFBvaW50ZXJBcmcoKSkgewotICAgICAgICAgICAgamZ1bmMgPSBKRnVuYy5jb252ZXJ0KGNmdW5jLCB0cnVlKTsKLQotICAgICAgICAgICAgLy8gRG9uJ3QgZW1pdCBkdXBsaWNhdGUgZnVuY3Rpb25zCi0gICAgICAgICAgICAvLyBUaGVzZSBtYXkgYXBwZWFyIGJlY2F1c2UgdGhleSBhcmUgZGVmaW5lZCBpbiBtdWx0aXBsZQotICAgICAgICAgICAgLy8gSmF2YSBpbnRlcmZhY2VzIChlLmcuLCBHTDExL0dMMTFFeHRlbnNpb25QYWNrKQotICAgICAgICAgICAgc2lnbmF0dXJlID0gamZ1bmMudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGR1cGxpY2F0ZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1GdW5jdGlvbnNFbWl0dGVkLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKLSAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRnVuY3Rpb25zRW1pdHRlZC5hZGQoc2lnbmF0dXJlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFkdXBsaWNhdGUpIHsKLSAgICAgICAgICAgICAgICBlbWl0TmF0aXZlRGVjbGFyYXRpb24oamZ1bmMsIGphdmFJbXBsU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBlbWl0SmF2YUNvZGUoamZ1bmMsIGphdmFJbXBsU3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChqYXZhSW50ZXJmYWNlU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbWl0SmF2YUludGVyZmFjZUNvZGUoamZ1bmMsIGphdmFJbnRlcmZhY2VTdHJlYW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkdXBsaWNhdGUpIHsKLSAgICAgICAgICAgICAgICBlbWl0Sm5pQ29kZShqZnVuYywgY1N0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBqZnVuYyA9IEpGdW5jLmNvbnZlcnQoY2Z1bmMsIGZhbHNlKTsKLQotICAgICAgICBzaWduYXR1cmUgPSBqZnVuYy50b1N0cmluZygpOwotICAgICAgICBkdXBsaWNhdGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1GdW5jdGlvbnNFbWl0dGVkLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKLSAgICAgICAgICAgIGR1cGxpY2F0ZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRnVuY3Rpb25zRW1pdHRlZC5hZGQoc2lnbmF0dXJlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZHVwbGljYXRlKSB7Ci0gICAgICAgICAgICBlbWl0TmF0aXZlRGVjbGFyYXRpb24oamZ1bmMsIGphdmFJbXBsU3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUludGVyZmFjZVN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbWl0SmF2YUludGVyZmFjZUNvZGUoamZ1bmMsIGphdmFJbnRlcmZhY2VTdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZHVwbGljYXRlKSB7Ci0gICAgICAgICAgICBlbWl0SmF2YUNvZGUoamZ1bmMsIGphdmFJbXBsU3RyZWFtKTsKLSAgICAgICAgICAgIGVtaXRKbmlDb2RlKGpmdW5jLCBjU3RyZWFtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVtaXROYXRpdmVEZWNsYXJhdGlvbihKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0KSB7Ci0gICAgICAgIG91dC5wcmludGxuKCIgICAgLy8gQyBmdW5jdGlvbiAiICsgamZ1bmMuZ2V0Q0Z1bmMoKS5nZXRPcmlnaW5hbCgpKTsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLQotICAgICAgICBlbWl0RnVuY3Rpb24oamZ1bmMsIG91dCwgdHJ1ZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVtaXRKYXZhSW50ZXJmYWNlQ29kZShKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0KSB7Ci0gICAgICAgIGVtaXRGdW5jdGlvbihqZnVuYywgb3V0LCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW1pdEphdmFDb2RlKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKLSAgICAgICAgZW1pdEZ1bmN0aW9uKGpmdW5jLCBvdXQsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1BvaW50ZXJGdW5jKEpGdW5jIGpmdW5jKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gamZ1bmMuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gKG5hbWUuZW5kc1dpdGgoIlBvaW50ZXIiKSB8fCBuYW1lLmVuZHNXaXRoKCJQb2ludGVyT0VTIikpCi0gICAgICAgICAgICAmJiBqZnVuYy5nZXRDRnVuYygpLmhhc1BvaW50ZXJBcmcoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGVtaXRGdW5jdGlvbkNhbGwoSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCwgU3RyaW5nIGlpaSwgYm9vbGVhbiBncmFiQXJyYXkpIHsKLSAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSBqZnVuYy5nZXRUeXBlKCkuaXNWb2lkKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNQb2ludGVyRnVuYyA9IGlzUG9pbnRlckZ1bmMoamZ1bmMpOwotCi0gICAgICAgIGlmICghaXNWb2lkKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKwotICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0VHlwZSgpICsgIiBfcmV0dXJuVmFsdWU7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnByaW50bG4oaWlpICsKLSAgICAgICAgICAgICAgICAgICAgKGlzVm9pZCA/ICIiIDogIl9yZXR1cm5WYWx1ZSA9ICIpICsKLSAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgKGlzUG9pbnRlckZ1bmMgPyAiQm91bmRzIiA6ICIiICkgKwotICAgICAgICAgICAgICAgICAgICAiKCIpOwotCi0gICAgICAgIGludCBudW1BcmdzID0gamZ1bmMuZ2V0TnVtQXJncygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGFyZ05hbWUgPSBqZnVuYy5nZXRBcmdOYW1lKGkpOwotICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7Ci0KLSAgICAgICAgICAgIGlmIChncmFiQXJyYXkgJiYgYXJnVHlwZS5pc1R5cGVkQnVmZmVyKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBhcmdUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoOSwgdHlwZU5hbWUubGVuZ3RoKCkgLSA2KTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiZ2V0IiArIHR5cGVOYW1lICsgIkFycmF5KCIgKyBhcmdOYW1lICsgIiksIik7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50KGlpaSArIGluZGVudCArICJnZXRPZmZzZXQoIiArIGFyZ05hbWUgKyAiKSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoaWlpICsgaW5kZW50ICsgYXJnTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSkgewotICAgICAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArIGFyZ05hbWUgKyAiLnJlbWFpbmluZygpIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiKTsiKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50SWZjaGVja1Bvc3RhbWJsZShQcmludFN0cmVhbSBvdXQsIGJvb2xlYW4gaXNCdWZmZXIsIGJvb2xlYW4gZW1pdEV4Y2VwdGlvbkNoZWNrLAotICAgICAgICAgICAgU3RyaW5nIGlpaSkgewotICAgICAgICAgICAgICAgIHByaW50SWZjaGVja1Bvc3RhbWJsZShvdXQsIGlzQnVmZmVyLCBlbWl0RXhjZXB0aW9uQ2hlY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQiLCAiX3JlbWFpbmluZyIsIGlpaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICB2b2lkIHByaW50SWZjaGVja1Bvc3RhbWJsZShQcmludFN0cmVhbSBvdXQsIGJvb2xlYW4gaXNCdWZmZXIsIGJvb2xlYW4gZW1pdEV4Y2VwdGlvbkNoZWNrLAotICAgICAgICAgICAgU3RyaW5nIG9mZnNldCwgU3RyaW5nIHJlbWFpbmluZywgU3RyaW5nIGlpaSkgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgZGVmYXVsdDoiKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAgICBfbmVlZGVkID0gMDsiKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAgICBicmVhazsiKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOwotCi0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgiICsgcmVtYWluaW5nICsgIiA8IF9uZWVkZWQpIHsiKTsKLSAgICAgICAgICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfZXhjZXB0aW9uID0gMTsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgImpuaVRocm93RXhjZXB0aW9uKF9lbnYsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlwiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblwiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyAoaXNCdWZmZXIgPyAicmVtYWluaW5nKCkiIDogImxlbmd0aCAtICIgKyBvZmZzZXQpICsgIiA8IG5lZWRlZFwiKTsiKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiZ290byBleGl0OyIpOwotICAgICAgICAgICAgICAgIG5lZWRzRXhpdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKLSAgICAgICAgICAgIH0KLQotICAgIGJvb2xlYW4gaXNOdWxsQWxsb3dlZChDRnVuYyBjZnVuYykgewotICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKTsKLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXR1cm4iKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5zdGFydHNXaXRoKCJjaGVjayIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygiaWZjaGVjayIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygidW5zdXBwb3J0ZWQiKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJlcXVpcmVzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJudWxsQWxsb3dlZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSArICJcIiIpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRFcnJvclJldHVyblZhbHVlKENGdW5jIGNmdW5jKSB7Ci0gICAgICAgIENUeXBlIHJldHVyblR5cGUgPSBjZnVuYy5nZXRUeXBlKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNWb2lkID0gcmV0dXJuVHlwZS5pc1ZvaWQoKTsKLSAgICAgICAgaWYgKGlzVm9pZCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKTsKLQotICAgICAgICBpbnQgaW5kZXggPSAxOwotICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja3NbaW5kZXggKyAxXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uc3RhcnRzV2l0aCgiY2hlY2siKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoImlmY2hlY2siKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSA1OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXF1aXJlcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSArICJcIiIpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzVW5zdXBwb3J0ZWRGdW5jKENGdW5jIGNmdW5jKSB7Ci0gICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOwotICAgICAgICBpbnQgaW5kZXggPSAxOwotICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmVxdWlyZXMiKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJudWxsQWxsb3dlZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogdW5rbm93biBrZXl3b3JkIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXhdICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgU3RyaW5nIGlzUmVxdWlyZXNGdW5jKENGdW5jIGNmdW5jKSB7Ci0gICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOwotICAgICAgICBpbnQgaW5kZXggPSAxOwotICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXF1aXJlcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja3NbaW5kZXgrMV07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uc3RhcnRzV2l0aCgiY2hlY2siKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoImlmY2hlY2siKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSA1OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoIm51bGxBbGxvd2VkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHZvaWQgZW1pdE5hdGl2ZUJvdW5kc0NoZWNrcyhDRnVuYyBjZnVuYywgU3RyaW5nIGNuYW1lLCBQcmludFN0cmVhbSBvdXQsCi0gICAgICAgICAgICBib29sZWFuIGlzQnVmZmVyLCBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjaywgU3RyaW5nIG9mZnNldCwgU3RyaW5nIHJlbWFpbmluZywgU3RyaW5nIGlpaSkgewotCi0gICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOwotCi0gICAgICAgIGJvb2xlYW4gbGFzdFdhc0lmY2hlY2sgPSBmYWxzZTsKLQotICAgICAgICBpbnQgaW5kZXggPSAxOwotICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5zdGFydHNXaXRoKCJjaGVjayIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0V2FzSWZjaGVjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJZmNoZWNrUG9zdGFtYmxlKG91dCwgaXNCdWZmZXIsIGVtaXRFeGNlcHRpb25DaGVjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCByZW1haW5pbmcsIGlpaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGFzdFdhc0lmY2hlY2sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNuYW1lICE9IG51bGwgJiYgIWNuYW1lLmVxdWFscyhjaGVja3NbaW5kZXggKyAxXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKCIgKyByZW1haW5pbmcgKyAiIDwgIiArIGNoZWNrc1tpbmRleCArIDJdICsgIikgeyIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX2V4Y2VwdGlvbiA9IDE7Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4Y2VwdGlvbkNsYXNzTmFtZSA9ICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIjsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlICJjaGVjayIga2V5d29yZCB3YXMgb2YgdGhlIGZvcm0KLSAgICAgICAgICAgICAgICAgICAgLy8gImNoZWNrXzxjbGFzcyBuYW1lPiIsIHVzZSB0aGUgY2xhc3MgbmFtZSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHRvIGJlIHRocm93bgotICAgICAgICAgICAgICAgICAgICBpbnQgdW5kZXJzY29yZSA9IGNoZWNrc1tpbmRleF0uaW5kZXhPZignXycpOwotICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXJzY29yZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWJiciA9IGNoZWNrc1tpbmRleF0uc3Vic3RyaW5nKHVuZGVyc2NvcmUgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYmJyLmVxdWFscygiQUlPT0JFIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25DbGFzc05hbWUgPSAiamF2YS9sYW5nL0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmtub3duIGV4Y2VwdGlvbiBhYmJyZXZpYXRpb246ICIgKyBhYmJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiam5pVGhyb3dFeGNlcHRpb24oX2VudiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIGV4Y2VwdGlvbkNsYXNzTmFtZSArICJcIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIChpc0J1ZmZlciA/ICJyZW1haW5pbmcoKSIgOiAibGVuZ3RoIC0gIiArIG9mZnNldCkgKyAiIDwgIiArIGNoZWNrc1tpbmRleCArIDJdICsgIlwiKTsiKTsKLQotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiZ290byBleGl0OyIpOwotICAgICAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygiaWZjaGVjayIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIG1hdGNoZXMgPSBjaGVja3NbaW5kZXggKyA0XS5zcGxpdCgiLCIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghbGFzdFdhc0lmY2hlY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpbnQgX25lZWRlZDsiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJzd2l0Y2ggKCIgKyBjaGVja3NbaW5kZXggKyAzXSArICIpIHsiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF0Y2hlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiNpZiBkZWZpbmVkKCIgKyBtYXRjaGVzW2ldICsgIikiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgY2FzZSAiICsgbWF0Y2hlc1tpXSArICI6Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiI2VuZGlmIC8vIGRlZmluZWQoIiArIG1hdGNoZXNbaV0gKyAiKSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICAgIF9uZWVkZWQgPSAiICsgY2hlY2tzW2luZGV4ICsgMl0gKyAiOyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAgICBicmVhazsiKTsKLQotICAgICAgICAgICAgICAgICAgICBsYXN0V2FzSWZjaGVjayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygidW5zdXBwb3J0ZWQiKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXF1aXJlcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoIm51bGxBbGxvd2VkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogdW5rbm93biBrZXl3b3JkIFwiIiArIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxhc3RXYXNJZmNoZWNrKSB7Ci0gICAgICAgICAgICBwcmludElmY2hlY2tQb3N0YW1ibGUob3V0LCBpc0J1ZmZlciwgZW1pdEV4Y2VwdGlvbkNoZWNrLCBpaWkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBoYXNOb25Db25zdEFyZyhKRnVuYyBqZnVuYywgQ0Z1bmMgY2Z1bmMsIExpc3Q8SW50ZWdlcj4gbm9uUHJpbWl0aXZlQXJncykgewotICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbm9uUHJpbWl0aXZlQXJncy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKLSAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5pc0NvbnN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNCdWZmZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5pc0NvbnN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVtaXQgYSBmdW5jdGlvbiBpbiBzZXZlcmFsIHZhcmlhbnRzOgotICAgICAqCi0gICAgICogaWYgbmF0aXZlRGVjbDogcHVibGljIG5hdGl2ZSA8cmV0dXJudHlwZT4gZnVuYyhhcmdzKTsKLSAgICAgKgotICAgICAqIGlmICFuYXRpdmVEZWNsOgotICAgICAqICAgaWYgaW50ZXJmYWNlRGVjbDogIHB1YmxpYyA8cmV0dXJudHlwZT4gZnVuYyhhcmdzKTsKLSAgICAgKiAgIGlmICFpbnRlcmZhY2VEZWNsOiBwdWJsaWMgPHJldHVybnR5cGU+IGZ1bmMoYXJncykgeyBib2R5IH0KLSAgICAgKi8KLSAgICB2b2lkIGVtaXRGdW5jdGlvbihKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0LCBib29sZWFuIG5hdGl2ZURlY2wsIGJvb2xlYW4gaW50ZXJmYWNlRGVjbCkgewotICAgICAgICBib29sZWFuIGlzUG9pbnRlckZ1bmMgPSBpc1BvaW50ZXJGdW5jKGpmdW5jKTsKLQotICAgICAgICBpZiAoIW5hdGl2ZURlY2wgJiYgIWludGVyZmFjZURlY2wgJiYgIWlzUG9pbnRlckZ1bmMpIHsKLSAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90IGEgcG9pbnRlciBmdW5jdGlvbiwgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGl0Ci0gICAgICAgICAgICAvLyB3aXRoIG5hdGl2ZURlY2wgPT0gdHJ1ZQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG1heWJlU3RhdGljID0gbVVzZVN0YXRpY01ldGhvZHMgPyAic3RhdGljICIgOiAiIjsKLQotICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgewotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChuYXRpdmVEZWNsID8gInByaXZhdGUgIiArIG1heWJlU3RhdGljICsibmF0aXZlICIgOgotICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRlcmZhY2VEZWNsID8gIiIgOiAicHVibGljICIpICsgbWF5YmVTdGF0aWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldFR5cGUoKSArICIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKG5hdGl2ZURlY2wgPyAiQm91bmRzIiA6ICIiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiKCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChuYXRpdmVEZWNsID8gInB1YmxpYyAiICsgbWF5YmVTdGF0aWMgKyJuYXRpdmUgIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKGludGVyZmFjZURlY2wgPyAiIiA6ICJwdWJsaWMgIikgKyBtYXliZVN0YXRpYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0VHlwZSgpICsgIiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiKCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG51bUFyZ3MgPSBqZnVuYy5nZXROdW1BcmdzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJnTmFtZSA9IGpmdW5jLmdldEFyZ05hbWUoaSk7Ci0gICAgICAgICAgICBKVHlwZSBhcmdUeXBlID0gamZ1bmMuZ2V0QXJnVHlwZShpKTsKLQotICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCArIGluZGVudCArIGFyZ1R5cGUgKyAiICIgKyBhcmdOYW1lKTsKLSAgICAgICAgICAgIGlmIChpID09IG51bUFyZ3MgLSAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMgJiYgbmF0aXZlRGVjbCkgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiaW50IHJlbWFpbmluZyIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5hdGl2ZURlY2wgfHwgaW50ZXJmYWNlRGVjbCkgewotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIik7Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiKSB7Iik7Ci0KLSAgICAgICAgICAgIFN0cmluZyBpaWkgPSBpbmRlbnQgKyBpbmRlbnQ7Ci0KLSAgICAgICAgICAgIC8vIGVtaXRCb3VuZHNDaGVja3MoamZ1bmMsIG91dCwgaWlpKTsKLSAgICAgICAgICAgIGVtaXRGdW5jdGlvbkNhbGwoamZ1bmMsIG91dCwgaWlpLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgcG9pbnRlciBhZnRlciB3ZSBjYWxsIHRoZSBuYXRpdmUgY29kZSwgc28gdGhhdCBpZgotICAgICAgICAgICAgLy8gdGhlIG5hdGl2ZSBjb2RlIHRocm93cyBhbiBleGNlcHRpb24gd2UgZG9uJ3QgbW9kaWZ5IHRoZQotICAgICAgICAgICAgLy8gcG9pbnRlci4gV2UgYXNzdW1lIHRoYXQgdGhlIG5hdGl2ZSBjb2RlIGlzIHdyaXR0ZW4gc28gdGhhdAotICAgICAgICAgICAgLy8gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdGhlbiB0aGUgdW5kZXJseWluZyBnbFhYWFBvaW50ZXIKLSAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHdpbGwgbm90IGhhdmUgYmVlbiBjYWxsZWQuCi0KLSAgICAgICAgICAgIFN0cmluZyBmbmFtZSA9IGpmdW5jLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAtIGRlYWwgd2l0aCBWQk8gdmFyaWFudHMKLSAgICAgICAgICAgICAgICBpZiAoZm5hbWUuZXF1YWxzKCJnbENvbG9yUG9pbnRlciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKHNpemUgPT0gNCkgJiYiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfY29sb3JQb2ludGVyID0gcG9pbnRlcjsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xOb3JtYWxQb2ludGVyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0JZVEUpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1NIT1JUKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX25vcm1hbFBvaW50ZXIgPSBwb2ludGVyOyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm5hbWUuZXF1YWxzKCJnbFRleENvb3JkUG9pbnRlciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKChzaXplID09IDIpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDMpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDQpKSAmJiIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICgodHlwZSA9PSBHTF9GTE9BVCkgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfQllURSkgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfU0hPUlQpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfdGV4Q29vcmRQb2ludGVyID0gcG9pbnRlcjsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xWZXJ0ZXhQb2ludGVyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHNpemUgPT0gMikgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gMykgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gNCkpICYmIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9CWVRFKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJiIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIChzdHJpZGUgPj0gMCkpIHsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl92ZXJ0ZXhQb2ludGVyID0gcG9pbnRlcjsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xQb2ludFNpemVQb2ludGVyT0VTIikpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfcG9pbnRTaXplUG9pbnRlck9FUyA9IHBvaW50ZXI7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbmFtZS5lcXVhbHMoImdsTWF0cml4SW5kZXhQb2ludGVyT0VTIikpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHNpemUgPT0gMikgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gMykgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gNCkpICYmIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9CWVRFKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJiIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIChzdHJpZGUgPj0gMCkpIHsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9tYXRyaXhJbmRleFBvaW50ZXJPRVMgPSBwb2ludGVyOyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm5hbWUuZXF1YWxzKCJnbFdlaWdodFBvaW50ZXIiKSkgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKCgoc2l6ZSA9PSAyKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAoc2l6ZSA9PSAzKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAoc2l6ZSA9PSA0KSkgJiYiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0JZVEUpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1NIT1JUKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX3dlaWdodFBvaW50ZXJPRVMgPSBwb2ludGVyOyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSBqZnVuYy5nZXRUeXBlKCkuaXNWb2lkKCk7Ci0KLSAgICAgICAgICAgIGlmICghaXNWb2lkKSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgInJldHVybiBfcmV0dXJuVmFsdWU7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTmF0aXZlUmVnaXN0cmF0aW9uKFN0cmluZyBzKSB7Ci0gICAgICAgIG5hdGl2ZVJlZ2lzdHJhdGlvbnMuYWRkKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVtaXROYXRpdmVSZWdpc3RyYXRpb24oU3RyaW5nIHJlZ2lzdHJhdGlvbkZ1bmN0aW9uTmFtZSwKLSAgICAgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0pIHsKLSAgICAgICAgY1N0cmVhbS5wcmludGxuKCJzdGF0aWMgY29uc3QgY2hhciAqY2xhc3NQYXRoTmFtZSA9IFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ2xhc3NQYXRoTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCI7Iik7Ci0gICAgICAgIGNTdHJlYW0ucHJpbnRsbigpOwotCi0gICAgICAgIGNTdHJlYW0ucHJpbnRsbigic3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RzW10gPSB7Iik7Ci0KLSAgICAgICAgY1N0cmVhbS5wcmludGxuKCJ7XCJfbmF0aXZlQ2xhc3NJbml0XCIsIFwiKClWXCIsICh2b2lkKiluYXRpdmVDbGFzc0luaXQgfSwiKTsKLQotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGkgPSBuYXRpdmVSZWdpc3RyYXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgY1N0cmVhbS5wcmludGxuKGkubmV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNTdHJlYW0ucHJpbnRsbigifTsiKTsKLSAgICAgICAgY1N0cmVhbS5wcmludGxuKCk7Ci0KLQotICAgICAgICBjU3RyZWFtLnByaW50bG4oImludCAiICsgcmVnaXN0cmF0aW9uRnVuY3Rpb25OYW1lICsgIihKTklFbnYgKl9lbnYpIik7Ci0gICAgICAgIGNTdHJlYW0ucHJpbnRsbigieyIpOwotICAgICAgICBjU3RyZWFtLnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgZXJyOyIpOwotCi0gICAgICAgIGNTdHJlYW0ucHJpbnRsbihpbmRlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgImVyciA9IGFuZHJvaWQ6OkFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoX2VudiwgY2xhc3NQYXRoTmFtZSwgbWV0aG9kcywgTkVMRU0obWV0aG9kcykpOyIpOwotCi0gICAgICAgIGNTdHJlYW0ucHJpbnRsbihpbmRlbnQgKyAicmV0dXJuIGVycjsiKTsKLSAgICAgICAgY1N0cmVhbS5wcmludGxuKCJ9Iik7Ci0gICAgfQotCi0gICAgcHVibGljIEpuaUNvZGVFbWl0dGVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRKbmlUeXBlKEpUeXBlIGpUeXBlKSB7Ci0gICAgICAgIGlmIChqVHlwZS5pc1ZvaWQoKSkgewotICAgICAgICAgICAgcmV0dXJuICJ2b2lkIjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGpUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICAgIGlmIChqVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICBpZiAoYmFzZVR5cGUuZXF1YWxzKCJTdHJpbmciKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAianN0cmluZyI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAiaiIgKyBiYXNlVHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChqVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiAiaiIgKyBiYXNlVHlwZSArICJBcnJheSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gImpvYmplY3QiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIGdldEpuaU1hbmdsZWROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIl8iLCAiXzEiKTsKLSAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiOyIsICJfMiIpOwotICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJcXFsiLCAiXzMiKTsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW1pdEpuaUNvZGUoSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCkgewotICAgICAgICBDRnVuYyBjZnVuYyA9IGpmdW5jLmdldENGdW5jKCk7Ci0KLSAgICAgICAgLy8gRW1pdCBjb21tZW50IGlkZW50aWZ5aW5nIG9yaWdpbmFsIEMgZnVuY3Rpb24KLSAgICAgICAgLy8KLSAgICAgICAgLy8gRXhhbXBsZToKLSAgICAgICAgLy8KLSAgICAgICAgLy8gLyogdm9pZCBnbENsaXBQbGFuZWYgKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uICkgKi8KLSAgICAgICAgLy8KLSAgICAgICAgb3V0LnByaW50bG4oIi8qICIgKyBjZnVuYy5nZXRPcmlnaW5hbCgpICsgIiAqLyIpOwotCi0gICAgICAgIC8vIEVtaXQgSk5JIHNpZ25hdHVyZSAobmFtZSkKLSAgICAgICAgLy8KLSAgICAgICAgLy8gRXhhbXBsZToKLSAgICAgICAgLy8KLSAgICAgICAgLy8gdm9pZAotICAgICAgICAvLyBhbmRyb2lkX2dsQ2xpcFBsYW5lZl9fSV8zRkkKLSAgICAgICAgLy8KLQotICAgICAgICBTdHJpbmcgb3V0TmFtZSA9ICJhbmRyb2lkXyIgKyBqZnVuYy5nZXROYW1lKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNQb2ludGVyRnVuYyA9IGlzUG9pbnRlckZ1bmMoamZ1bmMpOwotICAgICAgICBib29sZWFuIGlzVkJPUG9pbnRlckZ1bmMgPSAob3V0TmFtZS5lbmRzV2l0aCgiUG9pbnRlciIpIHx8Ci0gICAgICAgICAgICAgICAgb3V0TmFtZS5lbmRzV2l0aCgiUG9pbnRlck9FUyIpIHx8Ci0gICAgICAgICAgICBvdXROYW1lLmVuZHNXaXRoKCJEcmF3RWxlbWVudHMiKSB8fCBvdXROYW1lLmVuZHNXaXRoKCJWZXJ0ZXhBdHRyaWJQb2ludGVyIikpICYmCi0gICAgICAgICAgICAhamZ1bmMuZ2V0Q0Z1bmMoKS5oYXNQb2ludGVyQXJnKCk7Ci0gICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7Ci0gICAgICAgICAgICBvdXROYW1lICs9ICJCb3VuZHMiOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LnByaW50KCJzdGF0aWMgIik7Ci0gICAgICAgIG91dC5wcmludGxuKGdldEpuaVR5cGUoamZ1bmMuZ2V0VHlwZSgpKSk7Ci0gICAgICAgIG91dC5wcmludChvdXROYW1lKTsKLQotICAgICAgICBTdHJpbmcgcnNpZ25hdHVyZSA9IGdldEpuaU5hbWUoamZ1bmMuZ2V0VHlwZSgpKTsKLQotICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gIiI7Ci0gICAgICAgIGludCBudW1BcmdzID0gamZ1bmMuZ2V0TnVtQXJncygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7Ci0gICAgICAgICAgICBzaWduYXR1cmUgKz0gZ2V0Sm5pTmFtZShhcmdUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgewotICAgICAgICAgICAgc2lnbmF0dXJlICs9ICJJIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFwcGVuZCBzaWduYXR1cmUgdG8gZnVuY3Rpb24gbmFtZQotICAgICAgICBTdHJpbmcgc2lnID0gZ2V0Sm5pTWFuZ2xlZE5hbWUoc2lnbmF0dXJlKS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCcvJywgJ18nKTsKLSAgICAgICAgb3V0LnByaW50KCJfXyIgKyBzaWcpOwotICAgICAgICBvdXROYW1lICs9ICJfXyIgKyBzaWc7Ci0KLSAgICAgICAgc2lnbmF0dXJlID0gc2lnbmF0dXJlLnJlcGxhY2UoJy4nLCAnLycpOwotICAgICAgICByc2lnbmF0dXJlID0gcnNpZ25hdHVyZS5yZXBsYWNlKCcuJywgJy8nKTsKLQotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICBpZiAocnNpZ25hdHVyZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByc2lnbmF0dXJlID0gIlYiOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHMgPSAie1wiIiArCi0gICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkgKwotICAgICAgICAgICAgKGlzUG9pbnRlckZ1bmMgPyAiQm91bmRzIiA6ICIiKSArCi0gICAgICAgICAgICAiXCIsIFwiKCIgKyBzaWduYXR1cmUgKyIpIiArCi0gICAgICAgICAgICByc2lnbmF0dXJlICsKLSAgICAgICAgICAgICJcIiwgKHZvaWQgKikgIiArCi0gICAgICAgICAgICBvdXROYW1lICsKLSAgICAgICAgICAgICIgfSwiOwotICAgICAgICBuYXRpdmVSZWdpc3RyYXRpb25zLmFkZChzKTsKLQotICAgICAgICBMaXN0PEludGVnZXI+IG5vblByaW1pdGl2ZUFyZ3MgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgICAgIExpc3Q8SW50ZWdlcj4gc3RyaW5nQXJncyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgaW50IG51bUJ1ZmZlckFyZ3MgPSAwOwotICAgICAgICBMaXN0PFN0cmluZz4gYnVmZmVyQXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAvLyBFbWl0IEpOSSBzaWduYXR1cmUgKGFyZ3VtZW50cykKLSAgICAgICAgLy8KLSAgICAgICAgLy8gRXhhbXBsZToKLSAgICAgICAgLy8KLSAgICAgICAgLy8gKEpOSUVudiAqX2Vudiwgam9iamVjdCB0aGlzLCBqaW50IHBsYW5lLCBqZmxvYXRBcnJheSBlcXVhdGlvbl9yZWYsIGppbnQgb2Zmc2V0KSB7Ci0gICAgICAgIC8vCi0gICAgICAgIG91dC5wcmludCgiICAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoIiwgIik7Ci0gICAgICAgICAgICBKVHlwZSBhcmdUeXBlID0gamZ1bmMuZ2V0QXJnVHlwZShpKTsKLSAgICAgICAgICAgIFN0cmluZyBzdWZmaXg7Ci0gICAgICAgICAgICBpZiAoIWFyZ1R5cGUuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiX3JlZiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIl9idWYiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBub25QcmltaXRpdmVBcmdzLmFkZChuZXcgSW50ZWdlcihpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaSkuaXNCdWZmZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlckFyZ05hbWVzLmFkZChjbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG51bUJ1ZmZlckFyZ3MrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFyZ1R5cGUuaXNTdHJpbmcoKSkgewotICAgICAgICAgICAgICAgIHN0cmluZ0FyZ3MuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3V0LnByaW50KGdldEpuaVR5cGUoYXJnVHlwZSkgKyAiICIgKyBqZnVuYy5nZXRBcmdOYW1lKGkpICsgc3VmZml4KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgewotICAgICAgICAgICAgb3V0LnByaW50KCIsIGppbnQgcmVtYWluaW5nIik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnByaW50bG4oIikgeyIpOwotCi0gICAgICAgIGludCBudW1BcnJheXMgPSAwOwotICAgICAgICBpbnQgbnVtQnVmZmVycyA9IDA7Ci0gICAgICAgIGludCBudW1TdHJpbmdzID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub25QcmltaXRpdmVBcmdzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIEpUeXBlIGFyZ1R5cGUgPSBqZnVuYy5nZXRBcmdUeXBlKGlkeCk7Ci0gICAgICAgICAgICBpZiAoYXJnVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICArK251bUFycmF5czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcmdUeXBlLmlzQnVmZmVyKCkpIHsKLSAgICAgICAgICAgICAgICArK251bUJ1ZmZlcnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJnVHlwZS5pc1N0cmluZygpKSB7Ci0gICAgICAgICAgICAgICAgKytudW1TdHJpbmdzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRW1pdCBtZXRob2QgYm9keQotCi0gICAgICAgIC8vIEVtaXQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIGZvciBfZXhjZXB0aW9uIGFuZCBfcmV0dXJuVmFsdWUKLSAgICAgICAgLy8KLSAgICAgICAgLy8gRXhhbXBsZToKLSAgICAgICAgLy8KLSAgICAgICAgLy8gYW5kcm9pZDo6Z2w6Om9nbGVzX2NvbnRleHRfdCAqY3R4OwotICAgICAgICAvLwotICAgICAgICAvLyBqaW50IF9leGNlcHRpb247Ci0gICAgICAgIC8vIEdMZW51bSBfcmV0dXJuVmFsdWU7Ci0gICAgICAgIC8vCi0gICAgICAgIENUeXBlIHJldHVyblR5cGUgPSBjZnVuYy5nZXRUeXBlKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNWb2lkID0gcmV0dXJuVHlwZS5pc1ZvaWQoKTsKLQotICAgICAgICBib29sZWFuIGlzVW5zdXBwb3J0ZWQgPSBpc1Vuc3VwcG9ydGVkRnVuYyhjZnVuYyk7Ci0gICAgICAgIGlmIChpc1Vuc3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgImpuaVRocm93RXhjZXB0aW9uKF9lbnYsIFwiamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uXCIsIik7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBcIiIgKyBjZnVuYy5nZXROYW1lKCkgKyAiXCIpOyIpOwotICAgICAgICAgICAgaWYgKCFpc1ZvaWQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dmFsID0gZ2V0RXJyb3JSZXR1cm5WYWx1ZShjZnVuYyk7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgInJldHVybiAiICsgcmV0dmFsICsgIjsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJlcXVpcmVzRXh0ZW5zaW9uID0gaXNSZXF1aXJlc0Z1bmMoY2Z1bmMpOwotICAgICAgICBpZiAocmVxdWlyZXNFeHRlbnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJpZiAoISBzdXBwb3J0c0V4dGVuc2lvbihfZW52LCBfdGhpcywgaGF2ZV8iICsgcmVxdWlyZXNFeHRlbnNpb24gKyAiSUQpKSB7Iik7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgImpuaVRocm93RXhjZXB0aW9uKF9lbnYsIFwiamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uXCIsIik7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBcIiIgKyBjZnVuYy5nZXROYW1lKCkgKyAiXCIpOyIpOwotICAgICAgICAgICAgaWYgKGlzVm9pZCkgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICIgICAgcmV0dXJuOyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dmFsID0gZ2V0RXJyb3JSZXR1cm5WYWx1ZShjZnVuYyk7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgIiAgICByZXR1cm4gIiArIHJldHZhbCArICI7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVXNlQ29udGV4dFBvaW50ZXIpIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgImFuZHJvaWQ6OmdsOjpvZ2xlc19jb250ZXh0X3QgKmN0eCA9IGdldENvbnRleHQoX2VudiwgX3RoaXMpOyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpbml0aWFsaXplUmV0dXJuVmFsdWUgPSBzdHJpbmdBcmdzLnNpemUoKSA+IDA7Ci0KLSAgICAgICAgYm9vbGVhbiBlbWl0RXhjZXB0aW9uQ2hlY2sgPSAobnVtQXJyYXlzID4gMCB8fCBudW1CdWZmZXJzID4gMCB8fCBudW1TdHJpbmdzID4gMCkgJiYKLSAgICAgICAgICAgIGhhc05vbkNvbnN0QXJnKGpmdW5jLCBjZnVuYywgbm9uUHJpbWl0aXZlQXJncyk7Ci0gICAgICAgIC8vIG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpICE9IG51bGwKLQotICAgICAgICAvLyBFbWl0IGFuIF9leGVwdGlvbiB2YXJpYWJsZSBpZiB0aGVyZSB3aWxsIGJlIGVycm9yIGNoZWNrcwotICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiamludCBfZXhjZXB0aW9uID0gMDsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVtaXQgYSBzaW5nbGUgX2FycmF5IG9yIG11bHRpcGxlIF9YWFhBcnJheSB2YXJpYWJsZXMKLSAgICAgICAgaWYgKG51bUJ1ZmZlckFyZ3MgPT0gMSkgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJqYXJyYXkgX2FycmF5ID0gKGphcnJheSkgMDsiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnVmZmVyQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImphcnJheSBfIiArIGJ1ZmZlckFyZ05hbWVzLmdldChpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5ID0gKGphcnJheSkgMDsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWlzVm9pZCkgewotICAgICAgICAgICAgU3RyaW5nIHJldHZhbCA9IGdldEVycm9yUmV0dXJuVmFsdWUoY2Z1bmMpOwotICAgICAgICAgICAgaWYgKHJldHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgcmV0dXJuVHlwZS5nZXREZWNsYXJhdGlvbigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIF9yZXR1cm5WYWx1ZSA9ICIgKyByZXR2YWwgKyAiOyIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsaXplUmV0dXJuVmFsdWUpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyByZXR1cm5UeXBlLmdldERlY2xhcmF0aW9uKCkgKwotICAgICAgICAgICAgICAgICIgX3JldHVyblZhbHVlID0gMDsiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgcmV0dXJuVHlwZS5nZXREZWNsYXJhdGlvbigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIF9yZXR1cm5WYWx1ZTsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVtaXQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIGZvciBwb2ludGVyIGFyZ3VtZW50cwotICAgICAgICAvLwotICAgICAgICAvLyBFeGFtcGxlOgotICAgICAgICAvLwotICAgICAgICAvLyBHTGZpeGVkICplcW5fYmFzZTsKLSAgICAgICAgLy8gR0xmaXhlZCAqZXFuOwotICAgICAgICAvLwotICAgICAgICBTdHJpbmcgb2Zmc2V0ID0gIm9mZnNldCI7Ci0gICAgICAgIFN0cmluZyByZW1haW5pbmcgPSAiX3JlbWFpbmluZyI7Ci0gICAgICAgIGlmIChub25QcmltaXRpdmVBcmdzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uUHJpbWl0aXZlQXJncy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBDVHlwZSB0eXBlID0gY2Z1bmMuZ2V0QXJnVHlwZShqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlY2wgPSB0eXBlLmdldERlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWNsLmVuZHNXaXRoKCIqIikgPyAiIiA6ICIgIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2Jhc2UgPSAoIiArIGRlY2wgKyAiKSAwOyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZW1haW5pbmcgPSAoKG51bUFycmF5cyArIG51bUJ1ZmZlcnMpIDw9IDEpID8gIl9yZW1haW5pbmciIDoKLSAgICAgICAgICAgICAgICAgICAgIl8iICsgY25hbWUgKyAiUmVtYWluaW5nIjsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqaW50ICIgKyByZW1haW5pbmcgKyAiOyIpOwotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2wuZW5kc1dpdGgoIioiKSA/ICIiIDogIiAiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID0gKCIgKyBkZWNsICsgIikgMDsiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVtaXQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gZm9yIHN0cmluZ3MKLSAgICAgICAgaWYgKHN0cmluZ0FyZ3Muc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdBcmdzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGlkeCA9IHN0cmluZ0FyZ3MuZ2V0KGkpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KTsKLQotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJjb25zdCBjaGFyKiBfbmF0aXZlIiArIGNuYW1lICsgIiA9IDA7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOdWxsIHBvaW50ZXIgY2hlY2tzIGFuZCBHZXRTdHJpbmdVVEZDaGFycwotICAgICAgICBpZiAoc3RyaW5nQXJncy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ0FyZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgaWR4ID0gc3RyaW5nQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgQ1R5cGUgdHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBkZWNsID0gdHlwZS5nZXREZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJpZiAoISIgKyBjbmFtZSArICIpIHsiKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgIGpuaVRocm93RXhjZXB0aW9uKF9lbnYsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlwiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblwiLCBcIiIgKyBjbmFtZSArICIgPT0gbnVsbFwiKTsiKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgIGdvdG8gZXhpdDsiKTsKLSAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7Ci0KLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiX25hdGl2ZSIgKyBjbmFtZSArICIgPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycygiICsgY25hbWUgKyAiLCAwKTsiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVtaXQgJ0dldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwnIGZvciBhcnJheXMKLSAgICAgICAgLy8gRW1pdCAnR2V0UG9pbnRlcicgY2FsbHMgZm9yIEJ1ZmZlciBwb2ludGVycwotICAgICAgICBpbnQgYnVmQXJnSWR4ID0gMDsKLSAgICAgICAgaWYgKG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub25QcmltaXRpdmVBcmdzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGlkeCA9IG5vblByaW1pdGl2ZUFyZ3MuZ2V0KGkpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOwotICAgICAgICAgICAgICAgIG9mZnNldCA9IG51bUFycmF5cyA8PSAxID8gIm9mZnNldCIgOgotICAgICAgICAgICAgICAgICAgICBjbmFtZSArICJPZmZzZXQiOwotICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9ICgobnVtQXJyYXlzICsgbnVtQnVmZmVycykgPD0gMSkgPyAiX3JlbWFpbmluZyIgOgotICAgICAgICAgICAgICAgICAgICAiXyIgKyBjbmFtZSArICJSZW1haW5pbmciOwotCi0gICAgICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmICghIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9yZWYpIHsiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgIl9leGNlcHRpb24gPSAxOyIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgam5pVGhyb3dFeGNlcHRpb24oX2VudiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblwiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgY25hbWUgKyAiID09IG51bGxcIik7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgZ290byBleGl0OyIpOwotICAgICAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOwotCi0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJpZiAoIiArIG9mZnNldCArICIgPCAwKSB7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICJfZXhjZXB0aW9uID0gMTsiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgIGpuaVRocm93RXhjZXB0aW9uKF9lbnYsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cIiwgXCIiICsgb2Zmc2V0ICsgIiA8IDBcIik7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgZ290byBleGl0OyIpOwotICAgICAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOwotCi0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIHJlbWFpbmluZyArICIgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5HZXRBcnJheUxlbmd0aCgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKyAiX3JlZikgLSAiICsgb2Zmc2V0ICsgIjsiKTsKLQotICAgICAgICAgICAgICAgICAgICBlbWl0TmF0aXZlQm91bmRzQ2hlY2tzKGNmdW5jLCBjbmFtZSwgb3V0LCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXhjZXB0aW9uQ2hlY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCByZW1haW5pbmcsICIgICAgIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2Jhc2UgPSAoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5nZXREZWNsYXJhdGlvbigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldEFyZ05hbWUoaWR4KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfcmVmLCAoamJvb2xlYW4gKikwKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKyAiID0gIiArIGNuYW1lICsgIl9iYXNlICsgIiArIG9mZnNldCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFycmF5ID0gbnVtQnVmZmVyQXJncyA8PSAxID8gIl9hcnJheSIgOgotICAgICAgICAgICAgICAgICAgICAgICAgIl8iICsgYnVmZmVyQXJnTmFtZXMuZ2V0KGJ1ZkFyZ0lkeCsrKSArICJBcnJheSI7Ci0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBudWxsQWxsb3dlZCA9IGlzTnVsbEFsbG93ZWQoY2Z1bmMpIHx8IGlzUG9pbnRlckZ1bmM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChudWxsQWxsb3dlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImlmICgiICsgY25hbWUgKyAiX2J1ZikgeyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID0gKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuZ2V0RGVjbGFyYXRpb24oKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGdldERpcmVjdEJ1ZmZlclBvaW50ZXIoX2VudiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsgIl9idWYpOyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlpaSA9ICIgICAgIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJpZiAoICEgIiArIGNuYW1lICsgIiApIHsiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGlpaSArIGluZGVudCArICJyZXR1cm47Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAifSIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPSAoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuZ2V0RGVjbGFyYXRpb24oKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKWdldFBvaW50ZXIoX2VudiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2J1ZiwgJiIgKyBhcnJheSArICIsICYiICsgcmVtYWluaW5nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOyIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZW1pdE5hdGl2ZUJvdW5kc0NoZWNrcyhjZnVuYywgY25hbWUsIG91dCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXhjZXB0aW9uQ2hlY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCByZW1haW5pbmcsIG51bGxBbGxvd2VkID8gIiAgICAgICAgIiA6ICIgICAgIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bGxBbGxvd2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc1ZvaWQpIHsKLSAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQgKyAiX3JldHVyblZhbHVlID0gIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50KTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbmFtZSA9IGNmdW5jLmdldE5hbWUoKTsKLQotICAgICAgICBpZiAobVVzZUNvbnRleHRQb2ludGVyKSB7Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMiwgbmFtZS5sZW5ndGgoKSk7IC8vIFN0cmlwIG9mZiAnZ2wnIHByZWZpeAotICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKwotICAgICAgICAgICAgICAgIG5hbWUuc3Vic3RyaW5nKDEsIG5hbWUubGVuZ3RoKCkpOwotICAgICAgICAgICAgb3V0LnByaW50KCJjdHgtPnByb2NzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LnByaW50KG5hbWUgKyAoaXNQb2ludGVyRnVuYyA/ICJCb3VuZHMiIDogIiIpICsgIigiKTsKLQotICAgICAgICBudW1BcmdzID0gY2Z1bmMuZ2V0TnVtQXJncygpOwotICAgICAgICBpZiAobnVtQXJncyA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobVVzZUNvbnRleHRQb2ludGVyKSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oImN0eCk7Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJjdHgsIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlY2FzdDsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSAmJiBpc1ZCT1BvaW50ZXJGdW5jKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVjYXN0ID0gImNvbnN0IEdMdm9pZCAqIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0eXBlY2FzdCA9IGNmdW5jLmdldEFyZ1R5cGUoaSkuZ2V0RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCArIGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVjYXN0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIikiKTsKLSAgICAgICAgICAgICAgICBpZiAoY2Z1bmMuZ2V0QXJnVHlwZShpKS5pc0NvbnN0Q2hhclBvaW50ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIl9uYXRpdmUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50KGNmdW5jLmdldEFyZ05hbWUoaSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGkgPT0gbnVtQXJncyAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiKEdMc2l6ZWkpcmVtYWluaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiKTsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZWVkc0V4aXQpIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiZXhpdDoiKTsKLSAgICAgICAgICAgIG5lZWRzRXhpdCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmQXJnSWR4ID0gMDsKLSAgICAgICAgaWYgKG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKLSAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQXJyYXkoKSkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmd1bWVudCBpcyAnY29uc3QnLCBHTCB3aWxsIG5vdCB3cml0ZSB0byBpdC4KLSAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gdXNlIHRoZSAnSk5JX0FCT1JUJyBmbGFnIHRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZWVkIHRvIHdyaXRlIGJhY2sgdG8gdGhlIEphdmEgYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmICgiICsgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsgIl9iYXNlKSB7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsgIl9yZWYsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2Jhc2UsIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArIGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuaXNDb25zdCgpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKTklfQUJPUlQiIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfZXhjZXB0aW9uID8gSk5JX0FCT1JUOiAwIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0J1ZmZlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghIGlzUG9pbnRlckZ1bmMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcnJheSA9IG51bUJ1ZmZlckFyZ3MgPD0gMSA/ICJfYXJyYXkiIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXyIgKyBidWZmZXJBcmdOYW1lcy5nZXQoYnVmQXJnSWR4KyspICsgIkFycmF5IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJpZiAoIiArIGFycmF5ICsgIikgeyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlUG9pbnRlcihfZW52LCAiICsgYXJyYXkgKyAiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuaXNDb25zdCgpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSk5JX0ZBTFNFIiA6ICJfZXhjZXB0aW9uID8gSk5JX0ZBTFNFIDoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgSk5JX1RSVUUiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbWl0IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZvciBzdHJpbmdzCi0gICAgICAgIGlmIChzdHJpbmdBcmdzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nQXJncy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGludCBpZHggPSBzdHJpbmdBcmdzLmdldChpKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKF9uYXRpdmUiICsgY25hbWUgKyAiKSB7Iik7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICBfZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoIiArIGNuYW1lICsgIiwgX25hdGl2ZSIgKyBjbmFtZSArICIpOyIpOwotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICghaXNWb2lkKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAicmV0dXJuIF9yZXR1cm5WYWx1ZTsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pzcjIzOUNvZGVFbWl0dGVyLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pzcjIzOUNvZGVFbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMGVmZTMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Kc3IyMzlDb2RlRW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi0vKioKLSAqIEVtaXRzIGEgSmF2YSBpbnRlcmZhY2UgYW5kIEphdmEgJiBDIGltcGxlbWVudGF0aW9uIGZvciBhIEMgZnVuY3Rpb24uCi0gKgotICogPHA+IFRoZSBKYXZhIGludGVyZmFjZSB3aWxsIGhhdmUgQnVmZmVyIGFuZCBhcnJheSB2YXJpYW50cyBmb3IgZnVuY3Rpb25zIHRoYXQKLSAqIGhhdmUgYSB0eXBlZCBwb2ludGVyIGFyZ3VtZW50LiAgVGhlIGFycmF5IHZhcmlhbnQgd2lsbCBjb252ZXJ0IGEgc2luZ2xlICI8dHlwZT4gKmRhdGEiCi0gKiBhcmd1bWVudCB0byBhIHBhaXIgb2YgYXJndW1lbnRzICI8dHlwZT5bXSBkYXRhLCBpbnQgb2Zmc2V0Ii4KLSAqLwotcHVibGljIGNsYXNzIEpzcjIzOUNvZGVFbWl0dGVyIGV4dGVuZHMgSm5pQ29kZUVtaXR0ZXIgaW1wbGVtZW50cyBDb2RlRW1pdHRlciB7Ci0KLSAgICBQcmludFN0cmVhbSBtSmF2YTEwSW50ZXJmYWNlU3RyZWFtOwotICAgIFByaW50U3RyZWFtIG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW07Ci0gICAgUHJpbnRTdHJlYW0gbUphdmExMUludGVyZmFjZVN0cmVhbTsKLSAgICBQcmludFN0cmVhbSBtSmF2YTExRXh0SW50ZXJmYWNlU3RyZWFtOwotICAgIFByaW50U3RyZWFtIG1KYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtOwotICAgIFByaW50U3RyZWFtIG1KYXZhSW1wbFN0cmVhbTsKLSAgICBQcmludFN0cmVhbSBtQ1N0cmVhbTsKLQotICAgIFByaW50U3RyZWFtIG1KYXZhSW50ZXJmYWNlU3RyZWFtOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGphdmExMEludGVyZmFjZVN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbnRlcmZhY2UgZm9yIEdMIDEuMCBmdW5jdGlvbnMKLSAgICAgKiBAcGFyYW0gamF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4wIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAgICAgKiBAcGFyYW0gamF2YTExSW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4xIGZ1bmN0aW9ucwotICAgICAqIEBwYXJhbSBqYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjEgRXh0ZW5zaW9uIGZ1bmN0aW9ucwotICAgICAqIEBwYXJhbSBqYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4xIEV4dGVuc2lvbiBQYWNrIGZ1bmN0aW9ucwotICAgICAqIEBwYXJhbSBqYXZhSW1wbFN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbgotICAgICAqIEBwYXJhbSBjU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBDIGltcGxlbWVudGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIEpzcjIzOUNvZGVFbWl0dGVyKFN0cmluZyBjbGFzc1BhdGhOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJDaGVja2VyIGNoZWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMEludGVyZmFjZVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTFJbnRlcmZhY2VTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMUV4dEludGVyZmFjZVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YUltcGxTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlQ29udGV4dFBvaW50ZXIpIHsKLSAgICAgICAgbUNsYXNzUGF0aE5hbWUgPSBjbGFzc1BhdGhOYW1lOwotICAgICAgICBtQ2hlY2tlciA9IGNoZWNrZXI7Ci0gICAgICAgIG1KYXZhMTBJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTBJbnRlcmZhY2VTdHJlYW07Ci0gICAgICAgIG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW07Ci0gICAgICAgIG1KYXZhMTFJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTFJbnRlcmZhY2VTdHJlYW07Ci0gICAgICAgIG1KYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW07Ci0gICAgICAgIG1KYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtID0gamF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbTsKLSAgICAgICAgbUphdmFJbXBsU3RyZWFtID0gamF2YUltcGxTdHJlYW07Ci0gICAgICAgIG1DU3RyZWFtID0gY1N0cmVhbTsKLSAgICAgICAgbVVzZUNvbnRleHRQb2ludGVyID0gdXNlQ29udGV4dFBvaW50ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbiwgYm9vbGVhbiBleHQsIGJvb2xlYW4gcGFjaykgewotICAgICAgICBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgICAgICBtSmF2YUludGVyZmFjZVN0cmVhbSA9IGV4dCA/IG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0gOgotICAgICAgICAgICAgICAgIG1KYXZhMTBJbnRlcmZhY2VTdHJlYW07Ci0gICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgICAgICBtSmF2YUludGVyZmFjZVN0cmVhbSA9IGV4dCA/Ci0gICAgICAgICAgICAgICAgKHBhY2sgPyBtSmF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSA6Ci0gICAgICAgICAgICAgICAgIG1KYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0pIDoKLSAgICAgICAgICAgICAgICBtSmF2YTExSW50ZXJmYWNlU3RyZWFtOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJhZCB2ZXJzaW9uOiAiICsgdmVyc2lvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbWl0Q29kZShDRnVuYyBjZnVuYywgU3RyaW5nIG9yaWdpbmFsKSB7Ci0gICAgICAgIGVtaXRDb2RlKGNmdW5jLCBvcmlnaW5hbCwgbUphdmFJbnRlcmZhY2VTdHJlYW0sIG1KYXZhSW1wbFN0cmVhbSwgbUNTdHJlYW0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVtaXROYXRpdmVSZWdpc3RyYXRpb24oKSB7Ci0gICAgICAgIGVtaXROYXRpdmVSZWdpc3RyYXRpb24oInJlZ2lzdGVyX2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwiLCBtQ1N0cmVhbSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9QYXJhbWV0ZXJDaGVja2VyLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL1BhcmFtZXRlckNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmNmQ4Ni4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL1BhcmFtZXRlckNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckNoZWNrZXIgewotCi0gICAgSGFzaE1hcDxTdHJpbmcsU3RyaW5nW10+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmdbXT4oKTsKLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJDaGVja2VyKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzOwotICAgICAgICB3aGlsZSAoKHMgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gcy5zcGxpdCgiXFxzIik7Ci0gICAgICAgICAgICBtYXAucHV0KHRva2Vuc1swXSwgdG9rZW5zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDaGVja3MoU3RyaW5nIGZ1bmN0aW9uTmFtZSkgewotICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtYXAuZ2V0KGZ1bmN0aW9uTmFtZSk7Ci0gICAgICAgIGlmIChjaGVja3MgPT0gbnVsbCAmJgotICAgICAgICAgICAgKGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgiZnYiKSB8fAotICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgieHYiKSB8fAotICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgiaXYiKSkpIHsKLSAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uTmFtZS5zdWJzdHJpbmcoMCwgZnVuY3Rpb25OYW1lLmxlbmd0aCgpIC0gMik7Ci0gICAgICAgICAgICBjaGVja3MgPSBtYXAuZ2V0KGZ1bmN0aW9uTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoZWNrczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMEV4dEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBFeHRIZWFkZXIuamF2YS1pZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4OTFlYS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMEV4dEhlYWRlci5qYXZhLWlmCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotKioKLSoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCi1wYWNrYWdlIGFuZHJvaWQub3BlbmdsOwotCi1wdWJsaWMgY2xhc3MgR0xFUzEwRXh0IHsKLSAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfbmF0aXZlQ2xhc3NJbml0KCk7Ci0gICAgc3RhdGljIHsKLQkgICAgX25hdGl2ZUNsYXNzSW5pdCgpOwotICAgIH0KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMEV4dGNIZWFkZXIuY3BwIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBFeHRjSGVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0MThkNy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMEV4dGNIZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCi0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAiSk5JSGVscC5oIgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwotCi1zdGF0aWMgamNsYXNzIG5pb0FjY2Vzc0NsYXNzOwotc3RhdGljIGpjbGFzcyBidWZmZXJDbGFzczsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZVBvaW50ZXJJRDsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5SUQ7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheU9mZnNldElEOwotc3RhdGljIGpmaWVsZElEIHBvc2l0aW9uSUQ7Ci1zdGF0aWMgamZpZWxkSUQgbGltaXRJRDsKLXN0YXRpYyBqZmllbGRJRCBlbGVtZW50U2l6ZVNoaWZ0SUQ7Ci0KLS8qIENhY2hlIG1ldGhvZCBJRHMgZWFjaCB0aW1lIHRoZSBjbGFzcyBpcyBsb2FkZWQuICovCi0KLXN0YXRpYyB2b2lkCi1uYXRpdmVDbGFzc0luaXQoSk5JRW52ICpfZW52LCBqY2xhc3MgZ2xJbXBsQ2xhc3MpCi17Ci0gICAgamNsYXNzIG5pb0FjY2Vzc0NsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL05JT0FjY2VzcyIpOwotICAgIG5pb0FjY2Vzc0NsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKG5pb0FjY2Vzc0NsYXNzTG9jYWwpOwotCi0gICAgamNsYXNzIGJ1ZmZlckNsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL0J1ZmZlciIpOwotICAgIGJ1ZmZlckNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKGJ1ZmZlckNsYXNzTG9jYWwpOwotCi0gICAgZ2V0QmFzZVBvaW50ZXJJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VQb2ludGVyIiwgIihMamF2YS9uaW8vQnVmZmVyOylKIik7Ci0gICAgZ2V0QmFzZUFycmF5SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlQXJyYXkiLCAiKExqYXZhL25pby9CdWZmZXI7KUxqYXZhL2xhbmcvT2JqZWN0OyIpOwotICAgIGdldEJhc2VBcnJheU9mZnNldElEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZUFycmF5T2Zmc2V0IiwgIihMamF2YS9uaW8vQnVmZmVyOylJIik7Ci0KLSAgICBwb3NpdGlvbklEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgInBvc2l0aW9uIiwgIkkiKTsKLSAgICBsaW1pdElEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgImxpbWl0IiwgIkkiKTsKLSAgICBlbGVtZW50U2l6ZVNoaWZ0SUQgPQotICAgICAgICBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAiX2VsZW1lbnRTaXplU2hpZnQiLCAiSSIpOwotfQotCi0KLXN0YXRpYyB2b2lkICoKLWdldFBvaW50ZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IGJ1ZmZlciwgamFycmF5ICphcnJheSwgamludCAqcmVtYWluaW5nKQotewotICAgIGppbnQgcG9zaXRpb247Ci0gICAgamludCBsaW1pdDsKLSAgICBqaW50IGVsZW1lbnRTaXplU2hpZnQ7Ci0gICAgamxvbmcgcG9pbnRlcjsKLSAgICBqaW50IG9mZnNldDsKLSAgICB2b2lkICpkYXRhOwotCi0gICAgcG9zaXRpb24gPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIHBvc2l0aW9uSUQpOwotICAgIGxpbWl0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBsaW1pdElEKTsKLSAgICBlbGVtZW50U2l6ZVNoaWZ0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBlbGVtZW50U2l6ZVNoaWZ0SUQpOwotICAgICpyZW1haW5pbmcgPSAobGltaXQgLSBwb3NpdGlvbikgPDwgZWxlbWVudFNpemVTaGlmdDsKLSAgICBwb2ludGVyID0gX2Vudi0+Q2FsbFN0YXRpY0xvbmdNZXRob2QobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICBnZXRCYXNlUG9pbnRlcklELCBidWZmZXIpOwotICAgIGlmIChwb2ludGVyICE9IDBMKSB7Ci0gICAgICAgICphcnJheSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAodm9pZCAqKSAoamludCkgcG9pbnRlcjsKLSAgICB9Ci0KLSAgICAqYXJyYXkgPSAoamFycmF5KSBfZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZUFycmF5SUQsIGJ1ZmZlcik7Ci0gICAgb2Zmc2V0ID0gX2Vudi0+Q2FsbFN0YXRpY0ludE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VBcnJheU9mZnNldElELCBidWZmZXIpOwotICAgIGRhdGEgPSBfZW52LT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKCphcnJheSwgKGpib29sZWFuICopIDApOwotCi0gICAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBkYXRhICsgb2Zmc2V0KTsKLX0KLQotCi1zdGF0aWMgdm9pZAotcmVsZWFzZVBvaW50ZXIoSk5JRW52ICpfZW52LCBqYXJyYXkgYXJyYXksIHZvaWQgKmRhdGEsIGpib29sZWFuIGNvbW1pdCkKLXsKLSAgICBfZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChhcnJheSwgZGF0YSwKLQkJCQkJICAgY29tbWl0ID8gMCA6IEpOSV9BQk9SVCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBIZWFkZXIuamF2YS1pZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTgzMS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMEhlYWRlci5qYXZhLWlmCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCi1wYWNrYWdlIGFuZHJvaWQub3BlbmdsOwotCi1pbXBvcnQgamF2YS5uaW8uQnVmZmVyOwotCi1wdWJsaWMgY2xhc3MgR0xFUzEwIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAgICAgICAgPSAweDg0NkU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAgICAgICA9IDB4ODQ2RDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAgICAgICAgICAgICAgICAgICA9IDB4MTYwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FORF9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU5EX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxVRV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODEyRjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9MT0dJQ19PUCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkYyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX01BVEVSSUFMICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgICAgICAgICAgICA9IDB4ODZBMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgID0gMHgxMjA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09QWV9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwQzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVUxMX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjEwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDEwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRElUSEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJEMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET05UX0NBUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVFVSVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VYUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA4MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MEM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkxBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUQwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfREVOU0lUWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX0hJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUyAgPSAweDhCOUI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAgICA9IDB4OEI5QTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAgICAgICAgICAgICAgICAgICA9IDB4MEI1MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAgICAgICAgICAgICAgICAgID0gMHgwQjUyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjUwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIyMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzUyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RSSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjYwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FQVJfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgICAgID0gMHgxMjA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICAgICAgICAgICAgICAgICAgPSAweDI3MDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgICAgICAgICA9IDB4MjcwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgICAgICAgID0gMHg4MEU5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyAgICAgICAgICAgICAgICAgPSAweDgwRTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0xJR0hUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgICAgICAgID0gMHgwRDM2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAgICAgICAgPSAweDBEMzg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgICAgICAgID0gMHgwRDM5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9URVhUVVJFX1VOSVRTICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NT0RFTFZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01PRFVMQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIxMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTVVMVElTQU1QTEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA5RDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI2MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICAgICAgICAgICAgICAgICA9IDB4MjcwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUICAgICAgICAgICAgICAgID0gMHgyNzAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTklDRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkExOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAgICA9IDB4ODZBMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgID0gMHgwMzA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgPSAweDAzMDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICA9IDB4MDMwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgID0gMHgwMzAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1JfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwRDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUl9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgID0gMHg4QjkyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgPSAweDhCOTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFMRVRURTRfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICA9IDB4OEI5MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjkzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBTEVUVEU0X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICA9IDB4OEI5NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgID0gMHg4Qjk5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBTEVUVEU4X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhCOTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFMRVRURThfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCAgICAgICAgICAgPSAweDBDNTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU01PT1RIICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIxMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICAgID0gMHgwQzUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRSAgICAgICAgICAgICA9IDB4ODEyODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjExOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAgICAgICAgPSAweDgwMzc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICA9IDB4MEM1MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT1NJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE3MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OICAgICAgICAgICAgICAgICA9IDB4MTIwOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRURfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjkwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwM0E7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAgICAgICAgICAgICAgPSAweDgwOUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0FMUEhBX1RPX09ORSAgICAgICAgICAgICAgICAgICA9IDB4ODA5RjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwRjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TSElOSU5FU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNjAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU01PT1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUQwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSAgICAgICAgICAgICAgID0gMHgwQjIyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAgICAgICAgPSAweDBCMTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1BFQ1VMQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTIwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUE9UX0NVVE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQT1RfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1BPVF9FWFBPTkVOVCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTIwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAgICAgICAgPSAweDAzMDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgID0gMHgwNDAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1VCUElYRUxfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBERTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAgICAgICAgICAgICAgICAgICA9IDB4ODA3ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0VOViAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMzAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfRU5WX0NPTE9SICAgICAgICAgICAgICAgICAgICAgPSAweDIyMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9FTlZfTU9ERSAgICAgICAgICAgICAgICAgICAgICA9IDB4MjIwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgICAgICAgID0gMHgyODAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgPSAweDI4MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9XUkFQX1MgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjgwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyODAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0M7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDRDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0Y7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRENjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREQzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEREOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRERjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UUklBTkdMRV9GQU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJJQU5HTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgID0gMHgwQ0Y1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgICAgICAgID0gMHg4MDMzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAgICAgICAgPSAweDgwMzQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgICAgICAgICA9IDB4ODM2MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9YT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwotCi0gICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIHZvaWQgX25hdGl2ZUNsYXNzSW5pdCgpOwotICAgIHN0YXRpYyB7Ci0JICAgIF9uYXRpdmVDbGFzc0luaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCdWZmZXIgX2NvbG9yUG9pbnRlcjsKLSAgICBwcml2YXRlIHN0YXRpYyBCdWZmZXIgX25vcm1hbFBvaW50ZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQnVmZmVyIF90ZXhDb29yZFBvaW50ZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQnVmZmVyIF92ZXJ0ZXhQb2ludGVyOwotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMGNIZWFkZXIuY3BwIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBjSGVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhM2MzMy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMGNIZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCi0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAiSk5JSGVscC5oIgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLS8qIHNwZWNpYWwgY2FsbHMgaW1wbGVtZW50ZWQgaW4gQW5kcm9pZCdzIEdMRVMgd3JhcHBlciB1c2VkIHRvIG1vcmUKLSAqIGVmZmljaWVudGx5IGJvdW5kLWNoZWNrIHBhc3NlZCBhcnJheXMgKi8KLWV4dGVybiAiQyIgewotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvclBvaW50ZXJCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAotICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE5vcm1hbFBvaW50ZXJCb3VuZHMoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAotICAgICAgICBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXJCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCi0gICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKLX0KLQotc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Ci0KLXN0YXRpYyBqY2xhc3MgbmlvQWNjZXNzQ2xhc3M7Ci1zdGF0aWMgamNsYXNzIGJ1ZmZlckNsYXNzOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlUG9pbnRlcklEOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlQXJyYXlJRDsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5T2Zmc2V0SUQ7Ci1zdGF0aWMgamZpZWxkSUQgcG9zaXRpb25JRDsKLXN0YXRpYyBqZmllbGRJRCBsaW1pdElEOwotc3RhdGljIGpmaWVsZElEIGVsZW1lbnRTaXplU2hpZnRJRDsKLQotLyogQ2FjaGUgbWV0aG9kIElEcyBlYWNoIHRpbWUgdGhlIGNsYXNzIGlzIGxvYWRlZC4gKi8KLQotc3RhdGljIHZvaWQKLW5hdGl2ZUNsYXNzSW5pdChKTklFbnYgKl9lbnYsIGpjbGFzcyBnbEltcGxDbGFzcykKLXsKLSAgICBqY2xhc3MgbmlvQWNjZXNzQ2xhc3NMb2NhbCA9IF9lbnYtPkZpbmRDbGFzcygiamF2YS9uaW8vTklPQWNjZXNzIik7Ci0gICAgbmlvQWNjZXNzQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYobmlvQWNjZXNzQ2xhc3NMb2NhbCk7Ci0KLSAgICBqY2xhc3MgYnVmZmVyQ2xhc3NMb2NhbCA9IF9lbnYtPkZpbmRDbGFzcygiamF2YS9uaW8vQnVmZmVyIik7Ci0gICAgYnVmZmVyQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoYnVmZmVyQ2xhc3NMb2NhbCk7Ci0KLSAgICBnZXRCYXNlUG9pbnRlcklEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZVBvaW50ZXIiLCAiKExqYXZhL25pby9CdWZmZXI7KUoiKTsKLSAgICBnZXRCYXNlQXJyYXlJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VBcnJheSIsICIoTGphdmEvbmlvL0J1ZmZlcjspTGphdmEvbGFuZy9PYmplY3Q7Iik7Ci0gICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlQXJyYXlPZmZzZXQiLCAiKExqYXZhL25pby9CdWZmZXI7KUkiKTsKLQotICAgIHBvc2l0aW9uSUQgPSBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAicG9zaXRpb24iLCAiSSIpOwotICAgIGxpbWl0SUQgPSBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAibGltaXQiLCAiSSIpOwotICAgIGVsZW1lbnRTaXplU2hpZnRJRCA9Ci0gICAgICAgIF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJfZWxlbWVudFNpemVTaGlmdCIsICJJIik7Ci19Ci0KLXN0YXRpYyB2b2lkICoKLWdldFBvaW50ZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IGJ1ZmZlciwgamFycmF5ICphcnJheSwgamludCAqcmVtYWluaW5nKQotewotICAgIGppbnQgcG9zaXRpb247Ci0gICAgamludCBsaW1pdDsKLSAgICBqaW50IGVsZW1lbnRTaXplU2hpZnQ7Ci0gICAgamxvbmcgcG9pbnRlcjsKLSAgICBqaW50IG9mZnNldDsKLSAgICB2b2lkICpkYXRhOwotCi0gICAgcG9zaXRpb24gPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIHBvc2l0aW9uSUQpOwotICAgIGxpbWl0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBsaW1pdElEKTsKLSAgICBlbGVtZW50U2l6ZVNoaWZ0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBlbGVtZW50U2l6ZVNoaWZ0SUQpOwotICAgICpyZW1haW5pbmcgPSAobGltaXQgLSBwb3NpdGlvbikgPDwgZWxlbWVudFNpemVTaGlmdDsKLSAgICBwb2ludGVyID0gX2Vudi0+Q2FsbFN0YXRpY0xvbmdNZXRob2QobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICBnZXRCYXNlUG9pbnRlcklELCBidWZmZXIpOwotICAgIGlmIChwb2ludGVyICE9IDBMKSB7Ci0gICAgICAgICphcnJheSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAodm9pZCAqKSAoamludCkgcG9pbnRlcjsKLSAgICB9Ci0KLSAgICAqYXJyYXkgPSAoamFycmF5KSBfZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZUFycmF5SUQsIGJ1ZmZlcik7Ci0gICAgb2Zmc2V0ID0gX2Vudi0+Q2FsbFN0YXRpY0ludE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VBcnJheU9mZnNldElELCBidWZmZXIpOwotICAgIGRhdGEgPSBfZW52LT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKCphcnJheSwgKGpib29sZWFuICopIDApOwotCi0gICAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBkYXRhICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQKLXJlbGVhc2VQb2ludGVyKEpOSUVudiAqX2VudiwgamFycmF5IGFycmF5LCB2b2lkICpkYXRhLCBqYm9vbGVhbiBjb21taXQpCi17Ci0gICAgX2Vudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoYXJyYXksIGRhdGEsCi0JCQkJCSAgIGNvbW1pdCA/IDAgOiBKTklfQUJPUlQpOwotfQotCi1zdGF0aWMgdm9pZCAqCi1nZXREaXJlY3RCdWZmZXJQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIpIHsKLSAgICBjaGFyKiBidWYgPSAoY2hhciopIF9lbnYtPkdldERpcmVjdEJ1ZmZlckFkZHJlc3MoYnVmZmVyKTsKLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgIGppbnQgcG9zaXRpb24gPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIHBvc2l0aW9uSUQpOwotICAgICAgICBqaW50IGVsZW1lbnRTaXplU2hpZnQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGVsZW1lbnRTaXplU2hpZnRJRCk7Ci0gICAgICAgIGJ1ZiArPSBwb3NpdGlvbiA8PCBlbGVtZW50U2l6ZVNoaWZ0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKF9lbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3QgdXNlIGEgbmF0aXZlIG9yZGVyIGRpcmVjdCBCdWZmZXIiKTsKLSAgICB9Ci0gICAgcmV0dXJuICh2b2lkKikgYnVmOwotfQotCi1zdGF0aWMgaW50Ci1nZXROdW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKSB7Ci0gICAgaW50IG51bUNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IDA7Ci0gICAgZ2xHZXRJbnRlZ2VydihHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsICZudW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHMpOwotICAgIHJldHVybiBudW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHM7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMUV4dEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTFFeHRIZWFkZXIuamF2YS1pZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1ZmEwNC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMUV4dEhlYWRlci5qYXZhLWlmCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKLQotaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKLQotcHVibGljIGNsYXNzIEdMRVMxMUV4dCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfRVFVQVRJT05fUkdCX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9FUVVBVElPTl9BTFBIQV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODNEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0RTVF9SR0JfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQzg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfU1JDX1JHQl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9EU1RfQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MENBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX1NSQ19BTFBIQV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQ0I7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfRVFVQVRJT05fT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GVU5DX0FERF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZVTkNfU1VCVFJBQ1RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMEE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwQjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FVEMxX1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDY0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDI0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQ09NUE9ORU5UMzJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODFBNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjlEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZJWEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MEM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9ORV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0I1NjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDYyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDE2X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX1dJRFRIX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVRfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhENDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDU0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRV9PRVMgICAgICAgICAgICAgICA9IDB4OENEMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX09FUyAgICAgICAgICAgICAgID0gMHg4Q0QxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTF9PRVMgICAgICAgICAgICAgPSAweDhDRDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0VfT0VTICAgICA9IDB4OENEMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhEMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQyMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0Q1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgPSAweDhDRDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfT0VTICAgICAgICA9IDB4OENENzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfT0VTICAgICAgICAgICAgICAgID0gMHg4Q0Q5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19PRVMgICAgICAgICAgICAgICAgICAgPSAweDhDREE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENERDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0E2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDQTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTl9PRVMgICAgICAgICAgICAgICAgICAgID0gMHgwNTA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dSSVRFX09OTFlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4Qjk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQlVGRkVSX0FDQ0VTU19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCQjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CVUZGRVJfTUFQUEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEJDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JVRkZFUl9NQVBfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4QkQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgICAgICAgICAgICAgICA9IDB4ODk4RDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgICAgICAgICAgICAgID0gMHg4OThFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgICAgICAgICAgICAgICAgPSAweDg5OEY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZFUlRFWF9VTklUU19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODQyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BVFJJWF9QQUxFVFRFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg0NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9XRUlHSFRfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVUlJFTlRfUEFMRVRURV9NQVRSSVhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg0NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODQ3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg0OTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgID0gMHg4QjlFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dFSUdIVF9BUlJBWV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QUI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfV0VJR0hUX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dFSUdIVF9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QUM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfV0VJR0hUX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg5RTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9TVEVOQ0lMX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEY5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOU0lHTkVEX0lOVF8yNF84X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RkE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEgyNF9TVEVOQ0lMOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhGMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9JTkRFWDFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0lOREVYNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfSU5ERVg4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5DUl9XUkFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUwNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERUNSX1dSQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9NQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVGTEVDVElPTl9NQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTEzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWl9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MUE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxQzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0dFTl9NT0RFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX1NUUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUlSUk9SRURfUkVQRUFUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODM3MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRENfWF9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4N0Y5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMXzNEQ19YWV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg3RkE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVRDX1JHQl9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEM5MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BVENfUkdCQV9FWFBMSUNJVF9BTFBIQV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QzkzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FUQ19SR0JBX0lOVEVSUE9MQVRFRF9BTFBIQV9BTUQgICAgICAgICAgICAgICAgICAgICAgPSAweDg3RUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRGRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEZGOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JHUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwRTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ2NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQU1QTEVSX0VYVEVSTkFMX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDY2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQklORElOR19FWFRFUk5BTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENjc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVRVUlSRURfVEVYVFVSRV9JTUFHRV9VTklUU19PRVMgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ2ODsKLQotICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKLSAgICBzdGF0aWMgewotCSAgICBfbmF0aXZlQ2xhc3NJbml0KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHTF9CWVRFID0gR0xFUzEwLkdMX0JZVEU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdMX0ZJWEVEID0gR0xFUzEwLkdMX0ZJWEVEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHTF9GTE9BVCA9IEdMRVMxMC5HTF9GTE9BVDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hPUlQgPSBHTEVTMTAuR0xfU0hPUlQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVmZmVyIF9tYXRyaXhJbmRleFBvaW50ZXJPRVM7CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMUV4dGNIZWFkZXIuY3BwIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTFFeHRjSGVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyOWE0NC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMUV4dGNIZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCi0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAiSk5JSGVscC5oIgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLS8qIHNwZWNpYWwgY2FsbHMgaW1wbGVtZW50ZWQgaW4gQW5kcm9pZCdzIEdMRVMgd3JhcHBlciB1c2VkIHRvIG1vcmUKLSAqIGVmZmljaWVudGx5IGJvdW5kLWNoZWNrIHBhc3NlZCBhcnJheXMgKi8KLWV4dGVybiAiQyIgewotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVNCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAotICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFdlaWdodFBvaW50ZXJPRVNCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAotICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciwgR0xzaXplaSBjb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwotCi1zdGF0aWMgamNsYXNzIG5pb0FjY2Vzc0NsYXNzOwotc3RhdGljIGpjbGFzcyBidWZmZXJDbGFzczsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZVBvaW50ZXJJRDsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5SUQ7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheU9mZnNldElEOwotc3RhdGljIGpmaWVsZElEIHBvc2l0aW9uSUQ7Ci1zdGF0aWMgamZpZWxkSUQgbGltaXRJRDsKLXN0YXRpYyBqZmllbGRJRCBlbGVtZW50U2l6ZVNoaWZ0SUQ7Ci0KLS8qIENhY2hlIG1ldGhvZCBJRHMgZWFjaCB0aW1lIHRoZSBjbGFzcyBpcyBsb2FkZWQuICovCi0KLXN0YXRpYyB2b2lkCi1uYXRpdmVDbGFzc0luaXQoSk5JRW52ICpfZW52LCBqY2xhc3MgZ2xJbXBsQ2xhc3MpCi17Ci0gICAgamNsYXNzIG5pb0FjY2Vzc0NsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL05JT0FjY2VzcyIpOwotICAgIG5pb0FjY2Vzc0NsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKG5pb0FjY2Vzc0NsYXNzTG9jYWwpOwotCi0gICAgamNsYXNzIGJ1ZmZlckNsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL0J1ZmZlciIpOwotICAgIGJ1ZmZlckNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKGJ1ZmZlckNsYXNzTG9jYWwpOwotCi0gICAgZ2V0QmFzZVBvaW50ZXJJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VQb2ludGVyIiwgIihMamF2YS9uaW8vQnVmZmVyOylKIik7Ci0gICAgZ2V0QmFzZUFycmF5SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlQXJyYXkiLCAiKExqYXZhL25pby9CdWZmZXI7KUxqYXZhL2xhbmcvT2JqZWN0OyIpOwotICAgIGdldEJhc2VBcnJheU9mZnNldElEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZUFycmF5T2Zmc2V0IiwgIihMamF2YS9uaW8vQnVmZmVyOylJIik7Ci0KLSAgICBwb3NpdGlvbklEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgInBvc2l0aW9uIiwgIkkiKTsKLSAgICBsaW1pdElEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgImxpbWl0IiwgIkkiKTsKLSAgICBlbGVtZW50U2l6ZVNoaWZ0SUQgPQotICAgICAgICBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAiX2VsZW1lbnRTaXplU2hpZnQiLCAiSSIpOwotfQotCi0KLXN0YXRpYyB2b2lkICoKLWdldFBvaW50ZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IGJ1ZmZlciwgamFycmF5ICphcnJheSwgamludCAqcmVtYWluaW5nKQotewotICAgIGppbnQgcG9zaXRpb247Ci0gICAgamludCBsaW1pdDsKLSAgICBqaW50IGVsZW1lbnRTaXplU2hpZnQ7Ci0gICAgamxvbmcgcG9pbnRlcjsKLSAgICBqaW50IG9mZnNldDsKLSAgICB2b2lkICpkYXRhOwotCi0gICAgcG9zaXRpb24gPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIHBvc2l0aW9uSUQpOwotICAgIGxpbWl0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBsaW1pdElEKTsKLSAgICBlbGVtZW50U2l6ZVNoaWZ0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBlbGVtZW50U2l6ZVNoaWZ0SUQpOwotICAgICpyZW1haW5pbmcgPSAobGltaXQgLSBwb3NpdGlvbikgPDwgZWxlbWVudFNpemVTaGlmdDsKLSAgICBwb2ludGVyID0gX2Vudi0+Q2FsbFN0YXRpY0xvbmdNZXRob2QobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICBnZXRCYXNlUG9pbnRlcklELCBidWZmZXIpOwotICAgIGlmIChwb2ludGVyICE9IDBMKSB7Ci0gICAgICAgICphcnJheSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAodm9pZCAqKSAoamludCkgcG9pbnRlcjsKLSAgICB9Ci0KLSAgICAqYXJyYXkgPSAoamFycmF5KSBfZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZUFycmF5SUQsIGJ1ZmZlcik7Ci0gICAgb2Zmc2V0ID0gX2Vudi0+Q2FsbFN0YXRpY0ludE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VBcnJheU9mZnNldElELCBidWZmZXIpOwotICAgIGRhdGEgPSBfZW52LT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKCphcnJheSwgKGpib29sZWFuICopIDApOwotCi0gICAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBkYXRhICsgb2Zmc2V0KTsKLX0KLQotCi1zdGF0aWMgdm9pZAotcmVsZWFzZVBvaW50ZXIoSk5JRW52ICpfZW52LCBqYXJyYXkgYXJyYXksIHZvaWQgKmRhdGEsIGpib29sZWFuIGNvbW1pdCkKLXsKLSAgICBfZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChhcnJheSwgZGF0YSwKLQkJCQkJICAgY29tbWl0ID8gMCA6IEpOSV9BQk9SVCk7Ci19Ci0KLXN0YXRpYyB2b2lkICoKLWdldERpcmVjdEJ1ZmZlclBvaW50ZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IGJ1ZmZlcikgewotICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgX2Vudi0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyhidWZmZXIpOwotICAgIGlmIChidWYpIHsKLSAgICAgICAgamludCBwb3NpdGlvbiA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgcG9zaXRpb25JRCk7Ci0gICAgICAgIGppbnQgZWxlbWVudFNpemVTaGlmdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgZWxlbWVudFNpemVTaGlmdElEKTsKLSAgICAgICAgYnVmICs9IHBvc2l0aW9uIDw8IGVsZW1lbnRTaXplU2hpZnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oX2VudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCB1c2UgYSBuYXRpdmUgb3JkZXIgZGlyZWN0IEJ1ZmZlciIpOwotICAgIH0KLSAgICByZXR1cm4gKHZvaWQqKSBidWY7Ci19Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTFIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzExSGVhZGVyLmphdmEtaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNTcyZDIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTFIZWFkZXIuamF2YS1pZgorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKLQotaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKLQotcHVibGljIGNsYXNzIEdMRVMxMSBleHRlbmRzIEdMRVMxMCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEUwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FERF9TSUdORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMUM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfVEVTVF9GVU5DICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkMxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1RfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4OTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgICAgICAgID0gMHg4ODk0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0RTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJFMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9TUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQlVGRkVSX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEJCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODc2NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg3NjU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAgID0gMHg4NEUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSVBfUExBTkUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElQX1BMQU5FMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSVBfUExBTkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElQX1BMQU5FNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICA9IDB4ODg5ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgPSAweDgwOTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDgxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA4MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwODI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzIyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMyMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT01CSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09NQklORV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTcyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTUJJTkVfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT05TVEFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09PUkRfUkVQTEFDRV9PRVMgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODYyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVTExfRkFDRV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI0NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVUlJFTlRfVEVYVFVSRV9DT09SRFMgICAgICAgICAgICAgICAgICA9IDB4MEIwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjc0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9UM19SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RPVDNfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgICAgID0gMHg4ODkzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICA9IDB4ODg5NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfR0VORVJBVEVfTUlQTUFQICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTkxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UICAgICAgICAgICAgICAgICAgICA9IDB4ODE5MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlRFUlBPTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjIxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPR0lDX09QX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJGMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVRSSVhfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NMSVBfUExBTkVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDMyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01PREVMVklFV19NQVRSSVggICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgPSAweDg5OEQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgICAgICAgICAgICAgID0gMHgwQkEzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICA9IDB4ODg5NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgPSAweDgwOEY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdGOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3RTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUEVSQU5EMF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1BFUkFORDBfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTkwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09QRVJBTkQxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5OTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUEVSQU5EMV9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1BFUkFORDJfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTlBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09QRVJBTkQyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAgICAgICAgICAgICAgPSAweDgxMjk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRSAgICAgICAgICAgICAgID0gMHg4MTI4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIxMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgPSAweDhCOUY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjlDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICA9IDB4ODk4QzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgPSAweDg5OEI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUyAgICAgICAgICAgICAgID0gMHg4OThBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NJWkVfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODEyNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMjY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU1BSSVRFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODYxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICA9IDB4ODAzODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0xZR09OX09GRlNFVF9VTklUUyAgICAgICAgICAgICAgICAgICAgPSAweDJBMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUFJFVklPVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BSSU1BUllfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QUk9KRUNUSU9OX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTID0gMHg4OThFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICA9IDB4MEJBNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0JfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEE4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICAgICAgICAgICA9IDB4ODBBQjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUgICAgICAgICAgICAgICAgICAgPSAweDgwQUE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEE5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NDSVNTT1JfQk9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMxMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TSEFERV9NT0RFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1JDMF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTg4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQzBfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUkMxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1JDMV9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTgxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQzJfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4QTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUkMyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEU0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9GVU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICAgICAgICAgICAgICAgICA9IDB4MEI5NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgICAgICAgICAgPSAweDBCOTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9SRUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfVkFMVUVfTUFTSyAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEU3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQklORElOR18yRCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA2OTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgPSAweDg4OUE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgID0gMHg4MDkyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSAgICAgICAgICAgICAgICA9IDB4ODA4ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgPSAweDgwOEE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFICAgICAgICAgICAgICAgID0gMHg4MDg5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUFUUklYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgICAgPSAweDg5OEY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICA9IDB4ODg5NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgPSAweDgwOEU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3QzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0I7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVklFV1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dSSVRFX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCOTsKLQotICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKLSAgICBzdGF0aWMgewotCSAgICBfbmF0aXZlQ2xhc3NJbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVmZmVyIF9wb2ludFNpemVQb2ludGVyT0VTOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTFjSGVhZGVyLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzExY0hlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzA3OWYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTFjSGVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0vKiBzcGVjaWFsIGNhbGxzIGltcGxlbWVudGVkIGluIEFuZHJvaWQncyBHTEVTIHdyYXBwZXIgdXNlZCB0byBtb3JlCi0gKiBlZmZpY2llbnRseSBib3VuZC1jaGVjayBwYXNzZWQgYXJyYXlzICovCi1leHRlcm4gIkMiIHsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRTaXplUG9pbnRlck9FU0JvdW5kcyhHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsCi0gICAgICAgIGNvbnN0IEdMdm9pZCAqcHRyLCBHTHNpemVpIGNvdW50KTsKLX0KLQotc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Ci0KLXN0YXRpYyBqY2xhc3MgbmlvQWNjZXNzQ2xhc3M7Ci1zdGF0aWMgamNsYXNzIGJ1ZmZlckNsYXNzOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlUG9pbnRlcklEOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlQXJyYXlJRDsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5T2Zmc2V0SUQ7Ci1zdGF0aWMgamZpZWxkSUQgcG9zaXRpb25JRDsKLXN0YXRpYyBqZmllbGRJRCBsaW1pdElEOwotc3RhdGljIGpmaWVsZElEIGVsZW1lbnRTaXplU2hpZnRJRDsKLQotLyogQ2FjaGUgbWV0aG9kIElEcyBlYWNoIHRpbWUgdGhlIGNsYXNzIGlzIGxvYWRlZC4gKi8KLQotc3RhdGljIHZvaWQKLW5hdGl2ZUNsYXNzSW5pdChKTklFbnYgKl9lbnYsIGpjbGFzcyBnbEltcGxDbGFzcykKLXsKLSAgICBqY2xhc3MgbmlvQWNjZXNzQ2xhc3NMb2NhbCA9IF9lbnYtPkZpbmRDbGFzcygiamF2YS9uaW8vTklPQWNjZXNzIik7Ci0gICAgbmlvQWNjZXNzQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYobmlvQWNjZXNzQ2xhc3NMb2NhbCk7Ci0KLSAgICBqY2xhc3MgYnVmZmVyQ2xhc3NMb2NhbCA9IF9lbnYtPkZpbmRDbGFzcygiamF2YS9uaW8vQnVmZmVyIik7Ci0gICAgYnVmZmVyQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoYnVmZmVyQ2xhc3NMb2NhbCk7Ci0KLSAgICBnZXRCYXNlUG9pbnRlcklEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZVBvaW50ZXIiLCAiKExqYXZhL25pby9CdWZmZXI7KUoiKTsKLSAgICBnZXRCYXNlQXJyYXlJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VBcnJheSIsICIoTGphdmEvbmlvL0J1ZmZlcjspTGphdmEvbGFuZy9PYmplY3Q7Iik7Ci0gICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlQXJyYXlPZmZzZXQiLCAiKExqYXZhL25pby9CdWZmZXI7KUkiKTsKLQotICAgIHBvc2l0aW9uSUQgPSBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAicG9zaXRpb24iLCAiSSIpOwotICAgIGxpbWl0SUQgPSBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAibGltaXQiLCAiSSIpOwotICAgIGVsZW1lbnRTaXplU2hpZnRJRCA9Ci0gICAgICAgIF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJfZWxlbWVudFNpemVTaGlmdCIsICJJIik7Ci19Ci0KLQotc3RhdGljIHZvaWQgKgotZ2V0UG9pbnRlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgYnVmZmVyLCBqYXJyYXkgKmFycmF5LCBqaW50ICpyZW1haW5pbmcpCi17Ci0gICAgamludCBwb3NpdGlvbjsKLSAgICBqaW50IGxpbWl0OwotICAgIGppbnQgZWxlbWVudFNpemVTaGlmdDsKLSAgICBqbG9uZyBwb2ludGVyOwotICAgIGppbnQgb2Zmc2V0OwotICAgIHZvaWQgKmRhdGE7Ci0KLSAgICBwb3NpdGlvbiA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgcG9zaXRpb25JRCk7Ci0gICAgbGltaXQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGxpbWl0SUQpOwotICAgIGVsZW1lbnRTaXplU2hpZnQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGVsZW1lbnRTaXplU2hpZnRJRCk7Ci0gICAgKnJlbWFpbmluZyA9IChsaW1pdCAtIHBvc2l0aW9uKSA8PCBlbGVtZW50U2l6ZVNoaWZ0OwotICAgIHBvaW50ZXIgPSBfZW52LT5DYWxsU3RhdGljTG9uZ01ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VQb2ludGVySUQsIGJ1ZmZlcik7Ci0gICAgaWYgKHBvaW50ZXIgIT0gMEwpIHsKLSAgICAgICAgKmFycmF5ID0gTlVMTDsKLSAgICAgICAgcmV0dXJuICh2b2lkICopIChqaW50KSBwb2ludGVyOwotICAgIH0KLQotICAgICphcnJheSA9IChqYXJyYXkpIF9lbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICBnZXRCYXNlQXJyYXlJRCwgYnVmZmVyKTsKLSAgICBvZmZzZXQgPSBfZW52LT5DYWxsU3RhdGljSW50TWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQsIGJ1ZmZlcik7Ci0gICAgZGF0YSA9IF9lbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoKmFycmF5LCAoamJvb2xlYW4gKikgMCk7Ci0KLSAgICByZXR1cm4gKHZvaWQgKikgKChjaGFyICopIGRhdGEgKyBvZmZzZXQpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1yZWxlYXNlUG9pbnRlcihKTklFbnYgKl9lbnYsIGphcnJheSBhcnJheSwgdm9pZCAqZGF0YSwgamJvb2xlYW4gY29tbWl0KQotewotICAgIF9lbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGFycmF5LCBkYXRhLAotCQkJCQkgICBjb21taXQgPyAwIDogSk5JX0FCT1JUKTsKLX0KLQotc3RhdGljIHZvaWQgKgotZ2V0RGlyZWN0QnVmZmVyUG9pbnRlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgYnVmZmVyKSB7Ci0gICAgY2hhciogYnVmID0gKGNoYXIqKSBfZW52LT5HZXREaXJlY3RCdWZmZXJBZGRyZXNzKGJ1ZmZlcik7Ci0gICAgaWYgKGJ1ZikgewotICAgICAgICBqaW50IHBvc2l0aW9uID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBwb3NpdGlvbklEKTsKLSAgICAgICAgamludCBlbGVtZW50U2l6ZVNoaWZ0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBlbGVtZW50U2l6ZVNoaWZ0SUQpOwotICAgICAgICBidWYgKz0gcG9zaXRpb24gPDwgZWxlbWVudFNpemVTaGlmdDsKLSAgICB9IGVsc2UgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihfZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IHVzZSBhIG5hdGl2ZSBvcmRlciBkaXJlY3QgQnVmZmVyIik7Ci0gICAgfQotICAgIHJldHVybiAodm9pZCopIGJ1ZjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzIwSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMyMEhlYWRlci5qYXZhLWlmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjE1ZTBhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzIwSGVhZGVyLmphdmEtaWYKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotKioKLSoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKLQotLyoqIE9wZW5HTCBFUyAyLjAKLSAqLwotcHVibGljIGNsYXNzIEdMRVMyMCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEUwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAxMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDQwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA0MDAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJJQU5HTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UUklBTkdMRV9GQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZVTkNfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9FUVVBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfRVFVQVRJT05fUkdCICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA5OyAgIC8qIHNhbWUgYXMgQkxFTkRfRVFVQVRJT04gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9FUVVBVElPTl9BTFBIQSAgICAgICAgICAgICAgICAgICAgPSAweDg4M0Q7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlVOQ19TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDBBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICA9IDB4ODAwQjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9EU1RfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQzg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfU1JDX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEM5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQ0I7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09OU1RBTlRfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiAgICAgICAgICAgICAgICA9IDB4ODAwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT05TVEFOVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBICAgICAgICAgICAgICAgID0gMHg4MDA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4OTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgICAgID0gMHg4ODkzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICAgICAgICA9IDB4ODg5NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgPSAweDg4OTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RSRUFNX0RSQVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEUwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NUQVRJQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhFNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NzY0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JVRkZFUl9VU0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODc2NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1ZFUlRFWF9BVFRSSUIgICAgICAgICAgICAgICAgICAgPSAweDg2MjY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0MDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV8yRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwREUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI0NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRElUSEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkQwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzExOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAgICAgICAgICA9IDB4ODAzNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgICAgICAgICAgPSAweDgwOUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0NPVkVSQUdFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDkwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjIxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgICAgICAgICA9IDB4ODQ2RDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgICAgICAgICAgPSAweDg0NkU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZST05UX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI0NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9GVU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgICAgICAgICAgICAgICAgID0gMHgwQjk1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTICAgICAgICAgICAgICAgICA9IDB4MEI5NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JBQ0tfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9CQUNLX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUwgICAgICAgICAgICA9IDB4ODgwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTICAgICAgICAgICAgPSAweDg4MDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9CQUNLX1JFRiAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0EzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQkFDS19WQUxVRV9NQVNLICAgICAgICAgICAgICAgICA9IDB4OENBNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgPSAweDhDQTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVklFV1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NDSVNTT1JfQk9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMxMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMjI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzIzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MENGNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDMzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgICAgICAgICAgICAgICAgICAgID0gMHgyQTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICA9IDB4ODAzODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJTkRJTkdfMkQgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNjk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEE4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUgICAgICAgICAgICAgICAgICAgPSAweDgwQUE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgICAgICAgICAgID0gMHg4MEFCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgICAgICA9IDB4ODZBMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgICAgICAgICAgPSAweDg2QTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZBU1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDExMDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgICAgICAgICAgID0gMHg4MTkyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOU0lHTkVEX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MEM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQ09NUE9ORU5UICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MEE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgICAgICAgICAgID0gMHg4MDMzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAgICAgICAgICA9IDB4ODAzNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgICAgICAgICAgPSAweDgzNjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBR01FTlRfU0hBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCMzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX1NIQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCMzE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZFUlRFWF9BVFRSSUJTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4Njk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMgICAgICAgICAgICAgICAgPSAweDhERkI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZBUllJTkdfVkVDVE9SUyAgICAgICAgICAgICAgICAgICAgICAgPSAweDhERkM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgICAgICAgICAgPSAweDhCNEQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTICAgICAgICAgICAgPSAweDhCNEM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgICAgICAgICAgICAgICAgICAgPSAweDg4NzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyAgICAgICAgICAgICAgPSAweDhERkQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hBREVSX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCNEY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVMRVRFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCODA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElOS19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCODI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkFMSURBVEVfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCODM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVRUQUNIRURfU0hBREVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCODU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNUSVZFX1VOSUZPUk1TICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCODY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCAgICAgICAgICAgICAgICAgPSAweDhCODc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNUSVZFX0FUVFJJQlVURVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCODk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIICAgICAgICAgICAgICAgPSAweDhCOEE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OICAgICAgICAgICAgICAgICAgPSAweDhCOEM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9QUk9HUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCOEQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUFURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUwNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERUNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjYwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI2MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAgICAgICAgID0gMHgyNzAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAgICAgICAgICA9IDB4MjcwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgICAgICAgICAgPSAweDI3MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgICAgICAgICAgID0gMHgyNzAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgICA9IDB4MjgwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9XUkFQX1MgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyODAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfV1JBUF9UICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjgwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE3MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUCAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTEzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUCAgICAgICAgICAgICAgICA9IDB4ODUxNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggICAgICAgICAgICAgPSAweDg1MTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YICAgICAgICAgICAgID0gMHg4NTE2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSAgICAgICAgICAgICA9IDB4ODUxNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1kgICAgICAgICAgICAgPSAweDg1MTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aICAgICAgICAgICAgID0gMHg4NTE5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiAgICAgICAgICAgICA9IDB4ODUxQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgPSAweDg1MUM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0I7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDRDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0U7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENGOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRENjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREQzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRERjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI5MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTJGOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01JUlJPUkVEX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODM3MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GTE9BVF9WRUMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCNTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkxPQVRfVkVDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZMT0FUX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI1MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlRfVkVDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCNTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5UX1ZFQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjU0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVF9WRUM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI1NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCNTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQk9PTF9WRUMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjU3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JPT0xfVkVDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI1ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CT09MX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCNTk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkxPQVRfTUFUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjVBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZMT0FUX01BVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI1QjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GTE9BVF9NQVQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCNUM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFUl8yRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjVFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRVJfQ1VCRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI2MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQgICAgICAgICAgICAgICAgID0gMHg4NjIyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgICAgPSAweDg2MjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICA9IDB4ODYyNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgID0gMHg4NjI1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCAgICAgICAgICAgICAgPSAweDg4NkE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgICAgICA9IDB4ODY0NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgID0gMHg4ODlGOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSAgICAgICAgICAgID0gMHg4QjlBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUICAgICAgICAgID0gMHg4QjlCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTVBJTEVfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI4MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkZPX0xPR19MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCODQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hBREVSX1NPVVJDRV9MRU5HVEggICAgICAgICAgICAgICAgICAgID0gMHg4Qjg4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NIQURFUl9DT01QSUxFUiAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OERGQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TSEFERVJfQklOQVJZX0ZPUk1BVFMgICAgICAgICAgICAgICAgICAgPSAweDhERjg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTlVNX1NIQURFUl9CSU5BUllfRk9STUFUUyAgICAgICAgICAgICAgID0gMHg4REY5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPV19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OERGMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NRURJVU1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhERjE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSElHSF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4REYyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPV19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OERGMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NRURJVU1fSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhERjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSElHSF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4REY1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENjI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQ09NUE9ORU5UMTYgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0lOREVYOCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9IRUlHSFQgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUICAgICAgICAgICAgPSAweDhENDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFICAgICAgICAgICAgICAgICAgID0gMHg4RDUwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFICAgICAgICAgICAgICAgICA9IDB4OEQ1MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFICAgICAgICAgICAgICAgICAgPSAweDhENTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkUgICAgICAgICAgICAgICAgID0gMHg4RDUzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFICAgICAgICAgICAgICAgICA9IDB4OEQ1NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFICAgICAgICAgICAgICAgPSAweDhENTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRSAgICAgID0gMHg4Q0QwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUgICAgICA9IDB4OENEMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUwgICAgPSAweDhDRDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0UgPSAweDhDRDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0FUVEFDSE1FTlQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlQgICAgICAgICAgICAgICAgICAgICAgPSAweDhEMjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgPSAweDhDRDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UICAgICAgID0gMHg4Q0Q2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UICAgICAgICAgID0gMHg4Q0Q3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OUyAgICAgICA9IDB4OENEOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgICAgPSAweDhDREQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfQklORElORyAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0E2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICAgICAgICA9IDB4OENBNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgPSAweDg0RTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04gICAgICAgICAgID0gMHgwNTA2OwotCi0gICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIHZvaWQgX25hdGl2ZUNsYXNzSW5pdCgpOwotICAgIHN0YXRpYyB7Ci0JICAgIF9uYXRpdmVDbGFzc0luaXQoKTsKLSAgICB9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMyMGNIZWFkZXIuY3BwIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMjBjSGVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhMjU3Ny4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMyMGNIZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCi0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAiSk5JSGVscC5oIgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi1zdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLQotc3RhdGljIGpjbGFzcyBuaW9BY2Nlc3NDbGFzczsKLXN0YXRpYyBqY2xhc3MgYnVmZmVyQ2xhc3M7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VQb2ludGVySUQ7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheUlEOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlQXJyYXlPZmZzZXRJRDsKLXN0YXRpYyBqZmllbGRJRCBwb3NpdGlvbklEOwotc3RhdGljIGpmaWVsZElEIGxpbWl0SUQ7Ci1zdGF0aWMgamZpZWxkSUQgZWxlbWVudFNpemVTaGlmdElEOwotCi0vKiBDYWNoZSBtZXRob2QgSURzIGVhY2ggdGltZSB0aGUgY2xhc3MgaXMgbG9hZGVkLiAqLwotCi1zdGF0aWMgdm9pZAotbmF0aXZlQ2xhc3NJbml0KEpOSUVudiAqX2VudiwgamNsYXNzIGdsSW1wbENsYXNzKQotewotICAgIGpjbGFzcyBuaW9BY2Nlc3NDbGFzc0xvY2FsID0gX2Vudi0+RmluZENsYXNzKCJqYXZhL25pby9OSU9BY2Nlc3MiKTsKLSAgICBuaW9BY2Nlc3NDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihuaW9BY2Nlc3NDbGFzc0xvY2FsKTsKLQotICAgIGpjbGFzcyBidWZmZXJDbGFzc0xvY2FsID0gX2Vudi0+RmluZENsYXNzKCJqYXZhL25pby9CdWZmZXIiKTsKLSAgICBidWZmZXJDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihidWZmZXJDbGFzc0xvY2FsKTsKLQotICAgIGdldEJhc2VQb2ludGVySUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlUG9pbnRlciIsICIoTGphdmEvbmlvL0J1ZmZlcjspSiIpOwotICAgIGdldEJhc2VBcnJheUlEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZUFycmF5IiwgIihMamF2YS9uaW8vQnVmZmVyOylMamF2YS9sYW5nL09iamVjdDsiKTsKLSAgICBnZXRCYXNlQXJyYXlPZmZzZXRJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VBcnJheU9mZnNldCIsICIoTGphdmEvbmlvL0J1ZmZlcjspSSIpOwotCi0gICAgcG9zaXRpb25JRCA9IF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJwb3NpdGlvbiIsICJJIik7Ci0gICAgbGltaXRJRCA9IF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJsaW1pdCIsICJJIik7Ci0gICAgZWxlbWVudFNpemVTaGlmdElEID0KLSAgICAgICAgX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgIl9lbGVtZW50U2l6ZVNoaWZ0IiwgIkkiKTsKLX0KLQotCi1zdGF0aWMgdm9pZCAqCi1nZXRQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIsIGphcnJheSAqYXJyYXksIGppbnQgKnJlbWFpbmluZykKLXsKLSAgICBqaW50IHBvc2l0aW9uOwotICAgIGppbnQgbGltaXQ7Ci0gICAgamludCBlbGVtZW50U2l6ZVNoaWZ0OwotICAgIGpsb25nIHBvaW50ZXI7Ci0gICAgamludCBvZmZzZXQ7Ci0gICAgdm9pZCAqZGF0YTsKLQotICAgIHBvc2l0aW9uID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBwb3NpdGlvbklEKTsKLSAgICBsaW1pdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgbGltaXRJRCk7Ci0gICAgZWxlbWVudFNpemVTaGlmdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgZWxlbWVudFNpemVTaGlmdElEKTsKLSAgICAqcmVtYWluaW5nID0gKGxpbWl0IC0gcG9zaXRpb24pIDw8IGVsZW1lbnRTaXplU2hpZnQ7Ci0gICAgcG9pbnRlciA9IF9lbnYtPkNhbGxTdGF0aWNMb25nTWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZVBvaW50ZXJJRCwgYnVmZmVyKTsKLSAgICBpZiAocG9pbnRlciAhPSAwTCkgewotICAgICAgICAqYXJyYXkgPSBOVUxMOwotICAgICAgICByZXR1cm4gKHZvaWQgKikgKGppbnQpIHBvaW50ZXI7Ci0gICAgfQotCi0gICAgKmFycmF5ID0gKGphcnJheSkgX2Vudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VBcnJheUlELCBidWZmZXIpOwotICAgIG9mZnNldCA9IF9lbnYtPkNhbGxTdGF0aWNJbnRNZXRob2QobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICBnZXRCYXNlQXJyYXlPZmZzZXRJRCwgYnVmZmVyKTsKLSAgICBkYXRhID0gX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCgqYXJyYXksIChqYm9vbGVhbiAqKSAwKTsKLQotICAgIHJldHVybiAodm9pZCAqKSAoKGNoYXIgKikgZGF0YSArIG9mZnNldCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlbGVhc2VQb2ludGVyKEpOSUVudiAqX2VudiwgamFycmF5IGFycmF5LCB2b2lkICpkYXRhLCBqYm9vbGVhbiBjb21taXQpCi17Ci0gICAgX2Vudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoYXJyYXksIGRhdGEsCi0JCQkJCSAgIGNvbW1pdCA/IDAgOiBKTklfQUJPUlQpOwotfQotCi1zdGF0aWMgdm9pZCAqCi1nZXREaXJlY3RCdWZmZXJQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIpIHsKLSAgICBjaGFyKiBidWYgPSAoY2hhciopIF9lbnYtPkdldERpcmVjdEJ1ZmZlckFkZHJlc3MoYnVmZmVyKTsKLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgIGppbnQgcG9zaXRpb24gPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIHBvc2l0aW9uSUQpOwotICAgICAgICBqaW50IGVsZW1lbnRTaXplU2hpZnQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGVsZW1lbnRTaXplU2hpZnRJRCk7Ci0gICAgICAgIGJ1ZiArPSBwb3NpdGlvbiA8PCBlbGVtZW50U2l6ZVNoaWZ0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKF9lbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3QgdXNlIGEgbmF0aXZlIG9yZGVyIGRpcmVjdCBCdWZmZXIiKTsKLSAgICB9Ci0gICAgcmV0dXJuICh2b2lkKikgYnVmOwotfQotCi1zdGF0aWMgaW50Ci1nZXROdW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKSB7Ci0gICAgaW50IG51bUNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IDA7Ci0gICAgZ2xHZXRJbnRlZ2VydihHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsICZudW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHMpOwotICAgIHJldHVybiBudW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHM7Ci19Ci0KLXN0YXRpYyB2b2lkIGdsVmVydGV4QXR0cmliUG9pbnRlckJvdW5kcyhHTHVpbnQgaW5keCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCi0gICAgICAgIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7Ci0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGluZHgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0UHJvZ3JhbUluZm9Mb2cuY3BwIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFByb2dyYW1JbmZvTG9nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2YWIyNC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0UHJvZ3JhbUluZm9Mb2cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0vKiB2b2lkIGdsR2V0UHJvZ3JhbUluZm9Mb2cgKCBHTHVpbnQgc2hhZGVyLCBHTHNpemVpIG1heExlbmd0aCwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9Mb2cgKSAqLwotc3RhdGljIGpzdHJpbmcgYW5kcm9pZF9nbEdldFByb2dyYW1JbmZvTG9nKEpOSUVudiAqX2Vudiwgam9iamVjdCwgamludCBzaGFkZXIpIHsKLSAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICBnbEdldFByb2dyYW1pdihzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOwotICAgIGlmICghaW5mb0xlbikgewotICAgICAgICByZXR1cm4gX2Vudi0+TmV3U3RyaW5nVVRGKCIiKTsKLSAgICB9Ci0gICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKF9lbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgIm91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgIGpzdHJpbmcgcmVzdWx0ID0gX2Vudi0+TmV3U3RyaW5nVVRGKGJ1Zik7Ci0gICAgZnJlZShidWYpOwotICAgIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0UHJvZ3JhbUluZm9Mb2cuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRQcm9ncmFtSW5mb0xvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjJkZjM5Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRQcm9ncmFtSW5mb0xvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRQcm9ncmFtSW5mb0xvZyggR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICogbGVuZ3RoLAotIAkvLyAgICAgR0xjaGFyICogaW5mb0xvZyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2xHZXRQcm9ncmFtSW5mb0xvZygKLSAgICAgICAgaW50IHByb2dyYW0KLSAgICApOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFByb2dyYW1JbmZvTG9nLm5hdGl2ZVJlZyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRQcm9ncmFtSW5mb0xvZy5uYXRpdmVSZWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NTNmMmQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFByb2dyYW1JbmZvTG9nLm5hdGl2ZVJlZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXsiZ2xHZXRQcm9ncmFtSW5mb0xvZyIsICIoSSlMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKSBhbmRyb2lkX2dsR2V0UHJvZ3JhbUluZm9Mb2cgfSwKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTaGFkZXJJbmZvTG9nLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTaGFkZXJJbmZvTG9nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2NTZiNi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U2hhZGVySW5mb0xvZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8qIHZvaWQgZ2xHZXRTaGFkZXJJbmZvTG9nICggR0x1aW50IHNoYWRlciwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvTG9nICkgKi8KLXN0YXRpYyBqc3RyaW5nIGFuZHJvaWRfZ2xHZXRTaGFkZXJJbmZvTG9nKEpOSUVudiAqX2Vudiwgam9iamVjdCwgamludCBzaGFkZXIpIHsKLSAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgaWYgKCFpbmZvTGVuKSB7Ci0gICAgICAgIHJldHVybiBfZW52LT5OZXdTdHJpbmdVVEYoIiIpOwotICAgIH0KLSAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKLSAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oX2VudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCAib3V0IG9mIG1lbW9yeSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKLSAgICBqc3RyaW5nIHJlc3VsdCA9IF9lbnYtPk5ld1N0cmluZ1VURihidWYpOwotICAgIGZyZWUoYnVmKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFNoYWRlckluZm9Mb2cuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTaGFkZXJJbmZvTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNTI5YzAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFNoYWRlckluZm9Mb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0gICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0U2hhZGVySW5mb0xvZyggR0x1aW50IHNoYWRlciwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkgKiBsZW5ndGgsCi0gCS8vICAgICBHTGNoYXIgKiBpbmZvTG9nKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZyBnbEdldFNoYWRlckluZm9Mb2coCi0gICAgICAgIGludCBzaGFkZXIKLSAgICApOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFNoYWRlckluZm9Mb2cubmF0aXZlUmVnIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFNoYWRlckluZm9Mb2cubmF0aXZlUmVnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTE2M2MzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTaGFkZXJJbmZvTG9nLm5hdGl2ZVJlZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXsiZ2xHZXRTaGFkZXJJbmZvTG9nIiwgIihJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopIGFuZHJvaWRfZ2xHZXRTaGFkZXJJbmZvTG9nIH0sCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U3RyaW5nLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTdHJpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzlmZTRhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTdHJpbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vKiBjb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApICovDQotc3RhdGljIGpzdHJpbmcgYW5kcm9pZF9nbEdldFN0cmluZyhKTklFbnYqIF9lbnYsIGpvYmplY3QsIGppbnQgbmFtZSkgew0KLSAgICBjb25zdCBjaGFyKiBjaGFycyA9IChjb25zdCBjaGFyKikgZ2xHZXRTdHJpbmcoKEdMZW51bSkgbmFtZSk7DQotICAgIHJldHVybiBfZW52LT5OZXdTdHJpbmdVVEYoY2hhcnMpOw0KLX0NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U3RyaW5nLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMmEwZDEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSAgICAvLyBDIGZ1bmN0aW9uIGNvbnN0IEdMdWJ5dGUgKiBnbEdldFN0cmluZyAoIEdMZW51bSBuYW1lICkKLQotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZyBnbEdldFN0cmluZygKLSAgICAgICAgaW50IG5hbWUKLSAgICApOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFN0cmluZy5uYXRpdmVSZWcgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U3RyaW5nLm5hdGl2ZVJlZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhZjMxZi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U3RyaW5nLm5hdGl2ZVJlZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXsiZ2xHZXRTdHJpbmciLCAiKEkpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQgKikgYW5kcm9pZF9nbEdldFN0cmluZyB9LA0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xTaGFkZXJTb3VyY2UuY3BwIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbFNoYWRlclNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWZkMGYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbFNoYWRlclNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0KLS8qIHZvaWQgZ2xTaGFkZXJTb3VyY2UgKCBHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIgKiogc3RyaW5nLCBjb25zdCBHTGludCAqIGxlbmd0aCApICovCi1zdGF0aWMKLXZvaWQKLWFuZHJvaWRfZ2xTaGFkZXJTb3VyY2UKLSAgICAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNoYWRlciwganN0cmluZyBzdHJpbmcpIHsKLQotICAgIGlmICghc3RyaW5nKSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKF9lbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgInN0cmluZyA9PSBudWxsIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyKiBuYXRpdmVTdHJpbmcgPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzdHJpbmcsIDApOwotICAgIGNvbnN0IGNoYXIqIHN0cmluZ3NbXSA9IHtuYXRpdmVTdHJpbmd9OwotICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgc3RyaW5ncywgMCk7Ci0gICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHN0cmluZywgbmF0aXZlU3RyaW5nKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xTaGFkZXJTb3VyY2UuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xTaGFkZXJTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmY2VmMy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsU2hhZGVyU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFNoYWRlclNvdXJjZSAoIEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciAqKiBzdHJpbmcsIGNvbnN0IEdMaW50KiBsZW5ndGggKQotCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBnbFNoYWRlclNvdXJjZSgKLSAgICAgICAgaW50IHNoYWRlciwKLSAgICAgICAgU3RyaW5nIHN0cmluZwotICAgICk7CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsU2hhZGVyU291cmNlLm5hdGl2ZVJlZyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xTaGFkZXJTb3VyY2UubmF0aXZlUmVnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTc3ODNhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xTaGFkZXJTb3VyY2UubmF0aXZlUmVnCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAoteyJnbFNoYWRlclNvdXJjZSIsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKikgYW5kcm9pZF9nbFNoYWRlclNvdXJjZSB9LApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDEwRXh0SGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMMTBFeHRIZWFkZXIuamF2YS1pZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA5OTljMi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMMTBFeHRIZWFkZXIuamF2YS1pZgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0KLXBhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgR0wxMEV4dCBleHRlbmRzIEdMIHsKLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDEwSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMMTBIZWFkZXIuamF2YS1pZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5MjgyMS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMMTBIZWFkZXIuamF2YS1pZgorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCi1wYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEdMMTAgZXh0ZW5kcyBHTCB7Ci0gICAgaW50IEdMX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDQ7Ci0gICAgaW50IEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAgICAgICAgPSAweDg0NkU7Ci0gICAgaW50IEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgICAgICAgPSAweDg0NkQ7Ci0gICAgaW50IEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDY7Ci0gICAgaW50IEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTU7Ci0gICAgaW50IEdMX0FMUEhBX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQzA7Ci0gICAgaW50IEdMX0FMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDc7Ci0gICAgaW50IEdMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDA7Ci0gICAgaW50IEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgPSAweDE2MDI7Ci0gICAgaW50IEdMX0FORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDE7Ci0gICAgaW50IEdMX0FORF9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDQ7Ci0gICAgaW50IEdMX0FORF9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDI7Ci0gICAgaW50IEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0MDU7Ci0gICAgaW50IEdMX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTI7Ci0gICAgaW50IEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTQ7Ci0gICAgaW50IEdMX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDA7Ci0gICAgaW50IEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDE7Ci0gICAgaW50IEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMkY7Ci0gICAgaW50IEdMX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDA7Ci0gICAgaW50IEdMX0NPTE9SX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzY7Ci0gICAgaW50IEdMX0NPTE9SX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDA7Ci0gICAgaW50IEdMX0NPTE9SX0xPR0lDX09QICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRjI7Ci0gICAgaW50IEdMX0NPTE9SX01BVEVSSUFMICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNTc7Ci0gICAgaW50IEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAgICAgICAgPSAweDg2QTM7Ci0gICAgaW50IEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OICAgICAgICAgICAgICAgICAgPSAweDEyMDc7Ci0gICAgaW50IEdMX0NPUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDM7Ci0gICAgaW50IEdMX0NPUFlfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEM7Ci0gICAgaW50IEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDQ7Ci0gICAgaW50IEdMX0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDA7Ci0gICAgaW50IEdMX0RFQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIxMDE7Ci0gICAgaW50IEdMX0RFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDM7Ci0gICAgaW50IEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTY7Ci0gICAgaW50IEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDA7Ci0gICAgaW50IEdMX0RFUFRIX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzE7Ci0gICAgaW50IEdMX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDE7Ci0gICAgaW50IEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRDA7Ci0gICAgaW50IEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDExMDA7Ci0gICAgaW50IEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDQ7Ci0gICAgaW50IEdMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDY7Ci0gICAgaW50IEdMX0VNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE2MDA7Ci0gICAgaW50IEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDI7Ci0gICAgaW50IEdMX0VRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDk7Ci0gICAgaW50IEdMX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA4MDA7Ci0gICAgaW50IEdMX0VYUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA4MDE7Ci0gICAgaW50IEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDM7Ci0gICAgaW50IEdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwotICAgIGludCBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAxOwotICAgIGludCBHTF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDBDOwotICAgIGludCBHTF9GTEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRDAwOwotICAgIGludCBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA2OwotICAgIGludCBHTF9GT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYwOwotICAgIGludCBHTF9GT0dfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY2OwotICAgIGludCBHTF9GT0dfREVOU0lUWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYyOwotICAgIGludCBHTF9GT0dfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY0OwotICAgIGludCBHTF9GT0dfSElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzU0OwotICAgIGludCBHTF9GT0dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY1OwotICAgIGludCBHTF9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYzOwotICAgIGludCBHTF9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA0OwotICAgIGludCBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA4OwotICAgIGludCBHTF9HRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA2OwotICAgIGludCBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA0OwotICAgIGludCBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUzOwotICAgIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMgID0gMHg4QjlCOwotICAgIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTICAgID0gMHg4QjlBOwotICAgIGludCBHTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAyOwotICAgIGludCBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAwOwotICAgIGludCBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAyOwotICAgIGludCBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAxOwotICAgIGludCBHTF9JTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBBOwotICAgIGludCBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAwOwotICAgIGludCBHTF9MRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAzOwotICAgIGludCBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAxOwotICAgIGludCBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgID0gMHgwQjUzOwotICAgIGludCBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAgICAgICAgICAgICAgICAgID0gMHgwQjUyOwotICAgIGludCBHTF9MSUdIVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwOwotICAgIGludCBHTF9MSUdIVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAxOwotICAgIGludCBHTF9MSUdIVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAyOwotICAgIGludCBHTF9MSUdIVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAzOwotICAgIGludCBHTF9MSUdIVDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA0OwotICAgIGludCBHTF9MSUdIVDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA1OwotICAgIGludCBHTF9MSUdIVDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA2OwotICAgIGludCBHTF9MSUdIVDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA3OwotICAgIGludCBHTF9MSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjUwOwotICAgIGludCBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyOwotICAgIGludCBHTF9MSU5FX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjIwOwotICAgIGludCBHTF9MSU5FX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzUyOwotICAgIGludCBHTF9MSU5FX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAzOwotICAgIGludCBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNjAxOwotICAgIGludCBHTF9MSU5FQVJfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgICAgID0gMHgxMjA4OwotICAgIGludCBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgICAgICAgID0gMHgyNzAzOwotICAgIGludCBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgICAgICAgID0gMHgyNzAxOwotICAgIGludCBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxOwotICAgIGludCBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA5OwotICAgIGludCBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTBBOwotICAgIGludCBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgICAgICAgID0gMHg4MEU5OwotICAgIGludCBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMgICAgICAgICAgICAgICAgID0gMHg4MEU4OwotICAgIGludCBHTF9NQVhfTElHSFRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDMxOwotICAgIGludCBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgICAgICAgID0gMHgwRDM2OwotICAgIGludCBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgICAgID0gMHgwRDM4OwotICAgIGludCBHTF9NQVhfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDMzOwotICAgIGludCBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgICAgICAgID0gMHgwRDM5OwotICAgIGludCBHTF9NQVhfVEVYVFVSRV9VTklUUyAgICAgICAgICAgICAgICAgICAgID0gMHg4NEUyOwotICAgIGludCBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgICAgICAgID0gMHgwRDNBOwotICAgIGludCBHTF9NT0RFTFZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAwOwotICAgIGludCBHTF9NT0RVTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMTAwOwotICAgIGludCBHTF9NVUxUSVNBTVBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDlEOwotICAgIGludCBHTF9OQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBFOwotICAgIGludCBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNjAwOwotICAgIGludCBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgICAgICAgID0gMHgyNzAyOwotICAgIGludCBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUICAgICAgICAgICAgICAgID0gMHgyNzAwOwotICAgIGludCBHTF9ORVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAwOwotICAgIGludCBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAyOwotICAgIGludCBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICBpbnQgR0xfTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNTsKLSAgICBpbnQgR0xfTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwODsKLSAgICBpbnQgR0xfTk9STUFMX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3NTsKLSAgICBpbnQgR0xfTk9STUFMSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMTsKLSAgICBpbnQgR0xfTk9URVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNTsKLSAgICBpbnQgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAgICA9IDB4ODZBMjsKLSAgICBpbnQgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7Ci0gICAgaW50IEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgPSAweDAzMDU7Ci0gICAgaW50IEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgPSAweDAzMDc7Ci0gICAgaW50IEdMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgPSAweDAzMDM7Ci0gICAgaW50IEdMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgPSAweDAzMDE7Ci0gICAgaW50IEdMX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDc7Ci0gICAgaW50IEdMX09SX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEQ7Ci0gICAgaW50IEdMX09SX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEI7Ci0gICAgaW50IEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDU7Ci0gICAgaW50IEdMX1BBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMDU7Ci0gICAgaW50IEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgPSAweDhCOTI7Ci0gICAgaW50IEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgPSAweDhCOTQ7Ci0gICAgaW50IEdMX1BBTEVUVEU0X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhCOTA7Ci0gICAgaW50IEdMX1BBTEVUVEU0X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTM7Ci0gICAgaW50IEdMX1BBTEVUVEU0X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTE7Ci0gICAgaW50IEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgPSAweDhCOTc7Ci0gICAgaW50IEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgPSAweDhCOTk7Ci0gICAgaW50IEdMX1BBTEVUVEU4X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhCOTU7Ci0gICAgaW50IEdMX1BBTEVUVEU4X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTg7Ci0gICAgaW50IEdMX1BBTEVUVEU4X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTY7Ci0gICAgaW50IEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCAgICAgICAgICAgPSAweDBDNTA7Ci0gICAgaW50IEdMX1BPSU5UX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMTA7Ci0gICAgaW50IEdMX1BPSU5UX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgICAgPSAweDBDNTE7Ci0gICAgaW50IEdMX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA7Ci0gICAgaW50IEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAgICAgICAgPSAweDgxMjg7Ci0gICAgaW50IEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMTE7Ci0gICAgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAgICAgICAgPSAweDgwMzc7Ci0gICAgaW50IEdMX1BPTFlHT05fU01PT1RIX0hJTlQgICAgICAgICAgICAgICAgICAgPSAweDBDNTM7Ci0gICAgaW50IEdMX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDM7Ci0gICAgaW50IEdMX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE3MDE7Ci0gICAgaW50IEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgPSAweDEyMDk7Ci0gICAgaW50IEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTI7Ci0gICAgaW50IEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDE7Ci0gICAgaW50IEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI5MDE7Ci0gICAgaW50IEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDE7Ci0gICAgaW50IEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwM0E7Ci0gICAgaW50IEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDc7Ci0gICAgaW50IEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDg7Ci0gICAgaW50IEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAgICAgICAgICAgICAgPSAweDgwOUU7Ci0gICAgaW50IEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgICAgICAgICAgICAgICAgICAgPSAweDgwOUY7Ci0gICAgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTA7Ci0gICAgaW50IEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMTE7Ci0gICAgaW50IEdMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEY7Ci0gICAgaW50IEdMX1NISU5JTkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE2MDE7Ci0gICAgaW50IEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDI7Ci0gICAgaW50IEdMX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFEMDE7Ci0gICAgaW50IEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFICAgICAgICAgICAgICAgPSAweDBCMjI7Ci0gICAgaW50IEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAgICAgICAgPSAweDBCMTI7Ci0gICAgaW50IEdMX1NQRUNVTEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDI7Ci0gICAgaW50IEdMX1NQT1RfQ1VUT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDY7Ci0gICAgaW50IEdMX1NQT1RfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDQ7Ci0gICAgaW50IEdMX1NQT1RfRVhQT05FTlQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDU7Ci0gICAgaW50IEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDI7Ci0gICAgaW50IEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAgICAgICAgPSAweDAzMDg7Ci0gICAgaW50IEdMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDA7Ci0gICAgaW50IEdMX1NUQUNLX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDM7Ci0gICAgaW50IEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDQ7Ci0gICAgaW50IEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTc7Ci0gICAgaW50IEdMX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAgPSAweDA0MDA7Ci0gICAgaW50IEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTA7Ci0gICAgaW50IEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTA7Ci0gICAgaW50IEdMX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE3MDI7Ci0gICAgaW50IEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBERTE7Ci0gICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgICAgICAgICAgICAgICAgICAgPSAweDgwNzg7Ci0gICAgaW50IEdMX1RFWFRVUkVfRU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIzMDA7Ci0gICAgaW50IEdMX1RFWFRVUkVfRU5WX0NPTE9SICAgICAgICAgICAgICAgICAgICAgPSAweDIyMDE7Ci0gICAgaW50IEdMX1RFWFRVUkVfRU5WX01PREUgICAgICAgICAgICAgICAgICAgICAgPSAweDIyMDA7Ci0gICAgaW50IEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgPSAweDI4MDA7Ci0gICAgaW50IEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgPSAweDI4MDE7Ci0gICAgaW50IEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDI7Ci0gICAgaW50IEdMX1RFWFRVUkVfV1JBUF9UICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDM7Ci0gICAgaW50IEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzA7Ci0gICAgaW50IEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzE7Ci0gICAgaW50IEdMX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzI7Ci0gICAgaW50IEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzM7Ci0gICAgaW50IEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzQ7Ci0gICAgaW50IEdMX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzU7Ci0gICAgaW50IEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzY7Ci0gICAgaW50IEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzc7Ci0gICAgaW50IEdMX1RFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzg7Ci0gICAgaW50IEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzk7Ci0gICAgaW50IEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0E7Ci0gICAgaW50IEdMX1RFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0I7Ci0gICAgaW50IEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0M7Ci0gICAgaW50IEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0Q7Ci0gICAgaW50IEdMX1RFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0U7Ci0gICAgaW50IEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0Y7Ci0gICAgaW50IEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDA7Ci0gICAgaW50IEdMX1RFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDE7Ci0gICAgaW50IEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDI7Ci0gICAgaW50IEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDM7Ci0gICAgaW50IEdMX1RFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDQ7Ci0gICAgaW50IEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDU7Ci0gICAgaW50IEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDY7Ci0gICAgaW50IEdMX1RFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDc7Ci0gICAgaW50IEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDg7Ci0gICAgaW50IEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDk7Ci0gICAgaW50IEdMX1RFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REE7Ci0gICAgaW50IEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REI7Ci0gICAgaW50IEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REM7Ci0gICAgaW50IEdMX1RFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REQ7Ci0gICAgaW50IEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REU7Ci0gICAgaW50IEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REY7Ci0gICAgaW50IEdMX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDY7Ci0gICAgaW50IEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDU7Ci0gICAgaW50IEdMX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQ7Ci0gICAgaW50IEdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOwotICAgIGludCBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgID0gMHgwQ0Y1OwotICAgIGludCBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAxOwotICAgIGludCBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAzOwotICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgICAgICAgID0gMHg4MDMzOwotICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgICAgICAgID0gMHg4MDM0OwotICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgICAgICAgID0gMHg4MzYzOwotICAgIGludCBHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAwOwotICAgIGludCBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAyOwotICAgIGludCBHTF9WRVJURVhfQVJSQVkgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDc0OwotICAgIGludCBHTF9YT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA2OwotICAgIGludCBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDExRXh0SGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMMTFFeHRIZWFkZXIuamF2YS1pZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlMjE2NC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMMTFFeHRIZWFkZXIuamF2YS1pZgorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0KLXBhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgR0wxMUV4dCBleHRlbmRzIEdMIHsKLSAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyA9IDB4OEI5RTsKLSAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX09FUyAgICAgICAgICAgICAgICA9IDB4ODg0NDsKLSAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICA9IDB4ODg0OTsKLSAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfT0VTICAgICAgICAgICA9IDB4ODg0NjsKLSAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9PRVMgICAgICAgICA9IDB4ODg0ODsKLSAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICA9IDB4ODg0NzsKLSAgICBpbnQgR0xfTUFUUklYX1BBTEVUVEVfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4ODg0MDsKLSAgICBpbnQgR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfT0VTICAgICAgICAgICAgICA9IDB4ODg0MjsKLSAgICBpbnQgR0xfTUFYX1ZFUlRFWF9VTklUU19PRVMgICAgICAgICAgICAgICAgICA9IDB4ODZBNDsKLSAgICBpbnQgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTICAgICAgICAgICAgICAgICA9IDB4OEI5RDsKLSAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgICA9IDB4ODg5RTsKLSAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRDsKLSAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICAgICAgICA9IDB4ODZBQzsKLSAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1NJWkVfT0VTICAgICAgICAgICAgICAgICA9IDB4ODZBQjsKLSAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgICA9IDB4ODZBQTsKLSAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgICA9IDB4ODZBOTsKLQotICAgIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmdihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW0sIGludCBvZmZzZXQpOwotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMMTFFeHRlbnNpb25QYWNrSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMMTFFeHRlbnNpb25QYWNrSGVhZGVyLmphdmEtaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDAxOTEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0KLXBhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgR0wxMUV4dGVuc2lvblBhY2sgZXh0ZW5kcyBHTCB7Ci0gICAgaW50IEdMX0JMRU5EX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDQTsKLSAgICBpbnQgR0xfQkxFTkRfRFNUX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEM4OwotICAgIGludCBHTF9CTEVORF9FUVVBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDk7Ci0gICAgaW50IEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODgzRDsKLSAgICBpbnQgR0xfQkxFTkRfRVFVQVRJT05fUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA5OwotICAgIGludCBHTF9CTEVORF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQ0I7Ci0gICAgaW50IEdMX0JMRU5EX1NSQ19SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDOTsKLSAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UwOwotICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTE7Ci0gICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQyX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMjsKLSAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UzOwotICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTQ7Ci0gICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFNTsKLSAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDZfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U2OwotICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UN19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTc7Ci0gICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFODsKLSAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U5OwotICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUE7Ci0gICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFQjsKLSAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEyX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VDOwotICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUQ7Ci0gICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFRTsKLSAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDE1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VGOwotICAgIGludCBHTF9ERUNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MDg7Ci0gICAgaW50IEdMX0RFUFRIX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQwMDsKLSAgICBpbnQgR0xfREVQVEhfQ09NUE9ORU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTAyOwotICAgIGludCBHTF9ERVBUSF9DT01QT05FTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTU7Ci0gICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODFBNjsKLSAgICBpbnQgR0xfREVQVEhfQ09NUE9ORU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE3OwotICAgIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX09FUyAgICAgICAgICAgPSAweDhDRDE7Ci0gICAgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfT0VTICAgICAgICAgICA9IDB4OENEMDsKLSAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0VfT0VTID0gMHg4Q0QzOwotICAgIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfT0VTICAgICAgICAgPSAweDhDRDI7Ci0gICAgaW50IEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENBNjsKLSAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0Q1OwotICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgPSAweDhDRDY7Ci0gICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU19PRVMgICAgICAgICAgICA9IDB4OENEOTsKLSAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9EUkFXX0JVRkZFUl9PRVMgICAgICAgICAgID0gMHg4Q0RCOwotICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0ZPUk1BVFNfT0VTICAgICAgICAgICAgICAgPSAweDhDREE7Ci0gICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UX09FUyAgICA9IDB4OENENzsKLSAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9SRUFEX0JVRkZFUl9PRVMgICAgICAgICAgID0gMHg4Q0RDOwotICAgIGludCBHTF9GUkFNRUJVRkZFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDA7Ci0gICAgaW50IEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4OENERDsKLSAgICBpbnQgR0xfRlVOQ19BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA2OwotICAgIGludCBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMEI7Ci0gICAgaW50IEdMX0ZVTkNfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwQTsKLSAgICBpbnQgR0xfSU5DUl9XUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTA3OwotICAgIGludCBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTl9PRVMgICAgICAgICAgICAgICAgPSAweDA1MDY7Ci0gICAgaW50IEdMX01BWF9DT0xPUl9BVFRBQ0hNRU5UU19PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENERjsKLSAgICBpbnQgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTFDOwotICAgIGludCBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTg7Ci0gICAgaW50IEdMX01JUlJPUkVEX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODM3MDsKLSAgICBpbnQgR0xfTk9STUFMX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTExOwotICAgIGludCBHTF9SRUZMRUNUSU9OX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTI7Ci0gICAgaW50IEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MzsKLSAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0E3OwotICAgIGludCBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTI7Ci0gICAgaW50IEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1NDsKLSAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUxOwotICAgIGludCBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDM7Ci0gICAgaW50IEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVRfT0VTICAgICAgICAgICAgICAgICA9IDB4OEQ0NDsKLSAgICBpbnQgR0xfUkVOREVSQlVGRkVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQxOwotICAgIGludCBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTA7Ci0gICAgaW50IEdMX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1NTsKLSAgICBpbnQgR0xfUkVOREVSQlVGRkVSX1dJRFRIX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQyOwotICAgIGludCBHTF9SR0I1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTc7Ci0gICAgaW50IEdMX1JHQjU2NV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ2MjsKLSAgICBpbnQgR0xfUkdCOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDUxOwotICAgIGludCBHTF9SR0JBNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTY7Ci0gICAgaW50IEdMX1JHQkE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1ODsKLSAgICBpbnQgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDIwOwotICAgIGludCBHTF9TVEVOQ0lMX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDE7Ci0gICAgaW50IEdMX1NURU5DSUxfSU5ERVgxX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0NjsKLSAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWDRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ3OwotICAgIGludCBHTF9TVEVOQ0lMX0lOREVYOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDg7Ci0gICAgaW50IEdMX1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0xOwotICAgIGludCBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTQ7Ci0gICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMzsKLSAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE2OwotICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1kgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTg7Ci0gICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxQTsKLSAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE1OwotICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTc7Ci0gICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxOTsKLSAgICBpbnQgR0xfVEVYVFVSRV9HRU5fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNTAwOwotICAgIGludCBHTF9URVhUVVJFX0dFTl9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENjA7Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0wxMUhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDExSGVhZGVyLmphdmEtaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTVhNmIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDExSGVhZGVyLmphdmEtaWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKLQotcHVibGljIGludGVyZmFjZSBHTDExIGV4dGVuZHMgR0wxMCB7Ci0gICAgaW50IEdMX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFMDsKLSAgICBpbnQgR0xfQUREX1NJR05FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc0OwotICAgIGludCBHTF9BTFBIQV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMUM7Ci0gICAgaW50IEdMX0FMUEhBX1RFU1RfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMTsKLSAgICBpbnQgR0xfQUxQSEFfVEVTVF9SRUYgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkMyOwotICAgIGludCBHTF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4OTI7Ci0gICAgaW50IEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICAgICAgICA9IDB4ODg5NDsKLSAgICBpbnQgR0xfQkxFTkRfRFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUwOwotICAgIGludCBHTF9CTEVORF9TUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTE7Ci0gICAgaW50IEdMX0JVRkZFUl9BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCQjsKLSAgICBpbnQgR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NzY0OwotICAgIGludCBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg3NjU7Ci0gICAgaW50IEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgICA9IDB4ODRFMTsKLSAgICBpbnQgR0xfQ0xJUF9QTEFORTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAwOwotICAgIGludCBHTF9DTElQX1BMQU5FMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDE7Ci0gICAgaW50IEdMX0NMSVBfUExBTkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMjsKLSAgICBpbnQgR0xfQ0xJUF9QTEFORTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAzOwotICAgIGludCBHTF9DTElQX1BMQU5FNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDQ7Ci0gICAgaW50IEdMX0NMSVBfUExBTkU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwNTsKLSAgICBpbnQgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgID0gMHg4ODk4OwotICAgIGludCBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgPSAweDgwOTA7Ci0gICAgaW50IEdMX0NPTE9SX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA4MTsKLSAgICBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDgzOwotICAgIGludCBHTF9DT0xPUl9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwODI7Ci0gICAgaW50IEdMX0NPTE9SX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMyMjsKLSAgICBpbnQgR0xfQ09MT1JfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzIzOwotICAgIGludCBHTF9DT01CSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzA7Ci0gICAgaW50IEdMX0NPTUJJTkVfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MjsKLSAgICBpbnQgR0xfQ09NQklORV9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTcxOwotICAgIGludCBHTF9DT05TVEFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzY7Ci0gICAgaW50IEdMX0NPT1JEX1JFUExBQ0VfT0VTICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg2MjsKLSAgICBpbnQgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ1OwotICAgIGludCBHTF9DVVJSRU5UX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMDA7Ci0gICAgaW50IEdMX0NVUlJFTlRfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIwMjsKLSAgICBpbnQgR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUyAgICAgICAgICAgICAgICAgID0gMHgwQjAzOwotICAgIGludCBHTF9ERVBUSF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzM7Ci0gICAgaW50IEdMX0RFUFRIX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3NDsKLSAgICBpbnQgR0xfREVQVEhfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcwOwotICAgIGludCBHTF9ERVBUSF9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzI7Ci0gICAgaW50IEdMX0RPVDNfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRTsKLSAgICBpbnQgR0xfRE9UM19SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFGOwotICAgIGludCBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RTg7Ci0gICAgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICA9IDB4ODg5MzsKLSAgICBpbnQgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgID0gMHg4ODk1OwotICAgIGludCBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDY7Ci0gICAgaW50IEdMX0dFTkVSQVRFX01JUE1BUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODE5MTsKLSAgICBpbnQgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgICAgICAgICAgID0gMHg4MTkyOwotICAgIGludCBHTF9JTlRFUlBPTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzU7Ci0gICAgaW50IEdMX0xJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIyMTsKLSAgICBpbnQgR0xfTE9HSUNfT1BfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkYwOwotICAgIGludCBHTF9NQVRSSVhfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTA7Ci0gICAgaW50IEdMX01BWF9DTElQX1BMQU5FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMjsKLSAgICBpbnQgR0xfTU9ERUxWSUVXX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE2OwotICAgIGludCBHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgPSAweDg5OEQ7Ci0gICAgaW50IEdMX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAgICAgICAgICA9IDB4MEJBMzsKLSAgICBpbnQgR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgID0gMHg4ODk3OwotICAgIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgPSAweDgwOEY7Ci0gICAgaW50IEdMX05PUk1BTF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3RjsKLSAgICBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdFOwotICAgIGludCBHTF9PUEVSQU5EMF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTg7Ci0gICAgaW50IEdMX09QRVJBTkQwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5MDsKLSAgICBpbnQgR0xfT1BFUkFORDFfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTk5OwotICAgIGludCBHTF9PUEVSQU5EMV9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTE7Ci0gICAgaW50IEdMX09QRVJBTkQyX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5QTsKLSAgICBpbnQgR0xfT1BFUkFORDJfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTkyOwotICAgIGludCBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAgICAgICAgICAgICAgPSAweDgxMjk7Ci0gICAgaW50IEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAgICAgICAgICA9IDB4ODEyODsKLSAgICBpbnQgR0xfUE9JTlRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjExOwotICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgPSAweDhCOUY7Ci0gICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5QzsKLSAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgICAgID0gMHg4OThDOwotICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgPSAweDg5OEI7Ci0gICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICA9IDB4ODk4QTsKLSAgICBpbnQgR0xfUE9JTlRfU0laRV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTI3OwotICAgIGludCBHTF9QT0lOVF9TSVpFX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMjY7Ci0gICAgaW50IEdMX1BPSU5UX1NQUklURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg2MTsKLSAgICBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SICAgICAgICAgICAgICAgICAgID0gMHg4MDM4OwotICAgIGludCBHTF9QT0xZR09OX09GRlNFVF9VTklUUyAgICAgICAgICAgICAgICAgICAgPSAweDJBMDA7Ci0gICAgaW50IEdMX1BSRVZJT1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3ODsKLSAgICBpbnQgR0xfUFJJTUFSWV9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc3OwotICAgIGludCBHTF9QUk9KRUNUSU9OX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTc7Ci0gICAgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyA9IDB4ODk4RTsKLSAgICBpbnQgR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgICAgICAgICAgID0gMHgwQkE0OwotICAgIGludCBHTF9SR0JfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzM7Ci0gICAgaW50IEdMX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBODsKLSAgICBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgICAgICAgICAgID0gMHg4MEFCOwotICAgIGludCBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUgICAgICAgICAgICAgICAgICAgPSAweDgwQUE7Ci0gICAgaW50IEdMX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBOTsKLSAgICBpbnQgR0xfU0NJU1NPUl9CT1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzEwOwotICAgIGludCBHTF9TSEFERV9NT0RFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNTQ7Ci0gICAgaW50IEdMX1NSQzBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4ODsKLSAgICBpbnQgR0xfU1JDMF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTgwOwotICAgIGludCBHTF9TUkMxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODk7Ci0gICAgaW50IEdMX1NSQzFfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4MTsKLSAgICBpbnQgR0xfU1JDMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NThBOwotICAgIGludCBHTF9TUkMyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODI7Ci0gICAgaW50IEdMX1NUQVRJQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhFNDsKLSAgICBpbnQgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkxOwotICAgIGludCBHTF9TVEVOQ0lMX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTQ7Ci0gICAgaW50IEdMX1NURU5DSUxfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MjsKLSAgICBpbnQgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgICAgICAgICAgICAgICAgID0gMHgwQjk1OwotICAgIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgICAgICAgICAgPSAweDBCOTY7Ci0gICAgaW50IEdMX1NURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5NzsKLSAgICBpbnQgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkzOwotICAgIGludCBHTF9TVEVOQ0lMX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTg7Ci0gICAgaW50IEdMX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFNzsKLSAgICBpbnQgR0xfVEVYVFVSRV9CSU5ESU5HXzJEICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDY5OwotICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgPSAweDg4OUE7Ci0gICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICA9IDB4ODA5MjsKLSAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICAgICAgICAgICAgICAgID0gMHg4MDg4OwotICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgPSAweDgwOEE7Ci0gICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICA9IDB4ODA4OTsKLSAgICBpbnQgR0xfVEVYVFVSRV9NQVRSSVggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE4OwotICAgIGludCBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgICAgPSAweDg5OEY7Ci0gICAgaW50IEdMX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICAgICA9IDB4MEJBNTsKLSAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgID0gMHg4ODk2OwotICAgIGludCBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgPSAweDgwOEU7Ci0gICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3QTsKLSAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdDOwotICAgIGludCBHTF9WRVJURVhfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0I7Ci0gICAgaW50IEdMX1ZJRVdQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMjsKLSAgICBpbnQgR0xfV1JJVEVfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEI5OwotCi0gICAgdm9pZCBnbEdldFBvaW50ZXJ2KGludCBwbmFtZSwgamF2YS5uaW8uQnVmZmVyW10gcGFyYW1zKTsKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0wxMUltcGxIZWFkZXIuamF2YS1pbXBsIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDExSW1wbEhlYWRlci5qYXZhLWltcGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWJlNjUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDExSW1wbEhlYWRlci5qYXZhLWltcGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQuZ2xlc19qbmk7Ci0KLWltcG9ydCBqYXZhLm5pby5CdWZmZXI7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLQotcHVibGljIGNsYXNzIEdMMTFJbXBsIGltcGxlbWVudHMgR0wxMSB7Ci0KLSAgICAvLyBQcml2YXRlIGFjY2Vzc29ycyBmb3IgbmF0aXZlIGNvZGUKLQotICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKLSAgICBzdGF0aWMgewotCV9uYXRpdmVDbGFzc0luaXQoKTsKLSAgICB9Ci0KLSAgICBCdWZmZXIgX2NvbG9yUG9pbnRlciA9IG51bGw7Ci0gICAgQnVmZmVyIF9ub3JtYWxQb2ludGVyID0gbnVsbDsKLSAgICBCdWZmZXIgX3RleENvb3JkUG9pbnRlciA9IG51bGw7Ci0gICAgQnVmZmVyIF92ZXJ0ZXhQb2ludGVyID0gbnVsbDsKLQotICAgIHB1YmxpYyBHTDExSW1wbCgpIHsKLSAgICB9Ci0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTENIZWFkZXIuY3BwIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTENIZWFkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzMxNWVlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0xDSGVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0vLyBXb3JrIGFyb3VuZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBnZW5lcmF0ZWQgbmFtZSBhbmQgdGhlIGFjdHVhbCBuYW1lLgotCi0jZGVmaW5lIGdsQmxlbmRFcXVhdGlvbiBnbEJsZW5kRXF1YXRpb25PRVMKLSNkZWZpbmUgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMKLSNkZWZpbmUgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSBnbEJsZW5kRnVuY1NlcGFyYXRlT0VTCi0jZGVmaW5lIGdsR2V0VGV4R2VuZnYgZ2xHZXRUZXhHZW5mdk9FUwotI2RlZmluZSBnbEdldFRleEdlbml2IGdsR2V0VGV4R2VuaXZPRVMKLSNkZWZpbmUgZ2xHZXRUZXhHZW54diBnbEdldFRleEdlbnh2T0VTCi0jZGVmaW5lIGdsVGV4R2VuZiBnbFRleEdlbmZPRVMKLSNkZWZpbmUgZ2xUZXhHZW5mdiBnbFRleEdlbmZ2T0VTCi0jZGVmaW5lIGdsVGV4R2VuaSBnbFRleEdlbmlPRVMKLSNkZWZpbmUgZ2xUZXhHZW5pdiBnbFRleEdlbml2T0VTCi0jZGVmaW5lIGdsVGV4R2VueCBnbFRleEdlbnhPRVMKLSNkZWZpbmUgZ2xUZXhHZW54diBnbFRleEdlbnh2T0VTCi0KLQotCi0vKiBzcGVjaWFsIGNhbGxzIGltcGxlbWVudGVkIGluIEFuZHJvaWQncyBHTEVTIHdyYXBwZXIgdXNlZCB0byBtb3JlCi0gKiBlZmZpY2llbnRseSBib3VuZC1jaGVjayBwYXNzZWQgYXJyYXlzICovCi1leHRlcm4gIkMiIHsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29sb3JQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKLSAgICAgICAgY29uc3QgR0x2b2lkICpwdHIsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyQm91bmRzKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKLSAgICAgICAgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4UG9pbnRlckJvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50U2l6ZVBvaW50ZXJPRVNCb3VuZHMoR0xlbnVtIHR5cGUsCi0gICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVNCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCi0gICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xXZWlnaHRQb2ludGVyT0VTQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKLX0KLQotc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Ci0KLXN0YXRpYyBqY2xhc3MgbmlvQWNjZXNzQ2xhc3M7Ci1zdGF0aWMgamNsYXNzIGJ1ZmZlckNsYXNzOwotc3RhdGljIGpjbGFzcyBHMTFJbXBsQ2xhc3M7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VQb2ludGVySUQ7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheUlEOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlQXJyYXlPZmZzZXRJRDsKLXN0YXRpYyBqbWV0aG9kSUQgYWxsb3dJbmRpcmVjdEJ1ZmZlcnNJRDsKLXN0YXRpYyBqZmllbGRJRCBwb3NpdGlvbklEOwotc3RhdGljIGpmaWVsZElEIGxpbWl0SUQ7Ci1zdGF0aWMgamZpZWxkSUQgZWxlbWVudFNpemVTaGlmdElEOwotc3RhdGljIGpmaWVsZElEIGhhdmVDaGVja2VkRXh0ZW5zaW9uc0lEOwotc3RhdGljIGpmaWVsZElEIGhhdmVfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlSUQ7Ci1zdGF0aWMgamZpZWxkSUQgaGF2ZV9PRVNfYmxlbmRfc3VidHJhY3RJRDsKLXN0YXRpYyBqZmllbGRJRCBoYXZlX09FU19mcmFtZWJ1ZmZlcl9vYmplY3RJRDsKLXN0YXRpYyBqZmllbGRJRCBoYXZlX09FU190ZXh0dXJlX2N1YmVfbWFwSUQ7Ci0KLS8qIENhY2hlIG1ldGhvZCBJRHMgZWFjaCB0aW1lIHRoZSBjbGFzcyBpcyBsb2FkZWQuICovCi0KLXN0YXRpYyB2b2lkCi1uYXRpdmVDbGFzc0luaXQoSk5JRW52ICpfZW52LCBqY2xhc3MgZ2xJbXBsQ2xhc3MpCi17Ci0gICAgamNsYXNzIG5pb0FjY2Vzc0NsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL05JT0FjY2VzcyIpOwotICAgIG5pb0FjY2Vzc0NsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKG5pb0FjY2Vzc0NsYXNzTG9jYWwpOwotCi0gICAgamNsYXNzIGJ1ZmZlckNsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL0J1ZmZlciIpOwotICAgIGJ1ZmZlckNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKGJ1ZmZlckNsYXNzTG9jYWwpOwotCi0gICAgamNsYXNzIGcxMWltcENsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImNvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwiKTsKLSAgICBHMTFJbXBsQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoZzExaW1wQ2xhc3NMb2NhbCk7Ci0gICAgaGF2ZUNoZWNrZWRFeHRlbnNpb25zSUQgPSAgX2Vudi0+R2V0RmllbGRJRChHMTFJbXBsQ2xhc3MsICJoYXZlQ2hlY2tlZEV4dGVuc2lvbnMiLCAiWiIpOwotICAgIGhhdmVfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlSUQgPSAgX2Vudi0+R2V0RmllbGRJRChHMTFJbXBsQ2xhc3MsICJoYXZlX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSIsICJaIik7Ci0gICAgaGF2ZV9PRVNfYmxlbmRfc3VidHJhY3RJRCA9ICBfZW52LT5HZXRGaWVsZElEKEcxMUltcGxDbGFzcywgImhhdmVfT0VTX2JsZW5kX3N1YnRyYWN0IiwgIloiKTsKLSAgICBoYXZlX09FU19mcmFtZWJ1ZmZlcl9vYmplY3RJRCA9ICBfZW52LT5HZXRGaWVsZElEKEcxMUltcGxDbGFzcywgImhhdmVfT0VTX2ZyYW1lYnVmZmVyX29iamVjdCIsICJaIik7Ci0gICAgaGF2ZV9PRVNfdGV4dHVyZV9jdWJlX21hcElEID0gIF9lbnYtPkdldEZpZWxkSUQoRzExSW1wbENsYXNzLCAiaGF2ZV9PRVNfdGV4dHVyZV9jdWJlX21hcCIsICJaIik7Ci0KLSAgICBnZXRCYXNlUG9pbnRlcklEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZVBvaW50ZXIiLCAiKExqYXZhL25pby9CdWZmZXI7KUoiKTsKLSAgICBnZXRCYXNlQXJyYXlJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VBcnJheSIsICIoTGphdmEvbmlvL0J1ZmZlcjspTGphdmEvbGFuZy9PYmplY3Q7Iik7Ci0gICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlQXJyYXlPZmZzZXQiLCAiKExqYXZhL25pby9CdWZmZXI7KUkiKTsKLSAgICBhbGxvd0luZGlyZWN0QnVmZmVyc0lEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQoZzExaW1wQ2xhc3NMb2NhbCwKLSAgICAgICAgICAgICJhbGxvd0luZGlyZWN0QnVmZmVycyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiKTsKLSAgICBwb3NpdGlvbklEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgInBvc2l0aW9uIiwgIkkiKTsKLSAgICBsaW1pdElEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgImxpbWl0IiwgIkkiKTsKLSAgICBlbGVtZW50U2l6ZVNoaWZ0SUQgPQotICAgICAgICBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAiX2VsZW1lbnRTaXplU2hpZnQiLCAiSSIpOwotfQotCi1zdGF0aWMgdm9pZCAqCi1nZXRQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIsIGphcnJheSAqYXJyYXksIGppbnQgKnJlbWFpbmluZykKLXsKLSAgICBqaW50IHBvc2l0aW9uOwotICAgIGppbnQgbGltaXQ7Ci0gICAgamludCBlbGVtZW50U2l6ZVNoaWZ0OwotICAgIGpsb25nIHBvaW50ZXI7Ci0gICAgamludCBvZmZzZXQ7Ci0gICAgdm9pZCAqZGF0YTsKLQotICAgIHBvc2l0aW9uID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBwb3NpdGlvbklEKTsKLSAgICBsaW1pdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgbGltaXRJRCk7Ci0gICAgZWxlbWVudFNpemVTaGlmdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgZWxlbWVudFNpemVTaGlmdElEKTsKLSAgICAqcmVtYWluaW5nID0gKGxpbWl0IC0gcG9zaXRpb24pIDw8IGVsZW1lbnRTaXplU2hpZnQ7Ci0gICAgcG9pbnRlciA9IF9lbnYtPkNhbGxTdGF0aWNMb25nTWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZVBvaW50ZXJJRCwgYnVmZmVyKTsKLSAgICBpZiAocG9pbnRlciAhPSAwTCkgewotICAgICAgICAqYXJyYXkgPSBOVUxMOwotICAgICAgICByZXR1cm4gKHZvaWQgKikgKGppbnQpIHBvaW50ZXI7Ci0gICAgfQotCi0gICAgKmFycmF5ID0gKGphcnJheSkgX2Vudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VBcnJheUlELCBidWZmZXIpOwotICAgIGlmICgqYXJyYXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gKHZvaWQqKSBOVUxMOwotICAgIH0KLSAgICBvZmZzZXQgPSBfZW52LT5DYWxsU3RhdGljSW50TWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQsIGJ1ZmZlcik7Ci0gICAgZGF0YSA9IF9lbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoKmFycmF5LCAoamJvb2xlYW4gKikgMCk7Ci0KLSAgICByZXR1cm4gKHZvaWQgKikgKChjaGFyICopIGRhdGEgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZAotcmVsZWFzZVBvaW50ZXIoSk5JRW52ICpfZW52LCBqYXJyYXkgYXJyYXksIHZvaWQgKmRhdGEsIGpib29sZWFuIGNvbW1pdCkKLXsKLSAgICBfZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChhcnJheSwgZGF0YSwKLQkJCQkJICAgY29tbWl0ID8gMCA6IEpOSV9BQk9SVCk7Ci19Ci0KLWV4dGVybiAiQyIgewotZXh0ZXJuIGNoYXIqICBfX3Byb2duYW1lOwotfQotCi1zdGF0aWMgYm9vbAotYWxsb3dJbmRpcmVjdEJ1ZmZlcnMoSk5JRW52ICpfZW52KSB7Ci0gICAgc3RhdGljIGppbnQgc0luZGlyZWN0QnVmZmVyQ29tcGF0YWJpbGl0eTsKLSAgICBpZiAoc0luZGlyZWN0QnVmZmVyQ29tcGF0YWJpbGl0eSA9PSAwKSB7Ci0gICAgICAgIGpvYmplY3QgYXBwTmFtZSA9IF9lbnYtPk5ld1N0cmluZ1VURig6Ol9fcHJvZ25hbWUpOwotICAgICAgICBzSW5kaXJlY3RCdWZmZXJDb21wYXRhYmlsaXR5ID0gX2Vudi0+Q2FsbFN0YXRpY0Jvb2xlYW5NZXRob2QoRzExSW1wbENsYXNzLCBhbGxvd0luZGlyZWN0QnVmZmVyc0lELCBhcHBOYW1lKSA/IDIgOiAxOwotICAgIH0KLSAgICByZXR1cm4gc0luZGlyZWN0QnVmZmVyQ29tcGF0YWJpbGl0eSA9PSAyOwotfQotCi1zdGF0aWMgdm9pZCAqCi1nZXREaXJlY3RCdWZmZXJQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIpIHsKLSAgICBpZiAoIWJ1ZmZlcikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdm9pZCogYnVmID0gX2Vudi0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyhidWZmZXIpOwotICAgIGlmIChidWYpIHsKLSAgICAgICAgamludCBwb3NpdGlvbiA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgcG9zaXRpb25JRCk7Ci0gICAgICAgIGppbnQgZWxlbWVudFNpemVTaGlmdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgZWxlbWVudFNpemVTaGlmdElEKTsKLSAgICAgICAgYnVmID0gKChjaGFyKikgYnVmKSArIChwb3NpdGlvbiA8PCBlbGVtZW50U2l6ZVNoaWZ0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYWxsb3dJbmRpcmVjdEJ1ZmZlcnMoX2VudikpIHsKLSAgICAgICAgICAgIGphcnJheSBhcnJheSA9IDA7Ci0gICAgICAgICAgICBqaW50IHJlbWFpbmluZzsKLSAgICAgICAgICAgIGJ1ZiA9IGdldFBvaW50ZXIoX2VudiwgYnVmZmVyLCAmYXJyYXksICZyZW1haW5pbmcpOwotICAgICAgICAgICAgaWYgKGFycmF5KSB7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZVBvaW50ZXIoX2VudiwgYXJyYXksIGJ1ZiwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihfZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCB1c2UgYSBuYXRpdmUgb3JkZXIgZGlyZWN0IEJ1ZmZlciIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldE51bUNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpIHsKLSAgICBpbnQgbnVtQ29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gMDsKLSAgICBnbEdldEludGVnZXJ2KEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUywgJm51bUNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyk7Ci0gICAgcmV0dXJuIG51bUNvbXByZXNzZWRUZXh0dXJlRm9ybWF0czsKLX0KLQotLy8gQ2hlY2sgaWYgdGhlIGV4dGVuc2lvbiBhdCB0aGUgaGVhZCBvZiBwRXh0ZW5zaW9ucyBpcyBwRXh0ZW5zaW9uLiBOb3RlIHRoYXQgcEV4dGVuc2lvbnMgaXMKLS8vIHRlcm1pbmF0ZWQgYnkgZWl0aGVyIDAgb3Igc3BhY2UsIHdoaWxlIHBFeHRlbnNpb24gaXMgdGVybWluYXRlZCBieSAwLgotCi1zdGF0aWMgYm9vbAotZXh0ZW5zaW9uRXF1YWwoY29uc3QgR0x1Ynl0ZSogcEV4dGVuc2lvbnMsIGNvbnN0IEdMdWJ5dGUqIHBFeHRlbnNpb24pIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBjaGFyIGEgPSAqcEV4dGVuc2lvbnMrKzsKLSAgICAgICAgY2hhciBiID0gKnBFeHRlbnNpb24rKzsKLSAgICAgICAgYm9vbCBhRW5kID0gYSA9PSAnXDAnIHx8IGEgPT0gJyAnOwotICAgICAgICBib29sIGJFbmQgPSBiID09ICdcMCc7Ci0gICAgICAgIGlmICggYUVuZCB8fCBiRW5kKSB7Ci0gICAgICAgICAgICByZXR1cm4gYUVuZCA9PSBiRW5kOwotICAgICAgICB9Ci0gICAgICAgIGlmICggYSAhPSBiICkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgR0x1Ynl0ZSoKLW5leHRFeHRlbnNpb24oY29uc3QgR0x1Ynl0ZSogcEV4dGVuc2lvbnMpIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBjaGFyIGEgPSAqcEV4dGVuc2lvbnMrKzsKLSAgICAgICAgaWYgKCBhID09ICdcMCcpIHsKLSAgICAgICAgICAgIHJldHVybiBwRXh0ZW5zaW9ucy0xOwotICAgICAgICB9IGVsc2UgaWYgKCBhID09ICcgJykgewotICAgICAgICAgICAgcmV0dXJuIHBFeHRlbnNpb25zOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbAotY2hlY2tGb3JFeHRlbnNpb24oY29uc3QgR0x1Ynl0ZSogcEV4dGVuc2lvbnMsIGNvbnN0IEdMdWJ5dGUqIHBFeHRlbnNpb24pIHsKLSAgICBmb3IgKDsqcEV4dGVuc2lvbnMgIT0gJ1wwJzsgcEV4dGVuc2lvbnMgPSBuZXh0RXh0ZW5zaW9uKHBFeHRlbnNpb25zKSkgewotICAgICAgICBpZiAoZXh0ZW5zaW9uRXF1YWwocEV4dGVuc2lvbnMsIHBFeHRlbnNpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sCi1zdXBwb3J0c0V4dGVuc2lvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgaW1wbCwgamZpZWxkSUQgZmllbGRJZCkgewotICAgIGlmICghX2Vudi0+R2V0Qm9vbGVhbkZpZWxkKGltcGwsIGhhdmVDaGVja2VkRXh0ZW5zaW9uc0lEKSkgewotICAgICAgICBfZW52LT5TZXRCb29sZWFuRmllbGQoaW1wbCwgaGF2ZUNoZWNrZWRFeHRlbnNpb25zSUQsIHRydWUpOwotICAgICAgICBjb25zdCBHTHVieXRlKiBzRXh0ZW5zaW9ucyA9IGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpOwotICAgICAgICBfZW52LT5TZXRCb29sZWFuRmllbGQoaW1wbCwgaGF2ZV9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGVJRCwKLSAgICAgICAgICAgIGNoZWNrRm9yRXh0ZW5zaW9uKHNFeHRlbnNpb25zLCAoY29uc3QgR0x1Ynl0ZSopICJHTF9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUiKSk7Ci0gICAgICAgIF9lbnYtPlNldEJvb2xlYW5GaWVsZChpbXBsLCBoYXZlX09FU19ibGVuZF9zdWJ0cmFjdElELAotICAgICAgICAgICAgY2hlY2tGb3JFeHRlbnNpb24oc0V4dGVuc2lvbnMsIChjb25zdCBHTHVieXRlKikgIkdMX09FU19ibGVuZF9zdWJ0cmFjdCIpKTsKLSAgICAgICAgX2Vudi0+U2V0Qm9vbGVhbkZpZWxkKGltcGwsIGhhdmVfT0VTX2ZyYW1lYnVmZmVyX29iamVjdElELAotICAgICAgICAgICAgY2hlY2tGb3JFeHRlbnNpb24oc0V4dGVuc2lvbnMsIChjb25zdCBHTHVieXRlKikgIkdMX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QiKSk7Ci0gICAgICAgIF9lbnYtPlNldEJvb2xlYW5GaWVsZChpbXBsLCBoYXZlX09FU190ZXh0dXJlX2N1YmVfbWFwSUQsCi0gICAgICAgICAgICBjaGVja0ZvckV4dGVuc2lvbihzRXh0ZW5zaW9ucywgKGNvbnN0IEdMdWJ5dGUqKSAiR0xfT0VTX3RleHR1cmVfY3ViZV9tYXAiKSk7Ci0gICAgfQotICAgIHJldHVybiBfZW52LT5HZXRCb29sZWFuRmllbGQoaW1wbCwgZmllbGRJZCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMSGVhZGVyLmphdmEtaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNzhmM2QuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTEhlYWRlci5qYXZhLWlmCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1wYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEdMIHsKLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTEltcGxIZWFkZXIuamF2YS1pbXBsIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTEltcGxIZWFkZXIuamF2YS1pbXBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDczMGFhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0xJbXBsSGVhZGVyLmphdmEtaW1wbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLmdsZXNfam5pOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQXBwR2xvYmFsczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5uaW8uQnVmZmVyOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMEV4dDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTFFeHQ7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMUV4dGVuc2lvblBhY2s7Ci0KLXB1YmxpYyBjbGFzcyBHTEltcGwgaW1wbGVtZW50cyBHTDEwLCBHTDEwRXh0LCBHTDExLCBHTDExRXh0LCBHTDExRXh0ZW5zaW9uUGFjayB7Ci0KLSAgICAvLyBQcml2YXRlIGFjY2Vzc29ycyBmb3IgbmF0aXZlIGNvZGUKLQotICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKLSAgICBzdGF0aWMgewotCV9uYXRpdmVDbGFzc0luaXQoKTsKLSAgICB9Ci0KLSAgICBCdWZmZXIgX2NvbG9yUG9pbnRlciA9IG51bGw7Ci0gICAgQnVmZmVyIF9ub3JtYWxQb2ludGVyID0gbnVsbDsKLSAgICBCdWZmZXIgX3RleENvb3JkUG9pbnRlciA9IG51bGw7Ci0gICAgQnVmZmVyIF92ZXJ0ZXhQb2ludGVyID0gbnVsbDsKLSAgICBCdWZmZXIgX3BvaW50U2l6ZVBvaW50ZXJPRVMgPSBudWxsOwotICAgIEJ1ZmZlciBfbWF0cml4SW5kZXhQb2ludGVyT0VTID0gbnVsbDsKLSAgICBCdWZmZXIgX3dlaWdodFBvaW50ZXJPRVMgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlQ2hlY2tlZEV4dGVuc2lvbnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhdmVfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlX09FU19ibGVuZF9zdWJ0cmFjdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZV9PRVNfZnJhbWVidWZmZXJfb2JqZWN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlX09FU190ZXh0dXJlX2N1YmVfbWFwOwotCi0gICAgcHVibGljIEdMSW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnbEdldFBvaW50ZXJ2KGludCBwbmFtZSwgamF2YS5uaW8uQnVmZmVyW10gcGFyYW1zKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiZ2xHZXRQb2ludGVydiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWxsb3dJbmRpcmVjdEJ1ZmZlcnMoU3RyaW5nIGFwcE5hbWUpIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgaW50IHZlcnNpb24gPSAwOwotICAgICAgICBJUGFja2FnZU1hbmFnZXIgcG0gPSBBcHBHbG9iYWxzLmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcHBsaWNhdGlvbkluZm8gYXBwbGljYXRpb25JbmZvID0gcG0uZ2V0QXBwbGljYXRpb25JbmZvKGFwcE5hbWUsIDApOwotICAgICAgICAgICAgaWYgKGFwcGxpY2F0aW9uSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbiA9IGFwcGxpY2F0aW9uSW5mby50YXJnZXRTZGtWZXJzaW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotICAgICAgICBMb2cuZSgiT3BlbkdMRVMiLCBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgIkFwcGxpY2F0aW9uICVzIChTREsgdGFyZ2V0ICVkKSBjYWxsZWQgYSBHTDExIFBvaW50ZXIgbWV0aG9kIHdpdGggYW4gaW5kaXJlY3QgQnVmZmVyLiIsCi0gICAgICAgICAgICBhcHBOYW1lLCB2ZXJzaW9uKSk7Ci0gICAgICAgIGlmICh2ZXJzaW9uIDw9IEJ1aWxkLlZFUlNJT05fQ09ERVMuQ1VQQ0FLRSkgewotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9nbEdldFN0cmluZy5jcHAgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L2dsR2V0U3RyaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2ZTNmMy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L2dsR2V0U3RyaW5nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotLyogY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nICggR0xlbnVtIG5hbWUgKSAqLw0KLXN0YXRpYyBqc3RyaW5nIGFuZHJvaWRfZ2xHZXRTdHJpbmcoSk5JRW52ICpfZW52LCBqb2JqZWN0LCBqaW50IG5hbWUpIHsNCi0gICAgY29uc3QgY2hhciogY2hhcnMgPSAoY29uc3QgY2hhciopIGdsR2V0U3RyaW5nKChHTGVudW0pIG5hbWUpOw0KLSAgICByZXR1cm4gX2Vudi0+TmV3U3RyaW5nVVRGKGNoYXJzKTsNCi19DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9nbEdldFN0cmluZy5qYXZhLTEwLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9nbEdldFN0cmluZy5qYXZhLTEwLWlmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OThmYWJjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvZ2xHZXRTdHJpbmcuamF2YS0xMC1pZgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotICAgIHB1YmxpYyBTdHJpbmcgZ2xHZXRTdHJpbmcoDQotICAgICAgICBpbnQgbmFtZQ0KLSAgICApOw0KLQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvZ2xHZXRTdHJpbmcuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvZ2xHZXRTdHJpbmcuamF2YS1pZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4ZmFiYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L2dsR2V0U3RyaW5nLmphdmEtaWYKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKA0KLSAgICAgICAgaW50IG5hbWUNCi0gICAgKTsNCi0NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L2dsR2V0U3RyaW5nLmphdmEtaW1wbCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvZ2xHZXRTdHJpbmcuamF2YS1pbXBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc4ODFjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvZ2xHZXRTdHJpbmcuamF2YS1pbXBsCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotICAgIC8vIEMgZnVuY3Rpb24gY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nICggR0xlbnVtIG5hbWUgKQ0KLQ0KLSAgICBwdWJsaWMgbmF0aXZlIFN0cmluZyBfZ2xHZXRTdHJpbmcoDQotICAgICAgICBpbnQgbmFtZQ0KLSAgICApOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKA0KLSAgICAgICAgaW50IG5hbWUNCi0gICAgKSB7DQotICAgICAgICBTdHJpbmcgcmV0dXJuVmFsdWU7DQotICAgICAgICByZXR1cm5WYWx1ZSA9IF9nbEdldFN0cmluZygNCi0gICAgICAgICAgICBuYW1lDQotICAgICAgICApOw0KLSAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOw0KLSAgICB9DQotDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9nbEdldFN0cmluZy5uYXRpdmVSZWcgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L2dsR2V0U3RyaW5nLm5hdGl2ZVJlZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0MTg3Yy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L2dsR2V0U3RyaW5nLm5hdGl2ZVJlZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXsiX2dsR2V0U3RyaW5nIiwgIihJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopIGFuZHJvaWRfZ2xHZXRTdHJpbmcgfSwNCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKaW5kZXggYmVkMjBlYi4uZDVhZWE0MyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbApAQCAtMTksNSArMTksNSBAQAogCiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBfbGFiZWwiIG1zZ2lkPSI0NTY3NTY2MDk4NTI4NTg4ODYzIj4iU2V0ZWxhbiBQZW55aW1wYW5hbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9sYWJlbCIgbXNnaWQ9IjQ1Njc1NjYwOTg1Mjg1ODg4NjMiPiJQZW5nYXR1cmFuIFBlbnlpbXBhbmFuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbAppbmRleCBhOGIwMjRkLi43YzFjZDE4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKQEAgLTM5LDcgKzM5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJhdHRlcnlfbG93X3BlcmNlbnRfZm9ybWF0IiBtc2dpZD0iMTA3NzI0NDk0OTMxODI2MTc2MSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkJSU8L3hsaWZmOmc+IHRlcnNpc2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnZhbGlkX2NoYXJnZXIiIG1zZ2lkPSI0NTQ5MTA1OTk2NzQwNTIyNTIzIj4iUGVuZ2lzaWFuIGRheWEgVVNCIHRpZGFrIGRpZHVrdW5nLiJcbiJHdW5ha2FuIGhhbnlhIHBlbmdpc2kgZGF5YSB5YW5nIGRpc2VkaWFrYW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYmF0dGVyeV9sb3dfd2h5IiBtc2dpZD0iNzI3OTE2OTYwOTUxODM4NjM3MiI+IlBlbmdndW5hYW4gYmF0ZXJhaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfc2V0dGluZ3Nfc2V0dGluZ3NfYnV0dG9uIiBtc2dpZD0iMzAyMzg4OTkxNjY5OTI3MDIyNCI+IlNldGVsYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3NldHRpbmdzX3NldHRpbmdzX2J1dHRvbiIgbXNnaWQ9IjMwMjM4ODk5MTY2OTkyNzAyMjQiPiJQZW5nYXR1cmFuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9zZXR0aW5nc193aWZpX2J1dHRvbiIgbXNnaWQ9IjE3MzM5MjgxNTE2OTgzMTE5MjMiPiJXaS1GaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfc2V0dGluZ3NfYWlycGxhbmUiIG1zZ2lkPSI0ODc5ODc5Njk4NTAwOTU1MzAwIj4iTW9kZSBwZXNhd2F0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9zZXR0aW5nc19hdXRvX3JvdGF0aW9uIiBtc2dpZD0iMzc5MDQ4MjU0MTM1Nzc5ODQyMSI+IlB1dGFyIGxheWFyIHNlY2FyYSBvdG9tYXRpcyI8L3N0cmluZz4KQEAgLTY5LDEwICs2OSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0ic2NyZWVuc2hvdF9zYXZlZF90ZXh0IiBtc2dpZD0iMTE1MjgzOTY0NzY3NzU1ODgxNSI+IlNlbnR1aCB1bnR1ayBtZWxpaGF0IHRhbmdrYXBhbiBsYXlhciBBbmRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNjcmVlbnNob3RfZmFpbGVkX3RpdGxlIiBtc2dpZD0iNzA1NzgxMTE2NzQ2OTIyNzcxIj4iVGlkYWsgZGFwYXQgbWVuZ2FtYmlsIHRhbmdrYXBhbiBsYXlhci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzY3JlZW5zaG90X2ZhaWxlZF90ZXh0IiBtc2dpZD0iODEzNDAxMTI2OTU3MjQxNTQwMiI+IlRpZGFrIGRhcGF0IG1lbnlpbXBhbiB0YW5na2FwYW4gbGF5YXIuIFBlbnlpbXBhbmFuIG11bmdraW4gc2VkYW5nIGRpZ3VuYWthbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2JfcHJlZmVyZW5jZV90aXRsZSIgbXNnaWQ9IjY1NTEwNTAzNzczODg4ODI3ODciPiJPcHNpIHRyYW5zZmVyIGJlcmthcyBVU0IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2JfcHJlZmVyZW5jZV90aXRsZSIgbXNnaWQ9IjY1NTEwNTAzNzczODg4ODI3ODciPiJPcHNpIHRyYW5zZmVyIGZpbGUgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNlX210cF9idXR0b25fdGl0bGUiIG1zZ2lkPSI0MzMzNTA0NDEzNTYzMDIzNjI2Ij4iUGFzYW5nIHNlYmFnYWkgcGVtdXRhciBtZWRpYSAoTVRQKSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzZV9wdHBfYnV0dG9uX3RpdGxlIiBtc2dpZD0iNzUxNzEyNzU0MDMwMTYyNTc1MSI+IlBhc2FuZyBzZWJhZ2FpIGthbWVyYSAoUFRQKSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxlcl9jZF9idXR0b25fdGl0bGUiIG1zZ2lkPSIyMzEyNjY3NTc4NTYyMjAxNTgzIj4iUGFzYW5nIGFwbCBUcmFuc2ZlciBCZXJrYXMgQW5kcm9pZCB1bnR1ayBNYWMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsZXJfY2RfYnV0dG9uX3RpdGxlIiBtc2dpZD0iMjMxMjY2NzU3ODU2MjIwMTU4MyI+IlBhc2FuZyBhcGwgVHJhbnNmZXIgRmlsZSBBbmRyb2lkIHVudHVrIE1hYyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjY2Vzc2liaWxpdHlfYmFjayIgbXNnaWQ9IjU2NzAxMTUzODk5NDQyOTEyMCI+IktlbWJhbGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY2Nlc3NpYmlsaXR5X2hvbWUiIG1zZ2lkPSI4MjE3MjE2MDc0ODk1Mzc3NjQxIj4iVXRhbWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY2Nlc3NpYmlsaXR5X21lbnUiIG1zZ2lkPSIzMTY4MzkzMDMzMjQ2OTU5NDkiPiJNZW51Ijwvc3RyaW5nPgpAQCAtMTE4LDcgKzExOCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJhY2Nlc3NpYmlsaXR5X2JsdWV0b290aF90ZXRoZXIiIG1zZ2lkPSI0MTAyNzg0NDk4MTQwMjcxOTY5Ij4iUGVuYW1iYXRhbiBibHVldG9vdGguIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWNjZXNzaWJpbGl0eV9haXJwbGFuZV9tb2RlIiBtc2dpZD0iODM0NzQ4OTk5NzkwNzYzMDkyIj4iTW9kZSBwZXNhd2F0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjY2Vzc2liaWxpdHlfYmF0dGVyeV9sZXZlbCIgbXNnaWQ9Ijc0NTE0NzQxODcxMTMzNzE5NjUiPiJCYXRlcmFpIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBwZXJzZW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWNjZXNzaWJpbGl0eV9zZXR0aW5nc19idXR0b24iIG1zZ2lkPSI3OTk1ODM5MTEyMzE4OTMzODAiPiJTZXRlbGFuIHNpc3RlbS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2Nlc3NpYmlsaXR5X3NldHRpbmdzX2J1dHRvbiIgbXNnaWQ9Ijc5OTU4MzkxMTIzMTg5MzM4MCI+IlBlbmdhdHVyYW4gc2lzdGVtLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjY2Vzc2liaWxpdHlfbm90aWZpY2F0aW9uc19idXR0b24iIG1zZ2lkPSI0NDk4MDAwMzY5Nzc5NDIxODkyIj4iUGVtYmVyaXRhaHVhbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY2Nlc3NpYmlsaXR5X3JlbW92ZV9ub3RpZmljYXRpb24iIG1zZ2lkPSIzNjAzMDk5NTE0OTAyMTgyMzUwIj4iTWVuZ2hhcHVzIHBlbWJlcml0YWh1YW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWNjZXNzaWJpbGl0eV9ncHNfZW5hYmxlZCIgbXNnaWQ9IjM1MTE0Njk0OTkyNDAxMjMwMTkiPiJHUFMgZGlha3RpZmthbi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDYwOGZjNzEuLmZkNzQxOGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0xMDUzLDcgKzEwNTMsNyBAQAogfQogCiAvLyBhdWRpb0NvbmZpZ0NoYW5nZWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgdm9pZCAqcGFyYW0yKQordm9pZCBBdWRpb0ZsaW5nZXI6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMikKIHsKICAgICBzaXplX3Qgc2l6ZSA9IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewpAQCAtMTQ2Miw3ICsxNDYyLDkgQEAKICAgICAgICAgLy8gQXNzdW1lcyBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgYnkgQXVkaW9GbGluZ2VyIHdpdGggaXQncyBtTG9jayBoZWxkLAogICAgICAgICAvLyBidXQgaXQgd291bGQgYmUgc2FmZXIgdG8gZXhwbGljaXRseSBwYXNzIGluaXRpYWwgbWFzdGVyVm9sdW1lIGFzIHBhcmFtZXRlcgogICAgICAgICBtTWFzdGVyVm9sdW1lKGF1ZGlvRmxpbmdlci0+bWFzdGVyVm9sdW1lU1dfbCgpKSwKLSAgICAgICAgbUxhc3RXcml0ZVRpbWUoMCksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSkKKyAgICAgICAgbUxhc3RXcml0ZVRpbWUoMCksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSksCisgICAgICAgIC8vIG1NaXhlclN0YXR1cworICAgICAgICBtUHJldk1peGVyU3RhdHVzKE1JWEVSX0lETEUpCiB7CiAgICAgc25wcmludGYobU5hbWUsIGtOYW1lTGVuZ3RoLCAiQXVkaW9PdXRfJVgiLCBpZCk7CiAKQEAgLTE5MjIsNyArMTkyNCw2IEBACiAgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCB0eXBlKQogewogICAgIG1BdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIobUZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKLSAgICBtUHJldk1peGVyU3RhdHVzID0gTUlYRVJfSURMRTsKICAgICAvLyBGSVhNRSAtIEN1cnJlbnQgbWl4ZXIgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBzdGVyZW8gb3V0cHV0CiAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMSkgewogICAgICAgICBBTE9HRSgiSW52YWxpZCBhdWRpbyBoYXJkd2FyZSBjaGFubmVsIGNvdW50Iik7CkBAIC0yMDQzLDExICsyMDQ0LDcgQEAKIAogICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzKCk7CiAKLWlmIChtVHlwZSA9PSBESVJFQ1QpIHsKLSAgICAgICAgYWN0aXZlVHJhY2suY2xlYXIoKTsKLX0KLQotICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX0lETEU7CisgICAgICAgIG1NaXhlclN0YXR1cyA9IE1JWEVSX0lETEU7CiAgICAgICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0yMTAyLDkgKzIwOTksNyBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVigiVGhyZWFkICVwIHR5cGUgJWQgVElEICVkIHdha2luZyB1cCIsIHRoaXMsIG1UeXBlLCBnZXR0aWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVXYWtlTG9ja19sKCk7CiAKLWlmIChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykgewogICAgICAgICAgICAgICAgICAgICBtUHJldk1peGVyU3RhdHVzID0gTUlYRVJfSURMRTsKLX0KIAogICAgICAgICAgICAgICAgICAgICBjaGVja1NpbGVudE1vZGVfbCgpOwogCkBAIC0yMTI2LDExICsyMTIxLDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtaXhlclN0YXR1cyA9IHByZXBhcmVUcmFja3NfbCgmdHJhY2tzVG9SZW1vdmUpOwotICAgICAgICAgICAgLy8gc2VlIEZJWE1FIGluIEF1ZGlvRmxpbmdlci5oCi0gICAgICAgICAgICBpZiAobWl4ZXJTdGF0dXMgPT0gTUlYRVJfQ09OVElOVUUpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1peGVyX3N0YXRlIG5ld01peGVyU3RhdHVzID0gcHJlcGFyZVRyYWNrc19sKCZ0cmFja3NUb1JlbW92ZSk7CisgICAgICAgICAgICAvLyBTaGlmdCBpbiB0aGUgbmV3IHN0YXR1czsgdGhpcyBjb3VsZCBiZSBhIHF1ZXVlIGlmIGl0J3MKKyAgICAgICAgICAgIC8vIHVzZWZ1bCB0byBmaWx0ZXIgdGhlIG1peGVyIHN0YXR1cyBvdmVyIHNldmVyYWwgY3ljbGVzLgorICAgICAgICAgICAgbVByZXZNaXhlclN0YXR1cyA9IG1NaXhlclN0YXR1czsKKyAgICAgICAgICAgIG1NaXhlclN0YXR1cyA9IG5ld01peGVyU3RhdHVzOwogCiAgICAgICAgICAgICAvLyBwcmV2ZW50IGFueSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbiBsaXN0IGFuZCBpbiBlYWNoIGVmZmVjdCBjaGFpbgogICAgICAgICAgICAgLy8gZHVyaW5nIG1peGluZyBhbmQgZWZmZWN0IHByb2Nlc3MgYXMgdGhlIGF1ZGlvIGJ1ZmZlcnMgY291bGQgYmUgZGVsZXRlZApAQCAtMjEzOCwxMSArMjEzMyw3IEBACiAgICAgICAgICAgICBsb2NrRWZmZWN0Q2hhaW5zX2woZWZmZWN0Q2hhaW5zKTsKICAgICAgICAgfQogCi1pZiAobVR5cGUgPT0gRElSRUNUKSB7Ci0gICAgICAgIC8vIEZvciBEaXJlY3RPdXRwdXRUaHJlYWQsIHRoaXMgdGVzdCBpcyBlcXVpdmFsZW50IHRvICJhY3RpdmVUcmFjayAhPSAwIgotfQotCi0gICAgICAgIGlmIChDQ19MSUtFTFkobWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSkgeworICAgICAgICBpZiAoQ0NfTElLRUxZKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkpKSB7CiAgICAgICAgICAgICB0aHJlYWRMb29wX21peCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyZWFkTG9vcF9zbGVlcFRpbWUoKTsKQEAgLTIxOTYsMTAgKzIxODcsNiBAQAogICAgICAgICAvLyBzYW1lIGxvY2suCiAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLmNsZWFyKCk7CiAKLS8vIEZJWE1FIG1lcmdlIHRoZXNlCi1pZiAobVR5cGUgPT0gRElSRUNUKSB7Ci0gICAgICAgIGFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci19CiAgICAgICAgIC8vIEZJWE1FIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgbmVlZCBmb3IgdGhpcyBoZXJlOwogICAgICAgICAvLyAgICAgICBpdCB3YXMgaW4gdGhlIG9yaWdpbmFsIGNvZGUgYnV0IG1heWJlIHRoZQogICAgICAgICAvLyAgICAgICBhc3NpZ25tZW50IGluIHNhdmVPdXRwdXRUcmFja3MoKSBtYWtlcyB0aGlzIHVubmVjZXNzYXJ5PwpAQCAtMjI4Myw3ICsyMjcwLDcgQEAKICAgICAvLyBJZiBubyB0cmFja3MgYXJlIHJlYWR5LCBzbGVlcCBvbmNlIGZvciB0aGUgZHVyYXRpb24gb2YgYW4gb3V0cHV0CiAgICAgLy8gYnVmZmVyIHNpemUsIHRoZW4gd3JpdGUgMHMgdG8gdGhlIG91dHB1dAogICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgewotICAgICAgICBpZiAobWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKKyAgICAgICAgaWYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkgewogICAgICAgICAgICAgc2xlZXBUaW1lID0gYWN0aXZlU2xlZXBUaW1lID4+IHNsZWVwVGltZVNoaWZ0OwogICAgICAgICAgICAgaWYgKHNsZWVwVGltZSA8IGtNaW5UaHJlYWRTbGVlcFRpbWVVcykgewogICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IGtNaW5UaHJlYWRTbGVlcFRpbWVVczsKQEAgLTIyOTksMTAgKzIyODYsMTAgQEAKICAgICAgICAgICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCB8fAotICAgICAgICAgICAgICAgKG1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEICYmIGxvbmdTdGFuZGJ5RXhpdCkpIHsKKyAgICAgICAgICAgICAgIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQgJiYgbG9uZ1N0YW5kYnlFeGl0KSkgewogICAgICAgICBtZW1zZXQgKG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOwogICAgICAgICBzbGVlcFRpbWUgPSAwOwotICAgICAgICBBTE9HVl9JRigobUJ5dGVzV3JpdHRlbiA9PSAwICYmIChtaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCAmJiBsb25nU3RhbmRieUV4aXQpKSwgImFudGljaXBhdGVkIHN0YXJ0Iik7CisgICAgICAgIEFMT0dWX0lGKChtQnl0ZXNXcml0dGVuID09IDAgJiYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCAmJiBsb25nU3RhbmRieUV4aXQpKSwgImFudGljaXBhdGVkIHN0YXJ0Iik7CiAgICAgfQogICAgIC8vIFRPRE8gYWRkIHN0YW5kYnkgdGltZSBleHRlbnNpb24gZmN0IG9mIGVmZmVjdCB0YWlsCiB9CkBAIC0yNTU4LDcgKzI1NDUsNiBAQAogICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKICAgICB9CiAKLSAgICBtUHJldk1peGVyU3RhdHVzID0gbWl4ZXJTdGF0dXM7CiAgICAgcmV0dXJuIG1peGVyU3RhdHVzOwogfQogCkBAIC0yODI1LDE1ICsyODExLDEzIEBACiB7CiAgICAgc3A8VHJhY2s+IHRyYWNrVG9SZW1vdmU7CiAKLSAgICAvLyBGSVhNRSBUZW1wb3JhcmlseSByZW5hbWVkIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIHRoZSBtZW1iZXIgIm1peGVyU3RhdHVzIgotICAgIG1peGVyX3N0YXRlIG1peGVyU3RhdHVzXyA9IE1JWEVSX0lETEU7CisgICAgbWl4ZXJfc3RhdGUgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogCiAgICAgLy8gZmluZCBvdXQgd2hpY2ggdHJhY2tzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCiAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpICE9IDApIHsKICAgICAgICAgc3A8VHJhY2s+IHQgPSBtQWN0aXZlVHJhY2tzWzBdLnByb21vdGUoKTsKLSAgICAgICAgLy8gc2VlIEZJWE1FIGluIEF1ZGlvRmxpbmdlci5oLCByZXR1cm4gTUlYRVJfSURMRSBtaWdodCBhbHNvIHdvcmsKLSAgICAgICAgaWYgKHQgPT0gMCkgcmV0dXJuIE1JWEVSX0NPTlRJTlVFOwotICAgICAgICAvL2lmICh0ID09IDApIGNvbnRpbnVlOworICAgICAgICAvLyBUaGUgdHJhY2sgZGllZCByZWNlbnRseQorICAgICAgICBpZiAodCA9PSAwKSByZXR1cm4gTUlYRVJfSURMRTsKIAogICAgICAgICBUcmFjayogY29uc3QgdHJhY2sgPSB0LmdldCgpOwogICAgICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSB0cmFjay0+Y2JsaygpOwpAQCAtMjkxOCw4ICsyOTAyLDggQEAKIAogICAgICAgICAgICAgLy8gcmVzZXQgcmV0cnkgY291bnQKICAgICAgICAgICAgIHRyYWNrLT5tUmV0cnlDb3VudCA9IGtNYXhUcmFja1JldHJpZXNEaXJlY3Q7Ci0gICAgICAgICAgICBhY3RpdmVUcmFjayA9IHQ7Ci0gICAgICAgICAgICBtaXhlclN0YXR1c18gPSBNSVhFUl9UUkFDS1NfUkVBRFk7CisgICAgICAgICAgICBtQWN0aXZlVHJhY2sgPSB0OworICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfUkVBRFk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvL0FMT0dWKCJ0cmFjayAlZCB1PSUwOHgsIHM9JTA4eCBbTk9UIFJFQURZXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPnVzZXIsIGNibGstPnNlcnZlcik7CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBlZCgpKSB7CkBAIC0yOTM2LDcgKzI5MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCIsIHRyYWNrLT5uYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICB0cmFja1RvUmVtb3ZlID0gdHJhY2s7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXNfID0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yOTU3LDcgKzI5NDEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIG1peGVyU3RhdHVzXzsKKyAgICByZXR1cm4gbWl4ZXJTdGF0dXM7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnRocmVhZExvb3BfbWl4KCkKQEAgLTI5NjgsNyArMjk1Miw3IEBACiAgICAgLy8gb3V0cHV0IGF1ZGlvIHRvIGhhcmR3YXJlCiAgICAgd2hpbGUgKGZyYW1lQ291bnQpIHsKICAgICAgICAgYnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgICAgICBhY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrLT5nZXROZXh0QnVmZmVyKCZidWZmZXIpOwogICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoYnVmZmVyLnJhdyA9PSBOVUxMKSkgewogICAgICAgICAgICAgbWVtc2V0KGN1ckJ1ZiwgMCwgZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yOTc2LDE3ICsyOTYwLDE4IEBACiAgICAgICAgIG1lbWNweShjdXJCdWYsIGJ1ZmZlci5yYXcsIGJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgIGZyYW1lQ291bnQgLT0gYnVmZmVyLmZyYW1lQ291bnQ7CiAgICAgICAgIGN1ckJ1ZiArPSBidWZmZXIuZnJhbWVDb3VudCAqIG1GcmFtZVNpemU7Ci0gICAgICAgIGFjdGl2ZVRyYWNrLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOworICAgICAgICBtQWN0aXZlVHJhY2stPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CiAgICAgfQogICAgIHNsZWVwVGltZSA9IDA7CiAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CisgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7CiAgICAgYXBwbHlWb2x1bWUoKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6dGhyZWFkTG9vcF9zbGVlcFRpbWUoKQogewogICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgewotICAgICAgICBpZiAobWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKKyAgICAgICAgaWYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkgewogICAgICAgICAgICAgc2xlZXBUaW1lID0gYWN0aXZlU2xlZXBUaW1lOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKQEAgLTMxMjIsNyArMzEwNyw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfc2xlZXBUaW1lKCkKIHsKICAgICBpZiAoc2xlZXBUaW1lID09IDApIHsKLSAgICAgICAgaWYgKG1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7CisgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKICAgICAgICAgICAgIHNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggNTE4YTk5Yy4uMmUyNTljMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtNjA3LDEwICs2MDcsNiBAQAogICAgICAgICAgICAgTUlYRVJfVFJBQ0tTX1JFQURZICAgICAgLy8gYXQgbGVhc3Qgb25lIGFjdGl2ZSB0cmFjaywgYW5kIGF0IGxlYXN0IG9uZSB0cmFjayBoYXMgZGF0YQogICAgICAgICAgICAgLy8gc3RhbmRieSBtb2RlIGRvZXMgbm90IGhhdmUgYW4gZW51bSB2YWx1ZQogICAgICAgICAgICAgLy8gc3VzcGVuZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcyBvcnRob2dvbmFsIHRvIG1peGVyIHN0YXRlCi0jaWYgMQotICAgICAgICAgICAgLy8gRklYTUUgcmVtb3ZlIHRoaXMgaGFjayBmb3IgcHJlcGFyZVRyYWNrc19sKCkKLSAgICAgICAgICAgICwgTUlYRVJfQ09OVElOVUUgICAgICAgIC8vICJjb250aW51ZTsiCi0jZW5kaWYKICAgICAgICAgfTsKIAogICAgICAgICAvLyBwbGF5YmFjayB0cmFjawpAQCAtOTYyLDE5ICs5NTgsMTcgQEAKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTbGVlcFRpbWU7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgaWRsZVNsZWVwVGltZTsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWU7Ci0gICAgICAgIC8vIG1peGVyU3RhdHVzIHdhcyBsb2NhbCB0byB0aGUgd2hpbGUgIWV4aXRpbmdQZW5kaW5nIGxvb3AKLSAgICAgICAgbWl4ZXJfc3RhdGUgICAgICAgICAgICAgICAgICAgICBtaXhlclN0YXR1czsKKworICAgICAgICAvLyBtaXhlciBzdGF0dXMgcmV0dXJuZWQgYnkgcHJlcGFyZVRyYWNrc19sKCkKKyAgICAgICAgbWl4ZXJfc3RhdGUgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJTdGF0dXM7ICAgICAgIC8vIGN1cnJlbnQgY3ljbGUKKyAgICAgICAgbWl4ZXJfc3RhdGUgICAgICAgICAgICAgICAgICAgICBtUHJldk1peGVyU3RhdHVzOyAgIC8vIHByZXZpb3VzIGN5Y2xlCiAKICAgICAgICAgLy8gRklYTUUgbW92ZSB0aGVzZSBkZWNsYXJhdGlvbnMgaW50byB0aGUgc3BlY2lmaWMgc3ViLWNsYXNzIHRoYXQgbmVlZHMgdGhlbQogICAgICAgICAvLyBNSVhFUiBvbmx5CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1N0YW5kYnlFeGl0OwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwVGltZVNoaWZ0OwotICAgICAgICAvLyBNSVhFUiBhbmQgRFVQTElDQVRJTkcgb25seQotICAgICAgICBtaXhlcl9zdGF0ZSBtUHJldk1peGVyU3RhdHVzOyAvLyBwcmV2aW91cyBzdGF0dXMgcmV0dXJuZWQgYnkgcHJlcGFyZVRyYWNrc19sKCkKICAgICAgICAgLy8gRElSRUNUIG9ubHkKICAgICAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5RGVsYXk7Ci0gICAgICAgIC8vIGFjdGl2ZVRyYWNrIHdhcyBsb2NhbCB0byB0aGUgd2hpbGUgIWV4aXRpbmdQZW5kaW5nIGxvb3AKLSAgICAgICAgc3A8VHJhY2s+ICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjazsKICAgICAgICAgLy8gRFVQTElDQVRJTkcgb25seQogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVzOwogICAgIH07CkBAIC0xMDQ2LDYgKzEwNDAsOSBAQAogCiBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhcHBseVZvbHVtZSgpOyAgLy8gRklYTUUgaW5saW5lIGludG8gdGhyZWFkTG9vcF9taXgoKQorCisgICAgICAgIC8vIHByZXBhcmVUcmFja3NfbCgpIHRlbGxzIHRocmVhZExvb3BfbWl4KCkgdGhlIG5hbWUgb2YgdGhlIHNpbmdsZSBhY3RpdmUgdHJhY2sKKyAgICAgICAgc3A8VHJhY2s+ICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrOwogICAgIH07CiAKICAgICBjbGFzcyBEdXBsaWNhdGluZ1RocmVhZCA6IHB1YmxpYyBNaXhlclRocmVhZCB7CkBAIC0xMDkwLDcgKzEwODcsNyBAQAogICAgICAgICAgICAgICAvLyBubyByYW5nZSBjaGVjaywgZG9lc24ndCBjaGVjayBwZXItdGhyZWFkIHN0cmVhbSB2b2x1bWUsIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogICAgICAgICAgICAgICBmbG9hdCBzdHJlYW1Wb2x1bWVfbChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lOyB9Ci0gICAgICAgICAgICAgIHZvaWQgYXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgdm9pZCAqcGFyYW0yKTsKKyAgICAgICAgICAgICAgdm9pZCBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpOwogCiAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlIGFuIGF1ZGlvX2lvX2hhbmRsZV90LCBzZXNzaW9uIElELCBvciBlZmZlY3QgSUQKICAgICAgICAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BbGFybU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BbGFybU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggYjhjNDRkOS4uMDU3NDQwNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWxhcm1NYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FsYXJtTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNDc3LDcgKzQ3Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA6IGJzLmZpbHRlclN0YXRzLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAgICAiKTsgcHcucHJpbnQoZmUuZ2V0VmFsdWUoKS5jb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBhbGFybXM6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oZmUuZ2V0S2V5KCkuZ2V0SW50ZW50KCkudG9TaG9ydFN0cmluZyhmYWxzZSwgdHJ1ZSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGZlLmdldEtleSgpLmdldEludGVudCgpLnRvU2hvcnRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKaW5kZXggN2JiNzkzOC4uNzIwYjVmZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKQEAgLTExNyw2ICsxMTcsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnRlcmZhY2VUeFRocm90dGxlUmVzdWx0ID0gMjE5OwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRdW90YUNvdW50ZXJSZXN1bHQgICAgICAgID0gMjIwOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXRoZXJpbmdTdGF0c1Jlc3VsdCAgICAgID0gMjIxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEbnNQcm94eVF1ZXJ5UmVzdWx0ICAgICAgID0gMjIyOwogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEludGVyZmFjZUNoYW5nZSAgICAgICAgICAgPSA2MDA7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJhbmR3aWR0aENvbnRyb2wgICAgICAgICAgPSA2MDE7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggZDlkM2Y0ZS4uNjM0MThkYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMjIzNCwxNCArMjIzNCwxOCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gY3VycmVudFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZG9TY3JlZW5BbmltID0gKG1hc2sgJiAoU0NSRUVOX0JSSUdIVF9CSVQgfCBTQ1JFRU5fT05fQklUKSkgIT0gMDsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB0dXJuaW5nT2ZmID0gZW5kVmFsdWUgPT0gUG93ZXIuQlJJR0hUTkVTU19PRkY7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0dXJuaW5nT2ZmICYmICgobWFzayAmIChTQ1JFRU5fT05fQklUIHwgU0NSRUVOX0JSSUdIVF9CSVQpKSAhPSAwKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHVybmluZ09mZiAmJiBkb1NjcmVlbkFuaW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbmNlbCBhbGwgcGVuZGluZyBhbmltYXRpb25zIHNpbmNlIHdlJ3JlIHR1cm5pbmcgb2ZmCiAgICAgICAgICAgICAgICAgICAgICAgICBtU2NyZWVuQnJpZ2h0bmVzc0hhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzQW5kTWVzc2FnZXMobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5PZmZGaW5pc2hlZEFuaW1hdGluZ0xvY2tlZChtU2NyZWVuT2ZmUmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMjAwOyAvLyBUT0RPOiBob3cgbG9uZyBzaG91bGQgdGhpcyBiZT8KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhbmltYXRlSW50ZXJuYWwobWFzaywgdHVybmluZ09mZiwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkb1NjcmVlbkFuaW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVJbnRlcm5hbChtYXNrLCB0dXJuaW5nT2ZmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUga2V5Ym9hcmQgbGlnaHQgYW5pbWF0aW9uIHdoZW4gd2UgaGF2ZSBkZXZpY2VzIHRoYXQgc3VwcG9ydCBpdAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDRlYTJmMDQuLjI1Mzg0NTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTQ5LDEwICs0OSwxMCBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKIGltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYXBwLldhbGxwYXBlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLklCYWNrdXBNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrczI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKQEAgLTQyOTcsNyArNDI5Nyw3IEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGludCB1aWQgPSBBcHBHbG9iYWxzLmdldFBhY2thZ2VNYW5hZ2VyKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYWNrYWdlVWlkKHJlYy5rZXkucGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh1aWQgIT0gQmluZGVyLmdldENhbGxpbmdVaWQoKSkgeworICAgICAgICAgICAgICAgIGlmICghVXNlcklkLmlzU2FtZUFwcCh1aWQsIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbmNlbEludGVudFNlbmRlcigpIGZyb20gcGlkPSIKICAgICAgICAgICAgICAgICAgICAgICAgICsgQmluZGVyLmdldENhbGxpbmdQaWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkKQEAgLTQ2NTcsOSArNDY1NywxMSBAQAogICAgICAqIGlmIGNhbGxpbmdVaWQgaXMgbm90IGFsbG93ZWQgdG8gZG8gdGhpcy4gIFJldHVybnMgdGhlIHVpZCBvZiB0aGUgdGFyZ2V0CiAgICAgICogaWYgdGhlIFVSSSBwZXJtaXNzaW9uIGdyYW50IHNob3VsZCBiZSBwZXJmb3JtZWQ7IHJldHVybnMgLTEgaWYgaXQgaXMgbm90CiAgICAgICogbmVlZGVkIChmb3IgZXhhbXBsZSB0YXJnZXRQa2cgYWxyZWFkeSBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIFVSSSkuCisgICAgICogSWYgeW91IGFscmVhZHkga25vdyB0aGUgdWlkIG9mIHRoZSB0YXJnZXQsIHlvdSBjYW4gc3VwcGx5IGl0IGluCisgICAgICogbGFzdFRhcmdldFVpZCBlbHNlIHNldCB0aGF0IHRvIC0xLgogICAgICAqLwogICAgIGludCBjaGVja0dyYW50VXJpUGVybWlzc2lvbkxvY2tlZChpbnQgY2FsbGluZ1VpZCwgU3RyaW5nIHRhcmdldFBrZywKLSAgICAgICAgICAgIFVyaSB1cmksIGludCBtb2RlRmxhZ3MpIHsKKyAgICAgICAgICAgIFVyaSB1cmksIGludCBtb2RlRmxhZ3MsIGludCBsYXN0VGFyZ2V0VWlkKSB7CiAgICAgICAgIG1vZGVGbGFncyAmPSAoSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgogICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pOwogICAgICAgICBpZiAobW9kZUZsYWdzID09IDApIHsKQEAgLTQ2OTgsOCArNDcwMCw4IEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgdGFyZ2V0VWlkOwotICAgICAgICBpZiAodGFyZ2V0UGtnICE9IG51bGwpIHsKKyAgICAgICAgaW50IHRhcmdldFVpZCA9IGxhc3RUYXJnZXRVaWQ7CisgICAgICAgIGlmICh0YXJnZXRVaWQgPCAwICYmIHRhcmdldFBrZyAhPSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHRhcmdldFVpZCA9IHBtLmdldFBhY2thZ2VVaWQodGFyZ2V0UGtnKTsKICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0VWlkIDwgMCkgewpAQCAtNDcxMCw4ICs0NzEyLDYgQEAKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRhcmdldFVpZCA9IC0xOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHRhcmdldFVpZCA+PSAwKSB7CkBAIC00NzgzLDcgKzQ3ODMsNyBAQAogICAgICAgICAgICAgVXJpIHVyaSwgaW50IG1vZGVGbGFncykgewogICAgICAgICBlbmZvcmNlTm90SXNvbGF0ZWRDYWxsZXIoImNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uIik7CiAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hlY2tHcmFudFVyaVBlcm1pc3Npb25Mb2NrZWQoY2FsbGluZ1VpZCwgdGFyZ2V0UGtnLCB1cmksIG1vZGVGbGFncyk7CisgICAgICAgICAgICByZXR1cm4gY2hlY2tHcmFudFVyaVBlcm1pc3Npb25Mb2NrZWQoY2FsbGluZ1VpZCwgdGFyZ2V0UGtnLCB1cmksIG1vZGVGbGFncywgLTEpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00ODMwLDEzICs0ODMwLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIGdyYW50VXJpUGVybWlzc2lvbkxvY2tlZChpbnQgY2FsbGluZ1VpZCwKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQa2csIFVyaSB1cmksIGludCBtb2RlRmxhZ3MsIFVyaVBlcm1pc3Npb25Pd25lciBvd25lcikgeworICAgIHZvaWQgZ3JhbnRVcmlQZXJtaXNzaW9uTG9ja2VkKGludCBjYWxsaW5nVWlkLCBTdHJpbmcgdGFyZ2V0UGtnLCBVcmkgdXJpLAorICAgICAgICAgICAgaW50IG1vZGVGbGFncywgVXJpUGVybWlzc2lvbk93bmVyIG93bmVyKSB7CiAgICAgICAgIGlmICh0YXJnZXRQa2cgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0YXJnZXRQa2ciKTsKICAgICAgICAgfQogCi0gICAgICAgIGludCB0YXJnZXRVaWQgPSBjaGVja0dyYW50VXJpUGVybWlzc2lvbkxvY2tlZChjYWxsaW5nVWlkLCB0YXJnZXRQa2csIHVyaSwgbW9kZUZsYWdzKTsKKyAgICAgICAgaW50IHRhcmdldFVpZCA9IGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uTG9ja2VkKGNhbGxpbmdVaWQsIHRhcmdldFBrZywgdXJpLCBtb2RlRmxhZ3MsIC0xKTsKICAgICAgICAgaWYgKHRhcmdldFVpZCA8IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNDg0NCwxMyArNDg0NCwyNiBAQAogICAgICAgICBncmFudFVyaVBlcm1pc3Npb25VbmNoZWNrZWRMb2NrZWQodGFyZ2V0VWlkLCB0YXJnZXRQa2csIHVyaSwgbW9kZUZsYWdzLCBvd25lcik7CiAgICAgfQogCisgICAgc3RhdGljIGNsYXNzIE5lZWRlZFVyaUdyYW50cyBleHRlbmRzIEFycmF5TGlzdDxVcmk+IHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldFBrZzsKKyAgICAgICAgZmluYWwgaW50IHRhcmdldFVpZDsKKyAgICAgICAgZmluYWwgaW50IGZsYWdzOworCisgICAgICAgIE5lZWRlZFVyaUdyYW50cyhTdHJpbmcgX3RhcmdldFBrZywgaW50IF90YXJnZXRVaWQsIGludCBfZmxhZ3MpIHsKKyAgICAgICAgICAgIHRhcmdldFBrZyA9IF90YXJnZXRQa2c7CisgICAgICAgICAgICB0YXJnZXRVaWQgPSBfdGFyZ2V0VWlkOworICAgICAgICAgICAgZmxhZ3MgPSBfZmxhZ3M7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBMaWtlIGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uTG9ja2VkLCBidXQgdGFrZXMgYW4gSW50ZW50LgogICAgICAqLwotICAgIGludCBjaGVja0dyYW50VXJpUGVybWlzc2lvbkZyb21JbnRlbnRMb2NrZWQoaW50IGNhbGxpbmdVaWQsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGtnLCBJbnRlbnQgaW50ZW50KSB7CisgICAgTmVlZGVkVXJpR3JhbnRzIGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uRnJvbUludGVudExvY2tlZChpbnQgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQa2csIEludGVudCBpbnRlbnQsIGludCBtb2RlLCBOZWVkZWRVcmlHcmFudHMgbmVlZGVkKSB7CiAgICAgICAgIGlmIChERUJVR19VUklfUEVSTUlTU0lPTikgU2xvZy52KFRBRywKLSAgICAgICAgICAgICAgICAiQ2hlY2tpbmcgVVJJIHBlcm0gdG8gIiArIChpbnRlbnQgIT0gbnVsbCA/IGludGVudC5nZXREYXRhKCkgOiBudWxsKQorICAgICAgICAgICAgICAgICJDaGVja2luZyBVUkkgcGVybSB0byBkYXRhPSIgKyAoaW50ZW50ICE9IG51bGwgPyBpbnRlbnQuZ2V0RGF0YSgpIDogbnVsbCkKKyAgICAgICAgICAgICAgICArICIgY2xpcD0iICsgKGludGVudCAhPSBudWxsID8gaW50ZW50LmdldENsaXBEYXRhKCkgOiBudWxsKQogICAgICAgICAgICAgICAgICsgIiBmcm9tICIgKyBpbnRlbnQgKyAiOyBmbGFncz0weCIKICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoaW50ZW50ICE9IG51bGwgPyBpbnRlbnQuZ2V0RmxhZ3MoKSA6IDApKTsKIApAQCAtNDg1OSwzMyArNDg3Miw3NCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICBVcmkgZGF0YSA9IGludGVudC5nZXREYXRhKCk7Ci0gICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgQ2xpcERhdGEgY2xpcCA9IGludGVudC5nZXRDbGlwRGF0YSgpOworICAgICAgICBpZiAoZGF0YSA9PSBudWxsICYmIGNsaXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uTG9ja2VkKGNhbGxpbmdVaWQsIHRhcmdldFBrZywgZGF0YSwKLSAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0RmxhZ3MoKSk7CisgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCB0YXJnZXQgPSBjaGVja0dyYW50VXJpUGVybWlzc2lvbkxvY2tlZChjYWxsaW5nVWlkLCB0YXJnZXRQa2csIGRhdGEsCisgICAgICAgICAgICAgICAgbW9kZSwgbmVlZGVkICE9IG51bGwgPyBuZWVkZWQudGFyZ2V0VWlkIDogLTEpOworICAgICAgICAgICAgaWYgKHRhcmdldCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobmVlZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmVlZGVkID0gbmV3IE5lZWRlZFVyaUdyYW50cyh0YXJnZXRQa2csIHRhcmdldCwgbW9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5lZWRlZC5hZGQoZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNsaXAuZ2V0SXRlbUNvdW50KCk7IGkrKykgeworICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBjbGlwLmdldEl0ZW1BdChpKS5nZXRVcmkoKTsKKyAgICAgICAgICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldCA9IC0xOworICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjaGVja0dyYW50VXJpUGVybWlzc2lvbkxvY2tlZChjYWxsaW5nVWlkLCB0YXJnZXRQa2csIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLCBuZWVkZWQgIT0gbnVsbCA/IG5lZWRlZC50YXJnZXRVaWQgOiAtMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgPSBuZXcgTmVlZGVkVXJpR3JhbnRzKHRhcmdldFBrZywgdGFyZ2V0LCBtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZC5hZGQodXJpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEludGVudCBjbGlwSW50ZW50ID0gY2xpcC5nZXRJdGVtQXQoaSkuZ2V0SW50ZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlwSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5lZWRlZFVyaUdyYW50cyBuZXdOZWVkZWQgPSBjaGVja0dyYW50VXJpUGVybWlzc2lvbkZyb21JbnRlbnRMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdVaWQsIHRhcmdldFBrZywgY2xpcEludGVudCwgbW9kZSwgbmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOZWVkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCA9IG5ld05lZWRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZWVkZWQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogTGlrZSBncmFudFVyaVBlcm1pc3Npb25VbmNoZWNrZWRMb2NrZWQsIGJ1dCB0YWtlcyBhbiBJbnRlbnQuCiAgICAgICovCi0gICAgdm9pZCBncmFudFVyaVBlcm1pc3Npb25VbmNoZWNrZWRGcm9tSW50ZW50TG9ja2VkKGludCB0YXJnZXRVaWQsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGtnLCBJbnRlbnQgaW50ZW50LCBVcmlQZXJtaXNzaW9uT3duZXIgb3duZXIpIHsKLSAgICAgICAgZ3JhbnRVcmlQZXJtaXNzaW9uVW5jaGVja2VkTG9ja2VkKHRhcmdldFVpZCwgdGFyZ2V0UGtnLCBpbnRlbnQuZ2V0RGF0YSgpLAotICAgICAgICAgICAgICAgIGludGVudC5nZXRGbGFncygpLCBvd25lcik7CisgICAgdm9pZCBncmFudFVyaVBlcm1pc3Npb25VbmNoZWNrZWRGcm9tSW50ZW50TG9ja2VkKE5lZWRlZFVyaUdyYW50cyBuZWVkZWQsCisgICAgICAgICAgICBVcmlQZXJtaXNzaW9uT3duZXIgb3duZXIpIHsKKyAgICAgICAgaWYgKG5lZWRlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bmVlZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZ3JhbnRVcmlQZXJtaXNzaW9uVW5jaGVja2VkTG9ja2VkKG5lZWRlZC50YXJnZXRVaWQsIG5lZWRlZC50YXJnZXRQa2csCisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQuZ2V0KGkpLCBuZWVkZWQuZmxhZ3MsIG93bmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHZvaWQgZ3JhbnRVcmlQZXJtaXNzaW9uRnJvbUludGVudExvY2tlZChpbnQgY2FsbGluZ1VpZCwKICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQa2csIEludGVudCBpbnRlbnQsIFVyaVBlcm1pc3Npb25Pd25lciBvd25lcikgewotICAgICAgICBpbnQgdGFyZ2V0VWlkID0gY2hlY2tHcmFudFVyaVBlcm1pc3Npb25Gcm9tSW50ZW50TG9ja2VkKGNhbGxpbmdVaWQsIHRhcmdldFBrZywgaW50ZW50KTsKLSAgICAgICAgaWYgKHRhcmdldFVpZCA8IDApIHsKKyAgICAgICAgTmVlZGVkVXJpR3JhbnRzIG5lZWRlZCA9IGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uRnJvbUludGVudExvY2tlZChjYWxsaW5nVWlkLCB0YXJnZXRQa2csCisgICAgICAgICAgICAgICAgaW50ZW50LCBpbnRlbnQuZ2V0RmxhZ3MoKSwgbnVsbCk7CisgICAgICAgIGlmIChuZWVkZWQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgZ3JhbnRVcmlQZXJtaXNzaW9uVW5jaGVja2VkRnJvbUludGVudExvY2tlZCh0YXJnZXRVaWQsIHRhcmdldFBrZywgaW50ZW50LCBvd25lcik7CisgICAgICAgIGdyYW50VXJpUGVybWlzc2lvblVuY2hlY2tlZEZyb21JbnRlbnRMb2NrZWQobmVlZGVkLCBvd25lcik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZ3JhbnRVcmlQZXJtaXNzaW9uKElBcHBsaWNhdGlvblRocmVhZCBjYWxsZXIsIFN0cmluZyB0YXJnZXRQa2csCkBAIC01NDA2LDcgKzU0NjAsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdG9wU2VydmljZUxvY2tlZChzcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc3IucGVuZGluZ1N0YXJ0cy5hZGQobmV3IFNlcnZpY2VSZWNvcmQuU3RhcnRJdGVtKHNyLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyLm1ha2VOZXh0U3RhcnRJZCgpLCBiYXNlSW50ZW50LCAtMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyLm1ha2VOZXh0U3RhcnRJZCgpLCBiYXNlSW50ZW50LCBudWxsKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzci5hcHAgIT0gbnVsbCAmJiBzci5hcHAudGhyZWFkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRTZXJ2aWNlQXJnc0xvY2tlZChzciwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05MDQ0LDcgKzkwOTgsNyBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzYi5zZXRMZW5ndGgoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgICBJbnRlbnQ6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50cy5nZXQoaSkudG9TaG9ydFN0cmluZyhzYiwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudHMuZ2V0KGkpLnRvU2hvcnRTdHJpbmcoc2IsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihzYi50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBpbnRlbnRzLmdldChpKS5nZXRFeHRyYXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewpAQCAtOTEyOSw3ICs5MTgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUmVjb3JkIGNvbm4gPSBjbGlzdC5nZXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAgICAgICIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KGNvbm4uYmluZGluZy5pbnRlbnQuaW50ZW50LmdldEludGVudCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TaG9ydFN0cmluZyhmYWxzZSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TaG9ydFN0cmluZyhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgLT4gIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1JlY29yZCBwcm9jID0gY29ubi5iaW5kaW5nLmNsaWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKHByb2MgIT0gbnVsbCA/IHByb2MudG9TaG9ydFN0cmluZygpIDogIm51bGwiKTsKQEAgLTkzODAsNyArOTQzNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlICsgYnJpZWYgPT0gZ2l2ZSBhIHN1bW1hcnkuICBJc24ndCB0aGF0IG9idmlvdXM/IT8KICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RUYXNrLmludGVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiICAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihsYXN0VGFzay5pbnRlbnQudG9JbnNlY3VyZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihsYXN0VGFzay5pbnRlbnQudG9JbnNlY3VyZVN0cmluZ1dpdGhDbGlwKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTA2OTIsOSArMTA3NDYsOSBAQAogICAgICAgICAgICAgICAgIHNpLmRlbGl2ZXJlZFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgICAgICByLmRlbGl2ZXJlZFN0YXJ0cy5hZGQoc2kpOwogICAgICAgICAgICAgICAgIHNpLmRlbGl2ZXJ5Q291bnQrKzsKLSAgICAgICAgICAgICAgICBpZiAoc2kudGFyZ2V0UGVybWlzc2lvblVpZCA+PSAwICYmIHNpLmludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyYW50VXJpUGVybWlzc2lvblVuY2hlY2tlZEZyb21JbnRlbnRMb2NrZWQoc2kudGFyZ2V0UGVybWlzc2lvblVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnBhY2thZ2VOYW1lLCBzaS5pbnRlbnQsIHNpLmdldFVyaVBlcm1pc3Npb25zTG9ja2VkKCkpOworICAgICAgICAgICAgICAgIGlmIChzaS5uZWVkZWRHcmFudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBncmFudFVyaVBlcm1pc3Npb25VbmNoZWNrZWRGcm9tSW50ZW50TG9ja2VkKHNpLm5lZWRlZEdyYW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaS5nZXRVcmlQZXJtaXNzaW9uc0xvY2tlZCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnVtcFNlcnZpY2VFeGVjdXRpbmdMb2NrZWQociwgInN0YXJ0Iik7CiAgICAgICAgICAgICAgICAgaWYgKCFvb21BZGp1c3RlZCkgewpAQCAtMTA3NzIsNyArMTA4MjYsNyBAQAogICAgICAgICBib29sZWFuIGNyZWF0ZWQgPSBmYWxzZTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1TdHJpbmdCdWlsZGVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgIHIuaW50ZW50LmdldEludGVudCgpLnRvU2hvcnRTdHJpbmcobVN0cmluZ0J1aWxkZXIsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgIHIuaW50ZW50LmdldEludGVudCgpLnRvU2hvcnRTdHJpbmcobVN0cmluZ0J1aWxkZXIsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEV2ZW50TG9nVGFncy5BTV9DUkVBVEVfU0VSVklDRSwKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmlkZW50aXR5SGFzaENvZGUociksIHIuc2hvcnROYW1lLAogICAgICAgICAgICAgICAgICAgICBtU3RyaW5nQnVpbGRlci50b1N0cmluZygpLCByLmFwcC5waWQpOwpAQCAtMTA3OTgsNyArMTA4NTIsNyBAQAogICAgICAgICAvLyBiZSBjYWxsZWQuCiAgICAgICAgIGlmIChyLnN0YXJ0UmVxdWVzdGVkICYmIHIuY2FsbFN0YXJ0ICYmIHIucGVuZGluZ1N0YXJ0cy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgci5wZW5kaW5nU3RhcnRzLmFkZChuZXcgU2VydmljZVJlY29yZC5TdGFydEl0ZW0ociwgZmFsc2UsIHIubWFrZU5leHRTdGFydElkKCksCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIC0xKSk7CisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpKTsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgc2VuZFNlcnZpY2VBcmdzTG9ja2VkKHIsIHRydWUpOwpAQCAtMTExNzAsMTUgKzExMjI0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlcy5wZXJtaXNzaW9uIDogInByaXZhdGUgdG8gcGFja2FnZSIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgU2VydmljZVJlY29yZCByID0gcmVzLnJlY29yZDsKLSAgICAgICAgICAgIGludCB0YXJnZXRQZXJtaXNzaW9uVWlkID0gY2hlY2tHcmFudFVyaVBlcm1pc3Npb25Gcm9tSW50ZW50TG9ja2VkKAotICAgICAgICAgICAgICAgICAgICBjYWxsaW5nVWlkLCByLnBhY2thZ2VOYW1lLCBzZXJ2aWNlKTsKKyAgICAgICAgICAgIE5lZWRlZFVyaUdyYW50cyBuZWVkZWRHcmFudHMgPSBjaGVja0dyYW50VXJpUGVybWlzc2lvbkZyb21JbnRlbnRMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdVaWQsIHIucGFja2FnZU5hbWUsIHNlcnZpY2UsIHNlcnZpY2UuZ2V0RmxhZ3MoKSwgbnVsbCk7CiAgICAgICAgICAgICBpZiAodW5zY2hlZHVsZVNlcnZpY2VSZXN0YXJ0TG9ja2VkKHIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKERFQlVHX1NFUlZJQ0UpIFNsb2cudihUQUcsICJTVEFSVCBTRVJWSUNFIFdISUxFIFJFU1RBUlQgUEVORElORzogIiArIHIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgci5zdGFydFJlcXVlc3RlZCA9IHRydWU7CiAgICAgICAgICAgICByLmNhbGxTdGFydCA9IGZhbHNlOwogICAgICAgICAgICAgci5wZW5kaW5nU3RhcnRzLmFkZChuZXcgU2VydmljZVJlY29yZC5TdGFydEl0ZW0ociwgZmFsc2UsIHIubWFrZU5leHRTdGFydElkKCksCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UsIHRhcmdldFBlcm1pc3Npb25VaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZSwgbmVlZGVkR3JhbnRzKSk7CiAgICAgICAgICAgICByLmxhc3RBY3Rpdml0eSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICAgICAgc3luY2hyb25pemVkIChyLnN0YXRzLmdldEJhdHRlcnlTdGF0cygpKSB7CiAgICAgICAgICAgICAgICAgci5zdGF0cy5zdGFydFJ1bm5pbmdMb2NrZWQoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5UmVjb3JkLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhCmluZGV4IGNkYWI2YzYuLmEzMzdiNDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5UmVjb3JkLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YQpAQCAtMTI3LDI2ICsxMjcsMjcgQEAKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhY2thZ2VOYW1lPSIpOyBwdy5wcmludChwYWNrYWdlTmFtZSk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBwcm9jZXNzTmFtZT0iKTsgcHcucHJpbnRsbihwcm9jZXNzTmFtZSk7CiAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJsYXVuY2hlZEZyb21VaWQ9Iik7IHB3LnByaW50KGxhdW5jaGVkRnJvbVVpZCk7Ci0gICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJ1c2VySWQ9Iik7IHB3LnByaW50KHVzZXJJZCk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQoIiBhcHA9Iik7IHB3LnByaW50bG4oYXBwKTsKLSAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnRsbihpbnRlbnQudG9JbnNlY3VyZVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiIHVzZXJJZD0iKTsgcHcucHJpbnRsbih1c2VySWQpOworICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiYXBwPSIpOyBwdy5wcmludGxuKGFwcCk7CisgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50bG4oaW50ZW50LnRvSW5zZWN1cmVTdHJpbmdXaXRoQ2xpcCgpKTsKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImZyb250T2ZUYXNrPSIpOyBwdy5wcmludChmcm9udE9mVGFzayk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiB0YXNrPSIpOyBwdy5wcmludGxuKHRhc2spOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgidGFza0FmZmluaXR5PSIpOyBwdy5wcmludGxuKHRhc2tBZmZpbml0eSk7CiAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJyZWFsQWN0aXZpdHk9Iik7CiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihyZWFsQWN0aXZpdHkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKSk7Ci0gICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJiYXNlPSIpOyBwdy5wcmludChiYXNlRGlyKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJlc0Rpci5lcXVhbHMoYmFzZURpcikpIHB3LnByaW50KCIgcmVzPSIpOyBwdy5wcmludChyZXNEaXIpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KCIgZGF0YT0iKTsgcHcucHJpbnRsbihkYXRhRGlyKTsKLSAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImxhYmVsUmVzPTB4Iik7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQoSW50ZWdlci50b0hleFN0cmluZyhsYWJlbFJlcykpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KCIgaWNvbj0weCIpOyBwdy5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKGljb24pKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludCgiIHRoZW1lPTB4Iik7IHB3LnByaW50bG4oSW50ZWdlci50b0hleFN0cmluZyh0aGVtZSkpOworICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiYmFzZURpcj0iKTsgcHcucHJpbnRsbihiYXNlRGlyKTsKKyAgICAgICAgaWYgKCFyZXNEaXIuZXF1YWxzKGJhc2VEaXIpKSB7CisgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgicmVzRGlyPSIpOyBwdy5wcmludGxuKHJlc0Rpcik7CisgICAgICAgIH0KKyAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImRhdGFEaXI9Iik7IHB3LnByaW50bG4oZGF0YURpcik7CiAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJzdGF0ZU5vdE5lZWRlZD0iKTsgcHcucHJpbnQoc3RhdGVOb3ROZWVkZWQpOwogICAgICAgICAgICAgICAgIHB3LnByaW50KCIgY29tcG9uZW50U3BlY2lmaWVkPSIpOyBwdy5wcmludChjb21wb25lbnRTcGVjaWZpZWQpOwogICAgICAgICAgICAgICAgIHB3LnByaW50KCIgaXNIb21lQWN0aXZpdHk9Iik7IHB3LnByaW50bG4oaXNIb21lQWN0aXZpdHkpOworICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiY29tcGF0PSIpOyBwdy5wcmludChjb21wYXQpOworICAgICAgICAgICAgICAgIHB3LnByaW50KCIgbGFiZWxSZXM9MHgiKTsgcHcucHJpbnQoSW50ZWdlci50b0hleFN0cmluZyhsYWJlbFJlcykpOworICAgICAgICAgICAgICAgIHB3LnByaW50KCIgaWNvbj0weCIpOyBwdy5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKGljb24pKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiIHRoZW1lPTB4Iik7IHB3LnByaW50bG4oSW50ZWdlci50b0hleFN0cmluZyh0aGVtZSkpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiY29uZmlnPSIpOyBwdy5wcmludGxuKGNvbmZpZ3VyYXRpb24pOwotICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiY29tcGF0PSIpOyBwdy5wcmludGxuKGNvbXBhdCk7CiAgICAgICAgIGlmIChyZXN1bHRUbyAhPSBudWxsIHx8IHJlc3VsdFdobyAhPSBudWxsKSB7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgicmVzdWx0VG89Iik7IHB3LnByaW50KHJlc3VsdFRvKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiByZXN1bHRXaG89Iik7IHB3LnByaW50KHJlc3VsdFdobyk7CkBAIC0xOTMsMTMgKzE5NCwxMSBAQAogICAgICAgICAgICAgICAgICAgICBUaW1lVXRpbHMuZm9ybWF0RHVyYXRpb24obGF1bmNoVGltZSwgcHcpOyBwdy5wcmludCgiIHN0YXJ0VGltZT0iKTsKICAgICAgICAgICAgICAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKHN0YXJ0VGltZSwgcHcpOyBwdy5wcmludGxuKCIiKTsKICAgICAgICAgfQotICAgICAgICBpZiAobGFzdFZpc2libGVUaW1lICE9IDApIHsKLSAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJsYXN0VmlzaWJsZVRpbWU9Iik7Ci0gICAgICAgICAgICAgICAgICAgIFRpbWVVdGlscy5mb3JtYXREdXJhdGlvbihsYXN0VmlzaWJsZVRpbWUsIHB3KTsgcHcucHJpbnRsbigiIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdhaXRpbmdWaXNpYmxlIHx8IG5vd1Zpc2libGUpIHsKKyAgICAgICAgaWYgKGxhc3RWaXNpYmxlVGltZSAhPSAwIHx8IHdhaXRpbmdWaXNpYmxlIHx8IG5vd1Zpc2libGUpIHsKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJ3YWl0aW5nVmlzaWJsZT0iKTsgcHcucHJpbnQod2FpdGluZ1Zpc2libGUpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG5vd1Zpc2libGU9Iik7IHB3LnByaW50bG4obm93VmlzaWJsZSk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgbm93VmlzaWJsZT0iKTsgcHcucHJpbnQobm93VmlzaWJsZSk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCJsYXN0VmlzaWJsZVRpbWU9Iik7CisgICAgICAgICAgICAgICAgICAgIFRpbWVVdGlscy5mb3JtYXREdXJhdGlvbihsYXN0VmlzaWJsZVRpbWUsIHB3KTsgcHcucHJpbnRsbigiIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNvbmZpZ0Rlc3Ryb3kgfHwgY29uZmlnQ2hhbmdlRmxhZ3MgIT0gMCkgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImNvbmZpZ0Rlc3Ryb3k9Iik7IHB3LnByaW50KGNvbmZpZ0Rlc3Ryb3kpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjay5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjay5qYXZhCmluZGV4IGY5NjQxZWIuLmE0ZTU3M2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2suamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrLmphdmEKQEAgLTE4MjEsNiArMTgyMSwxMCBAQAogICAgICAgICAgICAgaWYgKGJlbG93ICE9IG51bGwgJiYgYmVsb3cuZmluaXNoaW5nKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBEb24ndCBjaGVjayBhbnkgbG93ZXIgaW4gdGhlIHN0YWNrIGlmIHdlJ3JlIGNyb3NzaW5nIGEgdXNlciBib3VuZGFyeS4KKyAgICAgICAgICAgIGlmIChiZWxvdyAhPSBudWxsICYmIGJlbG93LnVzZXJJZCAhPSB0YXNrVG9wLnVzZXJJZCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gYmVsb3c7CiAgICAgICAgICAgICAgICAgdGFyZ2V0SSA9IGk7CkBAIC0yMjkwLDggKzIyOTQsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciA9PSBTVEFSVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBTbG9nLmkoVEFHLCAiU1RBUlQgeyIgKyBpbnRlbnQudG9TaG9ydFN0cmluZyh0cnVlLCB0cnVlLCB0cnVlKSArICJ9IGZyb20gcGlkICIKLSAgICAgICAgICAgICAgICAgICAgKyAoY2FsbGVyQXBwICE9IG51bGwgPyBjYWxsZXJBcHAucGlkIDogY2FsbGluZ1BpZCkpOworICAgICAgICAgICAgU2xvZy5pKFRBRywgIlNUQVJUIHsiICsgaW50ZW50LnRvU2hvcnRTdHJpbmcodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICsgIn0gZnJvbSBwaWQgIiArIChjYWxsZXJBcHAgIT0gbnVsbCA/IGNhbGxlckFwcC5waWQgOiBjYWxsaW5nUGlkKSk7CiAgICAgICAgIH0KIAogICAgICAgICBBY3Rpdml0eVJlY29yZCBzb3VyY2VSZWNvcmQgPSBudWxsOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vSW50ZW50QmluZFJlY29yZC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vSW50ZW50QmluZFJlY29yZC5qYXZhCmluZGV4IDI2MThjNzcuLmM5NGY3MTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0ludGVudEJpbmRSZWNvcmQuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9JbnRlbnRCaW5kUmVjb3JkLmphdmEKQEAgLTU0LDcgKzU0LDcgQEAKIAogICAgIHZvaWQgZHVtcEluU2VydmljZShQcmludFdyaXRlciBwdywgU3RyaW5nIHByZWZpeCkgewogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiaW50ZW50PXsiKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludChpbnRlbnQuZ2V0SW50ZW50KCkudG9TaG9ydFN0cmluZyhmYWxzZSwgdHJ1ZSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludChpbnRlbnQuZ2V0SW50ZW50KCkudG9TaG9ydFN0cmluZyhmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKSk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbignfScpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiYmluZGVyPSIpOyBwdy5wcmludGxuKGJpbmRlcik7CiAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJyZXF1ZXN0ZWQ9Iik7IHB3LnByaW50KHJlcXVlc3RlZCk7CkBAIC04OSw3ICs4OSw3IEBACiAgICAgICAgIHNiLmFwcGVuZChzZXJ2aWNlLnNob3J0TmFtZSk7CiAgICAgICAgIHNiLmFwcGVuZCgnOicpOwogICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5nZXRJbnRlbnQoKS50b1Nob3J0U3RyaW5nKHNiLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGludGVudC5nZXRJbnRlbnQoKS50b1Nob3J0U3RyaW5nKHNiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgc2IuYXBwZW5kKCd9Jyk7CiAgICAgICAgIHJldHVybiBzdHJpbmdOYW1lID0gc2IudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1BlbmRpbmdJbnRlbnRSZWNvcmQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1BlbmRpbmdJbnRlbnRSZWNvcmQuamF2YQppbmRleCAzYjZhOTdjLi4wMDQzODc0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9QZW5kaW5nSW50ZW50UmVjb3JkLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vUGVuZGluZ0ludGVudFJlY29yZC5qYXZhCkBAIC0xNTIsNyArMTUyLDcgQEAKICAgICAgICAgICAgIHJldHVybiAiS2V5eyIgKyB0eXBlTmFtZSgpICsgIiBwa2c9IiArIHBhY2thZ2VOYW1lCiAgICAgICAgICAgICAgICAgKyAiIGludGVudD0iCiAgICAgICAgICAgICAgICAgKyAocmVxdWVzdEludGVudCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA/IHJlcXVlc3RJbnRlbnQudG9TaG9ydFN0cmluZyhmYWxzZSwgdHJ1ZSwgZmFsc2UpIDogIjxudWxsPiIpCisgICAgICAgICAgICAgICAgICAgICAgICA/IHJlcXVlc3RJbnRlbnQudG9TaG9ydFN0cmluZyhmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKSA6ICI8bnVsbD4iKQogICAgICAgICAgICAgICAgICsgIiBmbGFncz0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGZsYWdzKSArICJ9IjsKICAgICAgICAgfQogICAgICAgICAKQEAgLTMyMCw3ICszMjAsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChrZXkucmVxdWVzdEludGVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgicmVxdWVzdEludGVudD0iKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihrZXkucmVxdWVzdEludGVudC50b1Nob3J0U3RyaW5nKGZhbHNlLCB0cnVlLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oa2V5LnJlcXVlc3RJbnRlbnQudG9TaG9ydFN0cmluZyhmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChzZW50IHx8IGNhbmNlbGVkKSB7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgic2VudD0iKTsgcHcucHJpbnQoc2VudCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9TZXJ2aWNlUmVjb3JkLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9TZXJ2aWNlUmVjb3JkLmphdmEKaW5kZXggZGFhMzY1My4uODI4ZWVmNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vU2VydmljZVJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1NlcnZpY2VSZWNvcmQuamF2YQpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICAgIGZpbmFsIGJvb2xlYW4gdGFza1JlbW92ZWQ7CiAgICAgICAgIGZpbmFsIGludCBpZDsKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudDsKLSAgICAgICAgZmluYWwgaW50IHRhcmdldFBlcm1pc3Npb25VaWQ7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UuTmVlZGVkVXJpR3JhbnRzIG5lZWRlZEdyYW50czsKICAgICAgICAgbG9uZyBkZWxpdmVyZWRUaW1lOwogICAgICAgICBpbnQgZGVsaXZlcnlDb3VudDsKICAgICAgICAgaW50IGRvbmVFeGVjdXRpbmdDb3VudDsKQEAgLTExNSwxMiArMTE1LDEyIEBACiAgICAgICAgIFN0cmluZyBzdHJpbmdOYW1lOyAgICAgIC8vIGNhY2hpbmcgb2YgdG9TdHJpbmcKIAogICAgICAgICBTdGFydEl0ZW0oU2VydmljZVJlY29yZCBfc3IsIGJvb2xlYW4gX3Rhc2tSZW1vdmVkLCBpbnQgX2lkLCBJbnRlbnQgX2ludGVudCwKLSAgICAgICAgICAgICAgICBpbnQgX3RhcmdldFBlcm1pc3Npb25VaWQpIHsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLk5lZWRlZFVyaUdyYW50cyBfbmVlZGVkR3JhbnRzKSB7CiAgICAgICAgICAgICBzciA9IF9zcjsKICAgICAgICAgICAgIHRhc2tSZW1vdmVkID0gX3Rhc2tSZW1vdmVkOwogICAgICAgICAgICAgaWQgPSBfaWQ7CiAgICAgICAgICAgICBpbnRlbnQgPSBfaW50ZW50OwotICAgICAgICAgICAgdGFyZ2V0UGVybWlzc2lvblVpZCA9IF90YXJnZXRQZXJtaXNzaW9uVWlkOworICAgICAgICAgICAgbmVlZGVkR3JhbnRzID0gX25lZWRlZEdyYW50czsKICAgICAgICAgfQogCiAgICAgICAgIFVyaVBlcm1pc3Npb25Pd25lciBnZXRVcmlQZXJtaXNzaW9uc0xvY2tlZCgpIHsKQEAgLTE3Nyw5ICsxNzcsOSBAQAogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIiAgaW50ZW50PSIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc2kuaW50ZW50ICE9IG51bGwpIHB3LnByaW50bG4oc2kuaW50ZW50LnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICBlbHNlIHB3LnByaW50bG4oIm51bGwiKTsKLSAgICAgICAgICAgIGlmIChzaS50YXJnZXRQZXJtaXNzaW9uVWlkID49IDApIHsKLSAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiICB0YXJnZXRQZXJtaXNzaW9uVWlkPSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihzaS50YXJnZXRQZXJtaXNzaW9uVWlkKTsKKyAgICAgICAgICAgIGlmIChzaS5uZWVkZWRHcmFudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCIgIG5lZWRlZEdyYW50cz0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oc2kubmVlZGVkR3JhbnRzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzaS51cmlQZXJtaXNzaW9ucyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNpLnVyaVBlcm1pc3Npb25zLnJlYWRVcmlQZXJtaXNzaW9ucyAhPSBudWxsKSB7CkBAIC0xOTYsNyArMTk2LDcgQEAKICAgICAKICAgICB2b2lkIGR1bXAoUHJpbnRXcml0ZXIgcHcsIFN0cmluZyBwcmVmaXgpIHsKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImludGVudD17Iik7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQoaW50ZW50LmdldEludGVudCgpLnRvU2hvcnRTdHJpbmcoZmFsc2UsIHRydWUsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoaW50ZW50LmdldEludGVudCgpLnRvU2hvcnRTdHJpbmcoZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKSk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbignfScpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgicGFja2FnZU5hbWU9Iik7IHB3LnByaW50bG4ocGFja2FnZU5hbWUpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgicHJvY2Vzc05hbWU9Iik7IHB3LnByaW50bG4ocHJvY2Vzc05hbWUpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVGFza1JlY29yZC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVGFza1JlY29yZC5qYXZhCmluZGV4IDQ3ZWMyMTguLjY3ODczY2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Rhc2tSZWNvcmQuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9UYXNrUmVjb3JkLmphdmEKQEAgLTExMSwxNCArMTExLDE0IEBACiAgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CiAgICAgICAgICAgICBzYi5hcHBlbmQocHJlZml4KTsgc2IuYXBwZW5kKCJpbnRlbnQ9eyIpOwotICAgICAgICAgICAgaW50ZW50LnRvU2hvcnRTdHJpbmcoc2IsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICBpbnRlbnQudG9TaG9ydFN0cmluZyhzYiwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgIHNiLmFwcGVuZCgnfScpOwogICAgICAgICAgICAgcHcucHJpbnRsbihzYi50b1N0cmluZygpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYWZmaW5pdHlJbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CiAgICAgICAgICAgICBzYi5hcHBlbmQocHJlZml4KTsgc2IuYXBwZW5kKCJhZmZpbml0eUludGVudD17Iik7Ci0gICAgICAgICAgICBhZmZpbml0eUludGVudC50b1Nob3J0U3RyaW5nKHNiLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgYWZmaW5pdHlJbnRlbnQudG9TaG9ydFN0cmluZyhzYiwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgIHNiLmFwcGVuZCgnfScpOwogICAgICAgICAgICAgcHcucHJpbnRsbihzYi50b1N0cmluZygpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggOGEzMzRlMy4uMThiNTFhNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC02MzQ3LDYgKzYzNDcsOCBAQAogICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaW5kb3dNYXApIHsKICAgICAgICAgICAgIG1JbnB1dE1vbml0b3Iuc2V0RXZlbnREaXNwYXRjaGluZ0x3KGVuYWJsZWQpOwogICAgICAgICB9CisKKyAgICAgICAgc2VuZFNjcmVlblN0YXR1c1RvQ2xpZW50cygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjU3MCw2ICs2NTcyLDIwIEBACiAgICAgICAgIG1Qb2xpY3kuc3lzdGVtUmVhZHkoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgc2VuZFNjcmVlblN0YXR1c1RvQ2xpZW50cygpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PFdpbmRvd1N0YXRlPiB3aW5kb3dzID0gbVdpbmRvd3M7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHdpbmRvd3Muc2l6ZSgpOworICAgICAgICBib29sZWFuIG9uID0gbVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCk7CisgICAgICAgIGZvciAoaW50IGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBXaW5kb3dTdGF0ZSB3aW4gPSBtV2luZG93cy5nZXQoaSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdpbi5tQ2xpZW50LmRpc3BhdGNoU2NyZWVuU3RhdGUob24pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmVkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBUaGlzIGlzIGFuIGFuaW1hdGlvbiB0aGF0IGRvZXMgbm90aGluZzogaXQganVzdCBpbW1lZGlhdGVseSBmaW5pc2hlcwogICAgIC8vIGl0c2VsZiBldmVyeSB0aW1lIGl0IGlzIGNhbGxlZC4gIEl0IGlzIHVzZWQgYXMgYSBzdHViIGFuaW1hdGlvbiBpbiBjYXNlcwogICAgIC8vIHdoZXJlIHdlIHdhbnQgdG8gc3luY2hyb25pemUgbXVsdGlwbGUgdGhpbmdzIHRoYXQgbWF5IGJlIGFuaW1hdGluZy4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFlNDI2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgRXZlbnRUaHJlYWQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBMYXllci5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIExheWVyQmFzZS5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTGF5ZXJEaW0uY3BwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBMYXllclNjcmVlbnNob3QuY3BwICAgICAgICAgICAgICAgICAgICAgXAotICAgIERkbUNvbm5lY3Rpb24uY3BwICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAgICAgIFwKLSAgICBEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlQmFzZS5jcHAgXAotICAgIERpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmNwcCAgICAgICAgICBcCi0gICAgRGlzcGxheUhhcmR3YXJlL1ZTeW5jQmFycmllci5jcHAgICAgICAgIFwKLSAgICBEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmNwcCAgICAgICAgICAgICAgXAotICAgIEdMRXh0ZW5zaW9ucy5jcHAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWVzc2FnZVF1ZXVlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTdXJmYWNlRmxpbmdlci5jcHAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFN1cmZhY2VUZXh0dXJlTGF5ZXIuY3BwICAgICAgICAgICAgICAgICBcCi0gICAgVHJhbnNmb3JtLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAKLQotTE9DQUxfQ0ZMQUdTOj0gLURMT0dfVEFHPVwiU3VyZmFjZUZsaW5nZXJcIgotTE9DQUxfQ0ZMQUdTICs9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotCi1pZmVxICgkKFRBUkdFVF9IQVNfV0FJVEZPUlZTWU5DKSwgdHJ1ZSkKLQlMT0NBTF9DRkxBR1MgKz0gLURIQVNfV0FJVEZPUlZTWU5DCi1lbmRpZgotCi1pZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksIG9tYXAzKQotCUxPQ0FMX0NGTEFHUyArPSAtRE5PX1JHQlhfODg4OAotZW5kaWYKLWlmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSwgb21hcDQpCi0JTE9DQUxfQ0ZMQUdTICs9IC1ESEFTX0NPTlRFWFRfUFJJT1JJVFkKLQlMT0NBTF9DRkxBR1MgKz0gLURVU0VfVFJJUExFX0JVRkZFUklORwotZW5kaWYKLWlmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSwgczVwYzExMCkKLQlMT0NBTF9DRkxBR1MgKz0gLURIQVNfQ09OVEVYVF9QUklPUklUWSAtRE5FVkVSX0RFRkFVTFRfVE9fQVNZTkNfTU9ERQotZW5kaWYKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLQlsaWJoYXJkd2FyZSBcCi0JbGlidXRpbHMgXAotCWxpYkVHTCBcCi0JbGliR0xFU3YxX0NNIFwKLQlsaWJiaW5kZXIgXAotCWxpYnVpIFwKLQlsaWJndWkKLQotIyB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBERE1TIGRlYnVnZ2luZwotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkdm0gbGliYW5kcm9pZF9ydW50aW1lCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnN1cmZhY2VmbGluZ2VyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0JhcnJpZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0JhcnJpZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4NTA3ZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9CYXJyaWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0JBUlJJRVJfSAotI2RlZmluZSBBTkRST0lEX0JBUlJJRVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEJhcnJpZXIKLXsKLXB1YmxpYzoKLSAgICBpbmxpbmUgQmFycmllcigpIDogc3RhdGUoQ0xPU0VEKSB7IH0KLSAgICBpbmxpbmUgfkJhcnJpZXIoKSB7IH0KLSAgICB2b2lkIG9wZW4oKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChsb2NrKTsKLSAgICAgICAgc3RhdGUgPSBPUEVORUQ7Ci0gICAgICAgIGN2LmJyb2FkY2FzdCgpOwotICAgIH0KLSAgICB2b2lkIGNsb3NlKCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7Ci0gICAgICAgIHN0YXRlID0gQ0xPU0VEOwotICAgIH0KLSAgICB2b2lkIHdhaXQoKSBjb25zdCB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChsb2NrKTsKLSAgICAgICAgd2hpbGUgKHN0YXRlID09IENMT1NFRCkgewotICAgICAgICAgICAgY3Yud2FpdChsb2NrKTsKLSAgICAgICAgfQotICAgIH0KLXByaXZhdGU6Ci0gICAgZW51bSB7IE9QRU5FRCwgQ0xPU0VEIH07Ci0gICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgbG9jazsKLSAgICBtdXRhYmxlICAgICBDb25kaXRpb24gICBjdjsKLSAgICB2b2xhdGlsZSAgICBpbnQgICAgICAgICBzdGF0ZTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0JBUlJJRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGRtQ29ubmVjdGlvbi5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EZG1Db25uZWN0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY3YTkxNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EZG1Db25uZWN0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+Ci0KLSNpbmNsdWRlICJqbmkuaCIKLSNpbmNsdWRlICJEZG1Db25uZWN0aW9uLmgiCi0KLWV4dGVybiAiQyIgamludCBKYXZhX2NvbV9hbmRyb2lkX2ludGVybmFsX3V0aWxfV2l0aEZyYW1ld29ya19yZWdpc3Rlck5hdGl2ZXMoCi0gICAgICAgIEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXZvaWQgRGRtQ29ubmVjdGlvbjo6c3RhcnQoY29uc3QgY2hhciogbmFtZSkgewotICAgIEphdmFWTSogdm07Ci0gICAgSk5JRW52KiBlbnY7Ci0KLSAgICAvLyBzdGFydCBhIFZNCi0gICAgSmF2YVZNSW5pdEFyZ3MgYXJnczsKLSAgICBKYXZhVk1PcHRpb24gb3B0OwotCi0gICAgb3B0Lm9wdGlvblN0cmluZyA9Ci0gICAgICAgICItYWdlbnRsaWI6amR3cD10cmFuc3BvcnQ9ZHRfYW5kcm9pZF9hZGIsc3VzcGVuZD1uLHNlcnZlcj15IjsKLQotICAgIGFyZ3MudmVyc2lvbiA9IEpOSV9WRVJTSU9OXzFfNDsKLSAgICBhcmdzLm9wdGlvbnMgPSAmb3B0OwotICAgIGFyZ3Mubk9wdGlvbnMgPSAxOwotICAgIGFyZ3MuaWdub3JlVW5yZWNvZ25pemVkID0gSk5JX0ZBTFNFOwotCi0gICAgaWYgKEpOSV9DcmVhdGVKYXZhVk0oJnZtLCAmZW52LCAmYXJncykgPT0gMCkgewotICAgICAgICBqY2xhc3Mgc3RhcnRDbGFzczsKLSAgICAgICAgam1ldGhvZElEIHN0YXJ0TWV0aDsKLQotICAgICAgICAvLyByZWdpc3RlciBuYXRpdmUgY29kZQotICAgICAgICBpZiAoSmF2YV9jb21fYW5kcm9pZF9pbnRlcm5hbF91dGlsX1dpdGhGcmFtZXdvcmtfcmVnaXN0ZXJOYXRpdmVzKGVudiwgMCkgPT0gMCkgewotICAgICAgICAgICAgLy8gc2V0IG91ciBuYW1lIGJ5IGNhbGxpbmcgRGRtSGFuZGxlQXBwTmFtZS5zZXRBcHBOYW1lKCkKLSAgICAgICAgICAgIHN0YXJ0Q2xhc3MgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kZG0vRGRtSGFuZGxlQXBwTmFtZSIpOwotICAgICAgICAgICAgaWYgKHN0YXJ0Q2xhc3MpIHsKLSAgICAgICAgICAgICAgICBzdGFydE1ldGggPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKHN0YXJ0Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAic2V0QXBwTmFtZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRNZXRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgc3RyID0gZW52LT5OZXdTdHJpbmdVVEYobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVudi0+Q2FsbFN0YXRpY1ZvaWRNZXRob2Qoc3RhcnRDbGFzcywgc3RhcnRNZXRoLCBzdHIpOwotICAgICAgICAgICAgICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKHN0cik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpbml0aWFsaXplIERETVMgY29tbXVuaWNhdGlvbiBieSBjYWxsaW5nCi0gICAgICAgICAgICAvLyBEZG1SZWdpc3Rlci5yZWdpc3RlckhhbmRsZXJzKCkKLSAgICAgICAgICAgIHN0YXJ0Q2xhc3MgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kZG0vRGRtUmVnaXN0ZXIiKTsKLSAgICAgICAgICAgIGlmIChzdGFydENsYXNzKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRNZXRoID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChzdGFydENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVySGFuZGxlcnMiLCAiKClWIik7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0TWV0aCkgewotICAgICAgICAgICAgICAgICAgICBlbnYtPkNhbGxTdGF0aWNWb2lkTWV0aG9kKHN0YXJ0Q2xhc3MsIHN0YXJ0TWV0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGRtQ29ubmVjdGlvbi5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGRtQ29ubmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWI3MzdjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0RkbUNvbm5lY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU0ZfRERNX0NPTk5FQ1RJT04KLSNkZWZpbmUgQU5EUk9JRF9TRl9ERE1fQ09OTkVDVElPTgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERkbUNvbm5lY3Rpb24gewotcHVibGljOgotICAgIHN0YXRpYyB2b2lkIHN0YXJ0KGNvbnN0IGNoYXIqIG5hbWUpOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8qIEFORFJPSURfU0ZfRERNX0NPTk5FQ1RJT04gKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlFdmVudENvbm5lY3Rpb24uY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZWNiZDIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Z3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8Z3VpL0JpdFR1YmUuaD4KLSNpbmNsdWRlIDxndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKLSNpbmNsdWRlICJEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiRXZlbnRUaHJlYWQuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURpc3BsYXlFdmVudENvbm5lY3Rpb246OkRpc3BsYXlFdmVudENvbm5lY3Rpb24oCi0gICAgICAgIGNvbnN0IHNwPEV2ZW50VGhyZWFkPiYgZXZlbnRUaHJlYWQpCi0gICAgOiBtRXZlbnRUaHJlYWQoZXZlbnRUaHJlYWQpLCBtQ2hhbm5lbChuZXcgQml0VHViZSgpKQotewotfQotCi1EaXNwbGF5RXZlbnRDb25uZWN0aW9uOjp+RGlzcGxheUV2ZW50Q29ubmVjdGlvbigpIHsKLSAgICBtRXZlbnRUaHJlYWQtPnVucmVnaXN0ZXJEaXNwbGF5RXZlbnRDb25uZWN0aW9uKHRoaXMpOwotfQotCi12b2lkIERpc3BsYXlFdmVudENvbm5lY3Rpb246Om9uRmlyc3RSZWYoKSB7Ci0gICAgLy8gTk9URTogbUV2ZW50VGhyZWFkIGRvZXNuJ3QgaG9sZCBhIHN0cm9uZyByZWZlcmVuY2Ugb24gdXMKLSAgICBtRXZlbnRUaHJlYWQtPnJlZ2lzdGVyRGlzcGxheUV2ZW50Q29ubmVjdGlvbih0aGlzKTsKLX0KLQotc3A8Qml0VHViZT4gRGlzcGxheUV2ZW50Q29ubmVjdGlvbjo6Z2V0RGF0YUNoYW5uZWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1DaGFubmVsOwotfQotCi12b2lkIERpc3BsYXlFdmVudENvbm5lY3Rpb246OnNldFZzeW5jUmF0ZSh1aW50MzJfdCBjb3VudCkgewotICAgIG1FdmVudFRocmVhZC0+c2V0VnN5bmNSYXRlKGNvdW50LCB0aGlzKTsKLX0KLQotdm9pZCBEaXNwbGF5RXZlbnRDb25uZWN0aW9uOjpyZXF1ZXN0TmV4dFZzeW5jKCkgewotICAgIG1FdmVudFRocmVhZC0+cmVxdWVzdE5leHRWc3luYyh0aGlzKTsKLX0KLQotc3RhdHVzX3QgRGlzcGxheUV2ZW50Q29ubmVjdGlvbjo6cG9zdEV2ZW50KGNvbnN0IERpc3BsYXlFdmVudFJlY2VpdmVyOjpFdmVudCYgZXZlbnQpCi17Ci0gICAgc3NpemVfdCBzaXplID0gbUNoYW5uZWwtPndyaXRlKCZldmVudCwgc2l6ZW9mKERpc3BsYXlFdmVudFJlY2VpdmVyOjpFdmVudCkpOwotICAgIHJldHVybiBzaXplIDwgMCA/IHN0YXR1c190KHNpemUpIDogc3RhdHVzX3QoTk9fRVJST1IpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlFdmVudENvbm5lY3Rpb24uaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlFdmVudENvbm5lY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzZWUzNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5RXZlbnRDb25uZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NVUkZBQ0VfRkxJTkdFUl9ESVNQTEFZX0VWRU5UX0NPTk5FQ1RJT05fSAotI2RlZmluZSBBTkRST0lEX1NVUkZBQ0VfRkxJTkdFUl9ESVNQTEFZX0VWRU5UX0NPTk5FQ1RJT05fSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxndWkvSURpc3BsYXlFdmVudENvbm5lY3Rpb24uaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPGd1aS9EaXNwbGF5RXZlbnRSZWNlaXZlci5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQml0VHViZTsKLWNsYXNzIEV2ZW50VGhyZWFkOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgRGlzcGxheUV2ZW50Q29ubmVjdGlvbiA6IHB1YmxpYyBCbkRpc3BsYXlFdmVudENvbm5lY3Rpb24gewotcHVibGljOgotICAgIERpc3BsYXlFdmVudENvbm5lY3Rpb24oY29uc3Qgc3A8RXZlbnRUaHJlYWQ+JiBmbGluZ2VyKTsKLQotICAgIHN0YXR1c190IHBvc3RFdmVudChjb25zdCBEaXNwbGF5RXZlbnRSZWNlaXZlcjo6RXZlbnQmIGV2ZW50KTsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIH5EaXNwbGF5RXZlbnRDb25uZWN0aW9uKCk7Ci0gICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKLSAgICB2aXJ0dWFsIHNwPEJpdFR1YmU+IGdldERhdGFDaGFubmVsKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldFZzeW5jUmF0ZSh1aW50MzJfdCBjb3VudCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlcXVlc3ROZXh0VnN5bmMoKTsgICAgLy8gYXN5bmNocm9ub3VzCi0KLSAgICBzcDxFdmVudFRocmVhZD4gY29uc3QgbUV2ZW50VGhyZWFkOwotICAgIHNwPEJpdFR1YmU+IGNvbnN0IG1DaGFubmVsOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLyogQU5EUk9JRF9TVVJGQUNFX0ZMSU5HRVJfRElTUExBWV9FVkVOVF9DT05ORUNUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYWFlODAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLQotI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLQotI2luY2x1ZGUgIkdMRXh0ZW5zaW9ucy5oIgotI2luY2x1ZGUgIkhXQ29tcG9zZXIuaCIKLSNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQotdm9pZCBjaGVja0dMRXJyb3JzKCkKLXsKLSAgICBkbyB7Ci0gICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgZXJyb3IgZmxhZwotICAgICAgICBHTGVudW0gZXJyb3IgPSBnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChlcnJvciA9PSBHTF9OT19FUlJPUikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBBTE9HRSgiR0wgZXJyb3IgMHglMDR4IiwgaW50KGVycm9yKSk7Ci0gICAgfSB3aGlsZSh0cnVlKTsKLX0KLQotc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKLXZvaWQgY2hlY2tFR0xFcnJvcnMoY29uc3QgY2hhciogdG9rZW4pCi17Ci0gICAgc3RydWN0IEVHTFV0aWxzIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnN0cmVycm9yKEVHTGludCBlcnIpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZXJyKXsKLSAgICAgICAgICAgICAgICBjYXNlIEVHTF9TVUNDRVNTOiAgICAgICAgICAgcmV0dXJuICJFR0xfU1VDQ0VTUyI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFR0xfTk9UX0lOSVRJQUxJWkVEOiAgIHJldHVybiAiRUdMX05PVF9JTklUSUFMSVpFRCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFR0xfQkFEX0FDQ0VTUzogICAgICAgIHJldHVybiAiRUdMX0JBRF9BQ0NFU1MiOwotICAgICAgICAgICAgICAgIGNhc2UgRUdMX0JBRF9BTExPQzogICAgICAgICByZXR1cm4gIkVHTF9CQURfQUxMT0MiOwotICAgICAgICAgICAgICAgIGNhc2UgRUdMX0JBRF9BVFRSSUJVVEU6ICAgICByZXR1cm4gIkVHTF9CQURfQVRUUklCVVRFIjsKLSAgICAgICAgICAgICAgICBjYXNlIEVHTF9CQURfQ09ORklHOiAgICAgICAgcmV0dXJuICJFR0xfQkFEX0NPTkZJRyI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFR0xfQkFEX0NPTlRFWFQ6ICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05URVhUIjsKLSAgICAgICAgICAgICAgICBjYXNlIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFOiByZXR1cm4gIkVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFIjsKLSAgICAgICAgICAgICAgICBjYXNlIEVHTF9CQURfRElTUExBWTogICAgICAgcmV0dXJuICJFR0xfQkFEX0RJU1BMQVkiOwotICAgICAgICAgICAgICAgIGNhc2UgRUdMX0JBRF9NQVRDSDogICAgICAgICByZXR1cm4gIkVHTF9CQURfTUFUQ0giOwotICAgICAgICAgICAgICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfUElYTUFQOiByZXR1cm4gIkVHTF9CQURfTkFUSVZFX1BJWE1BUCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFR0xfQkFEX05BVElWRV9XSU5ET1c6IHJldHVybiAiRUdMX0JBRF9OQVRJVkVfV0lORE9XIjsKLSAgICAgICAgICAgICAgICBjYXNlIEVHTF9CQURfUEFSQU1FVEVSOiAgICAgcmV0dXJuICJFR0xfQkFEX1BBUkFNRVRFUiI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFR0xfQkFEX1NVUkZBQ0U6ICAgICAgIHJldHVybiAiRUdMX0JBRF9TVVJGQUNFIjsKLSAgICAgICAgICAgICAgICBjYXNlIEVHTF9DT05URVhUX0xPU1Q6ICAgICAgcmV0dXJuICJFR0xfQ09OVEVYVF9MT1NUIjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV04iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7Ci0gICAgaWYgKGVycm9yICYmIGVycm9yICE9IEVHTF9TVUNDRVNTKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRUdMIGVycm9yIDB4JTA0eCAoJXMpIiwKLSAgICAgICAgICAgICAgICB0b2tlbiwgaW50KGVycm9yKSwgRUdMVXRpbHM6OnN0cmVycm9yKGVycm9yKSk7Ci0gICAgfQotfQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgZGlzcGxheSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KLSAqCi0gKi8KLQotRGlzcGxheUhhcmR3YXJlOjpEaXNwbGF5SGFyZHdhcmUoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlciwKLSAgICAgICAgdWludDMyX3QgZHB5KQotICAgIDogRGlzcGxheUhhcmR3YXJlQmFzZShmbGluZ2VyLCBkcHkpLAotICAgICAgbUZsaW5nZXIoZmxpbmdlciksIG1GbGFncygwKSwgbUh3YygwKQotewotICAgIGluaXQoZHB5KTsKLX0KLQotRGlzcGxheUhhcmR3YXJlOjp+RGlzcGxheUhhcmR3YXJlKCkKLXsKLSAgICBmaW5pKCk7Ci19Ci0KLWZsb2F0IERpc3BsYXlIYXJkd2FyZTo6Z2V0RHBpWCgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIG1EcGlYOyB9Ci1mbG9hdCBEaXNwbGF5SGFyZHdhcmU6OmdldERwaVkoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBtRHBpWTsgfQotZmxvYXQgRGlzcGxheUhhcmR3YXJlOjpnZXREZW5zaXR5KCkgY29uc3QgICAgICAgeyByZXR1cm4gbURlbnNpdHk7IH0KLWZsb2F0IERpc3BsYXlIYXJkd2FyZTo6Z2V0UmVmcmVzaFJhdGUoKSBjb25zdCAgIHsgcmV0dXJuIG1SZWZyZXNoUmF0ZTsgfQotaW50IERpc3BsYXlIYXJkd2FyZTo6Z2V0V2lkdGgoKSBjb25zdCAgICAgICAgICAgeyByZXR1cm4gbVdpZHRoOyB9Ci1pbnQgRGlzcGxheUhhcmR3YXJlOjpnZXRIZWlnaHQoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBtSGVpZ2h0OyB9Ci1QaXhlbEZvcm1hdCBEaXNwbGF5SGFyZHdhcmU6OmdldEZvcm1hdCgpIGNvbnN0ICB7IHJldHVybiBtRm9ybWF0OyB9Ci11aW50MzJfdCBEaXNwbGF5SGFyZHdhcmU6OmdldE1heFRleHR1cmVTaXplKCkgY29uc3QgeyByZXR1cm4gbU1heFRleHR1cmVTaXplOyB9Ci0KLXVpbnQzMl90IERpc3BsYXlIYXJkd2FyZTo6Z2V0TWF4Vmlld3BvcnREaW1zKCkgY29uc3QgewotICAgIHJldHVybiBtTWF4Vmlld3BvcnREaW1zWzBdIDwgbU1heFZpZXdwb3J0RGltc1sxXSA/Ci0gICAgICAgICAgICBtTWF4Vmlld3BvcnREaW1zWzBdIDogbU1heFZpZXdwb3J0RGltc1sxXTsKLX0KLQotc3RhdGljIHN0YXR1c190IHNlbGVjdENvbmZpZ0ZvclBpeGVsRm9ybWF0KAotICAgICAgICBFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgRUdMaW50IGNvbnN0KiBhdHRycywKLSAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgICBFR0xDb25maWcqIG91dENvbmZpZykKLXsKLSAgICBFR0xDb25maWcgY29uZmlnID0gTlVMTDsKLSAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xLCBuPTA7Ci0gICAgZWdsR2V0Q29uZmlncyhkcHksIE5VTEwsIDAsICZudW1Db25maWdzKTsKLSAgICBFR0xDb25maWcqIGNvbnN0IGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnW251bUNvbmZpZ3NdOwotICAgIGVnbENob29zZUNvbmZpZyhkcHksIGF0dHJzLCBjb25maWdzLCBudW1Db25maWdzLCAmbik7Ci0gICAgZm9yIChpbnQgaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgIEVHTGludCBuYXRpdmVWaXN1YWxJZCA9IDA7Ci0gICAgICAgIGVnbEdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZ3NbaV0sIEVHTF9OQVRJVkVfVklTVUFMX0lELCAmbmF0aXZlVmlzdWFsSWQpOwotICAgICAgICBpZiAobmF0aXZlVmlzdWFsSWQ+MCAmJiBmb3JtYXQgPT0gbmF0aXZlVmlzdWFsSWQpIHsKLSAgICAgICAgICAgICpvdXRDb25maWcgPSBjb25maWdzW2ldOwotICAgICAgICAgICAgZGVsZXRlIFtdIGNvbmZpZ3M7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZGVsZXRlIFtdIGNvbmZpZ3M7Ci0gICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotfQotCi0KLXZvaWQgRGlzcGxheUhhcmR3YXJlOjppbml0KHVpbnQzMl90IGRweSkKLXsKLSAgICBtTmF0aXZlV2luZG93ID0gbmV3IEZyYW1lYnVmZmVyTmF0aXZlV2luZG93KCk7Ci0gICAgZnJhbWVidWZmZXJfZGV2aWNlX3QgY29uc3QgKiBmYkRldiA9IG1OYXRpdmVXaW5kb3ctPmdldERldmljZSgpOwotICAgIGlmICghZmJEZXYpIHsKLSAgICAgICAgQUxPR0UoIkRpc3BsYXkgc3Vic3lzdGVtIGZhaWxlZCB0byBpbml0aWFsaXplLiBjaGVjayBsb2dzLiBleGl0aW5nLi4uIik7Ci0gICAgICAgIGV4aXQoMCk7Ci0gICAgfQotCi0gICAgaW50IGZvcm1hdDsKLSAgICBBTmF0aXZlV2luZG93IGNvbnN0ICogY29uc3Qgd2luZG93ID0gbU5hdGl2ZVdpbmRvdy5nZXQoKTsKLSAgICB3aW5kb3ctPnF1ZXJ5KHdpbmRvdywgTkFUSVZFX1dJTkRPV19GT1JNQVQsICZmb3JtYXQpOwotICAgIG1EcGlYID0gbU5hdGl2ZVdpbmRvdy0+eGRwaTsKLSAgICBtRHBpWSA9IG1OYXRpdmVXaW5kb3ctPnlkcGk7Ci0gICAgbVJlZnJlc2hSYXRlID0gZmJEZXYtPmZwczsKLSAgICBtTmV4dEZha2VWU3luYyA9IDA7Ci0KLQotLyogRklYTUU6IHRoaXMgaXMgYSB0ZW1wb3JhcnkgSEFDSyB1bnRpbCB3ZSBhcmUgYWJsZSB0byByZXBvcnQgdGhlIHJlZnJlc2ggcmF0ZQotICogcHJvcGVybHkgZnJvbSB0aGUgSEFMLiBUaGUgV2luZG93TWFuYWdlclNlcnZpY2Ugbm93IHJlbGllcyBvbiB0aGlzIHZhbHVlLgotICovCi0jaWZuZGVmIFJFRlJFU0hfUkFURQotICAgIG1SZWZyZXNoUmF0ZSA9IGZiRGV2LT5mcHM7Ci0jZWxzZQotICAgIG1SZWZyZXNoUmF0ZSA9IFJFRlJFU0hfUkFURTsKLSN3YXJuaW5nICJyZWZyZXNoIHJhdGUgc2V0IHZpYSBtYWtlZmlsZSB0byBSRUZSRVNIX1JBVEUiCi0jZW5kaWYKLQotICAgIG1SZWZyZXNoUGVyaW9kID0gbnNlY3NfdCgxZTkgLyBtUmVmcmVzaFJhdGUpOwotCi0gICAgRUdMaW50IHcsIGgsIGR1bW15OwotICAgIEVHTGludCBudW1Db25maWdzPTA7Ci0gICAgRUdMU3VyZmFjZSBzdXJmYWNlOwotICAgIEVHTENvbnRleHQgY29udGV4dDsKLSAgICBFR0xCb29sZWFuIHJlc3VsdDsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICAvLyBpbml0aWFsaXplIEVHTAotICAgIEVHTGludCBhdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCAgICAgICBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9OT05FLCAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICBFR0xfTk9ORQotICAgIH07Ci0KLSAgICAvLyBkZWJ1ZzogZGlzYWJsZSBoL3cgcmVuZGVyaW5nCi0gICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoImRlYnVnLnNmLmh3IiwgcHJvcGVydHksIE5VTEwpID4gMCkgewotICAgICAgICBpZiAoYXRvaShwcm9wZXJ0eSkgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coIkgvVyBjb21wb3NpdGlvbiBkaXNhYmxlZCIpOwotICAgICAgICAgICAgYXR0cmlic1syXSA9IEVHTF9DT05GSUdfQ0FWRUFUOwotICAgICAgICAgICAgYXR0cmlic1szXSA9IEVHTF9TTE9XX0NPTkZJRzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IGFsbCB0aGUgZXh0ZW5zaW9ucyBiZWxvdyBzaG91bGQgYmUgcXVlcmllZCB0aHJvdWdoCi0gICAgLy8gZWdsR2V0UHJvY0FkZHJlc3MoKS4KLQotICAgIEVHTERpc3BsYXkgZGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgZWdsSW5pdGlhbGl6ZShkaXNwbGF5LCBOVUxMLCBOVUxMKTsKLSAgICBlZ2xHZXRDb25maWdzKGRpc3BsYXksIE5VTEwsIDAsICZudW1Db25maWdzKTsKLQotICAgIEVHTENvbmZpZyBjb25maWcgPSBOVUxMOwotICAgIGVyciA9IHNlbGVjdENvbmZpZ0ZvclBpeGVsRm9ybWF0KGRpc3BsYXksIGF0dHJpYnMsIGZvcm1hdCwgJmNvbmZpZyk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiY291bGRuJ3QgZmluZCBhbiBFR0xDb25maWcgbWF0Y2hpbmcgdGhlIHNjcmVlbiBmb3JtYXQiKTsKLSAgICAKLSAgICBFR0xpbnQgcixnLGIsYTsKLSAgICBlZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBFR0xfUkVEX1NJWkUsICAgJnIpOwotICAgIGVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIEVHTF9HUkVFTl9TSVpFLCAmZyk7Ci0gICAgZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgRUdMX0JMVUVfU0laRSwgICZiKTsKLSAgICBlZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBFR0xfQUxQSEFfU0laRSwgJmEpOwotCi0gICAgaWYgKG1OYXRpdmVXaW5kb3ctPmlzVXBkYXRlT25EZW1hbmQoKSkgewotICAgICAgICBtRmxhZ3MgfD0gUEFSVElBTF9VUERBVEVTOwotICAgIH0KLSAgICAKLSAgICBpZiAoZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgRUdMX0NPTkZJR19DQVZFQVQsICZkdW1teSkgPT0gRUdMX1RSVUUpIHsKLSAgICAgICAgaWYgKGR1bW15ID09IEVHTF9TTE9XX0NPTkZJRykKLSAgICAgICAgICAgIG1GbGFncyB8PSBTTE9XX0NPTkZJRzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENyZWF0ZSBvdXIgbWFpbiBzdXJmYWNlCi0gICAgICovCi0KLSAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkaXNwbGF5LCBjb25maWcsIG1OYXRpdmVXaW5kb3cuZ2V0KCksIE5VTEwpOwotICAgIGVnbFF1ZXJ5U3VyZmFjZShkaXNwbGF5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICAmbVdpZHRoKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UoZGlzcGxheSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJm1IZWlnaHQpOwotCi0gICAgaWYgKG1GbGFncyAmIFBBUlRJQUxfVVBEQVRFUykgewotICAgICAgICAvLyBpZiB3ZSBoYXZlIHBhcnRpYWwgdXBkYXRlcywgd2UgZGVmaW5pdGVseSBkb24ndCBuZWVkIHRvCi0gICAgICAgIC8vIHByZXNlcnZlIHRoZSBiYWNrYnVmZmVyLCB3aGljaCBtYXkgYmUgY29zdGx5LgotICAgICAgICBlZ2xTdXJmYWNlQXR0cmliKGRpc3BsYXksIHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgRUdMX1NXQVBfQkVIQVZJT1IsIEVHTF9CVUZGRVJfREVTVFJPWUVEKTsKLSAgICB9Ci0KLSAgICBpZiAoZWdsUXVlcnlTdXJmYWNlKGRpc3BsYXksIHN1cmZhY2UsIEVHTF9TV0FQX0JFSEFWSU9SLCAmZHVtbXkpID09IEVHTF9UUlVFKSB7Ci0gICAgICAgIGlmIChkdW1teSA9PSBFR0xfQlVGRkVSX1BSRVNFUlZFRCkgewotICAgICAgICAgICAgbUZsYWdzIHw9IEJVRkZFUl9QUkVTRVJWRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogUmVhZCBkZW5zaXR5IGZyb20gYnVpbGQtc3BlY2lmaWMgcm8uc2YubGNkX2RlbnNpdHkgcHJvcGVydHkKLSAgICAgKiBleGNlcHQgaWYgaXQgaXMgb3ZlcnJpZGRlbiBieSBxZW11LnNmLmxjZF9kZW5zaXR5LgotICAgICAqLwotICAgIGlmIChwcm9wZXJ0eV9nZXQoInFlbXUuc2YubGNkX2RlbnNpdHkiLCBwcm9wZXJ0eSwgTlVMTCkgPD0gMCkgewotICAgICAgICBpZiAocHJvcGVydHlfZ2V0KCJyby5zZi5sY2RfZGVuc2l0eSIsIHByb3BlcnR5LCBOVUxMKSA8PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygicm8uc2YubGNkX2RlbnNpdHkgbm90IGRlZmluZWQsIHVzaW5nIDE2MCBkcGkgYnkgZGVmYXVsdC4iKTsKLSAgICAgICAgICAgIHN0cmNweShwcm9wZXJ0eSwgIjE2MCIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogZm9yIHRoZSBlbXVsYXRvciBjYXNlLCByZXNldCB0aGUgZHBpIHZhbHVlcyB0b28gKi8KLSAgICAgICAgbURwaVggPSBtRHBpWSA9IGF0b2kocHJvcGVydHkpOwotICAgIH0KLSAgICBtRGVuc2l0eSA9IGF0b2kocHJvcGVydHkpICogKDEuMGYvMTYwLjBmKTsKLQotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgb3VyIE9wZW5HTCBFUyBjb250ZXh0Ci0gICAgICovCi0gICAgCi0KLSAgICBFR0xpbnQgY29udGV4dEF0dHJpYnV0ZXNbXSA9IHsKLSNpZmRlZiBFR0xfSU1HX2NvbnRleHRfcHJpb3JpdHkKLSNpZmRlZiBIQVNfQ09OVEVYVF9QUklPUklUWQotI3dhcm5pbmcgInVzaW5nIEVHTF9JTUdfY29udGV4dF9wcmlvcml0eSIKLSAgICAgICAgRUdMX0NPTlRFWFRfUFJJT1JJVFlfTEVWRUxfSU1HLCBFR0xfQ09OVEVYVF9QUklPUklUWV9ISUdIX0lNRywKLSNlbmRpZgotI2VuZGlmCi0gICAgICAgIEVHTF9OT05FLCBFR0xfTk9ORQotICAgIH07Ci0gICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZGlzcGxheSwgY29uZmlnLCBOVUxMLCBjb250ZXh0QXR0cmlidXRlcyk7Ci0KLSAgICBtRGlzcGxheSA9IGRpc3BsYXk7Ci0gICAgbUNvbmZpZyAgPSBjb25maWc7Ci0gICAgbVN1cmZhY2UgPSBzdXJmYWNlOwotICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICBtRm9ybWF0ICA9IGZiRGV2LT5mb3JtYXQ7Ci0gICAgbVBhZ2VGbGlwQ291bnQgPSAwOwotCi0gICAgLyoKLSAgICAgKiBHYXRoZXIgT3BlbkdMIEVTIGV4dGVuc2lvbnMKLSAgICAgKi8KLQotICAgIHJlc3VsdCA9IGVnbE1ha2VDdXJyZW50KGRpc3BsYXksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOwotICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZG4ndCBjcmVhdGUgYSB3b3JraW5nIEdMRVMgY29udGV4dC4gY2hlY2sgbG9ncy4gZXhpdGluZy4uLiIpOwotICAgICAgICBleGl0KDApOwotICAgIH0KLQotICAgIEdMRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyhHTEV4dGVuc2lvbnM6OmdldEluc3RhbmNlKCkpOwotICAgIGV4dGVuc2lvbnMuaW5pdFdpdGhHTFN0cmluZ3MoCi0gICAgICAgICAgICBnbEdldFN0cmluZyhHTF9WRU5ET1IpLAotICAgICAgICAgICAgZ2xHZXRTdHJpbmcoR0xfUkVOREVSRVIpLAotICAgICAgICAgICAgZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTiksCi0gICAgICAgICAgICBnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKSwKLSAgICAgICAgICAgIGVnbFF1ZXJ5U3RyaW5nKGRpc3BsYXksIEVHTF9WRU5ET1IpLAotICAgICAgICAgICAgZWdsUXVlcnlTdHJpbmcoZGlzcGxheSwgRUdMX1ZFUlNJT04pLAotICAgICAgICAgICAgZWdsUXVlcnlTdHJpbmcoZGlzcGxheSwgRUdMX0VYVEVOU0lPTlMpKTsKLQotICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfU0laRSwgJm1NYXhUZXh0dXJlU2l6ZSk7Ci0gICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVklFV1BPUlRfRElNUywgbU1heFZpZXdwb3J0RGltcyk7Ci0KLSAgICBBTE9HSSgiRUdMIGluZm9ybWF0aW9uczoiKTsKLSAgICBBTE9HSSgiIyBvZiBjb25maWdzIDogJWQiLCBudW1Db25maWdzKTsKLSAgICBBTE9HSSgidmVuZG9yICAgIDogJXMiLCBleHRlbnNpb25zLmdldEVnbFZlbmRvcigpKTsKLSAgICBBTE9HSSgidmVyc2lvbiAgIDogJXMiLCBleHRlbnNpb25zLmdldEVnbFZlcnNpb24oKSk7Ci0gICAgQUxPR0koImV4dGVuc2lvbnM6ICVzIiwgZXh0ZW5zaW9ucy5nZXRFZ2xFeHRlbnNpb24oKSk7Ci0gICAgQUxPR0koIkNsaWVudCBBUEk6ICVzIiwgZWdsUXVlcnlTdHJpbmcoZGlzcGxheSwgRUdMX0NMSUVOVF9BUElTKT86Ik5vdCBTdXBwb3J0ZWQiKTsKLSAgICBBTE9HSSgiRUdMU3VyZmFjZTogJWQtJWQtJWQtJWQsIGNvbmZpZz0lcCIsIHIsIGcsIGIsIGEsIGNvbmZpZyk7Ci0KLSAgICBBTE9HSSgiT3BlbkdMIGluZm9ybWF0aW9uczoiKTsKLSAgICBBTE9HSSgidmVuZG9yICAgIDogJXMiLCBleHRlbnNpb25zLmdldFZlbmRvcigpKTsKLSAgICBBTE9HSSgicmVuZGVyZXIgIDogJXMiLCBleHRlbnNpb25zLmdldFJlbmRlcmVyKCkpOwotICAgIEFMT0dJKCJ2ZXJzaW9uICAgOiAlcyIsIGV4dGVuc2lvbnMuZ2V0VmVyc2lvbigpKTsKLSAgICBBTE9HSSgiZXh0ZW5zaW9uczogJXMiLCBleHRlbnNpb25zLmdldEV4dGVuc2lvbigpKTsKLSAgICBBTE9HSSgiR0xfTUFYX1RFWFRVUkVfU0laRSA9ICVkIiwgbU1heFRleHR1cmVTaXplKTsKLSAgICBBTE9HSSgiR0xfTUFYX1ZJRVdQT1JUX0RJTVMgPSAlZCB4ICVkIiwgbU1heFZpZXdwb3J0RGltc1swXSwgbU1heFZpZXdwb3J0RGltc1sxXSk7Ci0gICAgQUxPR0koImZsYWdzID0gJTA4eCIsIG1GbGFncyk7Ci0KLSAgICAvLyBVbmJpbmQgdGhlIGNvbnRleHQgZnJvbSB0aGlzIHRocmVhZAotICAgIGVnbE1ha2VDdXJyZW50KGRpc3BsYXksIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQpOwotCi0KLSAgICAvLyBpbml0aWFsaXplIHRoZSBIL1cgY29tcG9zZXIKLSAgICBtSHdjID0gbmV3IEhXQ29tcG9zZXIobUZsaW5nZXIpOwotICAgIGlmIChtSHdjLT5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICBtSHdjLT5zZXRGcmFtZUJ1ZmZlcihtRGlzcGxheSwgbVN1cmZhY2UpOwotICAgIH0KLX0KLQotSFdDb21wb3NlciYgRGlzcGxheUhhcmR3YXJlOjpnZXRId0NvbXBvc2VyKCkgY29uc3QgewotICAgIHJldHVybiAqbUh3YzsKLX0KLQotLyoKLSAqIENsZWFuIHVwLiAgVGhyb3cgb3V0IG91ciBsb2NhbCBzdGF0ZS4KLSAqCi0gKiAoSXQncyBlbnRpcmVseSBwb3NzaWJsZSB3ZSdsbCBuZXZlciBnZXQgaGVyZSwgc2luY2UgdGhpcyBpcyBtZWFudAotICogZm9yIHJlYWwgaGFyZHdhcmUsIHdoaWNoIGRvZXNuJ3QgcmVzdGFydC4pCi0gKi8KLQotdm9pZCBEaXNwbGF5SGFyZHdhcmU6OmZpbmkoKQotewotICAgIGVnbE1ha2VDdXJyZW50KG1EaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKLSAgICBlZ2xUZXJtaW5hdGUobURpc3BsYXkpOwotfQotCi12b2lkIERpc3BsYXlIYXJkd2FyZTo6cmVsZWFzZVNjcmVlbigpIGNvbnN0Ci17Ci0gICAgRGlzcGxheUhhcmR3YXJlQmFzZTo6cmVsZWFzZVNjcmVlbigpOwotICAgIGlmIChtSHdjLT5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICBtSHdjLT5yZWxlYXNlKCk7Ci0gICAgfQotfQotCi12b2lkIERpc3BsYXlIYXJkd2FyZTo6YWNxdWlyZVNjcmVlbigpIGNvbnN0Ci17Ci0gICAgRGlzcGxheUhhcmR3YXJlQmFzZTo6YWNxdWlyZVNjcmVlbigpOwotfQotCi11aW50MzJfdCBEaXNwbGF5SGFyZHdhcmU6OmdldFBhZ2VGbGlwQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QYWdlRmxpcENvdW50OwotfQotCi0vLyB0aGlzIG5lZWRzIHRvIGJlIHRocmVhZCBzYWZlCi1uc2Vjc190IERpc3BsYXlIYXJkd2FyZTo6d2FpdEZvclJlZnJlc2goKSBjb25zdCB7Ci0gICAgbnNlY3NfdCB0aW1lc3RhbXA7Ci0gICAgaWYgKG1WU3luYy53YWl0KCZ0aW1lc3RhbXApIDwgMCkgewotICAgICAgICAvLyB2c3luYyBub3Qgc3VwcG9ydGVkIQotICAgICAgICB1c2xlZXAoIGdldERlbGF5VG9OZXh0VlN5bmNVcygmdGltZXN0YW1wKSApOwotICAgIH0KLSAgICBtTGFzdEh3VlN5bmMgPSB0aW1lc3RhbXA7IC8vIEZJWE1FOiBOb3QgdGhyZWFkIHNhZmUKLSAgICByZXR1cm4gdGltZXN0YW1wOwotfQotCi1uc2Vjc190IERpc3BsYXlIYXJkd2FyZTo6Z2V0UmVmcmVzaFRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgICAvLyB0aGlzIHJldHVybnMgdGhlIGxhc3QgcmVmcmVzaCB0aW1lc3RhbXAuCi0gICAgLy8gaWYgdGhlIGxhc3Qgb25lIGlzIG5vdCBhdmFpbGFibGUsIHdlIGVzdGltYXRlIGl0IGJhc2VkIG9uCi0gICAgLy8gdGhlIHJlZnJlc2ggcGVyaW9kIGFuZCB3aGF0ZXZlciBjbG9zZXN0IHRpbWVzdGFtcCB3ZSBoYXZlLgotICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgIHJldHVybiBub3cgLSAoKG5vdyAtIG1MYXN0SHdWU3luYykgJSAgbVJlZnJlc2hQZXJpb2QpOwotfQotCi1uc2Vjc190IERpc3BsYXlIYXJkd2FyZTo6Z2V0UmVmcmVzaFBlcmlvZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVJlZnJlc2hQZXJpb2Q7Ci19Ci0KLWludDMyX3QgRGlzcGxheUhhcmR3YXJlOjpnZXREZWxheVRvTmV4dFZTeW5jVXMobnNlY3NfdCogdGltZXN0YW1wKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1GYWtlVlN5bmNNdXRleCk7Ci0gICAgY29uc3QgbnNlY3NfdCBwZXJpb2QgPSBtUmVmcmVzaFBlcmlvZDsKLSAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IG5leHRfdnN5bmMgPSBtTmV4dEZha2VWU3luYzsKLSAgICBuc2Vjc190IHNsZWVwID0gbmV4dF92c3luYyAtIG5vdzsKLSAgICBpZiAoc2xlZXAgPCAwKSB7Ci0gICAgICAgIC8vIHdlIG1pc3NlZCwgZmluZCB3aGVyZSB0aGUgbmV4dCB2c3luYyBzaG91bGQgYmUKLSAgICAgICAgc2xlZXAgPSAocGVyaW9kIC0gKChub3cgLSBuZXh0X3ZzeW5jKSAlIHBlcmlvZCkpOwotICAgICAgICBuZXh0X3ZzeW5jID0gbm93ICsgc2xlZXA7Ci0gICAgfQotICAgIG1OZXh0RmFrZVZTeW5jID0gbmV4dF92c3luYyArIHBlcmlvZDsKLSAgICB0aW1lc3RhbXBbMF0gPSBuZXh0X3ZzeW5jOwotCi0gICAgLy8gcm91bmQgdG8gbmV4dCBtaWNyb3NlY29uZAotICAgIGludDMyX3Qgc2xlZXBfdXMgPSAoc2xlZXAgKyA5OTlMTCkgLyAxMDAwTEw7Ci0KLSAgICAvLyBndWFyYW50ZWVkIHRvIGJlID4gMAotICAgIHJldHVybiBzbGVlcF91czsKLX0KLQotc3RhdHVzX3QgRGlzcGxheUhhcmR3YXJlOjpjb21wb3NpdGlvbkNvbXBsZXRlKCkgY29uc3QgewotICAgIHJldHVybiBtTmF0aXZlV2luZG93LT5jb21wb3NpdGlvbkNvbXBsZXRlKCk7Ci19Ci0KLXZvaWQgRGlzcGxheUhhcmR3YXJlOjpmbGlwKGNvbnN0IFJlZ2lvbiYgZGlydHkpIGNvbnN0Ci17Ci0gICAgY2hlY2tHTEVycm9ycygpOwotCi0gICAgRUdMRGlzcGxheSBkcHkgPSBtRGlzcGxheTsKLSAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBtU3VyZmFjZTsKLQotI2lmZGVmIEVHTF9BTkRST0lEX3N3YXBfcmVjdGFuZ2xlICAgIAotICAgIGlmIChtRmxhZ3MgJiBTV0FQX1JFQ1RBTkdMRSkgewotICAgICAgICBjb25zdCBSZWdpb24gbmV3RGlydHkoZGlydHkuaW50ZXJzZWN0KGJvdW5kcygpKSk7Ci0gICAgICAgIGNvbnN0IFJlY3QgYihuZXdEaXJ0eS5nZXRCb3VuZHMoKSk7Ci0gICAgICAgIGVnbFNldFN3YXBSZWN0YW5nbGVBTkRST0lEKGRweSwgc3VyZmFjZSwKLSAgICAgICAgICAgICAgICBiLmxlZnQsIGIudG9wLCBiLndpZHRoKCksIGIuaGVpZ2h0KCkpOwotICAgIH0gCi0jZW5kaWYKLSAgICAKLSAgICBpZiAobUZsYWdzICYgUEFSVElBTF9VUERBVEVTKSB7Ci0gICAgICAgIG1OYXRpdmVXaW5kb3ctPnNldFVwZGF0ZVJlY3RhbmdsZShkaXJ0eS5nZXRCb3VuZHMoKSk7Ci0gICAgfQotICAgIAotICAgIG1QYWdlRmxpcENvdW50Kys7Ci0KLSAgICBpZiAobUh3Yy0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUh3Yy0+Y29tbWl0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICB9Ci0gICAgY2hlY2tFR0xFcnJvcnMoImVnbFN3YXBCdWZmZXJzIik7Ci0KLSAgICAvLyBmb3IgZGVidWdnaW5nCi0gICAgLy9nbENsZWFyQ29sb3IoMSwwLDAsMCk7Ci0gICAgLy9nbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotfQotCi11aW50MzJfdCBEaXNwbGF5SGFyZHdhcmU6OmdldEZsYWdzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbUZsYWdzOwotfQotCi12b2lkIERpc3BsYXlIYXJkd2FyZTo6bWFrZUN1cnJlbnQoKSBjb25zdAotewotICAgIGVnbE1ha2VDdXJyZW50KG1EaXNwbGF5LCBtU3VyZmFjZSwgbVN1cmZhY2UsIG1Db250ZXh0KTsKLX0KLQotdm9pZCBEaXNwbGF5SGFyZHdhcmU6OmR1bXAoU3RyaW5nOCYgcmVzKSBjb25zdAotewotICAgIG1OYXRpdmVXaW5kb3ctPmR1bXAocmVzKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4MjhiMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9ESVNQTEFZX0hBUkRXQVJFX0gKLSNkZWZpbmUgQU5EUk9JRF9ESVNQTEFZX0hBUkRXQVJFX0gKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLSNpbmNsdWRlIDx1aS9SZWdpb24uaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLQotI2luY2x1ZGUgIkdMRXh0ZW5zaW9ucy5oIgotCi0jaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuaCIKLSNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvVlN5bmNCYXJyaWVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c7Ci1jbGFzcyBIV0NvbXBvc2VyOwotCi1jbGFzcyBEaXNwbGF5SGFyZHdhcmUgOiBwdWJsaWMgRGlzcGxheUhhcmR3YXJlQmFzZQotewotcHVibGljOgotICAgIGVudW0gewotICAgICAgICBDT1BZX0JJVFNfRVhURU5TSU9OICAgICAgICAgPSAweDAwMDAwMDA4LAotICAgICAgICBCVUZGRVJfUFJFU0VSVkVEICAgICAgICAgICAgPSAweDAwMDEwMDAwLAotICAgICAgICBQQVJUSUFMX1VQREFURVMgICAgICAgICAgICAgPSAweDAwMDIwMDAwLCAgIC8vIHZpZGVvIGRyaXZlciBmZWF0dXJlCi0gICAgICAgIFNMT1dfQ09ORklHICAgICAgICAgICAgICAgICA9IDB4MDAwNDAwMDAsICAgLy8gc29mdHdhcmUKLSAgICAgICAgU1dBUF9SRUNUQU5HTEUgICAgICAgICAgICAgID0gMHgwMDA4MDAwMCwKLSAgICB9OwotCi0gICAgRGlzcGxheUhhcmR3YXJlKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLAotICAgICAgICAgICAgdWludDMyX3QgZGlzcGxheUluZGV4KTsKLQotICAgIH5EaXNwbGF5SGFyZHdhcmUoKTsKLQotICAgIHZvaWQgcmVsZWFzZVNjcmVlbigpIGNvbnN0OwotICAgIHZvaWQgYWNxdWlyZVNjcmVlbigpIGNvbnN0OwotCi0gICAgLy8gRmxpcCB0aGUgZnJvbnQgYW5kIGJhY2sgYnVmZmVycyBpZiB0aGUgYmFjayBidWZmZXIgaXMgImRpcnR5Ii4gIE1pZ2h0Ci0gICAgLy8gYmUgaW5zdGFudGFuZW91cywgbWlnaHQgaW52b2x2ZSBjb3B5aW5nIHRoZSBmcmFtZSBidWZmZXIgYXJvdW5kLgotICAgIHZvaWQgZmxpcChjb25zdCBSZWdpb24mIGRpcnR5KSBjb25zdDsKLQotICAgIGZsb2F0ICAgICAgIGdldERwaVgoKSBjb25zdDsKLSAgICBmbG9hdCAgICAgICBnZXREcGlZKCkgY29uc3Q7Ci0gICAgZmxvYXQgICAgICAgZ2V0UmVmcmVzaFJhdGUoKSBjb25zdDsKLSAgICBmbG9hdCAgICAgICBnZXREZW5zaXR5KCkgY29uc3Q7Ci0gICAgaW50ICAgICAgICAgZ2V0V2lkdGgoKSBjb25zdDsKLSAgICBpbnQgICAgICAgICBnZXRIZWlnaHQoKSBjb25zdDsKLSAgICBQaXhlbEZvcm1hdCBnZXRGb3JtYXQoKSBjb25zdDsKLSAgICB1aW50MzJfdCAgICBnZXRGbGFncygpIGNvbnN0OwotICAgIHZvaWQgICAgICAgIG1ha2VDdXJyZW50KCkgY29uc3Q7Ci0gICAgdWludDMyX3QgICAgZ2V0TWF4VGV4dHVyZVNpemUoKSBjb25zdDsKLSAgICB1aW50MzJfdCAgICBnZXRNYXhWaWV3cG9ydERpbXMoKSBjb25zdDsKLQotICAgIC8vIHdhaXRzIGZvciB0aGUgbmV4dCB2c3luYyBhbmQgcmV0dXJucyB0aGUgdGltZXN0YW1wIG9mIHdoZW4gaXQgaGFwcGVuZWQKLSAgICBuc2Vjc190ICAgICB3YWl0Rm9yUmVmcmVzaCgpIGNvbnN0OwotICAgIG5zZWNzX3QgICAgIGdldFJlZnJlc2hQZXJpb2QoKSBjb25zdDsKLSAgICBuc2Vjc190ICAgICBnZXRSZWZyZXNoVGltZXN0YW1wKCkgY29uc3Q7Ci0KLSAgICB1aW50MzJfdCBnZXRQYWdlRmxpcENvdW50KCkgY29uc3Q7Ci0gICAgRUdMRGlzcGxheSBnZXRFR0xEaXNwbGF5KCkgY29uc3QgeyByZXR1cm4gbURpc3BsYXk7IH0KLQotICAgIHZvaWQgZHVtcChTdHJpbmc4JiByZXMpIGNvbnN0OwotCi0gICAgLy8gSGFyZHdhcmUgQ29tcG9zZXIKLSAgICBIV0NvbXBvc2VyJiBnZXRId0NvbXBvc2VyKCkgY29uc3Q7Ci0gICAgCi0gICAgc3RhdHVzX3QgY29tcG9zaXRpb25Db21wbGV0ZSgpIGNvbnN0OwotICAgIAotICAgIFJlY3QgZ2V0Qm91bmRzKCkgY29uc3QgewotICAgICAgICByZXR1cm4gUmVjdChtV2lkdGgsIG1IZWlnaHQpOwotICAgIH0KLSAgICBpbmxpbmUgUmVjdCBib3VuZHMoKSBjb25zdCB7IHJldHVybiBnZXRCb3VuZHMoKTsgfQotCi1wcml2YXRlOgotICAgIHZvaWQgaW5pdCh1aW50MzJfdCBkaXNwbGF5SW5kZXgpIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7Ci0gICAgdm9pZCBmaW5pKCkgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKTsKLSAgICBpbnQzMl90IGdldERlbGF5VG9OZXh0VlN5bmNVcyhuc2Vjc190KiB0aW1lc3RhbXApIGNvbnN0OwotCi0gICAgc3A8U3VyZmFjZUZsaW5nZXI+IG1GbGluZ2VyOwotICAgIEVHTERpc3BsYXkgICAgICBtRGlzcGxheTsKLSAgICBFR0xTdXJmYWNlICAgICAgbVN1cmZhY2U7Ci0gICAgRUdMQ29udGV4dCAgICAgIG1Db250ZXh0OwotICAgIEVHTENvbmZpZyAgICAgICBtQ29uZmlnOwotICAgIGZsb2F0ICAgICAgICAgICBtRHBpWDsKLSAgICBmbG9hdCAgICAgICAgICAgbURwaVk7Ci0gICAgZmxvYXQgICAgICAgICAgIG1SZWZyZXNoUmF0ZTsKLSAgICBmbG9hdCAgICAgICAgICAgbURlbnNpdHk7Ci0gICAgaW50ICAgICAgICAgICAgIG1XaWR0aDsKLSAgICBpbnQgICAgICAgICAgICAgbUhlaWdodDsKLSAgICBQaXhlbEZvcm1hdCAgICAgbUZvcm1hdDsKLSAgICB1aW50MzJfdCAgICAgICAgbUZsYWdzOwotICAgIG11dGFibGUgdWludDMyX3QgbVBhZ2VGbGlwQ291bnQ7Ci0gICAgR0xpbnQgICAgICAgICAgIG1NYXhWaWV3cG9ydERpbXNbMl07Ci0gICAgR0xpbnQgICAgICAgICAgIG1NYXhUZXh0dXJlU2l6ZTsKLSAgICBWU3luY0JhcnJpZXIgICAgbVZTeW5jOwotCi0gICAgbXV0YWJsZSBNdXRleCAgIG1GYWtlVlN5bmNNdXRleDsKLSAgICBtdXRhYmxlIG5zZWNzX3QgbU5leHRGYWtlVlN5bmM7Ci0gICAgbnNlY3NfdCAgICAgICAgIG1SZWZyZXNoUGVyaW9kOwotICAgIG11dGFibGUgbnNlY3NfdCBtTGFzdEh3VlN5bmM7Ci0KLSAgICBIV0NvbXBvc2VyKiAgICAgbUh3YzsKLQotICAgIHNwPEZyYW1lYnVmZmVyTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfRElTUExBWV9IQVJEV0FSRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlQmFzZS5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlQmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZjFhY2EuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuaCIKLSNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3Qga1NsZWVwRmlsZU5hbWUgPSAiL3N5cy9wb3dlci93YWl0X2Zvcl9mYl9zbGVlcCI7Ci1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGtXYWtlRmlsZU5hbWUgID0gIi9zeXMvcG93ZXIvd2FpdF9mb3JfZmJfd2FrZSI7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRGlzcGxheUhhcmR3YXJlQmFzZTo6RGlzcGxheUV2ZW50VGhyZWFkOjpEaXNwbGF5RXZlbnRUaHJlYWQoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlcikKLSAgICA6IFRocmVhZChmYWxzZSksIG1GbGluZ2VyKGZsaW5nZXIpIHsKLX0KLQotRGlzcGxheUhhcmR3YXJlQmFzZTo6RGlzcGxheUV2ZW50VGhyZWFkOjp+RGlzcGxheUV2ZW50VGhyZWFkKCkgewotfQotCi1zdGF0dXNfdCBEaXNwbGF5SGFyZHdhcmVCYXNlOjpEaXNwbGF5RXZlbnRUaHJlYWQ6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gKChhY2Nlc3Moa1NsZWVwRmlsZU5hbWUsIFJfT0spID09IDAgJiYKLSAgICAgICAgICAgIGFjY2VzcyhrV2FrZUZpbGVOYW1lLCBSX09LKSA9PSAwKSkgPyBOT19FUlJPUiA6IE5PX0lOSVQ7Ci19Ci0KLWJvb2wgRGlzcGxheUhhcmR3YXJlQmFzZTo6RGlzcGxheUV2ZW50VGhyZWFkOjp0aHJlYWRMb29wKCkgewotCi0gICAgaWYgKHdhaXRGb3JGYlNsZWVwKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc3A8U3VyZmFjZUZsaW5nZXI+IGZsaW5nZXIgPSBtRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgICAgIEFMT0dEKCJBYm91dCB0byBnaXZlLXVwIHNjcmVlbiwgZmxpbmdlciA9ICVwIiwgZmxpbmdlci5nZXQoKSk7Ci0gICAgICAgIGlmIChmbGluZ2VyICE9IDApIHsKLSAgICAgICAgICAgIG1CYXJyaWVyLmNsb3NlKCk7Ci0gICAgICAgICAgICBmbGluZ2VyLT5zY3JlZW5SZWxlYXNlZCgwKTsKLSAgICAgICAgICAgIG1CYXJyaWVyLndhaXQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2FpdEZvckZiV2FrZSgpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzcDxTdXJmYWNlRmxpbmdlcj4gZmxpbmdlciA9IG1GbGluZ2VyLnByb21vdGUoKTsKLSAgICAgICAgICAgIEFMT0dEKCJTY3JlZW4gYWJvdXQgdG8gcmV0dXJuLCBmbGluZ2VyID0gJXAiLCBmbGluZ2VyLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChmbGluZ2VyICE9IDApIHsKLSAgICAgICAgICAgICAgICBmbGluZ2VyLT5zY3JlZW5BY3F1aXJlZCgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZXJyb3IsIGV4aXQgdGhlIHRocmVhZAotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgRGlzcGxheUhhcmR3YXJlQmFzZTo6RGlzcGxheUV2ZW50VGhyZWFkOjp3YWl0Rm9yRmJTbGVlcCgpIHsKLSAgICBpbnQgZXJyID0gMDsKLSAgICBjaGFyIGJ1ZjsKLSAgICBpbnQgZmQgPSBvcGVuKGtTbGVlcEZpbGVOYW1lLCBPX1JET05MWSwgMCk7Ci0gICAgLy8gaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgdGhlIGVycm9yIHdpbGwgYmUgY2F1Z2h0IGluIHJlYWQoKSBiZWxvdwotICAgIGRvIHsKLSAgICAgICAgZXJyID0gcmVhZChmZCwgJmJ1ZiwgMSk7Ci0gICAgfSB3aGlsZSAoZXJyIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0gICAgY2xvc2UoZmQpOwotICAgIEFMT0dFX0lGKGVycjwwLCAiKioqIEFORFJPSURfV0FJVF9GT1JfRkJfU0xFRVAgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBlcnIgPCAwID8gLWVycm5vIDogaW50KE5PX0VSUk9SKTsKLX0KLQotc3RhdHVzX3QgRGlzcGxheUhhcmR3YXJlQmFzZTo6RGlzcGxheUV2ZW50VGhyZWFkOjp3YWl0Rm9yRmJXYWtlKCkgewotICAgIGludCBlcnIgPSAwOwotICAgIGNoYXIgYnVmOwotICAgIGludCBmZCA9IG9wZW4oa1dha2VGaWxlTmFtZSwgT19SRE9OTFksIDApOwotICAgIC8vIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIHRoZSBlcnJvciB3aWxsIGJlIGNhdWdodCBpbiByZWFkKCkgYmVsb3cKLSAgICBkbyB7Ci0gICAgICAgIGVyciA9IHJlYWQoZmQsICZidWYsIDEpOwotICAgIH0gd2hpbGUgKGVyciA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotICAgIGNsb3NlKGZkKTsKLSAgICBBTE9HRV9JRihlcnI8MCwgIioqKiBBTkRST0lEX1dBSVRfRk9SX0ZCX1dBS0UgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBlcnIgPCAwID8gLWVycm5vIDogaW50KE5PX0VSUk9SKTsKLX0KLQotc3RhdHVzX3QgRGlzcGxheUhhcmR3YXJlQmFzZTo6RGlzcGxheUV2ZW50VGhyZWFkOjpyZWxlYXNlU2NyZWVuKCkgY29uc3QgewotICAgIG1CYXJyaWVyLm9wZW4oKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRGlzcGxheUhhcmR3YXJlQmFzZTo6RGlzcGxheUhhcmR3YXJlQmFzZShjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCi0gICAgICAgIHVpbnQzMl90IGRpc3BsYXlJbmRleCkgCi0gICAgOiBtU2NyZWVuQWNxdWlyZWQodHJ1ZSkKLXsKLSAgICBtRGlzcGxheUV2ZW50VGhyZWFkID0gbmV3IERpc3BsYXlFdmVudFRocmVhZChmbGluZ2VyKTsKLX0KLQotdm9pZCBEaXNwbGF5SGFyZHdhcmVCYXNlOjpzdGFydFNsZWVwTWFuYWdlbWVudCgpIGNvbnN0IHsKLSAgICBpZiAobURpc3BsYXlFdmVudFRocmVhZC0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbURpc3BsYXlFdmVudFRocmVhZC0+cnVuKCJEaXNwbGF5RXZlbnRUaHJlYWQiLCBQUklPUklUWV9VUkdFTlRfRElTUExBWSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIi9zeXMvcG93ZXIvd2FpdF9mb3JfZmJfe3dha2V8c2xlZXB9IGRvbid0IGV4aXN0Iik7Ci0gICAgfQotfQotCi1EaXNwbGF5SGFyZHdhcmVCYXNlOjp+RGlzcGxheUhhcmR3YXJlQmFzZSgpIHsKLSAgICAvLyByZXF1ZXN0IGV4aXQKLSAgICBtRGlzcGxheUV2ZW50VGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLX0KLQotYm9vbCBEaXNwbGF5SGFyZHdhcmVCYXNlOjpjYW5EcmF3KCkgY29uc3QgewotICAgIHJldHVybiBtU2NyZWVuQWNxdWlyZWQ7Ci19Ci0KLXZvaWQgRGlzcGxheUhhcmR3YXJlQmFzZTo6cmVsZWFzZVNjcmVlbigpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRGlzcGxheUV2ZW50VGhyZWFkLT5yZWxlYXNlU2NyZWVuKCk7Ci0gICAgaWYgKGVyciA+PSAwKSB7Ci0gICAgICAgIG1TY3JlZW5BY3F1aXJlZCA9IGZhbHNlOwotICAgIH0KLX0KLQotdm9pZCBEaXNwbGF5SGFyZHdhcmVCYXNlOjphY3F1aXJlU2NyZWVuKCkgY29uc3QgewotICAgIG1TY3JlZW5BY3F1aXJlZCA9IHRydWU7Ci19Ci0KLWJvb2wgRGlzcGxheUhhcmR3YXJlQmFzZTo6aXNTY3JlZW5BY3F1aXJlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNjcmVlbkFjcXVpcmVkOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYTIxMWIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRElTUExBWV9IQVJEV0FSRV9CQVNFX0gKLSNkZWZpbmUgQU5EUk9JRF9ESVNQTEFZX0hBUkRXQVJFX0JBU0VfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlICJCYXJyaWVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3VyZmFjZUZsaW5nZXI7IAotCi1jbGFzcyBEaXNwbGF5SGFyZHdhcmVCYXNlCi17Ci1wdWJsaWM6Ci0gICAgRGlzcGxheUhhcmR3YXJlQmFzZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlciwKLSAgICAgICAgICAgIHVpbnQzMl90IGRpc3BsYXlJbmRleCk7Ci0KLSAgICB+RGlzcGxheUhhcmR3YXJlQmFzZSgpOwotCi0gICAgdm9pZCBzdGFydFNsZWVwTWFuYWdlbWVudCgpIGNvbnN0OwotCi0gICAgLy8gY29uc29sZSBtYW5hZ2VtZW50Ci0gICAgdm9pZCByZWxlYXNlU2NyZWVuKCkgY29uc3Q7Ci0gICAgdm9pZCBhY3F1aXJlU2NyZWVuKCkgY29uc3Q7Ci0gICAgYm9vbCBpc1NjcmVlbkFjcXVpcmVkKCkgY29uc3Q7Ci0KLSAgICBib29sIGNhbkRyYXcoKSBjb25zdDsKLQotCi1wcml2YXRlOgotICAgIGNsYXNzIERpc3BsYXlFdmVudFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgICAgICB3cDxTdXJmYWNlRmxpbmdlcj4gbUZsaW5nZXI7Ci0gICAgICAgIG11dGFibGUgQmFycmllciBtQmFycmllcjsKLSAgICAgICAgc3RhdHVzX3Qgd2FpdEZvckZiU2xlZXAoKTsKLSAgICAgICAgc3RhdHVzX3Qgd2FpdEZvckZiV2FrZSgpOwotICAgIHB1YmxpYzoKLSAgICAgICAgRGlzcGxheUV2ZW50VGhyZWFkKGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlcik7Ci0gICAgICAgIHZpcnR1YWwgfkRpc3BsYXlFdmVudFRocmVhZCgpOwotICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwotICAgICAgICBzdGF0dXNfdCByZWxlYXNlU2NyZWVuKCkgY29uc3Q7Ci0gICAgICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIH07Ci0KLSAgICBzcDxEaXNwbGF5RXZlbnRUaHJlYWQ+ICBtRGlzcGxheUV2ZW50VGhyZWFkOwotICAgIG11dGFibGUgaW50ICAgICAgICAgICAgIG1TY3JlZW5BY3F1aXJlZDsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0RJU1BMQVlfSEFSRFdBUkVfQkFTRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxN2JmNDMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0KLSNpbmNsdWRlICJMYXllckJhc2UuaCIKLSNpbmNsdWRlICJIV0NvbXBvc2VyLmgiCi0jaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhXQ29tcG9zZXI6OkhXQ29tcG9zZXIoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyKQotICAgIDogbUZsaW5nZXIoZmxpbmdlciksCi0gICAgICBtTW9kdWxlKDApLCBtSHdjKDApLCBtTGlzdCgwKSwgbUNhcGFjaXR5KDApLAotICAgICAgbU51bU9WTGF5ZXJzKDApLCBtTnVtRkJMYXllcnMoMCksCi0gICAgICBtRHB5KEVHTF9OT19ESVNQTEFZKSwgbVN1cihFR0xfTk9fU1VSRkFDRSkKLXsKLSAgICBpbnQgZXJyID0gaHdfZ2V0X21vZHVsZShIV0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbU1vZHVsZSk7Ci0gICAgQUxPR1dfSUYoZXJyLCAiJXMgbW9kdWxlIG5vdCBmb3VuZCIsIEhXQ19IQVJEV0FSRV9NT0RVTEVfSUQpOwotICAgIGlmIChlcnIgPT0gMCkgewotICAgICAgICBlcnIgPSBod2Nfb3BlbihtTW9kdWxlLCAmbUh3Yyk7Ci0gICAgICAgIEFMT0dFX0lGKGVyciwgIiVzIGRldmljZSBmYWlsZWQgdG8gaW5pdGlhbGl6ZSAoJXMpIiwKLSAgICAgICAgICAgICAgICBIV0NfSEFSRFdBUkVfQ09NUE9TRVIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICAgICAgaWYgKGVyciA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobUh3Yy0+cmVnaXN0ZXJQcm9jcykgewotICAgICAgICAgICAgICAgIG1DQkNvbnRleHQuaHdjID0gdGhpczsKLSAgICAgICAgICAgICAgICBtQ0JDb250ZXh0LnByb2NzLmludmFsaWRhdGUgPSAmaG9va19pbnZhbGlkYXRlOwotICAgICAgICAgICAgICAgIG1Id2MtPnJlZ2lzdGVyUHJvY3MobUh3YywgJm1DQkNvbnRleHQucHJvY3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1IV0NvbXBvc2VyOjp+SFdDb21wb3NlcigpIHsKLSAgICBmcmVlKG1MaXN0KTsKLSAgICBpZiAobUh3YykgewotICAgICAgICBod2NfY2xvc2UobUh3Yyk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBIV0NvbXBvc2VyOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Id2MgPyBOT19FUlJPUiA6IE5PX0lOSVQ7Ci19Ci0KLXZvaWQgSFdDb21wb3Nlcjo6aG9va19pbnZhbGlkYXRlKHN0cnVjdCBod2NfcHJvY3MqIHByb2NzKSB7Ci0gICAgcmVpbnRlcnByZXRfY2FzdDxjYl9jb250ZXh0ICo+KHByb2NzKS0+aHdjLT5pbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgSFdDb21wb3Nlcjo6aW52YWxpZGF0ZSgpIHsKLSAgICBtRmxpbmdlci0+cmVwYWludEV2ZXJ5dGhpbmcoKTsKLX0KLQotdm9pZCBIV0NvbXBvc2VyOjpzZXRGcmFtZUJ1ZmZlcihFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXIpIHsKLSAgICBtRHB5ID0gKGh3Y19kaXNwbGF5X3QpZHB5OwotICAgIG1TdXIgPSAoaHdjX3N1cmZhY2VfdClzdXI7Ci19Ci0KLXN0YXR1c190IEhXQ29tcG9zZXI6OmNyZWF0ZVdvcmtMaXN0KHNpemVfdCBudW1MYXllcnMpIHsKLSAgICBpZiAobUh3YykgewotICAgICAgICBpZiAoIW1MaXN0IHx8IG1DYXBhY2l0eSA8IG51bUxheWVycykgewotICAgICAgICAgICAgZnJlZShtTGlzdCk7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihod2NfbGF5ZXJfbGlzdCkgKyBudW1MYXllcnMqc2l6ZW9mKGh3Y19sYXllcl90KTsKLSAgICAgICAgICAgIG1MaXN0ID0gKGh3Y19sYXllcl9saXN0X3QqKW1hbGxvYyhzaXplKTsKLSAgICAgICAgICAgIG1DYXBhY2l0eSA9IG51bUxheWVyczsKLSAgICAgICAgfQotICAgICAgICBtTGlzdC0+ZmxhZ3MgPSBIV0NfR0VPTUVUUllfQ0hBTkdFRDsKLSAgICAgICAgbUxpc3QtPm51bUh3TGF5ZXJzID0gbnVtTGF5ZXJzOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEhXQ29tcG9zZXI6OnByZXBhcmUoKSBjb25zdCB7Ci0gICAgaW50IGVyciA9IG1Id2MtPnByZXBhcmUobUh3YywgbUxpc3QpOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc2l6ZV90IG51bU9WTGF5ZXJzID0gMDsKLSAgICAgICAgc2l6ZV90IG51bUZCTGF5ZXJzID0gMDsKLSAgICAgICAgc2l6ZV90IGNvdW50ID0gbUxpc3QtPm51bUh3TGF5ZXJzOwotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBod2NfbGF5ZXImIGwobUxpc3QtPmh3TGF5ZXJzW2ldKTsKLSAgICAgICAgICAgIGlmIChsLmZsYWdzICYgSFdDX1NLSVBfTEFZRVIpIHsKLSAgICAgICAgICAgICAgICBsLmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAobC5jb21wb3NpdGlvblR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEhXQ19PVkVSTEFZOgotICAgICAgICAgICAgICAgICAgICBudW1PVkxheWVycysrOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEhXQ19GUkFNRUJVRkZFUjoKLSAgICAgICAgICAgICAgICAgICAgbnVtRkJMYXllcnMrKzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbU51bU9WTGF5ZXJzID0gbnVtT1ZMYXllcnM7Ci0gICAgICAgIG1OdW1GQkxheWVycyA9IG51bUZCTGF5ZXJzOwotICAgIH0KLSAgICByZXR1cm4gKHN0YXR1c190KWVycjsKLX0KLQotc2l6ZV90IEhXQ29tcG9zZXI6OmdldExheWVyQ291bnQoaW50IHR5cGUpIGNvbnN0IHsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBIV0NfT1ZFUkxBWToKLSAgICAgICAgICAgIHJldHVybiBtTnVtT1ZMYXllcnM7Ci0gICAgICAgIGNhc2UgSFdDX0ZSQU1FQlVGRkVSOgotICAgICAgICAgICAgcmV0dXJuIG1OdW1GQkxheWVyczsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IEhXQ29tcG9zZXI6OmNvbW1pdCgpIGNvbnN0IHsKLSAgICBpbnQgZXJyID0gbUh3Yy0+c2V0KG1Id2MsIG1EcHksIG1TdXIsIG1MaXN0KTsKLSAgICBpZiAobUxpc3QpIHsKLSAgICAgICAgbUxpc3QtPmZsYWdzICY9IH5IV0NfR0VPTUVUUllfQ0hBTkdFRDsKLSAgICB9Ci0gICAgcmV0dXJuIChzdGF0dXNfdCllcnI7Ci19Ci0KLXN0YXR1c190IEhXQ29tcG9zZXI6OnJlbGVhc2UoKSBjb25zdCB7Ci0gICAgaWYgKG1Id2MpIHsKLSAgICAgICAgaW50IGVyciA9IG1Id2MtPnNldChtSHdjLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIChzdGF0dXNfdCllcnI7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgSFdDb21wb3Nlcjo6ZGlzYWJsZSgpIHsKLSAgICBpZiAobUh3YykgewotICAgICAgICBmcmVlKG1MaXN0KTsKLSAgICAgICAgbUxpc3QgPSBOVUxMOwotICAgICAgICBpbnQgZXJyID0gbUh3Yy0+cHJlcGFyZShtSHdjLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIChzdGF0dXNfdCllcnI7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc2l6ZV90IEhXQ29tcG9zZXI6OmdldE51bUxheWVycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUxpc3QgPyBtTGlzdC0+bnVtSHdMYXllcnMgOiAwOwotfQotCi1od2NfbGF5ZXJfdCogSFdDb21wb3Nlcjo6Z2V0TGF5ZXJzKCkgY29uc3QgewotICAgIHJldHVybiBtTGlzdCA/IG1MaXN0LT5od0xheWVycyA6IDA7Ci19Ci0KLXZvaWQgSFdDb21wb3Nlcjo6ZHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUsCi0gICAgICAgIGNvbnN0IFZlY3Rvcjwgc3A8TGF5ZXJCYXNlPiA+JiB2aXNpYmxlTGF5ZXJzU29ydGVkQnlaKSBjb25zdCB7Ci0gICAgaWYgKG1Id2MgJiYgbUxpc3QpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiSGFyZHdhcmUgQ29tcG9zZXIgc3RhdGU6XG4iKTsKLQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIG51bUh3TGF5ZXJzPSV1LCBmbGFncz0lMDh4XG4iLAotICAgICAgICAgICAgICAgIG1MaXN0LT5udW1Id0xheWVycywgbUxpc3QtPmZsYWdzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKAotICAgICAgICAgICAgICAgICIgICB0eXBlICAgfCAgaGFuZGxlICB8ICAgaGludHMgIHwgICBmbGFncyAgfCB0ciB8IGJsZW5kIHwgIGZvcm1hdCAgfCAgICAgICBzb3VyY2UgY3JvcCAgICAgICAgIHwgICAgICAgICAgIGZyYW1lICAgICAgICAgICBuYW1lIFxuIgotICAgICAgICAgICAgICAgICItLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0rLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICAgIC8vICAgICAgIiBfX19fX19fXyB8IF9fX19fX19fIHwgX19fX19fX18gfCBfX19fX19fXyB8IF9fIHwgX19fX18gfCBfX19fX19fXyB8IFtfX19fXyxfX19fXyxfX19fXyxfX19fX10gfCBbX19fX18sX19fX18sX19fX18sX19fX19dCi0gICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8bUxpc3QtPm51bUh3TGF5ZXJzIDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBod2NfbGF5ZXJfdCYgbChtTGlzdC0+aHdMYXllcnNbaV0pOwotICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiBsYXllcih2aXNpYmxlTGF5ZXJzU29ydGVkQnlaW2ldKTsKLSAgICAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gLTE7Ci0gICAgICAgICAgICBpZiAobGF5ZXItPmdldExheWVyKCkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIobGF5ZXItPmdldExheWVyKCktPmdldEFjdGl2ZUJ1ZmZlcigpKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gYnVmZmVyLT5nZXRQaXhlbEZvcm1hdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICAgICAgICAgIiAlOHMgfCAlMDh4IHwgJTA4eCB8ICUwOHggfCAlMDJ4IHwgJTA1eCB8ICUwOHggfCBbJTVkLCU1ZCwlNWQsJTVkXSB8IFslNWQsJTVkLCU1ZCwlNWRdICVzXG4iLAotICAgICAgICAgICAgICAgICAgICBsLmNvbXBvc2l0aW9uVHlwZSA/ICJPVkVSTEFZIiA6ICJGQiIsCi0gICAgICAgICAgICAgICAgICAgIGludHB0cl90KGwuaGFuZGxlKSwgbC5oaW50cywgbC5mbGFncywgbC50cmFuc2Zvcm0sIGwuYmxlbmRpbmcsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgbC5zb3VyY2VDcm9wLmxlZnQsIGwuc291cmNlQ3JvcC50b3AsIGwuc291cmNlQ3JvcC5yaWdodCwgbC5zb3VyY2VDcm9wLmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgbC5kaXNwbGF5RnJhbWUubGVmdCwgbC5kaXNwbGF5RnJhbWUudG9wLCBsLmRpc3BsYXlGcmFtZS5yaWdodCwgbC5kaXNwbGF5RnJhbWUuYm90dG9tLAotICAgICAgICAgICAgICAgICAgICBsYXllci0+Z2V0TmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobUh3YyAmJiBtSHdjLT5jb21tb24udmVyc2lvbiA+PSAxICYmIG1Id2MtPmR1bXApIHsKLSAgICAgICAgbUh3Yy0+ZHVtcChtSHdjLCBidWZmZXIsIFNJWkUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4ZWJlMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TRl9IV0NPTVBPU0VSX0gKLSNkZWZpbmUgQU5EUk9JRF9TRl9IV0NPTVBPU0VSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvaHdjb21wb3Nlci5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU3RyaW5nODsKLWNsYXNzIFN1cmZhY2VGbGluZ2VyOwotY2xhc3MgTGF5ZXJCYXNlOwotCi1jbGFzcyBIV0NvbXBvc2VyCi17Ci1wdWJsaWM6Ci0KLSAgICBIV0NvbXBvc2VyKGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlcik7Ci0gICAgfkhXQ29tcG9zZXIoKTsKLQotICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgLy8gdGVsbHMgdGhlIEhBTCB3aGF0IHRoZSBmcmFtZWJ1ZmZlciBpcwotICAgIHZvaWQgc2V0RnJhbWVCdWZmZXIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyKTsKLQotICAgIC8vIGNyZWF0ZSBhIHdvcmsgbGlzdCBmb3IgbnVtTGF5ZXJzIGxheWVyCi0gICAgc3RhdHVzX3QgY3JlYXRlV29ya0xpc3Qoc2l6ZV90IG51bUxheWVycyk7Ci0KLSAgICAvLyBBc2tzIHRoZSBIQUwgd2hhdCBpdCBjYW4gZG8KLSAgICBzdGF0dXNfdCBwcmVwYXJlKCkgY29uc3Q7Ci0KLSAgICAvLyBkaXNhYmxlIGh3YyB1bnRpbCBuZXh0IGNyZWF0ZVdvcmtMaXN0Ci0gICAgc3RhdHVzX3QgZGlzYWJsZSgpOwotCi0gICAgLy8gY29tbWl0cyB0aGUgbGlzdAotICAgIHN0YXR1c190IGNvbW1pdCgpIGNvbnN0OwotCi0gICAgLy8gcmVsZWFzZSBoYXJkd2FyZSByZXNvdXJjZXMKLSAgICBzdGF0dXNfdCByZWxlYXNlKCkgY29uc3Q7Ci0KLSAgICBzaXplX3QgZ2V0TnVtTGF5ZXJzKCkgY29uc3Q7Ci0gICAgaHdjX2xheWVyX3QqIGdldExheWVycygpIGNvbnN0OwotCi0gICAgLy8gdXBkYXRlZCBpbiBwcmVhcHJlKCkKLSAgICBzaXplX3QgZ2V0TGF5ZXJDb3VudChpbnQgdHlwZSkgY29uc3Q7Ci0KLSAgICAvLyBmb3IgZGVidWdnaW5nCi0gICAgdm9pZCBkdW1wKFN0cmluZzgmIG91dCwgY2hhciogc2NyYXRjaCwgc2l6ZV90IFNJWkUsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8IHNwPExheWVyQmFzZT4gPiYgdmlzaWJsZUxheWVyc1NvcnRlZEJ5WikgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IGNiX2NvbnRleHQgewotICAgICAgICBod2NfcHJvY3NfdCBwcm9jczsKLSAgICAgICAgSFdDb21wb3NlciogaHdjOwotICAgIH07Ci0gICAgc3RhdGljIHZvaWQgaG9va19pbnZhbGlkYXRlKHN0cnVjdCBod2NfcHJvY3MqIHByb2NzKTsKLSAgICB2b2lkIGludmFsaWRhdGUoKTsKLQotICAgIHNwPFN1cmZhY2VGbGluZ2VyPiAgICAgIG1GbGluZ2VyOwotICAgIGh3X21vZHVsZV90IGNvbnN0KiAgICAgIG1Nb2R1bGU7Ci0gICAgaHdjX2NvbXBvc2VyX2RldmljZV90KiAgbUh3YzsKLSAgICBod2NfbGF5ZXJfbGlzdF90KiAgICAgICBtTGlzdDsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtQ2FwYWNpdHk7Ci0gICAgbXV0YWJsZSBzaXplX3QgICAgICAgICAgbU51bU9WTGF5ZXJzOwotICAgIG11dGFibGUgc2l6ZV90ICAgICAgICAgIG1OdW1GQkxheWVyczsKLSAgICBod2NfZGlzcGxheV90ICAgICAgICAgICBtRHB5OwotICAgIGh3Y19zdXJmYWNlX3QgICAgICAgICAgIG1TdXI7Ci0gICAgY2JfY29udGV4dCAgICAgICAgICAgICAgbUNCQ29udGV4dDsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9TRl9IV0NPTVBPU0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9WU3luY0JhcnJpZXIuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL1ZTeW5jQmFycmllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4N2RhMjAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL1ZTeW5jQmFycmllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0KLSNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvVlN5bmNCYXJyaWVyLmgiCi0KLSNpZm5kZWYgRkJJT19XQUlURk9SVlNZTkMKLSNkZWZpbmUgRkJJT19XQUlURk9SVlNZTkMgICBfSU9XKCdGJywgMHgyMCwgX191MzIpCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVZTeW5jQmFycmllcjo6VlN5bmNCYXJyaWVyKCkgOiBtRmQoLUVJTlZBTCkgewotI2lmIEhBU19XQUlURk9SVlNZTkMKLSAgICBtRmQgPSBvcGVuKCIvZGV2L2dyYXBoaWNzL2ZiMCIsIE9fUkRXUik7Ci0gICAgaWYgKG1GZCA8IDApIHsKLSAgICAgICAgbUZkID0gLWVycm5vOwotICAgIH0KLSAgICAvLyB0cnkgdG8gc2VlIGlmIEZCSU9fV0FJVEZPUlZTWU5DIGlzIHN1cHBvcnRlZAotICAgIHVpbnQzMl90IGNydCA9IDA7Ci0gICAgaW50IGVyciA9IGlvY3RsKG1GZCwgRkJJT19XQUlURk9SVlNZTkMsICZjcnQpOwotICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgIGNsb3NlKG1GZCk7Ci0gICAgICAgIG1GZCA9IC1FSU5WQUw7Ci0gICAgfQotI2VuZGlmCi19Ci0KLVZTeW5jQmFycmllcjo6flZTeW5jQmFycmllcigpIHsKLSAgICBpZiAobUZkID49IDApIHsKLSAgICAgICAgY2xvc2UobUZkKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZTeW5jQmFycmllcjo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtRmQgPCAwID8gbUZkIDogc3RhdHVzX3QoTk9fRVJST1IpOwotfQotCi0vLyB0aGlzIG11c3QgYmUgdGhyZWFkLXNhZmUKLXN0YXR1c190IFZTeW5jQmFycmllcjo6d2FpdChuc2Vjc190KiB0aW1lc3RhbXApIGNvbnN0IHsKLSAgICBpZiAobUZkIDwgMCkgewotICAgICAgICByZXR1cm4gbUZkOwotICAgIH0KLQotICAgIGludCBlcnI7Ci0gICAgdWludDMyX3QgY3J0ID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIGVyciA9IGlvY3RsKG1GZCwgRkJJT19XQUlURk9SVlNZTkMsICZjcnQpOwotICAgIH0gd2hpbGUgKGVycjwwICYmIGVycm5vPT1FSU5UUik7Ci0gICAgaWYgKGVyciA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICB9Ci0gICAgLy8gaWRlYWxseSB0aGlzIHdvdWxkIGNvbWUgZnJvbSB0aGUgZHJpdmVyCi0gICAgdGltZXN0YW1wWzBdID0gc3lzdGVtVGltZSgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL1ZTeW5jQmFycmllci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL1ZTeW5jQmFycmllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzMyOTUwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9WU3luY0JhcnJpZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU1VSRkFDRV9GTElOR0VSX1ZTWU5DQkFSUklFUl9IXwotI2RlZmluZSBBTkRST0lEX1NVUkZBQ0VfRkxJTkdFUl9WU1lOQ0JBUlJJRVJfSF8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBWU3luY0JhcnJpZXIgewotICAgIGludCBtRmQ7Ci1wdWJsaWM6Ci0gICAgVlN5bmNCYXJyaWVyKCk7Ci0gICAgflZTeW5jQmFycmllcigpOwotICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIHN0YXR1c190IHdhaXQobnNlY3NfdCogdGltZXN0YW1wKSBjb25zdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8qIEFORFJPSURfU1VSRkFDRV9GTElOR0VSX1ZTWU5DQkFSUklFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRXZlbnRUaHJlYWQuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRXZlbnRUaHJlYWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzA0NWQ3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0V2ZW50VGhyZWFkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Z3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8Z3VpL0Rpc3BsYXlFdmVudFJlY2VpdmVyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi0jaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oIgotI2luY2x1ZGUgIkRpc3BsYXlFdmVudENvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJFdmVudFRocmVhZC5oIgotI2luY2x1ZGUgIlN1cmZhY2VGbGluZ2VyLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FdmVudFRocmVhZDo6RXZlbnRUaHJlYWQoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyKQotICAgIDogbUZsaW5nZXIoZmxpbmdlciksCi0gICAgICBtSHcoZmxpbmdlci0+Z3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKSwKLSAgICAgIG1MYXN0VlN5bmNUaW1lc3RhbXAoMCksCi0gICAgICBtRGVsaXZlcmVkRXZlbnRzKDApCi17Ci19Ci0KLXZvaWQgRXZlbnRUaHJlYWQ6Om9uRmlyc3RSZWYoKSB7Ci0gICAgcnVuKCJFdmVudFRocmVhZCIsIFBSSU9SSVRZX1VSR0VOVF9ESVNQTEFZICsgUFJJT1JJVFlfTU9SRV9GQVZPUkFCTEUpOwotfQotCi1zcDxEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiBFdmVudFRocmVhZDo6Y3JlYXRlRXZlbnRDb25uZWN0aW9uKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgRGlzcGxheUV2ZW50Q29ubmVjdGlvbihjb25zdF9jYXN0PEV2ZW50VGhyZWFkKj4odGhpcykpOwotfQotCi1uc2Vjc190IEV2ZW50VGhyZWFkOjpnZXRMYXN0VlN5bmNUaW1lc3RhbXAoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUxhc3RWU3luY1RpbWVzdGFtcDsKLX0KLQotbnNlY3NfdCBFdmVudFRocmVhZDo6Z2V0VlN5bmNQZXJpb2QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Idy5nZXRSZWZyZXNoUGVyaW9kKCk7Ci0KLX0KLQotc3RhdHVzX3QgRXZlbnRUaHJlYWQ6OnJlZ2lzdGVyRGlzcGxheUV2ZW50Q29ubmVjdGlvbigKLSAgICAgICAgY29uc3Qgc3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4mIGNvbm5lY3Rpb24pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIENvbm5lY3Rpb25JbmZvIGluZm87Ci0gICAgbURpc3BsYXlFdmVudENvbm5lY3Rpb25zLmFkZChjb25uZWN0aW9uLCBpbmZvKTsKLSAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgRXZlbnRUaHJlYWQ6OnVucmVnaXN0ZXJEaXNwbGF5RXZlbnRDb25uZWN0aW9uKAotICAgICAgICBjb25zdCB3cDxEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiYgY29ubmVjdGlvbikgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbURpc3BsYXlFdmVudENvbm5lY3Rpb25zLnJlbW92ZUl0ZW0oY29ubmVjdGlvbik7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgRXZlbnRUaHJlYWQ6OnJlbW92ZURpc3BsYXlFdmVudENvbm5lY3Rpb24oCi0gICAgICAgIGNvbnN0IHdwPERpc3BsYXlFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtRGlzcGxheUV2ZW50Q29ubmVjdGlvbnMucmVtb3ZlSXRlbShjb25uZWN0aW9uKTsKLX0KLQotRXZlbnRUaHJlYWQ6OkNvbm5lY3Rpb25JbmZvKiBFdmVudFRocmVhZDo6Z2V0Q29ubmVjdGlvbkluZm9Mb2NrZWQoCi0gICAgICAgIGNvbnN0IHdwPERpc3BsYXlFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKSB7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1EaXNwbGF5RXZlbnRDb25uZWN0aW9ucy5pbmRleE9mS2V5KGNvbm5lY3Rpb24pOwotICAgIGlmIChpbmRleCA8IDApIHJldHVybiBOVUxMOwotICAgIHJldHVybiAmbURpc3BsYXlFdmVudENvbm5lY3Rpb25zLmVkaXRWYWx1ZUF0KGluZGV4KTsKLX0KLQotdm9pZCBFdmVudFRocmVhZDo6c2V0VnN5bmNSYXRlKHVpbnQzMl90IGNvdW50LAotICAgICAgICBjb25zdCB3cDxEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiYgY29ubmVjdGlvbikgewotICAgIGlmIChpbnQzMl90KGNvdW50KSA+PSAwKSB7IC8vIHNlcnZlciBtdXN0IHByb3RlY3QgYWdhaW5zdCBiYWQgcGFyYW1zCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIENvbm5lY3Rpb25JbmZvKiBpbmZvID0gZ2V0Q29ubmVjdGlvbkluZm9Mb2NrZWQoY29ubmVjdGlvbik7Ci0gICAgICAgIGlmIChpbmZvKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IG5ld19jb3VudCA9IChjb3VudCA9PSAwKSA/IC0xIDogY291bnQ7Ci0gICAgICAgICAgICBpZiAoaW5mby0+Y291bnQgIT0gbmV3X2NvdW50KSB7Ci0gICAgICAgICAgICAgICAgaW5mby0+Y291bnQgPSBuZXdfY291bnQ7Ci0gICAgICAgICAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBFdmVudFRocmVhZDo6cmVxdWVzdE5leHRWc3luYygKLSAgICAgICAgY29uc3Qgd3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4mIGNvbm5lY3Rpb24pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIENvbm5lY3Rpb25JbmZvKiBpbmZvID0gZ2V0Q29ubmVjdGlvbkluZm9Mb2NrZWQoY29ubmVjdGlvbik7Ci0gICAgaWYgKGluZm8gJiYgaW5mby0+Y291bnQgPCAwKSB7Ci0gICAgICAgIGluZm8tPmNvdW50ID0gMDsKLSAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICB9Ci19Ci0KLWJvb2wgRXZlbnRUaHJlYWQ6OnRocmVhZExvb3AoKSB7Ci0KLSAgICBuc2Vjc190IHRpbWVzdGFtcDsKLSAgICBEaXNwbGF5RXZlbnRSZWNlaXZlcjo6RXZlbnQgdnN5bmM7Ci0gICAgVmVjdG9yPCB3cDxEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiA+IGRpc3BsYXlFdmVudENvbm5lY3Rpb25zOwotCi0gICAgeyAvLyBzY29wZSBmb3IgdGhlIGxvY2sKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgLy8gc2VlIGlmIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIFZTWU5DIGF0IGFsbAotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGJvb2wgd2FpdEZvck5leHRWc3luYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IG1EaXNwbGF5RXZlbnRDb25uZWN0aW9ucy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25uZWN0aW9uSW5mbyYgaW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGlzcGxheUV2ZW50Q29ubmVjdGlvbnMudmFsdWVBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmNvdW50ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IGxlYXN0IG9uZSBjb250aW51b3VzIG1vZGUgb3IgYWN0aXZlIG9uZS1zaG90IGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICB3YWl0Rm9yTmV4dFZzeW5jID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHdhaXRGb3JOZXh0VnN5bmMpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICAgICAgICAgIH0gd2hpbGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIGF0IGxlYXN0IG9uZSBsaXN0ZW5lciByZXF1ZXN0ZWQgVlNZTkMKLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgdGltZXN0YW1wID0gbUh3LndhaXRGb3JSZWZyZXNoKCk7Ci0gICAgICAgICAgICBBVFJBQ0VfSU5UKCJWU1lOQyIsIG1EZWxpdmVyZWRFdmVudHMmMSk7Ci0gICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICBtRGVsaXZlcmVkRXZlbnRzKys7Ci0gICAgICAgICAgICBtTGFzdFZTeW5jVGltZXN0YW1wID0gdGltZXN0YW1wOwotCi0gICAgICAgICAgICAvLyBub3cgc2VlIGlmIHdlIHN0aWxsIG5lZWQgdG8gcmVwb3J0IHRoaXMgVlNZTkMgZXZlbnQKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IG1EaXNwbGF5RXZlbnRDb25uZWN0aW9ucy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCByZXBvcnRWc3luYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3Rpb25JbmZvJiBpbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgbURpc3BsYXlFdmVudENvbm5lY3Rpb25zLnZhbHVlQXQoaSkpOwotICAgICAgICAgICAgICAgIGlmIChpbmZvLmNvdW50ID49IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uY291bnQ9PTEgfHwgKG1EZWxpdmVyZWRFdmVudHMgJSBpbmZvLmNvdW50KSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51b3VzIGV2ZW50LCBhbmQgdGltZSB0byByZXBvcnQgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFZzeW5jID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby5jb3VudCA+PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSW5mbyYgaW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGlzcGxheUV2ZW50Q29ubmVjdGlvbnMuZWRpdFZhbHVlQXQoaSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5jb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJlZCB0aGlzIHRpbWUgYXJvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRWc3luYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5mby5jb3VudC0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVwb3J0VnN5bmMpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheUV2ZW50Q29ubmVjdGlvbnMuYWRkKG1EaXNwbGF5RXZlbnRDb25uZWN0aW9ucy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghZGlzcGxheUV2ZW50Q29ubmVjdGlvbnMuc2l6ZSgpKTsKLQotICAgICAgICAvLyBkaXNwYXRjaCB2c3luYyBldmVudHMgdG8gbGlzdGVuZXJzLi4uCi0gICAgICAgIHZzeW5jLmhlYWRlci50eXBlID0gRGlzcGxheUV2ZW50UmVjZWl2ZXI6OkRJU1BMQVlfRVZFTlRfVlNZTkM7Ci0gICAgICAgIHZzeW5jLmhlYWRlci50aW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0gICAgICAgIHZzeW5jLnZzeW5jLmNvdW50ID0gbURlbGl2ZXJlZEV2ZW50czsKLSAgICB9Ci0KLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBkaXNwbGF5RXZlbnRDb25uZWN0aW9ucy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBzcDxEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiBjb25uKGRpc3BsYXlFdmVudENvbm5lY3Rpb25zW2ldLnByb21vdGUoKSk7Ci0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgY29ubmVjdGlvbiBkaWRuJ3QgZGllCi0gICAgICAgIGlmIChjb25uICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNvbm4tPnBvc3RFdmVudCh2c3luYyk7Ci0gICAgICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4gfHwgZXJyID09IC1FV09VTERCTE9DSykgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkZXN0aW5hdGlvbiBkb2Vzbid0IGFjY2VwdCBldmVudHMgYW55bW9yZSwgaXQncyBwcm9iYWJseQotICAgICAgICAgICAgICAgIC8vIGZ1bGwuIEZvciBub3csIHdlIGp1c3QgZHJvcCB0aGUgZXZlbnRzIG9uIHRoZSBmbG9vci4KLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgc29tZSBldmVudHMgY2Fubm90IGJlIGRyb3BwZWQgYW5kIHdvdWxkIGhhdmUgdG8gYmUKLSAgICAgICAgICAgICAgICAvLyByZS1zZW50IGxhdGVyLiBSaWdodC1ub3cgd2UgZG9uJ3QgaGF2ZSB0aGUgYWJpbGl0eSB0byBkbwotICAgICAgICAgICAgICAgIC8vIHRoaXMsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBmb3IgVlNZTkMuCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYW55IG90aGVyIGVycm9yIG9uIHRoZSBwaXBlIGFzIGZhdGFsLiB0aGUgb25seQotICAgICAgICAgICAgICAgIC8vIHJlYXNvbmFibGUgdGhpbmcgdG8gZG8gaXMgdG8gY2xlYW4tdXAgdGhpcyBjb25uZWN0aW9uLgotICAgICAgICAgICAgICAgIC8vIFRoZSBtb3N0IGNvbW1vbiBlcnJvciB3ZSdsbCBnZXQgaGVyZSBpcyAtRVBJUEUuCi0gICAgICAgICAgICAgICAgcmVtb3ZlRGlzcGxheUV2ZW50Q29ubmVjdGlvbihkaXNwbGF5RXZlbnRDb25uZWN0aW9uc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBzb21laG93IHRoZSBjb25uZWN0aW9uIGlzIGRlYWQsIGJ1dCB3ZSBzdGlsbCBoYXZlIGl0IGluIG91ciBsaXN0Ci0gICAgICAgICAgICAvLyBqdXN0IGNsZWFuIHRoZSBsaXN0LgotICAgICAgICAgICAgcmVtb3ZlRGlzcGxheUV2ZW50Q29ubmVjdGlvbihkaXNwbGF5RXZlbnRDb25uZWN0aW9uc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjbGVhciBhbGwgb3VyIHJlZmVyZW5jZXMgd2l0aG91dCBob2xkaW5nIG1Mb2NrCi0gICAgZGlzcGxheUV2ZW50Q29ubmVjdGlvbnMuY2xlYXIoKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0dXNfdCBFdmVudFRocmVhZDo6cmVhZHlUb1J1bigpIHsKLSAgICBBTE9HSSgiRXZlbnRUaHJlYWQgcmVhZHkgdG8gcnVuLiIpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBFdmVudFRocmVhZDo6ZHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJlc3VsdC5hcHBlbmQoIlZTWU5DIHN0YXRlOlxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBudW1MaXN0ZW5lcnM9JXUsIGV2ZW50cy1kZWxpdmVyZWQ6ICV1XG4iLAotICAgICAgICAgICAgbURpc3BsYXlFdmVudENvbm5lY3Rpb25zLnNpemUoKSwgbURlbGl2ZXJlZEV2ZW50cyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0V2ZW50VGhyZWFkLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9FdmVudFRocmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTMwNzFlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0V2ZW50VGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TVVJGQUNFX0ZMSU5HRVJfRVZFTlRfVEhSRUFEX0gKLSNkZWZpbmUgQU5EUk9JRF9TVVJGQUNFX0ZMSU5HRVJfRVZFTlRfVEhSRUFEX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Z3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLQotI2luY2x1ZGUgIkRpc3BsYXlFdmVudENvbm5lY3Rpb24uaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFN1cmZhY2VGbGluZ2VyOwotY2xhc3MgRGlzcGxheUhhcmR3YXJlOwotY2xhc3MgRGlzcGxheUV2ZW50Q29ubmVjdGlvbjsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEV2ZW50VGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgZnJpZW5kIGNsYXNzIERpc3BsYXlFdmVudENvbm5lY3Rpb247Ci0KLXB1YmxpYzoKLSAgICBFdmVudFRocmVhZChjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIpOwotCi0gICAgc3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4gY3JlYXRlRXZlbnRDb25uZWN0aW9uKCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCByZWdpc3RlckRpc3BsYXlFdmVudENvbm5lY3Rpb24oCi0gICAgICAgICAgICBjb25zdCBzcDxEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiYgY29ubmVjdGlvbik7Ci0KLSAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyRGlzcGxheUV2ZW50Q29ubmVjdGlvbigKLSAgICAgICAgICAgIGNvbnN0IHdwPERpc3BsYXlFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKTsKLQotICAgIHZvaWQgc2V0VnN5bmNSYXRlKHVpbnQzMl90IGNvdW50LAotICAgICAgICAgICAgY29uc3Qgd3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4mIGNvbm5lY3Rpb24pOwotCi0gICAgdm9pZCByZXF1ZXN0TmV4dFZzeW5jKGNvbnN0IHdwPERpc3BsYXlFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKTsKLQotICAgIG5zZWNzX3QgZ2V0TGFzdFZTeW5jVGltZXN0YW1wKCkgY29uc3Q7Ci0KLSAgICBuc2Vjc190IGdldFZTeW5jUGVyaW9kKCkgY29uc3Q7Ci0KLSAgICB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKLQotICAgIHN0cnVjdCBDb25uZWN0aW9uSW5mbyB7Ci0gICAgICAgIENvbm5lY3Rpb25JbmZvKCkgOiBjb3VudCgtMSkgeyB9Ci0KLSAgICAgICAgLy8gY291bnQgPj0gMSA6IGNvbnRpbnVvdXMgZXZlbnQuIGNvdW50IGlzIHRoZSB2c3luYyByYXRlCi0gICAgICAgIC8vIGNvdW50ID09IDAgOiBvbmUtc2hvdCBldmVudCB0aGF0IGhhcyBub3QgZmlyZWQKLSAgICAgICAgLy8gY291bnQgPT0tMSA6IG9uZS1zaG90IGV2ZW50IHRoYXQgZmlyZWQgdGhpcyByb3VuZCAvIGRpc2FibGVkCi0gICAgICAgIC8vIGNvdW50ID09LTIgOiBvbmUtc2hvdCBldmVudCB0aGF0IGZpcmVkIHRoZSByb3VuZCBiZWZvcmUKLSAgICAgICAgaW50MzJfdCBjb3VudDsKLSAgICB9OwotCi0gICAgdm9pZCByZW1vdmVEaXNwbGF5RXZlbnRDb25uZWN0aW9uKAotICAgICAgICAgICAgY29uc3Qgd3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4mIGNvbm5lY3Rpb24pOwotCi0gICAgQ29ubmVjdGlvbkluZm8qIGdldENvbm5lY3Rpb25JbmZvTG9ja2VkKAotICAgICAgICAgICAgY29uc3Qgd3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4mIGNvbm5lY3Rpb24pOwotCi0gICAgLy8gY29uc3RhbnRzCi0gICAgc3A8U3VyZmFjZUZsaW5nZXI+IG1GbGluZ2VyOwotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgbUh3OwotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBtdXRhYmxlIENvbmRpdGlvbiBtQ29uZGl0aW9uOwotCi0gICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCi0gICAgS2V5ZWRWZWN0b3I8IHdwPERpc3BsYXlFdmVudENvbm5lY3Rpb24+LCBDb25uZWN0aW9uSW5mbyA+IG1EaXNwbGF5RXZlbnRDb25uZWN0aW9uczsKLSAgICBuc2Vjc190IG1MYXN0VlN5bmNUaW1lc3RhbXA7Ci0KLSAgICAvLyBtYWluIHRocmVhZCBvbmx5Ci0gICAgc2l6ZV90IG1EZWxpdmVyZWRFdmVudHM7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvKiBBTkRST0lEX1NVUkZBQ0VfRkxJTkdFUl9FVkVOVF9USFJFQURfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvR0xFeHRlbnNpb25zLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0dMRXh0ZW5zaW9ucy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MzEyMmQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvR0xFeHRlbnNpb25zLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJHTEV4dGVuc2lvbnMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUFORFJPSURfU0lOR0xFVE9OX1NUQVRJQ19JTlNUQU5DRSggR0xFeHRlbnNpb25zICkKLQotR0xFeHRlbnNpb25zOjpHTEV4dGVuc2lvbnMoKQotICAgIDogbUhhdmVUZXh0dXJlRXh0ZXJuYWwoZmFsc2UpLAotICAgICAgbUhhdmVOcG90KGZhbHNlKSwKLSAgICAgIG1IYXZlRGlyZWN0VGV4dHVyZShmYWxzZSkKLXsKLX0KLQotdm9pZCBHTEV4dGVuc2lvbnM6OmluaXRXaXRoR0xTdHJpbmdzKAotICAgICAgICBHTHVieXRlIGNvbnN0KiB2ZW5kb3IsCi0gICAgICAgIEdMdWJ5dGUgY29uc3QqIHJlbmRlcmVyLAotICAgICAgICBHTHVieXRlIGNvbnN0KiB2ZXJzaW9uLAotICAgICAgICBHTHVieXRlIGNvbnN0KiBleHRlbnNpb25zLAotICAgICAgICBjaGFyIGNvbnN0KiBlZ2xfdmVuZG9yLAotICAgICAgICBjaGFyIGNvbnN0KiBlZ2xfdmVyc2lvbiwKLSAgICAgICAgY2hhciBjb25zdCogZWdsX2V4dGVuc2lvbnMpCi17Ci0gICAgbVZlbmRvciAgICAgPSAoY2hhciBjb25zdCopdmVuZG9yOwotICAgIG1SZW5kZXJlciAgID0gKGNoYXIgY29uc3QqKXJlbmRlcmVyOwotICAgIG1WZXJzaW9uICAgID0gKGNoYXIgY29uc3QqKXZlcnNpb247Ci0gICAgbUV4dGVuc2lvbnMgPSAoY2hhciBjb25zdCopZXh0ZW5zaW9uczsKLSAgICBtRWdsVmVuZG9yICAgICA9IGVnbF92ZW5kb3I7Ci0gICAgbUVnbFZlcnNpb24gICAgPSBlZ2xfdmVyc2lvbjsKLSAgICBtRWdsRXh0ZW5zaW9ucyA9IGVnbF9leHRlbnNpb25zOwotCi0gICAgY2hhciBjb25zdCogY3VyciA9IChjaGFyIGNvbnN0KilleHRlbnNpb25zOwotICAgIGNoYXIgY29uc3QqIGhlYWQgPSBjdXJyOwotICAgIGRvIHsKLSAgICAgICAgaGVhZCA9IHN0cmNocihjdXJyLCAnICcpOwotICAgICAgICBTdHJpbmc4IHMoY3VyciwgaGVhZCA/IGhlYWQtY3VyciA6IHN0cmxlbihjdXJyKSk7Ci0gICAgICAgIGlmIChzLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBtRXh0ZW5zaW9uTGlzdC5hZGQocyk7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyciA9IGhlYWQrMTsKLSAgICB9IHdoaWxlIChoZWFkKTsKLQotICAgIGN1cnIgPSBlZ2xfZXh0ZW5zaW9uczsKLSAgICBoZWFkID0gY3VycjsKLSAgICBkbyB7Ci0gICAgICAgIGhlYWQgPSBzdHJjaHIoY3VyciwgJyAnKTsKLSAgICAgICAgU3RyaW5nOCBzKGN1cnIsIGhlYWQgPyBoZWFkLWN1cnIgOiBzdHJsZW4oY3VycikpOwotICAgICAgICBpZiAocy5sZW5ndGgoKSkgewotICAgICAgICAgICAgbUV4dGVuc2lvbkxpc3QuYWRkKHMpOwotICAgICAgICB9Ci0gICAgICAgIGN1cnIgPSBoZWFkKzE7Ci0gICAgfSB3aGlsZSAoaGVhZCk7Ci0KLSNpZmRlZiBFR0xfQU5EUk9JRF9pbWFnZV9uYXRpdmVfYnVmZmVyCi0gICAgaWYgKGhhc0V4dGVuc2lvbigiR0xfT0VTX0VHTF9pbWFnZSIpICYmCi0gICAgICAgIChoYXNFeHRlbnNpb24oIkVHTF9LSFJfaW1hZ2VfYmFzZSIpIHx8IGhhc0V4dGVuc2lvbigiRUdMX0tIUl9pbWFnZSIpKSAmJgotICAgICAgICBoYXNFeHRlbnNpb24oIkVHTF9BTkRST0lEX2ltYWdlX25hdGl2ZV9idWZmZXIiKSkKLSAgICB7Ci0gICAgICAgIG1IYXZlRGlyZWN0VGV4dHVyZSA9IHRydWU7Ci0gICAgfQotI2Vsc2UKLSN3YXJuaW5nICJFR0xfQU5EUk9JRF9pbWFnZV9uYXRpdmVfYnVmZmVyIG5vdCBzdXBwb3J0ZWQiCi0jZW5kaWYKLQotICAgIGlmIChoYXNFeHRlbnNpb24oIkdMX0FSQl90ZXh0dXJlX25vbl9wb3dlcl9vZl90d28iKSkgewotICAgICAgICBtSGF2ZU5wb3QgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChoYXNFeHRlbnNpb24oIkdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwiKSkgewotICAgICAgICBtSGF2ZVRleHR1cmVFeHRlcm5hbCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChzdHJzdHIobVJlbmRlcmVyLnN0cmluZygpLCAiQWRyZW5vIikpIHsKLSAgICAgICAgLy8gaGFjayBmb3IgQWRyZW5vIDIwMAotICAgICAgICBtSGF2ZVRleHR1cmVFeHRlcm5hbCA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGhhc0V4dGVuc2lvbigiR0xfT0VTX2ZyYW1lYnVmZmVyX29iamVjdCIpKSB7Ci0gICAgICAgIG1IYXZlRnJhbWVidWZmZXJPYmplY3QgPSB0cnVlOwotICAgIH0KLX0KLQotYm9vbCBHTEV4dGVuc2lvbnM6Omhhc0V4dGVuc2lvbihjaGFyIGNvbnN0KiBleHRlbnNpb24pIGNvbnN0Ci17Ci0gICAgY29uc3QgU3RyaW5nOCBzKGV4dGVuc2lvbik7Ci0gICAgcmV0dXJuIG1FeHRlbnNpb25MaXN0LmluZGV4T2YocykgPj0gMDsKLX0KLQotY2hhciBjb25zdCogR0xFeHRlbnNpb25zOjpnZXRWZW5kb3IoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1WZW5kb3Iuc3RyaW5nKCk7Ci19Ci0KLWNoYXIgY29uc3QqIEdMRXh0ZW5zaW9uczo6Z2V0UmVuZGVyZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SZW5kZXJlci5zdHJpbmcoKTsKLX0KLQotY2hhciBjb25zdCogR0xFeHRlbnNpb25zOjpnZXRWZXJzaW9uKCkgY29uc3QgewotICAgIHJldHVybiBtVmVyc2lvbi5zdHJpbmcoKTsKLX0KLQotY2hhciBjb25zdCogR0xFeHRlbnNpb25zOjpnZXRFeHRlbnNpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FeHRlbnNpb25zLnN0cmluZygpOwotfQotCi1jaGFyIGNvbnN0KiBHTEV4dGVuc2lvbnM6OmdldEVnbFZlbmRvcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbUVnbFZlbmRvci5zdHJpbmcoKTsKLX0KLQotY2hhciBjb25zdCogR0xFeHRlbnNpb25zOjpnZXRFZ2xWZXJzaW9uKCkgY29uc3QgewotICAgIHJldHVybiBtRWdsVmVyc2lvbi5zdHJpbmcoKTsKLX0KLQotY2hhciBjb25zdCogR0xFeHRlbnNpb25zOjpnZXRFZ2xFeHRlbnNpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FZ2xFeHRlbnNpb25zLnN0cmluZygpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0dMRXh0ZW5zaW9ucy5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvR0xFeHRlbnNpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NmM2NmEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvR0xFeHRlbnNpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NGX0dMRVhURU5TSU9OX0gKLSNkZWZpbmUgQU5EUk9JRF9TRl9HTEVYVEVOU0lPTl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEdMRXh0ZW5zaW9ucyA6IHB1YmxpYyBTaW5nbGV0b248R0xFeHRlbnNpb25zPgotewotICAgIGZyaWVuZCBjbGFzcyBTaW5nbGV0b248R0xFeHRlbnNpb25zPjsKLQotICAgIGJvb2wgbUhhdmVUZXh0dXJlRXh0ZXJuYWwgICA6IDE7Ci0gICAgYm9vbCBtSGF2ZU5wb3QgICAgICAgICAgICAgIDogMTsKLSAgICBib29sIG1IYXZlRGlyZWN0VGV4dHVyZSAgICAgOiAxOwotICAgIGJvb2wgbUhhdmVGcmFtZWJ1ZmZlck9iamVjdCA6IDE7Ci0KLSAgICBTdHJpbmc4IG1WZW5kb3I7Ci0gICAgU3RyaW5nOCBtUmVuZGVyZXI7Ci0gICAgU3RyaW5nOCBtVmVyc2lvbjsKLSAgICBTdHJpbmc4IG1FeHRlbnNpb25zOwotICAgIFN0cmluZzggbUVnbFZlbmRvcjsKLSAgICBTdHJpbmc4IG1FZ2xWZXJzaW9uOwotICAgIFN0cmluZzggbUVnbEV4dGVuc2lvbnM7Ci0gICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IG1FeHRlbnNpb25MaXN0OwotCi0gICAgR0xFeHRlbnNpb25zKGNvbnN0IEdMRXh0ZW5zaW9ucyYpOwotICAgIEdMRXh0ZW5zaW9ucyYgb3BlcmF0b3IgPSAoY29uc3QgR0xFeHRlbnNpb25zJik7Ci0KLXByb3RlY3RlZDoKLSAgICBHTEV4dGVuc2lvbnMoKTsKLQotcHVibGljOgotICAgIGlubGluZSBib29sIGhhdmVUZXh0dXJlRXh0ZXJuYWwoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSGF2ZVRleHR1cmVFeHRlcm5hbDsKLSAgICB9Ci0gICAgaW5saW5lIGJvb2wgaGF2ZU5wb3QoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSGF2ZU5wb3Q7Ci0gICAgfQotICAgIGlubGluZSBib29sIGhhdmVEaXJlY3RUZXh0dXJlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUhhdmVEaXJlY3RUZXh0dXJlOwotICAgIH0KLQotICAgIGlubGluZSBib29sIGhhdmVGcmFtZWJ1ZmZlck9iamVjdCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1IYXZlRnJhbWVidWZmZXJPYmplY3Q7Ci0gICAgfQotCi0gICAgdm9pZCBpbml0V2l0aEdMU3RyaW5ncygKLSAgICAgICAgICAgIEdMdWJ5dGUgY29uc3QqIHZlbmRvciwKLSAgICAgICAgICAgIEdMdWJ5dGUgY29uc3QqIHJlbmRlcmVyLAotICAgICAgICAgICAgR0x1Ynl0ZSBjb25zdCogdmVyc2lvbiwKLSAgICAgICAgICAgIEdMdWJ5dGUgY29uc3QqIGV4dGVuc2lvbnMsCi0gICAgICAgICAgICBjaGFyIGNvbnN0KiBlZ2xfdmVuZG9yLAotICAgICAgICAgICAgY2hhciBjb25zdCogZWdsX3ZlcnNpb24sCi0gICAgICAgICAgICBjaGFyIGNvbnN0KiBlZ2xfZXh0ZW5zaW9ucyk7Ci0KLSAgICBjaGFyIGNvbnN0KiBnZXRWZW5kb3IoKSBjb25zdDsKLSAgICBjaGFyIGNvbnN0KiBnZXRSZW5kZXJlcigpIGNvbnN0OwotICAgIGNoYXIgY29uc3QqIGdldFZlcnNpb24oKSBjb25zdDsKLSAgICBjaGFyIGNvbnN0KiBnZXRFeHRlbnNpb24oKSBjb25zdDsKLQotICAgIGNoYXIgY29uc3QqIGdldEVnbFZlbmRvcigpIGNvbnN0OwotICAgIGNoYXIgY29uc3QqIGdldEVnbFZlcnNpb24oKSBjb25zdDsKLSAgICBjaGFyIGNvbnN0KiBnZXRFZ2xFeHRlbnNpb24oKSBjb25zdDsKLQotICAgIGJvb2wgaGFzRXh0ZW5zaW9uKGNoYXIgY29uc3QqIGV4dGVuc2lvbikgY29uc3Q7Ci19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfU0ZfR0xFWFRFTlNJT05fSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjdmZTVjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0b3BXYXRjaC5oPgotI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJjbHouaCIKLSNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCi0jaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaCIKLSNpbmNsdWRlICJHTEV4dGVuc2lvbnMuaCIKLSNpbmNsdWRlICJMYXllci5oIgotI2luY2x1ZGUgIlN1cmZhY2VGbGluZ2VyLmgiCi0jaW5jbHVkZSAiU3VyZmFjZVRleHR1cmVMYXllci5oIgotCi0jZGVmaW5lIERFQlVHX1JFU0laRSAgICAwCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxheWVyOjpMYXllcihTdXJmYWNlRmxpbmdlciogZmxpbmdlciwKLSAgICAgICAgRGlzcGxheUlEIGRpc3BsYXksIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCkKLSAgICA6ICAgTGF5ZXJCYXNlQ2xpZW50KGZsaW5nZXIsIGRpc3BsYXksIGNsaWVudCksCi0gICAgICAgIG1UZXh0dXJlTmFtZSgtMVUpLAotICAgICAgICBtUXVldWVkRnJhbWVzKDApLAotICAgICAgICBtQ3VycmVudFRyYW5zZm9ybSgwKSwKLSAgICAgICAgbUN1cnJlbnRTY2FsaW5nTW9kZShOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9GUkVFWkUpLAotICAgICAgICBtQ3VycmVudE9wYWNpdHkodHJ1ZSksCi0gICAgICAgIG1SZWZyZXNoUGVuZGluZyhmYWxzZSksCi0gICAgICAgIG1GcmFtZUxhdGVuY3lOZWVkZWQoZmFsc2UpLAotICAgICAgICBtRnJhbWVMYXRlbmN5T2Zmc2V0KDApLAotICAgICAgICBtRm9ybWF0KFBJWEVMX0ZPUk1BVF9OT05FKSwKLSAgICAgICAgbUdMRXh0ZW5zaW9ucyhHTEV4dGVuc2lvbnM6OmdldEluc3RhbmNlKCkpLAotICAgICAgICBtT3BhcXVlTGF5ZXIodHJ1ZSksCi0gICAgICAgIG1OZWVkc0RpdGhlcmluZyhmYWxzZSksCi0gICAgICAgIG1TZWN1cmUoZmFsc2UpLAotICAgICAgICBtUHJvdGVjdGVkQnlBcHAoZmFsc2UpCi17Ci0gICAgbUN1cnJlbnRDcm9wLm1ha2VJbnZhbGlkKCk7Ci0gICAgZ2xHZW5UZXh0dXJlcygxLCAmbVRleHR1cmVOYW1lKTsKLX0KLQotdm9pZCBMYXllcjo6b25MYXllckRpc3BsYXllZCgpIHsKLSAgICBpZiAobUZyYW1lTGF0ZW5jeU5lZWRlZCkgewotICAgICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgICAgIG1GcmFtZVN0YXRzW21GcmFtZUxhdGVuY3lPZmZzZXRdLnRpbWVzdGFtcCA9IG1TdXJmYWNlVGV4dHVyZS0+Z2V0VGltZXN0YW1wKCk7Ci0gICAgICAgIG1GcmFtZVN0YXRzW21GcmFtZUxhdGVuY3lPZmZzZXRdLnNldCA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgbUZyYW1lU3RhdHNbbUZyYW1lTGF0ZW5jeU9mZnNldF0udnN5bmMgPSBody5nZXRSZWZyZXNoVGltZXN0YW1wKCk7Ci0gICAgICAgIG1GcmFtZUxhdGVuY3lPZmZzZXQgPSAobUZyYW1lTGF0ZW5jeU9mZnNldCArIDEpICUgMTI4OwotICAgICAgICBtRnJhbWVMYXRlbmN5TmVlZGVkID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIExheWVyOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBMYXllckJhc2VDbGllbnQ6Om9uRmlyc3RSZWYoKTsKLQotICAgIHN0cnVjdCBGcmFtZVF1ZXVlZExpc3RlbmVyIDogcHVibGljIFN1cmZhY2VUZXh0dXJlOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKLSAgICAgICAgRnJhbWVRdWV1ZWRMaXN0ZW5lcihMYXllciogbGF5ZXIpIDogbUxheWVyKGxheWVyKSB7IH0KLSAgICBwcml2YXRlOgotICAgICAgICB3cDxMYXllcj4gbUxheWVyOwotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpIHsKLSAgICAgICAgICAgIHNwPExheWVyPiB0aGF0KG1MYXllci5wcm9tb3RlKCkpOwotICAgICAgICAgICAgaWYgKHRoYXQgIT0gMCkgewotICAgICAgICAgICAgICAgIHRoYXQtPm9uRnJhbWVRdWV1ZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0gICAgbVN1cmZhY2VUZXh0dXJlID0gbmV3IFN1cmZhY2VUZXh0dXJlTGF5ZXIobVRleHR1cmVOYW1lLCB0aGlzKTsKLSAgICBtU3VyZmFjZVRleHR1cmUtPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIobmV3IEZyYW1lUXVldWVkTGlzdGVuZXIodGhpcykpOwotICAgIG1TdXJmYWNlVGV4dHVyZS0+c2V0U3luY2hyb25vdXNNb2RlKHRydWUpOwotI2lmZGVmIFVTRV9UUklQTEVfQlVGRkVSSU5HCi0jd2FybmluZyAidXNpbmcgdHJpcGxlIGJ1ZmZlcmluZyIKLSAgICBtU3VyZmFjZVRleHR1cmUtPnNldEJ1ZmZlckNvdW50U2VydmVyKDMpOwotI2Vsc2UKLSAgICBtU3VyZmFjZVRleHR1cmUtPnNldEJ1ZmZlckNvdW50U2VydmVyKDIpOwotI2VuZGlmCi19Ci0KLUxheWVyOjp+TGF5ZXIoKQotewotICAgIG1GbGluZ2VyLT5wb3N0TWVzc2FnZUFzeW5jKAotICAgICAgICAgICAgbmV3IFN1cmZhY2VGbGluZ2VyOjpNZXNzYWdlRGVzdHJveUdMVGV4dHVyZShtVGV4dHVyZU5hbWUpICk7Ci19Ci0KLXZvaWQgTGF5ZXI6Om9uRnJhbWVRdWV1ZWQoKSB7Ci0gICAgYW5kcm9pZF9hdG9taWNfaW5jKCZtUXVldWVkRnJhbWVzKTsKLSAgICBtRmxpbmdlci0+c2lnbmFsTGF5ZXJVcGRhdGUoKTsKLX0KLQotLy8gY2FsbGVkIHdpdGggU3VyZmFjZUZsaW5nZXI6Om1TdGF0ZUxvY2sgYXMgc29vbiBhcyB0aGUgbGF5ZXIgaXMgZW50ZXJlZAotLy8gaW4gdGhlIHB1cmdhdG9yeSBsaXN0Ci12b2lkIExheWVyOjpvblJlbW92ZWQoKQotewotICAgIG1TdXJmYWNlVGV4dHVyZS0+YWJhbmRvbigpOwotfQotCi12b2lkIExheWVyOjpzZXROYW1lKGNvbnN0IFN0cmluZzgmIG5hbWUpIHsKLSAgICBMYXllckJhc2U6OnNldE5hbWUobmFtZSk7Ci0gICAgbVN1cmZhY2VUZXh0dXJlLT5zZXROYW1lKG5hbWUpOwotfQotCi1zcDxJU3VyZmFjZT4gTGF5ZXI6OmNyZWF0ZVN1cmZhY2UoKQotewotICAgIGNsYXNzIEJTdXJmYWNlIDogcHVibGljIEJuU3VyZmFjZSwgcHVibGljIExheWVyQ2xlYW5lciB7Ci0gICAgICAgIHdwPGNvbnN0IExheWVyPiBtT3duZXI7Ci0gICAgICAgIHZpcnR1YWwgc3A8SVN1cmZhY2VUZXh0dXJlPiBnZXRTdXJmYWNlVGV4dHVyZSgpIGNvbnN0IHsKLSAgICAgICAgICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gcmVzOwotICAgICAgICAgICAgc3A8Y29uc3QgTGF5ZXI+IHRoYXQoIG1Pd25lci5wcm9tb3RlKCkgKTsKLSAgICAgICAgICAgIGlmICh0aGF0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXMgPSB0aGF0LT5tU3VyZmFjZVRleHR1cmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgcHVibGljOgotICAgICAgICBCU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXI+JiBsYXllcikKLSAgICAgICAgICAgIDogTGF5ZXJDbGVhbmVyKGZsaW5nZXIsIGxheWVyKSwgbU93bmVyKGxheWVyKSB7IH0KLSAgICB9OwotICAgIHNwPElTdXJmYWNlPiBzdXIobmV3IEJTdXJmYWNlKG1GbGluZ2VyLCB0aGlzKSk7Ci0gICAgcmV0dXJuIHN1cjsKLX0KLQotd3A8SUJpbmRlcj4gTGF5ZXI6OmdldFN1cmZhY2VUZXh0dXJlQmluZGVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVN1cmZhY2VUZXh0dXJlLT5hc0JpbmRlcigpOwotfQotCi1zdGF0dXNfdCBMYXllcjo6c2V0QnVmZmVycyggdWludDMyX3QgdywgdWludDMyX3QgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IGZsYWdzKQotewotICAgIC8vIHRoaXMgc3VyZmFjZXMgcGl4ZWwgZm9ybWF0Ci0gICAgUGl4ZWxGb3JtYXRJbmZvIGluZm87Ci0gICAgc3RhdHVzX3QgZXJyID0gZ2V0UGl4ZWxGb3JtYXRJbmZvKGZvcm1hdCwgJmluZm8pOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHBpeGVsZm9ybWF0ICVkIiwgZm9ybWF0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyB0aGUgZGlzcGxheSdzIHBpeGVsIGZvcm1hdAotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICB1aW50MzJfdCBjb25zdCBtYXhTdXJmYWNlRGltcyA9IG1pbigKLSAgICAgICAgICAgIGh3LmdldE1heFRleHR1cmVTaXplKCksIGh3LmdldE1heFZpZXdwb3J0RGltcygpKTsKLQotICAgIC8vIG5ldmVyIGFsbG93IGEgc3VyZmFjZSBsYXJnZXIgdGhhbiB3aGF0IG91ciB1bmRlcmx5aW5nIEdMIGltcGxlbWVudGF0aW9uCi0gICAgLy8gY2FuIGhhbmRsZS4KLSAgICBpZiAoKHVpbnQzMl90KHcpPm1heFN1cmZhY2VEaW1zKSB8fCAodWludDMyX3QoaCk+bWF4U3VyZmFjZURpbXMpKSB7Ci0gICAgICAgIEFMT0dFKCJkaW1lbnNpb25zIHRvbyBsYXJnZSAldSB4ICV1IiwgdWludDMyX3QodyksIHVpbnQzMl90KGgpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBQaXhlbEZvcm1hdEluZm8gZGlzcGxheUluZm87Ci0gICAgZ2V0UGl4ZWxGb3JtYXRJbmZvKGh3LmdldEZvcm1hdCgpLCAmZGlzcGxheUluZm8pOwotICAgIGNvbnN0IHVpbnQzMl90IGh3RmxhZ3MgPSBody5nZXRGbGFncygpOwotICAgIAotICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICBtU2VjdXJlID0gKGZsYWdzICYgSVN1cmZhY2VDb21wb3Nlcjo6ZVNlY3VyZSkgPyB0cnVlIDogZmFsc2U7Ci0gICAgbVByb3RlY3RlZEJ5QXBwID0gKGZsYWdzICYgSVN1cmZhY2VDb21wb3Nlcjo6ZVByb3RlY3RlZEJ5QXBwKSA/IHRydWUgOiBmYWxzZTsKLSAgICBtT3BhcXVlTGF5ZXIgPSAoZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplT3BhcXVlKTsKLSAgICBtQ3VycmVudE9wYWNpdHkgPSBnZXRPcGFjaXR5Rm9yRm9ybWF0KGZvcm1hdCk7Ci0KLSAgICBtU3VyZmFjZVRleHR1cmUtPnNldERlZmF1bHRCdWZmZXJTaXplKHcsIGgpOwotICAgIG1TdXJmYWNlVGV4dHVyZS0+c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChmb3JtYXQpOwotCi0gICAgLy8gd2UgdXNlIHRoZSByZWQgaW5kZXgKLSAgICBpbnQgZGlzcGxheVJlZFNpemUgPSBkaXNwbGF5SW5mby5nZXRTaXplKFBpeGVsRm9ybWF0SW5mbzo6SU5ERVhfUkVEKTsKLSAgICBpbnQgbGF5ZXJSZWRzaXplID0gaW5mby5nZXRTaXplKFBpeGVsRm9ybWF0SW5mbzo6SU5ERVhfUkVEKTsKLSAgICBtTmVlZHNEaXRoZXJpbmcgPSBsYXllclJlZHNpemUgPiBkaXNwbGF5UmVkU2l6ZTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBMYXllcjo6c2V0R2VvbWV0cnkoaHdjX2xheWVyX3QqIGh3Y2wpCi17Ci0gICAgTGF5ZXJCYXNlQ2xpZW50OjpzZXRHZW9tZXRyeShod2NsKTsKLQotICAgIGh3Y2wtPmZsYWdzICY9IH5IV0NfU0tJUF9MQVlFUjsKLQotICAgIC8vIHdlIGNhbid0IGRvIGFscGhhLWZhZGUgd2l0aCB0aGUgaHdjIEhBTAotICAgIGNvbnN0IFN0YXRlJiBzKGRyYXdpbmdTdGF0ZSgpKTsKLSAgICBpZiAocy5hbHBoYSA8IDB4RkYpIHsKLSAgICAgICAgaHdjbC0+ZmxhZ3MgPSBIV0NfU0tJUF9MQVlFUjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRyYW5zZm9ybWF0aW9ucyBhcmUgYXBwbGllZCBpbiB0aGlzIG9yZGVyOgotICAgICAqIDEpIGJ1ZmZlciBvcmllbnRhdGlvbi9mbGlwL21pcnJvcgotICAgICAqIDIpIHN0YXRlIHRyYW5zZm9ybWF0aW9uICh3aW5kb3cgbWFuYWdlcikKLSAgICAgKiAzKSBsYXllciBvcmllbnRhdGlvbiAoc2NyZWVuIG9yaWVudGF0aW9uKQotICAgICAqIG1UcmFuc2Zvcm0gaXMgYWxyZWFkeSB0aGUgY29tcG9zaXRpb24gb2YgKDIpIGFuZCAoMykKLSAgICAgKiAoTk9URTogdGhlIG1hdHJpY2VzIGFyZSBtdWx0aXBsaWVkIGluIHJldmVyc2Ugb3JkZXIpCi0gICAgICovCi0KLSAgICBjb25zdCBUcmFuc2Zvcm0gYnVmZmVyT3JpZW50YXRpb24obUN1cnJlbnRUcmFuc2Zvcm0pOwotICAgIGNvbnN0IFRyYW5zZm9ybSB0cihtVHJhbnNmb3JtICogYnVmZmVyT3JpZW50YXRpb24pOwotCi0gICAgLy8gdGhpcyBnaXZlcyB1cyBvbmx5IHRoZSAib3JpZW50YXRpb24iIGNvbXBvbmVudCBvZiB0aGUgdHJhbnNmb3JtCi0gICAgY29uc3QgdWludDMyX3QgZmluYWxUcmFuc2Zvcm0gPSB0ci5nZXRPcmllbnRhdGlvbigpOwotCi0gICAgLy8gd2UgY2FuIG9ubHkgaGFuZGxlIHNpbXBsZSB0cmFuc2Zvcm1hdGlvbgotICAgIGlmIChmaW5hbFRyYW5zZm9ybSAmIFRyYW5zZm9ybTo6Uk9UX0lOVkFMSUQpIHsKLSAgICAgICAgaHdjbC0+ZmxhZ3MgPSBIV0NfU0tJUF9MQVlFUjsKLSAgICB9IGVsc2UgewotICAgICAgICBod2NsLT50cmFuc2Zvcm0gPSBmaW5hbFRyYW5zZm9ybTsKLSAgICB9Ci0KLSAgICBpZiAoaXNDcm9wcGVkKCkpIHsKLSAgICAgICAgaHdjbC0+c291cmNlQ3JvcC5sZWZ0ICAgPSBtQ3VycmVudENyb3AubGVmdDsKLSAgICAgICAgaHdjbC0+c291cmNlQ3JvcC50b3AgICAgPSBtQ3VycmVudENyb3AudG9wOwotICAgICAgICBod2NsLT5zb3VyY2VDcm9wLnJpZ2h0ICA9IG1DdXJyZW50Q3JvcC5yaWdodDsKLSAgICAgICAgaHdjbC0+c291cmNlQ3JvcC5ib3R0b20gPSBtQ3VycmVudENyb3AuYm90dG9tOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIobUFjdGl2ZUJ1ZmZlcik7Ci0gICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AubGVmdCAgID0gMDsKLSAgICAgICAgaHdjbC0+c291cmNlQ3JvcC50b3AgICAgPSAwOwotICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AucmlnaHQgID0gYnVmZmVyLT53aWR0aDsKLSAgICAgICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AuYm90dG9tID0gYnVmZmVyLT5oZWlnaHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBod2NsLT5zb3VyY2VDcm9wLnJpZ2h0ICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy53aWR0aCgpOwotICAgICAgICAgICAgaHdjbC0+c291cmNlQ3JvcC5ib3R0b20gPSBtVHJhbnNmb3JtZWRCb3VuZHMuaGVpZ2h0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgTGF5ZXI6OnNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCkgewotICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIobUFjdGl2ZUJ1ZmZlcik7Ci0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgY2xpZW50IG5ldmVyIGRyZXcgaW50byB0aGlzIGxheWVyIHlldCwKLSAgICAgICAgLy8gb3IgaWYgd2UgcmFuIG91dCBvZiBtZW1vcnkuIEluIHRoYXQgY2FzZSwgZG9uJ3QgbGV0Ci0gICAgICAgIC8vIEhXQyBoYW5kbGUgaXQuCi0gICAgICAgIGh3Y2wtPmZsYWdzIHw9IEhXQ19TS0lQX0xBWUVSOwotICAgICAgICBod2NsLT5oYW5kbGUgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGh3Y2wtPmhhbmRsZSA9IGJ1ZmZlci0+aGFuZGxlOwotICAgIH0KLX0KLQotdm9pZCBMYXllcjo6b25EcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3QKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotCi0gICAgaWYgKENDX1VOTElLRUxZKG1BY3RpdmVCdWZmZXIgPT0gMCkpIHsKLSAgICAgICAgLy8gdGhlIHRleHR1cmUgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LCB0aGlzIExheWVyIGhhcwotICAgICAgICAvLyBpbiBmYWN0IG5ldmVyIGJlZW4gZHJhd24gaW50by4gVGhpcyBoYXBwZW5zIGZyZXF1ZW50bHkgd2l0aAotICAgICAgICAvLyBTdXJmYWNlVmlldyBiZWNhdXNlIHRoZSBXaW5kb3dNYW5hZ2VyIGNhbid0IGtub3cgd2hlbiB0aGUgY2xpZW50Ci0gICAgICAgIC8vIGhhcyBkcmF3biB0aGUgZmlyc3QgdGltZS4KLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBub3RoaW5nIHVuZGVyIHVzLCB3ZSBwYWludCB0aGUgc2NyZWVuIGluIGJsYWNrLCBvdGhlcndpc2UKLSAgICAgICAgLy8gd2UganVzdCBza2lwIHRoaXMgdXBkYXRlLgotCi0gICAgICAgIC8vIGZpZ3VyZSBvdXQgaWYgdGhlcmUgaXMgc29tZXRoaW5nIGJlbG93IHVzCi0gICAgICAgIFJlZ2lvbiB1bmRlcjsKLSAgICAgICAgY29uc3QgU3VyZmFjZUZsaW5nZXI6OkxheWVyVmVjdG9yJiBkcmF3aW5nTGF5ZXJzKAotICAgICAgICAgICAgICAgIG1GbGluZ2VyLT5tRHJhd2luZ1N0YXRlLmxheWVyc1NvcnRlZEJ5Wik7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGRyYXdpbmdMYXllcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihkcmF3aW5nTGF5ZXJzW2ldKTsKLSAgICAgICAgICAgIGlmIChsYXllci5nZXQoKSA9PSBzdGF0aWNfY2FzdDxMYXllckJhc2UgY29uc3QqPih0aGlzKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHVuZGVyLm9yU2VsZihsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgbm90IGV2ZXJ5dGhpbmcgYmVsb3cgdXMgaXMgY292ZXJlZCwgd2UgcGx1ZyB0aGUgaG9sZXMhCi0gICAgICAgIFJlZ2lvbiBob2xlcyhjbGlwLnN1YnRyYWN0KHVuZGVyKSk7Ci0gICAgICAgIGlmICghaG9sZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBjbGVhcldpdGhPcGVuR0woaG9sZXMsIDAsIDAsIDAsIDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWlzUHJvdGVjdGVkKCkpIHsKLSAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgbVRleHR1cmVOYW1lKTsKLSAgICAgICAgR0xlbnVtIGZpbHRlciA9IEdMX05FQVJFU1Q7Ci0gICAgICAgIGlmIChnZXRGaWx0ZXJpbmcoKSB8fCBuZWVkc0ZpbHRlcmluZygpIHx8IGlzRml4ZWRTaXplKCkgfHwgaXNDcm9wcGVkKCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHdlIGNvdWxkIGJlIG1vcmUgc3VidGxlIHdpdGggaXNGaXhlZFNpemUoKQotICAgICAgICAgICAgZmlsdGVyID0gR0xfTElORUFSOwotICAgICAgICB9Ci0gICAgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX1RFWFRVUkUpOwotICAgICAgICBnbExvYWRNYXRyaXhmKG1UZXh0dXJlTWF0cml4KTsKLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbUZsaW5nZXItPmdldFByb3RlY3RlZFRleE5hbWUoKSk7Ci0gICAgICAgIGdsTWF0cml4TW9kZShHTF9URVhUVVJFKTsKLSAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUyk7Ci0gICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgIH0KLQotICAgIGRyYXdXaXRoT3BlbkdMKGNsaXApOwotCi0gICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKTsKLSAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci19Ci0KLS8vIEFzIGRvY3VtZW50ZWQgaW4gbGliaGFyZHdhcmUgaGVhZGVyLCBmb3JtYXRzIGluIHRoZSByYW5nZQotLy8gMHgxMDAgLSAweDFGRiBhcmUgc3BlY2lmaWMgdG8gdGhlIEhBTCBpbXBsZW1lbnRhdGlvbiwgYW5kCi0vLyBhcmUga25vd24gdG8gaGF2ZSBubyBhbHBoYSBjaGFubmVsCi0vLyBUT0RPOiBtb3ZlIGRlZmluaXRpb24gZm9yIGRldmljZS1zcGVjaWZpYyByYW5nZSBpbnRvCi0vLyBoYXJkd2FyZS5oLCBpbnN0ZWFkIG9mIHVzaW5nIGhhcmQtY29kZWQgdmFsdWVzIGhlcmUuCi0jZGVmaW5lIEhBUkRXQVJFX0lTX0RFVklDRV9GT1JNQVQoZikgKChmKSA+PSAweDEwMCAmJiAoZikgPD0gMHgxRkYpCi0KLWJvb2wgTGF5ZXI6OmdldE9wYWNpdHlGb3JGb3JtYXQodWludDMyX3QgZm9ybWF0KQotewotICAgIGlmIChIQVJEV0FSRV9JU19ERVZJQ0VfRk9STUFUKGZvcm1hdCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIFBpeGVsRm9ybWF0SW5mbyBpbmZvOwotICAgIHN0YXR1c190IGVyciA9IGdldFBpeGVsRm9ybWF0SW5mbyhQaXhlbEZvcm1hdChmb3JtYXQpLCAmaW5mbyk7Ci0gICAgLy8gaW4gY2FzZSBvZiBlcnJvciAodW5rbm93biBmb3JtYXQpLCB3ZSBhc3N1bWUgbm8gYmxlbmRpbmcKLSAgICByZXR1cm4gKGVyciB8fCBpbmZvLmhfYWxwaGEgPD0gaW5mby5sX2FscGhhKTsKLX0KLQotCi1ib29sIExheWVyOjppc09wYXF1ZSgpIGNvbnN0Ci17Ci0gICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIGJ1ZmZlciB5ZXQsIHdlJ3JlIHRyYW5zbHVjZW50IHJlZ2FyZGxlc3Mgb2YgdGhlCi0gICAgLy8gbGF5ZXIncyBvcGFxdWUgZmxhZy4KLSAgICBpZiAobUFjdGl2ZUJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBpZiB0aGUgbGF5ZXIgaGFzIHRoZSBvcGFxdWUgZmxhZywgdGhlbiB3ZSdyZSBhbHdheXMgb3BhcXVlLAotICAgIC8vIG90aGVyd2lzZSB3ZSB1c2UgdGhlIGN1cnJlbnQgYnVmZmVyJ3MgZm9ybWF0LgotICAgIHJldHVybiBtT3BhcXVlTGF5ZXIgfHwgbUN1cnJlbnRPcGFjaXR5OwotfQotCi1ib29sIExheWVyOjppc1Byb3RlY3RlZCgpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGFjdGl2ZUJ1ZmZlcihtQWN0aXZlQnVmZmVyKTsKLSAgICByZXR1cm4gKGFjdGl2ZUJ1ZmZlciAhPSAwKSAmJgotICAgICAgICAgICAgKGFjdGl2ZUJ1ZmZlci0+Z2V0VXNhZ2UoKSAmIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKTsKLX0KLQotdWludDMyX3QgTGF5ZXI6OmRvVHJhbnNhY3Rpb24odWludDMyX3QgZmxhZ3MpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLQotICAgIGNvbnN0IExheWVyOjpTdGF0ZSYgZnJvbnQoZHJhd2luZ1N0YXRlKCkpOwotICAgIGNvbnN0IExheWVyOjpTdGF0ZSYgdGVtcChjdXJyZW50U3RhdGUoKSk7Ci0KLSAgICBjb25zdCBib29sIHNpemVDaGFuZ2VkID0gKGZyb250LnJlcXVlc3RlZF93ICE9IHRlbXAucmVxdWVzdGVkX3cpIHx8Ci0gICAgICAgICAgICAoZnJvbnQucmVxdWVzdGVkX2ggIT0gdGVtcC5yZXF1ZXN0ZWRfaCk7Ci0KLSAgICBpZiAoc2l6ZUNoYW5nZWQpIHsKLSAgICAgICAgLy8gdGhlIHNpemUgY2hhbmdlZCwgd2UgbmVlZCB0byBhc2sgb3VyIGNsaWVudCB0byByZXF1ZXN0IGEgbmV3IGJ1ZmZlcgotICAgICAgICBBTE9HRF9JRihERUJVR19SRVNJWkUsCi0gICAgICAgICAgICAgICAgImRvVHJhbnNhY3Rpb246ICIKLSAgICAgICAgICAgICAgICAicmVzaXplIChsYXllcj0lcCksIHJlcXVlc3RlZCAoJWR4JWQpLCBkcmF3aW5nICglZCwlZCksICIKLSAgICAgICAgICAgICAgICAic2NhbGluZ01vZGU9JWQiLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgaW50KHRlbXAucmVxdWVzdGVkX3cpLCBpbnQodGVtcC5yZXF1ZXN0ZWRfaCksCi0gICAgICAgICAgICAgICAgaW50KGZyb250LnJlcXVlc3RlZF93KSwgaW50KGZyb250LnJlcXVlc3RlZF9oKSwKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNjYWxpbmdNb2RlKTsKLQotICAgICAgICBpZiAoIWlzRml4ZWRTaXplKCkpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBtYWtlIHN1cmUgTGF5ZXJCYXNlOjpkb1RyYW5zYWN0aW9uIGRvZXNuJ3QgdXBkYXRlCi0gICAgICAgICAgICAvLyB0aGUgZHJhd2luZyBzdGF0ZSdzIHNpemUKLSAgICAgICAgICAgIExheWVyOjpTdGF0ZSYgZWRpdERyYXcobURyYXdpbmdTdGF0ZSk7Ci0gICAgICAgICAgICBlZGl0RHJhdy5yZXF1ZXN0ZWRfdyA9IHRlbXAucmVxdWVzdGVkX3c7Ci0gICAgICAgICAgICBlZGl0RHJhdy5yZXF1ZXN0ZWRfaCA9IHRlbXAucmVxdWVzdGVkX2g7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZWNvcmQgdGhlIG5ldyBzaXplLCBmb3JtIHRoaXMgcG9pbnQgb24sIHdoZW4gdGhlIGNsaWVudCByZXF1ZXN0Ci0gICAgICAgIC8vIGEgYnVmZmVyLCBpdCdsbCBnZXQgdGhlIG5ldyBzaXplLgotICAgICAgICBtU3VyZmFjZVRleHR1cmUtPnNldERlZmF1bHRCdWZmZXJTaXplKHRlbXAucmVxdWVzdGVkX3csCi0gICAgICAgICAgICAgICAgdGVtcC5yZXF1ZXN0ZWRfaCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIExheWVyQmFzZTo6ZG9UcmFuc2FjdGlvbihmbGFncyk7Ci19Ci0KLWJvb2wgTGF5ZXI6OmlzRml4ZWRTaXplKCkgY29uc3QgewotICAgIHJldHVybiBtQ3VycmVudFNjYWxpbmdNb2RlICE9IE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX0ZSRUVaRTsKLX0KLQotYm9vbCBMYXllcjo6aXNDcm9wcGVkKCkgY29uc3QgewotICAgIHJldHVybiAhbUN1cnJlbnRDcm9wLmlzRW1wdHkoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcGFnZWZsaXAgaGFuZGxpbmcuLi4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYm9vbCBMYXllcjo6b25QcmVDb21wb3NpdGlvbigpIHsKLSAgICBtUmVmcmVzaFBlbmRpbmcgPSBmYWxzZTsKLSAgICByZXR1cm4gbVF1ZXVlZEZyYW1lcyA+IDA7Ci19Ci0KLXZvaWQgTGF5ZXI6OmxvY2tQYWdlRmxpcChib29sJiByZWNvbXB1dGVWaXNpYmxlUmVnaW9ucykKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotCi0gICAgaWYgKG1RdWV1ZWRGcmFtZXMgPiAwKSB7Ci0KLSAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSBjYWxsZWQgdXBkYXRlVGV4SW1hZ2UoKSB3aXRob3V0IGdvaW5nIHRocm91Z2gKLSAgICAgICAgLy8gYSBjb21wb3NpdGlvbiBzdGVwLCB3ZSBoYXZlIHRvIHNraXAgdGhpcyBsYXllciBhdCB0aGlzIHBvaW50Ci0gICAgICAgIC8vIGJlY2F1c2Ugd2UgY2Fubm90IGNhbGwgdXBkYXRlVGV4aW1hZ2UoKSB3aXRob3V0IGEgY29ycmVzcG9uZGluZwotICAgICAgICAvLyBjb21wb3NpdGlvbkNvbXBsZXRlKCkgY2FsbC4KLSAgICAgICAgLy8gd2UnbGwgdHJpZ2dlciBhbiB1cGRhdGUgaW4gb25QcmVDb21wb3NpdGlvbigpLgotICAgICAgICBpZiAobVJlZnJlc2hQZW5kaW5nKSB7Ci0gICAgICAgICAgICBtUG9zdGVkRGlydHlSZWdpb24uY2xlYXIoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtUmVmcmVzaFBlbmRpbmcgPSB0cnVlOwotCi0gICAgICAgIC8vIENhcHR1cmUgdGhlIG9sZCBzdGF0ZSBvZiB0aGUgbGF5ZXIgZm9yIGNvbXBhcmlzb25zIGxhdGVyCi0gICAgICAgIGNvbnN0IGJvb2wgb2xkT3BhY2l0eSA9IGlzT3BhcXVlKCk7Ci0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IG9sZEFjdGl2ZUJ1ZmZlciA9IG1BY3RpdmVCdWZmZXI7Ci0KLSAgICAgICAgLy8gc2lnbmFsIGFub3RoZXIgZXZlbnQgaWYgd2UgaGF2ZSBtb3JlIGZyYW1lcyBwZW5kaW5nCi0gICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19kZWMoJm1RdWV1ZWRGcmFtZXMpID4gMSkgewotICAgICAgICAgICAgbUZsaW5nZXItPnNpZ25hbExheWVyVXBkYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVN1cmZhY2VUZXh0dXJlLT51cGRhdGVUZXhJbWFnZSgpIDwgTk9fRVJST1IpIHsKLSAgICAgICAgICAgIC8vIHNvbWV0aGluZyBoYXBwZW5lZCEKLSAgICAgICAgICAgIHJlY29tcHV0ZVZpc2libGVSZWdpb25zID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgYWN0aXZlIGJ1ZmZlcgotICAgICAgICBtQWN0aXZlQnVmZmVyID0gbVN1cmZhY2VUZXh0dXJlLT5nZXRDdXJyZW50QnVmZmVyKCk7Ci0gICAgICAgIG1GcmFtZUxhdGVuY3lOZWVkZWQgPSB0cnVlOwotCi0gICAgICAgIGlmIChvbGRBY3RpdmVCdWZmZXIgPT0gTlVMTCAmJiBtQWN0aXZlQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIHRoZSBmaXJzdCB0aW1lIHdlIHJlY2VpdmUgYSBidWZmZXIsIHdlIG5lZWQgdG8gdHJpZ2dlciBhCi0gICAgICAgICAgICAvLyBnZW9tZXRyeSBpbnZhbGlkYXRpb24uCi0gICAgICAgICAgICBtRmxpbmdlci0+aW52YWxpZGF0ZUh3Y0dlb21ldHJ5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBSZWN0IGNyb3AobVN1cmZhY2VUZXh0dXJlLT5nZXRDdXJyZW50Q3JvcCgpKTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgdHJhbnNmb3JtKG1TdXJmYWNlVGV4dHVyZS0+Z2V0Q3VycmVudFRyYW5zZm9ybSgpKTsKLSAgICAgICAgY29uc3QgdWludDMyX3Qgc2NhbGluZ01vZGUobVN1cmZhY2VUZXh0dXJlLT5nZXRDdXJyZW50U2NhbGluZ01vZGUoKSk7Ci0gICAgICAgIGlmICgoY3JvcCAhPSBtQ3VycmVudENyb3ApIHx8Ci0gICAgICAgICAgICAodHJhbnNmb3JtICE9IG1DdXJyZW50VHJhbnNmb3JtKSB8fAotICAgICAgICAgICAgKHNjYWxpbmdNb2RlICE9IG1DdXJyZW50U2NhbGluZ01vZGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtQ3VycmVudENyb3AgPSBjcm9wOwotICAgICAgICAgICAgbUN1cnJlbnRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm07Ci0gICAgICAgICAgICBtQ3VycmVudFNjYWxpbmdNb2RlID0gc2NhbGluZ01vZGU7Ci0gICAgICAgICAgICBtRmxpbmdlci0+aW52YWxpZGF0ZUh3Y0dlb21ldHJ5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBHTGZsb2F0IHRleHR1cmVNYXRyaXhbMTZdOwotICAgICAgICBtU3VyZmFjZVRleHR1cmUtPmdldFRyYW5zZm9ybU1hdHJpeCh0ZXh0dXJlTWF0cml4KTsKLSAgICAgICAgaWYgKG1lbWNtcCh0ZXh0dXJlTWF0cml4LCBtVGV4dHVyZU1hdHJpeCwgc2l6ZW9mKHRleHR1cmVNYXRyaXgpKSkgewotICAgICAgICAgICAgbWVtY3B5KG1UZXh0dXJlTWF0cml4LCB0ZXh0dXJlTWF0cml4LCBzaXplb2YodGV4dHVyZU1hdHJpeCkpOwotICAgICAgICAgICAgbUZsaW5nZXItPmludmFsaWRhdGVId2NHZW9tZXRyeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3QgYnVmV2lkdGggID0gbUFjdGl2ZUJ1ZmZlci0+Z2V0V2lkdGgoKTsKLSAgICAgICAgdWludDMyX3QgYnVmSGVpZ2h0ID0gbUFjdGl2ZUJ1ZmZlci0+Z2V0SGVpZ2h0KCk7Ci0gICAgICAgIGlmIChvbGRBY3RpdmVCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKGJ1ZldpZHRoICE9IHVpbnQzMl90KG9sZEFjdGl2ZUJ1ZmZlci0+d2lkdGgpIHx8Ci0gICAgICAgICAgICAgICAgYnVmSGVpZ2h0ICE9IHVpbnQzMl90KG9sZEFjdGl2ZUJ1ZmZlci0+aGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIG1GbGluZ2VyLT5pbnZhbGlkYXRlSHdjR2VvbWV0cnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1DdXJyZW50T3BhY2l0eSA9IGdldE9wYWNpdHlGb3JGb3JtYXQobUFjdGl2ZUJ1ZmZlci0+Zm9ybWF0KTsKLSAgICAgICAgaWYgKG9sZE9wYWNpdHkgIT0gaXNPcGFxdWUoKSkgewotICAgICAgICAgICAgcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOwotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgbGF5ZXIgc2l6ZSBpZiBuZWVkZWQKLSAgICAgICAgY29uc3QgTGF5ZXI6OlN0YXRlJiBmcm9udChkcmF3aW5nU3RhdGUoKSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IG1Qb3N0ZWREaXJ0eVJlZ2lvbiA9IGRpcnR5ICYgYm91bmRzCi0gICAgICAgIG1Qb3N0ZWREaXJ0eVJlZ2lvbi5zZXQoZnJvbnQudywgZnJvbnQuaCk7Ci0KLSAgICAgICAgaWYgKChmcm9udC53ICE9IGZyb250LnJlcXVlc3RlZF93KSB8fAotICAgICAgICAgICAgKGZyb250LmggIT0gZnJvbnQucmVxdWVzdGVkX2gpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjaGVjayB0aGF0IHdlIHJlY2VpdmVkIGEgYnVmZmVyIG9mIHRoZSByaWdodCBzaXplCi0gICAgICAgICAgICAvLyAoVGFrZSB0aGUgYnVmZmVyJ3Mgb3JpZW50YXRpb24gaW50byBhY2NvdW50KQotICAgICAgICAgICAgaWYgKG1DdXJyZW50VHJhbnNmb3JtICYgVHJhbnNmb3JtOjpST1RfOTApIHsKLSAgICAgICAgICAgICAgICBzd2FwKGJ1ZldpZHRoLCBidWZIZWlnaHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNGaXhlZFNpemUoKSB8fAotICAgICAgICAgICAgICAgICAgICAoYnVmV2lkdGggPT0gZnJvbnQucmVxdWVzdGVkX3cgJiYKLSAgICAgICAgICAgICAgICAgICAgYnVmSGVpZ2h0ID09IGZyb250LnJlcXVlc3RlZF9oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIHByZXRlbmQgdGhlIHRyYW5zYWN0aW9uIGhhcHBlbmVkIGJ5IHVwZGF0aW5nIHRoZQotICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgYW5kIGRyYXdpbmcgc3RhdGVzLiBEcmF3aW5nIHN0YXRlIGlzIG9ubHkgYWNjZXNzZWQKLSAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHRocmVhZCwgbm8gbmVlZCB0byBoYXZlIGl0IGxvY2tlZAotICAgICAgICAgICAgICAgIExheWVyOjpTdGF0ZSYgZWRpdERyYXcobURyYXdpbmdTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgZWRpdERyYXcudyA9IGVkaXREcmF3LnJlcXVlc3RlZF93OwotICAgICAgICAgICAgICAgIGVkaXREcmF3LmggPSBlZGl0RHJhdy5yZXF1ZXN0ZWRfaDsKLQotICAgICAgICAgICAgICAgIC8vIFdlIGFsc28gbmVlZCB0byB1cGRhdGUgdGhlIGN1cnJlbnQgc3RhdGUgc28gdGhhdCB3ZSBkb24ndAotICAgICAgICAgICAgICAgIC8vIGVuZC11cCBkb2luZyB0b28gbXVjaCB3b3JrIGR1cmluZyB0aGUgbmV4dCB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgICAgICAvLyBOT1RFOiBXZSBhY3R1YWxseSBkb24ndCBuZWVkIGhvbGQgdGhlIHRyYW5zYWN0aW9uIGxvY2sgaGVyZQotICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgU3RhdGU6OncgYW5kIFN0YXRlOjpoIGFyZSBvbmx5IGFjY2Vzc2VkIGZyb20KLSAgICAgICAgICAgICAgICAvLyB0aGlzIHRocmVhZAotICAgICAgICAgICAgICAgIExheWVyOjpTdGF0ZSYgZWRpdFRlbXAoY3VycmVudFN0YXRlKCkpOwotICAgICAgICAgICAgICAgIGVkaXRUZW1wLncgPSBlZGl0RHJhdy53OwotICAgICAgICAgICAgICAgIGVkaXRUZW1wLmggPSBlZGl0RHJhdy5oOwotCi0gICAgICAgICAgICAgICAgLy8gcmVjb21wdXRlIHZpc2libGUgcmVnaW9uCi0gICAgICAgICAgICAgICAgcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HRF9JRihERUJVR19SRVNJWkUsCi0gICAgICAgICAgICAgICAgICAgICJsb2NrUGFnZUZsaXAgOiAiCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgKGxheWVyPSVwKSwgYnVmZmVyICgldXgldSwgdHI9JTAyeCksICIKLSAgICAgICAgICAgICAgICAgICAgInJlcXVlc3RlZCAoJWR4JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgYnVmV2lkdGgsIGJ1ZkhlaWdodCwgbUN1cnJlbnRUcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgIGZyb250LnJlcXVlc3RlZF93LCBmcm9udC5yZXF1ZXN0ZWRfaCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgTGF5ZXI6OnVubG9ja1BhZ2VGbGlwKAotICAgICAgICBjb25zdCBUcmFuc2Zvcm0mIHBsYW5lVHJhbnNmb3JtLCBSZWdpb24mIG91dERpcnR5UmVnaW9uKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0KLSAgICBSZWdpb24gcG9zdGVkUmVnaW9uKG1Qb3N0ZWREaXJ0eVJlZ2lvbik7Ci0gICAgaWYgKCFwb3N0ZWRSZWdpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgIG1Qb3N0ZWREaXJ0eVJlZ2lvbi5jbGVhcigpOwotICAgICAgICBpZiAoIXZpc2libGVSZWdpb25TY3JlZW4uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgZGlydHkgcmVnaW9uIGlzIGdpdmVuIGluIHRoZSBsYXllcidzIGNvb3JkaW5hdGUgc3BhY2UKLSAgICAgICAgICAgIC8vIHRyYW5zZm9ybSB0aGUgZGlydHkgcmVnaW9uIGJ5IHRoZSBzdXJmYWNlJ3MgdHJhbnNmb3JtYXRpb24KLSAgICAgICAgICAgIC8vIGFuZCB0aGUgZ2xvYmFsIHRyYW5zZm9ybWF0aW9uLgotICAgICAgICAgICAgY29uc3QgTGF5ZXI6OlN0YXRlJiBzKGRyYXdpbmdTdGF0ZSgpKTsKLSAgICAgICAgICAgIGNvbnN0IFRyYW5zZm9ybSB0cihwbGFuZVRyYW5zZm9ybSAqIHMudHJhbnNmb3JtKTsKLSAgICAgICAgICAgIHBvc3RlZFJlZ2lvbiA9IHRyLnRyYW5zZm9ybShwb3N0ZWRSZWdpb24pOwotCi0gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgZGlydHkgcmVnaW9uIGlzIGluIHNjcmVlbiBzcGFjZS4KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIGNvbnN0cmFpbmVkIGJ5IHRoZSB2aXNpYmxlIHJlZ2lvbiAod2hpY2gKLSAgICAgICAgICAgIC8vIGlzIGluIHNjcmVlbiBzcGFjZSBhcyB3ZWxsKS4KLSAgICAgICAgICAgIHBvc3RlZFJlZ2lvbi5hbmRTZWxmKHZpc2libGVSZWdpb25TY3JlZW4pOwotICAgICAgICAgICAgb3V0RGlydHlSZWdpb24ub3JTZWxmKHBvc3RlZFJlZ2lvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgTGF5ZXI6OmR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdAotewotICAgIExheWVyQmFzZUNsaWVudDo6ZHVtcChyZXN1bHQsIGJ1ZmZlciwgU0laRSk7Ci0KLSAgICBzcDxjb25zdCBHcmFwaGljQnVmZmVyPiBidWYwKG1BY3RpdmVCdWZmZXIpOwotICAgIHVpbnQzMl90IHcwPTAsIGgwPTAsIHMwPTAsIGYwPTA7Ci0gICAgaWYgKGJ1ZjAgIT0gMCkgewotICAgICAgICB3MCA9IGJ1ZjAtPmdldFdpZHRoKCk7Ci0gICAgICAgIGgwID0gYnVmMC0+Z2V0SGVpZ2h0KCk7Ci0gICAgICAgIHMwID0gYnVmMC0+Z2V0U3RyaWRlKCk7Ci0gICAgICAgIGYwID0gYnVmMC0+Zm9ybWF0OwotICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAiICAgICAgIgotICAgICAgICAgICAgImZvcm1hdD0lMmQsIGFjdGl2ZUJ1ZmZlcj1bJTR1eCU0dTolNHUsJTNYXSwiCi0gICAgICAgICAgICAiIHRyYW5zZm9ybS1oaW50PTB4JTAyeCwgcXVldWVkLWZyYW1lcz0lZCwgbVJlZnJlc2hQZW5kaW5nPSVkXG4iLAotICAgICAgICAgICAgbUZvcm1hdCwgdzAsIGgwLCBzMCxmMCwKLSAgICAgICAgICAgIGdldFRyYW5zZm9ybUhpbnQoKSwgbVF1ZXVlZEZyYW1lcywgbVJlZnJlc2hQZW5kaW5nKTsKLQotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIGlmIChtU3VyZmFjZVRleHR1cmUgIT0gMCkgewotICAgICAgICBtU3VyZmFjZVRleHR1cmUtPmR1bXAocmVzdWx0LCAiICAgICAgICAgICAgIiwgYnVmZmVyLCBTSVpFKTsKLSAgICB9Ci19Ci0KLXZvaWQgTGF5ZXI6OmR1bXBTdGF0cyhTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0Ci17Ci0gICAgTGF5ZXJCYXNlQ2xpZW50OjpkdW1wU3RhdHMocmVzdWx0LCBidWZmZXIsIFNJWkUpOwotICAgIGNvbnN0IHNpemVfdCBvID0gbUZyYW1lTGF0ZW5jeU9mZnNldDsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgY29uc3QgbnNlY3NfdCBwZXJpb2QgPSBody5nZXRSZWZyZXNoUGVyaW9kKCk7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWxsZFxuIiwgcGVyaW9kKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPDEyOCA7IGkrKykgewotICAgICAgICBjb25zdCBzaXplX3QgaW5kZXggPSAobytpKSAlIDEyODsKLSAgICAgICAgY29uc3QgbnNlY3NfdCB0aW1lX2FwcCAgID0gbUZyYW1lU3RhdHNbaW5kZXhdLnRpbWVzdGFtcDsKLSAgICAgICAgY29uc3QgbnNlY3NfdCB0aW1lX3NldCAgID0gbUZyYW1lU3RhdHNbaW5kZXhdLnNldDsKLSAgICAgICAgY29uc3QgbnNlY3NfdCB0aW1lX3ZzeW5jID0gbUZyYW1lU3RhdHNbaW5kZXhdLnZzeW5jOwotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlbGxkXHQlbGxkXHQlbGxkXG4iLAotICAgICAgICAgICAgICAgIHRpbWVfYXBwLAotICAgICAgICAgICAgICAgIHRpbWVfdnN5bmMsCi0gICAgICAgICAgICAgICAgdGltZV9zZXQpOwotICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotfQotCi12b2lkIExheWVyOjpjbGVhclN0YXRzKCkKLXsKLSAgICBMYXllckJhc2VDbGllbnQ6OmNsZWFyU3RhdHMoKTsKLSAgICBtZW1zZXQobUZyYW1lU3RhdHMsIDAsIHNpemVvZihtRnJhbWVTdGF0cykpOwotfQotCi11aW50MzJfdCBMYXllcjo6Z2V0RWZmZWN0aXZlVXNhZ2UodWludDMyX3QgdXNhZ2UpIGNvbnN0Ci17Ci0gICAgLy8gVE9ETzogc2hvdWxkIHdlIGRvIHNvbWV0aGluZyBzcGVjaWFsIGlmIG1TZWN1cmUgaXMgc2V0PwotICAgIGlmIChtUHJvdGVjdGVkQnlBcHApIHsKLSAgICAgICAgLy8gbmVlZCBhIGhhcmR3YXJlLXByb3RlY3RlZCBwYXRoIHRvIGV4dGVybmFsIHZpZGVvIHNpbmsKLSAgICAgICAgdXNhZ2UgfD0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfUFJPVEVDVEVEOwotICAgIH0KLSAgICB1c2FnZSB8PSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUjsKLSAgICByZXR1cm4gdXNhZ2U7Ci19Ci0KLXVpbnQzMl90IExheWVyOjpnZXRUcmFuc2Zvcm1IaW50KCkgY29uc3QgewotICAgIHVpbnQzMl90IG9yaWVudGF0aW9uID0gMDsKLSAgICBpZiAoIW1GbGluZ2VyLT5tRGVidWdEaXNhYmxlVHJhbnNmb3JtSGludCkgewotICAgICAgICBvcmllbnRhdGlvbiA9IGdldFBsYW5lT3JpZW50YXRpb24oKTsKLSAgICAgICAgaWYgKG9yaWVudGF0aW9uICYgVHJhbnNmb3JtOjpST1RfSU5WQUxJRCkgewotICAgICAgICAgICAgb3JpZW50YXRpb24gPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvcmllbnRhdGlvbjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDUwOGMyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9MQVlFUl9ICi0jZGVmaW5lIEFORFJPSURfTEFZRVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxndWkvU3VyZmFjZVRleHR1cmUuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3NlckNsaWVudC5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSAiTGF5ZXJCYXNlLmgiCi0jaW5jbHVkZSAiU3VyZmFjZVRleHR1cmVMYXllci5oIgotI2luY2x1ZGUgIlRyYW5zZm9ybS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBDbGllbnQ7Ci1jbGFzcyBHTEV4dGVuc2lvbnM7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMYXllciA6IHB1YmxpYyBMYXllckJhc2VDbGllbnQKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgIExheWVyKFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLCBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50KTsKLQotICAgIHZpcnR1YWwgfkxheWVyKCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldFR5cGVJZCgpIGNvbnN0IHsgcmV0dXJuICJMYXllciI7IH0KLQotICAgIC8vIHRoZSB0aGlzIGxheWVyJ3Mgc2l6ZSBhbmQgZm9ybWF0Ci0gICAgc3RhdHVzX3Qgc2V0QnVmZmVycyh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCAKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgZmxhZ3M9MCk7Ci0KLSAgICBib29sIGlzRml4ZWRTaXplKCkgY29uc3Q7Ci0KLSAgICAvLyBMYXllckJhc2UgaW50ZXJmYWNlCi0gICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5KGh3Y19sYXllcl90KiBod2NsKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25EcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBkb1RyYW5zYWN0aW9uKHVpbnQzMl90IHRyYW5zYWN0aW9uRmxhZ3MpOwotICAgIHZpcnR1YWwgdm9pZCBsb2NrUGFnZUZsaXAoYm9vbCYgcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMpOwotICAgIHZpcnR1YWwgdm9pZCB1bmxvY2tQYWdlRmxpcChjb25zdCBUcmFuc2Zvcm0mIHBsYW5lVHJhbnNmb3JtLCBSZWdpb24mIG91dERpcnR5UmVnaW9uKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNPcGFxdWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgbmVlZHNEaXRoZXJpbmcoKSBjb25zdCAgICAgeyByZXR1cm4gbU5lZWRzRGl0aGVyaW5nOyB9Ci0gICAgdmlydHVhbCBib29sIGlzU2VjdXJlKCkgY29uc3QgICAgICAgICAgIHsgcmV0dXJuIG1TZWN1cmU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNQcm90ZWN0ZWQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgb25SZW1vdmVkKCk7Ci0gICAgdmlydHVhbCBzcDxMYXllcj4gZ2V0TGF5ZXIoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PExheWVyKj4odGhpcyk7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmc4JiBuYW1lKTsKLQotICAgIC8vIExheWVyQmFzZUNsaWVudCBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHdwPElCaW5kZXI+IGdldFN1cmZhY2VUZXh0dXJlQmluZGVyKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25MYXllckRpc3BsYXllZCgpOwotICAgIHZpcnR1YWwgYm9vbCBvblByZUNvbXBvc2l0aW9uKCk7Ci0KLSAgICAvLyBvbmx5IGZvciBkZWJ1Z2dpbmcKLSAgICBpbmxpbmUgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdldEFjdGl2ZUJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1BY3RpdmVCdWZmZXI7IH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7Ci0gICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBzY3JhdGNoLCBzaXplX3Qgc2l6ZSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGR1bXBTdGF0cyhTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBjbGVhclN0YXRzKCk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIFN1cmZhY2VUZXh0dXJlTGF5ZXI7Ci0gICAgdm9pZCBvbkZyYW1lUXVldWVkKCk7Ci0gICAgdmlydHVhbCBzcDxJU3VyZmFjZT4gY3JlYXRlU3VyZmFjZSgpOwotICAgIHVpbnQzMl90IGdldEVmZmVjdGl2ZVVzYWdlKHVpbnQzMl90IHVzYWdlKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRUcmFuc2Zvcm1IaW50KCkgY29uc3Q7Ci0gICAgYm9vbCBpc0Nyb3BwZWQoKSBjb25zdDsKLSAgICBzdGF0aWMgYm9vbCBnZXRPcGFjaXR5Rm9yRm9ybWF0KHVpbnQzMl90IGZvcm1hdCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gY29uc3RhbnRzCi0gICAgc3A8U3VyZmFjZVRleHR1cmVMYXllcj4gbVN1cmZhY2VUZXh0dXJlOwotICAgIEdMdWludCBtVGV4dHVyZU5hbWU7Ci0KLSAgICAvLyB0aHJlYWQtc2FmZQotICAgIHZvbGF0aWxlIGludDMyX3QgbVF1ZXVlZEZyYW1lczsKLQotICAgIC8vIG1haW4gdGhyZWFkCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUFjdGl2ZUJ1ZmZlcjsKLSAgICBHTGZsb2F0IG1UZXh0dXJlTWF0cml4WzE2XTsKLSAgICBSZWN0IG1DdXJyZW50Q3JvcDsKLSAgICB1aW50MzJfdCBtQ3VycmVudFRyYW5zZm9ybTsKLSAgICB1aW50MzJfdCBtQ3VycmVudFNjYWxpbmdNb2RlOwotICAgIGJvb2wgbUN1cnJlbnRPcGFjaXR5OwotICAgIGJvb2wgbVJlZnJlc2hQZW5kaW5nOwotICAgIGJvb2wgbUZyYW1lTGF0ZW5jeU5lZWRlZDsKLSAgICBpbnQgbUZyYW1lTGF0ZW5jeU9mZnNldDsKLQotICAgIHN0cnVjdCBTdGF0aXN0aWNzIHsKLSAgICAgICAgU3RhdGlzdGljcygpIDogdGltZXN0YW1wKDApLCBzZXQoMCksIHZzeW5jKDApIHsgfQotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcDsgIC8vIGJ1ZmZlciB0aW1lc3RhbXAKLSAgICAgICAgbnNlY3NfdCBzZXQ7ICAgICAgICAvLyBidWZmZXIgZGlzcGxheWVkIHRpbWVzdGFtcAotICAgICAgICBuc2Vjc190IHZzeW5jOyAgICAgIC8vIHZzeW5jIGltbWVkaWF0ZWx5IGJlZm9yZSBzZXQKLSAgICB9OwotCi0gICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCi0gICAgU3RhdGlzdGljcyBtRnJhbWVTdGF0c1sxMjhdOwotCi0gICAgLy8gY29uc3RhbnRzCi0gICAgUGl4ZWxGb3JtYXQgbUZvcm1hdDsKLSAgICBjb25zdCBHTEV4dGVuc2lvbnMmIG1HTEV4dGVuc2lvbnM7Ci0gICAgYm9vbCBtT3BhcXVlTGF5ZXI7Ci0gICAgYm9vbCBtTmVlZHNEaXRoZXJpbmc7Ci0KLSAgICAvLyBwYWdlLWZsaXAgdGhyZWFkIChjdXJyZW50bHkgbWFpbiB0aHJlYWQpCi0gICAgYm9vbCBtU2VjdXJlOyAgICAgICAgIC8vIG5vIHNjcmVlbnNob3RzCi0gICAgYm9vbCBtUHJvdGVjdGVkQnlBcHA7IC8vIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHByb3RlY3RlZCBwYXRoIHRvIGV4dGVybmFsIHNpbmsKLSAgICBSZWdpb24gbVBvc3RlZERpcnR5UmVnaW9uOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0xBWUVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzY0MDAxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotCi0jaW5jbHVkZSAiY2x6LmgiCi0jaW5jbHVkZSAiTGF5ZXJCYXNlLmgiCi0jaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKLSNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludDMyX3QgTGF5ZXJCYXNlOjpzU2VxdWVuY2UgPSAxOwotCi1MYXllckJhc2U6OkxheWVyQmFzZShTdXJmYWNlRmxpbmdlciogZmxpbmdlciwgRGlzcGxheUlEIGRpc3BsYXkpCi0gICAgOiBkcHkoZGlzcGxheSksIGNvbnRlbnREaXJ0eShmYWxzZSksCi0gICAgICBzZXF1ZW5jZSh1aW50MzJfdChhbmRyb2lkX2F0b21pY19pbmMoJnNTZXF1ZW5jZSkpKSwKLSAgICAgIG1GbGluZ2VyKGZsaW5nZXIpLCBtRmlsdGVyaW5nKGZhbHNlKSwKLSAgICAgIG1OZWVkc0ZpbHRlcmluZyhmYWxzZSksIG1Jbk92ZXJsYXkoZmFsc2UpLAotICAgICAgbU9yaWVudGF0aW9uKDApLAotICAgICAgbVBsYW5lT3JpZW50YXRpb24oMCksCi0gICAgICBtVHJhbnNhY3Rpb25GbGFncygwKSwKLSAgICAgIG1QcmVtdWx0aXBsaWVkQWxwaGEodHJ1ZSksIG1OYW1lKCJ1bm5hbWVkIiksIG1EZWJ1ZyhmYWxzZSkKLXsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGZsaW5nZXItPmdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgbUZsYWdzID0gaHcuZ2V0RmxhZ3MoKTsKLX0KLQotTGF5ZXJCYXNlOjp+TGF5ZXJCYXNlKCkKLXsKLX0KLQotdm9pZCBMYXllckJhc2U6OnNldE5hbWUoY29uc3QgU3RyaW5nOCYgbmFtZSkgewotICAgIG1OYW1lID0gbmFtZTsKLX0KLQotU3RyaW5nOCBMYXllckJhc2U6OmdldE5hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1OYW1lOwotfQotCi1jb25zdCBHcmFwaGljUGxhbmUmIExheWVyQmFzZTo6Z3JhcGhpY1BsYW5lKGludCBkcHkpIGNvbnN0Ci17IAotICAgIHJldHVybiBtRmxpbmdlci0+Z3JhcGhpY1BsYW5lKGRweSk7Ci19Ci0KLUdyYXBoaWNQbGFuZSYgTGF5ZXJCYXNlOjpncmFwaGljUGxhbmUoaW50IGRweSkKLXsKLSAgICByZXR1cm4gbUZsaW5nZXItPmdyYXBoaWNQbGFuZShkcHkpOyAKLX0KLQotdm9pZCBMYXllckJhc2U6OmluaXRTdGF0ZXModWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgdWludDMyX3QgbGF5ZXJGbGFncyA9IDA7Ci0gICAgaWYgKGZsYWdzICYgSVN1cmZhY2VDb21wb3Nlcjo6ZUhpZGRlbikKLSAgICAgICAgbGF5ZXJGbGFncyA9IElTdXJmYWNlQ29tcG9zZXI6OmVMYXllckhpZGRlbjsKLQotICAgIGlmIChmbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVOb25QcmVtdWx0aXBsaWVkKQotICAgICAgICBtUHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2U7Ci0KLSAgICBtQ3VycmVudFN0YXRlLnogICAgICAgICAgICAgPSAwOwotICAgIG1DdXJyZW50U3RhdGUudyAgICAgICAgICAgICA9IHc7Ci0gICAgbUN1cnJlbnRTdGF0ZS5oICAgICAgICAgICAgID0gaDsKLSAgICBtQ3VycmVudFN0YXRlLnJlcXVlc3RlZF93ICAgPSB3OwotICAgIG1DdXJyZW50U3RhdGUucmVxdWVzdGVkX2ggICA9IGg7Ci0gICAgbUN1cnJlbnRTdGF0ZS5hbHBoYSAgICAgICAgID0gMHhGRjsKLSAgICBtQ3VycmVudFN0YXRlLmZsYWdzICAgICAgICAgPSBsYXllckZsYWdzOwotICAgIG1DdXJyZW50U3RhdGUuc2VxdWVuY2UgICAgICA9IDA7Ci0gICAgbUN1cnJlbnRTdGF0ZS50cmFuc2Zvcm0uc2V0KDAsIDApOwotCi0gICAgLy8gZHJhd2luZyBzdGF0ZSAmIGN1cnJlbnQgc3RhdGUgYXJlIGlkZW50aWNhbAotICAgIG1EcmF3aW5nU3RhdGUgPSBtQ3VycmVudFN0YXRlOwotfQotCi12b2lkIExheWVyQmFzZTo6Y29tbWl0VHJhbnNhY3Rpb24oKSB7Ci0gICAgbURyYXdpbmdTdGF0ZSA9IG1DdXJyZW50U3RhdGU7Ci19Ci12b2lkIExheWVyQmFzZTo6Zm9yY2VWaXNpYmlsaXR5VHJhbnNhY3Rpb24oKSB7Ci0gICAgLy8gdGhpcyBjYW4gYmUgY2FsbGVkIHdpdGhvdXQgU3VyZmFjZUZsaW5nZXIubVN0YXRlTG9jaywgYnV0IGlmIHdlCi0gICAgLy8gY2FuIGF0b21pY2FsbHkgaW5jcmVtZW50IHRoZSBzZXF1ZW5jZSBudW1iZXIsIGl0IGRvZXNuJ3QgbWF0dGVyLgotICAgIGFuZHJvaWRfYXRvbWljX2luYygmbUN1cnJlbnRTdGF0ZS5zZXF1ZW5jZSk7Ci0gICAgcmVxdWVzdFRyYW5zYWN0aW9uKCk7Ci19Ci1ib29sIExheWVyQmFzZTo6cmVxdWVzdFRyYW5zYWN0aW9uKCkgewotICAgIGludDMyX3Qgb2xkID0gc2V0VHJhbnNhY3Rpb25GbGFncyhlVHJhbnNhY3Rpb25OZWVkZWQpOwotICAgIHJldHVybiAoKG9sZCAmIGVUcmFuc2FjdGlvbk5lZWRlZCkgPT0gMCk7Ci19Ci11aW50MzJfdCBMYXllckJhc2U6OmdldFRyYW5zYWN0aW9uRmxhZ3ModWludDMyX3QgZmxhZ3MpIHsKLSAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfYW5kKH5mbGFncywgJm1UcmFuc2FjdGlvbkZsYWdzKSAmIGZsYWdzOwotfQotdWludDMyX3QgTGF5ZXJCYXNlOjpzZXRUcmFuc2FjdGlvbkZsYWdzKHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX29yKGZsYWdzLCAmbVRyYW5zYWN0aW9uRmxhZ3MpOwotfQotCi1ib29sIExheWVyQmFzZTo6c2V0UG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSkgewotICAgIGlmIChtQ3VycmVudFN0YXRlLnRyYW5zZm9ybS50eCgpID09IHggJiYgbUN1cnJlbnRTdGF0ZS50cmFuc2Zvcm0udHkoKSA9PSB5KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbUN1cnJlbnRTdGF0ZS5zZXF1ZW5jZSsrOwotICAgIG1DdXJyZW50U3RhdGUudHJhbnNmb3JtLnNldCh4LCB5KTsKLSAgICByZXF1ZXN0VHJhbnNhY3Rpb24oKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgTGF5ZXJCYXNlOjpzZXRMYXllcih1aW50MzJfdCB6KSB7Ci0gICAgaWYgKG1DdXJyZW50U3RhdGUueiA9PSB6KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbUN1cnJlbnRTdGF0ZS5zZXF1ZW5jZSsrOwotICAgIG1DdXJyZW50U3RhdGUueiA9IHo7Ci0gICAgcmVxdWVzdFRyYW5zYWN0aW9uKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIExheWVyQmFzZTo6c2V0U2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoKSB7Ci0gICAgaWYgKG1DdXJyZW50U3RhdGUucmVxdWVzdGVkX3cgPT0gdyAmJiBtQ3VycmVudFN0YXRlLnJlcXVlc3RlZF9oID09IGgpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBtQ3VycmVudFN0YXRlLnJlcXVlc3RlZF93ID0gdzsKLSAgICBtQ3VycmVudFN0YXRlLnJlcXVlc3RlZF9oID0gaDsKLSAgICByZXF1ZXN0VHJhbnNhY3Rpb24oKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgTGF5ZXJCYXNlOjpzZXRBbHBoYSh1aW50OF90IGFscGhhKSB7Ci0gICAgaWYgKG1DdXJyZW50U3RhdGUuYWxwaGEgPT0gYWxwaGEpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBtQ3VycmVudFN0YXRlLnNlcXVlbmNlKys7Ci0gICAgbUN1cnJlbnRTdGF0ZS5hbHBoYSA9IGFscGhhOwotICAgIHJlcXVlc3RUcmFuc2FjdGlvbigpOwotICAgIHJldHVybiB0cnVlOwotfQotYm9vbCBMYXllckJhc2U6OnNldE1hdHJpeChjb25zdCBsYXllcl9zdGF0ZV90OjptYXRyaXgyMl90JiBtYXRyaXgpIHsKLSAgICBtQ3VycmVudFN0YXRlLnNlcXVlbmNlKys7Ci0gICAgbUN1cnJlbnRTdGF0ZS50cmFuc2Zvcm0uc2V0KAotICAgICAgICAgICAgbWF0cml4LmRzZHgsIG1hdHJpeC5kc2R5LCBtYXRyaXguZHRkeCwgbWF0cml4LmR0ZHkpOwotICAgIHJlcXVlc3RUcmFuc2FjdGlvbigpOwotICAgIHJldHVybiB0cnVlOwotfQotYm9vbCBMYXllckJhc2U6OnNldFRyYW5zcGFyZW50UmVnaW9uSGludChjb25zdCBSZWdpb24mIHRyYW5zcGFyZW50KSB7Ci0gICAgbUN1cnJlbnRTdGF0ZS5zZXF1ZW5jZSsrOwotICAgIG1DdXJyZW50U3RhdGUudHJhbnNwYXJlbnRSZWdpb24gPSB0cmFuc3BhcmVudDsKLSAgICByZXF1ZXN0VHJhbnNhY3Rpb24oKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgTGF5ZXJCYXNlOjpzZXRGbGFncyh1aW50OF90IGZsYWdzLCB1aW50OF90IG1hc2spIHsKLSAgICBjb25zdCB1aW50MzJfdCBuZXdGbGFncyA9IChtQ3VycmVudFN0YXRlLmZsYWdzICYgfm1hc2spIHwgKGZsYWdzICYgbWFzayk7Ci0gICAgaWYgKG1DdXJyZW50U3RhdGUuZmxhZ3MgPT0gbmV3RmxhZ3MpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBtQ3VycmVudFN0YXRlLnNlcXVlbmNlKys7Ci0gICAgbUN1cnJlbnRTdGF0ZS5mbGFncyA9IG5ld0ZsYWdzOwotICAgIHJlcXVlc3RUcmFuc2FjdGlvbigpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1SZWN0IExheWVyQmFzZTo6dmlzaWJsZUJvdW5kcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1UcmFuc2Zvcm1lZEJvdW5kczsKLX0gICAgICAKLQotdm9pZCBMYXllckJhc2U6OnNldFZpc2libGVSZWdpb24oY29uc3QgUmVnaW9uJiB2aXNpYmxlUmVnaW9uKSB7Ci0gICAgLy8gYWx3YXlzIGNhbGxlZCBmcm9tIG1haW4gdGhyZWFkCi0gICAgdmlzaWJsZVJlZ2lvblNjcmVlbiA9IHZpc2libGVSZWdpb247Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpzZXRDb3ZlcmVkUmVnaW9uKGNvbnN0IFJlZ2lvbiYgY292ZXJlZFJlZ2lvbikgewotICAgIC8vIGFsd2F5cyBjYWxsZWQgZnJvbSBtYWluIHRocmVhZAotICAgIGNvdmVyZWRSZWdpb25TY3JlZW4gPSBjb3ZlcmVkUmVnaW9uOwotfQotCi11aW50MzJfdCBMYXllckJhc2U6OmRvVHJhbnNhY3Rpb24odWludDMyX3QgZmxhZ3MpCi17Ci0gICAgY29uc3QgTGF5ZXI6OlN0YXRlJiBmcm9udChkcmF3aW5nU3RhdGUoKSk7Ci0gICAgY29uc3QgTGF5ZXI6OlN0YXRlJiB0ZW1wKGN1cnJlbnRTdGF0ZSgpKTsKLQotICAgIGlmICgoZnJvbnQucmVxdWVzdGVkX3cgIT0gdGVtcC5yZXF1ZXN0ZWRfdykgfHwKLSAgICAgICAgKGZyb250LnJlcXVlc3RlZF9oICE9IHRlbXAucmVxdWVzdGVkX2gpKSAgewotICAgICAgICAvLyByZXNpemUgdGhlIGxheWVyLCBzZXQgdGhlIHBoeXNpY2FsIHNpemUgdG8gdGhlIHJlcXVlc3RlZCBzaXplCi0gICAgICAgIExheWVyOjpTdGF0ZSYgZWRpdFRlbXAoY3VycmVudFN0YXRlKCkpOwotICAgICAgICBlZGl0VGVtcC53ID0gdGVtcC5yZXF1ZXN0ZWRfdzsKLSAgICAgICAgZWRpdFRlbXAuaCA9IHRlbXAucmVxdWVzdGVkX2g7Ci0gICAgfQotCi0gICAgaWYgKChmcm9udC53ICE9IHRlbXAudykgfHwgKGZyb250LmggIT0gdGVtcC5oKSkgewotICAgICAgICAvLyBpbnZhbGlkYXRlIGFuZCByZWNvbXB1dGUgdGhlIHZpc2libGUgcmVnaW9ucyBpZiBuZWVkZWQKLSAgICAgICAgZmxhZ3MgfD0gTGF5ZXI6OmVWaXNpYmxlUmVnaW9uOwotICAgIH0KLQotICAgIGlmICh0ZW1wLnNlcXVlbmNlICE9IGZyb250LnNlcXVlbmNlKSB7Ci0gICAgICAgIC8vIGludmFsaWRhdGUgYW5kIHJlY29tcHV0ZSB0aGUgdmlzaWJsZSByZWdpb25zIGlmIG5lZWRlZAotICAgICAgICBmbGFncyB8PSBlVmlzaWJsZVJlZ2lvbjsKLSAgICAgICAgdGhpcy0+Y29udGVudERpcnR5ID0gdHJ1ZTsKLQotICAgICAgICAvLyB3ZSBtYXkgdXNlIGxpbmVhciBmaWx0ZXJpbmcsIGlmIHRoZSBtYXRyaXggc2NhbGVzIHVzCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgdHlwZSA9IHRlbXAudHJhbnNmb3JtLmdldFR5cGUoKTsKLSAgICAgICAgbU5lZWRzRmlsdGVyaW5nID0gKCF0ZW1wLnRyYW5zZm9ybS5wcmVzZXJ2ZVJlY3RzKCkgfHwKLSAgICAgICAgICAgICAgICAodHlwZSA+PSBUcmFuc2Zvcm06OlNDQUxFKSk7Ci0gICAgfQotCi0gICAgLy8gQ29tbWl0IHRoZSB0cmFuc2FjdGlvbgotICAgIGNvbW1pdFRyYW5zYWN0aW9uKCk7Ci0gICAgcmV0dXJuIGZsYWdzOwotfQotCi12b2lkIExheWVyQmFzZTo6dmFsaWRhdGVWaXNpYmlsaXR5KGNvbnN0IFRyYW5zZm9ybSYgcGxhbmVUcmFuc2Zvcm0pCi17Ci0gICAgY29uc3QgTGF5ZXI6OlN0YXRlJiBzKGRyYXdpbmdTdGF0ZSgpKTsKLSAgICBjb25zdCBUcmFuc2Zvcm0gdHIocGxhbmVUcmFuc2Zvcm0gKiBzLnRyYW5zZm9ybSk7Ci0gICAgY29uc3QgYm9vbCB0cmFuc2Zvcm1lZCA9IHRyLnRyYW5zZm9ybWVkKCk7Ci0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIGNvbnN0IHVpbnQzMl90IGh3X2ggPSBody5nZXRIZWlnaHQoKTsKLQotICAgIHVpbnQzMl90IHcgPSBzLnc7Ci0gICAgdWludDMyX3QgaCA9IHMuaDsgICAgCi0gICAgdHIudHJhbnNmb3JtKG1WZXJ0aWNlc1swXSwgMCwgMCk7Ci0gICAgdHIudHJhbnNmb3JtKG1WZXJ0aWNlc1sxXSwgMCwgaCk7Ci0gICAgdHIudHJhbnNmb3JtKG1WZXJ0aWNlc1syXSwgdywgaCk7Ci0gICAgdHIudHJhbnNmb3JtKG1WZXJ0aWNlc1szXSwgdywgMCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTw0IDsgaSsrKQotICAgICAgICBtVmVydGljZXNbaV1bMV0gPSBod19oIC0gbVZlcnRpY2VzW2ldWzFdOwotCi0gICAgaWYgKENDX1VOTElLRUxZKHRyYW5zZm9ybWVkKSkgewotICAgICAgICAvLyBOT1RFOiBoZXJlIHdlIGNvdWxkIGFsc28gcHVudCBpZiB3ZSBoYXZlIHRvbyBtYW55IHJlY3RhbmdsZXMKLSAgICAgICAgLy8gaW4gdGhlIHRyYW5zcGFyZW50IHJlZ2lvbgotICAgICAgICBpZiAodHIucHJlc2VydmVSZWN0cygpKSB7Ci0gICAgICAgICAgICAvLyB0cmFuc2Zvcm0gdGhlIHRyYW5zcGFyZW50IHJlZ2lvbgotICAgICAgICAgICAgdHJhbnNwYXJlbnRSZWdpb25TY3JlZW4gPSB0ci50cmFuc2Zvcm0ocy50cmFuc3BhcmVudFJlZ2lvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0cmFuc2Zvcm1hdGlvbiB0b28gY29tcGxleCwgY2FuJ3QgZG8gdGhlIHRyYW5zcGFyZW50IHJlZ2lvbgotICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLgotICAgICAgICAgICAgdHJhbnNwYXJlbnRSZWdpb25TY3JlZW4uY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRyYW5zcGFyZW50UmVnaW9uU2NyZWVuID0gcy50cmFuc3BhcmVudFJlZ2lvbjsKLSAgICB9Ci0KLSAgICAvLyBjYWNoZSBhIGZldyB0aGluZ3MuLi4KLSAgICBtT3JpZW50YXRpb24gPSB0ci5nZXRPcmllbnRhdGlvbigpOwotICAgIG1QbGFuZU9yaWVudGF0aW9uID0gcGxhbmVUcmFuc2Zvcm0uZ2V0T3JpZW50YXRpb24oKTsKLSAgICBtVHJhbnNmb3JtID0gdHI7Ci0gICAgbVRyYW5zZm9ybWVkQm91bmRzID0gdHIubWFrZUJvdW5kcyh3LCBoKTsKLX0KLQotdm9pZCBMYXllckJhc2U6OmxvY2tQYWdlRmxpcChib29sJiByZWNvbXB1dGVWaXNpYmxlUmVnaW9ucykgewotfQotCi12b2lkIExheWVyQmFzZTo6dW5sb2NrUGFnZUZsaXAoCi0gICAgICAgIGNvbnN0IFRyYW5zZm9ybSYgcGxhbmVUcmFuc2Zvcm0sIFJlZ2lvbiYgb3V0RGlydHlSZWdpb24pIHsKLX0KLQotdm9pZCBMYXllckJhc2U6OmRyYXdSZWdpb24oY29uc3QgUmVnaW9uJiByZWcpIGNvbnN0Ci17Ci0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IHJlZy5iZWdpbigpOwotICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgY29uc3QgZW5kID0gcmVnLmVuZCgpOwotICAgIGlmIChpdCAhPSBlbmQpIHsKLSAgICAgICAgUmVjdCByOwotICAgICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgICAgIGNvbnN0IGludDMyX3QgZmJXaWR0aCAgPSBody5nZXRXaWR0aCgpOwotICAgICAgICBjb25zdCBpbnQzMl90IGZiSGVpZ2h0ID0gaHcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGNvbnN0IEdMc2hvcnQgdmVydGljZXNbXVsyXSA9IHsgeyAwLCAwIH0sIHsgZmJXaWR0aCwgMCB9LCAKLSAgICAgICAgICAgICAgICB7IGZiV2lkdGgsIGZiSGVpZ2h0IH0sIHsgMCwgZmJIZWlnaHQgfSAgfTsKLSAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX1NIT1JULCAwLCB2ZXJ0aWNlcyk7Ci0gICAgICAgIHdoaWxlIChpdCAhPSBlbmQpIHsKLSAgICAgICAgICAgIGNvbnN0IFJlY3QmIHIgPSAqaXQrKzsKLSAgICAgICAgICAgIGNvbnN0IEdMaW50IHN5ID0gZmJIZWlnaHQgLSAoci50b3AgKyByLmhlaWdodCgpKTsKLSAgICAgICAgICAgIGdsU2Npc3NvcihyLmxlZnQsIHN5LCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgICAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7IAotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIExheWVyQmFzZTo6c2V0R2VvbWV0cnkoaHdjX2xheWVyX3QqIGh3Y2wpCi17Ci0gICAgaHdjbC0+Y29tcG9zaXRpb25UeXBlID0gSFdDX0ZSQU1FQlVGRkVSOwotICAgIGh3Y2wtPmhpbnRzID0gMDsKLSAgICBod2NsLT5mbGFncyA9IEhXQ19TS0lQX0xBWUVSOwotICAgIGh3Y2wtPnRyYW5zZm9ybSA9IDA7Ci0gICAgaHdjbC0+YmxlbmRpbmcgPSBIV0NfQkxFTkRJTkdfTk9ORTsKLQotICAgIC8vIHRoaXMgZ2l2ZXMgdXMgb25seSB0aGUgIm9yaWVudGF0aW9uIiBjb21wb25lbnQgb2YgdGhlIHRyYW5zZm9ybQotICAgIGNvbnN0IFN0YXRlJiBzKGRyYXdpbmdTdGF0ZSgpKTsKLSAgICBjb25zdCB1aW50MzJfdCBmaW5hbFRyYW5zZm9ybSA9IHMudHJhbnNmb3JtLmdldE9yaWVudGF0aW9uKCk7Ci0gICAgLy8gd2UgY2FuIG9ubHkgaGFuZGxlIHNpbXBsZSB0cmFuc2Zvcm1hdGlvbgotICAgIGlmIChmaW5hbFRyYW5zZm9ybSAmIFRyYW5zZm9ybTo6Uk9UX0lOVkFMSUQpIHsKLSAgICAgICAgaHdjbC0+ZmxhZ3MgPSBIV0NfU0tJUF9MQVlFUjsKLSAgICB9IGVsc2UgewotICAgICAgICBod2NsLT50cmFuc2Zvcm0gPSBmaW5hbFRyYW5zZm9ybTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzT3BhcXVlKCkpIHsKLSAgICAgICAgaHdjbC0+YmxlbmRpbmcgPSBtUHJlbXVsdGlwbGllZEFscGhhID8KLSAgICAgICAgICAgICAgICBIV0NfQkxFTkRJTkdfUFJFTVVMVCA6IEhXQ19CTEVORElOR19DT1ZFUkFHRTsKLSAgICB9Ci0KLSAgICAvLyBzY2FsaW5nIGlzIGFscmVhZHkgYXBwbGllZCBpbiBtVHJhbnNmb3JtZWRCb3VuZHMKLSAgICBod2NsLT5kaXNwbGF5RnJhbWUubGVmdCAgID0gbVRyYW5zZm9ybWVkQm91bmRzLmxlZnQ7Ci0gICAgaHdjbC0+ZGlzcGxheUZyYW1lLnRvcCAgICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy50b3A7Ci0gICAgaHdjbC0+ZGlzcGxheUZyYW1lLnJpZ2h0ICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy5yaWdodDsKLSAgICBod2NsLT5kaXNwbGF5RnJhbWUuYm90dG9tID0gbVRyYW5zZm9ybWVkQm91bmRzLmJvdHRvbTsKLSAgICBod2NsLT52aXNpYmxlUmVnaW9uU2NyZWVuLnJlY3RzID0KLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aHdjX3JlY3RfdCBjb25zdCAqPigKLSAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVJlZ2lvblNjcmVlbi5nZXRBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaHdjbC0+dmlzaWJsZVJlZ2lvblNjcmVlbi5udW1SZWN0cykpOwotCi0gICAgaHdjbC0+c291cmNlQ3JvcC5sZWZ0ICAgPSAwOwotICAgIGh3Y2wtPnNvdXJjZUNyb3AudG9wICAgID0gMDsKLSAgICBod2NsLT5zb3VyY2VDcm9wLnJpZ2h0ICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy53aWR0aCgpOwotICAgIGh3Y2wtPnNvdXJjZUNyb3AuYm90dG9tID0gbVRyYW5zZm9ybWVkQm91bmRzLmhlaWdodCgpOwotfQotCi12b2lkIExheWVyQmFzZTo6c2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKSB7Ci0gICAgaHdjbC0+Y29tcG9zaXRpb25UeXBlID0gSFdDX0ZSQU1FQlVGRkVSOwotICAgIGh3Y2wtPmhhbmRsZSA9IE5VTEw7Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpzZXRPdmVybGF5KGJvb2wgaW5PdmVybGF5KSB7Ci0gICAgbUluT3ZlcmxheSA9IGluT3ZlcmxheTsKLX0KLQotYm9vbCBMYXllckJhc2U6OmlzT3ZlcmxheSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUluT3ZlcmxheTsKLX0KLQotdm9pZCBMYXllckJhc2U6OnNldEZpbHRlcmluZyhib29sIGZpbHRlcmluZykKLXsKLSAgICBtRmlsdGVyaW5nID0gZmlsdGVyaW5nOwotfQotCi1ib29sIExheWVyQmFzZTo6Z2V0RmlsdGVyaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbUZpbHRlcmluZzsKLX0KLQotdm9pZCBMYXllckJhc2U6OmRyYXcoY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdAotewotICAgIC8vIHJlc2V0IEdMIHN0YXRlCi0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLQotICAgIG9uRHJhdyhjbGlwKTsKLX0KLQotdm9pZCBMYXllckJhc2U6OmRyYXdGb3JTcmVlblNob3QoKQotewotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBzZXRGaWx0ZXJpbmcodHJ1ZSk7Ci0gICAgb25EcmF3KCBSZWdpb24oaHcuYm91bmRzKCkpICk7Ci0gICAgc2V0RmlsdGVyaW5nKGZhbHNlKTsKLX0KLQotdm9pZCBMYXllckJhc2U6OmNsZWFyV2l0aE9wZW5HTChjb25zdCBSZWdpb24mIGNsaXAsIEdMY2xhbXBmIHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMY2xhbXBmIGFscGhhKSBjb25zdAotewotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBjb25zdCB1aW50MzJfdCBmYkhlaWdodCA9IGh3LmdldEhlaWdodCgpOwotICAgIGdsQ29sb3I0ZihyZWQsZ3JlZW4sYmx1ZSxhbHBoYSk7Ci0KLSAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOwotICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotCi0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IGNsaXAuYmVnaW4oKTsKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IGVuZCA9IGNsaXAuZW5kKCk7Ci0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBnbFZlcnRleFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIG1WZXJ0aWNlcyk7Ci0gICAgd2hpbGUgKGl0ICE9IGVuZCkgewotICAgICAgICBjb25zdCBSZWN0JiByID0gKml0Kys7Ci0gICAgICAgIGNvbnN0IEdMaW50IHN5ID0gZmJIZWlnaHQgLSAoci50b3AgKyByLmhlaWdodCgpKTsKLSAgICAgICAgZ2xTY2lzc29yKHIubGVmdCwgc3ksIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOyAKLSAgICB9Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpjbGVhcldpdGhPcGVuR0woY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdAotewotICAgIGNsZWFyV2l0aE9wZW5HTChjbGlwLDAsMCwwLDApOwotfQotCi12b2lkIExheWVyQmFzZTo6ZHJhd1dpdGhPcGVuR0woY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdAotewotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBjb25zdCB1aW50MzJfdCBmYkhlaWdodCA9IGh3LmdldEhlaWdodCgpOwotICAgIGNvbnN0IFN0YXRlJiBzKGRyYXdpbmdTdGF0ZSgpKTsKLQotICAgIEdMZW51bSBzcmMgPSBtUHJlbXVsdGlwbGllZEFscGhhID8gR0xfT05FIDogR0xfU1JDX0FMUEhBOwotICAgIGlmIChDQ19VTkxJS0VMWShzLmFscGhhIDwgMHhGRikpIHsKLSAgICAgICAgY29uc3QgR0xmbG9hdCBhbHBoYSA9IHMuYWxwaGEgKiAoMS4wZi8yNTUuMGYpOwotICAgICAgICBpZiAobVByZW11bHRpcGxpZWRBbHBoYSkgewotICAgICAgICAgICAgZ2xDb2xvcjRmKGFscGhhLCBhbHBoYSwgYWxwaGEsIGFscGhhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdsQ29sb3I0ZigxLCAxLCAxLCBhbHBoYSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOwotICAgICAgICBnbEJsZW5kRnVuYyhzcmMsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotICAgICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX01PRFVMQVRFKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbENvbG9yNGYoMSwgMSwgMSwgMSk7Ci0gICAgICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7Ci0gICAgICAgIGlmICghaXNPcGFxdWUoKSkgewotICAgICAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOwotICAgICAgICAgICAgZ2xCbGVuZEZ1bmMoc3JjLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdHJ1Y3QgVGV4Q29vcmRzIHsKLSAgICAgICAgR0xmbG9hdCB1OwotICAgICAgICBHTGZsb2F0IHY7Ci0gICAgfTsKLQotICAgIFRleENvb3JkcyB0ZXhDb29yZHNbNF07Ci0gICAgdGV4Q29vcmRzWzBdLnUgPSAwOwotICAgIHRleENvb3Jkc1swXS52ID0gMTsKLSAgICB0ZXhDb29yZHNbMV0udSA9IDA7Ci0gICAgdGV4Q29vcmRzWzFdLnYgPSAwOwotICAgIHRleENvb3Jkc1syXS51ID0gMTsKLSAgICB0ZXhDb29yZHNbMl0udiA9IDA7Ci0gICAgdGV4Q29vcmRzWzNdLnUgPSAxOwotICAgIHRleENvb3Jkc1szXS52ID0gMTsKLQotICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX0ZMT0FULCAwLCBtVmVydGljZXMpOwotICAgIGdsVGV4Q29vcmRQb2ludGVyKDIsIEdMX0ZMT0FULCAwLCB0ZXhDb29yZHMpOwotCi0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IGNsaXAuYmVnaW4oKTsKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IGVuZCA9IGNsaXAuZW5kKCk7Ci0gICAgd2hpbGUgKGl0ICE9IGVuZCkgewotICAgICAgICBjb25zdCBSZWN0JiByID0gKml0Kys7Ci0gICAgICAgIGNvbnN0IEdMaW50IHN5ID0gZmJIZWlnaHQgLSAoci50b3AgKyByLmhlaWdodCgpKTsKLSAgICAgICAgZ2xTY2lzc29yKHIubGVmdCwgc3ksIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotICAgIH0KLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotfQotCi12b2lkIExheWVyQmFzZTo6ZHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0Ci17Ci0gICAgY29uc3QgTGF5ZXI6OlN0YXRlJiBzKGRyYXdpbmdTdGF0ZSgpKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICIrICVzICVwICglcylcbiIsCi0gICAgICAgICAgICBnZXRUeXBlSWQoKSwgdGhpcywgZ2V0TmFtZSgpLnN0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzLnRyYW5zcGFyZW50UmVnaW9uLmR1bXAocmVzdWx0LCAidHJhbnNwYXJlbnRSZWdpb24iKTsKLSAgICB0cmFuc3BhcmVudFJlZ2lvblNjcmVlbi5kdW1wKHJlc3VsdCwgInRyYW5zcGFyZW50UmVnaW9uU2NyZWVuIik7Ci0gICAgdmlzaWJsZVJlZ2lvblNjcmVlbi5kdW1wKHJlc3VsdCwgInZpc2libGVSZWdpb25TY3JlZW4iKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICIgICAgICAiCi0gICAgICAgICAgICAiej0lOWQsIHBvcz0oJWcsJWcpLCBzaXplPSglNGQsJTRkKSwgIgotICAgICAgICAgICAgImlzT3BhcXVlPSUxZCwgbmVlZHNEaXRoZXJpbmc9JTFkLCBpbnZhbGlkYXRlPSUxZCwgIgotICAgICAgICAgICAgImFscGhhPTB4JTAyeCwgZmxhZ3M9MHglMDh4LCB0cj1bJS4yZiwgJS4yZl1bJS4yZiwgJS4yZl1cbiIsCi0gICAgICAgICAgICBzLnosIHMudHJhbnNmb3JtLnR4KCksIHMudHJhbnNmb3JtLnR5KCksIHMudywgcy5oLAotICAgICAgICAgICAgaXNPcGFxdWUoKSwgbmVlZHNEaXRoZXJpbmcoKSwgY29udGVudERpcnR5LAotICAgICAgICAgICAgcy5hbHBoYSwgcy5mbGFncywKLSAgICAgICAgICAgIHMudHJhbnNmb3JtWzBdWzBdLCBzLnRyYW5zZm9ybVswXVsxXSwKLSAgICAgICAgICAgIHMudHJhbnNmb3JtWzFdWzBdLCBzLnRyYW5zZm9ybVsxXVsxXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotfQotCi12b2lkIExheWVyQmFzZTo6c2hvcnREdW1wKFN0cmluZzgmIHJlc3VsdCwgY2hhciogc2NyYXRjaCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKLSAgICBMYXllckJhc2U6OmR1bXAocmVzdWx0LCBzY3JhdGNoLCBzaXplKTsKLX0KLQotdm9pZCBMYXllckJhc2U6OmR1bXBTdGF0cyhTdHJpbmc4JiByZXN1bHQsIGNoYXIqIHNjcmF0Y2gsIHNpemVfdCBTSVpFKSBjb25zdCB7Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpjbGVhclN0YXRzKCkgewotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50MzJfdCBMYXllckJhc2VDbGllbnQ6OnNJZGVudGl0eSA9IDE7Ci0KLUxheWVyQmFzZUNsaWVudDo6TGF5ZXJCYXNlQ2xpZW50KFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLCBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50KQotICAgIDogTGF5ZXJCYXNlKGZsaW5nZXIsIGRpc3BsYXkpLAotICAgICAgbUhhc1N1cmZhY2UoZmFsc2UpLAotICAgICAgbUNsaWVudFJlZihjbGllbnQpLAotICAgICAgbUlkZW50aXR5KHVpbnQzMl90KGFuZHJvaWRfYXRvbWljX2luYygmc0lkZW50aXR5KSkpCi17Ci19Ci0KLUxheWVyQmFzZUNsaWVudDo6fkxheWVyQmFzZUNsaWVudCgpCi17Ci0gICAgc3A8Q2xpZW50PiBjKG1DbGllbnRSZWYucHJvbW90ZSgpKTsKLSAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgIGMtPmRldGFjaExheWVyKHRoaXMpOwotICAgIH0KLX0KLQotc3A8SVN1cmZhY2U+IExheWVyQmFzZUNsaWVudDo6Y3JlYXRlU3VyZmFjZSgpCi17Ci0gICAgY2xhc3MgQlN1cmZhY2UgOiBwdWJsaWMgQm5TdXJmYWNlLCBwdWJsaWMgTGF5ZXJDbGVhbmVyIHsKLSAgICAgICAgdmlydHVhbCBzcDxJU3VyZmFjZVRleHR1cmU+IGdldFN1cmZhY2VUZXh0dXJlKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHB1YmxpYzoKLSAgICAgICAgQlN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPExheWVyQmFzZUNsaWVudD4mIGxheWVyKQotICAgICAgICAgICAgOiBMYXllckNsZWFuZXIoZmxpbmdlciwgbGF5ZXIpIHsgfQotICAgIH07Ci0gICAgc3A8SVN1cmZhY2U+IHN1cihuZXcgQlN1cmZhY2UobUZsaW5nZXIsIHRoaXMpKTsKLSAgICByZXR1cm4gc3VyOwotfQotCi1zcDxJU3VyZmFjZT4gTGF5ZXJCYXNlQ2xpZW50OjpnZXRTdXJmYWNlKCkKLXsKLSAgICBzcDxJU3VyZmFjZT4gczsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtSGFzU3VyZmFjZSwKLSAgICAgICAgICAgICJMYXllckJhc2VDbGllbnQ6OmdldFN1cmZhY2UoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCIpOwotCi0gICAgbUhhc1N1cmZhY2UgPSB0cnVlOwotICAgIHMgPSBjcmVhdGVTdXJmYWNlKCk7Ci0gICAgbUNsaWVudFN1cmZhY2VCaW5kZXIgPSBzLT5hc0JpbmRlcigpOwotICAgIHJldHVybiBzOwotfQotCi13cDxJQmluZGVyPiBMYXllckJhc2VDbGllbnQ6OmdldFN1cmZhY2VCaW5kZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1DbGllbnRTdXJmYWNlQmluZGVyOwotfQotCi13cDxJQmluZGVyPiBMYXllckJhc2VDbGllbnQ6OmdldFN1cmZhY2VUZXh0dXJlQmluZGVyKCkgY29uc3QgewotICAgIHJldHVybiAwOwotfQotCi12b2lkIExheWVyQmFzZUNsaWVudDo6ZHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0Ci17Ci0gICAgTGF5ZXJCYXNlOjpkdW1wKHJlc3VsdCwgYnVmZmVyLCBTSVpFKTsKLQotICAgIHNwPENsaWVudD4gY2xpZW50KG1DbGllbnRSZWYucHJvbW90ZSgpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAiICAgICAgY2xpZW50PSVwLCBpZGVudGl0eT0ldVxuIiwKLSAgICAgICAgICAgIGNsaWVudC5nZXQoKSwgZ2V0SWRlbnRpdHkoKSk7Ci0KLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci19Ci0KLQotdm9pZCBMYXllckJhc2VDbGllbnQ6OnNob3J0RHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIHNjcmF0Y2gsIHNpemVfdCBzaXplKSBjb25zdAotewotICAgIExheWVyQmFzZUNsaWVudDo6ZHVtcChyZXN1bHQsIHNjcmF0Y2gsIHNpemUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTGF5ZXJCYXNlQ2xpZW50OjpMYXllckNsZWFuZXI6OkxheWVyQ2xlYW5lcihjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCi0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZUNsaWVudD4mIGxheWVyKQotICAgIDogbUZsaW5nZXIoZmxpbmdlciksIG1MYXllcihsYXllcikgewotfQotCi1MYXllckJhc2VDbGllbnQ6OkxheWVyQ2xlYW5lcjo6fkxheWVyQ2xlYW5lcigpIHsKLSAgICAvLyBkZXN0cm95IGNsaWVudCByZXNvdXJjZXMKLSAgICBtRmxpbmdlci0+ZGVzdHJveVN1cmZhY2UobUxheWVyKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDZlZmRkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfTEFZRVJfQkFTRV9ICi0jZGVmaW5lIEFORFJPSURfTEFZRVJfQkFTRV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSA8dWkvUmVnaW9uLmg+Ci0KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3NlckNsaWVudC5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9ndWkvTGF5ZXJTdGF0ZS5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvaHdjb21wb3Nlci5oPgotCi0jaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oIgotI2luY2x1ZGUgIlRyYW5zZm9ybS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBDbGllbnQ7Ci1jbGFzcyBEaXNwbGF5SGFyZHdhcmU7Ci1jbGFzcyBHcmFwaGljQnVmZmVyOwotY2xhc3MgR3JhcGhpY1BsYW5lOwotY2xhc3MgTGF5ZXI7Ci1jbGFzcyBMYXllckJhc2VDbGllbnQ7Ci1jbGFzcyBTdXJmYWNlRmxpbmdlcjsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIExheWVyQmFzZSA6IHB1YmxpYyBSZWZCYXNlCi17Ci0gICAgc3RhdGljIGludDMyX3Qgc1NlcXVlbmNlOwotCi1wdWJsaWM6Ci0gICAgICAgICAgICBMYXllckJhc2UoU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXIsIERpc3BsYXlJRCBkaXNwbGF5KTsKLQotICAgIERpc3BsYXlJRCAgICAgICAgICAgZHB5OwotICAgIG11dGFibGUgYm9vbCAgICAgICAgY29udGVudERpcnR5OwotICAgICAgICAgICAgUmVnaW9uICAgICAgdmlzaWJsZVJlZ2lvblNjcmVlbjsKLSAgICAgICAgICAgIFJlZ2lvbiAgICAgIHRyYW5zcGFyZW50UmVnaW9uU2NyZWVuOwotICAgICAgICAgICAgUmVnaW9uICAgICAgY292ZXJlZFJlZ2lvblNjcmVlbjsKLSAgICAgICAgICAgIGludDMyX3QgICAgIHNlcXVlbmNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdHJ1Y3QgU3RhdGUgewotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB3OwotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBoOwotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICByZXF1ZXN0ZWRfdzsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgcmVxdWVzdGVkX2g7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHo7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgIGFscGhhOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICBmbGFnczsKLSAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgcmVzZXJ2ZWRbMl07Ci0gICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIHNlcXVlbmNlOyAgIC8vIGNoYW5nZXMgd2hlbiB2aXNpYmxlIHJlZ2lvbnMgY2FuIGNoYW5nZQotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB0aW50OwotICAgICAgICAgICAgICAgIFRyYW5zZm9ybSAgICAgICB0cmFuc2Zvcm07Ci0gICAgICAgICAgICAgICAgUmVnaW9uICAgICAgICAgIHRyYW5zcGFyZW50UmVnaW9uOwotICAgICAgICAgICAgfTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZzgmIG5hbWUpOwotICAgICAgICAgICAgU3RyaW5nOCBnZXROYW1lKCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIC8vIG1vZGlmeSBjdXJyZW50IHN0YXRlCi0gICAgICAgICAgICBib29sIHNldFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHkpOwotICAgICAgICAgICAgYm9vbCBzZXRMYXllcih1aW50MzJfdCB6KTsKLSAgICAgICAgICAgIGJvb2wgc2V0U2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKLSAgICAgICAgICAgIGJvb2wgc2V0QWxwaGEodWludDhfdCBhbHBoYSk7Ci0gICAgICAgICAgICBib29sIHNldE1hdHJpeChjb25zdCBsYXllcl9zdGF0ZV90OjptYXRyaXgyMl90JiBtYXRyaXgpOwotICAgICAgICAgICAgYm9vbCBzZXRUcmFuc3BhcmVudFJlZ2lvbkhpbnQoY29uc3QgUmVnaW9uJiBvcGFxdWUpOwotICAgICAgICAgICAgYm9vbCBzZXRGbGFncyh1aW50OF90IGZsYWdzLCB1aW50OF90IG1hc2spOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB2b2lkIGNvbW1pdFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICBib29sIHJlcXVlc3RUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgdm9pZCBmb3JjZVZpc2liaWxpdHlUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB1aW50MzJfdCBnZXRUcmFuc2FjdGlvbkZsYWdzKHVpbnQzMl90IGZsYWdzKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNldFRyYW5zYWN0aW9uRmxhZ3ModWludDMyX3QgZmxhZ3MpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBSZWN0IHZpc2libGVCb3VuZHMoKSBjb25zdDsKLSAgICAgICAgICAgIHZvaWQgZHJhd1JlZ2lvbihjb25zdCBSZWdpb24mIHJlZykgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNwPExheWVyQmFzZUNsaWVudD4gZ2V0TGF5ZXJCYXNlQ2xpZW50KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgc3A8TGF5ZXI+IGdldExheWVyKCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyKiBnZXRUeXBlSWQoKSBjb25zdCB7IHJldHVybiAiTGF5ZXJCYXNlIjsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5KGh3Y19sYXllcl90KiBod2NsKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKTsKLSAgICAgICAgICAgIHZvaWQgc2V0T3ZlcmxheShib29sIGluT3ZlcmxheSk7Ci0gICAgICAgICAgICBib29sIGlzT3ZlcmxheSgpIGNvbnN0OwotCi0KLSAgICAvKioKLSAgICAgKiBkcmF3IC0gcGVyZm9ybXMgc29tZSBnbG9iYWwgY2xpcHBpbmcgb3B0aW1pemF0aW9ucwotICAgICAqIGFuZCBjYWxscyBvbkRyYXcoKS4KLSAgICAgKiBUeXBpY2FsbHkgdGhpcyBtZXRob2QgaXMgbm90IG92ZXJyaWRkZW4sIGluc3RlYWQgaW1wbGVtZW50IG9uRHJhdygpCi0gICAgICogdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGRyYXdpbmcuICAKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgZHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBkcmF3Rm9yU3JlZW5TaG90KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogb25EcmF3IC0gZHJhd3MgdGhlIHN1cmZhY2UuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIG9uRHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0ID0gMDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBpbml0U3RhdGVzIC0gY2FsbGVkIGp1c3QgYWZ0ZXIgY29uc3RydWN0aW9uCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIGluaXRTdGF0ZXModWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZmxhZ3MpOwotICAgIAotICAgIC8qKgotICAgICAqIGRvVHJhbnNhY3Rpb24gLSBwcm9jZXNzIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gZmlndXJlCi0gICAgICogb3V0IHdoaWNoIGF0dHJpYnV0ZXMgb2YgdGhlIHN1cmZhY2UgaGF2ZSBjaGFuZ2VkLgotICAgICAqLwotICAgIHZpcnR1YWwgdWludDMyX3QgZG9UcmFuc2FjdGlvbih1aW50MzJfdCB0cmFuc2FjdGlvbkZsYWdzKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBzZXRWaXNpYmxlUmVnaW9uIC0gY2FsbGVkIHRvIHNldCB0aGUgbmV3IHZpc2libGUgcmVnaW9uLiBUaGlzIGdpdmVzCi0gICAgICogYSBjaGFuY2UgdG8gdXBkYXRlIHRoZSBuZXcgdmlzaWJsZSByZWdpb24gb3IgcmVjb3JkIHRoZSBmYWN0IGl0IGNoYW5nZWQuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIHNldFZpc2libGVSZWdpb24oY29uc3QgUmVnaW9uJiB2aXNpYmxlUmVnaW9uKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBzZXRDb3ZlcmVkUmVnaW9uIC0gY2FsbGVkIHdoZW4gdGhlIGNvdmVyZWQgcmVnaW9uIGNoYW5nZXMuIFRoZSBjb3ZlcmVkCi0gICAgICogcmVnaW9uIGNvcnJlc3BvbmRzIHRvIGFueSBhcmVhIG9mIHRoZSBzdXJmYWNlIHRoYXQgaXMgY292ZXJlZAotICAgICAqICh0cmFuc3BhcmVudGx5IG9yIG5vdCkgYnkgYW5vdGhlciBzdXJmYWNlLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBzZXRDb3ZlcmVkUmVnaW9uKGNvbnN0IFJlZ2lvbiYgY292ZXJlZFJlZ2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZVZpc2liaWxpdHkgLSBjYWNoZSBhIGJ1bmNoIG9mIHRoaW5ncwotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZVZpc2liaWxpdHkoY29uc3QgVHJhbnNmb3JtJiBnbG9iYWxUcmFuc2Zvcm0pOwotCi0gICAgLyoqCi0gICAgICogbG9ja1BhZ2VGbGlwIC0gY2FsbGVkIGVhY2ggdGltZSB0aGUgc2NyZWVuIGlzIHJlZHJhd24gYW5kIHJldHVybnMgd2hldGhlcgotICAgICAqIHRoZSB2aXNpYmxlIHJlZ2lvbnMgbmVlZCB0byBiZSByZWNvbXB1dGVkICh0aGlzIGlzIGEgZmFpcmx5IGhlYXZ5Ci0gICAgICogb3BlcmF0aW9uLCBzbyB0aGlzIHNob3VsZCBiZSBzZXQgb25seSBpZiBuZWVkZWQpLiBUeXBpY2FsbHkgdGhpcyBpcyB1c2VkCi0gICAgICogdG8gZmlndXJlIG91dCBpZiB0aGUgY29udGVudCBvciBzaXplIG9mIGEgc3VyZmFjZSBoYXMgY2hhbmdlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgbG9ja1BhZ2VGbGlwKGJvb2wmIHJlY29tcHV0ZVZpc2libGVSZWdpb25zKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiB1bmxvY2tQYWdlRmxpcCAtIGNhbGxlZCBlYWNoIHRpbWUgdGhlIHNjcmVlbiBpcyByZWRyYXduLiB1cGRhdGVzIHRoZQotICAgICAqIGZpbmFsIGRpcnR5IHJlZ2lvbiB3cnQgdGhlIHBsYW5lVHJhbnNmb3JtLgotICAgICAqIEF0IHRoaXMgcG9pbnQsIGFsbCB2aXNpYmxlIHJlZ2lvbnMsIHN1cmZhY2UgcG9zaXRpb24gYW5kIHNpemUsIGV0Yy4uLiBhcmUKLSAgICAgKiBjb3JyZWN0LgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCB1bmxvY2tQYWdlRmxpcChjb25zdCBUcmFuc2Zvcm0mIHBsYW5lVHJhbnNmb3JtLCBSZWdpb24mIG91dERpcnR5UmVnaW9uKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBpc09wYXF1ZSAtIHRydWUgaWYgdGhpcyBzdXJmYWNlIGlzIG9wYXF1ZQotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBpc09wYXF1ZSgpIGNvbnN0ICB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAvKioKLSAgICAgKiBuZWVkc0RpdGhlcmluZyAtIHRydWUgaWYgdGhpcyBzdXJmYWNlIG5lZWRzIGRpdGhlcmluZwotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBuZWVkc0RpdGhlcmluZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAvKioKLSAgICAgKiBuZWVkc0xpbmVhckZpbHRlcmluZyAtIHRydWUgaWYgdGhpcyBzdXJmYWNlJ3Mgc3RhdGUgcmVxdWlyZXMgZmlsdGVyaW5nCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIG5lZWRzRmlsdGVyaW5nKCkgY29uc3QgeyByZXR1cm4gbU5lZWRzRmlsdGVyaW5nOyB9Ci0KLSAgICAvKioKLSAgICAgKiBpc1NlY3VyZSAtIHRydWUgaWYgdGhpcyBzdXJmYWNlIGlzIHNlY3VyZSwgdGhhdCBpcyBpZiBpdCBwcmV2ZW50cwotICAgICAqIHNjcmVlbnNob3RzIG9yIFZOQyBzZXJ2ZXJzLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBpc1NlY3VyZSgpIGNvbnN0ICAgICAgIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAvKioKLSAgICAgKiBpc1Byb3RlY3RlZCAtIHRydWUgaWYgdGhlIGxheWVyIG1heSBjb250YWluIHByb3RlY3RlZCBjb250ZW50IGluIHRoZQotICAgICAqIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEIHNlbnNlLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBpc1Byb3RlY3RlZCgpIGNvbnN0ICAgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIC8qKiBjYWxsZWQgd2l0aCB0aGUgc3RhdGUgbG9jayB3aGVuIHRoZSBzdXJmYWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUKLSAgICAgKiAgY3VycmVudCBsaXN0ICovCi0gICAgdmlydHVhbCB2b2lkIG9uUmVtb3ZlZCgpIHsgfQotCi0gICAgLyoqIGNhbGxlZCBhZnRlciBwYWdlLWZsaXAKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgb25MYXllckRpc3BsYXllZCgpIHsgfQotCi0gICAgLyoqIGNhbGxlZCBiZWZvcmUgY29tcG9zaXRpb24uCi0gICAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBsYXllciBoYXMgcGVuZGluZyB1cGRhdGVzLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBvblByZUNvbXBvc2l0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIC8qKiBhbHdheXMgY2FsbCBiYXNlIGNsYXNzIGZpcnN0ICovCi0gICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBzY3JhdGNoLCBzaXplX3Qgc2l6ZSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNob3J0RHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIHNjcmF0Y2gsIHNpemVfdCBzaXplKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgZHVtcFN0YXRzKFN0cmluZzgmIHJlc3VsdCwgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGNsZWFyU3RhdHMoKTsKLQotCi0gICAgZW51bSB7IC8vIGZsYWdzIGZvciBkb1RyYW5zYWN0aW9uKCkKLSAgICAgICAgZVZpc2libGVSZWdpb24gICAgICA9IDB4MDAwMDAwMDIsCi0gICAgfTsKLQotCi0gICAgaW5saW5lICBjb25zdCBTdGF0ZSYgICAgZHJhd2luZ1N0YXRlKCkgY29uc3QgICAgeyByZXR1cm4gbURyYXdpbmdTdGF0ZTsgfQotICAgIGlubGluZSAgY29uc3QgU3RhdGUmICAgIGN1cnJlbnRTdGF0ZSgpIGNvbnN0ICAgIHsgcmV0dXJuIG1DdXJyZW50U3RhdGU7IH0KLSAgICBpbmxpbmUgIFN0YXRlJiAgICAgICAgICBjdXJyZW50U3RhdGUoKSAgICAgICAgICB7IHJldHVybiBtQ3VycmVudFN0YXRlOyB9Ci0KLSAgICBpbnQzMl90ICBnZXRPcmllbnRhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1PcmllbnRhdGlvbjsgfQotICAgIGludDMyX3QgIGdldFBsYW5lT3JpZW50YXRpb24oKSBjb25zdCB7IHJldHVybiBtUGxhbmVPcmllbnRhdGlvbjsgfQotICAgIAotcHJvdGVjdGVkOgotICAgIGNvbnN0IEdyYXBoaWNQbGFuZSYgZ3JhcGhpY1BsYW5lKGludCBkcHkpIGNvbnN0OwotICAgICAgICAgIEdyYXBoaWNQbGFuZSYgZ3JhcGhpY1BsYW5lKGludCBkcHkpOwotCi0gICAgICAgICAgdm9pZCBjbGVhcldpdGhPcGVuR0woY29uc3QgUmVnaW9uJiBjbGlwLCBHTGNsYW1wZiByLCBHTGNsYW1wZiBnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMY2xhbXBmIGIsIEdMY2xhbXBmIGFscGhhKSBjb25zdDsKLSAgICAgICAgICB2b2lkIGNsZWFyV2l0aE9wZW5HTChjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0OwotICAgICAgICAgIHZvaWQgZHJhd1dpdGhPcGVuR0woY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdDsKLQotICAgICAgICAgIHZvaWQgc2V0RmlsdGVyaW5nKGJvb2wgZmlsdGVyaW5nKTsKLSAgICAgICAgICBib29sIGdldEZpbHRlcmluZygpIGNvbnN0OwotCi0gICAgICAgICAgICAgICAgc3A8U3VyZmFjZUZsaW5nZXI+IG1GbGluZ2VyOwotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBtRmxhZ3M7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICAgICAgLy8gYWNjZXNzZWQgb25seSBpbiB0aGUgbWFpbiB0aHJlYWQKLSAgICAgICAgICAgICAgICAvLyBXaGV0aGVyIGZpbHRlcmluZyBpcyBmb3JjZWQgb24gb3Igbm90Ci0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIG1GaWx0ZXJpbmc7Ci0KLSAgICAgICAgICAgICAgICAvLyBjYWNoZWQgZHVyaW5nIHZhbGlkYXRlVmlzaWJpbGl0eSgpCi0gICAgICAgICAgICAgICAgLy8gV2hldGhlciBmaWx0ZXJpbmcgaXMgbmVlZGVkIGIvYyBvZiB0aGUgZHJhd2luZ3N0YXRlCi0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIG1OZWVkc0ZpbHRlcmluZzsKLQotICAgICAgICAgICAgICAgIC8vIHRoaXMgbGF5ZXIgaXMgY3VycmVudGx5IGhhbmRsZWQgYnkgdGhlIGh3Yy4gdGhpcyBpcwotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgYXQgY29tcG9zaXRpb24gdGltZSwgYWx3YXlzIGZybW8gdGhlIGNvbXBvc2l0aW9uCi0gICAgICAgICAgICAgICAgLy8gdGhyZWFkLgotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBtSW5PdmVybGF5OwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgICAgICAgICAgLy8gY2FjaGVkIGR1cmluZyB2YWxpZGF0ZVZpc2liaWxpdHkoKQotICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICBtT3JpZW50YXRpb247Ci0gICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIG1QbGFuZU9yaWVudGF0aW9uOwotICAgICAgICAgICAgICAgIFRyYW5zZm9ybSAgICAgICBtVHJhbnNmb3JtOwotICAgICAgICAgICAgICAgIEdMZmxvYXQgICAgICAgICBtVmVydGljZXNbNF1bMl07Ci0gICAgICAgICAgICAgICAgUmVjdCAgICAgICAgICAgIG1UcmFuc2Zvcm1lZEJvdW5kczsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHRoZXNlIGFyZSBwcm90ZWN0ZWQgYnkgYW4gZXh0ZXJuYWwgbG9jawotICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICBtQ3VycmVudFN0YXRlOwotICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICBtRHJhd2luZ1N0YXRlOwotICAgIHZvbGF0aWxlICAgIGludDMyX3QgICAgICAgICBtVHJhbnNhY3Rpb25GbGFnczsKLQotICAgICAgICAgICAgICAgIC8vIGRvbid0IGNoYW5nZSwgZG9uJ3QgbmVlZCBhIGxvY2sKLSAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgbVByZW11bHRpcGxpZWRBbHBoYTsKLSAgICAgICAgICAgICAgICBTdHJpbmc4ICAgICAgICAgbU5hbWU7Ci0gICAgbXV0YWJsZSAgICAgYm9vbCAgICAgICAgICAgIG1EZWJ1ZzsKLQotCi1wdWJsaWM6Ci0gICAgLy8gY2FsbGVkIGZyb20gY2xhc3MgU3VyZmFjZUZsaW5nZXIKLSAgICB2aXJ0dWFsIH5MYXllckJhc2UoKTsKLQotcHJpdmF0ZToKLSAgICBMYXllckJhc2UoY29uc3QgTGF5ZXJCYXNlJiByaHMpOwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTGF5ZXJCYXNlQ2xpZW50IDogcHVibGljIExheWVyQmFzZQotewotcHVibGljOgotICAgICAgICAgICAgTGF5ZXJCYXNlQ2xpZW50KFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLCBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCk7Ci0KLSAgICAgICAgICAgIHZpcnR1YWwgfkxheWVyQmFzZUNsaWVudCgpOwotCi0gICAgICAgICAgICBzcDxJU3VyZmFjZT4gZ2V0U3VyZmFjZSgpOwotICAgICAgICAgICAgd3A8SUJpbmRlcj4gZ2V0U3VyZmFjZUJpbmRlcigpIGNvbnN0OwotICAgICAgICAgICAgdmlydHVhbCB3cDxJQmluZGVyPiBnZXRTdXJmYWNlVGV4dHVyZUJpbmRlcigpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzcDxMYXllckJhc2VDbGllbnQ+IGdldExheWVyQmFzZUNsaWVudCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TGF5ZXJCYXNlQ2xpZW50Kj4odGhpcyk7IH0KLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciogZ2V0VHlwZUlkKCkgY29uc3QgeyByZXR1cm4gIkxheWVyQmFzZUNsaWVudCI7IH0KLQotICAgIHVpbnQzMl90IGdldElkZW50aXR5KCkgY29uc3QgeyByZXR1cm4gbUlkZW50aXR5OyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIHNjcmF0Y2gsIHNpemVfdCBzaXplKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2hvcnREdW1wKFN0cmluZzgmIHJlc3VsdCwgY2hhciogc2NyYXRjaCwgc2l6ZV90IHNpemUpIGNvbnN0OwotCi0gICAgY2xhc3MgTGF5ZXJDbGVhbmVyIHsKLSAgICAgICAgc3A8U3VyZmFjZUZsaW5nZXI+IG1GbGluZ2VyOwotICAgICAgICB3cDxMYXllckJhc2VDbGllbnQ+IG1MYXllcjsKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIH5MYXllckNsZWFuZXIoKTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIExheWVyQ2xlYW5lcihjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlQ2xpZW50PiYgbGF5ZXIpOwotICAgIH07Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCBzcDxJU3VyZmFjZT4gY3JlYXRlU3VyZmFjZSgpOwotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBtdXRhYmxlIGJvb2wgbUhhc1N1cmZhY2U7Ci0gICAgd3A8SUJpbmRlcj4gbUNsaWVudFN1cmZhY2VCaW5kZXI7Ci0gICAgY29uc3Qgd3A8Q2xpZW50PiBtQ2xpZW50UmVmOwotICAgIC8vIG9ubHkgcmVhZAotICAgIGNvbnN0IHVpbnQzMl90IG1JZGVudGl0eTsKLSAgICBzdGF0aWMgaW50MzJfdCBzSWRlbnRpdHk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfTEFZRVJfQkFTRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckRpbS5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckRpbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NjVkN2EuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotCi0jaW5jbHVkZSAiTGF5ZXJEaW0uaCIKLSNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgotI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxheWVyRGltOjpMYXllckRpbShTdXJmYWNlRmxpbmdlciogZmxpbmdlciwgRGlzcGxheUlEIGRpc3BsYXksCi0gICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCkKLSAgICA6IExheWVyQmFzZUNsaWVudChmbGluZ2VyLCBkaXNwbGF5LCBjbGllbnQpCi17Ci19Ci0KLUxheWVyRGltOjp+TGF5ZXJEaW0oKQotewotfQotCi12b2lkIExheWVyRGltOjpvbkRyYXcoY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdAotewotICAgIGNvbnN0IFN0YXRlJiBzKGRyYXdpbmdTdGF0ZSgpKTsKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2xpcC5iZWdpbigpOwotICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgY29uc3QgZW5kID0gY2xpcC5lbmQoKTsKLSAgICBpZiAocy5hbHBoYT4wICYmIChpdCAhPSBlbmQpKSB7Ci0gICAgICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICAgICAgY29uc3QgR0xmbG9hdCBhbHBoYSA9IHMuYWxwaGEvMjU1LjBmOwotICAgICAgICBjb25zdCB1aW50MzJfdCBmYkhlaWdodCA9IGh3LmdldEhlaWdodCgpOwotICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOwotICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci0KLSAgICAgICAgaWYgKHMuYWxwaGEgPT0gMHhGRikgewotICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgICAgIGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnbENvbG9yNGYoMCwgMCwgMCwgYWxwaGEpOwotCi0gICAgICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9GTE9BVCwgMCwgbVZlcnRpY2VzKTsKLQotICAgICAgICB3aGlsZSAoaXQgIT0gZW5kKSB7Ci0gICAgICAgICAgICBjb25zdCBSZWN0JiByID0gKml0Kys7Ci0gICAgICAgICAgICBjb25zdCBHTGludCBzeSA9IGZiSGVpZ2h0IC0gKHIudG9wICsgci5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBnbFNjaXNzb3Ioci5sZWZ0LCBzeSwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKLSAgICAgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOyAKLSAgICAgICAgfQotICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzBlNmQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfTEFZRVJfRElNX0gKLSNkZWZpbmUgQU5EUk9JRF9MQVlFUl9ESU1fSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotCi0jaW5jbHVkZSAiTGF5ZXJCYXNlLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIExheWVyRGltIDogcHVibGljIExheWVyQmFzZUNsaWVudAotewotcHVibGljOiAgICAKLSAgICAgICAgICAgICAgICBMYXllckRpbShTdXJmYWNlRmxpbmdlciogZmxpbmdlciwgRGlzcGxheUlEIGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQpOwotICAgICAgICB2aXJ0dWFsIH5MYXllckRpbSgpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uRHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc09wYXF1ZSgpIGNvbnN0ICAgICAgICAgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTZWN1cmUoKSBjb25zdCAgICAgICAgIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUHJvdGVjdGVkQnlBcHAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc1Byb3RlY3RlZEJ5RFJNKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldFR5cGVJZCgpIGNvbnN0IHsgcmV0dXJuICJMYXllckRpbSI7IH0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9MQVlFUl9ESU1fSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJTY3JlZW5zaG90LmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyU2NyZWVuc2hvdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2Y0NmUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJTY3JlZW5zaG90LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0KLSNpbmNsdWRlICJMYXllclNjcmVlbnNob3QuaCIKLSNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgotI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTGF5ZXJTY3JlZW5zaG90OjpMYXllclNjcmVlbnNob3QoU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXIsIERpc3BsYXlJRCBkaXNwbGF5LAotICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQpCi0gICAgOiBMYXllckJhc2VDbGllbnQoZmxpbmdlciwgZGlzcGxheSwgY2xpZW50KSwKLSAgICAgIG1UZXh0dXJlTmFtZSgwKSwgbUZsaW5nZXIoZmxpbmdlcikKLXsKLX0KLQotTGF5ZXJTY3JlZW5zaG90Ojp+TGF5ZXJTY3JlZW5zaG90KCkKLXsKLSAgICBpZiAobVRleHR1cmVOYW1lKSB7Ci0gICAgICAgIG1GbGluZ2VyLT5wb3N0TWVzc2FnZUFzeW5jKAotICAgICAgICAgICAgICAgIG5ldyBTdXJmYWNlRmxpbmdlcjo6TWVzc2FnZURlc3Ryb3lHTFRleHR1cmUobVRleHR1cmVOYW1lKSApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTGF5ZXJTY3JlZW5zaG90OjpjYXB0dXJlTG9ja2VkKCkgewotICAgIEdMZmxvYXQgdSwgdjsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtRmxpbmdlci0+cmVuZGVyU2NyZWVuVG9UZXh0dXJlTG9ja2VkKDAsICZtVGV4dHVyZU5hbWUsICZ1LCAmdik7Ci0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBpbml0VGV4dHVyZSh1LCB2KTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IExheWVyU2NyZWVuc2hvdDo6Y2FwdHVyZSgpIHsKLSAgICBHTGZsb2F0IHUsIHY7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbUZsaW5nZXItPnJlbmRlclNjcmVlblRvVGV4dHVyZSgwLCAmbVRleHR1cmVOYW1lLCAmdSwgJnYpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaW5pdFRleHR1cmUodSwgdik7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIExheWVyU2NyZWVuc2hvdDo6aW5pdFRleHR1cmUoR0xmbG9hdCB1LCBHTGZsb2F0IHYpIHsKLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlTmFtZSk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgIG1UZXhDb29yZHNbMF0gPSAwOyAgICAgICAgIG1UZXhDb29yZHNbMV0gPSB2OwotICAgIG1UZXhDb29yZHNbMl0gPSAwOyAgICAgICAgIG1UZXhDb29yZHNbM10gPSAwOwotICAgIG1UZXhDb29yZHNbNF0gPSB1OyAgICAgICAgIG1UZXhDb29yZHNbNV0gPSAwOwotICAgIG1UZXhDb29yZHNbNl0gPSB1OyAgICAgICAgIG1UZXhDb29yZHNbN10gPSB2OwotfQotCi12b2lkIExheWVyU2NyZWVuc2hvdDo6aW5pdFN0YXRlcyh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmbGFncykgewotICAgIExheWVyQmFzZUNsaWVudDo6aW5pdFN0YXRlcyh3LCBoLCBmbGFncyk7Ci0gICAgaWYgKCEoZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplSGlkZGVuKSkgewotICAgICAgICBjYXB0dXJlKCk7Ci0gICAgfQotfQotCi11aW50MzJfdCBMYXllclNjcmVlbnNob3Q6OmRvVHJhbnNhY3Rpb24odWludDMyX3QgZmxhZ3MpCi17Ci0gICAgY29uc3QgTGF5ZXI6OlN0YXRlJiBkcmF3KGRyYXdpbmdTdGF0ZSgpKTsKLSAgICBjb25zdCBMYXllcjo6U3RhdGUmIGN1cnIoY3VycmVudFN0YXRlKCkpOwotCi0gICAgaWYgKGRyYXcuZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplTGF5ZXJIaWRkZW4pIHsKLSAgICAgICAgaWYgKCEoY3Vyci5mbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVMYXllckhpZGRlbikpIHsKLSAgICAgICAgICAgIC8vIHdlJ3JlIGdvaW5nIGZyb20gaGlkZGVuIHRvIHZpc2libGUKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNhcHR1cmVMb2NrZWQoKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlU2NyZWVuc2hvdFN1cmZhY2UgZmFpbGVkICglcykiLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGN1cnIuZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplTGF5ZXJIaWRkZW4pIHsKLSAgICAgICAgLy8gd2UncmUgZ29pbmcgZnJvbSB2aXNpYmxlIHRvIGhpZGRlbgotICAgICAgICBpZiAobVRleHR1cmVOYW1lKSB7Ci0gICAgICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtVGV4dHVyZU5hbWUpOwotICAgICAgICAgICAgbVRleHR1cmVOYW1lID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTGF5ZXJCYXNlQ2xpZW50Ojpkb1RyYW5zYWN0aW9uKGZsYWdzKTsKLX0KLQotdm9pZCBMYXllclNjcmVlbnNob3Q6Om9uRHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0Ci17Ci0gICAgY29uc3QgU3RhdGUmIHMoZHJhd2luZ1N0YXRlKCkpOwotICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjbGlwLmJlZ2luKCk7Ci0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBjb25zdCBlbmQgPSBjbGlwLmVuZCgpOwotICAgIGlmIChzLmFscGhhPjAgJiYgKGl0ICE9IGVuZCkpIHsKLSAgICAgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgICAgICBjb25zdCBHTGZsb2F0IGFscGhhID0gcy5hbHBoYS8yNTUuMGY7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGZiSGVpZ2h0ID0gaHcuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgaWYgKHMuYWxwaGEgPT0gMHhGRikgewotICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgICAgIGdsQmxlbmRGdW5jKEdMX1NSQ19BTFBIQSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnbENvbG9yNGYoMCwgMCwgMCwgYWxwaGEpOwotCi0gICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUyk7Ci0gICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotCi0gICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVRleHR1cmVOYW1lKTsKLSAgICAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX1RFWFRVUkUpOwotICAgICAgICBnbExvYWRJZGVudGl0eSgpOwotICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLQotICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgICAgICBnbFRleENvb3JkUG9pbnRlcigyLCBHTF9GTE9BVCwgMCwgbVRleENvb3Jkcyk7Ci0gICAgICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9GTE9BVCwgMCwgbVZlcnRpY2VzKTsKLQotICAgICAgICB3aGlsZSAoaXQgIT0gZW5kKSB7Ci0gICAgICAgICAgICBjb25zdCBSZWN0JiByID0gKml0Kys7Ci0gICAgICAgICAgICBjb25zdCBHTGludCBzeSA9IGZiSGVpZ2h0IC0gKHIudG9wICsgci5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBnbFNjaXNzb3Ioci5sZWZ0LCBzeSwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKLSAgICAgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJTY3JlZW5zaG90LmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllclNjcmVlbnNob3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5MDA0Ny4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllclNjcmVlbnNob3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfTEFZRVJfU0NSRUVOU0hPVF9ICi0jZGVmaW5lIEFORFJPSURfTEFZRVJfU0NSRUVOU0hPVF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0KLSNpbmNsdWRlICJMYXllckJhc2UuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTGF5ZXJTY3JlZW5zaG90IDogcHVibGljIExheWVyQmFzZUNsaWVudAotewotICAgIEdMdWludCBtVGV4dHVyZU5hbWU7Ci0gICAgR0xmbG9hdCBtVGV4Q29vcmRzWzhdOwotICAgIHNwPFN1cmZhY2VGbGluZ2VyPiBtRmxpbmdlcjsKLXB1YmxpYzogICAgCi0gICAgICAgICAgICBMYXllclNjcmVlbnNob3QoU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXIsIERpc3BsYXlJRCBkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50KTsKLSAgICAgICAgdmlydHVhbCB+TGF5ZXJTY3JlZW5zaG90KCk7Ci0KLSAgICAgICAgc3RhdHVzX3QgY2FwdHVyZSgpOwotCi0gICAgdmlydHVhbCB2b2lkIGluaXRTdGF0ZXModWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZmxhZ3MpOwotICAgIHZpcnR1YWwgdWludDMyX3QgZG9UcmFuc2FjdGlvbih1aW50MzJfdCBmbGFncyk7Ci0gICAgdmlydHVhbCB2b2lkIG9uRHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc09wYXF1ZSgpIGNvbnN0ICAgICAgICAgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTZWN1cmUoKSBjb25zdCAgICAgICAgIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUHJvdGVjdGVkQnlBcHAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc1Byb3RlY3RlZEJ5RFJNKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldFR5cGVJZCgpIGNvbnN0IHsgcmV0dXJuICJMYXllclNjcmVlbnNob3QiOyB9Ci0KLXByaXZhdGU6Ci0gICAgc3RhdHVzX3QgY2FwdHVyZUxvY2tlZCgpOwotICAgIHZvaWQgaW5pdFRleHR1cmUoR0xmbG9hdCB1LCBHTGZsb2F0IHYpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0xBWUVSX1NDUkVFTlNIT1RfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9NZXNzYWdlUXVldWUuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTWVzc2FnZVF1ZXVlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwZmZmNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9NZXNzYWdlUXVldWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8Z3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8Z3VpL0JpdFR1YmUuaD4KLQotI2luY2x1ZGUgIk1lc3NhZ2VRdWV1ZS5oIgotI2luY2x1ZGUgIkV2ZW50VGhyZWFkLmgiCi0jaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTWVzc2FnZUJhc2U6Ok1lc3NhZ2VCYXNlKCkKLSAgICA6IE1lc3NhZ2VIYW5kbGVyKCkgewotfQotCi1NZXNzYWdlQmFzZTo6fk1lc3NhZ2VCYXNlKCkgewotfQotCi12b2lkIE1lc3NhZ2VCYXNlOjpoYW5kbGVNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmKSB7Ci0gICAgdGhpcy0+aGFuZGxlcigpOwotICAgIGJhcnJpZXIub3BlbigpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTWVzc2FnZVF1ZXVlOjpIYW5kbGVyOjpzaWduYWxSZWZyZXNoKCkgewotICAgIGlmICgoYW5kcm9pZF9hdG9taWNfb3IoZXZlbnRNYXNrUmVmcmVzaCwgJm1FdmVudE1hc2spICYgZXZlbnRNYXNrUmVmcmVzaCkgPT0gMCkgewotICAgICAgICBtUXVldWUubUxvb3Blci0+c2VuZE1lc3NhZ2UodGhpcywgTWVzc2FnZShNZXNzYWdlUXVldWU6OlJFRlJFU0gpKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVzc2FnZVF1ZXVlOjpIYW5kbGVyOjpzaWduYWxJbnZhbGlkYXRlKCkgewotICAgIGlmICgoYW5kcm9pZF9hdG9taWNfb3IoZXZlbnRNYXNrSW52YWxpZGF0ZSwgJm1FdmVudE1hc2spICYgZXZlbnRNYXNrSW52YWxpZGF0ZSkgPT0gMCkgewotICAgICAgICBtUXVldWUubUxvb3Blci0+c2VuZE1lc3NhZ2UodGhpcywgTWVzc2FnZShNZXNzYWdlUXVldWU6OklOVkFMSURBVEUpKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVzc2FnZVF1ZXVlOjpIYW5kbGVyOjpoYW5kbGVNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICBjYXNlIElOVkFMSURBVEU6Ci0gICAgICAgICAgICBhbmRyb2lkX2F0b21pY19hbmQofmV2ZW50TWFza0ludmFsaWRhdGUsICZtRXZlbnRNYXNrKTsKLSAgICAgICAgICAgIG1RdWV1ZS5tRmxpbmdlci0+b25NZXNzYWdlUmVjZWl2ZWQobWVzc2FnZS53aGF0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJFRlJFU0g6Ci0gICAgICAgICAgICBhbmRyb2lkX2F0b21pY19hbmQofmV2ZW50TWFza1JlZnJlc2gsICZtRXZlbnRNYXNrKTsKLSAgICAgICAgICAgIG1RdWV1ZS5tRmxpbmdlci0+b25NZXNzYWdlUmVjZWl2ZWQobWVzc2FnZS53aGF0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU1lc3NhZ2VRdWV1ZTo6TWVzc2FnZVF1ZXVlKCkKLXsKLX0KLQotTWVzc2FnZVF1ZXVlOjp+TWVzc2FnZVF1ZXVlKCkgewotfQotCi12b2lkIE1lc3NhZ2VRdWV1ZTo6aW5pdChjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIpCi17Ci0gICAgbUZsaW5nZXIgPSBmbGluZ2VyOwotICAgIG1Mb29wZXIgPSBuZXcgTG9vcGVyKHRydWUpOwotICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKnRoaXMpOwotfQotCi12b2lkIE1lc3NhZ2VRdWV1ZTo6c2V0RXZlbnRUaHJlYWQoY29uc3Qgc3A8RXZlbnRUaHJlYWQ+JiBldmVudFRocmVhZCkKLXsKLSAgICBtRXZlbnRUaHJlYWQgPSBldmVudFRocmVhZDsKLSAgICBtRXZlbnRzID0gZXZlbnRUaHJlYWQtPmNyZWF0ZUV2ZW50Q29ubmVjdGlvbigpOwotICAgIG1FdmVudFR1YmUgPSBtRXZlbnRzLT5nZXREYXRhQ2hhbm5lbCgpOwotICAgIG1Mb29wZXItPmFkZEZkKG1FdmVudFR1YmUtPmdldEZkKCksIDAsIEFMT09QRVJfRVZFTlRfSU5QVVQsCi0gICAgICAgICAgICBNZXNzYWdlUXVldWU6OmNiX2V2ZW50UmVjZWl2ZXIsIHRoaXMpOwotfQotCi12b2lkIE1lc3NhZ2VRdWV1ZTo6d2FpdE1lc3NhZ2UoKSB7Ci0gICAgZG8gewotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIGludDMyX3QgcmV0ID0gbUxvb3Blci0+cG9sbE9uY2UoLTEpOwotICAgICAgICBzd2l0Y2ggKHJldCkgewotICAgICAgICAgICAgY2FzZSBBTE9PUEVSX1BPTExfV0FLRToKLSAgICAgICAgICAgIGNhc2UgQUxPT1BFUl9QT0xMX0NBTExCQUNLOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgY2FzZSBBTE9PUEVSX1BPTExfRVJST1I6Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkFMT09QRVJfUE9MTF9FUlJPUiIpOwotICAgICAgICAgICAgY2FzZSBBTE9PUEVSX1BPTExfVElNRU9VVDoKLSAgICAgICAgICAgICAgICAvLyB0aW1lb3V0IChzaG91bGQgbm90IGhhcHBlbikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4KLSAgICAgICAgICAgICAgICBBTE9HRSgiTG9vcGVyOjpwb2xsT25jZSgpIHJldHVybmVkIHVua25vd24gc3RhdHVzICVkIiwgcmV0KTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKHRydWUpOwotfQotCi1zdGF0dXNfdCBNZXNzYWdlUXVldWU6OnBvc3RNZXNzYWdlKAotICAgICAgICBjb25zdCBzcDxNZXNzYWdlQmFzZT4mIG1lc3NhZ2VIYW5kbGVyLCBuc2Vjc190IHJlbFRpbWUpCi17Ci0gICAgY29uc3QgTWVzc2FnZSBkdW1teU1lc3NhZ2U7Ci0gICAgaWYgKHJlbFRpbWUgPiAwKSB7Ci0gICAgICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlRGVsYXllZChyZWxUaW1lLCBtZXNzYWdlSGFuZGxlciwgZHVtbXlNZXNzYWdlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShtZXNzYWdlSGFuZGxlciwgZHVtbXlNZXNzYWdlKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIE1lc3NhZ2VRdWV1ZTo6aW52YWxpZGF0ZSgpIHsKLS8vICAgIG1IYW5kbGVyLT5zaWduYWxJbnZhbGlkYXRlKCk7Ci0gICAgbUV2ZW50cy0+cmVxdWVzdE5leHRWc3luYygpOwotfQotCi12b2lkIE1lc3NhZ2VRdWV1ZTo6cmVmcmVzaCgpIHsKLSAgICBtRXZlbnRzLT5yZXF1ZXN0TmV4dFZzeW5jKCk7Ci19Ci0KLWludCBNZXNzYWdlUXVldWU6OmNiX2V2ZW50UmVjZWl2ZXIoaW50IGZkLCBpbnQgZXZlbnRzLCB2b2lkKiBkYXRhKSB7Ci0gICAgTWVzc2FnZVF1ZXVlKiBxdWV1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWVzc2FnZVF1ZXVlICo+KGRhdGEpOwotICAgIHJldHVybiBxdWV1ZS0+ZXZlbnRSZWNlaXZlcihmZCwgZXZlbnRzKTsKLX0KLQotaW50IE1lc3NhZ2VRdWV1ZTo6ZXZlbnRSZWNlaXZlcihpbnQgZmQsIGludCBldmVudHMpIHsKLSAgICBzc2l6ZV90IG47Ci0gICAgRGlzcGxheUV2ZW50UmVjZWl2ZXI6OkV2ZW50IGJ1ZmZlcls4XTsKLSAgICB3aGlsZSAoKG4gPSBEaXNwbGF5RXZlbnRSZWNlaXZlcjo6Z2V0RXZlbnRzKG1FdmVudFR1YmUsIGJ1ZmZlciwgOCkpID4gMCkgewotICAgICAgICBmb3IgKGludCBpPTAgOyBpPG4gOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChidWZmZXJbaV0uaGVhZGVyLnR5cGUgPT0gRGlzcGxheUV2ZW50UmVjZWl2ZXI6OkRJU1BMQVlfRVZFTlRfVlNZTkMpIHsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci0+c2lnbmFsUmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL01lc3NhZ2VRdWV1ZS5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTWVzc2FnZVF1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMjllN2UuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTWVzc2FnZVF1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9NRVNTQUdFX1FVRVVFX0gKLSNkZWZpbmUgQU5EUk9JRF9NRVNTQUdFX1FVRVVFX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9vcGVyLmg+Ci0KLSNpbmNsdWRlIDxndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuaD4KLQotI2luY2x1ZGUgIkJhcnJpZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJRGlzcGxheUV2ZW50Q29ubmVjdGlvbjsKLWNsYXNzIEV2ZW50VGhyZWFkOwotY2xhc3MgU3VyZmFjZUZsaW5nZXI7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBNZXNzYWdlQmFzZSA6IHB1YmxpYyBNZXNzYWdlSGFuZGxlcgotewotcHVibGljOgotICAgIE1lc3NhZ2VCYXNlKCk7Ci0gICAgCi0gICAgLy8gcmV0dXJuIHRydWUgaWYgbWVzc2FnZSBoYXMgYSBoYW5kbGVyCi0gICAgdmlydHVhbCBib29sIGhhbmRsZXIoKSA9IDA7Ci0KLSAgICAvLyB3YWl0cyBmb3IgdGhlIGhhbmRsZXIgdG8gYmUgcHJvY2Vzc2VkCi0gICAgdm9pZCB3YWl0KCkgY29uc3QgeyBiYXJyaWVyLndhaXQoKTsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TWVzc2FnZUJhc2UoKTsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKLQotICAgIG11dGFibGUgQmFycmllciBiYXJyaWVyOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIE1lc3NhZ2VRdWV1ZSB7Ci0gICAgY2xhc3MgSGFuZGxlciA6IHB1YmxpYyBNZXNzYWdlSGFuZGxlciB7Ci0gICAgICAgIGVudW0gewotICAgICAgICAgICAgZXZlbnRNYXNrSW52YWxpZGF0ZSA9IDB4MSwKLSAgICAgICAgICAgIGV2ZW50TWFza1JlZnJlc2ggICAgPSAweDIKLSAgICAgICAgfTsKLSAgICAgICAgTWVzc2FnZVF1ZXVlJiBtUXVldWU7Ci0gICAgICAgIGludDMyX3QgbUV2ZW50TWFzazsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEhhbmRsZXIoTWVzc2FnZVF1ZXVlJiBxdWV1ZSkgOiBtUXVldWUocXVldWUpLCBtRXZlbnRNYXNrKDApIHsgfQotICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKLSAgICAgICAgdm9pZCBzaWduYWxSZWZyZXNoKCk7Ci0gICAgICAgIHZvaWQgc2lnbmFsSW52YWxpZGF0ZSgpOwotICAgIH07Ci0KLSAgICBmcmllbmQgY2xhc3MgSGFuZGxlcjsKLQotICAgIHNwPFN1cmZhY2VGbGluZ2VyPiBtRmxpbmdlcjsKLSAgICBzcDxMb29wZXI+IG1Mb29wZXI7Ci0gICAgc3A8RXZlbnRUaHJlYWQ+IG1FdmVudFRocmVhZDsKLSAgICBzcDxJRGlzcGxheUV2ZW50Q29ubmVjdGlvbj4gbUV2ZW50czsKLSAgICBzcDxCaXRUdWJlPiBtRXZlbnRUdWJlOwotICAgIHNwPEhhbmRsZXI+IG1IYW5kbGVyOwotCi0KLSAgICBzdGF0aWMgaW50IGNiX2V2ZW50UmVjZWl2ZXIoaW50IGZkLCBpbnQgZXZlbnRzLCB2b2lkKiBkYXRhKTsKLSAgICBpbnQgZXZlbnRSZWNlaXZlcihpbnQgZmQsIGludCBldmVudHMpOwotCi1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIElOVkFMSURBVEUgPSAwLAotICAgICAgICBSRUZSRVNIICAgID0gMSwKLSAgICB9OwotCi0gICAgTWVzc2FnZVF1ZXVlKCk7Ci0gICAgfk1lc3NhZ2VRdWV1ZSgpOwotICAgIHZvaWQgaW5pdChjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIpOwotICAgIHZvaWQgc2V0RXZlbnRUaHJlYWQoY29uc3Qgc3A8RXZlbnRUaHJlYWQ+JiBldmVudHMpOwotCi0gICAgdm9pZCB3YWl0TWVzc2FnZSgpOwotICAgIHN0YXR1c190IHBvc3RNZXNzYWdlKGNvbnN0IHNwPE1lc3NhZ2VCYXNlPiYgbWVzc2FnZSwgbnNlY3NfdCByZWx0aW1lPTApOwotICAgIHZvaWQgaW52YWxpZGF0ZSgpOwotICAgIHZvaWQgcmVmcmVzaCgpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvKiBBTkRST0lEX01FU1NBR0VfUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjYxZmU0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4MTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KLQotI2luY2x1ZGUgPGd1aS9JRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RvcFdhdGNoLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJBbGxvY2F0b3IuaD4KLSNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi0jaW5jbHVkZSAiY2x6LmgiCi0jaW5jbHVkZSAiRGRtQ29ubmVjdGlvbi5oIgotI2luY2x1ZGUgIkRpc3BsYXlFdmVudENvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJFdmVudFRocmVhZC5oIgotI2luY2x1ZGUgIkdMRXh0ZW5zaW9ucy5oIgotI2luY2x1ZGUgIkxheWVyLmgiCi0jaW5jbHVkZSAiTGF5ZXJEaW0uaCIKLSNpbmNsdWRlICJMYXllclNjcmVlbnNob3QuaCIKLSNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgotCi0jaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oIgotI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmgiCi0KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2d1aS9TaGFyZWRCdWZmZXJTdGFjay5oPgotCi0jZGVmaW5lIEVHTF9WRVJTSU9OX0hXX0FORFJPSUQgIDB4MzE0MwotCi0jZGVmaW5lIERJU1BMQVlfQ09VTlQgICAgICAgMQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgU3RyaW5nMTYgc0hhcmR3YXJlVGVzdCgiYW5kcm9pZC5wZXJtaXNzaW9uLkhBUkRXQVJFX1RFU1QiKTsKLWNvbnN0IFN0cmluZzE2IHNBY2Nlc3NTdXJmYWNlRmxpbmdlcigiYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19TVVJGQUNFX0ZMSU5HRVIiKTsKLWNvbnN0IFN0cmluZzE2IHNSZWFkRnJhbWVidWZmZXIoImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0ZSQU1FX0JVRkZFUiIpOwotY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TdXJmYWNlRmxpbmdlcjo6U3VyZmFjZUZsaW5nZXIoKQotICAgIDogICBCblN1cmZhY2VDb21wb3NlcigpLCBUaHJlYWQoZmFsc2UpLAotICAgICAgICBtVHJhbnNhY3Rpb25GbGFncygwKSwKLSAgICAgICAgbVRyYW5zYXRpb25QZW5kaW5nKGZhbHNlKSwKLSAgICAgICAgbUxheWVyc1JlbW92ZWQoZmFsc2UpLAotICAgICAgICBtQm9vdFRpbWUoc3lzdGVtVGltZSgpKSwKLSAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHkoZmFsc2UpLAotICAgICAgICBtSHdXb3JrTGlzdERpcnR5KGZhbHNlKSwKLSAgICAgICAgbUVsZWN0cm9uQmVhbUFuaW1hdGlvbk1vZGUoMCksCi0gICAgICAgIG1EZWJ1Z1JlZ2lvbigwKSwKLSAgICAgICAgbURlYnVnQmFja2dyb3VuZCgwKSwKLSAgICAgICAgbURlYnVnRERNUygwKSwKLSAgICAgICAgbURlYnVnRGlzYWJsZUhXQygwKSwKLSAgICAgICAgbURlYnVnRGlzYWJsZVRyYW5zZm9ybUhpbnQoMCksCi0gICAgICAgIG1EZWJ1Z0luU3dhcEJ1ZmZlcnMoMCksCi0gICAgICAgIG1MYXN0U3dhcEJ1ZmZlclRpbWUoMCksCi0gICAgICAgIG1EZWJ1Z0luVHJhbnNhY3Rpb24oMCksCi0gICAgICAgIG1MYXN0VHJhbnNhY3Rpb25UaW1lKDApLAotICAgICAgICBtQm9vdEZpbmlzaGVkKGZhbHNlKSwKLSAgICAgICAgbUNvbnNvbGVTaWduYWxzKDApLAotICAgICAgICBtU2VjdXJlRnJhbWVCdWZmZXIoMCkKLXsKLSAgICBpbml0KCk7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmluaXQoKQotewotICAgIEFMT0dJKCJTdXJmYWNlRmxpbmdlciBpcyBzdGFydGluZyIpOwotCi0gICAgLy8gZGVidWdnaW5nIHN0dWZmLi4uCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotCi0gICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5zZi5zaG93dXBkYXRlcyIsIHZhbHVlLCAiMCIpOwotICAgIG1EZWJ1Z1JlZ2lvbiA9IGF0b2kodmFsdWUpOwotCi0gICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5zZi5zaG93YmFja2dyb3VuZCIsIHZhbHVlLCAiMCIpOwotICAgIG1EZWJ1Z0JhY2tncm91bmQgPSBhdG9pKHZhbHVlKTsKLQotICAgIHByb3BlcnR5X2dldCgiZGVidWcuc2YuZGRtcyIsIHZhbHVlLCAiMCIpOwotICAgIG1EZWJ1Z0RETVMgPSBhdG9pKHZhbHVlKTsKLSAgICBpZiAobURlYnVnRERNUykgewotICAgICAgICBEZG1Db25uZWN0aW9uOjpzdGFydChnZXRTZXJ2aWNlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBBTE9HSV9JRihtRGVidWdSZWdpb24sICAgICAgICJzaG93dXBkYXRlcyBlbmFibGVkIik7Ci0gICAgQUxPR0lfSUYobURlYnVnQmFja2dyb3VuZCwgICAic2hvd2JhY2tncm91bmQgZW5hYmxlZCIpOwotICAgIEFMT0dJX0lGKG1EZWJ1Z0RETVMsICAgICAgICAgIkRETVMgZGVidWdnaW5nIGVuYWJsZWQiKTsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6b25GaXJzdFJlZigpCi17Ci0gICAgbUV2ZW50UXVldWUuaW5pdCh0aGlzKTsKLQotICAgIHJ1bigiU3VyZmFjZUZsaW5nZXIiLCBQUklPUklUWV9VUkdFTlRfRElTUExBWSk7Ci0KLSAgICAvLyBXYWl0IGZvciB0aGUgbWFpbiB0aHJlYWQgdG8gYmUgZG9uZSB3aXRoIGl0cyBpbml0aWFsaXphdGlvbgotICAgIG1SZWFkeVRvUnVuQmFycmllci53YWl0KCk7Ci19Ci0KLQotU3VyZmFjZUZsaW5nZXI6On5TdXJmYWNlRmxpbmdlcigpCi17Ci0gICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbVdvcm1ob2xlVGV4TmFtZSk7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKLXsKLSAgICAvLyB0aGUgd2luZG93IG1hbmFnZXIgZGllZCBvbiB1cy4gcHJlcGFyZSBpdHMgZXVsb2d5LgotCi0gICAgLy8gcmVzZXQgc2NyZWVuIG9yaWVudGF0aW9uCi0gICAgVmVjdG9yPENvbXBvc2VyU3RhdGU+IHN0YXRlOwotICAgIHNldFRyYW5zYWN0aW9uU3RhdGUoc3RhdGUsIGVPcmllbnRhdGlvbkRlZmF1bHQsIDApOwotCi0gICAgLy8gcmVzdGFydCB0aGUgYm9vdC1hbmltYXRpb24KLSAgICBwcm9wZXJ0eV9zZXQoImN0bC5zdGFydCIsICJib290YW5pbSIpOwotfQotCi1zcDxJTWVtb3J5SGVhcD4gU3VyZmFjZUZsaW5nZXI6OmdldENibGsoKSBjb25zdAotewotICAgIHJldHVybiBtU2VydmVySGVhcDsKLX0KLQotc3A8SVN1cmZhY2VDb21wb3NlckNsaWVudD4gU3VyZmFjZUZsaW5nZXI6OmNyZWF0ZUNvbm5lY3Rpb24oKQotewotICAgIHNwPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGJjbGllbnQ7Ci0gICAgc3A8Q2xpZW50PiBjbGllbnQobmV3IENsaWVudCh0aGlzKSk7Ci0gICAgc3RhdHVzX3QgZXJyID0gY2xpZW50LT5pbml0Q2hlY2soKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGJjbGllbnQgPSBjbGllbnQ7Ci0gICAgfQotICAgIHJldHVybiBiY2xpZW50OwotfQotCi1zcDxJR3JhcGhpY0J1ZmZlckFsbG9jPiBTdXJmYWNlRmxpbmdlcjo6Y3JlYXRlR3JhcGhpY0J1ZmZlckFsbG9jKCkKLXsKLSAgICBzcDxHcmFwaGljQnVmZmVyQWxsb2M+IGdiYShuZXcgR3JhcGhpY0J1ZmZlckFsbG9jKCkpOwotICAgIHJldHVybiBnYmE7Ci19Ci0KLWNvbnN0IEdyYXBoaWNQbGFuZSYgU3VyZmFjZUZsaW5nZXI6OmdyYXBoaWNQbGFuZShpbnQgZHB5KSBjb25zdAotewotICAgIEFMT0dFX0lGKHVpbnQzMl90KGRweSkgPj0gRElTUExBWV9DT1VOVCwgIkludmFsaWQgRGlzcGxheUlEICVkIiwgZHB5KTsKLSAgICBjb25zdCBHcmFwaGljUGxhbmUmIHBsYW5lKG1HcmFwaGljUGxhbmVzW2RweV0pOwotICAgIHJldHVybiBwbGFuZTsKLX0KLQotR3JhcGhpY1BsYW5lJiBTdXJmYWNlRmxpbmdlcjo6Z3JhcGhpY1BsYW5lKGludCBkcHkpCi17Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8R3JhcGhpY1BsYW5lJj4oCi0gICAgICAgIGNvbnN0X2Nhc3Q8U3VyZmFjZUZsaW5nZXIgY29uc3QgKj4odGhpcyktPmdyYXBoaWNQbGFuZShkcHkpKTsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6Ym9vdEZpbmlzaGVkKCkKLXsKLSAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICBjb25zdCBuc2Vjc190IGR1cmF0aW9uID0gbm93IC0gbUJvb3RUaW1lOwotICAgIEFMT0dJKCJCb290IGlzIGZpbmlzaGVkICglbGQgbXMpIiwgbG9uZyhuczJtcyhkdXJhdGlvbikpICk7Ci0gICAgbUJvb3RGaW5pc2hlZCA9IHRydWU7Ci0KLSAgICAvLyB3YWl0IHBhdGllbnRseSBmb3IgdGhlIHdpbmRvdyBtYW5hZ2VyIGRlYXRoCi0gICAgY29uc3QgU3RyaW5nMTYgbmFtZSgid2luZG93Iik7Ci0gICAgc3A8SUJpbmRlcj4gd2luZG93KGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKG5hbWUpKTsKLSAgICBpZiAod2luZG93ICE9IDApIHsKLSAgICAgICAgd2luZG93LT5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLyBzdG9wIGJvb3QgYW5pbWF0aW9uCi0gICAgcHJvcGVydHlfc2V0KCJjdGwuc3RvcCIsICJib290YW5pbSIpOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQxNl90IHBhY2s1NjUoaW50IHIsIGludCBnLCBpbnQgYikgewotICAgIHJldHVybiAocjw8MTEpfChnPDw1KXxiOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6cmVhZHlUb1J1bigpCi17Ci0gICAgQUxPR0koICAgIlN1cmZhY2VGbGluZ2VyJ3MgbWFpbiB0aHJlYWQgcmVhZHkgdG8gcnVuLiAiCi0gICAgICAgICAgICAiSW5pdGlhbGl6aW5nIGdyYXBoaWNzIEgvVy4uLiIpOwotCi0gICAgLy8gd2Ugb25seSBzdXBwb3J0IG9uZSBkaXNwbGF5IGN1cnJlbnRseQotICAgIGludCBkcHkgPSAwOwotCi0gICAgewotICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBtYWluIGRpc3BsYXkKLSAgICAgICAgR3JhcGhpY1BsYW5lJiBwbGFuZShncmFwaGljUGxhbmUoZHB5KSk7Ci0gICAgICAgIERpc3BsYXlIYXJkd2FyZSogY29uc3QgaHcgPSBuZXcgRGlzcGxheUhhcmR3YXJlKHRoaXMsIGRweSk7Ci0gICAgICAgIHBsYW5lLnNldERpc3BsYXlIYXJkd2FyZShodyk7Ci0gICAgfQotCi0gICAgLy8gY3JlYXRlIHRoZSBzaGFyZWQgY29udHJvbC1ibG9jawotICAgIG1TZXJ2ZXJIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKDQwOTYsCi0gICAgICAgICAgICBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZLCAiU3VyZmFjZUZsaW5nZXIgcmVhZC1vbmx5IGhlYXAiKTsKLSAgICBBTE9HRV9JRihtU2VydmVySGVhcD09MCwgImNhbid0IGNyZWF0ZSBzaGFyZWQgbWVtb3J5IGRlYWxlciIpOwotCi0gICAgbVNlcnZlckNibGsgPSBzdGF0aWNfY2FzdDxzdXJmYWNlX2ZsaW5nZXJfY2Jsa190Kj4obVNlcnZlckhlYXAtPmdldEJhc2UoKSk7Ci0gICAgQUxPR0VfSUYobVNlcnZlckNibGs9PTAsICJjYW4ndCBnZXQgdG8gc2hhcmVkIGNvbnRyb2wgYmxvY2sncyBhZGRyZXNzIik7Ci0KLSAgICBuZXcobVNlcnZlckNibGspIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3Q7Ci0KLSAgICAvLyBpbml0aWFsaXplIHByaW1hcnkgc2NyZWVuCi0gICAgLy8gKG90aGVyIGRpc3BsYXkgc2hvdWxkIGJlIGluaXRpYWxpemVkIGluIHRoZSBzYW1lIG1hbm5lciwgYnV0Ci0gICAgLy8gYXN5bmNocm9ub3VzbHksIGFzIHRoZXkgY291bGQgY29tZSBhbmQgZ28uIE5vbmUgb2YgdGhpcyBpcyBzdXBwb3J0ZWQKLSAgICAvLyB5ZXQpLgotICAgIGNvbnN0IEdyYXBoaWNQbGFuZSYgcGxhbmUoZ3JhcGhpY1BsYW5lKGRweSkpOwotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcgPSBwbGFuZS5kaXNwbGF5SGFyZHdhcmUoKTsKLSAgICBjb25zdCB1aW50MzJfdCB3ID0gaHcuZ2V0V2lkdGgoKTsKLSAgICBjb25zdCB1aW50MzJfdCBoID0gaHcuZ2V0SGVpZ2h0KCk7Ci0gICAgY29uc3QgdWludDMyX3QgZiA9IGh3LmdldEZvcm1hdCgpOwotICAgIGh3Lm1ha2VDdXJyZW50KCk7Ci0KLSAgICAvLyBpbml0aWFsaXplIHRoZSBzaGFyZWQgY29udHJvbCBibG9jawotICAgIG1TZXJ2ZXJDYmxrLT5jb25uZWN0ZWQgfD0gMTw8ZHB5OwotICAgIGRpc3BsYXlfY2Jsa190KiBkY2JsayA9IG1TZXJ2ZXJDYmxrLT5kaXNwbGF5cyArIGRweTsKLSAgICBtZW1zZXQoZGNibGssIDAsIHNpemVvZihkaXNwbGF5X2NibGtfdCkpOwotICAgIGRjYmxrLT53ICAgICAgICAgICAgPSBwbGFuZS5nZXRXaWR0aCgpOwotICAgIGRjYmxrLT5oICAgICAgICAgICAgPSBwbGFuZS5nZXRIZWlnaHQoKTsKLSAgICBkY2Jsay0+Zm9ybWF0ICAgICAgID0gZjsKLSAgICBkY2Jsay0+b3JpZW50YXRpb24gID0gSVN1cmZhY2VDb21wb3Nlcjo6ZU9yaWVudGF0aW9uRGVmYXVsdDsKLSAgICBkY2Jsay0+eGRwaSAgICAgICAgID0gaHcuZ2V0RHBpWCgpOwotICAgIGRjYmxrLT55ZHBpICAgICAgICAgPSBody5nZXREcGlZKCk7Ci0gICAgZGNibGstPmZwcyAgICAgICAgICA9IGh3LmdldFJlZnJlc2hSYXRlKCk7Ci0gICAgZGNibGstPmRlbnNpdHkgICAgICA9IGh3LmdldERlbnNpdHkoKTsKLQotICAgIC8vIEluaXRpYWxpemUgT3BlbkdMfEVTCi0gICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCA0KTsKLSAgICBnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCA0KTsKLSAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7Ci0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7Ci0gICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7Ci0KLSAgICBjb25zdCB1aW50MTZfdCBnMCA9IHBhY2s1NjUoMHgwRiwweDFGLDB4MEYpOwotICAgIGNvbnN0IHVpbnQxNl90IGcxID0gcGFjazU2NSgweDE3LDB4MmYsMHgxNyk7Ci0gICAgY29uc3QgdWludDE2X3Qgd29ybWhvbGVUZXhEYXRhWzRdID0geyBnMCwgZzEsIGcxLCBnMCB9OwotICAgIGdsR2VuVGV4dHVyZXMoMSwgJm1Xb3JtaG9sZVRleE5hbWUpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVdvcm1ob2xlVGV4TmFtZSk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKLSAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLCAyLCAyLCAwLAotICAgICAgICAgICAgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgd29ybWhvbGVUZXhEYXRhKTsKLQotICAgIGNvbnN0IHVpbnQxNl90IHByb3RUZXhEYXRhW10gPSB7IHBhY2s1NjUoMHgwMywgMHgwMywgMHgwMykgfTsKLSAgICBnbEdlblRleHR1cmVzKDEsICZtUHJvdGVjdGVkVGV4TmFtZSk7Ci0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtUHJvdGVjdGVkVGV4TmFtZSk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKLSAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLCAxLCAxLCAwLAotICAgICAgICAgICAgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgcHJvdFRleERhdGEpOwotCi0gICAgZ2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsKLSAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7Ci0gICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAvLyBwdXQgdGhlIG9yaWdpbiBpbiB0aGUgbGVmdC1ib3R0b20gY29ybmVyCi0gICAgZ2xPcnRob2YoMCwgdywgMCwgaCwgMCwgMSk7IC8vIGw9MCwgcj13IDsgYj0wLCB0PWgKLQotCi0gICAgLy8gc3RhcnQgdGhlIEV2ZW50VGhyZWFkCi0gICAgbUV2ZW50VGhyZWFkID0gbmV3IEV2ZW50VGhyZWFkKHRoaXMpOwotICAgIG1FdmVudFF1ZXVlLnNldEV2ZW50VGhyZWFkKG1FdmVudFRocmVhZCk7Ci0gICAgaHcuc3RhcnRTbGVlcE1hbmFnZW1lbnQoKTsKLQotICAgIC8qCi0gICAgICogIFdlJ3JlIG5vdyByZWFkeSB0byBhY2NlcHQgY2xpZW50cy4uLgotICAgICAqLwotCi0gICAgbVJlYWR5VG9SdW5CYXJyaWVyLm9wZW4oKTsKLQotICAgIC8vIHN0YXJ0IGJvb3QgYW5pbWF0aW9uCi0gICAgcHJvcGVydHlfc2V0KCJjdGwuc3RhcnQiLCAiYm9vdGFuaW0iKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ib29sIFN1cmZhY2VGbGluZ2VyOjphdXRoZW50aWNhdGVTdXJmYWNlVGV4dHVyZSgKLSAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2VUZXh0dXJlPiYgc3VyZmFjZVRleHR1cmUpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN0YXRlTG9jayk7Ci0gICAgc3A8SUJpbmRlcj4gc3VyZmFjZVRleHR1cmVCaW5kZXIoc3VyZmFjZVRleHR1cmUtPmFzQmluZGVyKCkpOwotCi0gICAgLy8gQ2hlY2sgdGhlIHZpc2libGUgbGF5ZXIgbGlzdCBmb3IgdGhlIElTdXJmYWNlCi0gICAgY29uc3QgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMgPSBtQ3VycmVudFN0YXRlLmxheWVyc1NvcnRlZEJ5WjsKLSAgICBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGN1cnJlbnRMYXllcnNbaV0pOwotICAgICAgICBzcDxMYXllckJhc2VDbGllbnQ+IGxiYyhsYXllci0+Z2V0TGF5ZXJCYXNlQ2xpZW50KCkpOwotICAgICAgICBpZiAobGJjICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHdwPElCaW5kZXI+IGxiY0JpbmRlciA9IGxiYy0+Z2V0U3VyZmFjZVRleHR1cmVCaW5kZXIoKTsKLSAgICAgICAgICAgIGlmIChsYmNCaW5kZXIgPT0gc3VyZmFjZVRleHR1cmVCaW5kZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENoZWNrIHRoZSBsYXllcnMgaW4gdGhlIHB1cmdhdG9yeS4gIFRoaXMgY2hlY2sgaXMgaGVyZSBzbyB0aGF0IGlmIGEKLSAgICAvLyBTdXJmYWNlVGV4dHVyZSBnZXRzIGRlc3Ryb3llZCBiZWZvcmUgYWxsIHRoZSBjbGllbnRzIGFyZSBkb25lIHVzaW5nIGl0LAotICAgIC8vIHRoZSBlcnJvciB3aWxsIG5vdCBiZSByZXBvcnRlZCBhcyAic3VyZmFjZSBYWVogaXMgbm90IGF1dGhlbnRpY2F0ZWQiLCBidXQKLSAgICAvLyB3aWxsIGluc3RlYWQgZmFpbCBsYXRlciBvbiB3aGVuIHRoZSBjbGllbnQgdHJpZXMgdG8gdXNlIHRoZSBzdXJmYWNlLAotICAgIC8vIHdoaWNoIHNob3VsZCBiZSByZXBvcnRlZCBhcyAic3VyZmFjZSBYWVogcmV0dXJuZWQgYW4gLUVOT0RFViIuICBUaGUKLSAgICAvLyBwdXJnYXRvcml6ZWQgbGF5ZXJzIGFyZSBubyBsZXNzIGF1dGhlbnRpYyB0aGFuIHRoZSB2aXNpYmxlIG9uZXMsIHNvIHRoaXMKLSAgICAvLyBzaG91bGQgbm90IGNhdXNlIGFueSBoYXJtLgotICAgIHNpemVfdCBwdXJnYXRvcnlTaXplID0gIG1MYXllclB1cmdhdG9yeS5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxwdXJnYXRvcnlTaXplIDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKG1MYXllclB1cmdhdG9yeS5pdGVtQXQoaSkpOwotICAgICAgICBzcDxMYXllckJhc2VDbGllbnQ+IGxiYyhsYXllci0+Z2V0TGF5ZXJCYXNlQ2xpZW50KCkpOwotICAgICAgICBpZiAobGJjICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHdwPElCaW5kZXI+IGxiY0JpbmRlciA9IGxiYy0+Z2V0U3VyZmFjZVRleHR1cmVCaW5kZXIoKTsKLSAgICAgICAgICAgIGlmIChsYmNCaW5kZXIgPT0gc3VyZmFjZVRleHR1cmVCaW5kZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zcDxJRGlzcGxheUV2ZW50Q29ubmVjdGlvbj4gU3VyZmFjZUZsaW5nZXI6OmNyZWF0ZURpc3BsYXlFdmVudENvbm5lY3Rpb24oKSB7Ci0gICAgcmV0dXJuIG1FdmVudFRocmVhZC0+Y3JlYXRlRXZlbnRDb25uZWN0aW9uKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6d2FpdEZvckV2ZW50KCkgewotICAgIG1FdmVudFF1ZXVlLndhaXRNZXNzYWdlKCk7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OnNpZ25hbFRyYW5zYWN0aW9uKCkgewotICAgIG1FdmVudFF1ZXVlLmludmFsaWRhdGUoKTsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6c2lnbmFsTGF5ZXJVcGRhdGUoKSB7Ci0gICAgbUV2ZW50UXVldWUuaW52YWxpZGF0ZSgpOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpzaWduYWxSZWZyZXNoKCkgewotICAgIG1FdmVudFF1ZXVlLnJlZnJlc2goKTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OnBvc3RNZXNzYWdlQXN5bmMoY29uc3Qgc3A8TWVzc2FnZUJhc2U+JiBtc2csCi0gICAgICAgIG5zZWNzX3QgcmVsdGltZSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICByZXR1cm4gbUV2ZW50UXVldWUucG9zdE1lc3NhZ2UobXNnLCByZWx0aW1lKTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OnBvc3RNZXNzYWdlU3luYyhjb25zdCBzcDxNZXNzYWdlQmFzZT4mIG1zZywKLSAgICAgICAgbnNlY3NfdCByZWx0aW1lLCB1aW50MzJfdCBmbGFncykgewotICAgIHN0YXR1c190IHJlcyA9IG1FdmVudFF1ZXVlLnBvc3RNZXNzYWdlKG1zZywgcmVsdGltZSk7Ci0gICAgaWYgKHJlcyA9PSBOT19FUlJPUikgewotICAgICAgICBtc2ctPndhaXQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotYm9vbCBTdXJmYWNlRmxpbmdlcjo6dGhyZWFkTG9vcCgpCi17Ci0gICAgd2FpdEZvckV2ZW50KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGludDMyX3Qgd2hhdCkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICBjYXNlIE1lc3NhZ2VRdWV1ZTo6UkVGUkVTSDogewotLy8gICAgICAgIGNhc2UgTWVzc2FnZVF1ZXVlOjpJTlZBTElEQVRFOiB7Ci0gICAgICAgICAgICAvLyBjaGVjayBmb3IgdHJhbnNhY3Rpb25zCi0gICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkobUNvbnNvbGVTaWduYWxzKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUNvbnNvbGVFdmVudHMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgd2UncmUgaW4gYSBnbG9iYWwgdHJhbnNhY3Rpb24sIGRvbid0IGRvIGFueXRoaW5nLgotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbWFzayA9IGVUcmFuc2FjdGlvbk5lZWRlZCB8IGVUcmF2ZXJzYWxOZWVkZWQ7Ci0gICAgICAgICAgICB1aW50MzJfdCB0cmFuc2FjdGlvbkZsYWdzID0gcGVla1RyYW5zYWN0aW9uRmxhZ3MobWFzayk7Ci0gICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodHJhbnNhY3Rpb25GbGFncykpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbkZsYWdzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcG9zdCBzdXJmYWNlcyAoaWYgbmVlZGVkKQotICAgICAgICAgICAgaGFuZGxlUGFnZUZsaXAoKTsKLQotLy8gICAgICAgICAgICBzaWduYWxSZWZyZXNoKCk7Ci0vLwotLy8gICAgICAgIH0gYnJlYWs7Ci0vLwotLy8gICAgICAgIGNhc2UgTWVzc2FnZVF1ZXVlOjpSRUZSRVNIOiB7Ci0KLSAgICAgICAgICAgIGhhbmRsZVJlZnJlc2goKTsKLQotICAgICAgICAgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotCi0vLyAgICAgICAgICAgIGlmIChtRGlydHlSZWdpb24uaXNFbXB0eSgpKSB7Ci0vLyAgICAgICAgICAgICAgICByZXR1cm47Ci0vLyAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKG1Id1dvcmtMaXN0RGlydHkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gYnVpbGQgdGhlIGgvdyB3b3JrIGxpc3QKLSAgICAgICAgICAgICAgICBoYW5kbGVXb3JrTGlzdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoQ0NfTElLRUxZKGh3LmNhbkRyYXcoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyByZXBhaW50IHRoZSBmcmFtZWJ1ZmZlciAoaWYgbmVlZGVkKQotICAgICAgICAgICAgICAgIGhhbmRsZVJlcGFpbnQoKTsKLSAgICAgICAgICAgICAgICAvLyBpbmZvcm0gdGhlIGgvdyB0aGF0IHdlJ3JlIGRvbmUgY29tcG9zaXRpbmcKLSAgICAgICAgICAgICAgICBody5jb21wb3NpdGlvbkNvbXBsZXRlKCk7Ci0gICAgICAgICAgICAgICAgcG9zdEZyYW1lYnVmZmVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHByZXRlbmQgd2UgZGlkIHRoZSBwb3N0Ci0gICAgICAgICAgICAgICAgaHcuY29tcG9zaXRpb25Db21wbGV0ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpwb3N0RnJhbWVidWZmZXIoKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgLy8gbVN3YXBSZWdpb24gY2FuIGJlIGVtcHR5IGhlcmUgaXMgc29tZSBjYXNlcywgZm9yIGluc3RhbmNlIGlmIGEgaGlkZGVuCi0gICAgLy8gb3IgZnVsbHkgdHJhbnNwYXJlbnQgd2luZG93IGlzIHVwZGF0aW5nLgotICAgIC8vIGluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byBmbGlwIGFueXdheXMgdG8gbm90IHJpc2sgYSBkZWFkbG9jayB3aXRoCi0gICAgLy8gaC93IGNvbXBvc2VyLgotCi0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIGNvbnN0IG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgIG1EZWJ1Z0luU3dhcEJ1ZmZlcnMgPSBub3c7Ci0gICAgaHcuZmxpcChtU3dhcFJlZ2lvbik7Ci0KLSAgICBzaXplX3QgbnVtTGF5ZXJzID0gbVZpc2libGVMYXllcnNTb3J0ZWRCeVouc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtTGF5ZXJzOyBpKyspIHsKLSAgICAgICAgbVZpc2libGVMYXllcnNTb3J0ZWRCeVpbaV0tPm9uTGF5ZXJEaXNwbGF5ZWQoKTsKLSAgICB9Ci0KLSAgICBtTGFzdFN3YXBCdWZmZXJUaW1lID0gc3lzdGVtVGltZSgpIC0gbm93OwotICAgIG1EZWJ1Z0luU3dhcEJ1ZmZlcnMgPSAwOwotICAgIG1Td2FwUmVnaW9uLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZUNvbnNvbGVFdmVudHMoKQotewotICAgIC8vIHNvbWV0aGluZyB0byBkbyB3aXRoIHRoZSBjb25zb2xlCi0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyA9IGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKTsKLQotICAgIGludCB3aGF0ID0gYW5kcm9pZF9hdG9taWNfYW5kKDAsICZtQ29uc29sZVNpZ25hbHMpOwotICAgIGlmICh3aGF0ICYgZUNvbnNvbGVBY3F1aXJlZCkgewotICAgICAgICBody5hY3F1aXJlU2NyZWVuKCk7Ci0gICAgICAgIC8vIHRoaXMgaXMgYSB0ZW1wb3Jhcnkgd29yay1hcm91bmQsIGV2ZW50dWFsbHkgdGhpcyBzaG91bGQgYmUgY2FsbGVkCi0gICAgICAgIC8vIGJ5IHRoZSBwb3dlci1tYW5hZ2VyCi0gICAgICAgIFN1cmZhY2VGbGluZ2VyOjp0dXJuRWxlY3Ryb25CZWFtT24obUVsZWN0cm9uQmVhbUFuaW1hdGlvbk1vZGUpOwotICAgIH0KLQotICAgIGlmICh3aGF0ICYgZUNvbnNvbGVSZWxlYXNlZCkgewotICAgICAgICBpZiAoaHcuaXNTY3JlZW5BY3F1aXJlZCgpKSB7Ci0gICAgICAgICAgICBody5yZWxlYXNlU2NyZWVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtRGlydHlSZWdpb24uc2V0KGh3LmJvdW5kcygpKTsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlVHJhbnNhY3Rpb24odWludDMyX3QgdHJhbnNhY3Rpb25GbGFncykKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotICAgIGNvbnN0IG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgIG1EZWJ1Z0luVHJhbnNhY3Rpb24gPSBub3c7Ci0KLSAgICAvLyBIZXJlIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdCBzb21lIHRyYW5zYWN0aW9uIGZsYWdzIGFyZSBzZXQKLSAgICAvLyBzbyB3ZSBjYW4gY2FsbCBoYW5kbGVUcmFuc2FjdGlvbkxvY2tlZCgpIHVuY29uZGl0aW9uYWxseS4KLSAgICAvLyBXZSBjYWxsIGdldFRyYW5zYWN0aW9uRmxhZ3MoKSwgd2hpY2ggd2lsbCBhbHNvIGNsZWFyIHRoZSBmbGFncywKLSAgICAvLyB3aXRoIG1TdGF0ZUxvY2sgaGVsZCB0byBndWFyYW50ZWUgdGhhdCBtQ3VycmVudFN0YXRlIHdvbid0IGNoYW5nZQotICAgIC8vIHVudGlsIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQuCi0KLSAgICBjb25zdCB1aW50MzJfdCBtYXNrID0gZVRyYW5zYWN0aW9uTmVlZGVkIHwgZVRyYXZlcnNhbE5lZWRlZDsKLSAgICB0cmFuc2FjdGlvbkZsYWdzID0gZ2V0VHJhbnNhY3Rpb25GbGFncyhtYXNrKTsKLSAgICBoYW5kbGVUcmFuc2FjdGlvbkxvY2tlZCh0cmFuc2FjdGlvbkZsYWdzKTsKLQotICAgIG1MYXN0VHJhbnNhY3Rpb25UaW1lID0gc3lzdGVtVGltZSgpIC0gbm93OwotICAgIG1EZWJ1Z0luVHJhbnNhY3Rpb24gPSAwOwotICAgIGludmFsaWRhdGVId2NHZW9tZXRyeSgpOwotICAgIC8vIGhlcmUgdGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGNvbW1pdHRlZAotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVUcmFuc2FjdGlvbkxvY2tlZCh1aW50MzJfdCB0cmFuc2FjdGlvbkZsYWdzKQotewotICAgIGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKG1DdXJyZW50U3RhdGUubGF5ZXJzU29ydGVkQnlaKTsKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKLQotICAgIC8qCi0gICAgICogVHJhdmVyc2FsIG9mIHRoZSBjaGlsZHJlbgotICAgICAqIChwZXJmb3JtIHRoZSB0cmFuc2FjdGlvbiBmb3IgZWFjaCBvZiB0aGVtIGlmIG5lZWRlZCkKLSAgICAgKi8KLQotICAgIGNvbnN0IGJvb2wgbGF5ZXJzTmVlZFRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb25GbGFncyAmIGVUcmF2ZXJzYWxOZWVkZWQ7Ci0gICAgaWYgKGxheWVyc05lZWRUcmFuc2FjdGlvbikgewotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllciA9IGN1cnJlbnRMYXllcnNbaV07Ci0gICAgICAgICAgICB1aW50MzJfdCB0ckZsYWdzID0gbGF5ZXItPmdldFRyYW5zYWN0aW9uRmxhZ3MoZVRyYW5zYWN0aW9uTmVlZGVkKTsKLSAgICAgICAgICAgIGlmICghdHJGbGFncykgY29udGludWU7Ci0KLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGZsYWdzID0gbGF5ZXItPmRvVHJhbnNhY3Rpb24oMCk7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBMYXllcjo6ZVZpc2libGVSZWdpb24pCi0gICAgICAgICAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHkgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQZXJmb3JtIG91ciBvd24gdHJhbnNhY3Rpb24gaWYgbmVlZGVkCi0gICAgICovCi0KLSAgICBpZiAodHJhbnNhY3Rpb25GbGFncyAmIGVUcmFuc2FjdGlvbk5lZWRlZCkgewotICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZS5vcmllbnRhdGlvbiAhPSBtRHJhd2luZ1N0YXRlLm9yaWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAvLyB0aGUgb3JpZW50YXRpb24gaGFzIGNoYW5nZWQsIHJlY29tcHV0ZSBhbGwgdmlzaWJsZSByZWdpb25zCi0gICAgICAgICAgICAvLyBhbmQgaW52YWxpZGF0ZSBldmVyeXRoaW5nLgotCi0gICAgICAgICAgICBjb25zdCBpbnQgZHB5ID0gMDsKLSAgICAgICAgICAgIGNvbnN0IGludCBvcmllbnRhdGlvbiA9IG1DdXJyZW50U3RhdGUub3JpZW50YXRpb247Ci0gICAgICAgICAgICAvLyBDdXJyZW50bHkgdW51c2VkOiBjb25zdCB1aW50MzJfdCBmbGFncyA9IG1DdXJyZW50U3RhdGUub3JpZW50YXRpb25GbGFnczsKLSAgICAgICAgICAgIEdyYXBoaWNQbGFuZSYgcGxhbmUoZ3JhcGhpY1BsYW5lKGRweSkpOwotICAgICAgICAgICAgcGxhbmUuc2V0T3JpZW50YXRpb24ob3JpZW50YXRpb24pOwotCi0gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHNoYXJlZCBjb250cm9sIGJsb2NrCi0gICAgICAgICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KHBsYW5lLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICAgICAgICAgIHZvbGF0aWxlIGRpc3BsYXlfY2Jsa190KiBkY2JsayA9IG1TZXJ2ZXJDYmxrLT5kaXNwbGF5cyArIGRweTsKLSAgICAgICAgICAgIGRjYmxrLT5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uOwotICAgICAgICAgICAgZGNibGstPncgPSBwbGFuZS5nZXRXaWR0aCgpOwotICAgICAgICAgICAgZGNibGstPmggPSBwbGFuZS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHkgPSB0cnVlOwotICAgICAgICAgICAgbURpcnR5UmVnaW9uLnNldChody5ib3VuZHMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3VycmVudExheWVycy5zaXplKCkgPiBtRHJhd2luZ1N0YXRlLmxheWVyc1NvcnRlZEJ5Wi5zaXplKCkpIHsKLSAgICAgICAgICAgIC8vIGxheWVycyBoYXZlIGJlZW4gYWRkZWQKLSAgICAgICAgICAgIG1WaXNpYmxlUmVnaW9uc0RpcnR5ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNvbWUgbGF5ZXJzIG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkLCBzbwotICAgICAgICAvLyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcmVnaW9ucyB0aGV5J3JlIGV4cG9zaW5nLgotICAgICAgICBpZiAobUxheWVyc1JlbW92ZWQpIHsKLSAgICAgICAgICAgIG1MYXllcnNSZW1vdmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICBjb25zdCBMYXllclZlY3RvciYgcHJldmlvdXNMYXllcnMobURyYXdpbmdTdGF0ZS5sYXllcnNTb3J0ZWRCeVopOwotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gcHJldmlvdXNMYXllcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKHByZXZpb3VzTGF5ZXJzW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudExheWVycy5pbmRleE9mKCBsYXllciApIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGxheWVyIGlzIG5vdCB2aXNpYmxlIGFueW1vcmUKLSAgICAgICAgICAgICAgICAgICAgbURpcnR5UmVnaW9uUmVtb3ZlZExheWVyLm9yU2VsZihsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY29tbWl0VHJhbnNhY3Rpb24oKTsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6Y29tcHV0ZVZpc2libGVSZWdpb25zKAotICAgIGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzLCBSZWdpb24mIGRpcnR5UmVnaW9uLCBSZWdpb24mIG9wYXF1ZVJlZ2lvbikKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotCi0gICAgY29uc3QgR3JhcGhpY1BsYW5lJiBwbGFuZShncmFwaGljUGxhbmUoMCkpOwotICAgIGNvbnN0IFRyYW5zZm9ybSYgcGxhbmVUcmFuc2Zvcm0ocGxhbmUudHJhbnNmb3JtKCkpOwotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcocGxhbmUuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIGNvbnN0IFJlZ2lvbiBzY3JlZW5SZWdpb24oaHcuYm91bmRzKCkpOwotCi0gICAgUmVnaW9uIGFib3ZlT3BhcXVlTGF5ZXJzOwotICAgIFJlZ2lvbiBhYm92ZUNvdmVyZWRMYXllcnM7Ci0gICAgUmVnaW9uIGRpcnR5OwotCi0gICAgYm9vbCBzZWN1cmVGcmFtZUJ1ZmZlciA9IGZhbHNlOwotCi0gICAgc2l6ZV90IGkgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKLSAgICB3aGlsZSAoaS0tKSB7Ci0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyID0gY3VycmVudExheWVyc1tpXTsKLSAgICAgICAgbGF5ZXItPnZhbGlkYXRlVmlzaWJpbGl0eShwbGFuZVRyYW5zZm9ybSk7Ci0KLSAgICAgICAgLy8gc3RhcnQgd2l0aCB0aGUgd2hvbGUgc3VyZmFjZSBhdCBpdHMgY3VycmVudCBsb2NhdGlvbgotICAgICAgICBjb25zdCBMYXllcjo6U3RhdGUmIHMobGF5ZXItPmRyYXdpbmdTdGF0ZSgpKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBvcGFxdWVSZWdpb246IGFyZWEgb2YgYSBzdXJmYWNlIHRoYXQgaXMgZnVsbHkgb3BhcXVlLgotICAgICAgICAgKi8KLSAgICAgICAgUmVnaW9uIG9wYXF1ZVJlZ2lvbjsKLQotICAgICAgICAvKgotICAgICAgICAgKiB2aXNpYmxlUmVnaW9uOiBhcmVhIG9mIGEgc3VyZmFjZSB0aGF0IGlzIHZpc2libGUgb24gc2NyZWVuCi0gICAgICAgICAqIGFuZCBub3QgZnVsbHkgdHJhbnNwYXJlbnQuIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIGxheWVyJ3MKLSAgICAgICAgICogZm9vdHByaW50IG1pbnVzIHRoZSBvcGFxdWUgcmVnaW9ucyBhYm92ZSBpdC4KLSAgICAgICAgICogQXJlYXMgY292ZXJlZCBieSBhIHRyYW5zbHVjZW50IHN1cmZhY2UgYXJlIGNvbnNpZGVyZWQgdmlzaWJsZS4KLSAgICAgICAgICovCi0gICAgICAgIFJlZ2lvbiB2aXNpYmxlUmVnaW9uOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGNvdmVyZWRSZWdpb246IGFyZWEgb2YgYSBzdXJmYWNlIHRoYXQgaXMgY292ZXJlZCBieSBhbGwKLSAgICAgICAgICogdmlzaWJsZSByZWdpb25zIGFib3ZlIGl0ICh3aGljaCBpbmNsdWRlcyB0aGUgdHJhbnNsdWNlbnQgYXJlYXMpLgotICAgICAgICAgKi8KLSAgICAgICAgUmVnaW9uIGNvdmVyZWRSZWdpb247Ci0KLQotICAgICAgICAvLyBoYW5kbGUgaGlkZGVuIHN1cmZhY2VzIGJ5IHNldHRpbmcgdGhlIHZpc2libGUgcmVnaW9uIHRvIGVtcHR5Ci0gICAgICAgIGlmIChDQ19MSUtFTFkoIShzLmZsYWdzICYgSVN1cmZhY2VDb21wb3Nlcjo6ZUxheWVySGlkZGVuKSAmJiBzLmFscGhhKSkgewotICAgICAgICAgICAgY29uc3QgYm9vbCB0cmFuc2x1Y2VudCA9ICFsYXllci0+aXNPcGFxdWUoKTsKLSAgICAgICAgICAgIGNvbnN0IFJlY3QgYm91bmRzKGxheWVyLT52aXNpYmxlQm91bmRzKCkpOwotICAgICAgICAgICAgdmlzaWJsZVJlZ2lvbi5zZXQoYm91bmRzKTsKLSAgICAgICAgICAgIHZpc2libGVSZWdpb24uYW5kU2VsZihzY3JlZW5SZWdpb24pOwotICAgICAgICAgICAgaWYgKCF2aXNpYmxlUmVnaW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhbnNwYXJlbnQgYXJlYSBmcm9tIHRoZSB2aXNpYmxlIHJlZ2lvbgotICAgICAgICAgICAgICAgIGlmICh0cmFuc2x1Y2VudCkgewotICAgICAgICAgICAgICAgICAgICB2aXNpYmxlUmVnaW9uLnN1YnRyYWN0U2VsZihsYXllci0+dHJhbnNwYXJlbnRSZWdpb25TY3JlZW4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIG9wYXF1ZSByZWdpb24KLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGxheWVyT3JpZW50YXRpb24gPSBsYXllci0+Z2V0T3JpZW50YXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAocy5hbHBoYT09MjU1ICYmICF0cmFuc2x1Y2VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChsYXllck9yaWVudGF0aW9uICYgVHJhbnNmb3JtOjpST1RfSU5WQUxJRCkgPT0gZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvcGFxdWUgcmVnaW9uIGlzIHRoZSBsYXllcidzIGZvb3RwcmludAotICAgICAgICAgICAgICAgICAgICBvcGFxdWVSZWdpb24gPSB2aXNpYmxlUmVnaW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENsaXAgdGhlIGNvdmVyZWQgcmVnaW9uIHRvIHRoZSB2aXNpYmxlIHJlZ2lvbgotICAgICAgICBjb3ZlcmVkUmVnaW9uID0gYWJvdmVDb3ZlcmVkTGF5ZXJzLmludGVyc2VjdCh2aXNpYmxlUmVnaW9uKTsKLQotICAgICAgICAvLyBVcGRhdGUgYWJvdmVDb3ZlcmVkTGF5ZXJzIGZvciBuZXh0IChsb3dlcikgbGF5ZXIKLSAgICAgICAgYWJvdmVDb3ZlcmVkTGF5ZXJzLm9yU2VsZih2aXNpYmxlUmVnaW9uKTsKLQotICAgICAgICAvLyBzdWJ0cmFjdCB0aGUgb3BhcXVlIHJlZ2lvbiBjb3ZlcmVkIGJ5IHRoZSBsYXllcnMgYWJvdmUgdXMKLSAgICAgICAgdmlzaWJsZVJlZ2lvbi5zdWJ0cmFjdFNlbGYoYWJvdmVPcGFxdWVMYXllcnMpOwotCi0gICAgICAgIC8vIGNvbXB1dGUgdGhpcyBsYXllcidzIGRpcnR5IHJlZ2lvbgotICAgICAgICBpZiAobGF5ZXItPmNvbnRlbnREaXJ0eSkgewotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZSB3aG9sZSByZWdpb24KLSAgICAgICAgICAgIGRpcnR5ID0gdmlzaWJsZVJlZ2lvbjsKLSAgICAgICAgICAgIC8vIGFzIHdlbGwsIGFzIHRoZSBvbGQgdmlzaWJsZSByZWdpb24KLSAgICAgICAgICAgIGRpcnR5Lm9yU2VsZihsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbik7Ci0gICAgICAgICAgICBsYXllci0+Y29udGVudERpcnR5ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjb21wdXRlIHRoZSBleHBvc2VkIHJlZ2lvbjoKLSAgICAgICAgICAgICAqICAgdGhlIGV4cG9zZWQgcmVnaW9uIGNvbnNpc3RzIG9mIHR3byBjb21wb25lbnRzOgotICAgICAgICAgICAgICogICAxKSB3aGF0J3MgVklTSUJMRSBub3cgYW5kIHdhcyBDT1ZFUkVEIGJlZm9yZQotICAgICAgICAgICAgICogICAyKSB3aGF0J3MgRVhQT1NFRCBub3cgbGVzcyB3aGF0IHdhcyBFWFBPU0VEIGJlZm9yZQotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIG5vdGUgdGhhdCAoMSkgaXMgY29uc2VydmF0aXZlLCB3ZSBzdGFydCB3aXRoIHRoZSB3aG9sZQotICAgICAgICAgICAgICogdmlzaWJsZSByZWdpb24gYnV0IG9ubHkga2VlcCB3aGF0IHVzZWQgdG8gYmUgY292ZXJlZCBieQotICAgICAgICAgICAgICogc29tZXRoaW5nIC0tIHdoaWNoIG1lYW4gaXQgbWF5IGhhdmUgYmVlbiBleHBvc2VkLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqICgyKSBoYW5kbGVzIGFyZWFzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSBhbnl0aGluZyBidXQgZ290Ci0gICAgICAgICAgICAgKiBleHBvc2VkIGJlY2F1c2Ugb2YgYSByZXNpemUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNvbnN0IFJlZ2lvbiBuZXdFeHBvc2VkID0gdmlzaWJsZVJlZ2lvbiAtIGNvdmVyZWRSZWdpb247Ci0gICAgICAgICAgICBjb25zdCBSZWdpb24gb2xkVmlzaWJsZVJlZ2lvbiA9IGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuOwotICAgICAgICAgICAgY29uc3QgUmVnaW9uIG9sZENvdmVyZWRSZWdpb24gPSBsYXllci0+Y292ZXJlZFJlZ2lvblNjcmVlbjsKLSAgICAgICAgICAgIGNvbnN0IFJlZ2lvbiBvbGRFeHBvc2VkID0gb2xkVmlzaWJsZVJlZ2lvbiAtIG9sZENvdmVyZWRSZWdpb247Ci0gICAgICAgICAgICBkaXJ0eSA9ICh2aXNpYmxlUmVnaW9uJm9sZENvdmVyZWRSZWdpb24pIHwgKG5ld0V4cG9zZWQtb2xkRXhwb3NlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGlydHkuc3VidHJhY3RTZWxmKGFib3ZlT3BhcXVlTGF5ZXJzKTsKLQotICAgICAgICAvLyBhY2N1bXVsYXRlIHRvIHRoZSBzY3JlZW4gZGlydHkgcmVnaW9uCi0gICAgICAgIGRpcnR5UmVnaW9uLm9yU2VsZihkaXJ0eSk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIGFib3ZlT3BhcXVlTGF5ZXJzIGZvciBuZXh0IChsb3dlcikgbGF5ZXIKLSAgICAgICAgYWJvdmVPcGFxdWVMYXllcnMub3JTZWxmKG9wYXF1ZVJlZ2lvbik7Ci0KLSAgICAgICAgLy8gU3RvcmUgdGhlIHZpc2libGUgcmVnaW9uIGlzIHNjcmVlbiBzcGFjZQotICAgICAgICBsYXllci0+c2V0VmlzaWJsZVJlZ2lvbih2aXNpYmxlUmVnaW9uKTsKLSAgICAgICAgbGF5ZXItPnNldENvdmVyZWRSZWdpb24oY292ZXJlZFJlZ2lvbik7Ci0KLSAgICAgICAgLy8gSWYgYSBzZWN1cmUgbGF5ZXIgaXMgcGFydGlhbGx5IHZpc2libGUsIGxvY2stZG93biB0aGUgc2NyZWVuIQotICAgICAgICBpZiAobGF5ZXItPmlzU2VjdXJlKCkgJiYgIXZpc2libGVSZWdpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzZWN1cmVGcmFtZUJ1ZmZlciA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBpbnZhbGlkYXRlIHRoZSBhcmVhcyB3aGVyZSBhIGxheWVyIHdhcyByZW1vdmVkCi0gICAgZGlydHlSZWdpb24ub3JTZWxmKG1EaXJ0eVJlZ2lvblJlbW92ZWRMYXllcik7Ci0gICAgbURpcnR5UmVnaW9uUmVtb3ZlZExheWVyLmNsZWFyKCk7Ci0KLSAgICBtU2VjdXJlRnJhbWVCdWZmZXIgPSBzZWN1cmVGcmFtZUJ1ZmZlcjsKLSAgICBvcGFxdWVSZWdpb24gPSBhYm92ZU9wYXF1ZUxheWVyczsKLX0KLQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpjb21taXRUcmFuc2FjdGlvbigpCi17Ci0gICAgaWYgKCFtTGF5ZXJzUGVuZGluZ1JlbW92YWwuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIE5vdGlmeSByZW1vdmVkIGxheWVycyBub3cgdGhhdCB0aGV5IGNhbid0IGJlIGRyYXduIGZyb20KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTGF5ZXJzUGVuZGluZ1JlbW92YWwuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1MYXllcnNQZW5kaW5nUmVtb3ZhbFtpXS0+b25SZW1vdmVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUxheWVyc1BlbmRpbmdSZW1vdmFsLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgbURyYXdpbmdTdGF0ZSA9IG1DdXJyZW50U3RhdGU7Ci0gICAgbVRyYW5zYXRpb25QZW5kaW5nID0gZmFsc2U7Ci0gICAgbVRyYW5zYWN0aW9uQ1YuYnJvYWRjYXN0KCk7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVBhZ2VGbGlwKCkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcgPSBncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCk7Ci0gICAgY29uc3QgUmVnaW9uIHNjcmVlblJlZ2lvbihody5ib3VuZHMoKSk7Ci0KLSAgICBjb25zdCBMYXllclZlY3RvciYgY3VycmVudExheWVycyhtRHJhd2luZ1N0YXRlLmxheWVyc1NvcnRlZEJ5Wik7Ci0gICAgY29uc3QgYm9vbCB2aXNpYmxlUmVnaW9ucyA9IGxvY2tQYWdlRmxpcChjdXJyZW50TGF5ZXJzKTsKLQotICAgICAgICBpZiAodmlzaWJsZVJlZ2lvbnMgfHwgbVZpc2libGVSZWdpb25zRGlydHkpIHsKLSAgICAgICAgICAgIFJlZ2lvbiBvcGFxdWVSZWdpb247Ci0gICAgICAgICAgICBjb21wdXRlVmlzaWJsZVJlZ2lvbnMoY3VycmVudExheWVycywgbURpcnR5UmVnaW9uLCBvcGFxdWVSZWdpb24pOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIHJlYnVpbGQgdGhlIHZpc2libGUgbGF5ZXIgbGlzdAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKLSAgICAgICAgICAgIG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaLmNsZWFyKCk7Ci0gICAgICAgICAgICBtVmlzaWJsZUxheWVyc1NvcnRlZEJ5Wi5zZXRDYXBhY2l0eShjb3VudCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50TGF5ZXJzW2ldLT52aXNpYmxlUmVnaW9uU2NyZWVuLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgbVZpc2libGVMYXllcnNTb3J0ZWRCeVouYWRkKGN1cnJlbnRMYXllcnNbaV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtV29ybWhvbGVSZWdpb24gPSBzY3JlZW5SZWdpb24uc3VidHJhY3Qob3BhcXVlUmVnaW9uKTsKLSAgICAgICAgICAgIG1WaXNpYmxlUmVnaW9uc0RpcnR5ID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlSHdjR2VvbWV0cnkoKTsKLSAgICAgICAgfQotCi0gICAgdW5sb2NrUGFnZUZsaXAoY3VycmVudExheWVycyk7Ci0KLSAgICBtRGlydHlSZWdpb24ub3JTZWxmKGdldEFuZENsZWFySW52YWxpZGF0ZVJlZ2lvbigpKTsKLSAgICBtRGlydHlSZWdpb24uYW5kU2VsZihzY3JlZW5SZWdpb24pOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjppbnZhbGlkYXRlSHdjR2VvbWV0cnkoKQotewotICAgIG1Id1dvcmtMaXN0RGlydHkgPSB0cnVlOwotfQotCi1ib29sIFN1cmZhY2VGbGluZ2VyOjpsb2NrUGFnZUZsaXAoY29uc3QgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMpCi17Ci0gICAgYm9vbCByZWNvbXB1dGVWaXNpYmxlUmVnaW9ucyA9IGZhbHNlOwotICAgIHNpemVfdCBjb3VudCA9IGN1cnJlbnRMYXllcnMuc2l6ZSgpOwotICAgIHNwPExheWVyQmFzZT4gY29uc3QqIGxheWVycyA9IGN1cnJlbnRMYXllcnMuYXJyYXkoKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGxheWVyc1tpXSk7Ci0gICAgICAgIGxheWVyLT5sb2NrUGFnZUZsaXAocmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMpOwotICAgIH0KLSAgICByZXR1cm4gcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnM7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OnVubG9ja1BhZ2VGbGlwKGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKQotewotICAgIGNvbnN0IEdyYXBoaWNQbGFuZSYgcGxhbmUoZ3JhcGhpY1BsYW5lKDApKTsKLSAgICBjb25zdCBUcmFuc2Zvcm0mIHBsYW5lVHJhbnNmb3JtKHBsYW5lLnRyYW5zZm9ybSgpKTsKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKLSAgICBzcDxMYXllckJhc2U+IGNvbnN0KiBsYXllcnMgPSBjdXJyZW50TGF5ZXJzLmFycmF5KCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihsYXllcnNbaV0pOwotICAgICAgICBsYXllci0+dW5sb2NrUGFnZUZsaXAocGxhbmVUcmFuc2Zvcm0sIG1EaXJ0eVJlZ2lvbik7Ci0gICAgfQotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVSZWZyZXNoKCkKLXsKLSAgICBib29sIG5lZWRJbnZhbGlkYXRlID0gZmFsc2U7Ci0gICAgY29uc3QgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMobURyYXdpbmdTdGF0ZS5sYXllcnNTb3J0ZWRCeVopOwotICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGN1cnJlbnRMYXllcnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIoY3VycmVudExheWVyc1tpXSk7Ci0gICAgICAgIGlmIChsYXllci0+b25QcmVDb21wb3NpdGlvbigpKSB7Ci0gICAgICAgICAgICBuZWVkSW52YWxpZGF0ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5lZWRJbnZhbGlkYXRlKSB7Ci0gICAgICAgIHNpZ25hbExheWVyVXBkYXRlKCk7Ci0gICAgfQotfQotCi0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVdvcmtMaXN0KCkKLXsKLSAgICBtSHdXb3JrTGlzdERpcnR5ID0gZmFsc2U7Ci0gICAgSFdDb21wb3NlciYgaHdjKGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKS5nZXRId0NvbXBvc2VyKCkpOwotICAgIGlmIChod2MuaW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgY29uc3QgVmVjdG9yPCBzcDxMYXllckJhc2U+ID4mIGN1cnJlbnRMYXllcnMobVZpc2libGVMYXllcnNTb3J0ZWRCeVopOwotICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKLSAgICAgICAgaHdjLmNyZWF0ZVdvcmtMaXN0KGNvdW50KTsKLSAgICAgICAgaHdjX2xheWVyX3QqIGNvbnN0IGN1cihod2MuZ2V0TGF5ZXJzKCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBjdXIgJiYgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgY3VycmVudExheWVyc1tpXS0+c2V0R2VvbWV0cnkoJmN1cltpXSk7Ci0gICAgICAgICAgICBpZiAobURlYnVnRGlzYWJsZUhXQyB8fCBtRGVidWdSZWdpb24pIHsKLSAgICAgICAgICAgICAgICBjdXJbaV0uY29tcG9zaXRpb25UeXBlID0gSFdDX0ZSQU1FQlVGRkVSOwotICAgICAgICAgICAgICAgIGN1cltpXS5mbGFncyB8PSBIV0NfU0tJUF9MQVlFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlUmVwYWludCgpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLQotICAgIC8vIGNvbXB1dGUgdGhlIGludmFsaWQgcmVnaW9uCi0gICAgbVN3YXBSZWdpb24ub3JTZWxmKG1EaXJ0eVJlZ2lvbik7Ci0KLSAgICBpZiAoQ0NfVU5MSUtFTFkobURlYnVnUmVnaW9uKSkgewotICAgICAgICBkZWJ1Z0ZsYXNoUmVnaW9ucygpOwotICAgIH0KLQotICAgIC8vIHNldCB0aGUgZnJhbWUgYnVmZmVyCi0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IGh3LmdldEZsYWdzKCk7Ci0gICAgaWYgKChmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6U1dBUF9SRUNUQU5HTEUpIHx8Ci0gICAgICAgIChmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6QlVGRkVSX1BSRVNFUlZFRCkpCi0gICAgewotICAgICAgICAvLyB3ZSBjYW4gcmVkcmF3IG9ubHkgd2hhdCdzIGRpcnR5LCBidXQgc2luY2UgU1dBUF9SRUNUQU5HTEUgb25seQotICAgICAgICAvLyB0YWtlcyBhIHJlY3RhbmdsZSwgd2UgbXVzdCBtYWtlIHN1cmUgdG8gdXBkYXRlIHRoYXQgd2hvbGUKLSAgICAgICAgLy8gcmVjdGFuZ2xlIGluIHRoYXQgY2FzZQotICAgICAgICBpZiAoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OlNXQVBfUkVDVEFOR0xFKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB3ZSByZWFsbHkgc2hvdWxkIGJlIGFibGUgdG8gcGFzcyBhIHJlZ2lvbiB0bwotICAgICAgICAgICAgLy8gU1dBUF9SRUNUQU5HTEUgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJlZHJhdyBhbGwgdGhpcy4KLSAgICAgICAgICAgIG1EaXJ0eVJlZ2lvbi5zZXQobVN3YXBSZWdpb24uYm91bmRzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaW4gdGhlIEJVRkZFUl9QUkVTRVJWRUQgY2FzZSwgb2J2aW91c2x5LCB3ZSBjYW4gdXBkYXRlIG9ubHkKLSAgICAgICAgICAgIC8vIHdoYXQncyBuZWVkZWQgYW5kIG5vdGhpbmcgbW9yZS4KLSAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgaXMgTk9UIGEgY29tbW9uIGNhc2UsIGFzIHByZXNlcnZpbmcgdGhlIGJhY2tidWZmZXIKLSAgICAgICAgICAgIC8vIGlzIGNvc3RseSBhbmQgdXN1YWxseSBpbnZvbHZlcyBjb3B5aW5nIHRoZSB3aG9sZSB1cGRhdGUgYmFjay4KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6UEFSVElBTF9VUERBVEVTKSB7Ci0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlZHJhdyB0aGUgcmVjdGFuZ2xlIHRoYXQgd2lsbCBiZSB1cGRhdGVkCi0gICAgICAgICAgICAvLyAocHVzaGVkIHRvIHRoZSBmcmFtZWJ1ZmZlcikuCi0gICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIFBBUlRJQUxfVVBEQVRFUyBvbmx5IHRha2VzIG9uZQotICAgICAgICAgICAgLy8gcmVjdGFuZ2xlIGluc3RlYWQgb2YgYSByZWdpb24gKHNlZSBEaXNwbGF5SGFyZHdhcmU6OmZsaXAoKSkKLSAgICAgICAgICAgIG1EaXJ0eVJlZ2lvbi5zZXQobVN3YXBSZWdpb24uYm91bmRzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byByZWRyYXcgZXZlcnl0aGluZyAodGhlIHdob2xlIHNjcmVlbikKLSAgICAgICAgICAgIG1EaXJ0eVJlZ2lvbi5zZXQoaHcuYm91bmRzKCkpOwotICAgICAgICAgICAgbVN3YXBSZWdpb24gPSBtRGlydHlSZWdpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzZXR1cEhhcmR3YXJlQ29tcG9zZXIobURpcnR5UmVnaW9uKTsKLSAgICBjb21wb3NlU3VyZmFjZXMobURpcnR5UmVnaW9uKTsKLQotICAgIC8vIHVwZGF0ZSB0aGUgc3dhcCByZWdpb24gYW5kIGNsZWFyIHRoZSBkaXJ0eSByZWdpb24KLSAgICBtU3dhcFJlZ2lvbi5vclNlbGYobURpcnR5UmVnaW9uKTsKLSAgICBtRGlydHlSZWdpb24uY2xlYXIoKTsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6c2V0dXBIYXJkd2FyZUNvbXBvc2VyKFJlZ2lvbiYgZGlydHlJbk91dCkKLXsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgSFdDb21wb3NlciYgaHdjKGh3LmdldEh3Q29tcG9zZXIoKSk7Ci0gICAgaHdjX2xheWVyX3QqIGNvbnN0IGN1cihod2MuZ2V0TGF5ZXJzKCkpOwotICAgIGlmICghY3VyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBWZWN0b3I8IHNwPExheWVyQmFzZT4gPiYgbGF5ZXJzKG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaKTsKLSAgICBzaXplX3QgY291bnQgPSBsYXllcnMuc2l6ZSgpOwotCi0gICAgQUxPR0VfSUYoaHdjLmdldE51bUxheWVycygpICE9IGNvdW50LAotICAgICAgICAgICAgIkhBTCBudW1iZXIgb2YgbGF5ZXJzICglZCkgZG9lc24ndCBtYXRjaCBzdXJmYWNlZmxpbmdlciAoJWQpIiwKLSAgICAgICAgICAgIGh3Yy5nZXROdW1MYXllcnMoKSwgY291bnQpOwotCi0gICAgLy8ganVzdCB0byBiZSBleHRyYS1zYWZlLCB1c2UgdGhlIHNtYWxsZXN0IGNvdW50Ci0gICAgaWYgKGh3Yy5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICBjb3VudCA9IGNvdW50IDwgaHdjLmdldE51bUxheWVycygpID8gY291bnQgOiBod2MuZ2V0TnVtTGF5ZXJzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgdXBkYXRlIHRoZSBwZXItZnJhbWUgaC93IGNvbXBvc2VyIGRhdGEgZm9yIGVhY2ggbGF5ZXIKLSAgICAgKiAgYW5kIGJ1aWxkIHRoZSB0cmFuc3BhcmVudCByZWdpb24gb2YgdGhlIEZCCi0gICAgICovCi0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihsYXllcnNbaV0pOwotICAgICAgICBsYXllci0+c2V0UGVyRnJhbWVEYXRhKCZjdXJbaV0pOwotICAgIH0KLSAgICBjb25zdCBzaXplX3QgZmJMYXllckNvdW50ID0gaHdjLmdldExheWVyQ291bnQoSFdDX0ZSQU1FQlVGRkVSKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBod2MucHJlcGFyZSgpOwotICAgIEFMT0dFX0lGKGVyciwgIkhXQ29tcG9zZXI6OnByZXBhcmUgZmFpbGVkICglcykiLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIHdoYXQncyBoYXBwZW5pbmcgaGVyZSBpcyB0cmlja3kuCi0gICAgICAgIC8vIHdlIHdhbnQgdG8gY2xlYXIgYWxsIHRoZSBsYXllcnMgd2l0aCB0aGUgQ0xFQVJfRkIgZmxhZ3MKLSAgICAgICAgLy8gdGhhdCBhcmUgb3BhcXVlLgotICAgICAgICAvLyBob3dldmVyLCBzaW5jZSBzb21lIEdQVSBhcmUgZWZmaWNpZW50IGF0IHByZXNlcnZpbmcKLSAgICAgICAgLy8gdGhlIGJhY2tidWZmZXIsIHdlIHdhbnQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhhdCBzbyB3ZSBkbyB0aGUKLSAgICAgICAgLy8gY2xlYXIgb25seSBpbiB0aGUgZGlydHkgcmVnaW9uIChvdGhlciBhcmVhcyB3aWxsIGJlIHByZXNlcnZlZAotICAgICAgICAvLyBvbiB0aG9zZSBHUFVzKS4KLSAgICAgICAgLy8gICBOT1RFOiBvbiBub24gYmFja2J1ZmZlciBwcmVzZXJ2aW5nIEdQVSwgdGhlIGRpcnR5IHJlZ2lvbgotICAgICAgICAvLyAgIGhhcyBhbHJlYWR5IGJlZW4gZXhwYW5kZWQgYXMgbmVlZGVkLCBzbyB0aGUgY29kZSBpcyBjb3JyZWN0Ci0gICAgICAgIC8vICAgdGhlcmUgdG9vLgotICAgICAgICAvLwotICAgICAgICAvLyBIb3dldmVyLCB0aGUgY29udGVudCBvZiB0aGUgZnJhbWVidWZmZXIgY2Fubm90IGJlIHRydXN0ZWQgd2hlbgotICAgICAgICAvLyB3ZSBzd2l0Y2ggdG8vZnJvbSBGQi9PVkVSTEFZLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8KLSAgICAgICAgLy8gZXhwYW5kIHRoZSBkaXJ0eSByZWdpb24gdG8gdGhvc2UgYXJlYXMgdG9vLgotICAgICAgICAvLwotICAgICAgICAvLyBOb3RlIGFsc28gdGhhdCB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB3aGVuIHN3aXRjaGluZyBmcm9tCi0gICAgICAgIC8vICJubyBsYXllcnMgaW4gRkIiIHRvICJzb21lIGxheWVycyBpbiBGQiIsIHdoZXJlIHdlIG5lZWQgdG8gcmVkcmF3Ci0gICAgICAgIC8vIHRoZSBlbnRpcmUgRkIsIHNpbmNlIHNvbWUgYXJlYXMgbWlnaHQgY29udGFpbiB1bmluaXRpYWxpemVkCi0gICAgICAgIC8vIGRhdGEuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEFsc28gd2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gbm90IGNsZWFyIGFyZWFzIHRoYXQgYmVsb25nIHRvCi0gICAgICAgIC8vIGxheWVycyBhYm92ZSB0aGF0IHdvbid0IHJlZHJhdyAod2Ugd291bGQganVzdCBiZSBlcmFzaW5nIHRoZW0pLAotICAgICAgICAvLyB0aGF0IGlzLCB3ZSBjYW4ndCBlcmFzZSBhbnl0aGluZyBvdXRzaWRlIHRoZSBkaXJ0eSByZWdpb24uCi0KLSAgICAgICAgUmVnaW9uIHRyYW5zcGFyZW50OwotCi0gICAgICAgIGlmICghZmJMYXllckNvdW50ICYmIGh3Yy5nZXRMYXllckNvdW50KEhXQ19GUkFNRUJVRkZFUikpIHsKLSAgICAgICAgICAgIHRyYW5zcGFyZW50LnNldChody5nZXRCb3VuZHMoKSk7Ci0gICAgICAgICAgICBkaXJ0eUluT3V0ID0gdHJhbnNwYXJlbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIobGF5ZXJzW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoKGN1cltpXS5oaW50cyAmIEhXQ19ISU5UX0NMRUFSX0ZCKSAmJiBsYXllci0+aXNPcGFxdWUoKSkgewotICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudC5vclNlbGYobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sIGlzT3ZlcmxheSA9IChjdXJbaV0uY29tcG9zaXRpb25UeXBlICE9IEhXQ19GUkFNRUJVRkZFUik7Ci0gICAgICAgICAgICAgICAgaWYgKGlzT3ZlcmxheSAhPSBsYXllci0+aXNPdmVybGF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgdHJhbnNpdGlvbmVkIHRvL2Zyb20gb3ZlcmxheSwgc28gYWRkIHRoaXMgbGF5ZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIGRpcnR5IHJlZ2lvbiBzbyB0aGUgZnJhbWVidWZmZXIgY2FuIGJlIGVpdGhlcgotICAgICAgICAgICAgICAgICAgICAvLyBjbGVhcmVkIG9yIHJlZHJhd24uCi0gICAgICAgICAgICAgICAgICAgIGRpcnR5SW5PdXQub3JTZWxmKGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGF5ZXItPnNldE92ZXJsYXkoaXNPdmVybGF5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGRvbid0IGVyYXNlIHN0dWZmIG91dHNpZGUgdGhlIGRpcnR5IHJlZ2lvbgotICAgICAgICAgICAgdHJhbnNwYXJlbnQuYW5kU2VsZihkaXJ0eUluT3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqICBjbGVhciB0aGUgYXJlYSBvZiB0aGUgRkIgdGhhdCBuZWVkIHRvIGJlIHRyYW5zcGFyZW50Ci0gICAgICAgICAqLwotICAgICAgICBpZiAoIXRyYW5zcGFyZW50LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZ2xDbGVhckNvbG9yKDAsMCwwLDApOwotICAgICAgICAgICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IHRyYW5zcGFyZW50LmJlZ2luKCk7Ci0gICAgICAgICAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IGVuZCA9IHRyYW5zcGFyZW50LmVuZCgpOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBoZWlnaHQgPSBody5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdCAhPSBlbmQpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBSZWN0JiByKCppdCsrKTsKLSAgICAgICAgICAgICAgICBjb25zdCBHTGludCBzeSA9IGhlaWdodCAtIChyLnRvcCArIHIuaGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIGdsU2Npc3NvcihyLmxlZnQsIHN5LCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmNvbXBvc2VTdXJmYWNlcyhjb25zdCBSZWdpb24mIGRpcnR5KQotewotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBIV0NvbXBvc2VyJiBod2MoaHcuZ2V0SHdDb21wb3NlcigpKTsKLQotICAgIGNvbnN0IHNpemVfdCBmYkxheWVyQ291bnQgPSBod2MuZ2V0TGF5ZXJDb3VudChIV0NfRlJBTUVCVUZGRVIpOwotICAgIGlmIChDQ19VTkxJS0VMWShmYkxheWVyQ291bnQgJiYgIW1Xb3JtaG9sZVJlZ2lvbi5pc0VtcHR5KCkpKSB7Ci0gICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gdW5sZXNzIHRoZSB3aW5kb3cgbWFuYWdlciBoYXMgYSBidWcKLSAgICAgICAgLy8gZHJhdyBzb21ldGhpbmcuLi4KLSAgICAgICAgZHJhd1dvcm1ob2xlKCk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IHdvcmthcm91ZCBmb3IgYi82MDIwODYwCi0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBnbFNjaXNzb3IoMCwwLDAsMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAvLyBlbmQtd29ya2Fyb3VuZAotCi0gICAgLyoKLSAgICAgKiBhbmQgdGhlbiwgcmVuZGVyIHRoZSBsYXllcnMgdGFyZ2V0ZWQgYXQgdGhlIGZyYW1lYnVmZmVyCi0gICAgICovCi0gICAgaHdjX2xheWVyX3QqIGNvbnN0IGN1cihod2MuZ2V0TGF5ZXJzKCkpOwotICAgIGNvbnN0IFZlY3Rvcjwgc3A8TGF5ZXJCYXNlPiA+JiBsYXllcnMobVZpc2libGVMYXllcnNTb3J0ZWRCeVopOwotICAgIHNpemVfdCBjb3VudCA9IGxheWVycy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBpZiAoY3VyICYmIChjdXJbaV0uY29tcG9zaXRpb25UeXBlICE9IEhXQ19GUkFNRUJVRkZFUikpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGxheWVyc1tpXSk7Ci0gICAgICAgIGNvbnN0IFJlZ2lvbiBjbGlwKGRpcnR5LmludGVyc2VjdChsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbikpOwotICAgICAgICBpZiAoIWNsaXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBsYXllci0+ZHJhdyhjbGlwKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6ZGVidWdGbGFzaFJlZ2lvbnMoKQotewotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBjb25zdCB1aW50MzJfdCBmbGFncyA9IGh3LmdldEZsYWdzKCk7Ci0gICAgY29uc3QgaW50MzJfdCBoZWlnaHQgPSBody5nZXRIZWlnaHQoKTsKLSAgICBpZiAobVN3YXBSZWdpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoISgoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OlNXQVBfUkVDVEFOR0xFKSB8fAotICAgICAgICAgICAgKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpCVUZGRVJfUFJFU0VSVkVEKSkpIHsKLSAgICAgICAgY29uc3QgUmVnaW9uIHJlcGFpbnQoKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpQQVJUSUFMX1VQREFURVMpID8KLSAgICAgICAgICAgICAgICBtRGlydHlSZWdpb24uYm91bmRzKCkgOiBody5ib3VuZHMoKSk7Ci0gICAgICAgIGNvbXBvc2VTdXJmYWNlcyhyZXBhaW50KTsKLSAgICB9Ci0KLSAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOwotICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotCi0gICAgc3RhdGljIGludCB0b2dnbGUgPSAwOwotICAgIHRvZ2dsZSA9IDEgLSB0b2dnbGU7Ci0gICAgaWYgKHRvZ2dsZSkgewotICAgICAgICBnbENvbG9yNGYoMSwgMCwgMSwgMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xDb2xvcjRmKDEsIDEsIDAsIDEpOwotICAgIH0KLQotICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtRGlydHlSZWdpb24uYmVnaW4oKTsKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IGVuZCA9IG1EaXJ0eVJlZ2lvbi5lbmQoKTsKLSAgICB3aGlsZSAoaXQgIT0gZW5kKSB7Ci0gICAgICAgIGNvbnN0IFJlY3QmIHIgPSAqaXQrKzsKLSAgICAgICAgR0xmbG9hdCB2ZXJ0aWNlc1tdWzJdID0gewotICAgICAgICAgICAgICAgIHsgci5sZWZ0LCAgaGVpZ2h0IC0gci50b3AgfSwKLSAgICAgICAgICAgICAgICB7IHIubGVmdCwgIGhlaWdodCAtIHIuYm90dG9tIH0sCi0gICAgICAgICAgICAgICAgeyByLnJpZ2h0LCBoZWlnaHQgLSByLmJvdHRvbSB9LAotICAgICAgICAgICAgICAgIHsgci5yaWdodCwgaGVpZ2h0IC0gci50b3AgfQotICAgICAgICB9OwotICAgICAgICBnbFZlcnRleFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIHZlcnRpY2VzKTsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci0gICAgfQotCi0gICAgaHcuZmxpcChtU3dhcFJlZ2lvbik7Ci0KLSAgICBpZiAobURlYnVnUmVnaW9uID4gMSkKLSAgICAgICAgdXNsZWVwKG1EZWJ1Z1JlZ2lvbiAqIDEwMDApOwotCi0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6ZHJhd1dvcm1ob2xlKCkgY29uc3QKLXsKLSAgICBjb25zdCBSZWdpb24gcmVnaW9uKG1Xb3JtaG9sZVJlZ2lvbi5pbnRlcnNlY3QobURpcnR5UmVnaW9uKSk7Ci0gICAgaWYgKHJlZ2lvbi5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBjb25zdCBpbnQzMl90IHdpZHRoID0gaHcuZ2V0V2lkdGgoKTsKLSAgICBjb25zdCBpbnQzMl90IGhlaWdodCA9IGh3LmdldEhlaWdodCgpOwotCi0gICAgaWYgKENDX0xJS0VMWSghbURlYnVnQmFja2dyb3VuZCkpIHsKLSAgICAgICAgZ2xDbGVhckNvbG9yKDAsMCwwLDApOwotICAgICAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVnaW9uLmJlZ2luKCk7Ci0gICAgICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgY29uc3QgZW5kID0gcmVnaW9uLmVuZCgpOwotICAgICAgICB3aGlsZSAoaXQgIT0gZW5kKSB7Ci0gICAgICAgICAgICBjb25zdCBSZWN0JiByID0gKml0Kys7Ci0gICAgICAgICAgICBjb25zdCBHTGludCBzeSA9IGhlaWdodCAtIChyLnRvcCArIHIuaGVpZ2h0KCkpOwotICAgICAgICAgICAgZ2xTY2lzc29yKHIubGVmdCwgc3ksIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgR0xzaG9ydCB2ZXJ0aWNlc1tdWzJdID0geyB7IDAsIDAgfSwgeyB3aWR0aCwgMCB9LAotICAgICAgICAgICAgICAgIHsgd2lkdGgsIGhlaWdodCB9LCB7IDAsIGhlaWdodCB9ICB9OwotICAgICAgICBjb25zdCBHTHNob3J0IHRjb29yZHNbXVsyXSA9IHsgeyAwLCAwIH0sIHsgMSwgMCB9LCAgeyAxLCAxIH0sIHsgMCwgMSB9IH07Ci0KLSAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX1NIT1JULCAwLCB2ZXJ0aWNlcyk7Ci0gICAgICAgIGdsVGV4Q29vcmRQb2ludGVyKDIsIEdMX1NIT1JULCAwLCB0Y29vcmRzKTsKLSAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLQotICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOwotICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtV29ybWhvbGVUZXhOYW1lKTsKLSAgICAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX1RFWFRVUkUpOwotICAgICAgICBnbExvYWRJZGVudGl0eSgpOwotCi0gICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0KLSAgICAgICAgZ2xTY2FsZWYod2lkdGgqKDEuMGYvMzIuMGYpLCBoZWlnaHQqKDEuMGYvMzIuMGYpLCAxKTsKLSAgICAgICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IHJlZ2lvbi5iZWdpbigpOwotICAgICAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IGVuZCA9IHJlZ2lvbi5lbmQoKTsKLSAgICAgICAgd2hpbGUgKGl0ICE9IGVuZCkgewotICAgICAgICAgICAgY29uc3QgUmVjdCYgciA9ICppdCsrOwotICAgICAgICAgICAgY29uc3QgR0xpbnQgc3kgPSBoZWlnaHQgLSAoci50b3AgKyByLmhlaWdodCgpKTsKLSAgICAgICAgICAgIGdsU2Npc3NvcihyLmxlZnQsIHN5LCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgICAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6YWRkTGF5ZXIoY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotICAgIGFkZExheWVyX2wobGF5ZXIpOwotICAgIHNldFRyYW5zYWN0aW9uRmxhZ3MoZVRyYW5zYWN0aW9uTmVlZGVkfGVUcmF2ZXJzYWxOZWVkZWQpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OmFkZExheWVyX2woY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIpCi17Ci0gICAgc3NpemVfdCBpID0gbUN1cnJlbnRTdGF0ZS5sYXllcnNTb3J0ZWRCeVouYWRkKGxheWVyKTsKLSAgICByZXR1cm4gKGkgPCAwKSA/IHN0YXR1c190KGkpIDogc3RhdHVzX3QoTk9fRVJST1IpOwotfQotCi1zc2l6ZV90IFN1cmZhY2VGbGluZ2VyOjphZGRDbGllbnRMYXllcihjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZUNsaWVudD4mIGxiYykKLXsKLSAgICAvLyBhdHRhY2ggdGhpcyBsYXllciB0byB0aGUgY2xpZW50Ci0gICAgc2l6ZV90IG5hbWUgPSBjbGllbnQtPmF0dGFjaExheWVyKGxiYyk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN0YXRlTG9jayk7Ci0KLSAgICAvLyBhZGQgdGhpcyBsYXllciB0byB0aGUgY3VycmVudCBzdGF0ZSBsaXN0Ci0gICAgYWRkTGF5ZXJfbChsYmMpOwotCi0gICAgcmV0dXJuIHNzaXplX3QobmFtZSk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpyZW1vdmVMYXllcihjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcikKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN0YXRlTG9jayk7Ci0gICAgc3RhdHVzX3QgZXJyID0gcHVyZ2F0b3JpemVMYXllcl9sKGxheWVyKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKQotICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWdzKGVUcmFuc2FjdGlvbk5lZWRlZCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OnJlbW92ZUxheWVyX2woY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXJCYXNlKQotewotICAgIHNwPExheWVyQmFzZUNsaWVudD4gbGJjKGxheWVyQmFzZS0+Z2V0TGF5ZXJCYXNlQ2xpZW50KCkpOwotICAgIGlmIChsYmMgIT0gMCkgewotICAgICAgICBtTGF5ZXJNYXAucmVtb3ZlSXRlbSggbGJjLT5nZXRTdXJmYWNlQmluZGVyKCkgKTsKLSAgICB9Ci0gICAgc3NpemVfdCBpbmRleCA9IG1DdXJyZW50U3RhdGUubGF5ZXJzU29ydGVkQnlaLnJlbW92ZShsYXllckJhc2UpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIG1MYXllcnNSZW1vdmVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzX3QoaW5kZXgpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6cHVyZ2F0b3JpemVMYXllcl9sKGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyQmFzZSkKLXsKLSAgICAvLyBGaXJzdCBhZGQgdGhlIGxheWVyIHRvIHRoZSBwdXJnYXRvcnkgbGlzdCwgd2hpY2ggbWFrZXMgc3VyZSBpdCB3b24ndAotICAgIC8vIGdvIGF3YXksIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIG1haW4gbGlzdCAodGhyb3VnaCBhIHRyYW5zYWN0aW9uKS4KLSAgICBzc2l6ZV90IGVyciA9IHJlbW92ZUxheWVyX2wobGF5ZXJCYXNlKTsKLSAgICBpZiAoZXJyID49IDApIHsKLSAgICAgICAgbUxheWVyUHVyZ2F0b3J5LmFkZChsYXllckJhc2UpOwotICAgIH0KLQotICAgIG1MYXllcnNQZW5kaW5nUmVtb3ZhbC5wdXNoKGxheWVyQmFzZSk7Ci0KLSAgICAvLyBpdCdzIHBvc3NpYmxlIHRoYXQgd2UgZG9uJ3QgZmluZCBhIGxheWVyLCBiZWNhdXNlIGl0IG1pZ2h0Ci0gICAgLy8gaGF2ZSBiZWVuIGRlc3Ryb3llZCBhbHJlYWR5IC0tIHRoaXMgaXMgbm90IHRlY2huaWNhbGx5IGFuIGVycm9yCi0gICAgLy8gZnJvbSB0aGUgdXNlciBiZWNhdXNlIHRoZXJlIGlzIGEgcmFjZSBiZXR3ZWVuIENsaWVudDo6ZGVzdHJveVN1cmZhY2UoKSwKLSAgICAvLyB+Q2xpZW50KCkgYW5kIH5JU3VyZmFjZSgpLgotICAgIHJldHVybiAoZXJyID09IE5BTUVfTk9UX0ZPVU5EKSA/IHN0YXR1c190KE5PX0VSUk9SKSA6IGVycjsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OmludmFsaWRhdGVMYXllclZpc2liaWxpdHkoY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIpCi17Ci0gICAgbGF5ZXItPmZvcmNlVmlzaWJpbGl0eVRyYW5zYWN0aW9uKCk7Ci0gICAgc2V0VHJhbnNhY3Rpb25GbGFncyhlVHJhdmVyc2FsTmVlZGVkKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXVpbnQzMl90IFN1cmZhY2VGbGluZ2VyOjpwZWVrVHJhbnNhY3Rpb25GbGFncyh1aW50MzJfdCBmbGFncykKLXsKLSAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9sb2FkKCZtVHJhbnNhY3Rpb25GbGFncyk7Ci19Ci0KLXVpbnQzMl90IFN1cmZhY2VGbGluZ2VyOjpnZXRUcmFuc2FjdGlvbkZsYWdzKHVpbnQzMl90IGZsYWdzKQotewotICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19hbmQofmZsYWdzLCAmbVRyYW5zYWN0aW9uRmxhZ3MpICYgZmxhZ3M7Ci19Ci0KLXVpbnQzMl90IFN1cmZhY2VGbGluZ2VyOjpzZXRUcmFuc2FjdGlvbkZsYWdzKHVpbnQzMl90IGZsYWdzKQotewotICAgIHVpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX29yKGZsYWdzLCAmbVRyYW5zYWN0aW9uRmxhZ3MpOwotICAgIGlmICgob2xkICYgZmxhZ3MpPT0wKSB7IC8vIHdha2UgdGhlIHNlcnZlciB1cAotICAgICAgICBzaWduYWxUcmFuc2FjdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4gb2xkOwotfQotCi0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OnNldFRyYW5zYWN0aW9uU3RhdGUoY29uc3QgVmVjdG9yPENvbXBvc2VyU3RhdGU+JiBzdGF0ZSwKLSAgICAgICAgaW50IG9yaWVudGF0aW9uLCB1aW50MzJfdCBmbGFncykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtU3RhdGVMb2NrKTsKLQotICAgIHVpbnQzMl90IHRyYW5zYWN0aW9uRmxhZ3MgPSAwOwotICAgIGlmIChtQ3VycmVudFN0YXRlLm9yaWVudGF0aW9uICE9IG9yaWVudGF0aW9uKSB7Ci0gICAgICAgIGlmICh1aW50MzJfdChvcmllbnRhdGlvbik8PWVPcmllbnRhdGlvbjI3MCB8fCBvcmllbnRhdGlvbj09NDIpIHsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKLSAgICAgICAgICAgIHRyYW5zYWN0aW9uRmxhZ3MgfD0gZVRyYW5zYWN0aW9uTmVlZGVkOwotICAgICAgICB9IGVsc2UgaWYgKG9yaWVudGF0aW9uICE9IGVPcmllbnRhdGlvblVuY2hhbmdlZCkgewotICAgICAgICAgICAgQUxPR1coInNldFRyYW5zYWN0aW9uU3RhdGU6IGlnbm9yaW5nIHVucmVjb2duaXplZCBvcmllbnRhdGlvbjogJWQiLAotICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBzdGF0ZS5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBjb25zdCBDb21wb3NlclN0YXRlJiBzKHN0YXRlW2ldKTsKLSAgICAgICAgc3A8Q2xpZW50PiBjbGllbnQoIHN0YXRpY19jYXN0PENsaWVudCAqPihzLmNsaWVudC5nZXQoKSkgKTsKLSAgICAgICAgdHJhbnNhY3Rpb25GbGFncyB8PSBzZXRDbGllbnRTdGF0ZUxvY2tlZChjbGllbnQsIHMuc3RhdGUpOwotICAgIH0KLQotICAgIGlmICh0cmFuc2FjdGlvbkZsYWdzKSB7Ci0gICAgICAgIC8vIHRoaXMgdHJpZ2dlcnMgdGhlIHRyYW5zYWN0aW9uCi0gICAgICAgIHNldFRyYW5zYWN0aW9uRmxhZ3ModHJhbnNhY3Rpb25GbGFncyk7Ci0KLSAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIHRyYW5zYWN0aW9uLCB3YWl0IGZvciBpdCB0byB0YWtlIGVmZmVjdAotICAgICAgICAvLyBiZWZvcmUgcmV0dXJuaW5nLgotICAgICAgICBpZiAoZmxhZ3MgJiBlU3luY2hyb25vdXMpIHsKLSAgICAgICAgICAgIG1UcmFuc2F0aW9uUGVuZGluZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKG1UcmFuc2F0aW9uUGVuZGluZykgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVRyYW5zYWN0aW9uQ1Yud2FpdFJlbGF0aXZlKG1TdGF0ZUxvY2ssIHMybnMoNSkpOwotICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKGVyciAhPSBOT19FUlJPUikpIHsKLSAgICAgICAgICAgICAgICAvLyBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgd3JvbmcgaW4gU0YsIHJldHVybiB0byB0aGUKLSAgICAgICAgICAgICAgICAvLyBjYWxsZWQgYWZ0ZXIgYSBmZXcgc2Vjb25kcy4KLSAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgPT0gVElNRURfT1VULCAiY2xvc2VHbG9iYWxUcmFuc2FjdGlvbiB0aW1lZCBvdXQhIik7Ci0gICAgICAgICAgICAgICAgbVRyYW5zYXRpb25QZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXNwPElTdXJmYWNlPiBTdXJmYWNlRmxpbmdlcjo6Y3JlYXRlU3VyZmFjZSgKLSAgICAgICAgSVN1cmZhY2VDb21wb3NlckNsaWVudDo6c3VyZmFjZV9kYXRhX3QqIHBhcmFtcywKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwKLSAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAotICAgICAgICBEaXNwbGF5SUQgZCwgdWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzcDxMYXllckJhc2VDbGllbnQ+IGxheWVyOwotICAgIHNwPElTdXJmYWNlPiBzdXJmYWNlSGFuZGxlOwotCi0gICAgaWYgKGludDMyX3Qod3xoKSA8IDApIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVN1cmZhY2UoKSBmYWlsZWQsIHcgb3IgaCBpcyBuZWdhdGl2ZSAodz0lZCwgaD0lZCkiLAotICAgICAgICAgICAgICAgIGludCh3KSwgaW50KGgpKTsKLSAgICAgICAgcmV0dXJuIHN1cmZhY2VIYW5kbGU7Ci0gICAgfQotCi0gICAgLy9BTE9HRCgiY3JlYXRlU3VyZmFjZSBmb3IgKCVkIHggJWQpLCBuYW1lPSVzIiwgdywgaCwgbmFtZS5zdHJpbmcoKSk7Ci0gICAgc3A8TGF5ZXI+IG5vcm1hbExheWVyOwotICAgIHN3aXRjaCAoZmxhZ3MgJiBlRlhTdXJmYWNlTWFzaykgewotICAgICAgICBjYXNlIGVGWFN1cmZhY2VOb3JtYWw6Ci0gICAgICAgICAgICBub3JtYWxMYXllciA9IGNyZWF0ZU5vcm1hbFN1cmZhY2UoY2xpZW50LCBkLCB3LCBoLCBmbGFncywgZm9ybWF0KTsKLSAgICAgICAgICAgIGxheWVyID0gbm9ybWFsTGF5ZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBlRlhTdXJmYWNlQmx1cjoKLSAgICAgICAgICAgIC8vIGZvciBub3cgd2UgdHJlYXQgQmx1ciBhcyBEaW0sIHVudGlsIHdlIGNhbiBpbXBsZW1lbnQgaXQKLSAgICAgICAgICAgIC8vIGVmZmljaWVudGx5LgotICAgICAgICBjYXNlIGVGWFN1cmZhY2VEaW06Ci0gICAgICAgICAgICBsYXllciA9IGNyZWF0ZURpbVN1cmZhY2UoY2xpZW50LCBkLCB3LCBoLCBmbGFncyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBlRlhTdXJmYWNlU2NyZWVuc2hvdDoKLSAgICAgICAgICAgIGxheWVyID0gY3JlYXRlU2NyZWVuc2hvdFN1cmZhY2UoY2xpZW50LCBkLCB3LCBoLCBmbGFncyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobGF5ZXIgIT0gMCkgewotICAgICAgICBsYXllci0+aW5pdFN0YXRlcyh3LCBoLCBmbGFncyk7Ci0gICAgICAgIGxheWVyLT5zZXROYW1lKG5hbWUpOwotICAgICAgICBzc2l6ZV90IHRva2VuID0gYWRkQ2xpZW50TGF5ZXIoY2xpZW50LCBsYXllcik7Ci0KLSAgICAgICAgc3VyZmFjZUhhbmRsZSA9IGxheWVyLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgIGlmIChzdXJmYWNlSGFuZGxlICE9IDApIHsKLSAgICAgICAgICAgIHBhcmFtcy0+dG9rZW4gPSB0b2tlbjsKLSAgICAgICAgICAgIHBhcmFtcy0+aWRlbnRpdHkgPSBsYXllci0+Z2V0SWRlbnRpdHkoKTsKLSAgICAgICAgICAgIGlmIChub3JtYWxMYXllciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotICAgICAgICAgICAgICAgIG1MYXllck1hcC5hZGQobGF5ZXItPmdldFN1cmZhY2VCaW5kZXIoKSwgbm9ybWFsTGF5ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VHJhbnNhY3Rpb25GbGFncyhlVHJhbnNhY3Rpb25OZWVkZWQpOwotICAgIH0KLQotICAgIHJldHVybiBzdXJmYWNlSGFuZGxlOwotfQotCi1zcDxMYXllcj4gU3VyZmFjZUZsaW5nZXI6OmNyZWF0ZU5vcm1hbFN1cmZhY2UoCi0gICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwgRGlzcGxheUlEIGRpc3BsYXksCi0gICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZsYWdzLAotICAgICAgICBQaXhlbEZvcm1hdCYgZm9ybWF0KQotewotICAgIC8vIGluaXRpYWxpemUgdGhlIHN1cmZhY2VzCi0gICAgc3dpdGNoIChmb3JtYXQpIHsgLy8gVE9ETzogdGFrZSBoL3cgaW50byBhY2NvdW50Ci0gICAgY2FzZSBQSVhFTF9GT1JNQVRfVFJBTlNQQVJFTlQ6Ci0gICAgY2FzZSBQSVhFTF9GT1JNQVRfVFJBTlNMVUNFTlQ6Ci0gICAgICAgIGZvcm1hdCA9IFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUElYRUxfRk9STUFUX09QQVFVRToKLSNpZmRlZiBOT19SR0JYXzg4ODgKLSAgICAgICAgZm9ybWF0ID0gUElYRUxfRk9STUFUX1JHQl81NjU7Ci0jZWxzZQotICAgICAgICBmb3JtYXQgPSBQSVhFTF9GT1JNQVRfUkdCWF84ODg4OwotI2VuZGlmCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotI2lmZGVmIE5PX1JHQlhfODg4OAotICAgIGlmIChmb3JtYXQgPT0gUElYRUxfRk9STUFUX1JHQlhfODg4OCkKLSAgICAgICAgZm9ybWF0ID0gUElYRUxfRk9STUFUX1JHQkFfODg4ODsKLSNlbmRpZgotCi0gICAgc3A8TGF5ZXI+IGxheWVyID0gbmV3IExheWVyKHRoaXMsIGRpc3BsYXksIGNsaWVudCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gbGF5ZXItPnNldEJ1ZmZlcnModywgaCwgZm9ybWF0LCBmbGFncyk7Ci0gICAgaWYgKENDX0xJS0VMWShlcnIgIT0gTk9fRVJST1IpKSB7Ci0gICAgICAgIEFMT0dFKCJjcmVhdGVOb3JtYWxTdXJmYWNlTG9ja2VkKCkgZmFpbGVkICglcykiLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgIGxheWVyLmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBsYXllcjsKLX0KLQotc3A8TGF5ZXJEaW0+IFN1cmZhY2VGbGluZ2VyOjpjcmVhdGVEaW1TdXJmYWNlKAotICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsIERpc3BsYXlJRCBkaXNwbGF5LAotICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzcDxMYXllckRpbT4gbGF5ZXIgPSBuZXcgTGF5ZXJEaW0odGhpcywgZGlzcGxheSwgY2xpZW50KTsKLSAgICByZXR1cm4gbGF5ZXI7Ci19Ci0KLXNwPExheWVyU2NyZWVuc2hvdD4gU3VyZmFjZUZsaW5nZXI6OmNyZWF0ZVNjcmVlbnNob3RTdXJmYWNlKAotICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsIERpc3BsYXlJRCBkaXNwbGF5LAotICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzcDxMYXllclNjcmVlbnNob3Q+IGxheWVyID0gbmV3IExheWVyU2NyZWVuc2hvdCh0aGlzLCBkaXNwbGF5LCBjbGllbnQpOwotICAgIHJldHVybiBsYXllcjsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OnJlbW92ZVN1cmZhY2UoY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LCBTdXJmYWNlSUQgc2lkKQotewotICAgIC8qCi0gICAgICogY2FsbGVkIGJ5IHRoZSB3aW5kb3cgbWFuYWdlciwgd2hlbiBhIHN1cmZhY2Ugc2hvdWxkIGJlIG1hcmtlZCBmb3IKLSAgICAgKiBkZXN0cnVjdGlvbi4KLSAgICAgKgotICAgICAqIFRoZSBzdXJmYWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgY3VycmVudCBhbmQgZHJhd2luZyBsaXN0cywgYnV0IHBsYWNlZAotICAgICAqIGluIHRoZSBwdXJnYXRvcnkgcXVldWUsIHNvIGl0J3Mgbm90IGRlc3Ryb3llZCByaWdodC1hd2F5ICh3ZSBuZWVkCi0gICAgICogdG8gd2FpdCBmb3IgYWxsIGNsaWVudCdzIHJlZmVyZW5jZXMgdG8gZ28gYXdheSBmaXJzdCkuCi0gICAgICovCi0KLSAgICBzdGF0dXNfdCBlcnIgPSBOQU1FX05PVF9GT1VORDsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN0YXRlTG9jayk7Ci0gICAgc3A8TGF5ZXJCYXNlQ2xpZW50PiBsYXllciA9IGNsaWVudC0+Z2V0TGF5ZXJVc2VyKHNpZCk7Ci0gICAgaWYgKGxheWVyICE9IDApIHsKLSAgICAgICAgZXJyID0gcHVyZ2F0b3JpemVMYXllcl9sKGxheWVyKTsKLSAgICAgICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25GbGFncyhlVHJhbnNhY3Rpb25OZWVkZWQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpkZXN0cm95U3VyZmFjZShjb25zdCB3cDxMYXllckJhc2VDbGllbnQ+JiBsYXllcikKLXsKLSAgICAvLyBjYWxsZWQgYnkgfklTdXJmYWNlKCkgd2hlbiBhbGwgcmVmZXJlbmNlcyBhcmUgZ29uZQotICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwotICAgIHNwPExheWVyQmFzZUNsaWVudD4gbChsYXllci5wcm9tb3RlKCkpOwotICAgIGlmIChsICE9IE5VTEwpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotICAgICAgICBlcnIgPSByZW1vdmVMYXllcl9sKGwpOwotICAgICAgICBpZiAoZXJyID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICAvLyBUaGUgc3VyZmFjZSB3YXNuJ3QgaW4gdGhlIGN1cnJlbnQgbGlzdCwgd2hpY2ggbWVhbnMgaXQgd2FzCi0gICAgICAgICAgICAvLyByZW1vdmVkIGFscmVhZHksIHdoaWNoIG1lYW5zIGl0IGlzIGluIHRoZSBwdXJnYXRvcnksCi0gICAgICAgICAgICAvLyBhbmQgbmVlZCB0byBiZSByZW1vdmVkIGZyb20gdGhlcmUuCi0gICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1MYXllclB1cmdhdG9yeS5yZW1vdmUobCk7Ci0gICAgICAgICAgICBBTE9HRV9JRihpZHggPCAwLAotICAgICAgICAgICAgICAgICAgICAibGF5ZXI9JXAgaXMgbm90IGluIHRoZSBwdXJnYXRvcnkgbGlzdCIsIGwuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dFX0lGKGVycjwwICYmIGVyciAhPSBOQU1FX05PVF9GT1VORCwKLSAgICAgICAgICAgICAgICAiZXJyb3IgcmVtb3ZpbmcgbGF5ZXI9JXAgKCVzKSIsIGwuZ2V0KCksIHN0cmVycm9yKC1lcnIpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotdWludDMyX3QgU3VyZmFjZUZsaW5nZXI6OnNldENsaWVudFN0YXRlTG9ja2VkKAotICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIGNvbnN0IGxheWVyX3N0YXRlX3QmIHMpCi17Ci0gICAgdWludDMyX3QgZmxhZ3MgPSAwOwotICAgIHNwPExheWVyQmFzZUNsaWVudD4gbGF5ZXIoY2xpZW50LT5nZXRMYXllclVzZXIocy5zdXJmYWNlKSk7Ci0gICAgaWYgKGxheWVyICE9IDApIHsKLSAgICAgICAgY29uc3QgdWludDMyX3Qgd2hhdCA9IHMud2hhdDsKLSAgICAgICAgaWYgKHdoYXQgJiBlUG9zaXRpb25DaGFuZ2VkKSB7Ci0gICAgICAgICAgICBpZiAobGF5ZXItPnNldFBvc2l0aW9uKHMueCwgcy55KSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBlVHJhdmVyc2FsTmVlZGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3aGF0ICYgZUxheWVyQ2hhbmdlZCkgewotICAgICAgICAgICAgc3NpemVfdCBpZHggPSBtQ3VycmVudFN0YXRlLmxheWVyc1NvcnRlZEJ5Wi5pbmRleE9mKGxheWVyKTsKLSAgICAgICAgICAgIGlmIChsYXllci0+c2V0TGF5ZXIocy56KSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUubGF5ZXJzU29ydGVkQnlaLnJlbW92ZUF0KGlkeCk7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZS5sYXllcnNTb3J0ZWRCeVouYWRkKGxheWVyKTsKLSAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRyYXZlcnNhbCAoc3RhdGUgY2hhbmdlZCkKLSAgICAgICAgICAgICAgICAvLyBBTkQgdHJhbnNhY3Rpb24gKGxpc3QgY2hhbmdlZCkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBlVHJhbnNhY3Rpb25OZWVkZWR8ZVRyYXZlcnNhbE5lZWRlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAod2hhdCAmIGVTaXplQ2hhbmdlZCkgewotICAgICAgICAgICAgaWYgKGxheWVyLT5zZXRTaXplKHMudywgcy5oKSkgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IGVUcmF2ZXJzYWxOZWVkZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdoYXQgJiBlQWxwaGFDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBpZiAobGF5ZXItPnNldEFscGhhKHVpbnQ4X3QoMjU1LjBmKnMuYWxwaGErMC41ZikpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IGVUcmF2ZXJzYWxOZWVkZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdoYXQgJiBlTWF0cml4Q2hhbmdlZCkgewotICAgICAgICAgICAgaWYgKGxheWVyLT5zZXRNYXRyaXgocy5tYXRyaXgpKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IGVUcmF2ZXJzYWxOZWVkZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdoYXQgJiBlVHJhbnNwYXJlbnRSZWdpb25DaGFuZ2VkKSB7Ci0gICAgICAgICAgICBpZiAobGF5ZXItPnNldFRyYW5zcGFyZW50UmVnaW9uSGludChzLnRyYW5zcGFyZW50UmVnaW9uKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBlVHJhdmVyc2FsTmVlZGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3aGF0ICYgZVZpc2liaWxpdHlDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBpZiAobGF5ZXItPnNldEZsYWdzKHMuZmxhZ3MsIHMubWFzaykpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gZVRyYXZlcnNhbE5lZWRlZDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmxhZ3M7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OnNjcmVlblJlbGVhc2VkKGludCBkcHkpCi17Ci0gICAgLy8gdGhpcyBtYXkgYmUgY2FsbGVkIGJ5IGEgc2lnbmFsIGhhbmRsZXIsIHdlIGNhbid0IGRvIHRvbyBtdWNoIGluIGhlcmUKLSAgICBhbmRyb2lkX2F0b21pY19vcihlQ29uc29sZVJlbGVhc2VkLCAmbUNvbnNvbGVTaWduYWxzKTsKLSAgICBzaWduYWxUcmFuc2FjdGlvbigpOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpzY3JlZW5BY3F1aXJlZChpbnQgZHB5KQotewotICAgIC8vIHRoaXMgbWF5IGJlIGNhbGxlZCBieSBhIHNpZ25hbCBoYW5kbGVyLCB3ZSBjYW4ndCBkbyB0b28gbXVjaCBpbiBoZXJlCi0gICAgYW5kcm9pZF9hdG9taWNfb3IoZUNvbnNvbGVBY3F1aXJlZCwgJm1Db25zb2xlU2lnbmFscyk7Ci0gICAgc2lnbmFsVHJhbnNhY3Rpb24oKTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gNDA5NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQZXJtaXNzaW9uIERlbmlhbDogIgotICAgICAgICAgICAgICAgICJjYW4ndCBkdW1wIFN1cmZhY2VGbGluZ2VyIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCi0gICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBUcnkgdG8gZ2V0IHRoZSBtYWluIGxvY2ssIGJ1dCBkb24ndCBpbnNpc3QgaWYgd2UgY2FuJ3QKLSAgICAgICAgLy8gKHRoaXMgd291bGQgaW5kaWNhdGUgU0YgaXMgc3R1Y2ssIGJ1dCB3ZSB3YW50IHRvIGJlIGFibGUgdG8KLSAgICAgICAgLy8gcHJpbnQgc29tZXRoaW5nIGluIGR1bXBzeXMpLgotICAgICAgICBpbnQgcmV0cnkgPSAzOwotICAgICAgICB3aGlsZSAobVN0YXRlTG9jay50cnlMb2NrKCk8MCAmJiAtLXJldHJ5Pj0wKSB7Ci0gICAgICAgICAgICB1c2xlZXAoMTAwMDAwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgYm9vbCBsb2NrZWQocmV0cnkgPj0gMCk7Ci0gICAgICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAgICAgICAgICJTdXJmYWNlRmxpbmdlciBhcHBlYXJzIHRvIGJlIHVucmVzcG9uc2l2ZSwgIgotICAgICAgICAgICAgICAgICAgICAiZHVtcGluZyBhbnl3YXlzIChubyBsb2NrcyBoZWxkKVxuIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGR1bXBBbGwgPSB0cnVlOwotICAgICAgICBzaXplX3QgaW5kZXggPSAwOwotICAgICAgICBzaXplX3QgbnVtQXJncyA9IGFyZ3Muc2l6ZSgpOwotICAgICAgICBpZiAobnVtQXJncykgewotICAgICAgICAgICAgZHVtcEFsbCA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoKGluZGV4IDwgbnVtQXJncykgJiYKLSAgICAgICAgICAgICAgICAgICAgKGFyZ3NbaW5kZXhdID09IFN0cmluZzE2KCItLWxpc3QiKSkpIHsKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgIGxpc3RMYXllcnNMb2NrZWQoYXJncywgaW5kZXgsIHJlc3VsdCwgYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChpbmRleCA8IG51bUFyZ3MpICYmCi0gICAgICAgICAgICAgICAgICAgIChhcmdzW2luZGV4XSA9PSBTdHJpbmcxNigiLS1sYXRlbmN5IikpKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBkdW1wU3RhdHNMb2NrZWQoYXJncywgaW5kZXgsIHJlc3VsdCwgYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChpbmRleCA8IG51bUFyZ3MpICYmCi0gICAgICAgICAgICAgICAgICAgIChhcmdzW2luZGV4XSA9PSBTdHJpbmcxNigiLS1sYXRlbmN5LWNsZWFyIikpKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBjbGVhclN0YXRzTG9ja2VkKGFyZ3MsIGluZGV4LCByZXN1bHQsIGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZHVtcEFsbCkgewotICAgICAgICAgICAgZHVtcEFsbExvY2tlZChyZXN1bHQsIGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9ja2VkKSB7Ci0gICAgICAgICAgICBtU3RhdGVMb2NrLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6bGlzdExheWVyc0xvY2tlZChjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBzaXplX3QmIGluZGV4LAotICAgICAgICBTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0Ci17Ci0gICAgY29uc3QgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMgPSBtQ3VycmVudFN0YXRlLmxheWVyc1NvcnRlZEJ5WjsKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGN1cnJlbnRMYXllcnNbaV0pOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlc1xuIiwgbGF5ZXItPmdldE5hbWUoKS5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmR1bXBTdGF0c0xvY2tlZChjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBzaXplX3QmIGluZGV4LAotICAgICAgICBTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0Ci17Ci0gICAgU3RyaW5nOCBuYW1lOwotICAgIGlmIChpbmRleCA8IGFyZ3Muc2l6ZSgpKSB7Ci0gICAgICAgIG5hbWUgPSBTdHJpbmc4KGFyZ3NbaW5kZXhdKTsKLSAgICAgICAgaW5kZXgrKzsKLSAgICB9Ci0KLSAgICBjb25zdCBMYXllclZlY3RvciYgY3VycmVudExheWVycyA9IG1DdXJyZW50U3RhdGUubGF5ZXJzU29ydGVkQnlaOwotICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGN1cnJlbnRMYXllcnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIoY3VycmVudExheWVyc1tpXSk7Ci0gICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXNcbiIsIGxheWVyLT5nZXROYW1lKCkuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSB8fCAobmFtZSA9PSBsYXllci0+Z2V0TmFtZSgpKSkgewotICAgICAgICAgICAgbGF5ZXItPmR1bXBTdGF0cyhyZXN1bHQsIGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmNsZWFyU3RhdHNMb2NrZWQoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgc2l6ZV90JiBpbmRleCwKLSAgICAgICAgU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdAotewotICAgIFN0cmluZzggbmFtZTsKLSAgICBpZiAoaW5kZXggPCBhcmdzLnNpemUoKSkgewotICAgICAgICBuYW1lID0gU3RyaW5nOChhcmdzW2luZGV4XSk7Ci0gICAgICAgIGluZGV4Kys7Ci0gICAgfQotCi0gICAgY29uc3QgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMgPSBtQ3VycmVudFN0YXRlLmxheWVyc1NvcnRlZEJ5WjsKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGN1cnJlbnRMYXllcnNbaV0pOwotICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkgfHwgKG5hbWUgPT0gbGF5ZXItPmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIGxheWVyLT5jbGVhclN0YXRzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmR1bXBBbGxMb2NrZWQoCi0gICAgICAgIFN0cmluZzgmIHJlc3VsdCwgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3QKLXsKLSAgICAvLyBmaWd1cmUgb3V0IGlmIHdlJ3JlIHN0dWNrIHNvbWV3aGVyZQotICAgIGNvbnN0IG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgIGNvbnN0IG5zZWNzX3QgaW5Td2FwQnVmZmVycyhtRGVidWdJblN3YXBCdWZmZXJzKTsKLSAgICBjb25zdCBuc2Vjc190IGluVHJhbnNhY3Rpb24obURlYnVnSW5UcmFuc2FjdGlvbik7Ci0gICAgbnNlY3NfdCBpblN3YXBCdWZmZXJzRHVyYXRpb24gPSAoaW5Td2FwQnVmZmVycykgPyBub3ctaW5Td2FwQnVmZmVycyA6IDA7Ci0gICAgbnNlY3NfdCBpblRyYW5zYWN0aW9uRHVyYXRpb24gPSAoaW5UcmFuc2FjdGlvbikgPyBub3ctaW5UcmFuc2FjdGlvbiA6IDA7Ci0KLSAgICAvKgotICAgICAqIER1bXAgdGhlIHZpc2libGUgbGF5ZXIgbGlzdAotICAgICAqLwotICAgIGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzID0gbUN1cnJlbnRTdGF0ZS5sYXllcnNTb3J0ZWRCeVo7Ci0gICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gY3VycmVudExheWVycy5zaXplKCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVmlzaWJsZSBsYXllcnMgKGNvdW50ID0gJWQpXG4iLCBjb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIoY3VycmVudExheWVyc1tpXSk7Ci0gICAgICAgIGxheWVyLT5kdW1wKHJlc3VsdCwgYnVmZmVyLCBTSVpFKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIER1bXAgdGhlIGxheWVycyBpbiB0aGUgcHVyZ2F0b3J5Ci0gICAgICovCi0KLSAgICBjb25zdCBzaXplX3QgcHVyZ2F0b3J5U2l6ZSA9IG1MYXllclB1cmdhdG9yeS5zaXplKCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUHVyZ2F0b3J5IHN0YXRlICglZCBlbnRyaWVzKVxuIiwgcHVyZ2F0b3J5U2l6ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8cHVyZ2F0b3J5U2l6ZSA7IGkrKykgewotICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihtTGF5ZXJQdXJnYXRvcnkuaXRlbUF0KGkpKTsKLSAgICAgICAgbGF5ZXItPnNob3J0RHVtcChyZXN1bHQsIGJ1ZmZlciwgU0laRSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEdW1wIFN1cmZhY2VGbGluZ2VyIGdsb2JhbCBzdGF0ZQotICAgICAqLwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiU3VyZmFjZUZsaW5nZXIgZ2xvYmFsIHN0YXRlOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgY29uc3QgR0xFeHRlbnNpb25zJiBleHRlbnNpb25zKEdMRXh0ZW5zaW9uczo6Z2V0SW5zdGFuY2UoKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiR0xFUzogJXMsICVzLCAlc1xuIiwKLSAgICAgICAgICAgIGV4dGVuc2lvbnMuZ2V0VmVuZG9yKCksCi0gICAgICAgICAgICBleHRlbnNpb25zLmdldFJlbmRlcmVyKCksCi0gICAgICAgICAgICBleHRlbnNpb25zLmdldFZlcnNpb24oKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRUdMIDogJXNcbiIsCi0gICAgICAgICAgICBlZ2xRdWVyeVN0cmluZyhncmFwaGljUGxhbmUoMCkuZ2V0RUdMRGlzcGxheSgpLAotICAgICAgICAgICAgICAgICAgICBFR0xfVkVSU0lPTl9IV19BTkRST0lEKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRVhUUzogJXNcbiIsIGV4dGVuc2lvbnMuZ2V0RXh0ZW5zaW9uKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIG1Xb3JtaG9sZVJlZ2lvbi5kdW1wKHJlc3VsdCwgIldvcm1ob2xlUmVnaW9uIik7Ci0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICIgIG9yaWVudGF0aW9uPSVkLCBjYW5EcmF3PSVkXG4iLAotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZS5vcmllbnRhdGlvbiwgaHcuY2FuRHJhdygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgIiAgbGFzdCBlZ2xTd2FwQnVmZmVycygpIHRpbWU6ICVmIHVzXG4iCi0gICAgICAgICAgICAiICBsYXN0IHRyYW5zYWN0aW9uIHRpbWUgICAgIDogJWYgdXNcbiIKLSAgICAgICAgICAgICIgIHRyYW5zYWN0aW9uLWZsYWdzICAgICAgICAgOiAlMDh4XG4iCi0gICAgICAgICAgICAiICByZWZyZXNoLXJhdGUgICAgICAgICAgICAgIDogJWYgZnBzXG4iCi0gICAgICAgICAgICAiICB4LWRwaSAgICAgICAgICAgICAgICAgICAgIDogJWZcbiIKLSAgICAgICAgICAgICIgIHktZHBpICAgICAgICAgICAgICAgICAgICAgOiAlZlxuIiwKLSAgICAgICAgICAgIG1MYXN0U3dhcEJ1ZmZlclRpbWUvMTAwMC4wLAotICAgICAgICAgICAgbUxhc3RUcmFuc2FjdGlvblRpbWUvMTAwMC4wLAotICAgICAgICAgICAgbVRyYW5zYWN0aW9uRmxhZ3MsCi0gICAgICAgICAgICBody5nZXRSZWZyZXNoUmF0ZSgpLAotICAgICAgICAgICAgaHcuZ2V0RHBpWCgpLAotICAgICAgICAgICAgaHcuZ2V0RHBpWSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIGVnbFN3YXBCdWZmZXJzIHRpbWU6ICVmIHVzXG4iLAotICAgICAgICAgICAgaW5Td2FwQnVmZmVyc0R1cmF0aW9uLzEwMDAuMCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICB0cmFuc2FjdGlvbiB0aW1lOiAlZiB1c1xuIiwKLSAgICAgICAgICAgIGluVHJhbnNhY3Rpb25EdXJhdGlvbi8xMDAwLjApOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIC8qCi0gICAgICogVlNZTkMgc3RhdGUKLSAgICAgKi8KLSAgICBtRXZlbnRUaHJlYWQtPmR1bXAocmVzdWx0LCBidWZmZXIsIFNJWkUpOwotCi0gICAgLyoKLSAgICAgKiBEdW1wIEhXQ29tcG9zZXIgc3RhdGUKLSAgICAgKi8KLSAgICBIV0NvbXBvc2VyJiBod2MoaHcuZ2V0SHdDb21wb3NlcigpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJoL3cgY29tcG9zZXIgc3RhdGU6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBoL3cgY29tcG9zZXIgJXMgYW5kICVzXG4iLAotICAgICAgICAgICAgaHdjLmluaXRDaGVjaygpPT1OT19FUlJPUiA/ICJwcmVzZW50IiA6ICJub3QgcHJlc2VudCIsCi0gICAgICAgICAgICAgICAgICAgIChtRGVidWdEaXNhYmxlSFdDIHx8IG1EZWJ1Z1JlZ2lvbikgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgaHdjLmR1bXAocmVzdWx0LCBidWZmZXIsIFNJWkUsIG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaKTsKLQotICAgIC8qCi0gICAgICogRHVtcCBncmFsbG9jIHN0YXRlCi0gICAgICovCi0gICAgY29uc3QgR3JhcGhpY0J1ZmZlckFsbG9jYXRvciYgYWxsb2MoR3JhcGhpY0J1ZmZlckFsbG9jYXRvcjo6Z2V0KCkpOwotICAgIGFsbG9jLmR1bXAocmVzdWx0KTsKLSAgICBody5kdW1wKHJlc3VsdCk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgQ1JFQVRFX0NPTk5FQ1RJT046Ci0gICAgICAgIGNhc2UgU0VUX1RSQU5TQUNUSU9OX1NUQVRFOgotICAgICAgICBjYXNlIFNFVF9PUklFTlRBVElPTjoKLSAgICAgICAgY2FzZSBCT09UX0ZJTklTSEVEOgotICAgICAgICBjYXNlIFRVUk5fRUxFQ1RST05fQkVBTV9PRkY6Ci0gICAgICAgIGNhc2UgVFVSTl9FTEVDVFJPTl9CRUFNX09OOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjb2RlcyB0aGF0IHJlcXVpcmUgcGVybWlzc2lvbiBjaGVjawotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICBpZiAoKHVpZCAhPSBBSURfR1JBUEhJQ1MpICYmCi0gICAgICAgICAgICAgICAgICAgICFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQWNjZXNzU3VyZmFjZUZsaW5nZXIsIHBpZCwgdWlkKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogIgotICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGFjY2VzcyBTdXJmYWNlRmxpbmdlciBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENBUFRVUkVfU0NSRUVOOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjb2RlcyB0aGF0IHJlcXVpcmUgcGVybWlzc2lvbiBjaGVjawotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICBpZiAoKHVpZCAhPSBBSURfR1JBUEhJQ1MpICYmCi0gICAgICAgICAgICAgICAgICAgICFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzUmVhZEZyYW1lYnVmZmVyLCBwaWQsIHVpZCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCByZWFkIGZyYW1lYnVmZmVyIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gQm5TdXJmYWNlQ29tcG9zZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICBpZiAoZXJyID09IFVOS05PV05fVFJBTlNBQ1RJT04gfHwgZXJyID09IFBFUk1JU1NJT05fREVOSUVEKSB7Ci0gICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZUNvbXBvc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgIGlmIChDQ19VTkxJS0VMWSghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNIYXJkd2FyZVRlc3QpKSkgewotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKLSAgICAgICAgICAgICAgICAgICAgImNhbid0IGFjY2VzcyBTdXJmYWNlRmxpbmdlciBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgfQotICAgICAgICBpbnQgbjsKLSAgICAgICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIDEwMDA6IC8vIFNIT1dfQ1BVLCBOT1QgU1VQUE9SVEVEIEFOWU1PUkUKLSAgICAgICAgICAgIGNhc2UgMTAwMTogLy8gU0hPV19GUFMsIE5PVCBTVVBQT1JURUQgQU5ZTU9SRQotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgMTAwMjogIC8vIFNIT1dfVVBEQVRFUwotICAgICAgICAgICAgICAgIG4gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIG1EZWJ1Z1JlZ2lvbiA9IG4gPyBuIDogKG1EZWJ1Z1JlZ2lvbiA/IDAgOiAxKTsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlSHdjR2VvbWV0cnkoKTsKLSAgICAgICAgICAgICAgICByZXBhaW50RXZlcnl0aGluZygpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgMTAwMzogIC8vIFNIT1dfQkFDS0dST1VORAotICAgICAgICAgICAgICAgIG4gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIG1EZWJ1Z0JhY2tncm91bmQgPSBuID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgY2FzZSAxMDA0OnsgLy8gcmVwYWludCBldmVyeXRoaW5nCi0gICAgICAgICAgICAgICAgcmVwYWludEV2ZXJ5dGhpbmcoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDEwMDU6eyAvLyBmb3JjZSB0cmFuc2FjdGlvbgotICAgICAgICAgICAgICAgIHNldFRyYW5zYWN0aW9uRmxhZ3MoZVRyYW5zYWN0aW9uTmVlZGVkfGVUcmF2ZXJzYWxOZWVkZWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMTAwNjp7IC8vIHNlbmQgZW1wdHkgdXBkYXRlCi0gICAgICAgICAgICAgICAgc2lnbmFsUmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMTAwODogIC8vIHRvZ2dsZSB1c2Ugb2YgaHcgY29tcG9zZXIKLSAgICAgICAgICAgICAgICBuID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBtRGVidWdEaXNhYmxlSFdDID0gbiA/IDEgOiAwOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGVId2NHZW9tZXRyeSgpOwotICAgICAgICAgICAgICAgIHJlcGFpbnRFdmVyeXRoaW5nKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgY2FzZSAxMDA5OiAgLy8gdG9nZ2xlIHVzZSBvZiB0cmFuc2Zvcm0gaGludAotICAgICAgICAgICAgICAgIG4gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIG1EZWJ1Z0Rpc2FibGVUcmFuc2Zvcm1IaW50ID0gbiA/IDEgOiAwOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGVId2NHZW9tZXRyeSgpOwotICAgICAgICAgICAgICAgIHJlcGFpbnRFdmVyeXRoaW5nKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgY2FzZSAxMDEwOiAgLy8gaW50ZXJyb2dhdGUuCi0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobURlYnVnUmVnaW9uKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihtRGVidWdCYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihtRGVidWdEaXNhYmxlSFdDKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICBjYXNlIDEwMTM6IHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN0YXRlTG9jayk7Ci0gICAgICAgICAgICAgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGh3LmdldFBhZ2VGbGlwQ291bnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6cmVwYWludEV2ZXJ5dGhpbmcoKSB7Ci0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIGNvbnN0IFJlY3QgYm91bmRzKGh3LmdldEJvdW5kcygpKTsKLSAgICBzZXRJbnZhbGlkYXRlUmVnaW9uKFJlZ2lvbihib3VuZHMpKTsKLSAgICBzaWduYWxUcmFuc2FjdGlvbigpOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpzZXRJbnZhbGlkYXRlUmVnaW9uKGNvbnN0IFJlZ2lvbiYgcmVnKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1JbnZhbGlkYXRlTG9jayk7Ci0gICAgbUludmFsaWRhdGVSZWdpb24gPSByZWc7Ci19Ci0KLVJlZ2lvbiBTdXJmYWNlRmxpbmdlcjo6Z2V0QW5kQ2xlYXJJbnZhbGlkYXRlUmVnaW9uKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtSW52YWxpZGF0ZUxvY2spOwotICAgIFJlZ2lvbiByZWcobUludmFsaWRhdGVSZWdpb24pOwotICAgIG1JbnZhbGlkYXRlUmVnaW9uLmNsZWFyKCk7Ci0gICAgcmV0dXJuIHJlZzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpyZW5kZXJTY3JlZW5Ub1RleHR1cmUoRGlzcGxheUlEIGRweSwKLSAgICAgICAgR0x1aW50KiB0ZXh0dXJlTmFtZSwgR0xmbG9hdCogdU91dCwgR0xmbG9hdCogdk91dCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN0YXRlTG9jayk7Ci0gICAgcmV0dXJuIHJlbmRlclNjcmVlblRvVGV4dHVyZUxvY2tlZChkcHksIHRleHR1cmVOYW1lLCB1T3V0LCB2T3V0KTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OnJlbmRlclNjcmVlblRvVGV4dHVyZUxvY2tlZChEaXNwbGF5SUQgZHB5LAotICAgICAgICBHTHVpbnQqIHRleHR1cmVOYW1lLCBHTGZsb2F0KiB1T3V0LCBHTGZsb2F0KiB2T3V0KQotewotICAgIGlmICghR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpLmhhdmVGcmFtZWJ1ZmZlck9iamVjdCgpKQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0KLSAgICAvLyBnZXQgc2NyZWVuIGdlb21ldHJ5Ci0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoZHB5KS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgY29uc3QgdWludDMyX3QgaHdfdyA9IGh3LmdldFdpZHRoKCk7Ci0gICAgY29uc3QgdWludDMyX3QgaHdfaCA9IGh3LmdldEhlaWdodCgpOwotICAgIEdMZmxvYXQgdSA9IDE7Ci0gICAgR0xmbG9hdCB2ID0gMTsKLQotICAgIC8vIG1ha2Ugc3VyZSB0byBjbGVhciBhbGwgR0wgZXJyb3IgZmxhZ3MKLSAgICB3aGlsZSAoIGdsR2V0RXJyb3IoKSAhPSBHTF9OT19FUlJPUiApIDsKLQotICAgIC8vIGNyZWF0ZSBhIEZCTwotICAgIEdMdWludCBuYW1lLCB0bmFtZTsKLSAgICBnbEdlblRleHR1cmVzKDEsICZ0bmFtZSk7Ci0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0bmFtZSk7Ci0gICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKLSAgICAgICAgICAgIGh3X3csIGh3X2gsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfQllURSwgMCk7Ci0gICAgaWYgKGdsR2V0RXJyb3IoKSAhPSBHTF9OT19FUlJPUikgewotICAgICAgICB3aGlsZSAoIGdsR2V0RXJyb3IoKSAhPSBHTF9OT19FUlJPUiApIDsKLSAgICAgICAgR0xpbnQgdHcgPSAoMiA8PCAoMzEgLSBjbHooaHdfdykpKTsKLSAgICAgICAgR0xpbnQgdGggPSAoMiA8PCAoMzEgLSBjbHooaHdfaCkpKTsKLSAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKLSAgICAgICAgICAgICAgICB0dywgdGgsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfQllURSwgMCk7Ci0gICAgICAgIHUgPSBHTGZsb2F0KGh3X3cpIC8gdHc7Ci0gICAgICAgIHYgPSBHTGZsb2F0KGh3X2gpIC8gdGg7Ci0gICAgfQotICAgIGdsR2VuRnJhbWVidWZmZXJzT0VTKDEsICZuYW1lKTsKLSAgICBnbEJpbmRGcmFtZWJ1ZmZlck9FUyhHTF9GUkFNRUJVRkZFUl9PRVMsIG5hbWUpOwotICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMoR0xfRlJBTUVCVUZGRVJfT0VTLAotICAgICAgICAgICAgR0xfQ09MT1JfQVRUQUNITUVOVDBfT0VTLCBHTF9URVhUVVJFXzJELCB0bmFtZSwgMCk7Ci0KLSAgICAvLyByZWRyYXcgdGhlIHNjcmVlbiBlbnRpcmVseS4uLgotICAgIGdsRGlzYWJsZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUyk7Ci0gICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGdsQ2xlYXJDb2xvcigwLDAsMCwxKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0gICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBjb25zdCBWZWN0b3I8IHNwPExheWVyQmFzZT4gPiYgbGF5ZXJzKG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaKTsKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBsYXllcnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyArK2kpIHsKLSAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIobGF5ZXJzW2ldKTsKLSAgICAgICAgbGF5ZXItPmRyYXdGb3JTcmVlblNob3QoKTsKLSAgICB9Ci0KLSAgICBody5jb21wb3NpdGlvbkNvbXBsZXRlKCk7Ci0KLSAgICAvLyBiYWNrIHRvIG1haW4gZnJhbWVidWZmZXIKLSAgICBnbEJpbmRGcmFtZWJ1ZmZlck9FUyhHTF9GUkFNRUJVRkZFUl9PRVMsIDApOwotICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTKDEsICZuYW1lKTsKLQotICAgICp0ZXh0dXJlTmFtZSA9IHRuYW1lOwotICAgICp1T3V0ID0gdTsKLSAgICAqdk91dCA9IHY7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OmVsZWN0cm9uQmVhbU9mZkFuaW1hdGlvbkltcGxMb2NrZWQoKQotewotICAgIC8vIGdldCBzY3JlZW4gZ2VvbWV0cnkKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgY29uc3QgdWludDMyX3QgaHdfdyA9IGh3LmdldFdpZHRoKCk7Ci0gICAgY29uc3QgdWludDMyX3QgaHdfaCA9IGh3LmdldEhlaWdodCgpOwotICAgIGNvbnN0IFJlZ2lvbiBzY3JlZW5Cb3VuZHMoaHcuZ2V0Qm91bmRzKCkpOwotCi0gICAgR0xmbG9hdCB1LCB2OwotICAgIEdMdWludCB0bmFtZTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSByZW5kZXJTY3JlZW5Ub1RleHR1cmVMb2NrZWQoMCwgJnRuYW1lLCAmdSwgJnYpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBHTGZsb2F0IHZ0eFs4XTsKLSAgICBjb25zdCBHTGZsb2F0IHRleENvb3Jkc1s0XVsyXSA9IHsgezAsMH0sIHswLHZ9LCB7dSx2fSwge3UsMH0gfTsKLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRuYW1lKTsKLSAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIHRleENvb3Jkcyk7Ci0gICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICBnbFZlcnRleFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIHZ0eCk7Ci0KLSAgICAvKgotICAgICAqIFRleHR1cmUgY29vcmRpbmF0ZSBtYXBwaW5nCi0gICAgICoKLSAgICAgKiAgICAgICAgICAgICAgICAgdQotICAgICAqICAgIDEgKy0tLS0tLS0tLS0rLS0tKwotICAgICAqICAgICAgfCAgICAgfCAgICB8ICAgfCAgaW1hZ2UgaXMgaW52ZXJ0ZWQKLSAgICAgKiAgICAgIHwgICAgIFYgICAgfCAgIHwgIHcuci50LiB0aGUgdGV4dHVyZQotICAgICAqICAxLXYgKy0tLS0tLS0tLS0rICAgfCAgY29vcmRpbmF0ZXMKLSAgICAgKiAgICAgIHwgICAgICAgICAgICAgIHwKLSAgICAgKiAgICAgIHwgICAgICAgICAgICAgIHwKLSAgICAgKiAgICAgIHwgICAgICAgICAgICAgIHwKLSAgICAgKiAgICAwICstLS0tLS0tLS0tLS0tLSsKLSAgICAgKiAgICAgIDAgICAgICAgICAgICAgIDEKLSAgICAgKgotICAgICAqLwotCi0gICAgY2xhc3Mgc19jdXJ2ZV9pbnRlcnBvbGF0b3IgewotICAgICAgICBjb25zdCBmbG9hdCBuYkZyYW1lcywgcywgdjsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHNfY3VydmVfaW50ZXJwb2xhdG9yKGludCBuYkZyYW1lcywgZmxvYXQgcykKLSAgICAgICAgOiBuYkZyYW1lcygxLjBmIC8gKG5iRnJhbWVzLTEpKSwgcyhzKSwKLSAgICAgICAgICB2KDEuMGYgKyBleHBmKC1zICsgMC41ZipzKSkgewotICAgICAgICB9Ci0gICAgICAgIGZsb2F0IG9wZXJhdG9yKCkoaW50IGYpIHsKLSAgICAgICAgICAgIGNvbnN0IGZsb2F0IHggPSBmICogbmJGcmFtZXM7Ci0gICAgICAgICAgICByZXR1cm4gKCgxLjBmLygxLjBmICsgZXhwZigteCpzICsgMC41ZipzKSkpIC0gMC41ZikgKiB2ICsgMC41ZjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBjbGFzcyB2X3N0cmV0Y2ggewotICAgICAgICBjb25zdCBHTGZsb2F0IGh3X3csIGh3X2g7Ci0gICAgcHVibGljOgotICAgICAgICB2X3N0cmV0Y2godWludDMyX3QgaHdfdywgdWludDMyX3QgaHdfaCkKLSAgICAgICAgOiBod193KGh3X3cpLCBod19oKGh3X2gpIHsKLSAgICAgICAgfQotICAgICAgICB2b2lkIG9wZXJhdG9yKCkoR0xmbG9hdCogdnR4LCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICBjb25zdCBHTGZsb2F0IHcgPSBod193ICsgKGh3X3cgKiB2KTsKLSAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgaCA9IGh3X2ggLSAoaHdfaCAqIHYpOwotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCB4ID0gKGh3X3cgLSB3KSAqIDAuNWY7Ci0gICAgICAgICAgICBjb25zdCBHTGZsb2F0IHkgPSAoaHdfaCAtIGgpICogMC41ZjsKLSAgICAgICAgICAgIHZ0eFswXSA9IHg7ICAgICAgICAgdnR4WzFdID0geTsKLSAgICAgICAgICAgIHZ0eFsyXSA9IHg7ICAgICAgICAgdnR4WzNdID0geSArIGg7Ci0gICAgICAgICAgICB2dHhbNF0gPSB4ICsgdzsgICAgIHZ0eFs1XSA9IHkgKyBoOwotICAgICAgICAgICAgdnR4WzZdID0geCArIHc7ICAgICB2dHhbN10gPSB5OwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIGNsYXNzIGhfc3RyZXRjaCB7Ci0gICAgICAgIGNvbnN0IEdMZmxvYXQgaHdfdywgaHdfaDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGhfc3RyZXRjaCh1aW50MzJfdCBod193LCB1aW50MzJfdCBod19oKQotICAgICAgICA6IGh3X3coaHdfdyksIGh3X2goaHdfaCkgewotICAgICAgICB9Ci0gICAgICAgIHZvaWQgb3BlcmF0b3IoKShHTGZsb2F0KiB2dHgsIGZsb2F0IHYpIHsKLSAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgdyA9IGh3X3cgLSAoaHdfdyAqIHYpOwotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCBoID0gMS4wZjsKLSAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgeCA9IChod193IC0gdykgKiAwLjVmOwotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCB5ID0gKGh3X2ggLSBoKSAqIDAuNWY7Ci0gICAgICAgICAgICB2dHhbMF0gPSB4OyAgICAgICAgIHZ0eFsxXSA9IHk7Ci0gICAgICAgICAgICB2dHhbMl0gPSB4OyAgICAgICAgIHZ0eFszXSA9IHkgKyBoOwotICAgICAgICAgICAgdnR4WzRdID0geCArIHc7ICAgICB2dHhbNV0gPSB5ICsgaDsKLSAgICAgICAgICAgIHZ0eFs2XSA9IHggKyB3OyAgICAgdnR4WzddID0geTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvLyB0aGUgZnVsbCBhbmltYXRpb24gaXMgMjQgZnJhbWVzCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgiZGVidWcuc2YuZWxlY3Ryb25fZnJhbWVzIiwgdmFsdWUsICIyNCIpOwotICAgIGludCBuYkZyYW1lcyA9IChhdG9pKHZhbHVlKSArIDEpID4+IDE7Ci0gICAgaWYgKG5iRnJhbWVzIDw9IDApIC8vIGp1c3QgaW4gY2FzZQotICAgICAgICBuYkZyYW1lcyA9IDI0OwotCi0gICAgc19jdXJ2ZV9pbnRlcnBvbGF0b3IgaXRyKG5iRnJhbWVzLCA3LjVmKTsKLSAgICBzX2N1cnZlX2ludGVycG9sYXRvciBpdGcobmJGcmFtZXMsIDguMGYpOwotICAgIHNfY3VydmVfaW50ZXJwb2xhdG9yIGl0YihuYkZyYW1lcywgOC41Zik7Ci0KLSAgICB2X3N0cmV0Y2ggdnZlcnRzKGh3X3csIGh3X2gpOwotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX1RFWFRVUkUpOwotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0gICAgZ2xMb2FkSWRlbnRpdHkoKTsKLQotICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORSk7Ci0gICAgZm9yIChpbnQgaT0wIDsgaTxuYkZyYW1lcyA7IGkrKykgewotICAgICAgICBmbG9hdCB4LCB5LCB3LCBoOwotICAgICAgICBjb25zdCBmbG9hdCB2ciA9IGl0cihpKTsKLSAgICAgICAgY29uc3QgZmxvYXQgdmcgPSBpdGcoaSk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHZiID0gaXRiKGkpOwotCi0gICAgICAgIC8vIGNsZWFyIHNjcmVlbgotICAgICAgICBnbENvbG9yTWFzaygxLDEsMSwxKTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0KLSAgICAgICAgLy8gZHJhdyB0aGUgcmVkIHBsYW5lCi0gICAgICAgIHZ2ZXJ0cyh2dHgsIHZyKTsKLSAgICAgICAgZ2xDb2xvck1hc2soMSwwLDAsMSk7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotCi0gICAgICAgIC8vIGRyYXcgdGhlIGdyZWVuIHBsYW5lCi0gICAgICAgIHZ2ZXJ0cyh2dHgsIHZnKTsKLSAgICAgICAgZ2xDb2xvck1hc2soMCwxLDAsMSk7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotCi0gICAgICAgIC8vIGRyYXcgdGhlIGJsdWUgcGxhbmUKLSAgICAgICAgdnZlcnRzKHZ0eCwgdmIpOwotICAgICAgICBnbENvbG9yTWFzaygwLDAsMSwxKTsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci0KLSAgICAgICAgLy8gZHJhdyB0aGUgd2hpdGUgaGlnaGxpZ2h0ICh3ZSB1c2UgdGhlIGxhc3QgdmVydGljZXMpCi0gICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICAgICAgZ2xDb2xvck1hc2soMSwxLDEsMSk7Ci0gICAgICAgIGdsQ29sb3I0Zih2ZywgdmcsIHZnLCAxKTsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci0gICAgICAgIGh3LmZsaXAoc2NyZWVuQm91bmRzKTsKLSAgICB9Ci0KLSAgICBoX3N0cmV0Y2ggaHZlcnRzKGh3X3csIGh3X2gpOwotICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgIGdsQ29sb3JNYXNrKDEsMSwxLDEpOwotICAgIGZvciAoaW50IGk9MCA7IGk8bmJGcmFtZXMgOyBpKyspIHsKLSAgICAgICAgY29uc3QgZmxvYXQgdiA9IGl0ZyhpKTsKLSAgICAgICAgaHZlcnRzKHZ0eCwgdik7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgIGdsQ29sb3I0ZigxLXYsIDEtdiwgMS12LCAxKTsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci0gICAgICAgIGh3LmZsaXAoc2NyZWVuQm91bmRzKTsKLSAgICB9Ci0KLSAgICBnbENvbG9yTWFzaygxLDEsMSwxKTsKLSAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRuYW1lKTsKLSAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjplbGVjdHJvbkJlYW1PbkFuaW1hdGlvbkltcGxMb2NrZWQoKQotewotICAgIHN0YXR1c190IHJlc3VsdCA9IFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgaWYgKCFHTEV4dGVuc2lvbnM6OmdldEluc3RhbmNlKCkuaGF2ZUZyYW1lYnVmZmVyT2JqZWN0KCkpCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLQotCi0gICAgLy8gZ2V0IHNjcmVlbiBnZW9tZXRyeQotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBjb25zdCB1aW50MzJfdCBod193ID0gaHcuZ2V0V2lkdGgoKTsKLSAgICBjb25zdCB1aW50MzJfdCBod19oID0gaHcuZ2V0SGVpZ2h0KCk7Ci0gICAgY29uc3QgUmVnaW9uIHNjcmVlbkJvdW5kcyhody5ib3VuZHMoKSk7Ci0KLSAgICBHTGZsb2F0IHUsIHY7Ci0gICAgR0x1aW50IHRuYW1lOwotICAgIHJlc3VsdCA9IHJlbmRlclNjcmVlblRvVGV4dHVyZUxvY2tlZCgwLCAmdG5hbWUsICZ1LCAmdik7Ci0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEdMZmxvYXQgdnR4WzhdOwotICAgIGNvbnN0IEdMZmxvYXQgdGV4Q29vcmRzWzRdWzJdID0geyB7MCx2fSwgezAsMH0sIHt1LDB9LCB7dSx2fSB9OwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdG5hbWUpOwotICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfTU9EVUxBVEUpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIHRleENvb3Jkcyk7Ci0gICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICBnbFZlcnRleFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIHZ0eCk7Ci0KLSAgICBjbGFzcyBzX2N1cnZlX2ludGVycG9sYXRvciB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IG5iRnJhbWVzLCBzLCB2OwotICAgIHB1YmxpYzoKLSAgICAgICAgc19jdXJ2ZV9pbnRlcnBvbGF0b3IoaW50IG5iRnJhbWVzLCBmbG9hdCBzKQotICAgICAgICA6IG5iRnJhbWVzKDEuMGYgLyAobmJGcmFtZXMtMSkpLCBzKHMpLAotICAgICAgICAgIHYoMS4wZiArIGV4cGYoLXMgKyAwLjVmKnMpKSB7Ci0gICAgICAgIH0KLSAgICAgICAgZmxvYXQgb3BlcmF0b3IoKShpbnQgZikgewotICAgICAgICAgICAgY29uc3QgZmxvYXQgeCA9IGYgKiBuYkZyYW1lczsKLSAgICAgICAgICAgIHJldHVybiAoKDEuMGYvKDEuMGYgKyBleHBmKC14KnMgKyAwLjVmKnMpKSkgLSAwLjVmKSAqIHYgKyAwLjVmOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIGNsYXNzIHZfc3RyZXRjaCB7Ci0gICAgICAgIGNvbnN0IEdMZmxvYXQgaHdfdywgaHdfaDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHZfc3RyZXRjaCh1aW50MzJfdCBod193LCB1aW50MzJfdCBod19oKQotICAgICAgICA6IGh3X3coaHdfdyksIGh3X2goaHdfaCkgewotICAgICAgICB9Ci0gICAgICAgIHZvaWQgb3BlcmF0b3IoKShHTGZsb2F0KiB2dHgsIGZsb2F0IHYpIHsKLSAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgdyA9IGh3X3cgKyAoaHdfdyAqIHYpOwotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCBoID0gaHdfaCAtIChod19oICogdik7Ci0gICAgICAgICAgICBjb25zdCBHTGZsb2F0IHggPSAoaHdfdyAtIHcpICogMC41ZjsKLSAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgeSA9IChod19oIC0gaCkgKiAwLjVmOwotICAgICAgICAgICAgdnR4WzBdID0geDsgICAgICAgICB2dHhbMV0gPSB5OwotICAgICAgICAgICAgdnR4WzJdID0geDsgICAgICAgICB2dHhbM10gPSB5ICsgaDsKLSAgICAgICAgICAgIHZ0eFs0XSA9IHggKyB3OyAgICAgdnR4WzVdID0geSArIGg7Ci0gICAgICAgICAgICB2dHhbNl0gPSB4ICsgdzsgICAgIHZ0eFs3XSA9IHk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgY2xhc3MgaF9zdHJldGNoIHsKLSAgICAgICAgY29uc3QgR0xmbG9hdCBod193LCBod19oOwotICAgIHB1YmxpYzoKLSAgICAgICAgaF9zdHJldGNoKHVpbnQzMl90IGh3X3csIHVpbnQzMl90IGh3X2gpCi0gICAgICAgIDogaHdfdyhod193KSwgaHdfaChod19oKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBvcGVyYXRvcigpKEdMZmxvYXQqIHZ0eCwgZmxvYXQgdikgewotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCB3ID0gaHdfdyAtIChod193ICogdik7Ci0gICAgICAgICAgICBjb25zdCBHTGZsb2F0IGggPSAxLjBmOwotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCB4ID0gKGh3X3cgLSB3KSAqIDAuNWY7Ci0gICAgICAgICAgICBjb25zdCBHTGZsb2F0IHkgPSAoaHdfaCAtIGgpICogMC41ZjsKLSAgICAgICAgICAgIHZ0eFswXSA9IHg7ICAgICAgICAgdnR4WzFdID0geTsKLSAgICAgICAgICAgIHZ0eFsyXSA9IHg7ICAgICAgICAgdnR4WzNdID0geSArIGg7Ci0gICAgICAgICAgICB2dHhbNF0gPSB4ICsgdzsgICAgIHZ0eFs1XSA9IHkgKyBoOwotICAgICAgICAgICAgdnR4WzZdID0geCArIHc7ICAgICB2dHhbN10gPSB5OwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8vIHRoZSBmdWxsIGFuaW1hdGlvbiBpcyAxMiBmcmFtZXMKLSAgICBpbnQgbmJGcmFtZXMgPSA4OwotICAgIHNfY3VydmVfaW50ZXJwb2xhdG9yIGl0cihuYkZyYW1lcywgNy41Zik7Ci0gICAgc19jdXJ2ZV9pbnRlcnBvbGF0b3IgaXRnKG5iRnJhbWVzLCA4LjBmKTsKLSAgICBzX2N1cnZlX2ludGVycG9sYXRvciBpdGIobmJGcmFtZXMsIDguNWYpOwotCi0gICAgaF9zdHJldGNoIGh2ZXJ0cyhod193LCBod19oKTsKLSAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICBnbENvbG9yTWFzaygxLDEsMSwxKTsKLSAgICBmb3IgKGludCBpPW5iRnJhbWVzLTEgOyBpPj0wIDsgaS0tKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHYgPSBpdGcoaSk7Ci0gICAgICAgIGh2ZXJ0cyh2dHgsIHYpOwotICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICBnbENvbG9yNGYoMS12LCAxLXYsIDEtdiwgMSk7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotICAgICAgICBody5mbGlwKHNjcmVlbkJvdW5kcyk7Ci0gICAgfQotCi0gICAgbmJGcmFtZXMgPSA0OwotICAgIHZfc3RyZXRjaCB2dmVydHMoaHdfdywgaHdfaCk7Ci0gICAgZ2xFbmFibGUoR0xfQkxFTkQpOwotICAgIGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfT05FKTsKLSAgICBmb3IgKGludCBpPW5iRnJhbWVzLTEgOyBpPj0wIDsgaS0tKSB7Ci0gICAgICAgIGZsb2F0IHgsIHksIHcsIGg7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHZyID0gaXRyKGkpOwotICAgICAgICBjb25zdCBmbG9hdCB2ZyA9IGl0ZyhpKTsKLSAgICAgICAgY29uc3QgZmxvYXQgdmIgPSBpdGIoaSk7Ci0KLSAgICAgICAgLy8gY2xlYXIgc2NyZWVuCi0gICAgICAgIGdsQ29sb3JNYXNrKDEsMSwxLDEpOwotICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKLQotICAgICAgICAvLyBkcmF3IHRoZSByZWQgcGxhbmUKLSAgICAgICAgdnZlcnRzKHZ0eCwgdnIpOwotICAgICAgICBnbENvbG9yTWFzaygxLDAsMCwxKTsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci0KLSAgICAgICAgLy8gZHJhdyB0aGUgZ3JlZW4gcGxhbmUKLSAgICAgICAgdnZlcnRzKHZ0eCwgdmcpOwotICAgICAgICBnbENvbG9yTWFzaygwLDEsMCwxKTsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci0KLSAgICAgICAgLy8gZHJhdyB0aGUgYmx1ZSBwbGFuZQotICAgICAgICB2dmVydHModnR4LCB2Yik7Ci0gICAgICAgIGdsQ29sb3JNYXNrKDAsMCwxLDEpOwotICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLQotICAgICAgICBody5mbGlwKHNjcmVlbkJvdW5kcyk7Ci0gICAgfQotCi0gICAgZ2xDb2xvck1hc2soMSwxLDEsMSk7Ci0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0bmFtZSk7Ci0gICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6dHVybkVsZWN0cm9uQmVhbU9mZkltcGxMb2NrZWQoaW50MzJfdCBtb2RlKQotewotICAgIERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmVkaXREaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgaWYgKCFody5jYW5EcmF3KCkpIHsKLSAgICAgICAgLy8gd2UncmUgYWxyZWFkeSBvZmYKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8vIHR1cm4gb2ZmIGh3YyB3aGlsZSB3ZSdyZSBkb2luZyB0aGUgYW5pbWF0aW9uCi0gICAgaHcuZ2V0SHdDb21wb3NlcigpLmRpc2FibGUoKTsKLSAgICAvLyBhbmQgbWFrZSBzdXJlIHRvIHR1cm4gaXQgYmFjayBvbiAoaWYgbmVlZGVkKSBuZXh0IHRpbWUgd2UgY29tcG9zZQotICAgIGludmFsaWRhdGVId2NHZW9tZXRyeSgpOwotCi0gICAgaWYgKG1vZGUgJiBJU3VyZmFjZUNvbXBvc2VyOjplRWxlY3Ryb25CZWFtQW5pbWF0aW9uT2ZmKSB7Ci0gICAgICAgIGVsZWN0cm9uQmVhbU9mZkFuaW1hdGlvbkltcGxMb2NrZWQoKTsKLSAgICB9Ci0KLSAgICAvLyBhbHdheXMgY2xlYXIgdGhlIHdob2xlIHNjcmVlbiBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24KLSAgICBnbENsZWFyQ29sb3IoMCwwLDAsMSk7Ci0gICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGh3LmZsaXAoIFJlZ2lvbihody5ib3VuZHMoKSkgKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OnR1cm5FbGVjdHJvbkJlYW1PZmYoaW50MzJfdCBtb2RlKQotewotICAgIGNsYXNzIE1lc3NhZ2VUdXJuRWxlY3Ryb25CZWFtT2ZmIDogcHVibGljIE1lc3NhZ2VCYXNlIHsKLSAgICAgICAgU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXI7Ci0gICAgICAgIGludDMyX3QgbW9kZTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0OwotICAgIHB1YmxpYzoKLSAgICAgICAgTWVzc2FnZVR1cm5FbGVjdHJvbkJlYW1PZmYoU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXIsIGludDMyX3QgbW9kZSkKLSAgICAgICAgICAgIDogZmxpbmdlcihmbGluZ2VyKSwgbW9kZShtb2RlKSwgcmVzdWx0KFBFUk1JU1NJT05fREVOSUVEKSB7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzX3QgZ2V0UmVzdWx0KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlcigpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChmbGluZ2VyLT5tU3RhdGVMb2NrKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZsaW5nZXItPnR1cm5FbGVjdHJvbkJlYW1PZmZJbXBsTG9ja2VkKG1vZGUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgc3A8TWVzc2FnZUJhc2U+IG1zZyA9IG5ldyBNZXNzYWdlVHVybkVsZWN0cm9uQmVhbU9mZih0aGlzLCBtb2RlKTsKLSAgICBzdGF0dXNfdCByZXMgPSBwb3N0TWVzc2FnZVN5bmMobXNnKTsKLSAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJlcyA9IHN0YXRpY19jYXN0PE1lc3NhZ2VUdXJuRWxlY3Ryb25CZWFtT2ZmKj4oIG1zZy5nZXQoKSApLT5nZXRSZXN1bHQoKTsKLQotICAgICAgICAvLyB3b3JrLWFyb3VuZDogd2hlbiB0aGUgcG93ZXItbWFuYWdlciBjYWxscyB1cyB3ZSBhY3RpdmF0ZSB0aGUKLSAgICAgICAgLy8gYW5pbWF0aW9uLiBldmVudHVhbGx5LCB0aGUgIm9uIiBhbmltYXRpb24gd2lsbCBiZSBjYWxsZWQKLSAgICAgICAgLy8gYnkgdGhlIHBvd2VyLW1hbmFnZXIgaXRzZWxmCi0gICAgICAgIG1FbGVjdHJvbkJlYW1BbmltYXRpb25Nb2RlID0gbW9kZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjp0dXJuRWxlY3Ryb25CZWFtT25JbXBsTG9ja2VkKGludDMyX3QgbW9kZSkKLXsKLSAgICBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5lZGl0RGlzcGxheUhhcmR3YXJlKCkpOwotICAgIGlmIChody5jYW5EcmF3KCkpIHsKLSAgICAgICAgLy8gd2UncmUgYWxyZWFkeSBvbgotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIGlmIChtb2RlICYgSVN1cmZhY2VDb21wb3Nlcjo6ZUVsZWN0cm9uQmVhbUFuaW1hdGlvbk9uKSB7Ci0gICAgICAgIGVsZWN0cm9uQmVhbU9uQW5pbWF0aW9uSW1wbExvY2tlZCgpOwotICAgIH0KLQotICAgIC8vIG1ha2Ugc3VyZSB0byByZWRyYXcgdGhlIHdob2xlIHNjcmVlbiB3aGVuIHRoZSBhbmltYXRpb24gaXMgZG9uZQotICAgIG1EaXJ0eVJlZ2lvbi5zZXQoaHcuYm91bmRzKCkpOwotICAgIHNpZ25hbFRyYW5zYWN0aW9uKCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjp0dXJuRWxlY3Ryb25CZWFtT24oaW50MzJfdCBtb2RlKQotewotICAgIGNsYXNzIE1lc3NhZ2VUdXJuRWxlY3Ryb25CZWFtT24gOiBwdWJsaWMgTWVzc2FnZUJhc2UgewotICAgICAgICBTdXJmYWNlRmxpbmdlciogZmxpbmdlcjsKLSAgICAgICAgaW50MzJfdCBtb2RlOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQ7Ci0gICAgcHVibGljOgotICAgICAgICBNZXNzYWdlVHVybkVsZWN0cm9uQmVhbU9uKFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLCBpbnQzMl90IG1vZGUpCi0gICAgICAgICAgICA6IGZsaW5nZXIoZmxpbmdlciksIG1vZGUobW9kZSksIHJlc3VsdChQRVJNSVNTSU9OX0RFTklFRCkgewotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IGdldFJlc3VsdCgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBib29sIGhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZmxpbmdlci0+bVN0YXRlTG9jayk7Ci0gICAgICAgICAgICByZXN1bHQgPSBmbGluZ2VyLT50dXJuRWxlY3Ryb25CZWFtT25JbXBsTG9ja2VkKG1vZGUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcG9zdE1lc3NhZ2VBc3luYyggbmV3IE1lc3NhZ2VUdXJuRWxlY3Ryb25CZWFtT24odGhpcywgbW9kZSkgKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6Y2FwdHVyZVNjcmVlbkltcGxMb2NrZWQoRGlzcGxheUlEIGRweSwKLSAgICAgICAgc3A8SU1lbW9yeUhlYXA+KiBoZWFwLAotICAgICAgICB1aW50MzJfdCogdywgdWludDMyX3QqIGgsIFBpeGVsRm9ybWF0KiBmLAotICAgICAgICB1aW50MzJfdCBzdywgdWludDMyX3Qgc2gsCi0gICAgICAgIHVpbnQzMl90IG1pbkxheWVyWiwgdWludDMyX3QgbWF4TGF5ZXJaKQotewotICAgIHN0YXR1c190IHJlc3VsdCA9IFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgLy8gb25seSBvbmUgZGlzcGxheSBzdXBwb3J0ZWQgZm9yIG5vdwotICAgIGlmIChDQ19VTkxJS0VMWSh1aW50MzJfdChkcHkpID49IERJU1BMQVlfQ09VTlQpKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgaWYgKCFHTEV4dGVuc2lvbnM6OmdldEluc3RhbmNlKCkuaGF2ZUZyYW1lYnVmZmVyT2JqZWN0KCkpCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLQotICAgIC8vIGdldCBzY3JlZW4gZ2VvbWV0cnkKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZShkcHkpLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBjb25zdCB1aW50MzJfdCBod193ID0gaHcuZ2V0V2lkdGgoKTsKLSAgICBjb25zdCB1aW50MzJfdCBod19oID0gaHcuZ2V0SGVpZ2h0KCk7Ci0KLSAgICBpZiAoKHN3ID4gaHdfdykgfHwgKHNoID4gaHdfaCkpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBzdyA9ICghc3cpID8gaHdfdyA6IHN3OwotICAgIHNoID0gKCFzaCkgPyBod19oIDogc2g7Ci0gICAgY29uc3Qgc2l6ZV90IHNpemUgPSBzdyAqIHNoICogNDsKLQotICAgIC8vQUxPR0QoInNjcmVlbnNob3Q6IHN3PSVkLCBzaD0lZCwgbWluWj0lZCwgbWF4Wj0lZCIsCi0gICAgLy8gICAgICAgIHN3LCBzaCwgbWluTGF5ZXJaLCBtYXhMYXllclopOwotCi0gICAgLy8gbWFrZSBzdXJlIHRvIGNsZWFyIGFsbCBHTCBlcnJvciBmbGFncwotICAgIHdoaWxlICggZ2xHZXRFcnJvcigpICE9IEdMX05PX0VSUk9SICkgOwotCi0gICAgLy8gY3JlYXRlIGEgRkJPCi0gICAgR0x1aW50IG5hbWUsIHRuYW1lOwotICAgIGdsR2VuUmVuZGVyYnVmZmVyc09FUygxLCAmdG5hbWUpOwotICAgIGdsQmluZFJlbmRlcmJ1ZmZlck9FUyhHTF9SRU5ERVJCVUZGRVJfT0VTLCB0bmFtZSk7Ci0gICAgZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTKEdMX1JFTkRFUkJVRkZFUl9PRVMsIEdMX1JHQkE4X09FUywgc3csIHNoKTsKLSAgICBnbEdlbkZyYW1lYnVmZmVyc09FUygxLCAmbmFtZSk7Ci0gICAgZ2xCaW5kRnJhbWVidWZmZXJPRVMoR0xfRlJBTUVCVUZGRVJfT0VTLCBuYW1lKTsKLSAgICBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTKEdMX0ZSQU1FQlVGRkVSX09FUywKLSAgICAgICAgICAgIEdMX0NPTE9SX0FUVEFDSE1FTlQwX09FUywgR0xfUkVOREVSQlVGRkVSX09FUywgdG5hbWUpOwotCi0gICAgR0xlbnVtIHN0YXR1cyA9IGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyhHTF9GUkFNRUJVRkZFUl9PRVMpOwotCi0gICAgaWYgKHN0YXR1cyA9PSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9PRVMpIHsKLQotICAgICAgICAvLyBpbnZlcnQgZXZlcnl0aGluZywgYi9jIGdsUmVhZFBpeGVsKCkgYmVsb3cgd2lsbCBpbnZlcnQgdGhlIEZCCi0gICAgICAgIGdsVmlld3BvcnQoMCwgMCwgc3csIHNoKTsKLSAgICAgICAgZ2xTY2lzc29yKDAsIDAsIHN3LCBzaCk7Ci0gICAgICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKLSAgICAgICAgZ2xQdXNoTWF0cml4KCk7Ci0gICAgICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgICAgIGdsT3J0aG9mKDAsIGh3X3csIGh3X2gsIDAsIDAsIDEpOwotICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLQotICAgICAgICAvLyByZWRyYXcgdGhlIHNjcmVlbiBlbnRpcmVseS4uLgotICAgICAgICBnbENsZWFyQ29sb3IoMCwwLDAsMSk7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICAgICAgY29uc3QgTGF5ZXJWZWN0b3ImIGxheWVycyhtRHJhd2luZ1N0YXRlLmxheWVyc1NvcnRlZEJ5Wik7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGxheWVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGxheWVyc1tpXSk7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBmbGFncyA9IGxheWVyLT5kcmF3aW5nU3RhdGUoKS5mbGFnczsKLSAgICAgICAgICAgIGlmICghKGZsYWdzICYgSVN1cmZhY2VDb21wb3Nlcjo6ZUxheWVySGlkZGVuKSkgewotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHogPSBsYXllci0+ZHJhd2luZ1N0YXRlKCkuejsKLSAgICAgICAgICAgICAgICBpZiAoeiA+PSBtaW5MYXllclogJiYgeiA8PSBtYXhMYXllclopIHsKLSAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRyYXdGb3JTcmVlblNob3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBYWFg6IHRoaXMgaXMgbmVlZGVkIG9uIHRlZ3JhCi0gICAgICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgICAgIGdsU2Npc3NvcigwLCAwLCBzdywgc2gpOwotCi0gICAgICAgIC8vIGNoZWNrIGZvciBlcnJvcnMgYW5kIHJldHVybiBzY3JlZW4gY2FwdHVyZQotICAgICAgICBpZiAoZ2xHZXRFcnJvcigpICE9IEdMX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICAvLyBlcnJvciB3aGlsZSByZW5kZXJpbmcKLSAgICAgICAgICAgIHJlc3VsdCA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKLSAgICAgICAgICAgIC8vIHNjcmVlbiBjYXB0dXJlCi0gICAgICAgICAgICBzcDxNZW1vcnlIZWFwQmFzZT4gYmFzZSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsICJzY3JlZW4tY2FwdHVyZSIpICk7Ci0gICAgICAgICAgICB2b2lkKiBjb25zdCBwdHIgPSBiYXNlLT5nZXRCYXNlKCk7Ci0gICAgICAgICAgICBpZiAocHRyKSB7Ci0gICAgICAgICAgICAgICAgLy8gY2FwdHVyZSB0aGUgc2NyZWVuIHdpdGggZ2xSZWFkUGl4ZWxzKCkKLSAgICAgICAgICAgICAgICBnbFJlYWRQaXhlbHMoMCwgMCwgc3csIHNoLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBwdHIpOwotICAgICAgICAgICAgICAgIGlmIChnbEdldEVycm9yKCkgPT0gR0xfTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgKmhlYXAgPSBiYXNlOwotICAgICAgICAgICAgICAgICAgICAqdyA9IHN3OwotICAgICAgICAgICAgICAgICAgICAqaCA9IHNoOwotICAgICAgICAgICAgICAgICAgICAqZiA9IFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gTk9fTUVNT1JZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgICAgIGdsVmlld3BvcnQoMCwgMCwgaHdfdywgaHdfaCk7Ci0gICAgICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKLSAgICAgICAgZ2xQb3BNYXRyaXgoKTsKLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIC8vIHJlbGVhc2UgRkJPIHJlc291cmNlcwotICAgIGdsQmluZEZyYW1lYnVmZmVyT0VTKEdMX0ZSQU1FQlVGRkVSX09FUywgMCk7Ci0gICAgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTKDEsICZ0bmFtZSk7Ci0gICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMoMSwgJm5hbWUpOwotCi0gICAgaHcuY29tcG9zaXRpb25Db21wbGV0ZSgpOwotCi0gICAgLy8gQUxPR0QoInNjcmVlbnNob3Q6IHJlc3VsdCA9ICVzIiwgcmVzdWx0PDAgPyBzdHJlcnJvcihyZXN1bHQpIDogIk9LIik7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpjYXB0dXJlU2NyZWVuKERpc3BsYXlJRCBkcHksCi0gICAgICAgIHNwPElNZW1vcnlIZWFwPiogaGVhcCwKLSAgICAgICAgdWludDMyX3QqIHdpZHRoLCB1aW50MzJfdCogaGVpZ2h0LCBQaXhlbEZvcm1hdCogZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBzdywgdWludDMyX3Qgc2gsCi0gICAgICAgIHVpbnQzMl90IG1pbkxheWVyWiwgdWludDMyX3QgbWF4TGF5ZXJaKQotewotICAgIC8vIG9ubHkgb25lIGRpc3BsYXkgc3VwcG9ydGVkIGZvciBub3cKLSAgICBpZiAoQ0NfVU5MSUtFTFkodWludDMyX3QoZHB5KSA+PSBESVNQTEFZX0NPVU5UKSkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIGlmICghR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpLmhhdmVGcmFtZWJ1ZmZlck9iamVjdCgpKQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0KLSAgICBjbGFzcyBNZXNzYWdlQ2FwdHVyZVNjcmVlbiA6IHB1YmxpYyBNZXNzYWdlQmFzZSB7Ci0gICAgICAgIFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyOwotICAgICAgICBEaXNwbGF5SUQgZHB5OwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4qIGhlYXA7Ci0gICAgICAgIHVpbnQzMl90KiB3OwotICAgICAgICB1aW50MzJfdCogaDsKLSAgICAgICAgUGl4ZWxGb3JtYXQqIGY7Ci0gICAgICAgIHVpbnQzMl90IHN3OwotICAgICAgICB1aW50MzJfdCBzaDsKLSAgICAgICAgdWludDMyX3QgbWluTGF5ZXJaOwotICAgICAgICB1aW50MzJfdCBtYXhMYXllclo7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lc3NhZ2VDYXB0dXJlU2NyZWVuKFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLCBEaXNwbGF5SUQgZHB5LAotICAgICAgICAgICAgICAgIHNwPElNZW1vcnlIZWFwPiogaGVhcCwgdWludDMyX3QqIHcsIHVpbnQzMl90KiBoLCBQaXhlbEZvcm1hdCogZiwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzdywgdWludDMyX3Qgc2gsCi0gICAgICAgICAgICAgICAgdWludDMyX3QgbWluTGF5ZXJaLCB1aW50MzJfdCBtYXhMYXllclopCi0gICAgICAgICAgICA6IGZsaW5nZXIoZmxpbmdlciksIGRweShkcHkpLAotICAgICAgICAgICAgICBoZWFwKGhlYXApLCB3KHcpLCBoKGgpLCBmKGYpLCBzdyhzdyksIHNoKHNoKSwKLSAgICAgICAgICAgICAgbWluTGF5ZXJaKG1pbkxheWVyWiksIG1heExheWVyWihtYXhMYXllclopLAotICAgICAgICAgICAgICByZXN1bHQoUEVSTUlTU0lPTl9ERU5JRUQpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCBnZXRSZXN1bHQoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVyKCkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGZsaW5nZXItPm1TdGF0ZUxvY2spOwotCi0gICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIHNlY3VyZSB3aW5kb3dzLCBuZXZlciBhbGxvdyB0aGUgc2NyZWVuIGNhcHR1cmUKLSAgICAgICAgICAgIGlmIChmbGluZ2VyLT5tU2VjdXJlRnJhbWVCdWZmZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IGZsaW5nZXItPmNhcHR1cmVTY3JlZW5JbXBsTG9ja2VkKGRweSwKLSAgICAgICAgICAgICAgICAgICAgaGVhcCwgdywgaCwgZiwgc3csIHNoLCBtaW5MYXllclosIG1heExheWVyWik7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHNwPE1lc3NhZ2VCYXNlPiBtc2cgPSBuZXcgTWVzc2FnZUNhcHR1cmVTY3JlZW4odGhpcywKLSAgICAgICAgICAgIGRweSwgaGVhcCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBzdywgc2gsIG1pbkxheWVyWiwgbWF4TGF5ZXJaKTsKLSAgICBzdGF0dXNfdCByZXMgPSBwb3N0TWVzc2FnZVN5bmMobXNnKTsKLSAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJlcyA9IHN0YXRpY19jYXN0PE1lc3NhZ2VDYXB0dXJlU2NyZWVuKj4oIG1zZy5nZXQoKSApLT5nZXRSZXN1bHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXNwPExheWVyPiBTdXJmYWNlRmxpbmdlcjo6Z2V0TGF5ZXIoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXIpIGNvbnN0Ci17Ci0gICAgc3A8TGF5ZXI+IHJlc3VsdDsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN0YXRlTG9jayk7Ci0gICAgcmVzdWx0ID0gbUxheWVyTWFwLnZhbHVlRm9yKCBzdXItPmFzQmluZGVyKCkgKS5wcm9tb3RlKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNsaWVudDo6Q2xpZW50KGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlcikKLSAgICA6IG1GbGluZ2VyKGZsaW5nZXIpLCBtTmFtZUdlbmVyYXRvcigxKQotewotfQotCi1DbGllbnQ6On5DbGllbnQoKQotewotICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IG1MYXllcnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgc3A8TGF5ZXJCYXNlQ2xpZW50PiBsYXllcihtTGF5ZXJzLnZhbHVlQXQoaSkucHJvbW90ZSgpKTsKLSAgICAgICAgaWYgKGxheWVyICE9IDApIHsKLSAgICAgICAgICAgIG1GbGluZ2VyLT5yZW1vdmVMYXllcihsYXllcik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IENsaWVudDo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc2l6ZV90IENsaWVudDo6YXR0YWNoTGF5ZXIoY29uc3Qgc3A8TGF5ZXJCYXNlQ2xpZW50PiYgbGF5ZXIpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzaXplX3QgbmFtZSA9IG1OYW1lR2VuZXJhdG9yKys7Ci0gICAgbUxheWVycy5hZGQobmFtZSwgbGF5ZXIpOwotICAgIHJldHVybiBuYW1lOwotfQotCi12b2lkIENsaWVudDo6ZGV0YWNoTGF5ZXIoY29uc3QgTGF5ZXJCYXNlQ2xpZW50KiBsYXllcikKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIC8vIHdlIGRvIGEgbGluZWFyIHNlYXJjaCBoZXJlLCBiZWNhdXNlIHRoaXMgZG9lc24ndCBoYXBwZW4gb2Z0ZW4KLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBtTGF5ZXJzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIGlmIChtTGF5ZXJzLnZhbHVlQXQoaSkgPT0gbGF5ZXIpIHsKLSAgICAgICAgICAgIG1MYXllcnMucmVtb3ZlSXRlbXNBdChpLCAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotc3A8TGF5ZXJCYXNlQ2xpZW50PiBDbGllbnQ6OmdldExheWVyVXNlcihpbnQzMl90IGkpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzcDxMYXllckJhc2VDbGllbnQ+IGxiYzsKLSAgICB3cDxMYXllckJhc2VDbGllbnQ+IGxheWVyKG1MYXllcnMudmFsdWVGb3IoaSkpOwotICAgIGlmIChsYXllciAhPSAwKSB7Ci0gICAgICAgIGxiYyA9IGxheWVyLnByb21vdGUoKTsKLSAgICAgICAgQUxPR0VfSUYobGJjPT0wLCAiZ2V0TGF5ZXJVc2VyKG5hbWU9JWQpIGlzIGRlYWQiLCBpbnQoaSkpOwotICAgIH0KLSAgICByZXR1cm4gbGJjOwotfQotCi0KLXN0YXR1c190IENsaWVudDo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIC8vIHRoZXNlIG11c3QgYmUgY2hlY2tlZAotICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICAgY29uc3QgaW50IHBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICBjb25zdCBpbnQgdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgIGNvbnN0IGludCBzZWxmX3BpZCA9IGdldHBpZCgpOwotICAgICBpZiAoQ0NfVU5MSUtFTFkocGlkICE9IHNlbGZfcGlkICYmIHVpZCAhPSBBSURfR1JBUEhJQ1MgJiYgdWlkICE9IDApKSB7Ci0gICAgICAgICAvLyB3ZSdyZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzLCBkbyB0aGUgcmVhbCBjaGVjawotICAgICAgICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0FjY2Vzc1N1cmZhY2VGbGluZ2VyKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKLSAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBvcGVuR2xvYmFsVHJhbnNhY3Rpb24gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7Ci0gICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICAgfQotICAgICB9Ci0gICAgIHJldHVybiBCblN1cmZhY2VDb21wb3NlckNsaWVudDo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotfQotCi0KLXNwPElTdXJmYWNlPiBDbGllbnQ6OmNyZWF0ZVN1cmZhY2UoCi0gICAgICAgIElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90KiBwYXJhbXMsCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsCi0gICAgICAgIERpc3BsYXlJRCBkaXNwbGF5LCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBQaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICAgIHVpbnQzMl90IGZsYWdzKQotewotICAgIC8qCi0gICAgICogY3JlYXRlU3VyZmFjZSBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBHTCB0aHJlYWQgc28gdGhhdCBpdCBjYW4KLSAgICAgKiBoYXZlIGFjY2VzcyB0byB0aGUgR0wgY29udGV4dC4KLSAgICAgKi8KLQotICAgIGNsYXNzIE1lc3NhZ2VDcmVhdGVTdXJmYWNlIDogcHVibGljIE1lc3NhZ2VCYXNlIHsKLSAgICAgICAgc3A8SVN1cmZhY2U+IHJlc3VsdDsKLSAgICAgICAgU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXI7Ci0gICAgICAgIElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90KiBwYXJhbXM7Ci0gICAgICAgIENsaWVudCogY2xpZW50OwotICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lOwotICAgICAgICBEaXNwbGF5SUQgZGlzcGxheTsKLSAgICAgICAgdWludDMyX3QgdywgaDsKLSAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0OwotICAgICAgICB1aW50MzJfdCBmbGFnczsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lc3NhZ2VDcmVhdGVTdXJmYWNlKFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLAotICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90KiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgQ2xpZW50KiBjbGllbnQsCi0gICAgICAgICAgICAgICAgRGlzcGxheUlEIGRpc3BsYXksIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykKLSAgICAgICAgICAgIDogZmxpbmdlcihmbGluZ2VyKSwgcGFyYW1zKHBhcmFtcyksIGNsaWVudChjbGllbnQpLCBuYW1lKG5hbWUpLAotICAgICAgICAgICAgICBkaXNwbGF5KGRpc3BsYXkpLCB3KHcpLCBoKGgpLCBmb3JtYXQoZm9ybWF0KSwgZmxhZ3MoZmxhZ3MpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBzcDxJU3VyZmFjZT4gZ2V0UmVzdWx0KCkgY29uc3QgeyByZXR1cm4gcmVzdWx0OyB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVyKCkgewotICAgICAgICAgICAgcmVzdWx0ID0gZmxpbmdlci0+Y3JlYXRlU3VyZmFjZShwYXJhbXMsIG5hbWUsIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwgdywgaCwgZm9ybWF0LCBmbGFncyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzcDxNZXNzYWdlQmFzZT4gbXNnID0gbmV3IE1lc3NhZ2VDcmVhdGVTdXJmYWNlKG1GbGluZ2VyLmdldCgpLAotICAgICAgICAgICAgcGFyYW1zLCBuYW1lLCB0aGlzLCBkaXNwbGF5LCB3LCBoLCBmb3JtYXQsIGZsYWdzKTsKLSAgICBtRmxpbmdlci0+cG9zdE1lc3NhZ2VTeW5jKG1zZyk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PE1lc3NhZ2VDcmVhdGVTdXJmYWNlKj4oIG1zZy5nZXQoKSApLT5nZXRSZXN1bHQoKTsKLX0KLXN0YXR1c190IENsaWVudDo6ZGVzdHJveVN1cmZhY2UoU3VyZmFjZUlEIHNpZCkgewotICAgIHJldHVybiBtRmxpbmdlci0+cmVtb3ZlU3VyZmFjZSh0aGlzLCBzaWQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotR3JhcGhpY0J1ZmZlckFsbG9jOjpHcmFwaGljQnVmZmVyQWxsb2MoKSB7fQotCi1HcmFwaGljQnVmZmVyQWxsb2M6On5HcmFwaGljQnVmZmVyQWxsb2MoKSB7fQotCi1zcDxHcmFwaGljQnVmZmVyPiBHcmFwaGljQnVmZmVyQWxsb2M6OmNyZWF0ZUdyYXBoaWNCdWZmZXIodWludDMyX3QgdywgdWludDMyX3QgaCwKLSAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwgc3RhdHVzX3QqIGVycm9yKSB7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcihuZXcgR3JhcGhpY0J1ZmZlcih3LCBoLCBmb3JtYXQsIHVzYWdlKSk7Ci0gICAgc3RhdHVzX3QgZXJyID0gZ3JhcGhpY0J1ZmZlci0+aW5pdENoZWNrKCk7Ci0gICAgKmVycm9yID0gZXJyOwotICAgIGlmIChlcnIgIT0gMCB8fCBncmFwaGljQnVmZmVyLT5oYW5kbGUgPT0gMCkgewotICAgICAgICBpZiAoZXJyID09IE5PX01FTU9SWSkgewotICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6ZHVtcEFsbG9jYXRpb25zVG9TeXN0ZW1Mb2coKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HRSgiR3JhcGhpY0J1ZmZlckFsbG9jOjpjcmVhdGVHcmFwaGljQnVmZmVyKHc9JWQsIGg9JWQpICIKLSAgICAgICAgICAgICAiZmFpbGVkICglcyksIGhhbmRsZT0lcCIsCi0gICAgICAgICAgICAgICAgdywgaCwgc3RyZXJyb3IoLWVyciksIGdyYXBoaWNCdWZmZXItPmhhbmRsZSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gZ3JhcGhpY0J1ZmZlcjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUdyYXBoaWNQbGFuZTo6R3JhcGhpY1BsYW5lKCkKLSAgICA6IG1IdygwKQotewotfQotCi1HcmFwaGljUGxhbmU6On5HcmFwaGljUGxhbmUoKSB7Ci0gICAgZGVsZXRlIG1IdzsKLX0KLQotYm9vbCBHcmFwaGljUGxhbmU6OmluaXRpYWxpemVkKCkgY29uc3QgewotICAgIHJldHVybiBtSHcgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLWludCBHcmFwaGljUGxhbmU6OmdldFdpZHRoKCkgY29uc3QgewotICAgIHJldHVybiBtV2lkdGg7Ci19Ci0KLWludCBHcmFwaGljUGxhbmU6OmdldEhlaWdodCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUhlaWdodDsKLX0KLQotdm9pZCBHcmFwaGljUGxhbmU6OnNldERpc3BsYXlIYXJkd2FyZShEaXNwbGF5SGFyZHdhcmUgKmh3KQotewotICAgIG1IdyA9IGh3OwotCi0gICAgLy8gaW5pdGlhbGl6ZSB0aGUgZGlzcGxheSBvcmllbnRhdGlvbiB0cmFuc2Zvcm0uCi0gICAgLy8gaXQncyBhIGNvbnN0YW50IHRoYXQgc2hvdWxkIGNvbWUgZnJvbSB0aGUgZGlzcGxheSBkcml2ZXIuCi0gICAgaW50IGRpc3BsYXlPcmllbnRhdGlvbiA9IElTdXJmYWNlQ29tcG9zZXI6OmVPcmllbnRhdGlvbkRlZmF1bHQ7Ci0gICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLnNmLmh3cm90YXRpb24iLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7Ci0gICAgICAgIC8vZGlzcGxheU9yaWVudGF0aW9uCi0gICAgICAgIHN3aXRjaCAoYXRvaShwcm9wZXJ0eSkpIHsKLSAgICAgICAgY2FzZSA5MDoKLSAgICAgICAgICAgIGRpc3BsYXlPcmllbnRhdGlvbiA9IElTdXJmYWNlQ29tcG9zZXI6OmVPcmllbnRhdGlvbjkwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcwOgotICAgICAgICAgICAgZGlzcGxheU9yaWVudGF0aW9uID0gSVN1cmZhY2VDb21wb3Nlcjo6ZU9yaWVudGF0aW9uMjcwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCBmbG9hdCB3ID0gaHctPmdldFdpZHRoKCk7Ci0gICAgY29uc3QgZmxvYXQgaCA9IGh3LT5nZXRIZWlnaHQoKTsKLSAgICBHcmFwaGljUGxhbmU6Om9yaWVudGF0aW9uVG9UcmFuc2Zyb20oZGlzcGxheU9yaWVudGF0aW9uLCB3LCBoLAotICAgICAgICAgICAgJm1EaXNwbGF5VHJhbnNmb3JtKTsKLSAgICBpZiAoZGlzcGxheU9yaWVudGF0aW9uICYgSVN1cmZhY2VDb21wb3Nlcjo6ZU9yaWVudGF0aW9uU3dhcE1hc2spIHsKLSAgICAgICAgbURpc3BsYXlXaWR0aCA9IGg7Ci0gICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gdzsKLSAgICB9IGVsc2UgewotICAgICAgICBtRGlzcGxheVdpZHRoID0gdzsKLSAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBoOwotICAgIH0KLQotICAgIHNldE9yaWVudGF0aW9uKElTdXJmYWNlQ29tcG9zZXI6OmVPcmllbnRhdGlvbkRlZmF1bHQpOwotfQotCi1zdGF0dXNfdCBHcmFwaGljUGxhbmU6Om9yaWVudGF0aW9uVG9UcmFuc2Zyb20oCi0gICAgICAgIGludCBvcmllbnRhdGlvbiwgaW50IHcsIGludCBoLCBUcmFuc2Zvcm0qIHRyKQotewotICAgIHVpbnQzMl90IGZsYWdzID0gMDsKLSAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7Ci0gICAgY2FzZSBJU3VyZmFjZUNvbXBvc2VyOjplT3JpZW50YXRpb25EZWZhdWx0OgotICAgICAgICBmbGFncyA9IFRyYW5zZm9ybTo6Uk9UXzA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSVN1cmZhY2VDb21wb3Nlcjo6ZU9yaWVudGF0aW9uOTA6Ci0gICAgICAgIGZsYWdzID0gVHJhbnNmb3JtOjpST1RfOTA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSVN1cmZhY2VDb21wb3Nlcjo6ZU9yaWVudGF0aW9uMTgwOgotICAgICAgICBmbGFncyA9IFRyYW5zZm9ybTo6Uk9UXzE4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJU3VyZmFjZUNvbXBvc2VyOjplT3JpZW50YXRpb24yNzA6Ci0gICAgICAgIGZsYWdzID0gVHJhbnNmb3JtOjpST1RfMjcwOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICB0ci0+c2V0KGZsYWdzLCB3LCBoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNQbGFuZTo6c2V0T3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKQotewotICAgIC8vIElmIHRoZSByb3RhdGlvbiBjYW4gYmUgaGFuZGxlZCBpbiBoYXJkd2FyZSwgdGhpcyBpcyB3aGVyZQotICAgIC8vIHRoZSBtYWdpYyBzaG91bGQgaGFwcGVuLgotCi0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhkaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgY29uc3QgZmxvYXQgdyA9IG1EaXNwbGF5V2lkdGg7Ci0gICAgY29uc3QgZmxvYXQgaCA9IG1EaXNwbGF5SGVpZ2h0OwotICAgIG1XaWR0aCA9IGludCh3KTsKLSAgICBtSGVpZ2h0ID0gaW50KGgpOwotCi0gICAgVHJhbnNmb3JtIG9yaWVudGF0aW9uVHJhbnNmb3JtOwotICAgIEdyYXBoaWNQbGFuZTo6b3JpZW50YXRpb25Ub1RyYW5zZnJvbShvcmllbnRhdGlvbiwgdywgaCwKLSAgICAgICAgICAgICZvcmllbnRhdGlvblRyYW5zZm9ybSk7Ci0gICAgaWYgKG9yaWVudGF0aW9uICYgSVN1cmZhY2VDb21wb3Nlcjo6ZU9yaWVudGF0aW9uU3dhcE1hc2spIHsKLSAgICAgICAgbVdpZHRoID0gaW50KGgpOwotICAgICAgICBtSGVpZ2h0ID0gaW50KHcpOwotICAgIH0KLQotICAgIG1PcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uOwotICAgIG1HbG9iYWxUcmFuc2Zvcm0gPSBtRGlzcGxheVRyYW5zZm9ybSAqIG9yaWVudGF0aW9uVHJhbnNmb3JtOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotY29uc3QgRGlzcGxheUhhcmR3YXJlJiBHcmFwaGljUGxhbmU6OmRpc3BsYXlIYXJkd2FyZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gKm1IdzsKLX0KLQotRGlzcGxheUhhcmR3YXJlJiBHcmFwaGljUGxhbmU6OmVkaXREaXNwbGF5SGFyZHdhcmUoKSB7Ci0gICAgcmV0dXJuICptSHc7Ci19Ci0KLWNvbnN0IFRyYW5zZm9ybSYgR3JhcGhpY1BsYW5lOjp0cmFuc2Zvcm0oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1HbG9iYWxUcmFuc2Zvcm07Ci19Ci0KLUVHTERpc3BsYXkgR3JhcGhpY1BsYW5lOjpnZXRFR0xEaXNwbGF5KCkgY29uc3QgewotICAgIHJldHVybiBtSHctPmdldEVHTERpc3BsYXkoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwNzg3Ny4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU1VSRkFDRV9GTElOR0VSX0gKLSNkZWZpbmUgQU5EUk9JRF9TVVJGQUNFX0ZMSU5HRVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0KLSNpbmNsdWRlICJCYXJyaWVyLmgiCi0jaW5jbHVkZSAiTGF5ZXIuaCIKLQotI2luY2x1ZGUgIk1lc3NhZ2VRdWV1ZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBDbGllbnQ7Ci1jbGFzcyBEaXNwbGF5SGFyZHdhcmU7Ci1jbGFzcyBEaXNwbGF5RXZlbnRDb25uZWN0aW9uOwotY2xhc3MgRXZlbnRUaHJlYWQ7Ci1jbGFzcyBMYXllcjsKLWNsYXNzIExheWVyRGltOwotY2xhc3MgTGF5ZXJTY3JlZW5zaG90Owotc3RydWN0IHN1cmZhY2VfZmxpbmdlcl9jYmxrX3Q7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBDbGllbnQgOiBwdWJsaWMgQm5TdXJmYWNlQ29tcG9zZXJDbGllbnQKLXsKLXB1YmxpYzoKLSAgICAgICAgQ2xpZW50KGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlcik7Ci0gICAgICAgIH5DbGllbnQoKTsKLQotICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgLy8gcHJvdGVjdGVkIGJ5IFN1cmZhY2VGbGluZ2VyOjptU3RhdGVMb2NrCi0gICAgc2l6ZV90IGF0dGFjaExheWVyKGNvbnN0IHNwPExheWVyQmFzZUNsaWVudD4mIGxheWVyKTsKLSAgICB2b2lkIGRldGFjaExheWVyKGNvbnN0IExheWVyQmFzZUNsaWVudCogbGF5ZXIpOwotICAgIHNwPExheWVyQmFzZUNsaWVudD4gZ2V0TGF5ZXJVc2VyKGludDMyX3QgaSkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgLy8gSVN1cmZhY2VDb21wb3NlckNsaWVudCBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHNwPElTdXJmYWNlPiBjcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgc3VyZmFjZV9kYXRhX3QqIHBhcmFtcywgY29uc3QgU3RyaW5nOCYgbmFtZSwKLSAgICAgICAgICAgIERpc3BsYXlJRCBkaXNwbGF5LCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lTdXJmYWNlKFN1cmZhY2VJRCBzdXJmYWNlSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKLSAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICAvLyBjb25zdGFudAotICAgIHNwPFN1cmZhY2VGbGluZ2VyPiBtRmxpbmdlcjsKLQotICAgIC8vIHByb3RlY3RlZCBieSBtTG9jawotICAgIERlZmF1bHRLZXllZFZlY3Rvcjwgc2l6ZV90LCB3cDxMYXllckJhc2VDbGllbnQ+ID4gbUxheWVyczsKLSAgICBzaXplX3QgbU5hbWVHZW5lcmF0b3I7Ci0KLSAgICAvLyB0aHJlYWQtc2FmZQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci19OwotCi1jbGFzcyBHcmFwaGljQnVmZmVyQWxsb2MgOiBwdWJsaWMgQm5HcmFwaGljQnVmZmVyQWxsb2MKLXsKLXB1YmxpYzoKLSAgICBHcmFwaGljQnVmZmVyQWxsb2MoKTsKLSAgICB2aXJ0dWFsIH5HcmFwaGljQnVmZmVyQWxsb2MoKTsKLSAgICB2aXJ0dWFsIHNwPEdyYXBoaWNCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIodWludDMyX3QgdywgdWludDMyX3QgaCwKLSAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwgc3RhdHVzX3QqIGVycm9yKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBHcmFwaGljUGxhbmUKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgc3RhdHVzX3Qgb3JpZW50YXRpb25Ub1RyYW5zZnJvbShpbnQgb3JpZW50YXRpb24sIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgIFRyYW5zZm9ybSogdHIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNQbGFuZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+R3JhcGhpY1BsYW5lKCk7Ci0KLSAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5SGFyZHdhcmUoRGlzcGxheUhhcmR3YXJlICopOwotICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXRPcmllbnRhdGlvbihpbnQgb3JpZW50YXRpb24pOwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRPcmllbnRhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1PcmllbnRhdGlvbjsgfQotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRXaWR0aCgpIGNvbnN0OwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRIZWlnaHQoKSBjb25zdDsKLQotICAgICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmICBkaXNwbGF5SGFyZHdhcmUoKSBjb25zdDsKLSAgICAgICAgRGlzcGxheUhhcmR3YXJlJiAgICAgICAgZWRpdERpc3BsYXlIYXJkd2FyZSgpOwotICAgICAgICBjb25zdCBUcmFuc2Zvcm0mICAgICAgICB0cmFuc2Zvcm0oKSBjb25zdDsKLSAgICAgICAgRUdMRGlzcGxheSAgICAgICAgICAgICAgZ2V0RUdMRGlzcGxheSgpIGNvbnN0OwotICAgICAgICAKLXByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNQbGFuZShjb25zdCBHcmFwaGljUGxhbmUmKTsKLSAgICAgICAgR3JhcGhpY1BsYW5lICAgICAgICAgICAgb3BlcmF0b3IgPSAoY29uc3QgR3JhcGhpY1BsYW5lJik7Ci0KLSAgICAgICAgRGlzcGxheUhhcmR3YXJlKiAgICAgICAgbUh3OwotICAgICAgICBUcmFuc2Zvcm0gICAgICAgICAgICAgICBtR2xvYmFsVHJhbnNmb3JtOwotICAgICAgICBUcmFuc2Zvcm0gICAgICAgICAgICAgICBtRGlzcGxheVRyYW5zZm9ybTsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uOwotICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtRGlzcGxheVdpZHRoOwotICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtRGlzcGxheUhlaWdodDsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVdpZHRoOwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSGVpZ2h0OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWVudW0gewotICAgIGVUcmFuc2FjdGlvbk5lZWRlZCAgICAgID0gMHgwMSwKLSAgICBlVHJhdmVyc2FsTmVlZGVkICAgICAgICA9IDB4MDIKLX07Ci0KLWNsYXNzIFN1cmZhY2VGbGluZ2VyIDoKLSAgICAgICAgcHVibGljIEJpbmRlclNlcnZpY2U8U3VyZmFjZUZsaW5nZXI+LAotICAgICAgICBwdWJsaWMgQm5TdXJmYWNlQ29tcG9zZXIsCi0gICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKLSAgICAgICAgcHJvdGVjdGVkIFRocmVhZAotewotcHVibGljOgotICAgIHN0YXRpYyBjaGFyIGNvbnN0KiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJTdXJmYWNlRmxpbmdlciI7IH0KLQotICAgICAgICAgICAgICAgICAgICBTdXJmYWNlRmxpbmdlcigpOwotICAgIHZpcnR1YWwgICAgICAgICB+U3VyZmFjZUZsaW5nZXIoKTsKLSAgICAgICAgICAgIHZvaWQgICAgaW5pdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAotICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgLy8gSVN1cmZhY2VDb21wb3NlciBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHNwPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+ICBjcmVhdGVDb25uZWN0aW9uKCk7Ci0gICAgdmlydHVhbCBzcDxJR3JhcGhpY0J1ZmZlckFsbG9jPiAgICAgY3JlYXRlR3JhcGhpY0J1ZmZlckFsbG9jKCk7Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gICAgICAgICAgICAgZ2V0Q2JsaygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RGaW5pc2hlZCgpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIHNldFRyYW5zYWN0aW9uU3RhdGUoY29uc3QgVmVjdG9yPENvbXBvc2VyU3RhdGU+JiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmllbnRhdGlvbiwgdWludDMyX3QgZmxhZ3MpOwotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZVN1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4mIHN1cmZhY2UpIGNvbnN0OwotICAgIHZpcnR1YWwgc3A8SURpc3BsYXlFdmVudENvbm5lY3Rpb24+IGNyZWF0ZURpc3BsYXlFdmVudENvbm5lY3Rpb24oKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZVNjcmVlbihEaXNwbGF5SUQgZHB5LAotICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+KiBoZWFwLAotICAgICAgICAgICAgdWludDMyX3QqIHdpZHRoLCB1aW50MzJfdCogaGVpZ2h0LAotICAgICAgICAgICAgUGl4ZWxGb3JtYXQqIGZvcm1hdCwgdWludDMyX3QgcmVxV2lkdGgsIHVpbnQzMl90IHJlcUhlaWdodCwKLSAgICAgICAgICAgIHVpbnQzMl90IG1pbkxheWVyWiwgdWludDMyX3QgbWF4TGF5ZXJaKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgIHR1cm5FbGVjdHJvbkJlYW1PZmYoaW50MzJfdCBtb2RlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICB0dXJuRWxlY3Ryb25CZWFtT24oaW50MzJfdCBtb2RlKTsKLQotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlblJlbGVhc2VkKERpc3BsYXlJRCBkcHkpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbkFjcXVpcmVkKERpc3BsYXlJRCBkcHkpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCByZW5kZXJTY3JlZW5Ub1RleHR1cmUoRGlzcGxheUlEIGRweSwKLSAgICAgICAgICAgICAgICAgICAgR0x1aW50KiB0ZXh0dXJlTmFtZSwgR0xmbG9hdCogdU91dCwgR0xmbG9hdCogdk91dCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZW5kZXJTY3JlZW5Ub1RleHR1cmVMb2NrZWQoRGlzcGxheUlEIGRweSwKLSAgICAgICAgICAgICAgICAgICAgR0x1aW50KiB0ZXh0dXJlTmFtZSwgR0xmbG9hdCogdU91dCwgR0xmbG9hdCogdk91dCk7Ci0KLSAgICAgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoaW50MzJfdCB3aGF0KTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgcG9zdE1lc3NhZ2VBc3luYyhjb25zdCBzcDxNZXNzYWdlQmFzZT4mIG1zZywKLSAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCByZWx0aW1lPTAsIHVpbnQzMl90IGZsYWdzID0gMCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHBvc3RNZXNzYWdlU3luYyhjb25zdCBzcDxNZXNzYWdlQmFzZT4mIG1zZywKLSAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCByZWx0aW1lPTAsIHVpbnQzMl90IGZsYWdzID0gMCk7Ci0KLSAgICBzdGF0dXNfdCByZW1vdmVMYXllcihjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcik7Ci0gICAgc3RhdHVzX3QgYWRkTGF5ZXIoY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIpOwotICAgIHN0YXR1c190IGludmFsaWRhdGVMYXllclZpc2liaWxpdHkoY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIpOwotICAgIHZvaWQgaW52YWxpZGF0ZUh3Y0dlb21ldHJ5KCk7Ci0KLSAgICBzcDxMYXllcj4gZ2V0TGF5ZXIoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXIpIGNvbnN0OwotCi0gICAgR0x1aW50IGdldFByb3RlY3RlZFRleE5hbWUoKSBjb25zdCB7IHJldHVybiBtUHJvdGVjdGVkVGV4TmFtZTsgfQotCi0KLSAgICBjbGFzcyBNZXNzYWdlRGVzdHJveUdMVGV4dHVyZSA6IHB1YmxpYyBNZXNzYWdlQmFzZSB7Ci0gICAgICAgIEdMdWludCB0ZXh0dXJlOwotICAgIHB1YmxpYzoKLSAgICAgICAgTWVzc2FnZURlc3Ryb3lHTFRleHR1cmUoR0x1aW50IHRleHR1cmUpIDogdGV4dHVyZSh0ZXh0dXJlKSB7IH0KLSAgICAgICAgdmlydHVhbCBib29sIGhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfTsKLQotCi1wcml2YXRlOgotICAgIC8vIERlYXRoUmVjaXBpZW50IGludGVyZmFjZQotICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBDbGllbnQ7Ci0gICAgZnJpZW5kIGNsYXNzIERpc3BsYXlFdmVudENvbm5lY3Rpb247Ci0gICAgZnJpZW5kIGNsYXNzIExheWVyQmFzZTsKLSAgICBmcmllbmQgY2xhc3MgTGF5ZXJCYXNlQ2xpZW50OwotICAgIGZyaWVuZCBjbGFzcyBMYXllcjsKLQotICAgIHNwPElTdXJmYWNlPiBjcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgSVN1cmZhY2VDb21wb3NlckNsaWVudDo6c3VyZmFjZV9kYXRhX3QqIHBhcmFtcywKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsCi0gICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICBEaXNwbGF5SUQgZGlzcGxheSwgdWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgc3A8TGF5ZXI+IGNyZWF0ZU5vcm1hbFN1cmZhY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsIERpc3BsYXlJRCBkaXNwbGF5LAotICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICBQaXhlbEZvcm1hdCYgZm9ybWF0KTsKLQotICAgIHNwPExheWVyRGltPiBjcmVhdGVEaW1TdXJmYWNlKAotICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LCBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHNwPExheWVyU2NyZWVuc2hvdD4gY3JlYXRlU2NyZWVuc2hvdFN1cmZhY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsIERpc3BsYXlJRCBkaXNwbGF5LAotICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgc3RhdHVzX3QgcmVtb3ZlU3VyZmFjZShjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBzaWQpOwotICAgIHN0YXR1c190IGRlc3Ryb3lTdXJmYWNlKGNvbnN0IHdwPExheWVyQmFzZUNsaWVudD4mIGxheWVyKTsKLSAgICB1aW50MzJfdCBzZXRDbGllbnRTdGF0ZUxvY2tlZChjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsIGNvbnN0IGxheWVyX3N0YXRlX3QmIHMpOwotCi0gICAgY2xhc3MgTGF5ZXJWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPCBzcDxMYXllckJhc2U+ID4gewotICAgIHB1YmxpYzoKLSAgICAgICAgTGF5ZXJWZWN0b3IoKSB7IH0KLSAgICAgICAgTGF5ZXJWZWN0b3IoY29uc3QgTGF5ZXJWZWN0b3ImIHJocykgOiBTb3J0ZWRWZWN0b3I8IHNwPExheWVyQmFzZT4gPihyaHMpIHsgfQotICAgICAgICB2aXJ0dWFsIGludCBkb19jb21wYXJlKGNvbnN0IHZvaWQqIGxocywgY29uc3Qgdm9pZCogcmhzKSBjb25zdCB7Ci0gICAgICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHNwPExheWVyQmFzZT4qPihsaHMpKTsKLSAgICAgICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIHIoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3A8TGF5ZXJCYXNlPio+KHJocykpOwotICAgICAgICAgICAgLy8gc29ydCBsYXllcnMgYnkgWiBvcmRlcgotICAgICAgICAgICAgdWludDMyX3QgbHogPSBsLT5jdXJyZW50U3RhdGUoKS56OwotICAgICAgICAgICAgdWludDMyX3QgcnogPSByLT5jdXJyZW50U3RhdGUoKS56OwotICAgICAgICAgICAgLy8gdGhlbiBieSBzZXF1ZW5jZSwgc28gd2UgZ2V0IGEgc3RhYmxlIG9yZGVyaW5nCi0gICAgICAgICAgICByZXR1cm4gKGx6ICE9IHJ6KSA/IChseiAtIHJ6KSA6IChsLT5zZXF1ZW5jZSAtIHItPnNlcXVlbmNlKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU3RhdGUgewotICAgICAgICBTdGF0ZSgpIHsKLSAgICAgICAgICAgIG9yaWVudGF0aW9uID0gSVN1cmZhY2VDb21wb3Nlcjo6ZU9yaWVudGF0aW9uRGVmYXVsdDsKLSAgICAgICAgfQotICAgICAgICBMYXllclZlY3RvciAgICAgbGF5ZXJzU29ydGVkQnlaOwotICAgICAgICB1aW50OF90ICAgICAgICAgb3JpZW50YXRpb247Ci0gICAgICAgIHVpbnQ4X3QgICAgICAgICBvcmllbnRhdGlvbkZsYWdzOwotICAgIH07Ci0KLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKLQotcHVibGljOiAgICAgLy8gaGFjayB0byB3b3JrIGFyb3VuZCBnY2MgNC4wLjMgYnVnCi0gICAgY29uc3QgR3JhcGhpY1BsYW5lJiAgICAgZ3JhcGhpY1BsYW5lKGludCBkcHkpIGNvbnN0OwotICAgICAgICAgIEdyYXBoaWNQbGFuZSYgICAgIGdyYXBoaWNQbGFuZShpbnQgZHB5KTsKLQotICAgICAgICAgIHZvaWQgICAgICAgICAgICAgIHNpZ25hbFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgdm9pZCAgICAgICAgICAgICAgc2lnbmFsTGF5ZXJVcGRhdGUoKTsKLSAgICAgICAgICB2b2lkICAgICAgICAgICAgICBzaWduYWxSZWZyZXNoKCk7Ci0gICAgICAgICAgdm9pZCAgICAgICAgICAgICAgcmVwYWludEV2ZXJ5dGhpbmcoKTsKLQotcHJpdmF0ZToKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHdhaXRGb3JFdmVudCgpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlQ29uc29sZUV2ZW50cygpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlVHJhbnNhY3Rpb24odWludDMyX3QgdHJhbnNhY3Rpb25GbGFncyk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVUcmFuc2FjdGlvbkxvY2tlZCh1aW50MzJfdCB0cmFuc2FjdGlvbkZsYWdzKTsKLQotICAgICAgICAgICAgdm9pZCAgICAgICAgY29tcHV0ZVZpc2libGVSZWdpb25zKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lvbiYgZGlydHlSZWdpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uJiB3b3JtaG9sZVJlZ2lvbik7Ci0KLSAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVBhZ2VGbGlwKCk7Ci0gICAgICAgICAgICBib29sICAgICAgICBsb2NrUGFnZUZsaXAoY29uc3QgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgdW5sb2NrUGFnZUZsaXAoY29uc3QgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlUmVmcmVzaCgpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlV29ya0xpc3QoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVJlcGFpbnQoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHBvc3RGcmFtZWJ1ZmZlcigpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0dXBIYXJkd2FyZUNvbXBvc2VyKFJlZ2lvbiYgZGlydHlJbk91dCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBjb21wb3NlU3VyZmFjZXMoY29uc3QgUmVnaW9uJiBkaXJ0eSk7Ci0KLQotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0SW52YWxpZGF0ZVJlZ2lvbihjb25zdCBSZWdpb24mIHJlZyk7Ci0gICAgICAgICAgICBSZWdpb24gICAgICBnZXRBbmRDbGVhckludmFsaWRhdGVSZWdpb24oKTsKLQotICAgICAgICAgICAgc3NpemVfdCAgICAgYWRkQ2xpZW50TGF5ZXIoY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxMYXllckJhc2VDbGllbnQ+JiBsYmMpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgYWRkTGF5ZXJfbChjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICByZW1vdmVMYXllcl9sKGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgIHB1cmdhdG9yaXplTGF5ZXJfbChjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcik7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90ICAgIGdldFRyYW5zYWN0aW9uRmxhZ3ModWludDMyX3QgZmxhZ3MpOwotICAgICAgICAgICAgdWludDMyX3QgICAgcGVla1RyYW5zYWN0aW9uRmxhZ3ModWludDMyX3QgZmxhZ3MpOwotICAgICAgICAgICAgdWludDMyX3QgICAgc2V0VHJhbnNhY3Rpb25GbGFncyh1aW50MzJfdCBmbGFncyk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBjb21taXRUcmFuc2FjdGlvbigpOwotCi0KLSAgICAgICAgICAgIHN0YXR1c190IGNhcHR1cmVTY3JlZW5JbXBsTG9ja2VkKERpc3BsYXlJRCBkcHksCi0gICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnlIZWFwPiogaGVhcCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHdpZHRoLCB1aW50MzJfdCogaGVpZ2h0LCBQaXhlbEZvcm1hdCogZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXFXaWR0aCwgdWludDMyX3QgcmVxSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtaW5MYXllclosIHVpbnQzMl90IG1heExheWVyWik7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHR1cm5FbGVjdHJvbkJlYW1PZmZJbXBsTG9ja2VkKGludDMyX3QgbW9kZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0dXJuRWxlY3Ryb25CZWFtT25JbXBsTG9ja2VkKGludDMyX3QgbW9kZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlbGVjdHJvbkJlYW1PZmZBbmltYXRpb25JbXBsTG9ja2VkKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlbGVjdHJvbkJlYW1PbkFuaW1hdGlvbkltcGxMb2NrZWQoKTsKLQotICAgICAgICAgICAgdm9pZCAgICAgICAgZGVidWdGbGFzaFJlZ2lvbnMoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGRyYXdXb3JtaG9sZSgpIGNvbnN0OwotICAgICAgICAgICAKLSAgICAgICAgICAgIHZvaWQgbGlzdExheWVyc0xvY2tlZChjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBzaXplX3QmIGluZGV4LAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0OwotICAgICAgICAgICAgdm9pZCBkdW1wU3RhdHNMb2NrZWQoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgc2l6ZV90JiBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdDsKLSAgICAgICAgICAgIHZvaWQgY2xlYXJTdGF0c0xvY2tlZChjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBzaXplX3QmIGluZGV4LAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0OwotICAgICAgICAgICAgdm9pZCBkdW1wQWxsTG9ja2VkKFN0cmluZzgmIHJlc3VsdCwgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3Q7Ci0KLSAgICBtdXRhYmxlICAgICBNZXNzYWdlUXVldWUgICAgbUV2ZW50UXVldWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBhY2Nlc3MgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgbVN0YXRlTG9jawotICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1TdGF0ZUxvY2s7Ci0gICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZTsKLSAgICB2b2xhdGlsZSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25GbGFnczsKLSAgICAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25DVjsKLSAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPExheWVyQmFzZT4gPiBtTGF5ZXJQdXJnYXRvcnk7Ci0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRyYW5zYXRpb25QZW5kaW5nOwotICAgICAgICAgICAgICAgIFZlY3Rvcjwgc3A8TGF5ZXJCYXNlPiA+IG1MYXllcnNQZW5kaW5nUmVtb3ZhbDsKLQotICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBtU3RhdGVMb2NrIChidXQgd2UgY291bGQgdXNlIGFub3RoZXIgbG9jaykKLSAgICAgICAgICAgICAgICBHcmFwaGljUGxhbmUgICAgICAgICAgICAgICAgbUdyYXBoaWNQbGFuZXNbMV07Ci0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1MYXllcnNSZW1vdmVkOwotICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3Rvcjwgd3A8SUJpbmRlcj4sIHdwPExheWVyPiA+IG1MYXllck1hcDsKLQotICAgICAgICAgICAgICAgIC8vIGFjY2VzcyBtdXN0IGJlIHByb3RlY3RlZCBieSBtSW52YWxpZGF0ZUxvY2sKLSAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGVMb2NrOwotICAgICAgICAgICAgICAgIFJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0ZVJlZ2lvbjsKLQotICAgICAgICAgICAgICAgIC8vIGNvbnN0YW50IG1lbWJlcnMgKG5vIHN5bmNocm9uaXphdGlvbiBuZWVkZWQgZm9yIGFjY2VzcykKLSAgICAgICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4gICAgICAgICAgICAgbVNlcnZlckhlYXA7Ci0gICAgICAgICAgICAgICAgc3VyZmFjZV9mbGluZ2VyX2NibGtfdCogICAgIG1TZXJ2ZXJDYmxrOwotICAgICAgICAgICAgICAgIEdMdWludCAgICAgICAgICAgICAgICAgICAgICBtV29ybWhvbGVUZXhOYW1lOwotICAgICAgICAgICAgICAgIEdMdWludCAgICAgICAgICAgICAgICAgICAgICBtUHJvdGVjdGVkVGV4TmFtZTsKLSAgICAgICAgICAgICAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgbUJvb3RUaW1lOwotICAgICAgICAgICAgICAgIHNwPEV2ZW50VGhyZWFkPiAgICAgICAgICAgICBtRXZlbnRUaHJlYWQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBDYW4gb25seSBhY2Nlc3NlZCBmcm9tIHRoZSBtYWluIHRocmVhZCwgdGhlc2UgbWVtYmVycwotICAgICAgICAgICAgICAgIC8vIGRvbid0IG5lZWQgc3luY2hyb25pemF0aW9uCi0gICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3aW5nU3RhdGU7Ci0gICAgICAgICAgICAgICAgUmVnaW9uICAgICAgICAgICAgICAgICAgICAgIG1EaXJ0eVJlZ2lvbjsKLSAgICAgICAgICAgICAgICBSZWdpb24gICAgICAgICAgICAgICAgICAgICAgbURpcnR5UmVnaW9uUmVtb3ZlZExheWVyOwotICAgICAgICAgICAgICAgIFJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICBtU3dhcFJlZ2lvbjsKLSAgICAgICAgICAgICAgICBSZWdpb24gICAgICAgICAgICAgICAgICAgICAgbVdvcm1ob2xlUmVnaW9uOwotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eTsKLSAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUh3V29ya0xpc3REaXJ0eTsKLSAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUVsZWN0cm9uQmVhbUFuaW1hdGlvbk1vZGU7Ci0gICAgICAgICAgICAgICAgVmVjdG9yPCBzcDxMYXllckJhc2U+ID4gICAgIG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaOwotCi0KLSAgICAgICAgICAgICAgICAvLyBkb24ndCB1c2UgYSBsb2NrIGZvciB0aGVzZSwgd2UgZG9uJ3QgY2FyZQotICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtRGVidWdSZWdpb247Ci0gICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWJ1Z0JhY2tncm91bmQ7Ci0gICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWJ1Z0RETVM7Ci0gICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWJ1Z0Rpc2FibGVIV0M7Ci0gICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWJ1Z0Rpc2FibGVUcmFuc2Zvcm1IaW50OwotICAgICAgICAgICAgICAgIHZvbGF0aWxlIG5zZWNzX3QgICAgICAgICAgICBtRGVidWdJblN3YXBCdWZmZXJzOwotICAgICAgICAgICAgICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICBtTGFzdFN3YXBCdWZmZXJUaW1lOwotICAgICAgICAgICAgICAgIHZvbGF0aWxlIG5zZWNzX3QgICAgICAgICAgICBtRGVidWdJblRyYW5zYWN0aW9uOwotICAgICAgICAgICAgICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYW5zYWN0aW9uVGltZTsKLSAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUJvb3RGaW5pc2hlZDsKLQotICAgICAgICAgICAgICAgIC8vIHRoZXNlIGFyZSB0aHJlYWQgc2FmZQotICAgIG11dGFibGUgICAgIEJhcnJpZXIgICAgICAgICAgICAgICAgICAgICBtUmVhZHlUb1J1bkJhcnJpZXI7Ci0KLQotICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBtRGVzdHJveWVkTGF5ZXJMb2NrOwotICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtRGVzdHJveWVkTGF5ZXJMb2NrOwotICAgICAgICAgICAgICAgIFZlY3RvcjxMYXllckJhc2UgY29uc3QgKj4gICBtRGVzdHJveWVkTGF5ZXJzOwotCi0gICAgICAgICAgICAgICAgLy8gYXRvbWljIHZhcmlhYmxlcwotICAgICAgICAgICAgICAgIGVudW0gewotICAgICAgICAgICAgICAgICAgICBlQ29uc29sZVJlbGVhc2VkID0gMSwKLSAgICAgICAgICAgICAgICAgICAgZUNvbnNvbGVBY3F1aXJlZCA9IDIKLSAgICAgICAgICAgICAgICB9OwotICAgdm9sYXRpbGUgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtQ29uc29sZVNpZ25hbHM7Ci0KLSAgIC8vIG9ubHkgd3JpdHRlbiBpbiB0aGUgbWFpbiB0aHJlYWQsIG9ubHkgcmVhZCBpbiBvdGhlciB0aHJlYWRzCi0gICB2b2xhdGlsZSAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1TZWN1cmVGcmFtZUJ1ZmZlcjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfU1VSRkFDRV9GTElOR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VUZXh0dXJlTGF5ZXIuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZVRleHR1cmVMYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZThlNjMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZVRleHR1cmVMYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSAiTGF5ZXIuaCIKLSNpbmNsdWRlICJTdXJmYWNlVGV4dHVyZUxheWVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLVN1cmZhY2VUZXh0dXJlTGF5ZXI6OlN1cmZhY2VUZXh0dXJlTGF5ZXIoR0x1aW50IHRleCwgY29uc3Qgc3A8TGF5ZXI+JiBsYXllcikKLSAgICA6IFN1cmZhY2VUZXh0dXJlKHRleCwgdHJ1ZSwgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIGZhbHNlKSwgbUxheWVyKGxheWVyKSB7Ci19Ci0KLVN1cmZhY2VUZXh0dXJlTGF5ZXI6On5TdXJmYWNlVGV4dHVyZUxheWVyKCkgewotfQotCi0KLXN0YXR1c190IFN1cmZhY2VUZXh0dXJlTGF5ZXI6OnNldERlZmF1bHRCdWZmZXJTaXplKHVpbnQzMl90IHcsIHVpbnQzMl90IGgpCi17Ci0gICAgLy9BTE9HRCgiJXMsIHc9JXUsIGg9JXUiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCB3LCBoKTsKLSAgICByZXR1cm4gU3VyZmFjZVRleHR1cmU6OnNldERlZmF1bHRCdWZmZXJTaXplKHcsIGgpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlVGV4dHVyZUxheWVyOjpzZXREZWZhdWx0QnVmZmVyRm9ybWF0KHVpbnQzMl90IGZvcm1hdCkKLXsKLSAgICBtRGVmYXVsdEZvcm1hdCA9IGZvcm1hdDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VUZXh0dXJlTGF5ZXI6OnNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCkgewotICAgIHN0YXR1c190IHJlcyA9IFN1cmZhY2VUZXh0dXJlOjpzZXRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZVRleHR1cmVMYXllcjo6cXVldWVCdWZmZXIoaW50IGJ1ZiwgaW50NjRfdCB0aW1lc3RhbXAsCi0gICAgICAgIHVpbnQzMl90KiBvdXRXaWR0aCwgdWludDMyX3QqIG91dEhlaWdodCwgdWludDMyX3QqIG91dFRyYW5zZm9ybSkgewotCi0gICAgc3RhdHVzX3QgcmVzID0gU3VyZmFjZVRleHR1cmU6OnF1ZXVlQnVmZmVyKGJ1ZiwgdGltZXN0YW1wLAotICAgICAgICAgICAgb3V0V2lkdGgsIG91dEhlaWdodCwgb3V0VHJhbnNmb3JtKTsKLSAgICBzcDxMYXllcj4gbGF5ZXIobUxheWVyLnByb21vdGUoKSk7Ci0gICAgaWYgKGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgKm91dFRyYW5zZm9ybSA9IGxheWVyLT5nZXRUcmFuc2Zvcm1IaW50KCk7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VUZXh0dXJlTGF5ZXI6OmRlcXVldWVCdWZmZXIoaW50ICpidWYsCi0gICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIHsKLQotICAgIHN0YXR1c190IHJlcyhOT19JTklUKTsKLSAgICBzcDxMYXllcj4gbGF5ZXIobUxheWVyLnByb21vdGUoKSk7Ci0gICAgaWYgKGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGZvcm1hdCA9PSAwKQotICAgICAgICAgICAgZm9ybWF0ID0gbURlZmF1bHRGb3JtYXQ7Ci0gICAgICAgIHVpbnQzMl90IGVmZmVjdGl2ZVVzYWdlID0gbGF5ZXItPmdldEVmZmVjdGl2ZVVzYWdlKHVzYWdlKTsKLSAgICAgICAgLy9BTE9HRCgiJXMsIHc9JXUsIGg9JXUsIGZvcm1hdD0ldSwgdXNhZ2U9JTA4eCwgZWZmZWN0aXZlVXNhZ2U9JTA4eCIsCi0gICAgICAgIC8vICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCB3LCBoLCBmb3JtYXQsIHVzYWdlLCBlZmZlY3RpdmVVc2FnZSk7Ci0gICAgICAgIHJlcyA9IFN1cmZhY2VUZXh0dXJlOjpkZXF1ZXVlQnVmZmVyKGJ1ZiwgdywgaCwgZm9ybWF0LCBlZmZlY3RpdmVVc2FnZSk7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VUZXh0dXJlTGF5ZXI6OmNvbm5lY3QoaW50IGFwaSwKLSAgICAgICAgdWludDMyX3QqIG91dFdpZHRoLCB1aW50MzJfdCogb3V0SGVpZ2h0LCB1aW50MzJfdCogb3V0VHJhbnNmb3JtKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gU3VyZmFjZVRleHR1cmU6OmNvbm5lY3QoYXBpLAotICAgICAgICAgICAgb3V0V2lkdGgsIG91dEhlaWdodCwgb3V0VHJhbnNmb3JtKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHNwPExheWVyPiBsYXllcihtTGF5ZXIucHJvbW90ZSgpKTsKLSAgICAgICAgaWYgKGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG9yaWVudGF0aW9uID0gbGF5ZXItPmdldE9yaWVudGF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAob3JpZW50YXRpb24gJiBUcmFuc2Zvcm06OlJPVF9JTlZBTElEKSB7Ci0gICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKm91dFRyYW5zZm9ybSA9IG9yaWVudGF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaChhcGkpIHsKLSAgICAgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfQ1BVOgotICAgICAgICAgICAgICAgIC8vIFN1cmZhY2VUZXh0dXJlQ2xpZW50IHN1cHBvcnRzIG9ubHkgMiBidWZmZXJzIGZvciBDUFUgY29ubmVjdGlvbnMKLSAgICAgICAgICAgICAgICB0aGlzLT5zZXRCdWZmZXJDb3VudFNlcnZlcigyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfTUVESUE6Ci0gICAgICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQToKLSAgICAgICAgICAgICAgICAvLyBDYW1lcmEgcHJldmlldyBhbmQgdmlkZW9zIGFyZSByYXRlLWxpbWl0ZWQgb24gdGhlIHByb2R1Y2VyCi0gICAgICAgICAgICAgICAgLy8gc2lkZS4gIElmIGVuYWJsZWQgZm9yIHRoaXMgYnVpbGQsIHdlIHVzZSBhc3luYyBtb2RlIHRvIGFsd2F5cwotICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIG1vc3QgcmVjZW50IGZyYW1lIGF0IHRoZSBjb3N0IG9mIHJlcXVpcmluZyBhbgotICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgYnVmZmVyLgotI2lmbmRlZiBORVZFUl9ERUZBVUxUX1RPX0FTWU5DX01PREUKLSAgICAgICAgICAgICAgICBlcnIgPSBzZXRTeW5jaHJvbm91c01vZGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIHNldCBzeW5jaHJvbm91cyBtb2RlIHdoZW4gbm90IGRlZmF1bHRpbmcgdG8KLSAgICAgICAgICAgICAgICAvLyBhc3luYyBtb2RlLgotICAgICAgICAgICAgZGVhZnVsdDoKLSAgICAgICAgICAgICAgICBlcnIgPSBzZXRTeW5jaHJvbm91c01vZGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgZGlzY29ubmVjdChhcGkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VUZXh0dXJlTGF5ZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VUZXh0dXJlTGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwODUyNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlVGV4dHVyZUxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NVUkZBQ0VfVEVYVFVSRV9MQVlFUl9ICi0jZGVmaW5lIEFORFJPSURfU1VSRkFDRV9URVhUVVJFX0xBWUVSX0gKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMYXllcjsKLQotY2xhc3MgU3VyZmFjZVRleHR1cmVMYXllciA6IHB1YmxpYyBTdXJmYWNlVGV4dHVyZQotewotICAgIHdwPExheWVyPiBtTGF5ZXI7Ci0gICAgdWludDMyX3QgbURlZmF1bHRGb3JtYXQ7Ci0KLXB1YmxpYzoKLSAgICBTdXJmYWNlVGV4dHVyZUxheWVyKEdMdWludCB0ZXgsIGNvbnN0IHNwPExheWVyPiYgbGF5ZXIpOwotICAgIH5TdXJmYWNlVGV4dHVyZUxheWVyKCk7Ci0KLSAgICBzdGF0dXNfdCBzZXREZWZhdWx0QnVmZmVyU2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKLSAgICBzdGF0dXNfdCBzZXREZWZhdWx0QnVmZmVyRm9ybWF0KHVpbnQzMl90IGZvcm1hdCk7Ci0KLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlQnVmZmVyKGludCBidWYsIGludDY0X3QgdGltZXN0YW1wLAotICAgICAgICAgICAgdWludDMyX3QqIG91dFdpZHRoLCB1aW50MzJfdCogb3V0SGVpZ2h0LCB1aW50MzJfdCogb3V0VHJhbnNmb3JtKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUJ1ZmZlcihpbnQgKmJ1ZiwgdWludDMyX3QgdywgdWludDMyX3QgaCwKLSAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KGludCBhcGksCi0gICAgICAgICAgICB1aW50MzJfdCogb3V0V2lkdGgsIHVpbnQzMl90KiBvdXRIZWlnaHQsIHVpbnQzMl90KiBvdXRUcmFuc2Zvcm0pOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9TVVJGQUNFX1RFWFRVUkVfTEFZRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvVHJhbnNmb3JtLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1RyYW5zZm9ybS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhM2ZhNmUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvVHJhbnNmb3JtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1aS9SZWdpb24uaD4KLQotI2luY2x1ZGUgImNsei5oIgotI2luY2x1ZGUgIlRyYW5zZm9ybS5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVHJhbnNmb3JtOjpUcmFuc2Zvcm0oKSB7Ci0gICAgcmVzZXQoKTsKLX0KLQotVHJhbnNmb3JtOjpUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtJiAgb3RoZXIpCi0gICAgOiBtTWF0cml4KG90aGVyLm1NYXRyaXgpLCBtVHlwZShvdGhlci5tVHlwZSkgewotfQotCi1UcmFuc2Zvcm06OlRyYW5zZm9ybSh1aW50MzJfdCBvcmllbnRhdGlvbikgewotICAgIHNldChvcmllbnRhdGlvbiwgMCwgMCk7Ci19Ci0KLVRyYW5zZm9ybTo6flRyYW5zZm9ybSgpIHsKLX0KLQotc3RhdGljIGNvbnN0IGZsb2F0IEVQU0lMT04gPSAwLjBmOwotCi1ib29sIFRyYW5zZm9ybTo6aXNaZXJvKGZsb2F0IGYpIHsKLSAgICByZXR1cm4gZmFicyhmKSA8PSBFUFNJTE9OOwotfQotCi1ib29sIFRyYW5zZm9ybTo6YWJzSXNPbmUoZmxvYXQgZikgewotICAgIHJldHVybiBpc1plcm8oZmFicyhmKSAtIDEuMGYpOwotfQotCi1UcmFuc2Zvcm0gVHJhbnNmb3JtOjpvcGVyYXRvciAqIChjb25zdCBUcmFuc2Zvcm0mIHJocykgY29uc3QKLXsKLSAgICBpZiAoQ0NfTElLRUxZKG1UeXBlID09IElERU5USVRZKSkKLSAgICAgICAgcmV0dXJuIHJoczsKLQotICAgIFRyYW5zZm9ybSByKCp0aGlzKTsKLSAgICBpZiAocmhzLm1UeXBlID09IElERU5USVRZKQotICAgICAgICByZXR1cm4gcjsKLQotICAgIC8vIFRPRE86IHdlIGNvdWxkIHVzZSBtVHlwZSB0byBvcHRpbWl6ZSB0aGUgbWF0cml4IG11bHRpcGx5Ci0gICAgY29uc3QgbWF0MzMmIEEobU1hdHJpeCk7Ci0gICAgY29uc3QgbWF0MzMmIEIocmhzLm1NYXRyaXgpOwotICAgICAgICAgIG1hdDMzJiBEKHIubU1hdHJpeCk7Ci0gICAgZm9yIChpbnQgaT0wIDsgaTwzIDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHYwID0gQVswXVtpXTsKLSAgICAgICAgY29uc3QgZmxvYXQgdjEgPSBBWzFdW2ldOwotICAgICAgICBjb25zdCBmbG9hdCB2MiA9IEFbMl1baV07Ci0gICAgICAgIERbMF1baV0gPSB2MCpCWzBdWzBdICsgdjEqQlswXVsxXSArIHYyKkJbMF1bMl07Ci0gICAgICAgIERbMV1baV0gPSB2MCpCWzFdWzBdICsgdjEqQlsxXVsxXSArIHYyKkJbMV1bMl07Ci0gICAgICAgIERbMl1baV0gPSB2MCpCWzJdWzBdICsgdjEqQlsyXVsxXSArIHYyKkJbMl1bMl07Ci0gICAgfQotICAgIHIubVR5cGUgfD0gcmhzLm1UeXBlOwotCi0gICAgLy8gVE9ETzogd2UgY291bGQgcmVjb21wdXRlIHRoaXMgdmFsdWUgZnJvbSByIGFuZCByaHMKLSAgICByLm1UeXBlICY9IDB4RkY7Ci0gICAgci5tVHlwZSB8PSBVTktOT1dOX1RZUEU7Ci0gICAgcmV0dXJuIHI7Ci19Ci0KLWZsb2F0IGNvbnN0KiBUcmFuc2Zvcm06Om9wZXJhdG9yIFtdIChpbnQgaSkgY29uc3QgewotICAgIHJldHVybiBtTWF0cml4W2ldLnY7Ci19Ci0KLWJvb2wgVHJhbnNmb3JtOjp0cmFuc2Zvcm1lZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZSgpID4gVFJBTlNMQVRFOwotfQotCi1mbG9hdCBUcmFuc2Zvcm06OnR4KCkgY29uc3QgewotICAgIHJldHVybiBtTWF0cml4WzJdWzBdOwotfQotCi1mbG9hdCBUcmFuc2Zvcm06OnR5KCkgY29uc3QgewotICAgIHJldHVybiBtTWF0cml4WzJdWzFdOwotfQotCi12b2lkIFRyYW5zZm9ybTo6cmVzZXQoKSB7Ci0gICAgbVR5cGUgPSBJREVOVElUWTsKLSAgICBmb3IoaW50IGk9MCA7IGk8MyA7IGkrKykgewotICAgICAgICB2ZWMzJiB2KG1NYXRyaXhbaV0pOwotICAgICAgICBmb3IgKGludCBqPTAgOyBqPDMgOyBqKyspCi0gICAgICAgICAgICB2W2pdID0gKChpPT1qKSA/IDEuMGYgOiAwLjBmKTsKLSAgICB9Ci19Ci0KLXZvaWQgVHJhbnNmb3JtOjpzZXQoZmxvYXQgdHgsIGZsb2F0IHR5KQotewotICAgIG1NYXRyaXhbMl1bMF0gPSB0eDsKLSAgICBtTWF0cml4WzJdWzFdID0gdHk7Ci0gICAgbU1hdHJpeFsyXVsyXSA9IDEuMGY7Ci0KLSAgICBpZiAoaXNaZXJvKHR4KSAmJiBpc1plcm8odHkpKSB7Ci0gICAgICAgIG1UeXBlICY9IH5UUkFOU0xBVEU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVR5cGUgfD0gVFJBTlNMQVRFOwotICAgIH0KLX0KLQotdm9pZCBUcmFuc2Zvcm06OnNldChmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjLCBmbG9hdCBkKQotewotICAgIG1hdDMzJiBNKG1NYXRyaXgpOwotICAgIE1bMF1bMF0gPSBhOyAgICBNWzFdWzBdID0gYjsKLSAgICBNWzBdWzFdID0gYzsgICAgTVsxXVsxXSA9IGQ7Ci0gICAgTVswXVsyXSA9IDA7ICAgIE1bMV1bMl0gPSAwOwotICAgIG1UeXBlID0gVU5LTk9XTl9UWVBFOwotfQotCi1zdGF0dXNfdCBUcmFuc2Zvcm06OnNldCh1aW50MzJfdCBmbGFncywgZmxvYXQgdywgZmxvYXQgaCkKLXsKLSAgICBpZiAoZmxhZ3MgJiBST1RfSU5WQUxJRCkgewotICAgICAgICAvLyB0aGF0J3Mgbm90IGFsbG93ZWQhCi0gICAgICAgIHJlc2V0KCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgVHJhbnNmb3JtIEgsIFYsIFI7Ci0gICAgaWYgKGZsYWdzICYgUk9UXzkwKSB7Ci0gICAgICAgIC8vIHcgJiBoIGFyZSBpbnZlcnRlZCB3aGVuIHJvdGF0aW5nIGJ5IDkwIGRlZ3JlZXMKLSAgICAgICAgc3dhcCh3LCBoKTsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBGTElQX0gpIHsKLSAgICAgICAgSC5tVHlwZSA9IChGTElQX0ggPDwgOCkgfCBTQ0FMRTsKLSAgICAgICAgSC5tVHlwZSB8PSBpc1plcm8odykgPyBJREVOVElUWSA6IFRSQU5TTEFURTsKLSAgICAgICAgbWF0MzMmIE0oSC5tTWF0cml4KTsKLSAgICAgICAgTVswXVswXSA9IC0xOwotICAgICAgICBNWzJdWzBdID0gdzsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBGTElQX1YpIHsKLSAgICAgICAgVi5tVHlwZSA9IChGTElQX1YgPDwgOCkgfCBTQ0FMRTsKLSAgICAgICAgVi5tVHlwZSB8PSBpc1plcm8oaCkgPyBJREVOVElUWSA6IFRSQU5TTEFURTsKLSAgICAgICAgbWF0MzMmIE0oVi5tTWF0cml4KTsKLSAgICAgICAgTVsxXVsxXSA9IC0xOwotICAgICAgICBNWzJdWzFdID0gaDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBST1RfOTApIHsKLSAgICAgICAgY29uc3QgZmxvYXQgb3JpZ2luYWxfdyA9IGg7Ci0gICAgICAgIFIubVR5cGUgPSAoUk9UXzkwIDw8IDgpIHwgUk9UQVRFOwotICAgICAgICBSLm1UeXBlIHw9IGlzWmVybyhvcmlnaW5hbF93KSA/IElERU5USVRZIDogVFJBTlNMQVRFOwotICAgICAgICBtYXQzMyYgTShSLm1NYXRyaXgpOwotICAgICAgICBNWzBdWzBdID0gMDsgICAgTVsxXVswXSA9LTE7ICAgIE1bMl1bMF0gPSBvcmlnaW5hbF93OwotICAgICAgICBNWzBdWzFdID0gMTsgICAgTVsxXVsxXSA9IDA7Ci0gICAgfQotCi0gICAgKnRoaXMgPSAoUiooSCpWKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1UcmFuc2Zvcm06OnZlYzIgVHJhbnNmb3JtOjp0cmFuc2Zvcm0oY29uc3QgdmVjMiYgdikgY29uc3QgewotICAgIHZlYzIgcjsKLSAgICBjb25zdCBtYXQzMyYgTShtTWF0cml4KTsKLSAgICByWzBdID0gTVswXVswXSp2WzBdICsgTVsxXVswXSp2WzFdICsgTVsyXVswXTsKLSAgICByWzFdID0gTVswXVsxXSp2WzBdICsgTVsxXVsxXSp2WzFdICsgTVsyXVsxXTsKLSAgICByZXR1cm4gcjsKLX0KLQotVHJhbnNmb3JtOjp2ZWMzIFRyYW5zZm9ybTo6dHJhbnNmb3JtKGNvbnN0IHZlYzMmIHYpIGNvbnN0IHsKLSAgICB2ZWMzIHI7Ci0gICAgY29uc3QgbWF0MzMmIE0obU1hdHJpeCk7Ci0gICAgclswXSA9IE1bMF1bMF0qdlswXSArIE1bMV1bMF0qdlsxXSArIE1bMl1bMF0qdlsyXTsKLSAgICByWzFdID0gTVswXVsxXSp2WzBdICsgTVsxXVsxXSp2WzFdICsgTVsyXVsxXSp2WzJdOwotICAgIHJbMl0gPSBNWzBdWzJdKnZbMF0gKyBNWzFdWzJdKnZbMV0gKyBNWzJdWzJdKnZbMl07Ci0gICAgcmV0dXJuIHI7Ci19Ci0KLXZvaWQgVHJhbnNmb3JtOjp0cmFuc2Zvcm0oZmxvYXQqIHBvaW50LCBpbnQgeCwgaW50IHkpIGNvbnN0Ci17Ci0gICAgY29uc3QgbWF0MzMmIE0obU1hdHJpeCk7Ci0gICAgdmVjMiB2KHgsIHkpOwotICAgIHYgPSB0cmFuc2Zvcm0odik7Ci0gICAgcG9pbnRbMF0gPSB2WzBdOwotICAgIHBvaW50WzFdID0gdlsxXTsKLX0KLQotUmVjdCBUcmFuc2Zvcm06Om1ha2VCb3VuZHMoaW50IHcsIGludCBoKSBjb25zdAotewotICAgIHJldHVybiB0cmFuc2Zvcm0oIFJlY3QodywgaCkgKTsKLX0KLQotUmVjdCBUcmFuc2Zvcm06OnRyYW5zZm9ybShjb25zdCBSZWN0JiBib3VuZHMpIGNvbnN0Ci17Ci0gICAgUmVjdCByOwotICAgIHZlYzIgbHQoIGJvdW5kcy5sZWZ0LCAgYm91bmRzLnRvcCAgICApOwotICAgIHZlYzIgcnQoIGJvdW5kcy5yaWdodCwgYm91bmRzLnRvcCAgICApOwotICAgIHZlYzIgbGIoIGJvdW5kcy5sZWZ0LCAgYm91bmRzLmJvdHRvbSApOwotICAgIHZlYzIgcmIoIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSApOwotCi0gICAgbHQgPSB0cmFuc2Zvcm0obHQpOwotICAgIHJ0ID0gdHJhbnNmb3JtKHJ0KTsKLSAgICBsYiA9IHRyYW5zZm9ybShsYik7Ci0gICAgcmIgPSB0cmFuc2Zvcm0ocmIpOwotCi0gICAgci5sZWZ0ICAgPSBmbG9vcmYobWluKGx0WzBdLCBydFswXSwgbGJbMF0sIHJiWzBdKSArIDAuNWYpOwotICAgIHIudG9wICAgID0gZmxvb3JmKG1pbihsdFsxXSwgcnRbMV0sIGxiWzFdLCByYlsxXSkgKyAwLjVmKTsKLSAgICByLnJpZ2h0ICA9IGZsb29yZihtYXgobHRbMF0sIHJ0WzBdLCBsYlswXSwgcmJbMF0pICsgMC41Zik7Ci0gICAgci5ib3R0b20gPSBmbG9vcmYobWF4KGx0WzFdLCBydFsxXSwgbGJbMV0sIHJiWzFdKSArIDAuNWYpOwotCi0gICAgcmV0dXJuIHI7Ci19Ci0KLVJlZ2lvbiBUcmFuc2Zvcm06OnRyYW5zZm9ybShjb25zdCBSZWdpb24mIHJlZykgY29uc3QKLXsKLSAgICBSZWdpb24gb3V0OwotICAgIGlmIChDQ19VTkxJS0VMWSh0cmFuc2Zvcm1lZCgpKSkgewotICAgICAgICBpZiAoQ0NfTElLRUxZKHByZXNlcnZlUmVjdHMoKSkpIHsKLSAgICAgICAgICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZWcuYmVnaW4oKTsKLSAgICAgICAgICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgY29uc3QgZW5kID0gcmVnLmVuZCgpOwotICAgICAgICAgICAgd2hpbGUgKGl0ICE9IGVuZCkgewotICAgICAgICAgICAgICAgIG91dC5vclNlbGYodHJhbnNmb3JtKCppdCsrKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQuc2V0KHRyYW5zZm9ybShyZWcuYm91bmRzKCkpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCB4cG9zID0gZmxvb3JmKHR4KCkgKyAwLjVmKTsKLSAgICAgICAgaW50IHlwb3MgPSBmbG9vcmYodHkoKSArIDAuNWYpOwotICAgICAgICBvdXQgPSByZWcudHJhbnNsYXRlKHhwb3MsIHlwb3MpOwotICAgIH0KLSAgICByZXR1cm4gb3V0OwotfQotCi11aW50MzJfdCBUcmFuc2Zvcm06OnR5cGUoKSBjb25zdAotewotICAgIGlmIChtVHlwZSAmIFVOS05PV05fVFlQRSkgewotICAgICAgICAvLyByZWNvbXB1dGUgd2hhdCB0aGlzIHRyYW5zZm9ybSBpcwotCi0gICAgICAgIGNvbnN0IG1hdDMzJiBNKG1NYXRyaXgpOwotICAgICAgICBjb25zdCBmbG9hdCBhID0gTVswXVswXTsKLSAgICAgICAgY29uc3QgZmxvYXQgYiA9IE1bMV1bMF07Ci0gICAgICAgIGNvbnN0IGZsb2F0IGMgPSBNWzBdWzFdOwotICAgICAgICBjb25zdCBmbG9hdCBkID0gTVsxXVsxXTsKLSAgICAgICAgY29uc3QgZmxvYXQgeCA9IE1bMl1bMF07Ci0gICAgICAgIGNvbnN0IGZsb2F0IHkgPSBNWzJdWzFdOwotCi0gICAgICAgIGJvb2wgc2NhbGUgPSBmYWxzZTsKLSAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBST1RfMDsKLSAgICAgICAgaWYgKGlzWmVybyhiKSAmJiBpc1plcm8oYykpIHsKLSAgICAgICAgICAgIGlmIChhPDApICAgIGZsYWdzIHw9IEZMSVBfSDsKLSAgICAgICAgICAgIGlmIChkPDApICAgIGZsYWdzIHw9IEZMSVBfVjsKLSAgICAgICAgICAgIGlmICghYWJzSXNPbmUoYSkgfHwgIWFic0lzT25lKGQpKSB7Ci0gICAgICAgICAgICAgICAgc2NhbGUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzWmVybyhhKSAmJiBpc1plcm8oZCkpIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IFJPVF85MDsKLSAgICAgICAgICAgIGlmIChiPjApICAgIGZsYWdzIHw9IEZMSVBfVjsKLSAgICAgICAgICAgIGlmIChjPDApICAgIGZsYWdzIHw9IEZMSVBfSDsKLSAgICAgICAgICAgIGlmICghYWJzSXNPbmUoYikgfHwgIWFic0lzT25lKGMpKSB7Ci0gICAgICAgICAgICAgICAgc2NhbGUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBza2V3IGNvbXBvbmVudCBhbmQvb3IgYSBub24gOTAgZGVncmVlcyByb3RhdGlvbgotICAgICAgICAgICAgZmxhZ3MgPSBST1RfSU5WQUxJRDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UeXBlID0gZmxhZ3MgPDwgODsKLSAgICAgICAgaWYgKGZsYWdzICYgUk9UX0lOVkFMSUQpIHsKLSAgICAgICAgICAgIG1UeXBlIHw9IFVOS05PV047Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKGZsYWdzICYgUk9UXzkwKSB8fCAoKGZsYWdzICYgUk9UXzE4MCkgPT0gUk9UXzE4MCkpCi0gICAgICAgICAgICAgICAgbVR5cGUgfD0gUk9UQVRFOwotICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxJUF9IKQotICAgICAgICAgICAgICAgIG1UeXBlIF49IFNDQUxFOwotICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxJUF9WKQotICAgICAgICAgICAgICAgIG1UeXBlIF49IFNDQUxFOwotICAgICAgICAgICAgaWYgKHNjYWxlKQotICAgICAgICAgICAgICAgIG1UeXBlIHw9IFNDQUxFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc1plcm8oeCkgfHwgIWlzWmVybyh5KSkKLSAgICAgICAgICAgIG1UeXBlIHw9IFRSQU5TTEFURTsKLSAgICB9Ci0gICAgcmV0dXJuIG1UeXBlOwotfQotCi11aW50MzJfdCBUcmFuc2Zvcm06OmdldFR5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGUoKSAmIDB4RkY7Ci19Ci0KLXVpbnQzMl90IFRyYW5zZm9ybTo6Z2V0T3JpZW50YXRpb24oKSBjb25zdAotewotICAgIHJldHVybiAodHlwZSgpID4+IDgpICYgMHhGRjsKLX0KLQotYm9vbCBUcmFuc2Zvcm06OnByZXNlcnZlUmVjdHMoKSBjb25zdAotewotICAgIHJldHVybiAoZ2V0T3JpZW50YXRpb24oKSAmIFJPVF9JTlZBTElEKSA/IGZhbHNlIDogdHJ1ZTsKLX0KLQotdm9pZCBUcmFuc2Zvcm06OmR1bXAoY29uc3QgY2hhciogbmFtZSkgY29uc3QKLXsKLSAgICB0eXBlKCk7IC8vIHVwZGF0ZXMgdGhlIHR5cGUKLQotICAgIFN0cmluZzggZmxhZ3MsIHR5cGU7Ci0gICAgY29uc3QgbWF0MzMmIG0obU1hdHJpeCk7Ci0gICAgdWludDMyX3Qgb3JpZW50ID0gbVR5cGUgPj4gODsKLQotICAgIGlmIChvcmllbnQmUk9UX0lOVkFMSUQpIHsKLSAgICAgICAgZmxhZ3MuYXBwZW5kKCJST1RfSU5WQUxJRCAiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAob3JpZW50JlJPVF85MCkgewotICAgICAgICAgICAgZmxhZ3MuYXBwZW5kKCJST1RfOTAgIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmbGFncy5hcHBlbmQoIlJPVF8wICIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcmllbnQmRkxJUF9WKQotICAgICAgICAgICAgZmxhZ3MuYXBwZW5kKCJGTElQX1YgIik7Ci0gICAgICAgIGlmIChvcmllbnQmRkxJUF9IKQotICAgICAgICAgICAgZmxhZ3MuYXBwZW5kKCJGTElQX0ggIik7Ci0gICAgfQotCi0gICAgaWYgKCEobVR5cGUmKFNDQUxFfFJPVEFURXxUUkFOU0xBVEUpKSkKLSAgICAgICAgdHlwZS5hcHBlbmQoIklERU5USVRZICIpOwotICAgIGlmIChtVHlwZSZTQ0FMRSkKLSAgICAgICAgdHlwZS5hcHBlbmQoIlNDQUxFICIpOwotICAgIGlmIChtVHlwZSZST1RBVEUpCi0gICAgICAgIHR5cGUuYXBwZW5kKCJST1RBVEUgIik7Ci0gICAgaWYgKG1UeXBlJlRSQU5TTEFURSkKLSAgICAgICAgdHlwZS5hcHBlbmQoIlRSQU5TTEFURSAiKTsKLQotICAgIEFMT0dEKCIlcyAweCUwOHggKCVzLCAlcykiLCBuYW1lLCBtVHlwZSwgZmxhZ3Muc3RyaW5nKCksIHR5cGUuc3RyaW5nKCkpOwotICAgIEFMT0dEKCIlLjRmICAlLjRmICAlLjRmIiwgbVswXVswXSwgbVsxXVswXSwgbVsyXVswXSk7Ci0gICAgQUxPR0QoIiUuNGYgICUuNGYgICUuNGYiLCBtWzBdWzFdLCBtWzFdWzFdLCBtWzJdWzFdKTsKLSAgICBBTE9HRCgiJS40ZiAgJS40ZiAgJS40ZiIsIG1bMF1bMl0sIG1bMV1bMl0sIG1bMl1bMl0pOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1RyYW5zZm9ybS5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvVHJhbnNmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNzQyNDMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvVHJhbnNmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9UUkFOU0ZPUk1fSAotI2RlZmluZSBBTkRST0lEX1RSQU5TRk9STV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHVpL1BvaW50Lmg+Ci0jaW5jbHVkZSA8dWkvUmVjdC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBSZWdpb247Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBUcmFuc2Zvcm0KLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtKCk7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm0mICBvdGhlcik7Ci0gICAgICAgICAgIGV4cGxpY2l0IFRyYW5zZm9ybSh1aW50MzJfdCBvcmllbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH5UcmFuc2Zvcm0oKTsKLQotICAgICAgICAgICAgZW51bSBvcmllbnRhdGlvbl9mbGFncyB7Ci0gICAgICAgICAgICAgICAgUk9UXzAgICA9IDB4MDAwMDAwMDAsCi0gICAgICAgICAgICAgICAgRkxJUF9IICA9IEhBTF9UUkFOU0ZPUk1fRkxJUF9ILAotICAgICAgICAgICAgICAgIEZMSVBfViAgPSBIQUxfVFJBTlNGT1JNX0ZMSVBfViwKLSAgICAgICAgICAgICAgICBST1RfOTAgID0gSEFMX1RSQU5TRk9STV9ST1RfOTAsCi0gICAgICAgICAgICAgICAgUk9UXzE4MCA9IEZMSVBfSHxGTElQX1YsCi0gICAgICAgICAgICAgICAgUk9UXzI3MCA9IFJPVF8xODB8Uk9UXzkwLAotICAgICAgICAgICAgICAgIFJPVF9JTlZBTElEID0gMHg4MAotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgZW51bSB0eXBlX21hc2sgewotICAgICAgICAgICAgICAgIElERU5USVRZICAgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgIFRSQU5TTEFURSAgICAgICAgICAgPSAweDEsCi0gICAgICAgICAgICAgICAgUk9UQVRFICAgICAgICAgICAgICA9IDB4MiwKLSAgICAgICAgICAgICAgICBTQ0FMRSAgICAgICAgICAgICAgID0gMHg0LAotICAgICAgICAgICAgICAgIFVOS05PV04gICAgICAgICAgICAgPSAweDgKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIC8vIHF1ZXJ5IHRoZSB0cmFuc2Zvcm0KLSAgICAgICAgICAgIGJvb2wgICAgICAgIHRyYW5zZm9ybWVkKCkgY29uc3Q7Ci0gICAgICAgICAgICBib29sICAgICAgICBwcmVzZXJ2ZVJlY3RzKCkgY29uc3Q7Ci0gICAgICAgICAgICB1aW50MzJfdCAgICBnZXRUeXBlKCkgY29uc3Q7Ci0gICAgICAgICAgICB1aW50MzJfdCAgICBnZXRPcmllbnRhdGlvbigpIGNvbnN0OwotCi0gICAgICAgICAgICBmbG9hdCBjb25zdCogb3BlcmF0b3IgW10gKGludCBpKSBjb25zdDsgIC8vIHJldHVybnMgY29sdW1uIGkKLSAgICAgICAgICAgIGZsb2F0ICAgdHgoKSBjb25zdDsKLSAgICAgICAgICAgIGZsb2F0ICAgdHkoKSBjb25zdDsKLQotICAgICAgICAgICAgLy8gbW9kaWZ5IHRoZSB0cmFuc2Zvcm0KLSAgICAgICAgICAgIHZvaWQgICAgICAgIHJlc2V0KCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBzZXQoZmxvYXQgdHgsIGZsb2F0IHR5KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHNldChmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjLCBmbG9hdCBkKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgIHNldCh1aW50MzJfdCBmbGFncywgZmxvYXQgdywgZmxvYXQgaCk7Ci0KLSAgICAgICAgICAgIC8vIHRyYW5zZm9ybSBkYXRhCi0gICAgICAgICAgICBSZWN0ICAgIG1ha2VCb3VuZHMoaW50IHcsIGludCBoKSBjb25zdDsKLSAgICAgICAgICAgIHZvaWQgICAgdHJhbnNmb3JtKGZsb2F0KiBwb2ludCwgaW50IHgsIGludCB5KSBjb25zdDsKLSAgICAgICAgICAgIFJlZ2lvbiAgdHJhbnNmb3JtKGNvbnN0IFJlZ2lvbiYgcmVnKSBjb25zdDsKLSAgICAgICAgICAgIFRyYW5zZm9ybSBvcGVyYXRvciAqIChjb25zdCBUcmFuc2Zvcm0mIHJocykgY29uc3Q7Ci0KLSAgICAgICAgICAgIC8vIGZvciBkZWJ1Z2dpbmcKLSAgICAgICAgICAgIHZvaWQgZHVtcChjb25zdCBjaGFyKiBuYW1lKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgdmVjMyB7Ci0gICAgICAgIGZsb2F0IHZbM107Ci0gICAgICAgIGlubGluZSB2ZWMzKCkgeyB9Ci0gICAgICAgIGlubGluZSB2ZWMzKGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMpIHsKLSAgICAgICAgICAgIHZbMF0gPSBhOyB2WzFdID0gYjsgdlsyXSA9IGM7Ci0gICAgICAgIH0KLSAgICAgICAgaW5saW5lIGZsb2F0IG9wZXJhdG9yIFtdIChpbnQgaSkgY29uc3QgeyByZXR1cm4gdltpXTsgfQotICAgICAgICBpbmxpbmUgZmxvYXQmIG9wZXJhdG9yIFtdIChpbnQgaSkgeyByZXR1cm4gdltpXTsgfQotICAgIH07Ci0gICAgc3RydWN0IHZlYzIgewotICAgICAgICBmbG9hdCB2WzJdOwotICAgICAgICBpbmxpbmUgdmVjMigpIHsgfQotICAgICAgICBpbmxpbmUgdmVjMihmbG9hdCBhLCBmbG9hdCBiKSB7Ci0gICAgICAgICAgICB2WzBdID0gYTsgdlsxXSA9IGI7Ci0gICAgICAgIH0KLSAgICAgICAgaW5saW5lIGZsb2F0IG9wZXJhdG9yIFtdIChpbnQgaSkgY29uc3QgeyByZXR1cm4gdltpXTsgfQotICAgICAgICBpbmxpbmUgZmxvYXQmIG9wZXJhdG9yIFtdIChpbnQgaSkgeyByZXR1cm4gdltpXTsgfQotICAgIH07Ci0gICAgc3RydWN0IG1hdDMzIHsKLSAgICAgICAgdmVjMyB2WzNdOwotICAgICAgICBpbmxpbmUgY29uc3QgdmVjMyYgb3BlcmF0b3IgW10gKGludCBpKSBjb25zdCB7IHJldHVybiB2W2ldOyB9Ci0gICAgICAgIGlubGluZSB2ZWMzJiBvcGVyYXRvciBbXSAoaW50IGkpIHsgcmV0dXJuIHZbaV07IH0KLSAgICB9OwotCi0gICAgZW51bSB7IFVOS05PV05fVFlQRSA9IDB4ODAwMDAwMDAgfTsKLQotICAgIC8vIGFzc3VtZXMgdGhlIGxhc3Qgcm93IGlzIDwgMCAsIDAgLCAxID4KLSAgICB2ZWMyIHRyYW5zZm9ybShjb25zdCB2ZWMyJiB2KSBjb25zdDsKLSAgICB2ZWMzIHRyYW5zZm9ybShjb25zdCB2ZWMzJiB2KSBjb25zdDsKLSAgICBSZWN0IHRyYW5zZm9ybShjb25zdCBSZWN0JiBib3VuZHMpIGNvbnN0OwotICAgIHVpbnQzMl90IHR5cGUoKSBjb25zdDsKLSAgICBzdGF0aWMgYm9vbCBhYnNJc09uZShmbG9hdCBmKTsKLSAgICBzdGF0aWMgYm9vbCBpc1plcm8oZmxvYXQgZik7Ci0KLSAgICBtYXQzMyAgICAgICAgICAgICAgIG1NYXRyaXg7Ci0gICAgbXV0YWJsZSB1aW50MzJfdCAgICBtVHlwZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8qIEFORFJPSURfVFJBTlNGT1JNX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL2Nsei5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9jbHouY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDU2Yjg2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL2Nsei5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImNsei5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWludCBjbHpfaW1wbChpbnQzMl90IHgpCi17Ci0jaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCi0gICAgcmV0dXJuIF9fYnVpbHRpbl9jbHooeCk7Ci0jZWxzZQotICAgIGlmICgheCkgcmV0dXJuIDMyOwotICAgIGludCBlID0gMzE7Ci0gICAgaWYgKHgmMHhGRkZGMDAwMCkgICB7IGUgLT0xNjsgeCA+Pj0xNjsgfQotICAgIGlmICh4JjB4MDAwMEZGMDApICAgeyBlIC09IDg7IHggPj49IDg7IH0KLSAgICBpZiAoeCYweDAwMDAwMEYwKSAgIHsgZSAtPSA0OyB4ID4+PSA0OyB9Ci0gICAgaWYgKHgmMHgwMDAwMDAwQykgICB7IGUgLT0gMjsgeCA+Pj0gMjsgfQotICAgIGlmICh4JjB4MDAwMDAwMDIpICAgeyBlIC09IDE7IH0KLSAgICByZXR1cm4gZTsKLSNlbmRpZgotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvY2x6LmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9jbHouaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjNTI2Mi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9jbHouaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU1VSRkFDRV9GTElOR0VSX0NMWl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1pbnQgaW5saW5lIGNseihpbnQzMl90IHgpIHsKLSAgICByZXR1cm4gX19idWlsdGluX2Nseih4KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW5saW5lIFQgbWluKFQgYSwgVCBiKSB7Ci0gICAgcmV0dXJuIGE8YiA/IGEgOiBiOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW5saW5lIFQgbWluKFQgYSwgVCBiLCBUIGMpIHsKLSAgICByZXR1cm4gbWluKGEsIG1pbihiLCBjKSk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUgVCBtaW4oVCBhLCBUIGIsIFQgYywgVCBkKSB7Ci0gICAgcmV0dXJuIG1pbihhLCBiLCBtaW4oYywgZCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUgVCBtYXgoVCBhLCBUIGIpIHsKLSAgICByZXR1cm4gYT5iID8gYSA6IGI7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUgVCBtYXgoVCBhLCBUIGIsIFQgYykgewotICAgIHJldHVybiBtYXgoYSwgbWF4KGIsIGMpKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdGljIGlubGluZSBUIG1heChUIGEsIFQgYiwgVCBjLCBUIGQpIHsKLSAgICByZXR1cm4gbWF4KGEsIGIsIG1heChjLCBkKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdGljIGlubGluZQotdm9pZCBzd2FwKFQmIGEsIFQmIGIpIHsKLSAgICBUIHQoYSk7Ci0gICAgYSA9IGI7Ci0gICAgYiA9IHQ7Ci19Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8qIEFORFJPSURfU1VSRkFDRV9GTElOR0VSX0NMWl9IICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1NTY0OC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cywKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBTdXJmYWNlRmxpbmdlcl90ZXN0Ci0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgVHJhbnNhY3Rpb25fdGVzdC5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJFR0wgXAotCWxpYkdMRVN2MiBcCi0JbGliYW5kcm9pZCBcCi0JbGliYmluZGVyIFwKLQlsaWJjdXRpbHMgXAotCWxpYmd1aSBcCi0JbGlic3RscG9ydCBcCi0JbGlidWkgXAotCWxpYnV0aWxzIFwKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgYmlvbmljIFwKLSAgICBiaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAotICAgIGV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAotICAgIGV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCi0KLSMgQnVpbGQgdGhlIGJpbmFyeSB0byAkKFRBUkdFVF9PVVRfREFUQV9OQVRJVkVfVEVTVFMpLyQoTE9DQUxfTU9EVUxFKQotIyB0byBpbnRlZ3JhdGUgd2l0aCBhdXRvLXRlc3QgZnJhbWV3b3JrLgotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi0jIEluY2x1ZGUgc3ViZGlyZWN0b3J5IG1ha2VmaWxlcwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBJZiB3ZSdyZSBidWlsZGluZyB3aXRoIE9ORV9TSE9UX01BS0VGSUxFIChtbSwgbW1tKSwgdGhlbiB3aGF0IHRoZSBmcmFtZXdvcmsKLSMgdGVhbSByZWFsbHkgd2FudHMgaXMgdG8gYnVpbGQgdGhlIHN0dWZmIGRlZmluZWQgYnkgdGhpcyBtYWtlZmlsZS4KLWlmZXEgKCwkKE9ORV9TSE9UX01BS0VGSUxFKSkKLWluY2x1ZGUgJChjYWxsIGZpcnN0LW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL1RyYW5zYWN0aW9uX3Rlc3QuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvVHJhbnNhY3Rpb25fdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YWUwZDkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvVHJhbnNhY3Rpb25fdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9ndWkvQ29tcG9zZXJTZXJ2aWNlLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gRmlsbCBhbiBSR0JBXzg4ODggZm9ybWF0dGVkIHN1cmZhY2Ugd2l0aCBhIHNpbmdsZSBjb2xvci4KLXN0YXRpYyB2b2lkIGZpbGxTdXJmYWNlUkdCQTgoY29uc3Qgc3A8U3VyZmFjZUNvbnRyb2w+JiBzYywKLSAgICAgICAgdWludDhfdCByLCB1aW50OF90IGcsIHVpbnQ4X3QgYikgewotICAgIFN1cmZhY2U6OlN1cmZhY2VJbmZvIGluZm87Ci0gICAgc3A8U3VyZmFjZT4gcyA9IHNjLT5nZXRTdXJmYWNlKCk7Ci0gICAgQVNTRVJUX1RSVUUocyAhPSBOVUxMKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHMtPmxvY2soJmluZm8pKTsKLSAgICB1aW50OF90KiBpbWcgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihpbmZvLmJpdHMpOwotICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCBpbmZvLmg7IHkrKykgewotICAgICAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgaW5mby53OyB4KyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHBpeGVsID0gaW1nICsgKDQgKiAoeSppbmZvLnMgKyB4KSk7Ci0gICAgICAgICAgICBwaXhlbFswXSA9IHI7Ci0gICAgICAgICAgICBwaXhlbFsxXSA9IGc7Ci0gICAgICAgICAgICBwaXhlbFsyXSA9IGI7Ci0gICAgICAgICAgICBwaXhlbFszXSA9IDI1NTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHMtPnVubG9ja0FuZFBvc3QoKSk7Ci19Ci0KLS8vIEEgU2NyZWVuQ2FwdHVyZSBpcyBhIHNjcmVlbnNob3QgZnJvbSBTdXJmYWNlRmxpbmdlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrCi0vLyBpbmRpdmlkdWFsIHBpeGVsIHZhbHVlcyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KLWNsYXNzIFNjcmVlbkNhcHR1cmUgOiBwdWJsaWMgUmVmQmFzZSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgY2FwdHVyZVNjcmVlbihzcDxTY3JlZW5DYXB0dXJlPiogc2MpIHsKLSAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXA7Ci0gICAgICAgIHVpbnQzMl90IHc9MCwgaD0wOwotICAgICAgICBQaXhlbEZvcm1hdCBmbXQ9MDsKLSAgICAgICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gc2YoQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgc2YtPmNhcHR1cmVTY3JlZW4oMCwgJmhlYXAsICZ3LCAmaCwgJmZtdCwgMCwgMCwKLSAgICAgICAgICAgICAgICAwLCBJTlRfTUFYKSk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKGhlYXAgIT0gTlVMTCk7Ci0gICAgICAgIEFTU0VSVF9FUShQSVhFTF9GT1JNQVRfUkdCQV84ODg4LCBmbXQpOwotICAgICAgICAqc2MgPSBuZXcgU2NyZWVuQ2FwdHVyZSh3LCBoLCBoZWFwKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNoZWNrUGl4ZWwodWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDhfdCByLCB1aW50OF90IGcsIHVpbnQ4X3QgYikgewotICAgICAgICBjb25zdCB1aW50OF90KiBpbWcgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihtSGVhcC0+YmFzZSgpKTsKLSAgICAgICAgY29uc3QgdWludDhfdCogcGl4ZWwgPSBpbWcgKyAoNCAqICh5Km1XaWR0aCArIHgpKTsKLSAgICAgICAgaWYgKHIgIT0gcGl4ZWxbMF0gfHwgZyAhPSBwaXhlbFsxXSB8fCBiICE9IHBpeGVsWzJdKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGVycihTdHJpbmc4Ojpmb3JtYXQoInBpeGVsIEAgKCUzZCwgJTNkKTogIgotICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgWyUzZCwgJTNkLCAlM2RdLCBnb3QgWyUzZCwgJTNkLCAlM2RdIiwKLSAgICAgICAgICAgICAgICAgICAgeCwgeSwgciwgZywgYiwgcGl4ZWxbMF0sIHBpeGVsWzFdLCBwaXhlbFsyXSkpOwotICAgICAgICAgICAgRVhQRUNUX0VRKFN0cmluZzgoKSwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotcHJpdmF0ZToKLSAgICBTY3JlZW5DYXB0dXJlKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCkgOgotICAgICAgICBtV2lkdGgodyksCi0gICAgICAgIG1IZWlnaHQoaCksCi0gICAgICAgIG1IZWFwKGhlYXApCi0gICAge30KLQotICAgIGNvbnN0IHVpbnQzMl90IG1XaWR0aDsKLSAgICBjb25zdCB1aW50MzJfdCBtSGVpZ2h0OwotICAgIHNwPElNZW1vcnlIZWFwPiBtSGVhcDsKLX07Ci0KLWNsYXNzIExheWVyVXBkYXRlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgbUNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpKTsKLQotICAgICAgICBzc2l6ZV90IGRpc3BsYXlXaWR0aCA9IG1Db21wb3NlckNsaWVudC0+Z2V0RGlzcGxheVdpZHRoKDApOwotICAgICAgICBzc2l6ZV90IGRpc3BsYXlIZWlnaHQgPSBtQ29tcG9zZXJDbGllbnQtPmdldERpc3BsYXlIZWlnaHQoMCk7Ci0KLSAgICAgICAgLy8gQmFja2dyb3VuZCBzdXJmYWNlCi0gICAgICAgIG1CR1N1cmZhY2VDb250cm9sID0gbUNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgICAgIFN0cmluZzgoIkJHIFRlc3QgU3VyZmFjZSIpLCAwLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICAgICAgUElYRUxfRk9STUFUX1JHQkFfODg4OCwgMCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKG1CR1N1cmZhY2VDb250cm9sICE9IE5VTEwpOwotICAgICAgICBBU1NFUlRfVFJVRShtQkdTdXJmYWNlQ29udHJvbC0+aXNWYWxpZCgpKTsKLSAgICAgICAgZmlsbFN1cmZhY2VSR0JBOChtQkdTdXJmYWNlQ29udHJvbCwgNjMsIDYzLCAxOTUpOwotCi0gICAgICAgIC8vIEZvcmVncm91bmQgc3VyZmFjZQotICAgICAgICBtRkdTdXJmYWNlQ29udHJvbCA9IG1Db21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKLSAgICAgICAgICAgICAgICBTdHJpbmc4KCJGRyBUZXN0IFN1cmZhY2UiKSwgMCwgNjQsIDY0LCBQSVhFTF9GT1JNQVRfUkdCQV84ODg4LCAwKTsKLSAgICAgICAgQVNTRVJUX1RSVUUobUZHU3VyZmFjZUNvbnRyb2wgIT0gTlVMTCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKG1GR1N1cmZhY2VDb250cm9sLT5pc1ZhbGlkKCkpOwotCi0gICAgICAgIGZpbGxTdXJmYWNlUkdCQTgobUZHU3VyZmFjZUNvbnRyb2wsIDE5NSwgNjMsIDYzKTsKLQotICAgICAgICAvLyBTeW5jaHJvbml6YXRpb24gc3VyZmFjZQotICAgICAgICBtU3luY1N1cmZhY2VDb250cm9sID0gbUNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgICAgIFN0cmluZzgoIlN5bmMgVGVzdCBTdXJmYWNlIiksIDAsIDEsIDEsIFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShtU3luY1N1cmZhY2VDb250cm9sICE9IE5VTEwpOwotICAgICAgICBBU1NFUlRfVFJVRShtU3luY1N1cmZhY2VDb250cm9sLT5pc1ZhbGlkKCkpOwotCi0gICAgICAgIGZpbGxTdXJmYWNlUkdCQTgobVN5bmNTdXJmYWNlQ29udHJvbCwgMzEsIDMxLCAzMSk7Ci0KLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLQotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1CR1N1cmZhY2VDb250cm9sLT5zZXRMYXllcihJTlRfTUFYLTIpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQkdTdXJmYWNlQ29udHJvbC0+c2hvdygpKTsKLQotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1GR1N1cmZhY2VDb250cm9sLT5zZXRMYXllcihJTlRfTUFYLTEpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtRkdTdXJmYWNlQ29udHJvbC0+c2V0UG9zaXRpb24oNjQsIDY0KSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUZHU3VyZmFjZUNvbnRyb2wtPnNob3coKSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3luY1N1cmZhY2VDb250cm9sLT5zZXRMYXllcihJTlRfTUFYLTEpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3luY1N1cmZhY2VDb250cm9sLT5zZXRQb3NpdGlvbihkaXNwbGF5V2lkdGgtMiwKLSAgICAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LTIpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3luY1N1cmZhY2VDb250cm9sLT5zaG93KCkpOwotCi0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbih0cnVlKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIG1Db21wb3NlckNsaWVudC0+ZGlzcG9zZSgpOwotICAgICAgICBtQkdTdXJmYWNlQ29udHJvbCA9IDA7Ci0gICAgICAgIG1GR1N1cmZhY2VDb250cm9sID0gMDsKLSAgICAgICAgbVN5bmNTdXJmYWNlQ29udHJvbCA9IDA7Ci0gICAgICAgIG1Db21wb3NlckNsaWVudCA9IDA7Ci0gICAgfQotCi0gICAgdm9pZCB3YWl0Rm9yUG9zdGVkQnVmZmVycygpIHsKLSAgICAgICAgLy8gU2luY2UgdGhlIHN5bmMgc3VyZmFjZSBpcyBpbiBzeW5jaHJvbm91cyBtb2RlIChpLmUuIGRvdWJsZSBidWZmZXJlZCkKLSAgICAgICAgLy8gcG9zdGluZyB0aHJlZSBidWZmZXJzIHRvIGl0IHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdCB0d28KLSAgICAgICAgLy8gU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVBhZ2VGbGlwIGNhbGxzIGhhdmUgYmVlbiBtYWRlLCB3aGljaCBzaG91bGQKLSAgICAgICAgLy8gZ3VhcmFudGVlZCB0aGF0IGEgYnVmZmVyIHBvc3RlZCB0byBhbm90aGVyIFN1cmZhY2UgaGFzIGJlZW4gcmV0aXJlZC4KLSAgICAgICAgZmlsbFN1cmZhY2VSR0JBOChtU3luY1N1cmZhY2VDb250cm9sLCAzMSwgMzEsIDMxKTsKLSAgICAgICAgZmlsbFN1cmZhY2VSR0JBOChtU3luY1N1cmZhY2VDb250cm9sLCAzMSwgMzEsIDMxKTsKLSAgICAgICAgZmlsbFN1cmZhY2VSR0JBOChtU3luY1N1cmZhY2VDb250cm9sLCAzMSwgMzEsIDMxKTsKLSAgICB9Ci0KLSAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IG1Db21wb3NlckNsaWVudDsKLSAgICBzcDxTdXJmYWNlQ29udHJvbD4gbUJHU3VyZmFjZUNvbnRyb2w7Ci0gICAgc3A8U3VyZmFjZUNvbnRyb2w+IG1GR1N1cmZhY2VDb250cm9sOwotCi0gICAgLy8gVGhpcyBzdXJmYWNlIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlcnMgcG9zdGVkIHRvCi0gICAgLy8gbUZHU3VyZmFjZUNvbnRyb2wgaGF2ZSBiZWVuIHBpY2tlZCB1cCBieSBTdXJmYWNlRmxpbmdlci4KLSAgICBzcDxTdXJmYWNlQ29udHJvbD4gbVN5bmNTdXJmYWNlQ29udHJvbDsKLX07Ci0KLVRFU1RfRihMYXllclVwZGF0ZVRlc3QsIExheWVyTW92ZVdvcmtzKSB7Ci0gICAgc3A8U2NyZWVuQ2FwdHVyZT4gc2M7Ci0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoImJlZm9yZSBtb3ZlIik7Ci0gICAgICAgIFNjcmVlbkNhcHR1cmU6OmNhcHR1cmVTY3JlZW4oJnNjKTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoICAwLCAgMTIsICA2MywgIDYzLCAxOTUpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCggNzUsICA3NSwgMTk1LCAgNjMsICA2Myk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKDE0NSwgMTQ1LCAgNjMsICA2MywgMTk1KTsKLSAgICB9Ci0KLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUZHU3VyZmFjZUNvbnRyb2wtPnNldFBvc2l0aW9uKDEyOCwgMTI4KSk7Ci0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKHRydWUpOwotICAgIHsKLSAgICAgICAgLy8gVGhpcyBzaG91bGQgcmVmbGVjdCB0aGUgbmV3IHBvc2l0aW9uLCBidXQgbm90IHRoZSBuZXcgY29sb3IuCi0gICAgICAgIFNDT1BFRF9UUkFDRSgiYWZ0ZXIgbW92ZSwgYmVmb3JlIHJlZHJhdyIpOwotICAgICAgICBTY3JlZW5DYXB0dXJlOjpjYXB0dXJlU2NyZWVuKCZzYyk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKCAyNCwgIDI0LCAgNjMsICA2MywgMTk1KTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoIDc1LCAgNzUsICA2MywgIDYzLCAxOTUpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCgxNDUsIDE0NSwgMTk1LCAgNjMsICA2Myk7Ci0gICAgfQotCi0gICAgZmlsbFN1cmZhY2VSR0JBOChtRkdTdXJmYWNlQ29udHJvbCwgNjMsIDE5NSwgNjMpOwotICAgIHdhaXRGb3JQb3N0ZWRCdWZmZXJzKCk7Ci0gICAgewotICAgICAgICAvLyBUaGlzIHNob3VsZCByZWZsZWN0IHRoZSBuZXcgcG9zaXRpb24gYW5kIHRoZSBuZXcgY29sb3IuCi0gICAgICAgIFNDT1BFRF9UUkFDRSgiYWZ0ZXIgcmVkcmF3Iik7Ci0gICAgICAgIFNjcmVlbkNhcHR1cmU6OmNhcHR1cmVTY3JlZW4oJnNjKTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoIDI0LCAgMjQsICA2MywgIDYzLCAxOTUpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCggNzUsICA3NSwgIDYzLCAgNjMsIDE5NSk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKDE0NSwgMTQ1LCAgNjMsIDE5NSwgIDYzKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihMYXllclVwZGF0ZVRlc3QsIExheWVyUmVzaXplV29ya3MpIHsKLSAgICBzcDxTY3JlZW5DYXB0dXJlPiBzYzsKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSgiYmVmb3JlIHJlc2l6ZSIpOwotICAgICAgICBTY3JlZW5DYXB0dXJlOjpjYXB0dXJlU2NyZWVuKCZzYyk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKCAgMCwgIDEyLCAgNjMsICA2MywgMTk1KTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoIDc1LCAgNzUsIDE5NSwgIDYzLCAgNjMpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCgxNDUsIDE0NSwgIDYzLCAgNjMsIDE5NSk7Ci0gICAgfQotCi0gICAgQUxPR0QoInJlc2l6aW5nIik7Ci0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1GR1N1cmZhY2VDb250cm9sLT5zZXRTaXplKDEyOCwgMTI4KSk7Ci0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKHRydWUpOwotICAgIEFMT0dEKCJyZXNpemVkIik7Ci0gICAgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgcmVmbGVjdCB0aGUgbmV3IHNpemUgb3IgY29sb3IgYmVjYXVzZSBTdXJmYWNlRmxpbmdlcgotICAgICAgICAvLyBoYXMgbm90IHlldCByZWNlaXZlZCBhIGJ1ZmZlciBvZiB0aGUgY29ycmVjdCBzaXplLgotICAgICAgICBTQ09QRURfVFJBQ0UoImFmdGVyIHJlc2l6ZSwgYmVmb3JlIHJlZHJhdyIpOwotICAgICAgICBTY3JlZW5DYXB0dXJlOjpjYXB0dXJlU2NyZWVuKCZzYyk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKCAgMCwgIDEyLCAgNjMsICA2MywgMTk1KTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoIDc1LCAgNzUsIDE5NSwgIDYzLCAgNjMpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCgxNDUsIDE0NSwgIDYzLCAgNjMsIDE5NSk7Ci0gICAgfQotCi0gICAgQUxPR0QoImRyYXdpbmciKTsKLSAgICBmaWxsU3VyZmFjZVJHQkE4KG1GR1N1cmZhY2VDb250cm9sLCA2MywgMTk1LCA2Myk7Ci0gICAgd2FpdEZvclBvc3RlZEJ1ZmZlcnMoKTsKLSAgICBBTE9HRCgiZHJhd24iKTsKLSAgICB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIHJlZmxlY3QgdGhlIG5ldyBzaXplIGFuZCB0aGUgbmV3IGNvbG9yLgotICAgICAgICBTQ09QRURfVFJBQ0UoImFmdGVyIHJlZHJhdyIpOwotICAgICAgICBTY3JlZW5DYXB0dXJlOjpjYXB0dXJlU2NyZWVuKCZzYyk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKCAyNCwgIDI0LCAgNjMsICA2MywgMTk1KTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoIDc1LCAgNzUsICA2MywgMTk1LCAgNjMpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCgxNDUsIDE0NSwgIDYzLCAxOTUsICA2Myk7Ci0gICAgfQotfQotCi19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9yZXNpemUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3Jlc2l6ZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODE2NzllLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3Jlc2l6ZS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCXJlc2l6ZS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLQlsaWJ1dGlscyBcCi0gICAgbGlidWkgXAotICAgIGxpYmd1aQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LXJlc2l6ZQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3Jlc2l6ZS9yZXNpemUuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvcmVzaXplL3Jlc2l6ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDNiM2QuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvcmVzaXplL3Jlc2l6ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGN1dGlscy9tZW1vcnkuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCi17Ci0gICAgLy8gc2V0IHVwIHRoZSB0aHJlYWQtcG9vbAotICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7Ci0gICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotCi0gICAgLy8gY3JlYXRlIGEgY2xpZW50IHRvIHN1cmZhY2VmbGluZ2VyCi0gICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50KCk7Ci0gICAgCi0gICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IGNsaWVudC0+Y3JlYXRlU3VyZmFjZSgwLCAxNjAsIDI0MCwKLSAgICAgICAgICAgIFBJWEVMX0ZPUk1BVF9SR0JfNTY1KTsKLQotCi0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLSAgICBzdXJmYWNlLT5zZXRMYXllcigxMDAwMDApOwotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbigpOwotCi0gICAgU3VyZmFjZTo6U3VyZmFjZUluZm8gaW5mbzsKLSAgICBzdXJmYWNlLT5sb2NrKCZpbmZvKTsKLSAgICBzc2l6ZV90IGJwciA9IGluZm8ucyAqIGJ5dGVzUGVyUGl4ZWwoaW5mby5mb3JtYXQpOwotICAgIGFuZHJvaWRfbWVtc2V0MTYoKHVpbnQxNl90KilpbmZvLmJpdHMsIDB4RjgwMCwgYnByKmluZm8uaCk7Ci0gICAgc3VyZmFjZS0+dW5sb2NrQW5kUG9zdCgpOwotCi0gICAgc3VyZmFjZS0+bG9jaygmaW5mbyk7Ci0gICAgYW5kcm9pZF9tZW1zZXQxNigodWludDE2X3QqKWluZm8uYml0cywgMHgwN0UwLCBicHIqaW5mby5oKTsKLSAgICBzdXJmYWNlLT51bmxvY2tBbmRQb3N0KCk7Ci0KLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgIHN1cmZhY2UtPnNldFNpemUoMzIwLCAyNDApOwotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbigpOwotCi0gICAgCi0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKLSAgICAKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3NjcmVlbmNhcC9BbmRyb2lkLm1rIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvc2NyZWVuY2FwL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZGQxYTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvc2NyZWVuY2FwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0Jc2NyZWVuY2FwLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYnV0aWxzIFwKLQlsaWJiaW5kZXIgXAotCWxpYnNraWEgXAotICAgIGxpYnVpIFwKLSAgICBsaWJndWkKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1zY3JlZW5jYXAKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0JZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2NvcmUgXAotCWV4dGVybmFsL3NraWEvaW5jbHVkZS9lZmZlY3RzIFwKLQlleHRlcm5hbC9za2lhL2luY2x1ZGUvaW1hZ2VzIFwKLQlleHRlcm5hbC9za2lhL3NyYy9wb3J0cyBcCi0JZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL3V0aWxzCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvc2NyZWVuY2FwL3NjcmVlbmNhcC5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9zY3JlZW5jYXAvc2NyZWVuY2FwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1NjZlMC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9zY3JlZW5jYXAvc2NyZWVuY2FwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgotCi0jaW5jbHVkZSA8U2tJbWFnZUVuY29kZXIuaD4KLSNpbmNsdWRlIDxTa0JpdG1hcC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIGlmIChhcmdjICE9IDIpIHsKLSAgICAgICAgcHJpbnRmKCJ1c2FnZTogJXMgcGF0aFxuIiwgYXJndlswXSk7Ci0gICAgICAgIGV4aXQoMCk7Ci0gICAgfQotCi0gICAgY29uc3QgU3RyaW5nMTYgbmFtZSgiU3VyZmFjZUZsaW5nZXIiKTsKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBjb21wb3NlcjsKLSAgICBnZXRTZXJ2aWNlKG5hbWUsICZjb21wb3Nlcik7Ci0KLSAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcDsKLSAgICB1aW50MzJfdCB3LCBoOwotICAgIFBpeGVsRm9ybWF0IGY7Ci0gICAgc3RhdHVzX3QgZXJyID0gY29tcG9zZXItPmNhcHR1cmVTY3JlZW4oMCwgJmhlYXAsICZ3LCAmaCwgJmYsIDAsIDApOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJzY3JlZW4gY2FwdHVyZSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgIGV4aXQoMCk7Ci0gICAgfQotCi0gICAgcHJpbnRmKCJzY3JlZW4gY2FwdHVyZSBzdWNjZXNzOiB3PSV1LCBoPSV1LCBwaXhlbHM9JXBcbiIsCi0gICAgICAgICAgICB3LCBoLCBoZWFwLT5nZXRCYXNlKCkpOwotCi0gICAgcHJpbnRmKCJzYXZpbmcgZmlsZSBhcyBQTkcgaW4gJXMgLi4uXG4iLCBhcmd2WzFdKTsKLQotICAgIFNrQml0bWFwIGI7Ci0gICAgYi5zZXRDb25maWcoU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnLCB3LCBoKTsKLSAgICBiLnNldFBpeGVscyhoZWFwLT5nZXRCYXNlKCkpOwotICAgIFNrSW1hZ2VFbmNvZGVyOjpFbmNvZGVGaWxlKGFyZ3ZbMV0sIGIsCi0gICAgICAgICAgICBTa0ltYWdlRW5jb2Rlcjo6a1BOR19UeXBlLCBTa0ltYWdlRW5jb2Rlcjo6a0RlZmF1bHRRdWFsaXR5KTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvc3VyZmFjZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvc3VyZmFjZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkwNjBlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3N1cmZhY2UvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlzdXJmYWNlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYnV0aWxzIFwKLQlsaWJiaW5kZXIgXAotICAgIGxpYnVpIFwKLSAgICBsaWJndWkKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1zdXJmYWNlCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvc3VyZmFjZS9zdXJmYWNlLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3N1cmZhY2Uvc3VyZmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ODc4ZjcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvc3VyZmFjZS9zdXJmYWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3V0aWxzL21lbW9yeS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCi17Ci0gICAgLy8gc2V0IHVwIHRoZSB0aHJlYWQtcG9vbAotICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7Ci0gICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotCi0gICAgLy8gY3JlYXRlIGEgY2xpZW50IHRvIHN1cmZhY2VmbGluZ2VyCi0gICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50KCk7Ci0gICAgCi0gICAgc3A8U3VyZmFjZUNvbnRyb2w+IHN1cmZhY2VDb250cm9sID0gY2xpZW50LT5jcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgMCwgMTYwLCAyNDAsIFBJWEVMX0ZPUk1BVF9SR0JfNTY1KTsKLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgIHN1cmZhY2VDb250cm9sLT5zZXRMYXllcigxMDAwMDApOwotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbigpOwotCi0gICAgLy8gcHJldGVuZCBpdCB3ZW50IGNyb3NzLXByb2Nlc3MKLSAgICBQYXJjZWwgcGFyY2VsOwotICAgIFN1cmZhY2VDb250cm9sOjp3cml0ZVN1cmZhY2VUb1BhcmNlbChzdXJmYWNlQ29udHJvbCwgJnBhcmNlbCk7Ci0gICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKLSAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gU3VyZmFjZTo6cmVhZEZyb21QYXJjZWwocGFyY2VsKTsKLSAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cgPSBzdXJmYWNlLmdldCgpOwotCi0gICAgcHJpbnRmKCJ3aW5kb3c9JXBcbiIsIHdpbmRvdyk7Ci0KLSAgICBpbnQgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KHdpbmRvdywgOCk7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyOwotCi0gICAgZm9yIChpbnQgaT0wIDsgaTw4IDsgaSsrKSB7Ci0gICAgICAgIHdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcih3aW5kb3csICZidWZmZXIpOwotICAgICAgICBwcmludGYoImJ1ZmZlciAlZDogJXBcbiIsIGksIGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgcHJpbnRmKCJ0ZXN0IGNvbXBsZXRlLiBDVFJMK0MgdG8gZmluaXNoLlxuIik7Ci0KLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvdHJhbnNmb3JtL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy90cmFuc2Zvcm0vQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxOWRhZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy90cmFuc2Zvcm0vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlUcmFuc2Zvcm1UZXN0LmNwcCBcCi0JLi4vLi4vVHJhbnNmb3JtLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYnV0aWxzIFwKLQlsaWJ1aSBcCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3QtdHJhbnNmb3JtCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gLi4vLi4KLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy90cmFuc2Zvcm0vVHJhbnNmb3JtVGVzdC5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy90cmFuc2Zvcm0vVHJhbnNmb3JtVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMTJjNGUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvdHJhbnNmb3JtL1RyYW5zZm9ybVRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlICIuLi8uLi9UcmFuc2Zvcm0uaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBUcmFuc2Zvcm0gdHI5MChUcmFuc2Zvcm06OlJPVF85MCk7Ci0gICAgVHJhbnNmb3JtIHRyRkgoVHJhbnNmb3JtOjpGTElQX0gpOwotICAgIFRyYW5zZm9ybSB0ckZWKFRyYW5zZm9ybTo6RkxJUF9WKTsKLQotICAgIFRyYW5zZm9ybSB0cjkwRkgoVHJhbnNmb3JtOjpST1RfOTAgfCBUcmFuc2Zvcm06OkZMSVBfSCk7Ci0gICAgVHJhbnNmb3JtIHRyOTBGVihUcmFuc2Zvcm06OlJPVF85MCB8IFRyYW5zZm9ybTo6RkxJUF9WKTsKLQotICAgIHRyOTAuZHVtcCgidHI5MCIpOwotICAgIHRyRkguZHVtcCgidHJGSCIpOwotICAgIHRyRlYuZHVtcCgidHJGViIpOwotCi0gICAgdHI5MEZILmR1bXAoInRyOTBGSCIpOwotICAgIHRyOTBGVi5kdW1wKCJ0cjkwRlYiKTsKLQotICAgICh0ckZIKnRyOTApLmR1bXAoInRyRkgqdHI5MCIpOwotICAgICh0ckZWKnRyOTApLmR1bXAoInRyRlYqdHI5MCIpOwotCi0gICAgKHRyOTAqdHJGSCkuZHVtcCgidHI5MCp0ckZIIik7Ci0gICAgKHRyOTAqdHJGVikuZHVtcCgidHI5MCp0ckZWIik7Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3ZzeW5jL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy92c3luYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTgxNzYwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3ZzeW5jL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JdnN5bmMuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0JbGlidXRpbHMgXAotCWxpYmJpbmRlciBcCi0gICAgbGlidWkgXAotICAgIGxpYmd1aQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LXZzeW5jLWV2ZW50cwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3ZzeW5jL3ZzeW5jLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3ZzeW5jL3ZzeW5jLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkNTRjNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy92c3luYy92c3luYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd1aS9EaXNwbGF5RXZlbnRSZWNlaXZlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvb3Blci5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotaW50IHJlY2VpdmVyKGludCBmZCwgaW50IGV2ZW50cywgdm9pZCogZGF0YSkKLXsKLSAgICBEaXNwbGF5RXZlbnRSZWNlaXZlciogcSA9IChEaXNwbGF5RXZlbnRSZWNlaXZlciopZGF0YTsKLQotICAgIHNzaXplX3QgbjsKLSAgICBEaXNwbGF5RXZlbnRSZWNlaXZlcjo6RXZlbnQgYnVmZmVyWzFdOwotCi0gICAgc3RhdGljIG5zZWNzX3Qgb2xkVGltZVN0YW1wID0gMDsKLQotICAgIHdoaWxlICgobiA9IHEtPmdldEV2ZW50cyhidWZmZXIsIDEpKSA+IDApIHsKLSAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyW2ldLmhlYWRlci50eXBlID09IERpc3BsYXlFdmVudFJlY2VpdmVyOjpESVNQTEFZX0VWRU5UX1ZTWU5DKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJldmVudCB2c3luYzogY291bnQ9JWRcdCIsIGJ1ZmZlcltpXS52c3luYy5jb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2xkVGltZVN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdCA9IGZsb2F0KGJ1ZmZlcltpXS5oZWFkZXIudGltZXN0YW1wIC0gb2xkVGltZVN0YW1wKSAvIHMybnMoMSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlZiBtcyAoJWYgSHopXG4iLCB0KjEwMDAsIDEuMC90KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9sZFRpbWVTdGFtcCA9IGJ1ZmZlcltpXS5oZWFkZXIudGltZXN0YW1wOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChuPDApIHsKLSAgICAgICAgcHJpbnRmKCJlcnJvciByZWFkaW5nIGV2ZW50cyAoJXMpXG4iLCBzdHJlcnJvcigtbikpOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIERpc3BsYXlFdmVudFJlY2VpdmVyIG15RGlzcGxheUV2ZW50OwotCi0KLSAgICBzcDxMb29wZXI+IGxvb3AgPSBuZXcgTG9vcGVyKGZhbHNlKTsKLSAgICBsb29wLT5hZGRGZChteURpc3BsYXlFdmVudC5nZXRGZCgpLCAwLCBBTE9PUEVSX0VWRU5UX0lOUFVULCByZWNlaXZlciwKLSAgICAgICAgICAgICZteURpc3BsYXlFdmVudCk7Ci0KLSAgICBteURpc3BsYXlFdmVudC5zZXRWc3luY1JhdGUoMSk7Ci0KLSAgICBkbyB7Ci0gICAgICAgIC8vcHJpbnRmKCJhYm91dCB0byBwb2xsLi4uXG4iKTsKLSAgICAgICAgaW50MzJfdCByZXQgPSBsb29wLT5wb2xsT25jZSgtMSk7Ci0gICAgICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgICAgICAgICBjYXNlIEFMT09QRVJfUE9MTF9XQUtFOgotICAgICAgICAgICAgICAgIC8vKCJBTE9PUEVSX1BPTExfV0FLRVxuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFMT09QRVJfUE9MTF9DQUxMQkFDSzoKLSAgICAgICAgICAgICAgICAvLygiQUxPT1BFUl9QT0xMX0NBTExCQUNLXG4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQUxPT1BFUl9QT0xMX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJBTE9PUEVSX1BPTExfVElNRU9VVFxuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFMT09QRVJfUE9MTF9FUlJPUjoKLSAgICAgICAgICAgICAgICBwcmludGYoIkFMT09QRVJfUE9MTF9USU1FT1VUXG4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJ1Z2g/IHBvbGwgcmV0dXJuZWQgJWRcbiIsIHJldCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlICgxKTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvd2FpdGZvcnZzeW5jL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy93YWl0Zm9ydnN5bmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1ZjVhYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy93YWl0Zm9ydnN5bmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQl3YWl0Zm9ydnN5bmMuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtd2FpdGZvcnZzeW5jCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvd2FpdGZvcnZzeW5jL3dhaXRmb3J2c3luYy5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy93YWl0Zm9ydnN5bmMvd2FpdGZvcnZzeW5jLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5Yjg4Yi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy93YWl0Zm9ydnN5bmMvd2FpdGZvcnZzeW5jLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZuZGVmIEZCSU9fV0FJVEZPUlZTWU5DCi0jZGVmaW5lIEZCSU9fV0FJVEZPUlZTWU5DICAgX0lPVygnRicsIDB4MjAsIF9fdTMyKQotI2VuZGlmCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIGludCBmZCA9IG9wZW4oIi9kZXYvZ3JhcGhpY3MvZmIwIiwgT19SRFdSKTsKLSAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB1aW50MzJfdCBjcnQgPSAwOwotICAgICAgICAgICBpbnQgZXJyID0gaW9jdGwoZmQsIEZCSU9fV0FJVEZPUlZTWU5DLCAmY3J0KTsKLSAgICAgICAgICAgaWYgKGVyciA8IDApIHsKLSAgICAgICAgICAgICAgIHByaW50ZigiRkJJT19XQUlURk9SVlNZTkMgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSgxKTsKLSAgICAgICAgY2xvc2UoZmQpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9BbmRyb2lkLm1rIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxMTE1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCisjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGb3VudGFpbl92MTEKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDExCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I0ZmFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZm91bnRhaW5fdjExIj4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIxMSIgLz4KKyAgICA8YXBwbGljYXRpb24gCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkZvdW50YWluX3YxMSIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvdGVzdF9wYXR0ZXJuIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iRm91bnRhaW5fdjExIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9faW5kZXguaHRtbCBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9faW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjMyNDJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL19pbmRleC5odG1sCkBAIC0wLDAgKzEsNSBAQAorPHA+QW4gZXhhbXBsZSB0aGF0IHJlbmRlcnMgbWFueSBkb3RzIG9uIHRoZSBzY3JlZW4gdGhhdCBmb2xsb3cgYSB1c2VyJ3MgdG91Y2guIFRoZSBkb3RzIGZhbGwgCit0byB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgZmluZ2VyLjwvcD4KKworCisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QxNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1ODEwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmZvdW50YWluX3YxMTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCitwdWJsaWMgY2xhc3MgRm91bnRhaW5SUyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSVF9DT1VOVCA9IDUwMDAwOworCisgICAgcHVibGljIEZvdW50YWluUlMoKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNjcmlwdENfZm91bnRhaW4gbVNjcmlwdDsKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyIHBmYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIocnMpOworICAgICAgICBwZmIuc2V0VmFyeWluZ0NvbG9yKHRydWUpOworICAgICAgICBycy5iaW5kUHJvZ3JhbUZyYWdtZW50KHBmYi5jcmVhdGUoKSk7CisKKyAgICAgICAgU2NyaXB0RmllbGRfUG9pbnQgcG9pbnRzID0gbmV3IFNjcmlwdEZpZWxkX1BvaW50KG1SUywgUEFSVF9DT1VOVCk7Ly8KKyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbi5VU0FHRV9HUkFQSElDU19WRVJURVgpOworCisgICAgICAgIE1lc2guQWxsb2NhdGlvbkJ1aWxkZXIgc21iID0gbmV3IE1lc2guQWxsb2NhdGlvbkJ1aWxkZXIobVJTKTsKKyAgICAgICAgc21iLmFkZFZlcnRleEFsbG9jYXRpb24ocG9pbnRzLmdldEFsbG9jYXRpb24oKSk7CisgICAgICAgIHNtYi5hZGRJbmRleFNldFR5cGUoTWVzaC5QcmltaXRpdmUuUE9JTlQpOworICAgICAgICBNZXNoIHNtID0gc21iLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19mb3VudGFpbihtUlMsIG1SZXMsIFIucmF3LmZvdW50YWluKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfcGFydE1lc2goc20pOworICAgICAgICBtU2NyaXB0LmJpbmRfcG9pbnQocG9pbnRzKTsKKyAgICAgICAgbVJTLmJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KKworICAgIGJvb2xlYW4gaG9sZGluZ0NvbG9yW10gPSBuZXcgYm9vbGVhblsxMF07CisgICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBwcmVzc3VyZSwgaW50IGlkKSB7CisgICAgICAgIGlmIChpZCA+PSBob2xkaW5nQ29sb3IubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IHJhdGUgPSAoaW50KShwcmVzc3VyZSAqIHByZXNzdXJlICogNTAwLmYpOworICAgICAgICBpZiAocmF0ZSA+IDUwMCkgeworICAgICAgICAgICAgcmF0ZSA9IDUwMDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmF0ZSA+IDApIHsKKyAgICAgICAgICAgIG1TY3JpcHQuaW52b2tlX2FkZFBhcnRpY2xlcyhyYXRlLCB4LCB5LCBpZCwgIWhvbGRpbmdDb2xvcltpZF0pOworICAgICAgICAgICAgaG9sZGluZ0NvbG9yW2lkXSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBob2xkaW5nQ29sb3JbaWRdID0gZmFsc2U7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjM3NmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5mb3VudGFpbl92MTE7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgRm91bnRhaW5WaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgRm91bnRhaW5WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBGb3VudGFpblJTIG1SZW5kZXI7CisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnIHNjID0gbmV3IFJlbmRlclNjcmlwdEdMLlN1cmZhY2VDb25maWcoKTsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdEdMKHNjKTsKKyAgICAgICAgICAgIG1SUy5zZXRTdXJmYWNlKGhvbGRlciwgdywgaCk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IEZvdW50YWluUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZiAobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0R0woKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbk1hc2tlZCgpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgeworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIGV2LmdldFBvaW50ZXJJZCgwKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0ID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAvLyBvbmx5IG9uZSBwb2ludGVyIGdvaW5nIHVwLCB3ZSBjYW4gZ2V0IHRoZSBpbmRleCBsaWtlIHRoaXMKKyAgICAgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5nZXRBY3Rpb25JbmRleCgpOworICAgICAgICAgICAgaW50IHBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChwb2ludGVySW5kZXgpOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIHBvaW50ZXJJZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvdW50ID0gZXYuZ2V0SGlzdG9yeVNpemUoKTsKKyAgICAgICAgaW50IHBjb3VudCA9IGV2LmdldFBvaW50ZXJDb3VudCgpOworCisgICAgICAgIGZvciAoaW50IHA9MDsgcCA8IHBjb3VudDsgcCsrKSB7CisgICAgICAgICAgICBpbnQgaWQgPSBldi5nZXRQb2ludGVySWQocCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oZXYuZ2V0WChwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRZKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldFByZXNzdXJlKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbihldi5nZXRIaXN0b3JpY2FsWChwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0SGlzdG9yaWNhbFkocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldEhpc3RvcmljYWxQcmVzc3VyZShwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluX3YxMS5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpbl92MTEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzA3YjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpbl92MTEuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5mb3VudGFpbl92MTE7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworcHVibGljIGNsYXNzIEZvdW50YWluX3YxMSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gImxpYlJTX2puaSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19FTkFCTEVEID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOworCisgICAgcHJpdmF0ZSBGb3VudGFpblZpZXcgbVZpZXc7CisKKyAgICAvLyBnZXQgdGhlIGN1cnJlbnQgbG9vcGVyIChmcm9tIHlvdXIgQWN0aXZpdHkgVUkgdGhyZWFkIGZvciBpbnN0YW5jZQorCisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBGb3VudGFpblZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgTG9nLmUoInJzIiwgIm9uUmVzdW1lIik7CisKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3LnJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIExvZy5lKCJycyIsICJvblBhdXNlIik7CisKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcucGF1c2UoKTsKKworCisKKyAgICAgICAgLy9SdW50aW1lLmdldFJ1bnRpbWUoKS5leGl0KDApOworICAgIH0KKworCisgICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGlmIChMT0dfRU5BQkxFRCkgeworICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL2ZvdW50YWluLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9mb3VudGFpbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjZjODlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9mb3VudGFpbi5ycwpAQCAtMCwwICsxLDY5IEBACisvLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQuZm91bnRhaW5fdjExKQorCisjcHJhZ21hIHN0YXRlRnJhZ21lbnQocGFyZW50KQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCitzdGF0aWMgaW50IG5ld1BhcnQgPSAwOworcnNfbWVzaCBwYXJ0TWVzaDsKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgUG9pbnQgeworICAgIGZsb2F0MiBkZWx0YTsKKyAgICBmbG9hdDIgcG9zaXRpb247CisgICAgdWNoYXI0IGNvbG9yOworfSBQb2ludF90OworUG9pbnRfdCAqcG9pbnQ7CisKK2ludCByb290KCkgeworICAgIGZsb2F0IGR0ID0gbWluKHJzR2V0RHQoKSwgMC4xZik7CisgICAgcnNnQ2xlYXJDb2xvcigwLmYsIDAuZiwgMC5mLCAxLmYpOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworICAgIGNvbnN0IGludCBzaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChyc0dldEFsbG9jYXRpb24ocG9pbnQpKTsKKyAgICBmbG9hdCBkeTIgPSBkdCAqICgxMC5mKTsKKyAgICBQb2ludF90ICogcCA9IHBvaW50OworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgc2l6ZTsgY3QrKykgeworICAgICAgICBwLT5kZWx0YS55ICs9IGR5MjsKKyAgICAgICAgcC0+cG9zaXRpb24gKz0gcC0+ZGVsdGE7CisgICAgICAgIGlmICgocC0+cG9zaXRpb24ueSA+IGhlaWdodCkgJiYgKHAtPmRlbHRhLnkgPiAwKSkgeworICAgICAgICAgICAgcC0+ZGVsdGEueSAqPSAtMC4zZjsKKyAgICAgICAgfQorICAgICAgICBwKys7CisgICAgfQorCisgICAgcnNnRHJhd01lc2gocGFydE1lc2gpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgZmxvYXQ0IHBhcnRDb2xvclsxMF07Cit2b2lkIGFkZFBhcnRpY2xlcyhpbnQgcmF0ZSwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGluZGV4LCBib29sIG5ld0NvbG9yKQoreworICAgIGlmIChuZXdDb2xvcikgeworICAgICAgICBwYXJ0Q29sb3JbaW5kZXhdLnggPSByc1JhbmQoMC41ZiwgMS4wZik7CisgICAgICAgIHBhcnRDb2xvcltpbmRleF0ueSA9IHJzUmFuZCgxLjBmKTsKKyAgICAgICAgcGFydENvbG9yW2luZGV4XS56ID0gcnNSYW5kKDEuMGYpOworICAgIH0KKyAgICBmbG9hdCByTWF4ID0gKChmbG9hdClyYXRlKSAqIDAuMDJmOworICAgIGludCBzaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChyc0dldEFsbG9jYXRpb24ocG9pbnQpKTsKKyAgICB1Y2hhcjQgYyA9IHJzUGFja0NvbG9yVG84ODg4KHBhcnRDb2xvcltpbmRleF0pOworCisgICAgUG9pbnRfdCAqIG5wID0gJnBvaW50W25ld1BhcnRdOworICAgIGZsb2F0MiBwID0ge3gsIHl9OworICAgIHdoaWxlIChyYXRlLS0pIHsKKyAgICAgICAgZmxvYXQgYW5nbGUgPSByc1JhbmQoMy4xNGYgKiAyLmYpOworICAgICAgICBmbG9hdCBsZW4gPSByc1JhbmQock1heCk7CisgICAgICAgIG5wLT5kZWx0YS54ID0gbGVuICogc2luKGFuZ2xlKTsKKyAgICAgICAgbnAtPmRlbHRhLnkgPSBsZW4gKiBjb3MoYW5nbGUpOworICAgICAgICBucC0+cG9zaXRpb24gPSBwOworICAgICAgICBucC0+Y29sb3IgPSBjOworICAgICAgICBuZXdQYXJ0Kys7CisgICAgICAgIG5wKys7CisgICAgICAgIGlmIChuZXdQYXJ0ID49IHNpemUpIHsKKyAgICAgICAgICAgIG5ld1BhcnQgPSAwOworICAgICAgICAgICAgbnAgPSAmcG9pbnRbbmV3UGFydF07CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvcmVzL3Jhdy9kaWZmdXNlX2xpZ2h0cy5nbHNsIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9yZXMvcmF3L2RpZmZ1c2VfbGlnaHRzLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5M2UxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvcmVzL3Jhdy9kaWZmdXNlX2xpZ2h0cy5nbHNsCkBAIC0wLDAgKzEsMjIgQEAKK3ZhcnlpbmcgdmVjMyB2YXJXb3JsZFBvczsKK3ZhcnlpbmcgdmVjMyB2YXJXb3JsZE5vcm1hbDsKK3ZhcnlpbmcgdmVjMiB2YXJUZXgwOworCit2b2lkIG1haW4oKSB7CisKKyAgIHZlYzMgViA9IG5vcm1hbGl6ZShVTklfY2FtZXJhUG9zLnh5eiAtIHZhcldvcmxkUG9zLnh5eik7CisgICB2ZWMzIHdvcmxkTm9ybSA9IG5vcm1hbGl6ZSh2YXJXb3JsZE5vcm1hbCk7CisKKyAgIHZlYzMgbGlnaHQwVmVjID0gbm9ybWFsaXplKFVOSV9saWdodFBvc18wLnh5eiAtIHZhcldvcmxkUG9zLnh5eik7CisgICBmbG9hdCBsaWdodDBfRGlmZnVzZSA9IGNsYW1wKGRvdCh3b3JsZE5vcm0sIGxpZ2h0MFZlYyksIDAuMCwgMS4wKTsKKworICAgdmVjMyBsaWdodDFWZWMgPSBub3JtYWxpemUoVU5JX2xpZ2h0UG9zXzEueHl6IC0gdmFyV29ybGRQb3MueHl6KTsKKyAgIGZsb2F0IGxpZ2h0MV9EaWZmdXNlID0gY2xhbXAoZG90KHdvcmxkTm9ybSwgbGlnaHQxVmVjKSwgMC4wLCAxLjApOworCisgICB2ZWMyIHQwID0gdmFyVGV4MC54eTsKKyAgIGxvd3AgdmVjNCBjb2wgPSBVTklfZGlmZnVzZTsKKyAgIGNvbC54eXogPSBjb2wueHl6ICogKGxpZ2h0MF9EaWZmdXNlICogVU5JX2xpZ2h0Q29sb3JfMC54eXogKworICAgICAgICAgICAgICAgICAgICAgICAgbGlnaHQxX0RpZmZ1c2UgKiBVTklfbGlnaHRDb2xvcl8xLnh5eik7CisgICBnbF9GcmFnQ29sb3IgPSBjb2w7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvcmVzL3Jhdy9zaGFkZXIydi5nbHNsIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9yZXMvcmF3L3NoYWRlcjJ2Lmdsc2wKaW5kZXggMWVhMjM0Zi4uNzkxMGE1NCAxMDA2NDQKLS0tIGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9yZXMvcmF3L3NoYWRlcjJ2Lmdsc2wKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9yZXMvcmF3L3NoYWRlcjJ2Lmdsc2wKQEAgLTEsMyArMSw4IEBACisvKgorICAgIHJzX21hdHJpeDR4NCBtb2RlbDsKKyAgICByc19tYXRyaXg0eDQgdmlld1Byb2o7CisqLworCiB2YXJ5aW5nIHZlYzMgdmFyV29ybGRQb3M7CiB2YXJ5aW5nIHZlYzMgdmFyV29ybGROb3JtYWw7CiB2YXJ5aW5nIHZlYzIgdmFyVGV4MDsKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvU2ltcGxlQXBwVmlldy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9zcmMvY29tL2FuZHJvaWQvdGVzdGFwcC9TaW1wbGVBcHBWaWV3LmphdmEKaW5kZXggMDUzZTU0NS4uMjExMjE4MSAxMDA2NDQKLS0tIGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9zcmMvY29tL2FuZHJvaWQvdGVzdGFwcC9TaW1wbGVBcHBWaWV3LmphdmEKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9zcmMvY29tL2FuZHJvaWQvdGVzdGFwcC9TaW1wbGVBcHBWaWV3LmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKICAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CiAgICAgICAgICAgICBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnIHNjID0gbmV3IFJlbmRlclNjcmlwdEdMLlN1cmZhY2VDb25maWcoKTsKICAgICAgICAgICAgIHNjLnNldERlcHRoKDE2LCAyNCk7CisgICAgICAgICAgICBzYy5zZXRTYW1wbGVzKDEsIDIsIDEpOwogICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0R0woc2MpOwogICAgICAgICAgICAgbVJTLnNldFN1cmZhY2UoaG9sZGVyLCB3LCBoKTsKICAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgU2ltcGxlQXBwUlMoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvVGVzdEFwcFJTLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3NyYy9jb20vYW5kcm9pZC90ZXN0YXBwL1Rlc3RBcHBSUy5qYXZhCmluZGV4IGYxNTllODUuLjNhYTgwZjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvVGVzdEFwcFJTLmphdmEKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9zcmMvY29tL2FuZHJvaWQvdGVzdGFwcC9UZXN0QXBwUlMuamF2YQpAQCAtNjUsNiArNjUsNyBAQAogICAgIC8vIFNoYWRlcnMKICAgICBwcml2YXRlIEZyYWdtZW50U2hhZGVyIG1QYWludEY7CiAgICAgcHJpdmF0ZSBGcmFnbWVudFNoYWRlciBtTGlnaHRzRjsKKyAgICBwcml2YXRlIEZyYWdtZW50U2hhZGVyIG1MaWdodHNEaWZmRjsKICAgICBwcml2YXRlIEZyYWdtZW50U2hhZGVyIG1BbHVtaW51bUY7CiAgICAgcHJpdmF0ZSBGcmFnbWVudFNoYWRlciBtUGxhc3RpY0Y7CiAgICAgcHJpdmF0ZSBGcmFnbWVudFNoYWRlciBtRGlmZnVzZUY7CkBAIC0xNzMsNiArMTc0LDExIEBACiAgICAgICAgIGZiLnNldFNoYWRlcihtUmVzLCBSLnJhdy5wbGFzdGljX2xpZ2h0cyk7CiAgICAgICAgIG1MaWdodHNGID0gZmIuY3JlYXRlKCk7CiAKKyAgICAgICAgZmIgPSBuZXcgRnJhZ21lbnRTaGFkZXIuQnVpbGRlcihtUlMpOworICAgICAgICBmYi5zZXRPYmplY3RDb25zdChsaWdodFBhcmFtcy5nZXRBbGxvY2F0aW9uKCkuZ2V0VHlwZSgpKTsKKyAgICAgICAgZmIuc2V0U2hhZGVyKG1SZXMsIFIucmF3LmRpZmZ1c2VfbGlnaHRzKTsKKyAgICAgICAgbUxpZ2h0c0RpZmZGID0gZmIuY3JlYXRlKCk7CisKICAgICAgICAgRnVsbHNjcmVlbkJsdXIuaW5pdFNoYWRlcnMobVJlcywgbVJTKTsKICAgICB9CiAKQEAgLTIwMyw2ICsyMDksNyBAQAogICAgIHByaXZhdGUgdm9pZCBhZGRTaGFkZXJzVG9TY2VuZSgpIHsKICAgICAgICAgbUFjdGl2ZVNjZW5lLmFwcGVuZFNoYWRlcihtUGFpbnRGKTsKICAgICAgICAgbUFjdGl2ZVNjZW5lLmFwcGVuZFNoYWRlcihtTGlnaHRzRik7CisgICAgICAgIG1BY3RpdmVTY2VuZS5hcHBlbmRTaGFkZXIobUxpZ2h0c0RpZmZGKTsKICAgICAgICAgbUFjdGl2ZVNjZW5lLmFwcGVuZFNoYWRlcihtQWx1bWludW1GKTsKICAgICAgICAgbUFjdGl2ZVNjZW5lLmFwcGVuZFNoYWRlcihtUGxhc3RpY0YpOwogICAgICAgICBtQWN0aXZlU2NlbmUuYXBwZW5kU2hhZGVyKG1EaWZmdXNlRik7CkBAIC0yMTksOCArMjI2LDEyIEBACiAgICAgICAgIFJlbmRlclN0YXRlIHBhaW50ID0gbmV3IFJlbmRlclN0YXRlKG1HZW5lcmljViwgbVBhaW50RiwgbnVsbCwgbnVsbCk7CiAgICAgICAgIFJlbmRlclN0YXRlIGFsdW1pbnVtID0gbmV3IFJlbmRlclN0YXRlKG1HZW5lcmljViwgbUFsdW1pbnVtRiwgbnVsbCwgbnVsbCk7CiAgICAgICAgIFJlbmRlclN0YXRlIGxpZ2h0cyA9IG5ldyBSZW5kZXJTdGF0ZShtR2VuZXJpY1YsIG1MaWdodHNGLCBudWxsLCBudWxsKTsKKyAgICAgICAgUmVuZGVyU3RhdGUgZGlmZl9saWdodHMgPSBuZXcgUmVuZGVyU3RhdGUobUdlbmVyaWNWLCBtTGlnaHRzRGlmZkYsIG51bGwsIG51bGwpOworICAgICAgICBSZW5kZXJTdGF0ZSBkaWZmX2xpZ2h0c19ub19jdWxsID0gbmV3IFJlbmRlclN0YXRlKG1HZW5lcmljViwgbUxpZ2h0c0RpZmZGLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIuQ1VMTF9OT05FKG1SUykpOwogICAgICAgICBSZW5kZXJTdGF0ZSBnbGFzc1RyYW5zcCA9IG5ldyBSZW5kZXJTdGF0ZShtR2VuZXJpY1YsIG1QYWludEYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CTEVORF9BTFBIQV9ERVBUSF9URVNUKG1SUyksIG51bGwpOworICAgICAgICBSZW5kZXJTdGF0ZSB0ZXhTdGF0ZSA9IG5ldyBSZW5kZXJTdGF0ZShtR2VuZXJpY1YsIG1UZXh0dXJlRiwgbnVsbCwgbnVsbCk7CiAKICAgICAgICAgaW5pdFJlbmRlclBhc3NlcygpOwogCkBAIC0yMzksMTAgKzI1MCwxMiBAQAogICAgICAgICBtQWN0aXZlU2NlbmUuYXNzaWduUmVuZGVyU3RhdGVUb01hdGVyaWFsKGdsYXNzVHJhbnNwLCAiXkdsYXNzTGlnaHQiKTsKIAogICAgICAgICBtQWN0aXZlU2NlbmUuYXNzaWduUmVuZGVyU3RhdGVUb01hdGVyaWFsKGxpZ2h0cywgIl5MaWdodEJsaW5uIik7CisgICAgICAgIG1BY3RpdmVTY2VuZS5hc3NpZ25SZW5kZXJTdGF0ZVRvTWF0ZXJpYWwoZGlmZl9saWdodHMsICJeTGlnaHRMYW1iZXJ0Iik7CisgICAgICAgIG1BY3RpdmVTY2VuZS5hc3NpZ25SZW5kZXJTdGF0ZVRvTWF0ZXJpYWwoZGlmZl9saWdodHNfbm9fY3VsbCwgIl5MaWdodExhbWJlcnROb0N1bGwiKTsKKyAgICAgICAgbUFjdGl2ZVNjZW5lLmFzc2lnblJlbmRlclN0YXRlVG9NYXRlcmlhbCh0ZXhTdGF0ZSwgIl5UZXh0dXJlT25seSIpOwogCiAgICAgICAgIFJlbmRlcmFibGUgcGxhbmUgPSAoUmVuZGVyYWJsZSltQWN0aXZlU2NlbmUuZ2V0UmVuZGVyYWJsZUJ5TmFtZSgicFBsYW5lU2hhcGUxIik7CiAgICAgICAgIGlmIChwbGFuZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSZW5kZXJTdGF0ZSB0ZXhTdGF0ZSA9IG5ldyBSZW5kZXJTdGF0ZShtR2VuZXJpY1YsIG1UZXh0dXJlRiwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICBwbGFuZS5zZXRSZW5kZXJTdGF0ZSh0ZXhTdGF0ZSk7CiAgICAgICAgICAgICBwbGFuZS5zZXRWaXNpYmxlKCFtVXNlQmx1cik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvVGVzdEFwcFZpZXcuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvVGVzdEFwcFZpZXcuamF2YQppbmRleCA2ODdmMzViLi4zM2NhMWI4IDEwMDY0NAotLS0gYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3NyYy9jb20vYW5kcm9pZC90ZXN0YXBwL1Rlc3RBcHBWaWV3LmphdmEKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9zcmMvY29tL2FuZHJvaWQvdGVzdGFwcC9UZXN0QXBwVmlldy5qYXZhCkBAIC01OSw2ICs1OSw3IEBACiAgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgewogICAgICAgICAgICAgUmVuZGVyU2NyaXB0R0wuU3VyZmFjZUNvbmZpZyBzYyA9IG5ldyBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnKCk7CiAgICAgICAgICAgICBzYy5zZXREZXB0aCgxNiwgMjQpOworICAgICAgICAgICAgc2Muc2V0U2FtcGxlcygxLCAyLCAxKTsKICAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdEdMKHNjKTsKICAgICAgICAgICAgIG1SUy5zZXRTdXJmYWNlKGhvbGRlciwgdywgaCk7CiAgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFRlc3RBcHBSUygpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9zcmMvY29tL2FuZHJvaWQvdGVzdGFwcC9Ub3VjaEhhbmRsZXIuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvVG91Y2hIYW5kbGVyLmphdmEKaW5kZXggZTI3MmNjNS4uZDBmOTc5NyAxMDA2NDQKLS0tIGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9zcmMvY29tL2FuZHJvaWQvdGVzdGFwcC9Ub3VjaEhhbmRsZXIuamF2YQorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3NyYy9jb20vYW5kcm9pZC90ZXN0YXBwL1RvdWNoSGFuZGxlci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAgICAgcHVibGljIHZvaWQgaW5pdChTY2VuZSBzY2VuZSkgewogICAgICAgICAvLyBTb21lIGluaXRpYWwgdmFsdWVzIGZvciBjYW1lcmEgcG9zaXRpb24KICAgICAgICAgbVJvdGF0ZVhWYWx1ZSA9IC0yMDsKLSAgICAgICAgbVJvdGF0ZVlWYWx1ZSA9IDQ1OworICAgICAgICBtUm90YXRlWVZhbHVlID0gMDsKICAgICAgICAgbURpc3RWYWx1ZSA9IG5ldyBGbG9hdDMoMCwgMCwgNDUpOwogICAgICAgICBtUG9zVmFsdWUgPSBuZXcgRmxvYXQzKDAsIDQsIDApOwogCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvQW5kcm9pZC5tayBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTQyOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gUlNUZXN0X3YxMQorTE9DQUxfU0RLX1ZFUlNJT04gOj0gMTEKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YWVkYTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5ycy50ZXN0X3YxMSI+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMTEiIC8+CisgICAgPGFwcGxpY2F0aW9uIAorICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUlNfVGVzdF92MTEiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL3Rlc3RfcGF0dGVybiI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlJTVGVzdF92MTEiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkMTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Q29yZS5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODhjZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworCisKK3B1YmxpYyBjbGFzcyBSU1Rlc3RDb3JlIHsKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworICAgIENvbnRleHQgbUN0eDsKKworICAgIHB1YmxpYyBSU1Rlc3RDb3JlKENvbnRleHQgY3R4KSB7CisgICAgICAgIG1DdHggPSBjdHg7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKworICAgIHByaXZhdGUgRm9udCBtRm9udDsKKyAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MgbUxpc3RBbGxvY3M7CisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworICAgIHByaXZhdGUgU2NyaXB0Q19yc2xpc3QgbVNjcmlwdDsKKworICAgIHByaXZhdGUgQXJyYXlMaXN0PFVuaXRUZXN0PiB1bml0VGVzdHM7CisgICAgcHJpdmF0ZSBMaXN0SXRlcmF0b3I8VW5pdFRlc3Q+IHRlc3RfaXRlcjsKKyAgICBwcml2YXRlIFVuaXRUZXN0IGFjdGl2ZVRlc3Q7CisgICAgcHJpdmF0ZSBib29sZWFuIHN0b3BUZXN0aW5nOworCisgICAgLyogUGVyaW9kaWMgdGltZXIgZm9yIGVuc3VyaW5nIGZ1dHVyZSB0ZXN0cyBnZXQgc2NoZWR1bGVkICovCisgICAgcHJpdmF0ZSBUaW1lciBtVGltZXI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlNfVElNRVJfUEVSSU9EID0gMTAwOworCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgc3RvcFRlc3RpbmcgPSBmYWxzZTsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfcnNsaXN0KG1SUywgbVJlcywgUi5yYXcucnNsaXN0KTsKKworICAgICAgICB1bml0VGVzdHMgPSBuZXcgQXJyYXlMaXN0PFVuaXRUZXN0PigpOworCisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX3ByaW1pdGl2ZXModGhpcywgbVJlcywgbUN0eCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF9yc2RlYnVnKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfcnN0aW1lKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfcnN0eXBlcyh0aGlzLCBtUmVzLCBtQ3R4KSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX21hdGgodGhpcywgbVJlcywgbUN0eCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF9mcF9tYWQodGhpcywgbVJlcywgbUN0eCkpOworICAgICAgICAvKgorICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVbml0VGVzdChudWxsLCAiPFBhc3M+IiwgMSkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVbml0VGVzdCgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVW5pdFRlc3QobnVsbCwgIjxGYWlsPiIsIC0xKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVbml0VGVzdChudWxsLCAiPFBhc3M+IiwgMSkpOworICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgVW5pdFRlc3QgW10gdXRhID0gbmV3IFVuaXRUZXN0W3VuaXRUZXN0cy5zaXplKCldOworICAgICAgICB1dGEgPSB1bml0VGVzdHMudG9BcnJheSh1dGEpOworCisgICAgICAgIG1MaXN0QWxsb2NzID0gbmV3IFNjcmlwdEZpZWxkX0xpc3RBbGxvY3NfcyhtUlMsIHV0YS5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHV0YS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0gbGlzdEVsZW0gPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0oKTsKKyAgICAgICAgICAgIGxpc3RFbGVtLnRleHQgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21TdHJpbmcobVJTLCB1dGFbaV0ubmFtZSwgQWxsb2NhdGlvbi5VU0FHRV9TQ1JJUFQpOworICAgICAgICAgICAgbGlzdEVsZW0ucmVzdWx0ID0gdXRhW2ldLnJlc3VsdDsKKyAgICAgICAgICAgIG1MaXN0QWxsb2NzLnNldChsaXN0RWxlbSwgaSwgZmFsc2UpOworICAgICAgICAgICAgdXRhW2ldLnNldEl0ZW0obGlzdEVsZW0pOworICAgICAgICB9CisKKyAgICAgICAgbUxpc3RBbGxvY3MuY29weUFsbCgpOworCisgICAgICAgIG1TY3JpcHQuYmluZF9nTGlzdChtTGlzdEFsbG9jcyk7CisKKyAgICAgICAgbUZvbnQgPSBGb250LmNyZWF0ZShtUlMsIG1SZXMsICJzZXJpZiIsIEZvbnQuU3R5bGUuQk9MRCwgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250KG1Gb250KTsKKworICAgICAgICBtUlMuYmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisKKyAgICAgICAgdGVzdF9pdGVyID0gdW5pdFRlc3RzLmxpc3RJdGVyYXRvcigpOworICAgICAgICByZWZyZXNoVGVzdFJlc3VsdHMoKTsgLyogS2ljayBvZmYgdGhlIGZpcnN0IHRlc3QgKi8KKworICAgICAgICBUaW1lclRhc2sgcFRhc2sgPSBuZXcgVGltZXJUYXNrKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHJlZnJlc2hUZXN0UmVzdWx0cygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG1UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICBtVGltZXIuc2NoZWR1bGUocFRhc2ssIFJTX1RJTUVSX1BFUklPRCwgUlNfVElNRVJfUEVSSU9EKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjaGVja0FuZFJ1bk5leHRUZXN0KCkgeworICAgICAgICBpZiAoYWN0aXZlVGVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWFjdGl2ZVRlc3QuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgLyogUHJvcGVybHkgY2xlYW4gdXAgb24gb3VyIGxhc3QgdGVzdCAqLworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRlc3Quam9pbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY3RpdmVUZXN0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3RvcFRlc3RpbmcgJiYgYWN0aXZlVGVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAodGVzdF9pdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGFjdGl2ZVRlc3QgPSB0ZXN0X2l0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGFjdGl2ZVRlc3Quc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIHJvdXRpbmUgd2lsbCBvbmx5IGdldCBjYWxsZWQgb25jZSB3aGVuIGEgbmV3IHRlc3QKKyAgICAgICAgICAgICAgICAgKiBzaG91bGQgc3RhcnQgcnVubmluZy4gVGhlIG1lc3NhZ2UgaGFuZGxlciBpbiBVbml0VGVzdC5qYXZhCisgICAgICAgICAgICAgICAgICogZW5zdXJlcyB0aGlzLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lci5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVyLnB1cmdlKCk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmcmVzaFRlc3RSZXN1bHRzKCkgeworICAgICAgICBjaGVja0FuZFJ1bk5leHRUZXN0KCk7CisKKyAgICAgICAgaWYgKG1MaXN0QWxsb2NzICE9IG51bGwgJiYgbVNjcmlwdCAhPSBudWxsICYmIG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdEFsbG9jcy5jb3B5QWxsKCk7CisKKyAgICAgICAgICAgIG1TY3JpcHQuYmluZF9nTGlzdChtTGlzdEFsbG9jcyk7CisgICAgICAgICAgICBtUlMuYmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeworICAgICAgICBzdG9wVGVzdGluZyA9IHRydWU7CisgICAgICAgIFVuaXRUZXN0IHQgPSBhY3RpdmVUZXN0OworCisgICAgICAgIC8qIFN0b3AgcGVyaW9kaWMgcmVmcmVzaCBvZiB0ZXN0aW5nICovCisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgbVRpbWVyLnB1cmdlKCk7CisgICAgICAgICAgICBtVGltZXIgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyogV2FpdCB0byBleGl0IHVudGlsIHdlIGZpbmlzaCB0aGUgY3VycmVudCB0ZXN0ICovCisgICAgICAgIGlmICh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdCA9IG51bGw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5ld1RvdWNoUG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcHJlc3N1cmUsIGludCBpZCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uRG93bihpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0RZKDAuMGYpOworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgICAgICByZWZyZXNoVGVzdFJlc3VsdHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbk1vdmUoaW50IHgsIGludCB5KSB7CisgICAgICAgIGludCBkeCA9IG1MYXN0WCAtIHg7CisgICAgICAgIGludCBkeSA9IG1MYXN0WSAtIHk7CisKKyAgICAgICAgaWYgKE1hdGguYWJzKGR5KSA8PSAyKSB7CisgICAgICAgICAgICBkeSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtU2NyaXB0LnNldF9nRFkoZHkpOworCisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgICAgIHJlZnJlc2hUZXN0UmVzdWx0cygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RWaWV3LmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YmViZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjExOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFJTVGVzdFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ3R4OworCisgICAgcHVibGljIFJTVGVzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBtQ3R4ID0gY29udGV4dDsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBSU1Rlc3RDb3JlIG1SZW5kZXI7CisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnIHNjID0gbmV3IFJlbmRlclNjcmlwdEdMLlN1cmZhY2VDb25maWcoKTsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdEdMKHNjKTsKKyAgICAgICAgICAgIG1SUy5zZXRTdXJmYWNlKGhvbGRlciwgdywgaCk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFJTVGVzdENvcmUobUN0eCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW5kZXIuY2xlYW51cCgpOworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHRHTCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKKyAgICB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fRE9XTikgeworICAgICAgICAgICAgbVJlbmRlci5vbkFjdGlvbkRvd24oKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYWN0ID09IGV2LkFDVElPTl9NT1ZFKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uTW92ZSgoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdF92MTEuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RfdjExLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlZGZjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RfdjExLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTE7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworcHVibGljIGNsYXNzIFJTVGVzdF92MTEgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgLy9FdmVudExpc3RlbmVyIG1MaXN0ZW5lciA9IG5ldyBFdmVudExpc3RlbmVyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJsaWJSU19qbmkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dfRU5BQkxFRCA9IERFQlVHID8gQ29uZmlnLkxPR0QgOiBDb25maWcuTE9HVjsKKworICAgIHByaXZhdGUgUlNUZXN0VmlldyBtVmlldzsKKworICAgIC8vIGdldCB0aGUgY3VycmVudCBsb29wZXIgKGZyb20geW91ciBBY3Rpdml0eSBVSSB0aHJlYWQgZm9yIGluc3RhbmNlCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgUlNUZXN0Vmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5yZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3LnBhdXNlKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGlmIChMT0dfRU5BQkxFRCkgeworICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2ZwX21hZC5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2ZwX21hZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzJhYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfZnBfbWFkLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfZnBfbWFkIGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisKKyAgICBwcm90ZWN0ZWQgVVRfZnBfbWFkKFJTVGVzdENvcmUgcnN0YywgUmVzb3VyY2VzIHJlcywgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIocnN0YywgIkZwX01hZCIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZShtQ3R4KTsKKyAgICAgICAgU2NyaXB0Q19mcF9tYWQgcyA9IG5ldyBTY3JpcHRDX2ZwX21hZChwUlMsIG1SZXMsIFIucmF3LmZwX21hZCk7CisgICAgICAgIHBSUy5zZXRNZXNzYWdlSGFuZGxlcihtUnNNZXNzYWdlKTsKKyAgICAgICAgcy5pbnZva2VfZnBfbWFkX3Rlc3QoMCwgMCk7CisgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfbWF0aC5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX21hdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTM1NmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX21hdGguamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxMTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CisKK3B1YmxpYyBjbGFzcyBVVF9tYXRoIGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisKKyAgICBwcm90ZWN0ZWQgVVRfbWF0aChSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJNYXRoIiwgY3R4KTsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBwUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKG1DdHgpOworICAgICAgICBTY3JpcHRDX21hdGggcyA9IG5ldyBTY3JpcHRDX21hdGgocFJTLCBtUmVzLCBSLnJhdy5tYXRoKTsKKyAgICAgICAgcFJTLnNldE1lc3NhZ2VIYW5kbGVyKG1Sc01lc3NhZ2UpOworICAgICAgICBzLmludm9rZV9tYXRoX3Rlc3QoMCwgMCk7CisgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcHJpbWl0aXZlcy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3ByaW1pdGl2ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzNlZmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3ByaW1pdGl2ZXMuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfcHJpbWl0aXZlcyBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX3ByaW1pdGl2ZXMoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzLCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihyc3RjLCAiUHJpbWl0aXZlcyIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVHbG9iYWxzKFNjcmlwdENfcHJpbWl0aXZlcyBzKSB7CisgICAgICAgIGZsb2F0IHBGID0gcy5nZXRfZmxvYXRUZXN0KCk7CisgICAgICAgIGlmIChwRiAhPSAxLjk5ZikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X2Zsb2F0VGVzdCgyLjk5Zik7CisKKyAgICAgICAgZG91YmxlIHBEID0gcy5nZXRfZG91YmxlVGVzdCgpOworICAgICAgICBpZiAocEQgIT0gMi4wNSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X2RvdWJsZVRlc3QoMy4wNSk7CisKKyAgICAgICAgYnl0ZSBwQyA9IHMuZ2V0X2NoYXJUZXN0KCk7CisgICAgICAgIGlmIChwQyAhPSAtOCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X2NoYXJUZXN0KChieXRlKS0xNik7CisKKyAgICAgICAgc2hvcnQgcFMgPSBzLmdldF9zaG9ydFRlc3QoKTsKKyAgICAgICAgaWYgKHBTICE9IC0xNikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X3Nob3J0VGVzdCgoc2hvcnQpLTMyKTsKKworICAgICAgICBpbnQgcEkgPSBzLmdldF9pbnRUZXN0KCk7CisgICAgICAgIGlmIChwSSAhPSAtMzIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF9pbnRUZXN0KC02NCk7CisKKyAgICAgICAgbG9uZyBwTCA9IHMuZ2V0X2xvbmdUZXN0KCk7CisgICAgICAgIGlmIChwTCAhPSAxNzE3OTg2OTE4NGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF9sb25nVGVzdCgxNzE3OTg2OTE4NWwpOworCisgICAgICAgIGxvbmcgcHVMID0gcy5nZXRfdWxvbmdUZXN0KCk7CisgICAgICAgIGlmIChwdUwgIT0gNDYxMTY4NjAxODQyNzM4NzkwNEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF91bG9uZ1Rlc3QoNDYxMTY4NjAxODQyNzM4NzkwM0wpOworCisKKyAgICAgICAgbG9uZyBwTEwgPSBzLmdldF9sb25nbG9uZ1Rlc3QoKTsKKyAgICAgICAgaWYgKHBMTCAhPSA2ODcxOTQ3NjczNkwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF9sb25nbG9uZ1Rlc3QoNjg3MTk0NzY3MzVMKTsKKworICAgICAgICBsb25nIHB1NjQgPSBzLmdldF91aW50NjRfdFRlc3QoKTsKKyAgICAgICAgaWYgKHB1NjQgIT0gMTE3MTc5ODY5MTg0bCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X3VpbnQ2NF90VGVzdCgxMTcxNzk4NjkxODVsKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBwUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKG1DdHgpOworICAgICAgICBTY3JpcHRDX3ByaW1pdGl2ZXMgcyA9IG5ldyBTY3JpcHRDX3ByaW1pdGl2ZXMocFJTLCBtUmVzLCBSLnJhdy5wcmltaXRpdmVzKTsKKyAgICAgICAgcFJTLnNldE1lc3NhZ2VIYW5kbGVyKG1Sc01lc3NhZ2UpOworICAgICAgICBpZiAoIWluaXRpYWxpemVHbG9iYWxzKHMpKSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplR2xvYmFscyBmYWlsZWQKKyAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy5pbnZva2VfcHJpbWl0aXZlc190ZXN0KDAsIDApOworICAgICAgICAgICAgcFJTLmZpbmlzaCgpOworICAgICAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBwUlMuZGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc2RlYnVnLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcnNkZWJ1Zy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZGJhZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcnNkZWJ1Zy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjExOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX3JzZGVidWcgZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKworICAgIHByb3RlY3RlZCBVVF9yc2RlYnVnKFJTVGVzdENvcmUgcnN0YywgUmVzb3VyY2VzIHJlcywgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIocnN0YywgInJzRGVidWciLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUobUN0eCk7CisgICAgICAgIFNjcmlwdENfcnNkZWJ1ZyBzID0gbmV3IFNjcmlwdENfcnNkZWJ1ZyhwUlMsIG1SZXMsIFIucmF3LnJzZGVidWcpOworICAgICAgICBwUlMuc2V0TWVzc2FnZUhhbmRsZXIobVJzTWVzc2FnZSk7CisgICAgICAgIHMuaW52b2tlX3Rlc3RfcnNkZWJ1ZygwLCAwKTsKKyAgICAgICAgcFJTLmZpbmlzaCgpOworICAgICAgICB3YWl0Rm9yTWVzc2FnZSgpOworICAgICAgICBwUlMuZGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc3RpbWUuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc3RpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjRjMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JzdGltZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjExOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX3JzdGltZSBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX3JzdGltZShSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJyc1RpbWUiLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUobUN0eCk7CisgICAgICAgIFNjcmlwdENfcnN0aW1lIHMgPSBuZXcgU2NyaXB0Q19yc3RpbWUocFJTLCBtUmVzLCBSLnJhdy5yc3RpbWUpOworICAgICAgICBwUlMuc2V0TWVzc2FnZUhhbmRsZXIobVJzTWVzc2FnZSk7CisgICAgICAgIHMuaW52b2tlX3Rlc3RfcnN0aW1lKDAsIDApOworICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JzdHlwZXMuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc3R5cGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhOTdjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc3R5cGVzLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfcnN0eXBlcyBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX3JzdHlwZXMoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzLCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihyc3RjLCAicnNUeXBlcyIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZShtQ3R4KTsKKyAgICAgICAgU2NyaXB0Q19yc3R5cGVzIHMgPSBuZXcgU2NyaXB0Q19yc3R5cGVzKHBSUywgbVJlcywgUi5yYXcucnN0eXBlcyk7CisgICAgICAgIHBSUy5zZXRNZXNzYWdlSGFuZGxlcihtUnNNZXNzYWdlKTsKKyAgICAgICAgcy5pbnZva2VfdGVzdF9yc3R5cGVzKDAsIDApOworICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VuaXRUZXN0LmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVW5pdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjJlNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VuaXRUZXN0LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjExOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdC5SU01lc3NhZ2VIYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBVbml0VGVzdCBleHRlbmRzIFRocmVhZCB7CisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBpbnQgcmVzdWx0OworICAgIHByaXZhdGUgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0gbUl0ZW07CisgICAgcHJpdmF0ZSBSU1Rlc3RDb3JlIG1SU1RDOworICAgIHByaXZhdGUgYm9vbGVhbiBtc2dIYW5kbGVkOworICAgIHByb3RlY3RlZCBDb250ZXh0IG1DdHg7CisKKyAgICAvKiBUaGVzZSBjb25zdGFudHMgbXVzdCBtYXRjaCB0aG9zZSBpbiBzaGFyZWQucnNoICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlNfTVNHX1RFU1RfUEFTU0VEID0gMTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJTX01TR19URVNUX0ZBSUxFRCA9IDEwMTsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBudW1UZXN0cyA9IDA7CisgICAgcHVibGljIGludCB0ZXN0SUQ7CisKKyAgICBwcm90ZWN0ZWQgVW5pdFRlc3QoUlNUZXN0Q29yZSByc3RjLCBTdHJpbmcgbiwgaW50IGluaXRSZXN1bHQsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIG1SU1RDID0gcnN0YzsKKyAgICAgICAgbmFtZSA9IG47CisgICAgICAgIG1zZ0hhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgbUN0eCA9IGN0eDsKKyAgICAgICAgcmVzdWx0ID0gaW5pdFJlc3VsdDsKKyAgICAgICAgdGVzdElEID0gbnVtVGVzdHMrKzsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVW5pdFRlc3QoUlNUZXN0Q29yZSByc3RjLCBTdHJpbmcgbiwgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgdGhpcyhyc3RjLCBuLCAwLCBjdHgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBVbml0VGVzdChSU1Rlc3RDb3JlIHJzdGMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHRoaXMgKHJzdGMsICI8VW5rbm93bj4iLCBjdHgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBVbml0VGVzdChDb250ZXh0IGN0eCkgeworICAgICAgICB0aGlzIChudWxsLCBjdHgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBSU01lc3NhZ2VIYW5kbGVyIG1Sc01lc3NhZ2UgPSBuZXcgUlNNZXNzYWdlSGFuZGxlcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSU19NU0dfVEVTVF9QQVNTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUlNfTVNHX1RFU1RfRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiUmVuZGVyU2NyaXB0IiwgIlVuaXQgdGVzdCBnb3QgdW5leHBlY3RlZCBtZXNzYWdlIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JdGVtLnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBtc2dIYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtUlNUQy5yZWZyZXNoVGVzdFJlc3VsdHMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSB0aGUgY2FzZSB3aGVyZSBvdXIgbWVzc2FnZSByZWNlaXZlciBoYXMgYmVlbgorICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQuIFRoaXMgaGFwcGVucyB3aGVuIHdlIGxlYXZlIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgaXQgZmluaXNoZXMgcnVubmluZyBhbGwgb2YgdGhlIHVuaXQgdGVzdHMuICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JNZXNzYWdlKCkgeworICAgICAgICB3aGlsZSAoIW1zZ0hhbmRsZWQpIHsKKyAgICAgICAgICAgIHlpZWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJdGVtKFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtIGl0ZW0pIHsKKyAgICAgICAgbUl0ZW0gPSBpdGVtOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgLyogVGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgZm9yIGVhY2ggc3ViY2xhc3MgKi8KKyAgICAgICAgaWYgKG1SU1RDICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SU1RDLnJlZnJlc2hUZXN0UmVzdWx0cygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L2ZwX21hZC5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mcF9tYWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmMmIyYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZnBfbWFkLnJzCkBAIC0wLDAgKzEsMTc0IEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworY29uc3QgaW50IFRFU1RfQ09VTlQgPSAxOworCitzdGF0aWMgZmxvYXQgZGF0YV9mMVsxMDI1XTsKK3N0YXRpYyBmbG9hdDQgZGF0YV9mNFsxMDI1XTsKKworc3RhdGljIHZvaWQgdGVzdF9tYWQ0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MSBiaWxsaW9uIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqICgxMDAwIC8gODApOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gKGRhdGFfZjRbaV0gKiAwLjAyZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSsxXSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzJdICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krM10gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzRdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs1XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krNl0gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzddICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krOF0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs5XSAqIDAuMDJmICsgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX21hZDQgTSBvcHMiLCAxMDAwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9tYWQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xIGJpbGxpb24gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogKDEwMDAgLyAyMCk7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjFbaV0gPSAoZGF0YV9mMVtpXSAqIDAuMDJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzFdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krMl0gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSszXSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krNF0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzVdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs2XSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krN10gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs4XSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzldICogMC4wMmYgKyAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfbWFkIE0gb3BzIiwgMTAwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfbm9ybSh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBub3JtYWxpemUoZGF0YV9mNFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9ub3JtIE0gb3BzIiwgMTAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NpbmNvczQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwIC8gNDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IHNpbihkYXRhX2Y0W2ldKSAqIGNvcyhkYXRhX2Y0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX3NpbmNvczQgTSBvcHMiLCAxMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2luY29zKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mMVtpXSA9IHNpbihkYXRhX2YxW2ldKSAqIGNvcyhkYXRhX2YxW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX3NpbmNvcyBNIG9wcyIsIDEwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jbGFtcCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICAvLyBEbyB+MTAwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2YxW2ldID0gY2xhbXAoZGF0YV9mMVtpXSwgLTEuZiwgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wIE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKKworICAgIHN0YXJ0KCk7CisgICAgLy8gRG8gfjEwMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGRhdGFfZjFbaV0gPCAtMS5mKSBkYXRhX2YxW2ldID0gLTEuZjsKKyAgICAgICAgICAgIGlmIChkYXRhX2YxW2ldID4gLTEuZikgZGF0YV9mMVtpXSA9IDEuZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wIHJlZiBNIG9wcyIsIDEwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY2xhbXA0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAwIC80OyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gY2xhbXAoZGF0YV9mNFtpXSwgLTEuZiwgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wNCBNIG9wcyIsIDEwMC5mIC8gdGltZSk7Cit9CisKK3ZvaWQgZnBfbWFkX3Rlc3QodWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGludCB4OworICAgIGZvciAoeD0wOyB4IDwgMTAyNTsgeCsrKSB7CisgICAgICAgIGRhdGFfZjFbeF0gPSAoeCAmIDB4ZikgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnggPSAoeCAmIDB4ZikgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnkgPSAoeCAmIDB4ZjApICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS56ID0gKHggJiAweDMzKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0udyA9ICh4ICYgMHg3NykgKiAwLjFmOworICAgIH0KKworICAgIHRlc3RfbWFkNChpbmRleCk7CisgICAgdGVzdF9tYWQoaW5kZXgpOworCisgICAgZm9yICh4PTA7IHggPCAxMDI1OyB4KyspIHsKKyAgICAgICAgZGF0YV9mMVt4XSA9ICh4ICYgMHhmKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueCA9ICh4ICYgMHhmKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueSA9ICh4ICYgMHhmMCkgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLnogPSAoeCAmIDB4MzMpICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS53ID0gKHggJiAweDc3KSAqIDAuMWYgKyAxLmY7CisgICAgfQorCisgICAgdGVzdF9ub3JtKGluZGV4KTsKKyAgICB0ZXN0X3NpbmNvczQoaW5kZXgpOworICAgIHRlc3Rfc2luY29zKGluZGV4KTsKKyAgICB0ZXN0X2NsYW1wNChpbmRleCk7CisgICAgdGVzdF9jbGFtcChpbmRleCk7CisKKyAgICAvLyBUT0RPIEFjdHVhbGx5IHZlcmlmeSB0ZXN0IHJlc3VsdCBhY2N1cmFjeQorICAgIHJzRGVidWcoImZwX21hZF90ZXN0IFBBU1NFRCIsIDApOworICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKK30KKworCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvbWF0aC5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9tYXRoLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjdiZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvbWF0aC5ycwpAQCAtMCwwICsxLDM0OCBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKKy8vIFRlc3RpbmcgbWF0aCBsaWJyYXJ5CisKK3ZvbGF0aWxlIGZsb2F0IGYxOwordm9sYXRpbGUgZmxvYXQyIGYyOwordm9sYXRpbGUgZmxvYXQzIGYzOwordm9sYXRpbGUgZmxvYXQ0IGY0OworCit2b2xhdGlsZSBpbnQgaTE7Cit2b2xhdGlsZSBpbnQyIGkyOwordm9sYXRpbGUgaW50MyBpMzsKK3ZvbGF0aWxlIGludDQgaTQ7CisKK3ZvbGF0aWxlIHVpbnQgdWkxOwordm9sYXRpbGUgdWludDIgdWkyOwordm9sYXRpbGUgdWludDMgdWkzOwordm9sYXRpbGUgdWludDQgdWk0OworCit2b2xhdGlsZSBzaG9ydCBzMTsKK3ZvbGF0aWxlIHNob3J0MiBzMjsKK3ZvbGF0aWxlIHNob3J0MyBzMzsKK3ZvbGF0aWxlIHNob3J0NCBzNDsKKwordm9sYXRpbGUgdXNob3J0IHVzMTsKK3ZvbGF0aWxlIHVzaG9ydDIgdXMyOwordm9sYXRpbGUgdXNob3J0MyB1czM7Cit2b2xhdGlsZSB1c2hvcnQ0IHVzNDsKKwordm9sYXRpbGUgY2hhciBjMTsKK3ZvbGF0aWxlIGNoYXIyIGMyOwordm9sYXRpbGUgY2hhcjMgYzM7Cit2b2xhdGlsZSBjaGFyNCBjNDsKKwordm9sYXRpbGUgdWNoYXIgdWMxOwordm9sYXRpbGUgdWNoYXIyIHVjMjsKK3ZvbGF0aWxlIHVjaGFyMyB1YzM7Cit2b2xhdGlsZSB1Y2hhcjQgdWM0OworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTihmbmMpICAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9QRk4oZm5jKSAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIChmbG9hdCopICZmMSk7ICAgICBcCisgICAgZjIgPSBmbmMoZjIsIChmbG9hdDIqKSAmZjIpOyAgICBcCisgICAgZjMgPSBmbmMoZjMsIChmbG9hdDMqKSAmZjMpOyAgICBcCisgICAgZjQgPSBmbmMoZjQsIChmbG9hdDQqKSAmZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GTihmbmMpICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGYyKTsgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYzKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fRihmbmMpICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSk7ICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBmMSk7ICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMSk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmMSk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0lOKGZuYykgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgaTIpOyAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgaTMpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgaTQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9JKGZuYykgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGkxKTsgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGkxKTsgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGkxKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGkxKTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4oZm5jKSAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSwgZjEpOyAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBmMiwgZjIpOyAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMywgZjMpOyAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmNCwgZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9QSU4oZm5jKSAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIChpbnQqKSAmaTEpOyAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIChpbnQyKikgJmkyKTsgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIChpbnQzKikgJmkzKTsgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIChpbnQ0KikgJmk0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fRk5fUElOKGZuYykgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSwgKGludCopICZpMSk7ICAgXAorICAgIGYyID0gZm5jKGYyLCBmMiwgKGludDIqKSAmaTIpOyAgXAorICAgIGYzID0gZm5jKGYzLCBmMywgKGludDMqKSAmaTMpOyAgXAorICAgIGY0ID0gZm5jKGY0LCBmNCwgKGludDQqKSAmaTQpOworCisjZGVmaW5lIFRFU1RfSU5fRlVOQ19GTihmbmMpICAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgaTEgPSBmbmMoZjEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaTIgPSBmbmMoZjIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaTMgPSBmbmMoZjMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaTQgPSBmbmMoZjQpOworCisKK3N0YXRpYyBib29sIHRlc3RfZnBfbWF0aCh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgc3RhcnQoKTsKKworICAgIFRFU1RfRk5fRlVOQ19GTihhY29zKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYWNvc2gpOworICAgIFRFU1RfRk5fRlVOQ19GTihhY29zcGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihhc2luKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXNpbmgpOworICAgIFRFU1RfRk5fRlVOQ19GTihhc2lucGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihhdGFuKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oYXRhbjIpOworICAgIFRFU1RfRk5fRlVOQ19GTihhdGFuaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGF0YW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGF0YW4ycGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihjYnJ0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY2VpbCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGNvcHlzaWduKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY29zKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY29zaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNvc3BpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXJmYyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGVyZik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cDIpOworICAgIFRFU1RfRk5fRlVOQ19GTihleHAxMCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cG0xKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZmFicyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZkaW0pOworICAgIFRFU1RfRk5fRlVOQ19GTihmbG9vcik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKGZtYSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZtYXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GKGZtYXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihmbWluKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihmbWluKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oZm1vZCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BGTihmcmFjdCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BJTihmcmV4cCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGh5cG90KTsKKyAgICBURVNUX0lOX0ZVTkNfRk4oaWxvZ2IpOworICAgIFRFU1RfRk5fRlVOQ19GTl9JTihsZGV4cCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0kobGRleHApOworICAgIFRFU1RfRk5fRlVOQ19GTihsZ2FtbWEpOworICAgIFRFU1RfRk5fRlVOQ19GTl9QSU4obGdhbW1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nMik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZzEwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nMXApOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2diKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4obWFkKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUEZOKG1vZGYpOworICAgIC8vIG5hbgorICAgIFRFU1RfRk5fRlVOQ19GTl9GTihuZXh0YWZ0ZXIpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihwb3cpOworICAgIFRFU1RfRk5fRlVOQ19GTl9JTihwb3duKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4ocG93cik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKHJlbWFpbmRlcik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX1BJTihyZW1xdW8pOworICAgIFRFU1RfRk5fRlVOQ19GTihyaW50KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSU4ocm9vdG4pOworICAgIFRFU1RfRk5fRlVOQ19GTihyb3VuZCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHJzcXJ0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oc2luKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUEZOKHNpbmNvcyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNpbmgpOworICAgIFRFU1RfRk5fRlVOQ19GTihzaW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNxcnQpOworICAgIFRFU1RfRk5fRlVOQ19GTih0YW4pOworICAgIFRFU1RfRk5fRlVOQ19GTih0YW5oKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGFucGkpOworICAgIFRFU1RfRk5fRlVOQ19GTih0Z2FtbWEpOworICAgIFRFU1RfRk5fRlVOQ19GTih0cnVuYyk7CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9mcF9tYXRoIEZBSUxFRCIsIHRpbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9mcF9tYXRoIFBBU1NFRCIsIHRpbWUpOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKKyNkZWZpbmUgREVDTF9JTlQocHJlZml4KSAgICAgICAgICAgIFwKK3ZvbGF0aWxlIGNoYXIgcHJlZml4IyNfY18xID0gMTsgICAgIFwKK3ZvbGF0aWxlIGNoYXIyIHByZWZpeCMjX2NfMiA9IDE7ICAgIFwKK3ZvbGF0aWxlIGNoYXIzIHByZWZpeCMjX2NfMyA9IDE7ICAgIFwKK3ZvbGF0aWxlIGNoYXI0IHByZWZpeCMjX2NfNCA9IDE7ICAgIFwKK3ZvbGF0aWxlIHVjaGFyIHByZWZpeCMjX3VjXzEgPSAxOyAgIFwKK3ZvbGF0aWxlIHVjaGFyMiBwcmVmaXgjI191Y18yID0gMTsgIFwKK3ZvbGF0aWxlIHVjaGFyMyBwcmVmaXgjI191Y18zID0gMTsgIFwKK3ZvbGF0aWxlIHVjaGFyNCBwcmVmaXgjI191Y180ID0gMTsgIFwKK3ZvbGF0aWxlIHNob3J0IHByZWZpeCMjX3NfMSA9IDE7ICAgIFwKK3ZvbGF0aWxlIHNob3J0MiBwcmVmaXgjI19zXzIgPSAxOyAgIFwKK3ZvbGF0aWxlIHNob3J0MyBwcmVmaXgjI19zXzMgPSAxOyAgIFwKK3ZvbGF0aWxlIHNob3J0NCBwcmVmaXgjI19zXzQgPSAxOyAgIFwKK3ZvbGF0aWxlIHVzaG9ydCBwcmVmaXgjI191c18xID0gMTsgIFwKK3ZvbGF0aWxlIHVzaG9ydDIgcHJlZml4IyNfdXNfMiA9IDE7IFwKK3ZvbGF0aWxlIHVzaG9ydDMgcHJlZml4IyNfdXNfMyA9IDE7IFwKK3ZvbGF0aWxlIHVzaG9ydDQgcHJlZml4IyNfdXNfNCA9IDE7IFwKK3ZvbGF0aWxlIGludCBwcmVmaXgjI19pXzEgPSAxOyAgICAgIFwKK3ZvbGF0aWxlIGludDIgcHJlZml4IyNfaV8yID0gMTsgICAgIFwKK3ZvbGF0aWxlIGludDMgcHJlZml4IyNfaV8zID0gMTsgICAgIFwKK3ZvbGF0aWxlIGludDQgcHJlZml4IyNfaV80ID0gMTsgICAgIFwKK3ZvbGF0aWxlIHVpbnQgcHJlZml4IyNfdWlfMSA9IDE7ICAgIFwKK3ZvbGF0aWxlIHVpbnQyIHByZWZpeCMjX3VpXzIgPSAxOyAgIFwKK3ZvbGF0aWxlIHVpbnQzIHByZWZpeCMjX3VpXzMgPSAxOyAgIFwKK3ZvbGF0aWxlIHVpbnQ0IHByZWZpeCMjX3VpXzQgPSAxOyAgIFwKK3ZvbGF0aWxlIGxvbmcgcHJlZml4IyNfbF8xID0gMTsgICAgIFwKK3ZvbGF0aWxlIHVsb25nIHByZWZpeCMjX3VsXzEgPSAxOworCisjZGVmaW5lIFRFU1RfSU5UX09QX1RZUEUob3AsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgIiAjb3AgIiBmb3IgIiAjdHlwZSAiMSIsIGkrKyk7ICAgICAgICAgXAorcmVzXyMjdHlwZSMjXzEgPSBzcmMxXyMjdHlwZSMjXzEgb3Agc3JjMl8jI3R5cGUjI18xOyAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yICIgI3R5cGUgIjIiLCBpKyspOyAgICAgICAgIFwKK3Jlc18jI3R5cGUjI18yID0gc3JjMV8jI3R5cGUjI18yIG9wIHNyYzJfIyN0eXBlIyNfMjsgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciAiICN0eXBlICIzIiwgaSsrKTsgICAgICAgICBcCityZXNfIyN0eXBlIyNfMyA9IHNyYzFfIyN0eXBlIyNfMyBvcCBzcmMyXyMjdHlwZSMjXzM7ICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgIiAjb3AgIiBmb3IgIiAjdHlwZSAiNCIsIGkrKyk7ICAgICAgICAgXAorcmVzXyMjdHlwZSMjXzQgPSBzcmMxXyMjdHlwZSMjXzQgb3Agc3JjMl8jI3R5cGUjI180OworCisjZGVmaW5lIFRFU1RfSU5UX09QKG9wKSAgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIGMpICAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgdWMpICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCBzKSAgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIHVzKSAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgaSkgICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCB1aSkgICAgICAgICAgICAgICAgICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgIiAjb3AgIiBmb3IgbDEiLCBpKyspOyAgICAgXAorcmVzX2xfMSA9IHNyYzFfbF8xIG9wIHNyYzJfbF8xOyAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yIHVsMSIsIGkrKyk7ICAgIFwKK3Jlc191bF8xID0gc3JjMV91bF8xIG9wIHNyYzJfdWxfMTsKKworREVDTF9JTlQocmVzKQorREVDTF9JTlQoc3JjMSkKK0RFQ0xfSU5UKHNyYzIpCisKK3N0YXRpYyBib29sIHRlc3RfYmFzaWNfb3BlcmF0b3JzKCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgaW50IGkgPSAwOworCisgICAgVEVTVF9JTlRfT1AoKyk7CisgICAgVEVTVF9JTlRfT1AoLSk7CisgICAgVEVTVF9JTlRfT1AoKik7CisgICAgVEVTVF9JTlRfT1AoLyk7CisgICAgVEVTVF9JTlRfT1AoJSk7CisgICAgVEVTVF9JTlRfT1AoPDwpOworICAgIFRFU1RfSU5UX09QKD4+KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9iYXNpY19vcGVyYXRvcnMgRkFJTEVEIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2Jhc2ljX29wZXJhdG9ycyBQQVNTRUQiLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCisjZGVmaW5lIFRFU1RfQ1ZUKHRvLCBmcm9tLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgY29udmVydCBmcm9tICIgI2Zyb20gIiB0byAiICN0bywgMCk7ICAgXAordG8jIzEgPSBmcm9tIyMxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0byMjMiA9IGNvbnZlcnRfIyN0eXBlIyMyKGZyb20jIzIpOyAgICAgICAgICAgICAgICAgICAgIFwKK3RvIyMzID0gY29udmVydF8jI3R5cGUjIzMoZnJvbSMjMyk7ICAgICAgICAgICAgICAgICAgICAgXAordG8jIzQgPSBjb252ZXJ0XyMjdHlwZSMjNChmcm9tIyM0KTsKKworI2RlZmluZSBURVNUX0NWVF9NQVRSSVgodG8sIHR5cGUpICAgXAorVEVTVF9DVlQodG8sIGMsIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVjLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHMsIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVzLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIGksIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVpLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIGYsIHR5cGUpOyAgICAgICAgICAgICAgXAorCitzdGF0aWMgYm9vbCB0ZXN0X2NvbnZlcnQoKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKworICAgIFRFU1RfQ1ZUX01BVFJJWChjLCBjaGFyKTsKKyAgICBURVNUX0NWVF9NQVRSSVgodWMsIHVjaGFyKTsKKyAgICBURVNUX0NWVF9NQVRSSVgocywgc2hvcnQpOworICAgIFRFU1RfQ1ZUX01BVFJJWCh1cywgdXNob3J0KTsKKyAgICBURVNUX0NWVF9NQVRSSVgoaSwgaW50KTsKKyAgICBURVNUX0NWVF9NQVRSSVgodWksIHVpbnQpOworICAgIFRFU1RfQ1ZUX01BVFJJWChmLCBmbG9hdCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfY29udmVydCBGQUlMRUQiLCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfY29udmVydCBQQVNTRUQiLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCisjZGVmaW5lIElOSVRfUFJFRklYX1RZUEUocHJlZml4LCB0eXBlKSAgXAorcHJlZml4IyNfIyN0eXBlIyNfMSA9IDE7ICAgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzIueCA9IDE7ICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI18yLnkgPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfMy54ID0gMTsgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzMueSA9IDE7ICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI18zLnogPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfNC54ID0gMTsgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzQueSA9IDE7ICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI180LnogPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfNC53ID0gMTsKKworI2RlZmluZSBJTklUX1RZUEUodHlwZSkgICAgICAgICBcCitJTklUX1BSRUZJWF9UWVBFKHNyYzEsIHR5cGUpICAgIFwKK0lOSVRfUFJFRklYX1RZUEUoc3JjMiwgdHlwZSkgICAgXAorSU5JVF9QUkVGSVhfVFlQRShyZXMsIHR5cGUpCisKKyNkZWZpbmUgSU5JVF9BTEwgICAgXAorSU5JVF9UWVBFKGMpOyAgICAgICBcCitJTklUX1RZUEUodWMpOyAgICAgIFwKK0lOSVRfVFlQRShzKTsgICAgICAgXAorSU5JVF9UWVBFKHVzKTsgICAgICBcCitJTklUX1RZUEUoaSk7ICAgICAgIFwKK0lOSVRfVFlQRSh1aSk7CisKK3ZvaWQgbWF0aF90ZXN0KHVpbnQzMl90IGluZGV4LCBpbnQgdGVzdF9udW0pIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIElOSVRfQUxMOworICAgIGZhaWxlZCB8PSB0ZXN0X2NvbnZlcnQoKTsKKyAgICBmYWlsZWQgfD0gdGVzdF9mcF9tYXRoKGluZGV4KTsKKyAgICBmYWlsZWQgfD0gdGVzdF9iYXNpY19vcGVyYXRvcnMoKTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9GQUlMRUQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9QQVNTRUQpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3ByaW1pdGl2ZXMucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcHJpbWl0aXZlcy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTQ1MWRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3ByaW1pdGl2ZXMucnMKQEAgLTAsMCArMSw2MSBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKKy8vIFRlc3RpbmcgcHJpbWl0aXZlIHR5cGVzCitmbG9hdCBmbG9hdFRlc3QgPSAxLjk5ZjsKK2RvdWJsZSBkb3VibGVUZXN0ID0gMi4wNTsKK2NoYXIgY2hhclRlc3QgPSAtODsKK3Nob3J0IHNob3J0VGVzdCA9IC0xNjsKK2ludCBpbnRUZXN0ID0gLTMyOworbG9uZyBsb25nVGVzdCA9IDE3MTc5ODY5MTg0bDsgLy8gMSA8PCAzNAorbG9uZyBsb25nIGxvbmdsb25nVGVzdCA9IDY4NzE5NDc2NzM2bDsgLy8gMSA8PCAzNgorCit1Y2hhciB1Y2hhclRlc3QgPSA4OwordXNob3J0IHVzaG9ydFRlc3QgPSAxNjsKK3VpbnQgdWludFRlc3QgPSAzMjsKK3Vsb25nIHVsb25nVGVzdCA9IDQ2MTE2ODYwMTg0MjczODc5MDRMOworaW50NjRfdCBpbnQ2NF90VGVzdCA9IC0xNzE3OTg2OTE4NGw7IC8vIC0gMSA8PCAzNAordWludDY0X3QgdWludDY0X3RUZXN0ID0gMTE3MTc5ODY5MTg0bDsKKworc3RhdGljIGJvb2wgdGVzdF9wcmltaXRpdmVfdHlwZXModWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIHN0YXJ0KCk7CisKKyAgICBfUlNfQVNTRVJUKGZsb2F0VGVzdCA9PSAyLjk5Zik7CisgICAgX1JTX0FTU0VSVChkb3VibGVUZXN0ID09IDMuMDUpOworICAgIF9SU19BU1NFUlQoY2hhclRlc3QgPT0gLTE2KTsKKyAgICBfUlNfQVNTRVJUKHNob3J0VGVzdCA9PSAtMzIpOworICAgIF9SU19BU1NFUlQoaW50VGVzdCA9PSAtNjQpOworICAgIF9SU19BU1NFUlQobG9uZ1Rlc3QgPT0gMTcxNzk4NjkxODVsKTsKKyAgICBfUlNfQVNTRVJUKGxvbmdsb25nVGVzdCA9PSA2ODcxOTQ3NjczNWwpOworCisgICAgX1JTX0FTU0VSVCh1Y2hhclRlc3QgPT0gOCk7CisgICAgX1JTX0FTU0VSVCh1c2hvcnRUZXN0ID09IDE2KTsKKyAgICBfUlNfQVNTRVJUKHVpbnRUZXN0ID09IDMyKTsKKyAgICBfUlNfQVNTRVJUKHVsb25nVGVzdCA9PSA0NjExNjg2MDE4NDI3Mzg3OTAzTCk7CisgICAgX1JTX0FTU0VSVChpbnQ2NF90VGVzdCA9PSAtMTcxNzk4NjkxODRsKTsKKyAgICBfUlNfQVNTRVJUKHVpbnQ2NF90VGVzdCA9PSAxMTcxNzk4NjkxODVsKTsKKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X3ByaW1pdGl2ZXMgRkFJTEVEIiwgdGltZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X3ByaW1pdGl2ZXMgUEFTU0VEIiwgdGltZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCBwcmltaXRpdmVzX3Rlc3QodWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgZmFpbGVkIHw9IHRlc3RfcHJpbWl0aXZlX3R5cGVzKGluZGV4KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9GQUlMRUQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9QQVNTRUQpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzZGVidWcucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnNkZWJ1Zy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzk0MmE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzZGVidWcucnMKQEAgLTAsMCArMSw1NiBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKKy8vIFRlc3RpbmcgcHJpbWl0aXZlIHR5cGVzCitmbG9hdCBmbG9hdFRlc3QgPSAxLjk5ZjsKK2RvdWJsZSBkb3VibGVUZXN0ID0gMi4wNTsKK2NoYXIgY2hhclRlc3QgPSAtODsKK3Nob3J0IHNob3J0VGVzdCA9IC0xNjsKK2ludCBpbnRUZXN0ID0gLTMyOworbG9uZyBsb25nVGVzdCA9IDE3MTc5ODY5MTg0bDsgLy8gMSA8PCAzNAorbG9uZyBsb25nIGxvbmdsb25nVGVzdCA9IDY4NzE5NDc2NzM2bDsgLy8gMSA8PCAzNgorCit1Y2hhciB1Y2hhclRlc3QgPSA4OwordXNob3J0IHVzaG9ydFRlc3QgPSAxNjsKK3VpbnQgdWludFRlc3QgPSAzMjsKK3Vsb25nIHVsb25nVGVzdCA9IDQ2MTE2ODYwMTg0MjczODc5MDRMOworaW50NjRfdCBpbnQ2NF90VGVzdCA9IC0xNzE3OTg2OTE4NGw7IC8vIC0gMSA8PCAzNAordWludDY0X3QgdWludDY0X3RUZXN0ID0gMTE3MTc5ODY5MTg0bDsKKworc3RhdGljIGJvb2wgYmFzaWNfdGVzdCh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICAvLyBUaGlzIHRlc3QgZm9jdXNlcyBwcmltYXJpbHkgb24gY29tcGlsYXRpb24tdGltZSwgbm90IHJ1bi10aW1lLgorICAgIC8vIEZvciB0aGlzIHJlYXNvbiwgbm9uZSBvZiB0aGUgb3V0cHV0cyBhcmUgYWN0dWFsbHkgY2hlY2tlZC4KKworICAgIHJzRGVidWcoImZsb2F0VGVzdCIsIGZsb2F0VGVzdCk7CisgICAgcnNEZWJ1ZygiZG91YmxlVGVzdCIsIGRvdWJsZVRlc3QpOworICAgIHJzRGVidWcoImNoYXJUZXN0IiwgY2hhclRlc3QpOworICAgIHJzRGVidWcoInNob3J0VGVzdCIsIHNob3J0VGVzdCk7CisgICAgcnNEZWJ1ZygiaW50VGVzdCIsIGludFRlc3QpOworICAgIHJzRGVidWcoImxvbmdUZXN0IiwgbG9uZ1Rlc3QpOworICAgIHJzRGVidWcoImxvbmdsb25nVGVzdCIsIGxvbmdsb25nVGVzdCk7CisKKyAgICByc0RlYnVnKCJ1Y2hhclRlc3QiLCB1Y2hhclRlc3QpOworICAgIHJzRGVidWcoInVzaG9ydFRlc3QiLCB1c2hvcnRUZXN0KTsKKyAgICByc0RlYnVnKCJ1aW50VGVzdCIsIHVpbnRUZXN0KTsKKyAgICByc0RlYnVnKCJ1bG9uZ1Rlc3QiLCB1bG9uZ1Rlc3QpOworICAgIHJzRGVidWcoImludDY0X3RUZXN0IiwgaW50NjRfdFRlc3QpOworICAgIHJzRGVidWcoInVpbnQ2NF90VGVzdCIsIHVpbnQ2NF90VGVzdCk7CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCit2b2lkIHRlc3RfcnNkZWJ1Zyh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmYWlsZWQgfD0gYmFzaWNfdGVzdChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgcnNEZWJ1ZygicnNkZWJ1Z190ZXN0IEZBSUxFRCIsIC0xKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICAgICAgcnNEZWJ1ZygicnNkZWJ1Z190ZXN0IFBBU1NFRCIsIDApOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzbGlzdC5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2xpc3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyNTAxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2xpc3QucnMKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy50ZXN0X3YxMSkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworZmxvYXQgZ0RZOworCityc19mb250IGdGb250OworCit0eXBlZGVmIHN0cnVjdCBMaXN0QWxsb2NzX3MgeworICAgIHJzX2FsbG9jYXRpb24gdGV4dDsKKyAgICBpbnQgcmVzdWx0OworfSBMaXN0QWxsb2NzOworCitMaXN0QWxsb2NzICpnTGlzdDsKKwordm9pZCBpbml0KCkgeworICAgIGdEWSA9IDAuMGY7Cit9CisKK2ludCB0ZXh0UG9zID0gMDsKKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICByc2dDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ0NsZWFyRGVwdGgoMS4wZik7CisKKyAgICB0ZXh0UG9zIC09IChpbnQpZ0RZKjI7CisgICAgZ0RZICo9IDAuOTU7CisKKyAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC45ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnQpOworCisgICAgcnNfYWxsb2NhdGlvbiBsaXN0QWxsb2M7CisgICAgcnNTZXRPYmplY3QoJmxpc3RBbGxvYywgcnNHZXRBbGxvY2F0aW9uKGdMaXN0KSk7CisgICAgaW50IGFsbG9jU2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgobGlzdEFsbG9jKTsKKworICAgIGludCB3aWR0aCA9IHJzZ0dldFdpZHRoKCk7CisgICAgaW50IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworCisgICAgaW50IGl0ZW1IZWlnaHQgPSA4MDsKKyAgICBpbnQgdG90YWxJdGVtSGVpZ2h0ID0gaXRlbUhlaWdodCAqIGFsbG9jU2l6ZTsKKworICAgIC8qIFByZXZlbnQgc2Nyb2xsaW5nIGFib3ZlIHRoZSB0b3Agb2YgdGhlIGxpc3QgKi8KKyAgICBpbnQgZmlyc3RJdGVtID0gaGVpZ2h0IC0gdG90YWxJdGVtSGVpZ2h0OworICAgIGlmIChmaXJzdEl0ZW0gPCAwKSB7CisgICAgICAgIGZpcnN0SXRlbSA9IDA7CisgICAgfQorCisgICAgLyogUHJldmVudCBzY3JvbGxpbmcgcGFzdCB0aGUgbGFzdCBsaW5lIG9mIHRoZSBsaXN0ICovCisgICAgaW50IGxhc3RJdGVtID0gLTEgKiAodG90YWxJdGVtSGVpZ2h0IC0gaGVpZ2h0KTsKKyAgICBpZiAobGFzdEl0ZW0gPiAwKSB7CisgICAgICAgIGxhc3RJdGVtID0gMDsKKyAgICB9CisKKyAgICBpZiAodGV4dFBvcyA+IGZpcnN0SXRlbSkgeworICAgICAgICB0ZXh0UG9zID0gZmlyc3RJdGVtOworICAgIH0KKyAgICBlbHNlIGlmICh0ZXh0UG9zIDwgbGFzdEl0ZW0pIHsKKyAgICAgICAgdGV4dFBvcyA9IGxhc3RJdGVtOworICAgIH0KKworICAgIGludCBjdXJyZW50WVBvcyA9IGl0ZW1IZWlnaHQgKyB0ZXh0UG9zOworCisgICAgZm9yKGludCBpID0gMDsgaSA8IGFsbG9jU2l6ZTsgaSArKykgeworICAgICAgICBpZihjdXJyZW50WVBvcyAtIGl0ZW1IZWlnaHQgPiBoZWlnaHQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYoY3VycmVudFlQb3MgPiAwKSB7CisgICAgICAgICAgICBzd2l0Y2goZ0xpc3RbaV0ucmVzdWx0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvKiBQYXNzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgcnNnRm9udENvbG9yKDAuNWYsIDAuOWYsIDAuNWYsIDEuMGYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIC0xOiAvKiBGYWlsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgcnNnRm9udENvbG9yKDAuOWYsIDAuNWYsIDAuNWYsIDEuMGYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8qIFN0aWxsIFRlc3RpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgcnNnRm9udENvbG9yKDAuOWYsIDAuOWYsIDAuNWYsIDEuMGYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBVbmtub3duICovCisgICAgICAgICAgICAgICAgICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjlmLCAwLjlmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByc2dEcmF3UmVjdCgwLCBjdXJyZW50WVBvcyAtIDEsIHdpZHRoLCBjdXJyZW50WVBvcywgMCk7CisgICAgICAgICAgICByc2dEcmF3VGV4dChnTGlzdFtpXS50ZXh0LCAzMCwgY3VycmVudFlQb3MgLSAzMik7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudFlQb3MgKz0gaXRlbUhlaWdodDsKKyAgICB9CisKKyAgICByZXR1cm4gMTA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnN0aW1lLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzdGltZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTNlMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzdGltZS5ycwpAQCAtMCwwICsxLDUyIEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworc3RhdGljIGJvb2wgYmFzaWNfdGVzdCh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICByc190aW1lX3QgY3VyVGltZSA9IHJzVGltZSgwKTsKKyAgICByc190bSB0bTsKKyAgICByc0RlYnVnKCJjdXJUaW1lIiwgY3VyVGltZSk7CisKKyAgICByc0xvY2FsdGltZSgmdG0sICZjdXJUaW1lKTsKKworICAgIHJzRGVidWcoInRtLnRtX3NlYyIsIHRtLnRtX3NlYyk7CisgICAgcnNEZWJ1ZygidG0udG1fbWluIiwgdG0udG1fbWluKTsKKyAgICByc0RlYnVnKCJ0bS50bV9ob3VyIiwgdG0udG1faG91cik7CisgICAgcnNEZWJ1ZygidG0udG1fbWRheSIsIHRtLnRtX21kYXkpOworICAgIHJzRGVidWcoInRtLnRtX21vbiIsIHRtLnRtX21vbik7CisgICAgcnNEZWJ1ZygidG0udG1feWVhciIsIHRtLnRtX3llYXIpOworICAgIHJzRGVidWcoInRtLnRtX3dkYXkiLCB0bS50bV93ZGF5KTsKKyAgICByc0RlYnVnKCJ0bS50bV95ZGF5IiwgdG0udG1feWRheSk7CisgICAgcnNEZWJ1ZygidG0udG1faXNkc3QiLCB0bS50bV9pc2RzdCk7CisKKyAgICAvLyBUZXN0IGEgc3BlY2lmaWMgdGltZSAob25seSB2YWxpZCBmb3IgUFNUIGxvY2FsdGltZSkKKyAgICBjdXJUaW1lID0gMTI5NDQzODg5MzsKKyAgICByc0xvY2FsdGltZSgmdG0sICZjdXJUaW1lKTsKKworICAgIF9SU19BU1NFUlQodG0udG1fc2VjID09IDMzKTsKKyAgICBfUlNfQVNTRVJUKHRtLnRtX21pbiA9PSAyMSk7CisgICAgX1JTX0FTU0VSVCh0bS50bV9ob3VyID09IDE0KTsKKyAgICBfUlNfQVNTRVJUKHRtLnRtX21kYXkgPT0gNyk7CisgICAgX1JTX0FTU0VSVCh0bS50bV9tb24gPT0gMCk7CisgICAgX1JTX0FTU0VSVCh0bS50bV95ZWFyID09IDExMSk7CisgICAgX1JTX0FTU0VSVCh0bS50bV93ZGF5ID09IDUpOworICAgIF9SU19BU1NFUlQodG0udG1feWRheSA9PSA2KTsKKyAgICBfUlNfQVNTRVJUKHRtLnRtX2lzZHN0ID09IDApOworCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCB0ZXN0X3JzdGltZSh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmYWlsZWQgfD0gYmFzaWNfdGVzdChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgcnNEZWJ1ZygicnN0aW1lX3Rlc3QgRkFJTEVEIiwgLTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9QQVNTRUQpOworICAgICAgICByc0RlYnVnKCJyc3RpbWVfdGVzdCBQQVNTRUQiLCAwKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc3R5cGVzLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzdHlwZXMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiZjI0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc3R5cGVzLnJzCkBAIC0wLDAgKzEsNzkgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworcnNfZWxlbWVudCBlbGVtZW50VGVzdDsKK3JzX3R5cGUgdHlwZVRlc3Q7Cityc19hbGxvY2F0aW9uIGFsbG9jYXRpb25UZXN0OworcnNfc2FtcGxlciBzYW1wbGVyVGVzdDsKK3JzX3NjcmlwdCBzY3JpcHRUZXN0OworcnNfbWVzaCBtZXNoVGVzdDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgcHJvZ3JhbV9mcmFnbWVudFRlc3Q7Cityc19wcm9ncmFtX3ZlcnRleCBwcm9ncmFtX3ZlcnRleFRlc3Q7Cityc19wcm9ncmFtX3Jhc3RlciBwcm9ncmFtX3Jhc3RlclRlc3Q7Cityc19wcm9ncmFtX3N0b3JlIHByb2dyYW1fc3RvcmVUZXN0OworcnNfZm9udCBmb250VGVzdDsKKworcnNfbWF0cml4NHg0IG1hdHJpeDR4NFRlc3Q7Cityc19tYXRyaXgzeDMgbWF0cml4M3gzVGVzdDsKK3JzX21hdHJpeDJ4MiBtYXRyaXgyeDJUZXN0OworCitzdHJ1Y3QgbXlfc3RydWN0IHsKKyAgICBpbnQgaTsKKyAgICByc19mb250IGZvbnRUZXN0U3RydWN0OworfTsKKworc3RhdGljIGJvb2wgYmFzaWNfdGVzdCh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICByc19tYXRyaXg0eDQgbWF0cml4NHg0VGVzdExvY2FsOworICAgIHJzX21hdHJpeDN4MyBtYXRyaXgzeDNUZXN0TG9jYWw7CisgICAgcnNfbWF0cml4MngyIG1hdHJpeDJ4MlRlc3RMb2NhbDsKKworICAgIC8vIFRoaXMgdGVzdCBmb2N1c2VzIHByaW1hcmlseSBvbiBjb21waWxhdGlvbi10aW1lLCBub3QgcnVuLXRpbWUuCisgICAgcnNfZWxlbWVudCBlbGVtZW50VGVzdExvY2FsOworICAgIHJzX3R5cGUgdHlwZVRlc3RMb2NhbDsKKyAgICByc19hbGxvY2F0aW9uIGFsbG9jYXRpb25UZXN0TG9jYWw7CisgICAgcnNfc2FtcGxlciBzYW1wbGVyVGVzdExvY2FsOworICAgIHJzX3NjcmlwdCBzY3JpcHRUZXN0TG9jYWw7CisgICAgcnNfbWVzaCBtZXNoVGVzdExvY2FsOworICAgIHJzX3Byb2dyYW1fZnJhZ21lbnQgcHJvZ3JhbV9mcmFnbWVudFRlc3RMb2NhbDsKKyAgICByc19wcm9ncmFtX3ZlcnRleCBwcm9ncmFtX3ZlcnRleFRlc3RMb2NhbDsKKyAgICByc19wcm9ncmFtX3Jhc3RlciBwcm9ncmFtX3Jhc3RlclRlc3RMb2NhbDsKKyAgICByc19wcm9ncmFtX3N0b3JlIHByb2dyYW1fc3RvcmVUZXN0TG9jYWw7CisgICAgcnNfZm9udCBmb250VGVzdExvY2FsOworCisgICAgcnNfZm9udCBmb250VGVzdExvY2FsQXJyYXlbNF07CisKKyAgICByc19mb250IGZvbnRUZXN0TG9jYWxQcmVJbml0ID0gZm9udFRlc3Q7CisKKyAgICBzdHJ1Y3QgbXlfc3RydWN0IHN0cnVjdFRlc3Q7CisKKyAgICByc1NldE9iamVjdCgmZm9udFRlc3RMb2NhbCwgZm9udFRlc3QpOworICAgIC8vYWxsb2NhdGlvblRlc3RMb2NhbCA9IGFsbG9jYXRpb25UZXN0OworCisgICAgcnNTZXRPYmplY3QoJmZvbnRUZXN0LCBmb250VGVzdExvY2FsKTsKKyAgICAvL2FsbG9jYXRpb25UZXN0ID0gYWxsb2NhdGlvblRlc3RMb2NhbDsKKworICAgIC8qZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgcnNTZXRPYmplY3QoJmZvbnRUZXN0TG9jYWxBcnJheVtpXSwgZm9udFRlc3RMb2NhbCk7CisgICAgfSovCisKKyAgICAvKnJzU2V0T2JqZWN0KCZmb250VGVzdCwgZm9udFRlc3RMb2NhbEFycmF5WzNdKTsqLworCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCB0ZXN0X3JzdHlwZXModWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgZmFpbGVkIHw9IGJhc2ljX3Rlc3QoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgICAgIHJzRGVidWcoInJzdHlwZXNfdGVzdCBGQUlMRUQiLCAtMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7CisgICAgICAgIHJzRGVidWcoInJzdHlwZXNfdGVzdCBQQVNTRUQiLCAwKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9zaGFyZWQucnNoIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3NoYXJlZC5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzNDQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9zaGFyZWQucnNoCkBAIC0wLDAgKzEsMzggQEAKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLnRlc3RfdjExKQorCit0eXBlZGVmIHN0cnVjdCBUZXN0UmVzdWx0X3MgeworICAgIHJzX2FsbG9jYXRpb24gbmFtZTsKKyAgICBib29sIHBhc3M7CisgICAgZmxvYXQgc2NvcmU7CisgICAgaW50NjRfdCB0aW1lOworfSBUZXN0UmVzdWx0OworLy9UZXN0UmVzdWx0ICpnX3Jlc3VsdHM7CisKK3N0YXRpYyBpbnQ2NF90IGdfdGltZTsKKworc3RhdGljIHZvaWQgc3RhcnQodm9pZCkgeworICAgIGdfdGltZSA9IHJzVXB0aW1lTWlsbGlzKCk7Cit9CisKK3N0YXRpYyBmbG9hdCBlbmQodWludDMyX3QgaWR4KSB7CisgICAgaW50NjRfdCB0ID0gcnNVcHRpbWVNaWxsaXMoKSAtIGdfdGltZTsKKyAgICAvL2dfcmVzdWx0c1tpZHhdLnRpbWUgPSB0OworICAgIC8vcnNEZWJ1ZygidGVzdCB0aW1lIiwgKGludCl0KTsKKyAgICByZXR1cm4gKChmbG9hdCl0KSAvIDEwMDAuZjsKK30KKworI2RlZmluZSBfUlNfQVNTRVJUKGIpIFwKK2RvIHsgXAorICAgIGlmICghKGIpKSB7IFwKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsgXAorICAgICAgICByc0RlYnVnKCNiICIgRkFJTEVEIiwgMCk7IFwKKyAgICB9IFwKK1wKK30gd2hpbGUgKDApCisKKy8qIFRoZXNlIGNvbnN0YW50cyBtdXN0IG1hdGNoIHRob3NlIGluIFVuaXRUZXN0LmphdmEgKi8KK3N0YXRpYyBjb25zdCBpbnQgUlNfTVNHX1RFU1RfUEFTU0VEID0gMTAwOworc3RhdGljIGNvbnN0IGludCBSU19NU0dfVEVTVF9GQUlMRUQgPSAxMDE7CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC90ZXN0X3Jvb3QucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdGVzdF9yb290LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYzgzYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdGVzdF9yb290LnJzCkBAIC0wLDAgKzEsMjMgQEAKKy8vIEZvdW50YWluIHRlc3Qgc2NyaXB0CisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy50ZXN0KQorCisjcHJhZ21hIHN0YXRlRnJhZ21lbnQocGFyZW50KQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCisKK3R5cGVkZWYgc3RydWN0IFRlc3RSZXN1bHQgeworICAgIHJzX2FsbG9jYXRpb24gbmFtZTsKKyAgICBib29sIHBhc3M7CisgICAgZmxvYXQgc2NvcmU7Cit9IFRlc3RSZXN1bHRfdDsKK1Rlc3RSZXN1bHRfdCAqcmVzdWx0czsKKworaW50IHJvb3QoKSB7CisKKyAgICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvQW5kcm9pZC5tayBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YzNhMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI3IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gUlNUZXN0X3YxNAorTE9DQUxfU0RLX1ZFUlNJT04gOj0gMTQKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZDliYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5ycy50ZXN0X3YxNCI+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMTQiIC8+CisgICAgPGFwcGxpY2F0aW9uIAorICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUlNfVGVzdF92MTQiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL3Rlc3RfcGF0dGVybiI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlJTVGVzdF92MTQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvcmVzL2RyYXdhYmxlLW5vZHBpL3Rlc3RfcGF0dGVybi5wbmcgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvcmVzL2RyYXdhYmxlLW5vZHBpL3Rlc3RfcGF0dGVybi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkMTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9yZXMvZHJhd2FibGUtbm9kcGkvdGVzdF9wYXR0ZXJuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Q29yZS5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWU4MWE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxNDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKKworcHVibGljIGNsYXNzIFJTVGVzdENvcmUgeworICAgIGludCBtV2lkdGg7CisgICAgaW50IG1IZWlnaHQ7CisgICAgQ29udGV4dCBtQ3R4OworCisgICAgcHVibGljIFJTVGVzdENvcmUoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgbUN0eCA9IGN0eDsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworCisgICAgcHJpdmF0ZSBGb250IG1Gb250OworICAgIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3NfcyBtTGlzdEFsbG9jczsKKyAgICBpbnQgbUxhc3RYOworICAgIGludCBtTGFzdFk7CisgICAgcHJpdmF0ZSBTY3JpcHRDX3JzbGlzdCBtU2NyaXB0OworCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8VW5pdFRlc3Q+IHVuaXRUZXN0czsKKyAgICBwcml2YXRlIExpc3RJdGVyYXRvcjxVbml0VGVzdD4gdGVzdF9pdGVyOworICAgIHByaXZhdGUgVW5pdFRlc3QgYWN0aXZlVGVzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RvcFRlc3Rpbmc7CisKKyAgICAvKiBQZXJpb2RpYyB0aW1lciBmb3IgZW5zdXJpbmcgZnV0dXJlIHRlc3RzIGdldCBzY2hlZHVsZWQgKi8KKyAgICBwcml2YXRlIFRpbWVyIG1UaW1lcjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSU19USU1FUl9QRVJJT0QgPSAxMDA7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBzdG9wVGVzdGluZyA9IGZhbHNlOworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19yc2xpc3QobVJTLCBtUmVzLCBSLnJhdy5yc2xpc3QpOworCisgICAgICAgIHVuaXRUZXN0cyA9IG5ldyBBcnJheUxpc3Q8VW5pdFRlc3Q+KCk7CisKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfcHJpbWl0aXZlcyh0aGlzLCBtUmVzLCBtQ3R4KSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX3ZlY3Rvcih0aGlzLCBtUmVzLCBtQ3R4KSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX3JzZGVidWcodGhpcywgbVJlcywgbUN0eCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF9yc3RpbWUodGhpcywgbVJlcywgbUN0eCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF9yc3R5cGVzKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfYWxsb2ModGhpcywgbVJlcywgbUN0eCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF9yZWZjb3VudCh0aGlzLCBtUmVzLCBtQ3R4KSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX2ZvcmVhY2godGhpcywgbVJlcywgbUN0eCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF9tYXRoKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfZnBfbWFkKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgLyoKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVW5pdFRlc3QobnVsbCwgIjxQYXNzPiIsIDEpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVW5pdFRlc3QoKSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVuaXRUZXN0KG51bGwsICI8RmFpbD4iLCAtMSkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVW5pdFRlc3QobnVsbCwgIjxQYXNzPiIsIDEpKTsKKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIFVuaXRUZXN0IFtdIHV0YSA9IG5ldyBVbml0VGVzdFt1bml0VGVzdHMuc2l6ZSgpXTsKKyAgICAgICAgdXRhID0gdW5pdFRlc3RzLnRvQXJyYXkodXRhKTsKKworICAgICAgICBtTGlzdEFsbG9jcyA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MobVJTLCB1dGEubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1dGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtIGxpc3RFbGVtID0gbmV3IFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtKCk7CisgICAgICAgICAgICBsaXN0RWxlbS50ZXh0ID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgdXRhW2ldLm5hbWUsIEFsbG9jYXRpb24uVVNBR0VfU0NSSVBUKTsKKyAgICAgICAgICAgIGxpc3RFbGVtLnJlc3VsdCA9IHV0YVtpXS5yZXN1bHQ7CisgICAgICAgICAgICBtTGlzdEFsbG9jcy5zZXQobGlzdEVsZW0sIGksIGZhbHNlKTsKKyAgICAgICAgICAgIHV0YVtpXS5zZXRJdGVtKGxpc3RFbGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MaXN0QWxsb2NzLmNvcHlBbGwoKTsKKworICAgICAgICBtU2NyaXB0LmJpbmRfZ0xpc3QobUxpc3RBbGxvY3MpOworCisgICAgICAgIG1Gb250ID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAic2VyaWYiLCBGb250LlN0eWxlLkJPTEQsIDgpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udChtRm9udCk7CisKKyAgICAgICAgbVJTLmJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworCisgICAgICAgIHRlc3RfaXRlciA9IHVuaXRUZXN0cy5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgcmVmcmVzaFRlc3RSZXN1bHRzKCk7IC8qIEtpY2sgb2ZmIHRoZSBmaXJzdCB0ZXN0ICovCisKKyAgICAgICAgVGltZXJUYXNrIHBUYXNrID0gbmV3IFRpbWVyVGFzaygpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICByZWZyZXNoVGVzdFJlc3VsdHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBtVGltZXIgPSBuZXcgVGltZXIoKTsKKyAgICAgICAgbVRpbWVyLnNjaGVkdWxlKHBUYXNrLCBSU19USU1FUl9QRVJJT0QsIFJTX1RJTUVSX1BFUklPRCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hlY2tBbmRSdW5OZXh0VGVzdCgpIHsKKyAgICAgICAgaWYgKGFjdGl2ZVRlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFhY3RpdmVUZXN0LmlzQWxpdmUoKSkgeworICAgICAgICAgICAgICAgIC8qIFByb3Blcmx5IGNsZWFuIHVwIG9uIG91ciBsYXN0IHRlc3QgKi8KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUZXN0LmpvaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWN0aXZlVGVzdCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN0b3BUZXN0aW5nICYmIGFjdGl2ZVRlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRlc3RfaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVUZXN0ID0gdGVzdF9pdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBhY3RpdmVUZXN0LnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgLyogVGhpcyByb3V0aW5lIHdpbGwgb25seSBnZXQgY2FsbGVkIG9uY2Ugd2hlbiBhIG5ldyB0ZXN0CisgICAgICAgICAgICAgICAgICogc2hvdWxkIHN0YXJ0IHJ1bm5pbmcuIFRoZSBtZXNzYWdlIGhhbmRsZXIgaW4gVW5pdFRlc3QuamF2YQorICAgICAgICAgICAgICAgICAqIGVuc3VyZXMgdGhpcy4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtVGltZXIuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lci5wdXJnZSgpOworICAgICAgICAgICAgICAgICAgICBtVGltZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hUZXN0UmVzdWx0cygpIHsKKyAgICAgICAgY2hlY2tBbmRSdW5OZXh0VGVzdCgpOworCisgICAgICAgIGlmIChtTGlzdEFsbG9jcyAhPSBudWxsICYmIG1TY3JpcHQgIT0gbnVsbCAmJiBtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RBbGxvY3MuY29weUFsbCgpOworCisgICAgICAgICAgICBtU2NyaXB0LmJpbmRfZ0xpc3QobUxpc3RBbGxvY3MpOworICAgICAgICAgICAgbVJTLmJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgc3RvcFRlc3RpbmcgPSB0cnVlOworICAgICAgICBVbml0VGVzdCB0ID0gYWN0aXZlVGVzdDsKKworICAgICAgICAvKiBTdG9wIHBlcmlvZGljIHJlZnJlc2ggb2YgdGVzdGluZyAqLworICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaW1lci5jYW5jZWwoKTsKKyAgICAgICAgICAgIG1UaW1lci5wdXJnZSgpOworICAgICAgICAgICAgbVRpbWVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFdhaXQgdG8gZXhpdCB1bnRpbCB3ZSBmaW5pc2ggdGhlIGN1cnJlbnQgdGVzdCAqLworICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQgPSBudWxsOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBuZXdUb3VjaFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHByZXNzdXJlLCBpbnQgaWQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbkRvd24oaW50IHgsIGludCB5KSB7CisgICAgICAgIG1TY3JpcHQuc2V0X2dEWSgwLjBmKTsKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICAgICAgcmVmcmVzaFRlc3RSZXN1bHRzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BY3Rpb25Nb3ZlKGludCB4LCBpbnQgeSkgeworICAgICAgICBpbnQgZHggPSBtTGFzdFggLSB4OworICAgICAgICBpbnQgZHkgPSBtTGFzdFkgLSB5OworCisgICAgICAgIGlmIChNYXRoLmFicyhkeSkgPD0gMikgeworICAgICAgICAgICAgZHkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0RZKGR5KTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgICAgICByZWZyZXNoVGVzdFJlc3VsdHMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Vmlldy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDE5MmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdFZpZXcuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxNDsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBSU1Rlc3RWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUN0eDsKKworICAgIHB1YmxpYyBSU1Rlc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgbUN0eCA9IGNvbnRleHQ7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgUlNUZXN0Q29yZSBtUmVuZGVyOworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgUmVuZGVyU2NyaXB0R0wuU3VyZmFjZUNvbmZpZyBzYyA9IG5ldyBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnKCk7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHRHTChzYyk7CisgICAgICAgICAgICBtUlMuc2V0U3VyZmFjZShob2xkZXIsIHcsIGgpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBSU1Rlc3RDb3JlKG1DdHgpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVuZGVyLmNsZWFudXAoKTsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0R0woKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Eb3duKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFjdCA9PSBldi5BQ1RJT05fTU9WRSkgeworICAgICAgICAgICAgbVJlbmRlci5vbkFjdGlvbk1vdmUoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RfdjE0LmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0X3YxNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDk2OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0X3YxNC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjE0OworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgUlNUZXN0X3YxNCBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlJTVGVzdF92MTQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dfRU5BQkxFRCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBSU1Rlc3RWaWV3IG1WaWV3OworCisgICAgLy8gZ2V0IHRoZSBjdXJyZW50IGxvb3BlciAoZnJvbSB5b3VyIEFjdGl2aXR5IFVJIHRocmVhZCBmb3IgaW5zdGFuY2UKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBSU1Rlc3RWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3LnJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcucGF1c2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIC8vIEFjdHVhbGx5IGtpbGwgdGhlIGFwcCBpZiB3ZSBhcmUgc3RvcHBpbmcuIFdlIGRvbid0IHdhbnQgdG8KKyAgICAgICAgLy8gY29udGludWUvcmVzdW1lIHRoaXMgdGVzdCBldmVyLiBJdCBzaG91bGQgYWx3YXlzIHN0YXJ0IGZyZXNoLgorICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGlmIChMT0dfRU5BQkxFRCkgeworICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2FsbG9jLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfYWxsb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQyYjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2FsbG9jLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfYWxsb2MgZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKworICAgIHByb3RlY3RlZCBVVF9hbGxvYyhSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJBbGxvYyIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHbG9iYWxzKFJlbmRlclNjcmlwdCBSUywgU2NyaXB0Q19hbGxvYyBzKSB7CisgICAgICAgIFR5cGUuQnVpbGRlciB0eXBlQnVpbGRlciA9IG5ldyBUeXBlLkJ1aWxkZXIoUlMsIEVsZW1lbnQuSTMyKFJTKSk7CisgICAgICAgIGludCBYID0gNTsKKyAgICAgICAgaW50IFkgPSA3OworICAgICAgICBpbnQgWiA9IDA7CisgICAgICAgIHMuc2V0X2RpbVgoWCk7CisgICAgICAgIHMuc2V0X2RpbVkoWSk7CisgICAgICAgIHMuc2V0X2RpbVooWik7CisgICAgICAgIHR5cGVCdWlsZGVyLnNldFgoWCkuc2V0WShZKTsKKyAgICAgICAgQWxsb2NhdGlvbiBBID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChSUywgdHlwZUJ1aWxkZXIuY3JlYXRlKCkpOworICAgICAgICBzLmJpbmRfYShBKTsKKworICAgICAgICB0eXBlQnVpbGRlciA9IG5ldyBUeXBlLkJ1aWxkZXIoUlMsIEVsZW1lbnQuSTMyKFJTKSk7CisgICAgICAgIHR5cGVCdWlsZGVyLnNldFgoWCkuc2V0WShZKS5zZXRGYWNlcyh0cnVlKTsKKyAgICAgICAgQWxsb2NhdGlvbiBBRmFjZXMgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKFJTLCB0eXBlQnVpbGRlci5jcmVhdGUoKSk7CisgICAgICAgIHMuc2V0X2FGYWNlcyhBRmFjZXMpOworICAgICAgICB0eXBlQnVpbGRlci5zZXRGYWNlcyhmYWxzZSkuc2V0TWlwbWFwcyh0cnVlKTsKKyAgICAgICAgQWxsb2NhdGlvbiBBTE9EID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChSUywgdHlwZUJ1aWxkZXIuY3JlYXRlKCkpOworICAgICAgICBzLnNldF9hTE9EKEFMT0QpOworICAgICAgICB0eXBlQnVpbGRlci5zZXRGYWNlcyh0cnVlKS5zZXRNaXBtYXBzKHRydWUpOworICAgICAgICBBbGxvY2F0aW9uIEFGYWNlc0xPRCA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQoUlMsIHR5cGVCdWlsZGVyLmNyZWF0ZSgpKTsKKyAgICAgICAgcy5zZXRfYUZhY2VzTE9EKEFGYWNlc0xPRCk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUobUN0eCk7CisgICAgICAgIFNjcmlwdENfYWxsb2MgcyA9IG5ldyBTY3JpcHRDX2FsbG9jKHBSUywgbVJlcywgUi5yYXcuYWxsb2MpOworICAgICAgICBwUlMuc2V0TWVzc2FnZUhhbmRsZXIobVJzTWVzc2FnZSk7CisgICAgICAgIGluaXRpYWxpemVHbG9iYWxzKHBSUywgcyk7CisgICAgICAgIHMuaW52b2tlX2FsbG9jX3Rlc3QoKTsKKyAgICAgICAgcFJTLmZpbmlzaCgpOworICAgICAgICB3YWl0Rm9yTWVzc2FnZSgpOworICAgICAgICBwUlMuZGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9mb3JlYWNoLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfZm9yZWFjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYjViYjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfZm9yZWFjaC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjE0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX2ZvcmVhY2ggZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gQTsKKworICAgIHByb3RlY3RlZCBVVF9mb3JlYWNoKFJTVGVzdENvcmUgcnN0YywgUmVzb3VyY2VzIHJlcywgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIocnN0YywgIkZvckVhY2giLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplR2xvYmFscyhSZW5kZXJTY3JpcHQgUlMsIFNjcmlwdENfZm9yZWFjaCBzKSB7CisgICAgICAgIFR5cGUuQnVpbGRlciB0eXBlQnVpbGRlciA9IG5ldyBUeXBlLkJ1aWxkZXIoUlMsIEVsZW1lbnQuSTMyKFJTKSk7CisgICAgICAgIGludCBYID0gNTsKKyAgICAgICAgaW50IFkgPSA3OworICAgICAgICBzLnNldF9kaW1YKFgpOworICAgICAgICBzLnNldF9kaW1ZKFkpOworICAgICAgICB0eXBlQnVpbGRlci5zZXRYKFgpLnNldFkoWSk7CisgICAgICAgIEEgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKFJTLCB0eXBlQnVpbGRlci5jcmVhdGUoKSk7CisgICAgICAgIHMuYmluZF9hKEEpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBwUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKG1DdHgpOworICAgICAgICBTY3JpcHRDX2ZvcmVhY2ggcyA9IG5ldyBTY3JpcHRDX2ZvcmVhY2gocFJTLCBtUmVzLCBSLnJhdy5mb3JlYWNoKTsKKyAgICAgICAgcFJTLnNldE1lc3NhZ2VIYW5kbGVyKG1Sc01lc3NhZ2UpOworICAgICAgICBpbml0aWFsaXplR2xvYmFscyhwUlMsIHMpOworICAgICAgICBzLmZvckVhY2hfcm9vdChBKTsKKyAgICAgICAgcy5pbnZva2VfZm9yZWFjaF90ZXN0KCk7CisgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfZnBfbWFkLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfZnBfbWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5NDk2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9mcF9tYWQuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxNDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CisKK3B1YmxpYyBjbGFzcyBVVF9mcF9tYWQgZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKworICAgIHByb3RlY3RlZCBVVF9mcF9tYWQoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzLCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihyc3RjLCAiRnBfTWFkIiwgY3R4KTsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBwUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKG1DdHgpOworICAgICAgICBTY3JpcHRDX2ZwX21hZCBzID0gbmV3IFNjcmlwdENfZnBfbWFkKHBSUywgbVJlcywgUi5yYXcuZnBfbWFkKTsKKyAgICAgICAgcFJTLnNldE1lc3NhZ2VIYW5kbGVyKG1Sc01lc3NhZ2UpOworICAgICAgICBzLmludm9rZV9mcF9tYWRfdGVzdCgwLCAwKTsKKyAgICAgICAgcFJTLmZpbmlzaCgpOworICAgICAgICB3YWl0Rm9yTWVzc2FnZSgpOworICAgICAgICBwUlMuZGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9tYXRoLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfbWF0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMTM1YzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfbWF0aC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjE0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX21hdGggZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKworICAgIHByb3RlY3RlZCBVVF9tYXRoKFJTVGVzdENvcmUgcnN0YywgUmVzb3VyY2VzIHJlcywgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIocnN0YywgIk1hdGgiLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUobUN0eCk7CisgICAgICAgIFNjcmlwdENfbWF0aCBzID0gbmV3IFNjcmlwdENfbWF0aChwUlMsIG1SZXMsIFIucmF3Lm1hdGgpOworICAgICAgICBwUlMuc2V0TWVzc2FnZUhhbmRsZXIobVJzTWVzc2FnZSk7CisgICAgICAgIHMuaW52b2tlX21hdGhfdGVzdCgwLCAwKTsKKyAgICAgICAgcFJTLmZpbmlzaCgpOworICAgICAgICB3YWl0Rm9yTWVzc2FnZSgpOworICAgICAgICBwUlMuZGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9wcmltaXRpdmVzLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcHJpbWl0aXZlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYzU2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcHJpbWl0aXZlcy5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxNDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CisKK3B1YmxpYyBjbGFzcyBVVF9wcmltaXRpdmVzIGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisKKyAgICBwcm90ZWN0ZWQgVVRfcHJpbWl0aXZlcyhSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJQcmltaXRpdmVzIiwgY3R4KTsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZUdsb2JhbHMoU2NyaXB0Q19wcmltaXRpdmVzIHMpIHsKKyAgICAgICAgZmxvYXQgcEYgPSBzLmdldF9mbG9hdFRlc3QoKTsKKyAgICAgICAgaWYgKHBGICE9IDEuOTlmKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcy5zZXRfZmxvYXRUZXN0KDIuOTlmKTsKKworICAgICAgICBkb3VibGUgcEQgPSBzLmdldF9kb3VibGVUZXN0KCk7CisgICAgICAgIGlmIChwRCAhPSAyLjA1KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcy5zZXRfZG91YmxlVGVzdCgzLjA1KTsKKworICAgICAgICBieXRlIHBDID0gcy5nZXRfY2hhclRlc3QoKTsKKyAgICAgICAgaWYgKHBDICE9IC04KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcy5zZXRfY2hhclRlc3QoKGJ5dGUpLTE2KTsKKworICAgICAgICBzaG9ydCBwUyA9IHMuZ2V0X3Nob3J0VGVzdCgpOworICAgICAgICBpZiAocFMgIT0gLTE2KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcy5zZXRfc2hvcnRUZXN0KChzaG9ydCktMzIpOworCisgICAgICAgIGludCBwSSA9IHMuZ2V0X2ludFRlc3QoKTsKKyAgICAgICAgaWYgKHBJICE9IC0zMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X2ludFRlc3QoLTY0KTsKKworICAgICAgICBsb25nIHBMID0gcy5nZXRfbG9uZ1Rlc3QoKTsKKyAgICAgICAgaWYgKHBMICE9IDE3MTc5ODY5MTg0bCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X2xvbmdUZXN0KDE3MTc5ODY5MTg1bCk7CisKKyAgICAgICAgbG9uZyBwdUwgPSBzLmdldF91bG9uZ1Rlc3QoKTsKKyAgICAgICAgaWYgKHB1TCAhPSA0NjExNjg2MDE4NDI3Mzg3OTA0TCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X3Vsb25nVGVzdCg0NjExNjg2MDE4NDI3Mzg3OTAzTCk7CisKKworICAgICAgICBsb25nIHBMTCA9IHMuZ2V0X2xvbmdsb25nVGVzdCgpOworICAgICAgICBpZiAocExMICE9IDY4NzE5NDc2NzM2TCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X2xvbmdsb25nVGVzdCg2ODcxOTQ3NjczNUwpOworCisgICAgICAgIGxvbmcgcHU2NCA9IHMuZ2V0X3VpbnQ2NF90VGVzdCgpOworICAgICAgICBpZiAocHU2NCAhPSAxMTcxNzk4NjkxODRsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcy5zZXRfdWludDY0X3RUZXN0KDExNzE3OTg2OTE4NWwpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUobUN0eCk7CisgICAgICAgIFNjcmlwdENfcHJpbWl0aXZlcyBzID0gbmV3IFNjcmlwdENfcHJpbWl0aXZlcyhwUlMsIG1SZXMsIFIucmF3LnByaW1pdGl2ZXMpOworICAgICAgICBwUlMuc2V0TWVzc2FnZUhhbmRsZXIobVJzTWVzc2FnZSk7CisgICAgICAgIGlmICghaW5pdGlhbGl6ZUdsb2JhbHMocykpIHsKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemVHbG9iYWxzIGZhaWxlZAorICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLmludm9rZV9wcmltaXRpdmVzX3Rlc3QoMCwgMCk7CisgICAgICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgICAgICB3YWl0Rm9yTWVzc2FnZSgpOworICAgICAgICB9CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JlZmNvdW50LmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcmVmY291bnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWE1MTZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JlZmNvdW50LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfcmVmY291bnQgZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKworICAgIHByb3RlY3RlZCBVVF9yZWZjb3VudChSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJSZWZjb3VudCIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHbG9iYWxzKFJlbmRlclNjcmlwdCBSUywgU2NyaXB0Q19yZWZjb3VudCBzKSB7CisgICAgICAgIFR5cGUuQnVpbGRlciB0eXBlQnVpbGRlciA9IG5ldyBUeXBlLkJ1aWxkZXIoUlMsIEVsZW1lbnQuSTMyKFJTKSk7CisgICAgICAgIGludCBYID0gNTAwOworICAgICAgICBpbnQgWSA9IDcwMDsKKyAgICAgICAgdHlwZUJ1aWxkZXIuc2V0WChYKS5zZXRZKFkpOworICAgICAgICBBbGxvY2F0aW9uIEEgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKFJTLCB0eXBlQnVpbGRlci5jcmVhdGUoKSk7CisgICAgICAgIHMuc2V0X2dsb2JhbEEoQSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZShtQ3R4KTsKKyAgICAgICAgcFJTLnNldE1lc3NhZ2VIYW5kbGVyKG1Sc01lc3NhZ2UpOworICAgICAgICBTY3JpcHRDX3JlZmNvdW50IHMgPSBuZXcgU2NyaXB0Q19yZWZjb3VudChwUlMsIG1SZXMsIFIucmF3LnJlZmNvdW50KTsKKyAgICAgICAgaW5pdGlhbGl6ZUdsb2JhbHMocFJTLCBzKTsKKyAgICAgICAgcy5pbnZva2VfcmVmY291bnRfdGVzdCgpOworICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JzZGVidWcuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc2RlYnVnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlOTJlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc2RlYnVnLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfcnNkZWJ1ZyBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX3JzZGVidWcoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzLCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihyc3RjLCAicnNEZWJ1ZyIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZShtQ3R4KTsKKyAgICAgICAgU2NyaXB0Q19yc2RlYnVnIHMgPSBuZXcgU2NyaXB0Q19yc2RlYnVnKHBSUywgbVJlcywgUi5yYXcucnNkZWJ1Zyk7CisgICAgICAgIHBSUy5zZXRNZXNzYWdlSGFuZGxlcihtUnNNZXNzYWdlKTsKKyAgICAgICAgcy5pbnZva2VfdGVzdF9yc2RlYnVnKDAsIDApOworICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JzdGltZS5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JzdGltZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmVkZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcnN0aW1lLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfcnN0aW1lIGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisKKyAgICBwcm90ZWN0ZWQgVVRfcnN0aW1lKFJTVGVzdENvcmUgcnN0YywgUmVzb3VyY2VzIHJlcywgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIocnN0YywgInJzVGltZSIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZShtQ3R4KTsKKyAgICAgICAgU2NyaXB0Q19yc3RpbWUgcyA9IG5ldyBTY3JpcHRDX3JzdGltZShwUlMsIG1SZXMsIFIucmF3LnJzdGltZSk7CisgICAgICAgIHBSUy5zZXRNZXNzYWdlSGFuZGxlcihtUnNNZXNzYWdlKTsKKyAgICAgICAgcy5pbnZva2VfdGVzdF9yc3RpbWUoMCwgMCk7CisgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcnN0eXBlcy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JzdHlwZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjk2ODY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JzdHlwZXMuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxNDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CisKK3B1YmxpYyBjbGFzcyBVVF9yc3R5cGVzIGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisKKyAgICBwcm90ZWN0ZWQgVVRfcnN0eXBlcyhSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJyc1R5cGVzIiwgY3R4KTsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBwUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKG1DdHgpOworICAgICAgICBTY3JpcHRDX3JzdHlwZXMgcyA9IG5ldyBTY3JpcHRDX3JzdHlwZXMocFJTLCBtUmVzLCBSLnJhdy5yc3R5cGVzKTsKKyAgICAgICAgcFJTLnNldE1lc3NhZ2VIYW5kbGVyKG1Sc01lc3NhZ2UpOworICAgICAgICBzLmludm9rZV90ZXN0X3JzdHlwZXMoMCwgMCk7CisgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfdmVjdG9yLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfdmVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3NDEzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF92ZWN0b3IuamF2YQpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfdmVjdG9yIGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisKKyAgICBwcm90ZWN0ZWQgVVRfdmVjdG9yKFJTVGVzdENvcmUgcnN0YywgUmVzb3VyY2VzIHJlcywgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIocnN0YywgIlZlY3RvciIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVHbG9iYWxzKFNjcmlwdENfdmVjdG9yIHMpIHsKKyAgICAgICAgRmxvYXQyIEYyID0gcy5nZXRfZjIoKTsKKyAgICAgICAgaWYgKEYyLnggIT0gMS4wZiB8fCBGMi55ICE9IDIuMGYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBGMi54ID0gMi45OWY7CisgICAgICAgIEYyLnkgPSAzLjk5ZjsKKyAgICAgICAgcy5zZXRfZjIoRjIpOworCisgICAgICAgIEZsb2F0MyBGMyA9IHMuZ2V0X2YzKCk7CisgICAgICAgIGlmIChGMy54ICE9IDEuMGYgfHwgRjMueSAhPSAyLjBmIHx8IEYzLnogIT0gMy4wZikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEYzLnggPSAyLjk5ZjsKKyAgICAgICAgRjMueSA9IDMuOTlmOworICAgICAgICBGMy56ID0gNC45OWY7CisgICAgICAgIHMuc2V0X2YzKEYzKTsKKworICAgICAgICBGbG9hdDQgRjQgPSBzLmdldF9mNCgpOworICAgICAgICBpZiAoRjQueCAhPSAxLjBmIHx8IEY0LnkgIT0gMi4wZiB8fCBGNC56ICE9IDMuMGYgfHwgRjQudyAhPSA0LjBmKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgRjQueCA9IDIuOTlmOworICAgICAgICBGNC55ID0gMy45OWY7CisgICAgICAgIEY0LnogPSA0Ljk5ZjsKKyAgICAgICAgRjQudyA9IDUuOTlmOworICAgICAgICBzLnNldF9mNChGNCk7CisKKyAgICAgICAgRG91YmxlMiBEMiA9IHMuZ2V0X2QyKCk7CisgICAgICAgIGlmIChEMi54ICE9IDEuMCB8fCBEMi55ICE9IDIuMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEQyLnggPSAyLjk5OworICAgICAgICBEMi55ID0gMy45OTsKKyAgICAgICAgcy5zZXRfZDIoRDIpOworCisgICAgICAgIERvdWJsZTMgRDMgPSBzLmdldF9kMygpOworICAgICAgICBpZiAoRDMueCAhPSAxLjAgfHwgRDMueSAhPSAyLjAgfHwgRDMueiAhPSAzLjApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBEMy54ID0gMi45OTsKKyAgICAgICAgRDMueSA9IDMuOTk7CisgICAgICAgIEQzLnogPSA0Ljk5OworICAgICAgICBzLnNldF9kMyhEMyk7CisKKyAgICAgICAgRG91YmxlNCBENCA9IHMuZ2V0X2Q0KCk7CisgICAgICAgIGlmIChENC54ICE9IDEuMCB8fCBENC55ICE9IDIuMCB8fCBENC56ICE9IDMuMCB8fCBENC53ICE9IDQuMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEQ0LnggPSAyLjk5OworICAgICAgICBENC55ID0gMy45OTsKKyAgICAgICAgRDQueiA9IDQuOTk7CisgICAgICAgIEQ0LncgPSA1Ljk5OworICAgICAgICBzLnNldF9kNChENCk7CisKKyAgICAgICAgQnl0ZTIgQjIgPSBzLmdldF9pOF8yKCk7CisgICAgICAgIGlmIChCMi54ICE9IDEgfHwgQjIueSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQjIueCA9IDI7CisgICAgICAgIEIyLnkgPSAzOworICAgICAgICBzLnNldF9pOF8yKEIyKTsKKworICAgICAgICBCeXRlMyBCMyA9IHMuZ2V0X2k4XzMoKTsKKyAgICAgICAgaWYgKEIzLnggIT0gMSB8fCBCMy55ICE9IDIgfHwgQjMueiAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQjMueCA9IDI7CisgICAgICAgIEIzLnkgPSAzOworICAgICAgICBCMy56ID0gNDsKKyAgICAgICAgcy5zZXRfaThfMyhCMyk7CisKKyAgICAgICAgQnl0ZTQgQjQgPSBzLmdldF9pOF80KCk7CisgICAgICAgIGlmIChCNC54ICE9IDEgfHwgQjQueSAhPSAyIHx8IEI0LnogIT0gMyB8fCBCNC53ICE9IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBCNC54ID0gMjsKKyAgICAgICAgQjQueSA9IDM7CisgICAgICAgIEI0LnogPSA0OworICAgICAgICBCNC53ID0gNTsKKyAgICAgICAgcy5zZXRfaThfNChCNCk7CisKKyAgICAgICAgU2hvcnQyIFMyID0gcy5nZXRfdThfMigpOworICAgICAgICBpZiAoUzIueCAhPSAxIHx8IFMyLnkgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFMyLnggPSAyOworICAgICAgICBTMi55ID0gMzsKKyAgICAgICAgcy5zZXRfdThfMihTMik7CisKKyAgICAgICAgU2hvcnQzIFMzID0gcy5nZXRfdThfMygpOworICAgICAgICBpZiAoUzMueCAhPSAxIHx8IFMzLnkgIT0gMiB8fCBTMy56ICE9IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTMy54ID0gMjsKKyAgICAgICAgUzMueSA9IDM7CisgICAgICAgIFMzLnogPSA0OworICAgICAgICBzLnNldF91OF8zKFMzKTsKKworICAgICAgICBTaG9ydDQgUzQgPSBzLmdldF91OF80KCk7CisgICAgICAgIGlmIChTNC54ICE9IDEgfHwgUzQueSAhPSAyIHx8IFM0LnogIT0gMyB8fCBTNC53ICE9IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTNC54ID0gMjsKKyAgICAgICAgUzQueSA9IDM7CisgICAgICAgIFM0LnogPSA0OworICAgICAgICBTNC53ID0gNTsKKyAgICAgICAgcy5zZXRfdThfNChTNCk7CisKKyAgICAgICAgUzIgPSBzLmdldF9pMTZfMigpOworICAgICAgICBpZiAoUzIueCAhPSAxIHx8IFMyLnkgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFMyLnggPSAyOworICAgICAgICBTMi55ID0gMzsKKyAgICAgICAgcy5zZXRfaTE2XzIoUzIpOworCisgICAgICAgIFMzID0gcy5nZXRfaTE2XzMoKTsKKyAgICAgICAgaWYgKFMzLnggIT0gMSB8fCBTMy55ICE9IDIgfHwgUzMueiAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgUzMueCA9IDI7CisgICAgICAgIFMzLnkgPSAzOworICAgICAgICBTMy56ID0gNDsKKyAgICAgICAgcy5zZXRfaTE2XzMoUzMpOworCisgICAgICAgIFM0ID0gcy5nZXRfaTE2XzQoKTsKKyAgICAgICAgaWYgKFM0LnggIT0gMSB8fCBTNC55ICE9IDIgfHwgUzQueiAhPSAzIHx8IFM0LncgIT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFM0LnggPSAyOworICAgICAgICBTNC55ID0gMzsKKyAgICAgICAgUzQueiA9IDQ7CisgICAgICAgIFM0LncgPSA1OworICAgICAgICBzLnNldF9pMTZfNChTNCk7CisKKyAgICAgICAgSW50MiBJMiA9IHMuZ2V0X3UxNl8yKCk7CisgICAgICAgIGlmIChJMi54ICE9IDEgfHwgSTIueSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgSTIueCA9IDI7CisgICAgICAgIEkyLnkgPSAzOworICAgICAgICBzLnNldF91MTZfMihJMik7CisKKyAgICAgICAgSW50MyBJMyA9IHMuZ2V0X3UxNl8zKCk7CisgICAgICAgIGlmIChJMy54ICE9IDEgfHwgSTMueSAhPSAyIHx8IEkzLnogIT0gMykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEkzLnggPSAyOworICAgICAgICBJMy55ID0gMzsKKyAgICAgICAgSTMueiA9IDQ7CisgICAgICAgIHMuc2V0X3UxNl8zKEkzKTsKKworICAgICAgICBJbnQ0IEk0ID0gcy5nZXRfdTE2XzQoKTsKKyAgICAgICAgaWYgKEk0LnggIT0gMSB8fCBJNC55ICE9IDIgfHwgSTQueiAhPSAzIHx8IEk0LncgIT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEk0LnggPSAyOworICAgICAgICBJNC55ID0gMzsKKyAgICAgICAgSTQueiA9IDQ7CisgICAgICAgIEk0LncgPSA1OworICAgICAgICBzLnNldF91MTZfNChJNCk7CisKKyAgICAgICAgSTIgPSBzLmdldF9pMzJfMigpOworICAgICAgICBpZiAoSTIueCAhPSAxIHx8IEkyLnkgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEkyLnggPSAyOworICAgICAgICBJMi55ID0gMzsKKyAgICAgICAgcy5zZXRfaTMyXzIoSTIpOworCisgICAgICAgIEkzID0gcy5nZXRfaTMyXzMoKTsKKyAgICAgICAgaWYgKEkzLnggIT0gMSB8fCBJMy55ICE9IDIgfHwgSTMueiAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgSTMueCA9IDI7CisgICAgICAgIEkzLnkgPSAzOworICAgICAgICBJMy56ID0gNDsKKyAgICAgICAgcy5zZXRfaTMyXzMoSTMpOworCisgICAgICAgIEk0ID0gcy5nZXRfaTMyXzQoKTsKKyAgICAgICAgaWYgKEk0LnggIT0gMSB8fCBJNC55ICE9IDIgfHwgSTQueiAhPSAzIHx8IEk0LncgIT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEk0LnggPSAyOworICAgICAgICBJNC55ID0gMzsKKyAgICAgICAgSTQueiA9IDQ7CisgICAgICAgIEk0LncgPSA1OworICAgICAgICBzLnNldF9pMzJfNChJNCk7CisKKyAgICAgICAgTG9uZzIgTDIgPSBzLmdldF91MzJfMigpOworICAgICAgICBpZiAoTDIueCAhPSAxIHx8IEwyLnkgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEwyLnggPSAyOworICAgICAgICBMMi55ID0gMzsKKyAgICAgICAgcy5zZXRfdTMyXzIoTDIpOworCisgICAgICAgIExvbmczIEwzID0gcy5nZXRfdTMyXzMoKTsKKyAgICAgICAgaWYgKEwzLnggIT0gMSB8fCBMMy55ICE9IDIgfHwgTDMueiAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTDMueCA9IDI7CisgICAgICAgIEwzLnkgPSAzOworICAgICAgICBMMy56ID0gNDsKKyAgICAgICAgcy5zZXRfdTMyXzMoTDMpOworCisgICAgICAgIExvbmc0IEw0ID0gcy5nZXRfdTMyXzQoKTsKKyAgICAgICAgaWYgKEw0LnggIT0gMSB8fCBMNC55ICE9IDIgfHwgTDQueiAhPSAzIHx8IEw0LncgIT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEw0LnggPSAyOworICAgICAgICBMNC55ID0gMzsKKyAgICAgICAgTDQueiA9IDQ7CisgICAgICAgIEw0LncgPSA1OworICAgICAgICBzLnNldF91MzJfNChMNCk7CisKKyAgICAgICAgTDIgPSBzLmdldF9pNjRfMigpOworICAgICAgICBpZiAoTDIueCAhPSAxIHx8IEwyLnkgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEwyLnggPSAyOworICAgICAgICBMMi55ID0gMzsKKyAgICAgICAgcy5zZXRfaTY0XzIoTDIpOworCisgICAgICAgIEwzID0gcy5nZXRfaTY0XzMoKTsKKyAgICAgICAgaWYgKEwzLnggIT0gMSB8fCBMMy55ICE9IDIgfHwgTDMueiAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTDMueCA9IDI7CisgICAgICAgIEwzLnkgPSAzOworICAgICAgICBMMy56ID0gNDsKKyAgICAgICAgcy5zZXRfaTY0XzMoTDMpOworCisgICAgICAgIEw0ID0gcy5nZXRfaTY0XzQoKTsKKyAgICAgICAgaWYgKEw0LnggIT0gMSB8fCBMNC55ICE9IDIgfHwgTDQueiAhPSAzIHx8IEw0LncgIT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEw0LnggPSAyOworICAgICAgICBMNC55ID0gMzsKKyAgICAgICAgTDQueiA9IDQ7CisgICAgICAgIEw0LncgPSA1OworICAgICAgICBzLnNldF9pNjRfNChMNCk7CisKKyAgICAgICAgTDIgPSBzLmdldF91NjRfMigpOworICAgICAgICBpZiAoTDIueCAhPSAxIHx8IEwyLnkgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEwyLnggPSAyOworICAgICAgICBMMi55ID0gMzsKKyAgICAgICAgcy5zZXRfdTY0XzIoTDIpOworCisgICAgICAgIEwzID0gcy5nZXRfdTY0XzMoKTsKKyAgICAgICAgaWYgKEwzLnggIT0gMSB8fCBMMy55ICE9IDIgfHwgTDMueiAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTDMueCA9IDI7CisgICAgICAgIEwzLnkgPSAzOworICAgICAgICBMMy56ID0gNDsKKyAgICAgICAgcy5zZXRfdTY0XzMoTDMpOworCisgICAgICAgIEw0ID0gcy5nZXRfdTY0XzQoKTsKKyAgICAgICAgaWYgKEw0LnggIT0gMSB8fCBMNC55ICE9IDIgfHwgTDQueiAhPSAzIHx8IEw0LncgIT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEw0LnggPSAyOworICAgICAgICBMNC55ID0gMzsKKyAgICAgICAgTDQueiA9IDQ7CisgICAgICAgIEw0LncgPSA1OworICAgICAgICBzLnNldF91NjRfNChMNCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZShtQ3R4KTsKKyAgICAgICAgU2NyaXB0Q192ZWN0b3IgcyA9IG5ldyBTY3JpcHRDX3ZlY3RvcihwUlMsIG1SZXMsIFIucmF3LnZlY3Rvcik7CisgICAgICAgIHBSUy5zZXRNZXNzYWdlSGFuZGxlcihtUnNNZXNzYWdlKTsKKyAgICAgICAgaWYgKCFpbml0aWFsaXplR2xvYmFscyhzKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLmludm9rZV92ZWN0b3JfdGVzdCgpOworICAgICAgICAgICAgcFJTLmZpbmlzaCgpOworICAgICAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBwUlMuZGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9Vbml0VGVzdC5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VuaXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4YTI1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9Vbml0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxNDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdC5SU01lc3NhZ2VIYW5kbGVyOworCitwdWJsaWMgY2xhc3MgVW5pdFRlc3QgZXh0ZW5kcyBUaHJlYWQgeworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgaW50IHJlc3VsdDsKKyAgICBwcml2YXRlIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtIG1JdGVtOworICAgIHByaXZhdGUgUlNUZXN0Q29yZSBtUlNUQzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbXNnSGFuZGxlZDsKKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ3R4OworCisgICAgLyogVGhlc2UgY29uc3RhbnRzIG11c3QgbWF0Y2ggdGhvc2UgaW4gc2hhcmVkLnJzaCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJTX01TR19URVNUX1BBU1NFRCA9IDEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSU19NU0dfVEVTVF9GQUlMRUQgPSAxMDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbnVtVGVzdHMgPSAwOworICAgIHB1YmxpYyBpbnQgdGVzdElEOworCisgICAgcHJvdGVjdGVkIFVuaXRUZXN0KFJTVGVzdENvcmUgcnN0YywgU3RyaW5nIG4sIGludCBpbml0UmVzdWx0LCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBtUlNUQyA9IHJzdGM7CisgICAgICAgIG5hbWUgPSBuOworICAgICAgICBtc2dIYW5kbGVkID0gZmFsc2U7CisgICAgICAgIG1DdHggPSBjdHg7CisgICAgICAgIHJlc3VsdCA9IGluaXRSZXN1bHQ7CisgICAgICAgIHRlc3RJRCA9IG51bVRlc3RzKys7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFVuaXRUZXN0KFJTVGVzdENvcmUgcnN0YywgU3RyaW5nIG4sIENvbnRleHQgY3R4KSB7CisgICAgICAgIHRoaXMocnN0YywgbiwgMCwgY3R4KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVW5pdFRlc3QoUlNUZXN0Q29yZSByc3RjLCBDb250ZXh0IGN0eCkgeworICAgICAgICB0aGlzIChyc3RjLCAiPFVua25vd24+IiwgY3R4KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVW5pdFRlc3QoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgdGhpcyAobnVsbCwgY3R4KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBfUlNfQVNTRVJUKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGIpIHsKKyAgICAgICAgaWYoYiA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICBMb2cuZShuYW1lLCBtZXNzYWdlICsgIiBGQUlMRUQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVVJKCkgeworICAgICAgICBpZiAobUl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgbUl0ZW0ucmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgbXNnSGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1SU1RDLnJlZnJlc2hUZXN0UmVzdWx0cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLyogSWdub3JlIHRoZSBjYXNlIHdoZXJlIG91ciBtZXNzYWdlIHJlY2VpdmVyIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkLiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBsZWF2ZSB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgICBiZWZvcmUgaXQgZmluaXNoZXMgcnVubmluZyBhbGwgb2YgdGhlIHVuaXQgdGVzdHMuICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUlNNZXNzYWdlSGFuZGxlciBtUnNNZXNzYWdlID0gbmV3IFJTTWVzc2FnZUhhbmRsZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobUlEKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUlNfTVNHX1RFU1RfUEFTU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJTX01TR19URVNUX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBSU1Rlc3RfdjE0LmxvZygiVW5pdCB0ZXN0IGdvdCB1bmV4cGVjdGVkIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVwZGF0ZVVJKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHZvaWQgd2FpdEZvck1lc3NhZ2UoKSB7CisgICAgICAgIHdoaWxlICghbXNnSGFuZGxlZCkgeworICAgICAgICAgICAgeWllbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEl0ZW0oU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0gaXRlbSkgeworICAgICAgICBtSXRlbSA9IGl0ZW07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAvKiBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBmb3IgZWFjaCBzdWJjbGFzcyAqLworICAgICAgICBpZiAobVJTVEMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTVEMucmVmcmVzaFRlc3RSZXN1bHRzKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvYWxsb2MucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvYWxsb2MucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExNmU1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9hbGxvYy5ycwpAQCAtMCwwICsxLDk0IEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworaW50ICphOworaW50IGRpbVg7CitpbnQgZGltWTsKK2ludCBkaW1aOworCityc19hbGxvY2F0aW9uIGFGYWNlczsKK3JzX2FsbG9jYXRpb24gYUxPRDsKK3JzX2FsbG9jYXRpb24gYUZhY2VzTE9EOworCitzdGF0aWMgYm9vbCB0ZXN0X2FsbG9jX2RpbXMoKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaiA9IDA7IGogPCBkaW1ZOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVg7IGkrKykgeworICAgICAgICAgICAgYVtpICsgaiAqIGRpbVhdID0gaSArIGogKiBkaW1YOworICAgICAgICB9CisgICAgfQorCisgICAgcnNfYWxsb2NhdGlvbiBhbGxvYyA9IHJzR2V0QWxsb2NhdGlvbihhKTsKKyAgICBfUlNfQVNTRVJUKHJzQWxsb2NhdGlvbkdldERpbVgoYWxsb2MpID09IGRpbVgpOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltWShhbGxvYykgPT0gZGltWSk7CisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1aKGFsbG9jKSA9PSBkaW1aKTsKKworICAgIC8vIFRlc3QgMkQgYWRkcmVzc2luZworICAgIGZvciAoaiA9IDA7IGogPCBkaW1ZOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVg7IGkrKykgeworICAgICAgICAgICAgcnNEZWJ1ZygiVmVyaWZ5aW5nICIsIGkgKyBqICogZGltWCk7CisgICAgICAgICAgICBjb25zdCB2b2lkICpwID0gcnNHZXRFbGVtZW50QXQoYWxsb2MsIGksIGopOworICAgICAgICAgICAgaW50IHZhbCA9ICooY29uc3QgaW50ICopcDsKKyAgICAgICAgICAgIF9SU19BU1NFUlQodmFsID09IChpICsgaiAqIGRpbVgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRlc3QgMUQgYWRkcmVzc2luZworICAgIGZvciAoaSA9IDA7IGkgPCBkaW1YICogZGltWTsgaSsrKSB7CisgICAgICAgIHJzRGVidWcoIlZlcmlmeWluZyAiLCBpKTsKKyAgICAgICAgY29uc3Qgdm9pZCAqcCA9IHJzR2V0RWxlbWVudEF0KGFsbG9jLCBpKTsKKyAgICAgICAgaW50IHZhbCA9ICooY29uc3QgaW50ICopcDsKKyAgICAgICAgX1JTX0FTU0VSVCh2YWwgPT0gaSk7CisgICAgfQorCisgICAgLy8gVGVzdCAzRCBhZGRyZXNzaW5nCisgICAgZm9yIChqID0gMDsgaiA8IGRpbVk7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWDsgaSsrKSB7CisgICAgICAgICAgICByc0RlYnVnKCJWZXJpZnlpbmcgIiwgaSArIGogKiBkaW1YKTsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKnAgPSByc0dldEVsZW1lbnRBdChhbGxvYywgaSwgaiwgMCk7CisgICAgICAgICAgICBpbnQgdmFsID0gKihjb25zdCBpbnQgKilwOworICAgICAgICAgICAgX1JTX0FTU0VSVCh2YWwgPT0gKGkgKyBqICogZGltWCkpOworICAgICAgICB9CisgICAgfQorCisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1YKGFGYWNlcykgPT0gZGltWCk7CisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1ZKGFGYWNlcykgPT0gZGltWSk7CisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1aKGFGYWNlcykgPT0gZGltWik7CisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1GYWNlcyhhRmFjZXMpICE9IDApOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltTE9EKGFGYWNlcykgPT0gMCk7CisKKyAgICBfUlNfQVNTRVJUKHJzQWxsb2NhdGlvbkdldERpbVgoYUxPRCkgPT0gZGltWCk7CisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1ZKGFMT0QpID09IGRpbVkpOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltWihhTE9EKSA9PSBkaW1aKTsKKyAgICBfUlNfQVNTRVJUKHJzQWxsb2NhdGlvbkdldERpbUZhY2VzKGFMT0QpID09IDApOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltTE9EKGFMT0QpICE9IDApOworCisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1YKGFGYWNlc0xPRCkgPT0gZGltWCk7CisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1ZKGFGYWNlc0xPRCkgPT0gZGltWSk7CisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1aKGFGYWNlc0xPRCkgPT0gZGltWik7CisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1GYWNlcyhhRmFjZXNMT0QpICE9IDApOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltTE9EKGFGYWNlc0xPRCkgIT0gMCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfYWxsb2NfZGltcyBGQUlMRUQiLCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfYWxsb2NfZGltcyBQQVNTRUQiLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCit2b2lkIGFsbG9jX3Rlc3QoKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmYWlsZWQgfD0gdGVzdF9hbGxvY19kaW1zKCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mb3JlYWNoLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L2ZvcmVhY2gucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhM2VlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mb3JlYWNoLnJzCkBAIC0wLDAgKzEsNDIgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCitpbnQgKmE7CitpbnQgZGltWDsKK2ludCBkaW1ZOworCit2b2lkIHJvb3QoaW50ICpvdXQsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICAqb3V0ID0geCArIHkgKiBkaW1YOworfQorCitzdGF0aWMgYm9vbCB0ZXN0X2ZvcmVhY2hfb3V0cHV0KCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgZGltWTsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1YOyBpKyspIHsKKyAgICAgICAgICAgIF9SU19BU1NFUlQoYVtpICsgaiAqIGRpbVhdID09IChpICsgaiAqIGRpbVgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9mb3JlYWNoX291dHB1dCBGQUlMRUQiLCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfZm9yZWFjaF9vdXRwdXQgUEFTU0VEIiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCBmb3JlYWNoX3Rlc3QoKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmYWlsZWQgfD0gdGVzdF9mb3JlYWNoX291dHB1dCgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZnBfbWFkLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L2ZwX21hZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmYyYjJhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mcF9tYWQucnMKQEAgLTAsMCArMSwxNzQgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCitjb25zdCBpbnQgVEVTVF9DT1VOVCA9IDE7CisKK3N0YXRpYyBmbG9hdCBkYXRhX2YxWzEwMjVdOworc3RhdGljIGZsb2F0NCBkYXRhX2Y0WzEwMjVdOworCitzdGF0aWMgdm9pZCB0ZXN0X21hZDQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xIGJpbGxpb24gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogKDEwMDAgLyA4MCk7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSAoZGF0YV9mNFtpXSAqIDAuMDJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzFdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krMl0gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSszXSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krNF0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzVdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs2XSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krN10gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs4XSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzldICogMC4wMmYgKyAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfbWFkNCBNIG9wcyIsIDEwMDAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X21hZCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEgYmlsbGlvbiBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAoMTAwMCAvIDIwKTsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mMVtpXSA9IChkYXRhX2YxW2ldICogMC4wMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krMV0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSsyXSAqIDAuMDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzNdICogMC4xZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs0XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krNV0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzZdICogMC4xZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs3XSAqIDAuMDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzhdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krOV0gKiAwLjAyZiArIDEuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9tYWQgTSBvcHMiLCAxMDAwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9ub3JtKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IG5vcm1hbGl6ZShkYXRhX2Y0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX25vcm0gTSBvcHMiLCAxMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2luY29zNCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAgLyA0OyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gc2luKGRhdGFfZjRbaV0pICogY29zKGRhdGFfZjRbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfc2luY29zNCBNIG9wcyIsIDEwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zaW5jb3ModWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2YxW2ldID0gc2luKGRhdGFfZjFbaV0pICogY29zKGRhdGFfZjFbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfc2luY29zIE0gb3BzIiwgMTAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2NsYW1wKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIC8vIERvIH4xMDAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjFbaV0gPSBjbGFtcChkYXRhX2YxW2ldLCAtMS5mLCAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfY2xhbXAgTSBvcHMiLCAxMDAuZiAvIHRpbWUpOworCisgICAgc3RhcnQoKTsKKyAgICAvLyBEbyB+MTAwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YV9mMVtpXSA8IC0xLmYpIGRhdGFfZjFbaV0gPSAtMS5mOworICAgICAgICAgICAgaWYgKGRhdGFfZjFbaV0gPiAtMS5mKSBkYXRhX2YxW2ldID0gMS5mOworICAgICAgICB9CisgICAgfQorCisgICAgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfY2xhbXAgcmVmIE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jbGFtcDQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMDAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDAgLzQ7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBjbGFtcChkYXRhX2Y0W2ldLCAtMS5mLCAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfY2xhbXA0IE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKK30KKwordm9pZCBmcF9tYWRfdGVzdCh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgaW50IHg7CisgICAgZm9yICh4PTA7IHggPCAxMDI1OyB4KyspIHsKKyAgICAgICAgZGF0YV9mMVt4XSA9ICh4ICYgMHhmKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0ueCA9ICh4ICYgMHhmKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0ueSA9ICh4ICYgMHhmMCkgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnogPSAoeCAmIDB4MzMpICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS53ID0gKHggJiAweDc3KSAqIDAuMWY7CisgICAgfQorCisgICAgdGVzdF9tYWQ0KGluZGV4KTsKKyAgICB0ZXN0X21hZChpbmRleCk7CisKKyAgICBmb3IgKHg9MDsgeCA8IDEwMjU7IHgrKykgeworICAgICAgICBkYXRhX2YxW3hdID0gKHggJiAweGYpICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS54ID0gKHggJiAweGYpICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS55ID0gKHggJiAweGYwKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueiA9ICh4ICYgMHgzMykgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLncgPSAoeCAmIDB4NzcpICogMC4xZiArIDEuZjsKKyAgICB9CisKKyAgICB0ZXN0X25vcm0oaW5kZXgpOworICAgIHRlc3Rfc2luY29zNChpbmRleCk7CisgICAgdGVzdF9zaW5jb3MoaW5kZXgpOworICAgIHRlc3RfY2xhbXA0KGluZGV4KTsKKyAgICB0ZXN0X2NsYW1wKGluZGV4KTsKKworICAgIC8vIFRPRE8gQWN0dWFsbHkgdmVyaWZ5IHRlc3QgcmVzdWx0IGFjY3VyYWN5CisgICAgcnNEZWJ1ZygiZnBfbWFkX3Rlc3QgUEFTU0VEIiwgMCk7CisgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9QQVNTRUQpOworfQorCisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9tYXRoLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L21hdGgucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiMzdmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9tYXRoLnJzCkBAIC0wLDAgKzEsNDYyIEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworLy8gVGVzdGluZyBtYXRoIGxpYnJhcnkKKwordm9sYXRpbGUgZmxvYXQgZjE7Cit2b2xhdGlsZSBmbG9hdDIgZjI7Cit2b2xhdGlsZSBmbG9hdDMgZjM7Cit2b2xhdGlsZSBmbG9hdDQgZjQ7CisKK3ZvbGF0aWxlIGludCBpMTsKK3ZvbGF0aWxlIGludDIgaTI7Cit2b2xhdGlsZSBpbnQzIGkzOwordm9sYXRpbGUgaW50NCBpNDsKKwordm9sYXRpbGUgdWludCB1aTE7Cit2b2xhdGlsZSB1aW50MiB1aTI7Cit2b2xhdGlsZSB1aW50MyB1aTM7Cit2b2xhdGlsZSB1aW50NCB1aTQ7CisKK3ZvbGF0aWxlIHNob3J0IHMxOwordm9sYXRpbGUgc2hvcnQyIHMyOwordm9sYXRpbGUgc2hvcnQzIHMzOwordm9sYXRpbGUgc2hvcnQ0IHM0OworCit2b2xhdGlsZSB1c2hvcnQgdXMxOwordm9sYXRpbGUgdXNob3J0MiB1czI7Cit2b2xhdGlsZSB1c2hvcnQzIHVzMzsKK3ZvbGF0aWxlIHVzaG9ydDQgdXM0OworCit2b2xhdGlsZSBjaGFyIGMxOwordm9sYXRpbGUgY2hhcjIgYzI7Cit2b2xhdGlsZSBjaGFyMyBjMzsKK3ZvbGF0aWxlIGNoYXI0IGM0OworCit2b2xhdGlsZSB1Y2hhciB1YzE7Cit2b2xhdGlsZSB1Y2hhcjIgdWMyOwordm9sYXRpbGUgdWNoYXIzIHVjMzsKK3ZvbGF0aWxlIHVjaGFyNCB1YzQ7CisKKyNkZWZpbmUgREVDTF9JTlQocHJlZml4KSAgICAgICAgICAgIFwKK3ZvbGF0aWxlIGNoYXIgcHJlZml4IyNfY18xID0gMTsgICAgIFwKK3ZvbGF0aWxlIGNoYXIyIHByZWZpeCMjX2NfMiA9IDE7ICAgIFwKK3ZvbGF0aWxlIGNoYXIzIHByZWZpeCMjX2NfMyA9IDE7ICAgIFwKK3ZvbGF0aWxlIGNoYXI0IHByZWZpeCMjX2NfNCA9IDE7ICAgIFwKK3ZvbGF0aWxlIHVjaGFyIHByZWZpeCMjX3VjXzEgPSAxOyAgIFwKK3ZvbGF0aWxlIHVjaGFyMiBwcmVmaXgjI191Y18yID0gMTsgIFwKK3ZvbGF0aWxlIHVjaGFyMyBwcmVmaXgjI191Y18zID0gMTsgIFwKK3ZvbGF0aWxlIHVjaGFyNCBwcmVmaXgjI191Y180ID0gMTsgIFwKK3ZvbGF0aWxlIHNob3J0IHByZWZpeCMjX3NfMSA9IDE7ICAgIFwKK3ZvbGF0aWxlIHNob3J0MiBwcmVmaXgjI19zXzIgPSAxOyAgIFwKK3ZvbGF0aWxlIHNob3J0MyBwcmVmaXgjI19zXzMgPSAxOyAgIFwKK3ZvbGF0aWxlIHNob3J0NCBwcmVmaXgjI19zXzQgPSAxOyAgIFwKK3ZvbGF0aWxlIHVzaG9ydCBwcmVmaXgjI191c18xID0gMTsgIFwKK3ZvbGF0aWxlIHVzaG9ydDIgcHJlZml4IyNfdXNfMiA9IDE7IFwKK3ZvbGF0aWxlIHVzaG9ydDMgcHJlZml4IyNfdXNfMyA9IDE7IFwKK3ZvbGF0aWxlIHVzaG9ydDQgcHJlZml4IyNfdXNfNCA9IDE7IFwKK3ZvbGF0aWxlIGludCBwcmVmaXgjI19pXzEgPSAxOyAgICAgIFwKK3ZvbGF0aWxlIGludDIgcHJlZml4IyNfaV8yID0gMTsgICAgIFwKK3ZvbGF0aWxlIGludDMgcHJlZml4IyNfaV8zID0gMTsgICAgIFwKK3ZvbGF0aWxlIGludDQgcHJlZml4IyNfaV80ID0gMTsgICAgIFwKK3ZvbGF0aWxlIHVpbnQgcHJlZml4IyNfdWlfMSA9IDE7ICAgIFwKK3ZvbGF0aWxlIHVpbnQyIHByZWZpeCMjX3VpXzIgPSAxOyAgIFwKK3ZvbGF0aWxlIHVpbnQzIHByZWZpeCMjX3VpXzMgPSAxOyAgIFwKK3ZvbGF0aWxlIHVpbnQ0IHByZWZpeCMjX3VpXzQgPSAxOyAgIFwKK3ZvbGF0aWxlIGxvbmcgcHJlZml4IyNfbF8xID0gMTsgICAgIFwKK3ZvbGF0aWxlIHVsb25nIHByZWZpeCMjX3VsXzEgPSAxOworCitERUNMX0lOVChyZXMpCitERUNMX0lOVChzcmMxKQorREVDTF9JTlQoc3JjMikKKworI2RlZmluZSBURVNUX0lOVF9PUF9UWVBFKG9wLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yICIgI3R5cGUgIjEiLCBpKyspOyAgICAgICAgIFwKK3Jlc18jI3R5cGUjI18xID0gc3JjMV8jI3R5cGUjI18xIG9wIHNyYzJfIyN0eXBlIyNfMTsgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciAiICN0eXBlICIyIiwgaSsrKTsgICAgICAgICBcCityZXNfIyN0eXBlIyNfMiA9IHNyYzFfIyN0eXBlIyNfMiBvcCBzcmMyXyMjdHlwZSMjXzI7ICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgIiAjb3AgIiBmb3IgIiAjdHlwZSAiMyIsIGkrKyk7ICAgICAgICAgXAorcmVzXyMjdHlwZSMjXzMgPSBzcmMxXyMjdHlwZSMjXzMgb3Agc3JjMl8jI3R5cGUjI18zOyAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yICIgI3R5cGUgIjQiLCBpKyspOyAgICAgICAgIFwKK3Jlc18jI3R5cGUjI180ID0gc3JjMV8jI3R5cGUjI180IG9wIHNyYzJfIyN0eXBlIyNfNDsKKworI2RlZmluZSBURVNUX0lOVF9PUChvcCkgICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCBjKSAgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIHVjKSAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgcykgICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCB1cykgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIGkpICAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgdWkpICAgICAgICAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yIGwxIiwgaSsrKTsgICAgIFwKK3Jlc19sXzEgPSBzcmMxX2xfMSBvcCBzcmMyX2xfMTsgICAgICAgICAgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciB1bDEiLCBpKyspOyAgICBcCityZXNfdWxfMSA9IHNyYzFfdWxfMSBvcCBzcmMyX3VsXzE7CisKKyNkZWZpbmUgVEVTVF9YTl9GVU5DX1lOKHR5cGVvdXQsIGZuYywgdHlwZWluKSAgIFwKKyAgICByZXNfIyN0eXBlb3V0IyNfMSA9IGZuYyhzcmMxXyMjdHlwZWluIyNfMSk7IFwKKyAgICByZXNfIyN0eXBlb3V0IyNfMiA9IGZuYyhzcmMxXyMjdHlwZWluIyNfMik7IFwKKyAgICByZXNfIyN0eXBlb3V0IyNfMyA9IGZuYyhzcmMxXyMjdHlwZWluIyNfMyk7IFwKKyAgICByZXNfIyN0eXBlb3V0IyNfNCA9IGZuYyhzcmMxXyMjdHlwZWluIyNfNCk7CisKKyNkZWZpbmUgVEVTVF9YTl9GVU5DX1hOX1hOKHR5cGUsIGZuYykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXNfIyN0eXBlIyNfMSA9IGZuYyhzcmMxXyMjdHlwZSMjXzEsIHNyYzJfIyN0eXBlIyNfMSk7IFwKKyAgICByZXNfIyN0eXBlIyNfMiA9IGZuYyhzcmMxXyMjdHlwZSMjXzIsIHNyYzJfIyN0eXBlIyNfMik7IFwKKyAgICByZXNfIyN0eXBlIyNfMyA9IGZuYyhzcmMxXyMjdHlwZSMjXzMsIHNyYzJfIyN0eXBlIyNfMyk7IFwKKyAgICByZXNfIyN0eXBlIyNfNCA9IGZuYyhzcmMxXyMjdHlwZSMjXzQsIHNyYzJfIyN0eXBlIyNfNCk7CisKKyNkZWZpbmUgVEVTVF9YX0ZVTkNfWF9YX1godHlwZSwgZm5jKSAgICBcCisgICAgcmVzXyMjdHlwZSMjXzEgPSBmbmMoc3JjMV8jI3R5cGUjI18xLCBzcmMyXyMjdHlwZSMjXzEsIHNyYzJfIyN0eXBlIyNfMSk7CisKKyNkZWZpbmUgVEVTVF9JTl9GVU5DX0lOKGZuYykgICAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odWMsIGZuYywgdWMpICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4oYywgZm5jLCBjKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odXMsIGZuYywgdXMpICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4ocywgZm5jLCBzKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odWksIGZuYywgdWkpICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4oaSwgZm5jLCBpKQorCisjZGVmaW5lIFRFU1RfVUlOX0ZVTkNfSU4oZm5jKSAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVjLCBmbmMsIGMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVzLCBmbmMsIHMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVpLCBmbmMsIGkpICAgICBcCisKKyNkZWZpbmUgVEVTVF9JTl9GVU5DX0lOX0lOKGZuYykgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4odWMsIGZuYykgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4oYywgZm5jKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4odXMsIGZuYykgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4ocywgZm5jKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4odWksIGZuYykgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4oaSwgZm5jKQorCisjZGVmaW5lIFRFU1RfSV9GVU5DX0lfSV9JKGZuYykgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1godWMsIGZuYykgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1goYywgZm5jKSAgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1godXMsIGZuYykgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1gocywgZm5jKSAgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1godWksIGZuYykgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1goaSwgZm5jKQorCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTihmbmMpICAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9QRk4oZm5jKSAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIChmbG9hdCopICZmMSk7ICAgICBcCisgICAgZjIgPSBmbmMoZjIsIChmbG9hdDIqKSAmZjIpOyAgICBcCisgICAgZjMgPSBmbmMoZjMsIChmbG9hdDMqKSAmZjMpOyAgICBcCisgICAgZjQgPSBmbmMoZjQsIChmbG9hdDQqKSAmZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GTihmbmMpICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGYyKTsgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYzKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGY0KTsKKworI2RlZmluZSBURVNUX0YzNF9GVU5DX0YzNF9GMzQoZm5jKSAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMyk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0YoZm5jKSAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjEpOworCisjZGVmaW5lIFRFU1RfRl9GVU5DX0ZOKGZuYykgICAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjQpOworCisjZGVmaW5lIFRFU1RfRl9GVU5DX0ZOX0ZOKGZuYykgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjIsIGYyKTsgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjMsIGYzKTsgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjQsIGY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fSU4oZm5jKSAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBpMSk7ICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBpMik7ICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBpMyk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBpNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0koZm5jKSAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgaTEpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GTl9GTihmbmMpICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxLCBmMSk7ICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGYyLCBmMik7ICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYzLCBmMyk7ICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGY0LCBmNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0ZOX0YoZm5jKSAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEsIGYxKTsgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjEsIGYxKTsgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjEsIGYxKTsgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjEsIGYxKTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fUElOKGZuYykgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCAoaW50KikgJmkxKTsgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCAoaW50MiopICZpMik7ICAgICAgXAorICAgIGYzID0gZm5jKGYzLCAoaW50MyopICZpMyk7ICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCAoaW50NCopICZpNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0ZOX1BJTihmbmMpIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEsIChpbnQqKSAmaTEpOyAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjIsIChpbnQyKikgJmkyKTsgIFwKKyAgICBmMyA9IGZuYyhmMywgZjMsIChpbnQzKikgJmkzKTsgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjQsIChpbnQ0KikgJmk0KTsKKworI2RlZmluZSBURVNUX0lOX0ZVTkNfRk4oZm5jKSAgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGkxID0gZm5jKGYxKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGkyID0gZm5jKGYyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGkzID0gZm5jKGYzKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGk0ID0gZm5jKGY0KTsKKworc3RhdGljIGJvb2wgdGVzdF9mcF9tYXRoKHVpbnQzMl90IGluZGV4KSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBzdGFydCgpOworCisgICAgVEVTVF9GTl9GVU5DX0ZOKGFjb3MpOworICAgIFRFU1RfRk5fRlVOQ19GTihhY29zaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFjb3NwaSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFzaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTihhc2luaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFzaW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGF0YW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihhdGFuMik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGF0YW5oKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXRhbnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oYXRhbjJwaSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNicnQpOworICAgIFRFU1RfRk5fRlVOQ19GTihjZWlsKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4oY2xhbXApOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GKGNsYW1wKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oY29weXNpZ24pOworICAgIFRFU1RfRk5fRlVOQ19GTihjb3MpOworICAgIFRFU1RfRk5fRlVOQ19GTihjb3NoKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY29zcGkpOworICAgIFRFU1RfRjM0X0ZVTkNfRjM0X0YzNChjcm9zcyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGRlZ3JlZXMpOworICAgIFRFU1RfRl9GVU5DX0ZOX0ZOKGRpc3RhbmNlKTsKKyAgICBURVNUX0ZfRlVOQ19GTl9GTihkb3QpOworICAgIFRFU1RfRk5fRlVOQ19GTihlcmZjKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXJmKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXhwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXhwMik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cDEwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXhwbTEpOworICAgIFRFU1RfRk5fRlVOQ19GTihmYWJzKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oZmRpbSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGZsb29yKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4oZm1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oZm1heCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0YoZm1heCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZtaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GKGZtaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihmbW9kKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUEZOKGZyYWN0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUElOKGZyZXhwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oaHlwb3QpOworICAgIFRFU1RfSU5fRlVOQ19GTihpbG9nYik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0lOKGxkZXhwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSShsZGV4cCk7CisgICAgVEVTVF9GX0ZVTkNfRk4obGVuZ3RoKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obGdhbW1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUElOKGxnYW1tYSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZzIpOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2cxMCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZzFwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nYik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKG1hZCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKG1heCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0YobWF4KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4obWluKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihtaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GTihtaXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GKG1peCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BGTihtb2RmKTsKKyAgICAvLyBuYW4KKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4obmV4dGFmdGVyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obm9ybWFsaXplKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4ocG93KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSU4ocG93bik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKHBvd3IpOworICAgIFRFU1RfRk5fRlVOQ19GTihyYWRpYW5zKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4ocmVtYWluZGVyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fUElOKHJlbXF1byk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHJpbnQpOworICAgIFRFU1RfRk5fRlVOQ19GTl9JTihyb290bik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHJvdW5kKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4ocnNxcnQpOworICAgIFRFU1RfRk5fRlVOQ19GTihzaWduKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oc2luKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUEZOKHNpbmNvcyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNpbmgpOworICAgIFRFU1RfRk5fRlVOQ19GTihzaW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNxcnQpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihzdGVwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihzdGVwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGFuKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGFuaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRhbnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGdhbW1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odHJ1bmMpOworCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfZnBfbWF0aCBGQUlMRUQiLCB0aW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfZnBfbWF0aCBQQVNTRUQiLCB0aW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCitzdGF0aWMgYm9vbCB0ZXN0X2ludF9tYXRoKHVpbnQzMl90IGluZGV4KSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBzdGFydCgpOworCisgICAgVEVTVF9VSU5fRlVOQ19JTihhYnMpOworICAgIFRFU1RfSU5fRlVOQ19JTihjbHopOworICAgIFRFU1RfSU5fRlVOQ19JTl9JTihtaW4pOworICAgIFRFU1RfSU5fRlVOQ19JTl9JTihtYXgpOworICAgIFRFU1RfSV9GVU5DX0lfSV9JKHJzQ2xhbXApOworCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfaW50X21hdGggRkFJTEVEIiwgdGltZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2ludF9tYXRoIFBBU1NFRCIsIHRpbWUpOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3N0YXRpYyBib29sIHRlc3RfYmFzaWNfb3BlcmF0b3JzKCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgaW50IGkgPSAwOworCisgICAgVEVTVF9JTlRfT1AoKyk7CisgICAgVEVTVF9JTlRfT1AoLSk7CisgICAgVEVTVF9JTlRfT1AoKik7CisgICAgVEVTVF9JTlRfT1AoLyk7CisgICAgVEVTVF9JTlRfT1AoJSk7CisgICAgVEVTVF9JTlRfT1AoPDwpOworICAgIFRFU1RfSU5UX09QKD4+KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9iYXNpY19vcGVyYXRvcnMgRkFJTEVEIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2Jhc2ljX29wZXJhdG9ycyBQQVNTRUQiLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCisjZGVmaW5lIFRFU1RfQ1ZUKHRvLCBmcm9tLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgY29udmVydCBmcm9tICIgI2Zyb20gIiB0byAiICN0bywgMCk7ICAgXAordG8jIzEgPSBmcm9tIyMxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0byMjMiA9IGNvbnZlcnRfIyN0eXBlIyMyKGZyb20jIzIpOyAgICAgICAgICAgICAgICAgICAgIFwKK3RvIyMzID0gY29udmVydF8jI3R5cGUjIzMoZnJvbSMjMyk7ICAgICAgICAgICAgICAgICAgICAgXAordG8jIzQgPSBjb252ZXJ0XyMjdHlwZSMjNChmcm9tIyM0KTsKKworI2RlZmluZSBURVNUX0NWVF9NQVRSSVgodG8sIHR5cGUpICAgXAorVEVTVF9DVlQodG8sIGMsIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVjLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHMsIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVzLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIGksIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVpLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIGYsIHR5cGUpOyAgICAgICAgICAgICAgXAorCitzdGF0aWMgYm9vbCB0ZXN0X2NvbnZlcnQoKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKworICAgIFRFU1RfQ1ZUX01BVFJJWChjLCBjaGFyKTsKKyAgICBURVNUX0NWVF9NQVRSSVgodWMsIHVjaGFyKTsKKyAgICBURVNUX0NWVF9NQVRSSVgocywgc2hvcnQpOworICAgIFRFU1RfQ1ZUX01BVFJJWCh1cywgdXNob3J0KTsKKyAgICBURVNUX0NWVF9NQVRSSVgoaSwgaW50KTsKKyAgICBURVNUX0NWVF9NQVRSSVgodWksIHVpbnQpOworICAgIFRFU1RfQ1ZUX01BVFJJWChmLCBmbG9hdCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfY29udmVydCBGQUlMRUQiLCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfY29udmVydCBQQVNTRUQiLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCisjZGVmaW5lIElOSVRfUFJFRklYX1RZUEUocHJlZml4LCB0eXBlKSAgXAorcHJlZml4IyNfIyN0eXBlIyNfMSA9IDE7ICAgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzIueCA9IDE7ICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI18yLnkgPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfMy54ID0gMTsgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzMueSA9IDE7ICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI18zLnogPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfNC54ID0gMTsgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzQueSA9IDE7ICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI180LnogPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfNC53ID0gMTsKKworI2RlZmluZSBJTklUX1RZUEUodHlwZSkgICAgICAgICBcCitJTklUX1BSRUZJWF9UWVBFKHNyYzEsIHR5cGUpICAgIFwKK0lOSVRfUFJFRklYX1RZUEUoc3JjMiwgdHlwZSkgICAgXAorSU5JVF9QUkVGSVhfVFlQRShyZXMsIHR5cGUpCisKKyNkZWZpbmUgSU5JVF9BTEwgICAgXAorSU5JVF9UWVBFKGMpOyAgICAgICBcCitJTklUX1RZUEUodWMpOyAgICAgIFwKK0lOSVRfVFlQRShzKTsgICAgICAgXAorSU5JVF9UWVBFKHVzKTsgICAgICBcCitJTklUX1RZUEUoaSk7ICAgICAgIFwKK0lOSVRfVFlQRSh1aSk7CisKK3ZvaWQgbWF0aF90ZXN0KHVpbnQzMl90IGluZGV4LCBpbnQgdGVzdF9udW0pIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIElOSVRfQUxMOworICAgIGZhaWxlZCB8PSB0ZXN0X2NvbnZlcnQoKTsKKyAgICBmYWlsZWQgfD0gdGVzdF9mcF9tYXRoKGluZGV4KTsKKyAgICBmYWlsZWQgfD0gdGVzdF9pbnRfbWF0aChpbmRleCk7CisgICAgZmFpbGVkIHw9IHRlc3RfYmFzaWNfb3BlcmF0b3JzKCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9tYXRoLnJzLmJhayBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9tYXRoLnJzLmJhawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDgwMmNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L21hdGgucnMuYmFrCkBAIC0wLDAgKzEsNDIzIEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworLy8gVGVzdGluZyBtYXRoIGxpYnJhcnkKKwordm9sYXRpbGUgZmxvYXQgZjE7Cit2b2xhdGlsZSBmbG9hdDIgZjI7Cit2b2xhdGlsZSBmbG9hdDMgZjM7Cit2b2xhdGlsZSBmbG9hdDQgZjQ7CisKK3ZvbGF0aWxlIGludCBpMTsKK3ZvbGF0aWxlIGludDIgaTI7Cit2b2xhdGlsZSBpbnQzIGkzOwordm9sYXRpbGUgaW50NCBpNDsKKwordm9sYXRpbGUgdWludCB1aTE7Cit2b2xhdGlsZSB1aW50MiB1aTI7Cit2b2xhdGlsZSB1aW50MyB1aTM7Cit2b2xhdGlsZSB1aW50NCB1aTQ7CisKK3ZvbGF0aWxlIHNob3J0IHMxOwordm9sYXRpbGUgc2hvcnQyIHMyOwordm9sYXRpbGUgc2hvcnQzIHMzOwordm9sYXRpbGUgc2hvcnQ0IHM0OworCit2b2xhdGlsZSB1c2hvcnQgdXMxOwordm9sYXRpbGUgdXNob3J0MiB1czI7Cit2b2xhdGlsZSB1c2hvcnQzIHVzMzsKK3ZvbGF0aWxlIHVzaG9ydDQgdXM0OworCit2b2xhdGlsZSBjaGFyIGMxOwordm9sYXRpbGUgY2hhcjIgYzI7Cit2b2xhdGlsZSBjaGFyMyBjMzsKK3ZvbGF0aWxlIGNoYXI0IGM0OworCit2b2xhdGlsZSB1Y2hhciB1YzE7Cit2b2xhdGlsZSB1Y2hhcjIgdWMyOwordm9sYXRpbGUgdWNoYXIzIHVjMzsKK3ZvbGF0aWxlIHVjaGFyNCB1YzQ7CisKKyNkZWZpbmUgREVDTF9JTlQocHJlZml4KSAgICAgICAgICAgIFwKK3ZvbGF0aWxlIGNoYXIgcHJlZml4IyNfY18xID0gMTsgICAgIFwKK3ZvbGF0aWxlIGNoYXIyIHByZWZpeCMjX2NfMiA9IDE7ICAgIFwKK3ZvbGF0aWxlIGNoYXIzIHByZWZpeCMjX2NfMyA9IDE7ICAgIFwKK3ZvbGF0aWxlIGNoYXI0IHByZWZpeCMjX2NfNCA9IDE7ICAgIFwKK3ZvbGF0aWxlIHVjaGFyIHByZWZpeCMjX3VjXzEgPSAxOyAgIFwKK3ZvbGF0aWxlIHVjaGFyMiBwcmVmaXgjI191Y18yID0gMTsgIFwKK3ZvbGF0aWxlIHVjaGFyMyBwcmVmaXgjI191Y18zID0gMTsgIFwKK3ZvbGF0aWxlIHVjaGFyNCBwcmVmaXgjI191Y180ID0gMTsgIFwKK3ZvbGF0aWxlIHNob3J0IHByZWZpeCMjX3NfMSA9IDE7ICAgIFwKK3ZvbGF0aWxlIHNob3J0MiBwcmVmaXgjI19zXzIgPSAxOyAgIFwKK3ZvbGF0aWxlIHNob3J0MyBwcmVmaXgjI19zXzMgPSAxOyAgIFwKK3ZvbGF0aWxlIHNob3J0NCBwcmVmaXgjI19zXzQgPSAxOyAgIFwKK3ZvbGF0aWxlIHVzaG9ydCBwcmVmaXgjI191c18xID0gMTsgIFwKK3ZvbGF0aWxlIHVzaG9ydDIgcHJlZml4IyNfdXNfMiA9IDE7IFwKK3ZvbGF0aWxlIHVzaG9ydDMgcHJlZml4IyNfdXNfMyA9IDE7IFwKK3ZvbGF0aWxlIHVzaG9ydDQgcHJlZml4IyNfdXNfNCA9IDE7IFwKK3ZvbGF0aWxlIGludCBwcmVmaXgjI19pXzEgPSAxOyAgICAgIFwKK3ZvbGF0aWxlIGludDIgcHJlZml4IyNfaV8yID0gMTsgICAgIFwKK3ZvbGF0aWxlIGludDMgcHJlZml4IyNfaV8zID0gMTsgICAgIFwKK3ZvbGF0aWxlIGludDQgcHJlZml4IyNfaV80ID0gMTsgICAgIFwKK3ZvbGF0aWxlIHVpbnQgcHJlZml4IyNfdWlfMSA9IDE7ICAgIFwKK3ZvbGF0aWxlIHVpbnQyIHByZWZpeCMjX3VpXzIgPSAxOyAgIFwKK3ZvbGF0aWxlIHVpbnQzIHByZWZpeCMjX3VpXzMgPSAxOyAgIFwKK3ZvbGF0aWxlIHVpbnQ0IHByZWZpeCMjX3VpXzQgPSAxOyAgIFwKK3ZvbGF0aWxlIGxvbmcgcHJlZml4IyNfbF8xID0gMTsgICAgIFwKK3ZvbGF0aWxlIHVsb25nIHByZWZpeCMjX3VsXzEgPSAxOworCitERUNMX0lOVChyZXMpCitERUNMX0lOVChzcmMxKQorREVDTF9JTlQoc3JjMikKKworI2RlZmluZSBURVNUX0lOVF9PUF9UWVBFKG9wLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yICIgI3R5cGUgIjMiLCBpKyspOyAgICAgICAgIFwKK3Jlc18jI3R5cGUjI18zID0gc3JjMV8jI3R5cGUjI18zIG9wIHNyYzJfIyN0eXBlIyNfMzsgICAgXAorCisjZGVmaW5lIFRFU1RfSU5UX09QKG9wKSAgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIGMpICAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgdWMpICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgVEVTVF9YTl9GVU5DX1lOKHR5cGVvdXQsIGZuYywgdHlwZWluKSAgIFwKKyAgICByZXNfIyN0eXBlb3V0IyNfMSA9IGZuYyhzcmMxXyMjdHlwZWluIyNfMSk7IFwKKyAgICByZXNfIyN0eXBlb3V0IyNfMiA9IGZuYyhzcmMxXyMjdHlwZWluIyNfMik7IFwKKyAgICByZXNfIyN0eXBlb3V0IyNfMyA9IGZuYyhzcmMxXyMjdHlwZWluIyNfMyk7IFwKKyAgICByZXNfIyN0eXBlb3V0IyNfNCA9IGZuYyhzcmMxXyMjdHlwZWluIyNfNCk7CisKKyNkZWZpbmUgVEVTVF9YTl9GVU5DX1hOX1hOKHR5cGUsIGZuYykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXNfIyN0eXBlIyNfMSA9IGZuYyhzcmMxXyMjdHlwZSMjXzEsIHNyYzJfIyN0eXBlIyNfMSk7IFwKKyAgICByZXNfIyN0eXBlIyNfMiA9IGZuYyhzcmMxXyMjdHlwZSMjXzIsIHNyYzJfIyN0eXBlIyNfMik7IFwKKyAgICByZXNfIyN0eXBlIyNfMyA9IGZuYyhzcmMxXyMjdHlwZSMjXzMsIHNyYzJfIyN0eXBlIyNfMyk7IFwKKyAgICByZXNfIyN0eXBlIyNfNCA9IGZuYyhzcmMxXyMjdHlwZSMjXzQsIHNyYzJfIyN0eXBlIyNfNCk7CisKKyNkZWZpbmUgVEVTVF9YX0ZVTkNfWF9YX1godHlwZSwgZm5jKSAgICBcCisgICAgcmVzXyMjdHlwZSMjXzEgPSBmbmMoc3JjMV8jI3R5cGUjI18xLCBzcmMyXyMjdHlwZSMjXzEsIHNyYzJfIyN0eXBlIyNfMSk7CisKKyNkZWZpbmUgVEVTVF9JTl9GVU5DX0lOKGZuYykgICAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odWMsIGZuYywgdWMpICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4oYywgZm5jLCBjKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odXMsIGZuYywgdXMpICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4ocywgZm5jLCBzKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odWksIGZuYywgdWkpICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4oaSwgZm5jLCBpKQorCisjZGVmaW5lIFRFU1RfVUlOX0ZVTkNfSU4oZm5jKSAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVjLCBmbmMsIGMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVzLCBmbmMsIHMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVpLCBmbmMsIGkpICAgICBcCisKKyNkZWZpbmUgVEVTVF9JTl9GVU5DX0lOX0lOKGZuYykgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4odWMsIGZuYykgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4oYywgZm5jKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4odXMsIGZuYykgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4ocywgZm5jKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4odWksIGZuYykgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4oaSwgZm5jKQorCisjZGVmaW5lIFRFU1RfSV9GVU5DX0lfSV9JKGZuYykgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1godWMsIGZuYykgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1goYywgZm5jKSAgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1godXMsIGZuYykgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1gocywgZm5jKSAgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1godWksIGZuYykgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1goaSwgZm5jKQorCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTihmbmMpICAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9QRk4oZm5jKSAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIChmbG9hdCopICZmMSk7ICAgICBcCisgICAgZjIgPSBmbmMoZjIsIChmbG9hdDIqKSAmZjIpOyAgICBcCisgICAgZjMgPSBmbmMoZjMsIChmbG9hdDMqKSAmZjMpOyAgICBcCisgICAgZjQgPSBmbmMoZjQsIChmbG9hdDQqKSAmZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GTihmbmMpICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGYyKTsgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYzKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGY0KTsKKworI2RlZmluZSBURVNUX0YzNF9GVU5DX0YzNF9GMzQoZm5jKSAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMyk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0YoZm5jKSAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjEpOworCisjZGVmaW5lIFRFU1RfRl9GVU5DX0ZOKGZuYykgICAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjQpOworCisjZGVmaW5lIFRFU1RfRl9GVU5DX0ZOX0ZOKGZuYykgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjIsIGYyKTsgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjMsIGYzKTsgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjQsIGY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fSU4oZm5jKSAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBpMSk7ICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBpMik7ICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBpMyk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBpNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0koZm5jKSAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgaTEpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GTl9GTihmbmMpICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxLCBmMSk7ICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGYyLCBmMik7ICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYzLCBmMyk7ICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGY0LCBmNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0ZOX0YoZm5jKSAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEsIGYxKTsgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjEsIGYxKTsgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjEsIGYxKTsgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjEsIGYxKTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fUElOKGZuYykgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCAoaW50KikgJmkxKTsgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCAoaW50MiopICZpMik7ICAgICAgXAorICAgIGYzID0gZm5jKGYzLCAoaW50MyopICZpMyk7ICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCAoaW50NCopICZpNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0ZOX1BJTihmbmMpIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEsIChpbnQqKSAmaTEpOyAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjIsIChpbnQyKikgJmkyKTsgIFwKKyAgICBmMyA9IGZuYyhmMywgZjMsIChpbnQzKikgJmkzKTsgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjQsIChpbnQ0KikgJmk0KTsKKworI2RlZmluZSBURVNUX0lOX0ZVTkNfRk4oZm5jKSAgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGkxID0gZm5jKGYxKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGkyID0gZm5jKGYyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGkzID0gZm5jKGYzKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGk0ID0gZm5jKGY0KTsKKworc3RhdGljIGJvb2wgdGVzdF9mcF9tYXRoKHVpbnQzMl90IGluZGV4KSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBzdGFydCgpOworCisgICAgVEVTVF9GTl9GVU5DX0ZOKGFjb3MpOworICAgIFRFU1RfRk5fRlVOQ19GTihhY29zaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFjb3NwaSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFzaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTihhc2luaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFzaW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGF0YW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihhdGFuMik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGF0YW5oKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXRhbnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oYXRhbjJwaSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNicnQpOworICAgIFRFU1RfRk5fRlVOQ19GTihjZWlsKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4oY2xhbXApOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GKGNsYW1wKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oY29weXNpZ24pOworICAgIFRFU1RfRk5fRlVOQ19GTihjb3MpOworICAgIFRFU1RfRk5fRlVOQ19GTihjb3NoKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY29zcGkpOworICAgIFRFU1RfRjM0X0ZVTkNfRjM0X0YzNChjcm9zcyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGRlZ3JlZXMpOworICAgIFRFU1RfRl9GVU5DX0ZOX0ZOKGRpc3RhbmNlKTsKKyAgICBURVNUX0ZfRlVOQ19GTl9GTihkb3QpOworICAgIFRFU1RfRk5fRlVOQ19GTihlcmZjKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXJmKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXhwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXhwMik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cDEwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXhwbTEpOworICAgIFRFU1RfRk5fRlVOQ19GTihmYWJzKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oZmRpbSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGZsb29yKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4oZm1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oZm1heCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0YoZm1heCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZtaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GKGZtaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihmbW9kKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUEZOKGZyYWN0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUElOKGZyZXhwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oaHlwb3QpOworICAgIFRFU1RfSU5fRlVOQ19GTihpbG9nYik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0lOKGxkZXhwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSShsZGV4cCk7CisgICAgVEVTVF9GX0ZVTkNfRk4obGVuZ3RoKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obGdhbW1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUElOKGxnYW1tYSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZzIpOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2cxMCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZzFwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nYik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKG1hZCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKG1heCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0YobWF4KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4obWluKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihtaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GTihtaXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GKG1peCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BGTihtb2RmKTsKKyAgICAvLyBuYW4KKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4obmV4dGFmdGVyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obm9ybWFsaXplKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4ocG93KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSU4ocG93bik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKHBvd3IpOworICAgIFRFU1RfRk5fRlVOQ19GTihyYWRpYW5zKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4ocmVtYWluZGVyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fUElOKHJlbXF1byk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHJpbnQpOworICAgIFRFU1RfRk5fRlVOQ19GTl9JTihyb290bik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHJvdW5kKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4ocnNxcnQpOworICAgIFRFU1RfRk5fRlVOQ19GTihzaWduKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oc2luKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUEZOKHNpbmNvcyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNpbmgpOworICAgIFRFU1RfRk5fRlVOQ19GTihzaW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNxcnQpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihzdGVwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihzdGVwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGFuKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGFuaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRhbnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGdhbW1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odHJ1bmMpOworCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfZnBfbWF0aCBGQUlMRUQiLCB0aW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfZnBfbWF0aCBQQVNTRUQiLCB0aW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCitzdGF0aWMgYm9vbCB0ZXN0X2ludF9tYXRoKHVpbnQzMl90IGluZGV4KSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBzdGFydCgpOworCisgICAgVEVTVF9VSU5fRlVOQ19JTihhYnMpOworICAgIFRFU1RfSU5fRlVOQ19JTihjbHopOworICAgIFRFU1RfSU5fRlVOQ19JTl9JTihtaW4pOworICAgIFRFU1RfSU5fRlVOQ19JTl9JTihtYXgpOworICAgIFRFU1RfSV9GVU5DX0lfSV9JKHJzQ2xhbXApOworCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfaW50X21hdGggRkFJTEVEIiwgdGltZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2ludF9tYXRoIFBBU1NFRCIsIHRpbWUpOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3N0YXRpYyBib29sIHRlc3RfYmFzaWNfb3BlcmF0b3JzKCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgaW50IGkgPSAwOworCisgICAgVEVTVF9JTlRfT1AoKyk7CisgICAgVEVTVF9JTlRfT1AoLSk7CisgICAgVEVTVF9JTlRfT1AoKik7CisgICAgVEVTVF9JTlRfT1AoLyk7CisgICAgVEVTVF9JTlRfT1AoJSk7CisgICAgVEVTVF9JTlRfT1AoPDwpOworICAgIFRFU1RfSU5UX09QKD4+KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9iYXNpY19vcGVyYXRvcnMgRkFJTEVEIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2Jhc2ljX29wZXJhdG9ycyBQQVNTRUQiLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCisjZGVmaW5lIFRFU1RfQ1ZUKHRvLCBmcm9tLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgY29udmVydCBmcm9tICIgI2Zyb20gIiB0byAiICN0bywgMCk7ICAgXAordG8jIzEgPSBmcm9tIyMxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0byMjMiA9IGNvbnZlcnRfIyN0eXBlIyMyKGZyb20jIzIpOyAgICAgICAgICAgICAgICAgICAgIFwKK3RvIyMzID0gY29udmVydF8jI3R5cGUjIzMoZnJvbSMjMyk7ICAgICAgICAgICAgICAgICAgICAgXAordG8jIzQgPSBjb252ZXJ0XyMjdHlwZSMjNChmcm9tIyM0KTsKKworI2RlZmluZSBURVNUX0NWVF9NQVRSSVgodG8sIHR5cGUpICAgXAorVEVTVF9DVlQodG8sIGMsIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVjLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHMsIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVzLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIGksIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVpLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIGYsIHR5cGUpOyAgICAgICAgICAgICAgXAorCitzdGF0aWMgYm9vbCB0ZXN0X2NvbnZlcnQoKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKworICAgIFRFU1RfQ1ZUX01BVFJJWChjLCBjaGFyKTsKKyAgICBURVNUX0NWVF9NQVRSSVgodWMsIHVjaGFyKTsKKyAgICBURVNUX0NWVF9NQVRSSVgocywgc2hvcnQpOworICAgIFRFU1RfQ1ZUX01BVFJJWCh1cywgdXNob3J0KTsKKyAgICBURVNUX0NWVF9NQVRSSVgoaSwgaW50KTsKKyAgICBURVNUX0NWVF9NQVRSSVgodWksIHVpbnQpOworICAgIFRFU1RfQ1ZUX01BVFJJWChmLCBmbG9hdCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfY29udmVydCBGQUlMRUQiLCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfY29udmVydCBQQVNTRUQiLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCit2b2lkIG1hdGhfdGVzdCh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICByc0RlYnVnKCJIZXJlICIsIDEpOworICAgIHJlc191Y18zID0gc3JjMV91Y18zIC8gc3JjMl91Y18zOworICAgIHJzRGVidWcoIkhlcmUgIiwgMik7CisgICAgZmFpbGVkIHw9IHRlc3RfYmFzaWNfb3BlcmF0b3JzKCk7CisgICAgcnNEZWJ1ZygiSGVyZSAiLCAzKTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9GQUlMRUQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9QQVNTRUQpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L21hdGgucnMub3JpZyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9tYXRoLnJzLm9yaWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlMjlhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9tYXRoLnJzLm9yaWcKQEAgLTAsMCArMSw0MzYgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCisvLyBUZXN0aW5nIG1hdGggbGlicmFyeQorCit2b2xhdGlsZSBmbG9hdCBmMTsKK3ZvbGF0aWxlIGZsb2F0MiBmMjsKK3ZvbGF0aWxlIGZsb2F0MyBmMzsKK3ZvbGF0aWxlIGZsb2F0NCBmNDsKKwordm9sYXRpbGUgaW50IGkxOwordm9sYXRpbGUgaW50MiBpMjsKK3ZvbGF0aWxlIGludDMgaTM7Cit2b2xhdGlsZSBpbnQ0IGk0OworCit2b2xhdGlsZSB1aW50IHVpMTsKK3ZvbGF0aWxlIHVpbnQyIHVpMjsKK3ZvbGF0aWxlIHVpbnQzIHVpMzsKK3ZvbGF0aWxlIHVpbnQ0IHVpNDsKKwordm9sYXRpbGUgc2hvcnQgczE7Cit2b2xhdGlsZSBzaG9ydDIgczI7Cit2b2xhdGlsZSBzaG9ydDMgczM7Cit2b2xhdGlsZSBzaG9ydDQgczQ7CisKK3ZvbGF0aWxlIHVzaG9ydCB1czE7Cit2b2xhdGlsZSB1c2hvcnQyIHVzMjsKK3ZvbGF0aWxlIHVzaG9ydDMgdXMzOwordm9sYXRpbGUgdXNob3J0NCB1czQ7CisKK3ZvbGF0aWxlIGNoYXIgYzE7Cit2b2xhdGlsZSBjaGFyMiBjMjsKK3ZvbGF0aWxlIGNoYXIzIGMzOwordm9sYXRpbGUgY2hhcjQgYzQ7CisKK3ZvbGF0aWxlIHVjaGFyIHVjMTsKK3ZvbGF0aWxlIHVjaGFyMiB1YzI7Cit2b2xhdGlsZSB1Y2hhcjMgdWMzOwordm9sYXRpbGUgdWNoYXI0IHVjNDsKKworI2RlZmluZSBERUNMX0lOVChwcmVmaXgpICAgICAgICAgICAgXAordm9sYXRpbGUgY2hhciBwcmVmaXgjI19jXzEgPSAxOyAgICAgXAordm9sYXRpbGUgY2hhcjIgcHJlZml4IyNfY18yID0gMTsgICAgXAordm9sYXRpbGUgY2hhcjMgcHJlZml4IyNfY18zID0gMTsgICAgXAordm9sYXRpbGUgY2hhcjQgcHJlZml4IyNfY180ID0gMTsgICAgXAordm9sYXRpbGUgdWNoYXIgcHJlZml4IyNfdWNfMSA9IDE7ICAgXAordm9sYXRpbGUgdWNoYXIyIHByZWZpeCMjX3VjXzIgPSAxOyAgXAordm9sYXRpbGUgdWNoYXIzIHByZWZpeCMjX3VjXzMgPSAxOyAgXAordm9sYXRpbGUgdWNoYXI0IHByZWZpeCMjX3VjXzQgPSAxOyAgXAordm9sYXRpbGUgc2hvcnQgcHJlZml4IyNfc18xID0gMTsgICAgXAordm9sYXRpbGUgc2hvcnQyIHByZWZpeCMjX3NfMiA9IDE7ICAgXAordm9sYXRpbGUgc2hvcnQzIHByZWZpeCMjX3NfMyA9IDE7ICAgXAordm9sYXRpbGUgc2hvcnQ0IHByZWZpeCMjX3NfNCA9IDE7ICAgXAordm9sYXRpbGUgdXNob3J0IHByZWZpeCMjX3VzXzEgPSAxOyAgXAordm9sYXRpbGUgdXNob3J0MiBwcmVmaXgjI191c18yID0gMTsgXAordm9sYXRpbGUgdXNob3J0MyBwcmVmaXgjI191c18zID0gMTsgXAordm9sYXRpbGUgdXNob3J0NCBwcmVmaXgjI191c180ID0gMTsgXAordm9sYXRpbGUgaW50IHByZWZpeCMjX2lfMSA9IDE7ICAgICAgXAordm9sYXRpbGUgaW50MiBwcmVmaXgjI19pXzIgPSAxOyAgICAgXAordm9sYXRpbGUgaW50MyBwcmVmaXgjI19pXzMgPSAxOyAgICAgXAordm9sYXRpbGUgaW50NCBwcmVmaXgjI19pXzQgPSAxOyAgICAgXAordm9sYXRpbGUgdWludCBwcmVmaXgjI191aV8xID0gMTsgICAgXAordm9sYXRpbGUgdWludDIgcHJlZml4IyNfdWlfMiA9IDE7ICAgXAordm9sYXRpbGUgdWludDMgcHJlZml4IyNfdWlfMyA9IDE7ICAgXAordm9sYXRpbGUgdWludDQgcHJlZml4IyNfdWlfNCA9IDE7ICAgXAordm9sYXRpbGUgbG9uZyBwcmVmaXgjI19sXzEgPSAxOyAgICAgXAordm9sYXRpbGUgdWxvbmcgcHJlZml4IyNfdWxfMSA9IDE7CisKK0RFQ0xfSU5UKHJlcykKK0RFQ0xfSU5UKHNyYzEpCitERUNMX0lOVChzcmMyKQorCisjZGVmaW5lIFRFU1RfSU5UX09QX1RZUEUob3AsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgIiAjb3AgIiBmb3IgIiAjdHlwZSAiMSIsIGkrKyk7ICAgICAgICAgXAorcmVzXyMjdHlwZSMjXzEgPSBzcmMxXyMjdHlwZSMjXzEgb3Agc3JjMl8jI3R5cGUjI18xOyAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yICIgI3R5cGUgIjIiLCBpKyspOyAgICAgICAgIFwKK3Jlc18jI3R5cGUjI18yID0gc3JjMV8jI3R5cGUjI18yIG9wIHNyYzJfIyN0eXBlIyNfMjsgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciAiICN0eXBlICIzIiwgaSsrKTsgICAgICAgICBcCityZXNfIyN0eXBlIyNfMyA9IHNyYzFfIyN0eXBlIyNfMyBvcCBzcmMyXyMjdHlwZSMjXzM7ICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgIiAjb3AgIiBmb3IgIiAjdHlwZSAiNCIsIGkrKyk7ICAgICAgICAgXAorcmVzXyMjdHlwZSMjXzQgPSBzcmMxXyMjdHlwZSMjXzQgb3Agc3JjMl8jI3R5cGUjI180OworCisjZGVmaW5lIFRFU1RfSU5UX09QKG9wKSAgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIGMpICAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgdWMpICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCBzKSAgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIHVzKSAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgaSkgICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCB1aSkgICAgICAgICAgICAgICAgICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgIiAjb3AgIiBmb3IgbDEiLCBpKyspOyAgICAgXAorcmVzX2xfMSA9IHNyYzFfbF8xIG9wIHNyYzJfbF8xOyAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yIHVsMSIsIGkrKyk7ICAgIFwKK3Jlc191bF8xID0gc3JjMV91bF8xIG9wIHNyYzJfdWxfMTsKKworI2RlZmluZSBURVNUX1hOX0ZVTkNfWU4odHlwZW91dCwgZm5jLCB0eXBlaW4pICAgXAorICAgIHJlc18jI3R5cGVvdXQjI18xID0gZm5jKHNyYzFfIyN0eXBlaW4jI18xKTsgXAorICAgIHJlc18jI3R5cGVvdXQjI18yID0gZm5jKHNyYzFfIyN0eXBlaW4jI18yKTsgXAorICAgIHJlc18jI3R5cGVvdXQjI18zID0gZm5jKHNyYzFfIyN0eXBlaW4jI18zKTsgXAorICAgIHJlc18jI3R5cGVvdXQjI180ID0gZm5jKHNyYzFfIyN0eXBlaW4jI180KTsKKworI2RlZmluZSBURVNUX1hOX0ZVTkNfWE5fWE4odHlwZSwgZm5jKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlc18jI3R5cGUjI18xID0gZm5jKHNyYzFfIyN0eXBlIyNfMSwgc3JjMl8jI3R5cGUjI18xKTsgXAorICAgIHJlc18jI3R5cGUjI18yID0gZm5jKHNyYzFfIyN0eXBlIyNfMiwgc3JjMl8jI3R5cGUjI18yKTsgXAorICAgIHJlc18jI3R5cGUjI18zID0gZm5jKHNyYzFfIyN0eXBlIyNfMywgc3JjMl8jI3R5cGUjI18zKTsgXAorICAgIHJlc18jI3R5cGUjI180ID0gZm5jKHNyYzFfIyN0eXBlIyNfNCwgc3JjMl8jI3R5cGUjI180KTsKKworI2RlZmluZSBURVNUX1hfRlVOQ19YX1hfWCh0eXBlLCBmbmMpICAgIFwKKyAgICByZXNfIyN0eXBlIyNfMSA9IGZuYyhzcmMxXyMjdHlwZSMjXzEsIHNyYzJfIyN0eXBlIyNfMSwgc3JjMl8jI3R5cGUjI18xKTsKKworI2RlZmluZSBURVNUX0lOX0ZVTkNfSU4oZm5jKSAgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTih1YywgZm5jLCB1YykgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTihjLCBmbmMsIGMpICAgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTih1cywgZm5jLCB1cykgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTihzLCBmbmMsIHMpICAgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTih1aSwgZm5jLCB1aSkgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTihpLCBmbmMsIGkpCisKKyNkZWZpbmUgVEVTVF9VSU5fRlVOQ19JTihmbmMpICAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odWMsIGZuYywgYykgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odXMsIGZuYywgcykgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odWksIGZuYywgaSkgICAgIFwKKworI2RlZmluZSBURVNUX0lOX0ZVTkNfSU5fSU4oZm5jKSAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIFRFU1RfWE5fRlVOQ19YTl9YTih1YywgZm5jKSAgICAgXAorICAgIFRFU1RfWE5fRlVOQ19YTl9YTihjLCBmbmMpICAgICAgXAorICAgIFRFU1RfWE5fRlVOQ19YTl9YTih1cywgZm5jKSAgICAgXAorICAgIFRFU1RfWE5fRlVOQ19YTl9YTihzLCBmbmMpICAgICAgXAorICAgIFRFU1RfWE5fRlVOQ19YTl9YTih1aSwgZm5jKSAgICAgXAorICAgIFRFU1RfWE5fRlVOQ19YTl9YTihpLCBmbmMpCisKKyNkZWZpbmUgVEVTVF9JX0ZVTkNfSV9JX0koZm5jKSAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBURVNUX1hfRlVOQ19YX1hfWCh1YywgZm5jKSAgICAgIFwKKyAgICBURVNUX1hfRlVOQ19YX1hfWChjLCBmbmMpICAgICAgIFwKKyAgICBURVNUX1hfRlVOQ19YX1hfWCh1cywgZm5jKSAgICAgIFwKKyAgICBURVNUX1hfRlVOQ19YX1hfWChzLCBmbmMpICAgICAgIFwKKyAgICBURVNUX1hfRlVOQ19YX1hfWCh1aSwgZm5jKSAgICAgIFwKKyAgICBURVNUX1hfRlVOQ19YX1hfWChpLCBmbmMpCisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOKGZuYykgICAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX1BGTihmbmMpICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgKGZsb2F0KikgJmYxKTsgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgKGZsb2F0MiopICZmMik7ICAgIFwKKyAgICBmMyA9IGZuYyhmMywgKGZsb2F0MyopICZmMyk7ICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgKGZsb2F0NCopICZmNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZuYykgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjIpOyAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjMpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjQpOworCisjZGVmaW5lIFRFU1RfRjM0X0ZVTkNfRjM0X0YzNChmbmMpICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYzKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fRihmbmMpICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSk7ICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBmMSk7ICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMSk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmMSk7CisKKyNkZWZpbmUgVEVTVF9GX0ZVTkNfRk4oZm5jKSAgICAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmMSA9IGZuYyhmMik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmMSA9IGZuYyhmMyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmMSA9IGZuYyhmNCk7CisKKyNkZWZpbmUgVEVTVF9GX0ZVTkNfRk5fRk4oZm5jKSAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMSA9IGZuYyhmMiwgZjIpOyAgICAgICAgICAgICAgIFwKKyAgICBmMSA9IGZuYyhmMywgZjMpOyAgICAgICAgICAgICAgIFwKKyAgICBmMSA9IGZuYyhmNCwgZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9JTihmbmMpICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGkxKTsgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGkyKTsgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGkzKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGk0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fSShmbmMpICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBpMSk7ICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBpMSk7ICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBpMSk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBpMSk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKGZuYykgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEsIGYxKTsgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjIsIGYyKTsgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjMsIGYzKTsgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjQsIGY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fRk5fRihmbmMpICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSwgZjEpOyAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBmMSwgZjEpOyAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMSwgZjEpOyAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmMSwgZjEpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9QSU4oZm5jKSAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIChpbnQqKSAmaTEpOyAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIChpbnQyKikgJmkyKTsgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIChpbnQzKikgJmkzKTsgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIChpbnQ0KikgJmk0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fRk5fUElOKGZuYykgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSwgKGludCopICZpMSk7ICAgXAorICAgIGYyID0gZm5jKGYyLCBmMiwgKGludDIqKSAmaTIpOyAgXAorICAgIGYzID0gZm5jKGYzLCBmMywgKGludDMqKSAmaTMpOyAgXAorICAgIGY0ID0gZm5jKGY0LCBmNCwgKGludDQqKSAmaTQpOworCisjZGVmaW5lIFRFU1RfSU5fRlVOQ19GTihmbmMpICAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgaTEgPSBmbmMoZjEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaTIgPSBmbmMoZjIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaTMgPSBmbmMoZjMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaTQgPSBmbmMoZjQpOworCitzdGF0aWMgYm9vbCB0ZXN0X2ZwX21hdGgodWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIHN0YXJ0KCk7CisKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYWNvcyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFjb3NoKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYWNvc3BpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXNpbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFzaW5oKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXNpbnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXRhbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGF0YW4yKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXRhbmgpOworICAgIFRFU1RfRk5fRlVOQ19GTihhdGFucGkpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihhdGFuMnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY2JydCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNlaWwpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GTihjbGFtcCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0YoY2xhbXApOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihjb3B5c2lnbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNvcyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNvc2gpOworICAgIFRFU1RfRk5fRlVOQ19GTihjb3NwaSk7CisgICAgVEVTVF9GMzRfRlVOQ19GMzRfRjM0KGNyb3NzKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZGVncmVlcyk7CisgICAgVEVTVF9GX0ZVTkNfRk5fRk4oZGlzdGFuY2UpOworICAgIFRFU1RfRl9GVU5DX0ZOX0ZOKGRvdCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGVyZmMpOworICAgIFRFU1RfRk5fRlVOQ19GTihlcmYpOworICAgIFRFU1RfRk5fRlVOQ19GTihleHApOworICAgIFRFU1RfRk5fRlVOQ19GTihleHAyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXhwMTApOworICAgIFRFU1RfRk5fRlVOQ19GTihleHBtMSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGZhYnMpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihmZGltKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZmxvb3IpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GTihmbWEpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihmbWF4KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihmbWF4KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oZm1pbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0YoZm1pbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZtb2QpOworICAgIFRFU1RfRk5fRlVOQ19GTl9QRk4oZnJhY3QpOworICAgIFRFU1RfRk5fRlVOQ19GTl9QSU4oZnJleHApOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihoeXBvdCk7CisgICAgVEVTVF9JTl9GVU5DX0ZOKGlsb2diKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSU4obGRleHApOworICAgIFRFU1RfRk5fRlVOQ19GTl9JKGxkZXhwKTsKKyAgICBURVNUX0ZfRlVOQ19GTihsZW5ndGgpOworICAgIFRFU1RfRk5fRlVOQ19GTihsZ2FtbWEpOworICAgIFRFU1RfRk5fRlVOQ19GTl9QSU4obGdhbW1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nMik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZzEwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nMXApOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2diKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4obWFkKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4obWF4KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihtYXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihtaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GKG1pbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKG1peCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0YobWl4KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUEZOKG1vZGYpOworICAgIC8vIG5hbgorICAgIFRFU1RfRk5fRlVOQ19GTl9GTihuZXh0YWZ0ZXIpOworICAgIFRFU1RfRk5fRlVOQ19GTihub3JtYWxpemUpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihwb3cpOworICAgIFRFU1RfRk5fRlVOQ19GTl9JTihwb3duKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4ocG93cik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHJhZGlhbnMpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihyZW1haW5kZXIpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9QSU4ocmVtcXVvKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4ocmludCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0lOKHJvb3RuKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4ocm91bmQpOworICAgIFRFU1RfRk5fRlVOQ19GTihyc3FydCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNpZ24pOworICAgIFRFU1RfRk5fRlVOQ19GTihzaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9QRk4oc2luY29zKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oc2luaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNpbnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oc3FydCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKHN0ZXApOworICAgIFRFU1RfRk5fRlVOQ19GTl9GKHN0ZXApOworICAgIFRFU1RfRk5fRlVOQ19GTih0YW4pOworICAgIFRFU1RfRk5fRlVOQ19GTih0YW5oKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGFucGkpOworICAgIFRFU1RfRk5fRlVOQ19GTih0Z2FtbWEpOworICAgIFRFU1RfRk5fRlVOQ19GTih0cnVuYyk7CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9mcF9tYXRoIEZBSUxFRCIsIHRpbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9mcF9tYXRoIFBBU1NFRCIsIHRpbWUpOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3N0YXRpYyBib29sIHRlc3RfaW50X21hdGgodWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIHN0YXJ0KCk7CisKKyAgICBURVNUX1VJTl9GVU5DX0lOKGFicyk7CisgICAgVEVTVF9JTl9GVU5DX0lOKGNseik7CisgICAgVEVTVF9JTl9GVU5DX0lOX0lOKG1pbik7CisgICAgVEVTVF9JTl9GVU5DX0lOX0lOKG1heCk7CisgICAgVEVTVF9JX0ZVTkNfSV9JX0kocnNDbGFtcCk7CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9pbnRfbWF0aCBGQUlMRUQiLCB0aW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfaW50X21hdGggUEFTU0VEIiwgdGltZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKworc3RhdGljIGJvb2wgdGVzdF9iYXNpY19vcGVyYXRvcnMoKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBURVNUX0lOVF9PUCgrKTsKKyAgICBURVNUX0lOVF9PUCgtKTsKKyAgICBURVNUX0lOVF9PUCgqKTsKKyAgICBURVNUX0lOVF9PUCgvKTsKKyAgICBURVNUX0lOVF9PUCglKTsKKyAgICBURVNUX0lOVF9PUCg8PCk7CisgICAgVEVTVF9JTlRfT1AoPj4pOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2Jhc2ljX29wZXJhdG9ycyBGQUlMRUQiLCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfYmFzaWNfb3BlcmF0b3JzIFBBU1NFRCIsIDApOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKKyNkZWZpbmUgVEVTVF9DVlQodG8sIGZyb20sIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgXAorcnNEZWJ1ZygiVGVzdGluZyBjb252ZXJ0IGZyb20gIiAjZnJvbSAiIHRvICIgI3RvLCAwKTsgICBcCit0byMjMSA9IGZyb20jIzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RvIyMyID0gY29udmVydF8jI3R5cGUjIzIoZnJvbSMjMik7ICAgICAgICAgICAgICAgICAgICAgXAordG8jIzMgPSBjb252ZXJ0XyMjdHlwZSMjMyhmcm9tIyMzKTsgICAgICAgICAgICAgICAgICAgICBcCit0byMjNCA9IGNvbnZlcnRfIyN0eXBlIyM0KGZyb20jIzQpOworCisjZGVmaW5lIFRFU1RfQ1ZUX01BVFJJWCh0bywgdHlwZSkgICBcCitURVNUX0NWVCh0bywgYywgdHlwZSk7ICAgICAgICAgICAgICBcCitURVNUX0NWVCh0bywgdWMsIHR5cGUpOyAgICAgICAgICAgICBcCitURVNUX0NWVCh0bywgcywgdHlwZSk7ICAgICAgICAgICAgICBcCitURVNUX0NWVCh0bywgdXMsIHR5cGUpOyAgICAgICAgICAgICBcCitURVNUX0NWVCh0bywgaSwgdHlwZSk7ICAgICAgICAgICAgICBcCitURVNUX0NWVCh0bywgdWksIHR5cGUpOyAgICAgICAgICAgICBcCitURVNUX0NWVCh0bywgZiwgdHlwZSk7ICAgICAgICAgICAgICBcCisKK3N0YXRpYyBib29sIHRlc3RfY29udmVydCgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgICAgVEVTVF9DVlRfTUFUUklYKGMsIGNoYXIpOworICAgIFRFU1RfQ1ZUX01BVFJJWCh1YywgdWNoYXIpOworICAgIFRFU1RfQ1ZUX01BVFJJWChzLCBzaG9ydCk7CisgICAgVEVTVF9DVlRfTUFUUklYKHVzLCB1c2hvcnQpOworICAgIFRFU1RfQ1ZUX01BVFJJWChpLCBpbnQpOworICAgIFRFU1RfQ1ZUX01BVFJJWCh1aSwgdWludCk7CisgICAgVEVTVF9DVlRfTUFUUklYKGYsIGZsb2F0KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9jb252ZXJ0IEZBSUxFRCIsIDApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9jb252ZXJ0IFBBU1NFRCIsIDApOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3ZvaWQgbWF0aF90ZXN0KHVpbnQzMl90IGluZGV4LCBpbnQgdGVzdF9udW0pIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGZhaWxlZCB8PSB0ZXN0X2NvbnZlcnQoKTsKKyAgICBmYWlsZWQgfD0gdGVzdF9mcF9tYXRoKGluZGV4KTsKKyAgICBmYWlsZWQgfD0gdGVzdF9pbnRfbWF0aChpbmRleCk7CisgICAgZmFpbGVkIHw9IHRlc3RfYmFzaWNfb3BlcmF0b3JzKCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9wcmltaXRpdmVzLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3ByaW1pdGl2ZXMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U0NTFkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9wcmltaXRpdmVzLnJzCkBAIC0wLDAgKzEsNjEgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCisvLyBUZXN0aW5nIHByaW1pdGl2ZSB0eXBlcworZmxvYXQgZmxvYXRUZXN0ID0gMS45OWY7Citkb3VibGUgZG91YmxlVGVzdCA9IDIuMDU7CitjaGFyIGNoYXJUZXN0ID0gLTg7CitzaG9ydCBzaG9ydFRlc3QgPSAtMTY7CitpbnQgaW50VGVzdCA9IC0zMjsKK2xvbmcgbG9uZ1Rlc3QgPSAxNzE3OTg2OTE4NGw7IC8vIDEgPDwgMzQKK2xvbmcgbG9uZyBsb25nbG9uZ1Rlc3QgPSA2ODcxOTQ3NjczNmw7IC8vIDEgPDwgMzYKKwordWNoYXIgdWNoYXJUZXN0ID0gODsKK3VzaG9ydCB1c2hvcnRUZXN0ID0gMTY7Cit1aW50IHVpbnRUZXN0ID0gMzI7Cit1bG9uZyB1bG9uZ1Rlc3QgPSA0NjExNjg2MDE4NDI3Mzg3OTA0TDsKK2ludDY0X3QgaW50NjRfdFRlc3QgPSAtMTcxNzk4NjkxODRsOyAvLyAtIDEgPDwgMzQKK3VpbnQ2NF90IHVpbnQ2NF90VGVzdCA9IDExNzE3OTg2OTE4NGw7CisKK3N0YXRpYyBib29sIHRlc3RfcHJpbWl0aXZlX3R5cGVzKHVpbnQzMl90IGluZGV4KSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBzdGFydCgpOworCisgICAgX1JTX0FTU0VSVChmbG9hdFRlc3QgPT0gMi45OWYpOworICAgIF9SU19BU1NFUlQoZG91YmxlVGVzdCA9PSAzLjA1KTsKKyAgICBfUlNfQVNTRVJUKGNoYXJUZXN0ID09IC0xNik7CisgICAgX1JTX0FTU0VSVChzaG9ydFRlc3QgPT0gLTMyKTsKKyAgICBfUlNfQVNTRVJUKGludFRlc3QgPT0gLTY0KTsKKyAgICBfUlNfQVNTRVJUKGxvbmdUZXN0ID09IDE3MTc5ODY5MTg1bCk7CisgICAgX1JTX0FTU0VSVChsb25nbG9uZ1Rlc3QgPT0gNjg3MTk0NzY3MzVsKTsKKworICAgIF9SU19BU1NFUlQodWNoYXJUZXN0ID09IDgpOworICAgIF9SU19BU1NFUlQodXNob3J0VGVzdCA9PSAxNik7CisgICAgX1JTX0FTU0VSVCh1aW50VGVzdCA9PSAzMik7CisgICAgX1JTX0FTU0VSVCh1bG9uZ1Rlc3QgPT0gNDYxMTY4NjAxODQyNzM4NzkwM0wpOworICAgIF9SU19BU1NFUlQoaW50NjRfdFRlc3QgPT0gLTE3MTc5ODY5MTg0bCk7CisgICAgX1JTX0FTU0VSVCh1aW50NjRfdFRlc3QgPT0gMTE3MTc5ODY5MTg1bCk7CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9wcmltaXRpdmVzIEZBSUxFRCIsIHRpbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9wcmltaXRpdmVzIFBBU1NFRCIsIHRpbWUpOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3ZvaWQgcHJpbWl0aXZlc190ZXN0KHVpbnQzMl90IGluZGV4LCBpbnQgdGVzdF9udW0pIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGZhaWxlZCB8PSB0ZXN0X3ByaW1pdGl2ZV90eXBlcyhpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yZWZjb3VudC5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yZWZjb3VudC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWE3MGUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JlZmNvdW50LnJzCkBAIC0wLDAgKzEsMTMgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCisvLyBUZXN0aW5nIHJlZmVyZW5jZSBjb3VudGluZyBvZiBSUyBvYmplY3QgdHlwZXMKKworcnNfYWxsb2NhdGlvbiBnbG9iYWxBOworc3RhdGljIHJzX2FsbG9jYXRpb24gc3RhdGljR2xvYmFsQTsKKwordm9pZCByZWZjb3VudF90ZXN0KCkgeworICAgIHN0YXRpY0dsb2JhbEEgPSBnbG9iYWxBOworICAgIHJzQ2xlYXJPYmplY3QoJmdsb2JhbEEpOworICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzZGVidWcucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnNkZWJ1Zy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzk0MmE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzZGVidWcucnMKQEAgLTAsMCArMSw1NiBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKKy8vIFRlc3RpbmcgcHJpbWl0aXZlIHR5cGVzCitmbG9hdCBmbG9hdFRlc3QgPSAxLjk5ZjsKK2RvdWJsZSBkb3VibGVUZXN0ID0gMi4wNTsKK2NoYXIgY2hhclRlc3QgPSAtODsKK3Nob3J0IHNob3J0VGVzdCA9IC0xNjsKK2ludCBpbnRUZXN0ID0gLTMyOworbG9uZyBsb25nVGVzdCA9IDE3MTc5ODY5MTg0bDsgLy8gMSA8PCAzNAorbG9uZyBsb25nIGxvbmdsb25nVGVzdCA9IDY4NzE5NDc2NzM2bDsgLy8gMSA8PCAzNgorCit1Y2hhciB1Y2hhclRlc3QgPSA4OwordXNob3J0IHVzaG9ydFRlc3QgPSAxNjsKK3VpbnQgdWludFRlc3QgPSAzMjsKK3Vsb25nIHVsb25nVGVzdCA9IDQ2MTE2ODYwMTg0MjczODc5MDRMOworaW50NjRfdCBpbnQ2NF90VGVzdCA9IC0xNzE3OTg2OTE4NGw7IC8vIC0gMSA8PCAzNAordWludDY0X3QgdWludDY0X3RUZXN0ID0gMTE3MTc5ODY5MTg0bDsKKworc3RhdGljIGJvb2wgYmFzaWNfdGVzdCh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICAvLyBUaGlzIHRlc3QgZm9jdXNlcyBwcmltYXJpbHkgb24gY29tcGlsYXRpb24tdGltZSwgbm90IHJ1bi10aW1lLgorICAgIC8vIEZvciB0aGlzIHJlYXNvbiwgbm9uZSBvZiB0aGUgb3V0cHV0cyBhcmUgYWN0dWFsbHkgY2hlY2tlZC4KKworICAgIHJzRGVidWcoImZsb2F0VGVzdCIsIGZsb2F0VGVzdCk7CisgICAgcnNEZWJ1ZygiZG91YmxlVGVzdCIsIGRvdWJsZVRlc3QpOworICAgIHJzRGVidWcoImNoYXJUZXN0IiwgY2hhclRlc3QpOworICAgIHJzRGVidWcoInNob3J0VGVzdCIsIHNob3J0VGVzdCk7CisgICAgcnNEZWJ1ZygiaW50VGVzdCIsIGludFRlc3QpOworICAgIHJzRGVidWcoImxvbmdUZXN0IiwgbG9uZ1Rlc3QpOworICAgIHJzRGVidWcoImxvbmdsb25nVGVzdCIsIGxvbmdsb25nVGVzdCk7CisKKyAgICByc0RlYnVnKCJ1Y2hhclRlc3QiLCB1Y2hhclRlc3QpOworICAgIHJzRGVidWcoInVzaG9ydFRlc3QiLCB1c2hvcnRUZXN0KTsKKyAgICByc0RlYnVnKCJ1aW50VGVzdCIsIHVpbnRUZXN0KTsKKyAgICByc0RlYnVnKCJ1bG9uZ1Rlc3QiLCB1bG9uZ1Rlc3QpOworICAgIHJzRGVidWcoImludDY0X3RUZXN0IiwgaW50NjRfdFRlc3QpOworICAgIHJzRGVidWcoInVpbnQ2NF90VGVzdCIsIHVpbnQ2NF90VGVzdCk7CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCit2b2lkIHRlc3RfcnNkZWJ1Zyh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmYWlsZWQgfD0gYmFzaWNfdGVzdChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgcnNEZWJ1ZygicnNkZWJ1Z190ZXN0IEZBSUxFRCIsIC0xKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICAgICAgcnNEZWJ1ZygicnNkZWJ1Z190ZXN0IFBBU1NFRCIsIDApOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzbGlzdC5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2xpc3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkOGI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2xpc3QucnMKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy50ZXN0X3YxNCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworZmxvYXQgZ0RZOworCityc19mb250IGdGb250OworCit0eXBlZGVmIHN0cnVjdCBMaXN0QWxsb2NzX3MgeworICAgIHJzX2FsbG9jYXRpb24gdGV4dDsKKyAgICBpbnQgcmVzdWx0OworfSBMaXN0QWxsb2NzOworCitMaXN0QWxsb2NzICpnTGlzdDsKKwordm9pZCBpbml0KCkgeworICAgIGdEWSA9IDAuMGY7Cit9CisKK2ludCB0ZXh0UG9zID0gMDsKKworaW50IHJvb3Qodm9pZCkgeworCisgICAgcnNnQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgdGV4dFBvcyAtPSAoaW50KWdEWSoyOworICAgIGdEWSAqPSAwLjk1OworCisgICAgcnNnRm9udENvbG9yKDAuOWYsIDAuOWYsIDAuOWYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250KTsKKworICAgIHJzX2FsbG9jYXRpb24gbGlzdEFsbG9jOworICAgIGxpc3RBbGxvYyA9IHJzR2V0QWxsb2NhdGlvbihnTGlzdCk7CisgICAgaW50IGFsbG9jU2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgobGlzdEFsbG9jKTsKKworICAgIGludCB3aWR0aCA9IHJzZ0dldFdpZHRoKCk7CisgICAgaW50IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworCisgICAgaW50IGl0ZW1IZWlnaHQgPSA4MDsKKyAgICBpbnQgdG90YWxJdGVtSGVpZ2h0ID0gaXRlbUhlaWdodCAqIGFsbG9jU2l6ZTsKKworICAgIC8qIFByZXZlbnQgc2Nyb2xsaW5nIGFib3ZlIHRoZSB0b3Agb2YgdGhlIGxpc3QgKi8KKyAgICBpbnQgZmlyc3RJdGVtID0gaGVpZ2h0IC0gdG90YWxJdGVtSGVpZ2h0OworICAgIGlmIChmaXJzdEl0ZW0gPCAwKSB7CisgICAgICAgIGZpcnN0SXRlbSA9IDA7CisgICAgfQorCisgICAgLyogUHJldmVudCBzY3JvbGxpbmcgcGFzdCB0aGUgbGFzdCBsaW5lIG9mIHRoZSBsaXN0ICovCisgICAgaW50IGxhc3RJdGVtID0gLTEgKiAodG90YWxJdGVtSGVpZ2h0IC0gaGVpZ2h0KTsKKyAgICBpZiAobGFzdEl0ZW0gPiAwKSB7CisgICAgICAgIGxhc3RJdGVtID0gMDsKKyAgICB9CisKKyAgICBpZiAodGV4dFBvcyA+IGZpcnN0SXRlbSkgeworICAgICAgICB0ZXh0UG9zID0gZmlyc3RJdGVtOworICAgIH0KKyAgICBlbHNlIGlmICh0ZXh0UG9zIDwgbGFzdEl0ZW0pIHsKKyAgICAgICAgdGV4dFBvcyA9IGxhc3RJdGVtOworICAgIH0KKworICAgIGludCBjdXJyZW50WVBvcyA9IGl0ZW1IZWlnaHQgKyB0ZXh0UG9zOworCisgICAgZm9yKGludCBpID0gMDsgaSA8IGFsbG9jU2l6ZTsgaSArKykgeworICAgICAgICBpZihjdXJyZW50WVBvcyAtIGl0ZW1IZWlnaHQgPiBoZWlnaHQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYoY3VycmVudFlQb3MgPiAwKSB7CisgICAgICAgICAgICBzd2l0Y2goZ0xpc3RbaV0ucmVzdWx0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvKiBQYXNzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgcnNnRm9udENvbG9yKDAuNWYsIDAuOWYsIDAuNWYsIDEuMGYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIC0xOiAvKiBGYWlsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgcnNnRm9udENvbG9yKDAuOWYsIDAuNWYsIDAuNWYsIDEuMGYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8qIFN0aWxsIFRlc3RpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgcnNnRm9udENvbG9yKDAuOWYsIDAuOWYsIDAuNWYsIDEuMGYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBVbmtub3duICovCisgICAgICAgICAgICAgICAgICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjlmLCAwLjlmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByc2dEcmF3UmVjdCgwLCBjdXJyZW50WVBvcyAtIDEsIHdpZHRoLCBjdXJyZW50WVBvcywgMCk7CisgICAgICAgICAgICByc2dEcmF3VGV4dChnTGlzdFtpXS50ZXh0LCAzMCwgY3VycmVudFlQb3MgLSAzMik7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudFlQb3MgKz0gaXRlbUhlaWdodDsKKyAgICB9CisKKyAgICByZXR1cm4gMTA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnN0aW1lLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzdGltZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTNlMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzdGltZS5ycwpAQCAtMCwwICsxLDUyIEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworc3RhdGljIGJvb2wgYmFzaWNfdGVzdCh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICByc190aW1lX3QgY3VyVGltZSA9IHJzVGltZSgwKTsKKyAgICByc190bSB0bTsKKyAgICByc0RlYnVnKCJjdXJUaW1lIiwgY3VyVGltZSk7CisKKyAgICByc0xvY2FsdGltZSgmdG0sICZjdXJUaW1lKTsKKworICAgIHJzRGVidWcoInRtLnRtX3NlYyIsIHRtLnRtX3NlYyk7CisgICAgcnNEZWJ1ZygidG0udG1fbWluIiwgdG0udG1fbWluKTsKKyAgICByc0RlYnVnKCJ0bS50bV9ob3VyIiwgdG0udG1faG91cik7CisgICAgcnNEZWJ1ZygidG0udG1fbWRheSIsIHRtLnRtX21kYXkpOworICAgIHJzRGVidWcoInRtLnRtX21vbiIsIHRtLnRtX21vbik7CisgICAgcnNEZWJ1ZygidG0udG1feWVhciIsIHRtLnRtX3llYXIpOworICAgIHJzRGVidWcoInRtLnRtX3dkYXkiLCB0bS50bV93ZGF5KTsKKyAgICByc0RlYnVnKCJ0bS50bV95ZGF5IiwgdG0udG1feWRheSk7CisgICAgcnNEZWJ1ZygidG0udG1faXNkc3QiLCB0bS50bV9pc2RzdCk7CisKKyAgICAvLyBUZXN0IGEgc3BlY2lmaWMgdGltZSAob25seSB2YWxpZCBmb3IgUFNUIGxvY2FsdGltZSkKKyAgICBjdXJUaW1lID0gMTI5NDQzODg5MzsKKyAgICByc0xvY2FsdGltZSgmdG0sICZjdXJUaW1lKTsKKworICAgIF9SU19BU1NFUlQodG0udG1fc2VjID09IDMzKTsKKyAgICBfUlNfQVNTRVJUKHRtLnRtX21pbiA9PSAyMSk7CisgICAgX1JTX0FTU0VSVCh0bS50bV9ob3VyID09IDE0KTsKKyAgICBfUlNfQVNTRVJUKHRtLnRtX21kYXkgPT0gNyk7CisgICAgX1JTX0FTU0VSVCh0bS50bV9tb24gPT0gMCk7CisgICAgX1JTX0FTU0VSVCh0bS50bV95ZWFyID09IDExMSk7CisgICAgX1JTX0FTU0VSVCh0bS50bV93ZGF5ID09IDUpOworICAgIF9SU19BU1NFUlQodG0udG1feWRheSA9PSA2KTsKKyAgICBfUlNfQVNTRVJUKHRtLnRtX2lzZHN0ID09IDApOworCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCB0ZXN0X3JzdGltZSh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmYWlsZWQgfD0gYmFzaWNfdGVzdChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgcnNEZWJ1ZygicnN0aW1lX3Rlc3QgRkFJTEVEIiwgLTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9QQVNTRUQpOworICAgICAgICByc0RlYnVnKCJyc3RpbWVfdGVzdCBQQVNTRUQiLCAwKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc3R5cGVzLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzdHlwZXMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkOWMxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc3R5cGVzLnJzCkBAIC0wLDAgKzEsNzkgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworcnNfZWxlbWVudCBlbGVtZW50VGVzdDsKK3JzX3R5cGUgdHlwZVRlc3Q7Cityc19hbGxvY2F0aW9uIGFsbG9jYXRpb25UZXN0OworcnNfc2FtcGxlciBzYW1wbGVyVGVzdDsKK3JzX3NjcmlwdCBzY3JpcHRUZXN0OworcnNfbWVzaCBtZXNoVGVzdDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgcHJvZ3JhbV9mcmFnbWVudFRlc3Q7Cityc19wcm9ncmFtX3ZlcnRleCBwcm9ncmFtX3ZlcnRleFRlc3Q7Cityc19wcm9ncmFtX3Jhc3RlciBwcm9ncmFtX3Jhc3RlclRlc3Q7Cityc19wcm9ncmFtX3N0b3JlIHByb2dyYW1fc3RvcmVUZXN0OworcnNfZm9udCBmb250VGVzdDsKKworcnNfbWF0cml4NHg0IG1hdHJpeDR4NFRlc3Q7Cityc19tYXRyaXgzeDMgbWF0cml4M3gzVGVzdDsKK3JzX21hdHJpeDJ4MiBtYXRyaXgyeDJUZXN0OworCitzdHJ1Y3QgbXlfc3RydWN0IHsKKyAgICBpbnQgaTsKKyAgICByc19mb250IGZvbnRUZXN0U3RydWN0OworfTsKKworc3RhdGljIGJvb2wgYmFzaWNfdGVzdCh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICByc19tYXRyaXg0eDQgbWF0cml4NHg0VGVzdExvY2FsOworICAgIHJzX21hdHJpeDN4MyBtYXRyaXgzeDNUZXN0TG9jYWw7CisgICAgcnNfbWF0cml4MngyIG1hdHJpeDJ4MlRlc3RMb2NhbDsKKworICAgIC8vIFRoaXMgdGVzdCBmb2N1c2VzIHByaW1hcmlseSBvbiBjb21waWxhdGlvbi10aW1lLCBub3QgcnVuLXRpbWUuCisgICAgcnNfZWxlbWVudCBlbGVtZW50VGVzdExvY2FsOworICAgIHJzX3R5cGUgdHlwZVRlc3RMb2NhbDsKKyAgICByc19hbGxvY2F0aW9uIGFsbG9jYXRpb25UZXN0TG9jYWw7CisgICAgcnNfc2FtcGxlciBzYW1wbGVyVGVzdExvY2FsOworICAgIHJzX3NjcmlwdCBzY3JpcHRUZXN0TG9jYWw7CisgICAgcnNfbWVzaCBtZXNoVGVzdExvY2FsOworICAgIHJzX3Byb2dyYW1fZnJhZ21lbnQgcHJvZ3JhbV9mcmFnbWVudFRlc3RMb2NhbDsKKyAgICByc19wcm9ncmFtX3ZlcnRleCBwcm9ncmFtX3ZlcnRleFRlc3RMb2NhbDsKKyAgICByc19wcm9ncmFtX3Jhc3RlciBwcm9ncmFtX3Jhc3RlclRlc3RMb2NhbDsKKyAgICByc19wcm9ncmFtX3N0b3JlIHByb2dyYW1fc3RvcmVUZXN0TG9jYWw7CisgICAgcnNfZm9udCBmb250VGVzdExvY2FsOworCisgICAgcnNfZm9udCBmb250VGVzdExvY2FsQXJyYXlbNF07CisKKyAgICByc19mb250IGZvbnRUZXN0TG9jYWxQcmVJbml0ID0gZm9udFRlc3Q7CisKKyAgICBzdHJ1Y3QgbXlfc3RydWN0IHN0cnVjdFRlc3Q7CisKKyAgICBmb250VGVzdExvY2FsID0gZm9udFRlc3Q7CisgICAgLy9hbGxvY2F0aW9uVGVzdExvY2FsID0gYWxsb2NhdGlvblRlc3Q7CisKKyAgICBmb250VGVzdCA9IGZvbnRUZXN0TG9jYWw7CisgICAgLy9hbGxvY2F0aW9uVGVzdCA9IGFsbG9jYXRpb25UZXN0TG9jYWw7CisKKyAgICAvKmZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGZvbnRUZXN0TG9jYWxBcnJheVtpXSA9IGZvbnRUZXN0TG9jYWw7CisgICAgfSovCisKKyAgICAvKmZvbnRUZXN0ID0gZm9udFRlc3RMb2NhbEFycmF5WzNdOyovCisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCit2b2lkIHRlc3RfcnN0eXBlcyh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmYWlsZWQgfD0gYmFzaWNfdGVzdChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgcnNEZWJ1ZygicnN0eXBlc190ZXN0IEZBSUxFRCIsIC0xKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICAgICAgcnNEZWJ1ZygicnN0eXBlc190ZXN0IFBBU1NFRCIsIDApOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3NoYXJlZC5yc2ggYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3Qvc2hhcmVkLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTcxNTFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3NoYXJlZC5yc2gKQEAgLTAsMCArMSwzOCBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMudGVzdF92MTQpCisKK3R5cGVkZWYgc3RydWN0IFRlc3RSZXN1bHRfcyB7CisgICAgcnNfYWxsb2NhdGlvbiBuYW1lOworICAgIGJvb2wgcGFzczsKKyAgICBmbG9hdCBzY29yZTsKKyAgICBpbnQ2NF90IHRpbWU7Cit9IFRlc3RSZXN1bHQ7CisvL1Rlc3RSZXN1bHQgKmdfcmVzdWx0czsKKworc3RhdGljIGludDY0X3QgZ190aW1lOworCitzdGF0aWMgdm9pZCBzdGFydCh2b2lkKSB7CisgICAgZ190aW1lID0gcnNVcHRpbWVNaWxsaXMoKTsKK30KKworc3RhdGljIGZsb2F0IGVuZCh1aW50MzJfdCBpZHgpIHsKKyAgICBpbnQ2NF90IHQgPSByc1VwdGltZU1pbGxpcygpIC0gZ190aW1lOworICAgIC8vZ19yZXN1bHRzW2lkeF0udGltZSA9IHQ7CisgICAgLy9yc0RlYnVnKCJ0ZXN0IHRpbWUiLCAoaW50KXQpOworICAgIHJldHVybiAoKGZsb2F0KXQpIC8gMTAwMC5mOworfQorCisjZGVmaW5lIF9SU19BU1NFUlQoYikgXAorZG8geyBcCisgICAgaWYgKCEoYikpIHsgXAorICAgICAgICBmYWlsZWQgPSB0cnVlOyBcCisgICAgICAgIHJzRGVidWcoI2IgIiBGQUlMRUQiLCAwKTsgXAorICAgIH0gXAorXAorfSB3aGlsZSAoMCkKKworLyogVGhlc2UgY29uc3RhbnRzIG11c3QgbWF0Y2ggdGhvc2UgaW4gVW5pdFRlc3QuamF2YSAqLworc3RhdGljIGNvbnN0IGludCBSU19NU0dfVEVTVF9QQVNTRUQgPSAxMDA7CitzdGF0aWMgY29uc3QgaW50IFJTX01TR19URVNUX0ZBSUxFRCA9IDEwMTsKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3Rlc3Rfcm9vdC5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC90ZXN0X3Jvb3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmZTM0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC90ZXN0X3Jvb3QucnMKQEAgLTAsMCArMSwyMyBAQAorLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLnRlc3RfdjE0KQorCisjcHJhZ21hIHN0YXRlRnJhZ21lbnQocGFyZW50KQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCisKK3R5cGVkZWYgc3RydWN0IFRlc3RSZXN1bHQgeworICAgIHJzX2FsbG9jYXRpb24gbmFtZTsKKyAgICBib29sIHBhc3M7CisgICAgZmxvYXQgc2NvcmU7Cit9IFRlc3RSZXN1bHRfdDsKK1Rlc3RSZXN1bHRfdCAqcmVzdWx0czsKKworaW50IHJvb3QoKSB7CisKKyAgICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdmVjdG9yLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3ZlY3Rvci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDMwYTJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3ZlY3Rvci5ycwpAQCAtMCwwICsxLDE5OCBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKKy8vIFRlc3RpbmcgdmVjdG9yIHR5cGVzCitmbG9hdDIgZjIgPSB7IDEuMGYsIDIuMGYgfTsKK2Zsb2F0MyBmMyA9IHsgMS4wZiwgMi4wZiwgMy4wZiB9OworZmxvYXQ0IGY0ID0geyAxLjBmLCAyLjBmLCAzLjBmLCA0LjBmIH07CisKK2RvdWJsZTIgZDIgPSB7IDEuMCwgMi4wIH07Citkb3VibGUzIGQzID0geyAxLjAsIDIuMCwgMy4wIH07Citkb3VibGU0IGQ0ID0geyAxLjAsIDIuMCwgMy4wLCA0LjAgfTsKKworY2hhcjIgaThfMiA9IHsgMSwgMiB9OworY2hhcjMgaThfMyA9IHsgMSwgMiwgMyB9OworY2hhcjQgaThfNCA9IHsgMSwgMiwgMywgNCB9OworCit1Y2hhcjIgdThfMiA9IHsgMSwgMiB9OwordWNoYXIzIHU4XzMgPSB7IDEsIDIsIDMgfTsKK3VjaGFyNCB1OF80ID0geyAxLCAyLCAzLCA0IH07CisKK3Nob3J0MiBpMTZfMiA9IHsgMSwgMiB9Oworc2hvcnQzIGkxNl8zID0geyAxLCAyLCAzIH07CitzaG9ydDQgaTE2XzQgPSB7IDEsIDIsIDMsIDQgfTsKKwordXNob3J0MiB1MTZfMiA9IHsgMSwgMiB9OwordXNob3J0MyB1MTZfMyA9IHsgMSwgMiwgMyB9OwordXNob3J0NCB1MTZfNCA9IHsgMSwgMiwgMywgNCB9OworCitpbnQyIGkzMl8yID0geyAxLCAyIH07CitpbnQzIGkzMl8zID0geyAxLCAyLCAzIH07CitpbnQ0IGkzMl80ID0geyAxLCAyLCAzLCA0IH07CisKK3VpbnQyIHUzMl8yID0geyAxLCAyIH07Cit1aW50MyB1MzJfMyA9IHsgMSwgMiwgMyB9OwordWludDQgdTMyXzQgPSB7IDEsIDIsIDMsIDQgfTsKKworbG9uZzIgaTY0XzIgPSB7IDEsIDIgfTsKK2xvbmczIGk2NF8zID0geyAxLCAyLCAzIH07Citsb25nNCBpNjRfNCA9IHsgMSwgMiwgMywgNCB9OworCit1bG9uZzIgdTY0XzIgPSB7IDEsIDIgfTsKK3Vsb25nMyB1NjRfMyA9IHsgMSwgMiwgMyB9OwordWxvbmc0IHU2NF80ID0geyAxLCAyLCAzLCA0IH07CisKK3N0YXRpYyBib29sIHRlc3RfdmVjdG9yX3R5cGVzKCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICByc0RlYnVnKCJUZXN0aW5nIEYzMiIsIDApOworICAgIF9SU19BU1NFUlQoZjIueCA9PSAyLjk5Zik7CisgICAgX1JTX0FTU0VSVChmMi55ID09IDMuOTlmKTsKKworICAgIF9SU19BU1NFUlQoZjMueCA9PSAyLjk5Zik7CisgICAgX1JTX0FTU0VSVChmMy55ID09IDMuOTlmKTsKKyAgICBfUlNfQVNTRVJUKGYzLnogPT0gNC45OWYpOworCisgICAgX1JTX0FTU0VSVChmNC54ID09IDIuOTlmKTsKKyAgICBfUlNfQVNTRVJUKGY0LnkgPT0gMy45OWYpOworICAgIF9SU19BU1NFUlQoZjQueiA9PSA0Ljk5Zik7CisgICAgX1JTX0FTU0VSVChmNC53ID09IDUuOTlmKTsKKworICAgIHJzRGVidWcoIlRlc3RpbmcgRjY0IiwgMCk7CisgICAgX1JTX0FTU0VSVChkMi54ID09IDIuOTkpOworICAgIF9SU19BU1NFUlQoZDIueSA9PSAzLjk5KTsKKworICAgIF9SU19BU1NFUlQoZDMueCA9PSAyLjk5KTsKKyAgICBfUlNfQVNTRVJUKGQzLnkgPT0gMy45OSk7CisgICAgX1JTX0FTU0VSVChkMy56ID09IDQuOTkpOworCisgICAgX1JTX0FTU0VSVChkNC54ID09IDIuOTkpOworICAgIF9SU19BU1NFUlQoZDQueSA9PSAzLjk5KTsKKyAgICBfUlNfQVNTRVJUKGQ0LnogPT0gNC45OSk7CisgICAgX1JTX0FTU0VSVChkNC53ID09IDUuOTkpOworCisgICAgcnNEZWJ1ZygiVGVzdGluZyBJOCIsIDApOworICAgIF9SU19BU1NFUlQoaThfMi54ID09IDIpOworICAgIF9SU19BU1NFUlQoaThfMi55ID09IDMpOworCisgICAgX1JTX0FTU0VSVChpOF8zLnggPT0gMik7CisgICAgX1JTX0FTU0VSVChpOF8zLnkgPT0gMyk7CisgICAgX1JTX0FTU0VSVChpOF8zLnogPT0gNCk7CisKKyAgICBfUlNfQVNTRVJUKGk4XzQueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKGk4XzQueSA9PSAzKTsKKyAgICBfUlNfQVNTRVJUKGk4XzQueiA9PSA0KTsKKyAgICBfUlNfQVNTRVJUKGk4XzQudyA9PSA1KTsKKworICAgIHJzRGVidWcoIlRlc3RpbmcgVTgiLCAwKTsKKyAgICBfUlNfQVNTRVJUKHU4XzIueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKHU4XzIueSA9PSAzKTsKKworICAgIF9SU19BU1NFUlQodThfMy54ID09IDIpOworICAgIF9SU19BU1NFUlQodThfMy55ID09IDMpOworICAgIF9SU19BU1NFUlQodThfMy56ID09IDQpOworCisgICAgX1JTX0FTU0VSVCh1OF80LnggPT0gMik7CisgICAgX1JTX0FTU0VSVCh1OF80LnkgPT0gMyk7CisgICAgX1JTX0FTU0VSVCh1OF80LnogPT0gNCk7CisgICAgX1JTX0FTU0VSVCh1OF80LncgPT0gNSk7CisKKyAgICByc0RlYnVnKCJUZXN0aW5nIEkxNiIsIDApOworICAgIF9SU19BU1NFUlQoaTE2XzIueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKGkxNl8yLnkgPT0gMyk7CisKKyAgICBfUlNfQVNTRVJUKGkxNl8zLnggPT0gMik7CisgICAgX1JTX0FTU0VSVChpMTZfMy55ID09IDMpOworICAgIF9SU19BU1NFUlQoaTE2XzMueiA9PSA0KTsKKworICAgIF9SU19BU1NFUlQoaTE2XzQueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKGkxNl80LnkgPT0gMyk7CisgICAgX1JTX0FTU0VSVChpMTZfNC56ID09IDQpOworICAgIF9SU19BU1NFUlQoaTE2XzQudyA9PSA1KTsKKworICAgIHJzRGVidWcoIlRlc3RpbmcgVTE2IiwgMCk7CisgICAgX1JTX0FTU0VSVCh1MTZfMi54ID09IDIpOworICAgIF9SU19BU1NFUlQodTE2XzIueSA9PSAzKTsKKworICAgIF9SU19BU1NFUlQodTE2XzMueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKHUxNl8zLnkgPT0gMyk7CisgICAgX1JTX0FTU0VSVCh1MTZfMy56ID09IDQpOworCisgICAgX1JTX0FTU0VSVCh1MTZfNC54ID09IDIpOworICAgIF9SU19BU1NFUlQodTE2XzQueSA9PSAzKTsKKyAgICBfUlNfQVNTRVJUKHUxNl80LnogPT0gNCk7CisgICAgX1JTX0FTU0VSVCh1MTZfNC53ID09IDUpOworCisgICAgcnNEZWJ1ZygiVGVzdGluZyBJMzIiLCAwKTsKKyAgICBfUlNfQVNTRVJUKGkzMl8yLnggPT0gMik7CisgICAgX1JTX0FTU0VSVChpMzJfMi55ID09IDMpOworCisgICAgX1JTX0FTU0VSVChpMzJfMy54ID09IDIpOworICAgIF9SU19BU1NFUlQoaTMyXzMueSA9PSAzKTsKKyAgICBfUlNfQVNTRVJUKGkzMl8zLnogPT0gNCk7CisKKyAgICBfUlNfQVNTRVJUKGkzMl80LnggPT0gMik7CisgICAgX1JTX0FTU0VSVChpMzJfNC55ID09IDMpOworICAgIF9SU19BU1NFUlQoaTMyXzQueiA9PSA0KTsKKyAgICBfUlNfQVNTRVJUKGkzMl80LncgPT0gNSk7CisKKyAgICByc0RlYnVnKCJUZXN0aW5nIFUzMiIsIDApOworICAgIF9SU19BU1NFUlQodTMyXzIueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKHUzMl8yLnkgPT0gMyk7CisKKyAgICBfUlNfQVNTRVJUKHUzMl8zLnggPT0gMik7CisgICAgX1JTX0FTU0VSVCh1MzJfMy55ID09IDMpOworICAgIF9SU19BU1NFUlQodTMyXzMueiA9PSA0KTsKKworICAgIF9SU19BU1NFUlQodTMyXzQueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKHUzMl80LnkgPT0gMyk7CisgICAgX1JTX0FTU0VSVCh1MzJfNC56ID09IDQpOworICAgIF9SU19BU1NFUlQodTMyXzQudyA9PSA1KTsKKworICAgIHJzRGVidWcoIlRlc3RpbmcgSTY0IiwgMCk7CisgICAgX1JTX0FTU0VSVChpNjRfMi54ID09IDIpOworICAgIF9SU19BU1NFUlQoaTY0XzIueSA9PSAzKTsKKworICAgIF9SU19BU1NFUlQoaTY0XzMueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKGk2NF8zLnkgPT0gMyk7CisgICAgX1JTX0FTU0VSVChpNjRfMy56ID09IDQpOworCisgICAgX1JTX0FTU0VSVChpNjRfNC54ID09IDIpOworICAgIF9SU19BU1NFUlQoaTY0XzQueSA9PSAzKTsKKyAgICBfUlNfQVNTRVJUKGk2NF80LnogPT0gNCk7CisgICAgX1JTX0FTU0VSVChpNjRfNC53ID09IDUpOworCisgICAgcnNEZWJ1ZygiVGVzdGluZyBVNjQiLCAwKTsKKyAgICBfUlNfQVNTRVJUKHU2NF8yLnggPT0gMik7CisgICAgX1JTX0FTU0VSVCh1NjRfMi55ID09IDMpOworCisgICAgX1JTX0FTU0VSVCh1NjRfMy54ID09IDIpOworICAgIF9SU19BU1NFUlQodTY0XzMueSA9PSAzKTsKKyAgICBfUlNfQVNTRVJUKHU2NF8zLnogPT0gNCk7CisKKyAgICBfUlNfQVNTRVJUKHU2NF80LnggPT0gMik7CisgICAgX1JTX0FTU0VSVCh1NjRfNC55ID09IDMpOworICAgIF9SU19BU1NFUlQodTY0XzQueiA9PSA0KTsKKyAgICBfUlNfQVNTRVJUKHU2NF80LncgPT0gNSk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfdmVjdG9yIEZBSUxFRCIsIDApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF92ZWN0b3IgUEFTU0VEIiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCB2ZWN0b3JfdGVzdCgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGZhaWxlZCB8PSB0ZXN0X3ZlY3Rvcl90eXBlcygpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwIGIvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcAppbmRleCAwYzBiMmVhLi5kZjZhYmU4IDEwMDY0NAotLS0gYS90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKQEAgLTIzMDQsMTAgKzIzMDQsOCBAQAogCiAgICAgICAgIGNvbnN0IGNoYXIxNl90KiBlbmQgPSBuYW1lICsgbmFtZUxlbjsKICAgICAgICAgY29uc3QgY2hhcjE2X3QqIHBvcyA9IG5hbWU7Ci0gICAgICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChwb3MgPCBlbmQgJiYgIWZhaWxlZCkgeworICAgICAgICB3aGlsZSAocG9zIDwgZW5kKSB7CiAgICAgICAgICAgICBjb25zdCBjaGFyMTZfdCogc3RhcnQgPSBwb3M7Ci0gICAgICAgICAgICBlbmQrKzsKICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBlbmQgJiYgKnBvcyAhPSAnfCcpIHsKICAgICAgICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgIH0KQEAgLTIzMzMsOSArMjMzMSw3IEBACiAgICAgICAgICAgICAgICAgLy8gRGlkbid0IGZpbmQgdGhpcyBmbGFnIGlkZW50aWZpZXIuCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBvcyA8IGVuZCkgewotICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zKys7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAgYi90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwCmluZGV4IGZlODhlMzcuLjdmMTM3Y2UgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAKKysrIGIvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcApAQCAtMTc0LDcgKzE3NCw5IEBACiAgICAgfQogCiAgICAgY29uc3QgYm9vbCBmaXJzdCA9IHZpZHggPCAwOwotICAgIGlmIChmaXJzdCB8fCAhbWVyZ2VEdXBsaWNhdGVzKSB7CisgICAgY29uc3QgYm9vbCBzdHlsZWQgPSAocG9zID49IDAgJiYgKHNpemVfdClwb3MgPCBtRW50cnlTdHlsZUFycmF5LnNpemUoKSkgPworICAgICAgICBtRW50cnlTdHlsZUFycmF5W3Bvc10uc3BhbnMuc2l6ZSgpIDogMDsKKyAgICBpZiAoZmlyc3QgfHwgc3R5bGVkIHx8ICFtZXJnZUR1cGxpY2F0ZXMpIHsKICAgICAgICAgcG9zID0gbUVudHJ5QXJyYXkuYWRkKGVpZHgpOwogICAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgICAgIHZpZHggPSBtVmFsdWVzLmFkZCh2YWx1ZSwgcG9zKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYW5kcm9pZC9CcmlkZ2VXaW5kb3cuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYW5kcm9pZC9CcmlkZ2VXaW5kb3cuamF2YQppbmRleCA3OTYwNmE0Li43YzY4M2M5IDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlV2luZG93LmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZVdpbmRvdy5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hHZXROZXdTdXJmYWNlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHBhc3MgZm9yIG5vdy4KICAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlQ29tbWFuZChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGFyZzIpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKQEAgLTUyLDYgKzUzLDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hTY3JlZW5TdGF0ZShib29sZWFuIG9uKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcGFzcyBmb3Igbm93LgorICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdpbmRvd0ZvY3VzQ2hhbmdlZChib29sZWFuIGFyZzAsIGJvb2xlYW4gYXJnMSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHBhc3MgZm9yIG5vdy4KICAgICB9Cg==